From e24e2ccf6267b34e05ba098ef45a5490af34c1fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 08:25:34 -0500 Subject: [PATCH 001/286] Upgrade trunk (#8245) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 8c981850d..2d3c0aa2d 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -4,19 +4,19 @@ cli: plugins: sources: - id: trunk - ref: v1.7.2 + ref: v1.7.3 uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.473 - - renovate@41.132.5 + - checkov@3.2.477 + - renovate@41.143.2 - prettier@3.6.2 - trufflehog@3.90.8 - yamllint@1.37.1 - bandit@1.8.6 - - trivy@0.67.0 + - trivy@0.67.1 - taplo@0.10.0 - - ruff@0.13.3 + - ruff@0.14.0 - isort@6.1.0 - markdownlint@0.45.0 - oxipng@9.1.5 From 1212c2c11b32bfaa251df3ef76f7d5df893e0959 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 06:32:21 -0500 Subject: [PATCH 002/286] Upgrade trunk (#8326) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 2d3c0aa2d..637372700 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,7 +9,7 @@ plugins: lint: enabled: - checkov@3.2.477 - - renovate@41.143.2 + - renovate@41.144.1 - prettier@3.6.2 - trufflehog@3.90.8 - yamllint@1.37.1 From 5814f3e7d2efd4fd89e5f3946cb61310a0c7371b Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 13 Oct 2025 17:17:32 -0500 Subject: [PATCH 003/286] Revert "Fix Station G2 Lora Power Settings (#8273)" (#8332) This reverts commit 05edcc5d6ce1ed755fe40013459b718bafe84e24. --- src/configuration.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index b6b1c1e5e..c6c8d673c 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -126,11 +126,6 @@ along with this program. If not, see . #define TX_GAIN_LORA 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7 #endif -#ifdef STATION_G2 -#define NUM_PA_POINTS 19 -#define TX_GAIN_LORA 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 18, 18 -#endif - // Default system gain to 0 if not defined #ifndef TX_GAIN_LORA #define TX_GAIN_LORA 0 From e8f4d07e9f6876317cbb47296888e782ea6d94f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 15:45:33 -0500 Subject: [PATCH 004/286] Update meshtastic/device-ui digest to 19b7855 (#8346) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5b7f5ddcf..376f6e5a8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -120,7 +120,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/3fb7c0e28e8e51fc0a7d56facacf3411f1d29fe0.zip + https://github.com/meshtastic/device-ui/archive/19b7855e9a1d9deff37391659ca7194e4ef57c43.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From 9a8aeb25abeb49065c1fbdb65cd228717cb117bb Mon Sep 17 00:00:00 2001 From: Erayd Date: Wed, 15 Oct 2025 13:22:45 +1300 Subject: [PATCH 005/286] Add a general-purpose packet cache (#8341) * Add general-purpose packet cache This commit adds a caching system that will save packet data in a much more compact form than the regular MeshPacket protobuf. It cannot be worked with directly to the same degree (although the packet header is available), but consumes *much* less memory, and as a result can be used to temporarily store large numbers of packets. Cached packets can be retrieved either by their (from, id) tuple, or by their hash. This cache is a pre-requisite for the upcoming packet replay feature. * Remove debug initialiser Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix ordering Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add missing size assignment Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add comments for hash & bucket macros * Make it clear that this field stores a map of the original data --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ben Meadors --- src/mesh/PacketCache.cpp | 253 +++++++++++++++++++++++++++++++++++++++ src/mesh/PacketCache.h | 75 ++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 src/mesh/PacketCache.cpp create mode 100644 src/mesh/PacketCache.h diff --git a/src/mesh/PacketCache.cpp b/src/mesh/PacketCache.cpp new file mode 100644 index 000000000..0edf81741 --- /dev/null +++ b/src/mesh/PacketCache.cpp @@ -0,0 +1,253 @@ +#include "PacketCache.h" +#include "Router.h" + +PacketCache packetCache{}; + +/** + * Allocate a new cache entry and copy the packet header and payload into it + */ +PacketCacheEntry *PacketCache::cache(const meshtastic_MeshPacket *p, bool preserveMetadata) +{ + size_t payload_size = + (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag) ? p->encrypted.size : p->decoded.payload.size; + PacketCacheEntry *e = (PacketCacheEntry *)malloc(sizeof(PacketCacheEntry) + payload_size + + (preserveMetadata ? sizeof(PacketCacheMetadata) : 0)); + if (!e) { + LOG_ERROR("Unable to allocate memory for packet cache entry"); + return NULL; + } + + *e = {}; + e->header.from = p->from; + e->header.to = p->to; + e->header.id = p->id; + e->header.channel = p->channel; + e->header.next_hop = p->next_hop; + e->header.relay_node = p->relay_node; + e->header.flags = (p->hop_limit & PACKET_FLAGS_HOP_LIMIT_MASK) | (p->want_ack ? PACKET_FLAGS_WANT_ACK_MASK : 0) | + (p->via_mqtt ? PACKET_FLAGS_VIA_MQTT_MASK : 0) | + ((p->hop_start << PACKET_FLAGS_HOP_START_SHIFT) & PACKET_FLAGS_HOP_START_MASK); + + PacketCacheMetadata m{}; + if (preserveMetadata) { + e->has_metadata = true; + m.rx_rssi = (uint8_t)(p->rx_rssi + 200); + m.rx_snr = (uint8_t)((p->rx_snr + 30.0f) / 0.25f); + m.rx_time = p->rx_time; + m.transport_mechanism = p->transport_mechanism; + m.priority = p->priority; + } + if (p->which_payload_variant == meshtastic_MeshPacket_encrypted_tag) { + e->encrypted = true; + e->payload_len = p->encrypted.size; + memcpy(((unsigned char *)e) + sizeof(PacketCacheEntry), p->encrypted.bytes, p->encrypted.size); + } else if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) { + e->encrypted = false; + if (preserveMetadata) { + m.portnum = p->decoded.portnum; + m.want_response = p->decoded.want_response; + m.emoji = p->decoded.emoji; + m.bitfield = p->decoded.bitfield; + if (p->decoded.reply_id) + m.reply_id = p->decoded.reply_id; + else if (p->decoded.request_id) + m.request_id = p->decoded.request_id; + } + e->payload_len = p->decoded.payload.size; + memcpy(((unsigned char *)e) + sizeof(PacketCacheEntry), p->decoded.payload.bytes, p->decoded.payload.size); + } else { + LOG_ERROR("Unable to cache packet with unknown payload type %d", p->which_payload_variant); + free(e); + return NULL; + } + if (preserveMetadata) + memcpy(((unsigned char *)e) + sizeof(PacketCacheEntry) + e->payload_len, &m, sizeof(m)); + + size += sizeof(PacketCacheEntry) + e->payload_len + (e->has_metadata ? sizeof(PacketCacheMetadata) : 0); + insert(e); + return e; +}; + +/** + * Dump a list of packets into the provided buffer + */ +void PacketCache::dump(void *dest, const PacketCacheEntry **entries, size_t num_entries) +{ + unsigned char *pos = (unsigned char *)dest; + for (size_t i = 0; i < num_entries; i++) { + size_t entry_len = + sizeof(PacketCacheEntry) + entries[i]->payload_len + (entries[i]->has_metadata ? sizeof(PacketCacheMetadata) : 0); + memcpy(pos, entries[i], entry_len); + pos += entry_len; + } +} + +/** + * Calculate the length of buffer needed to dump the specified entries + */ +size_t PacketCache::dumpSize(const PacketCacheEntry **entries, size_t num_entries) +{ + size_t total_size = 0; + for (size_t i = 0; i < num_entries; i++) { + total_size += sizeof(PacketCacheEntry) + entries[i]->payload_len; + if (entries[i]->has_metadata) + total_size += sizeof(PacketCacheMetadata); + } + return total_size; +} + +/** + * Find a packet in the cache + */ +PacketCacheEntry *PacketCache::find(NodeNum from, PacketId id) +{ + uint16_t h = PACKET_HASH(from, id); + PacketCacheEntry *e = buckets[PACKET_CACHE_BUCKET(h)]; + while (e) { + if (e->header.from == from && e->header.id == id) + return e; + e = e->next; + } + return NULL; +} + +/** + * Find a packet in the cache by its hash + */ +PacketCacheEntry *PacketCache::find(PacketHash h) +{ + PacketCacheEntry *e = buckets[PACKET_CACHE_BUCKET(h)]; + while (e) { + if (PACKET_HASH(e->header.from, e->header.id) == h) + return e; + e = e->next; + } + return NULL; +} + +/** + * Load a list of packets from the provided buffer + */ +bool PacketCache::load(void *src, PacketCacheEntry **entries, size_t num_entries) +{ + memset(entries, 0, sizeof(PacketCacheEntry *) * num_entries); + unsigned char *pos = (unsigned char *)src; + for (size_t i = 0; i < num_entries; i++) { + PacketCacheEntry e{}; + memcpy(&e, pos, sizeof(PacketCacheEntry)); + size_t entry_len = sizeof(PacketCacheEntry) + e.payload_len + (e.has_metadata ? sizeof(PacketCacheMetadata) : 0); + entries[i] = (PacketCacheEntry *)malloc(entry_len); + size += entry_len; + if (!entries[i]) { + LOG_ERROR("Unable to allocate memory for packet cache entry"); + for (size_t j = 0; j < i; j++) { + size -= sizeof(PacketCacheEntry) + entries[j]->payload_len + + (entries[j]->has_metadata ? sizeof(PacketCacheMetadata) : 0); + free(entries[j]); + entries[j] = NULL; + } + return false; + } + memcpy(entries[i], pos, entry_len); + pos += entry_len; + } + for (size_t i = 0; i < num_entries; i++) + insert(entries[i]); + return true; +} + +/** + * Copy the cached packet into the provided MeshPacket structure + */ +void PacketCache::rehydrate(const PacketCacheEntry *e, meshtastic_MeshPacket *p) +{ + if (!e || !p) + return; + + *p = {}; + p->from = e->header.from; + p->to = e->header.to; + p->id = e->header.id; + p->channel = e->header.channel; + p->next_hop = e->header.next_hop; + p->relay_node = e->header.relay_node; + p->hop_limit = e->header.flags & PACKET_FLAGS_HOP_LIMIT_MASK; + p->want_ack = !!(e->header.flags & PACKET_FLAGS_WANT_ACK_MASK); + p->via_mqtt = !!(e->header.flags & PACKET_FLAGS_VIA_MQTT_MASK); + p->hop_start = (e->header.flags & PACKET_FLAGS_HOP_START_MASK) >> PACKET_FLAGS_HOP_START_SHIFT; + p->which_payload_variant = e->encrypted ? meshtastic_MeshPacket_encrypted_tag : meshtastic_MeshPacket_decoded_tag; + + unsigned char *payload = ((unsigned char *)e) + sizeof(PacketCacheEntry); + PacketCacheMetadata m{}; + if (e->has_metadata) { + memcpy(&m, (payload + e->payload_len), sizeof(m)); + p->rx_rssi = ((int)m.rx_rssi) - 200; + p->rx_snr = ((float)m.rx_snr * 0.25f) - 30.0f; + p->rx_time = m.rx_time; + p->transport_mechanism = (meshtastic_MeshPacket_TransportMechanism)m.transport_mechanism; + p->priority = (meshtastic_MeshPacket_Priority)m.priority; + } + if (e->encrypted) { + memcpy(p->encrypted.bytes, payload, e->payload_len); + p->encrypted.size = e->payload_len; + } else { + memcpy(p->decoded.payload.bytes, payload, e->payload_len); + p->decoded.payload.size = e->payload_len; + if (e->has_metadata) { + // Decrypted-only metadata + p->decoded.portnum = (meshtastic_PortNum)m.portnum; + p->decoded.want_response = m.want_response; + p->decoded.emoji = m.emoji; + p->decoded.bitfield = m.bitfield; + if (m.reply_id) + p->decoded.reply_id = m.reply_id; + else if (m.request_id) + p->decoded.request_id = m.request_id; + } + } +} + +/** + * Release a cache entry + */ +void PacketCache::release(PacketCacheEntry *e) +{ + if (!e) + return; + remove(e); + size -= sizeof(PacketCacheEntry) + e->payload_len + (e->has_metadata ? sizeof(PacketCacheMetadata) : 0); + free(e); +} + +/** + * Insert a new entry into the hash table + */ +void PacketCache::insert(PacketCacheEntry *e) +{ + assert(e); + PacketHash h = PACKET_HASH(e->header.from, e->header.id); + PacketCacheEntry **target = &buckets[PACKET_CACHE_BUCKET(h)]; + e->next = *target; + *target = e; + num_entries++; +} + +/** + * Remove an entry from the hash table + */ +void PacketCache::remove(PacketCacheEntry *e) +{ + assert(e); + PacketHash h = PACKET_HASH(e->header.from, e->header.id); + PacketCacheEntry **target = &buckets[PACKET_CACHE_BUCKET(h)]; + while (*target) { + if (*target == e) { + *target = e->next; + e->next = NULL; + num_entries--; + break; + } else { + target = &(*target)->next; + } + } +} \ No newline at end of file diff --git a/src/mesh/PacketCache.h b/src/mesh/PacketCache.h new file mode 100644 index 000000000..81ad455da --- /dev/null +++ b/src/mesh/PacketCache.h @@ -0,0 +1,75 @@ +#pragma once +#include "RadioInterface.h" + +#define PACKET_HASH(a, b) ((((a ^ b) >> 16) ^ (a ^ b)) & 0xFFFF) // 16 bit fold of packet (from, id) tuple +typedef uint16_t PacketHash; + +#define PACKET_CACHE_BUCKETS 64 // Number of hash table buckets +#define PACKET_CACHE_BUCKET(h) (((h >> 12) ^ (h >> 6) ^ h) & 0x3F) // Fold hash down to 6-bit bucket index + +typedef struct PacketCacheEntry { + PacketCacheEntry *next; + PacketHeader header; + uint16_t payload_len = 0; + union { + uint16_t bitfield; + struct { + uint8_t encrypted : 1; // Payload is encrypted + uint8_t has_metadata : 1; // Payload includes PacketCacheMetadata + uint8_t : 6; // Reserved for future use + uint16_t : 8; // Reserved for future use + }; + }; +} PacketCacheEntry; + +typedef struct PacketCacheMetadata { + PacketCacheMetadata() : _bitfield(0), reply_id(0), _bitfield2(0) {} + union { + uint32_t _bitfield; + struct { + uint16_t portnum : 9; // meshtastic_MeshPacket::decoded::portnum + uint16_t want_response : 1; // meshtastic_MeshPacket::decoded::want_response + uint16_t emoji : 1; // meshtastic_MeshPacket::decoded::emoji + uint16_t bitfield : 5; // meshtastic_MeshPacket::decoded::bitfield (truncated) + uint8_t rx_rssi : 8; // meshtastic_MeshPacket::rx_rssi (map via actual RSSI + 200) + uint8_t rx_snr : 8; // meshtastic_MeshPacket::rx_snr (map via (p->rx_snr + 30.0f) / 0.25f) + }; + }; + union { + uint32_t reply_id; // meshtastic_MeshPacket::decoded.reply_id + uint32_t request_id; // meshtastic_MeshPacket::decoded.request_id + }; + uint32_t rx_time = 0; // meshtastic_MeshPacket::rx_time + uint8_t transport_mechanism = 0; // meshtastic_MeshPacket::transport_mechanism + struct { + uint8_t _bitfield2; + union { + uint8_t priority : 7; // meshtastic_MeshPacket::priority + uint8_t reserved : 1; // Reserved for future use + }; + }; +} PacketCacheMetadata; + +class PacketCache +{ + public: + PacketCacheEntry *cache(const meshtastic_MeshPacket *p, bool preserveMetadata); + static void dump(void *dest, const PacketCacheEntry **entries, size_t num_entries); + size_t dumpSize(const PacketCacheEntry **entries, size_t num_entries); + PacketCacheEntry *find(NodeNum from, PacketId id); + PacketCacheEntry *find(PacketHash h); + bool load(void *src, PacketCacheEntry **entries, size_t num_entries); + size_t getNumEntries() { return num_entries; } + size_t getSize() { return size; } + void rehydrate(const PacketCacheEntry *e, meshtastic_MeshPacket *p); + void release(PacketCacheEntry *e); + + private: + PacketCacheEntry *buckets[PACKET_CACHE_BUCKETS]{}; + size_t num_entries = 0; + size_t size = 0; + void insert(PacketCacheEntry *e); + void remove(PacketCacheEntry *e); +}; + +extern PacketCache packetCache; \ No newline at end of file From a6df18e60a78d7ad5600ea920fa0b1063692f5a9 Mon Sep 17 00:00:00 2001 From: Clive Blackledge Date: Wed, 15 Oct 2025 04:08:06 -0700 Subject: [PATCH 006/286] Guarding PhoneAPI node-info staging with mutex to prevent BLE future foot-gun (#8354) * Eliminating foot-gun and placing Phone NodeInfo into a mutex * Swapping over to concurrency::Lock from mutex --- src/mesh/PhoneAPI.cpp | 103 ++++++++++++++++++++++----------- src/mesh/PhoneAPI.h | 3 + src/nimble/NimbleBluetooth.cpp | 2 +- 3 files changed, 72 insertions(+), 36 deletions(-) diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index 9eeadf5a2..36bd577e1 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -15,6 +15,7 @@ #include "Router.h" #include "SPILock.h" #include "TypeConversions.h" +#include "concurrency/LockGuard.h" #include "main.h" #include "xmodem.h" @@ -71,8 +72,12 @@ void PhoneAPI::handleStartConfig() LOG_DEBUG("Got %d files in manifest", filesManifest.size()); LOG_INFO("Start API client config"); - nodeInfoForPhone.num = 0; // Don't keep returning old nodeinfos - nodeInfoQueue.clear(); + // Protect against concurrent BLE callbacks: they run in NimBLE's FreeRTOS task and also touch nodeInfoQueue. + { + concurrency::LockGuard guard(&nodeInfoMutex); + nodeInfoForPhone = {}; + nodeInfoQueue.clear(); + } resetReadIndex(); } @@ -94,8 +99,12 @@ void PhoneAPI::close() onConnectionChanged(false); fromRadioScratch = {}; toRadioScratch = {}; - nodeInfoForPhone = {}; - nodeInfoQueue.clear(); + // Clear cached node info under lock because NimBLE callbacks can still be draining it. + { + concurrency::LockGuard guard(&nodeInfoMutex); + nodeInfoForPhone = {}; + nodeInfoQueue.clear(); + } packetForPhone = NULL; filesManifest.clear(); fromRadioNum = 0; @@ -241,13 +250,20 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) LOG_DEBUG("Send My NodeInfo"); auto us = nodeDB->readNextMeshNode(readIndex); if (us) { - nodeInfoForPhone = TypeConversions::ConvertToNodeInfo(us); - nodeInfoForPhone.has_hops_away = false; - nodeInfoForPhone.is_favorite = true; + auto info = TypeConversions::ConvertToNodeInfo(us); + info.has_hops_away = false; + info.is_favorite = true; + { + concurrency::LockGuard guard(&nodeInfoMutex); + nodeInfoForPhone = info; + } fromRadioScratch.which_payload_variant = meshtastic_FromRadio_node_info_tag; - fromRadioScratch.node_info = nodeInfoForPhone; + fromRadioScratch.node_info = info; // Should allow us to resume sending NodeInfo in STATE_SEND_OTHER_NODEINFOS - nodeInfoForPhone.num = 0; + { + concurrency::LockGuard guard(&nodeInfoMutex); + nodeInfoForPhone.num = 0; + } } if (config_nonce == SPECIAL_NONCE_ONLY_NODES) { // If client only wants node info, jump directly to sending nodes @@ -434,23 +450,30 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) case STATE_SEND_OTHER_NODEINFOS: { LOG_DEBUG("Send known nodes"); - if (nodeInfoForPhone.num == 0 && !nodeInfoQueue.empty()) { - // Serve the next cached node without re-reading from the DB iterator. - nodeInfoForPhone = nodeInfoQueue.front(); - nodeInfoQueue.pop_front(); + meshtastic_NodeInfo infoToSend = {}; + { + concurrency::LockGuard guard(&nodeInfoMutex); + if (nodeInfoForPhone.num == 0 && !nodeInfoQueue.empty()) { + // Serve the next cached node without re-reading from the DB iterator. + nodeInfoForPhone = nodeInfoQueue.front(); + nodeInfoQueue.pop_front(); + } + infoToSend = nodeInfoForPhone; + if (infoToSend.num != 0) + nodeInfoForPhone = {}; } - if (nodeInfoForPhone.num != 0) { + if (infoToSend.num != 0) { // Just in case we stored a different user.id in the past, but should never happen going forward - sprintf(nodeInfoForPhone.user.id, "!%08x", nodeInfoForPhone.num); - LOG_DEBUG("nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s", nodeInfoForPhone.num, nodeInfoForPhone.last_heard, - nodeInfoForPhone.user.id, nodeInfoForPhone.user.long_name); + sprintf(infoToSend.user.id, "!%08x", infoToSend.num); + LOG_DEBUG("nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s", infoToSend.num, infoToSend.last_heard, + infoToSend.user.id, infoToSend.user.long_name); fromRadioScratch.which_payload_variant = meshtastic_FromRadio_node_info_tag; - fromRadioScratch.node_info = nodeInfoForPhone; - nodeInfoForPhone = {}; + fromRadioScratch.node_info = infoToSend; prefetchNodeInfos(); } else { LOG_DEBUG("Done sending nodeinfo"); + concurrency::LockGuard guard(&nodeInfoMutex); nodeInfoQueue.clear(); state = STATE_SEND_FILEMANIFEST; // Go ahead and send that ID right now @@ -559,20 +582,23 @@ void PhoneAPI::prefetchNodeInfos() { bool added = false; // Keep the queue topped up so BLE reads stay responsive even if DB fetches take a moment. - while (nodeInfoQueue.size() < kNodePrefetchDepth) { - auto nextNode = nodeDB->readNextMeshNode(readIndex); - if (!nextNode) - break; + { + concurrency::LockGuard guard(&nodeInfoMutex); + while (nodeInfoQueue.size() < kNodePrefetchDepth) { + auto nextNode = nodeDB->readNextMeshNode(readIndex); + if (!nextNode) + break; - auto info = TypeConversions::ConvertToNodeInfo(nextNode); - bool isUs = info.num == nodeDB->getNodeNum(); - info.hops_away = isUs ? 0 : info.hops_away; - info.last_heard = isUs ? getValidTime(RTCQualityFromNet) : info.last_heard; - info.snr = isUs ? 0 : info.snr; - info.via_mqtt = isUs ? false : info.via_mqtt; - info.is_favorite = info.is_favorite || isUs; - nodeInfoQueue.push_back(info); - added = true; + auto info = TypeConversions::ConvertToNodeInfo(nextNode); + bool isUs = info.num == nodeDB->getNodeNum(); + info.hops_away = isUs ? 0 : info.hops_away; + info.last_heard = isUs ? getValidTime(RTCQualityFromNet) : info.last_heard; + info.snr = isUs ? 0 : info.snr; + info.via_mqtt = isUs ? false : info.via_mqtt; + info.is_favorite = info.is_favorite || isUs; + nodeInfoQueue.push_back(info); + added = true; + } } if (added) @@ -614,10 +640,17 @@ bool PhoneAPI::available() case STATE_SEND_COMPLETE_ID: return true; - case STATE_SEND_OTHER_NODEINFOS: - if (nodeInfoQueue.empty()) - prefetchNodeInfos(); + case STATE_SEND_OTHER_NODEINFOS: { + concurrency::LockGuard guard(&nodeInfoMutex); + if (nodeInfoQueue.empty()) { + // Drop the lock before prefetching; prefetchNodeInfos() will re-acquire it. + goto PREFETCH_NODEINFO; + } + } return true; // Always say we have something, because we might need to advance our state machine + PREFETCH_NODEINFO: + prefetchNodeInfos(); + return true; case STATE_SEND_PACKETS: { if (!queueStatusPacketForPhone) queueStatusPacketForPhone = service->getQueueStatusForPhone(); diff --git a/src/mesh/PhoneAPI.h b/src/mesh/PhoneAPI.h index 692fdd0b9..a8d0faa28 100644 --- a/src/mesh/PhoneAPI.h +++ b/src/mesh/PhoneAPI.h @@ -1,6 +1,7 @@ #pragma once #include "Observer.h" +#include "concurrency/Lock.h" #include "mesh-pb-constants.h" #include "meshtastic/portnums.pb.h" #include @@ -84,6 +85,8 @@ class PhoneAPI std::deque nodeInfoQueue; // Tunable size of the node info cache so we can keep BLE reads non-blocking. static constexpr size_t kNodePrefetchDepth = 4; + // Protect nodeInfoForPhone + nodeInfoQueue because NimBLE callbacks run in a separate FreeRTOS task. + concurrency::Lock nodeInfoMutex; meshtastic_ToRadio toRadioScratch = { 0}; // this is a static scratch object, any data must be copied elsewhere before returning diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 4b0c33609..eb1d909f1 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -139,7 +139,7 @@ class NimbleBluetoothFromRadioCallback : public NimBLECharacteristicCallbacks { bluetoothPhoneAPI->phoneWants = true; bluetoothPhoneAPI->setIntervalFromNow(0); - std::lock_guard guard(bluetoothPhoneAPI->nimble_mutex); + std::lock_guard guard(bluetoothPhoneAPI->nimble_mutex); // BLE callbacks run in NimBLE task if (!bluetoothPhoneAPI->hasChecked) { // Fetch payload on demand; prefetch keeps this fast for the first read. From 858e8c6fefba6c2fc1da588c5a1ff8335f82e827 Mon Sep 17 00:00:00 2001 From: Mike Weaver Date: Wed, 15 Oct 2025 05:15:57 -0600 Subject: [PATCH 007/286] portduino, handle sdl2 builds (#8355) fix linux native build by adding sdl2 libraries --- variants/native/portduino/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 4e6a592de..49a8a71c7 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -17,6 +17,7 @@ extends = native_base build_flags = ${native_base.build_flags} !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : + !pkg-config --cflags --libs sdl2 --silence-errors || : [env:native-tft] extends = native_base From 4e0a4cc45feb9bc5e47ae40eeeed7001d8807cac Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 15 Oct 2025 06:34:28 -0500 Subject: [PATCH 008/286] Log the lora frequency error when receiving a packet. (#8343) --- src/mesh/LR11x0Interface.cpp | 1 + src/mesh/SX126xInterface.cpp | 1 + src/mesh/SX128xInterface.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/src/mesh/LR11x0Interface.cpp b/src/mesh/LR11x0Interface.cpp index 0e23405e5..3831a384d 100644 --- a/src/mesh/LR11x0Interface.cpp +++ b/src/mesh/LR11x0Interface.cpp @@ -218,6 +218,7 @@ template void LR11x0Interface::addReceiveMetadata(meshtastic_Mes // LOG_DEBUG("PacketStatus %x", lora.getPacketStatus()); mp->rx_snr = lora.getSNR(); mp->rx_rssi = lround(lora.getRSSI()); + LOG_DEBUG("Corrected frequency offset: %f", lora.getFrequencyError()); } /** We override to turn on transmitter power as needed. diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp index c60ef3a80..e1f07a32b 100644 --- a/src/mesh/SX126xInterface.cpp +++ b/src/mesh/SX126xInterface.cpp @@ -266,6 +266,7 @@ template void SX126xInterface::addReceiveMetadata(meshtastic_Mes // LOG_DEBUG("PacketStatus %x", lora.getPacketStatus()); mp->rx_snr = lora.getSNR(); mp->rx_rssi = lround(lora.getRSSI()); + LOG_DEBUG("Corrected frequency offset: %f", lora.getFrequencyError()); } /** We override to turn on transmitter power as needed. diff --git a/src/mesh/SX128xInterface.cpp b/src/mesh/SX128xInterface.cpp index cbc98eeb1..80872af07 100644 --- a/src/mesh/SX128xInterface.cpp +++ b/src/mesh/SX128xInterface.cpp @@ -204,6 +204,7 @@ template void SX128xInterface::addReceiveMetadata(meshtastic_Mes // LOG_DEBUG("PacketStatus %x", lora.getPacketStatus()); mp->rx_snr = lora.getSNR(); mp->rx_rssi = lround(lora.getRSSI()); + LOG_DEBUG("Corrected frequency offset: %f", lora.getFrequencyError()); } /** We override to turn on transmitter power as needed. From ec5a54c52377bbbdb13358ae971eeabe37820537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Czaplewski?= <28847593+Paplewski@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:19:47 +0200 Subject: [PATCH 009/286] bind python version to 3.13 (#8362) --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index bf1c50982..bc660170c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,7 +8,7 @@ "features": { "ghcr.io/devcontainers/features/python:1": { "installTools": true, - "version": "latest" + "version": "3.13" } }, "customizations": { From 51b3b937dcbfa8c3648f4125e399d9ece1d8663b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 08:55:11 +1100 Subject: [PATCH 010/286] Update actions/setup-node action to v6 (#8339) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 942659348..7852fc31f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,7 +47,7 @@ jobs: pio upgrade - name: Setup Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: 22 From cd3b31c5dab4bda7e8fc99f503d7635496324bc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 08:56:39 +1100 Subject: [PATCH 011/286] Upgrade trunk (#8340) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 637372700..5bec39ae2 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,20 +8,20 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.477 - - renovate@41.144.1 + - checkov@3.2.483 + - renovate@41.148.2 - prettier@3.6.2 - trufflehog@3.90.8 - yamllint@1.37.1 - bandit@1.8.6 - - trivy@0.67.1 + - trivy@0.67.2 - taplo@0.10.0 - ruff@0.14.0 - - isort@6.1.0 + - isort@7.0.0 - markdownlint@0.45.0 - oxipng@9.1.5 - svgo@4.0.0 - - actionlint@1.7.7 + - actionlint@1.7.8 - flake8@7.3.0 - hadolint@2.14.0 - shfmt@3.6.0 From 865b46ceefb4b096f594baefae9d5c1aa739cef1 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 16 Oct 2025 06:07:38 -0500 Subject: [PATCH 012/286] Ignore MQTT Client Proxy messages while not in sendpackets state (#8358) --- src/mesh/PhoneAPI.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index 36bd577e1..51a2bc148 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -159,6 +159,10 @@ bool PhoneAPI::handleToRadio(const uint8_t *buf, size_t bufLength) #if !MESHTASTIC_EXCLUDE_MQTT case meshtastic_ToRadio_mqttClientProxyMessage_tag: LOG_DEBUG("Got MqttClientProxy message"); + if (state != STATE_SEND_PACKETS) { + LOG_WARN("Ignore MqttClientProxy message while completing config handshake"); + break; + } if (mqtt && moduleConfig.mqtt.proxy_to_client_enabled && moduleConfig.mqtt.enabled && (channels.anyMqttEnabled() || moduleConfig.mqtt.map_reporting_enabled)) { mqtt->onClientProxyReceive(toRadioScratch.mqttClientProxyMessage); From 5953b4704e5ef79242b907f88e1dabaa7569951f Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 16 Oct 2025 14:01:04 -0500 Subject: [PATCH 013/286] Force CannedMessages to another node to be a PKI DM (#8373) --- src/modules/CannedMessageModule.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index e9f52bb7d..9f95a9e20 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -255,7 +255,7 @@ void CannedMessageModule::updateDestinationSelectionList() for (size_t i = 0; i < numMeshNodes; ++i) { meshtastic_NodeInfoLite *node = nodeDB->getMeshNodeByIndex(i); - if (!node || node->num == myNodeNum) + if (!node || node->num == myNodeNum || !node->has_user || node->user.public_key.size != 32) continue; const String &nodeName = node->user.long_name; @@ -976,6 +976,8 @@ void CannedMessageModule::sendText(NodeNum dest, ChannelIndex channel, const cha LOG_INFO("Proactively adding %x as favorite node", p->to); nodeDB->set_favorite(true, p->to); screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + p->pki_encrypted = true; + p->channel = 0; } // Send to mesh and phone (even if no phone connected, to track ACKs) From 32ebc70bcad1489e766af441bdeeca03f0115ab3 Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Fri, 17 Oct 2025 09:01:14 +1100 Subject: [PATCH 014/286] Update exempt labels for stale bot configuration Adds triaged and backlog to the list of exempt labels. --- .github/workflows/stale_bot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml index b528f80b2..11ba59386 100644 --- a/.github/workflows/stale_bot.yml +++ b/.github/workflows/stale_bot.yml @@ -22,5 +22,5 @@ jobs: days-before-stale: 45 stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days. close-issue-message: This issue has not had any comment since the last notice. It has been closed automatically. If this is incorrect, or the issue becomes relevant again, please request that it is reopened. - exempt-issue-labels: pinned,3.0 - exempt-pr-labels: pinned,3.0 + exempt-issue-labels: pinned,3.0,triaged,backlog + exempt-pr-labels: pinned,3.0,triaged,backlog From 073c35c782447f3749bd624c2a6a94959d74b7bc Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Fri, 17 Oct 2025 09:01:51 +1100 Subject: [PATCH 015/286] Update exempt labels for stale bot workflow Adds triaged and backlog to the list of exempt labels. --- .github/workflows/stale_bot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml index a80619e90..441d53ee3 100644 --- a/.github/workflows/stale_bot.yml +++ b/.github/workflows/stale_bot.yml @@ -20,5 +20,5 @@ jobs: uses: actions/stale@v10.1.0 with: days-before-stale: 45 - exempt-issue-labels: pinned,3.0 - exempt-pr-labels: pinned,3.0 + exempt-issue-labels: pinned,3.0,triaged,backlog + exempt-pr-labels: pinned,3.0,triaged,backlog From acab814b6f3070f039f231804b304545e790c28c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 09:14:34 +1100 Subject: [PATCH 016/286] Update meshtastic/web to v2.6.7 (#8381) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- bin/web.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/web.version b/bin/web.version index 952f449f1..ba5c9fca6 100644 --- a/bin/web.version +++ b/bin/web.version @@ -1 +1 @@ -2.6.6 \ No newline at end of file +2.6.7 \ No newline at end of file From ee2ed0a8fb8518e4f519ef60bd80e4906b89b7a9 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Fri, 17 Oct 2025 23:26:47 -0400 Subject: [PATCH 017/286] Fixe battery voltage to show missing decimals --- src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp index 7876276a8..09f76ed46 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp @@ -709,7 +709,7 @@ void InkHUD::MenuApplet::drawSystemInfoPanel(int16_t left, int16_t top, uint16_t // Voltage float voltage = powerStatus->getBatteryVoltageMv() / 1000.0; char voltageStr[6]; // "XX.XV" - sprintf(voltageStr, "%.1fV", voltage); + sprintf(voltageStr, "%.2fV", voltage); printAt(colC[0], labelT, "Bat", CENTER, TOP); printAt(colC[0], valT, voltageStr, CENTER, TOP); From d9905f3c316f37f9d95bb6b4cfb2579eb08becce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:17:34 +1100 Subject: [PATCH 018/286] Update DFRobot_RTU to v1.0.6 (#8387) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 376f6e5a8..7c63ad7ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -164,7 +164,7 @@ lib_deps = # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass mprograms/QMC5883LCompass@1.2.3 # renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU - dfrobot/DFRobot_RTU@1.0.3 + dfrobot/DFRobot_RTU@1.0.6 # renovate: datasource=git-refs depName=DFRobot_RainfallSensor packageName=https://github.com/DFRobot/DFRobot_RainfallSensor gitBranch=master https://github.com/DFRobot/DFRobot_RainfallSensor/archive/38fea5e02b40a5430be6dab39a99a6f6347d667e.zip # renovate: datasource=custom.pio depName=INA226 packageName=robtillaart/library/INA226 From 0bfc342b4832bcdef0463c7272733aa4f878763d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:20:07 +1100 Subject: [PATCH 019/286] Update mcr.microsoft.com/devcontainers/cpp Docker tag to v2 (#8375) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 30af24bd2..a2c56fad9 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ # trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue # trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions # trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions -FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12 +FROM mcr.microsoft.com/devcontainers/cpp:2-debian-12 USER root From 4df79374b0e220918eaa9c35f4a004653125afd6 Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Sun, 19 Oct 2025 08:52:03 +1100 Subject: [PATCH 020/286] manual merge stale bot config (#8392) --- .github/workflows/stale_bot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml index 441d53ee3..11ba59386 100644 --- a/.github/workflows/stale_bot.yml +++ b/.github/workflows/stale_bot.yml @@ -20,5 +20,7 @@ jobs: uses: actions/stale@v10.1.0 with: days-before-stale: 45 + stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days. + close-issue-message: This issue has not had any comment since the last notice. It has been closed automatically. If this is incorrect, or the issue becomes relevant again, please request that it is reopened. exempt-issue-labels: pinned,3.0,triaged,backlog exempt-pr-labels: pinned,3.0,triaged,backlog From e5d67310d6c6d76881c087b23c243ed6db70803b Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Sun, 19 Oct 2025 08:52:56 +1100 Subject: [PATCH 021/286] Master ---> Develop (#8391) * Update exempt labels for stale bot workflow Adds triaged and backlog to the list of exempt labels. * Update meshtastic/web to v2.6.7 (#8381) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update DFRobot_RTU to v1.0.6 (#8387) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update mcr.microsoft.com/devcontainers/cpp Docker tag to v2 (#8375) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * manual merge stale bot config (#8392) --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- bin/web.version | 2 +- platformio.ini | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 30af24bd2..a2c56fad9 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ # trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue # trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions # trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions -FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12 +FROM mcr.microsoft.com/devcontainers/cpp:2-debian-12 USER root diff --git a/bin/web.version b/bin/web.version index 952f449f1..ba5c9fca6 100644 --- a/bin/web.version +++ b/bin/web.version @@ -1 +1 @@ -2.6.6 \ No newline at end of file +2.6.7 \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 376f6e5a8..7c63ad7ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -164,7 +164,7 @@ lib_deps = # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass mprograms/QMC5883LCompass@1.2.3 # renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU - dfrobot/DFRobot_RTU@1.0.3 + dfrobot/DFRobot_RTU@1.0.6 # renovate: datasource=git-refs depName=DFRobot_RainfallSensor packageName=https://github.com/DFRobot/DFRobot_RainfallSensor gitBranch=master https://github.com/DFRobot/DFRobot_RainfallSensor/archive/38fea5e02b40a5430be6dab39a99a6f6347d667e.zip # renovate: datasource=custom.pio depName=INA226 packageName=robtillaart/library/INA226 From af8407aca9476398de49db15e723088de257275f Mon Sep 17 00:00:00 2001 From: "Daniel.Cao" <144674500+DanielCao0@users.noreply.github.com> Date: Sun, 19 Oct 2025 05:53:39 +0800 Subject: [PATCH 022/286] Board support: RAK3401+RAK13302 1-watt (#8140) * Add RAK3401 variant files * Add SPI configuration for RAK3401 and RAK13302 variants * Refactor SPI pin configuration and clean up variant definitions for RAK3401 * Add TX_GAIN_LORA for RAK13302 Power Amp * Fix merge --------- Co-authored-by: Ben Meadors Co-authored-by: Tom Fifield Co-authored-by: Manuel <71137295+mverch67@users.noreply.github.com> --- src/configuration.h | 5 + src/main.cpp | 7 + .../nrf52840/rak3401_1watt/platformio.ini | 31 +++ variants/nrf52840/rak3401_1watt/variant.cpp | 45 ++++ variants/nrf52840/rak3401_1watt/variant.h | 226 ++++++++++++++++++ 5 files changed, 314 insertions(+) create mode 100644 variants/nrf52840/rak3401_1watt/platformio.ini create mode 100644 variants/nrf52840/rak3401_1watt/variant.cpp create mode 100644 variants/nrf52840/rak3401_1watt/variant.h diff --git a/src/configuration.h b/src/configuration.h index c6c8d673c..baf24a636 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -126,6 +126,11 @@ along with this program. If not, see . #define TX_GAIN_LORA 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7 #endif +#ifdef RAK13302 +#define NUM_PA_POINTS 22 +#define TX_GAIN_LORA 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8 +#endif + // Default system gain to 0 if not defined #ifndef TX_GAIN_LORA #define TX_GAIN_LORA 0 diff --git a/src/main.cpp b/src/main.cpp index bb97a1aa6..3801f6f9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -841,7 +841,14 @@ void setup() SPI.begin(); } #elif !defined(ARCH_ESP32) // ARCH_RP2040 +#if defined(RAK3401) || defined(RAK13302) + pinMode(WB_IO2, OUTPUT); + digitalWrite(WB_IO2, HIGH); + SPI1.setPins(LORA_MISO, LORA_SCK, LORA_MOSI); + SPI1.begin(); +#else SPI.begin(); +#endif #else // ESP32 #if defined(HW_SPI1_DEVICE) diff --git a/variants/nrf52840/rak3401_1watt/platformio.ini b/variants/nrf52840/rak3401_1watt/platformio.ini new file mode 100644 index 000000000..1a915a6b3 --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/platformio.ini @@ -0,0 +1,31 @@ +; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921 +[env:rak3401-1watt] +extends = nrf52840_base +board = wiscore_rak4631 +board_check = true +build_flags = ${nrf52840_base.build_flags} + -Ivariants/nrf52840/rak3401_1watt + -D RAK_4631 +; -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. + -D RAK3401 + -D RAK13302 ; RAK 1Watt Power Amplifier + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 + -DRADIOLIB_EXCLUDE_LR11X0=1 +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak3401_1watt> + +lib_deps = + ${nrf52840_base.lib_deps} + ${networking_base.lib_deps} + melopero/Melopero RV3028@^1.1.0 + rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 + beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip + +; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) +; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds +;upload_protocol = jlink + +; Allows programming and debug via the RAK NanoDAP as the default debugger tool for the RAK4631 (it is only $10!) +; programming time is about the same as the bootloader version. +; For information on this see the meshtastic developers documentation for "Development on the NRF52" + diff --git a/variants/nrf52840/rak3401_1watt/variant.cpp b/variants/nrf52840/rak3401_1watt/variant.cpp new file mode 100644 index 000000000..e84b60b3b --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/variant.cpp @@ -0,0 +1,45 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + // LED1 & LED2 + pinMode(PIN_LED1, OUTPUT); + ledOff(PIN_LED1); + + pinMode(PIN_LED2, OUTPUT); + ledOff(PIN_LED2); + + // 3V3 Power Rail + pinMode(PIN_3V3_EN, OUTPUT); + digitalWrite(PIN_3V3_EN, HIGH); +} diff --git a/variants/nrf52840/rak3401_1watt/variant.h b/variants/nrf52840/rak3401_1watt/variant.h new file mode 100644 index 000000000..d4bb1a175 --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/variant.h @@ -0,0 +1,226 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_RAK3401_ +#define _VARIANT_RAK3401_ + +#define RAK4630 + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF +// define USE_LFRC // Board uses RC for LF + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (6) +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED1 (35) +#define PIN_LED2 (36) + +#define LED_BUILTIN PIN_LED1 +#define LED_CONN PIN_LED2 + +#define LED_GREEN PIN_LED1 +#define LED_BLUE PIN_LED2 + +#define LED_STATE_ON 1 // State when LED is litted + +/* + * Analog pins + */ +#define PIN_A0 (5) +#define PIN_A1 (31) +#define PIN_A2 (28) +#define PIN_A3 (29) +#define PIN_A4 (30) +#define PIN_A5 (31) +#define PIN_A6 (0xff) +#define PIN_A7 (0xff) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +static const uint8_t A6 = PIN_A6; +static const uint8_t A7 = PIN_A7; +#define ADC_RESOLUTION 14 + +// Other pins +#define WB_I2C1_SDA (13) // SENSOR_SLOT IO_SLOT +#define WB_I2C1_SCL (14) // SENSOR_SLOT IO_SLOT + +#define PIN_AREF (2) +#define PIN_NFC1 (9) +#define WB_IO5 PIN_NFC1 +#define WB_IO4 (4) +#define PIN_NFC2 (10) + +static const uint8_t AREF = PIN_AREF; + +/* + * Serial interfaces + */ +#define PIN_SERIAL1_RX (15) +#define PIN_SERIAL1_TX (16) + +// Connected to Jlink CDC +#define PIN_SERIAL2_RX (8) +#define PIN_SERIAL2_TX (6) + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 2 + +#define PIN_SPI_MISO (45) +#define PIN_SPI_MOSI (44) +#define PIN_SPI_SCK (43) + +#define PIN_SPI1_MISO (29) // (0 + 29) +#define PIN_SPI1_MOSI (30) // (0 + 30) +#define PIN_SPI1_SCK (3) // (0 + 3) + +static const uint8_t SS = 42; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * eink display pins + */ +#define PIN_EINK_CS (0 + 26) +#define PIN_EINK_BUSY (0 + 4) +#define PIN_EINK_DC (0 + 17) +#define PIN_EINK_RES (-1) +#define PIN_EINK_SCLK (0 + 3) +#define PIN_EINK_MOSI (0 + 30) // also called SDI + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (WB_I2C1_SDA) +#define PIN_WIRE_SCL (WB_I2C1_SCL) + +// QSPI Pins +#define PIN_QSPI_SCK 3 +#define PIN_QSPI_CS 26 +#define PIN_QSPI_IO0 30 +#define PIN_QSPI_IO1 29 +#define PIN_QSPI_IO2 28 +#define PIN_QSPI_IO3 2 + +// On-board QSPI Flash +#define EXTERNAL_FLASH_DEVICES IS25LP080D +#define EXTERNAL_FLASH_USE_QSPI + +// 1watt sx1262 RAK13302 +#define HW_SPI1_DEVICE 1 + +#define LORA_SCK PIN_SPI1_SCK +#define LORA_MISO PIN_SPI1_MISO +#define LORA_MOSI PIN_SPI1_MOSI +#define LORA_CS 26 + +#define USE_SX1262 +#define SX126X_CS (26) +#define SX126X_DIO1 (10) +#define SX126X_BUSY (9) +#define SX126X_RESET (4) + +#define SX126X_POWER_EN (21) +// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3 +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 + +// Testing USB detection +#define NRF_APM +// If using a power chip like the INA3221 you can override the default battery voltage channel below +// and comment out NRF_APM to use the INA3221 instead of the USB detection for charging +// #define INA3221_BAT_CH INA3221_CH2 +// #define INA3221_ENV_CH INA3221_CH1 + +// enables 3.3V periphery like GPS or IO Module +// Do not toggle this for GPS power savings +#define PIN_3V3_EN (34) +#define WB_IO2 PIN_3V3_EN + +// RAK1910 GPS module +// If using the wisblock GPS module and pluged into Port A on WisBlock base +// IO1 is hooked to PPS (pin 12 on header) = gpio 17 +// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on). +// Therefore must be 1 to keep peripherals powered +// Power is on the controllable 3V3_S rail +// #define PIN_GPS_RESET (34) +// #define PIN_GPS_EN PIN_3V3_EN +#define PIN_GPS_PPS (17) // Pulse per second input from the GPS + +#define GPS_RX_PIN PIN_SERIAL1_RX +#define GPS_TX_PIN PIN_SERIAL1_TX + +// Define pin to enable GPS toggle (set GPIO to LOW) via user button triple press + +// RAK12002 RTC Module +#define RV3028_RTC (uint8_t)0b1010010 + +// RAK18001 Buzzer in Slot C +// #define PIN_BUZZER 21 // IO3 is PWM2 +// NEW: set this via protobuf instead! + +// Battery +// The battery sense is hooked to pin A0 (5) +#define BATTERY_PIN PIN_A0 +// and has 12 bit resolution +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 3.0 +#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define ADC_MULTIPLIER 1.73 + +#define HAS_RTC 1 + +#define RAK_4631 1 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif From 0283e0658b2f615991f369307a240a7479da5632 Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Sun, 19 Oct 2025 08:54:56 +1100 Subject: [PATCH 023/286] Master --> develop (#8394) * Update exempt labels for stale bot workflow Adds triaged and backlog to the list of exempt labels. * Update meshtastic/web to v2.6.7 (#8381) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update DFRobot_RTU to v1.0.6 (#8387) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update mcr.microsoft.com/devcontainers/cpp Docker tag to v2 (#8375) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * manual merge stale bot config (#8392) * Board support: RAK3401+RAK13302 1-watt (#8140) * Add RAK3401 variant files * Add SPI configuration for RAK3401 and RAK13302 variants * Refactor SPI pin configuration and clean up variant definitions for RAK3401 * Add TX_GAIN_LORA for RAK13302 Power Amp * Fix merge --------- Co-authored-by: Ben Meadors Co-authored-by: Tom Fifield Co-authored-by: Manuel <71137295+mverch67@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel.Cao <144674500+DanielCao0@users.noreply.github.com> Co-authored-by: Ben Meadors Co-authored-by: Manuel <71137295+mverch67@users.noreply.github.com> --- src/configuration.h | 5 + src/main.cpp | 7 + .../nrf52840/rak3401_1watt/platformio.ini | 31 +++ variants/nrf52840/rak3401_1watt/variant.cpp | 45 ++++ variants/nrf52840/rak3401_1watt/variant.h | 226 ++++++++++++++++++ 5 files changed, 314 insertions(+) create mode 100644 variants/nrf52840/rak3401_1watt/platformio.ini create mode 100644 variants/nrf52840/rak3401_1watt/variant.cpp create mode 100644 variants/nrf52840/rak3401_1watt/variant.h diff --git a/src/configuration.h b/src/configuration.h index c6c8d673c..baf24a636 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -126,6 +126,11 @@ along with this program. If not, see . #define TX_GAIN_LORA 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 9, 9, 8, 7 #endif +#ifdef RAK13302 +#define NUM_PA_POINTS 22 +#define TX_GAIN_LORA 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8 +#endif + // Default system gain to 0 if not defined #ifndef TX_GAIN_LORA #define TX_GAIN_LORA 0 diff --git a/src/main.cpp b/src/main.cpp index bb97a1aa6..3801f6f9f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -841,7 +841,14 @@ void setup() SPI.begin(); } #elif !defined(ARCH_ESP32) // ARCH_RP2040 +#if defined(RAK3401) || defined(RAK13302) + pinMode(WB_IO2, OUTPUT); + digitalWrite(WB_IO2, HIGH); + SPI1.setPins(LORA_MISO, LORA_SCK, LORA_MOSI); + SPI1.begin(); +#else SPI.begin(); +#endif #else // ESP32 #if defined(HW_SPI1_DEVICE) diff --git a/variants/nrf52840/rak3401_1watt/platformio.ini b/variants/nrf52840/rak3401_1watt/platformio.ini new file mode 100644 index 000000000..1a915a6b3 --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/platformio.ini @@ -0,0 +1,31 @@ +; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921 +[env:rak3401-1watt] +extends = nrf52840_base +board = wiscore_rak4631 +board_check = true +build_flags = ${nrf52840_base.build_flags} + -Ivariants/nrf52840/rak3401_1watt + -D RAK_4631 +; -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely. + -D RAK3401 + -D RAK13302 ; RAK 1Watt Power Amplifier + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 + -DRADIOLIB_EXCLUDE_LR11X0=1 +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak3401_1watt> + +lib_deps = + ${nrf52840_base.lib_deps} + ${networking_base.lib_deps} + melopero/Melopero RV3028@^1.1.0 + rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 + beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip + +; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) +; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds +;upload_protocol = jlink + +; Allows programming and debug via the RAK NanoDAP as the default debugger tool for the RAK4631 (it is only $10!) +; programming time is about the same as the bootloader version. +; For information on this see the meshtastic developers documentation for "Development on the NRF52" + diff --git a/variants/nrf52840/rak3401_1watt/variant.cpp b/variants/nrf52840/rak3401_1watt/variant.cpp new file mode 100644 index 000000000..e84b60b3b --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/variant.cpp @@ -0,0 +1,45 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + // LED1 & LED2 + pinMode(PIN_LED1, OUTPUT); + ledOff(PIN_LED1); + + pinMode(PIN_LED2, OUTPUT); + ledOff(PIN_LED2); + + // 3V3 Power Rail + pinMode(PIN_3V3_EN, OUTPUT); + digitalWrite(PIN_3V3_EN, HIGH); +} diff --git a/variants/nrf52840/rak3401_1watt/variant.h b/variants/nrf52840/rak3401_1watt/variant.h new file mode 100644 index 000000000..d4bb1a175 --- /dev/null +++ b/variants/nrf52840/rak3401_1watt/variant.h @@ -0,0 +1,226 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_RAK3401_ +#define _VARIANT_RAK3401_ + +#define RAK4630 + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF +// define USE_LFRC // Board uses RC for LF + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (6) +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED1 (35) +#define PIN_LED2 (36) + +#define LED_BUILTIN PIN_LED1 +#define LED_CONN PIN_LED2 + +#define LED_GREEN PIN_LED1 +#define LED_BLUE PIN_LED2 + +#define LED_STATE_ON 1 // State when LED is litted + +/* + * Analog pins + */ +#define PIN_A0 (5) +#define PIN_A1 (31) +#define PIN_A2 (28) +#define PIN_A3 (29) +#define PIN_A4 (30) +#define PIN_A5 (31) +#define PIN_A6 (0xff) +#define PIN_A7 (0xff) + +static const uint8_t A0 = PIN_A0; +static const uint8_t A1 = PIN_A1; +static const uint8_t A2 = PIN_A2; +static const uint8_t A3 = PIN_A3; +static const uint8_t A4 = PIN_A4; +static const uint8_t A5 = PIN_A5; +static const uint8_t A6 = PIN_A6; +static const uint8_t A7 = PIN_A7; +#define ADC_RESOLUTION 14 + +// Other pins +#define WB_I2C1_SDA (13) // SENSOR_SLOT IO_SLOT +#define WB_I2C1_SCL (14) // SENSOR_SLOT IO_SLOT + +#define PIN_AREF (2) +#define PIN_NFC1 (9) +#define WB_IO5 PIN_NFC1 +#define WB_IO4 (4) +#define PIN_NFC2 (10) + +static const uint8_t AREF = PIN_AREF; + +/* + * Serial interfaces + */ +#define PIN_SERIAL1_RX (15) +#define PIN_SERIAL1_TX (16) + +// Connected to Jlink CDC +#define PIN_SERIAL2_RX (8) +#define PIN_SERIAL2_TX (6) + +/* + * SPI Interfaces + */ +#define SPI_INTERFACES_COUNT 2 + +#define PIN_SPI_MISO (45) +#define PIN_SPI_MOSI (44) +#define PIN_SPI_SCK (43) + +#define PIN_SPI1_MISO (29) // (0 + 29) +#define PIN_SPI1_MOSI (30) // (0 + 30) +#define PIN_SPI1_SCK (3) // (0 + 3) + +static const uint8_t SS = 42; +static const uint8_t MOSI = PIN_SPI_MOSI; +static const uint8_t MISO = PIN_SPI_MISO; +static const uint8_t SCK = PIN_SPI_SCK; + +/* + * eink display pins + */ +#define PIN_EINK_CS (0 + 26) +#define PIN_EINK_BUSY (0 + 4) +#define PIN_EINK_DC (0 + 17) +#define PIN_EINK_RES (-1) +#define PIN_EINK_SCLK (0 + 3) +#define PIN_EINK_MOSI (0 + 30) // also called SDI + +/* + * Wire Interfaces + */ +#define WIRE_INTERFACES_COUNT 1 + +#define PIN_WIRE_SDA (WB_I2C1_SDA) +#define PIN_WIRE_SCL (WB_I2C1_SCL) + +// QSPI Pins +#define PIN_QSPI_SCK 3 +#define PIN_QSPI_CS 26 +#define PIN_QSPI_IO0 30 +#define PIN_QSPI_IO1 29 +#define PIN_QSPI_IO2 28 +#define PIN_QSPI_IO3 2 + +// On-board QSPI Flash +#define EXTERNAL_FLASH_DEVICES IS25LP080D +#define EXTERNAL_FLASH_USE_QSPI + +// 1watt sx1262 RAK13302 +#define HW_SPI1_DEVICE 1 + +#define LORA_SCK PIN_SPI1_SCK +#define LORA_MISO PIN_SPI1_MISO +#define LORA_MOSI PIN_SPI1_MOSI +#define LORA_CS 26 + +#define USE_SX1262 +#define SX126X_CS (26) +#define SX126X_DIO1 (10) +#define SX126X_BUSY (9) +#define SX126X_RESET (4) + +#define SX126X_POWER_EN (21) +// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3 +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 + +// Testing USB detection +#define NRF_APM +// If using a power chip like the INA3221 you can override the default battery voltage channel below +// and comment out NRF_APM to use the INA3221 instead of the USB detection for charging +// #define INA3221_BAT_CH INA3221_CH2 +// #define INA3221_ENV_CH INA3221_CH1 + +// enables 3.3V periphery like GPS or IO Module +// Do not toggle this for GPS power savings +#define PIN_3V3_EN (34) +#define WB_IO2 PIN_3V3_EN + +// RAK1910 GPS module +// If using the wisblock GPS module and pluged into Port A on WisBlock base +// IO1 is hooked to PPS (pin 12 on header) = gpio 17 +// IO2 is hooked to GPS RESET = gpio 34, but it can not be used to this because IO2 is ALSO used to control 3V3_S power (1 is on). +// Therefore must be 1 to keep peripherals powered +// Power is on the controllable 3V3_S rail +// #define PIN_GPS_RESET (34) +// #define PIN_GPS_EN PIN_3V3_EN +#define PIN_GPS_PPS (17) // Pulse per second input from the GPS + +#define GPS_RX_PIN PIN_SERIAL1_RX +#define GPS_TX_PIN PIN_SERIAL1_TX + +// Define pin to enable GPS toggle (set GPIO to LOW) via user button triple press + +// RAK12002 RTC Module +#define RV3028_RTC (uint8_t)0b1010010 + +// RAK18001 Buzzer in Slot C +// #define PIN_BUZZER 21 // IO3 is PWM2 +// NEW: set this via protobuf instead! + +// Battery +// The battery sense is hooked to pin A0 (5) +#define BATTERY_PIN PIN_A0 +// and has 12 bit resolution +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 3.0 +#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define ADC_MULTIPLIER 1.73 + +#define HAS_RTC 1 + +#define RAK_4631 1 + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#endif From 30022c93774f5bd1b363a2aaebf1c49ef7a0757c Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:00:14 -0400 Subject: [PATCH 024/286] Fixe battery voltage to show missing decimals (#8386) --- src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp index 7876276a8..09f76ed46 100644 --- a/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/System/Menu/MenuApplet.cpp @@ -709,7 +709,7 @@ void InkHUD::MenuApplet::drawSystemInfoPanel(int16_t left, int16_t top, uint16_t // Voltage float voltage = powerStatus->getBatteryVoltageMv() / 1000.0; char voltageStr[6]; // "XX.XV" - sprintf(voltageStr, "%.1fV", voltage); + sprintf(voltageStr, "%.2fV", voltage); printAt(colC[0], labelT, "Bat", CENTER, TOP); printAt(colC[0], valT, voltageStr, CENTER, TOP); From b4dea63f4499273b32565a8451b43d83a135ac1b Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:00:35 -0400 Subject: [PATCH 025/286] Gatting off BaseUI code from screenless devices and InkHUD (#8384) --- src/graphics/SharedUIDisplay.cpp | 5 ++++- src/graphics/VirtualKeyboard.cpp | 4 +++- src/graphics/draw/CompassRenderer.cpp | 3 +++ src/graphics/emotes.cpp | 3 +++ src/modules/Telemetry/EnvironmentTelemetry.cpp | 2 ++ src/modules/Telemetry/PowerTelemetry.cpp | 2 ++ 6 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp index dcaa5d69b..8e1299f51 100644 --- a/src/graphics/SharedUIDisplay.cpp +++ b/src/graphics/SharedUIDisplay.cpp @@ -1,6 +1,8 @@ -#include "graphics/SharedUIDisplay.h" +#include "configuration.h" +#if HAS_SCREEN #include "RTC.h" #include "graphics/ScreenFonts.h" +#include "graphics/SharedUIDisplay.h" #include "graphics/draw/UIRenderer.h" #include "main.h" #include "meshtastic/config.pb.h" @@ -423,3 +425,4 @@ std::string sanitizeString(const std::string &input) } } // namespace graphics +#endif \ No newline at end of file diff --git a/src/graphics/VirtualKeyboard.cpp b/src/graphics/VirtualKeyboard.cpp index 84d5551cb..8062a0338 100644 --- a/src/graphics/VirtualKeyboard.cpp +++ b/src/graphics/VirtualKeyboard.cpp @@ -1,5 +1,6 @@ -#include "VirtualKeyboard.h" #include "configuration.h" +#if HAS_SCREEN +#include "VirtualKeyboard.h" #include "graphics/Screen.h" #include "graphics/ScreenFonts.h" #include "graphics/SharedUIDisplay.h" @@ -736,3 +737,4 @@ bool VirtualKeyboard::isTimedOut() const } } // namespace graphics +#endif \ No newline at end of file diff --git a/src/graphics/draw/CompassRenderer.cpp b/src/graphics/draw/CompassRenderer.cpp index 0e5a1d727..629949ffd 100644 --- a/src/graphics/draw/CompassRenderer.cpp +++ b/src/graphics/draw/CompassRenderer.cpp @@ -1,3 +1,5 @@ +#include "configuration.h" +#if HAS_SCREEN #include "CompassRenderer.h" #include "NodeDB.h" #include "UIRenderer.h" @@ -135,3 +137,4 @@ uint16_t getCompassDiam(uint32_t displayWidth, uint32_t displayHeight) } // namespace CompassRenderer } // namespace graphics +#endif \ No newline at end of file diff --git a/src/graphics/emotes.cpp b/src/graphics/emotes.cpp index e1a105d20..a0227d365 100644 --- a/src/graphics/emotes.cpp +++ b/src/graphics/emotes.cpp @@ -1,3 +1,5 @@ +#include "configuration.h" +#if HAS_SCREEN #include "emotes.h" namespace graphics @@ -275,3 +277,4 @@ const unsigned char bell_icon[] PROGMEM = { #endif } // namespace graphics +#endif \ No newline at end of file diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 95947560d..2337af808 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -361,6 +361,7 @@ bool EnvironmentTelemetryModule::wantUIFrame() return moduleConfig.telemetry.environment_screen_enabled; } +#if HAS_SCREEN void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { // === Setup display === @@ -510,6 +511,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt currentY += rowHeight; } } +#endif bool EnvironmentTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t) { diff --git a/src/modules/Telemetry/PowerTelemetry.cpp b/src/modules/Telemetry/PowerTelemetry.cpp index 479861a2e..e69ee3931 100644 --- a/src/modules/Telemetry/PowerTelemetry.cpp +++ b/src/modules/Telemetry/PowerTelemetry.cpp @@ -108,6 +108,7 @@ bool PowerTelemetryModule::wantUIFrame() return moduleConfig.telemetry.power_screen_enabled; } +#if HAS_SCREEN void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { display->clear(); @@ -165,6 +166,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s drawLine("Ch3", m.ch3_voltage, m.ch3_current); } } +#endif bool PowerTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t) { From e1c259ae32ade6524f43898d65fdc6c2282befe4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:21:24 -0500 Subject: [PATCH 026/286] Update protobufs (#8396) Co-authored-by: fifieldt <1287116+fifieldt@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/telemetry.pb.h | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/protobufs b/protobufs index 38638f19f..4a618380a 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 38638f19f84ad886222b484d6bf5a8459aed8c7e +Subproject commit 4a618380a0d80b476bb7f278008f811f456e0a5f diff --git a/src/mesh/generated/meshtastic/telemetry.pb.h b/src/mesh/generated/meshtastic/telemetry.pb.h index a8ca96e95..dec89ba15 100644 --- a/src/mesh/generated/meshtastic/telemetry.pb.h +++ b/src/mesh/generated/meshtastic/telemetry.pb.h @@ -101,7 +101,9 @@ typedef enum _meshtastic_TelemetrySensorType { /* SEN5X PM SENSORS */ meshtastic_TelemetrySensorType_SEN5X = 43, /* TSL2561 light sensor */ - meshtastic_TelemetrySensorType_TSL2561 = 44 + meshtastic_TelemetrySensorType_TSL2561 = 44, + /* BH1750 light sensor */ + meshtastic_TelemetrySensorType_BH1750 = 45 } meshtastic_TelemetrySensorType; /* Struct definitions */ @@ -438,8 +440,8 @@ extern "C" { /* Helper constants for enums */ #define _meshtastic_TelemetrySensorType_MIN meshtastic_TelemetrySensorType_SENSOR_UNSET -#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_TSL2561 -#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_TSL2561+1)) +#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_BH1750 +#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_BH1750+1)) From 2357ea004264fe9f433639ed1df8d197ae921e86 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 02:48:55 -0400 Subject: [PATCH 027/286] Clearer hop markers for inkHUD map --- .../InkHUD/Applets/Bases/Map/MapApplet.cpp | 357 ++++++++++++------ 1 file changed, 232 insertions(+), 125 deletions(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index db0805f4e..0639501ea 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -14,44 +14,128 @@ void InkHUD::MapApplet::onRender() } // Find center of map - // - latitude and longitude - // - will be placed at X(0.5), Y(0.5) getMapCenter(&latCenter, &lngCenter); - - // Calculate North+East distance of each node to map center - // - which nodes to use controlled by virtual shouldDrawNode method calculateAllMarkers(); - - // Set the region shown on the map - // - default: fit all nodes, plus padding - // - maybe overriden by derived applet - // - getMapSize *sets* passed parameters (C-style) getMapSize(&widthMeters, &heightMeters); - - // Set the metersToPx conversion value calculateMapScale(); - // Special marker for own node - meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); - if (ourNode && nodeDB->hasValidPosition(ourNode)) - drawLabeledMarker(ourNode); - - // Draw all markers + // Draw all markers first for (Marker m : markers) { int16_t x = X(0.5) + (m.eastMeters * metersToPx); int16_t y = Y(0.5) - (m.northMeters * metersToPx); - // Cross Size - constexpr uint16_t csMin = 5; - constexpr uint16_t csMax = 12; + // --- Add white halo outline first --- + constexpr int outlinePad = 2; // size of white outline padding + int boxSize = (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway ? 12 : 10; + fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, + boxSize + (outlinePad * 2), boxSize + (outlinePad * 2), WHITE); - // Too many hops away - if (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) // Too many mops - printAt(x, y, "!", CENTER, MIDDLE); - else if (!m.hasHopsAway) // Unknown hops - drawCross(x, y, csMin); - else // The fewer hops, the larger the cross - drawCross(x, y, map(m.hopsAway, 0, config.lora.hop_limit, csMax, csMin)); + // --- Draw actual marker on top --- + if (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) { + fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); + setFont(fontSmall); setTextColor(WHITE); + printAt(x, y, "X", CENTER, MIDDLE); + } + else if (!m.hasHopsAway) { + fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); + setFont(fontSmall); setTextColor(WHITE); + printAt(x, y, "?", CENTER, MIDDLE); + } + else { + fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); + char hopStr[4]; snprintf(hopStr, sizeof(hopStr), "%d", m.hopsAway); + setFont(fontSmall); setTextColor(WHITE); + printAt(x, y, hopStr, CENTER, MIDDLE); + } + + // Restore default font and color (safety for rest of UI) + setFont(fontSmall); setTextColor(BLACK); + } + + // Dual map scale bars + int16_t horizPx = width() * 0.25f; + int16_t vertPx = height() * 0.25f; + float horizMeters = horizPx / metersToPx; + float vertMeters = vertPx / metersToPx; + + auto formatDistance = [&](float meters, char *out, size_t len) { + if (config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) { + float feet = meters * 3.28084f; + if (feet < 528) snprintf(out, len, "%.0f ft", feet); + else { + float miles = feet / 5280.0f; + snprintf(out, len, miles < 10 ? "%.1f mi" : "%.0f mi", miles); + } + } else { + if (meters >= 1000) snprintf(out, len, "%.1f km", meters / 1000.0f); + else snprintf(out, len, "%.0f m", meters); + } + }; + + // === Horizontal scale bar === + int16_t horizBarY = height() - 2; + int16_t horizBarX = 1; + drawLine(horizBarX, horizBarY, horizBarX + horizPx, horizBarY, BLACK); + drawLine(horizBarX, horizBarY - 3, horizBarX, horizBarY + 3, BLACK); + drawLine(horizBarX + horizPx, horizBarY - 3, horizBarX + horizPx, horizBarY + 3, BLACK); + + char horizLabel[32]; + formatDistance(horizMeters, horizLabel, sizeof(horizLabel)); + int16_t horizLabelW = getTextWidth(horizLabel); + int16_t horizLabelH = getFont().lineHeight(); + int16_t horizLabelX = horizBarX + horizPx + 4; + int16_t horizLabelY = horizBarY - horizLabelH + 1; + fillRect(horizLabelX - 2, horizLabelY - 1, horizLabelW + 4, horizLabelH + 2, WHITE); + printAt(horizLabelX, horizBarY, horizLabel, LEFT, BOTTOM); + + // === Vertical scale bar === + int16_t vertBarX = 1; + int16_t vertBarBottom = horizBarY; + int16_t vertBarTop = vertBarBottom - vertPx; + drawLine(vertBarX, vertBarBottom, vertBarX, vertBarTop, BLACK); + drawLine(vertBarX - 3, vertBarBottom, vertBarX + 3, vertBarBottom, BLACK); + drawLine(vertBarX - 3, vertBarTop, vertBarX + 3, vertBarTop, BLACK); + + char vertTopLabel[32]; + formatDistance(vertMeters, vertTopLabel, sizeof(vertTopLabel)); + int16_t topLabelY = vertBarTop - getFont().lineHeight() - 2; + int16_t topLabelW = getTextWidth(vertTopLabel); + int16_t topLabelH = getFont().lineHeight(); + fillRect(vertBarX - 2, topLabelY - 1, topLabelW + 6, topLabelH + 2, WHITE); + printAt(vertBarX + (topLabelW / 2) + 1, topLabelY + (topLabelH / 2), vertTopLabel, CENTER, MIDDLE); + + char vertBottomLabel[32]; + formatDistance(horizMeters, vertBottomLabel, sizeof(vertBottomLabel)); + int16_t bottomLabelY = vertBarBottom + 4; + int16_t bottomLabelW = getTextWidth(vertBottomLabel); + int16_t bottomLabelH = getFont().lineHeight(); + fillRect(vertBarX - 2, bottomLabelY - 1, bottomLabelW + 6, bottomLabelH + 2, WHITE); + printAt(vertBarX + (bottomLabelW / 2) + 1, bottomLabelY + (bottomLabelH / 2), vertBottomLabel, CENTER, MIDDLE); + + // --- Draw our node LAST with full white fill + outline --- + meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); + if (ourNode && nodeDB->hasValidPosition(ourNode)) { + Marker self = calculateMarker( + ourNode->position.latitude_i * 1e-7, + ourNode->position.longitude_i * 1e-7, + false, + 0 + ); + + int16_t centerX = X(0.5) + (self.eastMeters * metersToPx); + int16_t centerY = Y(0.5) - (self.northMeters * metersToPx); + + // --- White fill background + halo --- + fillCircle(centerX, centerY, 8, WHITE); // big white base + drawCircle(centerX, centerY, 8, WHITE); // crisp edge + + // --- Black bullseye on top --- + drawCircle(centerX, centerY, 6, BLACK); + fillCircle(centerX, centerY, 2, BLACK); + + // --- Crosshairs --- + drawLine(centerX - 8, centerY, centerX + 8, centerY, BLACK); + drawLine(centerX, centerY - 8, centerX, centerY + 8, BLACK); } } @@ -63,110 +147,122 @@ void InkHUD::MapApplet::onRender() void InkHUD::MapApplet::getMapCenter(float *lat, float *lng) { - // Find mean lat long coords - // ============================ - // - assigning X, Y and Z values to position on Earth's surface in 3D space, relative to center of planet - // - averages the x, y and z coords - // - uses tan to find angles for lat / long degrees - // - longitude: triangle formed by x and y (on plane of the equator) - // - latitude: triangle formed by z (north south), - // and the line along plane of equator which stretches from earth's axis to where point xyz intersects planet's surface + // If we have a valid position for our own node, use that as the anchor + meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); + if (ourNode && nodeDB->hasValidPosition(ourNode)) { + *lat = ourNode->position.latitude_i * 1e-7; + *lng = ourNode->position.longitude_i * 1e-7; + } else { + // Find mean lat long coords + // ============================ + // - assigning X, Y and Z values to position on Earth's surface in 3D space, relative to center of planet + // - averages the x, y and z coords + // - uses tan to find angles for lat / long degrees + // - longitude: triangle formed by x and y (on plane of the equator) + // - latitude: triangle formed by z (north south), + // and the line along plane of equator which stretches from earth's axis to where point xyz intersects planet's surface - // Working totals, averaged after nodeDB processed - uint32_t positionCount = 0; - float xAvg = 0; - float yAvg = 0; - float zAvg = 0; + // Working totals, averaged after nodeDB processed + uint32_t positionCount = 0; + float xAvg = 0; + float yAvg = 0; + float zAvg = 0; - // For each node in db - for (uint32_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { - meshtastic_NodeInfoLite *node = nodeDB->getMeshNodeByIndex(i); + // For each node in db + for (uint32_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { + meshtastic_NodeInfoLite *node = nodeDB->getMeshNodeByIndex(i); - // Skip if no position - if (!nodeDB->hasValidPosition(node)) - continue; + // Skip if no position + if (!nodeDB->hasValidPosition(node)) + continue; - // Skip if derived applet doesn't want to show this node on the map - if (!shouldDrawNode(node)) - continue; + // Skip if derived applet doesn't want to show this node on the map + if (!shouldDrawNode(node)) + continue; - // Latitude and Longitude of node, in radians - float latRad = node->position.latitude_i * (1e-7) * DEG_TO_RAD; - float lngRad = node->position.longitude_i * (1e-7) * DEG_TO_RAD; + // Latitude and Longitude of node, in radians + float latRad = node->position.latitude_i * (1e-7) * DEG_TO_RAD; + float lngRad = node->position.longitude_i * (1e-7) * DEG_TO_RAD; - // Convert to cartesian points, with center of earth at 0, 0, 0 - // Exact distance from center is irrelevant, as we're only interested in the vector - float x = cos(latRad) * cos(lngRad); - float y = cos(latRad) * sin(lngRad); - float z = sin(latRad); + // Convert to cartesian points, with center of earth at 0, 0, 0 + // Exact distance from center is irrelevant, as we're only interested in the vector + float x = cos(latRad) * cos(lngRad); + float y = cos(latRad) * sin(lngRad); + float z = sin(latRad); - // To find mean values shortly - xAvg += x; - yAvg += y; - zAvg += z; - positionCount++; + // To find mean values shortly + xAvg += x; + yAvg += y; + zAvg += z; + positionCount++; + } + + // All NodeDB processed, find mean values + xAvg /= positionCount; + yAvg /= positionCount; + zAvg /= positionCount; + + // Longitude from cartesian coords + // (Angle from 3D coords describing a point of globe's surface) + /* + UK + /-------\ + (Top View) /- -\ + /- (You) -\ + /- . -\ + /- . X -\ + Asia - ... - USA + \- Y -/ + \- -/ + \- -/ + \- -/ + \- -----/ + Pacific + + */ + + *lng = atan2(yAvg, xAvg) * RAD_TO_DEG; + + // Latitude from cartesian coords + // (Angle from 3D coords describing a point on the globe's surface) + // As latitude increases, distance from the Earth's north-south axis out to our surface point decreases. + // Means we need to first find the hypotenuse which becomes base of our triangle in the second step + /* + UK North + /-------\ (Front View) /-------\ + (Top View) /- -\ /- -\ + /- (You) -\ /-(You) -\ + /- /. -\ /- . -\ + /- √X²+Y²/ . X -\ /- Z . -\ + Asia - /... - USA - ..... - + \- Y -/ \- √X²+Y² -/ + \- -/ \- -/ + \- -/ \- -/ + \- -/ \- -/ + \- -----/ \- -----/ + Pacific South + */ + + float hypotenuse = sqrt((xAvg * xAvg) + (yAvg * yAvg)); // Distance from globe's north-south axis to surface intersect + *lat = atan2(zAvg, hypotenuse) * RAD_TO_DEG; } - // All NodeDB processed, find mean values - xAvg /= positionCount; - yAvg /= positionCount; - zAvg /= positionCount; - - // Longitude from cartesian coords - // (Angle from 3D coords describing a point of globe's surface) - /* - UK - /-------\ - (Top View) /- -\ - /- (You) -\ - /- . -\ - /- . X -\ - Asia - ... - USA - \- Y -/ - \- -/ - \- -/ - \- -/ - \- -----/ - Pacific - - */ - - *lng = atan2(yAvg, xAvg) * RAD_TO_DEG; - - // Latitude from cartesian coords - // (Angle from 3D coords describing a point on the globe's surface) - // As latitude increases, distance from the Earth's north-south axis out to our surface point decreases. - // Means we need to first find the hypotenuse which becomes base of our triangle in the second step - /* - UK North - /-------\ (Front View) /-------\ - (Top View) /- -\ /- -\ - /- (You) -\ /-(You) -\ - /- /. -\ /- . -\ - /- √X²+Y²/ . X -\ /- Z . -\ - Asia - /... - USA - ..... - - \- Y -/ \- √X²+Y² -/ - \- -/ \- -/ - \- -/ \- -/ - \- -/ \- -/ - \- -----/ \- -----/ - Pacific South - */ - - float hypotenuse = sqrt((xAvg * xAvg) + (yAvg * yAvg)); // Distance from globe's north-south axis to surface intersect - *lat = atan2(zAvg, hypotenuse) * RAD_TO_DEG; + // Use either our node position, or the mean fallback as the center + latCenter = *lat; + lngCenter = *lng; // ---------------------------------------------- - // This has given us the "mean position" - // This will be a position *somewhere* near the center of our nodes. - // What we actually want is to place our center so that our outermost nodes end up on the border of our map. - // The only real use of our "mean position" is to give us a reference frame: - // which direction is east, and which is west. + // This has given us either: + // - our actual position (preferred), or + // - a mean position (fallback if we had no fix) + // + // What we actually want is to place our center so that our outermost nodes + // end up on the border of our map. The only real use of our "center" is to give + // us a reference frame: which direction is east, and which is west. //------------------------------------------------ - // Find furthest nodes from "mean lat long" + // Find furthest nodes from our center // ======================================== - float northernmost = latCenter; float southernmost = latCenter; float easternmost = lngCenter; @@ -184,14 +280,14 @@ void InkHUD::MapApplet::getMapCenter(float *lat, float *lng) continue; // Check for a new top or bottom latitude - float lat = node->position.latitude_i * 1e-7; - northernmost = max(northernmost, lat); - southernmost = min(southernmost, lat); + float latNode = node->position.latitude_i * 1e-7; + northernmost = max(northernmost, latNode); + southernmost = min(southernmost, latNode); // Longitude is trickier - float lng = node->position.longitude_i * 1e-7; - float degEastward = fmod(((lng - lngCenter) + 360), 360); // Degrees traveled east from lngCenter to reach node - float degWestward = abs(fmod(((lng - lngCenter) - 360), 360)); // Degrees traveled west from lngCenter to reach node + float lngNode = node->position.longitude_i * 1e-7; + float degEastward = fmod(((lngNode - lngCenter) + 360), 360); // Degrees traveled east from lngCenter to reach node + float degWestward = abs(fmod(((lngNode - lngCenter) - 360), 360)); // Degrees traveled west from lngCenter to reach node if (degEastward < degWestward) easternmost = max(easternmost, lngCenter + degEastward); else @@ -250,7 +346,6 @@ InkHUD::MapApplet::Marker InkHUD::MapApplet::calculateMarker(float lat, float ln m.hopsAway = hopsAway; return m; } - // Draw a marker on the map for a node, with a shortname label, and backing box void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) { @@ -324,6 +419,18 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) textX = labelX + paddingW; } + // Prevent overlap with scale bars and their labels + // Define a "safe zone" in the bottom-left where the scale bars and text are drawn + constexpr int16_t safeZoneHeight = 28; // adjust based on your label font height + constexpr int16_t safeZoneWidth = 60; // adjust based on horizontal label width zone + bool overlapsScale = (labelY + labelH > height() - safeZoneHeight) && (labelX < safeZoneWidth); + + // If it overlaps, shift label upward slightly above the safe zone + if (overlapsScale) { + labelY = height() - safeZoneHeight - labelH - 2; + textY = labelY + (labelH / 2); + } + // Backing box fillRect(labelX, labelY, labelW, labelH, WHITE); drawRect(labelX, labelY, labelW, labelH, BLACK); From 68e739359f0b9387025b59f40b289ebdfb2e1622 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 03:36:25 -0400 Subject: [PATCH 028/286] cleanup --- .../InkHUD/Applets/Bases/Map/MapApplet.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index 0639501ea..89e6f35f1 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -24,13 +24,13 @@ void InkHUD::MapApplet::onRender() int16_t x = X(0.5) + (m.eastMeters * metersToPx); int16_t y = Y(0.5) - (m.northMeters * metersToPx); - // --- Add white halo outline first --- - constexpr int outlinePad = 2; // size of white outline padding + // Add white halo outline first + constexpr int outlinePad = 1; // size of white outline padding int boxSize = (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway ? 12 : 10; fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, boxSize + (outlinePad * 2), boxSize + (outlinePad * 2), WHITE); - // --- Draw actual marker on top --- + // Draw actual marker on top if (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) { fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); setFont(fontSmall); setTextColor(WHITE); @@ -72,7 +72,7 @@ void InkHUD::MapApplet::onRender() } }; - // === Horizontal scale bar === + // Horizontal scale bar int16_t horizBarY = height() - 2; int16_t horizBarX = 1; drawLine(horizBarX, horizBarY, horizBarX + horizPx, horizBarY, BLACK); @@ -88,7 +88,7 @@ void InkHUD::MapApplet::onRender() fillRect(horizLabelX - 2, horizLabelY - 1, horizLabelW + 4, horizLabelH + 2, WHITE); printAt(horizLabelX, horizBarY, horizLabel, LEFT, BOTTOM); - // === Vertical scale bar === + // Vertical scale bar int16_t vertBarX = 1; int16_t vertBarBottom = horizBarY; int16_t vertBarTop = vertBarBottom - vertPx; @@ -112,7 +112,7 @@ void InkHUD::MapApplet::onRender() fillRect(vertBarX - 2, bottomLabelY - 1, bottomLabelW + 6, bottomLabelH + 2, WHITE); printAt(vertBarX + (bottomLabelW / 2) + 1, bottomLabelY + (bottomLabelH / 2), vertBottomLabel, CENTER, MIDDLE); - // --- Draw our node LAST with full white fill + outline --- + // Draw our node LAST with full white fill + outline meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); if (ourNode && nodeDB->hasValidPosition(ourNode)) { Marker self = calculateMarker( @@ -125,15 +125,15 @@ void InkHUD::MapApplet::onRender() int16_t centerX = X(0.5) + (self.eastMeters * metersToPx); int16_t centerY = Y(0.5) - (self.northMeters * metersToPx); - // --- White fill background + halo --- + // White fill background + halo fillCircle(centerX, centerY, 8, WHITE); // big white base drawCircle(centerX, centerY, 8, WHITE); // crisp edge - // --- Black bullseye on top --- + // Black bullseye on top drawCircle(centerX, centerY, 6, BLACK); fillCircle(centerX, centerY, 2, BLACK); - // --- Crosshairs --- + // Crosshairs drawLine(centerX - 8, centerY, centerX + 8, centerY, BLACK); drawLine(centerX, centerY - 8, centerX, centerY + 8, BLACK); } From 7afc6ef8331d253b78cb597e1ff255ac56db5456 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 03:47:02 -0400 Subject: [PATCH 029/286] trunk --- .../InkHUD/Applets/Bases/Map/MapApplet.cpp | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index 89e6f35f1..aee51c6ad 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -27,48 +27,54 @@ void InkHUD::MapApplet::onRender() // Add white halo outline first constexpr int outlinePad = 1; // size of white outline padding int boxSize = (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway ? 12 : 10; - fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, - boxSize + (outlinePad * 2), boxSize + (outlinePad * 2), WHITE); + fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, boxSize + (outlinePad * 2), + boxSize + (outlinePad * 2), WHITE); // Draw actual marker on top if (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) { fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); - setFont(fontSmall); setTextColor(WHITE); + setFont(fontSmall); + setTextColor(WHITE); printAt(x, y, "X", CENTER, MIDDLE); - } - else if (!m.hasHopsAway) { + } else if (!m.hasHopsAway) { fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); - setFont(fontSmall); setTextColor(WHITE); + setFont(fontSmall); + setTextColor(WHITE); printAt(x, y, "?", CENTER, MIDDLE); - } - else { + } else { fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); - char hopStr[4]; snprintf(hopStr, sizeof(hopStr), "%d", m.hopsAway); - setFont(fontSmall); setTextColor(WHITE); + char hopStr[4]; + snprintf(hopStr, sizeof(hopStr), "%d", m.hopsAway); + setFont(fontSmall); + setTextColor(WHITE); printAt(x, y, hopStr, CENTER, MIDDLE); } // Restore default font and color (safety for rest of UI) - setFont(fontSmall); setTextColor(BLACK); + setFont(fontSmall); + setTextColor(BLACK); } // Dual map scale bars int16_t horizPx = width() * 0.25f; - int16_t vertPx = height() * 0.25f; + int16_t vertPx = height() * 0.25f; float horizMeters = horizPx / metersToPx; - float vertMeters = vertPx / metersToPx; + float vertMeters = vertPx / metersToPx; auto formatDistance = [&](float meters, char *out, size_t len) { if (config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) { float feet = meters * 3.28084f; - if (feet < 528) snprintf(out, len, "%.0f ft", feet); + if (feet < 528) + snprintf(out, len, "%.0f ft", feet); else { float miles = feet / 5280.0f; snprintf(out, len, miles < 10 ? "%.1f mi" : "%.0f mi", miles); } } else { - if (meters >= 1000) snprintf(out, len, "%.1f km", meters / 1000.0f); - else snprintf(out, len, "%.0f m", meters); + if (meters >= 1000) + snprintf(out, len, "%.1f km", meters / 1000.0f); + else + snprintf(out, len, "%.0f m", meters); } }; @@ -115,12 +121,7 @@ void InkHUD::MapApplet::onRender() // Draw our node LAST with full white fill + outline meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); if (ourNode && nodeDB->hasValidPosition(ourNode)) { - Marker self = calculateMarker( - ourNode->position.latitude_i * 1e-7, - ourNode->position.longitude_i * 1e-7, - false, - 0 - ); + Marker self = calculateMarker(ourNode->position.latitude_i * 1e-7, ourNode->position.longitude_i * 1e-7, false, 0); int16_t centerX = X(0.5) + (self.eastMeters * metersToPx); int16_t centerY = Y(0.5) - (self.northMeters * metersToPx); @@ -160,7 +161,8 @@ void InkHUD::MapApplet::getMapCenter(float *lat, float *lng) // - uses tan to find angles for lat / long degrees // - longitude: triangle formed by x and y (on plane of the equator) // - latitude: triangle formed by z (north south), - // and the line along plane of equator which stretches from earth's axis to where point xyz intersects planet's surface + // and the line along plane of equator which stretches from earth's axis to where point xyz intersects planet's + // surface // Working totals, averaged after nodeDB processed uint32_t positionCount = 0; @@ -422,13 +424,13 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) // Prevent overlap with scale bars and their labels // Define a "safe zone" in the bottom-left where the scale bars and text are drawn constexpr int16_t safeZoneHeight = 28; // adjust based on your label font height - constexpr int16_t safeZoneWidth = 60; // adjust based on horizontal label width zone + constexpr int16_t safeZoneWidth = 60; // adjust based on horizontal label width zone bool overlapsScale = (labelY + labelH > height() - safeZoneHeight) && (labelX < safeZoneWidth); // If it overlaps, shift label upward slightly above the safe zone if (overlapsScale) { labelY = height() - safeZoneHeight - labelH - 2; - textY = labelY + (labelH / 2); + textY = labelY + (labelH / 2); } // Backing box From 05c176c16a1377991bc3de04f6969d2e2d3324fa Mon Sep 17 00:00:00 2001 From: igorka48 <10116759+igorka48@users.noreply.github.com> Date: Sun, 19 Oct 2025 12:48:06 +0300 Subject: [PATCH 030/286] Added support for SugarCube device (#8187) * Added support for SugarCube device * Update variants/esp32/sugarcube/platformio.ini Co-authored-by: Austin * added buzzer pin * Apply PR comments * Fix MR comments --------- Co-authored-by: Austin --- variants/esp32/tlora_v2_1_16/platformio.ini | 9 +++++++++ variants/esp32/tlora_v2_1_16/variant.h | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/variants/esp32/tlora_v2_1_16/platformio.ini b/variants/esp32/tlora_v2_1_16/platformio.ini index 6967bb480..8d5bdab9e 100644 --- a/variants/esp32/tlora_v2_1_16/platformio.ini +++ b/variants/esp32/tlora_v2_1_16/platformio.ini @@ -5,3 +5,12 @@ board_check = true build_flags = ${esp32_base.build_flags} -D TLORA_V2_1_16 -I variants/esp32/tlora_v2_1_16 upload_speed = 115200 + +[env:sugarcube] +extends = env:tlora-v2-1-1_6 +board_level = extra +build_flags = + ${env:tlora-v2-1-1_6.build_flags} + -DBUTTON_PIN=0 + -DPIN_BUZZER=25 + -DLED_PIN=-1 \ No newline at end of file diff --git a/variants/esp32/tlora_v2_1_16/variant.h b/variants/esp32/tlora_v2_1_16/variant.h index 48c069ab7..9584dd68b 100644 --- a/variants/esp32/tlora_v2_1_16/variant.h +++ b/variants/esp32/tlora_v2_1_16/variant.h @@ -8,7 +8,11 @@ #define I2C_SDA 21 // I2C pins for this board #define I2C_SCL 22 +#if defined(LED_PIN) && LED_PIN == -1 +#undef LED_PIN +#else #define LED_PIN 25 // If defined we will blink this LED +#endif #define USE_RF95 #define LORA_DIO0 26 // a No connect on the SX1262 module From d2403437fff723f2bb6625fe3b5bfbb689e7e358 Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Sun, 19 Oct 2025 10:35:30 +0100 Subject: [PATCH 031/286] Make packet pool dynamic again on STM32 as a workaround --- src/mesh/Router.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index 60637cbd1..5cf8bfa7d 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -35,6 +35,15 @@ (MAX_RX_TOPHONE + MAX_RX_FROMRADIO + 2 * MAX_TX_QUEUE + \ 2) // max number of packets which can be in flight (either queued from reception or queued for sending) +static MemoryDynamic dynamicPool; +Allocator &packetPool = dynamicPool; +#elif defined(ARCH_STM32WL) +// On STM32 there isn't enough heap left over for the rest of the firmware if we allocate this statically. +// For now, make it dynamic again. +#define MAX_PACKETS \ + (MAX_RX_TOPHONE + MAX_RX_FROMRADIO + 2 * MAX_TX_QUEUE + \ + 2) // max number of packets which can be in flight (either queued from reception or queued for sending) + static MemoryDynamic dynamicPool; Allocator &packetPool = dynamicPool; #else From f2a63faddd43752decf087a7cda003c809033bb1 Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Sun, 19 Oct 2025 06:32:58 -0400 Subject: [PATCH 032/286] Fix NimbleBluetooth reliability and performance (#8385) * Initial work to get NimbleBluetooth working reliably, and cross-task mutexes cleaned up * Pre-fill toPhoneQueue when safe (during config/nodeinfo): runOnceToPhoneCanPreloadNextPacket * Handle 0-byte responses breaking clients during initial config phases * requestLowerPowerConnection * PhoneAPI: onConfigStart and onConfigComplete callbacks for subclasses * NimbleBluetooth: switch to high-throughput BLE mode during config, then lower-power BLE mode for steady-state * Add some documentation to NimbleBluetooth.cpp * make cppcheck happier * Allow runOnceHandleToPhoneQueue to tell runOnce to shouldBreakAndRetryLater, so we don't busy-loop forever in runOnce * Gating some logging behind DEBUG_NIMBLE_ON_READ_TIMING ifdef again; bump retry count * Add check for connected state in NimBLE onRead() --------- Co-authored-by: Jonathan Bennett --- src/mesh/PhoneAPI.cpp | 31 +- src/mesh/PhoneAPI.h | 6 + src/nimble/NimbleBluetooth.cpp | 536 +++++++++++++++++++++++++++++---- 3 files changed, 512 insertions(+), 61 deletions(-) diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index 51a2bc148..d1e342c80 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -57,6 +57,9 @@ void PhoneAPI::handleStartConfig() #endif } + // Allow subclasses to prepare for high-throughput config traffic + onConfigStart(); + // even if we were already connected - restart our state machine if (config_nonce == SPECIAL_NONCE_ONLY_NODES) { // If client only wants node info, jump directly to sending nodes @@ -71,7 +74,7 @@ void PhoneAPI::handleStartConfig() spiLock->unlock(); LOG_DEBUG("Got %d files in manifest", filesManifest.size()); - LOG_INFO("Start API client config"); + LOG_INFO("Start API client config millis=%u", millis()); // Protect against concurrent BLE callbacks: they run in NimBLE's FreeRTOS task and also touch nodeInfoQueue. { concurrency::LockGuard guard(&nodeInfoMutex); @@ -453,7 +456,10 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) break; case STATE_SEND_OTHER_NODEINFOS: { - LOG_DEBUG("Send known nodes"); + if (readIndex == 2) { // readIndex==2 will be true for the first non-us node + LOG_INFO("Start sending nodeinfos millis=%u", millis()); + } + meshtastic_NodeInfo infoToSend = {}; { concurrency::LockGuard guard(&nodeInfoMutex); @@ -470,13 +476,22 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) if (infoToSend.num != 0) { // Just in case we stored a different user.id in the past, but should never happen going forward sprintf(infoToSend.user.id, "!%08x", infoToSend.num); - LOG_DEBUG("nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s", infoToSend.num, infoToSend.last_heard, - infoToSend.user.id, infoToSend.user.long_name); + + // Logging this really slows down sending nodes on initial connection because the serial console is so slow, so only + // uncomment if you really need to: + // LOG_INFO("nodeinfo: num=0x%x, lastseen=%u, id=%s, name=%s", nodeInfoForPhone.num, nodeInfoForPhone.last_heard, + // nodeInfoForPhone.user.id, nodeInfoForPhone.user.long_name); + + // Occasional progress logging. (readIndex==2 will be true for the first non-us node) + if (readIndex == 2 || readIndex % 20 == 0) { + LOG_DEBUG("nodeinfo: %d/%d", readIndex, nodeDB->getNumMeshNodes()); + } + fromRadioScratch.which_payload_variant = meshtastic_FromRadio_node_info_tag; fromRadioScratch.node_info = infoToSend; prefetchNodeInfos(); } else { - LOG_DEBUG("Done sending nodeinfo"); + LOG_DEBUG("Done sending %d of %d nodeinfos millis=%u", readIndex, nodeDB->getNumMeshNodes(), millis()); concurrency::LockGuard guard(&nodeInfoMutex); nodeInfoQueue.clear(); state = STATE_SEND_FILEMANIFEST; @@ -558,11 +573,15 @@ size_t PhoneAPI::getFromRadio(uint8_t *buf) void PhoneAPI::sendConfigComplete() { - LOG_INFO("Config Send Complete"); + LOG_INFO("Config Send Complete millis=%u", millis()); fromRadioScratch.which_payload_variant = meshtastic_FromRadio_config_complete_id_tag; fromRadioScratch.config_complete_id = config_nonce; config_nonce = 0; state = STATE_SEND_PACKETS; + + // Allow subclasses to know we've entered steady-state so they can lower power consumption + onConfigComplete(); + pauseBluetoothLogging = false; } diff --git a/src/mesh/PhoneAPI.h b/src/mesh/PhoneAPI.h index a8d0faa28..d6682684f 100644 --- a/src/mesh/PhoneAPI.h +++ b/src/mesh/PhoneAPI.h @@ -136,6 +136,7 @@ class PhoneAPI bool available(); bool isConnected() { return state != STATE_SEND_NOTHING; } + bool isSendingPackets() { return state == STATE_SEND_PACKETS; } protected: /// Our fromradio packet while it is being assembled @@ -158,6 +159,11 @@ class PhoneAPI */ virtual void onNowHasData(uint32_t fromRadioNum) {} + /// Subclasses can use these lifecycle hooks for transport-specific behavior around config/steady-state + /// (i.e. BLE connection params) + virtual void onConfigStart() {} + virtual void onConfigComplete() {} + /// begin a new connection void handleStartConfig(); diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index eb1d909f1..9accf23c6 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -3,12 +3,15 @@ #include "BluetoothCommon.h" #include "NimbleBluetooth.h" #include "PowerFSM.h" +#include "StaticPointerQueue.h" +#include "concurrency/OSThread.h" #include "main.h" #include "mesh/PhoneAPI.h" #include "mesh/mesh-pb-constants.h" #include "sleep.h" #include +#include #include #ifdef NIMBLE_TWO @@ -32,45 +35,288 @@ constexpr uint16_t kPreferredBleTxTimeUs = (kPreferredBleTxOctets + 14) * 8; } // namespace #endif +// Debugging options: careful, they slow things down quite a bit! +// #define DEBUG_NIMBLE_ON_READ_TIMING // uncomment to time onRead duration +// #define DEBUG_NIMBLE_ON_WRITE_TIMING // uncomment to time onWrite duration +// #define DEBUG_NIMBLE_NOTIFY // uncomment to enable notify logging + +#define NIMBLE_BLUETOOTH_TO_PHONE_QUEUE_SIZE 3 +#define NIMBLE_BLUETOOTH_FROM_PHONE_QUEUE_SIZE 3 + NimBLECharacteristic *fromNumCharacteristic; NimBLECharacteristic *BatteryCharacteristic; NimBLECharacteristic *logRadioCharacteristic; NimBLEServer *bleServer; static bool passkeyShowing; +static std::atomic nimbleBluetoothConnHandle{-1}; // actual handles are uint16_t, so -1 means "no connection" class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread { + /* + CAUTION: There's a lot going on here and lots of room to break things. + + This NimbleBluetooth.cpp file does some tricky synchronization between the NimBLE FreeRTOS task (which runs the onRead and + onWrite callbacks) and the main task (which runs runOnce and the rest of PhoneAPI). + + The main idea is to add a little bit of synchronization here to make it so that the rest of the codebase doesn't have to + know about concurrency and mutexes, and can just run happily ever after as a cooperative multitasking OSThread system, where + locking isn't something that anyone has to worry about too much! :) + + We achieve this by having some queues and mutexes in this file only, and ensuring that all calls to getFromRadio and + handleToRadio are only made from the main FreeRTOS task. This way, the rest of the codebase doesn't have to worry about + being run concurrently, which would make everything else much much much more complicated. + + PHONE -> RADIO: + - [NimBLE FreeRTOS task:] onWrite callback holds fromPhoneMutex and pushes received packets into fromPhoneQueue. + - [Main task:] runOnceHandleFromPhoneQueue in main task holds fromPhoneMutex, pulls packets from fromPhoneQueue, and calls + handleToRadio **in main task**. + + RADIO -> PHONE: + - [NimBLE FreeRTOS task:] onRead callback sets onReadCallbackIsWaitingForData flag and polls in a busy loop. (unless + there's already a packet waiting in toPhoneQueue) + - [Main task:] runOnceHandleToPhoneQueue sees onReadCallbackIsWaitingForData flag, calls getFromRadio **in main task** to + get packets from radio, holds toPhoneMutex, pushes the packet into toPhoneQueue, and clears the + onReadCallbackIsWaitingForData flag. + - [NimBLE FreeRTOS task:] onRead callback sees that the onReadCallbackIsWaitingForData flag cleared, holds toPhoneMutex, + pops the packet from toPhoneQueue, and returns it to NimBLE. + + MUTEXES: + - fromPhoneMutex protects fromPhoneQueue and fromPhoneQueueSize + - toPhoneMutex protects toPhoneQueue, toPhoneQueueByteSizes, and toPhoneQueueSize + + ATOMICS: + - fromPhoneQueueSize is only increased by onWrite, and only decreased by runOnceHandleFromPhoneQueue (or onDisconnect). + - toPhoneQueueSize is only increased by runOnceHandleToPhoneQueue, and only decreased by onRead (or onDisconnect). + - onReadCallbackIsWaitingForData is a flag. It's only set by onRead, and only cleared by runOnceHandleToPhoneQueue (or + onDisconnect). + + PRELOADING: see comments in runOnceToPhoneCanPreloadNextPacket about when it's safe to preload packets from getFromRadio. + + BLE CONNECTION PARAMS: + - During config, we request a high-throughput, low-latency BLE connection for speed. + - After config, we switch to a lower-power BLE connection for steady-state use to extend battery life. + + MEMORY MANAGEMENT: + - We keep packets on the stack and do not allocate heap. + - We use std::array for fromPhoneQueue and toPhoneQueue to avoid mallocs and frees across FreeRTOS tasks. + - Yes, we have to do some copy operations on pop because of this, but it's worth it to avoid cross-task memory management. + + NOTIFY IS BROKEN: + - Adding NIMBLE_PROPERTY::NOTIFY to FromRadioCharacteristic appears to break things. It is NOT backwards compatible. + + ZERO-SIZE READS: + - Returning a zero-size read from onRead breaks some clients during the config phase. So we have to block onRead until we + have data. + - During the STATE_SEND_PACKETS phase, it's totally OK to return zero-size reads, as clients are expected to do reads + until they get a 0-byte response. + + CROSS-TASK WAKEUP: + - If you call: bluetoothPhoneAPI->setIntervalFromNow(0); to schedule immediate processing of new data, + - Then you should also call: concurrency::mainDelay.interrupt(); to wake up the main loop if it's sleeping. + - Otherwise, you're going to wait ~100ms or so until the main loop wakes up from some other cause. + */ + public: - BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") { nimble_queue.resize(3); } - std::vector nimble_queue; - std::mutex nimble_mutex; - uint8_t queue_size = 0; - uint8_t fromRadioBytes[meshtastic_FromRadio_size] = {0}; - size_t numBytes = 0; - bool hasChecked = false; - bool phoneWants = false; + BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") {} + + /* Packets from phone (BLE onWrite callback) */ + std::mutex fromPhoneMutex; + std::atomic fromPhoneQueueSize{0}; + // We use array here (and pay the cost of memcpy) to avoid dynamic memory allocations and frees across FreeRTOS tasks. + std::array fromPhoneQueue{}; + + /* Packets to phone (BLE onRead callback) */ + std::mutex toPhoneMutex; + std::atomic toPhoneQueueSize{0}; + // We use array here (and pay the cost of memcpy) to avoid dynamic memory allocations and frees across FreeRTOS tasks. + std::array, NIMBLE_BLUETOOTH_TO_PHONE_QUEUE_SIZE> toPhoneQueue{}; + std::array toPhoneQueueByteSizes{}; + // The onReadCallbackIsWaitingForData flag provides synchronization between the NimBLE task's onRead callback and our main + // task's runOnce. It's only set by onRead, and only cleared by runOnce. + std::atomic onReadCallbackIsWaitingForData{false}; + + /* Statistics/logging helpers */ + std::atomic readCount{0}; + std::atomic notifyCount{0}; + std::atomic writeCount{0}; protected: virtual int32_t runOnce() override { - std::lock_guard guard(nimble_mutex); - if (queue_size > 0) { - for (uint8_t i = 0; i < queue_size; i++) { - handleToRadio(nimble_queue.at(i).data(), nimble_queue.at(i).length()); + bool shouldBreakAndRetryLater = false; + + while (runOnceHasWorkToDo()) { + // Important that we service onRead first, because the onRead callback blocks NimBLE until we clear + // onReadCallbackIsWaitingForData. + shouldBreakAndRetryLater = runOnceHandleToPhoneQueue(); // push data from getFromRadio to onRead + runOnceHandleFromPhoneQueue(); // pull data from onWrite to handleToRadio + + if (shouldBreakAndRetryLater) { + // onRead still wants data, but it's not available yet. Return so we can try again when a packet may be ready. +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_INFO("BLE runOnce breaking to retry later (leaving onRead waiting)"); +#endif + return 100; // try again in 100ms } - LOG_DEBUG("Queue_size %u", queue_size); - queue_size = 0; - } - if (!hasChecked && phoneWants) { - // Pull fresh data while we're outside of the NimBLE callback context. - numBytes = getFromRadio(fromRadioBytes); - hasChecked = true; } // the run is triggered via NimbleBluetoothToRadioCallback and NimbleBluetoothFromRadioCallback return INT32_MAX; } + + virtual void onConfigStart() override + { + LOG_INFO("BLE onConfigStart"); + + // Prefer high throughput during config/setup, at the cost of high power consumption (for a few seconds) + if (bleServer && isConnected()) { + int32_t conn_handle = nimbleBluetoothConnHandle.load(); + if (conn_handle != -1) { + requestHighThroughputConnection(static_cast(conn_handle)); + } + } + } + + virtual void onConfigComplete() override + { + LOG_INFO("BLE onConfigComplete"); + + // Switch to lower power consumption BLE connection params for steady-state use after config/setup is complete + if (bleServer && isConnected()) { + int32_t conn_handle = nimbleBluetoothConnHandle.load(); + if (conn_handle != -1) { + requestLowerPowerConnection(static_cast(conn_handle)); + } + } + } + + bool runOnceHasWorkToDo() { return runOnceHasWorkToPhone() || runOnceHasWorkFromPhone(); } + + bool runOnceHasWorkToPhone() { return onReadCallbackIsWaitingForData || runOnceToPhoneCanPreloadNextPacket(); } + + bool runOnceToPhoneCanPreloadNextPacket() + { + /* + * PRELOADING getFromRadio RESPONSES: + * + * It's not safe to preload packets if we're in STATE_SEND_PACKETS, because there may be a while between the time we call + * getFromRadio and when the client actually reads it. If the connection drops in that time, we might lose that packet + * forever. In STATE_SEND_PACKETS, if we wait for onRead before we call getFromRadio, we minimize the time window where + * the client might disconnect before completing the read. + * + * However, if we're in the setup states (sending config, nodeinfo, etc), it's safe and beneficial to preload packets into + * toPhoneQueue because the client will just reconnect after a disconnect, losing nothing. + */ + + if (!isConnected()) { + return false; + } else if (isSendingPackets()) { + // If we're in STATE_SEND_PACKETS, we must wait for onRead before calling getFromRadio. + return false; + } else { + // In other states, we can preload as long as there's space in the toPhoneQueue. + return toPhoneQueueSize < NIMBLE_BLUETOOTH_TO_PHONE_QUEUE_SIZE; + } + } + + bool runOnceHandleToPhoneQueue() + { + // Returns false normally. + // Returns true if we should break out of runOnce and retry later, such as setup states where getFromRadio returns 0 + // bytes. + + // Stack buffer for getFromRadio packet + uint8_t fromRadioBytes[meshtastic_FromRadio_size] = {0}; + size_t numBytes = 0; + + if (onReadCallbackIsWaitingForData || runOnceToPhoneCanPreloadNextPacket()) { + numBytes = getFromRadio(fromRadioBytes); + + if (numBytes == 0) { + // Client expected a read, but we have nothing to send. + // Returning a 0-byte packet breaks clients during the config phase, so we have to block onRead until there's a + // packet ready. + if (isSendingPackets()) { + // In STATE_SEND_PACKETS, it is 100% OK to return a 0-byte response, as we expect clients to do read beyond + // notifies regularly, to make sure they have nothing else to read. +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE getFromRadio returned numBytes=0, but in STATE_SEND_PACKETS, so clearing " + "onReadCallbackIsWaitingForData flag"); +#endif + } else { + // In other states, this breaks clients. + // Return early, leaving onReadCallbackIsWaitingForData==true so onRead knows to try again. + // This gives runOnce a chance to handleToRadio and produce a response. +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE getFromRadio returned numBytes=0. Blocking onRead until we have data"); +#endif + + // Return true to tell runOnce to shouldBreakAndRetryLater, so we don't busy-loop in runOnce even though + // onRead is still waiting! + return true; + } + } else { + // Push to toPhoneQueue, protected by toPhoneMutex. Hold the mutex as briefly as possible. + if (toPhoneQueueSize < NIMBLE_BLUETOOTH_TO_PHONE_QUEUE_SIZE) { + // Note: the comparison above is safe without a mutex because we are the only method that *increases* + // toPhoneQueueSize. (It's okay if toPhoneQueueSize *decreases* in the NimBLE task meanwhile.) + + { // scope for toPhoneMutex mutex + std::lock_guard guard(toPhoneMutex); + size_t storeAtIndex = toPhoneQueueSize.load(); + memcpy(toPhoneQueue[storeAtIndex].data(), fromRadioBytes, numBytes); + toPhoneQueueByteSizes[storeAtIndex] = numBytes; + toPhoneQueueSize++; + } +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE getFromRadio returned numBytes=%u, pushed toPhoneQueueSize=%u", numBytes, + toPhoneQueueSize.load()); +#endif + } else { + // Shouldn't happen because the onRead callback shouldn't be waiting if the queue is full! + LOG_ERROR("Shouldn't happen! Drop FromRadio packet, toPhoneQueue full (%u bytes)", numBytes); + } + } + + // Clear the onReadCallbackIsWaitingForData flag so onRead knows it can proceed. + onReadCallbackIsWaitingForData = false; // only clear this flag AFTER the push + } + + return false; + } + + bool runOnceHasWorkFromPhone() { return fromPhoneQueueSize > 0; } + + void runOnceHandleFromPhoneQueue() + { + // Handle packets we received from onWrite from the phone. + if (fromPhoneQueueSize > 0) { + // Note: the comparison above is safe without a mutex because we are the only method that *decreases* + // fromPhoneQueueSize. (It's okay if fromPhoneQueueSize *increases* in the NimBLE task meanwhile.) + + LOG_DEBUG("NimbleBluetooth: handling ToRadio packet, fromPhoneQueueSize=%u", fromPhoneQueueSize.load()); + + // Pop the front of fromPhoneQueue, holding the mutex only briefly while we pop. + NimBLEAttValue val; + { // scope for fromPhoneMutex mutex + std::lock_guard guard(fromPhoneMutex); + val = fromPhoneQueue[0]; + + // Shift the rest of the queue down + for (uint8_t i = 1; i < fromPhoneQueueSize; i++) { + fromPhoneQueue[i - 1] = fromPhoneQueue[i]; + } + + // Safe decrement due to onDisconnect + if (fromPhoneQueueSize > 0) + fromPhoneQueueSize--; + } + + handleToRadio(val.data(), val.length()); + } + } + /** * Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies) */ @@ -78,14 +324,22 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread { PhoneAPI::onNowHasData(fromRadioNum); + int currentNotifyCount = notifyCount.fetch_add(1); + uint8_t cc = bleServer->getConnectedCount(); - LOG_DEBUG("BLE notify fromNum: %d connections: %d", fromRadioNum, cc); + +#ifdef DEBUG_NIMBLE_NOTIFY + // This logging slows things down when there are lots of packets going to the phone, like initial connection: + LOG_DEBUG("BLE notify(%d) fromNum: %d connections: %d", currentNotifyCount, fromRadioNum, cc); +#endif uint8_t val[4]; put_le32(val, fromRadioNum); fromNumCharacteristic->setValue(val, sizeof(val)); #ifdef NIMBLE_TWO + // NOTE: I don't have any NIMBLE_TWO devices, but this line makes me suspicious, and I suspect it needs to just be + // notify(). fromNumCharacteristic->notify(val, sizeof(val), BLE_HS_CONN_HANDLE_NONE); #else fromNumCharacteristic->notify(); @@ -94,6 +348,54 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread /// Check the current underlying physical link to see if the client is currently connected virtual bool checkIsConnected() { return bleServer && bleServer->getConnectedCount() > 0; } + + void requestHighThroughputConnection(uint16_t conn_handle) + { + /* Request a lower-latency, higher-throughput BLE connection. + + This comes at the cost of higher power consumption, so we may want to only use this for initial setup, and then switch to + a slower mode. + + See https://developer.apple.com/library/archive/qa/qa1931/_index.html for formulas to calculate values, iOS/macOS + constraints, and recommendations. (Android doesn't have specific constraints, but seems to be compatible with the Apple + recommendations.) + + Selected settings: + minInterval (units of 1.25ms): 7.5ms = 6 (lower than the Apple recommended minimum, but allows faster when the client + supports it.) + maxInterval (units of 1.25ms): 15ms = 12 + latency: 0 (don't allow peripheral to skip any connection events) + timeout (units of 10ms): 6 seconds = 600 (supervision timeout) + + These are intentionally aggressive to prioritize speed over power consumption, but are only used for a few seconds at + setup. Not worth adjusting much. + */ + LOG_INFO("BLE requestHighThroughputConnection"); + bleServer->updateConnParams(conn_handle, 6, 12, 0, 600); + } + + void requestLowerPowerConnection(uint16_t conn_handle) + { + /* Request a lower power consumption (but higher latency, lower throughput) BLE connection. + + This is suitable for steady-state operation after initial setup is complete. + + See https://developer.apple.com/library/archive/qa/qa1931/_index.html for formulas to calculate values, iOS/macOS + constraints, and recommendations. (Android doesn't have specific constraints, but seems to be compatible with the Apple + recommendations.) + + Selected settings: + minInterval (units of 1.25ms): 30ms = 24 + maxInterval (units of 1.25ms): 50ms = 40 + latency: 2 (allow peripheral to skip up to 2 consecutive connection events to save power) + timeout (units of 10ms): 6 seconds = 600 (supervision timeout) + + There's an opportunity for tuning here if anyone wants to do some power measurements, but these should allow 10-20 packets + per second. + */ + LOG_INFO("BLE requestLowerPowerConnection"); + bleServer->updateConnParams(conn_handle, 24, 40, 2, 600); + } }; static BluetoothPhoneAPI *bluetoothPhoneAPI; @@ -113,18 +415,45 @@ class NimbleBluetoothToRadioCallback : public NimBLECharacteristicCallbacks #endif { + // CAUTION: This callback runs in the NimBLE task!!! Don't do anything except communicate with the main task's runOnce. + // Assumption: onWrite is serialized by NimBLE, so we don't need to lock here against multiple concurrent onWrite calls. + + int currentWriteCount = bluetoothPhoneAPI->writeCount.fetch_add(1); + +#ifdef DEBUG_NIMBLE_ON_WRITE_TIMING + int startMillis = millis(); + LOG_DEBUG("BLE onWrite(%d): start millis=%d", currentWriteCount, startMillis); +#endif + auto val = pCharacteristic->getValue(); if (memcmp(lastToRadio, val.data(), val.length()) != 0) { - if (bluetoothPhoneAPI->queue_size < 3) { + if (bluetoothPhoneAPI->fromPhoneQueueSize < NIMBLE_BLUETOOTH_FROM_PHONE_QUEUE_SIZE) { + // Note: the comparison above is safe without a mutex because we are the only method that *increases* + // fromPhoneQueueSize. (It's okay if fromPhoneQueueSize *decreases* in the main task meanwhile.) memcpy(lastToRadio, val.data(), val.length()); - std::lock_guard guard(bluetoothPhoneAPI->nimble_mutex); - bluetoothPhoneAPI->nimble_queue.at(bluetoothPhoneAPI->queue_size) = val; - bluetoothPhoneAPI->queue_size++; + + { // scope for fromPhoneMutex mutex + // Append to fromPhoneQueue, protected by fromPhoneMutex. Hold the mutex as briefly as possible. + std::lock_guard guard(bluetoothPhoneAPI->fromPhoneMutex); + bluetoothPhoneAPI->fromPhoneQueue.at(bluetoothPhoneAPI->fromPhoneQueueSize) = val; + bluetoothPhoneAPI->fromPhoneQueueSize++; + } + + // After releasing the mutex, schedule immediate processing of the new packet. bluetoothPhoneAPI->setIntervalFromNow(0); + concurrency::mainDelay.interrupt(); // wake up main loop if sleeping + +#ifdef DEBUG_NIMBLE_ON_WRITE_TIMING + int finishMillis = millis(); + LOG_DEBUG("BLE onWrite(%d): append to fromPhoneQueue took %u ms. numBytes=%d", currentWriteCount, + finishMillis - startMillis, val.length()); +#endif + } else { + LOG_WARN("BLE onWrite(%d): Drop ToRadio packet, fromPhoneQueue full (%u bytes)", currentWriteCount, val.length()); } } else { - LOG_DEBUG("Drop duplicate ToRadio packet (%u bytes)", val.length()); + LOG_DEBUG("BLE onWrite(%d): Drop duplicate ToRadio packet (%u bytes)", currentWriteCount, val.length()); } } }; @@ -137,32 +466,111 @@ class NimbleBluetoothFromRadioCallback : public NimBLECharacteristicCallbacks virtual void onRead(NimBLECharacteristic *pCharacteristic) #endif { - bluetoothPhoneAPI->phoneWants = true; - bluetoothPhoneAPI->setIntervalFromNow(0); - std::lock_guard guard(bluetoothPhoneAPI->nimble_mutex); // BLE callbacks run in NimBLE task + // In some cases, it seems a new connection starts with a read. + // The API has no bytes to send, leading to a timeout. This short-circuits this problem. + if (!bluetoothPhoneAPI->isConnected()) + return; + // CAUTION: This callback runs in the NimBLE task!!! Don't do anything except communicate with the main task's runOnce. - if (!bluetoothPhoneAPI->hasChecked) { - // Fetch payload on demand; prefetch keeps this fast for the first read. - bluetoothPhoneAPI->numBytes = bluetoothPhoneAPI->getFromRadio(bluetoothPhoneAPI->fromRadioBytes); - bluetoothPhoneAPI->hasChecked = true; - } + int currentReadCount = bluetoothPhoneAPI->readCount.fetch_add(1); + int tries = 0; + int startMillis = millis(); - pCharacteristic->setValue(bluetoothPhoneAPI->fromRadioBytes, bluetoothPhoneAPI->numBytes); - - if (bluetoothPhoneAPI->numBytes != 0) { -#ifdef NIMBLE_TWO - // Notify immediately so subscribed clients see the packet without an extra read. - pCharacteristic->notify(bluetoothPhoneAPI->fromRadioBytes, bluetoothPhoneAPI->numBytes, BLE_HS_CONN_HANDLE_NONE); -#else - pCharacteristic->notify(); +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE onRead(%d): start millis=%d", currentReadCount, startMillis); #endif + + // Is there a packet ready to go, or do we have to ask the main task to get one for us? + if (bluetoothPhoneAPI->toPhoneQueueSize > 0) { + // Note: the comparison above is safe without a mutex because we are the only method that *decreases* + // toPhoneQueueSize. (It's okay if toPhoneQueueSize *increases* in the main task meanwhile.) + + // There's already a packet queued. Great! We don't need to wait for onReadCallbackIsWaitingForData. +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE onRead(%d): packet already waiting, no need to set onReadCallbackIsWaitingForData", currentReadCount); +#endif + } else { + // Tell the main task that we'd like a packet. + bluetoothPhoneAPI->onReadCallbackIsWaitingForData = true; + + // Wait for the main task to produce a packet for us, up to about 20 seconds. + // It normally takes just a few milliseconds, but at initial startup, etc, the main task can get blocked for longer + // doing various setup tasks. + while (bluetoothPhoneAPI->onReadCallbackIsWaitingForData && tries < 4000) { + // Schedule the main task runOnce to run ASAP. + bluetoothPhoneAPI->setIntervalFromNow(0); + concurrency::mainDelay.interrupt(); // wake up main loop if sleeping + + if (!bluetoothPhoneAPI->onReadCallbackIsWaitingForData) { + // we may be able to break even before a delay, if the call to interrupt woke up the main loop and it ran + // already +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + LOG_DEBUG("BLE onRead(%d): broke before delay after %u ms, %d tries", currentReadCount, + millis() - startMillis, tries); +#endif + break; + } + + // This delay happens in the NimBLE FreeRTOS task, which really can't do anything until we get a value back. + // No harm in polling pretty frequently. + delay(tries < 20 ? 1 : 5); + tries++; + + if (tries == 4000) { + LOG_WARN( + "BLE onRead(%d): timeout waiting for data after %u ms, %d tries, giving up and returning 0-size response", + currentReadCount, millis() - startMillis, tries); + } + } } - if (bluetoothPhoneAPI->numBytes != 0) // if we did send something, queue it up right away to reload + // Pop from toPhoneQueue, protected by toPhoneMutex. Hold the mutex as briefly as possible. + uint8_t fromRadioBytes[meshtastic_FromRadio_size] = {0}; // Stack buffer for getFromRadio packet + size_t numBytes = 0; + { // scope for toPhoneMutex mutex + std::lock_guard guard(bluetoothPhoneAPI->toPhoneMutex); + size_t toPhoneQueueSize = bluetoothPhoneAPI->toPhoneQueueSize.load(); + if (toPhoneQueueSize > 0) { + // Copy from the front of the toPhoneQueue + memcpy(fromRadioBytes, bluetoothPhoneAPI->toPhoneQueue[0].data(), bluetoothPhoneAPI->toPhoneQueueByteSizes[0]); + numBytes = bluetoothPhoneAPI->toPhoneQueueByteSizes[0]; + + // Shift the rest of the queue down + for (uint8_t i = 1; i < toPhoneQueueSize; i++) { + memcpy(bluetoothPhoneAPI->toPhoneQueue[i - 1].data(), bluetoothPhoneAPI->toPhoneQueue[i].data(), + bluetoothPhoneAPI->toPhoneQueueByteSizes[i]); + // The above line is similar to: + // bluetoothPhoneAPI->toPhoneQueue[i - 1] = bluetoothPhoneAPI->toPhoneQueue[i] + // but is usually faster because it doesn't have to copy all the trailing bytes beyond + // toPhoneQueueByteSizes[i]. + // + // We deliberately use an array here (and pay the CPU cost of some memcpy) to avoid synchronizing dynamic + // memory allocations and frees across FreeRTOS tasks. + + bluetoothPhoneAPI->toPhoneQueueByteSizes[i - 1] = bluetoothPhoneAPI->toPhoneQueueByteSizes[i]; + } + + // Safe decrement due to onDisconnect + if (bluetoothPhoneAPI->toPhoneQueueSize > 0) + bluetoothPhoneAPI->toPhoneQueueSize--; + } else { + // nothing in the toPhoneQueue; that's fine, and we'll just have numBytes=0. + } + } + +#ifdef DEBUG_NIMBLE_ON_READ_TIMING + int finishMillis = millis(); + LOG_DEBUG("BLE onRead(%d): onReadCallbackIsWaitingForData took %u ms, %d tries. numBytes=%d", currentReadCount, + finishMillis - startMillis, tries, numBytes); +#endif + + pCharacteristic->setValue(fromRadioBytes, numBytes); + + // If we sent something, wake up the main loop if it's sleeping in case there are more packets ready to enqueue. + if (numBytes != 0) { bluetoothPhoneAPI->setIntervalFromNow(0); - bluetoothPhoneAPI->numBytes = 0; - bluetoothPhoneAPI->hasChecked = false; - bluetoothPhoneAPI->phoneWants = false; + concurrency::mainDelay.interrupt(); // wake up main loop if sleeping + } } }; @@ -244,6 +652,13 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks if (screen) screen->endAlert(); } + + // Store the connection handle for future use +#ifdef NIMBLE_TWO + nimbleBluetoothConnHandle = connInfo.getConnHandle(); +#else + nimbleBluetoothConnHandle = desc->conn_handle; +#endif } #ifdef NIMBLE_TWO @@ -290,16 +705,29 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks bluetoothStatus->updateStatus(&newStatus); if (bluetoothPhoneAPI) { - std::lock_guard guard(bluetoothPhoneAPI->nimble_mutex); bluetoothPhoneAPI->close(); - bluetoothPhoneAPI->numBytes = 0; - bluetoothPhoneAPI->queue_size = 0; - bluetoothPhoneAPI->hasChecked = false; - bluetoothPhoneAPI->phoneWants = false; + + { // scope for fromPhoneMutex mutex + std::lock_guard guard(bluetoothPhoneAPI->fromPhoneMutex); + bluetoothPhoneAPI->fromPhoneQueueSize = 0; + } + + bluetoothPhoneAPI->onReadCallbackIsWaitingForData = false; + { // scope for toPhoneMutex mutex + std::lock_guard guard(bluetoothPhoneAPI->toPhoneMutex); + bluetoothPhoneAPI->toPhoneQueueSize = 0; + } + + bluetoothPhoneAPI->readCount = 0; + bluetoothPhoneAPI->notifyCount = 0; + bluetoothPhoneAPI->writeCount = 0; } // Clear the last ToRadio packet buffer to avoid rejecting first packet from new connection memset(lastToRadio, 0, sizeof(lastToRadio)); + + nimbleBluetoothConnHandle = -1; // -1 means "no connection" + #ifdef NIMBLE_TWO // Restart Advertising ble->startAdvertising(); @@ -436,17 +864,15 @@ void NimbleBluetooth::setupService() if (config.bluetooth.mode == meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN) { ToRadioCharacteristic = bleService->createCharacteristic(TORADIO_UUID, NIMBLE_PROPERTY::WRITE); // Allow notifications so phones can stream FromRadio without polling. - FromRadioCharacteristic = - bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY); + FromRadioCharacteristic = bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ); fromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ); logRadioCharacteristic = bleService->createCharacteristic(LOGRADIO_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ, 512U); } else { ToRadioCharacteristic = bleService->createCharacteristic( TORADIO_UUID, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN | NIMBLE_PROPERTY::WRITE_ENC); - FromRadioCharacteristic = - bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | - NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::NOTIFY); + FromRadioCharacteristic = bleService->createCharacteristic( + FROMRADIO_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC); fromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC); From ffb168be00a576de79adf115f1c4a6581431959c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 19 Oct 2025 05:53:06 -0500 Subject: [PATCH 033/286] Update protobufs (#8398) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/mesh.pb.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/protobufs b/protobufs index 4a618380a..bf149bbdc 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 4a618380a0d80b476bb7f278008f811f456e0a5f +Subproject commit bf149bbdcce45ba7cd8643db7cb25e5c8815072b diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index d8d2f2e8a..059af57ae 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -282,6 +282,8 @@ typedef enum _meshtastic_HardwareModel { meshtastic_HardwareModel_HELTEC_WIRELESS_TRACKER_V2 = 113, /* LilyGo T-Watch Ultra */ meshtastic_HardwareModel_T_WATCH_ULTRA = 114, + /* Elecrow ThinkNode M3 */ + meshtastic_HardwareModel_THINKNODE_M3 = 115, /* ------------------------------------------------------------------------------------------------------------------------------------------ Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. ------------------------------------------------------------------------------------------------------------------------------------------ */ From f6eede8597fd822be7cc949f0accce16c941f4c3 Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Sun, 19 Oct 2025 11:00:47 -0400 Subject: [PATCH 034/286] NimbleBluetooth: process fromPhoneQueue before toPhoneQueue (fixes bug with 0-length reads during config phase) --- src/nimble/NimbleBluetooth.cpp | 74 +++++++++++++--------------------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 9accf23c6..4c9590103 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -144,21 +144,28 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread protected: virtual int32_t runOnce() override { - bool shouldBreakAndRetryLater = false; - while (runOnceHasWorkToDo()) { - // Important that we service onRead first, because the onRead callback blocks NimBLE until we clear - // onReadCallbackIsWaitingForData. - shouldBreakAndRetryLater = runOnceHandleToPhoneQueue(); // push data from getFromRadio to onRead - runOnceHandleFromPhoneQueue(); // pull data from onWrite to handleToRadio + /* + PROCESS fromPhoneQueue BEFORE toPhoneQueue: - if (shouldBreakAndRetryLater) { - // onRead still wants data, but it's not available yet. Return so we can try again when a packet may be ready. -#ifdef DEBUG_NIMBLE_ON_READ_TIMING - LOG_INFO("BLE runOnce breaking to retry later (leaving onRead waiting)"); -#endif - return 100; // try again in 100ms - } + In normal STATE_SEND_PACKETS operation, it's unlikely that we'll have both writes and reads to process at the same + time, because either onWrite or onRead will trigger this runOnce. And in STATE_SEND_PACKETS, it's generally ok to + service either the reads or writes first. + + However, during the initial setup wantConfig packet, the clients send a write and immediately send a read, and they + expect the read will respond to the write. (This also happens when a client goes from STATE_SEND_PACKETS back to + another wantConfig, like the iOS client does when requesting the nodedb after requesting the main config only.) + + So it's safest to always service writes (fromPhoneQueue) before reads (toPhoneQueue), so that any "synchronous" + write-then-read sequences from the client work as expected, even if this means we block onRead for a while: this is + what the client wants! + */ + + // PHONE -> RADIO: + runOnceHandleFromPhoneQueue(); // pull data from onWrite to handleToRadio + + // RADIO -> PHONE: + runOnceHandleToPhoneQueue(); // push data from getFromRadio to onRead } // the run is triggered via NimbleBluetoothToRadioCallback and NimbleBluetoothFromRadioCallback @@ -220,12 +227,8 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread } } - bool runOnceHandleToPhoneQueue() + void runOnceHandleToPhoneQueue() { - // Returns false normally. - // Returns true if we should break out of runOnce and retry later, such as setup states where getFromRadio returns 0 - // bytes. - // Stack buffer for getFromRadio packet uint8_t fromRadioBytes[meshtastic_FromRadio_size] = {0}; size_t numBytes = 0; @@ -234,28 +237,15 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread numBytes = getFromRadio(fromRadioBytes); if (numBytes == 0) { - // Client expected a read, but we have nothing to send. - // Returning a 0-byte packet breaks clients during the config phase, so we have to block onRead until there's a - // packet ready. - if (isSendingPackets()) { - // In STATE_SEND_PACKETS, it is 100% OK to return a 0-byte response, as we expect clients to do read beyond - // notifies regularly, to make sure they have nothing else to read. -#ifdef DEBUG_NIMBLE_ON_READ_TIMING - LOG_DEBUG("BLE getFromRadio returned numBytes=0, but in STATE_SEND_PACKETS, so clearing " - "onReadCallbackIsWaitingForData flag"); -#endif - } else { - // In other states, this breaks clients. - // Return early, leaving onReadCallbackIsWaitingForData==true so onRead knows to try again. - // This gives runOnce a chance to handleToRadio and produce a response. -#ifdef DEBUG_NIMBLE_ON_READ_TIMING - LOG_DEBUG("BLE getFromRadio returned numBytes=0. Blocking onRead until we have data"); -#endif + /* + Client expected a read, but we have nothing to send. - // Return true to tell runOnce to shouldBreakAndRetryLater, so we don't busy-loop in runOnce even though - // onRead is still waiting! - return true; - } + In STATE_SEND_PACKETS, it is 100% OK to return a 0-byte response, as we expect clients to do read beyond + notifies regularly, to make sure they have nothing else to read. + + In other states, this is fine **so long as we've already processed pending onWrites first**, because the client + may requesting wantConfig and immediately doing a read. + */ } else { // Push to toPhoneQueue, protected by toPhoneMutex. Hold the mutex as briefly as possible. if (toPhoneQueueSize < NIMBLE_BLUETOOTH_TO_PHONE_QUEUE_SIZE) { @@ -282,8 +272,6 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread // Clear the onReadCallbackIsWaitingForData flag so onRead knows it can proceed. onReadCallbackIsWaitingForData = false; // only clear this flag AFTER the push } - - return false; } bool runOnceHasWorkFromPhone() { return fromPhoneQueueSize > 0; } @@ -466,10 +454,6 @@ class NimbleBluetoothFromRadioCallback : public NimBLECharacteristicCallbacks virtual void onRead(NimBLECharacteristic *pCharacteristic) #endif { - // In some cases, it seems a new connection starts with a read. - // The API has no bytes to send, leading to a timeout. This short-circuits this problem. - if (!bluetoothPhoneAPI->isConnected()) - return; // CAUTION: This callback runs in the NimBLE task!!! Don't do anything except communicate with the main task's runOnce. int currentReadCount = bluetoothPhoneAPI->readCount.fetch_add(1); From 126954c2edee391e174e55caab0b068384c17cd6 Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Sun, 19 Oct 2025 11:10:14 -0400 Subject: [PATCH 035/286] NimbleBluetooth: reuse BLE_HS_CONN_HANDLE_NONE instead of creating a different constant to represent no connection --- src/nimble/NimbleBluetooth.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 4c9590103..6238031f6 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -49,7 +49,7 @@ NimBLECharacteristic *logRadioCharacteristic; NimBLEServer *bleServer; static bool passkeyShowing; -static std::atomic nimbleBluetoothConnHandle{-1}; // actual handles are uint16_t, so -1 means "no connection" +static std::atomic nimbleBluetoothConnHandle{BLE_HS_CONN_HANDLE_NONE}; // BLE_HS_CONN_HANDLE_NONE means "no connection" class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread { @@ -178,9 +178,9 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread // Prefer high throughput during config/setup, at the cost of high power consumption (for a few seconds) if (bleServer && isConnected()) { - int32_t conn_handle = nimbleBluetoothConnHandle.load(); - if (conn_handle != -1) { - requestHighThroughputConnection(static_cast(conn_handle)); + uint16_t conn_handle = nimbleBluetoothConnHandle.load(); + if (conn_handle != BLE_HS_CONN_HANDLE_NONE) { + requestHighThroughputConnection(conn_handle); } } } @@ -191,9 +191,9 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread // Switch to lower power consumption BLE connection params for steady-state use after config/setup is complete if (bleServer && isConnected()) { - int32_t conn_handle = nimbleBluetoothConnHandle.load(); - if (conn_handle != -1) { - requestLowerPowerConnection(static_cast(conn_handle)); + uint16_t conn_handle = nimbleBluetoothConnHandle.load(); + if (conn_handle != BLE_HS_CONN_HANDLE_NONE) { + requestLowerPowerConnection(conn_handle); } } } @@ -710,7 +710,7 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks // Clear the last ToRadio packet buffer to avoid rejecting first packet from new connection memset(lastToRadio, 0, sizeof(lastToRadio)); - nimbleBluetoothConnHandle = -1; // -1 means "no connection" + nimbleBluetoothConnHandle = BLE_HS_CONN_HANDLE_NONE; // BLE_HS_CONN_HANDLE_NONE means "no connection" #ifdef NIMBLE_TWO // Restart Advertising From 5b9563a357f5d6c535b866be1987619869ee786e Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 15:11:06 -0400 Subject: [PATCH 036/286] Update src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp makes sense, applying did not cause any visible issues. Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index aee51c6ad..0baca4f87 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -111,7 +111,7 @@ void InkHUD::MapApplet::onRender() printAt(vertBarX + (topLabelW / 2) + 1, topLabelY + (topLabelH / 2), vertTopLabel, CENTER, MIDDLE); char vertBottomLabel[32]; - formatDistance(horizMeters, vertBottomLabel, sizeof(vertBottomLabel)); + formatDistance(vertMeters, vertBottomLabel, sizeof(vertBottomLabel)); int16_t bottomLabelY = vertBarBottom + 4; int16_t bottomLabelW = getTextWidth(vertBottomLabel); int16_t bottomLabelH = getFont().lineHeight(); From 2ad52812c0e182ea4d9389cafa8125c8467da4af Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 15:12:03 -0400 Subject: [PATCH 037/286] Update src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp better for clarity Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index 0baca4f87..396a8dfe7 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -26,7 +26,12 @@ void InkHUD::MapApplet::onRender() // Add white halo outline first constexpr int outlinePad = 1; // size of white outline padding - int boxSize = (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway ? 12 : 10; + int boxSize; + if ((m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway) { + boxSize = 12; + } else { + boxSize = 10; + } fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, boxSize + (outlinePad * 2), boxSize + (outlinePad * 2), WHITE); From cb3ce1b1a869daef5cc773ea2a5bd09b8d201b1f Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 19 Oct 2025 16:25:53 -0400 Subject: [PATCH 038/286] proper centering and rounder hops labels --- .../InkHUD/Applets/Bases/Map/MapApplet.cpp | 56 +++++++++++-------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index 396a8dfe7..818c68070 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -13,6 +13,23 @@ void InkHUD::MapApplet::onRender() return; } + // Helper: draw rounded rectangle centered at x,y + auto fillRoundedRect = [&](int16_t cx, int16_t cy, int16_t w, int16_t h, int16_t r, uint16_t color) { + int16_t x = cx - (w / 2); + int16_t y = cy - (h / 2); + + // center rects + fillRect(x + r, y, w - 2 * r, h, color); + fillRect(x, y + r, r, h - 2 * r, color); + fillRect(x + w - r, y + r, r, h - 2 * r, color); + + // corners + fillCircle(x + r, y + r, r, color); + fillCircle(x + w - r - 1, y + r, r, color); + fillCircle(x + r, y + h - r - 1, r, color); + fillCircle(x + w - r - 1, y + h - r - 1, r, color); + }; + // Find center of map getMapCenter(&latCenter, &lngCenter); calculateAllMarkers(); @@ -25,37 +42,32 @@ void InkHUD::MapApplet::onRender() int16_t y = Y(0.5) - (m.northMeters * metersToPx); // Add white halo outline first - constexpr int outlinePad = 1; // size of white outline padding - int boxSize; - if ((m.hasHopsAway && m.hopsAway > config.lora.hop_limit) || !m.hasHopsAway) { - boxSize = 12; - } else { - boxSize = 10; - } - fillRect(x - (boxSize / 2) - outlinePad, y - (boxSize / 2) - outlinePad, boxSize + (outlinePad * 2), - boxSize + (outlinePad * 2), WHITE); + constexpr int outlinePad = 1; + int boxSize = 11; + int radius = 2; // rounded corner radius + + // White halo background + fillRoundedRect(x, y, boxSize + (outlinePad * 2), boxSize + (outlinePad * 2), radius + 1, WHITE); + + // Draw inner box + fillRoundedRect(x, y, boxSize, boxSize, radius, BLACK); + + // Text inside + setFont(fontSmall); + setTextColor(WHITE); // Draw actual marker on top if (m.hasHopsAway && m.hopsAway > config.lora.hop_limit) { - fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); - setFont(fontSmall); - setTextColor(WHITE); - printAt(x, y, "X", CENTER, MIDDLE); + printAt(x + 1, y + 1, "X", CENTER, MIDDLE); } else if (!m.hasHopsAway) { - fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); - setFont(fontSmall); - setTextColor(WHITE); - printAt(x, y, "?", CENTER, MIDDLE); + printAt(x + 1, y + 1, "?", CENTER, MIDDLE); } else { - fillRect(x - boxSize / 2, y - boxSize / 2, boxSize, boxSize, BLACK); char hopStr[4]; snprintf(hopStr, sizeof(hopStr), "%d", m.hopsAway); - setFont(fontSmall); - setTextColor(WHITE); - printAt(x, y, hopStr, CENTER, MIDDLE); + printAt(x, y + 1, hopStr, CENTER, MIDDLE); } - // Restore default font and color (safety for rest of UI) + // Restore default font and color setFont(fontSmall); setTextColor(BLACK); } From b5aa16badeb902c868ea1dc1a35b40c64425016d Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Sun, 19 Oct 2025 22:23:12 +0100 Subject: [PATCH 039/286] Add a banner on startup when DEBUG_MUTE is enabled (#8402) --- src/main.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 3801f6f9f..689e80e35 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -436,6 +436,12 @@ void setup() LOG_INFO("\n\n//\\ E S H T /\\ S T / C\n"); +#if defined(DEBUG_MUTE) && defined(DEBUG_PORT) + DEBUG_PORT.printf("\r\n\r\n//\\ E S H T /\\ S T / C\r\n"); + DEBUG_PORT.printf("Version %s for %s from %s\r\n", optstr(APP_VERSION), optstr(APP_ENV), optstr(APP_REPO)); + DEBUG_PORT.printf("Debug mute is enabled, there will be no serial output.\r\n"); +#endif + initDeepSleep(); #if defined(MODEM_POWER_EN) From c4656dacf7f886da0770f8778c7f7f094553e7da Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 19 Oct 2025 19:14:30 -0500 Subject: [PATCH 040/286] Remove "Phone GPS" in order to correct GPS reporting (#8407) * Removing Phone GPS reporting for the moment --- src/graphics/draw/UIRenderer.cpp | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index ff8cd20c5..1ff183779 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -563,6 +563,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(FONT_SMALL); int line = 1; + meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); // === Header === #if defined(M5STACK_UNITC6L) @@ -740,7 +741,6 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta int yOffset = (isHighResolution) ? 0 : 5; std::string longNameStr; - meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); if (ourNode && ourNode->has_user && strlen(ourNode->user.long_name) > 0) { longNameStr = sanitizeString(ourNode->user.long_name); } @@ -1000,24 +1000,7 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU const char *displayLine = ""; // Initialize to empty string by default meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); - bool usePhoneGPS = (ourNode && nodeDB->hasValidPosition(ourNode) && - config.position.gps_mode != meshtastic_Config_PositionConfig_GpsMode_ENABLED); - - if (usePhoneGPS) { - // Phone-provided GPS is active - displayLine = "Phone GPS"; - int yOffset = (isHighResolution) ? 3 : 1; - if (isHighResolution) { - NodeListRenderer::drawScaledXBitmap16x16(x, getTextPositions(display)[line] + yOffset - 5, imgSatellite_width, - imgSatellite_height, imgSatellite, display); - } else { - display->drawXbm(x + 1, getTextPositions(display)[line] + yOffset, imgSatellite_width, imgSatellite_height, - imgSatellite); - } - int xOffset = (isHighResolution) ? 6 : 0; - display->drawString(x + 11 + xOffset, getTextPositions(display)[line++], displayLine); - } else if (config.position.gps_mode != meshtastic_Config_PositionConfig_GpsMode_ENABLED) { - // GPS disabled / not present + if (config.position.gps_mode != meshtastic_Config_PositionConfig_GpsMode_ENABLED) { if (config.position.fixed_position) { displayLine = "Fixed GPS"; } else { @@ -1108,9 +1091,7 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU // === Final Row: Altitude === char altitudeLine[32] = {0}; - int32_t alt = (strcmp(displayLine, "Phone GPS") == 0 && ourNode && nodeDB->hasValidPosition(ourNode)) - ? ourNode->position.altitude - : geoCoord.getAltitude(); + int32_t alt = geoCoord.getAltitude(); if (config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) { snprintf(altitudeLine, sizeof(altitudeLine), "Alt: %.0fft", alt * METERS_TO_FEET); } else { From 15ee1c2819340da759d0dbb11ce302804004d707 Mon Sep 17 00:00:00 2001 From: Ford Jones <107664313+ford-jones@users.noreply.github.com> Date: Wed, 22 Oct 2025 22:08:17 +1300 Subject: [PATCH 041/286] Include RSSI in rangetest csv (#8395) * Include RSSI in rangetest csv * Fix typo * Preserve csv column order --------- Co-authored-by: Ben Meadors --- src/modules/RangeTestModule.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/modules/RangeTestModule.cpp b/src/modules/RangeTestModule.cpp index 3d78d0dc9..026b3028d 100644 --- a/src/modules/RangeTestModule.cpp +++ b/src/modules/RangeTestModule.cpp @@ -159,6 +159,7 @@ ProcessMessage RangeTestModuleRadio::handleReceived(const meshtastic_MeshPacket LOG_DEBUG("---- Received Packet:"); LOG_DEBUG("mp.from %d", mp.from); LOG_DEBUG("mp.rx_snr %f", mp.rx_snr); + LOG_DEBUG("mp.rx_rssi %f", mp.rx_rssi); LOG_DEBUG("mp.hop_limit %d", mp.hop_limit); LOG_DEBUG("---- Node Information of Received Packet (mp.from):"); LOG_DEBUG("n->user.long_name %s", n->user.long_name); @@ -234,8 +235,8 @@ bool RangeTestModuleRadio::appendFile(const meshtastic_MeshPacket &mp) } // Print the CSV header - if (fileToWrite.println( - "time,from,sender name,sender lat,sender long,rx lat,rx long,rx elevation,rx snr,distance,hop limit,payload")) { + if (fileToWrite.println("time,from,sender name,sender lat,sender long,rx lat,rx long,rx elevation,rx " + "snr,distance,hop limit,payload,rx rssi")) { LOG_INFO("File was written"); } else { LOG_ERROR("File write failed"); @@ -297,6 +298,8 @@ bool RangeTestModuleRadio::appendFile(const meshtastic_MeshPacket &mp) // TODO: If quotes are found in the payload, it has to be escaped. fileToAppend.printf("\"%s\"\n", p.payload.bytes); + fileToAppend.printf("%i,", mp.rx_rssi); // RX RSSI + fileToAppend.flush(); fileToAppend.close(); From 18c4956aba11cc23d8d09ea3d7f756b85b22326f Mon Sep 17 00:00:00 2001 From: Onyx Clawe <58921814+OnyxClawe@users.noreply.github.com> Date: Wed, 22 Oct 2025 03:02:14 -0700 Subject: [PATCH 042/286] Issue: #7944 External notification module: Adjusted default nag timeout to 15s (from 60s) (#7946) * External notification module: Adjusted default nag timeout to 5s (from 60s) * Change nag to 15s --------- Co-authored-by: Tom Fifield --- src/mesh/Default.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesh/Default.h b/src/mesh/Default.h index 2f05da98d..d0d4678ff 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -27,7 +27,7 @@ #ifdef USERPREFS_RINGTONE_NAG_SECS #define default_ringtone_nag_secs USERPREFS_RINGTONE_NAG_SECS #else -#define default_ringtone_nag_secs 60 +#define default_ringtone_nag_secs 15 #endif #define default_mqtt_address "mqtt.meshtastic.org" @@ -84,4 +84,4 @@ class Default return 1.0 + (nodesOverForty * throttlingFactor); // Each number of online node scales by 0.075 (default) } } -}; \ No newline at end of file +}; From f4e93b4a2d52c636bc4d1313696be7f9765012d7 Mon Sep 17 00:00:00 2001 From: "Daniel.Cao" <144674500+DanielCao0@users.noreply.github.com> Date: Thu, 23 Oct 2025 18:41:24 +0800 Subject: [PATCH 043/286] Add support for RAK WISMESH TAP V2 by enabling SDCARD_CS pin during deep sleep (#8429) --- src/sleep.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sleep.cpp b/src/sleep.cpp index c6efb0efd..756582c74 100644 --- a/src/sleep.cpp +++ b/src/sleep.cpp @@ -244,6 +244,10 @@ void doDeepSleep(uint32_t msecToWake, bool skipPreflight = false, bool skipSaveN // pinMode(PIN_POWER_EN1, INPUT_PULLDOWN); #endif +#ifdef RAK_WISMESH_TAP_V2 + digitalWrite(SDCARD_CS, LOW); +#endif + #ifdef TRACKER_T1000_E #ifdef GNSS_AIROHA digitalWrite(GPS_VRTC_EN, LOW); From 07d354fa02e7d9843fac8d22d4db9027165a0044 Mon Sep 17 00:00:00 2001 From: GUVWAF <78759985+GUVWAF@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:42:36 +0200 Subject: [PATCH 044/286] Move airtime calculation to when Tx is complete (#8427) --- src/mesh/RadioLibInterface.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index 2567d9e7f..80e51b8bc 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -289,12 +289,7 @@ void RadioLibInterface::onNotify(uint32_t notification) // actual transmission as short as possible txp = txQueue.dequeue(); assert(txp); - bool sent = startSend(txp); - if (sent) { - // Packet has been sent, count it toward our TX airtime utilization. - uint32_t xmitMsec = getPacketTime(txp); - airTime->logAirtime(TX_LOG, xmitMsec); - } + startSend(txp); LOG_DEBUG("%d packets remain in the TX queue", txQueue.getMaxLen() - txQueue.getFree()); } } @@ -413,6 +408,10 @@ void RadioLibInterface::completeSending() sendingPacket = NULL; if (p) { + // Packet has been sent, count it toward our TX airtime utilization. + uint32_t xmitMsec = getPacketTime(p); + airTime->logAirtime(TX_LOG, xmitMsec); + txGood++; if (!isFromUs(p)) txRelay++; From 153cf65214e764481024d24c5e4df92772be2379 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 06:14:14 -0500 Subject: [PATCH 045/286] Upgrade trunk (#8369) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 5bec39ae2..0a43c3079 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,15 +8,15 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.483 - - renovate@41.148.2 + - checkov@3.2.486 + - renovate@41.157.0 - prettier@3.6.2 - - trufflehog@3.90.8 + - trufflehog@3.90.11 - yamllint@1.37.1 - bandit@1.8.6 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.0 + - ruff@0.14.1 - isort@7.0.0 - markdownlint@0.45.0 - oxipng@9.1.5 From 39780656ef58b9d928902c4dcc6c60e866b74a3e Mon Sep 17 00:00:00 2001 From: korbinianbauer <64415847+korbinianbauer@users.noreply.github.com> Date: Thu, 23 Oct 2025 16:15:12 +0200 Subject: [PATCH 046/286] Don't assign negative SNR to unsigned int type SNR-based contention windows are broken on systems with 64-bit long integers. Fixes #8430 --- src/mesh/RadioInterface.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 31ec5acc5..3c0da4494 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -272,10 +272,10 @@ uint32_t RadioInterface::getTxDelayMsec() uint8_t RadioInterface::getCWsize(float snr) { // The minimum value for a LoRa SNR - const uint32_t SNR_MIN = -20; + const int32_t SNR_MIN = -20; // The maximum value for a LoRa SNR - const uint32_t SNR_MAX = 10; + const int32_t SNR_MAX = 10; return map(snr, SNR_MIN, SNR_MAX, CWmin, CWmax); } From b682ab396744af7be9deb34563ccb0573a934f38 Mon Sep 17 00:00:00 2001 From: Jason P Date: Thu, 23 Oct 2025 11:54:05 -0500 Subject: [PATCH 047/286] Allow vibra or buzzer only notifications to obey cutoff (#8342) * Allow vibra or buzzer only notifications to obey cutoff * Update src/modules/ExternalNotificationModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/modules/ExternalNotificationModule.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index ffc789275..2b1730e9c 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -94,8 +94,8 @@ int32_t ExternalNotificationModule::runOnce() // audioThread->isPlaying() also handles actually playing the RTTTL, needs to be called in loop isRtttlPlaying = isRtttlPlaying || audioThread->isPlaying(); #endif - if ((nagCycleCutoff < millis()) && !isRtttlPlaying) { - // let the song finish if we reach timeout + if ((nagCycleCutoff <= millis())) { + // Turn off external notification immediately when timeout is reached, regardless of song state nagCycleCutoff = UINT32_MAX; LOG_INFO("Turning off external notification: "); for (int i = 0; i < 3; i++) { @@ -103,7 +103,6 @@ int32_t ExternalNotificationModule::runOnce() externalTurnedOn[i] = 0; LOG_INFO("%d ", i); } - LOG_INFO(""); #ifdef HAS_I2S // GPIO0 is used as mclk for I2S audio and set to OUTPUT by the sound library // T-Deck uses GPIO0 as trackball button, so restore the mode From 35fa4187390e73cc0b74f54e63fcc8454cd1892f Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:55:24 -0400 Subject: [PATCH 048/286] InkHUD crash fix when nodes get deleted from NodeDB (#8428) * InkHUD crash fix * trunk fix --- .../InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp index 1b0bfa9d0..5c9906fba 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp @@ -127,6 +127,11 @@ void InkHUD::NodeListApplet::onRender() // Y value (top) of the current card. Increases as we draw. uint16_t cardTopY = headerDivY + padDivH; + // Clean up deleted nodes before drawing + cards.erase( + std::remove_if(cards.begin(), cards.end(), [](const CardInfo &c) { return nodeDB->getMeshNode(c.nodeNum) == nullptr; }), + cards.end()); + // -- Each node in list -- for (auto card = cards.begin(); card != cards.end(); ++card) { @@ -141,6 +146,11 @@ void InkHUD::NodeListApplet::onRender() meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeNum); + // Skip deleted nodes + if (!node) { + continue; + } + // -- Shortname -- // Parse special chars in the short name // Use "?" if unknown @@ -188,7 +198,7 @@ void InkHUD::NodeListApplet::onRender() drawSignalIndicator(signalX, signalY, signalW, signalH, signal); } // Otherwise, print "hops away" info, if available - else if (hopsAway != CardInfo::HOPS_UNKNOWN) { + else if (hopsAway != CardInfo::HOPS_UNKNOWN && node) { std::string hopString = to_string(node->hops_away); hopString += " Hop"; if (node->hops_away != 1) From 799cf0e8b3fbb90d87f2c7f7c13303a2f38fff95 Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Fri, 24 Oct 2025 10:37:38 +1100 Subject: [PATCH 049/286] Master --> develop (#8436) * Issue: #7944 External notification module: Adjusted default nag timeout to 15s (from 60s) (#7946) * External notification module: Adjusted default nag timeout to 5s (from 60s) * Change nag to 15s --------- Co-authored-by: Tom Fifield * Add support for RAK WISMESH TAP V2 by enabling SDCARD_CS pin during deep sleep (#8429) * Upgrade trunk (#8369) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> * Don't assign negative SNR to unsigned int type SNR-based contention windows are broken on systems with 64-bit long integers. Fixes #8430 * Allow vibra or buzzer only notifications to obey cutoff (#8342) * Allow vibra or buzzer only notifications to obey cutoff * Update src/modules/ExternalNotificationModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * InkHUD crash fix when nodes get deleted from NodeDB (#8428) * InkHUD crash fix * trunk fix --------- Co-authored-by: Ben Meadors Co-authored-by: Onyx Clawe <58921814+OnyxClawe@users.noreply.github.com> Co-authored-by: Daniel.Cao <144674500+DanielCao0@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> Co-authored-by: korbinianbauer <64415847+korbinianbauer@users.noreply.github.com> Co-authored-by: Jason P Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> --- .trunk/trunk.yaml | 8 ++++---- .../InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp | 12 +++++++++++- src/mesh/Default.h | 4 ++-- src/mesh/RadioInterface.cpp | 4 ++-- src/modules/ExternalNotificationModule.cpp | 5 ++--- src/sleep.cpp | 4 ++++ 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 5bec39ae2..0a43c3079 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,15 +8,15 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.483 - - renovate@41.148.2 + - checkov@3.2.486 + - renovate@41.157.0 - prettier@3.6.2 - - trufflehog@3.90.8 + - trufflehog@3.90.11 - yamllint@1.37.1 - bandit@1.8.6 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.0 + - ruff@0.14.1 - isort@7.0.0 - markdownlint@0.45.0 - oxipng@9.1.5 diff --git a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp index 1b0bfa9d0..5c9906fba 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/NodeList/NodeListApplet.cpp @@ -127,6 +127,11 @@ void InkHUD::NodeListApplet::onRender() // Y value (top) of the current card. Increases as we draw. uint16_t cardTopY = headerDivY + padDivH; + // Clean up deleted nodes before drawing + cards.erase( + std::remove_if(cards.begin(), cards.end(), [](const CardInfo &c) { return nodeDB->getMeshNode(c.nodeNum) == nullptr; }), + cards.end()); + // -- Each node in list -- for (auto card = cards.begin(); card != cards.end(); ++card) { @@ -141,6 +146,11 @@ void InkHUD::NodeListApplet::onRender() meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeNum); + // Skip deleted nodes + if (!node) { + continue; + } + // -- Shortname -- // Parse special chars in the short name // Use "?" if unknown @@ -188,7 +198,7 @@ void InkHUD::NodeListApplet::onRender() drawSignalIndicator(signalX, signalY, signalW, signalH, signal); } // Otherwise, print "hops away" info, if available - else if (hopsAway != CardInfo::HOPS_UNKNOWN) { + else if (hopsAway != CardInfo::HOPS_UNKNOWN && node) { std::string hopString = to_string(node->hops_away); hopString += " Hop"; if (node->hops_away != 1) diff --git a/src/mesh/Default.h b/src/mesh/Default.h index 2f05da98d..d0d4678ff 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -27,7 +27,7 @@ #ifdef USERPREFS_RINGTONE_NAG_SECS #define default_ringtone_nag_secs USERPREFS_RINGTONE_NAG_SECS #else -#define default_ringtone_nag_secs 60 +#define default_ringtone_nag_secs 15 #endif #define default_mqtt_address "mqtt.meshtastic.org" @@ -84,4 +84,4 @@ class Default return 1.0 + (nodesOverForty * throttlingFactor); // Each number of online node scales by 0.075 (default) } } -}; \ No newline at end of file +}; diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 31ec5acc5..3c0da4494 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -272,10 +272,10 @@ uint32_t RadioInterface::getTxDelayMsec() uint8_t RadioInterface::getCWsize(float snr) { // The minimum value for a LoRa SNR - const uint32_t SNR_MIN = -20; + const int32_t SNR_MIN = -20; // The maximum value for a LoRa SNR - const uint32_t SNR_MAX = 10; + const int32_t SNR_MAX = 10; return map(snr, SNR_MIN, SNR_MAX, CWmin, CWmax); } diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index ffc789275..2b1730e9c 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -94,8 +94,8 @@ int32_t ExternalNotificationModule::runOnce() // audioThread->isPlaying() also handles actually playing the RTTTL, needs to be called in loop isRtttlPlaying = isRtttlPlaying || audioThread->isPlaying(); #endif - if ((nagCycleCutoff < millis()) && !isRtttlPlaying) { - // let the song finish if we reach timeout + if ((nagCycleCutoff <= millis())) { + // Turn off external notification immediately when timeout is reached, regardless of song state nagCycleCutoff = UINT32_MAX; LOG_INFO("Turning off external notification: "); for (int i = 0; i < 3; i++) { @@ -103,7 +103,6 @@ int32_t ExternalNotificationModule::runOnce() externalTurnedOn[i] = 0; LOG_INFO("%d ", i); } - LOG_INFO(""); #ifdef HAS_I2S // GPIO0 is used as mclk for I2S audio and set to OUTPUT by the sound library // T-Deck uses GPIO0 as trackball button, so restore the mode diff --git a/src/sleep.cpp b/src/sleep.cpp index c6efb0efd..756582c74 100644 --- a/src/sleep.cpp +++ b/src/sleep.cpp @@ -244,6 +244,10 @@ void doDeepSleep(uint32_t msecToWake, bool skipPreflight = false, bool skipSaveN // pinMode(PIN_POWER_EN1, INPUT_PULLDOWN); #endif +#ifdef RAK_WISMESH_TAP_V2 + digitalWrite(SDCARD_CS, LOW); +#endif + #ifdef TRACKER_T1000_E #ifdef GNSS_AIROHA digitalWrite(GPS_VRTC_EN, LOW); From 664d17c519f1b1849a467e4c84367de6b0f8bf9e Mon Sep 17 00:00:00 2001 From: GUVWAF <78759985+GUVWAF@users.noreply.github.com> Date: Sat, 25 Oct 2025 13:59:01 +0200 Subject: [PATCH 050/286] Revert "Revert "develop --> Master" (#8244)" (#8450) This reverts commit 5bcc47dddb6aa339e51651a05ff7f2bdc6e27bd2. --- src/Power.cpp | 7 ++- src/gps/GPS.cpp | 8 ++- src/mesh/FloodingRouter.cpp | 102 ++++++++++++------------------ src/mesh/FloodingRouter.h | 15 +++-- src/mesh/NextHopRouter.cpp | 105 +++++++++++++++---------------- src/mesh/NextHopRouter.h | 6 +- src/mesh/PacketHistory.cpp | 1 - src/mesh/http/ContentHandler.cpp | 5 ++ src/mesh/http/WebServer.cpp | 35 ++++++++++- src/mesh/http/WebServer.h | 4 ++ src/modules/TraceRouteModule.cpp | 64 +++++++++++++++++++ src/modules/TraceRouteModule.h | 6 ++ src/power.h | 1 + 13 files changed, 229 insertions(+), 130 deletions(-) diff --git a/src/Power.cpp b/src/Power.cpp index 1f4c341f0..d7fd5b33b 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -839,8 +839,11 @@ void Power::readPowerStatus() // Notify any status instances that are observing us const PowerStatus powerStatus2 = PowerStatus(hasBattery, usbPowered, isChargingNow, batteryVoltageMv, batteryChargePercent); - LOG_DEBUG("Battery: usbPower=%d, isCharging=%d, batMv=%d, batPct=%d", powerStatus2.getHasUSB(), powerStatus2.getIsCharging(), - powerStatus2.getBatteryVoltageMv(), powerStatus2.getBatteryChargePercent()); + if (millis() > lastLogTime + 50 * 1000) { + LOG_DEBUG("Battery: usbPower=%d, isCharging=%d, batMv=%d, batPct=%d", powerStatus2.getHasUSB(), + powerStatus2.getIsCharging(), powerStatus2.getBatteryVoltageMv(), powerStatus2.getBatteryChargePercent()); + lastLogTime = millis(); + } newStatus.notifyObservers(&powerStatus2); #ifdef DEBUG_HEAP if (lastheap != memGet.getFreeHeap()) { diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 297ed3dfa..6c6cdba6d 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -1659,8 +1659,12 @@ bool GPS::lookForLocation() #ifndef TINYGPS_OPTION_NO_STATISTICS if (reader.failedChecksum() > lastChecksumFailCount) { - LOG_WARN("%u new GPS checksum failures, for a total of %u", reader.failedChecksum() - lastChecksumFailCount, - reader.failedChecksum()); +// In a GPS_DEBUG build we want to log all of these. In production, we only care if there are many of them. +#ifndef GPS_DEBUG + if (reader.failedChecksum() > 4) +#endif + LOG_WARN("%u new GPS checksum failures, for a total of %u", reader.failedChecksum() - lastChecksumFailCount, + reader.failedChecksum()); lastChecksumFailCount = reader.failedChecksum(); } #endif diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp index 1d8ac247f..032be241b 100644 --- a/src/mesh/FloodingRouter.cpp +++ b/src/mesh/FloodingRouter.cpp @@ -31,33 +31,8 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p) wasSeenRecently(p, true, nullptr, nullptr, &wasUpgraded); // Updates history; returns false when an upgrade is detected // Handle hop_limit upgrade scenario for rebroadcasters - // isRebroadcaster() is duplicated in perhapsRebroadcast(), but this avoids confusing log messages - if (wasUpgraded && isRebroadcaster() && iface && p->hop_limit > 0) { - // wasSeenRecently() reports false in upgrade cases so we handle replacement before the duplicate short-circuit - // If we overhear a duplicate copy of the packet with more hops left than the one we are waiting to - // rebroadcast, then remove the packet currently sitting in the TX queue and use this one instead. - uint8_t dropThreshold = p->hop_limit; // remove queued packets that have fewer hops remaining - if (iface->removePendingTXPacket(getFrom(p), p->id, dropThreshold)) { - LOG_DEBUG("Processing upgraded packet 0x%08x for rebroadcast with hop limit %d (dropping queued < %d)", p->id, - p->hop_limit, dropThreshold); - - if (nodeDB) - nodeDB->updateFrom(*p); -#if !MESHTASTIC_EXCLUDE_TRACEROUTE - if (traceRouteModule && p->which_payload_variant == meshtastic_MeshPacket_decoded_tag && - p->decoded.portnum == meshtastic_PortNum_TRACEROUTE_APP) - traceRouteModule->processUpgradedPacket(*p); -#endif - - perhapsRebroadcast(p); - - // We already enqueued the improved copy, so make sure the incoming packet stops here. - return true; - } - - // No queue entry was replaced by this upgraded copy, so treat it as a duplicate to avoid - // delivering the same packet to applications/phone twice with different hop limits. - seenRecently = true; + if (wasUpgraded && perhapsHandleUpgradedPacket(p)) { + return true; // we handled it, so stop processing } if (seenRecently) { @@ -70,8 +45,10 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p) if (isRepeated) { LOG_DEBUG("Repeated reliable tx"); // Check if it's still in the Tx queue, if not, we have to relay it again - if (!findInTxQueue(p->from, p->id)) + if (!findInTxQueue(p->from, p->id)) { + reprocessPacket(p); perhapsRebroadcast(p); + } } else { perhapsCancelDupe(p); } @@ -82,6 +59,40 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p) return Router::shouldFilterReceived(p); } +bool FloodingRouter::perhapsHandleUpgradedPacket(const meshtastic_MeshPacket *p) +{ + // isRebroadcaster() is duplicated in perhapsRebroadcast(), but this avoids confusing log messages + if (isRebroadcaster() && iface && p->hop_limit > 0) { + // If we overhear a duplicate copy of the packet with more hops left than the one we are waiting to + // rebroadcast, then remove the packet currently sitting in the TX queue and use this one instead. + uint8_t dropThreshold = p->hop_limit; // remove queued packets that have fewer hops remaining + if (iface->removePendingTXPacket(getFrom(p), p->id, dropThreshold)) { + LOG_DEBUG("Processing upgraded packet 0x%08x for rebroadcast with hop limit %d (dropping queued < %d)", p->id, + p->hop_limit, dropThreshold); + + reprocessPacket(p); + perhapsRebroadcast(p); + + rxDupe++; + // We already enqueued the improved copy, so make sure the incoming packet stops here. + return true; + } + } + + return false; +} + +void FloodingRouter::reprocessPacket(const meshtastic_MeshPacket *p) +{ + if (nodeDB) + nodeDB->updateFrom(*p); +#if !MESHTASTIC_EXCLUDE_TRACEROUTE + if (traceRouteModule && p->which_payload_variant == meshtastic_MeshPacket_decoded_tag && + p->decoded.portnum == meshtastic_PortNum_TRACEROUTE_APP) + traceRouteModule->processUpgradedPacket(*p); +#endif +} + bool FloodingRouter::roleAllowsCancelingDupe(const meshtastic_MeshPacket *p) { if (config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER || @@ -121,41 +132,6 @@ bool FloodingRouter::isRebroadcaster() config.device.rebroadcast_mode != meshtastic_Config_DeviceConfig_RebroadcastMode_NONE; } -void FloodingRouter::perhapsRebroadcast(const meshtastic_MeshPacket *p) -{ - if (!isToUs(p) && (p->hop_limit > 0) && !isFromUs(p)) { - if (p->id != 0) { - if (isRebroadcaster()) { - meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it - - // Use shared logic to determine if hop_limit should be decremented - if (shouldDecrementHopLimit(p)) { - tosend->hop_limit--; // bump down the hop count - } else { - LOG_INFO("favorite-ROUTER/CLIENT_BASE-to-ROUTER/CLIENT_BASE flood: preserving hop_limit"); - } -#if USERPREFS_EVENT_MODE - if (tosend->hop_limit > 2) { - // if we are "correcting" the hop_limit, "correct" the hop_start by the same amount to preserve hops away. - tosend->hop_start -= (tosend->hop_limit - 2); - tosend->hop_limit = 2; - } -#endif - - tosend->next_hop = NO_NEXT_HOP_PREFERENCE; // this should already be the case, but just in case - - LOG_INFO("Rebroadcast received floodmsg"); - // Note: we are careful to resend using the original senders node id - send(tosend); - } else { - LOG_DEBUG("No rebroadcast: Role = CLIENT_MUTE or Rebroadcast Mode = NONE"); - } - } else { - LOG_DEBUG("Ignore 0 id broadcast"); - } - } -} - void FloodingRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c) { bool isAckorReply = (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) && diff --git a/src/mesh/FloodingRouter.h b/src/mesh/FloodingRouter.h index eaf71d294..e8a2e9685 100644 --- a/src/mesh/FloodingRouter.h +++ b/src/mesh/FloodingRouter.h @@ -27,10 +27,6 @@ */ class FloodingRouter : public Router { - private: - /* Check if we should rebroadcast this packet, and do so if needed */ - void perhapsRebroadcast(const meshtastic_MeshPacket *p); - public: /** * Constructor @@ -59,6 +55,17 @@ class FloodingRouter : public Router */ virtual void sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c) override; + /* Check if we should rebroadcast this packet, and do so if needed */ + virtual bool perhapsRebroadcast(const meshtastic_MeshPacket *p) = 0; + + /* Check if we should handle an upgraded packet (with higher hop_limit) + * @return true if we handled it (so stop processing) + */ + bool perhapsHandleUpgradedPacket(const meshtastic_MeshPacket *p); + + /* Call when we receive a packet that needs some reprocessing, but afterwards should be filtered */ + void reprocessPacket(const meshtastic_MeshPacket *p); + // Return false for roles like ROUTER which should always rebroadcast even when we've heard another rebroadcast of // the same packet bool roleAllowsCancelingDupe(const meshtastic_MeshPacket *p); diff --git a/src/mesh/NextHopRouter.cpp b/src/mesh/NextHopRouter.cpp index 0461d7eb6..afdb4d096 100644 --- a/src/mesh/NextHopRouter.cpp +++ b/src/mesh/NextHopRouter.cpp @@ -43,31 +43,8 @@ bool NextHopRouter::shouldFilterReceived(const meshtastic_MeshPacket *p) &wasUpgraded); // Updates history; returns false when an upgrade is detected // Handle hop_limit upgrade scenario for rebroadcasters - // isRebroadcaster() is duplicated in perhapsRelay(), but this avoids confusing log messages - if (wasUpgraded && isRebroadcaster() && iface && p->hop_limit > 0) { - // Upgrade detection bypasses the duplicate short-circuit so we replace the queued packet before exiting - uint8_t dropThreshold = p->hop_limit; // remove queued packets that have fewer hops remaining - if (iface->removePendingTXPacket(getFrom(p), p->id, dropThreshold)) { - LOG_DEBUG("Processing upgraded packet 0x%08x for relay with hop limit %d (dropping queued < %d)", p->id, p->hop_limit, - dropThreshold); - - if (nodeDB) - nodeDB->updateFrom(*p); -#if !MESHTASTIC_EXCLUDE_TRACEROUTE - if (traceRouteModule && p->which_payload_variant == meshtastic_MeshPacket_decoded_tag && - p->decoded.portnum == meshtastic_PortNum_TRACEROUTE_APP) - traceRouteModule->processUpgradedPacket(*p); -#endif - - perhapsRelay(p); - - // We already enqueued the improved copy, so make sure the incoming packet stops here. - return true; - } - - // No queue entry was replaced by this upgraded copy, so treat it as a duplicate to avoid - // delivering the same packet to applications/phone twice with different hop limits. - seenRecently = true; + if (wasUpgraded && perhapsHandleUpgradedPacket(p)) { + return true; // we handled it, so stop processing } if (seenRecently) { @@ -82,14 +59,20 @@ bool NextHopRouter::shouldFilterReceived(const meshtastic_MeshPacket *p) if (wasFallback) { LOG_INFO("Fallback to flooding from relay_node=0x%x", p->relay_node); // Check if it's still in the Tx queue, if not, we have to relay it again - if (!findInTxQueue(p->from, p->id)) - perhapsRelay(p); + if (!findInTxQueue(p->from, p->id)) { + reprocessPacket(p); + perhapsRebroadcast(p); + } } else { bool isRepeated = p->hop_start > 0 && p->hop_start == p->hop_limit; // If repeated and not in Tx queue anymore, try relaying again, or if we are the destination, send the ACK again if (isRepeated) { - if (!findInTxQueue(p->from, p->id) && !perhapsRelay(p) && isToUs(p) && p->want_ack) - sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, 0); + if (!findInTxQueue(p->from, p->id)) { + reprocessPacket(p); + if (!perhapsRebroadcast(p) && isToUs(p) && p->want_ack) { + sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, p->channel, 0); + } + } } else if (!weWereNextHop) { perhapsCancelDupe(p); // If it's a dupe, cancel relay if we were not explicitly asked to relay } @@ -107,13 +90,14 @@ void NextHopRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtast bool isAckorReply = (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) && (p->decoded.request_id != 0 || p->decoded.reply_id != 0); if (isAckorReply) { - // Update next-hop for the original transmitter of this successful transmission to the relay node, but ONLY if "from" is - // not 0 (means implicit ACK) and original packet was also relayed by this node, or we sent it directly to the destination + // Update next-hop for the original transmitter of this successful transmission to the relay node, but ONLY if "from" + // is not 0 (means implicit ACK) and original packet was also relayed by this node, or we sent it directly to the + // destination if (p->from != 0) { meshtastic_NodeInfoLite *origTx = nodeDB->getMeshNode(p->from); if (origTx) { - // Either relayer of ACK was also a relayer of the packet, or we were the *only* relayer and the ACK came directly - // from the destination + // Either relayer of ACK was also a relayer of the packet, or we were the *only* relayer and the ACK came + // directly from the destination bool wasAlreadyRelayer = wasRelayer(p->relay_node, p->decoded.request_id, p->to); bool weWereSoleRelayer = false; bool weWereRelayer = wasRelayer(ourRelayID, p->decoded.request_id, p->to, &weWereSoleRelayer); @@ -134,34 +118,49 @@ void NextHopRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtast } } - perhapsRelay(p); + perhapsRebroadcast(p); // handle the packet as normal Router::sniffReceived(p, c); } -/* Check if we should be relaying this packet if so, do so. */ -bool NextHopRouter::perhapsRelay(const meshtastic_MeshPacket *p) +/* Check if we should be rebroadcasting this packet if so, do so. */ +bool NextHopRouter::perhapsRebroadcast(const meshtastic_MeshPacket *p) { if (!isToUs(p) && !isFromUs(p) && p->hop_limit > 0) { - if (p->next_hop == NO_NEXT_HOP_PREFERENCE || p->next_hop == nodeDB->getLastByteOfNodeNum(getNodeNum())) { + if (p->id != 0) { if (isRebroadcaster()) { - meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it - LOG_INFO("Relaying received message coming from %x", p->relay_node); + if (p->next_hop == NO_NEXT_HOP_PREFERENCE || p->next_hop == nodeDB->getLastByteOfNodeNum(getNodeNum())) { + meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it + LOG_INFO("Rebroadcast received message coming from %x", p->relay_node); - // Use shared logic to determine if hop_limit should be decremented - if (shouldDecrementHopLimit(p)) { - tosend->hop_limit--; // bump down the hop count - } else { - LOG_INFO("Router/CLIENT_BASE-to-favorite-router/CLIENT_BASE relay: preserving hop_limit"); + // Use shared logic to determine if hop_limit should be decremented + if (shouldDecrementHopLimit(p)) { + tosend->hop_limit--; // bump down the hop count + } else { + LOG_INFO("favorite-ROUTER/CLIENT_BASE-to-ROUTER/CLIENT_BASE rebroadcast: preserving hop_limit"); + } +#if USERPREFS_EVENT_MODE + if (tosend->hop_limit > 2) { + // if we are "correcting" the hop_limit, "correct" the hop_start by the same amount to preserve hops away. + tosend->hop_start -= (tosend->hop_limit - 2); + tosend->hop_limit = 2; + } +#endif + + if (p->next_hop == NO_NEXT_HOP_PREFERENCE) { + FloodingRouter::send(tosend); + } else { + NextHopRouter::send(tosend); + } + + return true; } - - NextHopRouter::send(tosend); - - return true; } else { - LOG_DEBUG("Not rebroadcasting: Role = CLIENT_MUTE or Rebroadcast Mode = NONE"); + LOG_DEBUG("No rebroadcast: Role = CLIENT_MUTE or Rebroadcast Mode = NONE"); } + } else { + LOG_DEBUG("Ignore 0 id broadcast"); } } @@ -231,13 +230,13 @@ bool NextHopRouter::stopRetransmission(GlobalPacketId key) } } - // Regardless of whether or not we canceled this packet from the txQueue, remove it from our pending list so it doesn't - // get scheduled again. (This is the core of stopRetransmission.) + // Regardless of whether or not we canceled this packet from the txQueue, remove it from our pending list so it + // doesn't get scheduled again. (This is the core of stopRetransmission.) auto numErased = pending.erase(key); assert(numErased == 1); - // When we remove an entry from pending, always be sure to release the copy of the packet that was allocated in the call - // to startRetransmission. + // When we remove an entry from pending, always be sure to release the copy of the packet that was allocated in the + // call to startRetransmission. packetPool.release(p); return true; diff --git a/src/mesh/NextHopRouter.h b/src/mesh/NextHopRouter.h index 0022644e9..c1df3596b 100644 --- a/src/mesh/NextHopRouter.h +++ b/src/mesh/NextHopRouter.h @@ -148,7 +148,7 @@ class NextHopRouter : public FloodingRouter */ uint8_t getNextHop(NodeNum to, uint8_t relay_node); - /** Check if we should be relaying this packet if so, do so. - * @return true if we did relay */ - bool perhapsRelay(const meshtastic_MeshPacket *p); + /** Check if we should be rebroadcasting this packet if so, do so. + * @return true if we did rebroadcast */ + bool perhapsRebroadcast(const meshtastic_MeshPacket *p) override; }; \ No newline at end of file diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index 49d581d9a..b4af707ae 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -94,7 +94,6 @@ bool PacketHistory::wasSeenRecently(const meshtastic_MeshPacket *p, bool withUpd LOG_DEBUG("Packet History - Hop limit upgrade: packet 0x%08x from hop_limit=%d to hop_limit=%d", p->id, found->hop_limit, p->hop_limit); *wasUpgraded = true; - seenRecently = false; // Allow router processing but prevent duplicate app delivery } else if (wasUpgraded) { *wasUpgraded = false; // Initialize to false if not an upgrade } diff --git a/src/mesh/http/ContentHandler.cpp b/src/mesh/http/ContentHandler.cpp index f87c6e3b0..7b7ebb595 100644 --- a/src/mesh/http/ContentHandler.cpp +++ b/src/mesh/http/ContentHandler.cpp @@ -148,6 +148,8 @@ void registerHandlers(HTTPServer *insecureServer, HTTPSServer *secureServer) void handleAPIv1FromRadio(HTTPRequest *req, HTTPResponse *res) { + if (webServerThread) + webServerThread->markActivity(); LOG_DEBUG("webAPI handleAPIv1FromRadio"); @@ -391,6 +393,9 @@ void handleFsDeleteStatic(HTTPRequest *req, HTTPResponse *res) void handleStatic(HTTPRequest *req, HTTPResponse *res) { + if (webServerThread) + webServerThread->markActivity(); + // Get access to the parameters ResourceParameters *params = req->getParams(); diff --git a/src/mesh/http/WebServer.cpp b/src/mesh/http/WebServer.cpp index bf170de59..3a264fa5a 100644 --- a/src/mesh/http/WebServer.cpp +++ b/src/mesh/http/WebServer.cpp @@ -49,6 +49,12 @@ Preferences prefs; using namespace httpsserver; #include "mesh/http/ContentHandler.h" +static const uint32_t ACTIVE_THRESHOLD_MS = 5000; +static const uint32_t MEDIUM_THRESHOLD_MS = 30000; +static const int32_t ACTIVE_INTERVAL_MS = 50; +static const int32_t MEDIUM_INTERVAL_MS = 200; +static const int32_t IDLE_INTERVAL_MS = 1000; + static SSLCert *cert; static HTTPSServer *secureServer; static HTTPServer *insecureServer; @@ -175,6 +181,32 @@ WebServerThread::WebServerThread() : concurrency::OSThread("WebServer") if (!config.network.wifi_enabled && !config.network.eth_enabled) { disable(); } + lastActivityTime = millis(); +} + +void WebServerThread::markActivity() +{ + lastActivityTime = millis(); +} + +int32_t WebServerThread::getAdaptiveInterval() +{ + uint32_t currentTime = millis(); + uint32_t timeSinceActivity; + + if (currentTime >= lastActivityTime) { + timeSinceActivity = currentTime - lastActivityTime; + } else { + timeSinceActivity = (UINT32_MAX - lastActivityTime) + currentTime + 1; + } + + if (timeSinceActivity < ACTIVE_THRESHOLD_MS) { + return ACTIVE_INTERVAL_MS; + } else if (timeSinceActivity < MEDIUM_THRESHOLD_MS) { + return MEDIUM_INTERVAL_MS; + } else { + return IDLE_INTERVAL_MS; + } } int32_t WebServerThread::runOnce() @@ -189,8 +221,7 @@ int32_t WebServerThread::runOnce() ESP.restart(); } - // Loop every 5ms. - return (5); + return getAdaptiveInterval(); } void initWebServer() diff --git a/src/mesh/http/WebServer.h b/src/mesh/http/WebServer.h index 815d87432..e7a29a5a7 100644 --- a/src/mesh/http/WebServer.h +++ b/src/mesh/http/WebServer.h @@ -10,13 +10,17 @@ void createSSLCert(); class WebServerThread : private concurrency::OSThread { + private: + uint32_t lastActivityTime = 0; public: WebServerThread(); uint32_t requestRestart = 0; + void markActivity(); protected: virtual int32_t runOnce() override; + int32_t getAdaptiveInterval(); }; extern WebServerThread *webServerThread; diff --git a/src/modules/TraceRouteModule.cpp b/src/modules/TraceRouteModule.cpp index fc2cc232b..5bdde1919 100644 --- a/src/modules/TraceRouteModule.cpp +++ b/src/modules/TraceRouteModule.cpp @@ -21,6 +21,11 @@ void TraceRouteModule::alterReceivedProtobuf(meshtastic_MeshPacket &p, meshtasti { const meshtastic_Data &incoming = p.decoded; + // Update next-hops using returned route + if (incoming.request_id) { + updateNextHops(p, r); + } + // Insert unknown hops if necessary insertUnknownHops(p, r, !incoming.request_id); @@ -153,6 +158,65 @@ void TraceRouteModule::alterReceivedProtobuf(meshtastic_MeshPacket &p, meshtasti } } +void TraceRouteModule::updateNextHops(meshtastic_MeshPacket &p, meshtastic_RouteDiscovery *r) +{ + // E.g. if the route is A->B->C->D and we are B, we can set C as next-hop for C and D + // Similarly, if we are C, we can set D as next-hop for D + // If we are A, we can set B as next-hop for B, C and D + + // First check if we were the original sender or in the original route + int8_t nextHopIndex = -1; + if (isToUs(&p)) { + nextHopIndex = 0; // We are the original sender, next hop is first in route + } else { + // Check if we are in the original route + for (uint8_t i = 0; i < r->route_count; i++) { + if (r->route[i] == nodeDB->getNodeNum()) { + nextHopIndex = i + 1; // Next hop is the one after us + break; + } + } + } + + // If we are in the original route, update the next hops + if (nextHopIndex != -1) { + // For every node after us, we can set the next-hop to the first node after us + NodeNum nextHop; + if (nextHopIndex == r->route_count) { + nextHop = p.from; // We are the last in the route, next hop is destination + } else { + nextHop = r->route[nextHopIndex]; + } + + if (nextHop == NODENUM_BROADCAST) { + return; + } + uint8_t nextHopByte = nodeDB->getLastByteOfNodeNum(nextHop); + + // For the rest of the nodes in the route, set their next-hop + // Note: if we are the last in the route, this loop will not run + for (int8_t i = nextHopIndex; i < r->route_count; i++) { + NodeNum targetNode = r->route[i]; + maybeSetNextHop(targetNode, nextHopByte); + } + + // Also set next-hop for the destination node + maybeSetNextHop(p.from, nextHopByte); + } +} + +void TraceRouteModule::maybeSetNextHop(NodeNum target, uint8_t nextHopByte) +{ + if (target == NODENUM_BROADCAST) + return; + + meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(target); + if (node && node->next_hop != nextHopByte) { + LOG_INFO("Updating next-hop for 0x%08x to 0x%02x based on traceroute", target, nextHopByte); + node->next_hop = nextHopByte; + } +} + void TraceRouteModule::processUpgradedPacket(const meshtastic_MeshPacket &mp) { if (mp.which_payload_variant != meshtastic_MeshPacket_decoded_tag || mp.decoded.portnum != meshtastic_PortNum_TRACEROUTE_APP) diff --git a/src/modules/TraceRouteModule.h b/src/modules/TraceRouteModule.h index a069f7157..dac422388 100644 --- a/src/modules/TraceRouteModule.h +++ b/src/modules/TraceRouteModule.h @@ -55,6 +55,12 @@ class TraceRouteModule : public ProtobufModule, // Call to add your ID to the route array of a RouteDiscovery message void appendMyIDandSNR(meshtastic_RouteDiscovery *r, float snr, bool isTowardsDestination, bool SNRonly); + // Update next-hops in the routing table based on the returned route + void updateNextHops(meshtastic_MeshPacket &p, meshtastic_RouteDiscovery *r); + + // Helper to update next-hop for a single node + void maybeSetNextHop(NodeNum target, uint8_t nextHopByte); + /* Call to print the route array of a RouteDiscovery message. Set origin to where the request came from. Set dest to the ID of its destination, or NODENUM_BROADCAST if it has not yet arrived there. */ diff --git a/src/power.h b/src/power.h index 23eb95064..cdbdd3ea0 100644 --- a/src/power.h +++ b/src/power.h @@ -138,6 +138,7 @@ class Power : private concurrency::OSThread void reboot(); // open circuit voltage lookup table uint8_t low_voltage_counter; + int32_t lastLogTime = 0; #ifdef DEBUG_HEAP uint32_t lastheap; #endif From 580fa292ac68b272b76271a9a11c625c459be4a9 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sat, 25 Oct 2025 07:12:59 -0500 Subject: [PATCH 051/286] Address longName wrapping (#8441) * Address longName wrapping * Update src/graphics/draw/NodeListRenderer.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/draw/MenuHandler.cpp | 1 + src/graphics/draw/NodeListRenderer.cpp | 34 +++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 701062e08..803fb87ea 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -784,6 +784,7 @@ void menuHandler::nodeNameLengthMenu() screen->runNow(); } }; + bannerOptions.InitialSelected = config.display.use_long_node_name == true ? 1 : 2; screen->showOverlayBanner(bannerOptions); } diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index 07577db8c..16bfa7066 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -53,7 +53,7 @@ static int scrollIndex = 0; // Utility Functions // ============================= -const char *getSafeNodeName(meshtastic_NodeInfoLite *node) +const char *getSafeNodeName(OLEDDisplay *display, meshtastic_NodeInfoLite *node) { const char *name = NULL; static char nodeName[16] = "?"; @@ -81,6 +81,28 @@ const char *getSafeNodeName(meshtastic_NodeInfoLite *node) snprintf(nodeName, sizeof(nodeName), "(%04X)", (uint16_t)(node->num & 0xFFFF)); } + if (config.display.use_long_node_name == true) { + int availWidth = (SCREEN_WIDTH / 2) - 65; + if (availWidth < 0) + availWidth = 0; + + size_t origLen = strlen(nodeName); + while (nodeName[0] && display->getStringWidth(nodeName) > availWidth) { + nodeName[strlen(nodeName) - 1] = '\0'; + } + + // If we actually truncated, append "..." (ensure space remains in buffer) + if (strlen(nodeName) < origLen) { + size_t len = strlen(nodeName); + size_t maxLen = sizeof(nodeName) - 4; // 3 for "..." and 1 for '\0' + if (len > maxLen) { + nodeName[maxLen] = '\0'; + len = maxLen; + } + strcat(nodeName, "..."); + } + } + return nodeName; } @@ -147,7 +169,7 @@ void drawEntryLastHeard(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int bool isLeftCol = (x < SCREEN_WIDTH / 2); int timeOffset = (isHighResolution) ? (isLeftCol ? 7 : 10) : (isLeftCol ? 3 : 7); - const char *nodeName = getSafeNodeName(node); + const char *nodeName = getSafeNodeName(display, node); char timeStr[10]; uint32_t seconds = sinceLastSeen(node); @@ -192,7 +214,7 @@ void drawEntryHopSignal(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int int barsXOffset = columnWidth - barsOffset; - const char *nodeName = getSafeNodeName(node); + const char *nodeName = getSafeNodeName(display, node); display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(FONT_SMALL); @@ -236,7 +258,7 @@ void drawNodeDistance(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16 bool isLeftCol = (x < SCREEN_WIDTH / 2); int nameMaxWidth = columnWidth - (isHighResolution ? (isLeftCol ? 25 : 28) : (isLeftCol ? 20 : 22)); - const char *nodeName = getSafeNodeName(node); + const char *nodeName = getSafeNodeName(display, node); char distStr[10] = ""; meshtastic_NodeInfoLite *ourNode = nodeDB->getMeshNode(nodeDB->getNodeNum()); @@ -331,7 +353,7 @@ void drawEntryCompass(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16 // Adjust max text width depending on column and screen width int nameMaxWidth = columnWidth - (isHighResolution ? (isLeftCol ? 25 : 28) : (isLeftCol ? 20 : 22)); - const char *nodeName = getSafeNodeName(node); + const char *nodeName = getSafeNodeName(display, node); display->setTextAlignment(TEXT_ALIGN_LEFT); display->setFont(FONT_SMALL); @@ -362,11 +384,11 @@ void drawCompassArrow(OLEDDisplay *display, meshtastic_NodeInfoLite *node, int16 float bearing = GeoCoord::bearing(userLat, userLon, nodeLat, nodeLon); float bearingToNode = RAD_TO_DEG * bearing; float relativeBearing = fmod((bearingToNode - myHeading + 360), 360); - float angle = relativeBearing * DEG_TO_RAD; // Shrink size by 2px int size = FONT_HEIGHT_SMALL - 5; CompassRenderer::drawArrowToNode(display, centerX, centerY, size, relativeBearing); /* + float angle = relativeBearing * DEG_TO_RAD; float halfSize = size / 2.0; // Point of the arrow From dd51de85f37dd123e0e7682f70f0e0f1ecdab067 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 19:42:32 +1100 Subject: [PATCH 052/286] Update GitHub Artifact Actions (#8443) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/build-variant/action.yml | 2 +- .github/workflows/build_debian_src.yml | 2 +- .github/workflows/build_firmware.yml | 2 +- .github/workflows/build_one_arch.yml | 8 ++++---- .github/workflows/build_one_target.yml | 8 ++++---- .github/workflows/main_matrix.yml | 18 +++++++++--------- .github/workflows/merge_queue.yml | 18 +++++++++--------- .github/workflows/package_obs.yml | 2 +- .github/workflows/package_pio_deps.yml | 2 +- .github/workflows/package_ppa.yml | 2 +- .github/workflows/pr_tests.yml | 2 +- .github/workflows/sec_sast_semgrep_cron.yml | 2 +- .github/workflows/test_native.yml | 12 ++++++------ 13 files changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml index f611908ee..a71ddfc4d 100644 --- a/.github/actions/build-variant/action.yml +++ b/.github/actions/build-variant/action.yml @@ -100,7 +100,7 @@ runs: id: version - name: Store binaries as an artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip overwrite: true diff --git a/.github/workflows/build_debian_src.yml b/.github/workflows/build_debian_src.yml index 7f3f8b672..d36e7fea1 100644 --- a/.github/workflows/build_debian_src.yml +++ b/.github/workflows/build_debian_src.yml @@ -64,7 +64,7 @@ jobs: PKG_VERSION: ${{ steps.version.outputs.deb }} - name: Store binaries as an artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src overwrite: true diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index b62729332..57c1e72c7 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -56,7 +56,7 @@ jobs: ota_firmware_target: ${{ steps.ota_dir.outputs.tgt || '' }} - name: Store binaries as an artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 id: upload with: name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}.zip diff --git a/.github/workflows/build_one_arch.yml b/.github/workflows/build_one_arch.yml index 9c57f8b7d..6d5462c93 100644 --- a/.github/workflows/build_one_arch.yml +++ b/.github/workflows/build_one_arch.yml @@ -113,7 +113,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: path: ./ pattern: firmware-${{inputs.arch}}-* @@ -126,7 +126,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -142,7 +142,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -161,7 +161,7 @@ jobs: run: zip -j -9 -r ./firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: debug-elfs-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip overwrite: true diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index 15b3fdba9..46362a629 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -119,7 +119,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: path: ./ pattern: firmware-*-* @@ -132,7 +132,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }} overwrite: true @@ -148,7 +148,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: pattern: firmware-*-${{ needs.version.outputs.long }} merge-multiple: true @@ -167,7 +167,7 @@ jobs: run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: debug-elfs-${{inputs.target}}-${{ needs.version.outputs.long }}.zip overwrite: true diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index 02a4c23b8..7ea033d55 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -168,7 +168,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: path: ./ pattern: firmware-${{matrix.arch}}-* @@ -181,7 +181,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -197,7 +197,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -216,7 +216,7 @@ jobs: run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip overwrite: true @@ -261,14 +261,14 @@ jobs: Autogenerated by github action, developer should edit as required before publishing... - name: Download source deb - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src merge-multiple: true path: ./output/debian-src - name: Download `native-tft` pio deps - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }} merge-multiple: true @@ -318,7 +318,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -335,7 +335,7 @@ jobs: - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip merge-multiple: true @@ -373,7 +373,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }} merge-multiple: true diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index e8c3d3450..6d69258c9 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -147,7 +147,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: path: ./ pattern: firmware-${{matrix.arch}}-* @@ -160,7 +160,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -176,7 +176,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -195,7 +195,7 @@ jobs: run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip overwrite: true @@ -240,14 +240,14 @@ jobs: Autogenerated by github action, developer should edit as required before publishing... - name: Download source deb - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src merge-multiple: true path: ./output/debian-src - name: Download `native-tft` pio deps - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }} merge-multiple: true @@ -297,7 +297,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -314,7 +314,7 @@ jobs: - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip merge-multiple: true @@ -352,7 +352,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v5 + - uses: actions/download-artifact@v6 with: pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }} merge-multiple: true diff --git a/.github/workflows/package_obs.yml b/.github/workflows/package_obs.yml index 4c547eadc..b8a829d9a 100644 --- a/.github/workflows/package_obs.yml +++ b/.github/workflows/package_obs.yml @@ -58,7 +58,7 @@ jobs: id: version - name: Download artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src merge-multiple: true diff --git a/.github/workflows/package_pio_deps.yml b/.github/workflows/package_pio_deps.yml index d8ff6e631..c52dfe348 100644 --- a/.github/workflows/package_pio_deps.yml +++ b/.github/workflows/package_pio_deps.yml @@ -56,7 +56,7 @@ jobs: PLATFORMIO_CORE_DIR: pio/core - name: Store binaries as an artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: platformio-deps-${{ inputs.pio_env }}-${{ steps.version.outputs.long }} overwrite: true diff --git a/.github/workflows/package_ppa.yml b/.github/workflows/package_ppa.yml index aece730a0..2d6c257e6 100644 --- a/.github/workflows/package_ppa.yml +++ b/.github/workflows/package_ppa.yml @@ -60,7 +60,7 @@ jobs: id: version - name: Download artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src merge-multiple: true diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index 4e285852d..c3a964e04 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -50,7 +50,7 @@ jobs: - name: Download test artifacts if: needs.native-tests.result != 'skipped' - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: platformio-test-report-${{ steps.version.outputs.long }}.zip merge-multiple: true diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml index 2059fde2c..dfb828bf6 100644 --- a/.github/workflows/sec_sast_semgrep_cron.yml +++ b/.github/workflows/sec_sast_semgrep_cron.yml @@ -33,7 +33,7 @@ jobs: # step 3 - name: save report as pipeline artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: report.sarif overwrite: true diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index 9cf1c9e53..3f3d02e4c 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -59,7 +59,7 @@ jobs: id: version - name: Save coverage information - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: always() # run this step even if previous step failed with: name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}.zip @@ -94,7 +94,7 @@ jobs: - name: Save test results if: always() # run this step even if previous step failed - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: platformio-test-report-${{ steps.version.outputs.long }}.zip overwrite: true @@ -108,7 +108,7 @@ jobs: sed -i -e "s#${PWD}#.#" coverage_tests.info # Make paths relative. - name: Save coverage information - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: always() # run this step even if previous step failed with: name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}.zip @@ -137,7 +137,7 @@ jobs: id: version - name: Download test artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: platformio-test-report-${{ steps.version.outputs.long }}.zip merge-multiple: true @@ -150,7 +150,7 @@ jobs: reporter: java-junit - name: Download coverage artifacts - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}.zip path: code-coverage-report @@ -163,7 +163,7 @@ jobs: genhtml --quiet --legend --prefix "${PWD}" code-coverage-report/coverage_src.info --output-directory code-coverage-report - name: Save Code Coverage Report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: code-coverage-report-${{ steps.version.outputs.long }}.zip path: code-coverage-report From b6830a68a090de21757b183c26ff62d98867124e Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Mon, 27 Oct 2025 19:47:34 +1100 Subject: [PATCH 053/286] Migrate test workflow to use Node 24 (#8466) Node 24 is now the common version amoungst all of our actions. --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7852fc31f..1ec435512 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -49,7 +49,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 - name: Setup pnpm uses: pnpm/action-setup@v4 From f045ca2303ce57089eced1fe8ec321cb0b60bfc6 Mon Sep 17 00:00:00 2001 From: Erayd Date: Tue, 28 Oct 2025 00:05:59 +1300 Subject: [PATCH 054/286] Fix type to ensure correct alignment; saves 4B per entry (#8465) --- src/mesh/PacketCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesh/PacketCache.h b/src/mesh/PacketCache.h index 81ad455da..85660922b 100644 --- a/src/mesh/PacketCache.h +++ b/src/mesh/PacketCache.h @@ -17,7 +17,7 @@ typedef struct PacketCacheEntry { uint8_t encrypted : 1; // Payload is encrypted uint8_t has_metadata : 1; // Payload includes PacketCacheMetadata uint8_t : 6; // Reserved for future use - uint16_t : 8; // Reserved for future use + uint8_t : 8; // Reserved for future use }; }; } PacketCacheEntry; From 7d3e529b2f7cb266c3fe741c359a85141cec5d25 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 07:16:09 +1100 Subject: [PATCH 055/286] Update node to v24 (#8476) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7852fc31f..1ec435512 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -49,7 +49,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 - name: Setup pnpm uses: pnpm/action-setup@v4 From 28f53d132aa0d3903482ea9b475527068389244a Mon Sep 17 00:00:00 2001 From: Clive Blackledge Date: Tue, 28 Oct 2025 13:32:08 -0700 Subject: [PATCH 056/286] refactor: change node count variables from uint8_t to uint16_t (#8478) This is a non-breaking change that increases the internal representation of node counts from uint8_t (max 255) to uint16_t (max 65535) to support larger mesh networks, particularly on ESP32-S3 devices with PSRAM. Changes: - NodeStatus: numOnline, numTotal, lastNumTotal (uint8_t -> uint16_t) - ProtobufModule: numOnlineNodes (uint8_t -> uint16_t) - MapApplet: loop counters changed to size_t for consistency with getNumMeshNodes() - NodeStatus: Fixed log format to use %u for unsigned integers Note: Default class methods keep uint32_t for numOnlineNodes parameter to match the public API and allow flexibility, even though internal node counts use uint16_t (max 65535 nodes). This change does NOT affect protobuf definitions, maintaining wire compatibility with existing clients and devices. --- src/NodeStatus.h | 16 ++++++++-------- .../niche/InkHUD/Applets/Bases/Map/MapApplet.cpp | 6 +++--- src/mesh/Default.h | 5 ++++- src/mesh/ProtobufModule.h | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/NodeStatus.h b/src/NodeStatus.h index 60d1bdd98..550f6254a 100644 --- a/src/NodeStatus.h +++ b/src/NodeStatus.h @@ -14,16 +14,16 @@ class NodeStatus : public Status CallbackObserver statusObserver = CallbackObserver(this, &NodeStatus::updateStatus); - uint8_t numOnline = 0; - uint8_t numTotal = 0; + uint16_t numOnline = 0; + uint16_t numTotal = 0; - uint8_t lastNumTotal = 0; + uint16_t lastNumTotal = 0; public: bool forceUpdate = false; NodeStatus() { statusType = STATUS_TYPE_NODE; } - NodeStatus(uint8_t numOnline, uint8_t numTotal, bool forceUpdate = false) : Status() + NodeStatus(uint16_t numOnline, uint16_t numTotal, bool forceUpdate = false) : Status() { this->forceUpdate = forceUpdate; this->numOnline = numOnline; @@ -34,11 +34,11 @@ class NodeStatus : public Status void observe(Observable *source) { statusObserver.observe(source); } - uint8_t getNumOnline() const { return numOnline; } + uint16_t getNumOnline() const { return numOnline; } - uint8_t getNumTotal() const { return numTotal; } + uint16_t getNumTotal() const { return numTotal; } - uint8_t getLastNumTotal() const { return lastNumTotal; } + uint16_t getLastNumTotal() const { return lastNumTotal; } bool matches(const NodeStatus *newStatus) const { @@ -56,7 +56,7 @@ class NodeStatus : public Status numTotal = newStatus->getNumTotal(); } if (isDirty || newStatus->forceUpdate) { - LOG_DEBUG("Node status update: %d online, %d total", numOnline, numTotal); + LOG_DEBUG("Node status update: %u online, %u total", numOnline, numTotal); onNewStatus.notifyObservers(this); } return 0; diff --git a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp index 818c68070..d383a11e4 100644 --- a/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp +++ b/src/graphics/niche/InkHUD/Applets/Bases/Map/MapApplet.cpp @@ -287,7 +287,7 @@ void InkHUD::MapApplet::getMapCenter(float *lat, float *lng) float easternmost = lngCenter; float westernmost = lngCenter; - for (uint8_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { + for (size_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { meshtastic_NodeInfoLite *node = nodeDB->getMeshNodeByIndex(i); // Skip if no position @@ -474,8 +474,8 @@ void InkHUD::MapApplet::drawLabeledMarker(meshtastic_NodeInfoLite *node) // Need at least two, to draw a sensible map bool InkHUD::MapApplet::enoughMarkers() { - uint8_t count = 0; - for (uint8_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { + size_t count = 0; + for (size_t i = 0; i < nodeDB->getNumMeshNodes(); i++) { meshtastic_NodeInfoLite *node = nodeDB->getMeshNodeByIndex(i); // Count nodes diff --git a/src/mesh/Default.h b/src/mesh/Default.h index d0d4678ff..34289ccb6 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -46,12 +46,15 @@ class Default static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval); static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval, uint32_t defaultInterval); static uint32_t getConfiguredOrDefault(uint32_t configured, uint32_t defaultValue); + // Note: numOnlineNodes uses uint32_t to match the public API and allow flexibility, + // even though internal node counts use uint16_t (max 65535 nodes) static uint32_t getConfiguredOrDefaultMsScaled(uint32_t configured, uint32_t defaultValue, uint32_t numOnlineNodes); static uint8_t getConfiguredOrDefaultHopLimit(uint8_t configured); static uint32_t getConfiguredOrMinimumValue(uint32_t configured, uint32_t minValue); private: - static float congestionScalingCoefficient(int numOnlineNodes) + // Note: Kept as uint32_t to match the public API parameter type + static float congestionScalingCoefficient(uint32_t numOnlineNodes) { // Increase frequency of broadcasts for small networks regardless of preset if (numOnlineNodes <= 10) { diff --git a/src/mesh/ProtobufModule.h b/src/mesh/ProtobufModule.h index e038e9bb8..725477eae 100644 --- a/src/mesh/ProtobufModule.h +++ b/src/mesh/ProtobufModule.h @@ -13,7 +13,7 @@ template class ProtobufModule : protected SinglePortModule const pb_msgdesc_t *fields; public: - uint8_t numOnlineNodes = 0; + uint16_t numOnlineNodes = 0; /** Constructor * name is for debugging output */ From c330bfe8483beea2ab967a19f666b713de97b6d3 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 29 Oct 2025 06:46:50 -0500 Subject: [PATCH 057/286] Turn the e-ink backlight on for any brightness value over 0 (#8481) --- src/graphics/Screen.cpp | 2 +- src/graphics/draw/MenuHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index e1cc0ccad..86599d5b3 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -443,7 +443,7 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) if (uiconfig.screen_brightness == 1) digitalWrite(PIN_EINK_EN, HIGH); #elif defined(PCA_PIN_EINK_EN) - if (uiconfig.screen_brightness == 1) + if (uiconfig.screen_brightness > 0) io.digitalWrite(PCA_PIN_EINK_EN, HIGH); #endif diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 803fb87ea..10c20cbd6 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -515,7 +515,7 @@ void menuHandler::homeBaseMenu() } saveUIConfig(); #elif defined(PCA_PIN_EINK_EN) - if (uiconfig.screen_brightness == 1) { + if (uiconfig.screen_brightness > 0) { uiconfig.screen_brightness = 0; io.digitalWrite(PCA_PIN_EINK_EN, LOW); } else { From 0dfa11a90987bf0858791bf269d7d980c29e8f9d Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 29 Oct 2025 22:35:54 -0500 Subject: [PATCH 058/286] Add missed debug log line in RF95 Interface (#8490) --- src/mesh/RF95Interface.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mesh/RF95Interface.cpp b/src/mesh/RF95Interface.cpp index 0f32f3427..da0039d38 100644 --- a/src/mesh/RF95Interface.cpp +++ b/src/mesh/RF95Interface.cpp @@ -260,6 +260,7 @@ void RF95Interface::addReceiveMetadata(meshtastic_MeshPacket *mp) { mp->rx_snr = lora->getSNR(); mp->rx_rssi = lround(lora->getRSSI()); + LOG_DEBUG("Corrected frequency offset: %f", lora->getFrequencyError()); } void RF95Interface::setStandby() From 756efa7f00cb4bed498a7f46cdbf998f20a082be Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 30 Oct 2025 06:23:11 -0500 Subject: [PATCH 059/286] Thinknode M5 ADC_MULTIPLIER to actually hit 100% charge (#8489) --- variants/esp32s3/ELECROW-ThinkNode-M5/variant.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/variants/esp32s3/ELECROW-ThinkNode-M5/variant.h b/variants/esp32s3/ELECROW-ThinkNode-M5/variant.h index a55808170..129b398e9 100644 --- a/variants/esp32s3/ELECROW-ThinkNode-M5/variant.h +++ b/variants/esp32s3/ELECROW-ThinkNode-M5/variant.h @@ -14,6 +14,8 @@ #define BATTERY_PIN 8 #define ADC_CHANNEL ADC1_GPIO8_CHANNEL +#define ADC_MULTIPLIER 2.11 // 2.0 + 10% for correction of display undervoltage. + #define PIN_BUZZER 9 // Buttons From c145be8e05b863af78750668cd6aa4ce73e39d62 Mon Sep 17 00:00:00 2001 From: Ixitxachitl Date: Fri, 31 Oct 2025 03:20:29 -0700 Subject: [PATCH 060/286] Refactor emote dimensions to 16x16 pixels (#8493) Updated the dimensions of various emotes in emotes.h from 30x30 or 25x25 to 16x16 pixels for consistency and optimization. Added new emotes including heart_smile, Heart_eyes, and others, all with the same 16x16 size. This change improves memory usage and aligns with the design specifications for smaller emotes. --- src/graphics/emotes.cpp | 335 +++++++++++++++++----------------------- src/graphics/emotes.h | 146 +++++++++++------ 2 files changed, 243 insertions(+), 238 deletions(-) diff --git a/src/graphics/emotes.cpp b/src/graphics/emotes.cpp index a0227d365..bed2b7b7c 100644 --- a/src/graphics/emotes.cpp +++ b/src/graphics/emotes.cpp @@ -18,6 +18,8 @@ const Emote emotes[] = { {"\U0001F642", Slightly_Smiling, Slightly_Smiling_width, Slightly_Smiling_height}, // 🙂 Slightly Smiling Face {"\U0001F609", Winking_Face, Winking_Face_width, Winking_Face_height}, // 😉 Winking Face {"\U0001F601", Grinning_Smiling_Eyes, Grinning_Smiling_Eyes_width, Grinning_Smiling_Eyes_height}, // 😠Grinning Smiling Eyes + {"\U0001F60D", Heart_eyes, Heart_eyes_width, Heart_eyes_height}, // 😠Heart Eyes + {"\U0001F970", heart_smile, heart_smile_width, heart_smile_height}, // 🥰 Smiling Face with Hearts // --- Question/Alert --- {"\u2753", question, question_width, question_height}, // â“ Question Mark @@ -30,11 +32,15 @@ const Emote emotes[] = { {"\U0001F605", haha, haha_width, haha_height}, // 😅 Smiling with Sweat {"\U0001F604", Grinning_SmilingEyes2, Grinning_SmilingEyes2_width, Grinning_SmilingEyes2_height}, // 😄 Grinning Face with Smiling Eyes + {"\U0001F62D", Loudly_Crying_Face, Loudly_Crying_Face_width, Loudly_Crying_Face_height}, // 😭 Loudly Crying Face // --- Gestures and People --- - {"\U0001F44B", wave_icon, wave_icon_width, wave_icon_height}, // 👋 Waving Hand - {"\U0001F920", cowboy, cowboy_width, cowboy_height}, // 🤠 Cowboy Hat Face - {"\U0001F3A7", deadmau5, deadmau5_width, deadmau5_height}, // 🎧 Headphones + {"\U0001F44B", wave_icon, wave_icon_width, wave_icon_height}, // 👋 Waving Hand + {"\u270C\uFE0F", peace_sign, peace_sign_width, peace_sign_height}, // âœŒï¸ Victory Hand + {"\U0001F596", vulcan_salute, vulcan_salute_width, vulcan_salute_height}, // 🖖 Vulcan Salute + {"\U0001F64F", Praying, Praying_width, Praying_height}, // 🙠Praying Hands + {"\U0001F920", cowboy, cowboy_width, cowboy_height}, // 🤠 Cowboy Hat Face + {"\U0001F3A7", deadmau5, deadmau5_width, deadmau5_height}, // 🎧 Headphones // --- Weather --- {"\u2600", sun, sun_width, sun_height}, // ☀ Sun (without variation selector) @@ -45,8 +51,12 @@ const Emote emotes[] = { // --- Misc Faces --- {"\U0001F608", devil, devil_width, devil_height}, // 😈 Smiling Face with Horns + {"\U0001F921", clown, clown_width, clown_height}, // 🤡 Clown Face + {"\U0001F916", robo, robo_width, robo_height}, // 🤖 Robot Face // --- Hearts (Multiple Unicode Aliases) --- + {"\u2665", heart, heart_width, heart_height}, // ♥ Black Heart Suit + {"\u2665\uFE0F", heart, heart_width, heart_height}, // â™¥ï¸ Black Heart Suit (emoji presentation) {"\u2764\uFE0F", heart, heart_width, heart_height}, // â¤ï¸ Red Heart {"\U0001F9E1", heart, heart_width, heart_height}, // 🧡 Orange Heart {"\U00002763", heart, heart_width, heart_height}, // ⣠Heart Exclamation @@ -57,223 +67,166 @@ const Emote emotes[] = { {"\U0001F498", heart, heart_width, heart_height}, // 💘 Heart with Arrow // --- Objects --- - {"\U0001F4A9", poo, poo_width, poo_height}, // 💩 Pile of Poo - {"\U0001F514", bell_icon, bell_icon_width, bell_icon_height} // 🔔 Bell + {"\U0001F4A9", poo, poo_width, poo_height}, // 💩 Pile of Poo + {"\U0001F514", bell_icon, bell_icon_width, bell_icon_height}, // 🔔 Bell + {"\U0001F36A", cookie, cookie_width, cookie_height}, // 🪠Cookie + {"\U0001F525", Fire, Fire_width, Fire_height}, // 🔥 Fire + {"\u2728", Sparkles, Sparkles_width, Sparkles_height}, // ✨ Sparkles + {"\U0001F573\uFE0F", hole, hole_width, hole_height}, // ðŸ•³ï¸ Hole + {"\U0001F3B3", bowling, bowling_width, bowling_height} // 🎳 Bowling #endif }; const int numEmotes = sizeof(emotes) / sizeof(emotes[0]); #ifndef EXCLUDE_EMOJI -const unsigned char thumbup[] PROGMEM = { - 0x00, 0x1C, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, - 0xC0, 0x08, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, - 0x0C, 0xCE, 0x7F, 0x00, 0x04, 0x20, 0x80, 0x00, 0x02, 0x20, 0x80, 0x00, 0x02, 0x60, 0xC0, 0x00, 0x01, 0xF8, 0xFF, 0x01, - 0x01, 0x08, 0x00, 0x01, 0x01, 0x08, 0x00, 0x01, 0x01, 0xF8, 0xFF, 0x00, 0x01, 0x10, 0x80, 0x00, 0x01, 0x18, 0x80, 0x00, - 0x02, 0x30, 0xC0, 0x00, 0x06, 0xE0, 0x3F, 0x00, 0x0C, 0x20, 0x30, 0x00, 0x38, 0x20, 0x10, 0x00, 0xE0, 0xCF, 0x1F, 0x00, -}; +const unsigned char thumbup[] PROGMEM = {0x00, 0x03, 0x80, 0x04, 0x80, 0x04, 0x40, 0x04, 0x20, 0x02, 0x18, + 0x02, 0x06, 0x3F, 0x06, 0x40, 0x06, 0x70, 0x06, 0x40, 0x06, 0x70, + 0x06, 0x40, 0x06, 0x30, 0x08, 0x20, 0xF0, 0x1F, 0x00, 0x00}; -const unsigned char thumbdown[] PROGMEM = { - 0xE0, 0xCF, 0x1F, 0x00, 0x38, 0x20, 0x10, 0x00, 0x0C, 0x20, 0x30, 0x00, 0x06, 0xE0, 0x3F, 0x00, 0x02, 0x30, 0xC0, 0x00, - 0x01, 0x18, 0x80, 0x00, 0x01, 0x10, 0x80, 0x00, 0x01, 0xF8, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x01, 0x01, 0x08, 0x00, 0x01, - 0x01, 0xF8, 0xFF, 0x01, 0x02, 0x60, 0xC0, 0x00, 0x02, 0x20, 0x80, 0x00, 0x04, 0x20, 0x80, 0x00, 0x0C, 0xCE, 0x7F, 0x00, - 0x18, 0x02, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0xC0, 0x08, 0x00, 0x00, - 0x80, 0x09, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, -}; +const unsigned char thumbdown[] PROGMEM = {0xF0, 0x1F, 0x08, 0x20, 0x06, 0x30, 0x06, 0x40, 0x06, 0x70, 0x06, + 0x40, 0x06, 0x70, 0x06, 0x40, 0x06, 0x3F, 0x18, 0x02, 0x20, 0x02, + 0x40, 0x04, 0x80, 0x04, 0x80, 0x04, 0x00, 0x03, 0x00, 0x00}; -const unsigned char Smiling_Eyes[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xcf, 0xfc, 0xff, 0xff, 0xcf, 0xfc, 0xff, 0xff, 0xcf, - 0x7e, 0xf8, 0xc3, 0xdf, 0x3e, 0xf0, 0x81, 0xdf, 0xbf, 0xf7, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x3f, 0xff, - 0x6f, 0xff, 0xdf, 0xfe, 0x6f, 0xff, 0xdf, 0xfe, 0x9f, 0xff, 0x3f, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x7e, 0xff, 0xdf, 0xdf, - 0x7c, 0xff, 0xdf, 0xcf, 0xfc, 0xfe, 0xef, 0xcf, 0xf8, 0xf9, 0xf7, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x07, 0xc0}; +const unsigned char Smiling_Eyes[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x24, 0x24, 0x52, + 0x4A, 0x02, 0x40, 0x02, 0x40, 0x22, 0x44, 0x22, 0x44, 0xC2, 0x43, + 0x04, 0x20, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char Grinning[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xcf, 0xfc, 0xf9, 0xf3, 0xcf, 0xfc, 0xf0, 0xe1, 0xcf, - 0xfe, 0xf0, 0xe1, 0xdf, 0xfe, 0xf0, 0xe1, 0xdf, 0xff, 0xf0, 0xe1, 0xff, 0xff, 0xf9, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xbe, 0xff, 0xbf, 0xdf, 0x7e, 0x00, 0xc0, 0xdf, - 0x7c, 0x00, 0xc0, 0xcf, 0xfc, 0x00, 0xe0, 0xcf, 0xf8, 0x01, 0xf0, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char Grinning[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x44, 0x22, 0x42, + 0x42, 0x02, 0x40, 0x02, 0x40, 0xF2, 0x4F, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char Slightly_Smiling[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xcf, 0xfc, 0xf9, 0xf3, 0xcf, 0xfc, 0xf0, 0xe1, 0xcf, - 0xfe, 0xf0, 0xe1, 0xdf, 0xfe, 0xf0, 0xe1, 0xdf, 0xff, 0xf0, 0xe1, 0xff, 0xff, 0xf9, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x7e, 0xff, 0xdf, 0xdf, - 0x7c, 0xff, 0xdf, 0xcf, 0xfc, 0xfe, 0xef, 0xcf, 0xf8, 0xf9, 0xf7, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char Slightly_Smiling[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x44, 0x22, 0x42, + 0x42, 0x02, 0x40, 0x02, 0x40, 0x12, 0x48, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char Winking_Face[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xf0, 0xff, 0xc3, 0x78, 0xef, 0xc3, 0xc7, 0xb8, 0xdf, 0xbd, 0xcf, 0xfc, 0xf9, 0x7f, 0xcf, 0xfc, 0xf0, 0xff, 0xcf, - 0xfe, 0xf0, 0xc3, 0xdf, 0xfe, 0xf0, 0x81, 0xdf, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x7e, 0xff, 0xdf, 0xdf, - 0x7c, 0xff, 0xdf, 0xcf, 0xfc, 0xfe, 0xef, 0xcf, 0xf8, 0xf9, 0xf7, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x07, 0xc0}; +const unsigned char Winking_Face[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x44, 0x20, 0x42, + 0x46, 0x02, 0x40, 0x02, 0x40, 0x12, 0x48, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char Grinning_Smiling_Eyes[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xcf, 0xfc, 0xf8, 0xe3, 0xcf, 0x7c, 0xf7, 0xdd, 0xcf, - 0xbe, 0xef, 0xbe, 0xdf, 0xbe, 0xef, 0xbe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0x5e, 0x55, 0x55, 0xdf, 0x5e, 0x55, 0x55, 0xdf, - 0x3c, 0x00, 0x80, 0xcf, 0x7c, 0x55, 0xd5, 0xcf, 0xf8, 0x54, 0xe5, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char Grinning_Smiling_Eyes[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x24, 0x24, 0x52, + 0x4A, 0x02, 0x40, 0xFA, 0x5F, 0x0A, 0x50, 0x0A, 0x50, 0x12, 0x48, + 0x24, 0x24, 0xC4, 0x23, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char question[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x80, 0xFF, 0x01, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0xE0, 0xFF, 0x07, 0x00, - 0xE0, 0xC3, 0x0F, 0x00, 0xF0, 0x81, 0x0F, 0x00, 0xF0, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x80, 0x0F, 0x00, - 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x7C, 0x00, 0x00, - 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; +const unsigned char heart_smile[] PROGMEM = {0x00, 0x00, 0x6C, 0x07, 0x7C, 0x18, 0x7C, 0x20, 0x38, 0x24, 0x52, + 0x0A, 0x02, 0xD8, 0x02, 0xF8, 0x22, 0xFC, 0x20, 0x74, 0xDB, 0x23, + 0x1F, 0x00, 0x1F, 0x20, 0x0E, 0x18, 0xE4, 0x07, 0x00, 0x00}; -const unsigned char bang[] PROGMEM = { - 0xFF, 0x0F, 0xFC, 0x3F, 0xFF, 0x0F, 0xFC, 0x3F, 0xFF, 0x0F, 0xFC, 0x3F, 0xFF, 0x07, 0xF8, 0x3F, 0xFF, 0x07, 0xF8, 0x3F, - 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, - 0xFE, 0x03, 0xF0, 0x1F, 0xFE, 0x03, 0xF0, 0x1F, 0xFC, 0x03, 0xF0, 0x0F, 0xFC, 0x03, 0xF0, 0x0F, 0xFC, 0x03, 0xF0, 0x0F, - 0xFC, 0x03, 0xF0, 0x0F, 0xFC, 0x03, 0xF0, 0x0F, 0xFC, 0x03, 0xF0, 0x0F, 0xFC, 0x01, 0xE0, 0x0F, 0xFC, 0x01, 0xE0, 0x0F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xC0, 0x03, 0xFC, 0x03, 0xF0, 0x0F, 0xFE, 0x03, 0xF0, 0x1F, - 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, 0xFE, 0x07, 0xF8, 0x1F, 0xFC, 0x03, 0xF0, 0x0F, 0xF8, 0x01, 0xE0, 0x07, -}; +const unsigned char Heart_eyes[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x54, 0x2A, 0xFA, + 0x5F, 0x72, 0x4E, 0x22, 0x44, 0x02, 0x40, 0x12, 0x48, 0x12, 0x48, + 0x24, 0x24, 0xC4, 0x23, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char haha[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0x7f, 0xc0, 0xe0, 0xf9, 0xf3, 0xc0, - 0xf0, 0xfe, 0xef, 0xc1, 0x38, 0xff, 0x9f, 0xc3, 0xd8, 0xff, 0x7f, 0xc3, 0xfc, 0xf8, 0xe3, 0xc7, 0x7c, 0xf7, 0xdd, 0xcf, - 0xbe, 0xef, 0xbe, 0xcf, 0xfe, 0xff, 0xff, 0xcf, 0xef, 0xff, 0xff, 0xde, 0xe7, 0xff, 0xff, 0xdc, 0xeb, 0xff, 0xff, 0xda, - 0xed, 0xff, 0xff, 0xd6, 0xee, 0xff, 0xff, 0xce, 0x36, 0x00, 0x80, 0xcd, 0xb8, 0xff, 0xbf, 0xc3, 0x7e, 0x00, 0xc0, 0xdf, - 0x7c, 0x00, 0xc0, 0xcf, 0xfc, 0x00, 0xe0, 0xcf, 0xf8, 0x01, 0xf0, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char question[] PROGMEM = {0xE0, 0x07, 0x10, 0x08, 0x08, 0x10, 0x88, 0x11, 0x48, 0x12, 0x48, + 0x12, 0x48, 0x12, 0x30, 0x11, 0x80, 0x08, 0x40, 0x04, 0x40, 0x02, + 0xC0, 0x03, 0x00, 0x00, 0xC0, 0x03, 0x40, 0x02, 0x80, 0x01}; -const unsigned char ROFL[] PROGMEM = { - 0x00, 0x00, 0x00, 0xc0, 0x00, 0xfc, 0x07, 0xc0, 0x00, 0xff, 0x1f, 0xc0, 0x80, 0xff, 0x7f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, - 0xe0, 0x9f, 0xff, 0xc1, 0xf0, 0x9f, 0xff, 0xc0, 0xf8, 0x9f, 0x7f, 0xcb, 0xf8, 0x9f, 0xbf, 0xcb, 0xfc, 0x9f, 0xdf, 0xdb, - 0xfc, 0x1f, 0x08, 0xdc, 0xfe, 0x1f, 0xf8, 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0x1e, 0xf0, 0x7f, 0xfe, 0x1e, 0xf0, 0xbf, 0xfe, - 0xfe, 0xf3, 0xdf, 0xfe, 0xfe, 0xf3, 0x6f, 0xfe, 0xfe, 0xf3, 0x37, 0xfe, 0xfe, 0xeb, 0x1b, 0xfe, 0xfc, 0xef, 0x0d, 0xde, - 0xfc, 0xe7, 0x06, 0xcf, 0xf8, 0x6b, 0x83, 0xcf, 0xf8, 0x0d, 0xc0, 0xc7, 0xf0, 0xed, 0xff, 0xc7, 0xe0, 0xee, 0xff, 0xc3, - 0xc0, 0xee, 0xff, 0xc1, 0x80, 0xee, 0xff, 0xc0, 0x00, 0xe6, 0x3f, 0xc0, 0x00, 0xf0, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0xc0}; +const unsigned char bang[] PROGMEM = {0x30, 0x0C, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, 0x48, + 0x12, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, 0x30, 0x0C, + 0x00, 0x00, 0x30, 0x0C, 0x48, 0x12, 0x30, 0x0C, 0x00, 0x00}; -const unsigned char Smiling_Closed_Eyes[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0xff, 0xc0, 0xe0, 0xff, 0xff, 0xc1, - 0xf0, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xcf, 0x7c, 0xfe, 0xcf, 0xcf, 0xfc, 0xfc, 0xe7, 0xcf, - 0xfe, 0xf9, 0xf3, 0xdf, 0xfe, 0xf3, 0xf9, 0xdf, 0xff, 0xf9, 0xf3, 0xff, 0xff, 0xfc, 0xe7, 0xff, 0x7f, 0xfe, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xbe, 0xff, 0xbf, 0xdf, 0x7e, 0x00, 0xc0, 0xdf, - 0x7c, 0x00, 0xc0, 0xcf, 0xfc, 0x00, 0xe0, 0xcf, 0xf8, 0x01, 0xf0, 0xc7, 0xf8, 0x03, 0xf8, 0xc7, 0xf0, 0xff, 0xff, 0xc3, - 0xe0, 0xff, 0xff, 0xc1, 0xc0, 0xff, 0xff, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char haha[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x24, 0x24, 0x52, + 0x4A, 0x0A, 0x50, 0x0E, 0x70, 0xF2, 0x4F, 0x12, 0x48, 0x32, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char Grinning_SmilingEyes2[] PROGMEM = { - 0x00, 0xf8, 0x03, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0xc0, 0xff, 0x7f, 0xc0, 0xe0, 0xff, 0xff, 0xc0, - 0xf0, 0xff, 0xff, 0xc1, 0xf8, 0xff, 0xff, 0xc3, 0xf8, 0xff, 0xff, 0xc3, 0xfc, 0xf8, 0xe3, 0xc7, 0x7c, 0xf7, 0xdd, 0xc7, - 0xbe, 0xef, 0xbe, 0xcf, 0xfe, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, - 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x3f, 0x00, 0x80, 0xdf, 0xbe, 0xff, 0xbf, 0xcf, 0x7e, 0x00, 0xc0, 0xcf, - 0x7c, 0x00, 0xc0, 0xc7, 0xfc, 0x00, 0xe0, 0xc7, 0xf8, 0x01, 0xf0, 0xc3, 0xf8, 0x03, 0xf8, 0xc3, 0xf0, 0xff, 0xff, 0xc1, - 0xe0, 0xff, 0xff, 0xc0, 0xc0, 0xff, 0x7f, 0xc0, 0x80, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0}; +const unsigned char ROFL[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x84, 0x21, 0x84, 0x20, 0x02, + 0x4C, 0x02, 0x4A, 0x1A, 0x49, 0x8A, 0x48, 0x42, 0x48, 0x22, 0x44, + 0xE4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char wave_icon[] PROGMEM = { - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0xc0, 0xc1, 0x00, 0x00, 0x00, 0xc7, - 0x00, 0x00, 0x1e, 0xcc, 0x00, 0x00, 0x30, 0xc8, 0x00, 0x00, 0x60, 0xd8, 0x00, 0x08, 0xc0, 0xd0, 0x00, 0x1a, 0x81, 0xd1, - 0x00, 0x36, 0x03, 0xd3, 0x80, 0x6d, 0x06, 0xd2, 0x00, 0xdb, 0x0c, 0xc2, 0x80, 0xb6, 0x1d, 0xc0, 0x80, 0x6d, 0x1f, 0xc0, - 0x00, 0xdb, 0x3f, 0xc0, 0x00, 0xf6, 0x7f, 0xc0, 0x00, 0xfc, 0x7f, 0xc0, 0x08, 0xf8, 0x7f, 0xc0, 0x48, 0xf0, 0x7f, 0xc0, - 0x48, 0xe0, 0x7f, 0xc0, 0xc8, 0xc0, 0x3f, 0xc0, 0x98, 0x81, 0x1f, 0xc0, 0x10, 0x03, 0x00, 0xc0, 0x30, 0x0e, 0x00, 0xc0, - 0x20, 0x38, 0x00, 0xc0, 0xe0, 0x00, 0x00, 0xc0, 0x80, 0x07, 0x00, 0xc0, 0x00, 0x1e, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0}; +const unsigned char Smiling_Closed_Eyes[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x24, 0x24, 0x42, + 0x42, 0x22, 0x44, 0x02, 0x40, 0xF2, 0x4F, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char cowboy[] PROGMEM = { - 0x00, 0x0c, 0x0c, 0xc0, 0x00, 0x02, 0x10, 0xc0, 0x00, 0x01, 0x20, 0xc0, 0xbc, 0x00, 0x40, 0xcf, 0xc2, 0x01, 0xe0, 0xd0, - 0x01, 0x01, 0x20, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, - 0xc1, 0x3f, 0xff, 0xe0, 0xe1, 0xff, 0xff, 0xe1, 0xf2, 0xf3, 0xf3, 0xd3, 0xf4, 0xf1, 0xe3, 0xcb, 0xfc, 0xf1, 0xe3, 0xc7, - 0xf8, 0xf1, 0xe3, 0xc7, 0xf8, 0xf1, 0xe3, 0xc7, 0xf8, 0xfb, 0xf7, 0xc7, 0xf8, 0xff, 0xff, 0xc7, 0xf8, 0xff, 0xff, 0xc7, - 0x70, 0xf8, 0x8f, 0xc3, 0x70, 0x03, 0xb0, 0xc3, 0x70, 0xfe, 0xbf, 0xc3, 0x60, 0x00, 0x80, 0xc1, 0xc0, 0x00, 0xc0, 0xc0, - 0x80, 0x01, 0x60, 0xc0, 0x00, 0x07, 0x38, 0xc0, 0x00, 0xfe, 0x1f, 0xc0, 0x00, 0xf0, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xc0}; +const unsigned char Grinning_SmilingEyes2[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x24, 0x24, 0x52, + 0x4A, 0x02, 0x40, 0x02, 0x40, 0xF2, 0x4F, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char deadmau5[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, - 0x00, 0xFC, 0x03, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0x3F, 0x00, - 0xE0, 0xFF, 0xFF, 0x01, 0xF0, 0xFF, 0x7F, 0x00, 0xF0, 0xFF, 0xFF, 0x03, 0xF8, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x07, - 0xFC, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0xFC, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, 0xFF, 0x00, - 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0x3F, 0xFC, - 0x0F, 0xFF, 0x7F, 0x00, 0xC0, 0xFF, 0x1F, 0xF8, 0x0F, 0xFC, 0x3F, 0x00, 0x80, 0xFF, 0x0F, 0xF8, 0x1F, 0xFC, 0x1F, 0x00, - 0x00, 0xFF, 0x0F, 0xFC, 0x3F, 0xFC, 0x0F, 0x00, 0x00, 0xF8, 0x1F, 0xFF, 0xFF, 0xFE, 0x01, 0x00, 0x00, 0x00, 0xFC, 0xFF, - 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; +const unsigned char Loudly_Crying_Face[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x34, 0x2C, 0x4A, + 0x52, 0x12, 0x48, 0x12, 0x48, 0x92, 0x49, 0x52, 0x4A, 0x52, 0x4A, + 0x54, 0x2A, 0x94, 0x29, 0x18, 0x18, 0xF0, 0x0F, 0x00, 0x00}; -const unsigned char sun[] PROGMEM = { - 0x00, 0xC0, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x30, 0xC0, 0x00, 0x03, - 0x70, 0x00, 0x80, 0x03, 0xF0, 0x00, 0xC0, 0x03, 0xF0, 0xF8, 0xC7, 0x03, 0xE0, 0xFC, 0xCF, 0x01, 0x00, 0xFE, 0x1F, 0x00, - 0x00, 0xFF, 0x3F, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x8E, 0xFF, 0x7F, 0x1C, 0x9F, 0xFF, 0x7F, 0x3E, - 0x9F, 0xFF, 0x7F, 0x3E, 0x8E, 0xFF, 0x7F, 0x1C, 0x80, 0xFF, 0x7F, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x3F, 0x00, - 0x00, 0xFE, 0x1F, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xC0, 0xF9, 0xE7, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0xE0, 0x03, - 0xF0, 0xC0, 0xC0, 0x03, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x00, -}; +const unsigned char wave_icon[] PROGMEM = {0x00, 0x00, 0xC0, 0x18, 0x30, 0x21, 0x48, 0x5A, 0x94, 0x64, 0x24, + 0x25, 0x4A, 0x24, 0x12, 0x44, 0x22, 0x44, 0x04, 0x40, 0x08, 0x40, + 0x12, 0x40, 0x22, 0x20, 0xC4, 0x10, 0x18, 0x0F, 0x00, 0x00}; -const unsigned char rain[] PROGMEM = { - 0xC0, 0x0F, 0xC0, 0x00, 0x40, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x03, 0x38, 0x00, - 0x00, 0x0E, 0x0C, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x30, 0x01, 0x00, 0x00, 0x20, - 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x30, 0x02, 0x00, - 0x00, 0x10, 0x06, 0x00, 0x00, 0x08, 0xFC, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x01, 0x80, 0x00, 0x01, 0x00, - 0xC0, 0xC0, 0x81, 0x03, 0xA0, 0x60, 0xC1, 0x03, 0x90, 0x20, 0x41, 0x01, 0xF0, 0xE0, 0xC0, 0x01, 0x60, 0x4C, - 0x98, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x00, 0x0B, 0x12, 0x00, 0x00, 0x09, 0x1A, 0x00, 0x00, 0x06, 0x0E, 0x00, -}; +const unsigned char cowboy[] PROGMEM = {0x70, 0x0E, 0x8F, 0xF1, 0x11, 0x88, 0x21, 0x84, 0xC2, 0x43, 0x1E, + 0x78, 0xE2, 0x47, 0x42, 0x42, 0x12, 0x48, 0x12, 0x48, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; -const unsigned char cloud[] PROGMEM = { - 0x00, 0x80, 0x07, 0x00, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00, 0x10, 0x60, 0x00, 0x80, 0x1F, 0x40, 0x00, - 0xC0, 0x0F, 0xC0, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x60, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x00, 0x20, 0x00, 0x80, 0x01, - 0x20, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x10, - 0x02, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, - 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x30, 0x03, 0x00, 0x00, 0x10, - 0x02, 0x00, 0x00, 0x10, 0x06, 0x00, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x0C, 0xFC, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x03, -}; +const unsigned char deadmau5[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0xE4, 0x27, 0x12, 0x48, 0x0A, + 0x50, 0x0E, 0x70, 0x11, 0x88, 0x19, 0x98, 0x19, 0x98, 0x19, 0x98, + 0x19, 0x98, 0x19, 0x98, 0x11, 0x88, 0x0E, 0x70, 0x00, 0x00}; -const unsigned char fog[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3C, 0x00, 0xFE, 0x01, 0xFF, 0x00, 0x87, 0xC7, 0xC3, 0x01, 0x03, 0xFE, 0x80, 0x01, - 0x00, 0x38, 0x00, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0xFF, 0x83, 0xFF, 0x01, 0x03, 0xFF, 0x81, 0x01, 0x00, 0x7C, 0x00, 0x00, - 0xF8, 0x00, 0x3E, 0x00, 0xFE, 0x01, 0xFF, 0x00, 0x87, 0xC7, 0xC3, 0x01, 0x03, 0xFE, 0x80, 0x01, 0x00, 0x38, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; +const unsigned char sun[] PROGMEM = {0x00, 0x00, 0x80, 0x01, 0xEC, 0x37, 0xFC, 0x3F, 0xF8, 0x1F, 0xFC, + 0x3F, 0xFE, 0x7F, 0xFC, 0x3F, 0xFC, 0x3F, 0xFE, 0x7F, 0xFC, 0x3F, + 0xF8, 0x1F, 0xFC, 0x3F, 0xEC, 0x37, 0x80, 0x01, 0x00, 0x00}; -const unsigned char devil[] PROGMEM = { - 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x0f, 0xfc, 0x0f, 0xfc, - 0x3f, 0xff, 0x3f, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xdf, 0xfc, 0xff, 0xff, 0xcf, - 0xfc, 0xff, 0xff, 0xcf, 0xf8, 0xff, 0xff, 0xc7, 0xf0, 0xff, 0xff, 0xc3, 0xf0, 0xff, 0xff, 0xc3, 0xf0, 0xf1, 0xe3, 0xc3, - 0xf0, 0xe7, 0xf9, 0xc3, 0xf0, 0xe7, 0xf9, 0xc3, 0xf0, 0xe3, 0xf1, 0xc3, 0xf0, 0xe3, 0xf1, 0xc3, 0xf0, 0xe7, 0xf9, 0xc3, - 0xf0, 0xff, 0xff, 0xc3, 0xe0, 0xfd, 0xef, 0xc1, 0xe0, 0xf3, 0xf3, 0xc1, 0xc0, 0x07, 0xf8, 0xc0, 0x80, 0x1f, 0x7e, 0xc0, - 0x00, 0xff, 0x3f, 0xc0, 0x00, 0xfe, 0x0f, 0xc0, 0x00, 0xf8, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0}; +const unsigned char rain[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x1F, 0xFC, 0x3F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0x3F, 0x00, 0x00, 0x48, 0x12, + 0x48, 0x12, 0x24, 0x09, 0x24, 0x09, 0x00, 0x00, 0x00, 0x00}; -const unsigned char heart[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0xF0, 0x00, 0xF8, 0x0F, 0xFC, 0x07, 0xFC, 0x1F, 0x06, 0x0E, 0xFE, 0x3F, 0x03, 0x18, - 0xFE, 0xFF, 0x7F, 0x10, 0xFF, 0xFF, 0xFF, 0x31, 0xFF, 0xFF, 0xFF, 0x33, 0xFF, 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0x37, - 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x3F, 0xFE, 0xFF, 0xFF, 0x1F, 0xFE, 0xFF, 0xFF, 0x1F, - 0xFC, 0xFF, 0xFF, 0x0F, 0xFC, 0xFF, 0xFF, 0x0F, 0xF8, 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0xFF, 0x03, 0xF0, 0xFF, 0xFF, 0x03, - 0xE0, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0xFE, 0x1F, 0x00, - 0x00, 0xFC, 0x0F, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, -}; +const unsigned char cloud[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x1F, 0xFC, + 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -const unsigned char poo[] PROGMEM = { - 0x00, 0x1c, 0x00, 0xc0, 0x00, 0x7c, 0x00, 0xc0, 0x00, 0xfc, 0x00, 0xc0, 0x00, 0x7c, 0x03, 0xc0, 0x00, 0xbe, 0x03, 0xc0, - 0x00, 0xdf, 0x0f, 0xc0, 0x80, 0xcf, 0x0f, 0xc0, 0xc0, 0xf1, 0x0f, 0xc0, 0x60, 0xfc, 0x0f, 0xc0, 0x30, 0xff, 0x07, 0xc0, - 0x90, 0xff, 0x3b, 0xc0, 0xc0, 0xff, 0x7d, 0xc0, 0xf8, 0xff, 0xfc, 0xc0, 0xf8, 0x3f, 0xf0, 0xc0, 0x78, 0x88, 0xc0, 0xc0, - 0x20, 0xe3, 0x18, 0xc0, 0x98, 0xe7, 0xbc, 0xc1, 0x9c, 0x64, 0xa4, 0xc3, 0x9e, 0x64, 0xa4, 0xc7, 0xbe, 0xe4, 0xa4, 0xc7, - 0xbc, 0x27, 0xbc, 0xc7, 0x38, 0x03, 0xd9, 0xc3, 0x00, 0xf0, 0x63, 0xc0, 0xf8, 0xfc, 0x3f, 0xcf, 0xfc, 0xff, 0x87, 0xdf, - 0xfe, 0xff, 0xe0, 0xdf, 0xfc, 0x1f, 0xfe, 0xdf, 0xf8, 0x07, 0xf8, 0xcf, 0xf0, 0x03, 0xe0, 0xc7, 0x00, 0x00, 0x00, 0xc0}; +const unsigned char fog[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x54, 0x55, 0x22, 0x22, 0x00, + 0x00, 0x44, 0x44, 0xAA, 0x2A, 0x11, 0x11, 0x00, 0x00, 0x88, 0x88, + 0x54, 0x55, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -const unsigned char bell_icon[] PROGMEM = { - 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b11110000, - 0b00000011, 0b00000000, 0b00000000, 0b11111100, 0b00001111, 0b00000000, 0b00000000, 0b00001111, 0b00111100, 0b00000000, - 0b00000000, 0b00000011, 0b00110000, 0b00000000, 0b10000000, 0b00000001, 0b01100000, 0b00000000, 0b11000000, 0b00000000, - 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, - 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, - 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b11000000, 0b00000000, - 0b11000000, 0b00000000, 0b11000000, 0b00000000, 0b01000000, 0b00000000, 0b10000000, 0b00000000, 0b01100000, 0b00000000, - 0b10000000, 0b00000001, 0b01110000, 0b00000000, 0b10000000, 0b00000011, 0b00110000, 0b00000000, 0b00000000, 0b00000011, - 0b00011000, 0b00000000, 0b00000000, 0b00000110, 0b11110000, 0b11111111, 0b11111111, 0b00000011, 0b00000000, 0b00001100, - 0b00001100, 0b00000000, 0b00000000, 0b00011000, 0b00000110, 0b00000000, 0b00000000, 0b11111000, 0b00000111, 0b00000000, - 0b00000000, 0b11100000, 0b00000001, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, - 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000}; +const unsigned char devil[] PROGMEM = {0x06, 0x60, 0xCA, 0x53, 0x32, 0x4C, 0x22, 0x44, 0x44, 0x22, 0x3A, + 0x5C, 0x32, 0x4C, 0x52, 0x4A, 0x72, 0x4E, 0x02, 0x40, 0x22, 0x44, + 0xC4, 0x23, 0x04, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; + +const unsigned char heart[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x7E, 0x7E, 0xFE, 0x7F, 0xFE, + 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFC, 0x3F, 0xF8, 0x1F, 0xF8, 0x1F, + 0xF0, 0x0F, 0xE0, 0x07, 0xC0, 0x03, 0x80, 0x01, 0x00, 0x00}; + +const unsigned char poo[] PROGMEM = {0x00, 0x00, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x10, 0x04, 0xF0, + 0x08, 0x10, 0x10, 0x48, 0x12, 0x08, 0x18, 0xE8, 0x21, 0x1C, 0x40, + 0x42, 0x42, 0x82, 0x41, 0x02, 0x30, 0xFC, 0x0F, 0x00, 0x00}; + +const unsigned char bell_icon[] PROGMEM = {0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0xE0, 0x07, 0xF0, 0x0F, 0xF0, + 0x0F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFC, 0x3F, + 0xFC, 0x3F, 0xFE, 0x7F, 0xFE, 0x7F, 0x80, 0x01, 0x00, 0x00}; + +const unsigned char cookie[] PROGMEM = {0x00, 0x00, 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x34, 0x22, 0x32, + 0x40, 0x02, 0x58, 0x82, 0x5B, 0x92, 0x43, 0x82, 0x43, 0x02, 0x40, + 0x64, 0x28, 0x64, 0x20, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; + +const unsigned char Fire[] PROGMEM = {0x30, 0x00, 0xF0, 0x00, 0xF8, 0x03, 0xF8, 0x07, 0xFC, 0x1F, 0xFC, + 0x1F, 0xFE, 0x3E, 0x7E, 0x3E, 0x3E, 0x7C, 0x1E, 0x78, 0x1E, 0x70, + 0x1C, 0x70, 0x1C, 0x70, 0x38, 0x38, 0x30, 0x38, 0x60, 0x0C}; + +const unsigned char peace_sign[] PROGMEM = {0xC0, 0x30, 0x40, 0x29, 0x40, 0x25, 0x40, 0x15, 0x40, 0x12, 0x38, + 0x0A, 0x54, 0x68, 0x54, 0x58, 0x54, 0x44, 0x3C, 0x22, 0x04, 0x22, + 0x04, 0x12, 0x08, 0x10, 0x10, 0x08, 0xE0, 0x07, 0x00, 0x00}; + +const unsigned char Praying[] PROGMEM = {0x00, 0x00, 0x40, 0x02, 0xA0, 0x05, 0x90, 0x09, 0x90, 0x09, 0x90, + 0x09, 0x98, 0x19, 0x94, 0x29, 0xA4, 0x25, 0xA4, 0x25, 0x84, 0x21, + 0x84, 0x21, 0x86, 0x61, 0x4E, 0x72, 0x7F, 0x7E, 0x3F, 0xFC}; + +const unsigned char Sparkles[] PROGMEM = {0x00, 0x00, 0x10, 0x00, 0x38, 0x04, 0x10, 0x04, 0x00, 0x0E, 0x00, + 0x1F, 0x80, 0x3F, 0xE0, 0xFF, 0x80, 0x3F, 0x10, 0x1F, 0x10, 0x0E, + 0x38, 0x04, 0xFE, 0x04, 0x38, 0x00, 0x10, 0x00, 0x10, 0x00}; + +const unsigned char clown[] PROGMEM = {0x00, 0x00, 0xEE, 0x77, 0x1A, 0x58, 0x06, 0x60, 0x24, 0x24, 0x72, + 0x4E, 0x22, 0x44, 0x82, 0x41, 0x82, 0x41, 0x1A, 0x58, 0xF2, 0x4F, + 0x14, 0x28, 0xE4, 0x27, 0x18, 0x18, 0xE0, 0x07, 0x00, 0x00}; + +const unsigned char robo[] PROGMEM = {0x80, 0x01, 0xC0, 0x03, 0x80, 0x01, 0xFC, 0x3F, 0x04, 0x20, 0x74, + 0x2E, 0x52, 0x4A, 0x72, 0x4E, 0x02, 0x40, 0x02, 0x40, 0xA2, 0x4A, + 0x52, 0x45, 0x04, 0x20, 0x04, 0x20, 0xFC, 0x3F, 0x00, 0x00}; + +const unsigned char hole[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x3C, 0x3C, + 0x06, 0x60, 0x0C, 0x30, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00}; + +const unsigned char bowling[] PROGMEM = {0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, + 0x38, 0x00, 0x28, 0x78, 0x44, 0x84, 0x82, 0x22, 0x83, 0x52, 0x83, + 0x02, 0x83, 0x02, 0x45, 0x84, 0x44, 0x78, 0x38, 0x00, 0x00}; + +const unsigned char vulcan_salute[] PROGMEM = {0x08, 0x02, 0x16, 0x0D, 0x15, 0x15, 0x15, 0x15, 0xA9, 0x12, 0x4A, + 0x0A, 0x02, 0x38, 0x04, 0x48, 0x04, 0x44, 0x04, 0x22, 0x04, 0x22, + 0x04, 0x12, 0x08, 0x10, 0x10, 0x08, 0xE0, 0x07, 0x00, 0x00}; #endif } // namespace graphics diff --git a/src/graphics/emotes.h b/src/graphics/emotes.h index 30b164cbc..b1b2d16da 100644 --- a/src/graphics/emotes.h +++ b/src/graphics/emotes.h @@ -17,98 +17,150 @@ extern const int numEmotes; #ifndef EXCLUDE_EMOJI // === Emote Bitmaps === -#define thumbs_height 25 -#define thumbs_width 25 +#define thumbs_height 16 +#define thumbs_width 16 extern const unsigned char thumbup[] PROGMEM; extern const unsigned char thumbdown[] PROGMEM; -#define Smiling_Eyes_height 30 -#define Smiling_Eyes_width 30 +#define Smiling_Eyes_height 16 +#define Smiling_Eyes_width 16 extern const unsigned char Smiling_Eyes[] PROGMEM; -#define Grinning_height 30 -#define Grinning_width 30 +#define Grinning_height 16 +#define Grinning_width 16 extern const unsigned char Grinning[] PROGMEM; -#define Slightly_Smiling_height 30 -#define Slightly_Smiling_width 30 +#define Slightly_Smiling_height 16 +#define Slightly_Smiling_width 16 extern const unsigned char Slightly_Smiling[] PROGMEM; -#define Winking_Face_height 30 -#define Winking_Face_width 30 +#define Winking_Face_height 16 +#define Winking_Face_width 16 extern const unsigned char Winking_Face[] PROGMEM; -#define Grinning_Smiling_Eyes_height 30 -#define Grinning_Smiling_Eyes_width 30 +#define Grinning_Smiling_Eyes_height 16 +#define Grinning_Smiling_Eyes_width 16 extern const unsigned char Grinning_Smiling_Eyes[] PROGMEM; -#define question_height 25 -#define question_width 25 +#define heart_smile_height 16 +#define heart_smile_width 16 +extern const unsigned char heart_smile[] PROGMEM; + +#define Heart_eyes_height 16 +#define Heart_eyes_width 16 +extern const unsigned char Heart_eyes[] PROGMEM; + +#define question_height 16 +#define question_width 16 extern const unsigned char question[] PROGMEM; -#define bang_height 30 -#define bang_width 30 +#define bang_height 16 +#define bang_width 16 extern const unsigned char bang[] PROGMEM; -#define haha_height 30 -#define haha_width 30 +#define haha_height 16 +#define haha_width 16 extern const unsigned char haha[] PROGMEM; -#define ROFL_height 30 -#define ROFL_width 30 +#define ROFL_height 16 +#define ROFL_width 16 extern const unsigned char ROFL[] PROGMEM; -#define Smiling_Closed_Eyes_height 30 -#define Smiling_Closed_Eyes_width 30 +#define Smiling_Closed_Eyes_height 16 +#define Smiling_Closed_Eyes_width 16 extern const unsigned char Smiling_Closed_Eyes[] PROGMEM; -#define Grinning_SmilingEyes2_height 30 -#define Grinning_SmilingEyes2_width 30 +#define Grinning_SmilingEyes2_height 16 +#define Grinning_SmilingEyes2_width 16 extern const unsigned char Grinning_SmilingEyes2[] PROGMEM; -#define wave_icon_height 30 -#define wave_icon_width 30 +#define Loudly_Crying_Face_height 16 +#define Loudly_Crying_Face_width 16 +extern const unsigned char Loudly_Crying_Face[] PROGMEM; + +#define wave_icon_height 16 +#define wave_icon_width 16 extern const unsigned char wave_icon[] PROGMEM; -#define cowboy_height 30 -#define cowboy_width 30 +#define cowboy_height 16 +#define cowboy_width 16 extern const unsigned char cowboy[] PROGMEM; -#define deadmau5_height 30 -#define deadmau5_width 60 +#define deadmau5_height 16 +#define deadmau5_width 16 extern const unsigned char deadmau5[] PROGMEM; -#define sun_height 30 -#define sun_width 30 +#define sun_height 16 +#define sun_width 16 extern const unsigned char sun[] PROGMEM; -#define rain_height 30 -#define rain_width 30 +#define rain_height 16 +#define rain_width 16 extern const unsigned char rain[] PROGMEM; -#define cloud_height 30 -#define cloud_width 30 +#define cloud_height 16 +#define cloud_width 16 extern const unsigned char cloud[] PROGMEM; -#define fog_height 25 -#define fog_width 25 +#define fog_height 16 +#define fog_width 16 extern const unsigned char fog[] PROGMEM; -#define devil_height 30 -#define devil_width 30 +#define devil_height 16 +#define devil_width 16 extern const unsigned char devil[] PROGMEM; -#define heart_height 30 -#define heart_width 30 +#define heart_height 16 +#define heart_width 16 extern const unsigned char heart[] PROGMEM; -#define poo_height 30 -#define poo_width 30 +#define poo_height 16 +#define poo_width 16 extern const unsigned char poo[] PROGMEM; -#define bell_icon_width 30 -#define bell_icon_height 30 +#define bell_icon_width 16 +#define bell_icon_height 16 extern const unsigned char bell_icon[] PROGMEM; + +#define cookie_width 16 +#define cookie_height 16 +extern const unsigned char cookie[] PROGMEM; + +#define Fire_width 16 +#define Fire_height 16 +extern const unsigned char Fire[] PROGMEM; + +#define peace_sign_width 16 +#define peace_sign_height 16 +extern const unsigned char peace_sign[] PROGMEM; + +#define Praying_width 16 +#define Praying_height 16 +extern const unsigned char Praying[] PROGMEM; + +#define Sparkles_width 16 +#define Sparkles_height 16 +extern const unsigned char Sparkles[] PROGMEM; + +#define clown_width 16 +#define clown_height 16 +extern const unsigned char clown[] PROGMEM; + +#define robo_width 16 +#define robo_height 16 +extern const unsigned char robo[] PROGMEM; + +#define hole_width 16 +#define hole_height 16 +extern const unsigned char hole[] PROGMEM; + +#define bowling_width 16 +#define bowling_height 16 +extern const unsigned char bowling[] PROGMEM; + +#define vulcan_salute_width 16 +#define vulcan_salute_height 16 +extern const unsigned char vulcan_salute[] PROGMEM; #endif // EXCLUDE_EMOJI -} // namespace graphics +} // namespace graphics \ No newline at end of file From de83b448f96196a7cbd837be8b54013449d58d6c Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Fri, 31 Oct 2025 10:54:35 +0000 Subject: [PATCH 061/286] Force stdout to be line buffered - this fixes logs ending early if meshtasticd crashes (#8499) --- src/platform/portduino/PortduinoGlue.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index dbc90f9a4..cfa0b560a 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -37,6 +37,8 @@ bool yamlOnly = false; const char *argp_program_version = optstr(APP_VERSION); +char stdoutBuffer[512]; + // FIXME - move setBluetoothEnable into a HALPlatform class void setBluetoothEnable(bool enable) { @@ -154,6 +156,9 @@ void portduinoSetup() std::string gpioChipName = "gpiochip"; portduino_config.displayPanel = no_screen; + // Force stdout to be line buffered + setvbuf(stdout, stdoutBuffer, _IOLBF, sizeof(stdoutBuffer)); + if (portduino_config.force_simradio == true) { portduino_config.lora_module = use_simradio; } else if (configPath != nullptr) { From 4f817d69eb03fefd37b89995bf0ccd09433df155 Mon Sep 17 00:00:00 2001 From: Andrew Yong Date: Fri, 31 Oct 2025 18:55:07 +0800 Subject: [PATCH 062/286] fix(wio-e5): Fix LED state inversion (#8500) Wio-E5 currently has LED appearing to be steadily on, due to incorrect LED_STATE_ON (it is actually briefly flashing off, but visually it is hard to perceive). Wio-E5 has LED between GPIO PB5 and VCC, so LED_STATE_ON should be 0 for LED to blink correctly. With this commit, it is now flashing correctly. Refer to schematics: * [Wio-E5 Development Kit](https://files.seeedstudio.com/products/113990934/LoRa-E5%20Dev%20Board%20v1.0.pdf) * [Wio-E5 mini](https://files.seeedstudio.com/products/113990939/LoRa-E5%20mini%20v1.0.pdf) Signed-off-by: Andrew Yong --- variants/stm32/wio-e5/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/stm32/wio-e5/variant.h b/variants/stm32/wio-e5/variant.h index 6098b4ce6..a312b31bd 100644 --- a/variants/stm32/wio-e5/variant.h +++ b/variants/stm32/wio-e5/variant.h @@ -15,7 +15,7 @@ Do not expect a working Meshtastic device with this target. #define USE_STM32WLx #define LED_PIN PB5 -#define LED_STATE_ON 1 +#define LED_STATE_ON 0 #define WIO_E5 From d00fda2f4d9cab15ff59f607246c093eb180bedb Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 31 Oct 2025 05:55:56 -0500 Subject: [PATCH 063/286] Better implementation of ExternalNotificationModule::stopNow (#8492) * Better implementation of ExternalNotificationModule::stopNow * Label external states turning off * Optimize original code to actually fix issues --- src/modules/ExternalNotificationModule.cpp | 31 +++++++++++----------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index 2b1730e9c..b047e04c2 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -94,22 +94,10 @@ int32_t ExternalNotificationModule::runOnce() // audioThread->isPlaying() also handles actually playing the RTTTL, needs to be called in loop isRtttlPlaying = isRtttlPlaying || audioThread->isPlaying(); #endif - if ((nagCycleCutoff <= millis())) { + if ((nagCycleCutoff < millis()) && !isRtttlPlaying) { // Turn off external notification immediately when timeout is reached, regardless of song state nagCycleCutoff = UINT32_MAX; - LOG_INFO("Turning off external notification: "); - for (int i = 0; i < 3; i++) { - setExternalState(i, false); - externalTurnedOn[i] = 0; - LOG_INFO("%d ", i); - } -#ifdef HAS_I2S - // GPIO0 is used as mclk for I2S audio and set to OUTPUT by the sound library - // T-Deck uses GPIO0 as trackball button, so restore the mode -#if defined(T_DECK) || (defined(BUTTON_PIN) && BUTTON_PIN == 0) - pinMode(0, INPUT); -#endif -#endif + ExternalNotificationModule::stopNow(); isNagging = false; return INT32_MAX; // save cycles till we're needed again } @@ -317,22 +305,33 @@ bool ExternalNotificationModule::nagging() void ExternalNotificationModule::stopNow() { + LOG_INFO("Turning off external notification: "); + LOG_INFO("Stop RTTTL playback"); rtttl::stop(); #ifdef HAS_I2S + LOG_INFO("Stop audioThread playback"); if (audioThread->isPlaying()) audioThread->stop(); #endif - nagCycleCutoff = 1; // small value - isNagging = false; // Turn off all outputs + LOG_INFO("Turning off setExternalStates: "); for (int i = 0; i < 3; i++) { setExternalState(i, false); externalTurnedOn[i] = 0; + LOG_INFO("%d ", i); } setIntervalFromNow(0); #ifdef T_WATCH_S3 drv.stop(); #endif + +#ifdef HAS_I2S + // GPIO0 is used as mclk for I2S audio and set to OUTPUT by the sound library + // T-Deck uses GPIO0 as trackball button, so restore the mode +#if defined(T_DECK) || (defined(BUTTON_PIN) && BUTTON_PIN == 0) + pinMode(0, INPUT); +#endif +#endif } ExternalNotificationModule::ExternalNotificationModule() From 16b1280804f7a85eb59fe4e5994337650c54b3a5 Mon Sep 17 00:00:00 2001 From: Erayd Date: Tue, 28 Oct 2025 00:05:59 +1300 Subject: [PATCH 064/286] Fix type to ensure correct alignment; saves 4B per entry (#8465) --- src/mesh/PacketCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mesh/PacketCache.h b/src/mesh/PacketCache.h index 81ad455da..85660922b 100644 --- a/src/mesh/PacketCache.h +++ b/src/mesh/PacketCache.h @@ -17,7 +17,7 @@ typedef struct PacketCacheEntry { uint8_t encrypted : 1; // Payload is encrypted uint8_t has_metadata : 1; // Payload includes PacketCacheMetadata uint8_t : 6; // Reserved for future use - uint16_t : 8; // Reserved for future use + uint8_t : 8; // Reserved for future use }; }; } PacketCacheEntry; From 001654e90a81ef8500aefb57a37bb32ddb01b99b Mon Sep 17 00:00:00 2001 From: Marius Faber <45321033+mariusfaber98@users.noreply.github.com> Date: Fri, 31 Oct 2025 23:38:37 +0100 Subject: [PATCH 065/286] Add basic LR1121 support for T-Beam S3, full support needs #4775 fixed (#8349) --- variants/esp32s3/tbeam-s3-core/rfswitch.h | 11 +++++++++++ variants/esp32s3/tbeam-s3-core/variant.h | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 variants/esp32s3/tbeam-s3-core/rfswitch.h diff --git a/variants/esp32s3/tbeam-s3-core/rfswitch.h b/variants/esp32s3/tbeam-s3-core/rfswitch.h new file mode 100644 index 000000000..19080cec6 --- /dev/null +++ b/variants/esp32s3/tbeam-s3-core/rfswitch.h @@ -0,0 +1,11 @@ +#include "RadioLib.h" + +static const uint32_t rfswitch_dio_pins[] = {RADIOLIB_LR11X0_DIO5, RADIOLIB_LR11X0_DIO6, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC}; + +static const Module::RfSwitchMode_t rfswitch_table[] = { + // mode DIO5 DIO6 + {LR11x0::MODE_STBY, {LOW, LOW}}, {LR11x0::MODE_RX, {HIGH, LOW}}, + {LR11x0::MODE_TX, {LOW, HIGH}}, {LR11x0::MODE_TX_HP, {LOW, HIGH}}, + {LR11x0::MODE_TX_HF, {LOW, LOW}}, {LR11x0::MODE_GNSS, {LOW, LOW}}, + {LR11x0::MODE_WIFI, {LOW, LOW}}, END_OF_MODE_TABLE, +}; \ No newline at end of file diff --git a/variants/esp32s3/tbeam-s3-core/variant.h b/variants/esp32s3/tbeam-s3-core/variant.h index 40ba0307a..1d99fbf14 100644 --- a/variants/esp32s3/tbeam-s3-core/variant.h +++ b/variants/esp32s3/tbeam-s3-core/variant.h @@ -15,6 +15,7 @@ // not found then probe for SX1262 #define USE_SX1262 #define USE_SX1268 +#define USE_LR1121 #define LORA_DIO0 -1 // a No connect on the SX1262 module #define LORA_RESET 5 @@ -34,6 +35,19 @@ // code) #endif +// LR1121 +#ifdef USE_LR1121 +#define LR1121_IRQ_PIN 1 +#define LR1121_NRESET_PIN LORA_RESET +#define LR1121_BUSY_PIN 4 +#define LR1121_SPI_NSS_PIN 10 +#define LR1121_SPI_SCK_PIN 12 +#define LR1121_SPI_MOSI_PIN 11 +#define LR1121_SPI_MISO_PIN 13 +#define LR11X0_DIO3_TCXO_VOLTAGE 3.0 +#define LR11X0_DIO_AS_RF_SWITCH +#endif + // Leave undefined to disable our PMU IRQ handler. DO NOT ENABLE THIS because the pmuirq can cause sperious interrupts // and waking from light sleep // #define PMU_IRQ 40 @@ -64,4 +78,4 @@ // has 32768 Hz crystal #define HAS_32768HZ 1 -#define USE_SH1106 +#define USE_SH1106 \ No newline at end of file From 17324fa72544300e563e43f25d49fb6621eaf52d Mon Sep 17 00:00:00 2001 From: shortwavesurfer2009 <116814522+shortwavesurfer2009@users.noreply.github.com> Date: Fri, 31 Oct 2025 18:39:30 -0400 Subject: [PATCH 066/286] adjust battery curve (#8137) Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> --- variants/nrf52840/heltec_mesh_pocket/variant.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variants/nrf52840/heltec_mesh_pocket/variant.h b/variants/nrf52840/heltec_mesh_pocket/variant.h index 79f47bd0e..e765dab66 100644 --- a/variants/nrf52840/heltec_mesh_pocket/variant.h +++ b/variants/nrf52840/heltec_mesh_pocket/variant.h @@ -120,7 +120,7 @@ No longer populated on PCB #undef AREF_VOLTAGE #define AREF_VOLTAGE 3.0 #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 -#define ADC_MULTIPLIER (4.90F) +#define ADC_MULTIPLIER (4.6425F) #undef HAS_GPS #define HAS_GPS 0 @@ -129,4 +129,4 @@ No longer populated on PCB } #endif -#endif \ No newline at end of file +#endif From 7f78a624cd23ab4720300893df15e766f8c589bc Mon Sep 17 00:00:00 2001 From: pa0lin082 Date: Fri, 31 Oct 2025 23:40:36 +0100 Subject: [PATCH 067/286] Add support for Bh1750 Light Sensor (#8376) * regenerate protobuf with bh1750 TelemetrySensorType * Added wollewald/BH1750_WE@^1.1.10 dependecy * Added support for BH1750 during i2C detection * Create new BH1750Sensor and added in EnvironmentTelemetry * clean code * Attempt to fix protobuf include --------- Co-authored-by: Tom Fifield --- platformio.ini | 2 + src/detect/ScanI2C.h | 3 +- src/detect/ScanI2CTwoWire.cpp | 20 ++++++- .../Telemetry/EnvironmentTelemetry.cpp | 7 +++ src/modules/Telemetry/Sensor/BH1750Sensor.cpp | 54 +++++++++++++++++++ src/modules/Telemetry/Sensor/BH1750Sensor.h | 21 ++++++++ 6 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/BH1750Sensor.cpp create mode 100644 src/modules/Telemetry/Sensor/BH1750Sensor.h diff --git a/platformio.ini b/platformio.ini index 7c63ad7ad..fe2f5e28a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -181,6 +181,8 @@ lib_deps = dfrobot/DFRobot_BMM150@1.0.0 # renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561 adafruit/Adafruit TSL2561@1.1.2 + # renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/BH1750_WE@^1.1.10 + wollewald/BH1750_WE@^1.1.10 ; (not included in native / portduino) [environmental_extra] diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 2e602338c..e7bdf58c5 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -82,7 +82,8 @@ class ScanI2C BHI260AP, BMM150, TSL2561, - DRV2605 + DRV2605, + BH1750 } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index da2a57fee..59d93d74f 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -485,7 +485,25 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address); SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address); SCAN_SIMPLE_CASE(CST328_ADDR, CST328, "CST328", (uint8_t)addr.address); - SCAN_SIMPLE_CASE(LTR553ALS_ADDR, LTR553ALS, "LTR553ALS", (uint8_t)addr.address); + case LTR553ALS_ADDR: + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x86), 1); // Part ID register + if (registerValue == 0x92) { // LTR553ALS Part ID + type = LTR553ALS; + logFoundDevice("LTR553ALS", (uint8_t)addr.address); + } else { + // Test BH1750 - send power on command + i2cBus->beginTransmission(addr.address); + i2cBus->write(0x01); // Power On command + uint8_t bh1750_error = i2cBus->endTransmission(); + if (bh1750_error == 0) { + type = BH1750; + logFoundDevice("BH1750", (uint8_t)addr.address); + } else { + LOG_INFO("Device found at address 0x%x was not able to be enumerated", (uint8_t)addr.address); + } + } + break; + SCAN_SIMPLE_CASE(BHI260AP_ADDR, BHI260AP, "BHI260AP", (uint8_t)addr.address); SCAN_SIMPLE_CASE(SCD4X_ADDR, SCD4X, "SCD4X", (uint8_t)addr.address); SCAN_SIMPLE_CASE(BMM150_ADDR, BMM150, "BMM150", (uint8_t)addr.address); diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 2337af808..a923ab457 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -134,6 +134,10 @@ extern void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const c #include "Sensor/TSL2561Sensor.h" #endif +#if __has_include() +#include "Sensor/BH1750Sensor.h" +#endif + #define FAILED_STATE_SENSOR_READ_MULTIPLIER 10 #define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true @@ -262,6 +266,9 @@ void EnvironmentTelemetryModule::i2cScanFinished(ScanI2C *i2cScanner) #if __has_include() addSensor(i2cScanner, ScanI2C::DeviceType::NAU7802); #endif +#if __has_include() + addSensor(i2cScanner, ScanI2C::DeviceType::BH1750); +#endif #endif } diff --git a/src/modules/Telemetry/Sensor/BH1750Sensor.cpp b/src/modules/Telemetry/Sensor/BH1750Sensor.cpp new file mode 100644 index 000000000..b8790dcd5 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BH1750Sensor.cpp @@ -0,0 +1,54 @@ +#include "configuration.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include() + +#include "../mesh/generated/meshtastic/telemetry.pb.h" +#include "BH1750Sensor.h" +#include "TelemetrySensor.h" +#include + +#ifndef BH1750_SENSOR_MODE +#define BH1750_SENSOR_MODE BH1750Mode::CHM +#endif + +BH1750Sensor::BH1750Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BH1750, "BH1750") {} + +bool BH1750Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) +{ + LOG_INFO("Init sensor: %s with mode %d", sensorName, BH1750_SENSOR_MODE); + + bh1750 = BH1750_WE(bus, dev->address.address); + status = bh1750.init(); + if (!status) { + return status; + } + + bh1750.setMode(BH1750_SENSOR_MODE); + + initI2CSensor(); + return status; +} + +bool BH1750Sensor::getMetrics(meshtastic_Telemetry *measurement) +{ + + /* An OTH and OTH_2 measurement takes ~120 ms. I suggest to wait + 140 ms to be on the safe side. + An OTL measurement takes about 16 ms. I suggest to wait 20 ms + to be on the safe side. */ + if (BH1750_SENSOR_MODE == BH1750Mode::OTH || BH1750_SENSOR_MODE == BH1750Mode::OTH_2) { + bh1750.setMode(BH1750_SENSOR_MODE); + delay(140); // wait for measurement to be completed + } else if (BH1750_SENSOR_MODE == BH1750Mode::OTL) { + bh1750.setMode(BH1750_SENSOR_MODE); + delay(20); + } + + measurement->variant.environment_metrics.has_lux = true; + float lightIntensity = bh1750.getLux(); + + measurement->variant.environment_metrics.lux = lightIntensity; + return true; +} + +#endif diff --git a/src/modules/Telemetry/Sensor/BH1750Sensor.h b/src/modules/Telemetry/Sensor/BH1750Sensor.h new file mode 100644 index 000000000..d9a4ded95 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BH1750Sensor.h @@ -0,0 +1,21 @@ +#pragma once +#include "configuration.h" + +#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include() + +#include "../mesh/generated/meshtastic/telemetry.pb.h" +#include "TelemetrySensor.h" +#include + +class BH1750Sensor : public TelemetrySensor +{ + private: + BH1750_WE bh1750; + + public: + BH1750Sensor(); + virtual bool getMetrics(meshtastic_Telemetry *measurement) override; + virtual bool initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) override; +}; + +#endif From c46abe125c2c99728558f4ae4f4857507bdc75e4 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sat, 1 Nov 2025 12:45:11 -0500 Subject: [PATCH 068/286] Skip setting up Lora GPIO lines when using a ch341 radio on native (#8506) --- src/platform/portduino/PortduinoGlue.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index dbc90f9a4..53dece150 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -393,11 +393,17 @@ void portduinoSetup() // Need to bind all the configured GPIO pins so they're not simulated // TODO: If one of these fails, we should log and terminate for (auto i : portduino_config.all_pins) { - if (i->enabled) + // In the case of a ch341 Lora device, we don't want to touch the system GPIO lines for Lora + // Those GPIO are handled in our usermode driver instead. + if (i->config_section == "Lora" && portduino_config.lora_spi_dev == "ch341") { + continue; + } + if (i->enabled) { if (initGPIOPin(i->pin, gpioChipName + std::to_string(i->gpiochip), i->line) != ERRNO_OK) { printf("Error setting pin number %d. It may not exist, or may already be in use.\n", i->line); exit(EXIT_FAILURE); } + } } // Only initialize the radio pins when dealing with real, kernel controlled SPI hardware @@ -423,8 +429,7 @@ int initGPIOPin(int pinNum, const std::string gpioChipName, int line) { #ifdef PORTDUINO_LINUX_HARDWARE std::string gpio_name = "GPIO" + std::to_string(pinNum); - std::cout << gpio_name; - printf("\n"); + std::cout << "Initializing " << gpio_name << " on chip " << gpioChipName << std::endl; try { GPIOPin *csPin; csPin = new LinuxGPIOPin(pinNum, gpioChipName.c_str(), line, gpio_name.c_str()); From bca0e1abde1076ed24d08e5e113fc8789bbc754b Mon Sep 17 00:00:00 2001 From: GUVWAF <78759985+GUVWAF@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:48:04 +0100 Subject: [PATCH 069/286] Fix boot on RP2040 by excluding new FreeRTOS task (#8508) --- src/input/InputBroker.cpp | 6 +++--- src/input/InputBroker.h | 4 ++-- src/main.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/input/InputBroker.cpp b/src/input/InputBroker.cpp index c588a9a0f..39fc665c5 100644 --- a/src/input/InputBroker.cpp +++ b/src/input/InputBroker.cpp @@ -5,7 +5,7 @@ InputBroker *inputBroker = nullptr; InputBroker::InputBroker() { -#ifdef HAS_FREE_RTOS +#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) inputEventQueue = xQueueCreate(5, sizeof(InputEvent)); pollSoonQueue = xQueueCreate(5, sizeof(InputPollable *)); xTaskCreate(pollSoonWorker, "input-pollSoon", 2 * 1024, this, 10, &pollSoonTask); @@ -17,7 +17,7 @@ void InputBroker::registerSource(Observable *source) this->inputEventObserver.observe(source); } -#ifdef HAS_FREE_RTOS +#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) void InputBroker::requestPollSoon(InputPollable *pollable) { if (xPortInIsrContext() == pdTRUE) { @@ -52,7 +52,7 @@ int InputBroker::handleInputEvent(const InputEvent *event) return 0; } -#ifdef HAS_FREE_RTOS +#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) void InputBroker::pollSoonWorker(void *p) { InputBroker *instance = (InputBroker *)p; diff --git a/src/input/InputBroker.h b/src/input/InputBroker.h index 192bd7e8b..36328ca64 100644 --- a/src/input/InputBroker.h +++ b/src/input/InputBroker.h @@ -59,7 +59,7 @@ class InputBroker : public Observable InputBroker(); void registerSource(Observable *source); void injectInputEvent(const InputEvent *event) { handleInputEvent(event); } -#ifdef HAS_FREE_RTOS +#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) void requestPollSoon(InputPollable *pollable); void queueInputEvent(const InputEvent *event); void processInputEventQueue(); @@ -69,7 +69,7 @@ class InputBroker : public Observable int handleInputEvent(const InputEvent *event); private: -#ifdef HAS_FREE_RTOS +#if defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) QueueHandle_t inputEventQueue; QueueHandle_t pollSoonQueue; TaskHandle_t pollSoonTask; diff --git a/src/main.cpp b/src/main.cpp index 689e80e35..c65482292 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1595,7 +1595,7 @@ void loop() #endif service->loop(); -#if !MESHTASTIC_EXCLUDE_INPUTBROKER && defined(HAS_FREE_RTOS) +#if !MESHTASTIC_EXCLUDE_INPUTBROKER && defined(HAS_FREE_RTOS) && !defined(ARCH_RP2040) if (inputBroker) inputBroker->processInputEventQueue(); #endif From 718fd118b095557ad0242fa0162d51489d51f6ab Mon Sep 17 00:00:00 2001 From: Xavier horwood <39760456+Xavierhorwood@users.noreply.github.com> Date: Sun, 2 Nov 2025 09:25:59 +1100 Subject: [PATCH 070/286] Add IPv6 Support for esp32 (#6866) * Update Default.h * Update NodeDB.cpp * Update WiFiAPClient.cpp * Update userPrefs.jsonc * set ipv6 to off by default * Trunk fix --------- Co-authored-by: Tom Fifield --- src/mesh/Default.h | 1 + src/mesh/NodeDB.cpp | 6 ++++++ src/mesh/wifi/WiFiAPClient.cpp | 33 +++++++++++++++++++++++++++++++-- userPrefs.jsonc | 1 + 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/mesh/Default.h b/src/mesh/Default.h index 34289ccb6..218d8d0fb 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -29,6 +29,7 @@ #else #define default_ringtone_nag_secs 15 #endif +#define default_network_ipv6_enabled false #define default_mqtt_address "mqtt.meshtastic.org" #define default_mqtt_username "meshdev" diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index dec8411fe..df9aece0a 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -718,6 +718,12 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) strncpy(config.network.wifi_psk, USERPREFS_NETWORK_WIFI_PSK, sizeof(config.network.wifi_psk)); #endif +#if defined(USERPREFS_NETWORK_IPV6_ENABLED) + config.network.ipv6_enabled = USERPREFS_NETWORK_IPV6_ENABLED; +#else + config.network.ipv6_enabled = default_network_ipv6_enabled; +#endif + #ifdef DISPLAY_FLIP_SCREEN config.display.flip_screen = true; #endif diff --git a/src/mesh/wifi/WiFiAPClient.cpp b/src/mesh/wifi/WiFiAPClient.cpp index 18f67706a..45944872e 100644 --- a/src/mesh/wifi/WiFiAPClient.cpp +++ b/src/mesh/wifi/WiFiAPClient.cpp @@ -334,6 +334,23 @@ bool initWifi() } #ifdef ARCH_ESP32 +#if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(3, 0, 0) +// Most of the next 12 lines of code are adapted from espressif/arduino-esp32 +// Licensed under the GNU Lesser General Public License v2.1 +// https://github.com/espressif/arduino-esp32/blob/1f038677eb2eaf5e9ca6b6074486803c15468bed/libraries/WiFi/src/WiFiSTA.cpp#L755 +esp_netif_t *get_esp_interface_netif(esp_interface_t interface); +IPv6Address GlobalIPv6() +{ + esp_ip6_addr_t addr; + if (WiFiGenericClass::getMode() == WIFI_MODE_NULL) { + return IPv6Address(); + } + if (esp_netif_get_ip6_global(get_esp_interface_netif(ESP_IF_WIFI_STA), &addr)) { + return IPv6Address(); + } + return IPv6Address(addr.addr); +} +#endif // Called by the Espressif SDK to static void WiFiEvent(WiFiEvent_t event) { @@ -355,6 +372,17 @@ static void WiFiEvent(WiFiEvent_t event) break; case ARDUINO_EVENT_WIFI_STA_CONNECTED: LOG_INFO("Connected to access point"); + if (config.network.ipv6_enabled) { +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0) + if (!WiFi.enableIPv6()) { + LOG_WARN("Failed to enable IPv6"); + } +#else + if (!WiFi.enableIpV6()) { + LOG_WARN("Failed to enable IPv6"); + } +#endif + } #ifdef WIFI_LED digitalWrite(WIFI_LED, HIGH); #endif @@ -383,7 +411,8 @@ static void WiFiEvent(WiFiEvent_t event) LOG_INFO("Obtained Local IP6 address: %s", WiFi.linkLocalIPv6().toString().c_str()); LOG_INFO("Obtained GlobalIP6 address: %s", WiFi.globalIPv6().toString().c_str()); #else - LOG_INFO("Obtained IP6 address: %s", WiFi.localIPv6().toString().c_str()); + LOG_INFO("Obtained Local IP6 address: %s", WiFi.localIPv6().toString().c_str()); + LOG_INFO("Obtained GlobalIP6 address: %s", GlobalIPv6().toString().c_str()); #endif break; case ARDUINO_EVENT_WIFI_STA_LOST_IP: @@ -514,4 +543,4 @@ uint8_t getWifiDisconnectReason() { return wifiDisconnectReason; } -#endif // HAS_WIFI \ No newline at end of file +#endif // HAS_WIFI diff --git a/userPrefs.jsonc b/userPrefs.jsonc index 464eb968c..0c92eabcf 100644 --- a/userPrefs.jsonc +++ b/userPrefs.jsonc @@ -56,5 +56,6 @@ // "USERPREFS_MQTT_ROOT_TOPIC": "event/REPLACEME", // "USERPREFS_RINGTONE_NAG_SECS": "60", "USERPREFS_RINGTONE_RTTTL": "24:d=32,o=5,b=565:f6,p,f6,4p,p,f6,p,f6,2p,p,b6,p,b6,p,b6,p,b6,p,b,p,b,p,b,p,b,p,b,p,b,p,b,p,b,1p.,2p.,p", + // "USERPREFS_NETWORK_IPV6_ENABLED": "1", "USERPREFS_TZ_STRING": "tzplaceholder " } From a7796fc7b486af5ce03f3f4740f6d666743ec00c Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sat, 1 Nov 2025 21:11:36 -0500 Subject: [PATCH 071/286] Fix dismiss of ext. notification (#8512) * Dismiss all ext notifications with any input broker event * Account for nagging --- src/input/InputBroker.cpp | 8 ++++++++ src/modules/ExternalNotificationModule.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/input/InputBroker.cpp b/src/input/InputBroker.cpp index 39fc665c5..7e3ff3de9 100644 --- a/src/input/InputBroker.cpp +++ b/src/input/InputBroker.cpp @@ -1,5 +1,7 @@ #include "InputBroker.h" #include "PowerFSM.h" // needed for event trigger +#include "configuration.h" +#include "modules/ExternalNotificationModule.h" InputBroker *inputBroker = nullptr; @@ -48,6 +50,12 @@ void InputBroker::processInputEventQueue() int InputBroker::handleInputEvent(const InputEvent *event) { powerFSM.trigger(EVENT_INPUT); // todo: not every input should wake, like long hold release + + if (event && event->inputEvent != INPUT_BROKER_NONE && externalNotificationModule && + moduleConfig.external_notification.enabled) { + externalNotificationModule->stopNow(); + } + this->notifyObservers(event); return 0; } diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index b047e04c2..4fe49cc1b 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -325,6 +325,10 @@ void ExternalNotificationModule::stopNow() drv.stop(); #endif + // Prevent the state machine from immediately re-triggering outputs after a manual stop. + isNagging = false; + nagCycleCutoff = UINT32_MAX; + #ifdef HAS_I2S // GPIO0 is used as mclk for I2S audio and set to OUTPUT by the sound library // T-Deck uses GPIO0 as trackball button, so restore the mode From d1b66782d128950ead5d4dfad2cc76eae7f9370d Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 2 Nov 2025 05:57:15 -0600 Subject: [PATCH 072/286] Hide nodes that don't have position in the distance and bearings nodelists (#8518) --- src/graphics/draw/NodeListRenderer.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index 16bfa7066..2a2f71dba 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -425,6 +425,12 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t { const int COMMON_HEADER_HEIGHT = FONT_HEIGHT_SMALL - 1; const int rowYOffset = FONT_HEIGHT_SMALL - 3; + bool locationScreen = false; + + if (strcmp(title, "Bearings") == 0) + locationScreen = true; + else if (strcmp(title, "Distance") == 0) + locationScreen = true; #if defined(M5STACK_UNITC6L) int columnWidth = display->getWidth(); #else @@ -440,7 +446,7 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t int totalEntries = nodeDB->getNumMeshNodes(); int totalRowsAvailable = (display->getHeight() - y) / rowYOffset; - + int numskipped = 0; int visibleNodeRows = totalRowsAvailable; #if defined(M5STACK_UNITC6L) int totalColumns = 1; @@ -460,6 +466,10 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t int rowCount = 0; for (int i = startIndex; i < endIndex; ++i) { + if (locationScreen && !nodeDB->getMeshNodeByIndex(i)->has_position) { + numskipped++; + continue; + } int xPos = x + (col * columnWidth); int yPos = y + yOffset; renderer(display, nodeDB->getMeshNodeByIndex(i), xPos, yPos, columnWidth); @@ -482,6 +492,9 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t } } + // This should correct the scrollbar + totalEntries -= numskipped; + #if !defined(M5STACK_UNITC6L) // Draw column separator if (shownCount > 0) { From 3a67204f6df571ccc1b10d03c0443fc67e5cb9ea Mon Sep 17 00:00:00 2001 From: Melon <1523107+Melonbwead@users.noreply.github.com> Date: Sun, 2 Nov 2025 12:09:15 +0000 Subject: [PATCH 073/286] Update device-install.sh to support heltec-v4 (#8509) * Update device-install.sh * Update device-install.sh --- bin/device-install.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/bin/device-install.sh b/bin/device-install.sh index ede75bbba..69e4794ba 100755 --- a/bin/device-install.sh +++ b/bin/device-install.sh @@ -31,21 +31,23 @@ MUIDB_8MB=( "seeed-sensecap-indicator" ) BIGDB_16MB=( - "t-deck" - "mesh-tab" - "t-energy-s3" "dreamcatcher" - "ESP32-S3-Pico" - "m5stack-cores3" - "station-g2" - "t-eth-elite" - "tlora-pager" - "t-watch-s3" "elecrow-adv" + "ESP32-S3-Pico" + "heltec-v4" + "m5stack-cores3" + "mesh-tab" + "station-g2" + "t-deck" + "t-energy-s3" + "t-eth-elite" + "t-watch-s3" + "tlora-pager" ) S3_VARIANTS=( "s3" "-v3" + "-v4" "t-deck" "wireless-paper" "wireless-tracker" From b5b9dc310f8a62fba1d91272adc21b1a94d099cc Mon Sep 17 00:00:00 2001 From: Melon <1523107+Melonbwead@users.noreply.github.com> Date: Sun, 2 Nov 2025 12:09:15 +0000 Subject: [PATCH 074/286] Update device-install.sh to support heltec-v4 (#8509) * Update device-install.sh * Update device-install.sh --- bin/device-install.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/bin/device-install.sh b/bin/device-install.sh index ede75bbba..69e4794ba 100755 --- a/bin/device-install.sh +++ b/bin/device-install.sh @@ -31,21 +31,23 @@ MUIDB_8MB=( "seeed-sensecap-indicator" ) BIGDB_16MB=( - "t-deck" - "mesh-tab" - "t-energy-s3" "dreamcatcher" - "ESP32-S3-Pico" - "m5stack-cores3" - "station-g2" - "t-eth-elite" - "tlora-pager" - "t-watch-s3" "elecrow-adv" + "ESP32-S3-Pico" + "heltec-v4" + "m5stack-cores3" + "mesh-tab" + "station-g2" + "t-deck" + "t-energy-s3" + "t-eth-elite" + "t-watch-s3" + "tlora-pager" ) S3_VARIANTS=( "s3" "-v3" + "-v4" "t-deck" "wireless-paper" "wireless-tracker" From 597fa0b3820e2799cb95c1a5369f3b952b20b4b9 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 2 Nov 2025 06:11:47 -0600 Subject: [PATCH 075/286] Add heltec v4 to bat as well --- bin/device-install.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/device-install.bat b/bin/device-install.bat index 9c206d718..519073b08 100755 --- a/bin/device-install.bat +++ b/bin/device-install.bat @@ -15,12 +15,12 @@ SET "LOGCOUNTER=0" SET "BPS_RESET=0" @REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable. -SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv" +SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv heltec-v4" SET "C3=esp32c3" @REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable. SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger" SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator" -SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv" +SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv heltec-v4" GOTO getopts :help From 7def82595dd6da1f5b2191f87de9bc5bd6413bb3 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 2 Nov 2025 21:30:41 -0600 Subject: [PATCH 076/286] Rename screen options to display options and add units chooser (#8517) * Rename screen options to display options and add units chooser * Add InitialSelected to DisplayUnits_menu --- src/graphics/draw/MenuHandler.cpp | 56 ++++++++++++++++++++++++++----- src/graphics/draw/MenuHandler.h | 4 ++- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 10c20cbd6..ddd4231f9 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -574,7 +574,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, Bluetooth, PowerMenu, FrameToggles, Test, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, Bluetooth, PowerMenu, Test, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -583,12 +583,10 @@ void menuHandler::systemBaseMenu() optionsEnumArray[options++] = Notifications; #if defined(ST7789_CS) || defined(ST7796_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || \ defined(USE_SH1107) || defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || HAS_TFT - optionsArray[options] = "Screen Options"; + optionsArray[options] = "Display Options"; optionsEnumArray[options++] = ScreenOptions; #endif - optionsArray[options] = "Frame Visiblity Toggle"; - optionsEnumArray[options++] = FrameToggles; #if defined(M5STACK_UNITC6L) optionsArray[options] = "Bluetooth"; #else @@ -626,9 +624,6 @@ void menuHandler::systemBaseMenu() } else if (selected == PowerMenu) { menuHandler::menuQueue = menuHandler::power_menu; screen->runNow(); - } else if (selected == FrameToggles) { - menuHandler::menuQueue = menuHandler::FrameToggles; - screen->runNow(); } else if (selected == Test) { menuHandler::menuQueue = menuHandler::test_menu; screen->runNow(); @@ -1330,7 +1325,7 @@ void menuHandler::screenOptionsMenu() hasSupportBrightness = false; #endif - enum optionsNumbers { Back, NodeNameLength, Brightness, ScreenColor }; + enum optionsNumbers { Back, NodeNameLength, Brightness, ScreenColor, FrameToggles, DisplayUnits }; static const char *optionsArray[5] = {"Back"}; static int optionsEnumArray[5] = {Back}; int options = 1; @@ -1352,8 +1347,14 @@ void menuHandler::screenOptionsMenu() optionsEnumArray[options++] = ScreenColor; #endif + optionsArray[options] = "Frame Visiblity Toggle"; + optionsEnumArray[options++] = FrameToggles; + + optionsArray[options] = "Display Units"; + optionsEnumArray[options++] = DisplayUnits; + BannerOverlayOptions bannerOptions; - bannerOptions.message = "Screen Options"; + bannerOptions.message = "Display Options"; bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = options; bannerOptions.optionsEnumPtr = optionsEnumArray; @@ -1367,6 +1368,12 @@ void menuHandler::screenOptionsMenu() } else if (selected == NodeNameLength) { menuHandler::menuQueue = menuHandler::node_name_length_menu; screen->runNow(); + } else if (selected == FrameToggles) { + menuHandler::menuQueue = menuHandler::FrameToggles; + screen->runNow(); + } else if (selected == DisplayUnits) { + menuHandler::menuQueue = menuHandler::DisplayUnits; + screen->runNow(); } else { menuQueue = system_base_menu; screen->runNow(); @@ -1578,6 +1585,34 @@ void menuHandler::FrameToggles_menu() screen->showOverlayBanner(bannerOptions); } +void menuHandler::DisplayUnits_menu() +{ + enum optionsNumbers { Back, MetricUnits, ImperialUnits }; + + static const char *optionsArray[] = {"Back", "Metric", "Imperial"}; + BannerOverlayOptions bannerOptions; + bannerOptions.message = " Select display units"; + bannerOptions.optionsArrayPtr = optionsArray; + bannerOptions.optionsCount = 3; + if (config.display.units == meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL) + bannerOptions.InitialSelected = 2; + else + bannerOptions.InitialSelected = 1; + bannerOptions.bannerCallback = [](int selected) -> void { + if (selected == MetricUnits) { + config.display.units = meshtastic_Config_DisplayConfig_DisplayUnits_METRIC; + service->reloadConfig(SEGMENT_CONFIG); + } else if (selected == ImperialUnits) { + config.display.units = meshtastic_Config_DisplayConfig_DisplayUnits_IMPERIAL; + service->reloadConfig(SEGMENT_CONFIG); + } else { + menuHandler::menuQueue = menuHandler::screen_options_menu; + screen->runNow(); + } + }; + screen->showOverlayBanner(bannerOptions); +} + void menuHandler::handleMenuSwitch(OLEDDisplay *display) { if (menuQueue != menu_none) @@ -1692,6 +1727,9 @@ void menuHandler::handleMenuSwitch(OLEDDisplay *display) case FrameToggles: FrameToggles_menu(); break; + case DisplayUnits: + DisplayUnits_menu(); + break; case throttle_message: screen->showSimpleBanner("Too Many Attempts\nTry again in 60 seconds.", 5000); break; diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index 1f7bbac8c..a611b7c9d 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -44,7 +44,8 @@ class menuHandler trace_route_menu, throttle_message, node_name_length_menu, - FrameToggles + FrameToggles, + DisplayUnits }; static screenMenus menuQueue; @@ -88,6 +89,7 @@ class menuHandler static void powerMenu(); static void nodeNameLengthMenu(); static void FrameToggles_menu(); + static void DisplayUnits_menu(); static void textMessageMenu(); private: From 0a124b7f3dbb38aa98c6edc152983fd4f37fe451 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanishkin Date: Mon, 3 Nov 2025 21:17:52 +0700 Subject: [PATCH 077/286] Fix SHT4x detection by reading unique serial nubmer (#8525) --- src/detect/ScanI2CTwoWire.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 59d93d74f..95ae5d31e 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -106,6 +106,7 @@ uint16_t ScanI2CTwoWire::getRegisterValue(const ScanI2CTwoWire::RegisterLocation if (i2cBus->available()) i2cBus->read(); } + LOG_DEBUG("Register value: 0x%x", value); return value; } @@ -377,14 +378,13 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) } case SHT31_4x_ADDR: // same as OPT3001_ADDR_ALT case SHT31_4x_ADDR_ALT: // same as OPT3001_ADDR - registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x89), 2); - if (registerValue == 0x11a2 || registerValue == 0x11da || registerValue == 0x11f3 || registerValue == 0xe9c || - registerValue == 0xc8d) { - type = SHT4X; - logFoundDevice("SHT4X", (uint8_t)addr.address); - } else if (getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x7E), 2) == 0x5449) { + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x7E), 2); + if (registerValue == 0x5449) { type = OPT3001; logFoundDevice("OPT3001", (uint8_t)addr.address); + } else if (getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x89), 2) != 0) { // unique SHT4x serial number + type = SHT4X; + logFoundDevice("SHT4X", (uint8_t)addr.address); } else { type = SHT31; logFoundDevice("SHT31", (uint8_t)addr.address); From 3ae7e54681e858af5acc7242718091e264fbe655 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:14:08 -0600 Subject: [PATCH 078/286] Automated version bumps (#8527) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 6fc5e8597..61ecf9fb5 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.13 diff --git a/debian/changelog b/debian/changelog index e124f8929..a387cc3c5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.14.0) unstable; urgency=medium + + * Version 2.7.14 + + -- GitHub Actions Mon, 03 Nov 2025 16:11:31 +0000 + meshtasticd (2.7.13.0) unstable; urgency=medium * Version 2.7.13 diff --git a/version.properties b/version.properties index f33f0f1cb..fe1a5b31b 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 13 +build = 14 From 468247fb9499d2c5c36974d4a2d3712195e727f8 Mon Sep 17 00:00:00 2001 From: Melon <1523107+Melonbwead@users.noreply.github.com> Date: Mon, 3 Nov 2025 20:14:24 +0000 Subject: [PATCH 079/286] ADD - heltec v4 support to device install bat (#8528) --- bin/device-install.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/device-install.bat b/bin/device-install.bat index 9c206d718..0c3025af5 100755 --- a/bin/device-install.bat +++ b/bin/device-install.bat @@ -15,12 +15,12 @@ SET "LOGCOUNTER=0" SET "BPS_RESET=0" @REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable. -SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv" +SET "S3=s3 v3 v4 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv" SET "C3=esp32c3" @REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable. SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger" SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator" -SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv" +SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv heltec-v4" GOTO getopts :help From f6370bea8f498d0f74affc1a41dd1d9f2de8085d Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Tue, 4 Nov 2025 04:18:52 +0800 Subject: [PATCH 080/286] Add the identification code for the DA217 triaxial accelerometer. (#8526) --- src/configuration.h | 1 + src/detect/ScanI2C.h | 3 ++- src/detect/ScanI2CTwoWire.cpp | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index baf24a636..524dacdea 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -228,6 +228,7 @@ along with this program. If not, see . #define ICM20948_ADDR_ALT 0x68 #define BHI260AP_ADDR 0x28 #define BMM150_ADDR 0x13 +#define DA217_ADDR 0x26 // ----------------------------------------------------------------------------- // LED diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index e7bdf58c5..cca867851 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -83,7 +83,8 @@ class ScanI2C BMM150, TSL2561, DRV2605, - BH1750 + BH1750, + DA217 } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 95ae5d31e..66697c109 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -465,8 +465,23 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) break; SCAN_SIMPLE_CASE(LSM6DS3_ADDR, LSM6DS3, "LSM6DS3", (uint8_t)addr.address); - SCAN_SIMPLE_CASE(TCA9555_ADDR, TCA9555, "TCA9555", (uint8_t)addr.address); SCAN_SIMPLE_CASE(VEML7700_ADDR, VEML7700, "VEML7700", (uint8_t)addr.address); + case TCA9555_ADDR: + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x01), 1); + if (registerValue == 0x13) { + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); + if (registerValue == 0x81) { + type = DA217; + logFoundDevice("DA217", (uint8_t)addr.address); + } else { + type = TCA9555; + logFoundDevice("TCA9555", (uint8_t)addr.address); + } + } else { + type = TCA9555; + logFoundDevice("TCA9555", (uint8_t)addr.address); + } + break; case TSL25911_ADDR: registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x12), 1); if (registerValue == 0x50) { From 538c05ad6c678769eca0d748ccdea3165c9a20de Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 3 Nov 2025 15:56:23 -0600 Subject: [PATCH 081/286] Revert "ADD - heltec v4 support to device install bat (#8528)" (#8532) This reverts commit 468247fb9499d2c5c36974d4a2d3712195e727f8. --- bin/device-install.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/device-install.bat b/bin/device-install.bat index 0c3025af5..9c206d718 100755 --- a/bin/device-install.bat +++ b/bin/device-install.bat @@ -15,12 +15,12 @@ SET "LOGCOUNTER=0" SET "BPS_RESET=0" @REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable. -SET "S3=s3 v3 v4 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv" +SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv" SET "C3=esp32c3" @REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable. SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger" SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator" -SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv heltec-v4" +SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv" GOTO getopts :help From cf716fe5ef916a2a29dddf598c822f1d5d8e872a Mon Sep 17 00:00:00 2001 From: Manuel <71137295+mverch67@users.noreply.github.com> Date: Tue, 4 Nov 2025 00:11:16 +0100 Subject: [PATCH 082/286] fix strlcpy compile error in Ubuntu 22.04 (#8520) * fix strlcpy error in Ubuntu 20.04 * add to native after tests --- variants/native/portduino/platformio.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 49a8a71c7..474d45492 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -18,6 +18,7 @@ build_flags = ${native_base.build_flags} !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : !pkg-config --cflags --libs sdl2 --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : [env:native-tft] extends = native_base @@ -43,6 +44,7 @@ build_flags = ${native_base.build_flags} -Os -lX11 -linput -lxkbcommon -ffunctio !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : !pkg-config --cflags --libs sdl2 --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${native_base.build_src_filter} @@ -71,6 +73,7 @@ build_flags = ${native_base.build_flags} -Os -ffunction-sections -fdata-sections -D MAP_FULL_REDRAW !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${native_base.build_src_filter} @@ -103,6 +106,7 @@ build_flags = ${native_base.build_flags} -O0 -fsanitize=address -lX11 -linput -l -D VIEW_320x240 !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${env:native-tft.build_src_filter} [env:coverage] From 91621427f1d31ea2d8d0ebad78f05e405fb6c13a Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 3 Nov 2025 18:56:31 -0500 Subject: [PATCH 083/286] Packaging: Add libbsd where needed (#8533) --- .devcontainer/Dockerfile | 2 +- alpine.Dockerfile | 7 ++++--- debian/control | 1 + meshtasticd.spec.rpkg | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a2c56fad9..f546d4cfd 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ # trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue # trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions # trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions -FROM mcr.microsoft.com/devcontainers/cpp:2-debian-12 +FROM mcr.microsoft.com/devcontainers/cpp:2-debian-13 USER root diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 0469874e4..bdee57d79 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -8,7 +8,8 @@ ARG PIO_ENV=native ENV PIP_ROOT_USER_ACTION=ignore RUN apk --no-cache add \ - bash g++ libstdc++-dev linux-headers zip git ca-certificates libgpiod-dev yaml-cpp-dev bluez-dev \ + bash g++ libstdc++-dev linux-headers zip git ca-certificates libbsd-dev \ + libgpiod-dev yaml-cpp-dev bluez-dev \ libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \ libx11-dev libinput-dev libxkbcommon-dev \ && rm -rf /var/cache/apk/* \ @@ -40,8 +41,8 @@ LABEL org.opencontainers.image.title="Meshtastic" \ USER root RUN apk --no-cache add \ - shadow libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \ - libx11 libinput libxkbcommon \ + shadow libstdc++ libbsd libgpiod yaml-cpp libusb \ + i2c-tools libuv libx11 libinput libxkbcommon \ && rm -rf /var/cache/apk/* \ && mkdir -p /var/lib/meshtasticd \ && mkdir -p /etc/meshtasticd/config.d \ diff --git a/debian/control b/debian/control index 761383a5c..679a444c9 100644 --- a/debian/control +++ b/debian/control @@ -3,6 +3,7 @@ Section: misc Priority: optional Maintainer: Austin Lane Build-Depends: debhelper-compat (= 13), + libc6-dev (>= 2.38) | libbsd-dev, lsb-release, tar, gzip, diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index eb4ab5ae7..f3b2e6960 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -33,6 +33,7 @@ BuildRequires: python3dist(grpcio[protobuf]) BuildRequires: python3dist(grpcio-tools) BuildRequires: git-core BuildRequires: gcc-c++ +BuildRequires: (glibc-devel >= 2.38) or pkgconfig(libbsd-overlay) BuildRequires: pkgconfig(yaml-cpp) BuildRequires: pkgconfig(libgpiod) BuildRequires: pkgconfig(bluez) From 83954293d8b52068750f40ae633ae7ccaf39b9c0 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Tue, 4 Nov 2025 04:35:44 -0700 Subject: [PATCH 084/286] nrf52: add watchdog (#8485) * nrf52: add watchdog Main thread only for now. * bump framework-arduinoadafruitnrf52 to pick up new wdt support * clang-format the new parts of main-nrf52.cpp --------- Co-authored-by: Ben Meadors --- arch/nrf52/nrf52.ini | 2 +- src/platform/nrf52/main-nrf52.cpp | 33 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini index 36effe017..e60d47ce7 100644 --- a/arch/nrf52/nrf52.ini +++ b/arch/nrf52/nrf52.ini @@ -7,7 +7,7 @@ extends = arduino_base platform_packages = ; our custom Git version until they merge our PR # TODO renovate - platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#e13f5820002a4fb2a5e6754b42ace185277e5adf + platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#c770c8a16a351b55b86e347a3d9d7b74ad0bbf39 ; Don't renovate toolchain-gccarmnoneeabi platformio/toolchain-gccarmnoneeabi@~1.90301.0 diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 8ce74d5f7..7eea46f6e 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -4,6 +4,13 @@ #include #include #include + +#define NRFX_WDT_ENABLED 1 +#define NRFX_WDT0_ENABLED 1 +#define NRFX_WDT_CONFIG_NO_IRQ 1 +#include +#include + #include #include #include @@ -19,6 +26,9 @@ #include "BQ25713.h" #endif +static nrfx_wdt_t nrfx_wdt = NRFX_WDT_INSTANCE(0); +static nrfx_wdt_channel_id nrfx_wdt_channel_id_nrf52_main; + static inline void debugger_break(void) { __asm volatile("bkpt #0x01\n\t" @@ -202,6 +212,15 @@ void checkSDEvents() void nrf52Loop() { + { + static bool watchdog_running = false; + if (!watchdog_running) { + nrfx_wdt_enable(&nrfx_wdt); + watchdog_running = true; + } + } + nrfx_wdt_channel_feed(&nrfx_wdt, nrfx_wdt_channel_id_nrf52_main); + checkSDEvents(); reportLittleFSCorruptionOnce(); } @@ -269,6 +288,20 @@ void nrf52Setup() LOG_DEBUG("Set random seed %u", seed.seed32); randomSeed(seed.seed32); nRFCrypto.end(); + + // Set up nrfx watchdog. Do not enable the watchdog yet (we do that + // the first time through the main loop), so that other threads can + // allocate their own wdt channel to protect themselves from hangs. + nrfx_wdt_config_t wdt0_config = { + .behaviour = NRF_WDT_BEHAVIOUR_RUN_SLEEP, .reload_value = 2000, + // Note: Not using wdt interrupts. + // .interrupt_priority = NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY + }; + nrfx_err_t r = nrfx_wdt_init(&nrfx_wdt, &wdt0_config, + nullptr // Watchdog event handler, not used, we just reset. + ); + + r = nrfx_wdt_channel_alloc(&nrfx_wdt, &nrfx_wdt_channel_id_nrf52_main); } void cpuDeepSleep(uint32_t msecToWake) From 3ed831b8a32b2e6189a6c535d94722302ae696dc Mon Sep 17 00:00:00 2001 From: "Daniel.Cao" <144674500+DanielCao0@users.noreply.github.com> Date: Tue, 4 Nov 2025 19:53:08 +0800 Subject: [PATCH 085/286] Add support for RAK_WISMESH_TAP_V2 and RAK3401 hardware models (#8537) --- src/platform/esp32/architecture.h | 2 ++ src/platform/nrf52/architecture.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h index 53b23124d..9b5abfba0 100644 --- a/src/platform/esp32/architecture.h +++ b/src/platform/esp32/architecture.h @@ -191,6 +191,8 @@ #define HW_VENDOR meshtastic_HardwareModel_CROWPANEL #elif defined(RAK3312) #define HW_VENDOR meshtastic_HardwareModel_RAK3312 +#elif defined(RAK_WISMESH_TAP_V2) +#define HW_VENDOR meshtastic_HardwareModel_WISMESH_TAP_V2 #elif defined(LINK_32) #define HW_VENDOR meshtastic_HardwareModel_LINK_32 #elif defined(T_DECK_PRO) diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index cee0e5a10..c74f02c44 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -60,6 +60,8 @@ // MAke sure all custom RAK4630 boards are defined before the generic RAK4630 #elif defined(RAK4630) #define HW_VENDOR meshtastic_HardwareModel_RAK4631 +#elif defined(RAK3401) +#define HW_VENDOR meshtastic_HardwareModel_RAK3401 #elif defined(TTGO_T_ECHO) #define HW_VENDOR meshtastic_HardwareModel_T_ECHO #elif defined(T_ECHO_LITE) From 03f69b3b77c49a4b8977aa87a22971bf81ebd6d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 06:04:56 -0600 Subject: [PATCH 086/286] Update RadioLib to v7.4.0 (#8456) * fix strlcpy compile error in Ubuntu 22.04 (#8520) * fix strlcpy error in Ubuntu 20.04 * add to native after tests * Add support for RAK_WISMESH_TAP_V2 and RAK3401 hardware models (#8537) * Update RadioLib to v7.4.0 --------- Co-authored-by: Manuel <71137295+mverch67@users.noreply.github.com> Co-authored-by: Daniel.Cao <144674500+DanielCao0@users.noreply.github.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- src/platform/esp32/architecture.h | 2 ++ src/platform/nrf52/architecture.h | 2 ++ variants/native/portduino/platformio.ini | 4 ++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index fe2f5e28a..80f65a9e7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,7 +115,7 @@ lib_deps = [radiolib_base] lib_deps = # renovate: datasource=custom.pio depName=RadioLib packageName=jgromes/library/RadioLib - jgromes/RadioLib@7.3.0 + jgromes/RadioLib@7.4.0 [device-ui_base] lib_deps = diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h index 53b23124d..9b5abfba0 100644 --- a/src/platform/esp32/architecture.h +++ b/src/platform/esp32/architecture.h @@ -191,6 +191,8 @@ #define HW_VENDOR meshtastic_HardwareModel_CROWPANEL #elif defined(RAK3312) #define HW_VENDOR meshtastic_HardwareModel_RAK3312 +#elif defined(RAK_WISMESH_TAP_V2) +#define HW_VENDOR meshtastic_HardwareModel_WISMESH_TAP_V2 #elif defined(LINK_32) #define HW_VENDOR meshtastic_HardwareModel_LINK_32 #elif defined(T_DECK_PRO) diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index cee0e5a10..c74f02c44 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -60,6 +60,8 @@ // MAke sure all custom RAK4630 boards are defined before the generic RAK4630 #elif defined(RAK4630) #define HW_VENDOR meshtastic_HardwareModel_RAK4631 +#elif defined(RAK3401) +#define HW_VENDOR meshtastic_HardwareModel_RAK3401 #elif defined(TTGO_T_ECHO) #define HW_VENDOR meshtastic_HardwareModel_T_ECHO #elif defined(T_ECHO_LITE) diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 49a8a71c7..474d45492 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -18,6 +18,7 @@ build_flags = ${native_base.build_flags} !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : !pkg-config --cflags --libs sdl2 --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : [env:native-tft] extends = native_base @@ -43,6 +44,7 @@ build_flags = ${native_base.build_flags} -Os -lX11 -linput -lxkbcommon -ffunctio !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : !pkg-config --cflags --libs sdl2 --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${native_base.build_src_filter} @@ -71,6 +73,7 @@ build_flags = ${native_base.build_flags} -Os -ffunction-sections -fdata-sections -D MAP_FULL_REDRAW !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${native_base.build_src_filter} @@ -103,6 +106,7 @@ build_flags = ${native_base.build_flags} -O0 -fsanitize=address -lX11 -linput -l -D VIEW_320x240 !pkg-config --libs libulfius --silence-errors || : !pkg-config --libs openssl --silence-errors || : + !pkg-config --cflags --libs libbsd-overlay --silence-errors || : build_src_filter = ${env:native-tft.build_src_filter} [env:coverage] From 0a13bcaabfa20617ae514aa8b256d8d591602987 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 06:07:12 -0600 Subject: [PATCH 087/286] Upgrade trunk (#8437) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 0a43c3079..46916bf29 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,15 +8,15 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.486 - - renovate@41.157.0 + - checkov@3.2.489 + - renovate@41.169.1 - prettier@3.6.2 - - trufflehog@3.90.11 + - trufflehog@3.90.12 - yamllint@1.37.1 - bandit@1.8.6 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.1 + - ruff@0.14.3 - isort@7.0.0 - markdownlint@0.45.0 - oxipng@9.1.5 From f2400c9dc6013bc64c07de823f2afda8988b6405 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 4 Nov 2025 11:35:44 -0600 Subject: [PATCH 088/286] Update platform-native for WIFi lib fix (#8544) Updates the WiFi library way down in Portduino, to detect TCP connection drops --- arch/portduino/portduino.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/portduino/portduino.ini b/arch/portduino/portduino.ini index f3fd00de7..bce06f907 100644 --- a/arch/portduino/portduino.ini +++ b/arch/portduino/portduino.ini @@ -2,7 +2,7 @@ [portduino_base] platform = # renovate: datasource=git-refs depName=platform-native packageName=https://github.com/meshtastic/platform-native gitBranch=develop - https://github.com/meshtastic/platform-native/archive/d3f6e339534233c7217818867368767590ce549e.zip + https://github.com/meshtastic/platform-native/archive/f566d364204416cdbf298e349213f7d551f793d9.zip framework = arduino build_src_filter = From 6b55ec6603d80077585a86310006ca6a8b02420d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:36:05 -0600 Subject: [PATCH 089/286] chore(deps): update python to v3.14.0 (#8542) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index bc660170c..e3f076ce0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,7 +8,7 @@ "features": { "ghcr.io/devcontainers/features/python:1": { "installTools": true, - "version": "3.13" + "version": "3.14" } }, "customizations": { From a579a9d0116847f629dac6686a4289f611dc2739 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 15:35:14 -0600 Subject: [PATCH 090/286] chore(deps): update adafruit pct2075 to v1.0.6 (#8548) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 7c63ad7ad..405fb040b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -176,7 +176,7 @@ lib_deps = # renovate: datasource=custom.pio depName=Adafruit LTR390 Library packageName=adafruit/library/Adafruit LTR390 Library adafruit/Adafruit LTR390 Library@1.1.2 # renovate: datasource=custom.pio depName=Adafruit PCT2075 packageName=adafruit/library/Adafruit PCT2075 - adafruit/Adafruit PCT2075@1.0.5 + adafruit/Adafruit PCT2075@1.0.6 # renovate: datasource=custom.pio depName=DFRobot_BMM150 packageName=dfrobot/library/DFRobot_BMM150 dfrobot/DFRobot_BMM150@1.0.0 # renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561 From 3e40d7896ba26e755bfdb16706277ba6cc07618d Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 5 Nov 2025 10:07:28 -0600 Subject: [PATCH 091/286] Revert "nrf52: add watchdog (#8485)" (#8554) This reverts commit 83954293d8b52068750f40ae633ae7ccaf39b9c0. --- arch/nrf52/nrf52.ini | 2 +- src/platform/nrf52/main-nrf52.cpp | 33 ------------------------------- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini index e60d47ce7..36effe017 100644 --- a/arch/nrf52/nrf52.ini +++ b/arch/nrf52/nrf52.ini @@ -7,7 +7,7 @@ extends = arduino_base platform_packages = ; our custom Git version until they merge our PR # TODO renovate - platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#c770c8a16a351b55b86e347a3d9d7b74ad0bbf39 + platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#e13f5820002a4fb2a5e6754b42ace185277e5adf ; Don't renovate toolchain-gccarmnoneeabi platformio/toolchain-gccarmnoneeabi@~1.90301.0 diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 7eea46f6e..8ce74d5f7 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -4,13 +4,6 @@ #include #include #include - -#define NRFX_WDT_ENABLED 1 -#define NRFX_WDT0_ENABLED 1 -#define NRFX_WDT_CONFIG_NO_IRQ 1 -#include -#include - #include #include #include @@ -26,9 +19,6 @@ #include "BQ25713.h" #endif -static nrfx_wdt_t nrfx_wdt = NRFX_WDT_INSTANCE(0); -static nrfx_wdt_channel_id nrfx_wdt_channel_id_nrf52_main; - static inline void debugger_break(void) { __asm volatile("bkpt #0x01\n\t" @@ -212,15 +202,6 @@ void checkSDEvents() void nrf52Loop() { - { - static bool watchdog_running = false; - if (!watchdog_running) { - nrfx_wdt_enable(&nrfx_wdt); - watchdog_running = true; - } - } - nrfx_wdt_channel_feed(&nrfx_wdt, nrfx_wdt_channel_id_nrf52_main); - checkSDEvents(); reportLittleFSCorruptionOnce(); } @@ -288,20 +269,6 @@ void nrf52Setup() LOG_DEBUG("Set random seed %u", seed.seed32); randomSeed(seed.seed32); nRFCrypto.end(); - - // Set up nrfx watchdog. Do not enable the watchdog yet (we do that - // the first time through the main loop), so that other threads can - // allocate their own wdt channel to protect themselves from hangs. - nrfx_wdt_config_t wdt0_config = { - .behaviour = NRF_WDT_BEHAVIOUR_RUN_SLEEP, .reload_value = 2000, - // Note: Not using wdt interrupts. - // .interrupt_priority = NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY - }; - nrfx_err_t r = nrfx_wdt_init(&nrfx_wdt, &wdt0_config, - nullptr // Watchdog event handler, not used, we just reset. - ); - - r = nrfx_wdt_channel_alloc(&nrfx_wdt, &nrfx_wdt_channel_id_nrf52_main); } void cpuDeepSleep(uint32_t msecToWake) From ce2e08e0d818cad7b729cd14227e46328cd0d4d2 Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 5 Nov 2025 13:19:55 -0600 Subject: [PATCH 092/286] Don't Favorite Nodes if our Role is CLIENT_BASE (#8558) * Don't Favorite Nodes if our Role is CLIENT_BASE * Update CannedMessageModule.cpp --- src/modules/CannedMessageModule.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 9f95a9e20..f435f6060 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -973,8 +973,14 @@ void CannedMessageModule::sendText(NodeNum dest, ChannelIndex channel, const cha LOG_INFO("Send message id=%u, dest=%x, msg=%.*s", p->id, p->to, p->decoded.payload.size, p->decoded.payload.bytes); if (p->to != 0xffffffff) { - LOG_INFO("Proactively adding %x as favorite node", p->to); - nodeDB->set_favorite(true, p->to); + // Only add as favorite if our role is NOT CLIENT_BASE + if (config.device.role != 12) { + LOG_INFO("Proactively adding %x as favorite node", p->to); + nodeDB->set_favorite(true, p->to); + } else { + LOG_DEBUG("Not favoriting node %x as we are CLIENT_BASE role", p->to); + } + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); p->pki_encrypted = true; p->channel = 0; From 45bf2468a9b2d0317a444ceeaf013d1b148fb363 Mon Sep 17 00:00:00 2001 From: Manuel <71137295+mverch67@users.noreply.github.com> Date: Thu, 6 Nov 2025 02:32:56 +0100 Subject: [PATCH 093/286] fix missing key 0 (#8564) --- src/input/TDeckProKeyboard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/TDeckProKeyboard.cpp b/src/input/TDeckProKeyboard.cpp index 098e0804a..eeafe4949 100644 --- a/src/input/TDeckProKeyboard.cpp +++ b/src/input/TDeckProKeyboard.cpp @@ -57,7 +57,7 @@ static unsigned char TDeckProTapMap[_TCA8418_NUM_KEYS][5] = { {0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}, {0x20, 0x00, 0x00}, - {0x00, 0x00, 0x00}, + {0x00, 0x00, '0'}, {0x00, 0x00, 0x00} // R_Shift, sym, space, mic, L_Shift }; From 7b14b173d95ea6dcd9c257ba83eec795720b5a2c Mon Sep 17 00:00:00 2001 From: Wessel Date: Thu, 6 Nov 2025 13:27:25 +0100 Subject: [PATCH 094/286] Store hop/mqtt/transport mechanism info in S&F (#8560) Before this, all messages received when enabling S&F server would return Hops away: -1 --- src/modules/StoreForwardModule.cpp | 8 ++++++++ src/modules/StoreForwardModule.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/modules/StoreForwardModule.cpp b/src/modules/StoreForwardModule.cpp index 72ac99118..b8a710bf5 100644 --- a/src/modules/StoreForwardModule.cpp +++ b/src/modules/StoreForwardModule.cpp @@ -204,6 +204,10 @@ void StoreForwardModule::historyAdd(const meshtastic_MeshPacket &mp) this->packetHistory[this->packetHistoryTotalCount].payload_size = p.payload.size; this->packetHistory[this->packetHistoryTotalCount].rx_rssi = mp.rx_rssi; this->packetHistory[this->packetHistoryTotalCount].rx_snr = mp.rx_snr; + this->packetHistory[this->packetHistoryTotalCount].hop_start = mp.hop_start; + this->packetHistory[this->packetHistoryTotalCount].hop_limit = mp.hop_limit; + this->packetHistory[this->packetHistoryTotalCount].via_mqtt = mp.via_mqtt; + this->packetHistory[this->packetHistoryTotalCount].transport_mechanism = mp.transport_mechanism; memcpy(this->packetHistory[this->packetHistoryTotalCount].payload, p.payload.bytes, meshtastic_Constants_DATA_PAYLOAD_LEN); this->packetHistoryTotalCount++; @@ -256,6 +260,10 @@ meshtastic_MeshPacket *StoreForwardModule::preparePayload(NodeNum dest, uint32_t p->decoded.emoji = (uint32_t)this->packetHistory[i].emoji; p->rx_rssi = this->packetHistory[i].rx_rssi; p->rx_snr = this->packetHistory[i].rx_snr; + p->hop_start = this->packetHistory[i].hop_start; + p->hop_limit = this->packetHistory[i].hop_limit; + p->via_mqtt = this->packetHistory[i].via_mqtt; + p->transport_mechanism = (meshtastic_MeshPacket_TransportMechanism)this->packetHistory[i].transport_mechanism; // Let's assume that if the server received the S&F request that the client is in range. // TODO: Make this configurable. diff --git a/src/modules/StoreForwardModule.h b/src/modules/StoreForwardModule.h index 25836eded..148568e1b 100644 --- a/src/modules/StoreForwardModule.h +++ b/src/modules/StoreForwardModule.h @@ -21,6 +21,10 @@ struct PacketHistoryStruct { pb_size_t payload_size; int32_t rx_rssi; float rx_snr; + uint8_t hop_start; + uint8_t hop_limit; + bool via_mqtt; + uint8_t transport_mechanism; }; class StoreForwardModule : private concurrency::OSThread, public ProtobufModule From 69db3bd11c999d27e25a65fd258113f69ab11fea Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 6 Nov 2025 06:28:13 -0600 Subject: [PATCH 095/286] Reject legacy text message DMs (#8562) Co-authored-by: Ben Meadors --- src/mesh/Router.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index 5cf8bfa7d..05f47d7f4 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -479,6 +479,11 @@ DecodeState perhapsDecode(meshtastic_MeshPacket *p) LOG_ERROR("Invalid protobufs in received mesh packet id=0x%08x (bad psk?)!", p->id); } else if (decodedtmp.portnum == meshtastic_PortNum_UNKNOWN_APP) { LOG_ERROR("Invalid portnum (bad psk?)!"); +#if !(MESHTASTIC_EXCLUDE_PKI) + } else if (!owner.is_licensed && isToUs(p) && decodedtmp.portnum == meshtastic_PortNum_TEXT_MESSAGE_APP) { + LOG_WARN("Rejecting legacy DM"); + return DecodeState::DECODE_FAILURE; +#endif } else { p->decoded = decodedtmp; p->which_payload_variant = meshtastic_MeshPacket_decoded_tag; // change type to decoded From 6a6c409b9a0ac15fafd56af5a36c753313a5209e Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Thu, 6 Nov 2025 08:10:20 -0500 Subject: [PATCH 096/286] addFromContact: Don't auto-favorite when CLIENT_BASE; don't update last_heard unless CLIENT_BASE (#8495) Co-authored-by: Ben Meadors --- src/mesh/NodeDB.cpp | 23 +++++++++++++++++++++-- src/modules/AdminModule.cpp | 11 ++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index df9aece0a..443cc8eb7 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -1638,13 +1638,32 @@ void NodeDB::addFromContact(meshtastic_SharedContact contact) // If should_ignore is set, // we need to clear the public key and other cruft, in addition to setting the node as ignored info->is_ignored = true; + info->is_favorite = false; info->has_device_metrics = false; info->has_position = false; info->user.public_key.size = 0; info->user.public_key.bytes[0] = 0; } else { - info->last_heard = getValidTime(RTCQualityNTP); - info->is_favorite = true; + /* Clients are sending add_contact before every text message DM (because clients may hold a larger node database with + * public keys than the radio holds). However, we don't want to update last_heard just because we sent someone a DM! + */ + + /* "Boring old nodes" are the first to be evicted out of the node database when full. This includes a newly-zeroed + * nodeinfo because it has: !is_favorite && last_heard==0. To keep this from happening when we addFromContact, we set the + * new node as a favorite, and we leave last_heard alone (even if it's zero). + */ + if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) { + // Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it + // without the user doing so deliberately. We don't normally expect users to use a CLIENT_BASE to send DMs or to add + // contacts, but we should make sure it doesn't auto-favorite in case they do. Instead, as a workaround, we'll set + // last_heard to now, so that the add_contact node doesn't immediately get evicted. + info->last_heard = getTime(); + } else { + // Normal case: set is_favorite to prevent expiration. + // last_heard will remain as-is (or remain 0 if this entry wasn't in the nodeDB). + info->is_favorite = true; + } + // As the clients will begin sending the contact with DMs, we want to strictly check if the node is manually verified if (contact.manually_verified) { info->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index d300ff53b..24fb8f1f9 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -104,9 +104,18 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta (config.security.admin_key[2].size == 32 && memcmp(mp.public_key.bytes, config.security.admin_key[2].bytes, 32) == 0)) { LOG_INFO("PKC admin payload with authorized sender key"); + + // Automatically favorite the node that is using the admin key auto remoteNode = nodeDB->getMeshNode(mp.from); if (remoteNode && !remoteNode->is_favorite) { - remoteNode->is_favorite = true; + if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) { + // Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it + // without the user doing so deliberately. + LOG_INFO("PKC admin valid, but not auto-favoriting node %x because role==CLIENT_BASE", mp.from); + } else { + LOG_INFO("PKC admin valid. Auto-favoriting node %x", mp.from); + remoteNode->is_favorite = true; + } } } else { myReply = allocErrorResponse(meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED, &mp); From 5ba04ade2de1855b0d34987ee397d73c8092b34f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Nov 2025 07:10:57 -0600 Subject: [PATCH 097/286] Update protobufs (#8566) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/admin.pb.h | 7 ++++--- src/mesh/generated/meshtastic/mesh.pb.h | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/protobufs b/protobufs index bf149bbdc..7654db2e2 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit bf149bbdcce45ba7cd8643db7cb25e5c8815072b +Subproject commit 7654db2e2d1834aebde40090a9b74162ad1048ae diff --git a/src/mesh/generated/meshtastic/admin.pb.h b/src/mesh/generated/meshtastic/admin.pb.h index 7cc896292..a542cf29c 100644 --- a/src/mesh/generated/meshtastic/admin.pb.h +++ b/src/mesh/generated/meshtastic/admin.pb.h @@ -272,8 +272,9 @@ typedef struct _meshtastic_AdminMessage { int32_t shutdown_seconds; /* Tell the node to factory reset config; all device state and configuration will be returned to factory defaults; BLE bonds will be preserved. */ int32_t factory_reset_config; - /* Tell the node to reset the nodedb. */ - int32_t nodedb_reset; + /* Tell the node to reset the nodedb. + When true, favorites are preserved through reset. */ + bool nodedb_reset; }; /* The node generates this key and sends it with any get_x_response packets. The client MUST include the same key with any set_x commands. Key expires after 300 seconds. @@ -459,7 +460,7 @@ X(a, STATIC, ONEOF, BOOL, (payload_variant,exit_simulator,exit_simulato X(a, STATIC, ONEOF, INT32, (payload_variant,reboot_seconds,reboot_seconds), 97) \ X(a, STATIC, ONEOF, INT32, (payload_variant,shutdown_seconds,shutdown_seconds), 98) \ X(a, STATIC, ONEOF, INT32, (payload_variant,factory_reset_config,factory_reset_config), 99) \ -X(a, STATIC, ONEOF, INT32, (payload_variant,nodedb_reset,nodedb_reset), 100) \ +X(a, STATIC, ONEOF, BOOL, (payload_variant,nodedb_reset,nodedb_reset), 100) \ X(a, STATIC, SINGULAR, BYTES, session_passkey, 101) #define meshtastic_AdminMessage_CALLBACK NULL #define meshtastic_AdminMessage_DEFAULT NULL diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index 059af57ae..0da44cce0 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -284,6 +284,10 @@ typedef enum _meshtastic_HardwareModel { meshtastic_HardwareModel_T_WATCH_ULTRA = 114, /* Elecrow ThinkNode M3 */ meshtastic_HardwareModel_THINKNODE_M3 = 115, + /* RAK WISMESH_TAP_V2 with ESP32-S3 CPU */ + meshtastic_HardwareModel_WISMESH_TAP_V2 = 116, + /* RAK3401 */ + meshtastic_HardwareModel_RAK3401 = 117, /* ------------------------------------------------------------------------------------------------------------------------------------------ Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. ------------------------------------------------------------------------------------------------------------------------------------------ */ From 112b294ef6660429e86eaaacd5705e2b1f679490 Mon Sep 17 00:00:00 2001 From: Wessel Date: Thu, 6 Nov 2025 13:27:25 +0100 Subject: [PATCH 098/286] Store hop/mqtt/transport mechanism info in S&F (#8560) Before this, all messages received when enabling S&F server would return Hops away: -1 --- src/modules/StoreForwardModule.cpp | 8 ++++++++ src/modules/StoreForwardModule.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/modules/StoreForwardModule.cpp b/src/modules/StoreForwardModule.cpp index 72ac99118..b8a710bf5 100644 --- a/src/modules/StoreForwardModule.cpp +++ b/src/modules/StoreForwardModule.cpp @@ -204,6 +204,10 @@ void StoreForwardModule::historyAdd(const meshtastic_MeshPacket &mp) this->packetHistory[this->packetHistoryTotalCount].payload_size = p.payload.size; this->packetHistory[this->packetHistoryTotalCount].rx_rssi = mp.rx_rssi; this->packetHistory[this->packetHistoryTotalCount].rx_snr = mp.rx_snr; + this->packetHistory[this->packetHistoryTotalCount].hop_start = mp.hop_start; + this->packetHistory[this->packetHistoryTotalCount].hop_limit = mp.hop_limit; + this->packetHistory[this->packetHistoryTotalCount].via_mqtt = mp.via_mqtt; + this->packetHistory[this->packetHistoryTotalCount].transport_mechanism = mp.transport_mechanism; memcpy(this->packetHistory[this->packetHistoryTotalCount].payload, p.payload.bytes, meshtastic_Constants_DATA_PAYLOAD_LEN); this->packetHistoryTotalCount++; @@ -256,6 +260,10 @@ meshtastic_MeshPacket *StoreForwardModule::preparePayload(NodeNum dest, uint32_t p->decoded.emoji = (uint32_t)this->packetHistory[i].emoji; p->rx_rssi = this->packetHistory[i].rx_rssi; p->rx_snr = this->packetHistory[i].rx_snr; + p->hop_start = this->packetHistory[i].hop_start; + p->hop_limit = this->packetHistory[i].hop_limit; + p->via_mqtt = this->packetHistory[i].via_mqtt; + p->transport_mechanism = (meshtastic_MeshPacket_TransportMechanism)this->packetHistory[i].transport_mechanism; // Let's assume that if the server received the S&F request that the client is in range. // TODO: Make this configurable. diff --git a/src/modules/StoreForwardModule.h b/src/modules/StoreForwardModule.h index 25836eded..148568e1b 100644 --- a/src/modules/StoreForwardModule.h +++ b/src/modules/StoreForwardModule.h @@ -21,6 +21,10 @@ struct PacketHistoryStruct { pb_size_t payload_size; int32_t rx_rssi; float rx_snr; + uint8_t hop_start; + uint8_t hop_limit; + bool via_mqtt; + uint8_t transport_mechanism; }; class StoreForwardModule : private concurrency::OSThread, public ProtobufModule From 4d86bbafe6c9be6930b49935bc3f147d66a8e093 Mon Sep 17 00:00:00 2001 From: Mike Robbins Date: Thu, 6 Nov 2025 08:10:20 -0500 Subject: [PATCH 099/286] addFromContact: Don't auto-favorite when CLIENT_BASE; don't update last_heard unless CLIENT_BASE (#8495) Co-authored-by: Ben Meadors --- src/mesh/NodeDB.cpp | 23 +++++++++++++++++++++-- src/modules/AdminModule.cpp | 11 ++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index dec8411fe..8d30fb824 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -1632,13 +1632,32 @@ void NodeDB::addFromContact(meshtastic_SharedContact contact) // If should_ignore is set, // we need to clear the public key and other cruft, in addition to setting the node as ignored info->is_ignored = true; + info->is_favorite = false; info->has_device_metrics = false; info->has_position = false; info->user.public_key.size = 0; info->user.public_key.bytes[0] = 0; } else { - info->last_heard = getValidTime(RTCQualityNTP); - info->is_favorite = true; + /* Clients are sending add_contact before every text message DM (because clients may hold a larger node database with + * public keys than the radio holds). However, we don't want to update last_heard just because we sent someone a DM! + */ + + /* "Boring old nodes" are the first to be evicted out of the node database when full. This includes a newly-zeroed + * nodeinfo because it has: !is_favorite && last_heard==0. To keep this from happening when we addFromContact, we set the + * new node as a favorite, and we leave last_heard alone (even if it's zero). + */ + if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) { + // Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it + // without the user doing so deliberately. We don't normally expect users to use a CLIENT_BASE to send DMs or to add + // contacts, but we should make sure it doesn't auto-favorite in case they do. Instead, as a workaround, we'll set + // last_heard to now, so that the add_contact node doesn't immediately get evicted. + info->last_heard = getTime(); + } else { + // Normal case: set is_favorite to prevent expiration. + // last_heard will remain as-is (or remain 0 if this entry wasn't in the nodeDB). + info->is_favorite = true; + } + // As the clients will begin sending the contact with DMs, we want to strictly check if the node is manually verified if (contact.manually_verified) { info->bitfield |= NODEINFO_BITFIELD_IS_KEY_MANUALLY_VERIFIED_MASK; diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index d300ff53b..24fb8f1f9 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -104,9 +104,18 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta (config.security.admin_key[2].size == 32 && memcmp(mp.public_key.bytes, config.security.admin_key[2].bytes, 32) == 0)) { LOG_INFO("PKC admin payload with authorized sender key"); + + // Automatically favorite the node that is using the admin key auto remoteNode = nodeDB->getMeshNode(mp.from); if (remoteNode && !remoteNode->is_favorite) { - remoteNode->is_favorite = true; + if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) { + // Special case for CLIENT_BASE: is_favorite has special meaning, and we don't want to automatically set it + // without the user doing so deliberately. + LOG_INFO("PKC admin valid, but not auto-favoriting node %x because role==CLIENT_BASE", mp.from); + } else { + LOG_INFO("PKC admin valid. Auto-favoriting node %x", mp.from); + remoteNode->is_favorite = true; + } } } else { myReply = allocErrorResponse(meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED, &mp); From 6cad39368801c6168e310c66052fc5de59bc02d7 Mon Sep 17 00:00:00 2001 From: Ford Jones <107664313+ford-jones@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:06:37 +1300 Subject: [PATCH 100/286] Persist favourites on NodeDB reset (#8292) * Conditionally delete favourited nodes on reset * trunk fmt * Fix equality check, use existing macro for role validation * Extend favourite persistence setting to devices of all roles * Refactor: Decoupled role/config check and set role defaults appropriately * Use American-English spelling * Use existing reference * Convert reset to bool, regen protos * Add optional arg to nodedb_reset in favor of additional device setting * Use correct proto commit ID * Regen protos * Log preservation status * Pull latest from master --- src/mesh/NodeDB.cpp | 17 +++++++++++++++-- src/mesh/NodeDB.h | 3 ++- src/modules/AdminModule.cpp | 7 ++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 443cc8eb7..76915397f 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -984,12 +984,25 @@ void NodeDB::installDefaultChannels() channelFile.version = DEVICESTATE_CUR_VER; } -void NodeDB::resetNodes() +void NodeDB::resetNodes(bool keepFavorites) { if (!config.position.fixed_position) clearLocalPosition(); numMeshNodes = 1; - std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite()); + if (keepFavorites) { + LOG_INFO("Clearing node database - preserving favorites"); + for (size_t i = 0; i < meshNodes->size(); i++) { + meshtastic_NodeInfoLite &node = meshNodes->at(i); + if (i > 0 && !node.is_favorite) { + node = meshtastic_NodeInfoLite(); + } else { + numMeshNodes += 1; + } + }; + } else { + LOG_INFO("Clearing node database - removing favorites"); + std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite()); + } devicestate.has_rx_text_message = false; devicestate.has_rx_waypoint = false; saveNodeDatabaseToDisk(); diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index e8724f2c9..444ac13e4 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -229,7 +229,8 @@ class NodeDB */ size_t getNumOnlineMeshNodes(bool localOnly = false); - void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(), removeNodeByNum(NodeNum nodeNum); + void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(bool keepFavorites = false), + removeNodeByNum(NodeNum nodeNum); bool factoryReset(bool eraseBleBonds = false); diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 24fb8f1f9..a98515059 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -289,7 +289,12 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta case meshtastic_AdminMessage_nodedb_reset_tag: { disableBluetooth(); LOG_INFO("Initiate node-db reset"); - nodeDB->resetNodes(); + // CLIENT_BASE, ROUTER and ROUTER_LATE are able to preserve the remaining hop count when relaying a packet via a + // favorited node, so ensure that their favorites are kept on reset + bool rolePreference = + isOneOf(config.device.role, meshtastic_Config_DeviceConfig_Role_CLIENT_BASE, + meshtastic_Config_DeviceConfig_Role_ROUTER, meshtastic_Config_DeviceConfig_Role_ROUTER_LATE); + nodeDB->resetNodes(rolePreference ? rolePreference : r->nodedb_reset); reboot(DEFAULT_REBOOT_SECONDS); break; } From 77e0a24838ffab446742af88799d7bc9cc7110af Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Thu, 6 Nov 2025 19:01:15 -0800 Subject: [PATCH 101/286] Discard everything if downlink isn't on (#8578) --- src/mqtt/MQTT.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 33887557f..40d03de63 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -59,7 +59,13 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) LOG_ERROR("Invalid MQTT service envelope, topic %s, len %u!", topic, length); return; } + const meshtastic_Channel &ch = channels.getByName(e.channel_id); + // Find channel by channel_id and check downlink_enabled + if (!(strcmp(e.channel_id, "PKI") == 0 || + (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { + return; + } // Generate node ID from nodenum for comparison std::string nodeId = nodeDB->getNodeId(); if (strcmp(e.gateway_id, nodeId.c_str()) == 0) { @@ -77,11 +83,6 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) return; } - // Find channel by channel_id and check downlink_enabled - if (!(strcmp(e.channel_id, "PKI") == 0 || - (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { - return; - } LOG_INFO("Received MQTT topic %s, len=%u", topic, length); if (e.packet->hop_limit > HOP_MAX || e.packet->hop_start > HOP_MAX) { LOG_INFO("Invalid hop_limit(%u) or hop_start(%u)", e.packet->hop_limit, e.packet->hop_start); From 7eca061f018def60386bb20f99a1954a23c4cd2c Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 6 Nov 2025 21:01:30 -0600 Subject: [PATCH 102/286] Bugfix: Don't toggle BLE when choosing active state (#8579) --- src/graphics/draw/MenuHandler.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 10c20cbd6..e1d309a10 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -936,7 +936,9 @@ void menuHandler::BluetoothToggleMenu() bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 3; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1 || selected == 2) { + if (selected == 0) + return; + else if (selected != (config.bluetooth.enabled ? 1 : 2)) { InputEvent event = {.inputEvent = (input_broker_event)170, .kbchar = 170, .touchX = 0, .touchY = 0}; inputBroker->injectInputEvent(&event); } From bdb3fb1477e5e9f8492c7c266181bab77d157389 Mon Sep 17 00:00:00 2001 From: Ford Jones <107664313+ford-jones@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:06:37 +1300 Subject: [PATCH 103/286] Persist favourites on NodeDB reset (#8292) * Conditionally delete favourited nodes on reset * trunk fmt * Fix equality check, use existing macro for role validation * Extend favourite persistence setting to devices of all roles * Refactor: Decoupled role/config check and set role defaults appropriately * Use American-English spelling * Use existing reference * Convert reset to bool, regen protos * Add optional arg to nodedb_reset in favor of additional device setting * Use correct proto commit ID * Regen protos * Log preservation status * Pull latest from master --- src/mesh/NodeDB.cpp | 17 +++++++++++++++-- src/mesh/NodeDB.h | 3 ++- src/modules/AdminModule.cpp | 7 ++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 8d30fb824..bda6f4ea4 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -978,12 +978,25 @@ void NodeDB::installDefaultChannels() channelFile.version = DEVICESTATE_CUR_VER; } -void NodeDB::resetNodes() +void NodeDB::resetNodes(bool keepFavorites) { if (!config.position.fixed_position) clearLocalPosition(); numMeshNodes = 1; - std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite()); + if (keepFavorites) { + LOG_INFO("Clearing node database - preserving favorites"); + for (size_t i = 0; i < meshNodes->size(); i++) { + meshtastic_NodeInfoLite &node = meshNodes->at(i); + if (i > 0 && !node.is_favorite) { + node = meshtastic_NodeInfoLite(); + } else { + numMeshNodes += 1; + } + }; + } else { + LOG_INFO("Clearing node database - removing favorites"); + std::fill(nodeDatabase.nodes.begin() + 1, nodeDatabase.nodes.end(), meshtastic_NodeInfoLite()); + } devicestate.has_rx_text_message = false; devicestate.has_rx_waypoint = false; saveNodeDatabaseToDisk(); diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index e8724f2c9..444ac13e4 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -229,7 +229,8 @@ class NodeDB */ size_t getNumOnlineMeshNodes(bool localOnly = false); - void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(), removeNodeByNum(NodeNum nodeNum); + void initConfigIntervals(), initModuleConfigIntervals(), resetNodes(bool keepFavorites = false), + removeNodeByNum(NodeNum nodeNum); bool factoryReset(bool eraseBleBonds = false); diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 24fb8f1f9..a98515059 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -289,7 +289,12 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta case meshtastic_AdminMessage_nodedb_reset_tag: { disableBluetooth(); LOG_INFO("Initiate node-db reset"); - nodeDB->resetNodes(); + // CLIENT_BASE, ROUTER and ROUTER_LATE are able to preserve the remaining hop count when relaying a packet via a + // favorited node, so ensure that their favorites are kept on reset + bool rolePreference = + isOneOf(config.device.role, meshtastic_Config_DeviceConfig_Role_CLIENT_BASE, + meshtastic_Config_DeviceConfig_Role_ROUTER, meshtastic_Config_DeviceConfig_Role_ROUTER_LATE); + nodeDB->resetNodes(rolePreference ? rolePreference : r->nodedb_reset); reboot(DEFAULT_REBOOT_SECONDS); break; } From b25797e1b3d19ceec67493f801332ec53c4071cc Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Thu, 6 Nov 2025 19:01:15 -0800 Subject: [PATCH 104/286] Discard everything if downlink isn't on (#8578) --- src/mqtt/MQTT.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 33887557f..40d03de63 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -59,7 +59,13 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) LOG_ERROR("Invalid MQTT service envelope, topic %s, len %u!", topic, length); return; } + const meshtastic_Channel &ch = channels.getByName(e.channel_id); + // Find channel by channel_id and check downlink_enabled + if (!(strcmp(e.channel_id, "PKI") == 0 || + (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { + return; + } // Generate node ID from nodenum for comparison std::string nodeId = nodeDB->getNodeId(); if (strcmp(e.gateway_id, nodeId.c_str()) == 0) { @@ -77,11 +83,6 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) return; } - // Find channel by channel_id and check downlink_enabled - if (!(strcmp(e.channel_id, "PKI") == 0 || - (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { - return; - } LOG_INFO("Received MQTT topic %s, len=%u", topic, length); if (e.packet->hop_limit > HOP_MAX || e.packet->hop_start > HOP_MAX) { LOG_INFO("Invalid hop_limit(%u) or hop_start(%u)", e.packet->hop_limit, e.packet->hop_start); From e76013fb60245ddabd2ff2a005da03fd3e9d7526 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Fri, 7 Nov 2025 05:16:00 -0600 Subject: [PATCH 105/286] Try-fix traceroute panic (#8568) --- src/modules/TraceRouteModule.cpp | 214 +++++++++++++++++++------------ src/modules/TraceRouteModule.h | 8 ++ 2 files changed, 140 insertions(+), 82 deletions(-) diff --git a/src/modules/TraceRouteModule.cpp b/src/modules/TraceRouteModule.cpp index 5bdde1919..87a2f1bd2 100644 --- a/src/modules/TraceRouteModule.cpp +++ b/src/modules/TraceRouteModule.cpp @@ -11,6 +11,113 @@ extern graphics::Screen *screen; TraceRouteModule *traceRouteModule; +void TraceRouteModule::setResultText(const String &text) +{ + resultText = text; + resultLines.clear(); + resultLinesDirty = true; +} + +void TraceRouteModule::clearResultLines() +{ + resultLines.clear(); + resultLinesDirty = false; +} +#if HAS_SCREEN +void TraceRouteModule::rebuildResultLines(OLEDDisplay *display) +{ + if (!display) { + resultLinesDirty = false; + return; + } + + resultLines.clear(); + + if (resultText.length() == 0) { + resultLinesDirty = false; + return; + } + + int maxWidth = display->getWidth() - 4; + if (maxWidth <= 0) { + resultLinesDirty = false; + return; + } + + int start = 0; + int textLength = resultText.length(); + + while (start <= textLength) { + int newlinePos = resultText.indexOf('\n', start); + String segment; + + if (newlinePos != -1) { + segment = resultText.substring(start, newlinePos); + start = newlinePos + 1; + } else { + segment = resultText.substring(start); + start = textLength + 1; + } + + if (segment.length() == 0) { + resultLines.push_back(""); + continue; + } + + if (display->getStringWidth(segment) <= maxWidth) { + resultLines.push_back(segment); + continue; + } + + String remaining = segment; + + while (remaining.length() > 0) { + String tempLine = ""; + int lastGoodBreak = -1; + bool lineComplete = false; + + for (int i = 0; i < static_cast(remaining.length()); i++) { + char ch = remaining.charAt(i); + String testLine = tempLine + ch; + + if (display->getStringWidth(testLine) > maxWidth) { + if (lastGoodBreak >= 0) { + resultLines.push_back(remaining.substring(0, lastGoodBreak + 1)); + remaining = remaining.substring(lastGoodBreak + 1); + lineComplete = true; + break; + } else if (tempLine.length() > 0) { + resultLines.push_back(tempLine); + remaining = remaining.substring(i); + lineComplete = true; + break; + } else { + resultLines.push_back(String(ch)); + remaining = remaining.substring(i + 1); + lineComplete = true; + break; + } + } else { + tempLine = testLine; + if (ch == ' ' || ch == '>' || ch == '<' || ch == '-' || ch == '(' || ch == ')' || ch == ',') { + lastGoodBreak = i; + } + } + } + + if (!lineComplete) { + if (tempLine.length() > 0) { + resultLines.push_back(tempLine); + } + break; + } + } + } + + resultLinesDirty = false; +} +#endif + bool TraceRouteModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_RouteDiscovery *r) { // We only alter the packet in alterReceivedProtobuf() @@ -406,7 +513,7 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) if (node == 0 || node == NODENUM_BROADCAST) { LOG_ERROR("Invalid node number for trace route: 0x%08x", node); runState = TRACEROUTE_STATE_RESULT; - resultText = "Invalid node"; + setResultText("Invalid node"); resultShowTime = millis(); tracingNode = 0; @@ -420,7 +527,7 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) if (node == nodeDB->getNodeNum()) { LOG_ERROR("Cannot trace route to self: 0x%08x", node); runState = TRACEROUTE_STATE_RESULT; - resultText = "Cannot trace self"; + setResultText("Cannot trace self"); resultShowTime = millis(); tracingNode = 0; @@ -447,6 +554,8 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) unsigned long wait = (cooldownMs - (now - lastTraceRouteTime)) / 1000; bannerText = String("Wait for ") + String(wait) + String("s"); runState = TRACEROUTE_STATE_COOLDOWN; + resultText = ""; + clearResultLines(); requestFocus(); UIFrameEvent e; @@ -459,6 +568,8 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) tracingNode = node; lastTraceRouteTime = now; runState = TRACEROUTE_STATE_TRACKING; + resultText = ""; + clearResultLines(); bannerText = String("Tracing ") + getNodeName(node); LOG_INFO("TraceRoute UI: Starting trace route to node 0x%08x, requesting focus", node); @@ -501,7 +612,7 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) } else { LOG_ERROR("MeshService is NULL!"); runState = TRACEROUTE_STATE_RESULT; - resultText = "Service unavailable"; + setResultText("Service unavailable"); resultShowTime = millis(); tracingNode = 0; @@ -514,7 +625,7 @@ bool TraceRouteModule::startTraceRoute(NodeNum node) } else { LOG_ERROR("Failed to allocate TraceRoute packet from router"); runState = TRACEROUTE_STATE_RESULT; - resultText = "Failed to send"; + setResultText("Failed to send"); resultShowTime = millis(); tracingNode = 0; @@ -532,7 +643,7 @@ void TraceRouteModule::launch(NodeNum node) if (node == 0 || node == NODENUM_BROADCAST) { LOG_ERROR("Invalid node number for trace route: 0x%08x", node); runState = TRACEROUTE_STATE_RESULT; - resultText = "Invalid node"; + setResultText("Invalid node"); resultShowTime = millis(); tracingNode = 0; @@ -546,7 +657,7 @@ void TraceRouteModule::launch(NodeNum node) if (node == nodeDB->getNodeNum()) { LOG_ERROR("Cannot trace route to self: 0x%08x", node); runState = TRACEROUTE_STATE_RESULT; - resultText = "Cannot trace self"; + setResultText("Cannot trace self"); resultShowTime = millis(); tracingNode = 0; @@ -568,6 +679,8 @@ void TraceRouteModule::launch(NodeNum node) unsigned long wait = (cooldownMs - (now - lastTraceRouteTime)) / 1000; bannerText = String("Wait for ") + String(wait) + String("s"); runState = TRACEROUTE_STATE_COOLDOWN; + resultText = ""; + clearResultLines(); requestFocus(); UIFrameEvent e; @@ -580,6 +693,8 @@ void TraceRouteModule::launch(NodeNum node) runState = TRACEROUTE_STATE_TRACKING; tracingNode = node; lastTraceRouteTime = now; + resultText = ""; + clearResultLines(); bannerText = String("Tracing ") + getNodeName(node); requestFocus(); @@ -614,14 +729,14 @@ void TraceRouteModule::launch(NodeNum node) } else { LOG_ERROR("MeshService is NULL!"); runState = TRACEROUTE_STATE_RESULT; - resultText = "Service unavailable"; + setResultText("Service unavailable"); resultShowTime = millis(); tracingNode = 0; } } else { LOG_ERROR("Failed to allocate TraceRoute packet from router"); runState = TRACEROUTE_STATE_RESULT; - resultText = "Failed to send"; + setResultText("Failed to send"); resultShowTime = millis(); tracingNode = 0; } @@ -629,7 +744,7 @@ void TraceRouteModule::launch(NodeNum node) void TraceRouteModule::handleTraceRouteResult(const String &result) { - resultText = result; + setResultText(result); runState = TRACEROUTE_STATE_RESULT; resultShowTime = millis(); tracingNode = 0; @@ -679,83 +794,15 @@ void TraceRouteModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state display->setFont(FONT_SMALL); if (resultText.length() > 0) { - std::vector lines; - String currentLine = ""; - int maxWidth = display->getWidth() - 4; - - int start = 0; - int newlinePos = resultText.indexOf('\n', start); - - while (newlinePos != -1 || start < static_cast(resultText.length())) { - String segment; - if (newlinePos != -1) { - segment = resultText.substring(start, newlinePos); - start = newlinePos + 1; - newlinePos = resultText.indexOf('\n', start); - } else { - segment = resultText.substring(start); - start = resultText.length(); - } - - if (display->getStringWidth(segment) <= maxWidth) { - lines.push_back(segment); - } else { - // Try to break at better positions (space, >, <, -) - String remaining = segment; - - while (remaining.length() > 0) { - String tempLine = ""; - int lastGoodBreak = -1; - bool lineComplete = false; - - for (int i = 0; i < static_cast(remaining.length()); i++) { - char ch = remaining.charAt(i); - String testLine = tempLine + ch; - - if (display->getStringWidth(testLine) > maxWidth) { - if (lastGoodBreak >= 0) { - // Break at the last good position - lines.push_back(remaining.substring(0, lastGoodBreak + 1)); - remaining = remaining.substring(lastGoodBreak + 1); - lineComplete = true; - break; - } else if (tempLine.length() > 0) { - lines.push_back(tempLine); - remaining = remaining.substring(i); - lineComplete = true; - break; - } else { - // Single character exceeds width - lines.push_back(String(ch)); - remaining = remaining.substring(i + 1); - lineComplete = true; - break; - } - } else { - tempLine = testLine; - // Mark good break positions - if (ch == ' ' || ch == '>' || ch == '<' || ch == '-' || ch == '(' || ch == ')') { - lastGoodBreak = i; - } - } - } - - if (!lineComplete) { - // Reached end of remaining text - if (tempLine.length() > 0) { - lines.push_back(tempLine); - } - break; - } - } - } + if (resultLinesDirty) { + rebuildResultLines(display); } int lineHeight = FONT_HEIGHT_SMALL + 1; // Use proper font height with 1px spacing - for (size_t i = 0; i < lines.size(); i++) { + for (size_t i = 0; i < resultLines.size(); i++) { int lineY = contentStartY + (i * lineHeight); if (lineY + FONT_HEIGHT_SMALL <= display->getHeight()) { - display->drawString(x + 2, lineY, lines[i]); + display->drawString(x + 2, lineY, resultLines[i]); } } } @@ -779,7 +826,7 @@ int32_t TraceRouteModule::runOnce() if (runState == TRACEROUTE_STATE_TRACKING && now - lastTraceRouteTime > trackingTimeoutMs) { LOG_INFO("TraceRoute timeout, no response received"); runState = TRACEROUTE_STATE_RESULT; - resultText = "No response received"; + setResultText("No response received"); resultShowTime = now; tracingNode = 0; @@ -815,6 +862,8 @@ int32_t TraceRouteModule::runOnce() // Cooldown finished LOG_INFO("TraceRoute cooldown finished, returning to IDLE"); runState = TRACEROUTE_STATE_IDLE; + resultText = ""; + clearResultLines(); bannerText = ""; UIFrameEvent e; e.action = UIFrameEvent::Action::REGENERATE_FRAMESET; @@ -828,6 +877,7 @@ int32_t TraceRouteModule::runOnce() LOG_INFO("TraceRoute result display timeout, returning to IDLE"); runState = TRACEROUTE_STATE_IDLE; resultText = ""; + clearResultLines(); bannerText = ""; tracingNode = 0; UIFrameEvent e; diff --git a/src/modules/TraceRouteModule.h b/src/modules/TraceRouteModule.h index dac422388..a40ed7733 100644 --- a/src/modules/TraceRouteModule.h +++ b/src/modules/TraceRouteModule.h @@ -7,6 +7,7 @@ #if HAS_SCREEN #include "OLEDDisplayUi.h" #endif +#include #define ROUTE_SIZE sizeof(((meshtastic_RouteDiscovery *)0)->route) / sizeof(((meshtastic_RouteDiscovery *)0)->route[0]) @@ -49,6 +50,11 @@ class TraceRouteModule : public ProtobufModule, virtual int32_t runOnce() override; private: + void setResultText(const String &text); + void clearResultLines(); +#if HAS_SCREEN + void rebuildResultLines(OLEDDisplay *display); +#endif // Call to add unknown hops (e.g. when a node couldn't decrypt it) to the route based on hopStart and current hopLimit void insertUnknownHops(meshtastic_MeshPacket &p, meshtastic_RouteDiscovery *r, bool isTowardsDestination); @@ -74,6 +80,8 @@ class TraceRouteModule : public ProtobufModule, unsigned long trackingTimeoutMs = 10000; String bannerText; String resultText; + std::vector resultLines; + bool resultLinesDirty = false; NodeNum tracingNode = 0; bool initialized = false; }; From 85afd706fd31ddde11f6db6b2259dc151891abcb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 05:33:36 -0600 Subject: [PATCH 106/286] chore(deps): update meshtastic/device-ui digest to 28167c6 (#8583) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 405fb040b..d62504ae3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -120,7 +120,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/19b7855e9a1d9deff37391659ca7194e4ef57c43.zip + https://github.com/meshtastic/device-ui/archive/28167c67dfd13015a0b5eef1828f95fe8e3ab7c3.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From b7070018731319bb4bcf3127329ef1de81bfb779 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 05:33:54 -0600 Subject: [PATCH 107/286] Upgrade trunk (#8552) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 46916bf29..73baa5345 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,10 +8,10 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.489 - - renovate@41.169.1 + - checkov@3.2.490 + - renovate@41.173.1 - prettier@3.6.2 - - trufflehog@3.90.12 + - trufflehog@3.90.13 - yamllint@1.37.1 - bandit@1.8.6 - trivy@0.67.2 @@ -28,7 +28,7 @@ lint: - shellcheck@0.11.0 - black@25.9.0 - git-diff-check - - gitleaks@8.28.0 + - gitleaks@8.29.0 - clang-format@16.0.3 ignore: - linters: [ALL] From 531cad5e8873639d8fe147d2f58f3dbf554d9610 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 7 Nov 2025 15:03:56 -0600 Subject: [PATCH 108/286] Add API types, state, and log message in Debug screen. Added persistent "Connected" icon (#8576) * Add API types, state, and log message in Debug screen * un-goober the API state tracking * Set the SerialConsole api_type * Add api_type for Ethernet * Remove API state debugging code * Update wording for client connection states * Improve string width for smaller screen devices * Reserve space on navigation bar to fit link indicator * Add persistent Connected icon to screen * Connect System frame to ensure text doesn't overflow --------- Co-authored-by: Ben Meadors Co-authored-by: Jason P Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> --- src/SerialConsole.cpp | 1 + src/graphics/SharedUIDisplay.cpp | 39 ++++++++++++++ src/graphics/SharedUIDisplay.h | 3 ++ src/graphics/draw/ClockRenderer.cpp | 3 ++ src/graphics/draw/DebugRenderer.cpp | 47 ++++++++++++++--- src/graphics/draw/MessageRenderer.cpp | 2 + src/graphics/draw/NodeListRenderer.cpp | 1 + src/graphics/draw/UIRenderer.cpp | 52 ++++++++++++++++++- src/graphics/images.h | 4 ++ src/mesh/MeshService.h | 12 +++++ src/mesh/PhoneAPI.cpp | 25 +++++++++ src/mesh/PhoneAPI.h | 12 +++++ src/mesh/api/PacketAPI.cpp | 1 + src/mesh/api/WiFiServerAPI.cpp | 1 + src/mesh/api/ethServerAPI.cpp | 1 + src/mesh/http/ContentHandler.h | 2 +- src/mesh/raspihttp/PiWebServer.h | 2 +- src/modules/SerialModule.cpp | 15 ++++-- .../Telemetry/EnvironmentTelemetry.cpp | 1 + src/modules/Telemetry/PowerTelemetry.cpp | 1 + src/modules/esp32/PaxcounterModule.cpp | 1 + src/nimble/NimbleBluetooth.cpp | 2 +- src/platform/nrf52/NRF52Bluetooth.cpp | 3 ++ 23 files changed, 218 insertions(+), 13 deletions(-) diff --git a/src/SerialConsole.cpp b/src/SerialConsole.cpp index fad0fb92f..dd2acb599 100644 --- a/src/SerialConsole.cpp +++ b/src/SerialConsole.cpp @@ -50,6 +50,7 @@ void consolePrintf(const char *format, ...) SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port), concurrency::OSThread("SerialConsole") { + api_type = TYPE_SERIAL; assert(!console); console = this; canWrite = false; // We don't send packets to our port until it has talked to us first diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp index 8e1299f51..1645789a7 100644 --- a/src/graphics/SharedUIDisplay.cpp +++ b/src/graphics/SharedUIDisplay.cpp @@ -1,6 +1,8 @@ #include "configuration.h" #if HAS_SCREEN +#include "MeshService.h" #include "RTC.h" +#include "draw/NodeListRenderer.h" #include "graphics/ScreenFonts.h" #include "graphics/SharedUIDisplay.h" #include "graphics/draw/UIRenderer.h" @@ -398,6 +400,43 @@ const int *getTextPositions(OLEDDisplay *display) return textPositions; } +// ************************* +// * Common Footer Drawing * +// ************************* +void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y) +{ + bool drawConnectionState = false; + if (service->api_state == service->STATE_BLE || service->api_state == service->STATE_WIFI || + service->api_state == service->STATE_SERIAL || service->api_state == service->STATE_PACKET || + service->api_state == service->STATE_HTTP || service->api_state == service->STATE_ETH) { + drawConnectionState = true; + } + + if (drawConnectionState) { + if (isHighResolution) { + const int scale = 2; + const int bytesPerRow = (connection_icon_width + 7) / 8; + int iconX = 0; + int iconY = SCREEN_HEIGHT - (connection_icon_height * 2); + + for (int yy = 0; yy < connection_icon_height; ++yy) { + const uint8_t *rowPtr = connection_icon + yy * bytesPerRow; + for (int xx = 0; xx < connection_icon_width; ++xx) { + const uint8_t byteVal = pgm_read_byte(rowPtr + (xx >> 3)); + const uint8_t bitMask = 1U << (xx & 7); // XBM is LSB-first + if (byteVal & bitMask) { + display->fillRect(iconX + xx * scale, iconY + yy * scale, scale, scale); + } + } + } + + } else { + display->drawXbm(0, SCREEN_HEIGHT - connection_icon_height, connection_icon_width, connection_icon_height, + connection_icon); + } + } +} + bool isAllowedPunctuation(char c) { const std::string allowed = ".,!?;:-_()[]{}'\"@#$/\\&+=%~^ "; diff --git a/src/graphics/SharedUIDisplay.h b/src/graphics/SharedUIDisplay.h index e1a7c6383..b51dfea36 100644 --- a/src/graphics/SharedUIDisplay.h +++ b/src/graphics/SharedUIDisplay.h @@ -52,6 +52,9 @@ void drawRoundedHighlight(OLEDDisplay *display, int16_t x, int16_t y, int16_t w, void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const char *titleStr = "", bool force_no_invert = false, bool show_date = false); +// Shared battery/time/mail header +void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y); + const int *getTextPositions(OLEDDisplay *display); bool isAllowedPunctuation(char c); diff --git a/src/graphics/draw/ClockRenderer.cpp b/src/graphics/draw/ClockRenderer.cpp index 751db8d88..97417571b 100644 --- a/src/graphics/draw/ClockRenderer.cpp +++ b/src/graphics/draw/ClockRenderer.cpp @@ -302,6 +302,8 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - yOffset, secondString); #endif + + graphics::drawCommonFooter(display, x, y); } void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y) @@ -516,6 +518,7 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 display->drawLine(centerX, centerY, secondX, secondY); #endif } + graphics::drawCommonFooter(display, x, y); } } // namespace ClockRenderer diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 60abd661e..d098fa304 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -3,6 +3,7 @@ #include "../Screen.h" #include "DebugRenderer.h" #include "FSCommon.h" +#include "MeshService.h" #include "NodeDB.h" #include "Throttle.h" #include "UIRenderer.h" @@ -223,6 +224,8 @@ void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i display->drawString(x, getTextPositions(display)[line++], "URL: http://meshtastic.local"); + graphics::drawCommonFooter(display, x, y); + /* Display a heartbeat pixel that blinks every time the frame is redrawn */ #ifdef SHOW_REDRAWS if (heartbeat) @@ -503,6 +506,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, display->drawString(starting_position + chUtil_x + chutil_bar_width + extraoffset, getTextPositions(display)[line++], chUtilPercentage); #endif + graphics::drawCommonFooter(display, x, y); } // **************************** @@ -642,10 +646,9 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x int textWidth = display->getStringWidth(appversionstr); int nameX = (SCREEN_WIDTH - textWidth) / 2; - display->drawString(nameX, getTextPositions(display)[line], appversionstr); -#if !defined(M5STACK_UNITC6L) - if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line < 4)) { // Only show uptime if the screen can show it - line += 1; + display->drawString(nameX, getTextPositions(display)[line++], appversionstr); + + if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show uptime if the screen can show it char uptimeStr[32] = ""; uint32_t uptime = millis() / 1000; uint32_t days = uptime / 86400; @@ -660,9 +663,41 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins); textWidth = display->getStringWidth(uptimeStr); nameX = (SCREEN_WIDTH - textWidth) / 2; - display->drawString(nameX, getTextPositions(display)[line], uptimeStr); + display->drawString(nameX, getTextPositions(display)[line++], uptimeStr); } -#endif + + if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show API state if the screen can show it + char api_state[32] = ""; + const char *clientWord = nullptr; + + // Determine if narrow or wide screen + if (isHighResolution) { + clientWord = "Client"; + } else { + clientWord = "App"; + } + snprintf(api_state, sizeof(api_state), "No %ss Connected", clientWord); + + if (service->api_state == service->STATE_BLE) { + snprintf(api_state, sizeof(api_state), "%s Connected (BLE)", clientWord); + } else if (service->api_state == service->STATE_WIFI) { + snprintf(api_state, sizeof(api_state), "%s Connected (WiFi)", clientWord); + } else if (service->api_state == service->STATE_SERIAL) { + snprintf(api_state, sizeof(api_state), "%s Connected (Serial)", clientWord); + } else if (service->api_state == service->STATE_PACKET) { + snprintf(api_state, sizeof(api_state), "%s Connected (Internal)", clientWord); + } else if (service->api_state == service->STATE_HTTP) { + snprintf(api_state, sizeof(api_state), "%s Connected (HTTP)", clientWord); + } else if (service->api_state == service->STATE_ETH) { + snprintf(api_state, sizeof(api_state), "%s Connected (Ethernet)", clientWord); + } + if (api_state[0] != '\0') { + display->drawString((SCREEN_WIDTH - display->getStringWidth(api_state)) / 2, getTextPositions(display)[line++], + api_state); + } + } + + graphics::drawCommonFooter(display, x, y); } // **************************** diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index 6971826de..da6ec7abc 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -213,6 +213,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 #else display->drawString(center_text, getTextPositions(display)[2], messageString); #endif + graphics::drawCommonFooter(display, x, y); return; } @@ -423,6 +424,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 // Draw header at the end to sort out overlapping elements graphics::drawCommonHeader(display, x, y, titleStr); #endif + graphics::drawCommonFooter(display, x, y); } std::vector generateLines(OLEDDisplay *display, const char *headerStr, const char *messageBuf, int textWidth) diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index 2a2f71dba..1a36a6188 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -505,6 +505,7 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t #endif const int scrollStartY = y + 3; drawScrollbar(display, visibleNodeRows, totalEntries, scrollIndex, 2, scrollStartY); + graphics::drawCommonFooter(display, x, y); } // ============================= diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index 1ff183779..538c32842 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -552,6 +552,7 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st // else show nothing } #endif + graphics::drawCommonFooter(display, x, y); } // **************************** @@ -771,6 +772,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta display->drawString(nameX, getTextPositions(display)[line++], shortnameble); } #endif + graphics::drawCommonFooter(display, x, y); } // Start Functions to write date/time to the screen @@ -1183,6 +1185,7 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU } #endif #endif // HAS_GPS + graphics::drawCommonFooter(display, x, y); } #ifdef USERPREFS_OEM_TEXT @@ -1267,7 +1270,13 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta if (totalIcons == 0) return; - const size_t iconsPerPage = (SCREEN_WIDTH + spacing) / (iconSize + spacing); + const int navPadding = isHighResolution ? 24 : 12; // padding per side + + int usableWidth = SCREEN_WIDTH - (navPadding * 2); + if (usableWidth < iconSize) + usableWidth = iconSize; + + const size_t iconsPerPage = usableWidth / (iconSize + spacing); const size_t currentPage = currentFrame / iconsPerPage; const size_t pageStart = currentPage * iconsPerPage; const size_t pageEnd = min(pageStart + iconsPerPage, totalIcons); @@ -1338,6 +1347,47 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta display->setColor(WHITE); } } + + // Compact arrow drawer + auto drawArrow = [&](bool rightSide) { + display->setColor(WHITE); + + const int offset = isHighResolution ? 3 : 1; + const int halfH = rectHeight / 2; + + const int top = (y - 2) + (rectHeight - halfH) / 2; + const int bottom = top + halfH - 1; + const int midY = top + (halfH / 2); + + const int maxW = 4; + + // Determine left X coordinate + int baseX = rightSide ? (rectX + rectWidth + offset) : // right arrow + (rectX - offset - 1); // left arrow + + for (int yy = top; yy <= bottom; yy++) { + int dist = abs(yy - midY); + int lineW = maxW - (dist * maxW / (halfH / 2)); + if (lineW < 1) + lineW = 1; + + if (rightSide) { + display->drawHorizontalLine(baseX, yy, lineW); + } else { + display->drawHorizontalLine(baseX - lineW + 1, yy, lineW); + } + } + }; + // Right arrow + if (pageEnd < totalIcons) { + drawArrow(true); + } + + // Left arrow + if (pageStart > 0) { + drawArrow(false); + } + // Knock the corners off the square display->setColor(BLACK); display->drawRect(rectX, y - 2, 1, 1); diff --git a/src/graphics/images.h b/src/graphics/images.h index b5010b116..8670d78d9 100644 --- a/src/graphics/images.h +++ b/src/graphics/images.h @@ -360,6 +360,10 @@ const uint8_t chirpy_hirez[] = { #define chirpy_small_image_height 8 const uint8_t chirpy_small[] = {0x7f, 0x41, 0x55, 0x55, 0x55, 0x55, 0x41, 0x7f}; +#define connection_icon_width 7 +#define connection_icon_height 5 +const uint8_t connection_icon[] = {0x36, 0x41, 0x5D, 0x41, 0x36}; + #ifdef M5STACK_UNITC6L #include "img/icon_small.xbm" #else diff --git a/src/mesh/MeshService.h b/src/mesh/MeshService.h index 66d9d9679..71fb544a0 100644 --- a/src/mesh/MeshService.h +++ b/src/mesh/MeshService.h @@ -79,6 +79,18 @@ class MeshService uint32_t oldFromNum = 0; public: + enum APIState { + STATE_DISCONNECTED, // Initial state, no API is connected + STATE_BLE, + STATE_WIFI, + STATE_SERIAL, + STATE_PACKET, + STATE_HTTP, + STATE_ETH + }; + + APIState api_state = STATE_DISCONNECTED; + static bool isTextPayload(const meshtastic_MeshPacket *p) { if (moduleConfig.range_test.enabled && p->decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP) { diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index d1e342c80..9050ee89d 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -87,6 +87,18 @@ void PhoneAPI::handleStartConfig() void PhoneAPI::close() { LOG_DEBUG("PhoneAPI::close()"); + if (service->api_state == service->STATE_BLE && api_type == TYPE_BLE) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_WIFI && api_type == TYPE_WIFI) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_SERIAL && api_type == TYPE_SERIAL) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_PACKET && api_type == TYPE_PACKET) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_HTTP && api_type == TYPE_HTTP) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_ETH && api_type == TYPE_ETH) + service->api_state = service->STATE_DISCONNECTED; if (state != STATE_SEND_NOTHING) { state = STATE_SEND_NOTHING; @@ -578,6 +590,19 @@ void PhoneAPI::sendConfigComplete() fromRadioScratch.config_complete_id = config_nonce; config_nonce = 0; state = STATE_SEND_PACKETS; + if (api_type == TYPE_BLE) { + service->api_state = service->STATE_BLE; + } else if (api_type == TYPE_WIFI) { + service->api_state = service->STATE_WIFI; + } else if (api_type == TYPE_SERIAL) { + service->api_state = service->STATE_SERIAL; + } else if (api_type == TYPE_PACKET) { + service->api_state = service->STATE_PACKET; + } else if (api_type == TYPE_HTTP) { + service->api_state = service->STATE_HTTP; + } else if (api_type == TYPE_ETH) { + service->api_state = service->STATE_ETH; + } // Allow subclasses to know we've entered steady-state so they can lower power consumption onConfigComplete(); diff --git a/src/mesh/PhoneAPI.h b/src/mesh/PhoneAPI.h index d6682684f..7f79b5792 100644 --- a/src/mesh/PhoneAPI.h +++ b/src/mesh/PhoneAPI.h @@ -167,6 +167,18 @@ class PhoneAPI /// begin a new connection void handleStartConfig(); + enum APIType { + TYPE_NONE, // Initial state, don't send anything until the client starts asking for config + TYPE_BLE, + TYPE_WIFI, + TYPE_SERIAL, + TYPE_PACKET, + TYPE_HTTP, + TYPE_ETH + }; + + APIType api_type = TYPE_NONE; + private: void releasePhonePacket(); diff --git a/src/mesh/api/PacketAPI.cpp b/src/mesh/api/PacketAPI.cpp index ab380d696..f4d5de540 100644 --- a/src/mesh/api/PacketAPI.cpp +++ b/src/mesh/api/PacketAPI.cpp @@ -19,6 +19,7 @@ PacketAPI *PacketAPI::create(PacketServer *_server) PacketAPI::PacketAPI(PacketServer *_server) : concurrency::OSThread("PacketAPI"), isConnected(false), programmingMode(false), server(_server) { + api_type = TYPE_PACKET; } int32_t PacketAPI::runOnce() diff --git a/src/mesh/api/WiFiServerAPI.cpp b/src/mesh/api/WiFiServerAPI.cpp index b19194f78..4d729f5c7 100644 --- a/src/mesh/api/WiFiServerAPI.cpp +++ b/src/mesh/api/WiFiServerAPI.cpp @@ -25,6 +25,7 @@ void deInitApiServer() WiFiServerAPI::WiFiServerAPI(WiFiClient &_client) : ServerAPI(_client) { + api_type = TYPE_WIFI; LOG_INFO("Incoming wifi connection"); } diff --git a/src/mesh/api/ethServerAPI.cpp b/src/mesh/api/ethServerAPI.cpp index 0ccf92df7..10ff06df2 100644 --- a/src/mesh/api/ethServerAPI.cpp +++ b/src/mesh/api/ethServerAPI.cpp @@ -20,6 +20,7 @@ void initApiServer(int port) ethServerAPI::ethServerAPI(EthernetClient &_client) : ServerAPI(_client) { LOG_INFO("Incoming ethernet connection"); + api_type = TYPE_ETH; } ethServerPort::ethServerPort(int port) : APIServerPort(port) {} diff --git a/src/mesh/http/ContentHandler.h b/src/mesh/http/ContentHandler.h index 2066a6d57..91cad3359 100644 --- a/src/mesh/http/ContentHandler.h +++ b/src/mesh/http/ContentHandler.h @@ -26,7 +26,7 @@ class HttpAPI : public PhoneAPI { public: - // Nothing here yet + HttpAPI() { api_type = TYPE_HTTP; } private: // Nothing here yet diff --git a/src/mesh/raspihttp/PiWebServer.h b/src/mesh/raspihttp/PiWebServer.h index b45348cf3..5a4adedaa 100644 --- a/src/mesh/raspihttp/PiWebServer.h +++ b/src/mesh/raspihttp/PiWebServer.h @@ -27,7 +27,7 @@ class HttpAPI : public PhoneAPI { public: - // Nothing here yet + HttpAPI() { api_type = TYPE_HTTP; } private: // Nothing here yet diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp index a9ec8f6a8..575e9fa96 100644 --- a/src/modules/SerialModule.cpp +++ b/src/modules/SerialModule.cpp @@ -65,13 +65,22 @@ SerialModuleRadio *serialModuleRadio; #if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \ defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) -SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial; #elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172) || defined(EBYTE_E77_MBL) -SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial1; #else -SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial2; #endif diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index a923ab457..29e815092 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -517,6 +517,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt currentY += rowHeight; } + graphics::drawCommonFooter(display, x, y); } #endif diff --git a/src/modules/Telemetry/PowerTelemetry.cpp b/src/modules/Telemetry/PowerTelemetry.cpp index e69ee3931..29dd1def8 100644 --- a/src/modules/Telemetry/PowerTelemetry.cpp +++ b/src/modules/Telemetry/PowerTelemetry.cpp @@ -165,6 +165,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s if (m.has_ch3_voltage || m.has_ch3_current) { drawLine("Ch3", m.ch3_voltage, m.ch3_current); } + graphics::drawCommonFooter(display, x, y); } #endif diff --git a/src/modules/esp32/PaxcounterModule.cpp b/src/modules/esp32/PaxcounterModule.cpp index 8b1fc5302..9c25177bc 100644 --- a/src/modules/esp32/PaxcounterModule.cpp +++ b/src/modules/esp32/PaxcounterModule.cpp @@ -141,6 +141,7 @@ void PaxcounterModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state display->drawStringf(display->getWidth() / 2 + x, graphics::getTextPositions(display)[line++], buffer, "WiFi: %d\nBLE: %d\nUptime: %ds", count_from_libpax.wifi_count, count_from_libpax.ble_count, millis() / 1000); + graphics::drawCommonFooter(display, x, y); } #endif // HAS_SCREEN diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 6238031f6..76cde3cae 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -118,7 +118,7 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread */ public: - BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") {} + BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") { api_type = TYPE_BLE; } /* Packets from phone (BLE onWrite callback) */ std::mutex fromPhoneMutex; diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp index 79eef8f76..4f7fb4776 100644 --- a/src/platform/nrf52/NRF52Bluetooth.cpp +++ b/src/platform/nrf52/NRF52Bluetooth.cpp @@ -48,6 +48,9 @@ class BluetoothPhoneAPI : public PhoneAPI /// Check the current underlying physical link to see if the client is currently connected virtual bool checkIsConnected() override { return Bluefruit.connected(connectionHandle); } + + public: + BluetoothPhoneAPI() { api_type = TYPE_BLE; } }; static BluetoothPhoneAPI *bluetoothPhoneAPI; From 8fe98db5dd6738546db0d27c6823e3380df322d4 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Sat, 8 Nov 2025 03:59:45 -0800 Subject: [PATCH 109/286] Drop PKI acks if there is no downlink on MQTTClientProxy (#8580) * Discard everything if downlink isn't on * Drop PKI packets when downlink not on --- src/mqtt/MQTT.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 40d03de63..f9f114039 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -66,6 +66,20 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { return; } + + bool anyChannelHasDownlink = false; + size_t numChan = channels.getNumChannels(); + for (size_t i = 0; i < numChan; ++i) { + const auto &c = channels.getByIndex(i); + if (c.settings.downlink_enabled) { + anyChannelHasDownlink = true; + break; + } + } + + if (strcmp(e.channel_id, "PKI") == 0 && !anyChannelHasDownlink) { + return; + } // Generate node ID from nodenum for comparison std::string nodeId = nodeDB->getNodeId(); if (strcmp(e.gateway_id, nodeId.c_str()) == 0) { From b86827967e536d7f7f66b0a037d3a9ee46f725ab Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Sat, 8 Nov 2025 03:59:45 -0800 Subject: [PATCH 110/286] Drop PKI acks if there is no downlink on MQTTClientProxy (#8580) * Discard everything if downlink isn't on * Drop PKI packets when downlink not on --- src/mqtt/MQTT.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 40d03de63..f9f114039 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -66,6 +66,20 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) (strcmp(e.channel_id, channels.getGlobalId(ch.index)) == 0 && ch.settings.downlink_enabled))) { return; } + + bool anyChannelHasDownlink = false; + size_t numChan = channels.getNumChannels(); + for (size_t i = 0; i < numChan; ++i) { + const auto &c = channels.getByIndex(i); + if (c.settings.downlink_enabled) { + anyChannelHasDownlink = true; + break; + } + } + + if (strcmp(e.channel_id, "PKI") == 0 && !anyChannelHasDownlink) { + return; + } // Generate node ID from nodenum for comparison std::string nodeId = nodeDB->getNodeId(); if (strcmp(e.gateway_id, nodeId.c_str()) == 0) { From 50f9be9a2b5d2407b423e6618f4579fc604fa9e0 Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Sat, 8 Nov 2025 20:47:24 +0800 Subject: [PATCH 111/286] Add the Heltec v4 expansion box. (#8539) * Add the Heltec v4 expansion box. * Change heltec-v4-oled to heltec-v4. * Add touchscreen to I2C scanning. * Add reset and busy pins to the ST7789. * Ignore the touch interrupt pin and extend the sleep time to 1 hour. * Remove the default sleep function. --------- Co-authored-by: Ben Meadors --- src/configuration.h | 1 + src/detect/ScanI2C.h | 3 +- src/detect/ScanI2CTwoWire.cpp | 1 + src/graphics/TFTDisplay.cpp | 53 ++++++++++- src/mesh/NodeDB.cpp | 2 +- variants/esp32s3/heltec_v4/pins_arduino.h | 4 +- variants/esp32s3/heltec_v4/platformio.ini | 105 +++++++++++++++++++++- variants/esp32s3/heltec_v4/variant.h | 8 -- 8 files changed, 162 insertions(+), 15 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index 524dacdea..8ec3b2211 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -251,6 +251,7 @@ along with this program. If not, see . // ----------------------------------------------------------------------------- #define FT6336U_ADDR 0x48 #define CST328_ADDR 0x1A +#define CHSC6X_ADDR 0x2E // ----------------------------------------------------------------------------- // RAK12035VB Soil Monitor (using RAK12023 up to 3 RAK12035 monitors can be connected) diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index cca867851..55980face 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -84,7 +84,8 @@ class ScanI2C TSL2561, DRV2605, BH1750, - DA217 + DA217, + CHSC6X } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 66697c109..167728ad3 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -500,6 +500,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address); SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address); SCAN_SIMPLE_CASE(CST328_ADDR, CST328, "CST328", (uint8_t)addr.address); + SCAN_SIMPLE_CASE(CHSC6X_ADDR, CHSC6X, "CHSC6X", (uint8_t)addr.address); case LTR553ALS_ADDR: registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x86), 1); // Part ID register if (registerValue == 0x92) { // LTR553ALS Part ID diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 0663602d9..b662869dd 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -422,7 +422,54 @@ static LGFX *tft = nullptr; #elif defined(ST7789_CS) #include // Graphics and font library for ST7735 driver chip +#ifdef HELTEC_V4_TFT +#include "chsc6x.h" +#include "lgfx/v1/Touch.hpp" +namespace lgfx +{ + inline namespace v1 + { +class TOUCH_CHSC6X : public ITouch +{ +public: + TOUCH_CHSC6X(void) + { + _cfg.i2c_addr = TOUCH_SLAVE_ADDRESS; + _cfg.x_min = 0; + _cfg.x_max = 240; + _cfg.y_min = 0; + _cfg.y_max = 320; + }; + bool init(void) override { + if(chsc6xTouch==nullptr) { + chsc6xTouch=new chsc6x(&Wire1,TOUCH_SDA_PIN,TOUCH_SCL_PIN,TOUCH_INT_PIN,TOUCH_RST_PIN); + } + chsc6xTouch->chsc6x_init(); + return true; + }; + + uint_fast8_t getTouchRaw(touch_point_t* tp, uint_fast8_t count) override { + uint16_t raw_x,raw_y; + if (chsc6xTouch->chsc6x_read_touch_info(&raw_x, &raw_y)==0) { + tp[0].x = 320-1-raw_y; + tp[0].y = 240-1-raw_x ; + tp[0].size = 1; + tp[0].id = 1; + return 1; + } + tp[0].size = 0; + return 0; + }; + + void wakeup(void) override {}; + void sleep(void) override {}; + private: + chsc6x *chsc6xTouch=nullptr; + }; +} +} +#endif class LGFX : public lgfx::LGFX_Device { lgfx::Panel_ST7789 _panel_instance; @@ -431,6 +478,8 @@ class LGFX : public lgfx::LGFX_Device #if HAS_TOUCHSCREEN #if defined(T_WATCH_S3) || defined(ELECROW) lgfx::Touch_FT5x06 _touch_instance; +#elif defined(HELTEC_V4_TFT) + lgfx::TOUCH_CHSC6X _touch_instance; #else lgfx::Touch_GT911 _touch_instance; #endif @@ -465,8 +514,8 @@ class LGFX : public lgfx::LGFX_Device auto cfg = _panel_instance.config(); // Gets a structure for display panel settings. cfg.pin_cs = ST7789_CS; // Pin number where CS is connected (-1 = disable) - cfg.pin_rst = -1; // Pin number where RST is connected (-1 = disable) - cfg.pin_busy = -1; // Pin number where BUSY is connected (-1 = disable) + cfg.pin_rst = ST7789_RESET; // Pin number where RST is connected (-1 = disable) + cfg.pin_busy = ST7789_BUSY; // Pin number where BUSY is connected (-1 = disable) // The following setting values ​​are general initial values ​​for each panel, so please comment out any // unknown items and try them. diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 76915397f..6291fa4cc 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -653,7 +653,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) strncpy(config.network.ntp_server, "meshtastic.pool.ntp.org", 32); #if (defined(T_DECK) || defined(T_WATCH_S3) || defined(UNPHONE) || defined(PICOMPUTER_S3) || defined(SENSECAP_INDICATOR) || \ - defined(ELECROW_PANEL)) && \ + defined(ELECROW_PANEL)||defined(HELTEC_V4_TFT)) && \ HAS_TFT // switch BT off by default; use TFT programming mode or hotkey to enable config.bluetooth.enabled = false; diff --git a/variants/esp32s3/heltec_v4/pins_arduino.h b/variants/esp32s3/heltec_v4/pins_arduino.h index 45561b4b5..d4485016d 100644 --- a/variants/esp32s3/heltec_v4/pins_arduino.h +++ b/variants/esp32s3/heltec_v4/pins_arduino.h @@ -13,8 +13,8 @@ static const uint8_t LED_BUILTIN = 35; static const uint8_t TX = 43; static const uint8_t RX = 44; -static const uint8_t SDA = 3; -static const uint8_t SCL = 4; +static const uint8_t SDA = 4; +static const uint8_t SCL = 3; static const uint8_t SS = 8; static const uint8_t MOSI = 10; diff --git a/variants/esp32s3/heltec_v4/platformio.ini b/variants/esp32s3/heltec_v4/platformio.ini index 7057f9646..4ff7ff253 100644 --- a/variants/esp32s3/heltec_v4/platformio.ini +++ b/variants/esp32s3/heltec_v4/platformio.ini @@ -1,4 +1,4 @@ -[env:heltec-v4] +[heltec_v4_base] extends = esp32s3_base board = heltec_v4 board_check = true @@ -7,3 +7,106 @@ build_flags = ${esp32s3_base.build_flags} -D HELTEC_V4 -I variants/esp32s3/heltec_v4 +lib_deps = + ${esp32s3_base.lib_deps} + + +[env:heltec-v4] +extends = heltec_v4_base +build_flags = + ${heltec_v4_base.build_flags} + -D HELTEC_V4_OLED + -D USE_SSD1306 ; Heltec_v4 has an SSD1315 display (compatible with SSD1306 driver) + -D LED_PIN=35 + -D RESET_OLED=21 + -D I2C_SDA=17 + -D I2C_SCL=18 + -D I2C_SDA1=4 + -D I2C_SCL1=3 +lib_deps = + ${heltec_v4_base.lib_deps} + +[env:heltec-v4-tft] +extends = heltec_v4_base +build_flags = + ${heltec_v4_base.build_flags} ;-Os + -D HELTEC_V4_TFT + -D I2C_SDA=4 + -D I2C_SCL=3 + -D I2C_SDA1=47 + -D I2C_SCL1=48 + -D PIN_BUTTON2=35 + -D PIN_BUZZER=6 + -D USE_PIN_BUZZER=PIN_BUZZER + -D CONFIG_ARDUHAL_LOG_COLORS + -D RADIOLIB_DEBUG_SPI=0 + -D RADIOLIB_DEBUG_PROTOCOL=0 + -D RADIOLIB_DEBUG_BASIC=0 + -D RADIOLIB_VERBOSE_ASSERT=0 + -D RADIOLIB_SPI_PARANOID=0 + -D CONFIG_DISABLE_HAL_LOCKS=1 + -D INPUTDRIVER_BUTTON_TYPE=0 + -D HAS_SCREEN=1 + -D HAS_TFT=1 + -D RAM_SIZE=1560 + -D LV_LVGL_H_INCLUDE_SIMPLE + -D LV_CONF_INCLUDE_SIMPLE + -D LV_COMP_CONF_INCLUDE_SIMPLE + -D LV_USE_SYSMON=0 + -D LV_USE_PROFILER=0 + -D LV_USE_PERF_MONITOR=0 + -D LV_USE_MEM_MONITOR=0 + -D LV_USE_LOG=0 + -D LV_BUILD_TEST=0 + -D USE_LOG_DEBUG + -D LOG_DEBUG_INC=\"DebugConfiguration.h\" + -D USE_PACKET_API + -D LGFX_DRIVER=LGFX_HELTEC_V4_TFT + -D GFX_DRIVER_INC=\"graphics/LGFX/LGFX_HELTEC_V4_TFT.h\" + -D VIEW_320x240 + -D MAP_FULL_REDRAW + -D DISPLAY_SIZE=320x240 ; landscape mode + -D LGFX_PIN_SCK=17 + -D LGFX_PIN_MOSI=33 + -D LGFX_PIN_DC=16 + -D LGFX_PIN_CS=15 + -D LGFX_PIN_BL=21 + -D LGFX_PIN_RST=18 + -D CUSTOM_TOUCH_DRIVER + -D TOUCH_SDA_PIN=I2C_SDA1 + -D TOUCH_SCL_PIN=I2C_SCL1 + -D TOUCH_INT_PIN=-1 ;45 + -D TOUCH_RST_PIN=44 +;base UI + -D TFT_CS=LGFX_PIN_CS + -D ST7789_CS=TFT_CS + -D ST7789_RS=LGFX_PIN_DC + -D ST7789_SDA=LGFX_PIN_MOSI + -D ST7789_SCK=LGFX_PIN_SCK + -D ST7789_RESET=LGFX_PIN_RST + -D ST7789_MISO=-1 + -D ST7789_BUSY=-1 + -D ST7789_BL=LGFX_PIN_BL + -D ST7789_SPI_HOST=SPI3_HOST + -D TFT_BL=ST7789_BL + -D SPI_FREQUENCY=40000000 + -D SPI_READ_FREQUENCY=4000000 + -D TFT_HEIGHT=320 + -D TFT_WIDTH=240 + -D TFT_OFFSET_X=0 + -D TFT_OFFSET_Y=0 + -D TFT_OFFSET_ROTATION=0 + -D SCREEN_ROTATE + -D SCREEN_TRANSITION_FRAMERATE=5 + -D BRIGHTNESS_DEFAULT=130 ; Medium Low Brightness + -D HAS_TOUCHSCREEN=1 + -D TOUCH_I2C_PORT=0 + -D TOUCH_SLAVE_ADDRESS=0x2E + -D SCREEN_TOUCH_INT=TOUCH_INT_PIN + -D SCREEN_TOUCH_RST=TOUCH_RST_PIN + +lib_deps = ${heltec_v4_base.lib_deps} + ; ${device-ui_base.lib_deps} + lovyan03/LovyanGFX@1.2.0 + https://github.com/Quency-D/chsc6x/archive/5cbead829d6b432a8d621ed1aafd4eb474fd4f27.zip + https://github.com/Quency-D/device-ui/archive/7c9870b8016641190b059bdd90fe16c1012a39eb.zip diff --git a/variants/esp32s3/heltec_v4/variant.h b/variants/esp32s3/heltec_v4/variant.h index 1c9516e39..72bbf14fc 100644 --- a/variants/esp32s3/heltec_v4/variant.h +++ b/variants/esp32s3/heltec_v4/variant.h @@ -1,11 +1,3 @@ -#define LED_PIN 35 - -#define USE_SSD1306 // Heltec_v4 has an SSD1315 display (compatible with SSD1306 driver) - -#define RESET_OLED 21 -#define I2C_SDA 17 // I2C pins for this board -#define I2C_SCL 18 - #define VEXT_ENABLE 36 // active low, powers the oled display and the lora antenna boost #define BUTTON_PIN 0 From 602945f66b0c060c1074736c023db1976c0efa25 Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Sat, 8 Nov 2025 20:47:24 +0800 Subject: [PATCH 112/286] Add the Heltec v4 expansion box. (#8539) * Add the Heltec v4 expansion box. * Change heltec-v4-oled to heltec-v4. * Add touchscreen to I2C scanning. * Add reset and busy pins to the ST7789. * Ignore the touch interrupt pin and extend the sleep time to 1 hour. * Remove the default sleep function. --------- Co-authored-by: Ben Meadors --- src/configuration.h | 1 + src/detect/ScanI2C.h | 5 +- src/detect/ScanI2CTwoWire.cpp | 21 ++++- src/graphics/TFTDisplay.cpp | 58 +++++++++++- src/mesh/NodeDB.cpp | 2 +- variants/esp32s3/heltec_v4/pins_arduino.h | 4 +- variants/esp32s3/heltec_v4/platformio.ini | 105 +++++++++++++++++++++- variants/esp32s3/heltec_v4/variant.h | 8 -- 8 files changed, 187 insertions(+), 17 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index baf24a636..75cdac552 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -250,6 +250,7 @@ along with this program. If not, see . // ----------------------------------------------------------------------------- #define FT6336U_ADDR 0x48 #define CST328_ADDR 0x1A +#define CHSC6X_ADDR 0x2E // ----------------------------------------------------------------------------- // RAK12035VB Soil Monitor (using RAK12023 up to 3 RAK12035 monitors can be connected) diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 2e602338c..55980face 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -82,7 +82,10 @@ class ScanI2C BHI260AP, BMM150, TSL2561, - DRV2605 + DRV2605, + BH1750, + DA217, + CHSC6X } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index da2a57fee..5372fbebd 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -485,7 +485,26 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address); SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address); SCAN_SIMPLE_CASE(CST328_ADDR, CST328, "CST328", (uint8_t)addr.address); - SCAN_SIMPLE_CASE(LTR553ALS_ADDR, LTR553ALS, "LTR553ALS", (uint8_t)addr.address); + SCAN_SIMPLE_CASE(CHSC6X_ADDR, CHSC6X, "CHSC6X", (uint8_t)addr.address); + case LTR553ALS_ADDR: + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x86), 1); // Part ID register + if (registerValue == 0x92) { // LTR553ALS Part ID + type = LTR553ALS; + logFoundDevice("LTR553ALS", (uint8_t)addr.address); + } else { + // Test BH1750 - send power on command + i2cBus->beginTransmission(addr.address); + i2cBus->write(0x01); // Power On command + uint8_t bh1750_error = i2cBus->endTransmission(); + if (bh1750_error == 0) { + type = BH1750; + logFoundDevice("BH1750", (uint8_t)addr.address); + } else { + LOG_INFO("Device found at address 0x%x was not able to be enumerated", (uint8_t)addr.address); + } + } + break; + SCAN_SIMPLE_CASE(BHI260AP_ADDR, BHI260AP, "BHI260AP", (uint8_t)addr.address); SCAN_SIMPLE_CASE(SCD4X_ADDR, SCD4X, "SCD4X", (uint8_t)addr.address); SCAN_SIMPLE_CASE(BMM150_ADDR, BMM150, "BMM150", (uint8_t)addr.address); diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 0663602d9..87593b0d4 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -422,7 +422,57 @@ static LGFX *tft = nullptr; #elif defined(ST7789_CS) #include // Graphics and font library for ST7735 driver chip +#ifdef HELTEC_V4_TFT +#include "chsc6x.h" +#include "lgfx/v1/Touch.hpp" +namespace lgfx +{ +inline namespace v1 +{ +class TOUCH_CHSC6X : public ITouch +{ + public: + TOUCH_CHSC6X(void) + { + _cfg.i2c_addr = TOUCH_SLAVE_ADDRESS; + _cfg.x_min = 0; + _cfg.x_max = 240; + _cfg.y_min = 0; + _cfg.y_max = 320; + }; + bool init(void) override + { + if (chsc6xTouch == nullptr) { + chsc6xTouch = new chsc6x(&Wire1, TOUCH_SDA_PIN, TOUCH_SCL_PIN, TOUCH_INT_PIN, TOUCH_RST_PIN); + } + chsc6xTouch->chsc6x_init(); + return true; + }; + + uint_fast8_t getTouchRaw(touch_point_t *tp, uint_fast8_t count) override + { + uint16_t raw_x, raw_y; + if (chsc6xTouch->chsc6x_read_touch_info(&raw_x, &raw_y) == 0) { + tp[0].x = 320 - 1 - raw_y; + tp[0].y = 240 - 1 - raw_x; + tp[0].size = 1; + tp[0].id = 1; + return 1; + } + tp[0].size = 0; + return 0; + }; + + void wakeup(void) override{}; + void sleep(void) override{}; + + private: + chsc6x *chsc6xTouch = nullptr; +}; +} // namespace v1 +} // namespace lgfx +#endif class LGFX : public lgfx::LGFX_Device { lgfx::Panel_ST7789 _panel_instance; @@ -431,6 +481,8 @@ class LGFX : public lgfx::LGFX_Device #if HAS_TOUCHSCREEN #if defined(T_WATCH_S3) || defined(ELECROW) lgfx::Touch_FT5x06 _touch_instance; +#elif defined(HELTEC_V4_TFT) + lgfx::TOUCH_CHSC6X _touch_instance; #else lgfx::Touch_GT911 _touch_instance; #endif @@ -464,9 +516,9 @@ class LGFX : public lgfx::LGFX_Device { // Set the display panel control. auto cfg = _panel_instance.config(); // Gets a structure for display panel settings. - cfg.pin_cs = ST7789_CS; // Pin number where CS is connected (-1 = disable) - cfg.pin_rst = -1; // Pin number where RST is connected (-1 = disable) - cfg.pin_busy = -1; // Pin number where BUSY is connected (-1 = disable) + cfg.pin_cs = ST7789_CS; // Pin number where CS is connected (-1 = disable) + cfg.pin_rst = ST7789_RESET; // Pin number where RST is connected (-1 = disable) + cfg.pin_busy = ST7789_BUSY; // Pin number where BUSY is connected (-1 = disable) // The following setting values ​​are general initial values ​​for each panel, so please comment out any // unknown items and try them. diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index bda6f4ea4..d047bf163 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -653,7 +653,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) strncpy(config.network.ntp_server, "meshtastic.pool.ntp.org", 32); #if (defined(T_DECK) || defined(T_WATCH_S3) || defined(UNPHONE) || defined(PICOMPUTER_S3) || defined(SENSECAP_INDICATOR) || \ - defined(ELECROW_PANEL)) && \ + defined(ELECROW_PANEL) || defined(HELTEC_V4_TFT)) && \ HAS_TFT // switch BT off by default; use TFT programming mode or hotkey to enable config.bluetooth.enabled = false; diff --git a/variants/esp32s3/heltec_v4/pins_arduino.h b/variants/esp32s3/heltec_v4/pins_arduino.h index 45561b4b5..d4485016d 100644 --- a/variants/esp32s3/heltec_v4/pins_arduino.h +++ b/variants/esp32s3/heltec_v4/pins_arduino.h @@ -13,8 +13,8 @@ static const uint8_t LED_BUILTIN = 35; static const uint8_t TX = 43; static const uint8_t RX = 44; -static const uint8_t SDA = 3; -static const uint8_t SCL = 4; +static const uint8_t SDA = 4; +static const uint8_t SCL = 3; static const uint8_t SS = 8; static const uint8_t MOSI = 10; diff --git a/variants/esp32s3/heltec_v4/platformio.ini b/variants/esp32s3/heltec_v4/platformio.ini index 7057f9646..4ff7ff253 100644 --- a/variants/esp32s3/heltec_v4/platformio.ini +++ b/variants/esp32s3/heltec_v4/platformio.ini @@ -1,4 +1,4 @@ -[env:heltec-v4] +[heltec_v4_base] extends = esp32s3_base board = heltec_v4 board_check = true @@ -7,3 +7,106 @@ build_flags = ${esp32s3_base.build_flags} -D HELTEC_V4 -I variants/esp32s3/heltec_v4 +lib_deps = + ${esp32s3_base.lib_deps} + + +[env:heltec-v4] +extends = heltec_v4_base +build_flags = + ${heltec_v4_base.build_flags} + -D HELTEC_V4_OLED + -D USE_SSD1306 ; Heltec_v4 has an SSD1315 display (compatible with SSD1306 driver) + -D LED_PIN=35 + -D RESET_OLED=21 + -D I2C_SDA=17 + -D I2C_SCL=18 + -D I2C_SDA1=4 + -D I2C_SCL1=3 +lib_deps = + ${heltec_v4_base.lib_deps} + +[env:heltec-v4-tft] +extends = heltec_v4_base +build_flags = + ${heltec_v4_base.build_flags} ;-Os + -D HELTEC_V4_TFT + -D I2C_SDA=4 + -D I2C_SCL=3 + -D I2C_SDA1=47 + -D I2C_SCL1=48 + -D PIN_BUTTON2=35 + -D PIN_BUZZER=6 + -D USE_PIN_BUZZER=PIN_BUZZER + -D CONFIG_ARDUHAL_LOG_COLORS + -D RADIOLIB_DEBUG_SPI=0 + -D RADIOLIB_DEBUG_PROTOCOL=0 + -D RADIOLIB_DEBUG_BASIC=0 + -D RADIOLIB_VERBOSE_ASSERT=0 + -D RADIOLIB_SPI_PARANOID=0 + -D CONFIG_DISABLE_HAL_LOCKS=1 + -D INPUTDRIVER_BUTTON_TYPE=0 + -D HAS_SCREEN=1 + -D HAS_TFT=1 + -D RAM_SIZE=1560 + -D LV_LVGL_H_INCLUDE_SIMPLE + -D LV_CONF_INCLUDE_SIMPLE + -D LV_COMP_CONF_INCLUDE_SIMPLE + -D LV_USE_SYSMON=0 + -D LV_USE_PROFILER=0 + -D LV_USE_PERF_MONITOR=0 + -D LV_USE_MEM_MONITOR=0 + -D LV_USE_LOG=0 + -D LV_BUILD_TEST=0 + -D USE_LOG_DEBUG + -D LOG_DEBUG_INC=\"DebugConfiguration.h\" + -D USE_PACKET_API + -D LGFX_DRIVER=LGFX_HELTEC_V4_TFT + -D GFX_DRIVER_INC=\"graphics/LGFX/LGFX_HELTEC_V4_TFT.h\" + -D VIEW_320x240 + -D MAP_FULL_REDRAW + -D DISPLAY_SIZE=320x240 ; landscape mode + -D LGFX_PIN_SCK=17 + -D LGFX_PIN_MOSI=33 + -D LGFX_PIN_DC=16 + -D LGFX_PIN_CS=15 + -D LGFX_PIN_BL=21 + -D LGFX_PIN_RST=18 + -D CUSTOM_TOUCH_DRIVER + -D TOUCH_SDA_PIN=I2C_SDA1 + -D TOUCH_SCL_PIN=I2C_SCL1 + -D TOUCH_INT_PIN=-1 ;45 + -D TOUCH_RST_PIN=44 +;base UI + -D TFT_CS=LGFX_PIN_CS + -D ST7789_CS=TFT_CS + -D ST7789_RS=LGFX_PIN_DC + -D ST7789_SDA=LGFX_PIN_MOSI + -D ST7789_SCK=LGFX_PIN_SCK + -D ST7789_RESET=LGFX_PIN_RST + -D ST7789_MISO=-1 + -D ST7789_BUSY=-1 + -D ST7789_BL=LGFX_PIN_BL + -D ST7789_SPI_HOST=SPI3_HOST + -D TFT_BL=ST7789_BL + -D SPI_FREQUENCY=40000000 + -D SPI_READ_FREQUENCY=4000000 + -D TFT_HEIGHT=320 + -D TFT_WIDTH=240 + -D TFT_OFFSET_X=0 + -D TFT_OFFSET_Y=0 + -D TFT_OFFSET_ROTATION=0 + -D SCREEN_ROTATE + -D SCREEN_TRANSITION_FRAMERATE=5 + -D BRIGHTNESS_DEFAULT=130 ; Medium Low Brightness + -D HAS_TOUCHSCREEN=1 + -D TOUCH_I2C_PORT=0 + -D TOUCH_SLAVE_ADDRESS=0x2E + -D SCREEN_TOUCH_INT=TOUCH_INT_PIN + -D SCREEN_TOUCH_RST=TOUCH_RST_PIN + +lib_deps = ${heltec_v4_base.lib_deps} + ; ${device-ui_base.lib_deps} + lovyan03/LovyanGFX@1.2.0 + https://github.com/Quency-D/chsc6x/archive/5cbead829d6b432a8d621ed1aafd4eb474fd4f27.zip + https://github.com/Quency-D/device-ui/archive/7c9870b8016641190b059bdd90fe16c1012a39eb.zip diff --git a/variants/esp32s3/heltec_v4/variant.h b/variants/esp32s3/heltec_v4/variant.h index 1c9516e39..72bbf14fc 100644 --- a/variants/esp32s3/heltec_v4/variant.h +++ b/variants/esp32s3/heltec_v4/variant.h @@ -1,11 +1,3 @@ -#define LED_PIN 35 - -#define USE_SSD1306 // Heltec_v4 has an SSD1315 display (compatible with SSD1306 driver) - -#define RESET_OLED 21 -#define I2C_SDA 17 // I2C pins for this board -#define I2C_SCL 18 - #define VEXT_ENABLE 36 // active low, powers the oled display and the lora antenna boost #define BUTTON_PIN 0 From 1c0c6b2736b9afb392a2986855456dff20dee4d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:14:08 -0600 Subject: [PATCH 113/286] Automated version bumps (#8527) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 6fc5e8597..61ecf9fb5 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.13 diff --git a/debian/changelog b/debian/changelog index e124f8929..a387cc3c5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.14.0) unstable; urgency=medium + + * Version 2.7.14 + + -- GitHub Actions Mon, 03 Nov 2025 16:11:31 +0000 + meshtasticd (2.7.13.0) unstable; urgency=medium * Version 2.7.13 diff --git a/version.properties b/version.properties index f33f0f1cb..fe1a5b31b 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 13 +build = 14 From 36c217857038f69d6a178419d91b5867e270aea6 Mon Sep 17 00:00:00 2001 From: Tom <116762865+NomDeTom@users.noreply.github.com> Date: Sun, 9 Nov 2025 15:24:03 +0000 Subject: [PATCH 114/286] Update to Pro-micro variants (#8600) * Update to Pro-micro variants Schematic updated Xtal variant removed Extra module added to list Extra explanation added to readme. * Fix markdown formatting in readme.md * Fix formatting in readme.md for RF switch section --------- Co-authored-by: Tom <116762865+Nestpebble@users.noreply.github.com> --- ...Schematic_Pro-Micro_Pinouts 2024-12-14.pdf | 9836 ----- .../Schematic_Pro-Micro_Pinouts.pdf | 33346 ++++++++++++++++ .../diy/nrf52_promicro_diy_tcxo/readme.md | 15 +- .../diy/nrf52_promicro_diy_tcxo/variant.h | 1 + .../nrf52_promicro_diy_xtal/platformio.ini | 12 - .../diy/nrf52_promicro_diy_xtal/variant.cpp | 38 - .../diy/nrf52_promicro_diy_xtal/variant.h | 154 - 7 files changed, 33360 insertions(+), 10042 deletions(-) delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf create mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf deleted file mode 100644 index de87af141..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf +++ /dev/null @@ -1,9836 +0,0 @@ -%PDF-1.4 -%ºß¬à -3 0 obj -<> -endobj -4 0 obj -<< -/Length 102720 ->> -stream -0.20 w -0 G -2 J -0 j -100 M -1.00 g -[] 0 d -0.00 826.80 1169.00 -826.80 re -f -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -216.000 806.000 m -216.000 816.000 l -216.000 20.000 m -216.000 10.000 l -412.000 806.000 m -412.000 816.000 l -412.000 20.000 m -412.000 10.000 l -608.000 806.000 m -608.000 816.000 l -608.000 20.000 m -608.000 10.000 l -804.000 806.000 m -804.000 816.000 l -804.000 20.000 m -804.000 10.000 l -1000.000 806.000 m -1000.000 816.000 l -1000.000 20.000 m -1000.000 10.000 l -20.000 610.000 m -10.000 610.000 l -1149.000 610.000 m -1159.000 610.000 l -20.000 414.000 m -10.000 414.000 l -1149.000 414.000 m -1159.000 414.000 l -20.000 218.000 m -10.000 218.000 l -1149.000 218.000 m -1159.000 218.000 l -20.000 22.000 m -10.000 22.000 l -1149.000 22.000 m -1159.000 22.000 l -S -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 708.00 Td -(A) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 708.00 Td -(A) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 512.00 Td -(B) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 512.00 Td -(B) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 316.00 Td -(C) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 316.00 Td -(C) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 120.00 Td -(D) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 120.00 Td -(D) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -118.00 807.50 Td -(1) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -118.00 11.50 Td -(1) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -314.00 807.50 Td -(2) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -314.00 11.50 Td -(2) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -510.00 807.50 Td -(3) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -510.00 11.50 Td -(3) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -706.00 807.50 Td -(4) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -706.00 11.50 Td -(4) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -902.00 807.50 Td -(5) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -902.00 11.50 Td -(5) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -20.00 806.00 1129.00 -786.00 re -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -10.00 816.00 1149.00 -806.00 re -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -705.00 100.00 444.00 -80.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -705.100 60.750 m -1148.630 60.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -809.630 40.750 m -1148.630 40.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -1069.610 99.930 m -1069.630 60.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -1069.630 60.750 m -1069.630 40.750 l -S -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -710.00 87.00 Td -(TITLE:) Tj -ET -10.00 w -BT -/F1 13 Tf -13.00 TL -0.000 0.000 1.000 rg -767.62 74.41 Td -(Pro-Micro Pinouts) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -1074.62 73.75 Td -(REV:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -1112.62 73.75 Td -(1.0) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -814.62 25.00 Td -(Date:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -861.62 24.52 Td -(2024-12-17) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -1073.62 45.00 Td -(Sheet:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -1118.62 44.52 Td -(1/1) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -953.62 24.75 Td -(Drawn By:) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -814.62 46.75 Td -(Company:) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -809.630 60.750 m -809.630 20.750 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 684.000 m -549.000 676.000 l -549.000 684.000 m -541.000 676.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -665.000 680.000 m -635.000 680.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -986.000 649.000 m -994.000 641.000 l -994.000 649.000 m -986.000 641.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 614.000 m -549.000 606.000 l -549.000 614.000 m -541.000 606.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 624.000 m -549.000 616.000 l -549.000 624.000 m -541.000 616.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 644.000 m -549.000 636.000 l -549.000 644.000 m -541.000 636.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -631.000 634.000 m -639.000 626.000 l -639.000 634.000 m -631.000 626.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 804.82 611.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 615.000 m -840.000 615.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 610.000 m -830.000 620.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 797.50 621.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 625.000 m -840.000 625.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 634.000 m -830.000 616.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -828.000 631.000 m -828.000 619.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -826.000 628.000 m -826.000 622.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -824.000 626.000 m -824.000 624.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1006.50 651.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1000.000 655.000 m -990.000 655.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1000.000 646.000 m -1000.000 664.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1002.000 649.000 m -1002.000 661.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1004.000 652.000 m -1004.000 658.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1006.000 654.000 m -1006.000 656.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 1011.94 671.15 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -990.000 675.000 m -995.000 680.000 l -1010.000 680.000 l -1010.000 670.000 l -995.000 670.000 l -990.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 797.25 651.75 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 655.000 m -835.000 650.000 l -820.000 650.000 l -820.000 660.000 l -835.000 660.000 l -840.000 655.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 804.69 631.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 635.000 m -835.000 630.000 l -820.000 630.000 l -820.000 640.000 l -835.000 640.000 l -840.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 791.48 661.75 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 665.000 m -835.000 660.000 l -820.000 660.000 l -820.000 670.000 l -835.000 670.000 l -840.000 665.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 791.41 671.75 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 675.000 m -835.000 670.000 l -820.000 670.000 l -820.000 680.000 l -835.000 680.000 l -840.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 790.06 641.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 645.000 m -835.000 640.000 l -820.000 640.000 l -820.000 650.000 l -835.000 650.000 l -840.000 645.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 1011.92 661.15 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -990.000 665.000 m -995.000 670.000 l -1010.000 670.000 l -1010.000 660.000 l -995.000 660.000 l -990.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -908.96 708.00 Td -(Seeed-wio-SX1262) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -908.96 717.00 Td -(SEEED_WIO-SX1262) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 682.00 Td -(RF_SW) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 686.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 685.000 m -860.000 685.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 672.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 676.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 675.000 m -860.000 675.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 662.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 666.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 665.000 m -860.000 665.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 652.00 Td -(CLK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 656.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 655.000 m -860.000 655.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 642.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 646.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 645.000 m -860.000 645.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 632.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 636.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 635.000 m -860.000 635.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 622.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 626.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 625.000 m -860.000 625.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 612.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 616.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 615.000 m -860.000 615.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -949.58 642.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 646.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 645.000 m -970.000 645.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -947.36 652.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 656.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 655.000 m -970.000 655.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -943.57 662.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 666.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 665.000 m -970.000 665.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -944.49 672.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 676.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 675.000 m -970.000 675.000 l -S -2 J -0 j -100 M -1.00 w -0.00 G -[] 0 d -860.00 705.00 110.00 -110.00 re -S -1.00 w -0.00 G -[] 0 d -965.00 615.00 m 965.00 623.28 958.28 630.00 950.00 630.00 c -941.72 630.00 935.00 623.28 935.00 615.00 c -935.00 606.72 941.72 600.00 950.00 600.00 c -958.28 600.00 965.00 606.72 965.00 615.00 c -S -2 J -0 j -100 M -1.00 w -0.00 G -[] 0 d -930.00 635.00 40.00 -40.00 re -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -535.000 660.000 m -545.000 660.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 499.82 655.93 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 660.000 m -535.000 660.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 655.000 m -525.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -520.000 670.000 m -545.000 670.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 652.00 699.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -665.000 690.000 m -665.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -674.000 690.000 m -656.000 690.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -671.000 692.000 m -659.000 692.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -668.000 694.000 m -662.000 694.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -666.000 696.000 m -664.000 696.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 507.00 689.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -520.000 680.000 m -520.000 670.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -529.000 680.000 m -511.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -526.000 682.000 m -514.000 682.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -523.000 684.000 m -517.000 684.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -521.000 686.000 m -519.000 686.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 622.00 582.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -635.000 600.000 m -635.000 610.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -626.000 600.000 m -644.000 600.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -629.000 598.000 m -641.000 598.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -632.000 596.000 m -638.000 596.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -634.000 594.000 m -636.000 594.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.92 616.15 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 620.000 m -640.000 625.000 l -655.000 625.000 l -655.000 615.000 l -640.000 615.000 l -635.000 620.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.55 636.15 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 640.000 m -640.000 645.000 l -655.000 645.000 l -655.000 635.000 l -640.000 635.000 l -635.000 640.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.92 646.15 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 650.000 m -640.000 655.000 l -655.000 655.000 l -655.000 645.000 l -640.000 645.000 l -635.000 650.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.85 656.15 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 660.000 m -640.000 665.000 l -655.000 665.000 l -655.000 655.000 l -640.000 655.000 l -635.000 660.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 657.00 666.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 670.000 m -640.000 675.000 l -655.000 675.000 l -655.000 665.000 l -640.000 665.000 l -635.000 670.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 504.19 626.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -545.000 630.000 m -540.000 625.000 l -525.000 625.000 l -525.000 635.000 l -540.000 635.000 l -545.000 630.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 495.06 646.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -545.000 650.000 m -540.000 645.000 l -525.000 645.000 l -525.000 655.000 l -540.000 655.000 l -545.000 650.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -584.95 693.33 Td -(RA-01SH) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -584.95 702.33 Td -(HT-RA62) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -557.000 690.000 m -623.000 690.000 l -624.105 690.000 625.000 689.105 625.000 688.000 c -625.000 602.000 l -625.000 600.895 623.895 600.000 623.000 600.000 c -557.000 600.000 l -555.895 600.000 555.000 601.105 555.000 602.000 c -555.000 688.000 l -555.000 689.105 556.105 690.000 557.000 690.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -561.50 685.00 m 561.50 685.83 560.83 686.50 560.00 686.50 c -559.17 686.50 558.50 685.83 558.50 685.00 c -558.50 684.17 559.17 683.50 560.00 683.50 c -560.83 683.50 561.50 684.17 561.50 685.00 c -B -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 676.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 681.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 680.000 m -555.000 680.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -558.70 666.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -548.78 671.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -545.000 670.000 m -555.000 670.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 656.00 Td -(3.3V) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 661.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 660.000 m -555.000 660.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 646.00 Td -(RESET) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 651.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 650.000 m -555.000 650.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 636.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 641.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 640.000 m -555.000 640.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 626.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 631.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 630.000 m -555.000 630.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 616.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 621.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 620.000 m -555.000 620.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 606.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 611.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 610.000 m -555.000 610.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -600.66 606.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -625.50 611.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -635.000 610.000 m -625.000 610.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.87 616.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 621.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 620.000 m -625.000 620.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.46 626.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 631.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 630.000 m -625.000 630.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -602.64 636.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 641.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 640.000 m -625.000 640.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.71 646.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 651.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 650.000 m -625.000 650.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.71 656.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 661.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 660.000 m -625.000 660.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -602.27 666.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 671.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 670.000 m -625.000 670.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -600.66 676.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -625.50 681.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -635.000 680.000 m -625.000 680.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -153.95 479.05 Td -(AMC-U_FL) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -153.95 488.16 Td -(U6) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -165.00 465.00 20.00 -20.00 re -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 174.00 434.29 Tm -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -175.000 425.000 m -175.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -159.28 456.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -155.000 455.000 m -165.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -185.00 456.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -195.000 455.000 m -185.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 174.00 465.00 Tm -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -175.000 475.000 m -175.000 465.000 l -S -1.00 w -0.53 0.00 0.00 RG -[] 0 d -177.00 455.00 m 177.00 456.10 176.10 457.00 175.00 457.00 c -173.90 457.00 173.00 456.10 173.00 455.00 c -173.00 453.90 173.90 453.00 175.00 453.00 c -176.10 453.00 177.00 453.90 177.00 455.00 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -175.000 453.000 m -175.000 445.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -506.000 394.000 m -514.000 386.000 l -514.000 394.000 m -506.000 386.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -646.000 394.000 m -654.000 386.000 l -654.000 394.000 m -646.000 386.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 666.50 415.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 420.000 m -650.000 420.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 411.000 m -660.000 429.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -662.000 414.000 m -662.000 426.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -664.000 417.000 m -664.000 423.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -666.000 419.000 m -666.000 421.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -650.000 430.000 m -650.000 400.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -796.000 389.000 m -804.000 381.000 l -804.000 389.000 m -796.000 381.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -573.96 503.33 Td -(E22-900M22S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -573.96 512.33 Td -(E22-900M22S) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 377.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 381.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 380.000 m -530.000 380.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 387.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 391.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 390.000 m -530.000 390.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 397.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 401.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 400.000 m -530.000 400.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 417.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 421.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 420.000 m -530.000 420.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 427.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 431.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 430.000 m -530.000 430.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 437.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 441.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 440.000 m -530.000 440.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 447.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 451.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 450.000 m -530.000 450.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 457.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 461.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 460.000 m -530.000 460.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 467.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 471.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 470.000 m -530.000 470.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 477.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 481.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 480.000 m -530.000 480.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 487.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 491.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 490.000 m -530.000 490.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 487.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 491.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 490.000 m -630.000 490.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 477.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 481.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 480.000 m -630.000 480.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -609.29 467.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 471.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 470.000 m -630.000 470.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -604.49 457.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 461.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 460.000 m -630.000 460.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -603.87 447.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 451.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 450.000 m -630.000 450.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -603.16 437.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 441.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 440.000 m -630.000 440.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 427.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 431.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 430.000 m -630.000 430.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 417.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 421.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 420.000 m -630.000 420.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 397.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 401.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 400.000 m -630.000 400.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 387.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 391.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 390.000 m -630.000 390.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 377.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 381.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 380.000 m -630.000 380.000 l -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -532.000 500.000 m -628.000 500.000 l -629.105 500.000 630.000 499.105 630.000 498.000 c -630.000 362.000 l -630.000 360.895 628.895 360.000 628.000 360.000 c -532.000 360.000 l -530.895 360.000 530.000 361.105 530.000 362.000 c -530.000 498.000 l -530.000 499.105 531.105 500.000 532.000 500.000 c -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -863.96 498.33 Td -(E22-900M30S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -863.96 507.33 Td -(E22-900M30S) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -822.000 495.000 m -918.000 495.000 l -919.105 495.000 920.000 494.105 920.000 493.000 c -920.000 357.000 l -920.000 355.895 918.895 355.000 918.000 355.000 c -822.000 355.000 l -820.895 355.000 820.000 356.105 820.000 357.000 c -820.000 493.000 l -820.000 494.105 821.105 495.000 822.000 495.000 c -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 372.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 376.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 375.000 m -920.000 375.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 382.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 386.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 385.000 m -920.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 392.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 396.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 395.000 m -920.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 412.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 416.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 415.000 m -920.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 422.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 426.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 425.000 m -920.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -893.16 432.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 436.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 435.000 m -920.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -893.87 442.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 446.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 445.000 m -920.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -894.49 452.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 456.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 455.000 m -920.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -899.29 462.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 466.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 465.000 m -920.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -899.29 472.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 476.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 475.000 m -920.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 482.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 486.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 485.000 m -920.000 485.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 482.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 486.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 485.000 m -820.000 485.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 472.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 476.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 475.000 m -820.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 462.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 466.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 465.000 m -820.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 452.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 456.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 455.000 m -820.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 442.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 446.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 445.000 m -820.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 432.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 436.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 435.000 m -820.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 422.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 426.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 425.000 m -820.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 412.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 416.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 415.000 m -820.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 392.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 396.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 395.000 m -820.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 382.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 386.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 385.000 m -820.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 372.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 376.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 375.000 m -820.000 375.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -293.99 488.33 Td -(E22-400MM22S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -293.99 497.33 Td -(E22-900MM22S) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -267.000 485.000 m -333.000 485.000 l -334.105 485.000 335.000 484.105 335.000 483.000 c -335.000 377.000 l -335.000 375.895 333.895 375.000 333.000 375.000 c -267.000 375.000 l -265.895 375.000 265.000 376.105 265.000 377.000 c -265.000 483.000 l -265.000 484.105 266.105 485.000 267.000 485.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -271.50 480.00 m 271.50 480.83 270.83 481.50 270.00 481.50 c -269.17 481.50 268.50 480.83 268.50 480.00 c -268.50 479.17 269.17 478.50 270.00 478.50 c -270.83 478.50 271.50 479.17 271.50 480.00 c -B -BT -/F1 9 Tf -9.00 TL -1.000 0.000 0.000 rg -268.70 471.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -1.000 0.000 0.000 rg -258.79 476.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -1.00 0.00 0.00 RG -[] 0 d -255.000 475.000 m -265.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -268.70 461.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -258.79 466.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -255.000 465.000 m -265.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 451.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 456.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 455.000 m -265.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 441.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 446.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 445.000 m -265.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 431.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 436.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 435.000 m -265.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 421.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 426.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 425.000 m -265.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -268.70 411.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -258.79 416.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -255.000 415.000 m -265.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 401.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 406.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 405.000 m -265.000 405.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 391.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 396.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 395.000 m -265.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 381.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -253.07 386.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 385.000 m -265.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.87 381.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 386.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 385.000 m -335.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.71 391.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 396.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 395.000 m -335.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.71 401.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 406.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 405.000 m -335.000 405.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -312.27 411.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 416.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 415.000 m -335.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -312.64 421.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 426.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 425.000 m -335.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -310.66 431.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -335.50 436.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -345.000 435.000 m -335.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -318.29 441.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 446.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 445.000 m -335.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 451.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 456.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 455.000 m -335.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 461.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 466.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 465.000 m -335.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 471.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 476.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 475.000 m -335.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 366.70 381.60 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 385.000 m -350.000 390.000 l -365.000 390.000 l -365.000 380.000 l -350.000 380.000 l -345.000 385.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 203.19 381.40 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 385.000 m -250.000 380.000 l -235.000 380.000 l -235.000 390.000 l -250.000 390.000 l -255.000 385.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 366.71 421.60 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 425.000 m -350.000 430.000 l -365.000 430.000 l -365.000 420.000 l -350.000 420.000 l -345.000 425.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 391.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 395.000 m -350.000 400.000 l -365.000 400.000 l -365.000 390.000 l -350.000 390.000 l -345.000 395.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 401.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 405.000 m -350.000 410.000 l -365.000 410.000 l -365.000 400.000 l -350.000 400.000 l -345.000 405.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 411.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 415.000 m -350.000 420.000 l -365.000 420.000 l -365.000 410.000 l -350.000 410.000 l -345.000 415.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.01 461.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 465.000 m -350.000 470.000 l -365.000 470.000 l -365.000 460.000 l -350.000 460.000 l -345.000 465.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 471.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 475.000 m -350.000 480.000 l -365.000 480.000 l -365.000 470.000 l -350.000 470.000 l -345.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 203.74 391.40 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 395.000 m -250.000 390.000 l -235.000 390.000 l -235.000 400.000 l -250.000 400.000 l -255.000 395.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 205.06 451.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 455.000 m -250.000 450.000 l -235.000 450.000 l -235.000 460.000 l -250.000 460.000 l -255.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.01 451.15 Tm -(DIO3) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 455.000 m -350.000 460.000 l -365.000 460.000 l -365.000 450.000 l -350.000 450.000 l -345.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.06 456.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 460.000 m -505.000 455.000 l -490.000 455.000 l -490.000 465.000 l -505.000 465.000 l -510.000 460.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 671.71 446.60 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 450.000 m -655.000 455.000 l -670.000 455.000 l -670.000 445.000 l -655.000 445.000 l -650.000 450.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 469.19 476.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 480.000 m -505.000 475.000 l -490.000 475.000 l -490.000 485.000 l -505.000 485.000 l -510.000 480.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 672.01 456.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 460.000 m -655.000 465.000 l -670.000 465.000 l -670.000 455.000 l -655.000 455.000 l -650.000 460.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.69 416.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 420.000 m -505.000 415.000 l -490.000 415.000 l -490.000 425.000 l -505.000 425.000 l -510.000 420.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.61 436.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 440.000 m -505.000 435.000 l -490.000 435.000 l -490.000 445.000 l -505.000 445.000 l -510.000 440.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.61 446.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 450.000 m -505.000 445.000 l -490.000 445.000 l -490.000 455.000 l -505.000 455.000 l -510.000 450.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 466.77 426.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 430.000 m -505.000 425.000 l -490.000 425.000 l -490.000 435.000 l -505.000 435.000 l -510.000 430.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 671.71 436.60 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 440.000 m -655.000 445.000 l -670.000 445.000 l -670.000 435.000 l -655.000 435.000 l -650.000 440.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 458.85 466.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 470.000 m -505.000 465.000 l -490.000 465.000 l -490.000 475.000 l -505.000 475.000 l -510.000 470.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 395.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 400.000 m -510.000 400.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 409.000 m -500.000 391.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 406.000 m -498.000 394.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 403.000 m -496.000 397.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 401.000 m -494.000 399.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 375.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 380.000 m -510.000 380.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 389.000 m -500.000 371.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 386.000 m -498.000 374.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 383.000 m -496.000 377.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 381.000 m -494.000 379.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 637.00 352.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -650.000 370.000 m -650.000 380.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -641.000 370.000 m -659.000 370.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -644.000 368.000 m -656.000 368.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -647.000 366.000 m -653.000 366.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -649.000 364.000 m -651.000 364.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 637.00 509.13 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -650.000 500.000 m -650.000 490.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -659.000 500.000 m -641.000 500.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -656.000 502.000 m -644.000 502.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -653.000 504.000 m -647.000 504.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -651.000 506.000 m -649.000 506.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 485.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 490.000 m -510.000 490.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 499.000 m -500.000 481.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 496.000 m -498.000 484.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 493.000 m -496.000 487.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 491.000 m -494.000 489.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 361.50 430.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 435.000 m -345.000 435.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 426.000 m -355.000 444.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -357.000 429.000 m -357.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -359.000 432.000 m -359.000 438.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -361.000 434.000 m -361.000 436.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 212.50 410.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 415.000 m -255.000 415.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 424.000 m -245.000 406.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -243.000 421.000 m -243.000 409.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -241.000 418.000 m -241.000 412.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -239.000 416.000 m -239.000 414.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 212.50 460.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 465.000 m -255.000 465.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 474.000 m -245.000 456.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -243.000 471.000 m -243.000 459.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -241.000 468.000 m -241.000 462.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -239.000 466.000 m -239.000 464.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -940.000 370.000 m -940.000 425.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 480.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 485.000 m -800.000 485.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 494.000 m -790.000 476.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 491.000 m -788.000 479.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 488.000 m -786.000 482.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 486.000 m -784.000 484.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 927.00 504.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -940.000 495.000 m -940.000 485.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -949.000 495.000 m -931.000 495.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -946.000 497.000 m -934.000 497.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -943.000 499.000 m -937.000 499.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -941.000 501.000 m -939.000 501.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 370.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 375.000 m -800.000 375.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 384.000 m -790.000 366.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 381.000 m -788.000 369.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 378.000 m -786.000 372.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 376.000 m -784.000 374.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 390.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 395.000 m -800.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 404.000 m -790.000 386.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 401.000 m -788.000 389.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 398.000 m -786.000 392.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 396.000 m -784.000 394.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 748.85 461.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 465.000 m -795.000 460.000 l -780.000 460.000 l -780.000 470.000 l -795.000 470.000 l -800.000 465.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 961.71 431.60 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 435.000 m -945.000 440.000 l -960.000 440.000 l -960.000 430.000 l -945.000 430.000 l -940.000 435.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 756.77 421.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 425.000 m -795.000 420.000 l -780.000 420.000 l -780.000 430.000 l -795.000 430.000 l -800.000 425.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.61 441.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 445.000 m -795.000 440.000 l -780.000 440.000 l -780.000 450.000 l -795.000 450.000 l -800.000 445.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.61 431.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 435.000 m -795.000 430.000 l -780.000 430.000 l -780.000 440.000 l -795.000 440.000 l -800.000 435.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 764.69 411.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 415.000 m -795.000 410.000 l -780.000 410.000 l -780.000 420.000 l -795.000 420.000 l -800.000 415.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 962.01 451.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 455.000 m -945.000 460.000 l -960.000 460.000 l -960.000 450.000 l -945.000 450.000 l -940.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 759.19 471.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 475.000 m -795.000 470.000 l -780.000 470.000 l -780.000 480.000 l -795.000 480.000 l -800.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 961.71 441.60 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 445.000 m -945.000 450.000 l -960.000 450.000 l -960.000 440.000 l -945.000 440.000 l -940.000 445.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.06 451.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 455.000 m -795.000 450.000 l -780.000 450.000 l -780.000 460.000 l -795.000 460.000 l -800.000 455.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 927.00 342.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -940.000 360.000 m -940.000 370.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 360.000 m -949.000 360.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -934.000 358.000 m -946.000 358.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -937.000 356.000 m -943.000 356.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -939.000 354.000 m -941.000 354.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 243.00 487.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -255.000 485.000 m -255.000 475.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -250.000 485.000 m -260.000 485.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 660.50 465.93 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 470.000 m -650.000 470.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 475.000 m -660.000 465.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -175.000 425.000 m -210.000 425.000 l -255.000 425.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 142.00 429.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -155.000 445.000 m -155.000 455.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -146.000 445.000 m -164.000 445.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -149.000 443.000 m -161.000 443.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -152.000 441.000 m -158.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -154.000 439.000 m -156.000 439.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 182.00 428.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -195.000 445.000 m -195.000 455.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -186.000 445.000 m -204.000 445.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -189.000 443.000 m -201.000 443.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -192.000 441.000 m -198.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -194.000 439.000 m -196.000 439.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 950.50 460.92 Tm -(+5V) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -950.000 465.000 m -940.000 465.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -950.000 470.000 m -950.000 460.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -650.000 490.000 m -650.000 480.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -940.000 465.000 m -940.000 475.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -231.000 294.000 m -239.000 286.000 l -239.000 294.000 m -231.000 286.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 244.000 m -379.000 236.000 l -379.000 244.000 m -371.000 236.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 284.000 m -379.000 276.000 l -379.000 284.000 m -371.000 276.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 274.000 m -379.000 266.000 l -379.000 274.000 m -371.000 266.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -231.000 204.000 m -239.000 196.000 l -239.000 204.000 m -231.000 196.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 204.000 m -379.000 196.000 l -379.000 204.000 m -371.000 196.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 397.71 246.28 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -375.000 250.000 m -380.000 255.000 l -395.000 255.000 l -395.000 245.000 l -380.000 245.000 l -375.000 250.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 397.00 256.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -375.000 260.000 m -380.000 265.000 l -395.000 265.000 l -395.000 255.000 l -380.000 255.000 l -375.000 260.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 183.85 236.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 240.000 m -230.000 235.000 l -215.000 235.000 l -215.000 245.000 l -230.000 245.000 l -235.000 240.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 199.69 246.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 250.000 m -230.000 245.000 l -215.000 245.000 l -215.000 255.000 l -230.000 255.000 l -235.000 250.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 185.61 266.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 270.000 m -230.000 265.000 l -215.000 265.000 l -215.000 275.000 l -230.000 275.000 l -235.000 270.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 191.77 256.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 260.000 m -230.000 255.000 l -215.000 255.000 l -215.000 265.000 l -230.000 265.000 l -235.000 260.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 185.61 276.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 280.000 m -230.000 275.000 l -215.000 275.000 l -215.000 285.000 l -230.000 285.000 l -235.000 280.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -298.96 313.33 Td -(E80-900M2213S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -298.96 322.33 Td -(E80-900M2213S) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 187.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 191.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 190.000 m -255.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 197.00 Td -(ANT_2.4) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 201.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 200.000 m -255.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 207.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 211.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 210.000 m -255.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 227.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 231.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 230.000 m -255.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 237.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 241.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 240.000 m -255.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 247.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 251.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 250.000 m -255.000 250.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 257.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 261.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 260.000 m -255.000 260.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 267.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 271.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 270.000 m -255.000 270.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 277.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 281.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 280.000 m -255.000 280.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 287.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 291.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 290.000 m -255.000 290.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 297.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 301.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 300.000 m -255.000 300.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 297.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 301.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 300.000 m -355.000 300.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -334.29 287.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 291.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 290.000 m -355.000 290.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 277.00 Td -(DIO7) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 281.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 280.000 m -355.000 280.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 267.00 Td -(DIO8) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 271.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 270.000 m -355.000 270.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 257.00 Td -(DIO9) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 261.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 260.000 m -355.000 260.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -328.32 247.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 251.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 250.000 m -355.000 250.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -339.99 237.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 241.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 240.000 m -355.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 227.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 231.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 230.000 m -355.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 207.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 211.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 210.000 m -355.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -311.72 197.00 Td -(ANT_900) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 201.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 200.000 m -355.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 187.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 191.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 190.000 m -355.000 190.000 l -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -257.000 310.000 m -353.000 310.000 l -354.105 310.000 355.000 309.105 355.000 308.000 c -355.000 172.000 l -355.000 170.895 353.895 170.000 353.000 170.000 c -257.000 170.000 l -255.895 170.000 255.000 171.105 255.000 172.000 c -255.000 308.000 l -255.000 309.105 256.105 310.000 257.000 310.000 c -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 362.00 163.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -375.000 180.000 m -375.000 190.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -366.000 180.000 m -384.000 180.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -369.000 178.000 m -381.000 178.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -372.000 176.000 m -378.000 176.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -374.000 174.000 m -376.000 174.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 206.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 210.000 m -375.000 210.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 201.000 m -385.000 219.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 204.000 m -387.000 216.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 207.000 m -389.000 213.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 209.000 m -391.000 211.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 226.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 230.000 m -375.000 230.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 221.000 m -385.000 239.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 224.000 m -387.000 236.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 227.000 m -389.000 233.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 229.000 m -391.000 231.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 296.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 300.000 m -375.000 300.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 291.000 m -385.000 309.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 294.000 m -387.000 306.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 297.000 m -389.000 303.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 299.000 m -391.000 301.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 296.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 300.000 m -235.000 300.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 309.000 m -225.000 291.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 306.000 m -223.000 294.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 303.000 m -221.000 297.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 301.000 m -219.000 299.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 226.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 230.000 m -235.000 230.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 239.000 m -225.000 221.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 236.000 m -223.000 224.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 233.000 m -221.000 227.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 231.000 m -219.000 229.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 206.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 210.000 m -235.000 210.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 219.000 m -225.000 201.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 216.000 m -223.000 204.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 213.000 m -221.000 207.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 211.000 m -219.000 209.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 186.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 190.000 m -235.000 190.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 199.000 m -225.000 181.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 196.000 m -223.000 184.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 193.000 m -221.000 187.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 191.000 m -219.000 189.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 386.00 286.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 290.000 m -375.000 290.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 295.000 m -385.000 285.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -160.000 675.000 m -160.000 680.000 l -160.000 685.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 655.000 m -160.000 655.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 645.000 m -160.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 635.000 m -160.000 635.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 625.000 m -160.000 625.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 615.000 m -160.000 615.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 605.000 m -160.000 605.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 591.40 Tm -(P1.06) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 595.000 m -155.000 590.000 l -140.000 590.000 l -140.000 600.000 l -155.000 600.000 l -160.000 595.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 701.40 Tm -(P0.06) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 705.000 m -155.000 700.000 l -140.000 700.000 l -140.000 710.000 l -155.000 710.000 l -160.000 705.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 691.40 Tm -(P0.08) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 695.000 m -155.000 690.000 l -140.000 690.000 l -140.000 700.000 l -155.000 700.000 l -160.000 695.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 632.75 Td -(1.5M) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 641.75 Td -(R2) Tj -ET -2 J -0 j -100 M -1.00 w -0.63 0.00 0.00 RG -[] 0 d -405.00 655.00 10.00 -20.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 655.000 m -410.000 665.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 635.000 m -410.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 413.70 727.50 Tm -(Batt) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -410.000 705.000 m -405.000 710.000 l -405.000 725.000 l -415.000 725.000 l -415.000 710.000 l -410.000 705.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -186.000 549.000 m -194.000 541.000 l -194.000 549.000 m -186.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -196.000 549.000 m -204.000 541.000 l -204.000 549.000 m -196.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -206.000 549.000 m -214.000 541.000 l -214.000 549.000 m -206.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -276.000 719.000 m -284.000 711.000 l -284.000 719.000 m -276.000 711.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -156.000 719.000 m -164.000 711.000 l -164.000 719.000 m -156.000 711.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 397.00 599.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -410.000 615.000 m -410.000 625.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -401.000 615.000 m -419.000 615.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -404.000 613.000 m -416.000 613.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -407.000 611.000 m -413.000 611.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -409.000 609.000 m -411.000 609.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -410.000 665.000 m -280.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 672.75 Td -(1M) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 681.75 Td -(R1) Tj -ET -2 J -0 j -100 M -1.00 w -0.63 0.00 0.00 RG -[] 0 d -405.00 695.00 10.00 -20.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 695.000 m -410.000 705.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 675.000 m -410.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 685.000 m -280.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.01 681.07 Tm -(RBtn) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 685.000 m -295.000 690.000 l -310.000 690.000 l -310.000 680.000 l -295.000 680.000 l -290.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 99.24 621.60 Tm -(UBtn) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 625.000 m -140.000 620.000 l -125.000 620.000 l -125.000 630.000 l -140.000 630.000 l -145.000 625.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 117.50 676.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -150.000 680.000 m -160.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -150.000 689.000 m -150.000 671.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -148.000 686.000 m -148.000 674.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -146.000 683.000 m -146.000 677.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -144.000 681.000 m -144.000 679.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 595.000 m -280.000 595.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 655.000 m -280.000 655.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 605.000 m -280.000 605.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 625.000 m -280.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 92.64 631.40 Tm -(GPSen) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 635.000 m -140.000 630.000 l -125.000 630.000 l -125.000 640.000 l -140.000 640.000 l -145.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 93.85 651.40 Tm -(GPSrx) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 655.000 m -140.000 650.000 l -125.000 650.000 l -125.000 660.000 l -140.000 660.000 l -145.000 655.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 94.40 641.40 Tm -(GPStx) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 645.000 m -140.000 640.000 l -125.000 640.000 l -125.000 650.000 l -140.000 650.000 l -145.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 615.000 m -280.000 615.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 635.000 m -280.000 635.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 645.000 m -280.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -345.000 695.000 m -280.000 695.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -345.000 675.000 m -280.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 601.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 605.000 m -295.000 610.000 l -310.000 610.000 l -310.000 600.000 l -295.000 600.000 l -290.000 605.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.50 591.60 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 595.000 m -295.000 600.000 l -310.000 600.000 l -310.000 590.000 l -295.000 590.000 l -290.000 595.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 356.00 671.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 675.000 m -345.000 675.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 680.000 m -355.000 670.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 621.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 625.000 m -295.000 630.000 l -310.000 630.000 l -310.000 620.000 l -295.000 620.000 l -290.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 631.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 635.000 m -295.000 640.000 l -310.000 640.000 l -310.000 630.000 l -295.000 630.000 l -290.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 641.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 645.000 m -295.000 650.000 l -310.000 650.000 l -310.000 640.000 l -295.000 640.000 l -290.000 645.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 311.84 611.60 Tm -(SCk) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 615.000 m -295.000 620.000 l -310.000 620.000 l -310.000 610.000 l -295.000 610.000 l -290.000 615.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 311.70 651.60 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 655.000 m -295.000 660.000 l -310.000 660.000 l -310.000 650.000 l -295.000 650.000 l -290.000 655.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 361.50 691.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 695.000 m -345.000 695.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 686.000 m -355.000 704.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -357.000 689.000 m -357.000 701.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -359.000 692.000 m -359.000 698.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -361.000 694.000 m -361.000 696.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 302.50 701.30 Tm -(Batt) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -280.000 705.000 m -285.000 710.000 l -300.000 710.000 l -300.000 700.000 l -285.000 700.000 l -280.000 705.000 l -S -10.00 w -BT -/F1 13 Tf -13.00 TL -0.000 0.000 1.000 rg -1015.00 25.00 Td -(Nom De Tom) Tj -ET -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 647.00 251.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -625.000 255.000 m -630.000 260.000 l -645.000 260.000 l -645.000 250.000 l -630.000 250.000 l -625.000 255.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 513.00 297.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 295.000 m -525.000 285.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -520.000 295.000 m -530.000 295.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -625.000 175.000 m -625.000 215.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 612.00 149.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -625.000 165.000 m -625.000 175.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -616.000 165.000 m -634.000 165.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -619.000 163.000 m -631.000 163.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -622.000 161.000 m -628.000 161.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -624.000 159.000 m -626.000 159.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.33 201.85 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 205.000 m -520.000 200.000 l -505.000 200.000 l -505.000 210.000 l -520.000 210.000 l -525.000 205.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 473.74 191.85 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 195.000 m -520.000 190.000 l -505.000 190.000 l -505.000 200.000 l -520.000 200.000 l -525.000 195.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 482.41 231.85 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 235.000 m -520.000 230.000 l -505.000 230.000 l -505.000 240.000 l -520.000 240.000 l -525.000 235.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 476.41 251.85 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 255.000 m -520.000 250.000 l -505.000 250.000 l -505.000 260.000 l -520.000 260.000 l -525.000 255.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 476.48 241.85 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 245.000 m -520.000 240.000 l -505.000 240.000 l -505.000 250.000 l -520.000 250.000 l -525.000 245.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 489.69 221.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 225.000 m -520.000 220.000 l -505.000 220.000 l -505.000 230.000 l -520.000 230.000 l -525.000 225.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 647.01 241.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -625.000 245.000 m -630.000 250.000 l -645.000 250.000 l -645.000 240.000 l -630.000 240.000 l -625.000 245.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.33 181.85 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 185.000 m -520.000 180.000 l -505.000 180.000 l -505.000 190.000 l -520.000 190.000 l -525.000 185.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 475.06 261.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 265.000 m -520.000 260.000 l -505.000 260.000 l -505.000 270.000 l -520.000 270.000 l -525.000 265.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -568.96 298.33 Td -(SX1262_MOD) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -584.58 282.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 286.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 285.000 m -605.000 285.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -568.96 307.33 Td -(CORE_SX1262) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 202.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 206.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 205.000 m -605.000 205.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 192.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 196.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 195.000 m -545.000 195.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 182.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 186.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 185.000 m -545.000 185.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -579.49 242.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 246.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 245.000 m -605.000 245.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -579.49 252.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 256.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 255.000 m -605.000 255.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 192.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 196.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 195.000 m -605.000 195.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 282.00 Td -(3V3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 286.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 285.000 m -545.000 285.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 202.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 206.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 205.000 m -545.000 205.000 l -S -1.00 w -0.53 0.00 0.00 RG -545.00 265.00 m 545.00 266.66 543.66 268.00 542.00 268.00 c -540.34 268.00 539.00 266.66 539.00 265.00 c -539.00 263.34 540.34 262.00 542.00 262.00 c -543.66 262.00 545.00 263.34 545.00 265.00 c -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 262.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 266.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 265.000 m -539.000 265.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 252.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 256.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 255.000 m -545.000 255.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 242.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 246.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 245.000 m -545.000 245.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 232.000 m -548.000 235.000 l -545.000 238.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 232.00 Td -(CLK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 236.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 235.000 m -545.000 235.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 222.00 Td -(CS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 226.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 225.000 m -545.000 225.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 182.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 186.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 185.000 m -605.000 185.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 212.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 216.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 215.000 m -605.000 215.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -550.000 295.000 m -600.000 295.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -605.000 290.000 m -605.000 180.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -600.000 175.000 m -550.000 175.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -545.000 180.000 m -545.000 290.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 290.000 m -545.000 295.000 545.000 295.000 550.000 295.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -600.000 295.000 m -605.000 295.000 605.000 295.000 605.000 290.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -605.000 180.000 m -605.000 175.000 605.000 175.000 600.000 175.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 180.000 m -545.000 175.000 545.000 175.000 550.000 175.000 c -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 737.72 681.45 Tm -(MCU_RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -820.000 685.000 m -815.000 680.000 l -800.000 680.000 l -800.000 690.000 l -815.000 690.000 l -820.000 685.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1115.00 362.67 Td -(100uF) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1115.00 371.67 Td -(C1) Tj -ET -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1113.000 373.000 m -1097.000 373.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1105.000 365.000 m -1105.000 355.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1105.000 385.000 m -1105.000 377.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1097.000 377.000 m -1113.000 377.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1105.000 385.000 m -1105.000 395.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1105.000 373.000 m -1105.000 365.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1065.00 362.67 Td -(100uF) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1065.00 371.67 Td -(C2) Tj -ET -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1063.000 373.000 m -1047.000 373.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1055.000 365.000 m -1055.000 355.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1055.000 385.000 m -1055.000 377.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1047.000 377.000 m -1063.000 377.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1055.000 385.000 m -1055.000 395.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1055.000 373.000 m -1055.000 365.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1092.00 329.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1105.000 345.000 m -1105.000 355.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1096.000 345.000 m -1114.000 345.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1099.000 343.000 m -1111.000 343.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1102.000 341.000 m -1108.000 341.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1104.000 339.000 m -1106.000 339.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1043.00 407.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1055.000 405.000 m -1055.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1050.000 405.000 m -1060.000 405.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1042.00 327.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1055.000 345.000 m -1055.000 355.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1046.000 345.000 m -1064.000 345.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1049.000 343.000 m -1061.000 343.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1052.000 341.000 m -1058.000 341.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1054.000 339.000 m -1056.000 339.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1095.00 407.00 Tm -(+5V) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1105.000 405.000 m -1105.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1100.000 405.000 m -1110.000 405.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 102.98 611.40 Tm -(SCL) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 615.000 m -140.000 610.000 l -125.000 610.000 l -125.000 620.000 l -140.000 620.000 l -145.000 615.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 101.11 601.40 Tm -(SDA) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 605.000 m -140.000 600.000 l -125.000 600.000 l -125.000 610.000 l -140.000 610.000 l -145.000 605.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -820.000 685.000 m -840.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 77.72 661.45 Tm -(MCU_RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 665.000 m -155.000 660.000 l -140.000 660.000 l -140.000 670.000 l -155.000 670.000 l -160.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -160.000 715.000 m -165.000 715.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -621.000 289.000 m -629.000 281.000 l -629.000 289.000 m -621.000 281.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 439.000 m -259.000 431.000 l -259.000 439.000 m -251.000 431.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 449.000 m -259.000 441.000 l -259.000 449.000 m -251.000 441.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -341.000 449.000 m -349.000 441.000 l -349.000 449.000 m -341.000 441.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 409.000 m -259.000 401.000 l -259.000 409.000 m -251.000 401.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -171.000 479.000 m -179.000 471.000 l -179.000 479.000 m -171.000 471.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 432.69 661.28 Tm -(ADC) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -410.000 665.000 m -415.000 670.000 l -430.000 670.000 l -430.000 660.000 l -415.000 660.000 l -410.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -213.86 728.26 Td -(PRO_MICRO_NRF52840_29P) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -213.86 737.11 Td -(PRO-MICRO) Tj -ET -2 J -0 j -100 M -1.00 w -0.55 0.14 0.14 RG -[] 0 d -180.00 725.00 80.00 -160.00 re -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -234.94 702.00 Td -(BATIN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 706.00 Td -(25) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 705.000 m -260.000 705.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -240.95 692.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 696.00 Td -(24) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 695.000 m -260.000 695.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -243.04 682.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 686.00 Td -(23) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 685.000 m -260.000 685.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -226.28 672.00 Td -(3.3v Out) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 676.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 675.000 m -260.000 675.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 632.00 Td -(P1.15) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 636.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 635.000 m -260.000 635.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 662.00 Td -(P0.31) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 666.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 665.000 m -260.000 665.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 692.00 Td -(P0.08) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 696.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 695.000 m -180.000 695.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 622.00 Td -(P1.13) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 626.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 625.000 m -260.000 625.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 652.00 Td -(P0.29) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 656.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 655.000 m -260.000 655.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 612.00 Td -(P1.11) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 616.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 615.000 m -260.000 615.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 642.00 Td -(P0.02) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 646.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 645.000 m -260.000 645.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 682.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 686.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 685.000 m -180.000 685.000 l -S -1.00 w -0.55 0.14 0.14 RG -180.00 705.00 m 180.00 706.66 178.66 708.00 177.00 708.00 c -175.34 708.00 174.00 706.66 174.00 705.00 c -174.00 703.34 175.34 702.00 177.00 702.00 c -178.66 702.00 180.00 703.34 180.00 705.00 c -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 702.00 Td -(P0.06) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 706.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 705.000 m -174.000 705.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 592.00 Td -(P0.09) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 596.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 595.000 m -260.000 595.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 602.00 Td -(P0.10) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 606.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 605.000 m -260.000 605.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 602.00 Td -(P1.04) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 606.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 605.000 m -180.000 605.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 672.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 676.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 675.000 m -180.000 675.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 662.00 Td -(P0.17) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 666.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 665.000 m -180.000 665.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 652.00 Td -(P0.20) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 656.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 655.000 m -180.000 655.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 642.00 Td -(P0.22) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 646.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 645.000 m -180.000 645.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 632.00 Td -(P0.24) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 636.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 635.000 m -180.000 635.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 622.00 Td -(P1.00) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 626.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 625.000 m -180.000 625.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 612.00 Td -(P0.11) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 616.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 615.000 m -180.000 615.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 592.00 Td -(P1.06) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 596.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 595.000 m -180.000 595.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 193.00 568.00 Tm -(P1.01) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 189.00 547.57 Tm -(27) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -190.000 545.000 m -190.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 203.00 568.00 Tm -(P1.02) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 199.00 547.57 Tm -(28) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -200.000 545.000 m -200.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 213.00 568.00 Tm -(P1.07) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 209.00 547.57 Tm -(29) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -210.000 545.000 m -210.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -234.94 712.00 Td -(BATIN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 716.00 Td -(26) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 715.000 m -260.000 715.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 712.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 716.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 715.000 m -180.000 715.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -864.25 253.00 Td -(RA-02_C9900010926) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -864.25 262.00 Td -(RA-02) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -837.000 250.000 m -903.000 250.000 l -904.105 250.000 905.000 249.105 905.000 248.000 c -905.000 162.000 l -905.000 160.895 903.895 160.000 903.000 160.000 c -837.000 160.000 l -835.895 160.000 835.000 161.105 835.000 162.000 c -835.000 248.000 l -835.000 249.105 836.105 250.000 837.000 250.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -841.50 245.00 m 841.50 245.83 840.83 246.50 840.00 246.50 c -839.17 246.50 838.50 245.83 838.50 245.00 c -838.50 244.17 839.17 243.50 840.00 243.50 c -840.83 243.50 841.50 244.17 841.50 245.00 c -B -BT -/F1 9 Tf -9.00 TL -0.000 g -838.70 236.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -828.78 241.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -825.000 240.000 m -835.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -838.70 226.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -828.78 231.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -825.000 230.000 m -835.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 216.00 Td -(3.3V) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 221.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 220.000 m -835.000 220.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 206.00 Td -(RESET) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 211.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 210.000 m -835.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 196.00 Td -(DIO0) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 201.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 200.000 m -835.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 186.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 191.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 190.000 m -835.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 176.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 181.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 180.000 m -835.000 180.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 166.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 171.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 170.000 m -835.000 170.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -880.66 166.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -905.50 171.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -915.000 170.000 m -905.000 170.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -877.79 176.00 Td -(DIO4) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 181.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 180.000 m -905.000 180.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -877.79 186.00 Td -(DIO5) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 191.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 190.000 m -905.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -882.64 196.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 201.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 200.000 m -905.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -876.71 206.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 211.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 210.000 m -905.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -876.71 216.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 221.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 220.000 m -905.000 220.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -882.27 226.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 231.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 230.000 m -905.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -880.66 236.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -905.50 241.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -915.000 240.000 m -905.000 240.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 773.85 196.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 200.000 m -820.000 195.000 l -805.000 195.000 l -805.000 205.000 l -820.000 205.000 l -825.000 200.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 226.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 230.000 m -920.000 235.000 l -935.000 235.000 l -935.000 225.000 l -920.000 225.000 l -915.000 230.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 936.71 196.60 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 200.000 m -920.000 205.000 l -935.000 205.000 l -935.000 195.000 l -920.000 195.000 l -915.000 200.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 216.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 220.000 m -920.000 225.000 l -935.000 225.000 l -935.000 215.000 l -920.000 215.000 l -915.000 220.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 206.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 210.000 m -920.000 215.000 l -935.000 215.000 l -935.000 205.000 l -920.000 205.000 l -915.000 210.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 775.06 206.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 210.000 m -820.000 205.000 l -805.000 205.000 l -805.000 215.000 l -820.000 215.000 l -825.000 210.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 784.19 186.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 190.000 m -820.000 185.000 l -805.000 185.000 l -805.000 195.000 l -820.000 195.000 l -825.000 190.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 931.50 166.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 170.000 m -915.000 170.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 161.000 m -925.000 179.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -927.000 164.000 m -927.000 176.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -929.000 167.000 m -929.000 173.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 169.000 m -931.000 171.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 931.50 236.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 240.000 m -915.000 240.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 231.000 m -925.000 249.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -927.000 234.000 m -927.000 246.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -929.000 237.000 m -929.000 243.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 239.000 m -931.000 241.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 782.50 236.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 240.000 m -825.000 240.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 249.000 m -815.000 231.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -813.000 246.000 m -813.000 234.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -811.000 243.000 m -811.000 237.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -809.000 241.000 m -809.000 239.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -825.000 240.000 m -825.000 230.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 789.82 216.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 220.000 m -825.000 220.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 215.000 m -815.000 225.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -911.000 194.000 m -919.000 186.000 l -919.000 194.000 m -911.000 186.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -911.000 184.000 m -919.000 176.000 l -919.000 184.000 m -911.000 176.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -821.000 184.000 m -829.000 176.000 l -829.000 184.000 m -821.000 176.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -821.000 174.000 m -829.000 166.000 l -829.000 174.000 m -821.000 166.000 l -S -0.80 0.00 0.00 rg -652.50 420.00 m 652.50 421.38 651.38 422.50 650.00 422.50 c -648.62 422.50 647.50 421.38 647.50 420.00 c -647.50 418.62 648.62 417.50 650.00 417.50 c -651.38 417.50 652.50 418.62 652.50 420.00 c -f -0.80 0.00 0.00 rg -942.50 415.00 m 942.50 416.38 941.38 417.50 940.00 417.50 c -938.62 417.50 937.50 416.38 937.50 415.00 c -937.50 413.62 938.62 412.50 940.00 412.50 c -941.38 412.50 942.50 413.62 942.50 415.00 c -f -0.80 0.00 0.00 rg -942.50 395.00 m 942.50 396.38 941.38 397.50 940.00 397.50 c -938.62 397.50 937.50 396.38 937.50 395.00 c -937.50 393.62 938.62 392.50 940.00 392.50 c -941.38 392.50 942.50 393.62 942.50 395.00 c -f -0.80 0.00 0.00 rg -942.50 385.00 m 942.50 386.38 941.38 387.50 940.00 387.50 c -938.62 387.50 937.50 386.38 937.50 385.00 c -937.50 383.62 938.62 382.50 940.00 382.50 c -941.38 382.50 942.50 383.62 942.50 385.00 c -f -0.80 0.00 0.00 rg -942.50 375.00 m 942.50 376.38 941.38 377.50 940.00 377.50 c -938.62 377.50 937.50 376.38 937.50 375.00 c -937.50 373.62 938.62 372.50 940.00 372.50 c -941.38 372.50 942.50 373.62 942.50 375.00 c -f -0.80 0.00 0.00 rg -652.50 490.00 m 652.50 491.38 651.38 492.50 650.00 492.50 c -648.62 492.50 647.50 491.38 647.50 490.00 c -647.50 488.62 648.62 487.50 650.00 487.50 c -651.38 487.50 652.50 488.62 652.50 490.00 c -f -0.80 0.00 0.00 rg -942.50 465.00 m 942.50 466.38 941.38 467.50 940.00 467.50 c -938.62 467.50 937.50 466.38 937.50 465.00 c -937.50 463.62 938.62 462.50 940.00 462.50 c -941.38 462.50 942.50 463.62 942.50 465.00 c -f -0.80 0.00 0.00 rg -412.50 665.00 m 412.50 666.38 411.38 667.50 410.00 667.50 c -408.62 667.50 407.50 666.38 407.50 665.00 c -407.50 663.62 408.62 662.50 410.00 662.50 c -411.38 662.50 412.50 663.62 412.50 665.00 c -f -0.80 0.00 0.00 rg -162.50 680.00 m 162.50 681.38 161.38 682.50 160.00 682.50 c -158.62 682.50 157.50 681.38 157.50 680.00 c -157.50 678.62 158.62 677.50 160.00 677.50 c -161.38 677.50 162.50 678.62 162.50 680.00 c -f -0.80 0.00 0.00 rg -627.50 185.00 m 627.50 186.38 626.38 187.50 625.00 187.50 c -623.62 187.50 622.50 186.38 622.50 185.00 c -622.50 183.62 623.62 182.50 625.00 182.50 c -626.38 182.50 627.50 183.62 627.50 185.00 c -f -0.80 0.00 0.00 rg -627.50 195.00 m 627.50 196.38 626.38 197.50 625.00 197.50 c -623.62 197.50 622.50 196.38 622.50 195.00 c -622.50 193.62 623.62 192.50 625.00 192.50 c -626.38 192.50 627.50 193.62 627.50 195.00 c -f -0.80 0.00 0.00 rg -627.50 205.00 m 627.50 206.38 626.38 207.50 625.00 207.50 c -623.62 207.50 622.50 206.38 622.50 205.00 c -622.50 203.62 623.62 202.50 625.00 202.50 c -626.38 202.50 627.50 203.62 627.50 205.00 c -f -0.80 0.00 0.00 rg -827.50 240.00 m 827.50 241.38 826.38 242.50 825.00 242.50 c -823.62 242.50 822.50 241.38 822.50 240.00 c -822.50 238.62 823.62 237.50 825.00 237.50 c -826.38 237.50 827.50 238.62 827.50 240.00 c -f -q -102.00 0 0 20.00 706.00 30.50 cm -/I0 Do -Q -endstream -endobj -1 0 obj -<> -endobj -5 0 obj -<< -/Descent -209 -/CapHeight 727 -/StemV 0 -/Type /FontDescriptor -/Flags 32 -/FontBBox [-559 -303 1446 1050] -/FontName /Verdana -/ItalicAngle 0 -/Ascent 1005 ->> -endobj -6 0 obj -<> -endobj -7 0 obj -<< -/Type /Font -/BaseFont /Times-Roman -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/FirstChar 32 -/LastChar 255 ->> -endobj -8 0 obj -<< -/Descent -325 -/CapHeight 500 -/StemV 80 -/Type /FontDescriptor -/Flags 32 -/FontBBox [-665 -325 2000 1006] -/FontName /Arial -/ItalicAngle 0 -/Ascent 1006 ->> -endobj -9 0 obj -<> -endobj -10 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 520 -/Height 105 -/ColorSpace /DeviceRGB -/BitsPerComponent 8 -/DecodeParms <> -/SMask 11 0 R -/Length 6251 -/Filter /FlateDecode ->> -stream -xíKÉqÇ£ª{†$V>ì:ùdm]uXbÅ™æZð‰>Ù€lËòh€Ëy-Ða÷$`!q‡Mr…õÁ€N|ÖÑGëØ^­_ÎLU¸ªz8ì™îÊügfdfõ0~° ÃÛS•••‚EQe"÷EQ”a¡ŠAQE¹ÀÛ¢&\ÔíãÖógnþ—_ÿ»@Q´ÿæJ¦k#úôûoËü(Š¢œs•ßd—AO%1ÛÜGó·Å˜fª!Eyk¸‚ònç!×&¨…®è”Ä쯯àŒ)Š¢,r¥ÄÜö—lì´óUÓ³¿¹Ró¦(вÈpÛ\DUánGòüo¯Èì)Š¢,²ö¢mçó(î.Á@QÒ³¿\û9TEYd½…ÚdŸ—#‹Óܼªésu.)ŠrUXWqvkŸG< á7yöWƒ¢(Jk)˶÷y€ãnôÔsÕ Š¢¬?ë'ȶ÷ºì„¡RtøƒOQÅÆ:‰°oNùë×s€™žkºƒ¢(kËÚȯɯÏ`U7(Š²Æ¬‡ðj£Y8µn+jŠá›RÝ (Êš²’K@+´Uñ¨à³¸Ö™ñˆ¸Ùš4ÚBd^T7(Š²Ž¬Ø -W ㊞ºg)ß}À§] ¾4TIQ”µcè2+D+H åí‡]ÉnoŽh6ú<+Š¢œ“S`½?åw~‡NŽ©ì*cÏ{!´ÿæßqÝë~j¡`z&íÃñVêPRe½È °øË4—ÑÓhºß¦ÑyÏ4¹AQ”5!´šìvñ¦Qo˜¤_Âí}¯Æ?cšý…êEQÖ€¢*Q®ò Íþ>‘ä½yÀ×ÈÍÏû¥(Šƒ¸¢êÖ>?-h–ÃQãêV₞É¡ôÁ”Ç7âߦêb…õ~ýÙ>HRǸ¦Ú!ŒÐ<ª²¹^}v~Ùü[TTíÿaŽYUmþA¤óËX³³Ó$¤©‡ñ;9lÒìφ²"wö9$ØÊÝ3­;Ây¦FðÂÀQµ®¤ª¨<¢íb~ºx-Q.š²úéõ}úý|Šá Ó±Ãïu -=9àÔ­,jšiãŠõäîc>9‰R#Àbóɪ«Æ|©£™á®XðñªýË_4eõÓbí—'÷™6~ÿª /†¡¶v¹ Kßó!I€€"NžbeÀj‰´áÎï”ÓŽaž?ûÍfòƒ”¼bê꧃1N§‡“ Ò3°Èº¸w•ErU±4¯–;q5Ž<‚LÇcàçÉU”æóbWL¿n%_œ„ìÑtÞÌ<Ša0ê\qb{—‹ôûKj³_ûÛª§YÃé=Àß~Äã -úe$CSæŠé½Õ#¦Ï†$_ný^¡?.êv£š]>êŽAÁÉÕ6±<¡Ãþ0tϤ"/R®ÛÛ >X$¥%¤‹˜AZÚ1c§è{÷øËod¸¯6Ç^Sr)k-䔎ŠzD/⇺lí³ÓÞ,†Æ¸bzÃs°&§gÁŒGè“ÇL§‰ïÙ1H¥®Xɲ¿´šÔUü®S]ŸÒ‹¿RèåB·róÄ“ºýwL­w¨X|Òæ¥”]”î2C®Iç‘»ÄÓ2·wÙÍ,!S*¢N†àfÀÌã©&»€Ybd]Îÿ­]9U`~·qQ]eÞÄ3ß}ÄGØ‘ÑJRºYÒQšà¶¾ììrÖŒà.ïì¥ÍŒÈuNO7ø9ÇÄ(þ—óŽ‚÷0ù'O˜»¼vJ¬g{Ûdº ±•Ù¥wæÏq9”ì Åd+,æÓ©©QBV•Ðð=>qUñº6F÷BÝ%1Ú·»‚ÎD؈û_Î㸤çý‘gVõPW)BØyÔ2„4±qa¢‰ÊJÔŒ$¹Ÿpç€kë†Á8ªÖq]ž„t qÝà¿’.!êy-»8Íþ‰”ˆ}ÀŽ,ÁwŽè§È·P²ƒ%¦?üC>4pT·»ºa®£—Ý߇8Ä'ßóZNšmÈÇÅ19¦‹ mƒ>¤¼Q eM‡i÷—ˆ$- :„÷1­Ç̱m¤ t^"ýµú\Ë© 8º4R!t ó"ÎÔÝù!W'öŸ êÅ}g«‚ª’æ>fd5ÓhDÿuþéO3å‚|Ìÿñïm Åâç0¨I“±ÍÓ?x¤]¯“€–rü† Ùù÷¹–›fR¡é4Hö•4 8•éáBK·rYA‹´1ôÊcúL:š{%·»õo˜¿¢;ógÏZp¿®é¥D1œ[{P|òÊÍ=²`2(«ºòµ£¼K˜êßúþÚï^ƒ6ègrŽ_ç ¹9‘ÂN›×ÙˆïÅ?  “¬Åþš9,zYÌDí†4é<*W)*¤¡‘/w¥Óúäs8‘y«+<¸¦.èEØ  ºåšžË¹òœ/ä”Ãu%·ÕN´¯¼›ƒ‚ÉQ¨¼A>ø9Ï´ch ÿ@‘9â3’hvsß~ÈÖ~I቞ž7¾ó˜k[’|Êœ9Ó)ÿ«­–sàé&*¯Ã¾”[<’°#eó„¢í -úŸÙœ¿ƒÅÓ“(mŽ!èkz‘¾P‡\¾’`\ø¨ÌžhëõOŽèa^‚«Q]B’v™lª:P]}ëÇüµÿƒ~ùÕˆ~黨ðzyfdu³Û…Œ’óëj­´•´Éz'Îñéˆ>— ö Ëøƒ)o\nµÁôó`i%å4ˆNk4G  Úå÷ˆRI¯ ˜à]/¢[|M·­=.ƒ§-†°u»¾¡V'’W3AÖãŸÌ¯ ¯¢_à:œ<`I¥÷È-jÌÏ;FöLÃõÅP]£—ßK»cH¢®&Ϙ~ üÎW1„7¬æ8Y¨nW=!ƒêlˆ¸ 3ôn»øÍ4–õ)ZPeS ‹¸¶V5¼JäRã1=í9ʾ0ɰ“AÊ›të1€ð_d%ghª l3%¶cØíª® -ÝnÅ”®Z!g?+ÚÿÚþsD³„šÃáN oz8ç'"Læ5Î(BY˜;q5~'ų¿ø©£ZÐëÃÆ÷"æ…Š¸’ÌåoÏç?–´JaЛÅøc\а±%¬Š•\÷MÄsŠ…É”iéLqù]¬PEØõ·ö['U¸”ˆ ®ÊŽ¡•_´z†ŽŽè¥µ7(¯C3¶r´t¿$@EBe €~9ëÞI<ú­i%´E÷\Ô›uäÈÇ%»²›+Fõ+šÍd>ÒoNùë@„2¥«?À¥Ô«ÐÜ®Q97Î2ý.Š3ô®@v’^««_à}³xíÜØZðšÉ¶nˆè\õ›rþ˜æR. ɳµz“¼«¨z_MD€¤ I"¡tö:˜Vå´^úÕ» -2î¡/¬ÕÔ;Ø»¾y í9 -Ò©h× Þ -º5vÊWPŸôÞ»HÇæ#Ìnîò šÝ6*8®WðœÓê$1{“ eûBñ*rb4Ï$!&î?¸³Ëµˆbèöò®üåJŰr ’tÇ€´YGÅÐÅÈ¥€ôIêä +’~ǰ¸×°ˆ‰ð¹û˜Oá -NRT«62ÌOŸ¥yÑ\YÏÛwñ‘­–Œ¬C{k—Këá³ílÕô/,¯4—_}Ÿ5iޏCpQ Ø~Š"(†÷»PÑy.x1ïm0¦ÍMrÚ§÷±õ€/ug‘]| È¬&òS_.=£Ä™!²V!°ãt…÷=þ£)ÿ¯­ÊlŸ7 Ùt:éݤ'RE—ò‚œßgHÂß&°w 9²ZírøõÊë÷]3ܺrûcô;‘hH9yÂôªK *Œ¾¦êºg©¬û\mõ„‘ôcbG¦é‘`MÊ@úºQ¦¬êj½òî<|)~EñËtƒ -8;N/$‚%4ÇqI_ÀKSp{‘pkxí;Vi7¾uû_ë•N$Céß`FÅ6¬æÅ7–—“Ë£M‹-–ÂÝ|2(þ/Ø5)M*»Í³>—]ä &%ï…[”®¹aÇ«G$ +B=¢ŠéeÚðtHL«çEy0{oDÌ”K˜•M  pT °7‰¼F¶³Ëìäè¿D£A7é³?7nè¦LÒ aRq ¹×ÝñéQÜ[˜î¸ìëŠ^•‹1«@§(RÝ@lká’7 Œ\pRâàäa ¹‡®€[yC;”Žç˜þeœ ìDíö—x{RSZæ\”;GÖêáÉž°Jh^ç¾¢ipN¸ø·bH݈xù‰;ûö^X‚RƼœ\×gbÝàêM‚BTK-—ÍPp;mpP.v:jÑ ;>„*o†É -ç¿Ä½Iï¾GŸü1|Ì%z(ºì(ˆ¦y}DŸ -µÛć²â‘%O1$α¬(w™OÕ _¿œ½=Â7)^'™*†´ƒóBœìݲ°Á#U¼æ„L‚»c 6p7n¤P™ù¼È«„‚N+ú\®”^y;Pj‹G­8‘2öÜšªê×ýêÖG¥¢?é!éVn¶e2doÅ­ßϼ -q1J·ÉO˜ÿÛí…˜êõØí"õÈÇÓ»ŠA ² Én _˜5mÔýEÓ~qTiwu› 8+i*x؆• VuÁÙçÄ+æ^f|`(ˆp²èήÁpòà8Ô”ñÑK©ýæ}¦ ‘+ØZq9Ìáü= †­Ñç%žúä&¸š»6ç´¦ñuªKe }FÞçXˆ»‘\Äq5 &H´OßhÓ´Tñ¸©Gw¯„;Gœ*@¥©”¸Ó¡`n]†0‰þs‚¼§s}öZ»WàhNѰt\\ JY£éEpŒN«1è'óäø{i‡m[/ÒÖ`¦5Ô­aÉ!np)'ä6}‰ÚŸÅØ­BêÀùœUÇ­‚ò~áËËàÞÇüå—©oŠãp:Vfñœô/ñfV F[ ²Œãã!¾t×å'<ÊÉ}æ ‰‹S1¤²»Å£ƒ²é†c¼¦¼8}.4bÊó®a–àΉ"+çÃ)ƒ!ä°îu(ofOàÍ| qBÆ ‹·K?w÷Ci!bŸÑ•ß`ß+ÌÉbj™ãäübÃ1¨+ÿ¤¡ /m­iÉ­¿ æñgÜ.X:¸r²´gUô™KK,3rç×ÖÚf">‡[Ž)Ëš+ß‹µ„»D–ÊjÊ bn¿aó –5öû[ÛoL"pe‘ð|r(¢L®õ^šÄÕeÌŸg®QYm5PþÄë]ÔÇtݬÄé­ƒx¸j¸1¾Õ…ÁD™³Èe\óX[€ÿDV7TEÛFÉò°6/¼C€@õ§äÖhžÕbûÒo1A‰‘·ÿÕÙ¤û`§PÁþoT:Á-ü݈¹}åVq¨!,J_jè%D¦´1#Ž7éß;»ÁºD«$I(‰ø”¹S–t(×0'KKë\¥SWÝ}¾Ó/í;*Übð>¢Á)†9Û]J×w+[CDi‹,Тˣ’Úû›ÉRÒËIá…–½Ze@l=äQ½b½ák tÞÂjØÍAäŽø¹T†`&wm3œ²@†°] ì r²28í\ݸREôßMP+׿Ÿ*z³‡Eâ©® {³~Å|ÔƒM lwǶ‹¿pZÍf‹o@í3/ªM¸›ð`c©¶wç$V àLŒQ½Ù.%Óã“D‹6v­›]/îâp*”’ã4Ç×B )»£Dðdòb5ë~ƒ| -JÑ -Ç$ÆþÞ ÛÃzW3ùæovѨž}.‘RÜö{ïßL%•Äo#4>Ý‚q)Cà?ª.$aÜ,ªnÐñ¿Ðl&vJü,‘c >’lÒ*©UÂ4v)É¢ +¤Ûi•Í¿Uç®MÞ`娘ÏlŽðñƒÆSÆ©P®0ùÌØ„þHÉŠ°èaì>"ÊÛIÎU•hÓÀôÎ+ú©¨VQ¢’7aJQr.¬6ÁÒ·ºÇ€Š’Èf‚3@Å•Ì +z$eò&SŠR#}[Må­"ÿÚŠçPÒ£eí¸yÀ×€âUA_¨bP¢1ˆµ%Ó2rª¡¢Ä¬¤§ JT†²¼dƒ” Š)J2&˜€2Mª”Ø h…Iéu¿*k -”F\«UQ¬ k…Mº}´·v(ºäFÁjbŠ’ ¨±S(Iâ"këc ÖßÀQ²O%)Ǧ(4LÅ0gò„éU×wÅX™™êŠ^º4'R”¡Ä_h”’ŒõXgm»×¯ÚR9ÕéYišF|yLÿ¬ùÌÊ•Ù.€ý-%]gŠ’¤^×ô\Ïœ•TèRS”œL1ÝÑõhAI‰®6EÉ ¢ª§ JZtµ)Š¢(PÅ (Š¢\@ƒ¢(ŠrÿÔF- -endstream -endobj -11 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 520 -/Height 105 -/ColorSpace /DeviceGray -/BitsPerComponent 8 -/DecodeParms <> -/Length 6577 -/Filter /FlateDecode ->> -stream -xí] œMÕ÷?ýòÌcÂ=ȳñJ„ÏQ¡‰¼j"*"Íx—IJŒh”GQž¿¼‰"oò袌Ô4¦(Æ`BÑ0“_¤ÿ}³×Ú{í}ö½3W3þ÷[öÙgí{Ž{×Ù{íµ¾k›Œ ‚pâ¦û‚È*Bnä¬"„5 -êüÿ¬߯»”£ŸDÀsŠÞ0<ün¡wÍê­GrìA9¤•ºt©);·uۦĜ¹JCŽ(B«.] -+>žóuN\'ˆÀ!¡WÏföBKælÍþ•‚²­5GtÑ\1g}v¯Dà]E<¢¤¶ì¬Ø?²yµ †ì)B³­|OŠÝ”­Ë8dK^œî눑qÙ¹^CvaôHßǬŠý)W "`ð_ò­Žôg؉Ëý¾dƒßŠPùG>Ô„\á¾½²3ç§§/SÚ‰¢‰ &äBø©!ç¨Þ‹IÉ»¿:fVŽŒ¤W &ä>ø©Âľ¤…‹~ãûJ·Šz\”¼Øz—— "`ðO>o/t­[¸”–mÛGT…]­/úuÝ }E¸ÅM4(uñBæùˆWø“ãÿ+I¨Âô~Ú× âº@SêvêXMq:~Âåð÷ó=ý|öEPè(Bx›¶÷«ÎÿñÌF»è=“ëÈhú£Æ•ƒ¸n°W„V/‰ÂÏjpŠí»w,zÆ~P×vŠÐ¬Ÿ]”9¡‘Þ•¾ŒÀÇÏ,ÒgâÖv™{öæNôM[‰„ð†‹¸–•u)+++õ?D¬éPÉ©¡~¿^vJ­¤u?†  )Í2tGºq²½Lú› -›õßÃ*ûÊ‹IÈŒú¸'þï#GR$$ýåëµ[<Ò¡ï©ä”Š ]ïèÓ]L¤'Çá{KGëß9ëx´ü)…¨L²Ô‰ -ø¶0¸Ð¯G6.Ý¡92ÿ‰P-¹b|¼¥Àã³Nö2N¤U°š#4}çšK™&jìG‡Ê žDöÔ·¿cë#B¶<Ìu¬š —ûR=Eï¾+gÀ¡9—MfÇÌÞ:jØ9gWvÀÇõV+­ÿ¥Öþ½+ަ¥¥U¯áúÏÝÑ{¶Íxa–Ðe¨ðà±uZŸ?óEoè:à·Ûu¤ºlÒ#‡ÛhBsסڰ“Š0Xt=lür-¸j­îÝK¿Uò#չȾ -BßÁ¸…öû}¨ñéé5í²ë‰{êHMš˜ÎÞ«õÉ)O)5á«Æ\Ç -…½M)BƒÝ|ÏŽ©<§è®nݾ¦º ƾFtÆÙ{,Æ¿ÊÚ£h‘‹‰‰>y&®ZdŽQ™€%ND#Bݵ¯ÔšvŠë>ñ)ßs´¼\šR„…Ýðñ¥ÔP¸Š­±B¡æ>ªWiк±´3kÛ.޹ -p5|aŽÎˆ† ÔˆêQQ5xÉØñòO!XdåáAB"9gá‘~ýâ2üP‹êÝÆ‘<ZÍÌ2—sò†1¯³vë/tFtd/4¢Y‡¾x7wõa鮋Š(¬:BÖcâ7 E‘ì`~w²ûíêa'î°šûïSÈå>Ì{–µÃ~Öñ -0êªã„ ˆ)ø9ZÅm Δû>‘‡’EEè†-·# -¯·_xEbºö÷eAvÃc¾]±D¹²eCÒÓ§ÿOs@þj÷•=æ„o—‘ÁÑÜjž+¡58`ÏÞÉÏ~œWâ¡/éÏx} Ñ™^VzMQv7€GU| ÛCEìò‰bTK0Cú²E¬Ò£U¹ÒæÁ–%›ÛŽè^½NOóƒ…{à™Ö¢ÃK-ù®ÅqÖ"Ýø+«W²`¶ÍNo™ú`V™ÑW~m†ÿd²1’î±J¹wKf¾ûË.*(Âð«ø¾‘î²ê¢c*s= -÷ð@q¬¦“Ç­/G|#A8Ò ãtÜûfóû:Vo 2Õ <ÊFo@íéŬOM2½é#Þ& -niÂÒj~=ÞàűRCŒW„È$è®áòó%£GᎴ¿Ëdw4em- -þ­Ó;KÏ•ƒgÅ| “<ʬ°3·i|rõŠ’>’VûË[%ò{gü‡³ãûº¢X±³7³ë‹…Œ;%6&œ˜Z8(‰›Ó˰ÂðØØš4¨ŠØÄ+Š{> 3'Œ¯›HäŠg²vÒöŸÛM=•MBtò±:óL©nukŒþ´Tl4Ó‰¦€HºDuà¥NÜÅŸµœÚÇvGXXÕ~åÍ!ô,!»5° :MŽ_•csÀsáQI‘¥Á²>¿‡í§ö˜k#Ð+Í0~ÇŽj•îÔòúÅ'1\×%¼P8Èìý•Õ ÝÇ*‘žÖ -CÂÌÒßÊÐ"hoW!;›èyTvÜæ9.:¡åàÕ6åá4 lLèàdôÊ6ÏÎcm)±gÓ•²z® ”õðÚûÊ…wLæð¾‹dŒ`:kµÙjž/f5ôÇOù'3ßÁw2^ $´áb^~“žej‚S„[ z]*_…~c#Çî¡¥ÞeÿI£Þ2[BÁ¥Ó§C¨È.â´¨‘Qá({·<Îì“CŒäï pw¡rG•7íÆ†Þhê=Ël••2rÓ¢®¬ýÊ|ÎcO•j(Á)¢*ÊM·œvÜ·Ÿ"™2<Möü=£ê>³z¶+šWªnݺB<ž=¹p»”2nC†Qº{w¯°)[¾€åב{Žá\z›’Zêl’[­ºhÅû²ô.˜jÀyMtý9ì]Ã'pŠ€nÛ7º¹·FïØ®8½áQpðíø“%| œkáN†Â»À3g2{«óÛœ#ˆ™ÃÕ€ÅÐØ»Ú/‹rý ½@`Sõiú¤xÀ΀?_ÿ©wijpo"ÿ9{‚ï‰sS]rö6ð1BË)z<;håÙ!ÿËѸ/ î¾e…T  n·GéÝåA×ÌQØìþiÌs‚7·™Ü9WæÙÅbpË ÃkÃ=ià~©†Úݵ ) ¶ýKÓX[ên -ÂÏKºÂ3æw¹ˆÜü̧¯é$ApŠ€Öbzë#úD»þ*J)2í$)µWo&»9¸V¤WÐðàe´Þ±L\¸4°@èäœ)6ç9«‰Ö†Õ HßàÄ2Õ3`áO@?zìm¥¸~ GBQIë± ®?=ñ)´)¯QÒ,pе1'–†nÑžXfb³,¹ÌŽ¥¥ZYÞ0©6ë â”Çàš³ ð×GYw»1=n32 ˜"0ÈpyÎq0WHú€«|²,µ|WXm`¼R)·^o÷Ä;˜{²èƒÆŒ&?S„¨eàà *¤í :D?d6G+RÃQésiÿ9Õ+ÀõðvÙö¤ -EqwëÀ–KêmfPçâ¶7Ÿ´üš×J±µág¸Ó‘†NJ<ï°ßåüÛ€3n-*¤ºÿ:侟ÞH‘µÞv»lÎå¾w¸Rs^0²ƒG€jFyéÝéð¹-›NH¼ªu{Ž¿êTɆ³8xâЪ˜õ¢Ì½Ü lm€d›µ¨`”„Àá|8X~g.tyí H†Î/må' 4³¸û/¯äÉ8÷Nvor½(d³O¥×9„‹£„@á 1 ­„÷”Üb눕”ëû‘Õ„ÞÙÐoA*£Î¤eê€1Z쎕&…€¦L`Ú-“Î ÓlR,l1÷§xwÝž9Êt‹>D} §pÆ1~&Š)š¸%,,ÌÅþ’0^j üÀó…Ê ¼Ÿúæ4>N}ì¶–1w¥6miW0âcrAè•ÃI~a¡ßŠ›Í?*{×ÈJä´ïIÚ¢ £à¦&Ñ¿+Í€qTÜn¾Ldz.³ñ~vK¦ñDF¶…yâо\áy%[6mjr®g®Ã"•†ŒÍÅ>•tˆ‡êïôCrÞRîY)Só‚Åû@ÛÚ‚ß`ZرáB8Á…åŒØâ]`Ð÷.Ÿf1J|!\2ü‰åì÷÷£Y›‘˜ýc:Hú6úc­Ç/QÛœv’o^âaL²% YÝ"#q„wÉÇ›ÑqéWéì_i,Æçèì2Køzß=Žâ—§Id¾¶V^\¯YÊ.¼Gù€+Ç»6ÀDÑžó°4¬S)UrCýÞDš -7#l®g¾õ]|–HÎ'¿b¾¹åRÈäN÷Æûâ©ñŒUt¸Œ—~¬–ði' n+ f&©÷ÝPr'ØRd:¥½4".;miå¡ú®µæ°§ð/=Üj훌“wJîc ˜Èn“e…ÂêWCÌÍn/PAŠ÷Ì5^b6I–#¯˜ì6˜O%ì2A|ǧÇ㽎ԛ^“ªöMŸN×Å@•eÖ.Îæ”zßÝ·® 1ÚÛ“¸„‹¨ ŠÀ®Ã½6€ð¢øƒ(Õ-‚±+ÜjÊÿ Ñï³6ãgü);8«)tKáƒTnÓ²Ëö?p”g¢N{Ùõç ±²² -¿LŸ!K™õI¼ ó4aÒŽ:¸ -r¦å ã\4à½l­'qKÂЇºÖ˜”)ºÒÿÊo5U¬YÉ#/h“¬Í —16ÕÆB2dV™ ‹yKµ -6öªFß8"¹ÆSS§K_ð†ãÐdRàƒù‡hª4*_¦åÏù?÷Lä–Ñ«V’ýS’[œ+?âÞº† ¬IzE €¹¾=B"ƒÒ”­ÒH׸3n¼÷Ù+4d(báÀ·‚"à`Wž~¸ÕDÅ}GerÕpâò{Ó)/‘˜™B’¢ Ö"“hM€üš˜h@#ÿj~â4Ÿ®-f`I³ãçk€×LtŸÂذΒ€«¿Ô£I4Éæü&†·’¾Ý¿ç›Ö¬_÷7ÞÅKR$ŽæŸïhyhâýJƒwÚÞ3Tu¹0WÞÚ–øµ|ÿP&ÀÚù«L/‡Y5¥è©÷™0‰µ_éd&¯ÝÂúÿןÜãZ¹BÐ. B£4eÓ‹PB?%³‘Ý« -xªƒ×Y¥Å°ñátå# m#CÞ`Xhˆ¤´Ñ©p·'™zOCëd~7 æûäp?DQaøðÔBC%'Q²«àn–œ'wÝòø‚ 9{JŽà“ÚÞCúÂãüitÐÓWqŒ,—YèOÖ¦§ 0:õà·¤°'Ò‰ÙFé°Fß¹:iÜyé£*ß Ì~žµï%§Òká/aXõê²xQT4Ü Eà …ëZ%{ªsI¬ž¨b&¹ÀEëçõ¤„jç¸MQw4붘.žqTõ7Pê @j@L­ØJ7ŠAh­¶ÏäY‚<¦æ£Ã3Pƒ`šP×â¦ç®(ö&”iaû8»ß=‘Ûn5'Ë>t®^BíÍ—óYm‘”â\ƒ_úˆ’p2Ìþü]”íKN/€‡*5^1@&OVJ` -ªhN¶%:O¥woå¿F|Ë·ür`oXÕòå"ù-[ATw £m0ÆyÊ(¨¯ ‰Ç‚Û[§-¬Ô6»8*ß6å_558$ÅCn§òˆ€e;‹¼h€‚›Ò‰ª1Èc˜ÕÄ;[j–ðó‚ȱ&gÁÁæü‚ñÌó¼×™ù•ŠëDÚëvocÈß®½ðI”°|R›Z­°>õ BO>rB¿õWȉ±’ÅT¢!¢9OÆeª€æ€÷ 0ü+:×BcbBP‡9ëi–{6ñ÷mBö'½ Ùe>ðòTy¦³#ÅxO¥Zµ­H{©ªÕŠtTÁ<÷’Ïì’Æ` 3£½ÞƒÓ™@2l—ç -&Œ@÷WAƒƒø¯>K¦ZÂuèám”èx(11œ‘ÔÄf8RžuJWÏD–+(fãÒ_lá­ád¿ŠÊå¬9qmäx1¨ Aæ¥65nd°‚3˜RL~ -\­ªr¦t4z*Á‡yKÑÍêoùÜ€ÉLlY¿ãwO“/;„‡ÒÒLoXeBG4­WOpš›WíÀçCx) aRœ¿$OäÖ ˜øBüê?š*“ï± Í´Ëæ·dýÕŒ]l×Ù­I¨ yÑØKñ“•ÒÚ|½×´3Þܺƒ6‚0sÝ]£¾n@³{)Á¿ÃR˜]#ò*ìþ¯1嵜ÖÀÑ¢X‚5K,é-›jÛ."ân^`W.œ8óuÊfR;§= w †ÅÇT"a’Å´á¯ã“½lùˆ¨(.Ÿ~“iXÖ\Á¸§kf=‘U¥aðÈÛ*{Iâ³àßcEa1ʹT…sxXQ,È~QÔ˙ėËóüéš±@梽RÇ,@¤UR-JÇ))«J$Ö}¤aÍ£‚Ããä/)U¬XQŒ‹š3[™e¶¡±5KFÎÇÙNeº`f€E˜Ñ—i˾ ®ÄŠ ’|‰ìל–rã«Þ|É+©ø°dše’µ&4Þ\!¥qaj)2Z˜[€E]•‚ ozþù—É #¸HíÌF¢ì€R?¿2.bæèeò¸ÀØÀгð£Pœd -ñ1…^a4íÅS)]HpÚh—úÐ^@7ÿ +¸Wm»NIƒåY¶]¦|9Å‹üËK]@toYɱâJ°mͯý7¶^Aþ–¢l𲼄2+ÊíXßÑÔWªZ’¹€§âËë0’ª^ß±]^0Á25_f´4#‡/U¼„œŒGËCJ©G[<À²®Ç~7ݲÔŽÛ­Üí5bü©‹Õ¹ºkê}yÍ1Ô¬©0éÌô•»r¸2þe½½×ÀuZQMá×/ÙìÄêá6Z,©Ë`È|™°þS2ʺM‡˜©J¸ò(8Æ3w úþ[n… -}Ç~ê°sÐ<Ñ_tÏ)¶´O¨ÎŽ¢T·+ÇÛ(õZd%I5Á»›½øìÕ|`¡ìTìçˆÊ뉃 -*€ Í‘tb"FÚ4èØÜ 2¥®/À*>>Ÿ²/ïÔ£¿@ —;”$¿X2§ÂÇ»w·–”’Üׂi¶M˜=ìœa¼ð¶gÁCÕÙʽF×õ•¬¹WXl˨+­RµT^áOr Cwýòåp…©]"“°ÚùºH:u¾"##¹Ò˜Ró­óˆ¶N/_î°½z#)·Käj=ør+ô¡ÞVy<Òå+XnÀ\G!ç!ÏB_8V‡Ò'ãÖw‘¿#ÏÁE°ñvä·sÅ`˜â¹ñ…£þÁEPRÚ7ú«ÏÀ!ž!Zò¼ŸA±uTL½á“mVý÷î#Çá›"oÆlÝÓoü¹g—c‘§à£"•c¢ÅÎ';oHÀok¾»/ÀWE0Œš]ºà°ÁêIŽº™ÜXœF]©!¯ÁwE0ŒÂíXy½-ŸlÖx3Å‚a€ƒí’üQò— - ÍtâjŽÞMnàÈüUBQf<Â_Eø X4šf.å]A0ÓFIÏ‹*‚> ;°Ý¹\žDP‚p#¨A¸T„ Üø?ó†7Ó -endstream -endobj -2 0 obj -<< -/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] -/Font << -/F1 6 0 R -/F2 7 0 R -/F3 9 0 R ->> -/XObject << -/I0 10 0 R ->> ->> -endobj -12 0 obj -<< -/Producer (jsPDF 0.0.0) -/CreationDate (D:20241217154849-00'00') ->> -endobj -13 0 obj -<< -/Type /Catalog -/Pages 1 0 R -/OpenAction [3 0 R /FitH null] -/PageLayout /OneColumn ->> -endobj -xref -0 14 -0000000000 65535 f -0000102899 00000 n -0000118853 00000 n -0000000015 00000 n -0000000125 00000 n -0000102956 00000 n -0000103126 00000 n -0000104180 00000 n -0000104307 00000 n -0000104476 00000 n -0000105520 00000 n -0000112030 00000 n -0000118988 00000 n -0000119074 00000 n -trailer -<< -/Size 14 -/Root 13 0 R -/Info 12 0 R -/ID [ <906A4C76C35816C42EB6FFD13B3B7D92> <906A4C76C35816C42EB6FFD13B3B7D92> ] ->> -startxref -119178 -%%EOF \ No newline at end of file diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf new file mode 100644 index 000000000..63a80dbbe --- /dev/null +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf @@ -0,0 +1,33346 @@ +%PDF-1.4 +%ºß¬à +3 0 obj +<> +endobj +4 0 obj +<< +/Length 334350 +>> +stream +0.14 w +0 G +q +2 J +0 j +72 M +1.00 g +[] 0 d +0.00 1197.36 848.16 -1197.36 re +f +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +2.88 1194.48 842.40 -1191.60 re +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +10.08 1187.28 828.00 -1177.20 re +S +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +71.28 3.60 Td +<0031> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +71.28 1188.00 Td +<0031> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +211.68 3.60 Td +<0032> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +211.68 1188.00 Td +<0032> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +352.08 3.60 Td +<0033> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +352.08 1188.00 Td +<0033> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +492.48 3.60 Td +<0034> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +492.48 1188.00 Td +<0034> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +632.88 3.60 Td +<0035> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +632.88 1188.00 Td +<0035> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +773.28 3.60 Td +<0036> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +773.28 1188.00 Td +<0036> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 1042.65 Td +<0041> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 1042.65 Td +<0041> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 744.75 Td +<0042> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 744.75 Td +<0042> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 446.85 Td +<0043> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 446.85 Td +<0043> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 148.95 Td +<0044> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 148.95 Td +<0044> Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +143.280 2.880 m +143.280 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +143.280 1194.480 m +143.280 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +283.680 2.880 m +283.680 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +283.680 1194.480 m +283.680 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 2.880 m +424.080 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 1194.480 m +424.080 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +564.480 2.880 m +564.480 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +564.480 1194.480 m +564.480 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +704.880 2.880 m +704.880 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +704.880 1194.480 m +704.880 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 896.580 m +10.080 896.580 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 896.580 m +838.080 896.580 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 598.680 m +10.080 598.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 598.680 m +838.080 598.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 300.780 m +10.080 300.780 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 300.780 m +838.080 300.780 l +S +7.20 w +BT +/F2 13.090909090909088 Tf +14.40 TL +0.000 0.000 0.502 rg +613.27 70.30 Td +(Pro-micro Pinouts) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +793.59 43.36 Td +(1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +730.08 129.04 Td +(2025-11-08) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +730.08 114.64 Td +(2025-11-07) Tj +ET +7.20 w +BT +/F2 13.090909090909088 Tf +14.40 TL +0.000 0.000 0.502 rg +474.65 120.70 Td +(Pro-micro_Pinouts) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +709.35 43.36 Td +(1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +510.19 100.24 Td +(Sheet_1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +509.74 21.04 Td +(V2.0) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +572.88 21.04 Td +(A3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +2.88 -1170.85 Td +(1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +2.88 -1170.85 Td +(1) Tj +ET +q +1 0 0 1 0 0 cm +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 71.44 Td +(Reviewed) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 85.84 Td +(Drawn) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +509.75 42.64 Td +(VER) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 114.64 Td +(Create Date) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 100.24 Td +(Part Number) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 43.36 Td +(PAGE) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +745.92 43.36 Td +(OF) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 121.84 Td +(Schematic) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 129.04 Td +(Update Date) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +566.53 42.64 Td +(SIZE) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +341.28 100.24 Td +(Page) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +332.64 139.68 505.44 -129.60 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +548.640 10.080 m +548.640 53.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +398.880 38.880 m +398.880 139.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +649.440 139.680 m +649.440 96.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +721.440 96.480 m +721.440 139.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 96.480 m +491.040 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 82.080 m +332.640 82.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 125.280 m +649.440 125.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 38.880 m +332.640 38.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 96.480 m +332.640 96.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 53.280 m +332.640 53.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 67.680 m +332.640 67.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 110.880 m +332.640 110.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +606.240 53.280 m +606.240 10.080 l +S +q +0.33 0.53 1.00 rg +[] 0 d +414.402 23.650 m +414.554 23.764 414.738 23.821 414.949 23.821 c +415.233 23.821 415.536 23.720 415.859 23.524 c +416.182 23.328 416.492 23.018 416.789 22.594 c +417.936 24.359 l +417.580 24.852 417.138 25.238 416.604 25.510 c +416.070 25.782 415.503 25.915 414.910 25.915 c +414.066 25.915 413.328 25.668 412.708 25.175 c +412.088 24.681 411.778 24.036 411.778 23.252 c +411.778 22.689 411.976 22.151 412.372 21.645 c +412.655 21.285 413.169 20.848 413.908 20.342 c +414.547 19.906 414.943 19.602 415.088 19.432 c +415.233 19.261 415.305 19.096 415.305 18.932 c +415.305 18.729 415.213 18.559 415.022 18.407 c +414.831 18.261 414.580 18.186 414.264 18.186 c +413.466 18.186 412.728 18.609 412.055 19.463 c +410.572 17.806 l +411.231 17.136 411.831 16.668 412.365 16.415 c +412.899 16.162 413.499 16.035 414.152 16.035 c +415.286 16.035 416.149 16.345 416.749 16.965 c +417.349 17.585 417.646 18.249 417.646 18.945 c +417.646 19.476 417.501 19.963 417.211 20.418 c +416.920 20.867 416.314 21.411 415.391 22.044 c +414.811 22.442 414.468 22.708 414.356 22.847 c +414.237 22.986 414.178 23.125 414.178 23.265 c +414.171 23.410 414.251 23.537 414.402 23.650 c +414.402 23.650 l +f +0.33 0.53 1.00 rg +[] 0 d +423.434 20.102 m +421.528 25.674 l +419.168 25.674 l +421.924 17.559 l +419.142 12.841 l +421.680 12.841 l +429.373 25.674 l +426.782 25.674 l +423.434 20.102 l +f +0.33 0.53 1.00 rg +[] 0 d +397.908 24.093 m +393.267 24.093 l +393.650 26.731 l +393.650 26.731 398.574 26.737 398.601 26.737 c +399.247 26.737 399.774 27.243 399.774 27.863 c +399.774 28.483 399.247 28.989 398.601 28.989 c +398.581 28.989 391.455 28.989 391.455 28.989 c +389.635 16.275 l +397.098 16.275 l +397.098 16.275 l +397.724 16.288 398.231 16.781 398.231 17.382 c +398.231 17.996 397.711 18.495 397.071 18.495 c +397.045 18.495 392.443 18.489 392.443 18.489 c +392.931 21.860 l +392.931 21.860 397.658 21.854 397.697 21.854 c +398.344 21.854 398.871 22.360 398.871 22.980 c +398.884 23.543 398.462 24.005 397.908 24.093 c +397.908 24.093 l +f +0.33 0.53 1.00 rg +[] 0 d +438.576 28.982 m +438.556 28.982 431.430 28.982 431.430 28.982 c +429.624 16.282 l +437.093 16.282 l +437.093 16.282 l +437.719 16.294 438.227 16.788 438.227 17.389 c +438.227 18.002 437.706 18.502 437.066 18.502 c +437.040 18.502 432.439 18.495 432.439 18.495 c +432.926 21.867 l +432.926 21.867 437.653 21.860 437.699 21.860 c +438.345 21.860 438.873 22.366 438.873 22.986 c +438.873 23.543 438.451 24.005 437.897 24.093 c +433.256 24.093 l +433.638 26.731 l +433.638 26.731 438.563 26.737 438.589 26.737 c +439.235 26.737 439.763 27.243 439.763 27.863 c +439.749 28.476 439.229 28.982 438.576 28.982 c +438.576 28.982 l +f +0.33 0.53 1.00 rg +[] 0 d +451.912 22.898 m +451.912 24.144 451.609 25.251 451.009 26.206 c +450.409 27.161 449.631 27.863 448.669 28.306 c +447.706 28.755 446.249 28.976 444.278 28.976 c +442.182 28.976 l +440.376 16.275 l +444.489 16.275 l +446.216 16.275 447.568 16.522 448.537 17.015 c +449.506 17.509 450.317 18.293 450.956 19.362 c +451.596 20.437 451.912 21.614 451.912 22.898 c +451.912 22.898 l +448.655 20.273 m +448.174 19.577 447.541 19.084 446.750 18.799 c +446.183 18.597 445.274 18.495 444.015 18.495 c +443.197 18.495 l +444.364 26.743 l +444.990 26.743 l +446.012 26.743 446.829 26.592 447.443 26.282 c +448.056 25.972 448.530 25.535 448.873 24.966 c +449.209 24.397 449.381 23.695 449.381 22.853 c +449.374 21.835 449.137 20.969 448.655 20.273 c +448.655 20.273 l +f +0.33 0.53 1.00 rg +[] 0 d +461.702 23.043 m +460.231 22.265 l +460.113 21.241 459.203 20.450 458.109 20.450 c +456.929 20.450 455.973 21.367 455.973 22.499 c +455.973 23.631 456.929 24.549 458.109 24.549 c +458.564 24.549 458.986 24.409 459.328 24.182 c +461.154 25.149 l +460.166 28.957 l +458.076 28.957 l +450.956 16.307 l +453.619 16.307 l +455.122 19.001 l +460.357 19.001 l +461.055 16.307 l +463.455 16.307 l +461.702 23.043 l +461.702 23.043 l +f +0.33 0.53 1.00 rg +[] 0 d +457.324 22.550 m +457.324 22.113 457.693 21.759 458.148 21.759 c +458.603 21.759 458.972 22.113 458.972 22.550 c +458.972 22.986 458.603 23.340 458.148 23.340 c +457.693 23.340 457.324 22.986 457.324 22.550 c +457.324 22.550 l +f +0.33 0.53 1.00 rg +[] 0 d +408.674 24.194 m +408.674 24.194 408.674 24.201 408.674 24.194 c +407.850 24.194 l +407.764 24.346 l +407.428 24.858 407.006 25.244 406.498 25.510 c +405.984 25.776 405.173 25.908 404.567 25.908 c +403.663 25.908 402.800 25.674 401.976 25.206 c +401.152 24.738 400.493 24.087 400.005 23.246 c +399.517 22.411 399.266 21.525 399.266 20.602 c +399.266 19.387 399.649 18.325 400.413 17.408 c +401.178 16.490 402.213 16.035 403.512 16.035 c +404.079 16.035 404.586 16.124 405.041 16.313 c +405.496 16.497 405.984 16.819 406.505 17.287 c +406.505 17.287 407.118 16.775 407.124 16.781 c +407.507 16.490 407.981 16.307 408.496 16.275 c +408.733 16.275 l +408.766 16.547 l +409.603 23.309 l +409.596 23.309 409.596 23.309 409.590 23.309 c +409.590 23.796 409.181 24.188 408.674 24.194 c +408.674 24.194 l +406.749 19.659 m +406.452 19.122 406.083 18.723 405.641 18.470 c +405.199 18.217 404.685 18.091 404.092 18.091 c +403.380 18.091 402.800 18.312 402.345 18.767 c +401.890 19.217 401.666 19.811 401.666 20.545 c +401.666 21.500 401.963 22.278 402.563 22.885 c +403.162 23.492 403.888 23.790 404.745 23.790 c +405.483 23.790 406.076 23.562 406.524 23.113 c +406.973 22.657 407.197 22.063 407.197 21.316 c +407.197 20.753 407.045 20.197 406.749 19.659 c +406.749 19.659 l +f +0.33 0.53 1.00 rg +[] 0 d +381.612 27.749 m +381.118 29.008 380.314 30.140 379.252 31.057 c +377.624 32.461 375.515 33.239 373.319 33.239 c +371.421 33.239 369.608 32.670 368.079 31.595 c +367.340 31.076 366.701 30.462 366.173 29.767 c +365.844 29.811 365.508 29.836 365.165 29.836 c +363.273 29.836 361.486 29.128 360.148 27.844 c +358.810 26.560 358.072 24.852 358.072 23.031 c +358.072 21.342 358.724 19.723 359.904 18.470 c +360.840 17.477 362.053 16.775 363.391 16.446 c +363.972 14.789 365.606 13.594 367.525 13.594 c +369.931 13.594 371.889 15.472 371.889 17.781 c +371.889 17.914 371.882 18.053 371.869 18.186 c +377.993 21.272 l +376.655 23.499 l +370.801 20.551 l +370.003 21.424 368.830 21.974 367.525 21.974 c +365.633 21.974 364.018 20.810 363.411 19.191 c +361.869 19.843 360.788 21.316 360.788 23.037 c +360.788 25.352 362.745 27.237 365.165 27.237 c +366.015 27.237 366.813 27.003 367.485 26.598 c +368.296 28.944 370.603 30.640 373.319 30.640 c +376.484 30.640 379.081 28.350 379.430 25.409 c +379.542 25.421 379.655 25.428 379.767 25.428 c +381.659 25.428 383.195 23.954 383.195 22.139 c +383.195 20.418 381.817 19.008 380.063 18.862 c +378.105 18.862 l +378.020 18.881 377.927 18.888 377.835 18.888 c +377.077 18.888 376.464 18.299 376.464 17.572 c +376.464 16.883 377.018 16.320 377.723 16.263 c +377.723 16.250 l +380.063 16.250 l +380.182 16.250 l +380.301 16.263 l +381.830 16.389 383.247 17.053 384.289 18.141 c +385.337 19.235 385.917 20.652 385.917 22.139 c +385.917 24.757 384.104 26.996 381.612 27.749 c +381.612 27.749 l +367.525 19.400 m +368.454 19.400 369.212 18.673 369.212 17.781 c +369.212 16.889 368.454 16.162 367.525 16.162 c +366.595 16.162 365.837 16.889 365.837 17.781 c +365.837 18.673 366.595 19.400 367.525 19.400 c +367.525 19.400 l +f +Q +Q +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.88 1126.08 57.60 -115.20 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +147.04 1109.75 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1112.63 Td +(25) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1111.680 m +168.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +151.78 1102.55 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1105.43 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1104.480 m +168.480 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.23 1095.35 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1098.23 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1097.280 m +168.480 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +141.58 1088.15 Td +(3.3v Out) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1091.03 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1090.080 m +168.480 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1059.35 Td +(P1.15) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1062.23 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1061.280 m +168.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1080.95 Td +(P0.31) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1083.83 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1082.880 m +168.480 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1102.55 Td +(P0.08) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1105.43 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1104.480 m +110.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1052.15 Td +(P1.13) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1055.03 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1054.080 m +168.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1073.75 Td +(P0.29) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1076.63 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1075.680 m +168.480 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1044.95 Td +(P1.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1047.83 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1046.880 m +168.480 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1066.55 Td +(P0.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1069.43 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1068.480 m +168.480 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1095.35 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1098.23 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1097.280 m +110.880 1097.280 l +S +0.72 w +0.63 0.00 0.00 RG +110.88 1111.68 m 110.88 1112.87 109.91 1113.84 108.72 1113.84 c +107.53 1113.84 106.56 1112.87 106.56 1111.68 c +106.56 1110.49 107.53 1109.52 108.72 1109.52 c +109.91 1109.52 110.88 1110.49 110.88 1111.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1109.75 Td +(P0.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1112.63 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1111.680 m +106.560 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1030.55 Td +(P0.09) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1033.43 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1032.480 m +168.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1037.75 Td +(P0.10) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1040.63 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1039.680 m +168.480 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1037.75 Td +(P1.04) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1040.63 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1039.680 m +110.880 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1088.15 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1091.03 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1090.080 m +110.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1080.95 Td +(P0.17) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1083.83 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1082.880 m +110.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1073.75 Td +(P0.20) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1076.63 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1075.680 m +110.880 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1066.55 Td +(P0.22) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1069.43 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1068.480 m +110.880 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1059.35 Td +(P0.24) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1062.23 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1061.280 m +110.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1052.15 Td +(P1.00) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1055.03 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1054.080 m +110.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1044.95 Td +(P0.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1047.83 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1046.880 m +110.880 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1030.55 Td +(P1.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1033.43 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1032.480 m +110.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +147.04 1116.95 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1119.83 Td +(26) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1118.880 m +168.480 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +180.000 1121.760 m +185.760 1116.000 l +180.000 1116.000 m +185.760 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1116.95 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1119.83 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1118.880 m +110.880 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +93.600 1121.760 m +99.360 1116.000 l +93.600 1116.000 m +99.360 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +135.38 1128.78 Td +(PRO_MICRO_NRF52840_26P) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +67.68 248.06 Td +(Switches) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 154.080 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +111.600 154.080 m +124.560 154.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 152.640 m +122.400 152.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.920 151.200 m +120.240 151.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +117.360 149.760 m +118.800 149.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +108.72 142.09 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 204.480 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +111.600 204.480 m +124.560 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 203.040 m +122.400 203.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.920 201.600 m +120.240 201.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +117.360 200.160 m +118.800 200.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +108.72 192.49 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +71.280 157.680 l +60.480 157.680 l +60.480 164.880 l +71.280 164.880 l +74.880 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +42.93 158.92 Td +(RBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +71.280 208.080 l +60.480 208.080 l +60.480 215.280 l +71.280 215.280 l +74.880 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +41.22 208.96 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 165.600 m +96.480 169.200 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 161.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 161.280 m +103.680 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +82.04 161.93 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 161.280 m +89.280 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +88.560 165.600 m +104.400 165.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +105.12 161.28 m 105.12 162.08 104.48 162.72 103.68 162.72 c +102.88 162.72 102.24 162.08 102.24 161.28 c +102.24 160.48 102.88 159.84 103.68 159.84 c +104.48 159.84 105.12 160.48 105.12 161.28 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +90.72 161.28 m 90.72 162.08 90.08 162.72 89.28 162.72 c +88.48 162.72 87.84 162.08 87.84 161.28 c +87.84 160.48 88.48 159.84 89.28 159.84 c +90.08 159.84 90.72 160.48 90.72 161.28 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +89.20 178.06 Td +(RS1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +89.20 171.69 Td +(434121043816) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 216.000 m +96.480 219.600 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 212.33 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 211.680 m +103.680 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +82.04 212.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 211.680 m +89.280 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +88.560 216.000 m +104.400 216.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +105.12 211.68 m 105.12 212.48 104.48 213.12 103.68 213.12 c +102.88 213.12 102.24 212.48 102.24 211.68 c +102.24 210.88 102.88 210.24 103.68 210.24 c +104.48 210.24 105.12 210.88 105.12 211.68 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +90.72 211.68 m 90.72 212.48 90.08 213.12 89.28 213.12 c +88.48 213.12 87.84 212.48 87.84 211.68 c +87.84 210.88 88.48 210.24 89.28 210.24 c +90.08 210.24 90.72 210.88 90.72 211.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +89.20 228.46 Td +(US1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +89.20 222.09 Td +(434121043816) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +125.280 617.040 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.800 617.040 m +131.760 617.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +120.960 615.600 m +129.600 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +123.120 614.160 m +127.440 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +124.560 612.720 m +126.000 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +115.92 604.33 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +103.68 631.44 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 108.85 608.42 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.880 602.640 m +110.880 617.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +100.04 619.01 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 624.240 m +103.680 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +118.08 619.01 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 624.240 m +118.080 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 108.85 630.06 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.880 638.640 m +110.880 631.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +108.000 641.520 m +113.760 635.760 l +108.000 635.760 m +113.760 641.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +112.32 624.24 m 112.32 625.04 111.68 625.68 110.88 625.68 c +110.08 625.68 109.44 625.04 109.44 624.24 c +109.44 623.44 110.08 622.80 110.88 622.80 c +111.68 622.80 112.32 623.44 112.32 624.24 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +110.880 622.800 m +110.880 617.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +95.72 648.44 Td +(U11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +95.72 641.89 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 617.040 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +90.000 617.040 m +102.960 617.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +92.160 615.600 m +100.800 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +94.320 614.160 m +98.640 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +95.760 612.720 m +97.200 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +87.12 605.05 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 570.240 m +146.880 577.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +128.76 570.43 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 601.920 m +146.880 588.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +145.440 599.760 m +145.440 591.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +144.000 597.600 m +144.000 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +142.560 596.160 m +142.560 594.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +123.48 592.03 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 596.160 m +233.280 609.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +234.720 598.320 m +234.720 606.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.160 600.480 m +236.160 604.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +237.600 601.920 m +237.600 603.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +237.96 599.23 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 545.040 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +219.600 545.040 m +232.560 545.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +221.760 543.600 m +230.400 543.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +223.920 542.160 m +228.240 542.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +225.360 540.720 m +226.800 540.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +216.72 533.05 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +229.680 591.840 l +240.480 591.840 l +240.480 584.640 l +229.680 584.640 l +226.080 588.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +242.43 585.29 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +150.480 555.840 l +139.680 555.840 l +139.680 563.040 l +150.480 563.040 l +154.080 559.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.96 556.28 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +150.480 548.640 l +139.680 548.640 l +139.680 555.840 l +150.480 555.840 l +154.080 552.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +120.42 549.37 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +229.680 584.640 l +240.480 584.640 l +240.480 577.440 l +229.680 577.440 l +226.080 581.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 578.24 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +229.680 577.440 l +240.480 577.440 l +240.480 570.240 l +229.680 570.240 l +226.080 573.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.60 571.04 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +229.680 570.240 l +240.480 570.240 l +240.480 563.040 l +229.680 563.040 l +226.080 566.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 563.84 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +229.680 563.040 l +240.480 563.040 l +240.480 555.840 l +229.680 555.840 l +226.080 559.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 556.64 Td +(MISO) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.28 609.84 57.60 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +165.96 606.24 m 165.96 606.84 165.48 607.32 164.88 607.32 c +164.28 607.32 163.80 606.84 163.80 606.24 c +163.80 605.64 164.28 605.16 164.88 605.16 c +165.48 605.16 165.96 605.64 165.96 606.24 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +201.67 549.29 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 552.89 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 552.240 m +218.880 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.49 556.49 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 560.09 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 559.440 m +218.880 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.49 563.69 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 567.29 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 566.640 m +218.880 566.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +202.76 570.89 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 574.49 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 573.840 m +218.880 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +202.76 578.09 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 581.69 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 581.040 m +218.880 581.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +189.67 585.29 Td +(NRESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 588.89 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 588.240 m +218.880 588.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +206.76 592.49 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 596.09 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 595.440 m +218.880 595.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +223.200 598.320 m +228.960 592.560 l +223.200 592.560 m +228.960 598.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +201.67 599.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 603.29 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 602.640 m +218.880 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 599.69 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +157.28 603.29 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 602.640 m +161.280 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 592.49 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 596.09 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 595.440 m +161.280 595.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 585.29 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 588.89 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 588.240 m +161.280 588.240 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 591.120 m +156.960 585.360 l +151.200 585.360 m +156.960 591.120 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 578.09 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 581.69 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 581.040 m +161.280 581.040 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 583.920 m +156.960 578.160 l +151.200 578.160 m +156.960 583.920 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 570.89 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 574.49 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 573.840 m +161.280 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 563.69 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 567.29 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 566.640 m +161.280 566.640 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 569.520 m +156.960 563.760 l +151.200 563.760 m +156.960 569.520 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 556.49 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 560.09 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 559.440 m +161.280 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 549.29 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 552.89 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 552.240 m +161.280 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +185.64 618.81 Td +(NICERF_LORA1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +185.64 612.33 Td +(LoRa1262-868) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +413.280 992.880 l +413.280 982.080 l +406.080 982.080 l +406.080 992.880 l +409.680 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 410.96 961.34 Tm +(P1.02) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +420.480 992.880 l +420.480 982.080 l +413.280 982.080 l +413.280 992.880 l +416.880 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 418.16 961.34 Tm +(P1.07) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +406.080 992.880 l +406.080 982.080 l +398.880 982.080 l +398.880 992.880 l +402.480 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 403.76 961.34 Tm +(P1.01) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 215.280 m +647.280 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +629.15 215.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 233.280 m +654.480 233.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 239.760 m +647.280 226.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +645.840 237.600 m +645.840 228.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +644.400 235.440 m +644.400 231.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +642.960 234.000 m +642.960 232.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 233.280 m +654.480 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +623.88 229.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 226.800 m +726.480 239.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 228.960 m +727.920 237.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 231.120 m +729.360 235.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 232.560 m +730.800 234.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +731.16 229.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 176.400 m +726.480 189.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 178.560 m +727.920 187.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 180.720 m +729.360 185.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 182.160 m +730.800 183.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +731.16 179.53 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +650.880 193.680 l +640.080 193.680 l +640.080 200.880 l +650.880 200.880 l +654.480 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +627.00 194.41 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +650.880 208.080 l +640.080 208.080 l +640.080 215.280 l +650.880 215.280 l +654.480 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +620.82 208.93 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +722.880 215.280 l +733.680 215.280 l +733.680 208.080 l +722.880 208.080 l +719.280 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 208.96 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +722.880 222.480 l +733.680 222.480 l +733.680 215.280 l +722.880 215.280 l +719.280 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 216.16 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +722.880 208.080 l +733.680 208.080 l +733.680 200.880 l +722.880 200.880 l +719.280 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +734.91 201.76 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +722.880 229.680 l +733.680 229.680 l +733.680 222.480 l +722.880 222.480 l +719.280 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 223.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +650.880 200.880 l +640.080 200.880 l +640.080 208.080 l +650.880 208.080 l +654.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +620.82 201.61 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.68 240.48 50.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +666.36 236.88 m 666.36 237.48 665.88 237.96 665.28 237.96 c +664.68 237.96 664.20 237.48 664.20 236.88 c +664.20 236.28 664.68 235.80 665.28 235.80 c +665.88 235.80 666.36 236.28 666.36 236.88 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 230.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 233.93 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 233.280 m +661.680 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 223.13 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 226.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 226.080 m +661.680 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 215.93 Td +(3.3V) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 219.53 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 218.880 m +661.680 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 208.73 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 212.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 211.680 m +661.680 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 201.53 Td +(DIO0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 205.13 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 204.480 m +661.680 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 194.33 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 197.93 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 197.280 m +661.680 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 187.13 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 190.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 190.080 m +661.680 190.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +651.600 192.960 m +657.360 187.200 l +651.600 187.200 m +657.360 192.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 179.93 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 183.53 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 182.880 m +661.680 182.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +651.600 185.760 m +657.360 180.000 l +651.600 180.000 m +657.360 185.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.87 179.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 183.53 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 182.880 m +712.080 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.14 187.13 Td +(DIO4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 190.73 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 190.080 m +712.080 190.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +716.400 192.960 m +722.160 187.200 l +716.400 187.200 m +722.160 192.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.14 194.33 Td +(DIO5) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 197.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 197.280 m +712.080 197.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +716.400 200.160 m +722.160 194.400 l +716.400 194.400 m +722.160 200.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +695.96 201.53 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 205.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 204.480 m +712.080 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +692.69 208.73 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 212.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 211.680 m +712.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +692.69 215.93 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 219.53 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 218.880 m +712.080 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +695.96 223.13 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 226.73 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 226.080 m +712.080 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.87 230.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 233.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 233.280 m +712.080 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +682.74 249.45 Td +(RA-2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +682.74 242.97 Td +(RA-02_C9900010926) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1082.880 m +564.480 1086.480 l +575.280 1086.480 l +575.280 1079.280 l +564.480 1079.280 l +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +577.22 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1039.680 m +366.480 1036.080 l +355.680 1036.080 l +355.680 1043.280 l +366.480 1043.280 l +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1039.680 m +370.080 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +340.78 1036.81 Td +(SDA) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1046.880 m +366.480 1043.280 l +355.680 1043.280 l +355.680 1050.480 l +366.480 1050.480 l +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1046.880 m +370.080 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +341.51 1044.01 Td +(SCL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 222.480 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 222.480 m +272.880 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +262.08 223.45 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 179.280 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.800 179.280 m +239.760 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +228.960 177.840 m +237.600 177.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +231.120 176.400 m +235.440 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +232.560 174.960 m +234.000 174.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +223.92 166.39 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 222.480 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 222.480 m +236.880 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +224.64 223.45 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 179.280 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +262.800 179.280 m +275.760 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +264.960 177.840 m +273.600 177.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 176.400 m +271.440 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 174.960 m +270.000 174.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +259.92 167.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +239.040 199.440 m +227.520 199.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 186.480 m +233.280 193.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 208.080 m +233.280 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +227.520 202.320 m +239.040 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 215.280 m +233.280 208.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 199.440 m +233.280 193.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +240.48 198.81 Td +(C2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +240.48 192.33 Td +(100uF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +275.040 199.440 m +263.520 199.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 186.480 m +269.280 193.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 208.080 m +269.280 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +263.520 202.320 m +275.040 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 215.280 m +269.280 208.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 199.440 m +269.280 193.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +276.48 198.81 Td +(C1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +276.48 192.33 Td +(100uF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +355.680 895.680 m +352.080 892.080 l +341.280 892.080 l +341.280 899.280 l +352.080 899.280 l +355.680 895.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +355.680 895.680 m +355.680 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +321.66 892.84 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +470.880 1115.280 l +481.680 1115.280 l +481.680 1108.080 l +470.880 1108.080 l +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +483.48 1108.74 Td +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1098.000 m +521.280 1110.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +522.720 1100.160 m +522.720 1108.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +524.160 1102.320 m +524.160 1106.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +525.600 1103.760 m +525.600 1105.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +514.080 1104.480 m +514.080 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +525.96 1101.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1075.680 m +478.080 1079.280 l +488.880 1079.280 l +488.880 1072.080 l +478.080 1072.080 l +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1075.680 m +474.480 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.10 1072.96 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1046.880 m +478.080 1050.480 l +488.880 1050.480 l +488.880 1043.280 l +478.080 1043.280 l +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1046.880 m +474.480 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.20 1044.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1068.480 m +478.080 1072.080 l +488.880 1072.080 l +488.880 1064.880 l +478.080 1064.880 l +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1068.480 m +474.480 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1065.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1061.280 m +478.080 1064.880 l +488.880 1064.880 l +488.880 1057.680 l +478.080 1057.680 l +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1061.280 m +474.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1058.56 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1054.080 m +478.080 1057.680 l +488.880 1057.680 l +488.880 1050.480 l +478.080 1050.480 l +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1054.080 m +474.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1051.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1093.680 m +521.280 1086.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +514.080 1090.080 m +514.080 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +522.00 1086.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1032.480 m +478.080 1036.080 l +488.880 1036.080 l +488.880 1028.880 l +478.080 1028.880 l +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1032.480 m +474.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.68 1029.76 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1039.680 m +478.080 1043.280 l +488.880 1043.280 l +488.880 1036.080 l +478.080 1036.080 l +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1039.680 m +474.480 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1036.96 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1068.480 m +366.480 1064.880 l +355.680 1064.880 l +355.680 1072.080 l +366.480 1072.080 l +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1068.480 m +370.080 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +332.05 1065.61 Td +(GPSTX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1075.680 m +366.480 1072.080 l +355.680 1072.080 l +355.680 1079.280 l +366.480 1079.280 l +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1075.680 m +370.080 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +331.32 1072.81 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1061.280 m +366.480 1057.680 l +355.680 1057.680 l +355.680 1064.880 l +366.480 1064.880 l +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1061.280 m +370.080 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +331.32 1058.41 Td +(GPSEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 1093.680 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 1100.160 m +373.680 1087.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 1098.000 m +372.240 1089.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 1095.840 m +370.800 1091.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 1094.400 m +369.360 1092.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1093.680 m +380.880 1093.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 1090.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1054.080 m +366.480 1050.480 l +355.680 1050.480 l +355.680 1057.680 l +366.480 1057.680 l +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1054.080 m +370.080 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +336.42 1051.36 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1097.280 m +478.080 1100.880 l +488.880 1100.880 l +488.880 1093.680 l +478.080 1093.680 l +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1097.280 m +474.480 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.33 1094.17 Td +(RBTN) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +557.28 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1111.680 m +560.880 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +565.92 1095.27 Td +(R_ADC_T0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +565.92 1088.79 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1046.880 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +554.400 1046.880 m +567.360 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +556.560 1045.440 m +565.200 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +558.720 1044.000 m +563.040 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.160 1042.560 m +561.600 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +551.52 1034.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +557.280 1115.280 l +557.280 1126.080 l +564.480 1126.080 l +564.480 1115.280 l +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 562.23 1126.29 Tm +(BATT) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +557.28 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1054.080 m +560.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +565.92 1066.47 Td +(R_ADC_B0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +565.92 1059.99 Td +(1.5M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +377.280 1100.880 l +366.480 1100.880 l +366.480 1108.080 l +377.280 1108.080 l +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +329.75 1101.76 Td +(SERIAL2TX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +377.280 1108.080 l +366.480 1108.080 l +366.480 1115.280 l +377.280 1115.280 l +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +329.03 1108.96 Td +(SERIAL2RX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +377.280 1028.880 l +366.480 1028.880 l +366.480 1036.080 l +377.280 1036.080 l +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.94 1029.61 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 438.480 m +737.280 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.00 431.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 369.360 m +622.080 356.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 367.200 m +620.640 358.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 365.040 m +619.200 360.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 363.600 m +617.760 362.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 359.53 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 383.760 m +622.080 370.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 381.600 m +620.640 372.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 379.440 m +619.200 375.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 378.000 m +617.760 376.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 373.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 398.160 m +622.080 385.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 396.000 m +620.640 387.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 393.840 m +619.200 389.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 392.400 m +617.760 390.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 388.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 448.560 m +622.080 435.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 446.400 m +620.640 437.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 444.240 m +619.200 439.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 442.800 m +617.760 441.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 438.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 435.600 m +737.280 448.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 437.760 m +738.720 446.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 439.920 m +740.160 444.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 441.360 m +741.600 442.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 438.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 385.200 m +737.280 398.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 387.360 m +738.720 396.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 389.520 m +740.160 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 390.960 m +741.600 392.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 388.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 370.800 m +737.280 383.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 372.960 m +738.720 381.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 375.120 m +740.160 379.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 376.560 m +741.600 378.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 373.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 355.680 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 355.680 m +736.560 355.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 354.240 m +734.400 354.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 352.800 m +732.240 352.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 351.360 m +730.800 351.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 342.97 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 360.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 363.53 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 362.880 m +643.680 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 367.85 Td +(ANT_2.4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 370.73 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 370.080 m +643.680 370.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 372.960 m +632.160 367.200 l +626.400 367.200 m +632.160 372.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 375.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 377.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 377.280 m +643.680 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 389.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 392.33 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 391.680 m +643.680 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 396.65 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 399.53 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 398.880 m +643.680 398.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 403.85 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 406.73 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 406.080 m +643.680 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 411.05 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 413.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 413.280 m +643.680 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 418.25 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 421.13 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 420.480 m +643.680 420.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 425.45 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 428.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 427.680 m +643.680 427.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 432.65 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 435.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 434.880 m +643.680 434.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 437.760 m +632.160 432.000 l +626.400 432.000 m +632.160 437.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 439.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 442.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 442.080 m +643.680 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 439.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 442.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 442.080 m +715.680 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 432.65 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 435.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 434.880 m +715.680 434.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 425.45 Td +(DIO7) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 428.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 427.680 m +715.680 427.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 430.560 m +732.960 424.800 l +727.200 424.800 m +732.960 430.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 418.25 Td +(DIO8) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 421.13 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 420.480 m +715.680 420.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 423.360 m +732.960 417.600 l +727.200 417.600 m +732.960 423.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 411.05 Td +(DIO9) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 413.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 413.280 m +715.680 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.42 403.85 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 406.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 406.080 m +715.680 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +704.79 396.65 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 399.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 398.880 m +715.680 398.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 401.760 m +732.960 396.000 l +727.200 396.000 m +732.960 401.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 389.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 392.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 391.680 m +715.680 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 375.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 377.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 377.280 m +715.680 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +686.59 367.85 Td +(ANT_900) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 370.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 370.080 m +715.680 370.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 372.960 m +732.960 367.200 l +727.200 367.200 m +732.960 372.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 360.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 363.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 362.880 m +715.680 362.880 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 449.28 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +675.33 458.49 Td +(E80-900M2213S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +675.33 452.01 Td +(E80-900M2213S) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +625.680 424.080 l +614.880 424.080 l +614.880 431.280 l +625.680 431.280 l +629.280 427.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 424.81 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +625.680 409.680 l +614.880 409.680 l +614.880 416.880 l +625.680 416.880 l +629.280 413.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 410.41 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +625.680 416.880 l +614.880 416.880 l +614.880 424.080 l +625.680 424.080 l +629.280 420.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 417.61 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +625.680 402.480 l +614.880 402.480 l +614.880 409.680 l +625.680 409.680 l +629.280 406.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 403.21 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +625.680 395.280 l +614.880 395.280 l +614.880 402.480 l +625.680 402.480 l +629.280 398.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 396.01 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +733.680 416.880 l +744.480 416.880 l +744.480 409.680 l +733.680 409.680 l +730.080 413.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.92 410.56 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +733.680 409.680 l +744.480 409.680 l +744.480 402.480 l +733.680 402.480 l +730.080 406.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +746.43 403.13 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 748.080 m +730.080 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 751.680 m +737.280 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 748.080 m +730.080 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +737.64 744.67 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +114.480 726.480 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +108.000 726.480 m +120.960 726.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +110.160 725.040 m +118.800 725.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +112.320 723.600 m +116.640 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 722.160 m +115.200 722.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.12 713.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.880 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.880 748.080 m +488.880 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +489.24 741.07 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 755.280 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 755.280 m +161.280 755.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +149.04 756.25 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 667.440 m +730.080 674.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 667.440 m +736.560 667.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 666.000 m +734.400 666.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 664.560 m +732.240 664.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 663.120 m +730.800 663.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 674.640 m +730.080 674.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 654.55 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +625.680 733.680 l +614.880 733.680 l +614.880 740.880 l +625.680 740.880 l +629.280 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 734.53 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +625.680 748.080 l +614.880 748.080 l +614.880 755.280 l +625.680 755.280 l +629.280 751.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +601.80 748.81 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +733.680 740.880 l +744.480 740.880 l +744.480 733.680 l +733.680 733.680 l +730.080 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 734.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +625.680 704.880 l +614.880 704.880 l +614.880 712.080 l +625.680 712.080 l +629.280 708.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 705.61 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +625.680 719.280 l +614.880 719.280 l +614.880 726.480 l +625.680 726.480 l +629.280 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 720.01 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +625.680 726.480 l +614.880 726.480 l +614.880 733.680 l +625.680 733.680 l +629.280 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 727.21 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +625.680 712.080 l +614.880 712.080 l +614.880 719.280 l +625.680 719.280 l +629.280 715.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 712.81 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +733.680 726.480 l +744.480 726.480 l +744.480 719.280 l +733.680 719.280 l +730.080 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.71 720.16 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +625.680 740.880 l +614.880 740.880 l +614.880 748.080 l +625.680 748.080 l +629.280 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 741.61 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 700.560 m +622.080 687.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 698.400 m +620.640 689.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 696.240 m +619.200 691.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 694.800 m +617.760 693.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 690.67 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 686.160 m +622.080 673.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 684.000 m +620.640 675.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 681.840 m +619.200 677.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 680.400 m +617.760 678.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 676.27 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 766.080 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +736.560 766.080 m +723.600 766.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 767.520 m +725.760 767.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.240 768.960 m +727.920 768.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 770.400 m +729.360 770.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 772.15 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 765.360 m +622.080 752.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 763.200 m +620.640 754.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 761.040 m +619.200 756.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 759.600 m +617.760 758.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 755.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 747.360 m +150.480 734.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.040 745.200 m +149.040 736.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +147.600 743.040 m +147.600 738.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.160 741.600 m +146.160 740.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +127.08 737.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 711.360 m +150.480 698.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.040 709.200 m +149.040 700.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +147.600 707.040 m +147.600 702.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.160 705.600 m +146.160 704.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +127.08 701.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 712.800 m +229.680 725.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +231.120 714.960 m +231.120 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +232.560 717.120 m +232.560 721.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +234.000 718.560 m +234.000 720.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +234.36 715.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 765.360 m +373.680 752.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 763.200 m +372.240 754.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 761.040 m +370.800 756.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 759.600 m +369.360 758.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 755.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 766.080 m +481.680 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.160 766.080 m +475.200 766.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +486.000 767.520 m +477.360 767.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +483.840 768.960 m +479.520 768.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +482.400 770.400 m +480.960 770.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 758.880 m +481.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +472.32 772.18 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 672.480 m +481.680 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +475.200 672.480 m +488.160 672.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +477.360 671.040 m +486.000 671.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +479.520 669.600 m +483.840 669.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +480.960 668.160 m +482.400 668.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 679.680 m +481.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +472.32 659.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 686.160 m +373.680 673.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 684.000 m +372.240 675.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 681.840 m +370.800 677.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 680.400 m +369.360 678.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 676.27 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 700.560 m +373.680 687.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 698.400 m +372.240 689.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 696.240 m +370.800 691.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 694.800 m +369.360 693.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 690.67 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +377.280 740.880 l +366.480 740.880 l +366.480 748.080 l +377.280 748.080 l +380.880 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.22 741.61 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +485.280 726.480 l +496.080 726.480 l +496.080 719.280 l +485.280 719.280 l +481.680 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.31 720.16 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +377.280 712.080 l +366.480 712.080 l +366.480 719.280 l +377.280 719.280 l +380.880 715.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +351.58 712.81 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +377.280 726.480 l +366.480 726.480 l +366.480 733.680 l +377.280 733.680 l +380.880 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.31 727.21 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +377.280 719.280 l +366.480 719.280 l +366.480 726.480 l +377.280 726.480 l +380.880 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.31 720.01 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +377.280 704.880 l +366.480 704.880 l +366.480 712.080 l +377.280 712.080 l +380.880 708.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +355.95 705.61 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +485.280 740.880 l +496.080 740.880 l +496.080 733.680 l +485.280 733.680 l +481.680 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.53 734.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +377.280 748.080 l +366.480 748.080 l +366.480 755.280 l +377.280 755.280 l +380.880 751.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +353.40 748.81 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +377.280 733.680 l +366.480 733.680 l +366.480 740.880 l +377.280 740.880 l +380.880 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.22 734.53 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +226.080 737.280 l +236.880 737.280 l +236.880 730.080 l +226.080 730.080 l +222.480 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.33 730.63 Td +(DIO3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +154.080 730.080 l +143.280 730.080 l +143.280 737.280 l +154.080 737.280 l +157.680 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.02 730.93 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +226.080 751.680 l +236.880 751.680 l +236.880 744.480 l +226.080 744.480 l +222.480 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 745.36 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +226.080 744.480 l +236.880 744.480 l +236.880 737.280 l +226.080 737.280 l +222.480 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.33 737.83 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +226.080 708.480 l +236.880 708.480 l +236.880 701.280 l +226.080 701.280 l +222.480 704.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 702.16 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +226.080 701.280 l +236.880 701.280 l +236.880 694.080 l +226.080 694.080 l +222.480 697.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 694.96 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +226.080 694.080 l +236.880 694.080 l +236.880 686.880 l +226.080 686.880 l +222.480 690.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 687.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +226.080 715.680 l +236.880 715.680 l +236.880 708.480 l +226.080 708.480 l +222.480 712.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.11 709.36 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +154.080 679.680 l +143.280 679.680 l +143.280 686.880 l +154.080 686.880 l +157.680 683.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +123.66 680.41 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +226.080 686.880 l +236.880 686.880 l +236.880 679.680 l +226.080 679.680 l +222.480 683.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.10 680.56 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.88 755.28 50.40 -79.20 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +169.56 751.68 m 169.56 752.28 169.08 752.76 168.48 752.76 c +167.88 752.76 167.40 752.28 167.40 751.68 c +167.40 751.08 167.88 750.60 168.48 750.60 c +169.08 750.60 169.56 751.08 169.56 751.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 745.13 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 748.73 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 748.080 m +164.880 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 737.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 741.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 740.880 m +164.880 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 730.73 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 734.33 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 733.680 m +164.880 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 723.53 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 727.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 726.480 m +164.880 726.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 729.360 m +160.560 723.600 l +154.800 723.600 m +160.560 729.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 716.33 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 719.93 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 719.280 m +164.880 719.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 722.160 m +160.560 716.400 l +154.800 716.400 m +160.560 722.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 709.13 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 712.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 712.080 m +164.880 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 701.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 705.53 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 704.880 m +164.880 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 694.73 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 698.33 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 697.680 m +164.880 697.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 700.560 m +160.560 694.800 l +154.800 694.800 m +160.560 700.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 687.53 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 691.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 690.480 m +164.880 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 680.33 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +157.24 683.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 683.280 m +164.880 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +194.79 680.33 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 683.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 683.280 m +215.280 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +195.89 687.53 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 691.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 690.480 m +215.280 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +195.89 694.73 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 698.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 697.680 m +215.280 697.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.16 701.93 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 705.53 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 704.880 m +215.280 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.16 709.13 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 712.73 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 712.080 m +215.280 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +198.07 716.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 719.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 719.280 m +215.280 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +203.16 723.53 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 727.13 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 726.480 m +215.280 726.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +219.600 729.360 m +225.360 723.600 l +219.600 723.600 m +225.360 729.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 730.73 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 734.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 733.680 m +215.280 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 737.93 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 741.53 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 740.880 m +215.280 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 745.13 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 748.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 748.080 m +215.280 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +185.75 764.49 Td +(E22-900MM22S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +185.75 758.01 Td +(E22-400MM22S) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 766.08 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 680.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 679.680 m +715.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 684.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 687.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 686.880 m +715.680 686.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 694.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 694.080 m +715.680 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 706.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 709.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 708.480 m +715.680 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 713.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 716.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 715.680 m +715.680 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.06 720.65 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 723.53 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 722.880 m +715.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.78 727.85 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 730.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 730.080 m +715.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 735.05 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 737.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 737.280 m +715.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 742.25 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 745.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 744.480 m +715.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 749.45 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 752.33 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 751.680 m +715.680 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 759.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 758.880 m +715.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 759.53 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 758.880 m +643.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 749.45 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 752.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 751.680 m +643.680 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 742.25 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 745.13 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 744.480 m +643.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 735.05 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 737.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 737.280 m +643.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 727.85 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 730.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 730.080 m +643.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 720.65 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 723.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 722.880 m +643.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 713.45 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 716.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 715.680 m +643.680 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 706.25 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 709.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 708.480 m +643.680 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 694.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 694.080 m +643.680 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 684.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 687.53 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 686.880 m +643.680 686.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 689.760 m +632.160 684.000 l +626.400 684.000 m +632.160 689.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 680.33 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 679.680 m +643.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +675.33 775.29 Td +(E22-900M30S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +675.33 768.81 Td +(E22-900M30S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 680.33 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 679.680 m +395.280 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 684.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 687.53 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 686.880 m +395.280 686.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +378.000 689.760 m +383.760 684.000 l +378.000 684.000 m +383.760 689.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 694.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 694.080 m +395.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 706.25 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 709.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 708.480 m +395.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 713.45 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 716.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 715.680 m +395.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 720.65 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 723.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 722.880 m +395.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 727.85 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 730.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 730.080 m +395.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 735.05 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 737.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 737.280 m +395.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 742.25 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 745.13 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 744.480 m +395.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 749.45 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 752.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 751.680 m +395.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 759.53 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 758.880 m +395.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 759.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 758.880 m +467.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 749.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 752.33 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 751.680 m +467.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.02 742.25 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 745.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 744.480 m +467.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +450.56 735.05 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 737.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 737.280 m +467.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +448.38 727.85 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 730.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 730.080 m +467.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +447.66 720.65 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 723.53 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 722.880 m +467.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 713.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 716.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 715.680 m +467.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 706.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 709.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 708.480 m +467.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 694.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 694.080 m +467.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 684.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 687.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 686.880 m +467.280 686.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 680.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 679.680 m +467.280 679.680 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 766.08 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +426.93 775.29 Td +(E22-900M22S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +426.93 768.81 Td +(E22-900M22S) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +139.68 899.28 50.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +144.36 895.68 m 144.36 896.28 143.88 896.76 143.28 896.76 c +142.68 896.76 142.20 896.28 142.20 895.68 c +142.20 895.08 142.68 894.60 143.28 894.60 c +143.88 894.60 144.36 895.08 144.36 895.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 889.13 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 892.73 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 892.080 m +139.680 892.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 894.960 m +135.360 889.200 l +129.600 889.200 m +135.360 894.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 881.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 885.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 884.880 m +139.680 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 874.73 Td +(3.3V) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 878.33 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 877.680 m +139.680 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 867.53 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 871.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 870.480 m +139.680 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 860.33 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 863.93 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 863.280 m +139.680 863.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 866.160 m +135.360 860.400 l +129.600 860.400 m +135.360 866.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 853.13 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 856.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 856.080 m +139.680 856.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 845.93 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 849.53 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 848.880 m +139.680 848.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 851.760 m +135.360 846.000 l +129.600 846.000 m +135.360 851.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 838.73 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 842.33 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 841.680 m +139.680 841.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 844.560 m +135.360 838.800 l +129.600 838.800 m +135.360 844.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.87 838.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 842.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 841.680 m +190.080 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +169.59 845.93 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 849.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 848.880 m +190.080 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +169.23 853.13 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 856.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 856.080 m +190.080 856.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +194.400 858.960 m +200.160 853.200 l +194.400 853.200 m +200.160 858.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +173.96 860.33 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 863.93 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 863.280 m +190.080 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +170.69 867.53 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 871.13 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 870.480 m +190.080 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +170.69 874.73 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 878.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 877.680 m +190.080 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +173.96 881.93 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 885.53 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 884.880 m +190.080 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.87 889.13 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 892.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 892.080 m +190.080 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +161.24 908.49 Td +(HT-RA62) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +161.24 902.01 Td +(RA-01SH) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +128.880 866.880 l +118.080 866.880 l +118.080 874.080 l +128.880 874.080 l +132.480 870.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +98.82 867.73 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +128.880 852.480 l +118.080 852.480 l +118.080 859.680 l +128.880 859.680 l +132.480 856.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.00 853.21 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +200.880 888.480 l +211.680 888.480 l +211.680 881.280 l +200.880 881.280 l +197.280 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.12 882.05 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +200.880 881.280 l +211.680 881.280 l +211.680 874.080 l +200.880 874.080 l +197.280 877.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.01 874.63 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +200.880 874.080 l +211.680 874.080 l +211.680 866.880 l +200.880 866.880 l +197.280 870.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.06 867.43 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +200.880 866.880 l +211.680 866.880 l +211.680 859.680 l +200.880 859.680 l +197.280 863.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +212.80 860.23 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +200.880 852.480 l +211.680 852.480 l +211.680 845.280 l +200.880 845.280 l +197.280 848.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.06 845.83 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 834.480 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.800 834.480 m +203.760 834.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +192.960 833.040 m +201.600 833.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +195.120 831.600 m +199.440 831.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +196.560 830.160 m +198.000 830.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +187.92 821.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +114.480 892.080 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +120.960 892.080 m +108.000 892.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.800 893.520 m +110.160 893.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +116.640 894.960 m +112.320 894.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.200 896.400 m +113.760 896.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 884.880 m +114.480 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.12 898.15 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +218.880 899.280 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +225.360 899.280 m +212.400 899.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +223.200 900.720 m +214.560 900.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +221.040 902.160 m +216.720 902.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +219.600 903.600 m +218.160 903.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +218.880 892.080 m +218.880 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +209.52 905.35 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 874.080 m +118.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 877.680 m +125.280 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +99.95 874.27 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 893.45 Td +(RF_SW) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 896.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 895.680 m +384.480 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 886.25 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 889.13 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 888.480 m +384.480 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 879.05 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 881.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 881.280 m +384.480 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 871.85 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 874.73 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 874.080 m +384.480 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 864.65 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 867.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 866.880 m +384.480 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 857.45 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 860.33 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 859.680 m +384.480 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 850.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 853.13 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 852.480 m +384.480 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 843.05 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 845.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 845.280 m +384.480 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +449.15 864.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 867.53 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 866.880 m +463.680 866.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +475.200 869.760 m +480.960 864.000 l +475.200 864.000 m +480.960 869.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +447.70 871.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 874.73 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 874.080 m +463.680 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +444.42 879.05 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 881.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 881.280 m +463.680 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +446.96 886.25 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 889.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 888.480 m +463.680 888.480 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +384.48 910.08 79.20 -79.20 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.08 845.28 m 460.08 851.24 455.24 856.08 449.28 856.08 c +443.32 856.08 438.48 851.24 438.48 845.28 c +438.48 839.32 443.32 834.48 449.28 834.48 c +455.24 834.48 460.08 839.32 460.08 845.28 c +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +434.88 859.68 28.80 -28.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +419.73 919.05 Td +(SEEED_WIO-SX1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +419.73 912.57 Td +(Seeed-wio-SX1262) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +481.680 884.880 l +492.480 884.880 l +492.480 877.680 l +481.680 877.680 l +478.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +493.86 878.23 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +366.480 863.280 l +355.680 863.280 l +355.680 870.480 l +366.480 870.480 l +370.080 866.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +336.42 864.13 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +366.480 884.880 l +355.680 884.880 l +355.680 892.080 l +366.480 892.080 l +370.080 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +335.10 885.86 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +366.480 877.680 l +355.680 877.680 l +355.680 884.880 l +366.480 884.880 l +370.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +335.15 878.66 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +366.480 856.080 l +355.680 856.080 l +355.680 863.280 l +366.480 863.280 l +370.080 859.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +345.15 856.85 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +366.480 870.480 l +355.680 870.480 l +355.680 877.680 l +366.480 877.680 l +370.080 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +339.30 871.46 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +481.680 892.080 l +492.480 892.080 l +492.480 884.880 l +481.680 884.880 l +478.080 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +493.88 885.43 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +485.280 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +485.280 867.600 m +485.280 880.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +486.720 869.760 m +486.720 878.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.160 871.920 m +488.160 876.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +489.600 873.360 m +489.600 874.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +489.96 870.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 858.960 m +362.880 846.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +361.440 856.800 m +361.440 848.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +360.000 854.640 m +360.000 850.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +358.560 853.200 m +358.560 851.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +339.48 849.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 841.680 m +362.880 848.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +344.75 841.93 Td +(VCC) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +92.88 740.88 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 98.05 717.86 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +100.080 712.080 m +100.080 726.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +89.24 728.45 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 733.680 m +92.880 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 728.45 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 733.680 m +107.280 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 98.05 739.50 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +100.080 748.080 m +100.080 740.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +97.200 750.960 m +102.960 745.200 l +97.200 745.200 m +102.960 750.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +101.52 733.68 m 101.52 734.48 100.88 735.12 100.08 735.12 c +99.28 735.12 98.64 734.48 98.64 733.68 c +98.64 732.88 99.28 732.24 100.08 732.24 c +100.88 732.24 101.52 732.88 101.52 733.68 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +100.080 732.240 m +100.080 726.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +84.92 757.88 Td +(U3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +84.92 751.33 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 726.480 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +79.200 726.480 m +92.160 726.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +81.360 725.040 m +90.000 725.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +83.520 723.600 m +87.840 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +84.960 722.160 m +86.400 722.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +76.32 713.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 571.680 m +737.280 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.00 564.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +733.680 578.880 l +744.480 578.880 l +744.480 571.680 l +733.680 571.680 l +730.080 575.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 572.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 593.280 m +730.080 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 596.880 m +737.280 589.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 593.280 m +730.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +737.64 589.87 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 514.080 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 514.080 m +736.560 514.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 512.640 m +734.400 512.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 511.200 m +732.240 511.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 509.760 m +730.800 509.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 521.280 m +730.080 521.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 501.19 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +625.680 578.880 l +614.880 578.880 l +614.880 586.080 l +625.680 586.080 l +629.280 582.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 579.73 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +625.680 593.280 l +614.880 593.280 l +614.880 600.480 l +625.680 600.480 l +629.280 596.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +601.80 594.01 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +733.680 586.080 l +744.480 586.080 l +744.480 578.880 l +733.680 578.880 l +730.080 582.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 579.43 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +625.680 550.080 l +614.880 550.080 l +614.880 557.280 l +625.680 557.280 l +629.280 553.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 550.81 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +625.680 564.480 l +614.880 564.480 l +614.880 571.680 l +625.680 571.680 l +629.280 568.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 565.21 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +625.680 571.680 l +614.880 571.680 l +614.880 578.880 l +625.680 578.880 l +629.280 575.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 572.41 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +625.680 557.280 l +614.880 557.280 l +614.880 564.480 l +625.680 564.480 l +629.280 560.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 558.01 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +625.680 586.080 l +614.880 586.080 l +614.880 593.280 l +625.680 593.280 l +629.280 589.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 586.81 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 545.760 m +622.080 532.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 543.600 m +620.640 534.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 541.440 m +619.200 537.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 540.000 m +617.760 538.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 535.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 531.360 m +622.080 518.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 529.200 m +620.640 520.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 527.040 m +619.200 522.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 525.600 m +617.760 524.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 521.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 611.280 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +736.560 611.280 m +723.600 611.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 612.720 m +725.760 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.240 614.160 m +727.920 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 615.600 m +729.360 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 617.35 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 610.560 m +622.080 597.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 608.400 m +620.640 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 606.240 m +619.200 601.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 604.800 m +617.760 603.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 600.67 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 611.28 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 522.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 525.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 524.880 m +715.680 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 529.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 532.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 532.080 m +715.680 532.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 537.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 539.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 539.280 m +715.680 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 551.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 554.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 553.680 m +715.680 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 558.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 561.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 560.880 m +715.680 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +707.69 565.85 Td +(IN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 568.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 568.080 m +715.680 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +684.79 573.05 Td +(T/R CTRL) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 575.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 575.280 m +715.680 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 580.25 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 583.13 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 582.480 m +715.680 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 587.45 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 590.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 589.680 m +715.680 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 594.65 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 597.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 596.880 m +715.680 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 601.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 604.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 604.080 m +715.680 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 601.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 604.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 604.080 m +643.680 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 594.65 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 597.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 596.880 m +643.680 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 587.45 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 590.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 589.680 m +643.680 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 580.25 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 583.13 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 582.480 m +643.680 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 573.05 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 575.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 575.280 m +643.680 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 565.85 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 568.73 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 568.080 m +643.680 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 558.65 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 561.53 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 560.880 m +643.680 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 551.45 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 554.33 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 553.680 m +643.680 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 537.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 539.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 539.280 m +643.680 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 529.85 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 532.73 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 532.080 m +643.680 532.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 534.960 m +632.160 529.200 l +626.400 529.200 m +632.160 534.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 522.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 525.53 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 524.880 m +643.680 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +672.35 613.83 Td +(E22P-868M30S) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 436.61 Td +(ANT_Lora) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 428.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 421.49 Td +(DIO9) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 414.29 Td +(DIO8) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 407.81 Td +(DIO7) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 400.61 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 392.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 385.49 Td +(3V3) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +423.36 436.61 Td +(ANT_2.4) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +434.88 429.41 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +440.64 422.21 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +437.04 414.29 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 407.81 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 400.61 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +428.40 392.69 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 385.49 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +384.48 445.68 68.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +389.16 442.08 m 389.16 442.68 388.68 443.16 388.08 443.16 c +387.48 443.16 387.00 442.68 387.00 442.08 c +387.00 441.48 387.48 441.00 388.08 441.00 c +388.68 441.00 389.16 441.48 389.16 442.08 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 439.13 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 438.480 m +384.480 438.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 441.360 m +380.160 435.600 l +374.400 435.600 m +380.160 441.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 431.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 431.280 m +384.480 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 424.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 424.080 m +384.480 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 417.53 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 416.880 m +384.480 416.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 419.760 m +380.160 414.000 l +374.400 414.000 m +380.160 419.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 410.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 409.680 m +384.480 409.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 412.560 m +380.160 406.800 l +374.400 406.800 m +380.160 412.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 403.13 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 402.480 m +384.480 402.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 405.360 m +380.160 399.600 l +374.400 399.600 m +380.160 405.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 395.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 395.280 m +384.480 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 388.73 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 388.080 m +384.480 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +454.32 388.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 388.080 m +452.880 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 395.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 395.280 m +452.880 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 403.13 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 402.480 m +452.880 402.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 410.33 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 409.680 m +452.880 409.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 417.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 416.880 m +452.880 416.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 424.73 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 424.080 m +452.880 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 431.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 431.280 m +452.880 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 439.13 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 438.480 m +452.880 438.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +457.200 441.360 m +462.960 435.600 l +457.200 435.600 m +462.960 441.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +388.08 453.21 Td +(WAVESHARE_LORA_CORE_1121) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +388.08 447.20 Td +(LoRa Core1121-XF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +373.680 427.680 l +362.880 427.680 l +362.880 420.480 l +373.680 420.480 l +377.280 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.16 420.93 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +463.680 384.480 l +474.480 384.480 l +474.480 391.680 l +463.680 391.680 l +460.080 388.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.55 385.64 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +463.680 391.680 l +474.480 391.680 l +474.480 398.880 l +463.680 398.880 l +460.080 395.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +476.44 392.12 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 391.680 m +370.080 384.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +355.90 384.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +463.680 427.680 l +474.480 427.680 l +474.480 420.480 l +463.680 420.480 l +460.080 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 421.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +463.680 420.480 l +474.480 420.480 l +474.480 413.280 l +463.680 413.280 l +460.080 416.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.71 414.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +463.680 406.080 l +474.480 406.080 l +474.480 398.880 l +463.680 398.880 l +460.080 402.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 399.04 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +463.680 413.280 l +474.480 413.280 l +474.480 406.080 l +463.680 406.080 l +460.080 409.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 406.24 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 437.760 m +370.080 424.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +368.640 435.600 m +368.640 426.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +367.200 433.440 m +367.200 429.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +365.760 432.000 m +365.760 430.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +346.68 427.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 424.800 m +467.280 437.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +468.720 426.960 m +468.720 435.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +470.160 429.120 m +470.160 433.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +471.600 430.560 m +471.600 432.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +471.96 427.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 401.760 m +370.080 388.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +368.640 399.600 m +368.640 390.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +367.200 397.440 m +367.200 393.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +365.760 396.000 m +365.760 394.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +346.68 391.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 563.760 m +380.880 550.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 561.600 m +379.440 552.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 559.440 m +378.000 555.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 558.000 m +376.560 556.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 553.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +384.480 582.480 l +373.680 582.480 l +373.680 589.680 l +384.480 589.680 l +388.080 586.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.06 583.25 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +456.480 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +456.480 586.800 m +456.480 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +457.920 588.960 m +457.920 597.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +459.360 591.120 m +459.360 595.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.800 592.560 m +460.800 594.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +461.16 589.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 606.960 m +380.880 594.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 604.800 m +379.440 596.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 602.640 m +378.000 598.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 601.200 m +376.560 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 597.07 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 599.760 m +380.880 586.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 597.600 m +379.440 588.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 595.440 m +378.000 591.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 594.000 m +376.560 592.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 589.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +452.880 575.280 l +463.680 575.280 l +463.680 568.080 l +452.880 568.080 l +449.280 571.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 568.24 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +452.880 568.080 l +463.680 568.080 l +463.680 560.880 l +452.880 560.880 l +449.280 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 561.04 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +452.880 582.480 l +463.680 582.480 l +463.680 575.280 l +452.880 575.280 l +449.280 578.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +464.91 576.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +452.880 589.680 l +463.680 589.680 l +463.680 582.480 l +452.880 582.480 l +449.280 586.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 583.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 553.680 m +380.880 546.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +366.70 546.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +452.880 553.680 l +463.680 553.680 l +463.680 560.880 l +452.880 560.880 l +449.280 557.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.64 554.12 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +452.880 546.480 l +463.680 546.480 l +463.680 553.680 l +452.880 553.680 l +449.280 550.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +464.75 547.64 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +384.480 568.080 l +373.680 568.080 l +373.680 560.880 l +384.480 560.880 l +388.080 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +358.96 561.33 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +452.880 604.080 l +463.680 604.080 l +463.680 596.880 l +452.880 596.880 l +449.280 600.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.65 597.65 Td +(LORA_ANT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +384.480 568.080 l +373.680 568.080 l +373.680 575.280 l +384.480 575.280 l +388.080 571.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.75 569.03 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 597.89 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 590.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 583.49 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 576.29 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 569.81 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 562.61 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 554.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 547.49 Td +(3V3) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +424.80 598.61 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +424.08 591.41 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +429.84 584.21 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +426.24 576.29 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 569.81 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 562.61 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +417.60 554.69 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 547.49 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 607.68 46.80 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +399.96 604.08 m 399.96 604.68 399.48 605.16 398.88 605.16 c +398.28 605.16 397.80 604.68 397.80 604.08 c +397.80 603.48 398.28 603.00 398.88 603.00 c +399.48 603.00 399.96 603.48 399.96 604.08 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 601.13 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 600.480 m +395.280 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 593.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 593.280 m +395.280 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 586.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 586.080 m +395.280 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 579.53 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 578.880 m +395.280 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 572.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 571.680 m +395.280 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 565.13 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 564.480 m +395.280 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 557.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 557.280 m +395.280 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 550.73 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 550.080 m +395.280 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +443.52 550.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 550.080 m +442.080 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 557.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 557.280 m +442.080 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 565.13 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 564.480 m +442.080 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 572.33 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 571.680 m +442.080 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 579.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 578.880 m +442.080 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 586.73 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 586.080 m +442.080 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 593.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 593.280 m +442.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 601.13 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 600.480 m +442.080 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +414.58 616.96 Td +(WAVESHARE_LORA_CORE_1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +414.58 610.89 Td +(LoRa Core1262-868M) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +172.08 447.84 79.20 -108.00 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +248.76 433.44 m 248.76 434.04 248.28 434.52 247.68 434.52 c +247.08 434.52 246.60 434.04 246.60 433.44 c +246.60 432.84 247.08 432.36 247.68 432.36 c +248.28 432.36 248.76 432.84 248.76 433.44 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 439.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 435.41 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 440.640 m +251.280 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.43 431.81 Td +(2.4G) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 428.21 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 433.440 m +251.280 433.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +255.600 436.320 m +261.360 430.560 l +255.600 430.560 m +261.360 436.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 424.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 421.01 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 426.240 m +251.280 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +223.15 406.61 Td +(LR_NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 403.01 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 408.240 m +251.280 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +223.15 399.41 Td +(LR_SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 395.81 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 401.040 m +251.280 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.88 392.21 Td +(LR_MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 388.61 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 393.840 m +251.280 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.88 385.01 Td +(LR_MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 381.41 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 386.640 m +251.280 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +218.79 377.81 Td +(LR_BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 374.21 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 379.440 m +251.280 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 370.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 367.01 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 372.240 m +251.280 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 232.69 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 236.29 330.82 Tm +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 332.640 m +229.680 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 225.49 341.13 Tm +(DIO8) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 229.09 330.82 Tm +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 332.640 m +222.480 339.840 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +219.600 335.520 m +225.360 329.760 l +219.600 329.760 m +225.360 335.520 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 218.29 341.13 Tm +(DIO9) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 221.89 330.82 Tm +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +215.280 332.640 m +215.280 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 211.09 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 214.69 330.82 Tm +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +208.080 332.640 m +208.080 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 203.89 341.13 Tm +(LR_nRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 207.49 330.82 Tm +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +200.880 332.640 m +200.880 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 196.69 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 200.29 330.82 Tm +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +193.680 332.640 m +193.680 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 370.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 367.01 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 372.240 m +172.080 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 377.81 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 374.21 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 379.440 m +172.080 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 385.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 381.41 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 386.640 m +172.080 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 392.21 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 388.61 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 393.840 m +172.080 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 399.41 Td +(VDD_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 395.81 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 401.040 m +172.080 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 406.61 Td +(VDD_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 403.01 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 408.240 m +172.080 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 424.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 421.01 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 426.240 m +172.080 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 431.81 Td +(SUBG_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 428.21 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 433.440 m +172.080 433.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +162.000 436.320 m +167.760 430.560 l +162.000 430.560 m +167.760 436.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 439.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 435.41 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 440.640 m +172.080 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +205.52 456.81 Td +(Seeed_WIO-LR1121) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.52 450.33 Td +(Seeed_WIO-LR1121) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 419.760 m +265.680 432.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 421.920 m +267.120 430.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 424.080 m +268.560 428.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 425.520 m +270.000 426.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +270.36 422.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 434.160 m +265.680 447.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 436.320 m +267.120 444.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 438.480 m +268.560 442.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 439.920 m +270.000 441.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +270.36 437.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 447.120 m +157.680 434.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +156.240 444.960 m +156.240 436.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.800 442.800 m +154.800 438.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +153.360 441.360 m +153.360 439.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +134.04 437.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 432.720 m +157.680 419.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +156.240 430.560 m +156.240 421.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.800 428.400 m +154.800 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +153.360 426.960 m +153.360 425.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +134.04 422.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 408.240 m +161.280 408.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 404.640 m +154.080 411.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.280 408.240 m +161.280 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +135.94 404.89 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 393.840 m +161.280 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 400.320 m +154.080 387.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +152.640 398.160 m +152.640 389.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +151.200 396.000 m +151.200 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.760 394.560 m +149.760 393.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.280 393.840 m +161.280 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +130.44 390.49 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 365.040 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +252.000 365.040 m +264.960 365.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +254.160 363.600 m +262.800 363.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +256.320 362.160 m +260.640 362.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +257.760 360.720 m +259.200 360.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +249.00 351.97 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +218.880 307.440 l +229.680 307.440 l +229.680 300.240 l +218.880 300.240 l +215.280 303.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +215.280 303.840 m +215.280 303.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +231.68 301.41 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +262.080 383.040 l +272.880 383.040 l +272.880 375.840 l +262.080 375.840 l +258.480 379.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.10 376.72 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +240.480 321.840 m +240.480 329.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +246.960 321.840 m +234.000 321.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +244.800 320.400 m +236.160 320.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +242.640 318.960 m +238.320 318.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +241.200 317.520 m +239.760 317.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +240.480 329.040 m +240.480 329.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +235.17 308.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +190.080 307.440 l +179.280 307.440 l +179.280 300.240 l +190.080 300.240 l +193.680 303.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +193.680 303.840 m +193.680 303.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +157.92 301.18 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +262.080 404.640 l +272.880 404.640 l +272.880 411.840 l +262.080 411.840 l +258.480 408.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.28 405.44 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +262.080 397.440 l +272.880 397.440 l +272.880 404.640 l +262.080 404.640 l +258.480 401.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +273.07 398.24 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +262.080 390.240 l +272.880 390.240 l +272.880 397.440 l +262.080 397.440 l +258.480 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.72 391.04 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +262.080 383.040 l +272.880 383.040 l +272.880 390.240 l +262.080 390.240 l +258.480 386.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.82 383.84 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +92.880 1028.880 l +82.080 1028.880 l +82.080 1036.080 l +92.880 1036.080 l +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +63.54 1029.61 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +92.880 1108.080 l +82.080 1108.080 l +82.080 1115.280 l +92.880 1115.280 l +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +44.63 1108.96 Td +(SERIAL2RX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +92.880 1100.880 l +82.080 1100.880 l +82.080 1108.080 l +92.880 1108.080 l +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +45.35 1101.76 Td +(SERIAL2TX) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +272.88 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1054.080 m +276.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +281.52 1066.47 Td +(R_ADC_B) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +281.52 1059.99 Td +(1.5M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +272.880 1115.280 l +272.880 1126.080 l +280.080 1126.080 l +280.080 1115.280 l +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 277.83 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1046.880 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 1046.880 m +282.960 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +272.160 1045.440 m +280.800 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +274.320 1044.000 m +278.640 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +275.760 1042.560 m +277.200 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +267.12 1034.89 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +272.88 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1111.680 m +276.480 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +281.52 1095.27 Td +(R_ADC_T) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +281.52 1088.79 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +193.680 1100.880 l +204.480 1100.880 l +204.480 1093.680 l +193.680 1093.680 l +190.080 1097.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1097.280 m +190.080 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.93 1094.17 Td +(RBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +82.080 1050.480 l +71.280 1050.480 l +71.280 1057.680 l +82.080 1057.680 l +85.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1054.080 m +85.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +52.02 1051.36 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +89.280 1093.680 m +96.480 1093.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +89.280 1100.160 m +89.280 1087.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +87.840 1098.000 m +87.840 1089.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +86.400 1095.840 m +86.400 1091.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +84.960 1094.400 m +84.960 1092.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1093.680 m +96.480 1093.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +65.88 1090.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +82.080 1057.680 l +71.280 1057.680 l +71.280 1064.880 l +82.080 1064.880 l +85.680 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1061.280 m +85.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +46.92 1058.41 Td +(GPSEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +82.080 1072.080 l +71.280 1072.080 l +71.280 1079.280 l +82.080 1079.280 l +85.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1075.680 m +85.680 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +46.92 1072.81 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +82.080 1064.880 l +71.280 1064.880 l +71.280 1072.080 l +82.080 1072.080 l +85.680 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1068.480 m +85.680 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +47.65 1065.61 Td +(GPSTX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +193.680 1043.280 l +204.480 1043.280 l +204.480 1036.080 l +193.680 1036.080 l +190.080 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1039.680 m +190.080 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1036.96 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +193.680 1036.080 l +204.480 1036.080 l +204.480 1028.880 l +193.680 1028.880 l +190.080 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1032.480 m +190.080 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +206.28 1029.76 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1090.080 m +229.680 1090.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1093.680 m +236.880 1086.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 1090.080 m +229.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +237.60 1086.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +193.680 1057.680 l +204.480 1057.680 l +204.480 1050.480 l +193.680 1050.480 l +190.080 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1054.080 m +190.080 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1051.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +193.680 1064.880 l +204.480 1064.880 l +204.480 1057.680 l +193.680 1057.680 l +190.080 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1061.280 m +190.080 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1058.56 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +193.680 1072.080 l +204.480 1072.080 l +204.480 1064.880 l +193.680 1064.880 l +190.080 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1068.480 m +190.080 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1065.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +193.680 1050.480 l +204.480 1050.480 l +204.480 1043.280 l +193.680 1043.280 l +190.080 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1046.880 m +190.080 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.80 1044.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +193.680 1079.280 l +204.480 1079.280 l +204.480 1072.080 l +193.680 1072.080 l +190.080 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1075.680 m +190.080 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.70 1072.96 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1104.480 m +229.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1098.000 m +236.880 1110.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +238.320 1100.160 m +238.320 1108.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +239.760 1102.320 m +239.760 1106.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +241.200 1103.760 m +241.200 1105.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 1104.480 m +229.680 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.56 1101.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +186.480 1115.280 l +197.280 1115.280 l +197.280 1108.080 l +186.480 1108.080 l +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +199.08 1108.74 Td +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +82.080 1043.280 l +71.280 1043.280 l +71.280 1050.480 l +82.080 1050.480 l +85.680 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1046.880 m +85.680 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +57.11 1044.01 Td +(SCL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +82.080 1036.080 l +71.280 1036.080 l +71.280 1043.280 l +82.080 1043.280 l +85.680 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1039.680 m +85.680 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +56.38 1036.81 Td +(SDA) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +280.080 1086.480 l +290.880 1086.480 l +290.880 1079.280 l +280.080 1079.280 l +276.480 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +292.82 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +658.080 1115.280 l +658.080 1126.080 l +665.280 1126.080 l +665.280 1115.280 l +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 663.03 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1046.880 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +655.200 1046.880 m +668.160 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +657.360 1045.440 m +666.000 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +659.520 1044.000 m +663.840 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +660.960 1042.560 m +662.400 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +652.32 1034.89 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +658.08 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1111.680 m +661.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +666.72 1095.27 Td +(R_ADC_T1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +666.72 1088.79 Td +(220k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +658.08 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1054.080 m +661.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +666.72 1066.47 Td +(R_ADC_B1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +666.72 1059.99 Td +(330k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +712.08 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1111.680 m +715.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +720.72 1095.27 Td +(R_ADC_T2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 1088.79 Td +(680k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +712.08 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1054.080 m +715.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +720.72 1066.47 Td +(R_ADC_B2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 1059.99 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +719.280 1086.480 l +730.080 1086.480 l +730.080 1079.280 l +719.280 1079.280 l +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +732.02 1079.93 Td +(ADC) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +640.08 1151.66 Td +(Alternative ADC resistors) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +712.080 1115.280 l +712.080 1126.080 l +719.280 1126.080 l +719.280 1115.280 l +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 717.03 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1046.880 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +709.200 1046.880 m +722.160 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +711.360 1045.440 m +720.000 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +713.520 1044.000 m +717.840 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +714.960 1042.560 m +716.400 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +706.32 1034.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +665.280 1086.480 l +676.080 1086.480 l +676.080 1079.280 l +665.280 1079.280 l +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +678.02 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +89.280 1079.280 l +78.480 1079.280 l +78.480 1086.480 l +89.280 1086.480 l +92.880 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +92.880 1082.880 m +92.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +58.86 1080.01 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +377.280 1082.880 m +373.680 1079.280 l +362.880 1079.280 l +362.880 1086.480 l +373.680 1086.480 l +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 1082.880 m +377.280 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +343.26 1080.01 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +218.88 248.06 Td +(Bulk Capacitors) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +154.080 686.880 l +143.280 686.880 l +143.280 694.080 l +154.080 694.080 l +157.680 690.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.34 687.64 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +485.280 733.680 l +496.080 733.680 l +496.080 726.480 l +485.280 726.480 l +481.680 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.53 727.03 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +733.680 733.680 l +744.480 733.680 l +744.480 726.480 l +733.680 726.480 l +730.080 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 727.03 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +366.48 820.46 Td +(NB// Ant pin is not connected, ) Tj +T* (except on non-ipex version) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +150.48 289.82 Td +(NB// Ant pin is not connected, ) Tj +T* (except on non-ipex version) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +157.68 665.66 Td +(NB// Non-TCXO!) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +114.48 809.66 Td +(NB// RA-01SH is Non-TCXO!) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +632.88 161.66 Td +(NB// SX1276 - non-preferred!) Tj +ET +2 J +0 j +72 M +0.72 w +0.00 G +[] 0 d +35.28 476.64 777.60 -208.80 re +S +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +46.08 459.02 Td +(LR1121 Modules) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +384.480 575.280 l +373.680 575.280 l +373.680 582.480 l +384.480 582.480 l +388.080 578.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.75 576.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 863.280 m +730.080 856.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +730.44 856.27 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +726.480 870.480 l +737.280 870.480 l +737.280 863.280 l +726.480 863.280 l +722.880 866.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.72 863.93 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +625.680 848.880 l +614.880 848.880 l +614.880 856.080 l +625.680 856.080 l +629.280 852.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.95 849.54 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 869.760 m +622.080 856.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 867.600 m +620.640 858.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 865.440 m +619.200 861.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 864.000 m +617.760 862.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 859.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 884.880 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 878.400 m +730.080 891.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +731.520 880.560 m +731.520 889.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.960 882.720 m +732.960 887.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 884.160 m +734.400 885.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 884.880 m +722.880 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +734.76 881.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.880 809.280 m +722.880 816.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +716.400 809.280 m +729.360 809.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +718.560 807.840 m +727.200 807.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +720.720 806.400 m +725.040 806.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.160 804.960 m +723.600 804.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 816.480 m +722.880 816.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +713.52 797.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +625.680 841.680 l +614.880 841.680 l +614.880 848.880 l +625.680 848.880 l +629.280 845.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +600.16 842.12 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +625.680 834.480 l +614.880 834.480 l +614.880 841.680 l +625.680 841.680 l +629.280 838.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +593.11 834.92 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +625.680 834.480 l +614.880 834.480 l +614.880 827.280 l +625.680 827.280 l +629.280 830.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +593.65 828.45 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 899.280 m +622.080 906.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +602.58 899.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +625.680 892.080 l +614.880 892.080 l +614.880 899.280 l +625.680 899.280 l +629.280 895.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 892.81 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +625.680 884.880 l +614.880 884.880 l +614.880 892.080 l +625.680 892.080 l +629.280 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 885.61 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +625.680 877.680 l +614.880 877.680 l +614.880 870.480 l +625.680 870.480 l +629.280 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 870.64 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +625.680 884.880 l +614.880 884.880 l +614.880 877.680 l +625.680 877.680 l +629.280 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 877.84 Td +(MOSI) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +636.48 910.08 79.20 -86.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 899.93 Td +(VDD) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 903.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 902.880 m +636.480 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 892.73 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 896.33 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 895.680 m +636.480 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 885.53 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 889.13 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 888.480 m +636.480 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 878.33 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 881.93 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 881.280 m +636.480 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 871.13 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 874.73 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 874.080 m +636.480 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 860.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 863.93 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 863.280 m +636.480 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 850.25 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 853.13 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 852.480 m +636.480 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 843.05 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 845.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 845.280 m +636.480 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 835.85 Td +(Busy) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 838.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 838.080 m +636.480 838.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 828.65 Td +(NRst) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +629.56 831.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 830.880 m +636.480 830.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +703.70 900.65 Td +(Ant) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +715.32 903.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 902.880 m +715.680 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.98 889.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +715.32 892.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 892.080 m +715.680 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 881.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 885.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 884.880 m +715.680 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 874.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 878.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 877.680 m +715.680 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +679.19 863.93 Td +(TX_RX_EN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 867.53 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 866.880 m +715.680 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +685.01 856.73 Td +(VDD_SW) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 860.33 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 859.680 m +715.680 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 845.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 849.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 848.880 m +715.680 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 838.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 842.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 841.680 m +715.680 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 832.97 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 835.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 834.480 m +715.680 834.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 825.77 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 827.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 827.280 m +715.680 827.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 665.41 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 663.25 814.66 Tm +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +665.280 816.480 m +665.280 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 672.61 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 670.45 814.66 Tm +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +672.480 816.480 m +672.480 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 679.81 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 677.65 814.66 Tm +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +679.680 816.480 m +679.680 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 687.01 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 684.85 814.66 Tm +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +686.880 816.480 m +686.880 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +672.16 919.36 Td +(ELECROW_LR1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +672.16 913.29 Td +(LR1262 Transceiver) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +751.680 917.280 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +745.200 917.280 m +758.160 917.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +747.360 915.840 m +756.000 915.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +749.520 914.400 m +753.840 914.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +750.960 912.960 m +752.400 912.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +742.32 904.57 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +758.88 931.68 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 764.05 908.66 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +766.080 902.880 m +766.080 917.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +755.24 919.25 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +751.680 924.480 m +758.880 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +773.28 919.25 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +780.480 924.480 m +773.280 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 764.05 930.30 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +766.080 938.880 m +766.080 931.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +763.200 941.760 m +768.960 936.000 l +763.200 936.000 m +768.960 941.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +767.52 924.48 m 767.52 925.28 766.88 925.92 766.08 925.92 c +765.28 925.92 764.64 925.28 764.64 924.48 c +764.64 923.68 765.28 923.04 766.08 923.04 c +766.88 923.04 767.52 923.68 767.52 924.48 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +766.080 923.040 m +766.080 917.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +750.92 948.68 Td +(U4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +750.92 942.13 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +780.480 917.280 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +774.000 917.280 m +786.960 917.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +776.160 915.840 m +784.800 915.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +778.320 914.400 m +782.640 914.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +779.760 912.960 m +781.200 912.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +771.12 904.57 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +110.880 602.640 m +154.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +110.880 602.640 m +154.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 233.280 m +654.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 233.280 m +654.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 895.680 m +355.680 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 895.680 m +355.680 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1068.480 m +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1068.480 m +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1061.280 m +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1061.280 m +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1046.880 m +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1046.880 m +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1054.080 m +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1054.080 m +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1039.680 m +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1039.680 m +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1075.680 m +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1075.680 m +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1032.480 m +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1032.480 m +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1097.280 m +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1097.280 m +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1082.880 m +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1082.880 m +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1039.680 m +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1039.680 m +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1046.880 m +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1046.880 m +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1054.080 m +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1054.080 m +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1061.280 m +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1061.280 m +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1068.480 m +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1068.480 m +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1075.680 m +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1075.680 m +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1093.680 m +380.880 1090.080 l +S +380.880 1097.280 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1093.680 m +380.880 1090.080 l +S +380.880 1097.280 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 748.080 m +730.080 751.680 l +S +730.080 748.080 m +730.080 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 748.080 m +730.080 751.680 l +S +730.080 748.080 m +730.080 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 758.880 m +481.680 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 758.880 m +481.680 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 712.080 m +100.080 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 712.080 m +100.080 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 679.680 m +730.080 674.640 l +S +730.080 715.680 m +730.080 708.480 l +S +730.080 694.080 m +730.080 708.480 l +S +730.080 686.880 m +730.080 694.080 l +S +730.080 679.680 m +730.080 686.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 679.680 m +730.080 674.640 l +S +730.080 715.680 m +730.080 708.480 l +S +730.080 694.080 m +730.080 708.480 l +S +730.080 686.880 m +730.080 694.080 l +S +730.080 679.680 m +730.080 686.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 679.680 m +481.680 686.880 l +S +481.680 694.080 m +481.680 686.880 l +S +481.680 694.080 m +481.680 708.480 l +S +481.680 715.680 m +481.680 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 679.680 m +481.680 686.880 l +S +481.680 694.080 m +481.680 686.880 l +S +481.680 694.080 m +481.680 708.480 l +S +481.680 715.680 m +481.680 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 884.880 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 884.880 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 892.080 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 892.080 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 589.680 m +730.080 593.280 l +S +730.080 593.280 m +730.080 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 589.680 m +730.080 593.280 l +S +730.080 593.280 m +730.080 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 524.880 m +730.080 532.080 l +S +730.080 532.080 m +730.080 539.280 l +S +730.080 539.280 m +730.080 553.680 l +S +730.080 560.880 m +730.080 553.680 l +S +730.080 524.880 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 524.880 m +730.080 532.080 l +S +730.080 532.080 m +730.080 539.280 l +S +730.080 539.280 m +730.080 553.680 l +S +730.080 560.880 m +730.080 553.680 l +S +730.080 524.880 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +215.280 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +215.280 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +200.880 303.840 l +S +200.880 303.840 m +200.880 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +200.880 303.840 l +S +200.880 303.840 m +200.880 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 401.040 m +161.280 401.040 l +S +161.280 401.040 m +161.280 408.240 l +S +161.280 408.240 m +164.880 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 401.040 m +161.280 401.040 l +S +161.280 401.040 m +161.280 408.240 l +S +161.280 408.240 m +164.880 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +161.280 386.640 m +161.280 393.840 l +S +161.280 393.840 m +164.880 393.840 l +S +161.280 379.440 m +161.280 386.640 l +S +164.880 386.640 m +161.280 386.640 l +S +164.880 372.240 m +161.280 372.240 l +S +161.280 372.240 m +161.280 379.440 l +S +164.880 379.440 m +161.280 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +161.280 386.640 m +161.280 393.840 l +S +161.280 393.840 m +164.880 393.840 l +S +161.280 379.440 m +161.280 386.640 l +S +164.880 386.640 m +161.280 386.640 l +S +164.880 372.240 m +161.280 372.240 l +S +161.280 372.240 m +161.280 379.440 l +S +164.880 379.440 m +161.280 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1090.080 m +96.480 1093.680 l +S +96.480 1093.680 m +96.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1090.080 m +96.480 1093.680 l +S +96.480 1093.680 m +96.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +96.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +96.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +96.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +96.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +96.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +96.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +96.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +96.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +96.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +96.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +96.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +96.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +182.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +182.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +182.880 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +182.880 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +182.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +182.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +182.880 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +182.880 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +182.880 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +182.880 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +182.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +182.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +182.880 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +182.880 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +182.880 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +182.880 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +182.880 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +182.880 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1104.480 m +182.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1104.480 m +182.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1090.080 m +182.880 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1090.080 m +182.880 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +96.480 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +96.480 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1082.880 m +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1082.880 m +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 841.680 m +722.880 848.880 l +S +722.880 834.480 m +722.880 841.680 l +S +722.880 827.280 m +722.880 834.480 l +S +722.880 827.280 m +722.880 816.480 l +S +722.880 816.480 m +686.880 816.480 l +S +686.880 816.480 m +679.680 816.480 l +S +679.680 816.480 m +672.480 816.480 l +S +672.480 816.480 m +665.280 816.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 841.680 m +722.880 848.880 l +S +722.880 834.480 m +722.880 841.680 l +S +722.880 827.280 m +722.880 834.480 l +S +722.880 827.280 m +722.880 816.480 l +S +722.880 816.480 m +686.880 816.480 l +S +686.880 816.480 m +679.680 816.480 l +S +679.680 816.480 m +672.480 816.480 l +S +672.480 816.480 m +665.280 816.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 884.880 m +722.880 892.080 l +S +722.880 877.680 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 884.880 m +722.880 892.080 l +S +722.880 877.680 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +766.080 902.880 m +722.880 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +766.080 902.880 m +722.880 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 329.040 m +229.680 332.640 l +S +193.680 332.640 m +193.680 329.040 l +S +193.680 329.040 m +208.080 329.040 l +S +208.080 332.640 m +208.080 329.040 l +S +208.080 329.040 m +229.680 329.040 l +S +240.480 329.040 m +229.680 329.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 329.040 m +229.680 332.640 l +S +193.680 332.640 m +193.680 329.040 l +S +193.680 329.040 m +208.080 329.040 l +S +208.080 332.640 m +208.080 329.040 l +S +208.080 329.040 m +229.680 329.040 l +S +240.480 329.040 m +229.680 329.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +420.480 222.480 l +409.680 222.480 l +409.680 229.680 l +420.480 229.680 l +424.080 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +365.70 223.79 Td +(E_INK_BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +420.480 215.280 l +409.680 215.280 l +409.680 222.480 l +420.480 222.480 l +424.080 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +366.48 216.59 Td +(E_INK_NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +420.480 208.080 l +409.680 208.080 l +409.680 215.280 l +420.480 215.280 l +424.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +370.08 209.39 Td +(E_INK_D/C) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +420.480 200.880 l +409.680 200.880 l +409.680 208.080 l +420.480 208.080 l +424.080 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +373.68 202.19 Td +(E_INK_CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +420.480 193.680 l +409.680 193.680 l +409.680 200.880 l +420.480 200.880 l +424.080 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +391.68 194.99 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +420.480 186.480 l +409.680 186.480 l +409.680 193.680 l +420.480 193.680 l +424.080 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +388.08 187.79 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +413.280 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +413.280 172.080 m +413.280 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +420.480 175.680 m +420.480 175.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +398.88 173.39 Td +(3V3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 189.360 m +416.880 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +415.440 187.200 m +415.440 178.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +414.000 185.040 m +414.000 180.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +412.560 183.600 m +412.560 182.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +391.68 180.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +442.080 215.280 l +452.880 215.280 l +452.880 208.080 l +442.080 208.080 l +438.480 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 209.39 Td +(P1.02) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +442.080 208.080 l +452.880 208.080 l +452.880 200.880 l +442.080 200.880 l +438.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 202.19 Td +(P1.07) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +442.080 222.480 l +452.880 222.480 l +452.880 215.280 l +442.080 215.280 l +438.480 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 216.59 Td +(P1.01) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +442.080 229.680 l +452.880 229.680 l +452.880 222.480 l +442.080 222.480 l +438.480 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +456.48 223.79 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 226.080 m +434.880 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 226.080 m +427.680 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 226.080 m +431.280 228.240 l +434.880 226.080 l +431.280 223.920 l +427.680 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 218.880 m +434.880 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 218.880 m +427.680 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 218.880 m +431.280 221.040 l +434.880 218.880 l +431.280 216.720 l +427.680 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 211.680 m +434.880 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 211.680 m +427.680 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 211.680 m +431.280 213.840 l +434.880 211.680 l +431.280 209.520 l +427.680 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 204.480 m +434.880 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 204.480 m +427.680 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 204.480 m +431.280 206.640 l +434.880 204.480 l +431.280 202.320 l +427.680 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 197.280 m +434.880 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 197.280 m +427.680 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 197.280 m +431.280 199.440 l +434.880 197.280 l +431.280 195.120 l +427.680 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 190.080 m +434.880 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 190.080 m +427.680 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 190.080 m +431.280 192.240 l +434.880 190.080 l +431.280 187.920 l +427.680 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 182.880 m +434.880 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 182.880 m +427.680 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 182.880 m +431.280 185.040 l +434.880 182.880 l +431.280 180.720 l +427.680 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 175.680 m +434.880 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 175.680 m +427.680 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 175.680 m +431.280 177.840 l +434.880 175.680 l +431.280 173.520 l +427.680 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 179.280 m +449.280 172.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +442.080 175.680 m +442.080 175.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +452.88 173.39 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +445.680 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +445.680 189.360 m +445.680 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +447.120 187.200 m +447.120 178.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +448.560 185.040 m +448.560 180.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +450.000 183.600 m +450.000 182.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +452.74 180.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +442.080 200.880 l +452.880 200.880 l +452.880 193.680 l +442.080 193.680 l +438.480 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.42 194.99 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +442.080 193.680 l +452.880 193.680 l +452.880 186.480 l +442.080 186.480 l +438.480 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +456.36 188.47 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +395.28 249.32 Td +(E-Ink Connections) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 1126.08 57.60 -115.20 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +431.44 1109.75 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1112.63 Td +(25) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1111.680 m +452.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +436.18 1102.55 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1105.43 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1104.480 m +452.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +437.63 1095.35 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1098.23 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1097.280 m +452.880 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +425.98 1088.15 Td +(3.3v Out) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1091.03 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1090.080 m +452.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1059.35 Td +(P1.15) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1062.23 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1061.280 m +452.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1080.95 Td +(P0.31) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1083.83 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1082.880 m +452.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1102.55 Td +(P0.08) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1105.43 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1104.480 m +395.280 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1052.15 Td +(P1.13) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1055.03 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1054.080 m +452.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1073.75 Td +(P0.29) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1076.63 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1075.680 m +452.880 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1044.95 Td +(P1.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1047.83 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1046.880 m +452.880 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1066.55 Td +(P0.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1069.43 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1068.480 m +452.880 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1095.35 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1098.23 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1097.280 m +395.280 1097.280 l +S +0.72 w +0.63 0.00 0.00 RG +395.28 1111.68 m 395.28 1112.87 394.31 1113.84 393.12 1113.84 c +391.93 1113.84 390.96 1112.87 390.96 1111.68 c +390.96 1110.49 391.93 1109.52 393.12 1109.52 c +394.31 1109.52 395.28 1110.49 395.28 1111.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1109.75 Td +(P0.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1112.63 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1111.680 m +390.960 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1030.55 Td +(P0.09) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1033.43 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1032.480 m +452.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1037.75 Td +(P0.10) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1040.63 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1039.680 m +452.880 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1037.75 Td +(P1.04) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1040.63 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1039.680 m +395.280 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1088.15 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1091.03 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1090.080 m +395.280 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1080.95 Td +(P0.17) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1083.83 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1082.880 m +395.280 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1073.75 Td +(P0.20) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1076.63 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1075.680 m +395.280 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1066.55 Td +(P0.22) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1069.43 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1068.480 m +395.280 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1059.35 Td +(P0.24) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1062.23 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1061.280 m +395.280 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1052.15 Td +(P1.00) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1055.03 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1054.080 m +395.280 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1044.95 Td +(P0.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1047.83 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1046.880 m +395.280 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1030.55 Td +(P1.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1033.43 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1032.480 m +395.280 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 403.33 1011.96 Tm +(P1.01) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 400.45 998.20 Tm +(27) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +402.480 996.480 m +402.480 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 410.53 1011.96 Tm +(P1.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 407.65 998.20 Tm +(28) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +409.680 996.480 m +409.680 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 417.73 1011.96 Tm +(P1.07) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 414.85 998.20 Tm +(29) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +416.880 996.480 m +416.880 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +431.44 1116.95 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1119.83 Td +(26) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1118.880 m +452.880 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +464.400 1121.760 m +470.160 1116.000 l +464.400 1116.000 m +470.160 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1116.95 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1119.83 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1118.880 m +395.280 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +378.000 1121.760 m +383.760 1116.000 l +378.000 1116.000 m +383.760 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +419.78 1128.78 Td +(PRO_MICRO_NRF52840_29P) Tj +ET +q +1 0 0 1 762.48 1112.40 cm +1.0000 0.0000 0.0000 1.0000 0 0 cm +1 0 0 1 0.00 0.00 cm +72.00 0 0 72.00 0 0 cm +/I0 Do +Q +q +0.16 0.16 0.23 rg +[] 0 d +348.612 35.359 m +470.980 35.359 l +470.980 11.520 l +348.612 11.520 l +348.612 35.359 l +f +0.40 0.92 0.58 rg +[] 0 d +381.817 11.520 m +351.787 11.520 l +349.935 11.520 348.480 12.977 348.480 14.831 c +348.480 32.048 l +348.480 33.902 349.935 35.359 351.787 35.359 c +381.817 35.359 l +381.817 11.520 l +f +0.16 0.16 0.23 rg +[] 0 d +368.720 30.591 m +368.720 30.591 l +368.588 30.591 l +368.588 30.591 l +368.588 30.591 l +368.456 30.591 l +368.456 30.458 l +368.456 30.458 l +368.456 30.458 l +368.323 30.458 l +368.323 30.326 368.323 30.326 368.323 30.326 c +368.191 30.326 l +368.191 30.326 l +368.191 30.326 368.191 30.326 368.191 30.326 c +368.191 30.326 l +368.059 30.194 l +368.059 30.194 l +368.059 30.194 368.059 30.194 368.059 30.194 c +368.059 30.194 l +368.059 30.061 l +368.059 30.061 368.059 30.061 367.927 30.061 c +367.927 30.061 l +367.927 29.929 l +367.927 29.929 l +367.927 29.929 367.927 29.929 367.927 29.929 c +367.794 29.796 l +367.794 29.796 l +367.794 29.664 l +367.794 29.664 367.794 29.664 367.662 29.664 c +367.662 29.664 l +367.662 29.664 l +367.662 29.531 367.662 29.531 367.662 29.531 c +367.662 29.531 l +367.662 29.531 l +367.530 29.531 l +367.530 29.399 367.530 29.399 367.530 29.399 c +367.530 29.399 l +367.397 29.266 l +367.397 29.266 l +367.397 29.134 367.397 29.134 367.397 29.266 c +367.397 29.134 l +367.397 29.134 l +367.397 29.134 367.397 29.134 367.265 29.134 c +367.265 29.002 l +367.265 29.002 l +367.265 29.002 l +367.133 28.869 l +367.133 28.869 l +367.133 28.737 l +367.133 28.737 367.133 28.737 367.133 28.737 c +367.001 28.737 l +367.001 28.604 l +367.001 28.604 l +367.001 28.604 367.001 28.604 367.001 28.604 c +366.868 28.472 l +366.868 28.472 l +366.868 28.339 l +366.868 28.339 l +366.868 28.339 366.868 28.339 366.736 28.339 c +366.736 28.339 l +366.736 28.207 366.736 28.207 366.736 28.207 c +366.736 28.207 l +366.736 28.207 l +366.736 28.075 l +366.736 28.075 366.736 28.075 366.604 28.075 c +366.604 28.075 l +366.604 27.942 l +366.471 27.942 l +366.471 27.810 l +366.471 27.810 366.471 27.810 366.471 27.810 c +366.471 27.810 l +366.471 27.810 366.471 27.810 366.471 27.810 c +366.339 27.677 l +366.339 27.677 l +366.339 27.677 l +366.339 27.545 366.339 27.545 366.339 27.545 c +366.339 27.545 l +366.207 27.545 l +366.207 27.412 l +366.207 27.412 366.207 27.412 366.207 27.412 c +366.074 27.412 l +366.074 27.280 l +366.074 27.280 366.207 27.280 366.074 27.280 c +366.074 27.280 l +366.074 27.280 l +366.074 27.148 l +366.074 27.148 366.074 27.148 365.942 27.148 c +365.942 27.015 l +365.942 27.015 l +365.942 26.883 l +365.942 26.883 365.942 26.883 365.810 26.883 c +365.810 26.883 l +365.810 26.883 l +365.810 26.750 365.810 26.750 365.810 26.750 c +365.678 26.750 l +365.678 26.750 l +365.678 26.618 l +365.678 26.618 l +365.545 26.485 l +365.545 26.485 l +365.545 26.353 365.545 26.485 365.545 26.485 c +365.545 26.353 l +365.545 26.353 l +365.413 26.353 l +365.413 26.220 365.413 26.220 365.413 26.220 c +365.413 26.220 l +365.281 26.220 l +365.281 26.088 l +365.281 26.088 l +365.281 25.956 365.281 25.956 365.281 25.956 c +365.281 25.956 l +365.281 25.956 365.281 25.956 365.148 25.956 c +365.148 25.956 l +365.148 25.823 l +365.148 25.823 l +365.148 25.823 365.148 25.823 365.148 25.823 c +365.016 25.691 l +365.016 25.691 l +365.016 25.558 l +364.884 25.558 l +364.884 25.558 365.016 25.558 364.884 25.558 c +364.884 25.558 l +364.884 25.426 364.884 25.426 364.884 25.426 c +364.884 25.426 l +364.884 25.426 l +364.752 25.293 l +364.752 25.293 364.752 25.293 364.752 25.293 c +364.752 25.293 l +364.752 25.161 l +364.619 25.161 l +364.619 25.029 364.619 25.029 364.619 25.029 c +364.619 25.029 l +364.619 25.029 l +364.619 25.029 364.619 25.029 364.487 25.029 c +364.487 24.896 l +364.487 24.896 l +364.487 24.896 l +364.487 24.764 364.487 24.896 364.487 24.896 c +364.355 24.764 l +364.355 24.764 l +364.355 24.631 l +364.355 24.631 364.355 24.631 364.355 24.631 c +364.222 24.631 l +364.222 24.499 l +364.222 24.499 364.222 24.499 364.222 24.499 c +364.222 24.499 l +364.090 24.366 l +364.090 24.366 l +364.090 24.234 l +364.090 24.234 l +363.958 24.234 l +363.958 24.101 364.090 24.101 363.958 24.101 c +363.958 24.101 l +363.958 24.101 l +363.958 23.969 l +363.958 23.969 363.958 23.969 363.826 23.969 c +363.826 23.969 l +363.826 23.837 l +363.693 23.837 l +363.693 23.704 l +363.693 23.704 l +363.693 23.572 363.693 23.704 363.693 23.704 c +363.561 23.572 l +363.561 23.572 l +363.561 23.572 l +363.561 23.439 363.561 23.439 363.561 23.439 c +363.561 23.439 l +363.429 23.439 l +363.429 23.307 l +363.429 23.307 l +363.429 23.174 363.429 23.174 363.296 23.174 c +363.296 23.174 l +363.296 23.174 363.429 23.174 363.296 23.174 c +363.296 23.174 l +363.296 23.042 l +363.296 23.042 l +363.296 23.042 363.296 23.042 363.164 23.042 c +363.164 22.910 l +363.164 22.910 l +363.164 22.777 l +363.164 22.777 363.164 22.777 363.032 22.777 c +363.032 22.777 l +363.032 22.777 l +363.032 22.645 363.032 22.645 363.032 22.645 c +362.900 22.645 l +362.900 22.645 l +362.900 22.645 l +362.900 22.512 362.900 22.512 362.900 22.512 c +362.900 22.512 l +362.767 22.380 l +362.767 22.380 l +362.767 22.247 362.767 22.247 362.767 22.380 c +362.767 22.247 l +362.767 22.247 l +362.767 22.247 362.767 22.247 362.635 22.247 c +362.635 22.115 l +362.635 22.115 l +362.503 22.115 l +362.503 21.982 l +362.503 21.982 l +362.503 21.850 l +362.503 21.850 362.503 21.850 362.370 21.850 c +362.370 21.850 l +362.370 21.718 l +362.370 21.718 l +362.370 21.718 362.370 21.718 362.370 21.718 c +362.238 21.585 l +362.238 21.585 l +362.238 21.453 l +362.106 21.453 l +362.106 21.453 l +362.106 21.320 362.106 21.320 362.106 21.320 c +362.106 21.320 l +362.106 21.320 l +361.974 21.188 l +361.974 21.188 362.106 21.188 361.974 21.188 c +361.974 21.188 l +361.974 21.055 l +361.841 21.055 l +361.841 20.923 l +361.841 20.923 361.841 20.923 361.841 20.923 c +361.841 20.923 l +361.841 20.923 361.841 20.923 361.709 20.923 c +361.709 20.791 l +361.709 20.791 l +361.709 20.791 l +361.709 20.658 361.709 20.658 361.709 20.658 c +361.577 20.658 l +361.577 20.658 l +361.577 20.526 l +361.577 20.526 361.577 20.526 361.577 20.526 c +361.444 20.526 l +361.444 20.393 l +361.444 20.393 361.444 20.393 361.444 20.393 c +361.444 20.393 l +361.444 20.393 l +361.312 20.261 l +361.444 20.261 361.444 20.261 361.312 20.261 c +361.312 20.128 l +361.312 20.128 l +361.180 19.996 l +361.180 19.996 361.312 19.996 361.180 19.996 c +361.180 19.996 l +361.180 19.996 l +361.180 19.863 361.180 19.863 361.180 19.863 c +361.047 19.863 l +361.047 19.863 l +361.047 19.731 l +360.915 19.731 l +360.915 19.599 l +360.915 19.599 l +360.915 19.466 360.915 19.599 360.915 19.599 c +360.783 19.466 l +360.783 19.466 l +360.783 19.466 l +360.783 19.334 360.783 19.334 360.783 19.334 c +360.783 19.334 l +360.651 19.334 l +360.651 19.201 l +360.651 19.201 l +360.651 19.069 l +360.651 19.069 360.651 19.069 360.518 19.069 c +360.518 19.069 l +360.518 18.936 l +360.518 18.936 l +360.518 18.936 360.518 18.936 360.386 18.936 c +360.386 18.804 l +360.386 18.804 l +360.386 18.672 l +360.254 18.672 l +360.254 18.672 360.254 18.672 360.254 18.672 c +360.254 18.672 l +360.254 18.539 360.254 18.539 360.254 18.539 c +360.121 18.539 l +360.121 18.539 l +360.121 18.407 l +360.121 18.407 360.121 18.407 360.121 18.407 c +360.121 18.407 l +359.989 18.274 l +359.989 18.274 l +359.989 18.142 359.989 18.142 359.989 18.142 c +359.989 18.142 l +359.989 18.142 l +359.989 18.142 359.989 18.142 359.857 18.142 c +359.857 18.009 l +359.857 18.009 l +359.857 18.009 l +359.857 17.877 359.857 18.009 359.725 18.009 c +359.725 17.877 l +359.725 17.877 l +359.725 17.745 l +359.725 17.745 359.725 17.745 359.592 17.745 c +359.592 17.745 l +359.592 17.612 l +359.592 17.612 359.592 17.612 359.592 17.612 c +359.592 17.612 l +359.592 17.612 l +359.592 17.480 l +359.592 17.480 l +359.725 17.480 359.592 17.480 359.592 17.347 c +359.725 17.347 l +359.725 17.347 l +359.725 17.347 359.725 17.347 359.725 17.347 c +359.725 17.215 l +359.857 17.215 l +359.857 17.215 l +359.989 17.215 l +359.989 17.082 l +360.121 17.082 359.989 17.215 359.989 17.082 c +360.121 17.082 l +360.121 17.082 360.121 17.082 360.121 17.082 c +360.121 17.082 l +360.121 17.082 l +360.254 16.950 l +360.254 16.950 360.254 16.950 360.254 16.950 c +360.386 16.950 l +360.386 16.817 l +360.386 16.817 l +360.518 16.817 l +360.518 16.817 360.518 16.817 360.518 16.817 c +360.518 16.817 l +360.651 16.817 360.651 16.817 360.518 16.685 c +360.651 16.685 l +360.651 16.685 l +360.651 16.685 l +360.783 16.685 360.783 16.685 360.783 16.685 c +360.783 16.553 l +360.783 16.553 l +360.915 16.553 l +360.915 16.420 l +361.047 16.420 361.047 16.553 361.047 16.420 c +361.047 16.420 l +361.047 16.420 361.047 16.420 361.047 16.420 c +361.047 16.420 l +361.180 16.420 l +361.180 16.288 l +361.180 16.288 361.180 16.288 361.180 16.288 c +361.312 16.288 l +361.312 16.155 l +361.312 16.155 l +361.444 16.155 l +361.444 16.288 l +361.577 16.288 l +361.577 16.420 l +361.577 16.420 361.577 16.420 361.577 16.420 c +361.577 16.420 l +361.577 16.420 l +361.577 16.553 361.577 16.553 361.709 16.553 c +361.709 16.553 l +361.709 16.685 l +361.709 16.685 l +361.841 16.685 l +361.841 16.817 l +361.841 16.817 361.841 16.817 361.841 16.817 c +361.841 16.817 l +361.841 16.950 361.841 16.950 361.974 16.817 c +361.974 16.950 l +361.974 16.950 l +361.974 16.950 l +361.974 17.082 361.974 17.082 361.974 17.082 c +362.106 17.082 l +362.106 17.082 l +362.106 17.215 l +362.106 17.215 l +362.106 17.347 362.106 17.347 362.238 17.347 c +362.238 17.347 l +362.238 17.347 362.238 17.347 362.238 17.347 c +362.238 17.347 l +362.238 17.480 l +362.370 17.480 l +362.370 17.480 362.238 17.480 362.370 17.480 c +362.370 17.612 l +362.370 17.612 l +362.503 17.745 l +362.503 17.745 l +362.503 17.745 362.503 17.745 362.503 17.745 c +362.503 17.745 l +362.503 17.877 362.503 17.877 362.503 17.877 c +362.635 17.877 l +362.635 17.877 l +362.635 18.009 l +362.635 18.009 362.635 18.009 362.635 18.009 c +362.767 18.009 l +362.767 18.142 l +362.767 18.142 l +362.767 18.142 l +362.767 18.274 362.767 18.274 362.900 18.274 c +362.900 18.274 l +362.900 18.274 362.900 18.274 362.900 18.274 c +362.900 18.407 l +362.900 18.407 l +363.032 18.539 l +363.032 18.539 l +363.032 18.539 l +363.164 18.672 l +363.032 18.672 363.032 18.672 363.164 18.672 c +363.164 18.672 l +363.164 18.804 l +363.164 18.804 363.164 18.804 363.164 18.804 c +363.296 18.804 l +363.296 18.936 l +363.296 18.936 l +363.296 19.069 l +363.429 19.069 l +363.429 19.069 363.429 19.069 363.429 19.069 c +363.429 19.201 l +363.429 19.201 363.429 19.201 363.429 19.201 c +363.561 19.201 l +363.561 19.201 l +363.561 19.334 l +363.561 19.334 363.561 19.334 363.561 19.334 c +363.561 19.334 l +363.693 19.466 l +363.693 19.466 l +363.693 19.599 l +363.693 19.599 363.693 19.599 363.693 19.599 c +363.693 19.599 l +363.693 19.731 363.693 19.599 363.826 19.599 c +363.826 19.731 l +363.826 19.731 l +363.826 19.731 l +363.826 19.863 363.826 19.863 363.958 19.863 c +363.958 19.863 l +363.958 19.863 l +363.958 19.996 l +364.090 19.996 l +364.090 20.128 364.090 20.128 364.090 20.128 c +364.090 20.128 l +364.090 20.128 364.090 20.128 364.090 20.128 c +364.090 20.128 l +364.090 20.261 l +364.222 20.261 l +364.222 20.261 364.222 20.261 364.222 20.261 c +364.222 20.393 l +364.355 20.393 l +364.355 20.393 l +364.355 20.526 l +364.355 20.526 364.355 20.526 364.355 20.526 c +364.355 20.526 l +364.355 20.658 364.355 20.658 364.487 20.658 c +364.487 20.658 l +364.487 20.791 l +364.487 20.791 l +364.619 20.791 l +364.619 20.923 l +364.619 20.923 l +364.619 21.055 364.619 21.055 364.752 21.055 c +364.752 21.055 l +364.752 21.055 l +364.752 21.055 364.752 21.055 364.752 21.055 c +364.752 21.188 l +364.884 21.188 l +364.884 21.188 l +364.884 21.320 l +364.884 21.320 l +364.884 21.453 364.884 21.453 365.016 21.453 c +365.016 21.453 l +365.016 21.453 365.016 21.453 365.016 21.453 c +365.016 21.453 l +365.016 21.585 l +365.016 21.585 365.016 21.585 365.148 21.585 c +365.148 21.585 l +365.148 21.718 l +365.148 21.718 l +365.281 21.850 l +365.281 21.850 l +365.281 21.850 365.281 21.850 365.281 21.850 c +365.281 21.850 l +365.281 21.982 365.281 21.982 365.281 21.982 c +365.413 21.982 l +365.413 21.982 l +365.413 22.115 l +365.413 22.115 365.413 22.115 365.413 22.115 c +365.545 22.115 l +365.545 22.247 l +365.545 22.247 l +365.545 22.380 l +365.545 22.380 365.545 22.380 365.678 22.380 c +365.678 22.380 l +365.678 22.512 365.545 22.380 365.678 22.380 c +365.678 22.512 l +365.678 22.512 l +365.678 22.512 l +365.678 22.645 365.678 22.645 365.810 22.645 c +365.810 22.645 l +365.810 22.645 l +365.942 22.777 l +365.942 22.777 l +365.942 22.910 365.942 22.910 365.942 22.910 c +365.942 22.910 l +365.942 22.910 365.942 22.910 365.942 22.910 c +366.074 22.910 l +366.074 23.042 l +366.074 23.042 l +366.074 23.174 l +366.207 23.174 l +366.207 23.307 l +366.207 23.307 366.207 23.307 366.207 23.307 c +366.339 23.307 l +366.339 23.307 l +366.339 23.439 366.207 23.439 366.339 23.439 c +366.339 23.439 l +366.339 23.439 l +366.471 23.572 l +366.471 23.572 l +366.471 23.704 l +366.471 23.704 l +366.471 23.837 366.471 23.837 366.604 23.704 c +366.604 23.837 l +366.604 23.837 l +366.604 23.837 366.604 23.837 366.604 23.837 c +366.736 23.969 l +366.736 23.969 l +366.736 23.969 l +366.736 24.101 l +366.868 24.101 l +366.868 24.234 366.736 24.234 366.868 24.234 c +366.868 24.234 l +366.868 24.234 366.868 24.234 366.868 24.234 c +366.868 24.234 l +366.868 24.366 l +367.001 24.366 l +367.001 24.366 367.001 24.366 367.001 24.366 c +367.001 24.499 l +367.133 24.499 l +367.133 24.631 l +367.133 24.631 l +367.133 24.631 367.133 24.631 367.133 24.631 c +367.133 24.631 l +367.133 24.764 367.133 24.764 367.265 24.764 c +367.265 24.764 l +367.265 24.764 l +367.265 24.896 l +367.265 24.896 367.265 24.896 367.265 24.896 c +367.397 24.896 l +367.397 25.029 l +367.397 25.029 l +367.530 25.029 l +367.530 25.161 367.397 25.161 367.530 25.161 c +367.530 25.161 l +367.530 25.161 367.530 25.161 367.530 25.161 c +367.530 25.293 l +367.530 25.293 l +367.662 25.293 l +367.662 25.426 367.530 25.426 367.662 25.426 c +367.662 25.426 l +367.662 25.426 l +367.794 25.558 l +367.794 25.558 367.794 25.558 367.794 25.558 c +367.794 25.558 l +367.794 25.691 l +367.794 25.691 367.794 25.691 367.927 25.691 c +367.927 25.691 l +367.927 25.823 l +367.927 25.823 l +368.059 25.956 l +368.059 25.956 l +368.059 26.088 l +368.059 26.088 368.059 26.088 368.059 26.088 c +368.191 26.088 l +368.191 26.088 l +368.191 26.220 368.191 26.220 368.191 26.220 c +368.191 26.220 l +368.191 26.220 l +368.323 26.353 l +368.323 26.353 l +368.323 26.485 l +368.323 26.485 368.323 26.485 368.456 26.485 c +368.456 26.485 l +368.456 26.618 368.323 26.485 368.456 26.485 c +368.456 26.618 l +368.456 26.618 l +368.456 26.618 l +368.456 26.750 368.456 26.750 368.588 26.750 c +368.588 26.750 l +368.588 26.750 l +368.720 26.883 l +368.720 26.883 l +368.720 27.015 368.720 27.015 368.720 27.015 c +368.720 27.015 l +368.720 27.015 368.720 27.015 368.720 27.015 c +368.853 27.015 l +368.853 27.148 l +368.853 27.148 l +368.853 27.148 368.853 27.148 368.853 27.148 c +368.853 27.280 l +368.985 27.280 l +368.985 27.280 l +368.985 27.412 l +368.985 27.412 368.985 27.412 369.117 27.412 c +369.117 27.412 l +369.117 27.545 l +369.117 27.545 l +369.117 27.545 l +369.249 27.412 l +369.249 27.412 l +369.249 27.412 369.249 27.412 369.249 27.412 c +369.249 27.280 l +369.249 27.280 l +369.382 27.280 369.382 27.280 369.382 27.280 c +369.382 27.148 l +369.382 27.148 l +369.514 27.015 l +369.514 27.015 369.514 27.015 369.514 27.015 c +369.514 27.015 l +369.514 27.015 l +369.514 26.883 l +369.646 26.883 369.646 26.883 369.646 26.883 c +369.646 26.750 l +369.646 26.750 l +369.646 26.750 l +369.779 26.750 369.779 26.750 369.779 26.618 c +369.779 26.618 l +369.779 26.618 l +369.779 26.485 l +369.911 26.485 369.911 26.618 369.911 26.485 c +369.911 26.485 l +369.911 26.485 369.911 26.485 369.911 26.485 c +369.911 26.353 l +369.911 26.353 l +370.043 26.220 l +370.043 26.220 l +370.043 26.220 l +370.175 26.220 370.043 26.220 370.043 26.088 c +370.043 26.088 l +370.175 26.088 l +370.175 26.088 370.175 26.088 370.175 26.088 c +370.175 25.956 l +370.308 25.956 l +370.308 25.823 l +370.308 25.823 370.308 25.823 370.308 25.823 c +370.308 25.691 l +370.308 25.691 l +370.440 25.691 l +370.440 25.691 370.440 25.691 370.440 25.691 c +370.440 25.558 l +370.440 25.558 l +370.572 25.426 l +370.572 25.426 370.572 25.426 370.572 25.426 c +370.572 25.426 l +370.572 25.293 l +370.705 25.293 l +370.705 25.293 370.705 25.293 370.705 25.293 c +370.705 25.293 l +370.705 25.293 370.705 25.293 370.705 25.161 c +370.705 25.161 l +370.837 25.161 l +370.837 25.029 l +370.837 25.029 l +370.969 25.029 370.837 25.029 370.837 24.896 c +370.969 24.896 l +370.969 24.896 l +370.969 24.896 l +370.969 24.896 370.969 24.896 370.969 24.764 c +370.969 24.764 l +371.101 24.631 l +371.101 24.631 l +371.101 24.631 371.101 24.631 371.101 24.631 c +371.234 24.499 l +371.234 24.499 l +371.234 24.499 l +371.234 24.499 371.234 24.499 371.234 24.366 c +371.234 24.366 l +371.366 24.366 l +371.366 24.234 l +371.366 24.234 l +371.366 24.101 l +371.498 24.101 l +371.498 24.101 371.498 24.101 371.498 24.101 c +371.498 23.969 l +371.498 23.969 371.498 24.101 371.498 23.969 c +371.631 23.969 l +371.631 23.837 l +371.631 23.837 l +371.631 23.837 l +371.763 23.837 371.763 23.837 371.763 23.704 c +371.763 23.704 l +371.763 23.704 l +371.763 23.572 l +371.895 23.572 371.895 23.704 371.895 23.572 c +371.895 23.439 l +371.895 23.439 l +371.895 23.439 l +372.027 23.439 372.027 23.439 372.027 23.307 c +372.027 23.307 l +372.027 23.307 l +372.027 23.307 l +372.160 23.307 372.027 23.307 372.027 23.174 c +372.160 23.174 l +372.160 23.042 l +372.160 23.042 l +372.292 23.042 l +372.292 22.910 l +372.292 22.910 l +372.292 22.910 372.292 22.910 372.292 22.777 c +372.292 22.777 l +372.424 22.777 l +372.424 22.777 372.424 22.777 372.424 22.777 c +372.424 22.645 l +372.424 22.645 l +372.557 22.512 l +372.557 22.512 372.557 22.512 372.557 22.512 c +372.557 22.512 l +372.557 22.380 l +372.689 22.380 l +372.689 22.380 372.689 22.380 372.689 22.380 c +372.689 22.247 l +372.689 22.247 l +372.821 22.115 l +372.821 22.115 372.821 22.247 372.821 22.115 c +372.821 22.115 l +372.821 22.115 l +372.821 21.982 l +372.954 21.982 372.954 21.982 372.954 21.982 c +372.954 21.982 l +372.954 21.982 372.954 21.982 372.954 21.850 c +372.954 21.850 l +372.954 21.850 l +373.086 21.718 l +373.086 21.718 l +373.086 21.585 l +373.218 21.718 373.218 21.718 373.218 21.585 c +373.218 21.585 l +373.218 21.585 l +373.218 21.585 373.218 21.585 373.218 21.453 c +373.218 21.453 l +373.350 21.453 l +373.350 21.320 l +373.350 21.320 373.350 21.320 373.350 21.320 c +373.350 21.188 l +373.350 21.188 l +373.483 21.188 l +373.483 21.188 373.483 21.188 373.483 21.188 c +373.483 21.055 l +373.615 21.055 l +373.615 20.923 l +373.615 20.923 373.615 20.923 373.615 20.923 c +373.615 20.923 l +373.615 20.791 l +373.747 20.791 l +373.747 20.791 373.747 20.791 373.747 20.791 c +373.747 20.791 l +373.747 20.791 373.747 20.791 373.747 20.658 c +373.747 20.658 l +373.880 20.526 l +373.880 20.526 l +373.880 20.526 l +374.012 20.393 l +374.012 20.393 374.012 20.393 374.012 20.393 c +374.012 20.393 l +374.012 20.393 l +374.144 20.393 374.012 20.393 374.012 20.261 c +374.144 20.261 l +374.144 20.128 l +374.144 20.128 l +374.276 20.128 374.276 20.128 374.144 19.996 c +374.276 19.996 l +374.276 19.996 l +374.276 19.996 l +374.276 19.996 374.276 19.996 374.276 19.863 c +374.409 19.863 l +374.409 19.731 l +374.409 19.731 l +374.541 19.731 374.409 19.731 374.409 19.731 c +374.541 19.599 l +374.541 19.599 l +374.541 19.599 l +374.541 19.599 374.541 19.599 374.541 19.599 c +374.541 19.466 l +374.673 19.466 374.673 19.466 374.541 19.466 c +374.673 19.466 l +374.673 19.334 l +374.673 19.334 l +374.806 19.201 l +374.806 19.201 l +374.806 19.201 374.806 19.201 374.806 19.201 c +374.806 19.201 l +374.806 19.069 l +374.938 19.069 374.938 19.069 374.938 19.069 c +374.938 18.936 l +374.938 18.936 l +374.938 18.936 l +375.070 18.936 375.070 18.936 375.070 18.804 c +375.070 18.804 l +375.070 18.804 l +375.070 18.672 l +375.202 18.672 375.202 18.804 375.202 18.672 c +375.202 18.672 l +375.202 18.539 l +375.202 18.539 l +375.335 18.539 375.335 18.539 375.335 18.407 c +375.335 18.407 l +375.335 18.407 l +375.335 18.407 l +375.467 18.407 375.335 18.407 375.335 18.274 c +375.335 18.274 l +375.467 18.274 375.467 18.274 375.467 18.274 c +375.467 18.142 l +375.467 18.142 l +375.599 18.142 l +375.599 18.009 l +375.599 18.009 375.599 18.009 375.599 18.009 c +375.599 18.009 l +375.599 17.877 l +375.732 17.877 l +375.732 17.877 375.732 17.877 375.732 17.877 c +375.732 17.745 l +375.732 17.745 l +375.864 17.612 l +375.864 17.612 375.864 17.612 375.864 17.612 c +375.864 17.612 l +375.864 17.480 l +375.996 17.480 l +375.996 17.480 375.996 17.480 375.996 17.480 c +375.996 17.347 l +375.996 17.347 l +376.128 17.347 l +376.128 17.215 l +376.128 17.215 l +376.128 17.082 l +376.261 17.082 376.261 17.215 376.261 17.082 c +376.261 17.082 l +376.261 17.082 376.261 17.082 376.261 17.082 c +376.261 16.950 l +376.393 16.950 l +376.393 16.817 l +376.393 16.817 l +376.525 16.817 376.393 16.817 376.393 16.817 c +376.525 16.685 l +376.525 16.685 l +376.525 16.685 l +376.525 16.685 376.525 16.685 376.525 16.685 c +376.525 16.553 l +376.658 16.553 l +376.658 16.420 l +376.658 16.420 376.658 16.420 376.658 16.420 c +376.790 16.288 l +376.790 16.288 l +376.790 16.288 l +376.790 16.288 376.790 16.288 376.790 16.288 c +376.790 16.155 l +376.922 16.155 l +376.922 16.155 l +376.922 16.288 376.922 16.288 376.922 16.288 c +377.054 16.288 l +377.054 16.288 l +377.054 16.288 l +377.054 16.420 377.054 16.420 377.187 16.420 c +377.187 16.420 l +377.187 16.420 l +377.319 16.420 l +377.319 16.553 377.319 16.553 377.319 16.553 c +377.451 16.553 l +377.451 16.553 l +377.451 16.553 l +377.451 16.685 377.451 16.685 377.451 16.685 c +377.451 16.685 l +377.451 16.685 377.451 16.685 377.584 16.685 c +377.584 16.685 l +377.716 16.685 l +377.716 16.817 l +377.716 16.817 l +377.716 16.817 377.716 16.817 377.848 16.817 c +377.848 16.817 l +377.848 16.817 l +377.981 16.950 l +377.848 16.950 377.848 16.950 377.981 16.950 c +377.981 16.950 l +378.113 17.082 l +378.113 17.082 l +378.113 17.082 378.113 17.082 378.113 17.082 c +378.245 17.082 l +378.245 17.082 l +378.245 17.215 l +378.245 17.215 378.245 17.215 378.377 17.215 c +378.377 17.215 l +378.377 17.347 l +378.510 17.347 l +378.510 17.347 378.510 17.347 378.510 17.347 c +378.642 17.347 l +378.642 17.347 l +378.642 17.480 l +378.642 17.480 378.642 17.480 378.642 17.480 c +378.642 17.480 l +378.774 17.480 378.774 17.480 378.774 17.612 c +378.774 17.612 l +378.642 17.612 378.774 17.612 378.774 17.612 c +378.642 17.612 l +378.642 17.745 l +378.642 17.745 l +378.510 17.877 l +378.510 17.877 l +378.510 17.877 378.510 17.877 378.510 17.877 c +378.510 18.009 l +378.510 18.009 l +378.377 18.009 378.377 18.009 378.377 18.009 c +378.377 18.142 l +378.377 18.142 l +378.377 18.142 l +378.245 18.142 378.245 18.142 378.245 18.274 c +378.245 18.274 l +378.245 18.274 l +378.245 18.407 l +378.113 18.407 378.113 18.274 378.113 18.407 c +378.113 18.407 l +378.113 18.407 378.113 18.407 378.113 18.407 c +378.113 18.539 l +378.113 18.539 l +377.981 18.672 l +377.981 18.672 l +377.981 18.672 l +377.848 18.672 377.981 18.672 377.981 18.804 c +377.981 18.804 l +377.848 18.804 377.848 18.804 377.848 18.804 c +377.848 18.936 l +377.848 18.936 l +377.716 18.936 l +377.716 19.069 l +377.716 19.069 l +377.716 19.069 377.716 19.069 377.716 19.201 c +377.716 19.201 l +377.584 19.201 l +377.584 19.201 377.584 19.201 377.584 19.201 c +377.584 19.334 l +377.584 19.334 l +377.451 19.466 l +377.451 19.466 377.451 19.466 377.451 19.466 c +377.451 19.466 l +377.451 19.599 l +377.319 19.599 l +377.319 19.599 377.319 19.599 377.319 19.599 c +377.319 19.599 l +377.319 19.599 377.319 19.599 377.319 19.731 c +377.319 19.731 l +377.187 19.863 l +377.187 19.863 l +377.187 19.863 l +377.187 19.996 l +377.054 19.996 377.054 19.996 377.054 19.996 c +377.054 19.996 l +377.054 19.996 377.054 19.996 377.054 20.128 c +377.054 20.128 l +376.922 20.128 l +376.922 20.261 l +376.922 20.261 l +376.922 20.261 l +376.790 20.261 376.790 20.261 376.790 20.393 c +376.790 20.393 l +376.790 20.393 l +376.790 20.393 376.790 20.393 376.790 20.526 c +376.790 20.526 l +376.658 20.526 l +376.658 20.658 l +376.658 20.658 376.658 20.658 376.658 20.658 c +376.525 20.791 l +376.525 20.791 l +376.525 20.791 l +376.525 20.791 376.525 20.791 376.525 20.791 c +376.525 20.923 l +376.525 20.923 376.525 20.791 376.525 20.923 c +376.393 20.923 l +376.393 21.055 l +376.393 21.055 l +376.393 21.188 l +376.261 21.188 l +376.261 21.188 376.261 21.188 376.261 21.188 c +376.261 21.188 l +376.261 21.188 376.261 21.188 376.261 21.320 c +376.128 21.320 l +376.128 21.453 l +376.128 21.453 l +376.128 21.453 l +375.996 21.453 375.996 21.453 375.996 21.585 c +375.996 21.585 l +375.996 21.585 l +375.996 21.585 l +375.864 21.585 375.864 21.585 375.996 21.718 c +375.864 21.718 l +375.864 21.850 l +375.864 21.850 l +375.732 21.850 375.732 21.850 375.732 21.850 c +375.732 21.982 l +375.732 21.982 l +375.732 21.982 l +375.732 21.982 375.732 21.982 375.732 22.115 c +375.732 22.115 l +375.599 22.115 375.599 22.115 375.599 22.115 c +375.599 22.115 l +375.599 22.247 l +375.599 22.247 l +375.467 22.380 l +375.467 22.380 l +375.467 22.380 375.467 22.380 375.467 22.380 c +375.467 22.512 l +375.335 22.512 375.335 22.512 375.467 22.512 c +375.335 22.512 l +375.335 22.645 l +375.335 22.645 l +375.202 22.777 l +375.202 22.777 375.202 22.645 375.202 22.777 c +375.202 22.777 l +375.202 22.777 l +375.202 22.910 l +375.070 22.910 375.070 22.910 375.070 22.910 c +375.070 23.042 l +375.070 23.042 l +374.938 23.042 l +374.938 23.042 374.938 23.042 374.938 23.174 c +374.938 23.174 l +374.938 23.174 l +374.938 23.307 l +374.806 23.174 374.806 23.174 374.806 23.307 c +374.806 23.307 l +374.806 23.307 374.806 23.307 374.806 23.307 c +374.806 23.439 l +374.806 23.439 l +374.673 23.439 l +374.673 23.572 l +374.673 23.572 l +374.541 23.572 374.541 23.572 374.541 23.704 c +374.541 23.704 l +374.541 23.704 374.541 23.704 374.541 23.704 c +374.541 23.837 l +374.541 23.837 l +374.409 23.837 l +374.409 23.969 l +374.409 23.969 374.409 23.969 374.409 23.969 c +374.409 23.969 l +374.409 24.101 l +374.276 24.101 l +374.276 24.101 374.276 24.101 374.276 24.101 c +374.276 24.234 l +374.144 24.234 l +374.144 24.366 l +374.144 24.366 l +374.144 24.366 l +374.012 24.499 l +374.012 24.499 374.012 24.499 374.012 24.499 c +374.012 24.499 l +374.012 24.499 374.012 24.499 374.012 24.631 c +374.012 24.631 l +373.880 24.631 l +373.880 24.764 l +373.880 24.764 l +373.880 24.896 l +373.747 24.896 373.747 24.764 373.747 24.896 c +373.747 24.896 l +373.747 24.896 l +373.615 24.896 373.747 24.896 373.747 25.029 c +373.615 25.029 l +373.615 25.161 l +373.615 25.161 l +373.483 25.161 373.615 25.161 373.615 25.161 c +373.483 25.293 l +373.483 25.293 l +373.483 25.293 l +373.483 25.293 373.483 25.293 373.483 25.293 c +373.483 25.426 l +373.350 25.426 373.350 25.426 373.350 25.426 c +373.350 25.426 l +373.350 25.558 l +373.350 25.558 l +373.218 25.691 l +373.218 25.691 l +373.218 25.691 373.218 25.691 373.218 25.691 c +373.218 25.691 l +373.086 25.691 373.218 25.691 373.218 25.823 c +373.086 25.823 l +373.086 25.956 l +373.086 25.956 l +373.086 26.088 l +372.954 26.088 l +372.954 26.088 372.954 26.088 372.954 26.088 c +372.954 26.088 l +372.954 26.220 l +372.821 26.220 372.821 26.088 372.821 26.220 c +372.821 26.220 l +372.821 26.353 l +372.821 26.353 l +372.689 26.353 372.689 26.353 372.689 26.485 c +372.689 26.485 l +372.689 26.485 l +372.689 26.485 l +372.557 26.485 372.557 26.485 372.557 26.618 c +372.557 26.618 l +372.557 26.618 372.557 26.618 372.557 26.618 c +372.557 26.750 l +372.557 26.750 l +372.424 26.750 l +372.424 26.883 l +372.424 26.883 l +372.292 26.883 372.424 26.883 372.424 27.015 c +372.424 27.015 l +372.292 27.015 372.292 27.015 372.292 27.015 c +372.292 27.015 l +372.292 27.148 l +372.160 27.148 l +372.160 27.280 l +372.160 27.280 372.160 27.280 372.160 27.280 c +372.160 27.280 l +372.160 27.412 l +372.027 27.412 l +372.027 27.412 372.027 27.412 372.027 27.412 c +372.027 27.545 l +372.027 27.545 l +371.895 27.545 l +371.895 27.545 371.895 27.545 371.895 27.677 c +371.895 27.677 l +371.895 27.677 l +371.763 27.810 l +371.763 27.810 371.763 27.677 371.763 27.810 c +371.763 27.810 l +371.763 27.810 371.763 27.810 371.763 27.810 c +371.763 27.942 l +371.631 27.942 l +371.631 28.075 l +371.631 28.075 l +371.631 28.075 l +371.498 28.075 371.498 28.075 371.498 28.207 c +371.498 28.207 l +371.498 28.207 371.498 28.207 371.498 28.207 c +371.498 28.339 l +371.498 28.339 l +371.366 28.339 l +371.366 28.472 l +371.366 28.472 371.366 28.472 371.366 28.472 c +371.234 28.604 l +371.234 28.604 l +371.234 28.604 l +371.234 28.604 371.234 28.604 371.234 28.604 c +371.234 28.737 l +371.101 28.737 l +371.101 28.869 l +371.101 28.869 371.101 28.869 371.101 28.869 c +371.101 28.869 l +371.101 29.002 l +370.969 29.002 l +370.969 29.002 370.969 29.002 370.969 29.002 c +370.969 29.002 l +370.969 29.002 370.969 29.002 370.969 29.134 c +370.837 29.134 l +370.837 29.266 l +370.837 29.266 l +370.837 29.266 l +370.705 29.399 l +370.705 29.399 370.705 29.399 370.705 29.399 c +370.705 29.399 l +370.705 29.399 370.705 29.399 370.705 29.531 c +370.705 29.531 l +370.572 29.531 l +370.572 29.664 l +370.572 29.664 l +370.440 29.664 370.440 29.664 370.440 29.664 c +370.440 29.796 l +370.440 29.796 l +370.440 29.796 l +370.308 29.796 370.440 29.796 370.440 29.929 c +370.308 29.929 l +370.308 29.929 l +370.308 30.061 l +370.308 30.061 l +370.175 30.061 370.175 30.061 370.175 30.194 c +370.175 30.194 l +370.043 30.326 l +370.043 30.326 l +369.911 30.326 369.911 30.326 369.911 30.326 c +369.911 30.458 l +369.911 30.458 l +369.911 30.458 l +369.779 30.458 l +369.779 30.458 l +369.646 30.458 369.779 30.458 369.779 30.591 c +369.646 30.591 l +369.646 30.591 l +369.646 30.591 l +369.514 30.591 l +369.514 30.591 l +369.382 30.591 l +369.249 30.591 l +368.985 30.591 l +368.853 30.591 l +368.720 30.591 l +f +0.16 0.16 0.23 rg +[] 0 d +360.254 30.723 m +360.254 30.723 360.254 30.723 360.254 30.723 c +360.254 30.723 l +360.121 30.591 l +360.254 30.591 360.254 30.591 360.121 30.591 c +360.121 30.591 l +360.121 30.458 l +359.989 30.458 l +359.989 30.458 l +359.989 30.326 l +359.989 30.326 359.989 30.326 359.989 30.326 c +359.989 30.326 l +359.989 30.194 359.989 30.194 359.857 30.194 c +359.857 30.194 l +359.857 30.194 l +359.857 30.194 l +359.857 30.061 359.857 30.061 359.725 30.061 c +359.725 30.061 l +359.725 29.929 l +359.725 29.929 l +359.725 29.796 359.725 29.929 359.592 29.929 c +359.592 29.796 l +359.592 29.796 l +359.592 29.796 l +359.592 29.664 359.592 29.664 359.592 29.664 c +359.460 29.664 l +359.460 29.664 l +359.460 29.531 l +359.460 29.531 359.460 29.531 359.460 29.531 c +359.328 29.399 l +359.328 29.399 l +359.328 29.399 l +359.328 29.266 359.328 29.399 359.328 29.399 c +359.195 29.266 l +359.195 29.266 l +359.195 29.134 l +359.195 29.134 359.195 29.134 359.195 29.134 c +359.063 29.134 l +359.063 29.002 l +359.063 29.002 l +359.063 29.002 359.063 29.002 359.063 29.002 c +359.063 28.869 l +358.931 28.869 l +358.931 28.869 l +358.931 28.737 l +358.931 28.737 358.931 28.737 358.799 28.737 c +358.799 28.737 l +358.799 28.604 358.931 28.604 358.799 28.604 c +358.799 28.604 l +358.799 28.604 l +358.666 28.472 l +358.666 28.472 l +358.666 28.339 l +358.666 28.339 358.666 28.339 358.666 28.339 c +358.666 28.339 l +358.666 28.207 358.666 28.339 358.534 28.339 c +358.534 28.207 l +358.534 28.207 l +358.534 28.207 l +358.534 28.075 358.534 28.075 358.402 28.075 c +358.402 28.075 l +358.402 28.075 l +358.402 27.942 l +358.402 27.942 358.402 27.942 358.269 27.942 c +358.269 27.810 l +358.269 27.810 l +358.269 27.810 l +358.269 27.677 358.269 27.810 358.137 27.810 c +358.137 27.677 l +358.137 27.677 l +358.137 27.545 l +358.137 27.545 358.137 27.545 358.005 27.545 c +358.005 27.545 l +358.005 27.412 l +358.005 27.412 l +358.005 27.412 358.005 27.412 358.005 27.412 c +357.873 27.280 l +357.873 27.280 l +357.873 27.148 l +357.873 27.148 357.873 27.148 357.873 27.148 c +357.740 27.148 l +357.740 27.148 l +357.740 27.015 357.740 27.015 357.740 27.015 c +357.740 27.015 l +357.608 26.883 l +357.608 26.883 l +357.608 26.883 l +357.608 26.750 l +357.608 26.750 357.608 26.750 357.476 26.750 c +357.476 26.750 l +357.476 26.618 357.476 26.618 357.476 26.750 c +357.476 26.618 l +357.476 26.618 l +357.343 26.485 l +357.343 26.485 l +357.343 26.485 l +357.343 26.353 357.343 26.353 357.211 26.353 c +357.211 26.353 l +357.211 26.353 357.343 26.353 357.211 26.353 c +357.211 26.220 l +357.211 26.220 l +357.211 26.220 l +357.211 26.088 357.211 26.220 357.079 26.220 c +357.079 26.088 l +357.079 26.088 l +357.079 25.956 l +357.079 25.956 357.079 25.956 356.947 25.956 c +356.947 25.956 l +356.947 25.823 l +356.947 25.823 l +356.947 25.823 356.947 25.823 356.814 25.823 c +356.814 25.691 l +356.814 25.691 l +356.814 25.558 l +356.814 25.558 356.814 25.558 356.682 25.558 c +356.682 25.558 l +356.682 25.558 l +356.682 25.426 l +356.682 25.426 356.682 25.426 356.682 25.426 c +356.550 25.293 l +356.550 25.293 l +356.550 25.293 l +356.550 25.161 356.550 25.161 356.417 25.161 c +356.417 25.161 l +356.417 25.161 l +356.417 25.029 356.417 25.029 356.417 25.161 c +356.417 25.029 l +356.285 25.029 l +356.285 24.896 l +356.285 24.896 l +356.153 24.896 l +356.285 24.764 356.285 24.764 356.153 24.764 c +356.153 24.764 l +356.153 24.764 356.153 24.764 356.153 24.764 c +356.153 24.631 l +356.153 24.631 l +356.020 24.631 l +356.020 24.499 356.153 24.631 356.020 24.631 c +356.020 24.499 l +356.020 24.499 l +355.888 24.366 l +355.888 24.366 355.888 24.366 355.888 24.366 c +355.888 24.366 l +355.888 24.234 l +355.888 24.234 l +355.888 24.234 355.888 24.234 355.756 24.234 c +355.756 24.101 l +355.756 24.101 l +355.624 23.969 l +355.624 23.969 355.756 23.969 355.624 23.969 c +355.624 23.969 l +355.624 23.969 l +355.624 23.837 l +355.624 23.837 355.624 23.837 355.491 23.837 c +355.491 23.704 l +355.491 23.704 l +355.491 23.704 l +355.491 23.572 355.491 23.572 355.359 23.572 c +355.359 23.572 l +355.359 23.572 l +355.359 23.439 355.359 23.439 355.359 23.572 c +355.227 23.439 l +355.227 23.439 l +355.227 23.307 l +355.227 23.307 l +355.094 23.307 l +355.094 23.174 355.094 23.174 355.094 23.174 c +355.094 23.174 l +355.094 23.174 355.094 23.174 355.094 23.174 c +354.962 23.042 l +354.962 23.042 l +354.962 23.042 l +354.962 22.910 l +354.830 22.910 l +354.830 22.777 354.962 22.777 354.830 22.777 c +354.830 22.777 l +354.830 22.777 354.830 22.777 354.830 22.777 c +354.830 22.777 l +354.830 22.645 l +354.698 22.645 l +354.698 22.645 354.698 22.645 354.698 22.645 c +354.698 22.512 l +354.565 22.512 l +354.565 22.380 l +354.565 22.380 354.565 22.380 354.565 22.380 c +354.565 22.380 l +354.565 22.380 l +354.433 22.247 l +354.433 22.247 354.565 22.247 354.433 22.247 c +354.433 22.115 l +354.433 22.115 l +354.301 22.115 l +354.301 21.982 354.433 21.982 354.301 21.982 c +354.301 21.982 l +354.301 21.982 l +354.301 21.850 l +354.301 21.850 354.301 21.850 354.168 21.850 c +354.168 21.850 l +354.168 21.718 l +354.036 21.718 l +354.168 21.585 354.168 21.585 354.036 21.585 c +354.036 21.585 l +354.036 21.585 l +354.036 21.585 354.036 21.585 354.036 21.585 c +353.904 21.453 l +353.904 21.453 l +353.904 21.453 l +353.904 21.320 l +353.772 21.320 l +353.772 21.188 353.772 21.188 353.772 21.188 c +353.772 21.188 l +353.772 21.188 353.772 21.188 353.772 21.188 c +353.639 21.188 l +353.639 21.055 l +353.639 21.055 l +353.639 20.923 l +353.507 20.923 l +353.507 20.791 l +353.507 20.791 353.507 20.791 353.507 20.791 c +353.507 20.791 l +353.507 20.791 l +353.375 20.658 l +353.375 20.658 353.375 20.658 353.375 20.658 c +353.375 20.526 l +353.242 20.526 l +353.242 20.526 l +353.242 20.393 353.242 20.393 353.242 20.393 c +353.242 20.393 l +353.242 20.393 l +353.110 20.261 l +353.110 20.261 353.110 20.261 353.110 20.261 c +353.110 20.261 l +352.978 20.128 l +352.978 20.128 l +352.978 19.996 352.978 19.996 352.978 19.996 c +352.978 19.996 l +352.978 19.996 l +352.846 19.996 l +352.846 19.863 352.978 19.863 352.846 19.863 c +352.846 19.863 l +352.846 19.863 l +352.713 19.731 l +352.713 19.731 l +352.713 19.599 352.713 19.599 352.713 19.599 c +352.713 19.599 l +352.713 19.599 352.713 19.599 352.713 19.599 c +352.581 19.599 l +352.581 19.466 l +352.581 19.466 l +352.449 19.334 l +352.449 19.334 l +352.449 19.201 352.449 19.334 352.449 19.334 c +352.449 19.201 l +352.449 19.201 352.449 19.201 352.449 19.201 c +352.316 19.201 l +352.316 19.201 l +352.316 19.069 l +352.316 19.069 352.316 19.069 352.316 19.069 c +352.316 18.936 l +352.184 18.936 l +352.184 18.936 l +352.184 18.804 352.184 18.804 352.184 18.804 c +352.052 18.804 l +352.052 18.804 l +352.052 18.672 l +352.052 18.672 352.052 18.672 352.052 18.672 c +352.052 18.672 l +351.920 18.539 l +351.920 18.539 l +351.920 18.407 351.920 18.407 351.920 18.407 c +351.920 18.407 l +351.920 18.407 l +351.787 18.407 l +351.787 18.274 351.787 18.274 351.787 18.274 c +351.787 18.274 l +351.655 18.274 l +351.655 18.142 l +351.655 18.009 351.655 18.142 351.655 18.142 c +351.655 18.009 l +351.655 18.009 l +351.655 18.009 351.655 18.009 351.523 18.009 c +351.523 18.009 l +351.523 17.877 l +351.523 17.877 l +351.390 17.745 l +351.390 17.745 l +351.390 17.612 351.390 17.745 351.390 17.745 c +351.390 17.612 l +351.390 17.612 351.390 17.612 351.258 17.612 c +351.258 17.612 l +351.258 17.612 l +351.258 17.480 351.258 17.480 351.258 17.480 c +351.390 17.480 351.390 17.480 351.390 17.480 c +351.390 17.347 l +351.523 17.347 l +351.523 17.347 351.523 17.347 351.523 17.347 c +351.523 17.347 l +351.655 17.347 351.523 17.347 351.523 17.347 c +351.655 17.215 l +351.655 17.215 l +351.655 17.215 l +351.787 17.215 351.787 17.215 351.787 17.215 c +351.787 17.082 l +351.787 17.082 l +351.920 17.082 l +351.920 17.082 351.920 17.082 351.920 17.082 c +351.920 16.950 l +352.052 16.950 l +352.052 16.950 l +352.052 16.950 352.052 16.950 352.052 16.950 c +352.184 16.817 l +352.184 16.817 l +352.184 16.817 l +352.316 16.817 l +352.316 16.817 352.316 16.817 352.316 16.685 c +352.316 16.685 l +352.449 16.685 352.449 16.685 352.449 16.685 c +352.449 16.685 l +352.449 16.685 l +352.581 16.553 l +352.581 16.553 l +352.713 16.553 l +352.713 16.553 352.713 16.553 352.713 16.420 c +352.713 16.420 l +352.713 16.420 352.713 16.420 352.713 16.420 c +352.846 16.420 l +352.846 16.420 l +352.846 16.288 l +352.978 16.288 l +353.110 16.288 352.978 16.155 353.110 16.288 c +353.110 16.420 l +353.110 16.420 l +353.242 16.420 l +353.242 16.553 353.110 16.553 353.242 16.553 c +353.242 16.553 l +353.242 16.553 l +353.242 16.685 l +353.242 16.685 353.242 16.685 353.375 16.685 c +353.375 16.685 l +353.375 16.817 l +353.507 16.817 l +353.507 16.817 l +353.507 16.950 353.507 16.950 353.507 16.950 c +353.507 16.950 l +353.507 16.950 353.507 16.950 353.507 16.950 c +353.639 17.082 l +353.639 17.082 l +353.639 17.082 l +353.639 17.215 l +353.772 17.215 l +353.772 17.347 353.772 17.347 353.772 17.347 c +353.772 17.347 l +353.772 17.347 353.772 17.347 353.772 17.347 c +353.904 17.347 l +353.904 17.480 l +353.904 17.480 l +353.904 17.612 l +354.036 17.612 l +354.036 17.612 353.904 17.612 354.036 17.612 c +354.036 17.745 l +354.036 17.745 354.036 17.745 354.036 17.745 c +354.036 17.745 l +354.036 17.745 l +354.168 17.877 l +354.168 17.877 354.168 17.877 354.168 17.877 c +354.168 18.009 l +354.301 18.009 l +354.301 18.009 l +354.301 18.142 354.301 18.142 354.301 18.142 c +354.301 18.142 l +354.301 18.142 l +354.433 18.274 l +354.433 18.274 354.301 18.274 354.433 18.274 c +354.433 18.274 l +354.433 18.407 l +354.565 18.407 l +354.565 18.539 354.565 18.539 354.565 18.539 c +354.565 18.539 l +354.565 18.539 l +354.698 18.539 l +354.698 18.672 354.565 18.672 354.698 18.672 c +354.698 18.672 l +354.698 18.672 l +354.830 18.804 l +354.830 18.804 l +354.830 18.936 354.830 18.936 354.830 18.936 c +354.830 18.936 l +354.830 18.936 354.830 18.936 354.830 18.936 c +354.962 18.936 l +354.962 19.069 l +354.962 19.069 l +355.094 19.201 l +355.094 19.201 l +355.094 19.201 355.094 19.201 355.094 19.201 c +355.094 19.334 l +355.094 19.334 355.094 19.334 355.094 19.334 c +355.227 19.334 l +355.227 19.466 l +355.227 19.466 l +355.227 19.599 l +355.359 19.599 l +355.359 19.599 355.359 19.599 355.359 19.599 c +355.359 19.599 l +355.359 19.731 355.359 19.731 355.359 19.731 c +355.491 19.731 l +355.491 19.731 l +355.491 19.863 l +355.491 19.863 355.491 19.863 355.491 19.863 c +355.491 19.863 l +355.624 19.996 l +355.624 19.996 l +355.624 20.128 355.624 20.128 355.624 20.128 c +355.624 20.128 l +355.624 20.128 l +355.756 20.128 l +355.756 20.261 355.756 20.261 355.756 20.261 c +355.756 20.261 l +355.888 20.261 l +355.888 20.393 l +355.888 20.393 355.888 20.393 355.888 20.393 c +355.888 20.526 l +355.888 20.526 l +355.888 20.526 355.888 20.526 356.020 20.526 c +356.020 20.526 l +356.020 20.658 l +356.020 20.658 l +356.153 20.791 l +356.153 20.791 l +356.153 20.791 356.153 20.791 356.153 20.791 c +356.153 20.923 l +356.153 20.923 356.153 20.923 356.285 20.923 c +356.285 20.923 l +356.285 21.055 l +356.285 21.055 l +356.417 21.188 l +356.417 21.188 l +356.417 21.188 356.417 21.188 356.417 21.188 c +356.417 21.188 l +356.417 21.320 356.417 21.320 356.417 21.320 c +356.550 21.320 l +356.550 21.320 l +356.550 21.453 l +356.550 21.453 356.550 21.453 356.550 21.453 c +356.682 21.453 l +356.682 21.585 l +356.682 21.585 356.682 21.585 356.682 21.585 c +356.682 21.585 l +356.682 21.718 356.682 21.718 356.682 21.718 c +356.814 21.718 l +356.814 21.718 l +356.814 21.718 l +356.814 21.850 356.814 21.850 356.814 21.850 c +356.814 21.850 l +356.947 21.850 l +356.947 21.982 l +356.947 21.982 356.947 21.982 356.947 21.982 c +357.079 22.115 l +357.079 22.115 l +357.079 22.115 l +357.079 22.247 357.079 22.115 357.079 22.115 c +357.079 22.247 l +357.211 22.247 l +357.211 22.380 l +357.211 22.380 l +357.211 22.512 357.211 22.380 357.211 22.380 c +357.211 22.512 l +357.211 22.512 357.211 22.512 357.343 22.512 c +357.343 22.512 l +357.343 22.645 l +357.476 22.645 l +357.476 22.777 l +357.476 22.777 l +357.476 22.777 357.476 22.777 357.476 22.777 c +357.476 22.777 l +357.476 22.910 357.476 22.910 357.608 22.910 c +357.608 22.910 l +357.608 23.042 l +357.608 23.042 l +357.740 23.042 l +357.740 23.174 l +357.740 23.174 357.740 23.174 357.740 23.174 c +357.740 23.174 l +357.740 23.307 357.740 23.307 357.873 23.307 c +357.873 23.307 l +357.873 23.307 l +357.873 23.307 l +357.873 23.439 357.873 23.439 357.873 23.439 c +358.005 23.439 l +358.005 23.439 l +358.005 23.572 l +358.005 23.704 358.005 23.572 358.005 23.572 c +358.137 23.704 l +358.137 23.704 l +358.137 23.704 l +358.137 23.837 358.137 23.837 358.137 23.837 c +358.137 23.837 l +358.269 23.837 l +358.269 23.969 l +358.269 23.969 358.269 23.969 358.269 23.969 c +358.402 23.969 l +358.402 24.101 l +358.402 24.101 358.269 24.101 358.402 24.101 c +358.402 24.101 l +358.402 24.234 l +358.534 24.234 l +358.534 24.366 l +358.534 24.366 l +358.534 24.366 358.534 24.366 358.534 24.366 c +358.534 24.366 l +358.534 24.499 358.534 24.499 358.666 24.499 c +358.666 24.499 l +358.666 24.631 l +358.799 24.631 l +358.799 24.631 l +358.799 24.764 l +358.799 24.764 358.799 24.764 358.799 24.764 c +358.799 24.764 l +358.799 24.896 358.799 24.896 358.931 24.896 c +358.931 24.896 l +358.931 24.896 l +359.063 25.029 l +359.063 25.029 l +359.063 25.161 l +359.063 25.161 359.063 25.161 359.063 25.161 c +359.063 25.161 l +359.063 25.293 359.063 25.161 359.195 25.161 c +359.195 25.293 l +359.195 25.293 l +359.195 25.293 l +359.195 25.426 359.195 25.426 359.195 25.426 c +359.328 25.426 l +359.328 25.426 l +359.328 25.558 l +359.328 25.558 359.328 25.558 359.328 25.558 c +359.460 25.558 l +359.460 25.691 l +359.460 25.691 l +359.460 25.691 359.460 25.691 359.460 25.691 c +359.592 25.823 l +359.592 25.823 l +359.592 25.956 l +359.592 25.956 l +359.592 25.956 359.592 25.956 359.725 25.956 c +359.725 25.956 l +359.725 26.088 359.725 26.088 359.725 26.088 c +359.725 26.088 l +359.725 26.220 l +359.857 26.220 l +359.857 26.220 l +359.857 26.353 l +359.857 26.353 359.857 26.353 359.989 26.353 c +359.989 26.353 l +359.989 26.485 359.857 26.485 359.989 26.485 c +359.989 26.485 l +359.989 26.485 l +360.121 26.618 l +360.121 26.618 l +360.121 26.750 l +360.121 26.750 360.121 26.750 360.121 26.750 c +360.121 26.750 l +360.121 26.883 360.121 26.750 360.254 26.750 c +360.254 26.883 l +360.254 26.883 l +360.254 26.883 l +360.254 27.015 360.254 27.015 360.386 27.015 c +360.386 27.015 l +360.386 27.015 l +360.386 27.148 l +360.386 27.148 360.386 27.148 360.518 27.148 c +360.518 27.148 l +360.518 27.280 l +360.518 27.280 l +360.518 27.280 360.518 27.280 360.518 27.280 c +360.651 27.412 l +360.651 27.412 l +360.651 27.545 l +360.651 27.545 360.651 27.545 360.783 27.545 c +360.783 27.545 l +360.783 27.545 l +360.783 27.677 360.783 27.677 360.783 27.677 c +360.783 27.677 l +360.915 27.810 l +360.915 27.810 l +360.915 27.810 l +361.047 27.942 l +360.915 27.942 360.915 27.942 361.047 27.942 c +361.047 27.942 l +361.047 28.075 361.047 28.075 361.047 28.075 c +361.047 28.075 l +361.180 28.075 l +361.180 28.207 l +361.180 28.207 l +361.180 28.339 l +361.180 28.339 361.180 28.339 361.312 28.339 c +361.312 28.339 l +361.312 28.339 361.312 28.339 361.312 28.339 c +361.312 28.472 l +361.312 28.472 l +361.444 28.604 l +361.444 28.604 l +361.444 28.604 l +361.444 28.737 361.444 28.737 361.577 28.737 c +361.577 28.737 l +361.577 28.737 361.444 28.737 361.577 28.737 c +361.577 28.737 l +361.577 28.869 l +361.577 28.869 l +361.577 28.869 361.577 28.869 361.709 28.869 c +361.709 29.002 l +361.709 29.002 l +361.709 29.134 l +361.709 29.134 361.709 29.134 361.841 29.134 c +361.841 29.134 l +361.841 29.134 l +361.841 29.266 l +361.841 29.266 361.841 29.266 361.974 29.266 c +361.974 29.399 l +361.974 29.399 l +361.974 29.531 l +361.974 29.531 361.974 29.531 362.106 29.531 c +362.106 29.531 l +362.106 29.531 l +361.974 29.531 361.974 29.531 361.974 29.664 c +361.974 29.664 l +361.974 29.664 l +361.974 29.664 l +361.841 29.664 361.841 29.664 361.841 29.664 c +361.841 29.796 l +361.709 29.796 l +361.709 29.796 l +361.709 29.796 361.709 29.796 361.709 29.929 c +361.577 29.929 l +361.577 29.929 l +361.577 29.929 l +361.444 29.929 361.577 29.929 361.577 29.929 c +361.444 30.061 l +361.444 30.061 l +361.312 30.061 l +361.312 30.061 361.312 30.061 361.312 30.194 c +361.312 30.194 l +361.180 30.194 l +361.180 30.194 l +361.180 30.194 361.180 30.194 361.180 30.194 c +361.047 30.326 l +361.047 30.326 l +360.915 30.326 l +360.915 30.326 360.915 30.326 360.915 30.326 c +360.915 30.458 l +360.915 30.458 l +360.783 30.458 360.783 30.458 360.783 30.458 c +360.783 30.458 l +360.783 30.458 l +360.783 30.591 l +360.651 30.591 360.651 30.458 360.651 30.591 c +360.651 30.591 l +360.651 30.591 l +360.518 30.723 l +360.518 30.723 360.518 30.723 360.518 30.723 c +360.386 30.723 l +360.386 30.723 l +360.386 30.856 l +360.254 30.856 360.386 30.723 360.386 30.856 c +360.254 30.723 l +f +1.00 g +[] 0 d +389.093 30.591 m +391.077 30.591 392.665 30.194 393.855 29.399 c +394.914 28.737 395.443 27.545 395.443 25.823 c +395.443 25.029 395.310 24.234 395.046 23.704 c +394.781 23.042 394.384 22.645 393.723 22.247 c +393.194 21.850 392.532 21.585 391.739 21.320 c +390.813 21.188 389.887 21.055 388.828 21.055 c +387.638 21.055 l +387.638 16.023 l +384.992 16.023 l +384.992 30.194 l +385.521 30.326 386.182 30.458 386.976 30.458 c +387.770 30.591 388.431 30.591 389.093 30.591 c +389.093 30.591 l +389.225 28.339 m +388.564 28.339 388.034 28.339 387.638 28.207 c +387.638 23.307 l +388.828 23.307 l +390.151 23.307 391.077 23.572 391.739 23.837 c +392.400 24.234 392.797 24.896 392.797 25.823 c +392.797 26.353 392.665 26.750 392.532 27.015 c +392.268 27.412 392.003 27.677 391.739 27.810 c +391.474 27.942 391.077 28.075 390.680 28.207 c +390.151 28.339 389.754 28.339 389.225 28.339 c +389.225 28.339 l +f +1.00 g +[] 0 d +407.216 21.453 m +407.216 20.658 407.084 19.863 406.820 19.069 c +406.555 18.407 406.290 17.877 405.761 17.347 c +405.364 16.817 404.835 16.420 404.174 16.155 c +403.512 15.890 402.719 15.758 402.057 15.758 c +401.263 15.758 400.470 15.890 399.941 16.155 c +399.279 16.420 398.750 16.817 398.221 17.347 c +397.824 17.877 397.427 18.407 397.162 19.069 c +396.898 19.863 396.766 20.658 396.766 21.453 c +396.766 22.380 396.898 23.174 397.162 23.837 c +397.427 24.499 397.824 25.161 398.221 25.558 c +398.750 26.088 399.279 26.485 399.941 26.750 c +400.602 27.015 401.263 27.148 402.057 27.148 c +402.719 27.148 403.512 27.015 404.042 26.750 c +404.703 26.485 405.364 26.088 405.761 25.558 c +406.158 25.161 406.555 24.499 406.820 23.837 c +407.084 23.174 407.216 22.380 407.216 21.453 c +407.216 21.453 l +404.571 21.453 m +404.571 22.512 404.438 23.439 403.909 24.101 c +403.512 24.631 402.851 25.029 402.057 25.029 c +401.131 25.029 400.470 24.631 400.073 24.101 c +399.544 23.439 399.411 22.512 399.411 21.453 c +399.411 20.393 399.544 19.466 400.073 18.936 c +400.470 18.274 401.131 17.877 402.057 17.877 c +402.851 17.877 403.512 18.274 403.909 18.936 c +404.438 19.466 404.571 20.393 404.571 21.453 c +404.571 21.453 l +f +1.00 g +[] 0 d +416.080 22.910 m +415.683 21.718 415.418 20.526 415.022 19.334 c +414.625 18.142 414.360 17.082 413.963 16.023 c +411.847 16.023 l +411.582 16.685 411.317 17.347 411.053 18.274 c +410.656 19.069 410.391 19.863 410.127 20.791 c +409.730 21.718 409.465 22.777 409.201 23.704 c +408.936 24.764 408.539 25.823 408.275 26.883 c +410.921 26.883 l +411.053 26.353 411.185 25.691 411.450 25.029 c +411.582 24.366 411.714 23.704 411.847 22.910 c +412.111 22.247 412.243 21.585 412.508 20.923 c +412.640 20.261 412.905 19.599 413.037 19.069 c +413.302 19.731 413.434 20.393 413.699 21.055 c +413.831 21.718 414.095 22.380 414.228 23.042 c +414.360 23.837 414.625 24.499 414.757 25.029 c +414.889 25.691 415.022 26.353 415.154 26.883 c +417.138 26.883 l +417.270 26.353 417.403 25.691 417.535 25.029 c +417.667 24.499 417.800 23.837 418.064 23.042 c +418.196 22.380 418.329 21.718 418.593 21.055 c +418.726 20.393 418.990 19.731 419.122 19.069 c +419.387 19.599 419.519 20.261 419.784 20.923 c +419.916 21.585 420.181 22.247 420.313 22.910 c +420.445 23.704 420.710 24.366 420.842 25.029 c +420.975 25.691 421.107 26.353 421.239 26.883 c +423.885 26.883 l +423.620 25.823 423.356 24.764 422.959 23.704 c +422.694 22.777 422.430 21.718 422.033 20.791 c +421.768 19.863 421.504 19.069 421.107 18.274 c +420.842 17.347 420.578 16.685 420.313 16.023 c +418.196 16.023 l +417.800 17.082 417.535 18.142 417.138 19.334 c +416.741 20.526 416.344 21.718 416.080 22.910 c +416.080 22.910 l +f +1.00 g +[] 0 d +425.208 21.453 m +425.208 22.380 425.340 23.174 425.605 23.969 c +425.869 24.631 426.266 25.293 426.663 25.691 c +427.192 26.220 427.721 26.618 428.383 26.750 c +428.912 27.015 429.573 27.148 430.235 27.148 c +431.690 27.148 432.881 26.750 433.674 25.823 c +434.600 24.896 434.997 23.439 434.997 21.585 c +434.997 21.453 434.997 21.320 434.997 21.188 c +434.997 20.923 434.997 20.791 434.865 20.658 c +427.721 20.658 l +427.854 19.863 428.118 19.201 428.647 18.672 c +429.176 18.142 429.970 18.009 431.029 18.009 c +431.690 18.009 432.219 18.009 432.748 18.142 c +433.277 18.274 433.674 18.407 433.939 18.407 c +434.203 16.420 l +434.071 16.288 433.939 16.288 433.674 16.155 c +433.410 16.155 433.145 16.023 432.881 16.023 c +432.484 15.890 432.219 15.890 431.822 15.890 c +431.425 15.758 431.161 15.758 430.764 15.758 c +429.838 15.758 428.912 15.890 428.250 16.155 c +427.589 16.420 426.928 16.817 426.531 17.347 c +426.002 17.877 425.737 18.539 425.472 19.201 c +425.340 19.863 425.208 20.658 425.208 21.453 c +425.208 21.453 l +432.484 22.512 m +432.484 22.910 432.351 23.174 432.351 23.572 c +432.219 23.837 432.087 24.101 431.822 24.366 c +431.690 24.631 431.425 24.764 431.161 24.896 c +430.896 25.029 430.632 25.029 430.235 25.029 c +429.838 25.029 429.441 25.029 429.176 24.896 c +428.912 24.764 428.647 24.499 428.515 24.234 c +428.250 24.101 428.118 23.837 427.986 23.439 c +427.854 23.174 427.854 22.910 427.721 22.512 c +432.484 22.512 l +f +1.00 g +[] 0 d +443.861 24.631 m +443.596 24.764 443.331 24.764 442.935 24.896 c +442.538 24.896 442.141 25.029 441.612 25.029 c +441.347 25.029 441.083 24.896 440.818 24.896 c +440.421 24.896 440.289 24.764 440.156 24.764 c +440.156 16.023 l +437.643 16.023 l +437.643 26.353 l +438.040 26.618 438.701 26.750 439.495 26.883 c +440.156 27.015 440.950 27.148 441.876 27.148 c +442.009 27.148 442.273 27.148 442.405 27.148 c +442.670 27.148 442.935 27.015 443.067 27.015 c +443.331 27.015 443.596 26.883 443.728 26.883 c +443.993 26.883 444.125 26.750 444.257 26.750 c +443.861 24.631 l +f +1.00 g +[] 0 d +445.448 21.453 m +445.448 22.380 445.580 23.174 445.845 23.969 c +446.109 24.631 446.506 25.293 446.903 25.691 c +447.432 26.220 447.962 26.618 448.623 26.750 c +449.152 27.015 449.814 27.148 450.475 27.148 c +451.930 27.148 453.121 26.750 453.915 25.823 c +454.708 24.896 455.237 23.439 455.237 21.585 c +455.237 21.453 455.237 21.320 455.105 21.188 c +455.105 20.923 455.105 20.791 455.105 20.658 c +447.962 20.658 l +448.094 19.863 448.358 19.201 448.888 18.672 c +449.417 18.142 450.210 18.009 451.269 18.009 c +451.930 18.009 452.459 18.009 452.989 18.142 c +453.518 18.274 453.915 18.407 454.179 18.407 c +454.444 16.420 l +454.311 16.288 454.179 16.288 453.915 16.155 c +453.650 16.155 453.385 16.023 453.121 16.023 c +452.724 15.890 452.459 15.890 452.063 15.890 c +451.666 15.758 451.401 15.758 451.004 15.758 c +449.946 15.758 449.152 15.890 448.491 16.155 c +447.829 16.420 447.168 16.817 446.771 17.347 c +446.242 17.877 445.977 18.539 445.713 19.201 c +445.448 19.863 445.448 20.658 445.448 21.453 c +445.448 21.453 l +452.724 22.512 m +452.724 22.910 452.592 23.174 452.459 23.572 c +452.459 23.837 452.327 24.101 452.063 24.366 c +451.930 24.631 451.666 24.764 451.401 24.896 c +451.136 25.029 450.872 25.029 450.475 25.029 c +450.078 25.029 449.681 25.029 449.417 24.896 c +449.152 24.764 448.888 24.499 448.755 24.234 c +448.491 24.101 448.358 23.837 448.226 23.439 c +448.094 23.174 448.094 22.910 447.962 22.512 c +452.724 22.512 l +f +1.00 g +[] 0 d +459.868 21.453 m +459.868 20.393 460.132 19.466 460.661 18.936 c +461.058 18.274 461.852 18.009 462.778 18.009 c +463.175 18.009 463.572 18.009 463.836 18.009 c +464.101 18.009 464.365 18.009 464.498 18.142 c +464.498 24.366 l +464.233 24.499 463.969 24.631 463.572 24.764 c +463.307 24.896 462.910 25.029 462.381 25.029 c +461.587 25.029 460.926 24.631 460.397 24.101 c +460.000 23.439 459.868 22.512 459.868 21.453 c +459.868 21.453 l +467.011 16.420 m +466.482 16.155 465.953 16.023 465.159 15.890 c +464.365 15.890 463.572 15.758 462.778 15.758 c +461.852 15.758 461.190 15.890 460.397 16.155 c +459.735 16.420 459.206 16.817 458.677 17.347 c +458.280 17.745 457.883 18.407 457.619 19.069 c +457.354 19.731 457.222 20.526 457.222 21.453 c +457.222 22.247 457.354 23.042 457.619 23.837 c +457.751 24.499 458.148 25.029 458.545 25.558 c +458.942 26.088 459.471 26.485 460.000 26.750 c +460.661 27.015 461.323 27.148 462.117 27.148 c +462.646 27.148 463.043 27.015 463.439 26.883 c +463.836 26.883 464.233 26.750 464.498 26.485 c +464.498 31.783 l +467.011 32.180 l +467.011 16.420 l +f +Q +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +1.000 0.000 0.000 rg +784.08 720.59 Td +(Note!) Tj +ET +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +780.480 722.880 m +766.080 722.880 l +769.680 726.480 l +S +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +766.080 722.880 m +769.680 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +1.000 0.000 0.000 rg +784.08 563.63 Td +(Note!) Tj +ET +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +780.480 565.920 m +766.080 565.920 l +769.680 569.520 l +S +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +766.080 565.920 m +769.680 562.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +672.48 619.79 Td +(E22P-915M30S) Tj +ET +0.80 0.00 0.00 rg +656.28 233.28 m 656.28 234.27 655.47 235.08 654.48 235.08 c +653.49 235.08 652.68 234.27 652.68 233.28 c +652.68 232.29 653.49 231.48 654.48 231.48 c +655.47 231.48 656.28 232.29 656.28 233.28 c +f +0.80 0.00 0.00 rg +562.68 1082.88 m 562.68 1083.87 561.87 1084.68 560.88 1084.68 c +559.89 1084.68 559.08 1083.87 559.08 1082.88 c +559.08 1081.89 559.89 1081.08 560.88 1081.08 c +561.87 1081.08 562.68 1081.89 562.68 1082.88 c +f +0.80 0.00 0.00 rg +382.68 1093.68 m 382.68 1094.67 381.87 1095.48 380.88 1095.48 c +379.89 1095.48 379.08 1094.67 379.08 1093.68 c +379.08 1092.69 379.89 1091.88 380.88 1091.88 c +381.87 1091.88 382.68 1092.69 382.68 1093.68 c +f +0.80 0.00 0.00 rg +731.88 748.08 m 731.88 749.07 731.07 749.88 730.08 749.88 c +729.09 749.88 728.28 749.07 728.28 748.08 c +728.28 747.09 729.09 746.28 730.08 746.28 c +731.07 746.28 731.88 747.09 731.88 748.08 c +f +0.80 0.00 0.00 rg +483.48 758.88 m 483.48 759.87 482.67 760.68 481.68 760.68 c +480.69 760.68 479.88 759.87 479.88 758.88 c +479.88 757.89 480.69 757.08 481.68 757.08 c +482.67 757.08 483.48 757.89 483.48 758.88 c +f +0.80 0.00 0.00 rg +731.88 679.68 m 731.88 680.67 731.07 681.48 730.08 681.48 c +729.09 681.48 728.28 680.67 728.28 679.68 c +728.28 678.69 729.09 677.88 730.08 677.88 c +731.07 677.88 731.88 678.69 731.88 679.68 c +f +0.80 0.00 0.00 rg +731.88 708.48 m 731.88 709.47 731.07 710.28 730.08 710.28 c +729.09 710.28 728.28 709.47 728.28 708.48 c +728.28 707.49 729.09 706.68 730.08 706.68 c +731.07 706.68 731.88 707.49 731.88 708.48 c +f +0.80 0.00 0.00 rg +731.88 694.08 m 731.88 695.07 731.07 695.88 730.08 695.88 c +729.09 695.88 728.28 695.07 728.28 694.08 c +728.28 693.09 729.09 692.28 730.08 692.28 c +731.07 692.28 731.88 693.09 731.88 694.08 c +f +0.80 0.00 0.00 rg +731.88 686.88 m 731.88 687.87 731.07 688.68 730.08 688.68 c +729.09 688.68 728.28 687.87 728.28 686.88 c +728.28 685.89 729.09 685.08 730.08 685.08 c +731.07 685.08 731.88 685.89 731.88 686.88 c +f +0.80 0.00 0.00 rg +483.48 679.68 m 483.48 680.67 482.67 681.48 481.68 681.48 c +480.69 681.48 479.88 680.67 479.88 679.68 c +479.88 678.69 480.69 677.88 481.68 677.88 c +482.67 677.88 483.48 678.69 483.48 679.68 c +f +0.80 0.00 0.00 rg +483.48 686.88 m 483.48 687.87 482.67 688.68 481.68 688.68 c +480.69 688.68 479.88 687.87 479.88 686.88 c +479.88 685.89 480.69 685.08 481.68 685.08 c +482.67 685.08 483.48 685.89 483.48 686.88 c +f +0.80 0.00 0.00 rg +483.48 694.08 m 483.48 695.07 482.67 695.88 481.68 695.88 c +480.69 695.88 479.88 695.07 479.88 694.08 c +479.88 693.09 480.69 692.28 481.68 692.28 c +482.67 692.28 483.48 693.09 483.48 694.08 c +f +0.80 0.00 0.00 rg +483.48 708.48 m 483.48 709.47 482.67 710.28 481.68 710.28 c +480.69 710.28 479.88 709.47 479.88 708.48 c +479.88 707.49 480.69 706.68 481.68 706.68 c +482.67 706.68 483.48 707.49 483.48 708.48 c +f +0.80 0.00 0.00 rg +731.88 593.28 m 731.88 594.27 731.07 595.08 730.08 595.08 c +729.09 595.08 728.28 594.27 728.28 593.28 c +728.28 592.29 729.09 591.48 730.08 591.48 c +731.07 591.48 731.88 592.29 731.88 593.28 c +f +0.80 0.00 0.00 rg +731.88 524.88 m 731.88 525.87 731.07 526.68 730.08 526.68 c +729.09 526.68 728.28 525.87 728.28 524.88 c +728.28 523.89 729.09 523.08 730.08 523.08 c +731.07 523.08 731.88 523.89 731.88 524.88 c +f +0.80 0.00 0.00 rg +731.88 532.08 m 731.88 533.07 731.07 533.88 730.08 533.88 c +729.09 533.88 728.28 533.07 728.28 532.08 c +728.28 531.09 729.09 530.28 730.08 530.28 c +731.07 530.28 731.88 531.09 731.88 532.08 c +f +0.80 0.00 0.00 rg +731.88 539.28 m 731.88 540.27 731.07 541.08 730.08 541.08 c +729.09 541.08 728.28 540.27 728.28 539.28 c +728.28 538.29 729.09 537.48 730.08 537.48 c +731.07 537.48 731.88 538.29 731.88 539.28 c +f +0.80 0.00 0.00 rg +731.88 553.68 m 731.88 554.67 731.07 555.48 730.08 555.48 c +729.09 555.48 728.28 554.67 728.28 553.68 c +728.28 552.69 729.09 551.88 730.08 551.88 c +731.07 551.88 731.88 552.69 731.88 553.68 c +f +0.80 0.00 0.00 rg +163.08 408.24 m 163.08 409.23 162.27 410.04 161.28 410.04 c +160.29 410.04 159.48 409.23 159.48 408.24 c +159.48 407.25 160.29 406.44 161.28 406.44 c +162.27 406.44 163.08 407.25 163.08 408.24 c +f +0.80 0.00 0.00 rg +163.08 386.64 m 163.08 387.63 162.27 388.44 161.28 388.44 c +160.29 388.44 159.48 387.63 159.48 386.64 c +159.48 385.65 160.29 384.84 161.28 384.84 c +162.27 384.84 163.08 385.65 163.08 386.64 c +f +0.80 0.00 0.00 rg +163.08 393.84 m 163.08 394.83 162.27 395.64 161.28 395.64 c +160.29 395.64 159.48 394.83 159.48 393.84 c +159.48 392.85 160.29 392.04 161.28 392.04 c +162.27 392.04 163.08 392.85 163.08 393.84 c +f +0.80 0.00 0.00 rg +163.08 379.44 m 163.08 380.43 162.27 381.24 161.28 381.24 c +160.29 381.24 159.48 380.43 159.48 379.44 c +159.48 378.45 160.29 377.64 161.28 377.64 c +162.27 377.64 163.08 378.45 163.08 379.44 c +f +0.80 0.00 0.00 rg +98.28 1093.68 m 98.28 1094.67 97.47 1095.48 96.48 1095.48 c +95.49 1095.48 94.68 1094.67 94.68 1093.68 c +94.68 1092.69 95.49 1091.88 96.48 1091.88 c +97.47 1091.88 98.28 1092.69 98.28 1093.68 c +f +0.80 0.00 0.00 rg +278.28 1082.88 m 278.28 1083.87 277.47 1084.68 276.48 1084.68 c +275.49 1084.68 274.68 1083.87 274.68 1082.88 c +274.68 1081.89 275.49 1081.08 276.48 1081.08 c +277.47 1081.08 278.28 1081.89 278.28 1082.88 c +f +0.80 0.00 0.00 rg +724.68 841.68 m 724.68 842.67 723.87 843.48 722.88 843.48 c +721.89 843.48 721.08 842.67 721.08 841.68 c +721.08 840.69 721.89 839.88 722.88 839.88 c +723.87 839.88 724.68 840.69 724.68 841.68 c +f +0.80 0.00 0.00 rg +724.68 834.48 m 724.68 835.47 723.87 836.28 722.88 836.28 c +721.89 836.28 721.08 835.47 721.08 834.48 c +721.08 833.49 721.89 832.68 722.88 832.68 c +723.87 832.68 724.68 833.49 724.68 834.48 c +f +0.80 0.00 0.00 rg +724.68 827.28 m 724.68 828.27 723.87 829.08 722.88 829.08 c +721.89 829.08 721.08 828.27 721.08 827.28 c +721.08 826.29 721.89 825.48 722.88 825.48 c +723.87 825.48 724.68 826.29 724.68 827.28 c +f +0.80 0.00 0.00 rg +724.68 816.48 m 724.68 817.47 723.87 818.28 722.88 818.28 c +721.89 818.28 721.08 817.47 721.08 816.48 c +721.08 815.49 721.89 814.68 722.88 814.68 c +723.87 814.68 724.68 815.49 724.68 816.48 c +f +0.80 0.00 0.00 rg +688.68 816.48 m 688.68 817.47 687.87 818.28 686.88 818.28 c +685.89 818.28 685.08 817.47 685.08 816.48 c +685.08 815.49 685.89 814.68 686.88 814.68 c +687.87 814.68 688.68 815.49 688.68 816.48 c +f +0.80 0.00 0.00 rg +681.48 816.48 m 681.48 817.47 680.67 818.28 679.68 818.28 c +678.69 818.28 677.88 817.47 677.88 816.48 c +677.88 815.49 678.69 814.68 679.68 814.68 c +680.67 814.68 681.48 815.49 681.48 816.48 c +f +0.80 0.00 0.00 rg +674.28 816.48 m 674.28 817.47 673.47 818.28 672.48 818.28 c +671.49 818.28 670.68 817.47 670.68 816.48 c +670.68 815.49 671.49 814.68 672.48 814.68 c +673.47 814.68 674.28 815.49 674.28 816.48 c +f +0.80 0.00 0.00 rg +724.68 884.88 m 724.68 885.87 723.87 886.68 722.88 886.68 c +721.89 886.68 721.08 885.87 721.08 884.88 c +721.08 883.89 721.89 883.08 722.88 883.08 c +723.87 883.08 724.68 883.89 724.68 884.88 c +f +0.80 0.00 0.00 rg +231.48 329.04 m 231.48 330.03 230.67 330.84 229.68 330.84 c +228.69 330.84 227.88 330.03 227.88 329.04 c +227.88 328.05 228.69 327.24 229.68 327.24 c +230.67 327.24 231.48 328.05 231.48 329.04 c +f +0.80 0.00 0.00 rg +209.88 329.04 m 209.88 330.03 209.07 330.84 208.08 330.84 c +207.09 330.84 206.28 330.03 206.28 329.04 c +206.28 328.05 207.09 327.24 208.08 327.24 c +209.07 327.24 209.88 328.05 209.88 329.04 c +f +0.80 0.00 0.00 rg +663.48 1082.88 m 663.48 1083.87 662.67 1084.68 661.68 1084.68 c +660.69 1084.68 659.88 1083.87 659.88 1082.88 c +659.88 1081.89 660.69 1081.08 661.68 1081.08 c +662.67 1081.08 663.48 1081.89 663.48 1082.88 c +f +0.80 0.00 0.00 rg +717.48 1082.88 m 717.48 1083.87 716.67 1084.68 715.68 1084.68 c +714.69 1084.68 713.88 1083.87 713.88 1082.88 c +713.88 1081.89 714.69 1081.08 715.68 1081.08 c +716.67 1081.08 717.48 1081.89 717.48 1082.88 c +f +Q +endstream +endobj +1 0 obj +<> +endobj +5 0 obj +<< +/Type /FontDescriptor +/FontName /SimSun +/FontBBox [-8 -145 1000 859] +/Flags 32 +/StemV 0 +/ItalicAngle 0 +/Ascent 859 +/Descent -141 +/CapHeight 175 +>> +endobj +6 0 obj +<< +/Type /Font +/BaseFont /SimSun +/FontDescriptor 5 0 R +/W [1 95 500] +/Subtype /CIDFontType2 +/CIDSystemInfo +<< +/Ordering (GB1) +/Registry (Adobe) +/Supplement 2 +>> +>> +endobj +7 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /SimSun +/Encoding /UniGB-UCS2-H +/DescendantFonts [6 0 R] +>> +endobj +8 0 obj +<< +/Descent -325 +/CapHeight 500 +/StemV 80 +/Type /FontDescriptor +/Flags 32 +/FontBBox [-665 -325 2000 1006] +/FontName /Arial +/ItalicAngle 0 +/Ascent 1006 +>> +endobj +9 0 obj +<> +endobj +10 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1024 +/Height 1024 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/DecodeParms <> +/SMask 11 0 R +/Length 56607 +/Filter /FlateDecode +>> +stream +xìÝ{\ÎwÇñ]))D¸™{ErNsÊ!•™c9Ω-gCưp/& cMCJF4sHrÓœ)6‡ms\ÎB)Ý÷o³‡ÍnÕ«>¿ëú½žx¸ïÝwß×®ëzs]¿Ÿî¿ÿýï+´AÇ´ƒhР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„ .<8wîÜ™3g._¾|íIþéÝ»w¥þÎÂÂÂÆÆFùNáÂ…íW²dIåÛ%J899U¨PÁÎÎNº`HJKKKùÝÑ£GO:¥¼î¿páBNNŽt€/^\™+V¬^½ºËï*Uªdff&Ý¥E €|u÷îÝ}ûöíܹs÷î݇¾té’t€ŒÂ… רQ£Aƒ5rwwwtt”.Ò +@žËÌÌLJJÚ°aƒòmrrrvv¶t€ê8995nܸeË–mÚ´)Uª”tŽ)cä•sçέ[·.11qÛ¶m¼qàét:WWW//¯¶mÛ6hЀ· ÀÀ.\¸ðÕW_ÅÅÅíÚµ‹[€—ñꫯvèСsçÎîîîÊ0Î1 ÃHOOŽŽV^÷ó)^Ãrrrò÷÷ïׯ_åÊ•¥[ŒàesæÌC‡I·hK‰%”0dÈÒ¥KK·€ÞîܹvîÜ9éí*X°`×®]ƒ‚‚jÔ¨!ÝbLz¸víZhhhxx8ïöP N×¶mÛI“&¹¹¹I·À Q^ñ+¯û§M›vóæMé<…§§çÇ\»vméµc<Çýû÷gÍšzãÆ é<‹™™Y§NBBB*Uª$Ý¢^ €g‰6lØéÓ§¥Cð¢,,,'Ožlgg'Ý¢F €§;|øððáÓ’’¤Cööö&L|(Ý€—Ò°aÃùóçW¯^]:DEOؾ}û€N:%ð°°xï½÷&Mšdii)Ý¢ + €?ܸqcذa111Ò!0¼jÕªEFFÖ¯__:Dà7»víêÑ£ö0aæææ#GŽœ2eŠ………t‹$­€ìììÿüŽwühAýúõ—,YR¹reé1š?ýôS—.]:$€ückkáçç'"C»`ýúõ=zôàö^Ú0wî\ ¾H‹@ùWž>}ú¸qãrrr¤[ ¦qãÆ+V¬(S¦ŒtH¾ÒܸsçN·nÝÖ­['yŽŽŽ_ýu½zõ¤Cò¶ÀÅ‹}||>,µ°²²ŠŠŠêÚµ«tH>ÑÐHMMõööþå—_¤C .:nâĉÁÁÁÒ!ùA+ 11±K—.éééÒ!P©ÁƒÏž=ÛÌÌL:$oib¬X±¢GYYYÒ!P5??¿Å‹›ö¥L,]º´wïÞÙÙÙÒ!0>>>qqqVVVÒ!yÅÄ@DDÄÀ¹Ü'^\³fÍÖ®]kcc#’'LyÌ;wèС&ü/€<¢l€„„kkkéÃ3ÙÝ·o_þì¹Ó²eËøøxKKKé3ͰråJ???Þ÷€—Ѿ}û¸¸8ssséC2Á°víÚN:qͼ¼ž={FGGët:éƒ1µpàÀ¦M›Þ½{W:&bìØ±!!!ÒcRàÌ™3 4¸råŠtLJxxx`` t…a˜Î¸}û¶»»ûÑ£G¥C`jÌÍÍZµj%b&2²³³[·n½uëVé˜&[[ÛÝ»wW«VM:äe™Èxï½÷fΜ)]SöÚk¯íß¿ßÎÎN:䥘ˆõ÷÷—®€ék×®ÝêÕ«ú¢@F?Ž?^¯^½;wîH‡@BBBÆŽ+]‘{Æ=ÒÓÓÝÜÜNž<)bxUªT©ø»2eÊ”,YÒÞÞ¾H‘"666ÒuzðàÁÝ»w333¯ýîÊ•+g~÷Óïrrr¤ ¬@[¶liÚ´©tH.÷èß¿ÿÂ… ¥+ Cy}ß°aÃFÕ©SÇÅÅ¥T©RÒE/ëÞ½{ÇŽKNNÞµk×îÝ»Oœ8!]dŽŽŽ)))Å‹—É #«W¯~ë­·¤+^Š2=<<ÚüNyÑoÔo&x®+W®lܸ111qÓ¦Mׯ_—Îy):tX¹r¥tEnë¸xñ¢òŠùÚµkÒ!¹T½zõž={öîÝ»téÒÒ-ùíÁƒÊX¼xñš5k”ïKçäÒ¢E‹Þ~ûmé +½ëhÓ¦2¥+ôV¦L™nݺõêÕKY/Ò-ò®]»³wï^é½)R$55ÕÉÉI:D?F9¢££nlU¬Xqøðáï¼óŽ¥¥¥t €ê$''‡„„|õÕWÆõê´M›6‰‰‰Òú1¾põêÕjÕª¥¥¥I‡¼¨5jùûû›››K·¨ÚÑ£GCCC—.]š-Ýò¢bbbzôè!]¡ã~~~Ë—/—®x!ÊP™:uª¯¯/Ÿîxq'Ož Ž5ŠWªööößÿ½ƒƒƒtÈ‹2²°~ýzoooéŠç+T¨PPPÐûï¿Ï~r'))iàÀÇŽ“y¾^½zEGGKW¼(cYYYÎÎÎê¿|¬¯¯ïœ9sŒîã j£¼üûüóÏÇçÎé–gÑétÊ\iܸ±tÈ 1¦6räHéŠg)W®\DD„———t€é8wîÜ AƒÖ­['ò,nnnûöí333“y>£iiiUªT¹yó¦tÈ?òññ‰ŠŠ²··—05ÊKÖ9sæŒ=ZÍ7 0–OÍ œ7ožtÅÓ™››?~„ F±ùŒÔüüü~úé'é§sttüðCé§°··ÿùçŸmmm¥CžÅÀÉ“'«W¯®Â›Aøøø,_¾¼P¡BÒ!š5`À¾DTÆÉøñã¥+žÅ€:ïüÕ£GÈÈH éZ³f¿¿ÿýû÷¥Cž`ggwúôébÅŠI‡ü#µ€ãÇW¯^=''G:ä Æ ã#¿²¶oßþæ›oÞºuK:ä “&Mš8q¢tÅ?Rû˜?¾tÅÆ÷ÑGIWà7ûöíkÑ¢EzzºtÈŸΜ9cmm-òtªiiiNNNªúk^½zEEEét:éüaëÖ­mÛ¶ÍÌÌ”ùSDDD@@€tÅÓ©zOš4IºâOíÚµ[¹r¥¹¹¹tžÛ½{wõ¼o¼J•*?üðƒ:ß1®Þ‘‘áääô믿J‡ü¡I“&6l°²²’ÀS„‡‡4HºâOk×®õõõ•®x +õ€%K–ôìÙSºâU«Vݽ{·tþѨQ£>ùäéŠ?´mÛ6!!Aºâ)Ô;š4i’””$]ñ++«={öÔ¬YS:ϒݬY³;vH‡üÆÌÌìçŸvrr’ù;•€“'O¾þúë*i[¸paß¾}¥+ð|çÏŸwuu½zõªtÈo‚ƒƒUxÇb•€Ñ£GϘ1Cºâ7]»v•®À‹JLLôööVëÜråÊ>}º@Ò!OPãÈÎÎvttTÃÇ_{íµØÚÚJ‡@AAA¡¡¡Ò¿Ù¸qc«V­¤+ž Æ°iÓ¦Ö­[KW¼¢lµ½{÷º¹¹I‡@?YYYuëÖ=räˆtÈ+}ûö]¸p¡tÅÔ8ú÷﯆¦ÁƒÏ™3Gº¹±sçNñ׺E‹½råJÁ‚e3þJu@™keÊ”¹víšlF©R¥Ž?®ü„Éf ×úöí»hÑ"éŠWÚ¶m+]ñ'Õ €ÄÄD5ü-^¼X=w!@.\»víõ×_¿"PïÞ½£¢¢dþJuàÝw߈ˆmhܸqRR’N§“ÍÀKR^X*//eŠ+–––¦žk©nT¨PáìÙ³‚ÊëþC‡ÕªUK°‘““ãêêš’’"›±sçÎFÉ6<¦®pìØ±5jÈ6´k×nÍš5² 0”åË—ûùùÉ6L˜0aòäɲ ©k̘1côèѲ ªÚgxI>¬^½ú‰'êÔ©³ÿ~Á€¿R×ðôôüæ›od6oÞ,ƒ[´hQß¾}ÌÌÌ.]ºäàà Øð˜Š@fffÑ¢E322¶mÛÖ´iSÁ\VVV•*UΜ9#ذ|ùò.]º<¦¢°{÷nÙ÷Þ4hÐ@i @ùì³Ï,0tèÐÙ³g <¦¢ þ€ ôë×O0yäÖ­[eÊ”¹ÿ¾T€››Û¤Nÿ+ €:¬ZµJêt++«K—.që_SÕ¥K—¸¸8©Ó (pãÆ"EŠH<¦¢Pºté+W®Hîïï¿téR©Ó×âããÛµk'°eË–-Z<¢–ðË/¿”/_^0`ýúõ^^^‚ÈSÙÙÙ¯¾úªàŸ8O›6m̘1R§?¦–àãã#uz©R¥ÎŸ?onn.€|0lذO?ýTêôîÝ»/Y²DêôÇÔ2¦N:nÜ8©Ó‡ "øKÀS½óÎ;õë×—½l3ÀÄÈ^vÒÅÅåÈ‘#R§?¦–Э[·eË–Iž˜˜Ø¦M©Óü¿¥K—vïÞ]ùŽ——×Â… Ë”)#]0>,UªÔµk×DN·°°HOO/X° Èé©eÔ¨QãØ±c"G[YY)¿ +*$r:€ÿwá—ëׯ?ú ,ðõõ•­˜ÿØØX©ÓSRRœ¥ND ''Gyý™™)rº§§çæÍ›EŽðÿ”„–-[nݺõoÿ}Ïž=ÃÃÃmllDª&cáÂ…ýû÷—:=..®S§NR§?¢ŠpþüùråÊIþá‡KàoÂÂÂFŽùÔT±bŘ˜ww÷|NþÉíÛ·SRRΞ={óæÍ[·n=ú¶hÑ¢¶¶¶vvvÊ·Ê/ZåûÒ¥þtâĉ×_]êôÐÐÐQ£FIþˆ*ÀŽ;<<<¤N߸qc«V­¤NðWßÿ}:užq›FssseL™2ÅÂÂ"?Àǔ_¥ñññûöíKNN>}úô‹<*3 fÍšõêÕóõõ­Q£F>Dxå·méÒ¥ýõW‘ÓøÙgŸ‰ý˜*@LLL¯^½¤N¿~ýz±bŤNðXfffýúõ_äòÊ )åq£J•*ùP<¢¼â_¹råêÕ«Ož<ù2_§R¥JíÛ·ïСƒàuHøøø$$$ˆíååµ~ýz‘£SŘ2eÊĉEŽvrr:sæŒÈÑþf̘1Ó§OÁÿ±µµõÔ©S‡ªÓéò´ +—““£¼J˜6mÚ®]» û•]]]‡îïïÏ_gùoܸqÊ“ˆÈÑU«VýþûïEŽ~L 00pÞ¼y"G+û/>>^ähµcÇŽ¦M›>|øP¯ÿWëÖ­###Ë–-›GU⬬¬/¾øâ“O>9}útÞR¾|ù#F 8Pü²€€¦,[¶¬[·n"G)RäöíÛ"G?¦ŠЩS§•+WŠ=zôèÿGyäÖ­[µjÕÊÝ_Ç•,YRy•Ö¾}{CGAÓ’’’œššš?ǽöÚkŸ~ú)w¤òÍ‘#G”ç©Ó322,--¥NE% Y³fß~û­ÈÑááá"Gx¬wïÞ‹/~™¯Ð³gÏÏ>û¬H‘"†J‚f]¾|yÔ¨QK—.ÍÿçÇ.]º„……9::æó¹€ݾ}[ðò\/^”½Á¥*€‹‹K¾ý)Ë߬_¿ÞËËKäh¬ZµªC‡/ÿu*T¨ýÆo¼ü—‚f%%%uíÚUÙRööö_~ùeëÖ­¥í(^¼ø7DŽ¿˜*@Ù²e/]º$r´2<¸" èâÅ‹...†º%{F5yòdÞN })φŸ~úéèÑ£³²²dKt:]PPPHHˆ™™™l `ÚjÕªõ"×Ë Û¶mkÚ´©ÈѨb.\øÞ½{"G_¾|¹T©R"GP||| ~54ggç%K–(»Â°_&,##£GRŸF{*__ßØØØB… +I‡&«eË–[¶l9zÕªU²]SÅ077×÷Ò¡Óé233¹þ eîܹC† É‹¯lee|öìÙ"GÏŸ?¿ÿþ"G?"?nÞ¼Y¬X1‘£Ë–-{á‘£?~üG}”oÇuîÜ9""Bꡪ5`À€ HW<_·nݾüòKé +ÀÔèuûyÚ;wî AƒDŽ~D~¤¥¥988ˆíää”»x»vízã7òù“?åË—ŽŽ–½êTeþüùÒ/jöìÙC‡•®LÊ„ þóŸÿˆ6bÄ‘£‘¿þú«Ôux*T¨§7xðÿîÞ½ëêêzêÔ©ü?Z§Ó 2dúôé²÷_„>|ØÝÝýþýûÒ!/ÊÜÜ|Ë–-Mš4‘LLJ~8yòd‘£g̘1räH‘£a0€|Õ¿ÿ…  +Ô¨Q#&&FððwëÖ­š5kž={V:D?¥K—NII)Y²¤t`"’€v¬Y³FöÊÇp‘PëÕ«—2¥+rãÍ7ß\½zµt`"’€F¤¥¥9;;_¹rE:äÍ›7ŠŠ*W®œtòÕªU«:tè ]‘{‘‘‘}úô‘®L@Ð__ßuëÖIW<ÁÎÎnΜ9={ö”A>Qžq”ª|+’{… NNN®\¹²t`ô’€DDD¼ûî»ÒO×¹sçyóæ/^\:yKy¾SV¨ +ïø«/ww÷íÛ·(P@:0n I ÀäýôÓO®®®j¾ñvéÒ¥###½¼¼¤C‡>ÿüóJWÆÔ©Sßÿ}é +À¸1$1Ó–íáá±gÏéçÐét ˜9s¦Ô½É‘§”Z«V­ôôtéð°°Ø¹sgݺu¥C#ÆÄLÛ¤I“‚ƒƒ¥+^TµjÕ–,Yâêê*C2–ª—ªU«\º0 I Àdäää4oÞ|ûöíÒ!†´víZ___é +èáâÅ‹ÎÎÎׯ_—Éo–––û÷ïWþÝ¥CãÀÄLFHHÈ| ]aHÒЃò¤æí혘("£V­Z{÷î-X° t`’€i8|øpƒ ‚’w‚ƒƒ•×:Ò€º0$1ã’™™Y¯^½””éƒáΩÆèÂ… ÎÎΦô””1z‹-zûí·¥+a I @å”G ooïÄÄDéCZ¶l™ŸŸŸtôp÷î]WW×S§NI‡˜›Ã‡W®\Y:ÄÄTnÖ¬Y#FŒ®0¤=zÄÄÄHW@?óçÏ—®0îîîÛ·o/P €t † ‰¨™é]qåÕW_MII)V¬˜tô°qãF///ñ',3mÚ´1cÆHWb’€jeee¹»»›ÒWÌÌÌ6oÞܼyséèáêÕ«ÎÎΗ/_–15»víªS§Žt ƒ ‰¨Öرc§M›&]aH£F + •®€~ºté']ašªU«vàÀkkké@@P§;w6iÒÄ”®¸¢¼Ö9xð •••tô°hÑ¢¾}ûJW˜²#F„……IW’€ +¥§§»ººþøãÒ!cii¹wïÞš5kJ‡@gΜQ~Ênß¾-bÊx_4‹ ‰¨PŸ>}¢¢¢¤+ IüÑúÊÉÉiѢŷß~+búSRRŠ/.ä+€$ 6«W¯~ë­·¤+ ÉÃÃcÛ¶m\ñ脆†IWhE·nݾüòKé + _1$1UQ~K:;;+ßJ‡ŒÝ‘#Gœœœ¤C ‡cÇŽÕ©S'##C:DC¸;´† ‰¨‡ò€àëë› bHK–,éÞ½»tô™™Y¿~}e¶I‡hKÑ¢E•óòåËK‡ù„ ‰¨Gxxø Aƒ¤+ ©C‡+W®”®€~ÆŒ3}úté +-òôôÜ´i“N§“ò@P‰üÑÕÕ5==]:Ä`Ê–-›’’boo/=˜ÞõgˬY³† &]ä€$ ÙÙÙ7Þ»w¯tˆÁètº„„///éèÁô®?kt,--÷ïßïìì,ä9€$ 'Nœ2eŠt…! 6lÖ¬YÒÐOß¾}-Z$]¡uÊÛ³gOÁ‚¥C€¼ÅÄÄ8p Q£FYYYÒ!SµjÕƒZ[[K‡@kÖ¬iß¾½t~3nܸ>úHºÈ[ I @ÖÝ»wk×®}òäI郱°°Ø¹sgݺu¥C ‡´´4ggç+W®H‡à7fff[·nmÒ¤‰t‡’€¬€€€ùóçKWRHHÈØ±c¥+ ŸŽ;~ýõ×ÒøSÅŠ“““mmm¥C€¼ÂÄmذ¡mÛ¶âäîî¾}ûvnúk\” ª Qé +ü]¿~ý,X ]ä€$ %--ÍÅÅåòåËÒ!cccsøðáÊ•+K‡@ÊãpÍš5ïܹ#‚§ˆ‹‹ëÔ©“t'’€åyÝÄn’Ù§Oé +è!''§yóæÛ·o—ÁÓ•(Q"55µtéÒÒ!€á1$1¦÷¦‹7ß|sõêÕÒÐÏÔ©SÇ']giݺubb"·†éaHbùï矮U«–)½éÂÁÁ!%%EêÁ¹“œœ\¿~ýH‡à9æÍ›÷Î;ïHWÆÄòYNNN³fÍ’’’¤C F§ÓÅÇÇ{{{K‡@™™™uëÖMMM•Áó.\øÐ¡CUªT‘ ‰ ‰ä³)SþÇÞ}Eu/üVTìeŒ[¬»t)Š"J•X°+vG±DÍØÛèØulDQ‰+*Ø‚ ˆHßµDcœk޽€€dçwžy~sŸ<<¹‰Ïw?»g?¯?œ;wráíÍ–ó³ç,^°`ºBIaaaè +’Gzó[»v-º‚>—»»ûÕ«WíììÐ!DŠá@â 2¥¬¬,///5Ýô·qãÆ999ŽŽŽè’!))ÉÏÏÏh4¢CH†E‹©ìgdå88ˆL&??ßÕÕõöíÛèÅØÚÚ^¹rÅÓÓB2¼}ûÖÉÉéþýûè’‡O7R$"“™0a‚ÊN•á$-ÑСC÷ìÙƒ® Òà/ÜHM88ˆLãܹs]ºt?åÄ“’-QLLŒºo,Õ»wïØØXt…@ãÇß´iº‚HHD&ðâÅ N÷ûï¿£CÃË’X"é_«ÕJ¢CDñõõMHH;vì¶mÛÐ-¢ð¢[¤HD&пÿC‡¡+”´uëV•ÝÈLõ¤·›ààุ8tˆ(•+WÎÍÍmРA^^ž‹‹Ë¯¿þŠ.¥V­ZƒAúBôE88ˆDÛµk׈#ÐJêҥ˩S§xkR˲yóæñãÇ£+Ú³gÏ!Cþû?§¤¤øúúþñÇØ$qzöìyôèQtÑá@â ê_ÿú—““Ó»wïÐ!Š©Q£†Á`¨]»6:„d¸wïžô8üðá:D”^½z•8õÞ¼yK—.Eõ˜ÀîÝ»‡Š® *=$"qŒFc§NÐ!J:|ø°º?Eª>ÅÅž¾¾©©©èQ¾úê+i”V¯^ýÏÿ¥ô·nÛ¶íµk×PU¢UªT)77Wz'E‡•‘8+V¬˜={6ºBI£Gþé§ŸÐ$ún>ýgó¡Ø_~ùÅÍÍ-??ßôU¦Ñ®]»„„„2eÊ CˆJƒ‰€HœœOOÏ¢¢"tˆb6l˜››[±bEtÉ••åíí­¦Ça aaas{üñûï¿7e‰­\¹rÆŒè +¢Òà@â ¡°°ÐÃÃÃ`0 C£Ñh.]ºÔ¾}{tÉPPP =¯_¿ŽåoŒ%½ÉvëÖíôéÓ¦¬2%{{û´´4'''t‘lHD"L™2eÆ è +%Í›7oñâÅè +’gòäÉáááè +Qlmm“’’¼¼¼þþ{òä‰N§{ùò¥iªL¯eË–åÊ•C‡ÉÀÄ@¤¸ .ÀŸÝ +ruuMII)[¶,:„dPßã°„ ,Z´èsþÉ£GöîÝ[tt(#Р+ˆäá@â RÖ›7oœœœ{öìAW}.$"¥<~üX§Ó½zõ +¢˜ªU«êõúzõê¡CH†'OžhµZ5=Kèܹó¹sçJ7J§M›¶fÍÅ“ÌÇ €® ú,HDŠ0/^D‡()::º_¿~è +’AõW½¬R¥JnnnýúõK÷?/,,lÓ¦4k•­2Òÿ?Òßî믿F‡ý3$"E¬Y³fÚ´iè +% 6l×®]è +’Gõ÷½úòŸp߸qÃÝݽ  @©$só%¿!!2%$¢/wóæMéâãÇèÅð…–è—_~qssËÏÏG‡ˆräÈ‘/ÿ:«W¯V÷ÝsK÷ "ã@â úB………žžž¹¹¹èÅh4š .øùù¡CH†âââvíÚ¥¥¥¡CD©S§ŽÁ`¨V­Ú—)£ÑعsçK—.}ù—2Oééé­[·F‡ý$¢/4cƌիW£+”4sæÌ+V +Hà[© ØØØÄÅÅ)õ=z¤Óé^¿~­Ô47...©©©¼y™3$¢/qåÊ???5]X°U«Vè’!33ÓÛÛûÓ§OèQ¾ÿþû 6(û5£¢¢† ¦ì×4+sçÎ]²d º‚è?â@â *5õÝZÈÞÞþÚµk:B2äç绺ºÞ¾}"JóæÍ³²²Ê•+§øWîß¿ÿ¡C‡ÿ²fB£Ñ\ºt©}ûö袿ƀÄ@TjC‡UÙmwÖ­[7eÊtÉ3a„ˆˆt…(¶¶¶ÉÉÉmÚ´ñÅ_¿~-mø‡Šøâæ aƹ¹¹+VD‡ý$¢Ò9zôhïÞ½ÑJjß¾ý¥K—4 :„dˆ „¿•ˆ#ÌŸ?_Ü×Wýÿ£Gþé§ŸÐD‰€¨ž>>éééèÅh4šøøxtÉ ½qIÇÇèQªV­*Òzõê™ò›JÏîöíÛ§¤¤˜ò›šR… +²²²LpJÑgâ@â ú|sçÎ]¶lºBI?üðÚ5kÐ$Ϻuë¤qè +¢££ûõëgúï{ïÞ=ggç÷ïß›þ[›†»»ûÕ«WE¨šè3q q}&é³}ûöjºéoË–-322DÜ_‰ÄQßIh%„††FEE¡¾{dd䨱cQßÝ/^}ŠÅÇÇçòåËæù‰uêZŠ® +Å€Ä@ô—Š‹‹Ûµk—––†Q ÏúµPýúõ;|ø0ºB” +*dgg7mÚò×TÝÕÊ•+çææ6hÐBÖˆ‰€è/-\¸pÑ¢Eè +%ñº–h×®]#FŒ@W9fÌtÅßQý×xM0Bá@â ú¿233½½½?}ú„Q ¯üm‰=z¤Óé^¿~%00ðôéÓ666è>yòdt…@«W¯ž6mº‚¬Q ùùù...wîÜA‡(†÷þ´DF£±S§N èQjÔ¨a0j×®ùgÒ;u·nݤ­‚…÷'$¢Æ·uëVt…’–,Y2wî\tɳzõjuߪùðáÃ}úôAW|®'OžhµÚW¯^¡CDiÙ²eff¦ƒƒ:„¬ÑŸ©ïz‹æ|‰úOnÞ¼éææVPP€eĈ;vì@WÈ‚®hÚ´iÒìDWá@â ú7õ]oÑÌ/±B©°°ÐÓÓ377"Šôâ/ýí*Uª„‘mÈ!ûöíCWˆ¢ÑhΟ?ß±cGtY $¢ëÛ·ï‘#GÐJÚ¶mÛ¨Q£Ð$ÏÌ™3W­Z…®E:ʼp႟Ÿ:¤4Þ¾}«Óéi*7¬]»]!ÐÁƒû÷ï® õã@â 2þþþ‰‰‰è%D‡(¦|ùòYYYÍš5C‡ ª¼ÕŸYÃåhû÷ïèÐ!t…(æÒ¥KíÛ·G‡ +q qu0`@tt4ºBI›7o7nº‚äY¾|ùœ9sÐ8q"88]!Ö‹/t:Ýï¿ÿŽ¥Q£F999¼®)މ€¬PTTÔ°aÃÐJ + <}ú4¯ÙgY¤ƒ*OOO5]ª„1cÆDFF¢+Láܹs]ºt¿¡‹c=ÿ*É”88ÈÚ¨ïs{5jÔ0 µk×F‡ ª¿™TÆ sss­çÇÆ&Lˆˆˆ@Wd ¿Ì!ã@â «b4;wî|éÒ%tˆ’:Ô·o_tÉ#½÷¬]»]!Šž8žŸŸïêêzûömtˆ(Öðq21$²*«V­š9s&ºBI#GŽÜ¾};º‚äIJJêØ±ãüeΜ9K—.EW˜Zff¦··÷§OŸÐ!¢|÷ÝwÇGWzp qõ¸qㆻ»{AA:D1 6ÌÉÉ©T©:„dxûö­““Óýû÷Ñ!¢8;;§¥¥YçÅã-Z¤îqüôÓO£GFWJp q•Pß)׿âÅ‹:t@‡<Æ ‹ŠŠBWˆbooŸžž®ÕjÑ!ÅÅž¾¾©©©èQ*T¨Ý´iSt©Y õrmgYXºcÇŽõêÕ ]!ô,›:u*ºéÞ½{ÎÎÎ*¾³›··wRRR™2eÐ!dñ88ÈHoW~~~F£¢—ÔÔTë<ËÂrI¯·Z­Vú"Н¯oBB‚F£A‡€mÙ²%,, ]!Ð’%KæÎ‹® ‹Ç€Ä@ª÷öí[N÷àÁtˆb®]»fµgYX®îÝ»ÇÅÅ¡+D©\¹rnnnƒ Ð!f!88øçŸFWˆbkk›œœÜ¦MtY6$R½Aƒ8p]¡¤ðððI“&¡+HÕÿT8***44]a.ž?.MôgÏž¡CDiÞ¼yVVV¹råÐ!dÁ88HÝbbbúô郮PRçÎÏ;Ç›þZÕŸÞ«W¯ØØXt…y9~üxÏž=Ñ}ÿý÷6l@Wã@â {üø±N§{õê:D1UªTÑëõ_ý5:„dPý•ajÕªe0¤?Ñ!fgäÈ‘;wîDWˆbcc„!KÅ€Ä@j%=¹ºvízæÌtˆ’<Ø¿tɳxñâ  +D‘ŽOž<Ù­[7tˆ9ÊËËsvv¾{÷.:D”:uêèõúêÕ«£CÈ"q qZ­[·î‡~@W()44TÅ×W«ììl//¯¢¢"tˆ(aaaè +󕜜ܡCßõ¹wïÞ111è +²HH¤J7oÞtwwÿøñ#:D1õêÕÓëõU«VE‡ ׯ_G‡ˆÒ¸q㜜GGGtˆY›3gÎòåËÑíÙ³gÈ!è +²<H¤>Ÿ>}òññÉÈÈ@‡(F£Ñœ?¾cÇŽè’gòäÉáááè +Qlmm“’’¼¼¼Ð!æNzEjÛ¶mzz::D^–J‡‰€ÔgÖ¬Y+W®DW(iúôé«V­BW<.\€¿È‹³`Á‚E‹¡+,í[·ÜÜÜÔô;É|}}/]ºÄÛ“,H¤2ê;ã¶U«Vè’A}·Ÿ+ÁÕÕ555ÕÎÎb1Ö¯_?uêTt…@ð#*²8H¤&>|pqqQÓ57ìíí¯]»&J¢CHžÁƒïß¿]!Š4GÓÓÓ[·n±$ÒÛ}·nÝNŸ>…/V$©ÉðáÃwïÞ®PÒš5kTv-#k‚®ˆ÷¢.õÝ™¤þº’dá@â Õ8vìX¯^½ÐJòõõMHHÐh4è’áÉ“'ÒAÞË—/Ñ!¢ð^Ô_B}÷&/aÆŒ*û‰Ã€Ä@ê =’µZ­ô':D1¼°†%RýiUªT‘–õë×G‡X°Aƒ8p]! +/YFŸ‰€T@zuïÞýÔ©Sè%íÛ·O:P@W<7nT÷¹1Ò‘ë€Ð–MõçMKè3q q +lÚ´iâĉè +%ñæš–èîÝ»...>|@‡ˆräÈt…\¾|¹cÇŽF£"ʰaÃvíÚ…® sÇ€Ä@–î—_~qssËÏÏG‡(¦nݺz½¾Zµjè’¡¸¸¸]»viiièQêÔ©c0ø°TÊÔ©Sׯ_®(::º_¿~è +2kHdѤ£®¶mÛ^»v ¢›¸¸¸   tɳpáBß‹KÅzxxH› +"JÕªUõz}½zõÐ!d¾88Ȣ͟?É’%è +%M™2eݺuè +’'33ÓÛÛûÓ§OèQ&MšŽ®P›œœOOÏ¢¢"tˆ(gÏžå£è?á@â Ë•’’âë뫦›þ¶hÑB:”,W®:„dÈÏÏwuu½}û6:D”æÍ›KËòåË£CThÅŠ³gÏFW´qãÆ & +ÈLq q…ÊËËsqqùõ×_Ñ!б³³KNNöðð@‡<ÒñMDDºB[[[éaÙ¦Mtˆ:FÿÄÄDtˆ(ÒnÌÊÊjÖ¬:„ÌY¨1cÆlÛ¶ ]¡¤åË—Ïš5 ]AòÄÇÇÂ_ÉÅY´hÑ‚ Ðj&½:;;¿{÷"Š««kjjª:„ÌY¢'NôèÑ]¡¤¶mÛ&&&–)SB2¼yóF§Ó=|ø"Š››[JJ +ÝDÛ¹sçÈ‘#ÑIRÅ‘§Rã@â ‹óüùs­VûìÙ3tˆb³³³›4i‚!y ®…'o˜R¿~ý>Œ®ÅÖÖ6))ÉËË Bæ…‰€,Îwß}wòäIt…’vîÜ9|øptɳoß¾!C† +Šˆˆ CWX‹/^ètºßÿ"J£Frrr*V¬ˆ!3€Ä@–%22rìØ±è +%õìÙóèÑ£è +’çñãÇÒáÚ«W¯Ð!¢ðަwîܹ.]ºÀ +Ä‘^º·lÙ‚® 3€Ä@äÞ½{ÎÎÎïß¿G‡(¦V­ZƒAúB2H¯Û]»v=sæ :DÞ %,,L݇È'NœFW¹à@â KQ\\ܾ}û””tˆblllNž<Ù­[7tɳ~ýú©S§¢+ŠŽŽîׯºÂ©þž5kÖ4 ¨£27Hd)¤— éÅ]¡¤ñãÇoÚ´ ]AòܺuËÍÍíãÇèQBCC£¢¢ÐÖKõw•îѣDZcÇÐd88È"deeyyy©éM±I“&ÙÙÙŽŽŽè’¡¸¸ØÇÇ'=="Jݺu CÕªUÑ!VmáÂ…ê¾hæöíÛÕ}ÙSúLHdþÔ÷kq[[Û+W®xzz¢CHžyóæ-]º]!ŠF£‰÷÷÷G‡X;ig¶k×.-- "J… +²³³›6mŠ!0$2ãÇß¼y3ºBIÒKÞüùóÑ$OJJН¯ïüeêÔ©k×®EWÐùí·ßœ?|ø€ÅÇÇçòå˼õ¡•ã@â 3§¾Kã¹»»_½z•wWµ,yyy®®®wîÜA‡ˆÒ¢E‹ÌÌÌråÊ¡CèÿÛ¼yóøñãÑ-[¶löìÙè +Bâ@â s¦¾›ãT¨P!++ë›o¾A‡]!ÏI3>|pqq¹{÷.:D”ºuëêõújÕª¡CÈÔ88È -_¾\eg$KÇX*þ©Z=zôH§Ó½~ý"J``àéÓ§yNšùKNNîСƒŠ/AÛ»wt™™›ììl//¯¢¢"tˆb5j”““S±bEtÉ`4;wî|éÒ%tˆ(5jÔ0 <'ÍRÌš5kåÊ•è +öíÛ7hÐ t™™•ÂÂB鸢F#D¶oßBòHoÓ§OGWtøðá>}ú +ès}úôÉÇÇ'##"JåÊ•õz}ýúõÑ!d:HdV&OžŽ®PÒüùóQ/pTj7oÞtss+((@‡ˆ2bĈ;v +HéaéîîþñãGtˆ(¾¾¾ B&€Ä@æãüùóß~û-üI¡ WW×ÔÔTÞôײµiÓ&77"ŠôÚ+ýí*Uª„!ÙÖ­[÷Ã? +Z»víÔ©SÑd"Hd&Þ¼yãääôàÁtˆbÊ—/Ÿ™™Ù¼ystɣ5Í… üüüÐ!TÒ1C×®]Ïœ9ƒÅÞÞþÚµk:B¦À€Ä@fbàÀDW(iÓ¦MãÇGW<ª¿ÜÊôéÓW­Z…® Ò{üø±t|üêÕ+tˆ(­ZµÊÈÈppp@‡pHdöîÝŠ®PÒ·ß~{æÌ^`Ѳäåå9;;«ø‚ë-[¶ÌÌÌä¡•¥Û¿ÿàÁƒÑÍœ9sÅŠè +މ€àÔwµõ5jèõú¯¾ú +BòŒ5Jŵ··OKKsrrB‡Ô÷+Ó?ã‰jV‚‰€°ŒFc@@ÀÅ‹Ñ!JŠŽŽîׯº‚ä9qâD=ЭZµJÝ6µ*êûÐT ü¨º5à@â ,õ]m}øðá;wîDW<ÏŸ?×jµÏž=C‡ˆÒ¶mÛÄÄÄ2eÊ CH1.\€EˆÃ×RÕã@â  7n¸»»«éjëü©•…êÓ§OLL ºBGGÇììì&Mš CHaS¦LÙ°aºB C‡õíÛ]A¢p qJaa¡§§§š®¶ÎóV-ÔöíÛG®hÇŽ#FŒ@WòÔwëôøy*uã@â ”éÓ§KÏ@t…’fÍšµ|ùrtÉ#½ +9;;¿{÷"J=Ž;†® Q²³³½¼¼ŠŠŠÐ!¢ðŠj*Æ€Ä@III;vTÓÕÖ¥ƒÈ´´´²eË¢CH£Ñèï˜ˆ¥fÍšƒõ"O¦±|ùò9sæ +Šˆˆ CWò88ÈôÞ¾}ëäätÿþ}tˆbìííÓÓÓµZ-:„äY±bÅìÙ³ÑÅÄÄôîÝ]Ab©~Ç–/_>++«Y³fèR™^hhèÞ½{ÑJZ¿~ýäÉ“Ñ$ú>ƒ^˜1c"##Ñd +ª?“ÍÍÍ-%%ÅÎÎBJâ@â ‹ AW(©S§Nñññ}¢¤ 0]Aò\¹rÅÏÏOMŸA/aöìÙË–-CW©½xñB«Õ>}ú"JãÆsrrÑ!¤ $2™ððp•(?xð`•}˜Á¨ï3è%ð‚TÖììÙ³AAAðC qÆ·yóft)ƒ‰€LãÖ­[nnn?~D‡(¦nݺz½¾Zµjè’gذaQQQè +QxA*’‘·nÝŠ®èäɓݻwGW88ÈŠ‹‹}||¤ãtˆb4M||¼¿¿?:„ä9vìX¯^½Ð­]»vêÔ©è +BÊËËsuu½sç:D”ZµjéõzÞÝB88ÈæÌ™£²[äJ/*»±5^î´Z­ô':D__ß„„i¢C,33ÓÛÛûÓ§OèQxkuà@â Ñ’““;tè ¦\¶lÙ2##£\¹rè’'88øçŸFWˆR¹råÜÜÜ  CÈ,­LcÇŽ#FŒ@WÐá@â ¡òòòœïÞ½‹QŒ½½}ZZš““:„äÙºuë¸qãÐEEE…††¢+È\·k×Nz±B‡ˆâèè˜Ý¤It• 5räÈ;w¢+”´jÕªéÓ§£+Hž{÷îICôýû÷èQzöìyôèQt™—ß~ûMzØøð"JÛ¶mË”)ƒ¡Râ@â qŽ?.— +”Ô®]»„„¾ßX£Ñèçç—””„¥V­ZƒAúBf'""b„ è +–/_>kÖ,t• "=´t:ݳgÏÐ!Šá9ÖjÉ’%óçÏGWˆbccsòäÉnݺ¡CÈIÇÁÁÁqqqèQììì’““=<<Ð!TH$‚*ßux޵%ÊÎÎöòò***B‡ˆ® ó¥ú‹_µhÑ"33“We°DH$ÂæÍ›Ç®PR¯^½bccÑ$Oaa¡»»ûõë×Ñ!¢4jÔ(77×ÑÑBfMõ·¿˜2eʺuëÐ$)N}Ÿ<«S§Ž^¯¯^½::„ä‘ 6lØ€®ÅÖÖ6))ÉËË B`øðá»wïFWˆbccsêÔ©.]º CH$R–ú®='½µÄÅÅ¡CHž .À_cÅY°`Á¢E‹ÐdÞ½{çääô¯ý "Jݺuõz}µjÕÐ!$)K}wŸ™4iRxx8º‚äyûö­N§{ðà:DWW×ÔÔT;;;tYŒ+W®øùù©éžŒ%„„„9r]A2p q‚222|||Ôtÿy~¼ÌB wîœ :„,ÒÍ›7ÝÝÝ?~üˆ¥S§NÒD£Ñ CèŸq q"Μ9ÓµkWøãYA>>>—/_æM-‹ôìÞ½û©S§Ð!¢ðœôåÖ¬Y3mÚ4t…@ëÖ­›2e +º‚þ}¹/^hµÚ§OŸ¢CS¡B…ììì¦M›¢CHžM›6Mœ8]!Oq¦/g4.^¼ˆÅÞÞ>==]zWB‡Ð?à@â /×·o_•]{aûöí#GŽDW<ê»E ½{÷މ‰AW<~üX:>~ýú5:Dé¥ --­lÙ²èú;Hô…¶mÛ6fÌt…’zôèqìØ1tÉ£¾P”P§NƒÁÀËœ“RöíÛ7dÈt…@³gÏ^¶lº‚þ} éß ““Óû÷ïÑ!Š©U«–^¯G=)¨Ô.\¨â»bñnt$ÂÀ<ˆ®E£Ñ\¼x±C‡èú88¨ÔŒFcÇŽ/_¾ŒQÒÉ“'»w y233½½½ÕtŠx7:áÍ›7:îáÇèQ6l˜““S©R%tý5$*µ%K–ÌŸ?]¡¤qãÆmÞ¼]Aòäç绺ºÞ¾}"JóæÍ¥…S¾|yt©Ðùóç¿ýö[ø¡ˆ8#GŽÜ¾};º‚þ•NVV–··wQQ:D17ÎÉÉqttD‡<'NÜ´iºB[[Ûäää6mÚ CHµ&Ož¬îß/:t¨oß¾è +ú HT +ׯ_G‡(F:̺r劧§':„ä‰ „¿Š³hÑ¢  +HÍÔ÷z^B5 CíÚµÑ!T•‚ú~æºpáBé•]Aò¨þ f77·””;;;t©\vv¶———š~£[B``àéÓ§yÿlsÀÄ@r©ïg®<̲P ˆŽŽFWˆR¾|ù¬¬¬fÍš¡CÈ*,]ºtÞ¼yè +6oÞ>žº‚…B‘——gooOð?ÂÃÃ###©+Ú»w¯¯¯/u…î „åÙ³g–––÷ïß§ŒAqqñ§Ÿ~Jü¤¥¥¹¹¹‘-Ù‰ŠŠZ¹r%u@sÎÎÎEEEÔ!¬´mÛ¶¼¼¼wïÞÔ!: +€ü•/¾øâàÁƒÔBÚ¼ysPPuðSSS£T*>|HŠ££cvvv«V­¨CþÄõë×mmm_¿~M +·p®\¹‚o@”0àO9rDb×È=zô… pÓ_Ñ™>}zjj*u+FFFååå}úô¡øK[¶lY¸p!uCëׯ_¾|9u…. „ôàÁ¥RùäÉêÁ˜˜˜¨TªîÝ»S‡?‰‰‰~~~Ô íØ±cöìÙÔ兀?þìÙ³Ô!¬èééåååÙÙÙQ‡è JÐLSSÓèÑ£/_¾L"¤C‡yzzRW?UUUÜ}úô)u+®®®çÎëR ý~þùgî›ñ—_~¡aÅÜܼ¤¤—áÒ0 JÐLll,íw…à|||©+€nˆŽ5*##ƒ:„•Ž;ªÕê.]ºP‡ü#ÇŽ›`Àî$ÒÀÀ€:øY±b…„g›\.¿té÷½FÐBK—.åNž¨+:xðàŒ3¨+t% ø×ÿ¿°keeu÷î]êÁèëë)•Jêà'77wذaR¢Íp'O{ tôÞ,ÚŒ‰‰ ÷O×£Gêéà„__ߤ¤$ê +!ÅÄÄ,^¼˜ºø©­­å†è­[·¨CX177/--Å«R vW¯^µ³³“ð§tF•––†Kô²†@ ¤wq·!C†dffÊårêà' `×®]Ô¬èëëZZZR‡@ò×銋‹ ¦®8 J:Nz·w166V©TxõVtNž<9iÒ$ê +†6lذlÙ2ê +aHþNÜb/..¶°° ‘2 JºL’7xß¿ÿ_|A]üTWWsCôÑ£GÔ!¬8;;_¹r¥U«VÔ!‚‘ü½º­­­ + +Z·nM"Y”0tÙ–-[.\H]!¤)S¦>|˜ºx›:uê‘#G¨+XiÛ¶myyyïÞ½©C–œœìããC]ÁÐÊ•+£¢¢¨+$ €€Îº~ýº­­íëׯ©Cƒ{¸ˆÔ®]»¨+Ú½{·¿¿?u3fÌøî»ï¨+X‘Ëå—/_6luˆ4aPÂÐMÎÎÎEEEÔ!‚‘ÉdgÏžuss£~¸ƒ€••Õ‹/¨CX™4iÒñãÇ©+Xyöì™R©üé§Ÿ¨CXéÙ³gEEîÜÇ% Ý&±—5CBBbcc©+€Ÿ¦¦¦#F\¹r…:„•N:©Õjªc,€f¤§§»ºº’ŸÏ°3kÖ¬;wRWH% ”——7tèP)ÝkÉÜܼ¤¤ÄÐÐ:øY¿~}hh(uC‡ž2e +us .ܲe uC©©©S§N¥® Jº¦¶¶ÖÚÚúǤŒžž7iììì¨C€ÉßKhöìÙ;vì ®ÐîÙÞÞþûï¿§a¥cÇŽjµºK—.Ô!’‚@ @×Hï^Këׯ_¾|9uðS__ïàà R©¨CXéÙ³geee»ví¨C4¤¬¬ÌÑÑñ×_¥aÅÕÕõܹs¸=°€0(aè”'NxxxPW —W©%K–ÄÄÄPW°‚+‡€nZ»víêÕ«©+Š ¤® Jº£ººÚÂÂâñãÇÔ!‚ÁåÕE*''gøðáRúJ3¡¡¡ëÖ­£®Ð´¦¦&—¬¬,êVŒŒŒÊÊÊúöíK"”0tÇĉO:E]!¤½{÷úúúRW?/^¼P*•÷îÝ£aÅÊʪ°°wÝtçÎî[àåË—Ô!¬ØÙÙåååéééQ‡H% ?wî\ê +!yxx;vŒºxóóóKLL¤®`E__¿¸¸ØÂ‚:€LBB‚´ß'óJûNƒ@ @HïW2;wV«ÕÜ©C€é} +¥™˜˜˜Å‹SW›:uê‘#G¨+XQ(999¤= J’רØ8dÈ‚‚êÁÈd²Ó§O»»»S‡?ÜÑF©TJéS(Ípßh™™™r¹œ:€Xuu5÷ÍþèÑ#êVz÷î]^^Þ¶m[êqà„ ykÖ¬¡®Ò‚ ¤}Ç©š0a·Ü¨+X166®¬¬ü裨C´ÂÉ“''MšD]Á~½? JÒVZZêèèØÐÐ@"˜~ýúqÿPmÚ´¡~¤÷)”f’’’¼½½©+´ÈìÙ³wîÜI]Á +^‹~”0$ìõë×6667nÜ ŒB¡ÈÍÍupp ~¤÷)”fð‘t€?’Þç›ùðÃÕju‡¨CÄ +€€„Í›7oûöíÔBŠŒŒ £®~$ip|$à¯äçç2DÂ7ýÀø”0¤*--ÍÍÍü L@ŽŽŽÙÙÙ¸é¯èHûæ 2™ìÔ©SãÆ£ÐRaaaQQQÔ %&&úøøPWˆ% Iª©©Q*•>¤Œ‘‘QyyyŸ>}¨C€î¿Ú Aƒ~ýõWêVæÍ›·mÛ6ê +íÕØØèìì\TTDб±qEEwJC">”0$iúôé©©©ÔBJHH ®~êëëíííÕj5u+½zõª¬¬Ä¥Þíúõë666uuuÔ!¬ <833/Pó…@ @zvïÞ=kÖ,ê +!Mœ8ñĉÔÀÛ¢E‹âââ¨+XQ(ÙÙÙƒ ¢Í›7SW0ôõ×_/]º”ºBd0(aH ÷¯ÔÊÊêÅ‹Ô!‚éÔ©“Z­¦ú*…»téÒ˜1cššš¨CXY½z5Õ.ÑáÎvÆwîÜ9êVôõõ ---©CÄ€€”p'[#FŒ¸rå +uˆNž<9aÂê +àçùóçJ¥òþýûÔ!¬ØØØäçç·nÝš:@4~þùgî°ðË/¿P‡°bnn^ZZj``@"”0¤dݺu«V­¢®R```||..NÚïf`ÇÛÛ{ß¾}Ô¬Èåòôôô#FP‡ˆ% ixóæƒƒƒ”.·¢P(²²²©C€É¿Ê?räHî¼L&£¥çÏŸ[ZZÞ»w:„333•JejjJ"”0¤!88xóæÍÔB +ˆˆ ®~¸ÚøñãÏž=KЉ‰Ieee=¨CD,;;ÛÅÅE·öòòJNN¦® JpñâÅ1cÆ- ÈÆÆ¦  @OO:øÙºukPPuCøüóÏ©+DoÉ’%111Ô :tÈÓÓ“ºBÛaP»gÏž)•ÊŸ~ú‰:D0mÚ´)++ûä“O¨C€ŸÛ·o[YY½zõŠ:„•É“'9r„º@ +êëëT*u+&&&Ü?]÷îÝ©C´% ±›1cÆwß}G]!¤mÛ¶Í›7ºøill}ÚÝÝ:„% íôêÕ+kkë[·nQ‡F__¿°°ÐÒÒ’:ø©©©Q*•>¤a—ãÐfµµµÜOÃü‘:„•®]»ªTª:P‡À „ üýý÷îÝK]!¤èèè%K–PWožžž)))Ô¬•——÷éÓ‡:þR^^ÞСC¥ôzx3Ÿ}öÙÑ£G©+`PÂÐBÇçÔB2dHFF~É*:III¾¾¾Ô á–œ¢°jÕªuëÖQW0Äl½½½©+4 €€¶áþ‹XXXp¤Œ±±qeeåG}DüTUU)•ʧOŸR‡°âêêzîÜ9™LF£±±ÑÉÉIJ×ÄkF7PbPÂÐ*Ü×Ä Μ9C"¤ääd///ê +à§©©iÔ¨QÔ!¬tìØQ­VwéÒ…:þéݧ|©€€VÙ¶mÛ‚ ¨+„4yòä#GŽPWo111ÒþÌFJJÊ´iÓ¨+€‡¸¸¸E‹QW0¤k–à„ =nß¾meeõêÕ+êÁèòÅ Dí‡~°³³“ðoÚüüüöìÙC]üp§LãÆ;wîu+úúúEEEJ¥’:DC0(ah‰ÆÆÆÁƒR‡F&“9sfìØ±Ô!ÀOCCƒ““SII u+fffÜ.555¥Þ~þùg ‹'OžP‡°2`Àîð«#7ÌÁ „ %ÂÃÃ###©+„G]¼IïþÓÿM.—_ºtiøðáÔ!ÐBG2e +uCK—.ýú믩+4€€6àæ¾““SCCuˆ`ú÷ï_ZZjhhHüHþzÛºó“@¼¼¼öïßO]ÁŠ\.¿xñ¢‹‹ us”0ÈÕÖÖÚØØÜ¼y“:D0 +…‚;´··§~$ÇMsssn—êÈkëöüùs¥Ryÿþ}êVt䊔0È&$$PWiݺu¡¡¡ÔÀ[@@À®]»¨+XÑ××/,,´´´¤dgg>¼©©‰:„ŸÄÄDê +¶0(aÐ:þ¼»»;ù—€œ¯\¹¢SW2–†“'ONš4‰º‚¡ 6,[¶ŒºÃÀÅÆÆRW0tèÐ!OOOê +†0(aª®®V*•=¢Œ‘‘QEEEïÞ½©C€Ÿšš )})6ƒ] + =õõõ*•Š:„{÷îÔ!¬`P 4uêT‰Ý$k÷îÝþþþÔÀÛ´iÓ>L]ÁJÛ¶mËË˱K¤çêÕ«vvvoÞ¼¡aeôèÑ.\ÉdÔ!L`P ’H]!¤I“&?~œºxãfÛ¬Y³¨+Â.° 6¬X±‚º‚¡-[¶,X°€º‚ J$îܹceeõòåKêÁtîÜY¥RQ}-A‹q߃ܗâ‹/¨CXÁ.¶¦¦¦‘#GfffR‡°b``PRR2`ÀêáaPÂÐ<îhåââ’••E"™LvòäÉñãÇS‡?Ü—âˆ#®\¹BÂJ§NÔj5v)€´UUU)•ʧOŸR‡°bcc“ŸŸßºukêaPÂмÈÈÈððpê +!Í›7oÛ¶mÔÀ›ä_:?|ø°´ï +¿Ù»w¯´ßé·zõjªsev0(ahXYYÙ Aƒ¤tÓß?þ¸¢¢¢mÛ¶Ô!Àä?< ±;lÀ;xzz¦¤¤PW°"—Ë333‡ B"$ JšÄlq§\܉uˆ` +ENNÎÀ©C€É_>¯gÏž•••íÚµ£ ©©©Q*•>¤a¥W¯^R:¬aPÂФ Hì­2{;“ŽXºt)wø£®`E.—_¾|yذaÔ! QiiinnnägVìÆÇÇSW€€Æ¤§§»ºº’ÿ]^^žžžuð“““3|øð·oßR‡°ºnÝ:ê + 0þüo¿ý–º‚¡“'ON˜0ºB”04Cz/M•••õíÛ—:øyñâ…¥¥åÝ»w©CX±²²*,,”Þå2àŸxýúµÍ7¨CX‘ÒÅÍ0(ah†ô>œ/±™é??¿ÄÄDê +Vôõõ‹ŠŠ¸±MdJKK¥t±f&NœxâÄ ê +`PÂÐé]žÌÍÍíìÙ³R½9¹„q?3<<<¨+Љ‰Y¼x1u‹ˆˆX³f uC;wî”ÀÜ1(a°v÷î]KKK)ÝiµcÇŽjµºK—.Ô!ÀOuuµ……ÅãÇ©CX2dHff¦\.§bÜ¡  €:„##£òòò>}úP‡¼ JLIòå©©©S§N¥®Þ&L˜púôiê +VŒ+++?úè#êÐ +·oß¶¶¶~ùò%u+NNNYYY­Zµ¢i9 JL­_¿>44”ºBH¸¹’HíØ±cΜ9Ô %%%y{{SW€Ù¾}û¼yó¨+ŠŠŠZ¹r%uEËaPÂ`§¢¢bàÀ¿þú+uˆ`ps%‘ºs玕••„æááqìØ1ê +Ð:Ò~åS¡PäååÙÛÛS‡´% Fêëë¹ïIµZM"¹\ž‘‘1tèPêà§©©ÉÅÅ%++‹:„•Î;sßhÜ©C@ëHþ³Oýû÷/--544¤i JŒ„„„lܸ‘ºBHaaa‘‘‘ÔÀ[TT÷ߎº‚™LvêÔ©qãÆQ‡€–’üÕÏ‚ƒƒãââ¨+Z€ —.]3fLSSuˆ`lllòóóqs%Ñ)//4h”Þ‡ÖÌܹs¥}×Ox3gÎܳgu+2™ìÌ™3cÇŽ¥á €€àž={fiiyÿþ}êÁúé§Ô!ÀôÞ‡ÖL¯^½***ð¡x·ÚÚZ++«[·nQ‡°ÒµkW•JÕ¡Cê~0(a.77wâĉOž<¡ÌæÍ›ƒ‚‚¨+€7i_C¡Pdee9::R‡€äää >üíÛ·Ô!LÌœ9sãÆ¢ûm% =zpæÌêŒ=úÂ… ¸é¯q‡—„„„Å‹×ÖÖR·oõêÕT?9@ŒBCCׯ_O]!°N:ÅÇÇöÙgÔ!-@ €‘ßνBBB^¿~MÝÒr¦¦¦•••Ý»w§–»sçŽOnn.uˆð¡à«¡¡ÁÙÙ¹¸¸˜:D0®®®»wïîÚµ+uH aPÂ`êÚµk^^^eeeÔ!-ôÝwßMŸ>ºÞWcccLLLxx¸4> Œ¥@Ëp?”mmmëêê¨CÞ—¡¡áW_},ê×ç1(a°Æ{­ý¢{롯¯ïÞ½{©+@0ÜI³··÷7¨CÞW\\÷cºDiãÆ!!!ÔïÅÁÁ!99¹oß¾Ô!ï €€fpç^"º™™™J¥255¥!ÕÕÕEDDDGG‹÷µ#GŽLOOõ/½€wÞåîî~þüyê–P(Üikdd¤žžu‹0(ahÌË—/—,Y²cÇê¿'—Ë/]º4|øpê`ââÅ‹þþþUUUÔ!¼™˜˜TVVöèу:DìÁƒJ¥RtëëÕ«WRR’³³3uˆ`0(ahØÑ£GçÌ™SSSCò.Ë—/—Þ¥à¿=þ<((hß¾}Ô!ü8pàóÏ?§®Ñ;räÈÔ©S©+xðööÞ¶m[Û¶m©C„„@ @ó¸ç§N¢ùs ())100 æRSSçÎ+–_ƒMž<™û™M]ñÅ_:::00:„! J´~»@ûêÕ«¨[þ5tèÐŒŒ ¹\N®]»æíí]ZZJò'‚‚‚6oÞL]²qãFêŠæ“’’z÷îMÂ% mPTTÄ{ݼy“°×W­š£¿ëׯ7KÚ´iCT__ooo¯V«©CþCOOoåÊ•Üq¸U«VÔ-ÌaPÂÐuuu+V¬Ø¼y3Õ—®¯¿Ñ†9ú;…B‘““3pà@ê¬ŠŠ +î £ 7J777ß·oŸµµ5uˆ†`PÂÐ*.\ð÷÷øð¡†ŸwÊ”)‡Öð“‚Ö"Ÿ£¿‹ˆˆ§mÉ[¿~}hh(a€L&›={ö7ß|£S¯vbPÂÐ6ÕÕÕÜQàĉ{Ænݺ©T*\_šIKK›9s惨lmmóóó¥qÃKÐfMMM#FŒ¸rå +ɳwïÞ=11ÑÅÅ…äÙ aPÂÐN»H¨\.OOOç|¬ŸÄèÙ³gÜ×á4ÿÔmÚ´)++ûä“O4ÿÔ ƒ¸++«/^høy§M›¶}ûvÝü% ­u÷î]Ÿììl¦ÏËô)@ìRSSçÌ™óôéSM>éÖ­[çÏŸ¯Ég·gÏž™3gjì錷lÙâå奱gÔ6”0´ÙÛ·o¹¯ÑððpFN277/))144dñà %÷ïß÷óóËÈÈÐÌÓ=úÂ… 2™L3Oð›éÓ§§¦¦jà‰FÅí 333 <—Ö „ ý¸stooïëׯ û°úúú………–––Â>,HÕo÷ yýú5Ó'211Q©TÝ»wgú,TSS£T*™^ŠÃÀÀ`Íš5K—.Å]w0(aˆB]]]DDDtt´€7,ܰaòeË„z4Ð?üð7GËÊÊØ=Å¡C‡<==Ù=>À;¤¥¥¹¹¹1:=³°°Ø·o·1X<¸è`P‘ôôtA®Ê2xðàÌÌL]¸Ï®¡¡!**jíÚµoß¾üÁ½¼¼’““X€nÞ¼yÛ·oö1åryPPPtttëÖ­…}dñ „ .‚\•ÅØØ¸¢¢‚û÷/P袂‚ŸüQÀÇìÖ­›Z­655ð1øzýúµÍ7„z@înbbâСC…z@iÀ „ FïyUî0ĺ ›:ˆûºiÓ&AM&“={ÖÍÍMGx¥¥¥ŽŽŽ ïÿPÞÞÞ[·nm×®Ýû?”Ä`P©{÷îùúú¶à®%Ÿ}öÙÑ£GY$n:þüÌ™3ßÿ3s¸"-h•5kÖDDD¼Ï#têÔiÇŽB%I % ñâ¾x6mÚ´|ùòúúúø·tíÚU¥RuèÐièšêêêÀÀÀãÇ·øú÷ï_ZZŠ+Ò€öhllíîî®*ÐA©©©Ü xöìß¿Q¡PäååÙÛÛ³¨h±Û·o[YY½zõŠ×ßehhøÕW_ãf&ï†@ @Þ¼y³fÍš¿½HhPPÐæÍ›5V:¨eïL‹ŠŠZ¹r%£$€÷ñí·ßòº+¹ƒƒCrrrß¾}Ù%I% ɸté’ŸŸ_UUÕŸþ¯ýúõ+--mÓ¦†«@×ð}gš££cvv6®H Ú‰;¦M˜0áÌ™3ûW* +îœ222ROOOa€@ @Jž?¾páÂ?^F;*åææ:88Tºzõª——WEEÅ»ÿ2##£òòò>}úh¦ + ¸3%¥Rùøñãwü5½zõJJJrvvÖX•`PžÔÔÔ¹sç>yòä÷?³víÚU«V&ú'÷ ‹ Ôd@ œ8qâ¯.æ#“ÉfÏžkdd¤á*±Ã „ I?ýô“¯¯oFF÷;99eeeá-@"//ÏÇÇçöíÛüŸ\]]Ï;‡É€(øûûïÝ»·ÙŸäΠvîÜ9~üxŠ"Ñà„ UÜ—VBBBXXXnn.Þb„^¼x±téÒ;vü÷Ÿìر£Z­îÒ¥ U/¯^½²¶¶¾uëÖïfÊ”)Û·oçŽf„U¢†@ @Ú¸VÛ¶m©+þuôèÑ9sæÔÔÔüöÿ¦¤¤L›66 €—ÜÜÜaƽ}û¶}ûöÑÑÑxã{ „šÁmfÏž}òäI??¿={öPçð¶bÅŠìì줤¤?þ˜ºEô0(a€ÆpG<‡‡±±1u o ­Zµ’ËåÔ!R€@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 JÿÇÞ}‡Eu­û§‹¢  \„«¹ö;ˆ-Š…(ÖÄn̵>ŠF'õ±Ô£ØX{¹vPì¨Xト€ (ðüÞs—‹8ÎìµöZÃðýüÁCŒó®åÌ.ë»gïµ@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™$+++ooo)M€D‰‰‰IIIRšFC@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(Gd77·sçÎIi$ZµjÕßÿþw)M#È ÿþïÿþßÿýßRš‰þú׿þío“Ò4ˆ† † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † @9DƒÀ{÷îÝ¿ßÙÙ¹oß¾‚[G À襥¥Ñp?&&¦ègRR’æýçþçßÿþwÁýA ÀÈ”îß¹s'99ùc@0&%†ûÑÑÑ4ÀÓýå‚! (ôÓO?­\¹2##ƒ¥€` +9rÓ¦MŒEC@P@€² +@€² +@€² +@€² +@€² +@€² +@€² +@€² +@nÞ½{GofBBBrrrJJÊ›7o233égZZÚ›BôŸéééô÷é÷üü|Í ³²²ŠêTªT©B… +U«Vµ´´¬R¥JÅŠ­­­mmmé?íììè9;;»ººj~º¸¸8::Jû7€T + èôÑÑÑ÷îÝK(DÃ}ÍOz'¥ôÇÆÆ¦~ýú 6ô.Ô¨Q#)=Á@@ø„¼¼¼¸¸8î_¿~=&&†~¹ÿ¾ôOM»ÚµkûêÒ¥‹­­­ìî€Z@@ÐfĈÛ·o÷îìŽ(T¡B…víÚõèÑcРA²>eP€Úüå/ù¯ÿú/Ù½àÀÜÜÜÇÇg̘1þþþVVV²»| (€€ Ñ€"NNNÆ £ýÜÃÃCv_€€Ú_Ð033ëÞ½ûœ9sZµj%»/ €Úk(Ò¹sçiÓ¦uëÖMvG@ ´1ú Ñ°aÃ9s昚šÊî è@mÊIÐðööž6mÚàÁƒÍÍÍe÷t‚ €6å*h4hÐ 88¸]»v²;Ÿ† €6å0˜®°{÷nÙ€O@P@›òˆ••ÕöíÛdw´AP@›rL +×Û°aÈ#dw> +@mÊs0)\.`ãÆÃ‡—Ý(€Ú”ó`Rø=ÀÖ­[(»#P +´A0)Ì;wîüúë¯ewJBP@ +*9r¤sçβ;ÿ€Ú qpp¸víZ­Zµdwþ€Ú ײeËóçÏW¨PAvGà (€€ ÚÀÜÜÜÖÖ¶è?mll¬¬¬è—ìììÜÜÜÌÌ̼¼<õZW`ܸqÁÁÁ²{ÿ@mx€ÀÀÀîÝ»;üKåBvvvº¼6---??Ÿ>¦gÿK?ÿüóÏÔÔTö¾éëðáÃôoß.|@mx€_ýõ»ï¾c¯SÂÓ§O/]ºtñâÅcÇŽÅÅÅq¯_ª:uêܹsÇÂÂBLs €Úx(îáÇ[·n]¿~ýË—/UmˆlذaôèÑj·Ÿ„ €6e(häææþãÿX¶lÙ;wÔkÅÉÉéÉ“'UªTQ¯ Ѐڔ¹ AÕéÓ§iËŽŽŽV©‰5kÖL˜0A¥â #´)£@ãÝ»wóæÍ[²dI~~>÷âmÚ´¹té÷² ´)Ó@ãøñã HOOç[ÖÔÔôéÓ§ô ò- zAP@#$::ÚÇÇçÕ«W|Ë.[¶lÚ´i|k€^@@ÐÆ89þ¼ŸŸß»wï8ÖlÕªÕåË—9}!(€€ Ñ²zõêÉ“'s,hii™‘‘ammͱ&è@mŒ)Ж֭[·ãÇs¬yõêÕæÍ›s,¨žüüü„„„gÏž%%%¥§§StÉ,D^¥½½=ý¬^½:m–îîîVVV²»  ::þ?}ú”vÔÔÔô©Zµ*íNNN...š_ªU«&»§†.+++''‡Þ=úåÝ»wšã 1¦K$t´Œ§ æÅ‹šMåõë×ô籠FÎÎÎE¿ØØØÈ{ûö-½ut&¢·ÑÂÂÂÎÎÎÖÖ–v=eÕ@@ÐÆ˜€IáÊÁ^^^yyy¼ +®[·nìØ±¼ªñE‡×ÈÈHúø._¾Lãþ¸¸¸÷ïßëøZ33³5jÔªU«I“&>>>;v¤Ó¹ª½ƒv„3gÎÐ~qûöí?ÿüóÍ›7º¼ÊÒÒ’Æv4°£H£F7nܰaCŠj÷ÖP@¢S?ÿ»PRRRvv6ahèVôËÇ^NoêÜÜÜè|çááAG•/T§NÿÊ@ÿvÚNhk9wî܃bccu¼´R¥J4® £hƒ hƒiX¨Ü.óðáȈÚrèLT´ Ñ{[ê_¦­…€££cÓ¦M[µjÕ²eËúõë›››ko@mŒ,¯¿þ:44”WµÑ£GoذW5.?~¼gÏžS§NÑè?''‡KMÊš$ЧOŸ/¾øÂÔÔ”KYÅhЦ{˜Ñ‚N*¶¶¶ìuôB§=sRÑ(ªråÊjôG ^ï3{,,,Øë(–ŸŸþüyÚ/Nž<ùäÉ^ei,Û«P‡äþùJKK»wïÞõë×cbbè—›7oÒ(Ÿ{+ôŽyzz6+D#<í988poE™ÌÌ̃îß¿ÿìÙ³©©©\jÒa³E‹þþþ={öôööæRÓÑÈêĉ§OŸ¦“ÑóçÏYJÙØØÐFBa€ÞºvíÚ•zBP@ã 4èØ±#¯jt0ºpá¯j,âãã÷íÛGCœˆˆU÷)77·¾}ûRŽjÛ¶­¬$0eÊ”U«V±×¡Ñÿ«W¯>ym‰/ƒ~ùå—ú¾ª^½z4S£?ZüÇüÇŸþÉX„ÒcRR’““—.é‹vÏ;wÒ®‘œœ¬^+ööö´SLŸ>ÝËËK½VTõôéS¨]¼xñܹsqqqâ; ¹Êà[¨}ûö*T߇ÜÜ\ÚTþñ;vŒ×Õ“RÕ®]{øðá4ÜT|Ç‹Ázûöí¡C‡BBBŽ?ÎåòA E' :ùÿs´1¾@>ûì3:Ûq)EÇqö#:gÓáƒNÞ‚w%OOÏ™3g:TüµÏ'NtéÒ…K©›7o6nܘK));ÜSÖzùò¥ÈK¤4bvvvf¯Ó²eË+W®°×Ñ í 4 +Y¸p¡ÈyºhÛ½{÷ü‘þÉÂU,???::úüùó4⧘D[—ìý¯Ê•+GFF6hÐ@X‹YYY7n¤ñãµj½Ð?sĈ3f̨Q£†°FÕµjÕª°°05¾/úPݺu'L˜ðí·ßV¬XÑ@mŒ2ðº~LèÐ#æ`WªˆˆˆE‹Ñ@GVˆ‡‡½ŸãÆyÅ.77·Zµj:Þ½­îé Ï^GwŠ÷©Ã‡Óø’{>&44ô믿f¯C§·Ÿ~ú‰½ŽŽ + + +víÚEûÅÝ»w…5Z½ok֬៸{õêÕ±cÇÂÃÃ?ž––&»;¥377ýúµ˜{Þ222V®\IÇ^·úè‹N"³gÏ + +²´´”Òv=š3g1ÄçèD@Cÿ‰'RðFЀ6FNŸ>íëëË«¨ìììxUÓÑÇ'MšÄwF#µjÕ¢CIß¾}…µøÕW_Ñ€˜½N``àÎ;Ùëè(//ÏÞÞ^Yt¡Q‚ ¸wécxåäË—/·jÕŠ½Ž.®^½JûEdd¤˜æ´¨Zµê’%KF-ý¤¤¤½….^¼Èq•4hÐàÎ;j·BYqÛ¶m4òVõö0y{{oܸ±L|wT¥&úÿþûïjÜí£; +Qt\MLLd¬ƒ €h¼îmÐxðàȳ³³—.]ºxñâÜÜ\aê¨sçÎk×®­[·®€¶~ùå.Wî]]]E~é¥x4Ü©S§3gÎðí-Z´¸víc:À +xÊ‚>Ä3fP–“~B)ÎÏÏoË–-r' ¢ÁYHHû?6éŠúöÛoÿøãU›¸páÂäÉ“oܸ¡j+z¡ÝdÚ´iòËÊåáááãÆcvÁ$¨Zµª‚™XJEc2™q)õI‡?~¼”GôtT¡B…   ¹sçª}£§víÚ\J={öÌÃÃK©OZ±b…ânÅŠi£sŸ@VV–½½=ûU½Aƒmß¾K—´ È7ß|c˜7´T¯^}ÇŽ¿rÔ—'¹Sõ|‘ŸŸ?¿a&¢víÚíÞ½ÛÀŸ +HNN¦±2Çùô €`4jÔ(::šK):»8K)-h7Yºté¬Y³ ó¤UBûöí÷ìÙ£önåååõèÑ#ö:Û¶m&//oÁ‚;˜Ó077Ÿ3g¥b333ñ­—Å ÞvN§{ÚÙO:¥Fq^¤‡Fí®\¹Ò³gÏ””Ùá@0 :tèÀkúÎåË—O:•K©ÉÌÌ6lØTm…/777é¶hÑB½&&Ož¼zõjö:´eÒöÉ^G.../^¼Pürú÷Nœ8‘c>fÞ¼yìOîª=(½“_ýõÅ‹UªÏe¿J•* n·Ì++«ŒŒ 5&8þü€Xv@a,,,hp6iÒ$Ù)),,lРA§¾P€`ðz„”L›6mÙ²e\J•êÉ“'ÔÛ‡ª×„J*V¬¸eË.3É”êøñã]»ve¯ãííÍëë í=zÄø¸ _víÚÅ«?Z|ùå—'Ožd,Bñ/**ŠK>DƒZúô9®ê%@£F<èîî.²Ñ2š7o~õêUîe÷ïßO#WUg÷çnÔ¨Qtê4œÙ¨3'NÌÏϗݵ †€ AŸ>}x]PWõyµ˜˜??¿²û”•¹¹ùºuëè4¦Fq:—;::²_‹233KII0Åþ¦M›FŽÉRAÌ#Ët‚§7–ý!™¹sçΛ7K—J b=ÊâM...aaaª~3VB™ j|#G£ºÉ“'ò}bÓ®]»}ûöU¯^]vGþÿ×ôÊî…ºC@€ã-@êÝ@ríÚµnݺÔ= +˜ššÒQF¥»¤hxäÈö:b¦Øç²TM\\\Íš5¹ôçcnܸѬY3ö:‘‘‘­[·f¯S±cDz²²¸W£R¥J—/_öööÓ\™ ¿ÿþûˆ#8üá‡/^̱ ` 6ŒŠŠ’²4r:p5JúhMm‚! HP¿~ý˜˜.¥¦OŸ¾téR.¥Š;{ölÏž=¹¬ue.\H§aîe×®];aÂö:³fÍúùçŸÙëhçééùøñcÆ";wî äÒŸ¡S û“*MzóæÍöíÛ—ÝÑ¿FË–-#""ÌŽjR@tt4Çt´|ùòiÓ¦ñª&‹z_¦é"$$døðáeñû}!†€ }âô¹s)EÇe::s)UäÑ£G­Zµzýú5ß²rýñÇß~û-ßš¼&íØ±#%.ö:ZðZ}‚†æ\}Ö‚ÆîÝ»‹ 8pÇŽ\úS$11‘ö ‘ë6¨gåÊ•bn¨([ R¥Jééé¼&>räH¯^½ŒàžuzC®^½Ú¸qcñMŸ9sÆÏÏÏÞC] †€ Ú»wïlllx-‡É} ÌÌÌ/¾øâÞ½{kkkë‹/r¹·¤8.—Õ+V¬HqËÊÊŠK—JµwïÞ€€ö:ô²¯Ï¥]Íš5ÙÙ!!!C‡åÒ·oßRNSãñP)h¤{çÎ^kYhQ¶@»víxÝœyëÖ­öíÛÍ—¨"¿5*’––F©ÃWžá @0ÑîÞ½Ëñ+æ 6Œ=šWµ‚‚‚Þ½{‡‡‡ó*hP<<zô(—É(5~úé'‰÷z +àççwìØ1Ž+"Qµnݺ±×Y¶l™ª÷ +·lÙ’×ÕkÚ%}||¸”úжmÛØ¯ÜsŸÉ‘Ëc ˆFWêÍ“«Q¶ÀöíÛ ÄX„½zõ:tè—.Ž*Uªh^?ÆÜÜÜ©íƒ)…Ô~ðÑÍ͆t666ê5Q¶À£G>ÿüsÆ"Â&¬´¶¶¦ÁhOJJbŸ9÷“(œ‡„„¨Ý +‰¯W¯žÑÜ@¥#ÁDã²È‘†©©) =é4À^ŠN!Mš4a¿]•*Uòððpww¯Y³¦¥¥e\\ܳgÏbccÅî+T¨pýúõúõëó*Èe2P:‹Ó¡€>P.]*ךeªÞ:Ò AöçO.]ºÔ¦M.ýÉÉÉiÕª•J+µÑÈ›ÞÌîÝ»SÀ ³ ý‹7E£Ê´w„‡‡‡††Þ¿_>Ìž={Á‚jTÖlmmèͬ\¹r•*U(ªÑ§–‘‘A‰—ÆÄô»Žá­jÕª¯^½bÜU‹ØèhÓ­[7OOOêpñÿ›››KÌÝ»w÷íÛ·ÿ~5fp¦7çìÙ³:tà^¹„€€€½{÷ªÝJ ‹êÕ«ÓHRjjêËBïÞ½Ö Á„¢exY8.ÌDïϺu블ú¹¹y§NèÓlÙ²eãÆKýktö}øðadd$ àŽ=ªÞ5צM›^¾|™× +—¼îá;ÿ`q3fÌà8W, ³è“Rc}P::;;3“íííiÄëiE^ÏN”@a›ö¸ÀÀ@°êø’˜˜˜={ö¬^½:--cO(Ó‘†ékÇ7P@úì³ÏèÝkÔ¨ýBÅég‰qð‡è I}xò/÷ }øí + N:ÅÒ½¼¼<꽟,E>DÃî>}úŒ=šâ¢Ž·/æççÓH}Û¶m!!!|¿G¢øµk×T}øäÉ“ô/U¯¾Iáä ­[·nUÈÝݽÔÃ(C&''ß¾}û¿ +ѹIÕ.™ ‡€ ß›‰Û·oþüyö:tÚ£®û¥}6¬Zµjz½¾¡¡¡t€PéÂçâÅ‹©c\J=}ú”F!ìuhl§Òæ-Z´à;uÅ':qr,¨±sçNö;°iTMu¸ô‡‹õêÕãu딆n¿ÿþ{eC(‘mݺ•ãÞ@Ñ‚Wµ¸úzôèáããÓ®];Ý#“ééé´ GFF^,”››kR˜“WìZ·n÷ Uƒƒƒ;wî¬ìå7oÞ;v,ßGb6mÚ4|øpŽ‹{÷î]Æ UmתUküøñß|ó‚© h4¦Ò—‚! ˆ“Mg²ØØX^øá‡… 2¡]€sÜç7¤ñ PgÍšÅr‡1½è³£#÷Û[iFw.Õ>ÿüs,2Qé1zëù>Ú±dɆr,¨1zôè72Ù²e N.ýéß¿?ß‘ñ€V®\éââÂXçäÉ“£Fâ5=¢©©éíÛ·Uúö‰KPõa嬬¬3gÎ;vŒv@___ÅuÞ¼yCÇ/^ðêXÅŠçÌ™3}útÆoÛòòòV­Z5{öl^ÃÖÏ>ûìÁƒ¼VK(ø¹—µ¶¶ž9s&1Ùg[¦¾yóæõë×s>!†€ €häıàÙ³g;vìÈX$44”ûÉÕÕÕuÛ¶m:uâRÆÖ}úôáþÅ:Ç»Ÿ'NœÈ~à®ZµêË—/¹·F#¾5{ôè¡Æ$'4° TÆRƲ ì#lB‘˜‚1¯„™™Yppð˜1c¸T3)|J²sçÎì±SCuÓ4 ?ðÂw +5''§'N4jÔˆWAÚa4ßu°Ûºuë!C¸”*Žv·zõêQºà[¶Aƒ{÷îå5[†FAAZg͚ű·‚! ²oß¾þýûs¼kcc“ššZ¡B–"tkÒ¤ ßgiGŸš»»;ÇšoÞ¼ <|ø0Çš•+W¦¡ hÙK=z´{÷îìunܸA{â&OžÌ}í^;;;Úöøf•¸¸8Æ"×)£áõ™3g¸”¢7ê÷ßÿæ›o¸T+òâÅ :BÆÄİ—¢Þ»wÏËË‹½T å$Ðyœþ¥™™™\ªQ‚=yò$lj +4Ž?Þ§O.ÏVÕ©S‡6Žó)k¨qµÂÇLJN¾Ÿ|PD™¼¼¼M›6ýøã´°WC @„S§N}õÕW¼®¾hôêÕ‹—ŒE¸L»^ÜçŸN™››ÇšïÞ½£AÀÁƒ9Öœ6mÚ²eËØëðš ”ûºÎ¤aÆwîÜá[“\¿~½iÓ¦ ÒytäÈ‘ŒExMѶm[ö:&…OÙîÚµ‹û°F#))©M›6Ïž=c/5|øpúØë”PNÀìÙ³ÙïÆÔ¨]»6/jժťZ ”zôèÁå:Thhh¿~ýØë×±cG.Oµ ܲe‹ª‹¬›®XL§ã‹/2ÖA @uW®\ñõõå>Çeppð¸qã‹4jÔˆãåOOOú¼\]]y,2@@@Ç…Š+W®üüùs;;;öRݺu;vìcJ‰|—aæ2¯N©ø.§@† ²}ûvÆ"¼&íÛ·/¯ç1~ûí·Q£Fq)UªÓ§Oûùù±Ä666ÉÉÉÜ×(€’¿»»{jj*{):"ݸqƒ}--¦M›¶|ùrö:={öä{9æöíÛ7æXöâÝ»w«ô¬B #FŒøã?‹ †€ ®#GŽ 4ˆû3¬VVV úN­S™3gO.ñ!///ú°Ô^'’{ൾýš5kØëp¿µ†ï²ÓÅùûû8p€cA777Ú¤Y*ØÛÛÓá”ý|ÿøñã:uêp™<‘û»Tª±cÇnذ½ÎŽ;È^§¸ò¸ìûjÇE“¯+5jľ䋥¥ebb"ã9¨8 ®X±‚Wµ.]º„……1Þ"«;´)Ó€6­¥K—Κ5Kå<étH'EÆ"/sÚÚÚÞ¿_Ì*ñ999M›6å5=( P>|È~3+¯É@£¢¢Z´hÁ^GcܸqëׯçU­8‡””^7Ó§Y¯^=Æ" صk{gx­‰áää-àðž‘‘áííÍ>)Ïv}ÈÏÏ÷òòâ²Ö˜¸hRx‡[ûöíÙOL¿üòËøñã¹t‰:ãîîÎx  Hƒ ®^½Êe‰L!(€€ MÙ ¯^½¢ÙÇèsäÈ‘nݺ±Tˆ¥+¯‡’þùgŠ:\JéâàÁƒt²äUýÍÔà2(ß6===Õ[ÝùöíÛ 6äRŠFtòc,²yófömß¼yCdöÇ9HxxøW_}Å^G4ø !cKKK)˜"] £™zöìÉ^ÇÑÑ‘b0ß7_ .Kí¶iÓæÒ¥K\úÃwµrú§õíÛ—W5] (€€ M™ 4ž>sæÌÖ­[CCC¹Œ!JåêêJÃwÆEæÎËåqIM=zT©R%.Õtäëë{úôi.¥xMÀÏe2P: =z”½3&…  Ö¬Y“K©R­Y³f„ \Jõë×oß¾},xMJÝàòhc‹-¢¢¢ØëèèíÛ·nnn¯^½b¬Ãq ££Fúý÷ßÙëüôÓO4c¯££S§Nùùù1¡.99™Kh¡­ŽÎ›ìuˆ··÷­[·¸ÏP¤€Ú”•@[QDDÄ®]»öìÙCDõÒ =–ÎŒE7n|ûömÝqßꇮ\¹Òºuk.¥*V¬˜ššJ?ëpYÁ¾råÊ4Œc\úG#$$„ûÔ“ÅñZA¶  €Ž/_¾d)ÒªU«Ë—/³w†×@D9R´ã2ßë¸qゃƒ¹ôGømº®®®ì‹UªT)66–ãýôŸDç¬:uê¦zõêtÎ655e¬sãÆfÍš1Y¸pá?üÀX$??ßÙÙ™1Š˜ÎäHC+îkºi÷àÁƒzõê1îÔ 6äu]@øÀ¥K—ÚµkÇ^gâĉÜëø¤åË—O›6±ÈÌ™3-ZÄX„Ë#@^^^111‚/ÿ› (‚€ ¡îÐЙŽVQ…hàÂwj]ìÙ³' €±È† ÆŽË¥?\n¼V†ÞÿæÍ›sÙ…yy¹ÌeÉë +ÚÁcccÙëhAçÚºuë2¡ÓÀôéÓ ¡'gÏžõñña,Bh[b¤AoooƳiäôêÕ+.ãjw˜1cÆÒ¥K‹P„~òä …F.]ÒèÁX¤C‡çÎc,²nÝ:^Wè6mÚ4|øp.¥ô‚ €6¼À¨Q£t¹7#???##ƒ~ÉÌÌÌËË{ÿþ= iÄŸðüùsúåÝ»wìaáëë{òäIö:þþþ\¦p®Q£Æ³gϸܯ¢ }¬\ÞZµj=}ú”½ųþýû3áò)ÓBÕÙÄ5¸,Fѽ{wÆÇè_Ê~3™:uêÊ•+‹Ðx.>>^½Õ0´à2èñãÇÙïd+bÜ N:>d,Âqùj}Õ¬Y“Nm,*V¬øúõkÆo€Èeþ.GGGú爜ü§€Úð +Æ¡R¥J7oÞôôôd¬“››Kʬ¬,ö. žüçCáááìw jp¹„üæÍ›êÕ«çää°¡š’'ã Ö¿äÑ"00pçÎ,(i;88Päf)2cƌŋ³TÐ`¿‚NZ¶lyåÊöÎ(°yóföËŸË–-c¿3¤ˆŠyîîîìu?þ[½«¡¡¡ŒEh—©_¿>KJˉ‰‰ŒÝ0) ð\Ö8S@mŠãõåfdd$—ÕR­¬¬ž?.lÞºRЃËf¼~ýú1cư×áòdÂùóçÛ·oÏR×E5í\\\ÏÜ\Mšý‰ðׯ_S0fŸ}þüùsæÌa,¢ÌÇëÔ©ÃXdüøñ¿üò —þ˜u è;hÐ ö:7nÜhÒ¤ {V¬XÁ>;tèP=¿<..ÎÃñ÷îÝãõ,¾@@Р¯EŽÈÊ•+§NÊ^§[·nGŽa¯ÃˆËm¸&…Gp.ÓùýöÛoìAbÞ¼ysçÎUürÅÒМŽ-ŒÝÐã7'4\fù—:~Raìïèѣݻwg,BnÞ¼Ù¸qcö: +ÐéÌÁÁ’ K¾ûµ.ÓþºººÆÇdz?I¯ÌÅ‹/4˜0?ñÂkQо¼V‡T@m4è$zýúu[[[.Õ(KpY¡lÆ £Gf¯ÃèòåË\æÌ©W¯Þ½{÷Øë$''רQƒñB2ã£u×®]㸜°v«V­š4i’â—wêÔ‰ñ!BŠ[\V;æ²2†MFF†øIHаߕÎw eÄ yóætXf,Âk.]e¸<)Äxã û% JÒ€’½Ž2 + hƒ`R8ïçéÓ§Ùoý/âááÁeÒÒ¤¤$gggö:ŒxÍ!mjjšššjooÏÞ¥víÚ1.iiiI©R¥Š²—/X°àÇÔë%vvv´¥)ˆ@Ý»wW|Ë•«U«öþý{e/×àµ3—¥å(‹FDD°wF±6mÚDFF²T°¶¶ÎÎÎæuMÚX@VVVÕªUóòòëH¼a̤pÅzGGGÆ"}úôaYÅËšÄ&¼^×€Ú Ð`%Ÿ}ö¯‚4j¯Q£{^ÓæpÑ«W¯ððpö:¼N!Ë–- + +b,²Ž‚Bgq«QÏõm‹å‘åýû÷3.ÙC)%%…ñi“›¦h<Çø,2ùî»ï~ýõWÆ",¸<‚BáÓÁÁKŒ5œ?¾cÇŽìuèÀE{eh³·²²ÊÏÏg)¸ßçŸþäÉ–h<þ\ÊÔ[ + hS΀§§'þÝÜÜ8Ö¤‚¾¾¾ìuú÷ï¿{÷nö:\ðú™ñn–"\¾XW|2xýúuõêÕõ½6L}V¶mÐFÕ¹sg/7nãÝ;ìÓi¼xñÂÅÅ…½ÎºuëL¾¤—•ŒŸ={Æë¹Lc ›6m9r${øøx¾Gx}9::R€g©Àródnnn¥J•ØŸ¼·±±¡ô.ëQ +E´)Ï mÛ¶{÷îå¾m„„„pY·kÑ¢E3gÎd¯ÃÅáǹ\E›>}:—ç‰MxL(©xn{ekÐ("4x󿾝U< gíÚµA4ú§ ÀRAƒ×SÎÎÎ4 a¯£ØË—/5‹™°¸sçNƒ ¸ôÇX™¸ÌÝ)~ý¯âââodªY³¦â{J¹,FFš6mÊþ< ´)·`̘1t `\]¥T .œ={6{ƒ:%óZI~àÀ;vì`¯C~üñÇ 0¡‘“‚ñÁ¨Q£ôΈFi?¦_zôè¡`˜&MšÜ¸qCßW=xð€qáKKK:~V­Z•¥ˆFXXXïÞ½Ùë‡K—.q™)ØÄx—5׌í€iiiÊ^ÕªU+ö>ðú&P1´)‡ÀÚÚú—_~¡£‰Jõ¿ÿþ{.÷(_¹r¥eË–ìu¸ÈÎζ±±a¯ÃeY{ .W”•ÝOâîî¯×Kh«X»v-ý²fÍ7A™šš&&&êûDøªU«¦L™¢o[ÅuíÚ•q á"´Ó±LehdŽ;Ö¥K.¥Œ5(‹ÊFÉÜÜüýû÷Ên¿áµ’#búé'ö:Š!(€€ My ݺu[¾|9ûz´ZôîÝ;,,Œ½NBB—‡‰y©^½úË—/‹Ô®]›}°¢A}â%ôíÛWßù1îܹӰaC}:pà€f*nÅWå·mÛ6xð`½^B[; 4´U$88xܸq,ŠÌš5kÑ¢E\J={öp)e¬ Q£FÑÑѲ{a(²²²”Ýù¶qãF.sI‡„„ :”½Žb + hS~€——í ¦ƒhݺõ•+WØë¼}ûÖÚÚš½/\¦’ sɸô‡L˜0AsY]1[[[J5–––º¿DÁDÔŠæ?•Ý—?lذ-[¶èþ÷srr³³³õm¨ˆ©©i\\¯(‡¾yóf.¥ŒÀï¿ÿÎëKHc NNN)))²{a(O Íë–ÔƒöìÙ“½Žb + hS7çÎ;zôh‡ h®~ýú111ŒEhHúîÝ;.ýá¥Y³f +nCÿP^^ž¹¹9{rêÔ)???Æ"/^lÛ¶­î_Ádö%n|3fÌo¿ý¦W“ÂÍ811Q÷ÛŽ;Æ8y?EYÆ ï‹ëׯË\æF†×tX&Ƭ­­ssse÷ÂP<~ü˜>h/œ9sæ’%KØ;@ãö:Š!(€€ qzÿ'OžLã­Š+Šl466–±ˆ££#ûý6|ÑÑÿìÙ³ìu222/¿UÂû÷ïi×Vüxœ…Ãyóæéø—³²²è£Ñw\Rb)¢½{÷*»ýãöíÛºß}4eÊe*h¥ßy¨ØïG2&W§2ÊŸŸ/æzMYqãÆ&Mš(x!åÌ5kÖ°w@ú3i + hc¬ Q£FAAAýû÷ár¯¼A­¦Ák-0¾Ë:tÛ¶m,ôºÎ­ì‰º¨¨¨âÏ++[F€,]ºtúôé:þåºuë>xð@ß&Š»ÿ~:uX*סC‡ .ðªVÖÑщËuY# ™™™¶¶¶²{a@Ξ=«lY´Ñ£Goܸ‘½÷îÝã2œb + hcd€ÞpŸÑ™¬]»v²úP±bÅœœÆ"`nݺť?¼ 2dûöíìužÿüó'Ož0±±±yóæ —þG£î±T¨T©(¨{û cǎݰaƒ^5i$’’¢e£ì¢x×®]=ú±ÿ›˜˜èææÆrÔ äò°G ìÏ%Žn£ ¤B… +†vD":lj9:i±`Á‚ü‘½Ÿ¼î 6´Aà. `ïÞ½ìu_òQ —Îh°òøñc.ý)¡I“&Œ+'„††öëׯÔÿUPP@£ê¤¤$½ +~r$­ì‹ Ñ1ícË$­[·î»ï¾Ó·fq´õÒ`¥B©ÆŒ£ËTKåÄÉ“'}}}¹”2ÖàêêJiVv/ ‚•••¾«aŸXƒ†°\‚„b + hƒÀÝäÉ“W¯^Í^‡û<Œ,²³³•]*¡cÇŽgÏže¯ó¡E‹Íš5‹¥ÂàÁƒ?¶¨pdd¤‚à¶oß>hÐ -Añ»wïîß¿©ÿ«[·nÇŽSPS£råÊtÀ¬X±¢â +Ãë,¸oß>¹ qáååÅëIc \VŽ«Y³¦|ïdnnÞ¸qce¯=tèPÏž=Ùû0|øp.+† €6Ü-[¶,((ˆ½Ž–Ažx÷ïßç²< ˆ¹,Kù¡§OŸÒHˆåh£åÞ÷™3g.Y²D¯jtÎNNNvttÔþ×”=1ò±·‘}Y4õ> àà`.‡ÅK¢+c \¦³´´¤‚û-eÈÍ›7›6mÊ^§C‡\&P @m¸Û±cÇàÁƒÙë,Z´ˆÆìu¸Pö쇦OŸ¾téRö:¥jѢŵk×X*|lö›:uê<|øP¯R:u:sæÌ'ÿÚìÙ³,¸û±¬²gÏÆÐÖ«W/– +sàÀ>}ú°×á8Žq0Ö0zôè7²×¡€ÍåâEÅküãìì¬ï=|!(€€  wì³°kÐùXÁ<ñ*™?þܹsÙë¬X±bÊ”)ìuJÅ>И1c>\íøÁƒuëÖÕ·Ôòå˧NúÉ¿¥ìF¯Ro"2dËõ{[[Ûääd•=W¼øq ÒoE04Æè€C‡ö:”ŠØë”Q4«X±¢âGŠ{úôi­ZµØë(ƒ €6Ü¥¦¦V¯^}³§C-p¹t‰¯õä?þå—_²×)U||¼‡‡Ë;ïä䔘˜Xb–ÒÅ‹ÿðÃú–zôè‘.÷÷SoÝÝÝŸ?®oýÏdyyyÎÎÎ,ËG|óÍ7›7oVürí¨cÕªUc¯CyéòåËìuŒ†±€­[·6Œ½Î¼yó¸\¼(»<==¹L½@ŸÈ!CØë(ƒ €6jàuÀå¾h®2´ »ºº²ÿkjjJ£@Uuþâ‹/G‡çÎëСcͺuëÆÄÄèø—iÇ Ö«¾Iá)xè--úÚ‘iwÖ·Nq‡îÞ½;KíèxËX¤J•*iiiÜ—’(»Œ5Ü»w¯Aƒìu ê«T)¿,2jÔ(‰y!(€€  €† ¶uëVö:7n9r${FŠoS)ÁËËëÁƒìu´Xµjã-F%ÖîMNN®Q£FAA^E‚‚‚thøøñãʖݽ~ýzñÇû&Mš´fÍu4(˜QàTõqÉ~ýúíÛ·½Îµkך5kÆ^Ç8kÈÏÏ·³³Ówíí999ц]<*—74ä8q"{‡¤¤$YOT#(€€  €èÝ  {=z°ÏƒÁnÖ¬Y‹-b¯3tèÐö:ZÐùÉÍÍMßñzqôò¸¸¸¢á‚²Y´/\¸Ð®];ÿòû÷ïiŒòúõk}[™;wî¼yóŠþ³víÚ,GŠš\ž¹Ô‚ךDÒÏjÅXiÓ¦Mdd${˜˜ñ ^WpLÔœ$à“~¨D@(w®_¿Þ¼ysö:ÖÖÖ‰‰‰ªÞ3óI´ÿÖ©SçÑ£Gì¥Ö¬Y3aÂö:Ú)[^·¸«W¯}|Ý»wײìn©“““õºGeàÀ»víÒ«Ò¨Q£¢µÏ¢££é?õ­PœªghÐ;Éå#é3#4\£3 {Å‹Ϙ1ƒ½Nõþý{;;»·oß²—êÝ»·¬u@@Ð@ tÀ­^½zzz:{)é;ð‰'ºtéÂ¥T‰[VT²víZƘ1kÖ¬ŸþÙDé´úÆ Û²e‹^/¡Ñ?e½^¢Q4/ã4MÕªUKJJ²°°P\A©©©NNN,ßÏh˜šš>yò¤víÚ\zUÖqضmÛСCÙëÔ«WOÁjƤmÛ¶ìuh×‹ŽŽæòl†¾>~@@(öîÝË^ÇÃÃÎîyìÕ«Wxx8{ggçÄÄDwâ¾xñÂÍÍ-??_qOOOͬÿ4*0`€¾/W0í`ff&% Sõ­ZµjÒ¤I&Ì˦Ž;vݺuŠ_®;J€7oÞd¯3{öì °×1FèˆáêêÊ¥Ô¥K—,æm4æÍ›÷ÓO?q)%àNÎR!(€€  €J6mÚÄëùÝÐÐÐ~ýúq)¥¯4hЀe0]DÕ)&Kðõõ=}ú4KÍMÃÞ±c‡^/´²²zùòe•*Uôm±k×®Ç×÷U>>>´ÿ&$$Ô¬Y“åH{öìÙŽ;*~¹î¦M›¶|ùrö:•+W~òä‰!Ì‘%“ µ¸Ì@›7mäìuʨk×®µhÑ‚K) ‹[·nÕ¯_ŸK5Ý!(€€  €J^¼xQ£F .?j£££ÍÌÌØKékРA;wîäRŠêr)õI[¶lùöÛoY*,X° ((HÁ³¹_~ù¥‚q< V°ÑÉ899y÷îÝ,{Ÿ»»;¦Äl`¼ &L`™õÈhw OyíÚµ\J;vŒ×ÝŒe¯©œ5:wîÌx…E´APã]ÅI9=ß¿ßÛÛ›Ëåsss§:::²—ÒEff¦³³svv¶â +Íš5[´h‘‚‡b×­[7vìX-*¾s‰ÒÎöíÛOœ8¡ Q~øaáÂ…Š_®—¬¬,‡wïÞ±—¢ÄBÇ.1_\2ãû÷ïïÛ·/—R´EGGËSA¢áÇsüöàÁƒ={öäUM + hƒ Ž·]zyyݹsÇÒÒ’K5Ñy—ׄmÛ¶eœ™G_Œß]˜šš*˜ƒ•rNbb¢“““²F;wî|æÌ}_åççwîÜ9–!õÝ»wE~¡O±êäÉ“\JÕ®]ûæÍ›¶¶¶\ª•QÆÒÓÓ]\\¸Ì`c"öFDCÊñ#öðð¸wïž ¯‚Ÿ„ €6ꡱ mïß¿çRMñ¥ee®\¹òÅ_ðÚyéÀÍxO޾>üÕW_‰lѤpo:uê”â—+[s€QÓ¦My}O¥# +fÏxUëÚµkxx¸Úó2ã&…OnÛ¶W51“ ¬¬¬š5k¦¥¥ñ*(ò›CE´AP¯¹€ˆ‹‹Ë£G*W®Ì¥šv´Ï¶oßþÒ¥K\ªÙÛÛ?þ¼R¥J\ªé(//ÏÍÍ-99Yd£Œ!íåË—ô)SÏ9vé“–/_>uêT‘-¾{÷ÎÕÕ•þ±¼ +Nœ8qõêÕ¼ª•9FΞ=ëããëš¹¹ù¾}ûd­f%×ôéÓiDÈ«š¥¥åÕ«W—Ñ€Ú ¨êÌ™3;wæUÍÏÏïàÁƒÖÖÖ¼ +–ŠvXQñzðΤpâ—eË–ñª¦;úWˆ<Ö3Þÿ£Áñö]˜™™ÅÅÅñšiQw“'Oæ;d§šËÚÛe‘Ñ:"yyy=~ü˜WÁ*Uª\¸pAØÈÕpÄÆÆÒÖÂñƒƒƒCXX˜î«ž³@P@µÑi&::šWµ.]º8p@½ À}ôojjúàÁOOO^uÕªU+aÍq™ã÷ß5j—þè‚6§cÇŽ k®ÈÝ»w½½½9¤ôEÙ˜×üBe‹Ñ²téR¾Kùº»»_¾|ÙÅÅ…cÍ2¡_¿~ûöíãXNF!!!6´APû””%tëÖmÿþý*TàXSƒûèŸøûûSbáXP/uêÔÑ,é%@pp0ûüiiiÎÎÎ\&Éѹ¹¬´ªmÆ|³‡……‚~þùg1·ÉŽòÒÓÓédªïœ¼ÚѨ€rŰaÃ8Ö4|.\èСßš¿W¯^ýý÷ßó-[€Ú ¨-??¿Aƒ\Ö²)Ò·oß;wZYYq¬Iû)ýõWŽ5MMM£¢¢š7oα¦^æÏŸ?wî\ q¹ÿG£GGŽa¯óI666/^¼5\¾té’w|öÙgt,2„éÞi{ óŽ€5¼ËC0)\ûYGN)ˆÒˆ6î•õõüùs777 ©tŸaPPÅoõÇGP@¶oß>dȾ5Û´iÊë+ì7oÞŒ7ŽúÉ¥Z‘>}úðýºY_±±±µjÕpâ¸2NHHÈ7ß|Ã¥”v´MnݺU@Cããã£Ò⬾¾¾kÖ¬©[·®ŵKKK ß³gϱcÇ(ö Y–“ššJçS:Rq¯liiùÝwßÍŸ?_Ê|²Ïž=Û½{÷æÍ› + +Ä|]yýúõ-Z¨qTlÙ²å¶mÛ>ÿüsî•MA@Ð@:²7nÜøÎ;|˺ººþúë¯ìÓYܺukàÀ|¿£0)¼üóæMéOÚµk׎×tFZp¹ÿG###ƒŽW999\ªi!}aTŠL4RW©¸••娙3gÖ®][¥&Š£ãü™3göîÝ{òäÉ¢™Å,–TN¡¡ÌŠ+T*N;Õ§$ à;±üü|:êÒ¦BCúEó‡oÔ¸·óC§§+¡J•*´ÓMœ8‘ûÛˆ €6bÐPÀßß_Ê4†£ƒKË–-¼öéÓ§óæÍÛ¾};—å~K P±cÇîeõõÛo¿3FÕ&ÌÍÍ8dz÷îÆ«Z©(=ÆÆÆ +¸AE;ë»Úš^hPEoæ!CºuëÆ÷–9BÃîsçÎ={–~ÆÅÅ}ø–,YÄ·Ñ•ŸðòåËúõëÓ ]½&ik>>\ö T½Õâ…4•Š+œœÜ¬Y³„„Ùá/>>^í¹Ë[ ‡ò÷÷WéöE‰6lxûöm‘-r_¦ÆÀ!†€ÿëýû÷;w¾xñ¢ìލÂÚÚúüùóÜŸŸc·dÉ’™3gªQù×_ýî»ï¸—ÍÎΦ£–.888ÐP[½Å¤•‰ŒŒìÔ©“°Є9q℟ŸŸªM”Ã`"uP¥Ú+i—ühþĉʼneA þ¤¤¤æÍ›'&&Êî7n9r¤ì^”"99¹fÍšEó3ò¢Òý?ܵk÷²“&MZµj÷²ìÖ¬YC}“Ý ÎV¯^M,U›(Ÿ    gÏžb–ÌéñãÇôŠl1??¿wïÞªNÆe8C@€’"""|||Œìzçwß}Çw!a¾üýý<È·¦J÷ÿhìß¿¿oß¾ÜËÞºuKúâ 3tèÐmÛ¶ÉîOcÇŽ]·nªM”Ï@^½zÕ²eKö»A c_ÚE_™™™mÚ´¹{÷®àvÅC J2bÄ5&à—¢Gûöíã>Õ:GtfíÝ»7ßš*Ýÿ£‘““ãì윞žÎ±¦˜yi£ÝaäÈ‘[¶l‘Ýn:tèpîÜ9U›(·À¤ðÛÔ/¿üÒ˜F®‹/ž1c†øvŸ>}JÛªQ>‡S€`P::é2„û})âùûûïÞ½[Ì–Šååå¹»»+›ž¯TªÞÿ£ÁýŠøúõëÕ^/¦L™²zõjÙá£Zµj)))ª6Qž€Iá÷ݺu‹ŠŠ’Ý>ĬQªÄÄÄîÝ» ~ +Y0Áà£>LçÝ·oßÊîˆrƒ¦3–………ìŽ|Ú¬Y³-ZÄ«Z§NΜ9ëZ©:Ô³gO^ÕªT©’@?yT€UŠ„¡ ïºcz)çÀ¤pÕ­¯¾úÊ8fVûÝëׯýýýÏŸ?/«jC ´9}út@@€€ÅPÕ0eÊ”åË—«=Ó9/qqqµk׿uÛ•ª÷ÿh¼ÿÞÙÙùÕ«W\ªM˜0aÍš5\J @çi:uÁ÷cçÎëСƒzõL +gÍ9r¤Í FùœòŒÄ#jNNÎСCCCCeu@U‚! À'{öìca|^^½Õì’J™^‹÷ï߯X±â矦,»/J¨½JxñâEPPжmÛ¤=”¡¸h b¤¦¦Ž;vïÞ½²; €` ‡'OžÐAêøñã²;R +‰.Z´hذa²;„þ ³fÍb©`nnþüùsggg^]Òn̘1¿ýöK…Zµj=~üXð +£|½|ùrþüùtœ)s3纹¹ÅÇÇ«W T×®]›íëëËRÁp®)2¢Q]PPÈ7Ÿ}âââÔ["àchì±mÛ6:jøY¸„!C†lݺUv/þz'CCCi×cÿîT.Á úЃ`°²³³ûí·Å‹¿xñBb7hè8wî\Á Ô«êÛo¿eYmJðÖžŸŸïêêšœœ¬ìåUªT‰·³³ãÛ+‰nÞ¼¹råÊ;vò·æææ>>>cÆŒéÝ»7íDê5„ ]AAÁáÇiFéQv_´¡=tÀ€C‡m׮쾔.'''$$dùòå=’Ýý899ÑPÇÏϯk×®fn(@&- \VVÖÚµk—.]Êk.HÝ™™™õë×ïçŸþüóÏ7­¶7n4kÖLÙkém¡ñ´àG ¾ÿþû_ýUÙk§L™²bÅ +¾ý1111Ë–-Û·o_FF†ì¾ü/÷7iÒ„FrC† s“€.hB1`ÕªUgÏž5¨ÜhccÓ±cG÷SP´¶¶–ÝO£@F»žßT½zuŠR:tèÔ©S£F$Î¬Š €eBNNÎÉ“'·nÝJG^S³Õ«WoذatN*£Oúê¢uëÖÊÜ|ÿƹsç¨]/¤ñè£Gj׮ͻG†"//ïòåË{öìÙ»woBB‚”>ЛìååE£ ___:¢:88ˆl@/¯^½:}útxxød=V^©R%J‰š ¦}ûö¾†úÇÜ¿ÿàÁƒtJ¢)¥ÙÝ1±··oܸ1õégË–-ëÔ©c Ô È„ ERR—eh«U«fkkË^´KKK£ w.\¸Àwý`Ä4mÚÔßßàÀF<^,’šššžž®à…vvvŽŽŽÜû£_•Ý}kaaáîîλ;†ˆÞ¢¨¨¨C‡Ñ®qíÚµììlU›sss£A? 5(˜ÑNâVñññì3ßÓ)񮮠KÊ +ÚBNºxñâ½{÷TÂZZZÒA•†¤­Zµêرc‹-T½+L°ääd +TGˆˆvê™™™‡‡GшŸÐŠiZ_2!€ñÉÍÍ¥£íéB7nÜPöµ úéœô—¿ü¥sçÎtZªZµ*÷~ˆGbÚ)h¹téÒýû÷iˆÌr­×ÚÚÚ«§§gݺu5¿ÁÓðP$###¢PddäÓ§OXæbvpp -„6Ú`4¿ÐèߘFüZüù矚wòÊ•+±±±ìw®ÒÞG#{÷¡1•æ?)—•·@&0nùùùtÆzöìÙJJJ¢óÙ›7o2 Ñÿ­ò/4Äwtt¬õ/t-+ÇP´#P  Ý$11‘%˜ÓÒÒègVVí)4Ȱ°°°²²²±±133«þ/ÎÎΚŸô‡²ÿ Trr2m*ÏŸ?§_4 m'´µÐ/¯_¿Ö\+¡­…¶™ +*ÐFâääDà ÍÖ"ø0CööíÛ¸¸8zi×KMMÍÉÉIOOÏÎΦ_èͤ]±bEÚûèÜD; ½½=ý¤ßéOèÏmmmé %l¶eõ È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È”’’âää$¥igÏžIi$š;wîüùó¥4½|ùò©S§JiZC~xýúµ½½½”¦kÔ¨‘ ¥ihÆŒK—.•ÒôÚµk¿ÿþ{)MkÈÙÙÙ666Rš®V­ZJJŠ”¦@¢)S¦¬ZµJJÓ6l=z´”¦5ä€üü| )MW®\933SJÓ Ñøñッƒ¥4½eË–aÆIiZC~ (Hi:77×ÊÊJJÓ K``àîÝ»¥4½k×®HiZà €Mvv¶”¦“’’œ¥4 ²øúúž>}ZJÓûöíëÓ§”¦5 "¸ºº&&&Ji:::ÚÛÛ[JÓ K“&Mnݺ%¥é3gÎtêÔIJÓ6lxçÎ)Mïß¿¿wïÞRšY_½z%¥i÷6hÐ@JÓ|||Ξ=+¥é%K–Ii¤ÈÌÌ´µµ•Õzbb¢‹‹‹¬ÖM $|ýõס¡¡Rš9r䯥4 Rܾ}»qãÆ²ZÏÉÉ©P¡‚¬ÖM $Œ7nýúõRšnß¾ýùóç¥4 RìܹsРARš6„iè "üíoûë_ÿ*¥éû·{ñâ…”¦@ŠY³f-Z´HJÓuêÔ¹ÿ¾”¦‹D ùæ›odµþòåKGGGY­€`½zõ +—Òt×®]=*¥é".\¸Ð¡CY­8pÀßß_Vë ~ÿùÏJiý»ï¾ûõ×_¥4]Ä @||¼»»»¬Ö§L™²bÅ +Y­€H=òòò’ÕúÒ¥K§OŸ.«u ƒ•*UÊÍÍ•ÒzãÆoÞ¼)¥iì?þ1b„¬Ö÷ìÙ «u ƒ¤~ýú111Rš633ûç?ÿ‰ÇʃÁƒïرCVë·nÝjÔ¨‘¬Ö5 % 8p×®]²ZÇzÀåAAA‹‹‹¬,--ß¼ycee%¥õ"†.\8{ölY­ÂÓ ¶+W®´nÝZVëÞÞÞÑÑѲZ/b(àСC={ö”Õº££cbb¢ô4ªš:uêÊ•+eµ>xðàmÛ¶Éj½ˆ¡€¸¸8‰ÿꫯ$vT•——W³fM‰‹À.^¼xÆŒ²Z/b(À¤pQ^Y÷c‘ÀÀÀ;wÊjÔväÈ‘=zHìÀ‰'üüü$v@À@Ÿ>}8 «ukkkŠƒvvv²:ª’;댹¹yZZZ•*Udu ˆ€eË–IìÀæÍ›¿ù払ddd¸¸¸dggËê@Ó¦M¯_¿.«õâ (DDD´mÛVbZ´h%± ’õë×7Nb&Nœ¸zõj‰(b@ 77·jÕª999ûpêÔ©¿üå/;Üåçç×­[÷ñãÇû°{÷îþýûKì@ +¤sçÎgΜ‘ØýSØànë֭Æ “ØSSÓÄÄDggg‰}(bX`éÒ¥Ò§FŠˆˆøâ‹/äöx¡ánÆ ïÞ½+±ÿ¯½{ Šªþã8î.ˆ—U#±,2P +¤Ô”*oh©Í2æ¨Ý)ïÊX˜6Y2@HèT€£25–—ÀHMPS1­FñŠ&b ;ÿŸ—Qó +¸ú=»çýzÐ0>zï²~ÚsŽv.h¥µPQQ¡~=² /¿ür~~¾l¬%77744T¶aÆŒóæÍ“m¸J[@qww?tè`€Ñhܶm[ïÞ½`ê¬Û§OŸíÛ·ËflÞ¼900P¶á*Í €¸¸¸ôôtÙ†€€õK2 ²¸C±±±² ÎÎÎÇŽstt”͸Js@ü m—egg¿òÊ+Òh¹“'O>ñÄêð-›1nܸåË—Ë6\OsÀl6?ôÐCê·%›Ñµk×ÊÊJ `»âããÓÒÒ¤+ZháÜWin(111Ë–-“®hõÆo,Z´Hº-QVV6`À‹Å"›áìì|ôèQ'''ÙŒëiq 6Lº¢•£££úÜøùùI‡ yêëëû÷ï¿mÛ6éVãÇן¶¯§Å`6›]]]?.ÒÊÃÃcëÖ­;v”@3̘1#))Iºâ¢ï¾ûN Ú¾ž€òæ›o.^¼Xºâ¢ððð•+WJW ©~üñÇ!C†444H‡´êÖ­ÛÁƒ¤CþC£`Ïž=ÞÞÞiËÌÌŒŠŠ’®Àí=zÔÏÏïÈ‘#Ò!Íž=ûý÷ß—®¸‘F€X\\,]q‘Éd*++óòò’À­X,–!C†¬_¿^:ä"£ÑxàÀwwwéiwdeeEGGKW\áãã£ÖhÙ´iÓ,X ]qÅСC ¥+¡ÝpþüùG}ôĉÒ!W 6líÚµÚy„®—šš:qâDéŠkV­Z5zôhéŠFhw(³fÍš7ožtÅ5ê#•’’"]€åææ†‡‡káÂßË<<<öìÙc4¥C¡éP]]íîî^WW'rÍôéÓçÏŸ/]€k6lØ¢©CcJJЦþwÄõ4=”ØØØŒŒ éŠÿHJJš6mšt.úõ×_Ÿþù3gÎH‡\ãââòǘL&éÆi}ìÞ½û©§žÒZä»ï¾«ëKt«´´tĈZx€ìõ´y÷Ï«´>”1cÆäååIWÜ(!!AmƒÁ  ScÇŽ­­­•ùN:UUUuîÜY:ä¦l`ìÚµË×××b±H‡Ü(:::55ÕÉÉI:@w²³³cbbÌf³tÈæÌ™3wî\éŠ[± DFF®X±Bº¢ÁÁÁ¹¹¹ÎÎÎÒ!:²`Á‚éÓ§k𫎅UUU?ÚÆøý÷ß½½½ëëë¥Cááá‘——çãã#`ÿΞ=¿råJéÆÙÄÝblc(qqqéééÒ3™LiiiÒ!ölûöíaaaûöí“iÜÃ?¼wïÞ:H‡Ü†Í €êêê^½zÕÔÔH‡ÜThhhjjêý÷ß/`‡²³³ãããÏŸ?/rS™™™QQQÒ·g3@INNNHH®¸•=zddd 8P:À~üý÷ßS¦LÉÏÏ—¹•gžy¦¬¬L›þ½- €ÿý×ÇÇgïÞ½Ò!·ñÒK/}öÙgnnnÒ!¶­¾¾~éÒ¥³fÍÒÔs¾þŸÁ`ظqcPPtH“ØÒPÖ®];räHéŠÛkß¾}BBÂ{ï½×¦Mé›ôË/¿Lš4©¬¬L:äö"##¿úê+銦²±ÐêÒWísss¥+šÄËËëã? ‘°%UUU|ðAVV–MœT;wî¼{÷î®]»J‡4•í €#GŽx{{Ÿ:uJ:¤©z÷îýÖ[oEDD888H·hÚ>üðÃ/¿üRƒOøº[¹ö÷*ÛJFFFll¬tEóôìÙóµ×^‹‹‹kÛ¶­t €æTTT,\¸0''§¡¡Aº¥¸~ýzƒÁ Ò 69TóàÁƒÕ{-ÒlݺuS122ÒËËKº@^MMMnnnvvö¦M›lî\j2™ÊËË{öì)Ò<69”?ÿü³wïÞ'Ož”i¡'Ÿ|244TîÝ»K·Ük ?ýô“:÷çåå;wN:§…ÒÒÒ&L˜ ]Ñl¶:õq3fŒtÅqpp + + +~á…ž}öY'''é"€»èĉ?üðCaaáºuëŽ;&sGF½jÕ*銖°á DGGgeeIWXGûöíÔð÷÷÷ôôtuu•.¸Sf³ù·ß~Û±cGIIÉÏ?ÿ¼{÷n‹Å"eꨦ^T—.]¤CZ¶ÀÙ³gŸ~úéýû÷K‡X_ÇŽ=<ÿüó)S¦Ø÷k€u=÷Üsk×®íÔ©“tÈ]aç@IOOŸ8q"× )BBBòòòÚµk'r·ØÿPV®\e6›¥C i#GŽüæ›oÚ´i#réb(«W¯Žˆˆàù¸™ &¤¤¤888H‡Ü]zÊŽ;FŒñ×_I‡@[ ÃìÙ³çÎ+r/èh(êô¯6€ZÒ!Њ6mÚ,[¶,""B:äÑ×PNŸ>=vìØï¿ÿ^:òºvíš—— rïèn(ê%ôÑGÓ§OçÖ@zÖ·o_uúwss“¹§ô8.+((7nÜéÓ§¥C ..nÉ’%NNNÒ!÷š~€RYYV^^.€{§C‡K—.7nœtˆ ]åÂ… sæÌINNæë@zЯ_¿œœé1z—­_¿>**Š;„Ø1£Ñ8yòäääd~íçz €+Ž?®>_ýµt¬¯W¯^_|ñEPPtˆ<À¬[·îÕW_=tèt¬ÃÑÑqÒ¤IIII&“IºE7:wî\bb"WØ??¿ôôô¾}ûJ‡h q¥¥¥¯¿þú–-[¤CÐ<ð@bbbll¬ƒƒƒt‹¶0nJ½3¹¹¹ ”n@SµnÝzüøñóçÏïÒ¥‹t‹1n£¶¶699yÑ¢EgΜ‘nÀ­ †Q£F-X°ÀÓÓSºE»MròäÉO?ýtñâÅÌm4hPRRR¿~ý¤C´ŽÐ ÕÕÕjP¦¥¥;wNºW 2dîܹþþþÒ!¶Ðl555™™™ÉÉÉ<8 @Ñh>|øÌ™3û÷ï/ÝbK-táÂ…ìììO>ùd×®]Ò-úrß}÷ÅÆÆN:ÕÍÍMºÅö0îÔÖ­[ÓÒÒrrrø^ÀÝÖ§OŸ¸¸¸ÈÈHžêÕb 먩©Q`ùò奥¥¼¥ÖõÈ#„‡‡ÇÄÄxyyI·Ø<€•>|8??ÿÛo¿-))ὸ...Ç qtt”α €»eÿþýkÖ¬),,Ü´iS]]t€Íðññ6l˜:úñ_«cÜuµµµ6lPK`ãÆ;wî´X,ÒEšãêê8xð`uôïÖ­›tŽ=cÜS555[¶l))))..Þ¾}û©S§¤‹d899yyy 0 @ý{ôè!]¤ I‡Þ¹sgyyyEEž}û> +/Length 2967 +/Filter /FlateDecode +>> +stream +xíÔ€ ú?º†#Ø j]€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„== +endstream +endobj +2 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << +/F1 7 0 R +/F2 9 0 R +>> +/XObject << +/I0 10 0 R +>> +>> +endobj +319 0 obj +<> endobj +320 0 obj +<> endobj +321 0 obj +<> endobj +322 0 obj +<> endobj +323 0 obj +<> endobj +324 0 obj +<> endobj +325 0 obj +<> endobj +326 0 obj +<> endobj +327 0 obj +<> endobj +328 0 obj +<> endobj +329 0 obj +<> endobj +330 0 obj +<> endobj +331 0 obj +<> endobj +332 0 obj +<> endobj +333 0 obj +<> endobj +334 0 obj +<> endobj +335 0 obj +<> endobj +336 0 obj +<> endobj +337 0 obj +<> endobj +338 0 obj +<> endobj +339 0 obj +<> endobj +340 0 obj +<> endobj +341 0 obj +<> endobj +342 0 obj +<> endobj +343 0 obj +<> endobj +344 0 obj +<> endobj +345 0 obj +<> endobj +346 0 obj +<> endobj +347 0 obj +<> endobj +348 0 obj +<> endobj +349 0 obj +<> endobj +350 0 obj +<> endobj +351 0 obj +<> endobj +352 0 obj +<> endobj +353 0 obj +<> endobj +354 0 obj +<> endobj +355 0 obj +<> endobj +356 0 obj +<> endobj +357 0 obj +<> endobj +358 0 obj +<> endobj +359 0 obj +<> endobj +360 0 obj +<> endobj +361 0 obj +<> endobj +362 0 obj +<> endobj +363 0 obj +<> endobj +364 0 obj +<> endobj +365 0 obj +<> endobj +366 0 obj +<> endobj +367 0 obj +<> endobj +368 0 obj +<> endobj +369 0 obj +<> endobj +370 0 obj +<> endobj +371 0 obj +<> endobj +372 0 obj +<> endobj +373 0 obj +<> endobj +374 0 obj +<> endobj +375 0 obj +<> endobj +376 0 obj +<> endobj +377 0 obj +<> endobj +378 0 obj +<> endobj +379 0 obj +<> endobj +380 0 obj +<> endobj +381 0 obj +<> endobj +382 0 obj +<> endobj +383 0 obj +<> endobj +384 0 obj +<> endobj +385 0 obj +<> endobj +386 0 obj +<> endobj +387 0 obj +<> endobj +388 0 obj +<> endobj +389 0 obj +<> endobj +390 0 obj +<> endobj +391 0 obj +<> endobj +392 0 obj +<> endobj +393 0 obj +<> endobj +394 0 obj +<> endobj +395 0 obj +<> endobj +396 0 obj +<> endobj +397 0 obj +<> endobj +398 0 obj +<> endobj +399 0 obj +<> endobj +400 0 obj +<> endobj +401 0 obj +<> endobj +402 0 obj +<> endobj +403 0 obj +<> endobj +404 0 obj +<> endobj +405 0 obj +<> endobj +406 0 obj +<> endobj +407 0 obj +<> endobj +408 0 obj +<> endobj +409 0 obj +<> endobj +410 0 obj +<> endobj +411 0 obj +<> endobj +412 0 obj +<> endobj +413 0 obj +<> endobj +414 0 obj +<> endobj +415 0 obj +<> endobj +416 0 obj +<> endobj +417 0 obj +<> endobj +418 0 obj +<> endobj +419 0 obj +<> endobj +420 0 obj +<> endobj +421 0 obj +<> endobj +422 0 obj +<> endobj +423 0 obj +<> endobj +424 0 obj +<> endobj +425 0 obj +<> endobj +426 0 obj +<> endobj +427 0 obj +<> endobj +428 0 obj +<> endobj +429 0 obj +<> endobj +430 0 obj +<> endobj +431 0 obj +<> endobj +432 0 obj +<> endobj +433 0 obj +<> endobj +434 0 obj +<> endobj +435 0 obj +<> endobj +436 0 obj +<> endobj +437 0 obj +<> endobj +438 0 obj +<> endobj +439 0 obj +<> endobj +440 0 obj +<> endobj +441 0 obj +<> endobj +442 0 obj +<> endobj +443 0 obj +<> endobj +444 0 obj +<> endobj +445 0 obj +<> endobj +446 0 obj +<> endobj +447 0 obj +<> endobj +448 0 obj +<> endobj +449 0 obj +<> endobj +450 0 obj +<> endobj +451 0 obj +<> endobj +452 0 obj +<> endobj +453 0 obj +<> endobj +454 0 obj +<> endobj +455 0 obj +<> endobj +456 0 obj +<> endobj +457 0 obj +<> endobj +458 0 obj +<> endobj +459 0 obj +<> endobj +460 0 obj +<> endobj +461 0 obj +<> endobj +462 0 obj +<> endobj +463 0 obj +<> endobj +464 0 obj +<> endobj +465 0 obj +<> endobj +466 0 obj +<> endobj +467 0 obj +<> endobj +468 0 obj +<> endobj +469 0 obj +<> endobj +470 0 obj +<> endobj +471 0 obj +<> endobj +472 0 obj +<> endobj +473 0 obj +<> endobj +474 0 obj +<> endobj +475 0 obj +<> endobj +476 0 obj +<> endobj +477 0 obj +<> endobj +478 0 obj +<> endobj +479 0 obj +<> endobj +480 0 obj +<> endobj +481 0 obj +<> endobj +482 0 obj +<> endobj +483 0 obj +<> endobj +484 0 obj +<> endobj +485 0 obj +<> endobj +486 0 obj +<> endobj +487 0 obj +<> endobj +488 0 obj +<> endobj +489 0 obj +<> endobj +490 0 obj +<> endobj +491 0 obj +<> endobj +492 0 obj +<> endobj +493 0 obj +<> endobj +494 0 obj +<> endobj +495 0 obj +<> endobj +496 0 obj +<> endobj +497 0 obj +<> endobj +498 0 obj +<> endobj +499 0 obj +<> endobj +500 0 obj +<> endobj +501 0 obj +<> endobj +502 0 obj +<> endobj +503 0 obj +<> endobj +504 0 obj +<> endobj +505 0 obj +<> endobj +506 0 obj +<> endobj +507 0 obj +<> endobj +508 0 obj +<> endobj +509 0 obj +<> endobj +510 0 obj +<> endobj +511 0 obj +<> endobj +512 0 obj +<> endobj +513 0 obj +<> endobj +514 0 obj +<> endobj +515 0 obj +<> endobj +516 0 obj +<> endobj +517 0 obj +<> endobj +518 0 obj +<> endobj +519 0 obj +<> endobj +520 0 obj +<> endobj +521 0 obj +<> endobj +522 0 obj +<> endobj +523 0 obj +<> endobj +524 0 obj +<> endobj +525 0 obj +<> endobj +526 0 obj +<> endobj +527 0 obj +<> endobj +528 0 obj +<> endobj +529 0 obj +<> endobj +530 0 obj +<> endobj +531 0 obj +<> endobj +532 0 obj +<> endobj +533 0 obj +<> endobj +534 0 obj +<> endobj +535 0 obj +<> endobj +536 0 obj +<> endobj +537 0 obj +<> endobj +538 0 obj +<> endobj +539 0 obj +<> endobj +540 0 obj +<> endobj +541 0 obj +<> endobj +542 0 obj +<> endobj +543 0 obj +<> endobj +544 0 obj +<> endobj +545 0 obj +<> endobj +546 0 obj +<> endobj +547 0 obj +<> endobj +548 0 obj +<> endobj +549 0 obj +<> endobj +550 0 obj +<> endobj +551 0 obj +<> endobj +552 0 obj +<> endobj +553 0 obj +<> endobj +554 0 obj +<> endobj +555 0 obj +<> endobj +556 0 obj +<> endobj +557 0 obj +<> endobj +558 0 obj +<> endobj +559 0 obj +<> endobj +560 0 obj +<> endobj +561 0 obj +<> endobj +562 0 obj +<> endobj +563 0 obj +<> endobj +564 0 obj +<> endobj +565 0 obj +<> endobj +566 0 obj +<> endobj +567 0 obj +<> endobj +568 0 obj +<> endobj +569 0 obj +<> endobj +570 0 obj +<> endobj +571 0 obj +<> endobj +572 0 obj +<> endobj +573 0 obj +<> endobj +574 0 obj +<> endobj +575 0 obj +<> endobj +576 0 obj +<> endobj +577 0 obj +<> endobj +578 0 obj +<> endobj +579 0 obj +<> endobj +580 0 obj +<> endobj +581 0 obj +<> endobj +582 0 obj +<> endobj +583 0 obj +<> endobj +584 0 obj +<> endobj +585 0 obj +<> endobj +586 0 obj +<> endobj +587 0 obj +<> endobj +588 0 obj +<> endobj +589 0 obj +<> endobj +590 0 obj +<> endobj +591 0 obj +<> endobj +592 0 obj +<> endobj +593 0 obj +<> endobj +594 0 obj +<> endobj +595 0 obj +<> endobj +596 0 obj +<> endobj +597 0 obj +<> endobj +598 0 obj +<> endobj +599 0 obj +<> endobj +600 0 obj +<> endobj +601 0 obj +<> endobj +602 0 obj +<> endobj +603 0 obj +<> endobj +604 0 obj +<> endobj +605 0 obj +<> endobj +606 0 obj +<> endobj +607 0 obj +<> endobj +608 0 obj +<> endobj +609 0 obj +<> endobj +610 0 obj +<> endobj +611 0 obj +<> endobj +612 0 obj +<> endobj +613 0 obj +<> endobj +614 0 obj +<> endobj +615 0 obj +<> endobj +616 0 obj +<> endobj +617 0 obj +<> endobj +618 0 obj +<> endobj +619 0 obj +<> endobj +620 0 obj +<> endobj +621 0 obj +<> endobj +622 0 obj +<> endobj +623 0 obj +<> endobj +624 0 obj +<> endobj +625 0 obj +<> endobj +626 0 obj +<> endobj +627 0 obj +<> endobj +628 0 obj +<> endobj +629 0 obj +<> endobj +630 0 obj +<> endobj +631 0 obj +<> endobj +632 0 obj +<> endobj +633 0 obj +<> endobj +634 0 obj +<> endobj +635 0 obj +<> endobj +636 0 obj +<> endobj +637 0 obj +<> endobj +638 0 obj +<> endobj +639 0 obj +<> endobj +640 0 obj +<> endobj +641 0 obj +<> endobj +642 0 obj +<> endobj +643 0 obj +<> endobj +644 0 obj +<> endobj +645 0 obj +<> endobj +646 0 obj +<> endobj +647 0 obj +<> endobj +648 0 obj +<> endobj +649 0 obj +<> endobj +650 0 obj +<> endobj +651 0 obj +<> endobj +652 0 obj +<> endobj +653 0 obj +<> endobj +654 0 obj +<> endobj +655 0 obj +<> endobj +656 0 obj +<> endobj +657 0 obj +<> endobj +658 0 obj +<> endobj +659 0 obj +<> endobj +660 0 obj +<> endobj +661 0 obj +<> endobj +662 0 obj +<> endobj +663 0 obj +<> endobj +664 0 obj +<> endobj +665 0 obj +<> endobj +666 0 obj +<> endobj +667 0 obj +<> endobj +668 0 obj +<> endobj +669 0 obj +<> endobj +670 0 obj +<> endobj +671 0 obj +<> endobj +672 0 obj +<> endobj +673 0 obj +<> endobj +674 0 obj +<> endobj +675 0 obj +<> endobj +676 0 obj +<> endobj +677 0 obj +<> endobj +678 0 obj +<> endobj +679 0 obj +<> endobj +680 0 obj +<> endobj +681 0 obj +<> endobj +682 0 obj +<> endobj +683 0 obj +<> endobj +684 0 obj +<> endobj +685 0 obj +<> endobj +686 0 obj +<> endobj +687 0 obj +<> endobj +688 0 obj +<> endobj +689 0 obj +<> endobj +690 0 obj +<> endobj +691 0 obj +<> endobj +692 0 obj +<> endobj +693 0 obj +<> endobj +694 0 obj +<> endobj +695 0 obj +<> endobj +696 0 obj +<> endobj +697 0 obj +<> endobj +698 0 obj +<> endobj +699 0 obj +<> endobj +700 0 obj +<> endobj +701 0 obj +<> endobj +702 0 obj +<> endobj +703 0 obj +<> endobj +704 0 obj +<> endobj +705 0 obj +<> endobj +706 0 obj +<> endobj +707 0 obj +<> endobj +708 0 obj +<> endobj +709 0 obj +<> endobj +710 0 obj +<> endobj +711 0 obj +<> endobj +712 0 obj +<> endobj +713 0 obj +<> endobj +714 0 obj +<> endobj +715 0 obj +<> endobj +716 0 obj +<> endobj +717 0 obj +<> endobj +718 0 obj +<> endobj +719 0 obj +<> endobj +720 0 obj +<> endobj +721 0 obj +<> endobj +722 0 obj +<> endobj +723 0 obj +<> endobj +724 0 obj +<> endobj +725 0 obj +<> endobj +726 0 obj +<> endobj +727 0 obj +<> endobj +728 0 obj +<> endobj +729 0 obj +<> endobj +730 0 obj +<> endobj +731 0 obj +<> endobj +732 0 obj +<> endobj +733 0 obj +<> endobj +734 0 obj +<> endobj +735 0 obj +<> endobj +736 0 obj +<> endobj +737 0 obj +<> endobj +738 0 obj +<> endobj +739 0 obj +<> endobj +740 0 obj +<> endobj +741 0 obj +<> endobj +742 0 obj +<> endobj +743 0 obj +<> endobj +744 0 obj +<> endobj +745 0 obj +<> endobj +746 0 obj +<> endobj +747 0 obj +<> endobj +748 0 obj +<> endobj +749 0 obj +<> endobj +750 0 obj +<> endobj +751 0 obj +<> endobj +752 0 obj +<> endobj +753 0 obj +<> endobj +754 0 obj +<> endobj +755 0 obj +<> endobj +756 0 obj +<> endobj +757 0 obj +<> endobj +758 0 obj +<> endobj +759 0 obj +<> endobj +760 0 obj +<> endobj +761 0 obj +<> endobj +762 0 obj +<> endobj +763 0 obj +<> endobj +764 0 obj +<> endobj +765 0 obj +<> endobj +766 0 obj +<> endobj +767 0 obj +<> endobj +768 0 obj +<> endobj +769 0 obj +<> endobj +770 0 obj +<> endobj +771 0 obj +<> endobj +772 0 obj +<> endobj +773 0 obj +<> endobj +774 0 obj +<> endobj +775 0 obj +<> endobj +776 0 obj +<> endobj +777 0 obj +<> endobj +778 0 obj +<> endobj +779 0 obj +<> endobj +780 0 obj +<> endobj +781 0 obj +<> endobj +782 0 obj +<> endobj +783 0 obj +<> endobj +784 0 obj +<> endobj +785 0 obj +<> endobj +786 0 obj +<> endobj +787 0 obj +<> endobj +788 0 obj +<> endobj +789 0 obj +<> endobj +790 0 obj +<> endobj +791 0 obj +<> endobj +792 0 obj +<> endobj +793 0 obj +<> endobj +794 0 obj +<> endobj +795 0 obj +<> endobj +796 0 obj +<> endobj +797 0 obj +<> endobj +798 0 obj +<> endobj +799 0 obj +<> endobj +800 0 obj +<> endobj +801 0 obj +<> endobj +802 0 obj +<> endobj +803 0 obj +<> endobj +804 0 obj +<> endobj +805 0 obj +<> endobj +806 0 obj +<> endobj +807 0 obj +<> endobj +808 0 obj +<> endobj +809 0 obj +<> endobj +810 0 obj +<> endobj +811 0 obj +<> endobj +812 0 obj +<> endobj +813 0 obj +<> endobj +814 0 obj +<> endobj +815 0 obj +<> endobj +816 0 obj +<> endobj +817 0 obj +<> endobj +818 0 obj +<> endobj +819 0 obj +<> endobj +820 0 obj +<> endobj +821 0 obj +<> endobj +822 0 obj +<> endobj +823 0 obj +<> endobj +824 0 obj +<> endobj +825 0 obj +<> endobj +826 0 obj +<> endobj +827 0 obj +<> endobj +828 0 obj +<> endobj +829 0 obj +<> endobj +830 0 obj +<> endobj +831 0 obj +<> endobj +832 0 obj +<> endobj +833 0 obj +<> endobj +834 0 obj +<> endobj +835 0 obj +<> endobj +836 0 obj +<> endobj +837 0 obj +<> endobj +838 0 obj +<> endobj +839 0 obj +<> endobj +840 0 obj +<> endobj +841 0 obj +<> endobj +842 0 obj +<> endobj +843 0 obj +<> endobj +844 0 obj +<> endobj +845 0 obj +<> endobj +846 0 obj +<> endobj +847 0 obj +<> endobj +848 0 obj +<> endobj +849 0 obj +<> endobj +850 0 obj +<> endobj +851 0 obj +<> endobj +852 0 obj +<> endobj +853 0 obj +<> endobj +854 0 obj +<> endobj +855 0 obj +<> endobj +856 0 obj +<> endobj +857 0 obj +<> endobj +858 0 obj +<> endobj +859 0 obj +<> endobj +860 0 obj +<> endobj + +12 0 obj +<< +/Type /Outlines +/First 13 0 R +/Last 15 0 R +/Count 306 +>> +endobj + +13 0 obj +<< +/Title (Pages) +/Parent 12 0 R +/Next 15 0 R +/First 14 0 R +/Last 14 0 R +/Count 1 +>> +endobj + +15 0 obj +<< +/Title (Net) +/Parent 12 0 R +/Prev 13 0 R +/First 16 0 R +/Last 315 0 R +/Count 303 +>> +endobj + +14 0 obj +<< +/Title (SCH_Pro-micro_Pinouts 1-Sheet_1) +/Parent 13 0 R +/Dest [3 0 R /XYZ 0 1197.36 0] +>> +endobj + +16 0 obj +<< +/Title (3V3) +/Parent 15 0 R +/Next 35 0 R +/First 17 0 R +/Last 34 0 R +/Count 18 +>> +endobj + +35 0 obj +<< +/Title (+5V) +/Parent 15 0 R +/Prev 16 0 R +/Next 39 0 R +/First 36 0 R +/Last 38 0 R +/Count 3 +>> +endobj + +39 0 obj +<< +/Title ($1N1) +/Parent 15 0 R +/Prev 35 0 R +/Next 41 0 R +/First 40 0 R +/Last 40 0 R +/Count 1 +>> +endobj + +41 0 obj +<< +/Title ($1N25) +/Parent 15 0 R +/Prev 39 0 R +/Next 43 0 R +/First 42 0 R +/Last 42 0 R +/Count 1 +>> +endobj + +43 0 obj +<< +/Title ($1N62) +/Parent 15 0 R +/Prev 41 0 R +/Next 45 0 R +/First 44 0 R +/Last 44 0 R +/Count 1 +>> +endobj + +45 0 obj +<< +/Title (ADC) +/Parent 15 0 R +/Prev 43 0 R +/Next 50 0 R +/First 46 0 R +/Last 49 0 R +/Count 4 +>> +endobj + +50 0 obj +<< +/Title (BATT) +/Parent 15 0 R +/Prev 45 0 R +/Next 57 0 R +/First 51 0 R +/Last 56 0 R +/Count 6 +>> +endobj + +57 0 obj +<< +/Title (BUSY) +/Parent 15 0 R +/Prev 50 0 R +/Next 73 0 R +/First 58 0 R +/Last 72 0 R +/Count 15 +>> +endobj + +73 0 obj +<< +/Title (CS) +/Parent 15 0 R +/Prev 57 0 R +/Next 89 0 R +/First 74 0 R +/Last 88 0 R +/Count 15 +>> +endobj + +89 0 obj +<< +/Title (DIO2) +/Parent 15 0 R +/Prev 73 0 R +/Next 102 0 R +/First 90 0 R +/Last 101 0 R +/Count 12 +>> +endobj + +102 0 obj +<< +/Title (DIO3) +/Parent 15 0 R +/Prev 89 0 R +/Next 104 0 R +/First 103 0 R +/Last 103 0 R +/Count 1 +>> +endobj + +104 0 obj +<< +/Title (E_INK_BUSY) +/Parent 15 0 R +/Prev 102 0 R +/Next 109 0 R +/First 105 0 R +/Last 108 0 R +/Count 4 +>> +endobj + +109 0 obj +<< +/Title (E_INK_CS) +/Parent 15 0 R +/Prev 104 0 R +/Next 113 0 R +/First 110 0 R +/Last 112 0 R +/Count 3 +>> +endobj + +113 0 obj +<< +/Title (E_INK_D/C) +/Parent 15 0 R +/Prev 109 0 R +/Next 117 0 R +/First 114 0 R +/Last 116 0 R +/Count 3 +>> +endobj + +117 0 obj +<< +/Title (E_INK_NRST) +/Parent 15 0 R +/Prev 113 0 R +/Next 121 0 R +/First 118 0 R +/Last 120 0 R +/Count 3 +>> +endobj + +121 0 obj +<< +/Title (GND) +/Parent 15 0 R +/Prev 117 0 R +/Next 196 0 R +/First 122 0 R +/Last 195 0 R +/Count 74 +>> +endobj + +196 0 obj +<< +/Title (GPSEN) +/Parent 15 0 R +/Prev 121 0 R +/Next 199 0 R +/First 197 0 R +/Last 198 0 R +/Count 2 +>> +endobj + +199 0 obj +<< +/Title (GPSRX) +/Parent 15 0 R +/Prev 196 0 R +/Next 202 0 R +/First 200 0 R +/Last 201 0 R +/Count 2 +>> +endobj + +202 0 obj +<< +/Title (GPSTX) +/Parent 15 0 R +/Prev 199 0 R +/Next 205 0 R +/First 203 0 R +/Last 204 0 R +/Count 2 +>> +endobj + +205 0 obj +<< +/Title (IRQ) +/Parent 15 0 R +/Prev 202 0 R +/Next 221 0 R +/First 206 0 R +/Last 220 0 R +/Count 15 +>> +endobj + +221 0 obj +<< +/Title (LORA_ANT) +/Parent 15 0 R +/Prev 205 0 R +/Next 223 0 R +/First 222 0 R +/Last 222 0 R +/Count 1 +>> +endobj + +223 0 obj +<< +/Title (MISO) +/Parent 15 0 R +/Prev 221 0 R +/Next 239 0 R +/First 224 0 R +/Last 238 0 R +/Count 15 +>> +endobj + +239 0 obj +<< +/Title (MOSI) +/Parent 15 0 R +/Prev 223 0 R +/Next 257 0 R +/First 240 0 R +/Last 256 0 R +/Count 17 +>> +endobj + +257 0 obj +<< +/Title (NRST) +/Parent 15 0 R +/Prev 239 0 R +/Next 273 0 R +/First 258 0 R +/Last 272 0 R +/Count 15 +>> +endobj + +273 0 obj +<< +/Title (RBTN) +/Parent 15 0 R +/Prev 257 0 R +/Next 277 0 R +/First 274 0 R +/Last 276 0 R +/Count 3 +>> +endobj + +277 0 obj +<< +/Title (RXEN) +/Parent 15 0 R +/Prev 273 0 R +/Next 285 0 R +/First 278 0 R +/Last 284 0 R +/Count 7 +>> +endobj + +285 0 obj +<< +/Title (SCK) +/Parent 15 0 R +/Prev 277 0 R +/Next 303 0 R +/First 286 0 R +/Last 302 0 R +/Count 17 +>> +endobj + +303 0 obj +<< +/Title (SCL) +/Parent 15 0 R +/Prev 285 0 R +/Next 306 0 R +/First 304 0 R +/Last 305 0 R +/Count 2 +>> +endobj + +306 0 obj +<< +/Title (SDA) +/Parent 15 0 R +/Prev 303 0 R +/Next 309 0 R +/First 307 0 R +/Last 308 0 R +/Count 2 +>> +endobj + +309 0 obj +<< +/Title (SERIAL2RX) +/Parent 15 0 R +/Prev 306 0 R +/Next 312 0 R +/First 310 0 R +/Last 311 0 R +/Count 2 +>> +endobj + +312 0 obj +<< +/Title (SERIAL2TX) +/Parent 15 0 R +/Prev 309 0 R +/Next 315 0 R +/First 313 0 R +/Last 314 0 R +/Count 2 +>> +endobj + +315 0 obj +<< +/Title (UBTN) +/Parent 15 0 R +/Prev 312 0 R +/First 316 0 R +/Last 318 0 R +/Count 3 +>> +endobj + +17 0 obj +<< +/Title ($1N5) +/Parent 16 0 R +/Next 18 0 R +/A 319 0 R +>> +endobj + +18 0 obj +<< +/Title ($1N29) +/Parent 16 0 R +/Prev 17 0 R +/Next 19 0 R +/A 321 0 R +>> +endobj + +19 0 obj +<< +/Title ($1N35) +/Parent 16 0 R +/Prev 18 0 R +/Next 20 0 R +/A 323 0 R +>> +endobj + +20 0 obj +<< +/Title ($1N54) +/Parent 16 0 R +/Prev 19 0 R +/Next 21 0 R +/A 325 0 R +>> +endobj + +21 0 obj +<< +/Title ($1N1528) +/Parent 16 0 R +/Prev 20 0 R +/Next 22 0 R +/A 327 0 R +>> +endobj + +22 0 obj +<< +/Title ($1N1550) +/Parent 16 0 R +/Prev 21 0 R +/Next 23 0 R +/A 329 0 R +>> +endobj + +23 0 obj +<< +/Title ($1N1574) +/Parent 16 0 R +/Prev 22 0 R +/Next 24 0 R +/A 331 0 R +>> +endobj + +24 0 obj +<< +/Title ($1N1582) +/Parent 16 0 R +/Prev 23 0 R +/Next 25 0 R +/A 333 0 R +>> +endobj + +25 0 obj +<< +/Title ($1N1616) +/Parent 16 0 R +/Prev 24 0 R +/Next 26 0 R +/A 335 0 R +>> +endobj + +26 0 obj +<< +/Title ($1N1618) +/Parent 16 0 R +/Prev 25 0 R +/Next 27 0 R +/A 337 0 R +>> +endobj + +27 0 obj +<< +/Title ($1N1732) +/Parent 16 0 R +/Prev 26 0 R +/Next 28 0 R +/A 339 0 R +>> +endobj + +28 0 obj +<< +/Title ($1N1742) +/Parent 16 0 R +/Prev 27 0 R +/Next 29 0 R +/A 341 0 R +>> +endobj + +29 0 obj +<< +/Title ($1N1776) +/Parent 16 0 R +/Prev 28 0 R +/Next 30 0 R +/A 343 0 R +>> +endobj + +30 0 obj +<< +/Title ($1N1810) +/Parent 16 0 R +/Prev 29 0 R +/Next 31 0 R +/A 345 0 R +>> +endobj + +31 0 obj +<< +/Title ($1N1860) +/Parent 16 0 R +/Prev 30 0 R +/Next 32 0 R +/A 347 0 R +>> +endobj + +32 0 obj +<< +/Title ($1N1874) +/Parent 16 0 R +/Prev 31 0 R +/Next 33 0 R +/A 349 0 R +>> +endobj + +33 0 obj +<< +/Title ($1N5406) +/Parent 16 0 R +/Prev 32 0 R +/Next 34 0 R +/A 351 0 R +>> +endobj + +34 0 obj +<< +/Title ($1N5445) +/Parent 16 0 R +/Prev 33 0 R +/A 353 0 R +>> +endobj + +36 0 obj +<< +/Title ($1N23) +/Parent 35 0 R +/Next 37 0 R +/A 355 0 R +>> +endobj + +37 0 obj +<< +/Title ($1N31) +/Parent 35 0 R +/Prev 36 0 R +/Next 38 0 R +/A 357 0 R +>> +endobj + +38 0 obj +<< +/Title ($1N1570) +/Parent 35 0 R +/Prev 37 0 R +/A 359 0 R +>> +endobj + +40 0 obj +<< +/Title ($1N1) +/Parent 39 0 R +/A 361 0 R +>> +endobj + +42 0 obj +<< +/Title ($1N25) +/Parent 41 0 R +/A 363 0 R +>> +endobj + +44 0 obj +<< +/Title ($1N62) +/Parent 43 0 R +/A 365 0 R +>> +endobj + +46 0 obj +<< +/Title ($1N15) +/Parent 45 0 R +/Next 47 0 R +/A 367 0 R +>> +endobj + +47 0 obj +<< +/Title ($1N44) +/Parent 45 0 R +/Prev 46 0 R +/Next 48 0 R +/A 369 0 R +>> +endobj + +48 0 obj +<< +/Title ($1N1852) +/Parent 45 0 R +/Prev 47 0 R +/Next 49 0 R +/A 371 0 R +>> +endobj + +49 0 obj +<< +/Title ($1N1856) +/Parent 45 0 R +/Prev 48 0 R +/A 373 0 R +>> +endobj + +51 0 obj +<< +/Title ($1N1494) +/Parent 50 0 R +/Next 52 0 R +/A 375 0 R +>> +endobj + +52 0 obj +<< +/Title ($1N1508) +/Parent 50 0 R +/Prev 51 0 R +/Next 53 0 R +/A 377 0 R +>> +endobj + +53 0 obj +<< +/Title ($1N1578) +/Parent 50 0 R +/Prev 52 0 R +/Next 54 0 R +/A 379 0 R +>> +endobj + +54 0 obj +<< +/Title ($1N1846) +/Parent 50 0 R +/Prev 53 0 R +/Next 55 0 R +/A 381 0 R +>> +endobj + +55 0 obj +<< +/Title ($1N1848) +/Parent 50 0 R +/Prev 54 0 R +/Next 56 0 R +/A 383 0 R +>> +endobj + +56 0 obj +<< +/Title ($1N1854) +/Parent 50 0 R +/Prev 55 0 R +/A 385 0 R +>> +endobj + +58 0 obj +<< +/Title ($1N12) +/Parent 57 0 R +/Next 59 0 R +/A 387 0 R +>> +endobj + +59 0 obj +<< +/Title ($1N47) +/Parent 57 0 R +/Prev 58 0 R +/Next 60 0 R +/A 389 0 R +>> +endobj + +60 0 obj +<< +/Title ($1N1540) +/Parent 57 0 R +/Prev 59 0 R +/Next 61 0 R +/A 391 0 R +>> +endobj + +61 0 obj +<< +/Title ($1N1568) +/Parent 57 0 R +/Prev 60 0 R +/Next 62 0 R +/A 393 0 R +>> +endobj + +62 0 obj +<< +/Title ($1N1600) +/Parent 57 0 R +/Prev 61 0 R +/Next 63 0 R +/A 395 0 R +>> +endobj + +63 0 obj +<< +/Title ($1N1636) +/Parent 57 0 R +/Prev 62 0 R +/Next 64 0 R +/A 397 0 R +>> +endobj + +64 0 obj +<< +/Title ($1N1660) +/Parent 57 0 R +/Prev 63 0 R +/Next 65 0 R +/A 399 0 R +>> +endobj + +65 0 obj +<< +/Title ($1N1696) +/Parent 57 0 R +/Prev 64 0 R +/Next 66 0 R +/A 401 0 R +>> +endobj + +66 0 obj +<< +/Title ($1N1710) +/Parent 57 0 R +/Prev 65 0 R +/Next 67 0 R +/A 403 0 R +>> +endobj + +67 0 obj +<< +/Title ($1N1736) +/Parent 57 0 R +/Prev 66 0 R +/Next 68 0 R +/A 405 0 R +>> +endobj + +68 0 obj +<< +/Title ($1N1760) +/Parent 57 0 R +/Prev 67 0 R +/Next 69 0 R +/A 407 0 R +>> +endobj + +69 0 obj +<< +/Title ($1N1778) +/Parent 57 0 R +/Prev 68 0 R +/Next 70 0 R +/A 409 0 R +>> +endobj + +70 0 obj +<< +/Title ($1N1814) +/Parent 57 0 R +/Prev 69 0 R +/Next 71 0 R +/A 411 0 R +>> +endobj + +71 0 obj +<< +/Title ($1N1836) +/Parent 57 0 R +/Prev 70 0 R +/Next 72 0 R +/A 413 0 R +>> +endobj + +72 0 obj +<< +/Title ($1N1870) +/Parent 57 0 R +/Prev 71 0 R +/A 415 0 R +>> +endobj + +74 0 obj +<< +/Title ($1N10) +/Parent 73 0 R +/Next 75 0 R +/A 417 0 R +>> +endobj + +75 0 obj +<< +/Title ($1N49) +/Parent 73 0 R +/Prev 74 0 R +/Next 76 0 R +/A 419 0 R +>> +endobj + +76 0 obj +<< +/Title ($1N1542) +/Parent 73 0 R +/Prev 75 0 R +/Next 77 0 R +/A 421 0 R +>> +endobj + +77 0 obj +<< +/Title ($1N1566) +/Parent 73 0 R +/Prev 76 0 R +/Next 78 0 R +/A 423 0 R +>> +endobj + +78 0 obj +<< +/Title ($1N1602) +/Parent 73 0 R +/Prev 77 0 R +/Next 79 0 R +/A 425 0 R +>> +endobj + +79 0 obj +<< +/Title ($1N1626) +/Parent 73 0 R +/Prev 78 0 R +/Next 80 0 R +/A 427 0 R +>> +endobj + +80 0 obj +<< +/Title ($1N1670) +/Parent 73 0 R +/Prev 79 0 R +/Next 81 0 R +/A 429 0 R +>> +endobj + +81 0 obj +<< +/Title ($1N1686) +/Parent 73 0 R +/Prev 80 0 R +/Next 82 0 R +/A 431 0 R +>> +endobj + +82 0 obj +<< +/Title ($1N1718) +/Parent 73 0 R +/Prev 81 0 R +/Next 83 0 R +/A 433 0 R +>> +endobj + +83 0 obj +<< +/Title ($1N1728) +/Parent 73 0 R +/Prev 82 0 R +/Next 84 0 R +/A 435 0 R +>> +endobj + +84 0 obj +<< +/Title ($1N1752) +/Parent 73 0 R +/Prev 83 0 R +/Next 85 0 R +/A 437 0 R +>> +endobj + +85 0 obj +<< +/Title ($1N1788) +/Parent 73 0 R +/Prev 84 0 R +/Next 86 0 R +/A 439 0 R +>> +endobj + +86 0 obj +<< +/Title ($1N1808) +/Parent 73 0 R +/Prev 85 0 R +/Next 87 0 R +/A 441 0 R +>> +endobj + +87 0 obj +<< +/Title ($1N1828) +/Parent 73 0 R +/Prev 86 0 R +/Next 88 0 R +/A 443 0 R +>> +endobj + +88 0 obj +<< +/Title ($1N1876) +/Parent 73 0 R +/Prev 87 0 R +/A 445 0 R +>> +endobj + +90 0 obj +<< +/Title ($1N1624) +/Parent 89 0 R +/Next 91 0 R +/A 447 0 R +>> +endobj + +91 0 obj +<< +/Title ($1N1672) +/Parent 89 0 R +/Prev 90 0 R +/Next 92 0 R +/A 449 0 R +>> +endobj + +92 0 obj +<< +/Title ($1N1684) +/Parent 89 0 R +/Prev 91 0 R +/Next 93 0 R +/A 451 0 R +>> +endobj + +93 0 obj +<< +/Title ($1N1698) +/Parent 89 0 R +/Prev 92 0 R +/Next 94 0 R +/A 453 0 R +>> +endobj + +94 0 obj +<< +/Title ($1N1700) +/Parent 89 0 R +/Prev 93 0 R +/Next 95 0 R +/A 455 0 R +>> +endobj + +95 0 obj +<< +/Title ($1N1702) +/Parent 89 0 R +/Prev 94 0 R +/Next 96 0 R +/A 457 0 R +>> +endobj + +96 0 obj +<< +/Title ($1N1744) +/Parent 89 0 R +/Prev 95 0 R +/Next 97 0 R +/A 459 0 R +>> +endobj + +97 0 obj +<< +/Title ($1N1750) +/Parent 89 0 R +/Prev 96 0 R +/Next 98 0 R +/A 461 0 R +>> +endobj + +98 0 obj +<< +/Title ($1N1820) +/Parent 89 0 R +/Prev 97 0 R +/Next 99 0 R +/A 463 0 R +>> +endobj + +99 0 obj +<< +/Title ($1N1822) +/Parent 89 0 R +/Prev 98 0 R +/Next 100 0 R +/A 465 0 R +>> +endobj + +100 0 obj +<< +/Title ($1N1862) +/Parent 89 0 R +/Prev 99 0 R +/Next 101 0 R +/A 467 0 R +>> +endobj + +101 0 obj +<< +/Title ($1N1864) +/Parent 89 0 R +/Prev 100 0 R +/A 469 0 R +>> +endobj + +103 0 obj +<< +/Title ($1N1678) +/Parent 102 0 R +/A 471 0 R +>> +endobj + +105 0 obj +<< +/Title ($1N1500) +/Parent 104 0 R +/Next 106 0 R +/A 473 0 R +>> +endobj + +106 0 obj +<< +/Title ($1N1514) +/Parent 104 0 R +/Prev 105 0 R +/Next 107 0 R +/A 475 0 R +>> +endobj + +107 0 obj +<< +/Title ($1N5294) +/Parent 104 0 R +/Prev 106 0 R +/Next 108 0 R +/A 477 0 R +>> +endobj + +108 0 obj +<< +/Title ($1N5448) +/Parent 104 0 R +/Prev 107 0 R +/A 479 0 R +>> +endobj + +110 0 obj +<< +/Title ($1N1506) +/Parent 109 0 R +/Next 111 0 R +/A 481 0 R +>> +endobj + +111 0 obj +<< +/Title ($1N5342) +/Parent 109 0 R +/Prev 110 0 R +/Next 112 0 R +/A 483 0 R +>> +endobj + +112 0 obj +<< +/Title ($1N5457) +/Parent 109 0 R +/Prev 111 0 R +/A 485 0 R +>> +endobj + +114 0 obj +<< +/Title ($1N1504) +/Parent 113 0 R +/Next 115 0 R +/A 487 0 R +>> +endobj + +115 0 obj +<< +/Title ($1N5326) +/Parent 113 0 R +/Prev 114 0 R +/Next 116 0 R +/A 489 0 R +>> +endobj + +116 0 obj +<< +/Title ($1N5454) +/Parent 113 0 R +/Prev 115 0 R +/A 491 0 R +>> +endobj + +118 0 obj +<< +/Title ($1N1502) +/Parent 117 0 R +/Next 119 0 R +/A 493 0 R +>> +endobj + +119 0 obj +<< +/Title ($1N5310) +/Parent 117 0 R +/Prev 118 0 R +/Next 120 0 R +/A 495 0 R +>> +endobj + +120 0 obj +<< +/Title ($1N5451) +/Parent 117 0 R +/Prev 119 0 R +/A 497 0 R +>> +endobj + +122 0 obj +<< +/Title ($1N2) +/Parent 121 0 R +/Next 123 0 R +/A 499 0 R +>> +endobj + +123 0 obj +<< +/Title ($1N6) +/Parent 121 0 R +/Prev 122 0 R +/Next 124 0 R +/A 501 0 R +>> +endobj + +124 0 obj +<< +/Title ($1N22) +/Parent 121 0 R +/Prev 123 0 R +/Next 125 0 R +/A 503 0 R +>> +endobj + +125 0 obj +<< +/Title ($1N24) +/Parent 121 0 R +/Prev 124 0 R +/Next 126 0 R +/A 505 0 R +>> +endobj + +126 0 obj +<< +/Title ($1N26) +/Parent 121 0 R +/Prev 125 0 R +/Next 127 0 R +/A 507 0 R +>> +endobj + +127 0 obj +<< +/Title ($1N27) +/Parent 121 0 R +/Prev 126 0 R +/Next 128 0 R +/A 509 0 R +>> +endobj + +128 0 obj +<< +/Title ($1N28) +/Parent 121 0 R +/Prev 127 0 R +/Next 129 0 R +/A 511 0 R +>> +endobj + +129 0 obj +<< +/Title ($1N30) +/Parent 121 0 R +/Prev 128 0 R +/Next 130 0 R +/A 513 0 R +>> +endobj + +130 0 obj +<< +/Title ($1N32) +/Parent 121 0 R +/Prev 129 0 R +/Next 131 0 R +/A 515 0 R +>> +endobj + +131 0 obj +<< +/Title ($1N36) +/Parent 121 0 R +/Prev 130 0 R +/Next 132 0 R +/A 517 0 R +>> +endobj + +132 0 obj +<< +/Title ($1N37) +/Parent 121 0 R +/Prev 131 0 R +/Next 133 0 R +/A 519 0 R +>> +endobj + +133 0 obj +<< +/Title ($1N53) +/Parent 121 0 R +/Prev 132 0 R +/Next 134 0 R +/A 521 0 R +>> +endobj + +134 0 obj +<< +/Title ($1N58) +/Parent 121 0 R +/Prev 133 0 R +/Next 135 0 R +/A 523 0 R +>> +endobj + +135 0 obj +<< +/Title ($1N61) +/Parent 121 0 R +/Prev 134 0 R +/Next 136 0 R +/A 525 0 R +>> +endobj + +136 0 obj +<< +/Title ($1N63) +/Parent 121 0 R +/Prev 135 0 R +/Next 137 0 R +/A 527 0 R +>> +endobj + +137 0 obj +<< +/Title ($1N1516) +/Parent 121 0 R +/Prev 136 0 R +/Next 138 0 R +/A 529 0 R +>> +endobj + +138 0 obj +<< +/Title ($1N1518) +/Parent 121 0 R +/Prev 137 0 R +/Next 139 0 R +/A 531 0 R +>> +endobj + +139 0 obj +<< +/Title ($1N1524) +/Parent 121 0 R +/Prev 138 0 R +/Next 140 0 R +/A 533 0 R +>> +endobj + +140 0 obj +<< +/Title ($1N1526) +/Parent 121 0 R +/Prev 139 0 R +/Next 141 0 R +/A 535 0 R +>> +endobj + +141 0 obj +<< +/Title ($1N1530) +/Parent 121 0 R +/Prev 140 0 R +/Next 142 0 R +/A 537 0 R +>> +endobj + +142 0 obj +<< +/Title ($1N1532) +/Parent 121 0 R +/Prev 141 0 R +/Next 143 0 R +/A 539 0 R +>> +endobj + +143 0 obj +<< +/Title ($1N1534) +/Parent 121 0 R +/Prev 142 0 R +/Next 144 0 R +/A 541 0 R +>> +endobj + +144 0 obj +<< +/Title ($1N1552) +/Parent 121 0 R +/Prev 143 0 R +/Next 145 0 R +/A 543 0 R +>> +endobj + +145 0 obj +<< +/Title ($1N1554) +/Parent 121 0 R +/Prev 144 0 R +/Next 146 0 R +/A 545 0 R +>> +endobj + +146 0 obj +<< +/Title ($1N1572) +/Parent 121 0 R +/Prev 145 0 R +/Next 147 0 R +/A 547 0 R +>> +endobj + +147 0 obj +<< +/Title ($1N1576) +/Parent 121 0 R +/Prev 146 0 R +/Next 148 0 R +/A 549 0 R +>> +endobj + +148 0 obj +<< +/Title ($1N1580) +/Parent 121 0 R +/Prev 147 0 R +/Next 149 0 R +/A 551 0 R +>> +endobj + +149 0 obj +<< +/Title ($1N1584) +/Parent 121 0 R +/Prev 148 0 R +/Next 150 0 R +/A 553 0 R +>> +endobj + +150 0 obj +<< +/Title ($1N1586) +/Parent 121 0 R +/Prev 149 0 R +/Next 151 0 R +/A 555 0 R +>> +endobj + +151 0 obj +<< +/Title ($1N1588) +/Parent 121 0 R +/Prev 150 0 R +/Next 152 0 R +/A 557 0 R +>> +endobj + +152 0 obj +<< +/Title ($1N1590) +/Parent 121 0 R +/Prev 151 0 R +/Next 153 0 R +/A 559 0 R +>> +endobj + +153 0 obj +<< +/Title ($1N1592) +/Parent 121 0 R +/Prev 152 0 R +/Next 154 0 R +/A 561 0 R +>> +endobj + +154 0 obj +<< +/Title ($1N1594) +/Parent 121 0 R +/Prev 153 0 R +/Next 155 0 R +/A 563 0 R +>> +endobj + +155 0 obj +<< +/Title ($1N1596) +/Parent 121 0 R +/Prev 154 0 R +/Next 156 0 R +/A 565 0 R +>> +endobj + +156 0 obj +<< +/Title ($1N1598) +/Parent 121 0 R +/Prev 155 0 R +/Next 157 0 R +/A 567 0 R +>> +endobj + +157 0 obj +<< +/Title ($1N1614) +/Parent 121 0 R +/Prev 156 0 R +/Next 158 0 R +/A 569 0 R +>> +endobj + +158 0 obj +<< +/Title ($1N1638) +/Parent 121 0 R +/Prev 157 0 R +/Next 159 0 R +/A 571 0 R +>> +endobj + +159 0 obj +<< +/Title ($1N1640) +/Parent 121 0 R +/Prev 158 0 R +/Next 160 0 R +/A 573 0 R +>> +endobj + +160 0 obj +<< +/Title ($1N1642) +/Parent 121 0 R +/Prev 159 0 R +/Next 161 0 R +/A 575 0 R +>> +endobj + +161 0 obj +<< +/Title ($1N1644) +/Parent 121 0 R +/Prev 160 0 R +/Next 162 0 R +/A 577 0 R +>> +endobj + +162 0 obj +<< +/Title ($1N1646) +/Parent 121 0 R +/Prev 161 0 R +/Next 163 0 R +/A 579 0 R +>> +endobj + +163 0 obj +<< +/Title ($1N1648) +/Parent 121 0 R +/Prev 162 0 R +/Next 164 0 R +/A 581 0 R +>> +endobj + +164 0 obj +<< +/Title ($1N1650) +/Parent 121 0 R +/Prev 163 0 R +/Next 165 0 R +/A 583 0 R +>> +endobj + +165 0 obj +<< +/Title ($1N1652) +/Parent 121 0 R +/Prev 164 0 R +/Next 166 0 R +/A 585 0 R +>> +endobj + +166 0 obj +<< +/Title ($1N1656) +/Parent 121 0 R +/Prev 165 0 R +/Next 167 0 R +/A 587 0 R +>> +endobj + +167 0 obj +<< +/Title ($1N1658) +/Parent 121 0 R +/Prev 166 0 R +/Next 168 0 R +/A 589 0 R +>> +endobj + +168 0 obj +<< +/Title ($1N1708) +/Parent 121 0 R +/Prev 167 0 R +/Next 169 0 R +/A 591 0 R +>> +endobj + +169 0 obj +<< +/Title ($1N1730) +/Parent 121 0 R +/Prev 168 0 R +/Next 170 0 R +/A 593 0 R +>> +endobj + +170 0 obj +<< +/Title ($1N1734) +/Parent 121 0 R +/Prev 169 0 R +/Next 171 0 R +/A 595 0 R +>> +endobj + +171 0 obj +<< +/Title ($1N1740) +/Parent 121 0 R +/Prev 170 0 R +/Next 172 0 R +/A 597 0 R +>> +endobj + +172 0 obj +<< +/Title ($1N1762) +/Parent 121 0 R +/Prev 171 0 R +/Next 173 0 R +/A 599 0 R +>> +endobj + +173 0 obj +<< +/Title ($1N1764) +/Parent 121 0 R +/Prev 172 0 R +/Next 174 0 R +/A 601 0 R +>> +endobj + +174 0 obj +<< +/Title ($1N1766) +/Parent 121 0 R +/Prev 173 0 R +/Next 175 0 R +/A 603 0 R +>> +endobj + +175 0 obj +<< +/Title ($1N1768) +/Parent 121 0 R +/Prev 174 0 R +/Next 176 0 R +/A 605 0 R +>> +endobj + +176 0 obj +<< +/Title ($1N1770) +/Parent 121 0 R +/Prev 175 0 R +/Next 177 0 R +/A 607 0 R +>> +endobj + +177 0 obj +<< +/Title ($1N1774) +/Parent 121 0 R +/Prev 176 0 R +/Next 178 0 R +/A 609 0 R +>> +endobj + +178 0 obj +<< +/Title ($1N1790) +/Parent 121 0 R +/Prev 177 0 R +/Next 179 0 R +/A 611 0 R +>> +endobj + +179 0 obj +<< +/Title ($1N1792) +/Parent 121 0 R +/Prev 178 0 R +/Next 180 0 R +/A 613 0 R +>> +endobj + +180 0 obj +<< +/Title ($1N1796) +/Parent 121 0 R +/Prev 179 0 R +/Next 181 0 R +/A 615 0 R +>> +endobj + +181 0 obj +<< +/Title ($1N1798) +/Parent 121 0 R +/Prev 180 0 R +/Next 182 0 R +/A 617 0 R +>> +endobj + +182 0 obj +<< +/Title ($1N1800) +/Parent 121 0 R +/Prev 181 0 R +/Next 183 0 R +/A 619 0 R +>> +endobj + +183 0 obj +<< +/Title ($1N1824) +/Parent 121 0 R +/Prev 182 0 R +/Next 184 0 R +/A 621 0 R +>> +endobj + +184 0 obj +<< +/Title ($1N1826) +/Parent 121 0 R +/Prev 183 0 R +/Next 185 0 R +/A 623 0 R +>> +endobj + +185 0 obj +<< +/Title ($1N1838) +/Parent 121 0 R +/Prev 184 0 R +/Next 186 0 R +/A 625 0 R +>> +endobj + +186 0 obj +<< +/Title ($1N1840) +/Parent 121 0 R +/Prev 185 0 R +/Next 187 0 R +/A 627 0 R +>> +endobj + +187 0 obj +<< +/Title ($1N1842) +/Parent 121 0 R +/Prev 186 0 R +/Next 188 0 R +/A 629 0 R +>> +endobj + +188 0 obj +<< +/Title ($1N1844) +/Parent 121 0 R +/Prev 187 0 R +/Next 189 0 R +/A 631 0 R +>> +endobj + +189 0 obj +<< +/Title ($1N1850) +/Parent 121 0 R +/Prev 188 0 R +/Next 190 0 R +/A 633 0 R +>> +endobj + +190 0 obj +<< +/Title ($1N1858) +/Parent 121 0 R +/Prev 189 0 R +/Next 191 0 R +/A 635 0 R +>> +endobj + +191 0 obj +<< +/Title ($1N1866) +/Parent 121 0 R +/Prev 190 0 R +/Next 192 0 R +/A 637 0 R +>> +endobj + +192 0 obj +<< +/Title ($1N1884) +/Parent 121 0 R +/Prev 191 0 R +/Next 193 0 R +/A 639 0 R +>> +endobj + +193 0 obj +<< +/Title ($1N1886) +/Parent 121 0 R +/Prev 192 0 R +/Next 194 0 R +/A 641 0 R +>> +endobj + +194 0 obj +<< +/Title ($1N5390) +/Parent 121 0 R +/Prev 193 0 R +/Next 195 0 R +/A 643 0 R +>> +endobj + +195 0 obj +<< +/Title ($1N5442) +/Parent 121 0 R +/Prev 194 0 R +/A 645 0 R +>> +endobj + +197 0 obj +<< +/Title ($1N19) +/Parent 196 0 R +/Next 198 0 R +/A 647 0 R +>> +endobj + +198 0 obj +<< +/Title ($1N40) +/Parent 196 0 R +/Prev 197 0 R +/A 649 0 R +>> +endobj + +200 0 obj +<< +/Title ($1N21) +/Parent 199 0 R +/Next 201 0 R +/A 651 0 R +>> +endobj + +201 0 obj +<< +/Title ($1N38) +/Parent 199 0 R +/Prev 200 0 R +/A 653 0 R +>> +endobj + +203 0 obj +<< +/Title ($1N20) +/Parent 202 0 R +/Next 204 0 R +/A 655 0 R +>> +endobj + +204 0 obj +<< +/Title ($1N39) +/Parent 202 0 R +/Prev 203 0 R +/A 657 0 R +>> +endobj + +206 0 obj +<< +/Title ($1N11) +/Parent 205 0 R +/Next 207 0 R +/A 659 0 R +>> +endobj + +207 0 obj +<< +/Title ($1N33) +/Parent 205 0 R +/Prev 206 0 R +/Next 208 0 R +/A 661 0 R +>> +endobj + +208 0 obj +<< +/Title ($1N48) +/Parent 205 0 R +/Prev 207 0 R +/Next 209 0 R +/A 663 0 R +>> +endobj + +209 0 obj +<< +/Title ($1N1538) +/Parent 205 0 R +/Prev 208 0 R +/Next 210 0 R +/A 665 0 R +>> +endobj + +210 0 obj +<< +/Title ($1N1556) +/Parent 205 0 R +/Prev 209 0 R +/Next 211 0 R +/A 667 0 R +>> +endobj + +211 0 obj +<< +/Title ($1N1610) +/Parent 205 0 R +/Prev 210 0 R +/Next 212 0 R +/A 669 0 R +>> +endobj + +212 0 obj +<< +/Title ($1N1622) +/Parent 205 0 R +/Prev 211 0 R +/Next 213 0 R +/A 671 0 R +>> +endobj + +213 0 obj +<< +/Title ($1N1674) +/Parent 205 0 R +/Prev 212 0 R +/Next 214 0 R +/A 673 0 R +>> +endobj + +214 0 obj +<< +/Title ($1N1682) +/Parent 205 0 R +/Prev 213 0 R +/Next 215 0 R +/A 675 0 R +>> +endobj + +215 0 obj +<< +/Title ($1N1706) +/Parent 205 0 R +/Prev 214 0 R +/Next 216 0 R +/A 677 0 R +>> +endobj + +216 0 obj +<< +/Title ($1N1738) +/Parent 205 0 R +/Prev 215 0 R +/Next 217 0 R +/A 679 0 R +>> +endobj + +217 0 obj +<< +/Title ($1N1748) +/Parent 205 0 R +/Prev 216 0 R +/Next 218 0 R +/A 681 0 R +>> +endobj + +218 0 obj +<< +/Title ($1N1772) +/Parent 205 0 R +/Prev 217 0 R +/Next 219 0 R +/A 683 0 R +>> +endobj + +219 0 obj +<< +/Title ($1N1816) +/Parent 205 0 R +/Prev 218 0 R +/Next 220 0 R +/A 685 0 R +>> +endobj + +220 0 obj +<< +/Title ($1N1868) +/Parent 205 0 R +/Prev 219 0 R +/A 687 0 R +>> +endobj + +222 0 obj +<< +/Title ($1N1818) +/Parent 221 0 R +/A 689 0 R +>> +endobj + +224 0 obj +<< +/Title ($1N7) +/Parent 223 0 R +/Next 225 0 R +/A 691 0 R +>> +endobj + +225 0 obj +<< +/Title ($1N52) +/Parent 223 0 R +/Prev 224 0 R +/Next 226 0 R +/A 693 0 R +>> +endobj + +226 0 obj +<< +/Title ($1N1548) +/Parent 223 0 R +/Prev 225 0 R +/Next 227 0 R +/A 695 0 R +>> +endobj + +227 0 obj +<< +/Title ($1N1560) +/Parent 223 0 R +/Prev 226 0 R +/Next 228 0 R +/A 697 0 R +>> +endobj + +228 0 obj +<< +/Title ($1N1608) +/Parent 223 0 R +/Prev 227 0 R +/Next 229 0 R +/A 699 0 R +>> +endobj + +229 0 obj +<< +/Title ($1N1630) +/Parent 223 0 R +/Prev 228 0 R +/Next 230 0 R +/A 701 0 R +>> +endobj + +230 0 obj +<< +/Title ($1N1666) +/Parent 223 0 R +/Prev 229 0 R +/Next 231 0 R +/A 703 0 R +>> +endobj + +231 0 obj +<< +/Title ($1N1690) +/Parent 223 0 R +/Prev 230 0 R +/Next 232 0 R +/A 705 0 R +>> +endobj + +232 0 obj +<< +/Title ($1N1714) +/Parent 223 0 R +/Prev 231 0 R +/Next 233 0 R +/A 707 0 R +>> +endobj + +233 0 obj +<< +/Title ($1N1720) +/Parent 223 0 R +/Prev 232 0 R +/Next 234 0 R +/A 709 0 R +>> +endobj + +234 0 obj +<< +/Title ($1N1756) +/Parent 223 0 R +/Prev 233 0 R +/Next 235 0 R +/A 711 0 R +>> +endobj + +235 0 obj +<< +/Title ($1N1782) +/Parent 223 0 R +/Prev 234 0 R +/Next 236 0 R +/A 713 0 R +>> +endobj + +236 0 obj +<< +/Title ($1N1804) +/Parent 223 0 R +/Prev 235 0 R +/Next 237 0 R +/A 715 0 R +>> +endobj + +237 0 obj +<< +/Title ($1N1834) +/Parent 223 0 R +/Prev 236 0 R +/Next 238 0 R +/A 717 0 R +>> +endobj + +238 0 obj +<< +/Title ($1N1880) +/Parent 223 0 R +/Prev 237 0 R +/A 719 0 R +>> +endobj + +240 0 obj +<< +/Title ($1N8) +/Parent 239 0 R +/Next 241 0 R +/A 721 0 R +>> +endobj + +241 0 obj +<< +/Title ($1N51) +/Parent 239 0 R +/Prev 240 0 R +/Next 242 0 R +/A 723 0 R +>> +endobj + +242 0 obj +<< +/Title ($1N1546) +/Parent 239 0 R +/Prev 241 0 R +/Next 243 0 R +/A 725 0 R +>> +endobj + +243 0 obj +<< +/Title ($1N1562) +/Parent 239 0 R +/Prev 242 0 R +/Next 244 0 R +/A 727 0 R +>> +endobj + +244 0 obj +<< +/Title ($1N1606) +/Parent 239 0 R +/Prev 243 0 R +/Next 245 0 R +/A 729 0 R +>> +endobj + +245 0 obj +<< +/Title ($1N1628) +/Parent 239 0 R +/Prev 244 0 R +/Next 246 0 R +/A 731 0 R +>> +endobj + +246 0 obj +<< +/Title ($1N1668) +/Parent 239 0 R +/Prev 245 0 R +/Next 247 0 R +/A 733 0 R +>> +endobj + +247 0 obj +<< +/Title ($1N1688) +/Parent 239 0 R +/Prev 246 0 R +/Next 248 0 R +/A 735 0 R +>> +endobj + +248 0 obj +<< +/Title ($1N1716) +/Parent 239 0 R +/Prev 247 0 R +/Next 249 0 R +/A 737 0 R +>> +endobj + +249 0 obj +<< +/Title ($1N1722) +/Parent 239 0 R +/Prev 248 0 R +/Next 250 0 R +/A 739 0 R +>> +endobj + +250 0 obj +<< +/Title ($1N1754) +/Parent 239 0 R +/Prev 249 0 R +/Next 251 0 R +/A 741 0 R +>> +endobj + +251 0 obj +<< +/Title ($1N1784) +/Parent 239 0 R +/Prev 250 0 R +/Next 252 0 R +/A 743 0 R +>> +endobj + +252 0 obj +<< +/Title ($1N1802) +/Parent 239 0 R +/Prev 251 0 R +/Next 253 0 R +/A 745 0 R +>> +endobj + +253 0 obj +<< +/Title ($1N1832) +/Parent 239 0 R +/Prev 252 0 R +/Next 254 0 R +/A 747 0 R +>> +endobj + +254 0 obj +<< +/Title ($1N1882) +/Parent 239 0 R +/Prev 253 0 R +/Next 255 0 R +/A 749 0 R +>> +endobj + +255 0 obj +<< +/Title ($1N5374) +/Parent 239 0 R +/Prev 254 0 R +/Next 256 0 R +/A 751 0 R +>> +endobj + +256 0 obj +<< +/Title ($1N5481) +/Parent 239 0 R +/Prev 255 0 R +/A 753 0 R +>> +endobj + +258 0 obj +<< +/Title ($1N13) +/Parent 257 0 R +/Next 259 0 R +/A 755 0 R +>> +endobj + +259 0 obj +<< +/Title ($1N34) +/Parent 257 0 R +/Prev 258 0 R +/Next 260 0 R +/A 757 0 R +>> +endobj + +260 0 obj +<< +/Title ($1N46) +/Parent 257 0 R +/Prev 259 0 R +/Next 261 0 R +/A 759 0 R +>> +endobj + +261 0 obj +<< +/Title ($1N1536) +/Parent 257 0 R +/Prev 260 0 R +/Next 262 0 R +/A 761 0 R +>> +endobj + +262 0 obj +<< +/Title ($1N1558) +/Parent 257 0 R +/Prev 261 0 R +/Next 263 0 R +/A 763 0 R +>> +endobj + +263 0 obj +<< +/Title ($1N1612) +/Parent 257 0 R +/Prev 262 0 R +/Next 264 0 R +/A 765 0 R +>> +endobj + +264 0 obj +<< +/Title ($1N1620) +/Parent 257 0 R +/Prev 263 0 R +/Next 265 0 R +/A 767 0 R +>> +endobj + +265 0 obj +<< +/Title ($1N1676) +/Parent 257 0 R +/Prev 264 0 R +/Next 266 0 R +/A 769 0 R +>> +endobj + +266 0 obj +<< +/Title ($1N1680) +/Parent 257 0 R +/Prev 265 0 R +/Next 267 0 R +/A 771 0 R +>> +endobj + +267 0 obj +<< +/Title ($1N1704) +/Parent 257 0 R +/Prev 266 0 R +/Next 268 0 R +/A 773 0 R +>> +endobj + +268 0 obj +<< +/Title ($1N1726) +/Parent 257 0 R +/Prev 267 0 R +/Next 269 0 R +/A 775 0 R +>> +endobj + +269 0 obj +<< +/Title ($1N1746) +/Parent 257 0 R +/Prev 268 0 R +/Next 270 0 R +/A 777 0 R +>> +endobj + +270 0 obj +<< +/Title ($1N1780) +/Parent 257 0 R +/Prev 269 0 R +/Next 271 0 R +/A 779 0 R +>> +endobj + +271 0 obj +<< +/Title ($1N1812) +/Parent 257 0 R +/Prev 270 0 R +/Next 272 0 R +/A 781 0 R +>> +endobj + +272 0 obj +<< +/Title ($1N1872) +/Parent 257 0 R +/Prev 271 0 R +/A 783 0 R +>> +endobj + +274 0 obj +<< +/Title ($1N14) +/Parent 273 0 R +/Next 275 0 R +/A 785 0 R +>> +endobj + +275 0 obj +<< +/Title ($1N45) +/Parent 273 0 R +/Prev 274 0 R +/Next 276 0 R +/A 787 0 R +>> +endobj + +276 0 obj +<< +/Title ($1N1520) +/Parent 273 0 R +/Prev 275 0 R +/A 789 0 R +>> +endobj + +278 0 obj +<< +/Title ($1N4) +/Parent 277 0 R +/Next 279 0 R +/A 791 0 R +>> +endobj + +279 0 obj +<< +/Title ($1N56) +/Parent 277 0 R +/Prev 278 0 R +/Next 280 0 R +/A 793 0 R +>> +endobj + +280 0 obj +<< +/Title ($1N57) +/Parent 277 0 R +/Prev 279 0 R +/Next 281 0 R +/A 795 0 R +>> +endobj + +281 0 obj +<< +/Title ($1N1634) +/Parent 277 0 R +/Prev 280 0 R +/Next 282 0 R +/A 797 0 R +>> +endobj + +282 0 obj +<< +/Title ($1N1662) +/Parent 277 0 R +/Prev 281 0 R +/Next 283 0 R +/A 799 0 R +>> +endobj + +283 0 obj +<< +/Title ($1N1694) +/Parent 277 0 R +/Prev 282 0 R +/Next 284 0 R +/A 801 0 R +>> +endobj + +284 0 obj +<< +/Title ($1N1794) +/Parent 277 0 R +/Prev 283 0 R +/A 803 0 R +>> +endobj + +286 0 obj +<< +/Title ($1N9) +/Parent 285 0 R +/Next 287 0 R +/A 805 0 R +>> +endobj + +287 0 obj +<< +/Title ($1N50) +/Parent 285 0 R +/Prev 286 0 R +/Next 288 0 R +/A 807 0 R +>> +endobj + +288 0 obj +<< +/Title ($1N1544) +/Parent 285 0 R +/Prev 287 0 R +/Next 289 0 R +/A 809 0 R +>> +endobj + +289 0 obj +<< +/Title ($1N1564) +/Parent 285 0 R +/Prev 288 0 R +/Next 290 0 R +/A 811 0 R +>> +endobj + +290 0 obj +<< +/Title ($1N1604) +/Parent 285 0 R +/Prev 289 0 R +/Next 291 0 R +/A 813 0 R +>> +endobj + +291 0 obj +<< +/Title ($1N1632) +/Parent 285 0 R +/Prev 290 0 R +/Next 292 0 R +/A 815 0 R +>> +endobj + +292 0 obj +<< +/Title ($1N1664) +/Parent 285 0 R +/Prev 291 0 R +/Next 293 0 R +/A 817 0 R +>> +endobj + +293 0 obj +<< +/Title ($1N1692) +/Parent 285 0 R +/Prev 292 0 R +/Next 294 0 R +/A 819 0 R +>> +endobj + +294 0 obj +<< +/Title ($1N1712) +/Parent 285 0 R +/Prev 293 0 R +/Next 295 0 R +/A 821 0 R +>> +endobj + +295 0 obj +<< +/Title ($1N1724) +/Parent 285 0 R +/Prev 294 0 R +/Next 296 0 R +/A 823 0 R +>> +endobj + +296 0 obj +<< +/Title ($1N1758) +/Parent 285 0 R +/Prev 295 0 R +/Next 297 0 R +/A 825 0 R +>> +endobj + +297 0 obj +<< +/Title ($1N1786) +/Parent 285 0 R +/Prev 296 0 R +/Next 298 0 R +/A 827 0 R +>> +endobj + +298 0 obj +<< +/Title ($1N1806) +/Parent 285 0 R +/Prev 297 0 R +/Next 299 0 R +/A 829 0 R +>> +endobj + +299 0 obj +<< +/Title ($1N1830) +/Parent 285 0 R +/Prev 298 0 R +/Next 300 0 R +/A 831 0 R +>> +endobj + +300 0 obj +<< +/Title ($1N1878) +/Parent 285 0 R +/Prev 299 0 R +/Next 301 0 R +/A 833 0 R +>> +endobj + +301 0 obj +<< +/Title ($1N5358) +/Parent 285 0 R +/Prev 300 0 R +/Next 302 0 R +/A 835 0 R +>> +endobj + +302 0 obj +<< +/Title ($1N5478) +/Parent 285 0 R +/Prev 301 0 R +/A 837 0 R +>> +endobj + +304 0 obj +<< +/Title ($1N17) +/Parent 303 0 R +/Next 305 0 R +/A 839 0 R +>> +endobj + +305 0 obj +<< +/Title ($1N42) +/Parent 303 0 R +/Prev 304 0 R +/A 841 0 R +>> +endobj + +307 0 obj +<< +/Title ($1N16) +/Parent 306 0 R +/Next 308 0 R +/A 843 0 R +>> +endobj + +308 0 obj +<< +/Title ($1N43) +/Parent 306 0 R +/Prev 307 0 R +/A 845 0 R +>> +endobj + +310 0 obj +<< +/Title ($1N1498) +/Parent 309 0 R +/Next 311 0 R +/A 847 0 R +>> +endobj + +311 0 obj +<< +/Title ($1N1512) +/Parent 309 0 R +/Prev 310 0 R +/A 849 0 R +>> +endobj + +313 0 obj +<< +/Title ($1N1496) +/Parent 312 0 R +/Next 314 0 R +/A 851 0 R +>> +endobj + +314 0 obj +<< +/Title ($1N1510) +/Parent 312 0 R +/Prev 313 0 R +/A 853 0 R +>> +endobj + +316 0 obj +<< +/Title ($1N18) +/Parent 315 0 R +/Next 317 0 R +/A 855 0 R +>> +endobj + +317 0 obj +<< +/Title ($1N41) +/Parent 315 0 R +/Prev 316 0 R +/Next 318 0 R +/A 857 0 R +>> +endobj + +318 0 obj +<< +/Title ($1N1522) +/Parent 315 0 R +/Prev 317 0 R +/A 859 0 R +>> +endobj + +861 0 obj +<< +/Producer (jsPDF 0.0.0) +/CreationDate (D:20251108000128-00'00') +>> +endobj +862 0 obj +<< +/Type /Catalog +/Pages 1 0 R +/OpenAction [3 0 R /FitH null] +/PageLayout /OneColumn +/Outlines 12 0 R +>> +endobj +xref +0 863 +0000000000 65535 f +0000334529 00000 n +0000396345 00000 n +0000000015 00000 n +0000000125 00000 n +0000334586 00000 n +0000334751 00000 n +0000334930 00000 n +0000335046 00000 n +0000335215 00000 n +0000336259 00000 n +0000393129 00000 n +0000527015 00000 n +0000527093 00000 n +0000527300 00000 n +0000527196 00000 n +0000527411 00000 n +0000531215 00000 n +0000531292 00000 n +0000531383 00000 n +0000531474 00000 n +0000531565 00000 n +0000531658 00000 n +0000531751 00000 n +0000531844 00000 n +0000531937 00000 n +0000532030 00000 n +0000532123 00000 n +0000532216 00000 n +0000532309 00000 n +0000532402 00000 n +0000532495 00000 n +0000532588 00000 n +0000532681 00000 n +0000532774 00000 n +0000527513 00000 n +0000532854 00000 n +0000532932 00000 n +0000533023 00000 n +0000527627 00000 n +0000533103 00000 n +0000527742 00000 n +0000533167 00000 n +0000527858 00000 n +0000533232 00000 n +0000527974 00000 n +0000533297 00000 n +0000533375 00000 n +0000533466 00000 n +0000533559 00000 n +0000528088 00000 n +0000533639 00000 n +0000533719 00000 n +0000533812 00000 n +0000533905 00000 n +0000533998 00000 n +0000534091 00000 n +0000528203 00000 n +0000534171 00000 n +0000534249 00000 n +0000534340 00000 n +0000534433 00000 n +0000534526 00000 n +0000534619 00000 n +0000534712 00000 n +0000534805 00000 n +0000534898 00000 n +0000534991 00000 n +0000535084 00000 n +0000535177 00000 n +0000535270 00000 n +0000535363 00000 n +0000535456 00000 n +0000528319 00000 n +0000535536 00000 n +0000535614 00000 n +0000535705 00000 n +0000535798 00000 n +0000535891 00000 n +0000535984 00000 n +0000536077 00000 n +0000536170 00000 n +0000536263 00000 n +0000536356 00000 n +0000536449 00000 n +0000536542 00000 n +0000536635 00000 n +0000536728 00000 n +0000536821 00000 n +0000528433 00000 n +0000536901 00000 n +0000536981 00000 n +0000537074 00000 n +0000537167 00000 n +0000537260 00000 n +0000537353 00000 n +0000537446 00000 n +0000537539 00000 n +0000537632 00000 n +0000537725 00000 n +0000537819 00000 n +0000537914 00000 n +0000528551 00000 n +0000537996 00000 n +0000528670 00000 n +0000538065 00000 n +0000538148 00000 n +0000538245 00000 n +0000538342 00000 n +0000528796 00000 n +0000538425 00000 n +0000538508 00000 n +0000538605 00000 n +0000528920 00000 n +0000538688 00000 n +0000538771 00000 n +0000538868 00000 n +0000529045 00000 n +0000538951 00000 n +0000539034 00000 n +0000539131 00000 n +0000529171 00000 n +0000539214 00000 n +0000539294 00000 n +0000539388 00000 n +0000539483 00000 n +0000539578 00000 n +0000539673 00000 n +0000539768 00000 n +0000539863 00000 n +0000539958 00000 n +0000540053 00000 n +0000540148 00000 n +0000540243 00000 n +0000540338 00000 n +0000540433 00000 n +0000540528 00000 n +0000540623 00000 n +0000540720 00000 n +0000540817 00000 n +0000540914 00000 n +0000541011 00000 n +0000541108 00000 n +0000541205 00000 n +0000541302 00000 n +0000541399 00000 n +0000541496 00000 n +0000541593 00000 n +0000541690 00000 n +0000541787 00000 n +0000541884 00000 n +0000541981 00000 n +0000542078 00000 n +0000542175 00000 n +0000542272 00000 n +0000542369 00000 n +0000542466 00000 n +0000542563 00000 n +0000542660 00000 n +0000542757 00000 n +0000542854 00000 n +0000542951 00000 n +0000543048 00000 n +0000543145 00000 n +0000543242 00000 n +0000543339 00000 n +0000543436 00000 n +0000543533 00000 n +0000543630 00000 n +0000543727 00000 n +0000543824 00000 n +0000543921 00000 n +0000544018 00000 n +0000544115 00000 n +0000544212 00000 n +0000544309 00000 n +0000544406 00000 n +0000544503 00000 n +0000544600 00000 n +0000544697 00000 n +0000544794 00000 n +0000544891 00000 n +0000544988 00000 n +0000545085 00000 n +0000545182 00000 n +0000545279 00000 n +0000545376 00000 n +0000545473 00000 n +0000545570 00000 n +0000545667 00000 n +0000545764 00000 n +0000545861 00000 n +0000545958 00000 n +0000546055 00000 n +0000546152 00000 n +0000546249 00000 n +0000529291 00000 n +0000546332 00000 n +0000546413 00000 n +0000529412 00000 n +0000546494 00000 n +0000546575 00000 n +0000529533 00000 n +0000546656 00000 n +0000546737 00000 n +0000529654 00000 n +0000546818 00000 n +0000546899 00000 n +0000546994 00000 n +0000547089 00000 n +0000547186 00000 n +0000547283 00000 n +0000547380 00000 n +0000547477 00000 n +0000547574 00000 n +0000547671 00000 n +0000547768 00000 n +0000547865 00000 n +0000547962 00000 n +0000548059 00000 n +0000548156 00000 n +0000529774 00000 n +0000548239 00000 n +0000529898 00000 n +0000548308 00000 n +0000548388 00000 n +0000548483 00000 n +0000548580 00000 n +0000548677 00000 n +0000548774 00000 n +0000548871 00000 n +0000548968 00000 n +0000549065 00000 n +0000549162 00000 n +0000549259 00000 n +0000549356 00000 n +0000549453 00000 n +0000549550 00000 n +0000549647 00000 n +0000530019 00000 n +0000549730 00000 n +0000549810 00000 n +0000549905 00000 n +0000550002 00000 n +0000550099 00000 n +0000550196 00000 n +0000550293 00000 n +0000550390 00000 n +0000550487 00000 n +0000550584 00000 n +0000550681 00000 n +0000550778 00000 n +0000550875 00000 n +0000550972 00000 n +0000551069 00000 n +0000551166 00000 n +0000551263 00000 n +0000530140 00000 n +0000551346 00000 n +0000551427 00000 n +0000551522 00000 n +0000551617 00000 n +0000551714 00000 n +0000551811 00000 n +0000551908 00000 n +0000552005 00000 n +0000552102 00000 n +0000552199 00000 n +0000552296 00000 n +0000552393 00000 n +0000552490 00000 n +0000552587 00000 n +0000552684 00000 n +0000530261 00000 n +0000552767 00000 n +0000552848 00000 n +0000552943 00000 n +0000530381 00000 n +0000553026 00000 n +0000553106 00000 n +0000553201 00000 n +0000553296 00000 n +0000553393 00000 n +0000553490 00000 n +0000553587 00000 n +0000530501 00000 n +0000553670 00000 n +0000553750 00000 n +0000553845 00000 n +0000553942 00000 n +0000554039 00000 n +0000554136 00000 n +0000554233 00000 n +0000554330 00000 n +0000554427 00000 n +0000554524 00000 n +0000554621 00000 n +0000554718 00000 n +0000554815 00000 n +0000554912 00000 n +0000555009 00000 n +0000555106 00000 n +0000555203 00000 n +0000530621 00000 n +0000555286 00000 n +0000555367 00000 n +0000530740 00000 n +0000555448 00000 n +0000555529 00000 n +0000530859 00000 n +0000555610 00000 n +0000555693 00000 n +0000530984 00000 n +0000555776 00000 n +0000555859 00000 n +0000531109 00000 n +0000555942 00000 n +0000556023 00000 n +0000556118 00000 n +0000396470 00000 n +0000396534 00000 n +0000396980 00000 n +0000397044 00000 n +0000397438 00000 n +0000397502 00000 n +0000397911 00000 n +0000397975 00000 n +0000398408 00000 n +0000398472 00000 n +0000398878 00000 n +0000398942 00000 n +0000399335 00000 n +0000399399 00000 n +0000399831 00000 n +0000399895 00000 n +0000400288 00000 n +0000400352 00000 n +0000400796 00000 n +0000400860 00000 n +0000401304 00000 n +0000401368 00000 n +0000401797 00000 n +0000401861 00000 n +0000402268 00000 n +0000402332 00000 n +0000402727 00000 n +0000402791 00000 n +0000403198 00000 n +0000403262 00000 n +0000403666 00000 n +0000403730 00000 n +0000404170 00000 n +0000404234 00000 n +0000404692 00000 n +0000404756 00000 n +0000405214 00000 n +0000405278 00000 n +0000405674 00000 n +0000405738 00000 n +0000406156 00000 n +0000406220 00000 n +0000406615 00000 n +0000406679 00000 n +0000407109 00000 n +0000407173 00000 n +0000407617 00000 n +0000407681 00000 n +0000408112 00000 n +0000408176 00000 n +0000408596 00000 n +0000408660 00000 n +0000409081 00000 n +0000409145 00000 n +0000409553 00000 n +0000409617 00000 n +0000410025 00000 n +0000410089 00000 n +0000410487 00000 n +0000410551 00000 n +0000410947 00000 n +0000411011 00000 n +0000411418 00000 n +0000411482 00000 n +0000411917 00000 n +0000411981 00000 n +0000412391 00000 n +0000412455 00000 n +0000412865 00000 n +0000412929 00000 n +0000413338 00000 n +0000413402 00000 n +0000413813 00000 n +0000413877 00000 n +0000414283 00000 n +0000414347 00000 n +0000414742 00000 n +0000414806 00000 n +0000415221 00000 n +0000415285 00000 n +0000415714 00000 n +0000415778 00000 n +0000416183 00000 n +0000416247 00000 n +0000416676 00000 n +0000416740 00000 n +0000417195 00000 n +0000417259 00000 n +0000417688 00000 n +0000417752 00000 n +0000418169 00000 n +0000418233 00000 n +0000418628 00000 n +0000418692 00000 n +0000419099 00000 n +0000419163 00000 n +0000419556 00000 n +0000419620 00000 n +0000420049 00000 n +0000420113 00000 n +0000420556 00000 n +0000420620 00000 n +0000421065 00000 n +0000421129 00000 n +0000421524 00000 n +0000421588 00000 n +0000422005 00000 n +0000422069 00000 n +0000422486 00000 n +0000422550 00000 n +0000422979 00000 n +0000423043 00000 n +0000423448 00000 n +0000423512 00000 n +0000423930 00000 n +0000423994 00000 n +0000424449 00000 n +0000424513 00000 n +0000424908 00000 n +0000424972 00000 n +0000425389 00000 n +0000425453 00000 n +0000425848 00000 n +0000425912 00000 n +0000426319 00000 n +0000426383 00000 n +0000426778 00000 n +0000426842 00000 n +0000427259 00000 n +0000427323 00000 n +0000427752 00000 n +0000427816 00000 n +0000428282 00000 n +0000428346 00000 n +0000428764 00000 n +0000428828 00000 n +0000429272 00000 n +0000429336 00000 n +0000429743 00000 n +0000429807 00000 n +0000430251 00000 n +0000430315 00000 n +0000430710 00000 n +0000430774 00000 n +0000431181 00000 n +0000431245 00000 n +0000431640 00000 n +0000431704 00000 n +0000432122 00000 n +0000432186 00000 n +0000432613 00000 n +0000432677 00000 n +0000433106 00000 n +0000433170 00000 n +0000433565 00000 n +0000433629 00000 n +0000434036 00000 n +0000434100 00000 n +0000434518 00000 n +0000434582 00000 n +0000434977 00000 n +0000435041 00000 n +0000435473 00000 n +0000435537 00000 n +0000435942 00000 n +0000436006 00000 n +0000436401 00000 n +0000436465 00000 n +0000436897 00000 n +0000436961 00000 n +0000437405 00000 n +0000437469 00000 n +0000437901 00000 n +0000437965 00000 n +0000438434 00000 n +0000438498 00000 n +0000438942 00000 n +0000439006 00000 n +0000439399 00000 n +0000439463 00000 n +0000439893 00000 n +0000439957 00000 n +0000440353 00000 n +0000440417 00000 n +0000440840 00000 n +0000440904 00000 n +0000441301 00000 n +0000441365 00000 n +0000441820 00000 n +0000441884 00000 n +0000442281 00000 n +0000442345 00000 n +0000442791 00000 n +0000442855 00000 n +0000443274 00000 n +0000443338 00000 n +0000443770 00000 n +0000443834 00000 n +0000444264 00000 n +0000444328 00000 n +0000444761 00000 n +0000444825 00000 n +0000445233 00000 n +0000445297 00000 n +0000445707 00000 n +0000445771 00000 n +0000446212 00000 n +0000446276 00000 n +0000446679 00000 n +0000446743 00000 n +0000447163 00000 n +0000447227 00000 n +0000447659 00000 n +0000447723 00000 n +0000448192 00000 n +0000448256 00000 n +0000448687 00000 n +0000448751 00000 n +0000449166 00000 n +0000449230 00000 n +0000449623 00000 n +0000449687 00000 n +0000450116 00000 n +0000450180 00000 n +0000450586 00000 n +0000450650 00000 n +0000451067 00000 n +0000451131 00000 n +0000451546 00000 n +0000451610 00000 n +0000452042 00000 n +0000452106 00000 n +0000452501 00000 n +0000452565 00000 n +0000453006 00000 n +0000453070 00000 n +0000453485 00000 n +0000453549 00000 n +0000453966 00000 n +0000454030 00000 n +0000454447 00000 n +0000454511 00000 n +0000454928 00000 n +0000454992 00000 n +0000455387 00000 n +0000455451 00000 n +0000455846 00000 n +0000455910 00000 n +0000456305 00000 n +0000456369 00000 n +0000456762 00000 n +0000456826 00000 n +0000457233 00000 n +0000457297 00000 n +0000457726 00000 n +0000457790 00000 n +0000458207 00000 n +0000458271 00000 n +0000458689 00000 n +0000458753 00000 n +0000459193 00000 n +0000459257 00000 n +0000459712 00000 n +0000459776 00000 n +0000460231 00000 n +0000460295 00000 n +0000460724 00000 n +0000460788 00000 n +0000461204 00000 n +0000461268 00000 n +0000461661 00000 n +0000461725 00000 n +0000462130 00000 n +0000462194 00000 n +0000462626 00000 n +0000462690 00000 n +0000463097 00000 n +0000463161 00000 n +0000463568 00000 n +0000463632 00000 n +0000464024 00000 n +0000464088 00000 n +0000464505 00000 n +0000464569 00000 n +0000465009 00000 n +0000465073 00000 n +0000465480 00000 n +0000465544 00000 n +0000465973 00000 n +0000466037 00000 n +0000466432 00000 n +0000466496 00000 n +0000466891 00000 n +0000466955 00000 n +0000467350 00000 n +0000467414 00000 n +0000467809 00000 n +0000467873 00000 n +0000468268 00000 n +0000468332 00000 n +0000468739 00000 n +0000468803 00000 n +0000469198 00000 n +0000469262 00000 n +0000469657 00000 n +0000469721 00000 n +0000470116 00000 n +0000470180 00000 n +0000470575 00000 n +0000470639 00000 n +0000471032 00000 n +0000471096 00000 n +0000471489 00000 n +0000471553 00000 n +0000472022 00000 n +0000472086 00000 n +0000472530 00000 n +0000472594 00000 n +0000473038 00000 n +0000473102 00000 n +0000473553 00000 n +0000473617 00000 n +0000474036 00000 n +0000474100 00000 n +0000474507 00000 n +0000474571 00000 n +0000474964 00000 n +0000475028 00000 n +0000475458 00000 n +0000475522 00000 n +0000475957 00000 n +0000476021 00000 n +0000476452 00000 n +0000476516 00000 n +0000476928 00000 n +0000476992 00000 n +0000477400 00000 n +0000477464 00000 n +0000477887 00000 n +0000477951 00000 n +0000478370 00000 n +0000478434 00000 n +0000478843 00000 n +0000478907 00000 n +0000479340 00000 n +0000479404 00000 n +0000479815 00000 n +0000479879 00000 n +0000480272 00000 n +0000480336 00000 n +0000480731 00000 n +0000480795 00000 n +0000481190 00000 n +0000481254 00000 n +0000481671 00000 n +0000481735 00000 n +0000482128 00000 n +0000482192 00000 n +0000482599 00000 n +0000482663 00000 n +0000483070 00000 n +0000483134 00000 n +0000483541 00000 n +0000483605 00000 n +0000484045 00000 n +0000484109 00000 n +0000484504 00000 n +0000484568 00000 n +0000484975 00000 n +0000485039 00000 n +0000485490 00000 n +0000485554 00000 n +0000485961 00000 n +0000486025 00000 n +0000486445 00000 n +0000486509 00000 n +0000486931 00000 n +0000486995 00000 n +0000487388 00000 n +0000487452 00000 n +0000487906 00000 n +0000487970 00000 n +0000488387 00000 n +0000488451 00000 n +0000488880 00000 n +0000488944 00000 n +0000489349 00000 n +0000489413 00000 n +0000489820 00000 n +0000489884 00000 n +0000490328 00000 n +0000490392 00000 n +0000490799 00000 n +0000490863 00000 n +0000491280 00000 n +0000491344 00000 n +0000491776 00000 n +0000491840 00000 n +0000492247 00000 n +0000492311 00000 n +0000492706 00000 n +0000492770 00000 n +0000493199 00000 n +0000493263 00000 n +0000493695 00000 n +0000493759 00000 n +0000494193 00000 n +0000494257 00000 n +0000494686 00000 n +0000494750 00000 n +0000495165 00000 n +0000495229 00000 n +0000495683 00000 n +0000495747 00000 n +0000496187 00000 n +0000496251 00000 n +0000496667 00000 n +0000496731 00000 n +0000497126 00000 n +0000497190 00000 n +0000497622 00000 n +0000497686 00000 n +0000498115 00000 n +0000498179 00000 n +0000498608 00000 n +0000498672 00000 n +0000499067 00000 n +0000499131 00000 n +0000499526 00000 n +0000499590 00000 n +0000499985 00000 n +0000500049 00000 n +0000500500 00000 n +0000500564 00000 n +0000500959 00000 n +0000501023 00000 n +0000501455 00000 n +0000501519 00000 n +0000501939 00000 n +0000502003 00000 n +0000502424 00000 n +0000502488 00000 n +0000502910 00000 n +0000502974 00000 n +0000503380 00000 n +0000503444 00000 n +0000503876 00000 n +0000503940 00000 n +0000504335 00000 n +0000504399 00000 n +0000504850 00000 n +0000504914 00000 n +0000505341 00000 n +0000505405 00000 n +0000505837 00000 n +0000505901 00000 n +0000506308 00000 n +0000506372 00000 n +0000506790 00000 n +0000506854 00000 n +0000507283 00000 n +0000507347 00000 n +0000507742 00000 n +0000507806 00000 n +0000508201 00000 n +0000508265 00000 n +0000508705 00000 n +0000508769 00000 n +0000509201 00000 n +0000509265 00000 n +0000509699 00000 n +0000509763 00000 n +0000510153 00000 n +0000510217 00000 n +0000510611 00000 n +0000510675 00000 n +0000511082 00000 n +0000511146 00000 n +0000511556 00000 n +0000511620 00000 n +0000512038 00000 n +0000512102 00000 n +0000512557 00000 n +0000512621 00000 n +0000513087 00000 n +0000513151 00000 n +0000513558 00000 n +0000513622 00000 n +0000514029 00000 n +0000514093 00000 n +0000514502 00000 n +0000514566 00000 n +0000514972 00000 n +0000515036 00000 n +0000515453 00000 n +0000515517 00000 n +0000515934 00000 n +0000515998 00000 n +0000516415 00000 n +0000516479 00000 n +0000516872 00000 n +0000516936 00000 n +0000517343 00000 n +0000517407 00000 n +0000517873 00000 n +0000517937 00000 n +0000518344 00000 n +0000518408 00000 n +0000518848 00000 n +0000518912 00000 n +0000519305 00000 n +0000519369 00000 n +0000519787 00000 n +0000519851 00000 n +0000520283 00000 n +0000520347 00000 n +0000520776 00000 n +0000520840 00000 n +0000521235 00000 n +0000521299 00000 n +0000521731 00000 n +0000521795 00000 n +0000522205 00000 n +0000522269 00000 n +0000522675 00000 n +0000522739 00000 n +0000523151 00000 n +0000523215 00000 n +0000523623 00000 n +0000523687 00000 n +0000524083 00000 n +0000524147 00000 n +0000524554 00000 n +0000524618 00000 n +0000525025 00000 n +0000525089 00000 n +0000525507 00000 n +0000525571 00000 n +0000526017 00000 n +0000526081 00000 n +0000526523 00000 n +0000526587 00000 n +0000556201 00000 n +0000556288 00000 n +trailer +<< +/Size 863 +/Root 862 0 R +/Info 861 0 R +/ID [ ] +>> +startxref +556410 +%%EOF diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md index 5a78103ee..de76286b2 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md @@ -4,7 +4,9 @@ ## General -The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts%202024-12-14.pdf) is located in this directory. +The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts.pdf) is located in this directory. + +This variant is suitable for both TCXO and XTAL types of modules. The old XTAL variant has been removed to reduce confusion. ### Note on DIO2, RXEN, TXEN, and RF switching @@ -17,9 +19,13 @@ Several modules require external switching between transmit (Tx) and receive (Rx RXEN is not required to be connected if the selected module already has internal RF switching, or if external RF switching logic is already applied. Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed (marked RF_SW) and has the DIO2-TXEN link internally. +## Making a node based on this variant + +Making your own node based on this design is straightforward. There are various open source and free to use PCB design files available, or you can solder wires directly from a module to the pro-micro. +
- The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. + < Click to expand > The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. | Mfr | Module | TCXO | RF Switch | Notes | | ------------ | ---------------- | ---- | --------- | ------------------------------------- | @@ -34,6 +40,7 @@ Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed | Waveshare | Core1262-HF | yes | Ext | | | Waveshare | LoRa Node Module | yes | Int | | | Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed | +| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h | | AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** | | RF Solutions | RFM95 | No | Int | Untested | | Ebyte | E80-900M2213S | Yes | Int | LR1121 radio | @@ -72,6 +79,10 @@ The Semtech default, the values are (taken from [here](https://github.com/Lora-n
+ < Click to expand > + + + ```cpp .rfswitch = { .enable = LR11XX_SYSTEM_RFSW0_HIGH | LR11XX_SYSTEM_RFSW1_HIGH | LR11XX_SYSTEM_RFSW2_HIGH, diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h index 87342a02f..fee8ee88e 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h @@ -175,6 +175,7 @@ settings. | Waveshare | Core1262-HF | yes | Ext | | | Waveshare | LoRa Node Module | yes | Int | | | Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed | +| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h | | AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** | | RF Solutions | RFM95 | No | Int | Untested | | Ebyte | E80-900M2213S | Yes | Int | LR1121 radio | diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini deleted file mode 100644 index 278f578c5..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini +++ /dev/null @@ -1,12 +0,0 @@ -; Promicro + E22(0)-xxxMM / RA-01SH modules board variant - DIY - without TCXO -[env:nrf52_promicro_diy_xtal] -extends = nrf52840_base -board = promicro-nrf52840 -board_level = extra -build_flags = ${nrf52840_base.build_flags} - -I variants/nrf52840/diy/nrf52_promicro_diy_xtal - -D NRF52_PROMICRO_DIY -build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_xtal> -lib_deps = - ${nrf52840_base.lib_deps} -debug_tool = jlink diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp deleted file mode 100644 index 5869ed1d4..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - Copyright (c) 2014-2015 Arduino LLC. All right reserved. - Copyright (c) 2016 Sandeep Mistry All right reserved. - Copyright (c) 2018, Adafruit Industries (adafruit.com) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "variant.h" -#include "nrf.h" -#include "wiring_constants.h" -#include "wiring_digital.h" - -const uint32_t g_ADigitalPinMap[] = { - // P0 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - - // P1 - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; - -void initVariant() -{ - // 3V3 Power Rail - pinMode(PIN_3V3_EN, OUTPUT); - digitalWrite(PIN_3V3_EN, HIGH); -} diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h deleted file mode 100644 index 6e208e79f..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h +++ /dev/null @@ -1,154 +0,0 @@ -#ifndef _VARIANT_PROMICRO_DIY_ -#define _VARIANT_PROMICRO_DIY_ - -/** Master clock frequency */ -#define VARIANT_MCK (64000000ul) - -// #define USE_LFXO // Board uses 32khz crystal for LF -#define USE_LFRC // Board uses RC for LF - -#define PROMICRO_DIY_XTAL -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "WVariant.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/* -NRF52 PRO MICRO PIN ASSIGNMENT - -| Pin | Function | | Pin | Function | -|-------|------------|---|---------|-------------| -| Gnd | | | vbat | | -| P0.06 | Serial2 RX | | vbat | | -| P0.08 | Serial2 TX | | Gnd | | -| Gnd | | | reset | | -| Gnd | | | ext_vcc | *see 0.13 | -| P0.17 | RXEN | | P0.31 | BATTERY_PIN | -| P0.20 | GPS_RX | | P0.29 | BUSY | -| P0.22 | GPS_TX | | P0.02 | MISO | -| P0.24 | GPS_EN | | P1.15 | MOSI | -| P1.00 | BUTTON_PIN | | P1.13 | CS | -| P0.11 | SCL | | P1.11 | SCK | -| P1.04 | SDA | | P0.10 | DIO1/IRQ | -| P1.06 | Free pin | | P0.09 | RESET | -| | | | | | -| | Mid board | | | Internal | -| P1.01 | Free pin | | 0.15 | LED | -| P1.02 | Free pin | | 0.13 | 3V3_EN | -| P1.07 | Free pin | | | | -*/ - -// Number of pins defined in PinDescription array -#define PINS_COUNT (48) -#define NUM_DIGITAL_PINS (48) -#define NUM_ANALOG_INPUTS (1) -#define NUM_ANALOG_OUTPUTS (0) - -// Pin 13 enables 3.3V periphery. If the Lora module is on this pin, then it should stay enabled at all times. -#define PIN_3V3_EN (0 + 13) // P0.13 - -// Analog pins -#define BATTERY_PIN (0 + 31) // P0.31 Battery ADC -#define ADC_CHANNEL ADC1_GPIO4_CHANNEL -#define ADC_RESOLUTION 14 -#define BATTERY_SENSE_RESOLUTION_BITS 12 -#define BATTERY_SENSE_RESOLUTION 4096.0 -// Definition of milliVolt per LSB => 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096 -#define VBAT_MV_PER_LSB (0.73242188F) -// Voltage divider value => 1.5M + 1M voltage divider on VBAT = (1.5M / (1M + 1.5M)) -#define VBAT_DIVIDER (0.6F) -// Compensation factor for the VBAT divider -#define VBAT_DIVIDER_COMP (1.73) -// Fixed calculation of milliVolt from compensation value -#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) -#undef AREF_VOLTAGE -#define AREF_VOLTAGE 3.0 -#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 -#define ADC_MULTIPLIER VBAT_DIVIDER_COMP // REAL_VBAT_MV_PER_LSB -#define VBAT_RAW_TO_SCALED(x) (REAL_VBAT_MV_PER_LSB * x) - -// WIRE IC AND IIC PINS -#define WIRE_INTERFACES_COUNT 1 - -#define PIN_WIRE_SDA (32 + 4) // P1.04 -#define PIN_WIRE_SCL (0 + 11) // P0.11 - -// LED -#define PIN_LED1 (0 + 15) // P0.15 -#define LED_BUILTIN PIN_LED1 -// Actually red -#define LED_BLUE PIN_LED1 -#define LED_STATE_ON 1 // State when LED is lit - -// Button -#define BUTTON_PIN (32 + 0) // P1.00 - -// GPS -#define PIN_GPS_TX (0 + 22) // P0.22 -#define PIN_GPS_RX (0 + 20) // P0.20 - -#define PIN_GPS_EN (0 + 24) // P0.24 -#define GPS_UBLOX -// define GPS_DEBUG - -// UART interfaces -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX - -#define PIN_SERIAL2_RX (0 + 6) // P0.06 -#define PIN_SERIAL2_TX (0 + 8) // P0.08 - -// Serial interfaces -#define SPI_INTERFACES_COUNT 1 - -#define PIN_SPI_MISO (0 + 2) // P0.02 -#define PIN_SPI_MOSI (32 + 15) // P1.15 -#define PIN_SPI_SCK (32 + 11) // P1.11 - -// LORA MODULES -#define USE_LLCC68 -#define USE_SX1262 -// #define USE_RF95 -#define USE_SX1268 - -// LORA CONFIG -#define SX126X_CS (32 + 13) // P1.13 FIXME - we really should define LORA_CS instead -#define SX126X_DIO1 (0 + 10) // P0.10 IRQ -#define SX126X_DIO2_AS_RF_SWITCH // Note for E22 modules: DIO2 is not attached internally to TXEN for automatic TX/RX switching, - // so it needs connecting externally if it is used in this way -#define SX126X_BUSY (0 + 29) // P0.29 -#define SX126X_RESET (0 + 9) // P0.09 -#define SX126X_RXEN (0 + 17) // P0.17 -#define SX126X_TXEN RADIOLIB_NC // Assuming that DIO2 is connected to TXEN pin. If not, TXEN must be connected. - -/* -On the SX1262, DIO3 sets the voltage for an external TCXO, if one is present. If one is not present, then this should not be used. - -Ebyte -e22-900mm22s has no TCXO -e22-900m22s has TCXO -e220-900mm22s has no TCXO, works with/without this definition, looks like DIO3 not connected at all - -AI-thinker -RA-01SH does not have TCXO - -Waveshare -Core1262 has TCXO - -*/ -// #define SX126X_DIO3_TCXO_VOLTAGE 1.8 - -#ifdef __cplusplus -} -#endif - -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#endif \ No newline at end of file From beaebda4debf07c845565697de8a7740408083e3 Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Mon, 10 Nov 2025 15:08:04 +0000 Subject: [PATCH 115/286] stm32wl: Wrap and remove some functions that pull in large amounts of code/data to claw back even more flash space (#8609) --- arch/stm32/stm32.ini | 3 +++ src/platform/stm32wl/main-stm32wl.cpp | 28 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/arch/stm32/stm32.ini b/arch/stm32/stm32.ini index 8b7d256b3..7732533c9 100644 --- a/arch/stm32/stm32.ini +++ b/arch/stm32/stm32.ini @@ -37,6 +37,9 @@ build_flags = -DRADIOLIB_EXCLUDE_LR11X0=1 -DHAL_DAC_MODULE_ONLY -DHAL_RNG_MODULE_ENABLED + -Wl,--wrap=__assert_func + -Wl,--wrap=strerror + -Wl,--wrap=_tzset_unlocked_r build_src_filter = ${arduino_base.build_src_filter} - - - - - - - - - - - - - - diff --git a/src/platform/stm32wl/main-stm32wl.cpp b/src/platform/stm32wl/main-stm32wl.cpp index 3eddbb3cf..e841f8f29 100644 --- a/src/platform/stm32wl/main-stm32wl.cpp +++ b/src/platform/stm32wl/main-stm32wl.cpp @@ -26,3 +26,31 @@ void getMacAddr(uint8_t *dmac) } void cpuDeepSleep(uint32_t msecToWake) {} + +// Hacks to force more code and data out. + +// By default __assert_func uses fiprintf which pulls in stdio. +extern "C" void __wrap___assert_func(const char *, int, const char *, const char *) +{ + while (true) + ; + return; +} + +// By default strerror has a lot of strings we probably don't use. Make it return an empty string instead. +char empty = 0; +extern "C" char *__wrap_strerror(int) +{ + return ∅ +} + +#ifdef MESHTASTIC_EXCLUDE_TZ +struct _reent; + +// Even if you don't use timezones, mktime will try to set the timezone anyway with _tzset_unlocked(), which pulls in scanf and +// friends. The timezone is initialized to UTC by default. +extern "C" void __wrap__tzset_unlocked_r(struct _reent *reent_ptr) +{ + return; +} +#endif \ No newline at end of file From 7d2744fae06062d4a4518383d66f297947e4dc96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Mon, 10 Nov 2025 16:16:24 +0100 Subject: [PATCH 116/286] Change RadioLib to commit zip til 7.4.1+ is released fixes regression for SX127x chips per @GUVWAF --- platformio.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 09c924f47..f9e2dd898 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,7 +115,8 @@ lib_deps = [radiolib_base] lib_deps = # renovate: datasource=custom.pio depName=RadioLib packageName=jgromes/library/RadioLib - jgromes/RadioLib@7.4.0 + # jgromes/RadioLib@7.4.0 + https://github.com/jgromes/RadioLib/archive/536c7267362e2c1345be7054ba45e503252975ff.zip [device-ui_base] lib_deps = From e9590003f4709ca83e0586d59050483587ba194b Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 10 Nov 2025 11:58:39 -0600 Subject: [PATCH 117/286] Only call stopNow if we're nagging (#8601) --- src/input/InputBroker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/InputBroker.cpp b/src/input/InputBroker.cpp index 7e3ff3de9..0aa78e2b8 100644 --- a/src/input/InputBroker.cpp +++ b/src/input/InputBroker.cpp @@ -52,7 +52,7 @@ int InputBroker::handleInputEvent(const InputEvent *event) powerFSM.trigger(EVENT_INPUT); // todo: not every input should wake, like long hold release if (event && event->inputEvent != INPUT_BROKER_NONE && externalNotificationModule && - moduleConfig.external_notification.enabled) { + moduleConfig.external_notification.enabled && externalNotificationModule->nagging()) { externalNotificationModule->stopNow(); } From 4118e1c0f6f41e9fda52f9eb6a84514af8bbf2ed Mon Sep 17 00:00:00 2001 From: "Jason B. Cox" Date: Mon, 10 Nov 2025 18:19:15 -0800 Subject: [PATCH 118/286] Cleanup unnecessary global dereferencing in CryptoEngine (#8611) Co-authored-by: Ben Meadors --- src/mesh/CryptoEngine.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index 82d0a9f57..9ca16878d 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -92,10 +92,10 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, meshtas LOG_DEBUG("Node %d or their public_key not found", toNode); return false; } - if (!crypto->setDHPublicKey(remotePublic.bytes)) { + if (!setDHPublicKey(remotePublic.bytes)) { return false; } - crypto->hash(shared_key, 32); + hash(shared_key, 32); initNonce(fromNode, packetNum, extraNonceTmp); // Calculate the shared secret with the destination node and encrypt @@ -134,10 +134,10 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, meshtastic_UserLite_publ } // Calculate the shared secret with the sending node and decrypt - if (!crypto->setDHPublicKey(remotePublic.bytes)) { + if (!setDHPublicKey(remotePublic.bytes)) { return false; } - crypto->hash(shared_key, 32); + hash(shared_key, 32); initNonce(fromNode, packetNum, extraNonce); printBytes("Attempt decrypt with nonce: ", nonce, 13); From 7212fb9caa15119c500edb3a074a5bc6b956605d Mon Sep 17 00:00:00 2001 From: Andrik45719 Date: Tue, 11 Nov 2025 18:00:08 +0200 Subject: [PATCH 119/286] Fix null pointer dereference in radio chip region check (#8613) --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index c65482292..8fec62953 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1401,7 +1401,7 @@ void setup() #endif // check if the radio chip matches the selected region - if ((config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_LORA_24) && (!rIf->wideLora())) { + if ((config.lora.region == meshtastic_Config_LoRaConfig_RegionCode_LORA_24) && rIf && (!rIf->wideLora())) { LOG_WARN("LoRa chip does not support 2.4GHz. Revert to unset"); config.lora.region = meshtastic_Config_LoRaConfig_RegionCode_UNSET; nodeDB->saveToDisk(SEGMENT_CONFIG); From 4df6627ab153ef61a391fce92af00853e69920ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 05:33:31 -0600 Subject: [PATCH 120/286] Upgrade trunk (#8606) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 73baa5345..1fd8790f2 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -8,15 +8,15 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.490 - - renovate@41.173.1 + - checkov@3.2.492 + - renovate@42.5.4 - prettier@3.6.2 - trufflehog@3.90.13 - yamllint@1.37.1 - bandit@1.8.6 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.3 + - ruff@0.14.4 - isort@7.0.0 - markdownlint@0.45.0 - oxipng@9.1.5 @@ -26,7 +26,7 @@ lint: - hadolint@2.14.0 - shfmt@3.6.0 - shellcheck@0.11.0 - - black@25.9.0 + - black@25.11.0 - git-diff-check - gitleaks@8.29.0 - clang-format@16.0.3 From 0aa11d810c06ed87e70efc6bde1b4cc5f6d8d463 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 13 Nov 2025 11:20:17 -0600 Subject: [PATCH 121/286] Clean up GPS toggle logging Removed redundant log warnings for GPS toggle events. --- src/modules/SystemCommandsModule.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/modules/SystemCommandsModule.cpp b/src/modules/SystemCommandsModule.cpp index 74b9678f4..dc5d8b41f 100644 --- a/src/modules/SystemCommandsModule.cpp +++ b/src/modules/SystemCommandsModule.cpp @@ -85,10 +85,8 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event) switch (event->inputEvent) { // GPS case INPUT_BROKER_GPS_TOGGLE: - LOG_WARN("GPS Toggle"); #if !MESHTASTIC_EXCLUDE_GPS if (gps) { - LOG_WARN("GPS Toggle2"); if (config.position.gps_mode == meshtastic_Config_PositionConfig_GpsMode_ENABLED && config.position.fixed_position == false) { nodeDB->clearLocalPosition(); From 034aaa376a8939dde47095e7697ce85d60cb34da Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 06:09:25 -0600 Subject: [PATCH 122/286] Automated version bumps (#8626) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 61ecf9fb5..b59bb6202 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.15 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14 diff --git a/debian/changelog b/debian/changelog index a387cc3c5..437e1645b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.15.0) unstable; urgency=medium + + * Version 2.7.15 + + -- GitHub Actions Thu, 13 Nov 2025 12:31:57 +0000 + meshtasticd (2.7.14.0) unstable; urgency=medium * Version 2.7.14 diff --git a/version.properties b/version.properties index fe1a5b31b..165f476df 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 14 +build = 15 From 4284fc2aecf2e5ce549bce3b4d71e35e26a79a0a Mon Sep 17 00:00:00 2001 From: Dane Evans Date: Sun, 16 Nov 2025 12:49:46 +1100 Subject: [PATCH 123/286] Feat/6704 neighbor info on demand (#8523) * full thing. works * works * minimal changes * roll back previous changes, move to using the alloc() overrride * clean up comments * format * run clang-format manually. Trunk may be the absolute worst formatter in existance * format on WSL to fix trunks awfulness * add a 3 minute cooldown to prevent messages going back and forth * add ignoring the dummy neighbor. * fix or. * fix spelling, increase logging --------- Co-authored-by: Ben Meadors --- src/modules/NeighborInfoModule.cpp | 67 +++++++++++++++++++++++------- src/modules/NeighborInfoModule.h | 7 ++++ 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/modules/NeighborInfoModule.cpp b/src/modules/NeighborInfoModule.cpp index 97dc17001..936a7b44a 100644 --- a/src/modules/NeighborInfoModule.cpp +++ b/src/modules/NeighborInfoModule.cpp @@ -34,7 +34,8 @@ void NeighborInfoModule::printNodeDBNeighbors() } } -/* Send our initial owner announcement 35 seconds after we start (to give network time to setup) */ +/* Send our initial owner announcement 35 seconds after we start (to give + * network time to setup) */ NeighborInfoModule::NeighborInfoModule() : ProtobufModule("neighborinfo", meshtastic_PortNum_NEIGHBORINFO_APP, &meshtastic_NeighborInfo_msg), concurrency::OSThread("NeighborInfo") @@ -53,8 +54,8 @@ NeighborInfoModule::NeighborInfoModule() } /* -Collect neighbor info from the nodeDB's history, capping at a maximum number of entries and max time -Assumes that the neighborInfo packet has been allocated +Collect neighbor info from the nodeDB's history, capping at a maximum number of +entries and max time Assumes that the neighborInfo packet has been allocated @returns the number of entries collected */ uint32_t NeighborInfoModule::collectNeighborInfo(meshtastic_NeighborInfo *neighborInfo) @@ -71,8 +72,8 @@ uint32_t NeighborInfoModule::collectNeighborInfo(meshtastic_NeighborInfo *neighb if ((neighborInfo->neighbors_count < MAX_NUM_NEIGHBORS) && (nbr.node_id != my_node_id)) { neighborInfo->neighbors[neighborInfo->neighbors_count].node_id = nbr.node_id; neighborInfo->neighbors[neighborInfo->neighbors_count].snr = nbr.snr; - // Note: we don't set the last_rx_time and node_broadcast_intervals_secs here, because we don't want to send this over - // the mesh + // Note: we don't set the last_rx_time and node_broadcast_intervals_secs + // here, because we don't want to send this over the mesh neighborInfo->neighbors_count++; } } @@ -88,8 +89,9 @@ void NeighborInfoModule::cleanUpNeighbors() uint32_t now = getTime(); NodeNum my_node_id = nodeDB->getNodeNum(); for (auto it = neighbors.rbegin(); it != neighbors.rend();) { - // We will remove a neighbor if we haven't heard from them in twice the broadcast interval - // cannot use isWithinTimespanMs() as it->last_rx_time is seconds since 1970 + // We will remove a neighbor if we haven't heard from them in twice the + // broadcast interval cannot use isWithinTimespanMs() as it->last_rx_time is + // seconds since 1970 if ((now - it->last_rx_time > it->node_broadcast_interval_secs * 2) && (it->node_id != my_node_id)) { LOG_DEBUG("Remove neighbor with node ID 0x%x", it->node_id); it = std::vector::reverse_iterator( @@ -132,25 +134,55 @@ int32_t NeighborInfoModule::runOnce() return Default::getConfiguredOrDefaultMs(moduleConfig.neighbor_info.update_interval, default_neighbor_info_broadcast_secs); } +meshtastic_MeshPacket *NeighborInfoModule::allocReply() +{ + LOG_INFO("NeighborInfoRequested."); + if (lastSentReply && Throttle::isWithinTimespanMs(lastSentReply, 3 * 60 * 1000)) { + LOG_DEBUG("Skip Neighbors reply since we sent a reply <3min ago"); + ignoreRequest = true; // Mark it as ignored for MeshModule + return nullptr; + } + + meshtastic_NeighborInfo neighborInfo = meshtastic_NeighborInfo_init_zero; + collectNeighborInfo(&neighborInfo); + + meshtastic_MeshPacket *reply = allocDataProtobuf(neighborInfo); + + if (reply) { + lastSentReply = millis(); // Track when we sent this reply + } + return reply; +} + /* Collect a received neighbor info packet from another node Pass it to an upper client; do not persist this data on the mesh */ bool NeighborInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_NeighborInfo *np) { + LOG_DEBUG("NeighborInfo: handleReceivedProtobuf"); if (np) { printNeighborInfo("RECEIVED", np); - updateNeighbors(mp, np); + // Ignore dummy/interceptable packets: single neighbor with nodeId 0 and snr 0 + if (np->neighbors_count != 1 || np->neighbors[0].node_id != 0 || np->neighbors[0].snr != 0.0f) { + LOG_DEBUG(" Updating neighbours"); + updateNeighbors(mp, np); + } else { + LOG_DEBUG(" Ignoring dummy neighbor info packet (single neighbor with nodeId 0, snr 0)"); + } } else if (mp.hop_start != 0 && mp.hop_start == mp.hop_limit) { + LOG_DEBUG("Get or create neighbor: %u with snr %f", mp.from, mp.rx_snr); // If the hopLimit is the same as hopStart, then it is a neighbor - getOrCreateNeighbor(mp.from, mp.from, 0, mp.rx_snr); // Set the broadcast interval to 0, as we don't know it + getOrCreateNeighbor(mp.from, mp.from, 0, + mp.rx_snr); // Set the broadcast interval to 0, as we don't know it } // Allow others to handle this packet return false; } /* -Copy the content of a current NeighborInfo packet into a new one and update the last_sent_by_id to our NodeNum +Copy the content of a current NeighborInfo packet into a new one and update the +last_sent_by_id to our NodeNum */ void NeighborInfoModule::alterReceivedProtobuf(meshtastic_MeshPacket &p, meshtastic_NeighborInfo *n) { @@ -168,8 +200,10 @@ void NeighborInfoModule::resetNeighbors() void NeighborInfoModule::updateNeighbors(const meshtastic_MeshPacket &mp, const meshtastic_NeighborInfo *np) { - // The last sent ID will be 0 if the packet is from the phone, which we don't count as - // an edge. So we assume that if it's zero, then this packet is from our node. + LOG_DEBUG("updateNeighbors"); + // The last sent ID will be 0 if the packet is from the phone, which we don't + // count as an edge. So we assume that if it's zero, then this packet is from + // our node. if (mp.which_payload_variant == meshtastic_MeshPacket_decoded_tag && mp.from) { getOrCreateNeighbor(mp.from, np->last_sent_by_id, np->node_broadcast_interval_secs, mp.rx_snr); } @@ -188,7 +222,8 @@ meshtastic_Neighbor *NeighborInfoModule::getOrCreateNeighbor(NodeNum originalSen // if found, update it neighbors[i].snr = snr; neighbors[i].last_rx_time = getTime(); - // Only if this is the original sender, the broadcast interval corresponds to it + // Only if this is the original sender, the broadcast interval corresponds + // to it if (originalSender == n && node_broadcast_interval_secs != 0) neighbors[i].node_broadcast_interval_secs = node_broadcast_interval_secs; return &neighbors[i]; @@ -200,10 +235,12 @@ meshtastic_Neighbor *NeighborInfoModule::getOrCreateNeighbor(NodeNum originalSen new_nbr.node_id = n; new_nbr.snr = snr; new_nbr.last_rx_time = getTime(); - // Only if this is the original sender, the broadcast interval corresponds to it + // Only if this is the original sender, the broadcast interval corresponds to + // it if (originalSender == n && node_broadcast_interval_secs != 0) new_nbr.node_broadcast_interval_secs = node_broadcast_interval_secs; - else // Assume the same broadcast interval as us for the neighbor if we don't know it + else // Assume the same broadcast interval as us for the neighbor if we don't + // know it new_nbr.node_broadcast_interval_secs = moduleConfig.neighbor_info.update_interval; if (neighbors.size() < MAX_NUM_NEIGHBORS) { diff --git a/src/modules/NeighborInfoModule.h b/src/modules/NeighborInfoModule.h index aa76a2187..abb530329 100644 --- a/src/modules/NeighborInfoModule.h +++ b/src/modules/NeighborInfoModule.h @@ -28,6 +28,10 @@ class NeighborInfoModule : public ProtobufModule, priva */ virtual bool handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_NeighborInfo *nb) override; + /* Messages can be received that have the want_response bit set. If set, this callback will be invoked + * so that subclasses can (optionally) send a response back to the original sender. */ + virtual meshtastic_MeshPacket *allocReply() override; + /* * Collect neighbor info from the nodeDB's history, capping at a maximum number of entries and max time * @return the number of entries collected @@ -66,5 +70,8 @@ class NeighborInfoModule : public ProtobufModule, priva /* These are for debugging only */ void printNeighborInfo(const char *header, const meshtastic_NeighborInfo *np); void printNodeDBNeighbors(); + + private: + uint32_t lastSentReply = 0; // Last time we sent a position reply (used for reply throttling only) }; extern NeighborInfoModule *neighborInfoModule; \ No newline at end of file From 955347bf50b13168de188628d1003f1ed3699e90 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 16 Nov 2025 08:42:51 -0600 Subject: [PATCH 124/286] Remove fixed scaling in Digital Clock (#8620) * Update digital clock draw to auto scale to correct size; no more fixed scaling * Static scale calcuation to improve performance * Update src/graphics/draw/ClockRenderer.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Back off for width or height exceeds * Fixes for some calcuations --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/draw/ClockRenderer.cpp | 107 ++++++++++++++++------------ src/graphics/draw/ClockRenderer.h | 1 - 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/src/graphics/draw/ClockRenderer.cpp b/src/graphics/draw/ClockRenderer.cpp index 97417571b..cc6a70957 100644 --- a/src/graphics/draw/ClockRenderer.cpp +++ b/src/graphics/draw/ClockRenderer.cpp @@ -194,17 +194,12 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 graphics::drawCommonHeader(display, x, y, titleStr, true, true); int line = 0; -#ifdef T_WATCH_S3 - if (nimbleBluetooth && nimbleBluetooth->isConnected()) { - graphics::ClockRenderer::drawBluetoothConnectedIcon(display, display->getWidth() - 18, display->getHeight() - 14); - } -#endif - uint32_t rtc_sec = getValidTime(RTCQuality::RTCQualityDevice, true); // Display local timezone char timeString[16]; int hour = 0; int minute = 0; int second = 0; + if (rtc_sec > 0) { long hms = rtc_sec % SEC_PER_DAY; hms = (hms + SEC_PER_DAY) % SEC_PER_DAY; @@ -215,11 +210,11 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 } bool isPM = hour >= 12; - // hour = hour > 12 ? hour - 12 : hour; if (config.display.use_12h_clock) { hour %= 12; - if (hour == 0) + if (hour == 0) { hour = 12; + } snprintf(timeString, sizeof(timeString), "%d:%02d", hour, minute); } else { snprintf(timeString, sizeof(timeString), "%02d:%02d", hour, minute); @@ -229,24 +224,56 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 char secondString[8]; snprintf(secondString, sizeof(secondString), "%02d", second); -#ifdef T_WATCH_S3 - float scale = 1.5; -#elif defined(CHATTER_2) - float scale = 1.1; -#else - float scale = 0.75; - if (isHighResolution) { - scale = 1.5; - } -#endif + static bool scaleInitialized = false; + static float scale = 0.75f; + static float segmentWidth = SEGMENT_WIDTH * 0.75f; + static float segmentHeight = SEGMENT_HEIGHT * 0.75f; - uint16_t segmentWidth = SEGMENT_WIDTH * scale; - uint16_t segmentHeight = SEGMENT_HEIGHT * scale; + if (!scaleInitialized) { + float screenwidth_target_ratio = 0.80f; // Target 80% of display width (adjustable) + float max_scale = 3.5f; // Safety limit to avoid runaway scaling + float step = 0.05f; // Step increment per iteration + + float target_width = display->getWidth() * screenwidth_target_ratio; + float target_height = + display->getHeight() - + (isHighResolution + ? 46 + : 33); // Be careful adjusting this number, we have to account for header and the text under the time + + float calculated_width_size = 0.0f; + float calculated_height_size = 0.0f; + + while (true) { + segmentWidth = SEGMENT_WIDTH * scale; + segmentHeight = SEGMENT_HEIGHT * scale; + + calculated_width_size = segmentHeight + ((segmentWidth + (segmentHeight * 2) + 4) * 4); + calculated_height_size = segmentHeight + ((segmentHeight + (segmentHeight * 2) + 4) * 2); + + if (calculated_width_size >= target_width || calculated_height_size >= target_height || scale >= max_scale) { + break; + } + + scale += step; + } + + // If we overshot width, back off one step and recompute segment sizes + if (calculated_width_size > target_width || calculated_height_size > target_height) { + scale -= step; + segmentWidth = SEGMENT_WIDTH * scale; + segmentHeight = SEGMENT_HEIGHT * scale; + } + + scaleInitialized = true; + } + + size_t len = strlen(timeString); // calculate hours:minutes string width - uint16_t timeStringWidth = strlen(timeString) * 5; + uint16_t timeStringWidth = len * 5; // base spacing between characters - for (uint8_t i = 0; i < strlen(timeString); i++) { + for (size_t i = 0; i < len; i++) { char character = timeString[i]; if (character == ':') { @@ -257,19 +284,21 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 } uint16_t hourMinuteTextX = (display->getWidth() / 2) - (timeStringWidth / 2); - uint16_t startingHourMinuteTextX = hourMinuteTextX; - uint16_t hourMinuteTextY = (display->getHeight() / 2) - (((segmentWidth * 2) + (segmentHeight * 3) + 8) / 2); + uint16_t hourMinuteTextY = (display->getHeight() / 2) - (((segmentWidth * 2) + (segmentHeight * 3) + 8) / 2) + 2; // iterate over characters in hours:minutes string and draw segmented characters - for (uint8_t i = 0; i < strlen(timeString); i++) { + for (size_t i = 0; i < len; i++) { char character = timeString[i]; if (character == ':') { drawSegmentedDisplayColon(display, hourMinuteTextX, hourMinuteTextY, scale); hourMinuteTextX += segmentHeight + 6; + if (scale >= 2.0f) { + hourMinuteTextX += (uint16_t)(4.5f * scale); + } } else { drawSegmentedDisplayCharacter(display, hourMinuteTextX, hourMinuteTextY, character - '0', scale); @@ -279,38 +308,29 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 hourMinuteTextX += 5; } - // draw seconds string + // draw seconds string + AM/PM display->setFont(FONT_SMALL); int xOffset = (isHighResolution) ? 0 : -1; if (hour >= 10) { xOffset += (isHighResolution) ? 32 : 18; } - int yOffset = (isHighResolution) ? 3 : 1; -#ifdef SENSECAP_INDICATOR - yOffset -= 3; -#endif -#ifdef T_DECK - yOffset -= 5; -#endif + if (config.display.use_12h_clock) { - display->drawString(startingHourMinuteTextX + xOffset, (display->getHeight() - hourMinuteTextY) - yOffset - 2, - isPM ? "pm" : "am"); + display->drawString(startingHourMinuteTextX + xOffset, (display->getHeight() - hourMinuteTextY) - 1, isPM ? "pm" : "am"); } #ifndef USE_EINK xOffset = (isHighResolution) ? 18 : 10; - display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - yOffset, + if (scale >= 2.0f) { + xOffset -= (int)(4.5f * scale); + } + display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - 1, secondString); #endif graphics::drawCommonFooter(display, x, y); } -void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y) -{ - display->drawFastImage(x, y, 18, 14, bluetoothConnectedIcon); -} - // Draw an analog clock void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) { @@ -321,11 +341,6 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 graphics::drawCommonHeader(display, x, y, titleStr, true, true); int line = 0; -#ifdef T_WATCH_S3 - if (nimbleBluetooth && nimbleBluetooth->isConnected()) { - drawBluetoothConnectedIcon(display, display->getWidth() - 18, display->getHeight() - 14); - } -#endif // clock face center coordinates int16_t centerX = display->getWidth() / 2; int16_t centerY = display->getHeight() / 2; diff --git a/src/graphics/draw/ClockRenderer.h b/src/graphics/draw/ClockRenderer.h index c8ba62868..eace26cf5 100644 --- a/src/graphics/draw/ClockRenderer.h +++ b/src/graphics/draw/ClockRenderer.h @@ -24,7 +24,6 @@ void drawVerticalSegment(OLEDDisplay *display, int x, int y, int width, int heig // UI elements for clock displays // void drawWatchFaceToggleButton(OLEDDisplay *display, int16_t x, int16_t y, bool digitalMode = true, float scale = 1); -void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y); } // namespace ClockRenderer From 84bb1e33a6a857f342ebd8bfb97089a5144c5a60 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 16 Nov 2025 14:18:16 -0600 Subject: [PATCH 125/286] Add code for preserving favorites, also move to Home screen before reseting (#8647) --- src/graphics/draw/MenuHandler.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index ddd4231f9..3162f07d3 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -785,17 +785,24 @@ void menuHandler::nodeNameLengthMenu() void menuHandler::resetNodeDBMenu() { - static const char *optionsArray[] = {"Back", "Confirm"}; + static const char *optionsArray[] = {"Back", "Reset All", "Preserve Favorites"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Confirm Reset NodeDB"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; + bannerOptions.optionsCount = 3; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { + if (selected == 1 || selected == 2) { disableBluetooth(); + screen->setFrames(Screen::FOCUS_DEFAULT); + } + if (selected == 1) { LOG_INFO("Initiate node-db reset"); nodeDB->resetNodes(); rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } else if (selected == 2) { + LOG_INFO("Initiate node-db reset but keeping favorites"); + nodeDB->resetNodes(1); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } }; screen->showOverlayBanner(bannerOptions); From 6e3be132f28c7601f5b9869d6917b2dec775ff75 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 16 Nov 2025 14:20:17 -0600 Subject: [PATCH 126/286] Reset the calibration data back to 0 when doing a compass calibration --- src/motion/BMX160Sensor.cpp | 3 ++- src/motion/ICM20948Sensor.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/motion/BMX160Sensor.cpp b/src/motion/BMX160Sensor.cpp index 003ee850c..56f794306 100755 --- a/src/motion/BMX160Sensor.cpp +++ b/src/motion/BMX160Sensor.cpp @@ -116,6 +116,7 @@ void BMX160Sensor::calibrate(uint16_t forSeconds) { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) LOG_DEBUG("BMX160 calibration started for %is", forSeconds); + highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; doCalibration = true; uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided @@ -127,4 +128,4 @@ void BMX160Sensor::calibrate(uint16_t forSeconds) #endif -#endif \ No newline at end of file +#endif diff --git a/src/motion/ICM20948Sensor.cpp b/src/motion/ICM20948Sensor.cpp index 76ba8e8cf..ebb0f7b66 100755 --- a/src/motion/ICM20948Sensor.cpp +++ b/src/motion/ICM20948Sensor.cpp @@ -157,6 +157,7 @@ void ICM20948Sensor::calibrate(uint16_t forSeconds) { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN LOG_DEBUG("BMX160 calibration started for %is", forSeconds); + highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; doCalibration = true; uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided @@ -295,4 +296,4 @@ bool ICM20948Singleton::setWakeOnMotion() return true; } -#endif \ No newline at end of file +#endif From df063f40ff85a3fbd916e26fbbe4ef14b88d4336 Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Thu, 30 Oct 2025 22:35:56 +0000 Subject: [PATCH 127/286] Try to look for a config file based on the HAT vendor/product for autoconfig --- src/platform/portduino/PortduinoGlue.cpp | 55 +++++++++++++++++++++--- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index 6b3476b98..5d323d107 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -146,6 +146,20 @@ void getMacAddr(uint8_t *dmac) } } +std::string cleanupNameForAutoconf(std::string name) +{ + // Convert spaces -> dashes, lowercase + + std::transform(name.begin(), name.end(), name.begin(), [](unsigned char c) { + if (c == ' ') { + return '-'; + } + return (char)std::tolower(c); + }); + + return name; +} + /** apps run under portduino can optionally define a portduinoSetup() to * use portduino specific init code (such as gpioBind) to setup portduino on their host machine, * before running 'arduino' code. @@ -218,6 +232,11 @@ void portduinoSetup() // If LoRa `Module: auto` (default in config.yaml), // attempt to auto config based on Product Strings if (portduino_config.lora_module == use_autoconf) { + bool found_hat = false; + bool found_rak_eeprom = false; + bool found_ch341 = false; + + char hat_vendor[96] = {0}; char autoconf_product[96] = {0}; // Try CH341 try { @@ -227,21 +246,32 @@ void portduinoSetup() ch341Hal->getProductString(autoconf_product, 95); delete ch341Hal; std::cout << "autoconf: Found CH341 device " << autoconf_product << std::endl; + + found_ch341 = true; } catch (...) { std::cout << "autoconf: Could not locate CH341 device" << std::endl; } // Try Pi HAT+ if (strlen(autoconf_product) < 6) { std::cout << "autoconf: Looking for Pi HAT+..." << std::endl; + if (access("/proc/device-tree/hat/vendor", R_OK) == 0) { + std::ifstream hatVendorFile("/proc/device-tree/hat/vendor"); + if (hatVendorFile.is_open()) { + hatVendorFile.read(hat_vendor, 95); + hatVendorFile.close(); + } + } if (access("/proc/device-tree/hat/product", R_OK) == 0) { std::ifstream hatProductFile("/proc/device-tree/hat/product"); if (hatProductFile.is_open()) { hatProductFile.read(autoconf_product, 95); hatProductFile.close(); } - std::cout << "autoconf: Found Pi HAT+ " << autoconf_product << " at /proc/device-tree/hat/product" << std::endl; + std::cout << "autoconf: Found Pi HAT+ " << hat_vendor << " " << autoconf_product << " at /proc/device-tree/hat" + << std::endl; + found_hat = true; } else { - std::cout << "autoconf: Could not locate Pi HAT+ at /proc/device-tree/hat/product" << std::endl; + std::cout << "autoconf: Could not locate Pi HAT+ at /proc/device-tree/hat" << std::endl; } } // attempt to load autoconf data from an EEPROM on 0x50 @@ -297,6 +327,7 @@ void portduinoSetup() autoconf_product[0] = 0x0; } else { std::cout << "autoconf: Found eeprom data " << autoconf_raw << std::endl; + found_rak_eeprom = true; if (mac_start != nullptr) { std::cout << "autoconf: Found mac data " << mac_start << std::endl; if (strlen(mac_start) == 12) @@ -325,12 +356,24 @@ void portduinoSetup() if (strlen(autoconf_product) > 0) { // From configProducts map in PortduinoGlue.h std::string product_config = ""; - try { + + if (configProducts.find(autoconf_product) != configProducts.end()) { product_config = configProducts.at(autoconf_product); - } catch (std::out_of_range &e) { - std::cerr << "autoconf: Unable to find config for " << autoconf_product << std::endl; - exit(EXIT_FAILURE); + } else { + if (found_hat) { + product_config = + cleanupNameForAutoconf("lora-hat-" + std::string(hat_vendor) + "-" + autoconf_product + ".yaml"); + } else if (found_ch341) { + product_config = cleanupNameForAutoconf("lora-usb-" + std::string(autoconf_product) + ".yaml"); + } + + if (!access((portduino_config.available_directory + product_config).c_str(), R_OK)) { + std::cerr << "autoconf: Unable to find config for " << autoconf_product << "(tried " << product_config << ")" + << std::endl; + exit(EXIT_FAILURE); + } } + if (loadConfig((portduino_config.available_directory + product_config).c_str())) { std::cout << "autoconf: Using " << product_config << " as config file for " << autoconf_product << std::endl; } else { From b7bdcbe43e3cdcf94a5a64252237d6a9f75c5dfb Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Mon, 10 Nov 2025 13:38:20 +0000 Subject: [PATCH 128/286] Address review comments --- src/platform/portduino/PortduinoGlue.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index 5d323d107..10b3a7fe4 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -367,7 +367,12 @@ void portduinoSetup() product_config = cleanupNameForAutoconf("lora-usb-" + std::string(autoconf_product) + ".yaml"); } - if (!access((portduino_config.available_directory + product_config).c_str(), R_OK)) { + // Don't try to automatically find config for a device with RAK eeprom. + if (found_rak_eeprom) { + std::cerr << "autoconf: Found unknown RAK product " << autoconf_product << std::endl; + exit(EXIT_FAILURE); + } + if (access((portduino_config.available_directory + product_config).c_str(), R_OK) != 0) { std::cerr << "autoconf: Unable to find config for " << autoconf_product << "(tried " << product_config << ")" << std::endl; exit(EXIT_FAILURE); From 43e0c354668c76492c504256d90c3d656aa6c7ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 20:00:05 -0600 Subject: [PATCH 129/286] chore(deps): update dorny/test-reporter action to v2.2.0 (#8637) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/test_native.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index 3f3d02e4c..591d52bd0 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -143,7 +143,7 @@ jobs: merge-multiple: true - name: Test Report - uses: dorny/test-reporter@v2.1.1 + uses: dorny/test-reporter@v2.2.0 with: name: PlatformIO Tests path: testreport.xml From 17cd83085bdb8c548a3487085d3858253752d834 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 16 Nov 2025 22:05:24 -0600 Subject: [PATCH 130/286] Remove gating for Display Options (#8651) --- src/graphics/draw/MenuHandler.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 3162f07d3..1ac75c4d9 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -581,11 +581,8 @@ void menuHandler::systemBaseMenu() optionsArray[options] = "Notifications"; optionsEnumArray[options++] = Notifications; -#if defined(ST7789_CS) || defined(ST7796_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || \ - defined(USE_SH1107) || defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || HAS_TFT optionsArray[options] = "Display Options"; optionsEnumArray[options++] = ScreenOptions; -#endif #if defined(M5STACK_UNITC6L) optionsArray[options] = "Bluetooth"; From 438e170b0345b6f35abebfd718af9229cdbbbfd0 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 3 Nov 2025 18:56:31 -0500 Subject: [PATCH 131/286] Packaging: Add libbsd where needed (#8533) --- .devcontainer/Dockerfile | 2 +- alpine.Dockerfile | 7 ++++--- debian/control | 1 + meshtasticd.spec.rpkg | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a2c56fad9..f546d4cfd 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,7 +1,7 @@ # trunk-ignore-all(terrascan/AC_DOCKER_0002): Known terrascan issue # trunk-ignore-all(hadolint/DL3008): Do not pin apt package versions # trunk-ignore-all(hadolint/DL3013): Do not pin pip package versions -FROM mcr.microsoft.com/devcontainers/cpp:2-debian-12 +FROM mcr.microsoft.com/devcontainers/cpp:2-debian-13 USER root diff --git a/alpine.Dockerfile b/alpine.Dockerfile index 0469874e4..bdee57d79 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -8,7 +8,8 @@ ARG PIO_ENV=native ENV PIP_ROOT_USER_ACTION=ignore RUN apk --no-cache add \ - bash g++ libstdc++-dev linux-headers zip git ca-certificates libgpiod-dev yaml-cpp-dev bluez-dev \ + bash g++ libstdc++-dev linux-headers zip git ca-certificates libbsd-dev \ + libgpiod-dev yaml-cpp-dev bluez-dev \ libusb-dev i2c-tools-dev libuv-dev openssl-dev pkgconf argp-standalone \ libx11-dev libinput-dev libxkbcommon-dev \ && rm -rf /var/cache/apk/* \ @@ -40,8 +41,8 @@ LABEL org.opencontainers.image.title="Meshtastic" \ USER root RUN apk --no-cache add \ - shadow libstdc++ libgpiod yaml-cpp libusb i2c-tools libuv \ - libx11 libinput libxkbcommon \ + shadow libstdc++ libbsd libgpiod yaml-cpp libusb \ + i2c-tools libuv libx11 libinput libxkbcommon \ && rm -rf /var/cache/apk/* \ && mkdir -p /var/lib/meshtasticd \ && mkdir -p /etc/meshtasticd/config.d \ diff --git a/debian/control b/debian/control index 761383a5c..679a444c9 100644 --- a/debian/control +++ b/debian/control @@ -3,6 +3,7 @@ Section: misc Priority: optional Maintainer: Austin Lane Build-Depends: debhelper-compat (= 13), + libc6-dev (>= 2.38) | libbsd-dev, lsb-release, tar, gzip, diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index eb4ab5ae7..f3b2e6960 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -33,6 +33,7 @@ BuildRequires: python3dist(grpcio[protobuf]) BuildRequires: python3dist(grpcio-tools) BuildRequires: git-core BuildRequires: gcc-c++ +BuildRequires: (glibc-devel >= 2.38) or pkgconfig(libbsd-overlay) BuildRequires: pkgconfig(yaml-cpp) BuildRequires: pkgconfig(libgpiod) BuildRequires: pkgconfig(bluez) From ec5e79585bf2f39381425716991431aa4846539d Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 17 Nov 2025 17:40:19 -0500 Subject: [PATCH 132/286] Don't trust the AI! (#8659) Read the docs instead --- meshtasticd.spec.rpkg | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index f3b2e6960..227f81574 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -33,7 +33,6 @@ BuildRequires: python3dist(grpcio[protobuf]) BuildRequires: python3dist(grpcio-tools) BuildRequires: git-core BuildRequires: gcc-c++ -BuildRequires: (glibc-devel >= 2.38) or pkgconfig(libbsd-overlay) BuildRequires: pkgconfig(yaml-cpp) BuildRequires: pkgconfig(libgpiod) BuildRequires: pkgconfig(bluez) @@ -50,6 +49,13 @@ BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(xkbcommon-x11) +# libbsd is needed on older Fedora/RHEL to provide 'strlcpy' +%if 0%{?fedora} >= 41 || 0%{?rhel} >= 9 +BuildRequires: glibc-devel >= 2.38 +%else +BuildRequires: pkgconfig(libbsd-overlay) +%endif + Requires: systemd-udev %description From 79a91578b7da810bf0a60167344af2749638ebef Mon Sep 17 00:00:00 2001 From: omgbebebe Date: Tue, 18 Nov 2025 02:54:02 +0400 Subject: [PATCH 133/286] mqtt: do not try to send packets when it disconnected (#8658) --- src/mqtt/MQTT.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index f9f114039..babbcfd7c 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -51,6 +51,7 @@ constexpr int reconnectMax = 5; static uint8_t bytes[meshtastic_MqttClientProxyMessage_size + 30]; // 12 for channel name and 16 for nodeid static bool isMqttServerAddressPrivate = false; +static bool isConnected = false; inline void onReceiveProto(char *topic, byte *payload, size_t length) { @@ -320,8 +321,10 @@ bool connectPubSub(const PubSubConfig &config, PubSubClient &pubSub, Client &cli std::string nodeId = nodeDB->getNodeId(); const bool connected = pubSub.connect(nodeId.c_str(), config.mqttUsername, config.mqttPassword); if (connected) { + isConnected = true; LOG_INFO("MQTT connected"); } else { + isConnected = false; LOG_WARN("Failed to connect to MQTT server"); } return connected; @@ -507,6 +510,7 @@ bool MQTT::publish(const char *topic, const uint8_t *payload, size_t length, boo void MQTT::reconnect() { + isConnected = false; if (wantsLink()) { if (moduleConfig.mqtt.proxy_to_client_enabled) { LOG_INFO("MQTT connect via client proxy instead"); @@ -534,7 +538,7 @@ void MQTT::reconnect() runASAP = true; reconnectCount = 0; isMqttServerAddressPrivate = isPrivateIpAddress(clientConnection->remoteIP()); - + isConnected = true; publishNodeInfo(); sendSubscriptions(); } else { @@ -688,7 +692,7 @@ void MQTT::publishNodeInfo() } void MQTT::publishQueuedMessages() { - if (mqttQueue.isEmpty()) + if (mqttQueue.isEmpty() || !isConnected) return; LOG_DEBUG("Publish enqueued MQTT message"); @@ -895,4 +899,4 @@ void MQTT::perhapsReportToMap() // Update the last report time last_report_to_map = millis(); -} \ No newline at end of file +} From 501c296e758c624f7037c5010574f54ef50da129 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 17 Nov 2025 18:39:52 -0500 Subject: [PATCH 134/286] Linux: Fix silly EPEL9 mistake (#8660) --- meshtasticd.spec.rpkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index 227f81574..e2da172c3 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -50,7 +50,7 @@ BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(xkbcommon-x11) # libbsd is needed on older Fedora/RHEL to provide 'strlcpy' -%if 0%{?fedora} >= 41 || 0%{?rhel} >= 9 +%if 0%{?fedora} >= 39 || 0%{?rhel} >= 10 BuildRequires: glibc-devel >= 2.38 %else BuildRequires: pkgconfig(libbsd-overlay) From a8d1a90e16ddc1defa29e1ac33d2808e1f069eee Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 17 Nov 2025 19:58:12 -0600 Subject: [PATCH 135/286] Fix ble rssi crash (#8661) * Fix BLE crash occuring when trying to get RSSI from Android with a bad connection handle * Cleanup --- src/nimble/NimbleBluetooth.cpp | 40 +++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 6238031f6..b09777de3 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -20,13 +20,14 @@ #include "PowerStatus.h" #endif -#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) #if defined(CONFIG_NIMBLE_CPP_IDF) #include "host/ble_gap.h" #else #include "nimble/nimble/host/include/host/ble_gap.h" #endif +#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) + namespace { constexpr uint16_t kPreferredBleMtu = 517; @@ -776,16 +777,35 @@ bool NimbleBluetooth::isConnected() int NimbleBluetooth::getRssi() { - if (bleServer && isConnected()) { - auto service = bleServer->getServiceByUUID(MESH_SERVICE_UUID); - uint16_t handle = service->getHandle(); -#ifdef NIMBLE_TWO - return NimBLEDevice::getClientByHandle(handle)->getRssi(); -#else - return NimBLEDevice::getClientByID(handle)->getRssi(); -#endif +#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) + if (!bleServer || !isConnected()) { + return 0; // No active BLE connection } - return 0; // FIXME figure out where to source this + + uint16_t connHandle = nimbleBluetoothConnHandle.load(); + + if (connHandle == BLE_HS_CONN_HANDLE_NONE) { + const auto peers = bleServer->getPeerDevices(); + if (!peers.empty()) { + connHandle = peers.front(); + nimbleBluetoothConnHandle = connHandle; + } + } + + if (connHandle == BLE_HS_CONN_HANDLE_NONE) { + return 0; // Connection handle not available yet + } + + int8_t rssi = 0; + const int rc = ble_gap_conn_rssi(connHandle, &rssi); + + if (rc == 0) { + return rssi; + } + LOG_DEBUG("BLE RSSI read failed, rc=%d", rc); +#endif + + return 0; } void NimbleBluetooth::setup() From c34f94abda72e2bd850d5bc65f4a5da1220fbee3 Mon Sep 17 00:00:00 2001 From: omgbebebe Date: Tue, 18 Nov 2025 02:54:02 +0400 Subject: [PATCH 136/286] mqtt: do not try to send packets when it disconnected (#8658) --- src/mqtt/MQTT.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index f9f114039..babbcfd7c 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -51,6 +51,7 @@ constexpr int reconnectMax = 5; static uint8_t bytes[meshtastic_MqttClientProxyMessage_size + 30]; // 12 for channel name and 16 for nodeid static bool isMqttServerAddressPrivate = false; +static bool isConnected = false; inline void onReceiveProto(char *topic, byte *payload, size_t length) { @@ -320,8 +321,10 @@ bool connectPubSub(const PubSubConfig &config, PubSubClient &pubSub, Client &cli std::string nodeId = nodeDB->getNodeId(); const bool connected = pubSub.connect(nodeId.c_str(), config.mqttUsername, config.mqttPassword); if (connected) { + isConnected = true; LOG_INFO("MQTT connected"); } else { + isConnected = false; LOG_WARN("Failed to connect to MQTT server"); } return connected; @@ -507,6 +510,7 @@ bool MQTT::publish(const char *topic, const uint8_t *payload, size_t length, boo void MQTT::reconnect() { + isConnected = false; if (wantsLink()) { if (moduleConfig.mqtt.proxy_to_client_enabled) { LOG_INFO("MQTT connect via client proxy instead"); @@ -534,7 +538,7 @@ void MQTT::reconnect() runASAP = true; reconnectCount = 0; isMqttServerAddressPrivate = isPrivateIpAddress(clientConnection->remoteIP()); - + isConnected = true; publishNodeInfo(); sendSubscriptions(); } else { @@ -688,7 +692,7 @@ void MQTT::publishNodeInfo() } void MQTT::publishQueuedMessages() { - if (mqttQueue.isEmpty()) + if (mqttQueue.isEmpty() || !isConnected) return; LOG_DEBUG("Publish enqueued MQTT message"); @@ -895,4 +899,4 @@ void MQTT::perhapsReportToMap() // Update the last report time last_report_to_map = millis(); -} \ No newline at end of file +} From ef4cb2abfb6cc23dacb860f342e7a8c677387a25 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 17 Nov 2025 20:05:42 -0600 Subject: [PATCH 137/286] If we're not client proxying and we are not connected, don't publish --- src/mqtt/MQTT.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index babbcfd7c..ad35e152a 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -692,7 +692,10 @@ void MQTT::publishNodeInfo() } void MQTT::publishQueuedMessages() { - if (mqttQueue.isEmpty() || !isConnected) + if (mqttQueue.isEmpty()) + return; + + if (!moduleConfig.mqtt.proxy_to_client_enabled && !isConnected) return; LOG_DEBUG("Publish enqueued MQTT message"); From 6c09cf9d3d233b13cf12d86a81c612f130cf9926 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 18 Nov 2025 01:04:44 -0600 Subject: [PATCH 138/286] Gps reset detect (#8302) * Properly format timestamp in log message * Better formatting of GPS_DEBUG logging in gps probe * Reset GPS after serial speed change, and look for magic string to identify chip * Add UC6580 to boot message detection, for Heltec Tracker * Add L76K detect from boot string, for Heltec-v4 * Slightly more useful GPS debugging * Back out detection of L76K via startup messages. * Ignore PIN_GPS_RESET = -1 and rename passive_detect array. --------- Co-authored-by: Tom Fifield --- src/gps/GPS.cpp | 35 +++++++++++++++++++++++++++-------- src/gps/RTC.cpp | 4 ++-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 6c6cdba6d..0404ae5f8 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -240,6 +240,9 @@ GPS_RESPONSE GPS::getACK(const char *message, uint32_t waitMillis) buffer[bytesRead] = b; bytesRead++; if ((bytesRead == 767) || (b == '\r')) { +#ifdef GPS_DEBUG + LOG_DEBUG(debugmsg.c_str()); +#endif if (strnstr((char *)buffer, message, bytesRead) != nullptr) { #ifdef GPS_DEBUG LOG_DEBUG("Found: %s", message); // Log the found message @@ -247,9 +250,6 @@ GPS_RESPONSE GPS::getACK(const char *message, uint32_t waitMillis) return GNSS_RESPONSE_OK; } else { bytesRead = 0; -#ifdef GPS_DEBUG - LOG_DEBUG(debugmsg.c_str()); -#endif } } } @@ -1275,6 +1275,24 @@ GnssModel_t GPS::probe(int serialSpeed) memset(&ublox_info, 0, sizeof(ublox_info)); delay(100); +#if defined(PIN_GPS_RESET) && PIN_GPS_RESET != -1 + digitalWrite(PIN_GPS_RESET, GPS_RESET_MODE); // assert for 10ms + delay(10); + digitalWrite(PIN_GPS_RESET, !GPS_RESET_MODE); + + // attempt to detect the chip based on boot messages + std::vector passive_detect = { + {"AG3335", "$PAIR021,AG3335", GNSS_MODEL_AG3335}, + {"AG3352", "$PAIR021,AG3352", GNSS_MODEL_AG3352}, + {"RYS3520", "$PAIR021,REYAX_RYS3520_V2", GNSS_MODEL_AG3352}, + {"UC6580", "UC6580", GNSS_MODEL_UC6580}, + // as L76K is sort of a last ditch effort, we won't attempt to detect it by startup messages for now. + /*{"L76K", "SW=URANUS", GNSS_MODEL_MTK}*/}; + GnssModel_t detectedDriver = getProbeResponse(500, passive_detect, serialSpeed); + if (detectedDriver != GNSS_MODEL_UNKNOWN) { + return detectedDriver; + } +#endif // Close all NMEA sentences, valid for L76K, ATGM336H (and likely other AT6558 devices) _serial_gps->write("$PCAS03,0,0,0,0,0,0,0,0,0,0,,,0,0*02\r\n"); delay(20); @@ -1473,12 +1491,12 @@ GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n')) { -#ifdef GPS_DEBUG - LOG_DEBUG(response); -#endif // check if we can see our chips for (const auto &chipInfo : responseMap) { if (strstr(response, chipInfo.detectionString.c_str()) != nullptr) { +#ifdef GPS_DEBUG + LOG_DEBUG(response); +#endif LOG_INFO("%s detected", chipInfo.chipName.c_str()); delete[] response; // Cleanup before return return chipInfo.driver; @@ -1486,6 +1504,9 @@ GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n') { +#ifdef GPS_DEBUG + LOG_DEBUG(response); +#endif // Reset the response buffer for the next potential message responseLen = 0; response[0] = '\0'; @@ -1572,8 +1593,6 @@ GPS *GPS::createGps() #ifdef PIN_GPS_RESET pinMode(PIN_GPS_RESET, OUTPUT); - digitalWrite(PIN_GPS_RESET, GPS_RESET_MODE); // assert for 10ms - delay(10); digitalWrite(PIN_GPS_RESET, !GPS_RESET_MODE); #endif diff --git a/src/gps/RTC.cpp b/src/gps/RTC.cpp index 665a9aaa3..692f3c2d2 100644 --- a/src/gps/RTC.cpp +++ b/src/gps/RTC.cpp @@ -310,7 +310,7 @@ RTCSetResult perhapsSetRTC(RTCQuality q, struct tm &t) #ifdef BUILD_EPOCH if (tv.tv_sec < BUILD_EPOCH) { if (Throttle::isWithinTimespanMs(lastTimeValidationWarning, TIME_VALIDATION_WARNING_INTERVAL_MS) == false) { - LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH); + LOG_WARN("Ignore time (%lu) before build epoch (%lu)!", printableEpoch, BUILD_EPOCH); lastTimeValidationWarning = millis(); } return RTCSetResultInvalidTime; @@ -319,7 +319,7 @@ RTCSetResult perhapsSetRTC(RTCQuality q, struct tm &t) // Calculate max allowed time safely to avoid overflow in logging uint64_t maxAllowedTime = (uint64_t)BUILD_EPOCH + FORTY_YEARS; uint32_t maxAllowedPrintable = (maxAllowedTime > UINT32_MAX) ? UINT32_MAX : (uint32_t)maxAllowedTime; - LOG_WARN("Ignore time (%ld) too far in the future (build epoch: %ld, max allowed: %ld)!", printableEpoch, + LOG_WARN("Ignore time (%lu) too far in the future (build epoch: %lu, max allowed: %lu)!", printableEpoch, (uint32_t)BUILD_EPOCH, maxAllowedPrintable); lastTimeValidationWarning = millis(); } From edcdb2dcb22b804bc1e297ee1ada26bc3a9d5761 Mon Sep 17 00:00:00 2001 From: "Jason B. Cox" Date: Mon, 10 Nov 2025 18:19:15 -0800 Subject: [PATCH 139/286] Cleanup unnecessary global dereferencing in CryptoEngine (#8611) Co-authored-by: Ben Meadors --- src/mesh/CryptoEngine.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp index 82d0a9f57..9ca16878d 100644 --- a/src/mesh/CryptoEngine.cpp +++ b/src/mesh/CryptoEngine.cpp @@ -92,10 +92,10 @@ bool CryptoEngine::encryptCurve25519(uint32_t toNode, uint32_t fromNode, meshtas LOG_DEBUG("Node %d or their public_key not found", toNode); return false; } - if (!crypto->setDHPublicKey(remotePublic.bytes)) { + if (!setDHPublicKey(remotePublic.bytes)) { return false; } - crypto->hash(shared_key, 32); + hash(shared_key, 32); initNonce(fromNode, packetNum, extraNonceTmp); // Calculate the shared secret with the destination node and encrypt @@ -134,10 +134,10 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, meshtastic_UserLite_publ } // Calculate the shared secret with the sending node and decrypt - if (!crypto->setDHPublicKey(remotePublic.bytes)) { + if (!setDHPublicKey(remotePublic.bytes)) { return false; } - crypto->hash(shared_key, 32); + hash(shared_key, 32); initNonce(fromNode, packetNum, extraNonce); printBytes("Attempt decrypt with nonce: ", nonce, 13); From 59864dd09d7ccba3234e95de19087081507161fd Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 7 Nov 2025 15:03:56 -0600 Subject: [PATCH 140/286] Add API types, state, and log message in Debug screen. Added persistent "Connected" icon (#8576) * Add API types, state, and log message in Debug screen * un-goober the API state tracking * Set the SerialConsole api_type * Add api_type for Ethernet * Remove API state debugging code * Update wording for client connection states * Improve string width for smaller screen devices * Reserve space on navigation bar to fit link indicator * Add persistent Connected icon to screen * Connect System frame to ensure text doesn't overflow --------- Co-authored-by: Ben Meadors Co-authored-by: Jason P Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> --- src/SerialConsole.cpp | 1 + src/graphics/SharedUIDisplay.cpp | 39 ++++++++++++++ src/graphics/SharedUIDisplay.h | 3 ++ src/graphics/draw/ClockRenderer.cpp | 3 ++ src/graphics/draw/DebugRenderer.cpp | 47 ++++++++++++++--- src/graphics/draw/MessageRenderer.cpp | 2 + src/graphics/draw/NodeListRenderer.cpp | 1 + src/graphics/draw/UIRenderer.cpp | 52 ++++++++++++++++++- src/graphics/images.h | 4 ++ src/mesh/MeshService.h | 12 +++++ src/mesh/PhoneAPI.cpp | 25 +++++++++ src/mesh/PhoneAPI.h | 12 +++++ src/mesh/api/PacketAPI.cpp | 1 + src/mesh/api/WiFiServerAPI.cpp | 1 + src/mesh/api/ethServerAPI.cpp | 1 + src/mesh/http/ContentHandler.h | 2 +- src/mesh/raspihttp/PiWebServer.h | 2 +- src/modules/SerialModule.cpp | 15 ++++-- .../Telemetry/EnvironmentTelemetry.cpp | 1 + src/modules/Telemetry/PowerTelemetry.cpp | 1 + src/modules/esp32/PaxcounterModule.cpp | 1 + src/nimble/NimbleBluetooth.cpp | 2 +- src/platform/nrf52/NRF52Bluetooth.cpp | 3 ++ 23 files changed, 218 insertions(+), 13 deletions(-) diff --git a/src/SerialConsole.cpp b/src/SerialConsole.cpp index fad0fb92f..dd2acb599 100644 --- a/src/SerialConsole.cpp +++ b/src/SerialConsole.cpp @@ -50,6 +50,7 @@ void consolePrintf(const char *format, ...) SerialConsole::SerialConsole() : StreamAPI(&Port), RedirectablePrint(&Port), concurrency::OSThread("SerialConsole") { + api_type = TYPE_SERIAL; assert(!console); console = this; canWrite = false; // We don't send packets to our port until it has talked to us first diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp index 8e1299f51..1645789a7 100644 --- a/src/graphics/SharedUIDisplay.cpp +++ b/src/graphics/SharedUIDisplay.cpp @@ -1,6 +1,8 @@ #include "configuration.h" #if HAS_SCREEN +#include "MeshService.h" #include "RTC.h" +#include "draw/NodeListRenderer.h" #include "graphics/ScreenFonts.h" #include "graphics/SharedUIDisplay.h" #include "graphics/draw/UIRenderer.h" @@ -398,6 +400,43 @@ const int *getTextPositions(OLEDDisplay *display) return textPositions; } +// ************************* +// * Common Footer Drawing * +// ************************* +void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y) +{ + bool drawConnectionState = false; + if (service->api_state == service->STATE_BLE || service->api_state == service->STATE_WIFI || + service->api_state == service->STATE_SERIAL || service->api_state == service->STATE_PACKET || + service->api_state == service->STATE_HTTP || service->api_state == service->STATE_ETH) { + drawConnectionState = true; + } + + if (drawConnectionState) { + if (isHighResolution) { + const int scale = 2; + const int bytesPerRow = (connection_icon_width + 7) / 8; + int iconX = 0; + int iconY = SCREEN_HEIGHT - (connection_icon_height * 2); + + for (int yy = 0; yy < connection_icon_height; ++yy) { + const uint8_t *rowPtr = connection_icon + yy * bytesPerRow; + for (int xx = 0; xx < connection_icon_width; ++xx) { + const uint8_t byteVal = pgm_read_byte(rowPtr + (xx >> 3)); + const uint8_t bitMask = 1U << (xx & 7); // XBM is LSB-first + if (byteVal & bitMask) { + display->fillRect(iconX + xx * scale, iconY + yy * scale, scale, scale); + } + } + } + + } else { + display->drawXbm(0, SCREEN_HEIGHT - connection_icon_height, connection_icon_width, connection_icon_height, + connection_icon); + } + } +} + bool isAllowedPunctuation(char c) { const std::string allowed = ".,!?;:-_()[]{}'\"@#$/\\&+=%~^ "; diff --git a/src/graphics/SharedUIDisplay.h b/src/graphics/SharedUIDisplay.h index e1a7c6383..b51dfea36 100644 --- a/src/graphics/SharedUIDisplay.h +++ b/src/graphics/SharedUIDisplay.h @@ -52,6 +52,9 @@ void drawRoundedHighlight(OLEDDisplay *display, int16_t x, int16_t y, int16_t w, void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const char *titleStr = "", bool force_no_invert = false, bool show_date = false); +// Shared battery/time/mail header +void drawCommonFooter(OLEDDisplay *display, int16_t x, int16_t y); + const int *getTextPositions(OLEDDisplay *display); bool isAllowedPunctuation(char c); diff --git a/src/graphics/draw/ClockRenderer.cpp b/src/graphics/draw/ClockRenderer.cpp index 751db8d88..97417571b 100644 --- a/src/graphics/draw/ClockRenderer.cpp +++ b/src/graphics/draw/ClockRenderer.cpp @@ -302,6 +302,8 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1 display->drawString(startingHourMinuteTextX + timeStringWidth - xOffset, (display->getHeight() - hourMinuteTextY) - yOffset, secondString); #endif + + graphics::drawCommonFooter(display, x, y); } void drawBluetoothConnectedIcon(OLEDDisplay *display, int16_t x, int16_t y) @@ -516,6 +518,7 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 display->drawLine(centerX, centerY, secondX, secondY); #endif } + graphics::drawCommonFooter(display, x, y); } } // namespace ClockRenderer diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 60abd661e..d098fa304 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -3,6 +3,7 @@ #include "../Screen.h" #include "DebugRenderer.h" #include "FSCommon.h" +#include "MeshService.h" #include "NodeDB.h" #include "Throttle.h" #include "UIRenderer.h" @@ -223,6 +224,8 @@ void drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, i display->drawString(x, getTextPositions(display)[line++], "URL: http://meshtastic.local"); + graphics::drawCommonFooter(display, x, y); + /* Display a heartbeat pixel that blinks every time the frame is redrawn */ #ifdef SHOW_REDRAWS if (heartbeat) @@ -503,6 +506,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, display->drawString(starting_position + chUtil_x + chutil_bar_width + extraoffset, getTextPositions(display)[line++], chUtilPercentage); #endif + graphics::drawCommonFooter(display, x, y); } // **************************** @@ -642,10 +646,9 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x int textWidth = display->getStringWidth(appversionstr); int nameX = (SCREEN_WIDTH - textWidth) / 2; - display->drawString(nameX, getTextPositions(display)[line], appversionstr); -#if !defined(M5STACK_UNITC6L) - if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line < 4)) { // Only show uptime if the screen can show it - line += 1; + display->drawString(nameX, getTextPositions(display)[line++], appversionstr); + + if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show uptime if the screen can show it char uptimeStr[32] = ""; uint32_t uptime = millis() / 1000; uint32_t days = uptime / 86400; @@ -660,9 +663,41 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins); textWidth = display->getStringWidth(uptimeStr); nameX = (SCREEN_WIDTH - textWidth) / 2; - display->drawString(nameX, getTextPositions(display)[line], uptimeStr); + display->drawString(nameX, getTextPositions(display)[line++], uptimeStr); } -#endif + + if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show API state if the screen can show it + char api_state[32] = ""; + const char *clientWord = nullptr; + + // Determine if narrow or wide screen + if (isHighResolution) { + clientWord = "Client"; + } else { + clientWord = "App"; + } + snprintf(api_state, sizeof(api_state), "No %ss Connected", clientWord); + + if (service->api_state == service->STATE_BLE) { + snprintf(api_state, sizeof(api_state), "%s Connected (BLE)", clientWord); + } else if (service->api_state == service->STATE_WIFI) { + snprintf(api_state, sizeof(api_state), "%s Connected (WiFi)", clientWord); + } else if (service->api_state == service->STATE_SERIAL) { + snprintf(api_state, sizeof(api_state), "%s Connected (Serial)", clientWord); + } else if (service->api_state == service->STATE_PACKET) { + snprintf(api_state, sizeof(api_state), "%s Connected (Internal)", clientWord); + } else if (service->api_state == service->STATE_HTTP) { + snprintf(api_state, sizeof(api_state), "%s Connected (HTTP)", clientWord); + } else if (service->api_state == service->STATE_ETH) { + snprintf(api_state, sizeof(api_state), "%s Connected (Ethernet)", clientWord); + } + if (api_state[0] != '\0') { + display->drawString((SCREEN_WIDTH - display->getStringWidth(api_state)) / 2, getTextPositions(display)[line++], + api_state); + } + } + + graphics::drawCommonFooter(display, x, y); } // **************************** diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index 6971826de..da6ec7abc 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -213,6 +213,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 #else display->drawString(center_text, getTextPositions(display)[2], messageString); #endif + graphics::drawCommonFooter(display, x, y); return; } @@ -423,6 +424,7 @@ void drawTextMessageFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16 // Draw header at the end to sort out overlapping elements graphics::drawCommonHeader(display, x, y, titleStr); #endif + graphics::drawCommonFooter(display, x, y); } std::vector generateLines(OLEDDisplay *display, const char *headerStr, const char *messageBuf, int textWidth) diff --git a/src/graphics/draw/NodeListRenderer.cpp b/src/graphics/draw/NodeListRenderer.cpp index 16bfa7066..2eed58d93 100644 --- a/src/graphics/draw/NodeListRenderer.cpp +++ b/src/graphics/draw/NodeListRenderer.cpp @@ -492,6 +492,7 @@ void drawNodeListScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t #endif const int scrollStartY = y + 3; drawScrollbar(display, visibleNodeRows, totalEntries, scrollIndex, 2, scrollStartY); + graphics::drawCommonFooter(display, x, y); } // ============================= diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index 1ff183779..538c32842 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -552,6 +552,7 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st // else show nothing } #endif + graphics::drawCommonFooter(display, x, y); } // **************************** @@ -771,6 +772,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta display->drawString(nameX, getTextPositions(display)[line++], shortnameble); } #endif + graphics::drawCommonFooter(display, x, y); } // Start Functions to write date/time to the screen @@ -1183,6 +1185,7 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU } #endif #endif // HAS_GPS + graphics::drawCommonFooter(display, x, y); } #ifdef USERPREFS_OEM_TEXT @@ -1267,7 +1270,13 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta if (totalIcons == 0) return; - const size_t iconsPerPage = (SCREEN_WIDTH + spacing) / (iconSize + spacing); + const int navPadding = isHighResolution ? 24 : 12; // padding per side + + int usableWidth = SCREEN_WIDTH - (navPadding * 2); + if (usableWidth < iconSize) + usableWidth = iconSize; + + const size_t iconsPerPage = usableWidth / (iconSize + spacing); const size_t currentPage = currentFrame / iconsPerPage; const size_t pageStart = currentPage * iconsPerPage; const size_t pageEnd = min(pageStart + iconsPerPage, totalIcons); @@ -1338,6 +1347,47 @@ void UIRenderer::drawNavigationBar(OLEDDisplay *display, OLEDDisplayUiState *sta display->setColor(WHITE); } } + + // Compact arrow drawer + auto drawArrow = [&](bool rightSide) { + display->setColor(WHITE); + + const int offset = isHighResolution ? 3 : 1; + const int halfH = rectHeight / 2; + + const int top = (y - 2) + (rectHeight - halfH) / 2; + const int bottom = top + halfH - 1; + const int midY = top + (halfH / 2); + + const int maxW = 4; + + // Determine left X coordinate + int baseX = rightSide ? (rectX + rectWidth + offset) : // right arrow + (rectX - offset - 1); // left arrow + + for (int yy = top; yy <= bottom; yy++) { + int dist = abs(yy - midY); + int lineW = maxW - (dist * maxW / (halfH / 2)); + if (lineW < 1) + lineW = 1; + + if (rightSide) { + display->drawHorizontalLine(baseX, yy, lineW); + } else { + display->drawHorizontalLine(baseX - lineW + 1, yy, lineW); + } + } + }; + // Right arrow + if (pageEnd < totalIcons) { + drawArrow(true); + } + + // Left arrow + if (pageStart > 0) { + drawArrow(false); + } + // Knock the corners off the square display->setColor(BLACK); display->drawRect(rectX, y - 2, 1, 1); diff --git a/src/graphics/images.h b/src/graphics/images.h index b5010b116..8670d78d9 100644 --- a/src/graphics/images.h +++ b/src/graphics/images.h @@ -360,6 +360,10 @@ const uint8_t chirpy_hirez[] = { #define chirpy_small_image_height 8 const uint8_t chirpy_small[] = {0x7f, 0x41, 0x55, 0x55, 0x55, 0x55, 0x41, 0x7f}; +#define connection_icon_width 7 +#define connection_icon_height 5 +const uint8_t connection_icon[] = {0x36, 0x41, 0x5D, 0x41, 0x36}; + #ifdef M5STACK_UNITC6L #include "img/icon_small.xbm" #else diff --git a/src/mesh/MeshService.h b/src/mesh/MeshService.h index 66d9d9679..71fb544a0 100644 --- a/src/mesh/MeshService.h +++ b/src/mesh/MeshService.h @@ -79,6 +79,18 @@ class MeshService uint32_t oldFromNum = 0; public: + enum APIState { + STATE_DISCONNECTED, // Initial state, no API is connected + STATE_BLE, + STATE_WIFI, + STATE_SERIAL, + STATE_PACKET, + STATE_HTTP, + STATE_ETH + }; + + APIState api_state = STATE_DISCONNECTED; + static bool isTextPayload(const meshtastic_MeshPacket *p) { if (moduleConfig.range_test.enabled && p->decoded.portnum == meshtastic_PortNum_RANGE_TEST_APP) { diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp index d1e342c80..9050ee89d 100644 --- a/src/mesh/PhoneAPI.cpp +++ b/src/mesh/PhoneAPI.cpp @@ -87,6 +87,18 @@ void PhoneAPI::handleStartConfig() void PhoneAPI::close() { LOG_DEBUG("PhoneAPI::close()"); + if (service->api_state == service->STATE_BLE && api_type == TYPE_BLE) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_WIFI && api_type == TYPE_WIFI) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_SERIAL && api_type == TYPE_SERIAL) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_PACKET && api_type == TYPE_PACKET) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_HTTP && api_type == TYPE_HTTP) + service->api_state = service->STATE_DISCONNECTED; + else if (service->api_state == service->STATE_ETH && api_type == TYPE_ETH) + service->api_state = service->STATE_DISCONNECTED; if (state != STATE_SEND_NOTHING) { state = STATE_SEND_NOTHING; @@ -578,6 +590,19 @@ void PhoneAPI::sendConfigComplete() fromRadioScratch.config_complete_id = config_nonce; config_nonce = 0; state = STATE_SEND_PACKETS; + if (api_type == TYPE_BLE) { + service->api_state = service->STATE_BLE; + } else if (api_type == TYPE_WIFI) { + service->api_state = service->STATE_WIFI; + } else if (api_type == TYPE_SERIAL) { + service->api_state = service->STATE_SERIAL; + } else if (api_type == TYPE_PACKET) { + service->api_state = service->STATE_PACKET; + } else if (api_type == TYPE_HTTP) { + service->api_state = service->STATE_HTTP; + } else if (api_type == TYPE_ETH) { + service->api_state = service->STATE_ETH; + } // Allow subclasses to know we've entered steady-state so they can lower power consumption onConfigComplete(); diff --git a/src/mesh/PhoneAPI.h b/src/mesh/PhoneAPI.h index d6682684f..7f79b5792 100644 --- a/src/mesh/PhoneAPI.h +++ b/src/mesh/PhoneAPI.h @@ -167,6 +167,18 @@ class PhoneAPI /// begin a new connection void handleStartConfig(); + enum APIType { + TYPE_NONE, // Initial state, don't send anything until the client starts asking for config + TYPE_BLE, + TYPE_WIFI, + TYPE_SERIAL, + TYPE_PACKET, + TYPE_HTTP, + TYPE_ETH + }; + + APIType api_type = TYPE_NONE; + private: void releasePhonePacket(); diff --git a/src/mesh/api/PacketAPI.cpp b/src/mesh/api/PacketAPI.cpp index ab380d696..f4d5de540 100644 --- a/src/mesh/api/PacketAPI.cpp +++ b/src/mesh/api/PacketAPI.cpp @@ -19,6 +19,7 @@ PacketAPI *PacketAPI::create(PacketServer *_server) PacketAPI::PacketAPI(PacketServer *_server) : concurrency::OSThread("PacketAPI"), isConnected(false), programmingMode(false), server(_server) { + api_type = TYPE_PACKET; } int32_t PacketAPI::runOnce() diff --git a/src/mesh/api/WiFiServerAPI.cpp b/src/mesh/api/WiFiServerAPI.cpp index b19194f78..4d729f5c7 100644 --- a/src/mesh/api/WiFiServerAPI.cpp +++ b/src/mesh/api/WiFiServerAPI.cpp @@ -25,6 +25,7 @@ void deInitApiServer() WiFiServerAPI::WiFiServerAPI(WiFiClient &_client) : ServerAPI(_client) { + api_type = TYPE_WIFI; LOG_INFO("Incoming wifi connection"); } diff --git a/src/mesh/api/ethServerAPI.cpp b/src/mesh/api/ethServerAPI.cpp index 0ccf92df7..10ff06df2 100644 --- a/src/mesh/api/ethServerAPI.cpp +++ b/src/mesh/api/ethServerAPI.cpp @@ -20,6 +20,7 @@ void initApiServer(int port) ethServerAPI::ethServerAPI(EthernetClient &_client) : ServerAPI(_client) { LOG_INFO("Incoming ethernet connection"); + api_type = TYPE_ETH; } ethServerPort::ethServerPort(int port) : APIServerPort(port) {} diff --git a/src/mesh/http/ContentHandler.h b/src/mesh/http/ContentHandler.h index 2066a6d57..91cad3359 100644 --- a/src/mesh/http/ContentHandler.h +++ b/src/mesh/http/ContentHandler.h @@ -26,7 +26,7 @@ class HttpAPI : public PhoneAPI { public: - // Nothing here yet + HttpAPI() { api_type = TYPE_HTTP; } private: // Nothing here yet diff --git a/src/mesh/raspihttp/PiWebServer.h b/src/mesh/raspihttp/PiWebServer.h index b45348cf3..5a4adedaa 100644 --- a/src/mesh/raspihttp/PiWebServer.h +++ b/src/mesh/raspihttp/PiWebServer.h @@ -27,7 +27,7 @@ class HttpAPI : public PhoneAPI { public: - // Nothing here yet + HttpAPI() { api_type = TYPE_HTTP; } private: // Nothing here yet diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp index a9ec8f6a8..575e9fa96 100644 --- a/src/modules/SerialModule.cpp +++ b/src/modules/SerialModule.cpp @@ -65,13 +65,22 @@ SerialModuleRadio *serialModuleRadio; #if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \ defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) -SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial; #elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172) || defined(EBYTE_E77_MBL) -SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial1; #else -SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial") {} +SerialModule::SerialModule() : StreamAPI(&Serial2), concurrency::OSThread("Serial") +{ + api_type = TYPE_SERIAL; +} static Print *serialPrint = &Serial2; #endif diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 2337af808..e8c8172cb 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -510,6 +510,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt currentY += rowHeight; } + graphics::drawCommonFooter(display, x, y); } #endif diff --git a/src/modules/Telemetry/PowerTelemetry.cpp b/src/modules/Telemetry/PowerTelemetry.cpp index e69ee3931..29dd1def8 100644 --- a/src/modules/Telemetry/PowerTelemetry.cpp +++ b/src/modules/Telemetry/PowerTelemetry.cpp @@ -165,6 +165,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s if (m.has_ch3_voltage || m.has_ch3_current) { drawLine("Ch3", m.ch3_voltage, m.ch3_current); } + graphics::drawCommonFooter(display, x, y); } #endif diff --git a/src/modules/esp32/PaxcounterModule.cpp b/src/modules/esp32/PaxcounterModule.cpp index 8b1fc5302..9c25177bc 100644 --- a/src/modules/esp32/PaxcounterModule.cpp +++ b/src/modules/esp32/PaxcounterModule.cpp @@ -141,6 +141,7 @@ void PaxcounterModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state display->drawStringf(display->getWidth() / 2 + x, graphics::getTextPositions(display)[line++], buffer, "WiFi: %d\nBLE: %d\nUptime: %ds", count_from_libpax.wifi_count, count_from_libpax.ble_count, millis() / 1000); + graphics::drawCommonFooter(display, x, y); } #endif // HAS_SCREEN diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index b09777de3..69da25884 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -119,7 +119,7 @@ class BluetoothPhoneAPI : public PhoneAPI, public concurrency::OSThread */ public: - BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") {} + BluetoothPhoneAPI() : concurrency::OSThread("NimbleBluetooth") { api_type = TYPE_BLE; } /* Packets from phone (BLE onWrite callback) */ std::mutex fromPhoneMutex; diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp index 79eef8f76..4f7fb4776 100644 --- a/src/platform/nrf52/NRF52Bluetooth.cpp +++ b/src/platform/nrf52/NRF52Bluetooth.cpp @@ -48,6 +48,9 @@ class BluetoothPhoneAPI : public PhoneAPI /// Check the current underlying physical link to see if the client is currently connected virtual bool checkIsConnected() override { return Bluefruit.connected(connectionHandle); } + + public: + BluetoothPhoneAPI() { api_type = TYPE_BLE; } }; static BluetoothPhoneAPI *bluetoothPhoneAPI; From 15257b017c570771c058ebec2fa6986d87bf1c76 Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Sat, 8 Nov 2025 20:47:24 +0800 Subject: [PATCH 141/286] Add the Heltec v4 expansion box. (#8539) * Add the Heltec v4 expansion box. * Change heltec-v4-oled to heltec-v4. * Add touchscreen to I2C scanning. * Add reset and busy pins to the ST7789. * Ignore the touch interrupt pin and extend the sleep time to 1 hour. * Remove the default sleep function. --------- Co-authored-by: Ben Meadors --- src/graphics/TFTDisplay.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 87593b0d4..f7906c013 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -483,6 +483,8 @@ class LGFX : public lgfx::LGFX_Device lgfx::Touch_FT5x06 _touch_instance; #elif defined(HELTEC_V4_TFT) lgfx::TOUCH_CHSC6X _touch_instance; +#elif defined(HELTEC_V4_TFT) + lgfx::TOUCH_CHSC6X _touch_instance; #else lgfx::Touch_GT911 _touch_instance; #endif From 85ea22ac38e9c44b646f9c75013b02b9974b2db9 Mon Sep 17 00:00:00 2001 From: Tom <116762865+NomDeTom@users.noreply.github.com> Date: Sun, 9 Nov 2025 15:24:03 +0000 Subject: [PATCH 142/286] Update to Pro-micro variants (#8600) * Update to Pro-micro variants Schematic updated Xtal variant removed Extra module added to list Extra explanation added to readme. * Fix markdown formatting in readme.md * Fix formatting in readme.md for RF switch section --------- Co-authored-by: Tom <116762865+Nestpebble@users.noreply.github.com> --- ...Schematic_Pro-Micro_Pinouts 2024-12-14.pdf | 9836 ----- .../Schematic_Pro-Micro_Pinouts.pdf | 33346 ++++++++++++++++ .../diy/nrf52_promicro_diy_tcxo/readme.md | 15 +- .../diy/nrf52_promicro_diy_tcxo/variant.h | 1 + .../nrf52_promicro_diy_xtal/platformio.ini | 12 - .../diy/nrf52_promicro_diy_xtal/variant.cpp | 38 - .../diy/nrf52_promicro_diy_xtal/variant.h | 154 - 7 files changed, 33360 insertions(+), 10042 deletions(-) delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf create mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp delete mode 100644 variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf deleted file mode 100644 index de87af141..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf +++ /dev/null @@ -1,9836 +0,0 @@ -%PDF-1.4 -%ºß¬à -3 0 obj -<> -endobj -4 0 obj -<< -/Length 102720 ->> -stream -0.20 w -0 G -2 J -0 j -100 M -1.00 g -[] 0 d -0.00 826.80 1169.00 -826.80 re -f -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -216.000 806.000 m -216.000 816.000 l -216.000 20.000 m -216.000 10.000 l -412.000 806.000 m -412.000 816.000 l -412.000 20.000 m -412.000 10.000 l -608.000 806.000 m -608.000 816.000 l -608.000 20.000 m -608.000 10.000 l -804.000 806.000 m -804.000 816.000 l -804.000 20.000 m -804.000 10.000 l -1000.000 806.000 m -1000.000 816.000 l -1000.000 20.000 m -1000.000 10.000 l -20.000 610.000 m -10.000 610.000 l -1149.000 610.000 m -1159.000 610.000 l -20.000 414.000 m -10.000 414.000 l -1149.000 414.000 m -1159.000 414.000 l -20.000 218.000 m -10.000 218.000 l -1149.000 218.000 m -1159.000 218.000 l -20.000 22.000 m -10.000 22.000 l -1149.000 22.000 m -1159.000 22.000 l -S -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 708.00 Td -(A) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 708.00 Td -(A) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 512.00 Td -(B) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 512.00 Td -(B) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 316.00 Td -(C) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 316.00 Td -(C) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -11.50 120.00 Td -(D) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -1150.50 120.00 Td -(D) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -118.00 807.50 Td -(1) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -118.00 11.50 Td -(1) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -314.00 807.50 Td -(2) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -314.00 11.50 Td -(2) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -510.00 807.50 Td -(3) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -510.00 11.50 Td -(3) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -706.00 807.50 Td -(4) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -706.00 11.50 Td -(4) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -902.00 807.50 Td -(5) Tj -ET -10.00 w -BT -/F1 9 Tf -9.00 TL -0.533 0.000 0.000 rg -902.00 11.50 Td -(5) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -20.00 806.00 1129.00 -786.00 re -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -10.00 816.00 1149.00 -806.00 re -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -705.00 100.00 444.00 -80.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -705.100 60.750 m -1148.630 60.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -809.630 40.750 m -1148.630 40.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -1069.610 99.930 m -1069.630 60.750 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -1069.630 60.750 m -1069.630 40.750 l -S -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -710.00 87.00 Td -(TITLE:) Tj -ET -10.00 w -BT -/F1 13 Tf -13.00 TL -0.000 0.000 1.000 rg -767.62 74.41 Td -(Pro-Micro Pinouts) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -1074.62 73.75 Td -(REV:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -1112.62 73.75 Td -(1.0) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -814.62 25.00 Td -(Date:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -861.62 24.52 Td -(2024-12-17) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -1073.62 45.00 Td -(Sheet:) Tj -ET -10.00 w -BT -/F1 12 Tf -12.00 TL -0.000 0.000 1.000 rg -1118.62 44.52 Td -(1/1) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -953.62 24.75 Td -(Drawn By:) Tj -ET -10.00 w -BT -/F1 11 Tf -11.00 TL -0.533 0.000 0.000 rg -814.62 46.75 Td -(Company:) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -809.630 60.750 m -809.630 20.750 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 684.000 m -549.000 676.000 l -549.000 684.000 m -541.000 676.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -665.000 680.000 m -635.000 680.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -986.000 649.000 m -994.000 641.000 l -994.000 649.000 m -986.000 641.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 614.000 m -549.000 606.000 l -549.000 614.000 m -541.000 606.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 624.000 m -549.000 616.000 l -549.000 624.000 m -541.000 616.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -541.000 644.000 m -549.000 636.000 l -549.000 644.000 m -541.000 636.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -631.000 634.000 m -639.000 626.000 l -639.000 634.000 m -631.000 626.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 804.82 611.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 615.000 m -840.000 615.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 610.000 m -830.000 620.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 797.50 621.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 625.000 m -840.000 625.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -830.000 634.000 m -830.000 616.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -828.000 631.000 m -828.000 619.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -826.000 628.000 m -826.000 622.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -824.000 626.000 m -824.000 624.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1006.50 651.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1000.000 655.000 m -990.000 655.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1000.000 646.000 m -1000.000 664.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1002.000 649.000 m -1002.000 661.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1004.000 652.000 m -1004.000 658.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1006.000 654.000 m -1006.000 656.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 1011.94 671.15 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -990.000 675.000 m -995.000 680.000 l -1010.000 680.000 l -1010.000 670.000 l -995.000 670.000 l -990.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 797.25 651.75 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 655.000 m -835.000 650.000 l -820.000 650.000 l -820.000 660.000 l -835.000 660.000 l -840.000 655.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 804.69 631.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 635.000 m -835.000 630.000 l -820.000 630.000 l -820.000 640.000 l -835.000 640.000 l -840.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 791.48 661.75 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 665.000 m -835.000 660.000 l -820.000 660.000 l -820.000 670.000 l -835.000 670.000 l -840.000 665.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 791.41 671.75 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 675.000 m -835.000 670.000 l -820.000 670.000 l -820.000 680.000 l -835.000 680.000 l -840.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 790.06 641.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -840.000 645.000 m -835.000 640.000 l -820.000 640.000 l -820.000 650.000 l -835.000 650.000 l -840.000 645.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 1011.92 661.15 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -990.000 665.000 m -995.000 670.000 l -1010.000 670.000 l -1010.000 660.000 l -995.000 660.000 l -990.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -908.96 708.00 Td -(Seeed-wio-SX1262) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -908.96 717.00 Td -(SEEED_WIO-SX1262) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 682.00 Td -(RF_SW) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 686.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 685.000 m -860.000 685.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 672.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 676.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 675.000 m -860.000 675.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 662.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 666.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 665.000 m -860.000 665.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 652.00 Td -(CLK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 656.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 655.000 m -860.000 655.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 642.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 646.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 645.000 m -860.000 645.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 632.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 636.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 635.000 m -860.000 635.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 622.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 626.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 625.000 m -860.000 625.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -862.00 612.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -849.28 616.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -840.000 615.000 m -860.000 615.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -949.58 642.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 646.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 645.000 m -970.000 645.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -947.36 652.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 656.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 655.000 m -970.000 655.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -943.57 662.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 666.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 665.000 m -970.000 665.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -944.49 672.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -975.00 676.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -990.000 675.000 m -970.000 675.000 l -S -2 J -0 j -100 M -1.00 w -0.00 G -[] 0 d -860.00 705.00 110.00 -110.00 re -S -1.00 w -0.00 G -[] 0 d -965.00 615.00 m 965.00 623.28 958.28 630.00 950.00 630.00 c -941.72 630.00 935.00 623.28 935.00 615.00 c -935.00 606.72 941.72 600.00 950.00 600.00 c -958.28 600.00 965.00 606.72 965.00 615.00 c -S -2 J -0 j -100 M -1.00 w -0.00 G -[] 0 d -930.00 635.00 40.00 -40.00 re -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -535.000 660.000 m -545.000 660.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 499.82 655.93 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 660.000 m -535.000 660.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 655.000 m -525.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -520.000 670.000 m -545.000 670.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 652.00 699.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -665.000 690.000 m -665.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -674.000 690.000 m -656.000 690.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -671.000 692.000 m -659.000 692.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -668.000 694.000 m -662.000 694.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -666.000 696.000 m -664.000 696.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 507.00 689.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -520.000 680.000 m -520.000 670.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -529.000 680.000 m -511.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -526.000 682.000 m -514.000 682.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -523.000 684.000 m -517.000 684.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -521.000 686.000 m -519.000 686.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 622.00 582.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -635.000 600.000 m -635.000 610.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -626.000 600.000 m -644.000 600.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -629.000 598.000 m -641.000 598.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -632.000 596.000 m -638.000 596.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -634.000 594.000 m -636.000 594.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.92 616.15 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 620.000 m -640.000 625.000 l -655.000 625.000 l -655.000 615.000 l -640.000 615.000 l -635.000 620.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.55 636.15 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 640.000 m -640.000 645.000 l -655.000 645.000 l -655.000 635.000 l -640.000 635.000 l -635.000 640.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.92 646.15 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 650.000 m -640.000 655.000 l -655.000 655.000 l -655.000 645.000 l -640.000 645.000 l -635.000 650.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 656.85 656.15 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 660.000 m -640.000 665.000 l -655.000 665.000 l -655.000 655.000 l -640.000 655.000 l -635.000 660.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 657.00 666.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -635.000 670.000 m -640.000 675.000 l -655.000 675.000 l -655.000 665.000 l -640.000 665.000 l -635.000 670.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 504.19 626.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -545.000 630.000 m -540.000 625.000 l -525.000 625.000 l -525.000 635.000 l -540.000 635.000 l -545.000 630.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 495.06 646.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -545.000 650.000 m -540.000 645.000 l -525.000 645.000 l -525.000 655.000 l -540.000 655.000 l -545.000 650.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -584.95 693.33 Td -(RA-01SH) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -584.95 702.33 Td -(HT-RA62) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -557.000 690.000 m -623.000 690.000 l -624.105 690.000 625.000 689.105 625.000 688.000 c -625.000 602.000 l -625.000 600.895 623.895 600.000 623.000 600.000 c -557.000 600.000 l -555.895 600.000 555.000 601.105 555.000 602.000 c -555.000 688.000 l -555.000 689.105 556.105 690.000 557.000 690.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -561.50 685.00 m 561.50 685.83 560.83 686.50 560.00 686.50 c -559.17 686.50 558.50 685.83 558.50 685.00 c -558.50 684.17 559.17 683.50 560.00 683.50 c -560.83 683.50 561.50 684.17 561.50 685.00 c -B -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 676.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 681.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 680.000 m -555.000 680.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -558.70 666.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -548.78 671.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -545.000 670.000 m -555.000 670.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 656.00 Td -(3.3V) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 661.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 660.000 m -555.000 660.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 646.00 Td -(RESET) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 651.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 650.000 m -555.000 650.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 636.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 641.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 640.000 m -555.000 640.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 626.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 631.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 630.000 m -555.000 630.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 616.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 621.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 620.000 m -555.000 620.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -558.70 606.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -548.78 611.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 610.000 m -555.000 610.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -600.66 606.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -625.50 611.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -635.000 610.000 m -625.000 610.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.87 616.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 621.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 620.000 m -625.000 620.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.46 626.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 631.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 630.000 m -625.000 630.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -602.64 636.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 641.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 640.000 m -625.000 640.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.71 646.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 651.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 650.000 m -625.000 650.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -596.71 656.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 661.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 660.000 m -625.000 660.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -602.27 666.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -625.50 671.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -635.000 670.000 m -625.000 670.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -600.66 676.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -625.50 681.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -635.000 680.000 m -625.000 680.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -153.95 479.05 Td -(AMC-U_FL) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -153.95 488.16 Td -(U6) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -165.00 465.00 20.00 -20.00 re -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 174.00 434.29 Tm -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -175.000 425.000 m -175.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -159.28 456.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -155.000 455.000 m -165.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -185.00 456.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -195.000 455.000 m -185.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 174.00 465.00 Tm -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -175.000 475.000 m -175.000 465.000 l -S -1.00 w -0.53 0.00 0.00 RG -[] 0 d -177.00 455.00 m 177.00 456.10 176.10 457.00 175.00 457.00 c -173.90 457.00 173.00 456.10 173.00 455.00 c -173.00 453.90 173.90 453.00 175.00 453.00 c -176.10 453.00 177.00 453.90 177.00 455.00 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -175.000 453.000 m -175.000 445.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -506.000 394.000 m -514.000 386.000 l -514.000 394.000 m -506.000 386.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -646.000 394.000 m -654.000 386.000 l -654.000 394.000 m -646.000 386.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 666.50 415.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 420.000 m -650.000 420.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 411.000 m -660.000 429.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -662.000 414.000 m -662.000 426.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -664.000 417.000 m -664.000 423.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -666.000 419.000 m -666.000 421.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -650.000 430.000 m -650.000 400.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -796.000 389.000 m -804.000 381.000 l -804.000 389.000 m -796.000 381.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -573.96 503.33 Td -(E22-900M22S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -573.96 512.33 Td -(E22-900M22S) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 377.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 381.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 380.000 m -530.000 380.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 387.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 391.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 390.000 m -530.000 390.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 397.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 401.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 400.000 m -530.000 400.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 417.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 421.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 420.000 m -530.000 420.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 427.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 431.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 430.000 m -530.000 430.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 437.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 441.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 440.000 m -530.000 440.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 447.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 451.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 450.000 m -530.000 450.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 457.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 461.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 460.000 m -530.000 460.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 467.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 471.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 470.000 m -530.000 470.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 477.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 481.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 480.000 m -530.000 480.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -532.00 487.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -513.57 491.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -510.000 490.000 m -530.000 490.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 487.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 491.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 490.000 m -630.000 490.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 477.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 481.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 480.000 m -630.000 480.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -609.29 467.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 471.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 470.000 m -630.000 470.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -604.49 457.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 461.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 460.000 m -630.000 460.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -603.87 447.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 451.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 450.000 m -630.000 450.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -603.16 437.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 441.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 440.000 m -630.000 440.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 427.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 431.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 430.000 m -630.000 430.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 417.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 421.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 420.000 m -630.000 420.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 397.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 401.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 400.000 m -630.000 400.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 387.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 391.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 390.000 m -630.000 390.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -607.36 377.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -635.00 381.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -650.000 380.000 m -630.000 380.000 l -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -532.000 500.000 m -628.000 500.000 l -629.105 500.000 630.000 499.105 630.000 498.000 c -630.000 362.000 l -630.000 360.895 628.895 360.000 628.000 360.000 c -532.000 360.000 l -530.895 360.000 530.000 361.105 530.000 362.000 c -530.000 498.000 l -530.000 499.105 531.105 500.000 532.000 500.000 c -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -863.96 498.33 Td -(E22-900M30S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -863.96 507.33 Td -(E22-900M30S) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -822.000 495.000 m -918.000 495.000 l -919.105 495.000 920.000 494.105 920.000 493.000 c -920.000 357.000 l -920.000 355.895 918.895 355.000 918.000 355.000 c -822.000 355.000 l -820.895 355.000 820.000 356.105 820.000 357.000 c -820.000 493.000 l -820.000 494.105 821.105 495.000 822.000 495.000 c -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 372.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 376.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 375.000 m -920.000 375.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 382.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 386.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 385.000 m -920.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 392.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 396.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 395.000 m -920.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 412.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 416.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 415.000 m -920.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 422.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 426.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 425.000 m -920.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -893.16 432.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 436.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 435.000 m -920.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -893.87 442.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 446.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 445.000 m -920.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -894.49 452.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 456.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 455.000 m -920.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -899.29 462.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 466.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 465.000 m -920.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -899.29 472.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 476.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 475.000 m -920.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -897.36 482.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -925.00 486.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -940.000 485.000 m -920.000 485.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 482.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 486.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 485.000 m -820.000 485.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 472.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 476.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 475.000 m -820.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 462.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 466.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 465.000 m -820.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 452.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 456.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 455.000 m -820.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 442.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 446.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 445.000 m -820.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 432.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 436.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 435.000 m -820.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 422.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 426.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 425.000 m -820.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 412.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 416.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 415.000 m -820.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 392.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 396.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 395.000 m -820.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 382.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 386.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 385.000 m -820.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -822.00 372.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -803.57 376.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -800.000 375.000 m -820.000 375.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -293.99 488.33 Td -(E22-400MM22S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -293.99 497.33 Td -(E22-900MM22S) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -267.000 485.000 m -333.000 485.000 l -334.105 485.000 335.000 484.105 335.000 483.000 c -335.000 377.000 l -335.000 375.895 333.895 375.000 333.000 375.000 c -267.000 375.000 l -265.895 375.000 265.000 376.105 265.000 377.000 c -265.000 483.000 l -265.000 484.105 266.105 485.000 267.000 485.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -271.50 480.00 m 271.50 480.83 270.83 481.50 270.00 481.50 c -269.17 481.50 268.50 480.83 268.50 480.00 c -268.50 479.17 269.17 478.50 270.00 478.50 c -270.83 478.50 271.50 479.17 271.50 480.00 c -B -BT -/F1 9 Tf -9.00 TL -1.000 0.000 0.000 rg -268.70 471.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -1.000 0.000 0.000 rg -258.79 476.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -1.00 0.00 0.00 RG -[] 0 d -255.000 475.000 m -265.000 475.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -268.70 461.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -258.79 466.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -255.000 465.000 m -265.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 451.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 456.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 455.000 m -265.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 441.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 446.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 445.000 m -265.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 431.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 436.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 435.000 m -265.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 421.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 426.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 425.000 m -265.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -268.70 411.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -258.79 416.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -255.000 415.000 m -265.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 401.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 406.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 405.000 m -265.000 405.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 391.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -258.79 396.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 395.000 m -265.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -268.70 381.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -253.07 386.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -255.000 385.000 m -265.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.87 381.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 386.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 385.000 m -335.000 385.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.71 391.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 396.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 395.000 m -335.000 395.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -306.71 401.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 406.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 405.000 m -335.000 405.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -312.27 411.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 416.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 415.000 m -335.000 415.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -312.64 421.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 426.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 425.000 m -335.000 425.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -310.66 431.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -335.50 436.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -345.000 435.000 m -335.000 435.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -318.29 441.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 446.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 445.000 m -335.000 445.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 451.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 456.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 455.000 m -335.000 455.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 461.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 466.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 465.000 m -335.000 465.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -307.79 471.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -335.50 476.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -345.000 475.000 m -335.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 366.70 381.60 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 385.000 m -350.000 390.000 l -365.000 390.000 l -365.000 380.000 l -350.000 380.000 l -345.000 385.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 203.19 381.40 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 385.000 m -250.000 380.000 l -235.000 380.000 l -235.000 390.000 l -250.000 390.000 l -255.000 385.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 366.71 421.60 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 425.000 m -350.000 430.000 l -365.000 430.000 l -365.000 420.000 l -350.000 420.000 l -345.000 425.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 391.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 395.000 m -350.000 400.000 l -365.000 400.000 l -365.000 390.000 l -350.000 390.000 l -345.000 395.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 401.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 405.000 m -350.000 410.000 l -365.000 410.000 l -365.000 400.000 l -350.000 400.000 l -345.000 405.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 411.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 415.000 m -350.000 420.000 l -365.000 420.000 l -365.000 410.000 l -350.000 410.000 l -345.000 415.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.01 461.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 465.000 m -350.000 470.000 l -365.000 470.000 l -365.000 460.000 l -350.000 460.000 l -345.000 465.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.00 471.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 475.000 m -350.000 480.000 l -365.000 480.000 l -365.000 470.000 l -350.000 470.000 l -345.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 203.74 391.40 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 395.000 m -250.000 390.000 l -235.000 390.000 l -235.000 400.000 l -250.000 400.000 l -255.000 395.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 205.06 451.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -255.000 455.000 m -250.000 450.000 l -235.000 450.000 l -235.000 460.000 l -250.000 460.000 l -255.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 367.01 451.15 Tm -(DIO3) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -345.000 455.000 m -350.000 460.000 l -365.000 460.000 l -365.000 450.000 l -350.000 450.000 l -345.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.06 456.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 460.000 m -505.000 455.000 l -490.000 455.000 l -490.000 465.000 l -505.000 465.000 l -510.000 460.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 671.71 446.60 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 450.000 m -655.000 455.000 l -670.000 455.000 l -670.000 445.000 l -655.000 445.000 l -650.000 450.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 469.19 476.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 480.000 m -505.000 475.000 l -490.000 475.000 l -490.000 485.000 l -505.000 485.000 l -510.000 480.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 672.01 456.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 460.000 m -655.000 465.000 l -670.000 465.000 l -670.000 455.000 l -655.000 455.000 l -650.000 460.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.69 416.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 420.000 m -505.000 415.000 l -490.000 415.000 l -490.000 425.000 l -505.000 425.000 l -510.000 420.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.61 436.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 440.000 m -505.000 435.000 l -490.000 435.000 l -490.000 445.000 l -505.000 445.000 l -510.000 440.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 460.61 446.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 450.000 m -505.000 445.000 l -490.000 445.000 l -490.000 455.000 l -505.000 455.000 l -510.000 450.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 466.77 426.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 430.000 m -505.000 425.000 l -490.000 425.000 l -490.000 435.000 l -505.000 435.000 l -510.000 430.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 671.71 436.60 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -650.000 440.000 m -655.000 445.000 l -670.000 445.000 l -670.000 435.000 l -655.000 435.000 l -650.000 440.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 458.85 466.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -510.000 470.000 m -505.000 465.000 l -490.000 465.000 l -490.000 475.000 l -505.000 475.000 l -510.000 470.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 395.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 400.000 m -510.000 400.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 409.000 m -500.000 391.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 406.000 m -498.000 394.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 403.000 m -496.000 397.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 401.000 m -494.000 399.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 375.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 380.000 m -510.000 380.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 389.000 m -500.000 371.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 386.000 m -498.000 374.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 383.000 m -496.000 377.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 381.000 m -494.000 379.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 637.00 352.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -650.000 370.000 m -650.000 380.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -641.000 370.000 m -659.000 370.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -644.000 368.000 m -656.000 368.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -647.000 366.000 m -653.000 366.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -649.000 364.000 m -651.000 364.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 637.00 509.13 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -650.000 500.000 m -650.000 490.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -659.000 500.000 m -641.000 500.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -656.000 502.000 m -644.000 502.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -653.000 504.000 m -647.000 504.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -651.000 506.000 m -649.000 506.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 467.50 485.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 490.000 m -510.000 490.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -500.000 499.000 m -500.000 481.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -498.000 496.000 m -498.000 484.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -496.000 493.000 m -496.000 487.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -494.000 491.000 m -494.000 489.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 361.50 430.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 435.000 m -345.000 435.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 426.000 m -355.000 444.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -357.000 429.000 m -357.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -359.000 432.000 m -359.000 438.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -361.000 434.000 m -361.000 436.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 212.50 410.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 415.000 m -255.000 415.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 424.000 m -245.000 406.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -243.000 421.000 m -243.000 409.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -241.000 418.000 m -241.000 412.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -239.000 416.000 m -239.000 414.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 212.50 460.93 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 465.000 m -255.000 465.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -245.000 474.000 m -245.000 456.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -243.000 471.000 m -243.000 459.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -241.000 468.000 m -241.000 462.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -239.000 466.000 m -239.000 464.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -940.000 370.000 m -940.000 425.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 480.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 485.000 m -800.000 485.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 494.000 m -790.000 476.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 491.000 m -788.000 479.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 488.000 m -786.000 482.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 486.000 m -784.000 484.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 927.00 504.09 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -940.000 495.000 m -940.000 485.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -949.000 495.000 m -931.000 495.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -946.000 497.000 m -934.000 497.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -943.000 499.000 m -937.000 499.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -941.000 501.000 m -939.000 501.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 370.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 375.000 m -800.000 375.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 384.000 m -790.000 366.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 381.000 m -788.000 369.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 378.000 m -786.000 372.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 376.000 m -784.000 374.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 757.50 390.92 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 395.000 m -800.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -790.000 404.000 m -790.000 386.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -788.000 401.000 m -788.000 389.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -786.000 398.000 m -786.000 392.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -784.000 396.000 m -784.000 394.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 748.85 461.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 465.000 m -795.000 460.000 l -780.000 460.000 l -780.000 470.000 l -795.000 470.000 l -800.000 465.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 961.71 431.60 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 435.000 m -945.000 440.000 l -960.000 440.000 l -960.000 430.000 l -945.000 430.000 l -940.000 435.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 756.77 421.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 425.000 m -795.000 420.000 l -780.000 420.000 l -780.000 430.000 l -795.000 430.000 l -800.000 425.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.61 441.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 445.000 m -795.000 440.000 l -780.000 440.000 l -780.000 450.000 l -795.000 450.000 l -800.000 445.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.61 431.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 435.000 m -795.000 430.000 l -780.000 430.000 l -780.000 440.000 l -795.000 440.000 l -800.000 435.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 764.69 411.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 415.000 m -795.000 410.000 l -780.000 410.000 l -780.000 420.000 l -795.000 420.000 l -800.000 415.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 962.01 451.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 455.000 m -945.000 460.000 l -960.000 460.000 l -960.000 450.000 l -945.000 450.000 l -940.000 455.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 759.19 471.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 475.000 m -795.000 470.000 l -780.000 470.000 l -780.000 480.000 l -795.000 480.000 l -800.000 475.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 961.71 441.60 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -940.000 445.000 m -945.000 450.000 l -960.000 450.000 l -960.000 440.000 l -945.000 440.000 l -940.000 445.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 750.06 451.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -800.000 455.000 m -795.000 450.000 l -780.000 450.000 l -780.000 460.000 l -795.000 460.000 l -800.000 455.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 927.00 342.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -940.000 360.000 m -940.000 370.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 360.000 m -949.000 360.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -934.000 358.000 m -946.000 358.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -937.000 356.000 m -943.000 356.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -939.000 354.000 m -941.000 354.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 243.00 487.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -255.000 485.000 m -255.000 475.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -250.000 485.000 m -260.000 485.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 660.50 465.93 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 470.000 m -650.000 470.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -660.000 475.000 m -660.000 465.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -175.000 425.000 m -210.000 425.000 l -255.000 425.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 142.00 429.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -155.000 445.000 m -155.000 455.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -146.000 445.000 m -164.000 445.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -149.000 443.000 m -161.000 443.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -152.000 441.000 m -158.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -154.000 439.000 m -156.000 439.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 182.00 428.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -195.000 445.000 m -195.000 455.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -186.000 445.000 m -204.000 445.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -189.000 443.000 m -201.000 443.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -192.000 441.000 m -198.000 441.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -194.000 439.000 m -196.000 439.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 950.50 460.92 Tm -(+5V) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -950.000 465.000 m -940.000 465.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -950.000 470.000 m -950.000 460.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -650.000 490.000 m -650.000 480.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -940.000 465.000 m -940.000 475.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -231.000 294.000 m -239.000 286.000 l -239.000 294.000 m -231.000 286.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 244.000 m -379.000 236.000 l -379.000 244.000 m -371.000 236.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 284.000 m -379.000 276.000 l -379.000 284.000 m -371.000 276.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 274.000 m -379.000 266.000 l -379.000 274.000 m -371.000 266.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -231.000 204.000 m -239.000 196.000 l -239.000 204.000 m -231.000 196.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -371.000 204.000 m -379.000 196.000 l -379.000 204.000 m -371.000 196.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 397.71 246.28 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -375.000 250.000 m -380.000 255.000 l -395.000 255.000 l -395.000 245.000 l -380.000 245.000 l -375.000 250.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 397.00 256.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -375.000 260.000 m -380.000 265.000 l -395.000 265.000 l -395.000 255.000 l -380.000 255.000 l -375.000 260.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 183.85 236.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 240.000 m -230.000 235.000 l -215.000 235.000 l -215.000 245.000 l -230.000 245.000 l -235.000 240.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 199.69 246.40 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 250.000 m -230.000 245.000 l -215.000 245.000 l -215.000 255.000 l -230.000 255.000 l -235.000 250.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 185.61 266.40 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 270.000 m -230.000 265.000 l -215.000 265.000 l -215.000 275.000 l -230.000 275.000 l -235.000 270.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 191.77 256.40 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 260.000 m -230.000 255.000 l -215.000 255.000 l -215.000 265.000 l -230.000 265.000 l -235.000 260.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 185.61 276.40 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -235.000 280.000 m -230.000 275.000 l -215.000 275.000 l -215.000 285.000 l -230.000 285.000 l -235.000 280.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -298.96 313.33 Td -(E80-900M2213S) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -298.96 322.33 Td -(E80-900M2213S) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 187.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 191.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 190.000 m -255.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 197.00 Td -(ANT_2.4) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 201.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 200.000 m -255.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 207.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 211.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 210.000 m -255.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 227.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 231.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 230.000 m -255.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 237.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 241.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 240.000 m -255.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 247.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 251.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 250.000 m -255.000 250.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 257.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 261.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 260.000 m -255.000 260.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 267.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 271.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 270.000 m -255.000 270.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 277.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 281.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 280.000 m -255.000 280.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 287.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 291.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 290.000 m -255.000 290.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -257.00 297.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -238.57 301.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -235.000 300.000 m -255.000 300.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 297.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 301.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 300.000 m -355.000 300.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -334.29 287.00 Td -(VCC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 291.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 290.000 m -355.000 290.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 277.00 Td -(DIO7) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 281.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 280.000 m -355.000 280.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 267.00 Td -(DIO8) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 271.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 270.000 m -355.000 270.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -329.49 257.00 Td -(DIO9) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 261.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 260.000 m -355.000 260.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -328.32 247.00 Td -(NRST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 251.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 250.000 m -355.000 250.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -339.99 237.00 Td -(NC) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 241.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 240.000 m -355.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 227.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 231.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 230.000 m -355.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 207.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 211.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 210.000 m -355.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -311.72 197.00 Td -(ANT_900) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 201.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 200.000 m -355.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -332.36 187.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -360.00 191.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -375.000 190.000 m -355.000 190.000 l -S -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -257.000 310.000 m -353.000 310.000 l -354.105 310.000 355.000 309.105 355.000 308.000 c -355.000 172.000 l -355.000 170.895 353.895 170.000 353.000 170.000 c -257.000 170.000 l -255.895 170.000 255.000 171.105 255.000 172.000 c -255.000 308.000 l -255.000 309.105 256.105 310.000 257.000 310.000 c -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 362.00 163.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -375.000 180.000 m -375.000 190.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -366.000 180.000 m -384.000 180.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -369.000 178.000 m -381.000 178.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -372.000 176.000 m -378.000 176.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -374.000 174.000 m -376.000 174.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 206.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 210.000 m -375.000 210.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 201.000 m -385.000 219.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 204.000 m -387.000 216.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 207.000 m -389.000 213.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 209.000 m -391.000 211.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 226.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 230.000 m -375.000 230.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 221.000 m -385.000 239.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 224.000 m -387.000 236.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 227.000 m -389.000 233.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 229.000 m -391.000 231.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 391.50 296.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 300.000 m -375.000 300.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 291.000 m -385.000 309.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -387.000 294.000 m -387.000 306.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -389.000 297.000 m -389.000 303.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -391.000 299.000 m -391.000 301.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 296.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 300.000 m -235.000 300.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 309.000 m -225.000 291.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 306.000 m -223.000 294.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 303.000 m -221.000 297.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 301.000 m -219.000 299.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 226.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 230.000 m -235.000 230.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 239.000 m -225.000 221.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 236.000 m -223.000 224.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 233.000 m -221.000 227.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 231.000 m -219.000 229.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 206.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 210.000 m -235.000 210.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 219.000 m -225.000 201.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 216.000 m -223.000 204.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 213.000 m -221.000 207.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 211.000 m -219.000 209.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 192.50 186.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 190.000 m -235.000 190.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -225.000 199.000 m -225.000 181.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -223.000 196.000 m -223.000 184.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -221.000 193.000 m -221.000 187.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -219.000 191.000 m -219.000 189.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 386.00 286.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 290.000 m -375.000 290.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -385.000 295.000 m -385.000 285.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -160.000 675.000 m -160.000 680.000 l -160.000 685.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 655.000 m -160.000 655.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 645.000 m -160.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 635.000 m -160.000 635.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 625.000 m -160.000 625.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 615.000 m -160.000 615.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -145.000 605.000 m -160.000 605.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 591.40 Tm -(P1.06) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 595.000 m -155.000 590.000 l -140.000 590.000 l -140.000 600.000 l -155.000 600.000 l -160.000 595.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 701.40 Tm -(P0.06) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 705.000 m -155.000 700.000 l -140.000 700.000 l -140.000 710.000 l -155.000 710.000 l -160.000 705.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 112.70 691.40 Tm -(P0.08) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 695.000 m -155.000 690.000 l -140.000 690.000 l -140.000 700.000 l -155.000 700.000 l -160.000 695.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 632.75 Td -(1.5M) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 641.75 Td -(R2) Tj -ET -2 J -0 j -100 M -1.00 w -0.63 0.00 0.00 RG -[] 0 d -405.00 655.00 10.00 -20.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 655.000 m -410.000 665.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 635.000 m -410.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -0.00 1.00 -1.00 0.00 413.70 727.50 Tm -(Batt) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -410.000 705.000 m -405.000 710.000 l -405.000 725.000 l -415.000 725.000 l -415.000 710.000 l -410.000 705.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -186.000 549.000 m -194.000 541.000 l -194.000 549.000 m -186.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -196.000 549.000 m -204.000 541.000 l -204.000 549.000 m -196.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -206.000 549.000 m -214.000 541.000 l -214.000 549.000 m -206.000 541.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -276.000 719.000 m -284.000 711.000 l -284.000 719.000 m -276.000 711.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -156.000 719.000 m -164.000 711.000 l -164.000 719.000 m -156.000 711.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 397.00 599.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -410.000 615.000 m -410.000 625.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -401.000 615.000 m -419.000 615.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -404.000 613.000 m -416.000 613.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -407.000 611.000 m -413.000 611.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -409.000 609.000 m -411.000 609.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -410.000 665.000 m -280.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 672.75 Td -(1M) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -417.00 681.75 Td -(R1) Tj -ET -2 J -0 j -100 M -1.00 w -0.63 0.00 0.00 RG -[] 0 d -405.00 695.00 10.00 -20.00 re -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 695.000 m -410.000 705.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -410.000 675.000 m -410.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 685.000 m -280.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.01 681.07 Tm -(RBtn) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 685.000 m -295.000 690.000 l -310.000 690.000 l -310.000 680.000 l -295.000 680.000 l -290.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 99.24 621.60 Tm -(UBtn) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 625.000 m -140.000 620.000 l -125.000 620.000 l -125.000 630.000 l -140.000 630.000 l -145.000 625.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 117.50 676.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -150.000 680.000 m -160.000 680.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -150.000 689.000 m -150.000 671.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -148.000 686.000 m -148.000 674.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -146.000 683.000 m -146.000 677.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -144.000 681.000 m -144.000 679.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 595.000 m -280.000 595.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 655.000 m -280.000 655.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 605.000 m -280.000 605.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 625.000 m -280.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 92.64 631.40 Tm -(GPSen) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 635.000 m -140.000 630.000 l -125.000 630.000 l -125.000 640.000 l -140.000 640.000 l -145.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 93.85 651.40 Tm -(GPSrx) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 655.000 m -140.000 650.000 l -125.000 650.000 l -125.000 660.000 l -140.000 660.000 l -145.000 655.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 94.40 641.40 Tm -(GPStx) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 645.000 m -140.000 640.000 l -125.000 640.000 l -125.000 650.000 l -140.000 650.000 l -145.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 615.000 m -280.000 615.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 635.000 m -280.000 635.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -290.000 645.000 m -280.000 645.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -345.000 695.000 m -280.000 695.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -345.000 675.000 m -280.000 675.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 601.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 605.000 m -295.000 610.000 l -310.000 610.000 l -310.000 600.000 l -295.000 600.000 l -290.000 605.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.50 591.60 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 595.000 m -295.000 600.000 l -310.000 600.000 l -310.000 590.000 l -295.000 590.000 l -290.000 595.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 356.00 671.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 675.000 m -345.000 675.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 680.000 m -355.000 670.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 621.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 625.000 m -295.000 630.000 l -310.000 630.000 l -310.000 620.000 l -295.000 620.000 l -290.000 625.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 631.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 635.000 m -295.000 640.000 l -310.000 640.000 l -310.000 630.000 l -295.000 630.000 l -290.000 635.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 312.00 641.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 645.000 m -295.000 650.000 l -310.000 650.000 l -310.000 640.000 l -295.000 640.000 l -290.000 645.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 311.84 611.60 Tm -(SCk) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 615.000 m -295.000 620.000 l -310.000 620.000 l -310.000 610.000 l -295.000 610.000 l -290.000 615.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 311.70 651.60 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -290.000 655.000 m -295.000 660.000 l -310.000 660.000 l -310.000 650.000 l -295.000 650.000 l -290.000 655.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 361.50 691.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 695.000 m -345.000 695.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -355.000 686.000 m -355.000 704.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -357.000 689.000 m -357.000 701.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -359.000 692.000 m -359.000 698.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -361.000 694.000 m -361.000 696.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 302.50 701.30 Tm -(Batt) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -280.000 705.000 m -285.000 710.000 l -300.000 710.000 l -300.000 700.000 l -285.000 700.000 l -280.000 705.000 l -S -10.00 w -BT -/F1 13 Tf -13.00 TL -0.000 0.000 1.000 rg -1015.00 25.00 Td -(Nom De Tom) Tj -ET -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 647.00 251.60 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -625.000 255.000 m -630.000 260.000 l -645.000 260.000 l -645.000 250.000 l -630.000 250.000 l -625.000 255.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 513.00 297.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -525.000 295.000 m -525.000 285.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -520.000 295.000 m -530.000 295.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -625.000 175.000 m -625.000 215.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 612.00 149.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -625.000 165.000 m -625.000 175.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -616.000 165.000 m -634.000 165.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -619.000 163.000 m -631.000 163.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -622.000 161.000 m -628.000 161.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -624.000 159.000 m -626.000 159.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.33 201.85 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 205.000 m -520.000 200.000 l -505.000 200.000 l -505.000 210.000 l -520.000 210.000 l -525.000 205.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 473.74 191.85 Tm -(RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 195.000 m -520.000 190.000 l -505.000 190.000 l -505.000 200.000 l -520.000 200.000 l -525.000 195.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 482.41 231.85 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 235.000 m -520.000 230.000 l -505.000 230.000 l -505.000 240.000 l -520.000 240.000 l -525.000 235.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 476.41 251.85 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 255.000 m -520.000 250.000 l -505.000 250.000 l -505.000 260.000 l -520.000 260.000 l -525.000 255.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 476.48 241.85 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 245.000 m -520.000 240.000 l -505.000 240.000 l -505.000 250.000 l -520.000 250.000 l -525.000 245.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 489.69 221.45 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 225.000 m -520.000 220.000 l -505.000 220.000 l -505.000 230.000 l -520.000 230.000 l -525.000 225.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 647.01 241.15 Tm -(DIO2) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -625.000 245.000 m -630.000 250.000 l -645.000 250.000 l -645.000 240.000 l -630.000 240.000 l -625.000 245.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 474.33 181.85 Tm -(TXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 185.000 m -520.000 180.000 l -505.000 180.000 l -505.000 190.000 l -520.000 190.000 l -525.000 185.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 475.06 261.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -525.000 265.000 m -520.000 260.000 l -505.000 260.000 l -505.000 270.000 l -520.000 270.000 l -525.000 265.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -568.96 298.33 Td -(SX1262_MOD) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -584.58 282.00 Td -(ANT) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 286.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 285.000 m -605.000 285.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -568.96 307.33 Td -(CORE_SX1262) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 202.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 206.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 205.000 m -605.000 205.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 192.00 Td -(RXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 196.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 195.000 m -545.000 195.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 182.00 Td -(TXEN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 186.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 185.000 m -545.000 185.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -579.49 242.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 246.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 245.000 m -605.000 245.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -579.49 252.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 256.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 255.000 m -605.000 255.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 192.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 196.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 195.000 m -605.000 195.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 282.00 Td -(3V3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 286.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 285.000 m -545.000 285.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 202.00 Td -(BUSY) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -534.28 206.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 205.000 m -545.000 205.000 l -S -1.00 w -0.53 0.00 0.00 RG -545.00 265.00 m 545.00 266.66 543.66 268.00 542.00 268.00 c -540.34 268.00 539.00 266.66 539.00 265.00 c -539.00 263.34 540.34 262.00 542.00 262.00 c -543.66 262.00 545.00 263.34 545.00 265.00 c -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 262.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 266.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 265.000 m -539.000 265.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 252.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 256.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 255.000 m -545.000 255.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 242.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 246.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 245.000 m -545.000 245.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 232.000 m -548.000 235.000 l -545.000 238.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 232.00 Td -(CLK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 236.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 235.000 m -545.000 235.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -547.00 222.00 Td -(CS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -528.57 226.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -525.000 225.000 m -545.000 225.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 182.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 186.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 185.000 m -605.000 185.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -582.36 212.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -610.00 216.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -625.000 215.000 m -605.000 215.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -550.000 295.000 m -600.000 295.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -605.000 290.000 m -605.000 180.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -600.000 175.000 m -550.000 175.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -0.00 g -[] 0 d -545.000 180.000 m -545.000 290.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 290.000 m -545.000 295.000 545.000 295.000 550.000 295.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -600.000 295.000 m -605.000 295.000 605.000 295.000 605.000 290.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -605.000 180.000 m -605.000 175.000 605.000 175.000 600.000 175.000 c -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -545.000 180.000 m -545.000 175.000 545.000 175.000 550.000 175.000 c -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 737.72 681.45 Tm -(MCU_RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -820.000 685.000 m -815.000 680.000 l -800.000 680.000 l -800.000 690.000 l -815.000 690.000 l -820.000 685.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1115.00 362.67 Td -(100uF) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1115.00 371.67 Td -(C1) Tj -ET -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1113.000 373.000 m -1097.000 373.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1105.000 365.000 m -1105.000 355.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1105.000 385.000 m -1105.000 377.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1097.000 377.000 m -1113.000 377.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1105.000 385.000 m -1105.000 395.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1105.000 373.000 m -1105.000 365.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1065.00 362.67 Td -(100uF) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -1065.00 371.67 Td -(C2) Tj -ET -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1063.000 373.000 m -1047.000 373.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1055.000 365.000 m -1055.000 355.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1055.000 385.000 m -1055.000 377.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1047.000 377.000 m -1063.000 377.000 l -S -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -1055.000 385.000 m -1055.000 395.000 l -S -1 J -1 j -1.00 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -1055.000 373.000 m -1055.000 365.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1092.00 329.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1105.000 345.000 m -1105.000 355.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1096.000 345.000 m -1114.000 345.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1099.000 343.000 m -1111.000 343.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1102.000 341.000 m -1108.000 341.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1104.000 339.000 m -1106.000 339.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1043.00 407.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1055.000 405.000 m -1055.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1050.000 405.000 m -1060.000 405.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1042.00 327.76 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1055.000 345.000 m -1055.000 355.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1046.000 345.000 m -1064.000 345.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1049.000 343.000 m -1061.000 343.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1052.000 341.000 m -1058.000 341.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1054.000 339.000 m -1056.000 339.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 1095.00 407.00 Tm -(+5V) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1105.000 405.000 m -1105.000 395.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -1100.000 405.000 m -1110.000 405.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 102.98 611.40 Tm -(SCL) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 615.000 m -140.000 610.000 l -125.000 610.000 l -125.000 620.000 l -140.000 620.000 l -145.000 615.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 101.11 601.40 Tm -(SDA) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -145.000 605.000 m -140.000 600.000 l -125.000 600.000 l -125.000 610.000 l -140.000 610.000 l -145.000 605.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -820.000 685.000 m -840.000 685.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 77.72 661.45 Tm -(MCU_RXEN) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -160.000 665.000 m -155.000 660.000 l -140.000 660.000 l -140.000 670.000 l -155.000 670.000 l -160.000 665.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -160.000 715.000 m -165.000 715.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -621.000 289.000 m -629.000 281.000 l -629.000 289.000 m -621.000 281.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 439.000 m -259.000 431.000 l -259.000 439.000 m -251.000 431.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 449.000 m -259.000 441.000 l -259.000 449.000 m -251.000 441.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -341.000 449.000 m -349.000 441.000 l -349.000 449.000 m -341.000 441.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -251.000 409.000 m -259.000 401.000 l -259.000 409.000 m -251.000 401.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -171.000 479.000 m -179.000 471.000 l -179.000 479.000 m -171.000 471.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 432.69 661.28 Tm -(ADC) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -410.000 665.000 m -415.000 670.000 l -430.000 670.000 l -430.000 660.000 l -415.000 660.000 l -410.000 665.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -213.86 728.26 Td -(PRO_MICRO_NRF52840_29P) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -213.86 737.11 Td -(PRO-MICRO) Tj -ET -2 J -0 j -100 M -1.00 w -0.55 0.14 0.14 RG -[] 0 d -180.00 725.00 80.00 -160.00 re -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -234.94 702.00 Td -(BATIN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 706.00 Td -(25) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 705.000 m -260.000 705.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -240.95 692.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 696.00 Td -(24) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 695.000 m -260.000 695.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -243.04 682.00 Td -(RST) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 686.00 Td -(23) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 685.000 m -260.000 685.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -226.28 672.00 Td -(3.3v Out) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 676.00 Td -(22) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 675.000 m -260.000 675.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 632.00 Td -(P1.15) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 636.00 Td -(18) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 635.000 m -260.000 635.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 662.00 Td -(P0.31) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 666.00 Td -(21) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 665.000 m -260.000 665.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 692.00 Td -(P0.08) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 696.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 695.000 m -180.000 695.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 622.00 Td -(P1.13) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 626.00 Td -(17) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 625.000 m -260.000 625.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 652.00 Td -(P0.29) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 656.00 Td -(20) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 655.000 m -260.000 655.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 612.00 Td -(P1.11) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 616.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 615.000 m -260.000 615.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 642.00 Td -(P0.02) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 646.00 Td -(19) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 645.000 m -260.000 645.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 682.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 686.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 685.000 m -180.000 685.000 l -S -1.00 w -0.55 0.14 0.14 RG -180.00 705.00 m 180.00 706.66 178.66 708.00 177.00 708.00 c -175.34 708.00 174.00 706.66 174.00 705.00 c -174.00 703.34 175.34 702.00 177.00 702.00 c -178.66 702.00 180.00 703.34 180.00 705.00 c -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 702.00 Td -(P0.06) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 706.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 705.000 m -174.000 705.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 592.00 Td -(P0.09) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 596.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 595.000 m -260.000 595.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -236.90 602.00 Td -(P0.10) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 606.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 605.000 m -260.000 605.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 602.00 Td -(P1.04) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 606.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 605.000 m -180.000 605.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 672.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 676.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 675.000 m -180.000 675.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 662.00 Td -(P0.17) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 666.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 665.000 m -180.000 665.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 652.00 Td -(P0.20) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 656.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 655.000 m -180.000 655.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 642.00 Td -(P0.22) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 646.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 645.000 m -180.000 645.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 632.00 Td -(P0.24) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 636.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 635.000 m -180.000 635.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 622.00 Td -(P1.00) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 626.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 625.000 m -180.000 625.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 612.00 Td -(P0.11) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 616.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 615.000 m -180.000 615.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 592.00 Td -(P1.06) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -162.57 596.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 595.000 m -180.000 595.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 193.00 568.00 Tm -(P1.01) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 189.00 547.57 Tm -(27) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -190.000 545.000 m -190.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 203.00 568.00 Tm -(P1.02) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 199.00 547.57 Tm -(28) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -200.000 545.000 m -200.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 213.00 568.00 Tm -(P1.07) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -0.00 1.00 -1.00 0.00 209.00 547.57 Tm -(29) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -210.000 545.000 m -210.000 565.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -234.94 712.00 Td -(BATIN) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -266.00 716.00 Td -(26) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -280.000 715.000 m -260.000 715.000 l -S -BT -/F1 7 Tf -7.00 TL -0.553 0.137 0.137 rg -183.00 712.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.553 0.137 0.137 rg -168.28 716.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.55 0.14 0.14 RG -[] 0 d -160.000 715.000 m -180.000 715.000 l -S -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -864.25 253.00 Td -(RA-02_C9900010926) Tj -ET -10.00 w -BT -/F3 9 Tf -9.00 TL -0.000 0.000 0.502 rg -864.25 262.00 Td -(RA-02) Tj -ET -2 J -0 j -100 M -1.00 w -0.53 0.00 0.00 RG -[] 0 d -837.000 250.000 m -903.000 250.000 l -904.105 250.000 905.000 249.105 905.000 248.000 c -905.000 162.000 l -905.000 160.895 903.895 160.000 903.000 160.000 c -837.000 160.000 l -835.895 160.000 835.000 161.105 835.000 162.000 c -835.000 248.000 l -835.000 249.105 836.105 250.000 837.000 250.000 c -S -1.00 w -0.53 0.00 0.00 RG -0.53 0.00 0.00 rg -[] 0 d -841.50 245.00 m 841.50 245.83 840.83 246.50 840.00 246.50 c -839.17 246.50 838.50 245.83 838.50 245.00 c -838.50 244.17 839.17 243.50 840.00 243.50 c -840.83 243.50 841.50 244.17 841.50 245.00 c -B -BT -/F1 9 Tf -9.00 TL -0.000 g -838.70 236.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -828.78 241.00 Td -(1) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -825.000 240.000 m -835.000 240.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -838.70 226.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -828.78 231.00 Td -(2) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -825.000 230.000 m -835.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 216.00 Td -(3.3V) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 221.00 Td -(3) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 220.000 m -835.000 220.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 206.00 Td -(RESET) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 211.00 Td -(4) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 210.000 m -835.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 196.00 Td -(DIO0) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 201.00 Td -(5) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 200.000 m -835.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 186.00 Td -(DIO1) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 191.00 Td -(6) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 190.000 m -835.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 176.00 Td -(DIO2) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 181.00 Td -(7) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 180.000 m -835.000 180.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -838.70 166.00 Td -(DIO3) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -828.78 171.00 Td -(8) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -825.000 170.000 m -835.000 170.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -880.66 166.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -905.50 171.00 Td -(9) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -915.000 170.000 m -905.000 170.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -877.79 176.00 Td -(DIO4) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 181.00 Td -(10) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 180.000 m -905.000 180.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -877.79 186.00 Td -(DIO5) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 191.00 Td -(11) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 190.000 m -905.000 190.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -882.64 196.00 Td -(SCK) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 201.00 Td -(12) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 200.000 m -905.000 200.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -876.71 206.00 Td -(MISO) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 211.00 Td -(13) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 210.000 m -905.000 210.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -876.71 216.00 Td -(MOSI) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 221.00 Td -(14) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 220.000 m -905.000 220.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -882.27 226.00 Td -(NSS) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 0.000 1.000 rg -905.50 231.00 Td -(15) Tj -ET -1 J -1 j -1.00 w -0.53 0.00 0.00 RG -[] 0 d -915.000 230.000 m -905.000 230.000 l -S -BT -/F1 9 Tf -9.00 TL -0.000 g -880.66 236.00 Td -(GND) Tj -ET -BT -/F1 9 Tf -9.00 TL -0.000 g -905.50 241.00 Td -(16) Tj -ET -1 J -1 j -1.00 w -0.00 G -[] 0 d -915.000 240.000 m -905.000 240.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 773.85 196.40 Tm -(BUSY) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 200.000 m -820.000 195.000 l -805.000 195.000 l -805.000 205.000 l -820.000 205.000 l -825.000 200.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 226.60 Tm -(CS) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 230.000 m -920.000 235.000 l -935.000 235.000 l -935.000 225.000 l -920.000 225.000 l -915.000 230.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 936.71 196.60 Tm -(SCK) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 200.000 m -920.000 205.000 l -935.000 205.000 l -935.000 195.000 l -920.000 195.000 l -915.000 200.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 216.60 Tm -(MOSI) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 220.000 m -920.000 225.000 l -935.000 225.000 l -935.000 215.000 l -920.000 215.000 l -915.000 220.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 937.00 206.60 Tm -(MISO) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -915.000 210.000 m -920.000 215.000 l -935.000 215.000 l -935.000 205.000 l -920.000 205.000 l -915.000 210.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 775.06 206.57 Tm -(NRST) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 210.000 m -820.000 205.000 l -805.000 205.000 l -805.000 215.000 l -820.000 215.000 l -825.000 210.000 l -S -BT -/F2 11 Tf -11.00 TL -0.000 0.000 1.000 rg -1.00 -0.00 0.00 1.00 784.19 186.40 Tm -(IRQ) Tj -ET -1 J -1 j -1.00 w -0.00 0.00 1.00 RG -0.00 g -[] 0 d -825.000 190.000 m -820.000 185.000 l -805.000 185.000 l -805.000 195.000 l -820.000 195.000 l -825.000 190.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 931.50 166.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 170.000 m -915.000 170.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 161.000 m -925.000 179.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -927.000 164.000 m -927.000 176.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -929.000 167.000 m -929.000 173.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 169.000 m -931.000 171.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 931.50 236.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 240.000 m -915.000 240.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -925.000 231.000 m -925.000 249.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -927.000 234.000 m -927.000 246.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -929.000 237.000 m -929.000 243.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -931.000 239.000 m -931.000 241.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 782.50 236.00 Tm -(GND) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 240.000 m -825.000 240.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 249.000 m -815.000 231.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -813.000 246.000 m -813.000 234.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -811.000 243.000 m -811.000 237.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -809.000 241.000 m -809.000 239.000 l -S -1 J -1 j -1.00 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -825.000 240.000 m -825.000 230.000 l -S -BT -/F2 12 Tf -12.00 TL -0.000 g -1.00 -0.00 0.00 1.00 789.82 216.00 Tm -(VCC) Tj -ET -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 220.000 m -825.000 220.000 l -S -1 J -1 j -1.00 w -0.00 G -0.00 g -[] 0 d -815.000 215.000 m -815.000 225.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -911.000 194.000 m -919.000 186.000 l -919.000 194.000 m -911.000 186.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -911.000 184.000 m -919.000 176.000 l -919.000 184.000 m -911.000 176.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -821.000 184.000 m -829.000 176.000 l -829.000 184.000 m -821.000 176.000 l -S -1 J -1 j -1.00 w -0.20 0.80 0.20 RG -[] 0 d -821.000 174.000 m -829.000 166.000 l -829.000 174.000 m -821.000 166.000 l -S -0.80 0.00 0.00 rg -652.50 420.00 m 652.50 421.38 651.38 422.50 650.00 422.50 c -648.62 422.50 647.50 421.38 647.50 420.00 c -647.50 418.62 648.62 417.50 650.00 417.50 c -651.38 417.50 652.50 418.62 652.50 420.00 c -f -0.80 0.00 0.00 rg -942.50 415.00 m 942.50 416.38 941.38 417.50 940.00 417.50 c -938.62 417.50 937.50 416.38 937.50 415.00 c -937.50 413.62 938.62 412.50 940.00 412.50 c -941.38 412.50 942.50 413.62 942.50 415.00 c -f -0.80 0.00 0.00 rg -942.50 395.00 m 942.50 396.38 941.38 397.50 940.00 397.50 c -938.62 397.50 937.50 396.38 937.50 395.00 c -937.50 393.62 938.62 392.50 940.00 392.50 c -941.38 392.50 942.50 393.62 942.50 395.00 c -f -0.80 0.00 0.00 rg -942.50 385.00 m 942.50 386.38 941.38 387.50 940.00 387.50 c -938.62 387.50 937.50 386.38 937.50 385.00 c -937.50 383.62 938.62 382.50 940.00 382.50 c -941.38 382.50 942.50 383.62 942.50 385.00 c -f -0.80 0.00 0.00 rg -942.50 375.00 m 942.50 376.38 941.38 377.50 940.00 377.50 c -938.62 377.50 937.50 376.38 937.50 375.00 c -937.50 373.62 938.62 372.50 940.00 372.50 c -941.38 372.50 942.50 373.62 942.50 375.00 c -f -0.80 0.00 0.00 rg -652.50 490.00 m 652.50 491.38 651.38 492.50 650.00 492.50 c -648.62 492.50 647.50 491.38 647.50 490.00 c -647.50 488.62 648.62 487.50 650.00 487.50 c -651.38 487.50 652.50 488.62 652.50 490.00 c -f -0.80 0.00 0.00 rg -942.50 465.00 m 942.50 466.38 941.38 467.50 940.00 467.50 c -938.62 467.50 937.50 466.38 937.50 465.00 c -937.50 463.62 938.62 462.50 940.00 462.50 c -941.38 462.50 942.50 463.62 942.50 465.00 c -f -0.80 0.00 0.00 rg -412.50 665.00 m 412.50 666.38 411.38 667.50 410.00 667.50 c -408.62 667.50 407.50 666.38 407.50 665.00 c -407.50 663.62 408.62 662.50 410.00 662.50 c -411.38 662.50 412.50 663.62 412.50 665.00 c -f -0.80 0.00 0.00 rg -162.50 680.00 m 162.50 681.38 161.38 682.50 160.00 682.50 c -158.62 682.50 157.50 681.38 157.50 680.00 c -157.50 678.62 158.62 677.50 160.00 677.50 c -161.38 677.50 162.50 678.62 162.50 680.00 c -f -0.80 0.00 0.00 rg -627.50 185.00 m 627.50 186.38 626.38 187.50 625.00 187.50 c -623.62 187.50 622.50 186.38 622.50 185.00 c -622.50 183.62 623.62 182.50 625.00 182.50 c -626.38 182.50 627.50 183.62 627.50 185.00 c -f -0.80 0.00 0.00 rg -627.50 195.00 m 627.50 196.38 626.38 197.50 625.00 197.50 c -623.62 197.50 622.50 196.38 622.50 195.00 c -622.50 193.62 623.62 192.50 625.00 192.50 c -626.38 192.50 627.50 193.62 627.50 195.00 c -f -0.80 0.00 0.00 rg -627.50 205.00 m 627.50 206.38 626.38 207.50 625.00 207.50 c -623.62 207.50 622.50 206.38 622.50 205.00 c -622.50 203.62 623.62 202.50 625.00 202.50 c -626.38 202.50 627.50 203.62 627.50 205.00 c -f -0.80 0.00 0.00 rg -827.50 240.00 m 827.50 241.38 826.38 242.50 825.00 242.50 c -823.62 242.50 822.50 241.38 822.50 240.00 c -822.50 238.62 823.62 237.50 825.00 237.50 c -826.38 237.50 827.50 238.62 827.50 240.00 c -f -q -102.00 0 0 20.00 706.00 30.50 cm -/I0 Do -Q -endstream -endobj -1 0 obj -<> -endobj -5 0 obj -<< -/Descent -209 -/CapHeight 727 -/StemV 0 -/Type /FontDescriptor -/Flags 32 -/FontBBox [-559 -303 1446 1050] -/FontName /Verdana -/ItalicAngle 0 -/Ascent 1005 ->> -endobj -6 0 obj -<> -endobj -7 0 obj -<< -/Type /Font -/BaseFont /Times-Roman -/Subtype /Type1 -/Encoding /WinAnsiEncoding -/FirstChar 32 -/LastChar 255 ->> -endobj -8 0 obj -<< -/Descent -325 -/CapHeight 500 -/StemV 80 -/Type /FontDescriptor -/Flags 32 -/FontBBox [-665 -325 2000 1006] -/FontName /Arial -/ItalicAngle 0 -/Ascent 1006 ->> -endobj -9 0 obj -<> -endobj -10 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 520 -/Height 105 -/ColorSpace /DeviceRGB -/BitsPerComponent 8 -/DecodeParms <> -/SMask 11 0 R -/Length 6251 -/Filter /FlateDecode ->> -stream -xíKÉqÇ£ª{†$V>ì:ùdm]uXbÅ™æZð‰>Ù€lËòh€Ëy-Ða÷$`!q‡Mr…õÁ€N|ÖÑGëØ^­_ÎLU¸ªz8ì™îÊügfdfõ0~° ÃÛS•••‚EQe"÷EQ”a¡ŠAQE¹ÀÛ¢&\ÔíãÖógnþ—_ÿ»@Q´ÿæJ¦k#úôûoËü(Š¢œs•ßd—AO%1ÛÜGó·Å˜fª!Eyk¸‚ònç!×&¨…®è”Ä쯯àŒ)Š¢,r¥ÄÜö—lì´óUÓ³¿¹Ró¦(вÈpÛ\DUánGòüo¯Èì)Š¢,²ö¢mçó(î.Á@QÒ³¿\û9TEYd½…ÚdŸ—#‹Óܼªésu.)ŠrUXWqvkŸG< á7yöWƒ¢(Jk)˶÷y€ãnôÔsÕ Š¢¬?ë'ȶ÷ºì„¡RtøƒOQÅÆ:‰°oNùë×s€™žkºƒ¢(kËÚȯɯÏ`U7(Š²Æ¬‡ðj£Y8µn+jŠá›RÝ (Êš²’K@+´Uñ¨à³¸Ö™ñˆ¸Ùš4ÚBd^T7(Š²Ž¬Ø -W ㊞ºg)ß}À§] ¾4TIQ”µcè2+D+H åí‡]ÉnoŽh6ú<+Š¢œ“S`½?åw~‡NŽ©ì*cÏ{!´ÿæßqÝë~j¡`z&íÃñVêPRe½È °øË4—ÑÓhºß¦ÑyÏ4¹AQ”5!´šìvñ¦Qo˜¤_Âí}¯Æ?cšý…êEQÖ€¢*Q®ò Íþ>‘ä½yÀ×ÈÍÏû¥(Šƒ¸¢êÖ>?-h–ÃQãêV₞É¡ôÁ”Ç7âߦêb…õ~ýÙ>HRǸ¦Ú!ŒÐ<ª²¹^}v~Ùü[TTíÿaŽYUmþA¤óËX³³Ó$¤©‡ñ;9lÒìφ²"wö9$ØÊÝ3­;Ây¦FðÂÀQµ®¤ª¨<¢íb~ºx-Q.š²úéõ}úý|Šá Ó±Ãïu -=9àÔ­,jšiãŠõäîc>9‰R#Àbóɪ«Æ|©£™á®XðñªýË_4eõÓbí—'÷™6~ÿª /†¡¶v¹ Kßó!I€€"NžbeÀj‰´áÎï”ÓŽaž?ûÍfòƒ”¼bê꧃1N§‡“ Ò3°Èº¸w•ErU±4¯–;q5Ž<‚LÇcàçÉU”æóbWL¿n%_œ„ìÑtÞÌ<Ša0ê\qb{—‹ôûKj³_ûÛª§YÃé=Àß~Äã -úe$CSæŠé½Õ#¦Ï†$_ný^¡?.êv£š]>êŽAÁÉÕ6±<¡Ãþ0tϤ"/R®ÛÛ >X$¥%¤‹˜AZÚ1c§è{÷øËod¸¯6Ç^Sr)k-䔎ŠzD/⇺lí³ÓÞ,†Æ¸bzÃs°&§gÁŒGè“ÇL§‰ïÙ1H¥®Xɲ¿´šÔUü®S]ŸÒ‹¿RèåB·róÄ“ºýwL­w¨X|Òæ¥”]”î2C®Iç‘»ÄÓ2·wÙÍ,!S*¢N†àfÀÌã©&»€Ybd]Îÿ­]9U`~·qQ]eÞÄ3ß}ÄGØ‘ÑJRºYÒQšà¶¾ììrÖŒà.ïì¥ÍŒÈuNO7ø9ÇÄ(þ—óŽ‚÷0ù'O˜»¼vJ¬g{Ûdº ±•Ù¥wæÏq9”ì Åd+,æÓ©©QBV•Ðð=>qUñº6F÷BÝ%1Ú·»‚ÎD؈û_Î㸤çý‘gVõPW)BØyÔ2„4±qa¢‰ÊJÔŒ$¹Ÿpç€kë†Á8ªÖq]ž„t qÝà¿’.!êy-»8Íþ‰”ˆ}ÀŽ,ÁwŽè§È·P²ƒ%¦?üC>4pT·»ºa®£—Ý߇8Ä'ßóZNšmÈÇÅ19¦‹ mƒ>¤¼Q eM‡i÷—ˆ$- :„÷1­Ç̱m¤ t^"ýµú\Ë© 8º4R!t ó"ÎÔÝù!W'öŸ êÅ}g«‚ª’æ>fd5ÓhDÿuþéO3å‚|Ìÿñïm Åâç0¨I“±ÍÓ?x¤]¯“€–rü† Ùù÷¹–›fR¡é4Hö•4 8•éáBK·rYA‹´1ôÊcúL:š{%·»õo˜¿¢;ógÏZp¿®é¥D1œ[{P|òÊÍ=²`2(«ºòµ£¼K˜êßúþÚï^ƒ6ègrŽ_ç ¹9‘ÂN›×ÙˆïÅ?  “¬Åþš9,zYÌDí†4é<*W)*¤¡‘/w¥Óúäs8‘y«+<¸¦.èEØ  ºåšžË¹òœ/ä”Ãu%·ÕN´¯¼›ƒ‚ÉQ¨¼A>ø9Ï´ch ÿ@‘9â3’hvsß~ÈÖ~I቞ž7¾ó˜k[’|Êœ9Ó)ÿ«­–sàé&*¯Ã¾”[<’°#eó„¢í -úŸÙœ¿ƒÅÓ“(mŽ!èkz‘¾P‡\¾’`\ø¨ÌžhëõOŽèa^‚«Q]B’v™lª:P]}ëÇüµÿƒ~ùÕˆ~黨ðzyfdu³Û…Œ’óëj­´•´Éz'Îñéˆ>— ö Ëøƒ)o\nµÁôó`i%å4ˆNk4G  Úå÷ˆRI¯ ˜à]/¢[|M·­=.ƒ§-†°u»¾¡V'’W3AÖãŸÌ¯ ¯¢_à:œ<`I¥÷È-jÌÏ;FöLÃõÅP]£—ßK»cH¢®&Ϙ~ üÎW1„7¬æ8Y¨nW=!ƒêlˆ¸ 3ôn»øÍ4–õ)ZPeS ‹¸¶V5¼JäRã1=í9ʾ0ɰ“AÊ›të1€ð_d%ghª l3%¶cØíª® -ÝnÅ”®Z!g?+ÚÿÚþsD³„šÃáN oz8ç'"Læ5Î(BY˜;q5~'ų¿ø©£ZÐëÃÆ÷"æ…Š¸’ÌåoÏç?–´JaЛÅøc\а±%¬Š•\÷MÄsŠ…É”iéLqù]¬PEØõ·ö['U¸”ˆ ®ÊŽ¡•_´z†ŽŽè¥µ7(¯C3¶r´t¿$@EBe €~9ëÞI<ú­i%´E÷\Ô›uäÈÇ%»²›+Fõ+šÍd>ÒoNùë@„2¥«?À¥Ô«ÐÜ®Q97Î2ý.Š3ô®@v’^««_à}³xíÜØZðšÉ¶nˆè\õ›rþ˜æR. ɳµz“¼«¨z_MD€¤ I"¡tö:˜Vå´^úÕ» -2î¡/¬ÕÔ;Ø»¾y í9 -Ò©h× Þ -º5vÊWPŸôÞ»HÇæ#Ìnîò šÝ6*8®WðœÓê$1{“ eûBñ*rb4Ï$!&î?¸³Ëµˆbèöò®üåJŰr ’tÇ€´YGÅÐÅÈ¥€ôIêä +’~ǰ¸×°ˆ‰ð¹û˜Oá -NRT«62ÌOŸ¥yÑ\YÏÛwñ‘­–Œ¬C{k—Këá³ílÕô/,¯4—_}Ÿ5iޏCpQ Ø~Š"(†÷»PÑy.x1ïm0¦ÍMrÚ§÷±õ€/ug‘]| È¬&òS_.=£Ä™!²V!°ãt…÷=þ£)ÿ¯­ÊlŸ7 Ùt:éݤ'RE—ò‚œßgHÂß&°w 9²ZírøõÊë÷]3ܺrûcô;‘hH9yÂôªK *Œ¾¦êºg©¬û\mõ„‘ôcbG¦é‘`MÊ@úºQ¦¬êj½òî<|)~EñËtƒ -8;N/$‚%4ÇqI_ÀKSp{‘pkxí;Vi7¾uû_ë•N$Céß`FÅ6¬æÅ7–—“Ë£M‹-–ÂÝ|2(þ/Ø5)M*»Í³>—]ä &%ï…[”®¹aÇ«G$ +B=¢ŠéeÚðtHL«çEy0{oDÌ”K˜•M  pT °7‰¼F¶³Ëìäè¿D£A7é³?7nè¦LÒ aRq ¹×ÝñéQÜ[˜î¸ìëŠ^•‹1«@§(RÝ@lká’7 Œ\pRâàäa ¹‡®€[yC;”Žç˜þeœ ìDíö—x{RSZæ\”;GÖêáÉž°Jh^ç¾¢ipN¸ø·bH݈xù‰;ûö^X‚RƼœ\×gbÝàêM‚BTK-—ÍPp;mpP.v:jÑ ;>„*o†É -ç¿Ä½Iï¾GŸü1|Ì%z(ºì(ˆ¦y}DŸ -µÛć²â‘%O1$α¬(w™OÕ _¿œ½=Â7)^'™*†´ƒóBœìݲ°Á#U¼æ„L‚»c 6p7n¤P™ù¼È«„‚N+ú\®”^y;Pj‹G­8‘2öÜšªê×ýêÖG¥¢?é!éVn¶e2doÅ­ßϼ -q1J·ÉO˜ÿÛí…˜êõØí"õÈÇÓ»ŠA ² Én _˜5mÔýEÓ~qTiwu› 8+i*x؆• VuÁÙçÄ+æ^f|`(ˆp²èήÁpòà8Ô”ñÑK©ýæ}¦ ‘+ØZq9Ìáü= †­Ñç%žúä&¸š»6ç´¦ñuªKe }FÞçXˆ»‘\Äq5 &H´OßhÓ´Tñ¸©Gw¯„;Gœ*@¥©”¸Ó¡`n]†0‰þs‚¼§s}öZ»WàhNѰt\\ JY£éEpŒN«1è'óäø{i‡m[/ÒÖ`¦5Ô­aÉ!np)'ä6}‰ÚŸÅØ­BêÀùœUÇ­‚ò~áËËàÞÇüå—©oŠãp:Vfñœô/ñfV F[ ²Œãã!¾t×å'<ÊÉ}æ ‰‹S1¤²»Å£ƒ²é†c¼¦¼8}.4bÊó®a–àΉ"+çÃ)ƒ!ä°îu(ofOàÍ| qBÆ ‹·K?w÷Ci!bŸÑ•ß`ß+ÌÉbj™ãäübÃ1¨+ÿ¤¡ /m­iÉ­¿ æñgÜ.X:¸r²´gUô™KK,3rç×ÖÚf">‡[Ž)Ëš+ß‹µ„»D–ÊjÊ bn¿aó –5öû[ÛoL"pe‘ð|r(¢L®õ^šÄÕeÌŸg®QYm5PþÄë]ÔÇtݬÄé­ƒx¸j¸1¾Õ…ÁD™³Èe\óX[€ÿDV7TEÛFÉò°6/¼C€@õ§äÖhžÕbûÒo1A‰‘·ÿÕÙ¤û`§PÁþoT:Á-ü݈¹}åVq¨!,J_jè%D¦´1#Ž7éß;»ÁºD«$I(‰ø”¹S–t(×0'KKë\¥SWÝ}¾Ó/í;*Übð>¢Á)†9Û]J×w+[CDi‹,Тˣ’Úû›ÉRÒËIá…–½Ze@l=äQ½b½ák tÞÂjØÍAäŽø¹T†`&wm3œ²@†°] ì r²28í\ݸREôßMP+׿Ÿ*z³‡Eâ©® {³~Å|ÔƒM lwǶ‹¿pZÍf‹o@í3/ªM¸›ð`c©¶wç$V àLŒQ½Ù.%Óã“D‹6v­›]/îâp*”’ã4Ç×B )»£Dðdòb5ë~ƒ| -JÑ -Ç$ÆþÞ ÛÃzW3ùæovѨž}.‘RÜö{ïßL%•Äo#4>Ý‚q)Cà?ª.$aÜ,ªnÐñ¿Ðl&vJü,‘c >’lÒ*©UÂ4v)É¢ +¤Ûi•Í¿Uç®MÞ`娘ÏlŽðñƒÆSÆ©P®0ùÌØ„þHÉŠ°èaì>"ÊÛIÎU•hÓÀôÎ+ú©¨VQ¢’7aJQr.¬6ÁÒ·ºÇ€Š’Èf‚3@Å•Ì +z$eò&SŠR#}[Må­"ÿÚŠçPÒ£eí¸yÀ×€âUA_¨bP¢1ˆµ%Ó2rª¡¢Ä¬¤§ JT†²¼dƒ” Š)J2&˜€2Mª”Ø h…Iéu¿*k -”F\«UQ¬ k…Mº}´·v(ºäFÁjbŠ’ ¨±S(Iâ"këc ÖßÀQ²O%)Ǧ(4LÅ0gò„éU×wÅX™™êŠ^º4'R”¡Ä_h”’ŒõXgm»×¯ÚR9ÕéYišF|yLÿ¬ùÌÊ•Ù.€ý-%]gŠ’¤^×ô\Ïœ•TèRS”œL1ÝÑõhAI‰®6EÉ ¢ª§ JZtµ)Š¢(PÅ (Š¢\@ƒ¢(ŠrÿÔF- -endstream -endobj -11 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 520 -/Height 105 -/ColorSpace /DeviceGray -/BitsPerComponent 8 -/DecodeParms <> -/Length 6577 -/Filter /FlateDecode ->> -stream -xí] œMÕ÷?ýòÌcÂ=ȳñJ„ÏQ¡‰¼j"*"Íx—IJŒh”GQž¿¼‰"oò袌Ô4¦(Æ`BÑ0“_¤ÿ}³×Ú{í}ö½3W3þ÷[öÙgí{Ž{×Ù{íµ¾k›Œ ‚pâ¦û‚È*Bnä¬"„5 -êüÿ¬߯»”£ŸDÀsŠÞ0<ün¡wÍê­GrìA9¤•ºt©);·uۦĜ¹JCŽ(B«.] -+>žóuN\'ˆÀ!¡WÏföBKælÍþ•‚²­5GtÑ\1g}v¯Dà]E<¢¤¶ì¬Ø?²yµ †ì)B³­|OŠÝ”­Ë8dK^œî눑qÙ¹^CvaôHßǬŠý)W "`ð_ò­Žôg؉Ëý¾dƒßŠPùG>Ô„\á¾½²3ç§§/SÚ‰¢‰ &äBø©!ç¨Þ‹IÉ»¿:fVŽŒ¤W &ä>ø©Âľ¤…‹~ãûJ·Šz\”¼Øz—— "`ðO>o/t­[¸”–mÛGT…]­/úuÝ }E¸ÅM4(uñBæùˆWø“ãÿ+I¨Âô~Ú× âº@SêvêXMq:~Âåð÷ó=ý|öEPè(Bx›¶÷«ÎÿñÌF»è=“ëÈhú£Æ•ƒ¸n°W„V/‰ÂÏjpŠí»w,zÆ~P×vŠÐ¬Ÿ]”9¡‘Þ•¾ŒÀÇÏ,ÒgâÖv™{öæNôM[‰„ð†‹¸–•u)+++õ?D¬éPÉ©¡~¿^vJ­¤u?†  )Í2tGºq²½Lú› -›õßÃ*ûÊ‹IÈŒú¸'þï#GR$$ýåëµ[<Ò¡ï©ä”Š ]ïèÓ]L¤'Çá{KGëß9ëx´ü)…¨L²Ô‰ -ø¶0¸Ð¯G6.Ý¡92ÿ‰P-¹b|¼¥Àã³Nö2N¤U°š#4}çšK™&jìG‡Ê žDöÔ·¿cë#B¶<Ìu¬š —ûR=Eï¾+gÀ¡9—MfÇÌÞ:jØ9gWvÀÇõV+­ÿ¥Öþ½+ަ¥¥U¯áúÏÝÑ{¶Íxa–Ðe¨ðà±uZŸ?óEoè:à·Ûu¤ºlÒ#‡ÛhBsסڰ“Š0Xt=lür-¸j­îÝK¿Uò#չȾ -BßÁ¸…öû}¨ñéé5í²ë‰{êHMš˜ÎÞ«õÉ)O)5á«Æ\Ç -…½M)BƒÝ|ÏŽ©<§è®nݾ¦º ƾFtÆÙ{,Æ¿ÊÚ£h‘‹‰‰>y&®ZdŽQ™€%ND#Bݵ¯ÔšvŠë>ñ)ßs´¼\šR„…Ýðñ¥ÔP¸Š­±B¡æ>ªWiк±´3kÛ.޹ -p5|aŽÎˆ† ÔˆêQQ5xÉØñòO!XdåáAB"9gá‘~ýâ2üP‹êÝÆ‘<ZÍÌ2—sò†1¯³vë/tFtd/4¢Y‡¾x7wõa鮋Š(¬:BÖcâ7 E‘ì`~w²ûíêa'î°šûïSÈå>Ì{–µÃ~Öñ -0êªã„ ˆ)ø9ZÅm Δû>‘‡’EEè†-·# -¯·_xEbºö÷eAvÃc¾]±D¹²eCÒÓ§ÿOs@þj÷•=æ„o—‘ÁÑÜjž+¡58`ÏÞÉÏ~œWâ¡/éÏx} Ñ™^VzMQv7€GU| ÛCEìò‰bTK0Cú²E¬Ò£U¹ÒæÁ–%›ÛŽè^½NOóƒ…{à™Ö¢ÃK-ù®ÅqÖ"Ýø+«W²`¶ÍNo™ú`V™ÑW~m†ÿd²1’î±J¹wKf¾ûË.*(Âð«ø¾‘î²ê¢c*s= -÷ð@q¬¦“Ç­/G|#A8Ò ãtÜûfóû:Vo 2Õ <ÊFo@íéŬOM2½é#Þ& -niÂÒj~=ÞàűRCŒW„È$è®áòó%£GᎴ¿Ëdw4em- -þ­Ó;KÏ•ƒgÅ| “<ʬ°3·i|rõŠ’>’VûË[%ò{gü‡³ãûº¢X±³7³ë‹…Œ;%6&œ˜Z8(‰›Ó˰ÂðØØš4¨ŠØÄ+Š{> 3'Œ¯›HäŠg²vÒöŸÛM=•MBtò±:óL©nukŒþ´Tl4Ó‰¦€HºDuà¥NÜÅŸµœÚÇvGXXÕ~åÍ!ô,!»5° :MŽ_•csÀsáQI‘¥Á²>¿‡í§ö˜k#Ð+Í0~ÇŽj•îÔòúÅ'1\×%¼P8Èìý•Õ ÝÇ*‘žÖ -CÂÌÒßÊÐ"hoW!;›èyTvÜæ9.:¡åàÕ6åá4 lLèàdôÊ6ÏÎcm)±gÓ•²z® ”õðÚûÊ…wLæð¾‹dŒ`:kµÙjž/f5ôÇOù'3ßÁw2^ $´áb^~“žej‚S„[ z]*_…~c#Çî¡¥ÞeÿI£Þ2[BÁ¥Ó§C¨È.â´¨‘Qá({·<Îì“CŒäï pw¡rG•7íÆ†Þhê=Ël••2rÓ¢®¬ýÊ|ÎcO•j(Á)¢*ÊM·œvÜ·Ÿ"™2<Möü=£ê>³z¶+šWªnݺB<ž=¹p»”2nC†Qº{w¯°)[¾€åב{Žá\z›’Zêl’[­ºhÅû²ô.˜jÀyMtý9ì]Ã'pŠ€nÛ7º¹·FïØ®8½áQpðíø“%| œkáN†Â»À3g2{«óÛœ#ˆ™ÃÕ€ÅÐØ»Ú/‹rý ½@`Sõiú¤xÀ΀?_ÿ©wijpo"ÿ9{‚ï‰sS]rö6ð1BË)z<;håÙ!ÿËѸ/ î¾e…T  n·GéÝåA×ÌQØìþiÌs‚7·™Ü9WæÙÅbpË ÃkÃ=ià~©†Úݵ ) ¶ýKÓX[ên -ÂÏKºÂ3æw¹ˆÜü̧¯é$ApŠ€Öbzë#úD»þ*J)2í$)µWo&»9¸V¤WÐðàe´Þ±L\¸4°@èäœ)6ç9«‰Ö†Õ HßàÄ2Õ3`áO@?zìm¥¸~ GBQIë± ®?=ñ)´)¯QÒ,pе1'–†nÑžXfb³,¹ÌŽ¥¥ZYÞ0©6ë â”Çàš³ ð×GYw»1=n32 ˜"0ÈpyÎq0WHú€«|²,µ|WXm`¼R)·^o÷Ä;˜{²èƒÆŒ&?S„¨eàà *¤í :D?d6G+RÃQésiÿ9Õ+ÀõðvÙö¤ -EqwëÀ–KêmfPçâ¶7Ÿ´üš×J±µág¸Ó‘†NJ<ï°ßåüÛ€3n-*¤ºÿ:侟ÞH‘µÞv»lÎå¾w¸Rs^0²ƒG€jFyéÝéð¹-›NH¼ªu{Ž¿êTɆ³8xâЪ˜õ¢Ì½Ü lm€d›µ¨`”„Àá|8X~g.tyí H†Î/må' 4³¸û/¯äÉ8÷Nvor½(d³O¥×9„‹£„@á 1 ­„÷”Üb눕”ëû‘Õ„ÞÙÐoA*£Î¤eê€1Z쎕&…€¦L`Ú-“Î ÓlR,l1÷§xwÝž9Êt‹>D} §pÆ1~&Š)š¸%,,ÌÅþ’0^j üÀó…Ê ¼Ÿúæ4>N}ì¶–1w¥6miW0âcrAè•ÃI~a¡ßŠ›Í?*{×ÈJä´ïIÚ¢ £à¦&Ñ¿+Í€qTÜn¾Ldz.³ñ~vK¦ñDF¶…yâо\áy%[6mjr®g®Ã"•†ŒÍÅ>•tˆ‡êïôCrÞRîY)Só‚Åû@ÛÚ‚ß`ZرáB8Á…åŒØâ]`Ð÷.Ÿf1J|!\2ü‰åì÷÷£Y›‘˜ýc:Hú6úc­Ç/QÛœv’o^âaL²% YÝ"#q„wÉÇ›ÑqéWéì_i,Æçèì2Køzß=Žâ—§Id¾¶V^\¯YÊ.¼Gù€+Ç»6ÀDÑžó°4¬S)UrCýÞDš -7#l®g¾õ]|–HÎ'¿b¾¹åRÈäN÷Æûâ©ñŒUt¸Œ—~¬–ði' n+ f&©÷ÝPr'ØRd:¥½4".;miå¡ú®µæ°§ð/=Üj훌“wJîc ˜Èn“e…ÂêWCÌÍn/PAŠ÷Ì5^b6I–#¯˜ì6˜O%ì2A|ǧÇ㽎ԛ^“ªöMŸN×Å@•eÖ.Îæ”zßÝ·® 1ÚÛ“¸„‹¨ ŠÀ®Ã½6€ð¢øƒ(Õ-‚±+ÜjÊÿ Ñï³6ãgü);8«)tKáƒTnÓ²Ëö?p”g¢N{Ùõç ±²² -¿LŸ!K™õI¼ ó4aÒŽ:¸ -r¦å ã\4à½l­'qKÂЇºÖ˜”)ºÒÿÊo5U¬YÉ#/h“¬Í —16ÕÆB2dV™ ‹yKµ -6öªFß8"¹ÆSS§K_ð†ãÐdRàƒù‡hª4*_¦åÏù?÷Lä–Ñ«V’ýS’[œ+?âÞº† ¬IzE €¹¾=B"ƒÒ”­ÒH׸3n¼÷Ù+4d(báÀ·‚"à`Wž~¸ÕDÅ}GerÕpâò{Ó)/‘˜™B’¢ Ö"“hM€üš˜h@#ÿj~â4Ÿ®-f`I³ãçk€×LtŸÂذΒ€«¿Ô£I4Éæü&†·’¾Ý¿ç›Ö¬_÷7ÞÅKR$ŽæŸïhyhâýJƒwÚÞ3Tu¹0WÞÚ–øµ|ÿP&ÀÚù«L/‡Y5¥è©÷™0‰µ_éd&¯ÝÂúÿןÜãZ¹BÐ. B£4eÓ‹PB?%³‘Ý« -xªƒ×Y¥Å°ñátå# m#CÞ`Xhˆ¤´Ñ©p·'™zOCëd~7 æûäp?DQaøðÔBC%'Q²«àn–œ'wÝòø‚ 9{JŽà“ÚÞCúÂãüitÐÓWqŒ,—YèOÖ¦§ 0:õà·¤°'Ò‰ÙFé°Fß¹:iÜyé£*ß Ì~žµï%§Òká/aXõê²xQT4Ü Eà …ëZ%{ªsI¬ž¨b&¹ÀEëçõ¤„jç¸MQw4붘.žqTõ7Pê @j@L­ØJ7ŠAh­¶ÏäY‚<¦æ£Ã3Pƒ`šP×â¦ç®(ö&”iaû8»ß=‘Ûn5'Ë>t®^BíÍ—óYm‘”â\ƒ_úˆ’p2Ìþü]”íKN/€‡*5^1@&OVJ` -ªhN¶%:O¥woå¿F|Ë·ür`oXÕòå"ù-[ATw £m0ÆyÊ(¨¯ ‰Ç‚Û[§-¬Ô6»8*ß6å_558$ÅCn§òˆ€e;‹¼h€‚›Ò‰ª1Èc˜ÕÄ;[j–ðó‚ȱ&gÁÁæü‚ñÌó¼×™ù•ŠëDÚëvocÈß®½ðI”°|R›Z­°>õ BO>rB¿õWȉ±’ÅT¢!¢9OÆeª€æ€÷ 0ü+:×BcbBP‡9ëi–{6ñ÷mBö'½ Ùe>ðòTy¦³#ÅxO¥Zµ­H{©ªÕŠtTÁ<÷’Ïì’Æ` 3£½ÞƒÓ™@2l—ç -&Œ@÷WAƒƒø¯>K¦ZÂuèám”èx(11œ‘ÔÄf8RžuJWÏD–+(fãÒ_lá­ád¿ŠÊå¬9qmäx1¨ Aæ¥65nd°‚3˜RL~ -\­ªr¦t4z*Á‡yKÑÍêoùÜ€ÉLlY¿ãwO“/;„‡ÒÒLoXeBG4­WOpš›WíÀçCx) aRœ¿$OäÖ ˜øBüê?š*“ï± Í´Ëæ·dýÕŒ]l×Ù­I¨ yÑØKñ“•ÒÚ|½×´3Þܺƒ6‚0sÝ]£¾n@³{)Á¿ÃR˜]#ò*ìþ¯1嵜ÖÀÑ¢X‚5K,é-›jÛ."ân^`W.œ8óuÊfR;§= w †ÅÇT"a’Å´á¯ã“½lùˆ¨(.Ÿ~“iXÖ\Á¸§kf=‘U¥aðÈÛ*{Iâ³àßcEa1ʹT…sxXQ,È~QÔ˙ėËóüéš±@梽RÇ,@¤UR-JÇ))«J$Ö}¤aÍ£‚Ããä/)U¬XQŒ‹š3[™e¶¡±5KFÎÇÙNeº`f€E˜Ñ—i˾ ®ÄŠ ’|‰ìל–rã«Þ|É+©ø°dše’µ&4Þ\!¥qaj)2Z˜[€E]•‚ ozþù—É #¸HíÌF¢ì€R?¿2.bæèeò¸ÀØÀгð£Pœd -ñ1…^a4íÅS)]HpÚh—úÐ^@7ÿ +¸Wm»NIƒåY¶]¦|9Å‹üËK]@toYɱâJ°mͯý7¶^Aþ–¢l𲼄2+ÊíXßÑÔWªZ’¹€§âËë0’ª^ß±]^0Á25_f´4#‡/U¼„œŒGËCJ©G[<À²®Ç~7ݲÔŽÛ­Üí5bü©‹Õ¹ºkê}yÍ1Ô¬©0éÌô•»r¸2þe½½×ÀuZQMá×/ÙìÄêá6Z,©Ë`È|™°þS2ʺM‡˜©J¸ò(8Æ3w úþ[n… -}Ç~ê°sÐ<Ñ_tÏ)¶´O¨ÎŽ¢T·+ÇÛ(õZd%I5Á»›½øìÕ|`¡ìTìçˆÊ뉃 -*€ Í‘tb"FÚ4èØÜ 2¥®/À*>>Ÿ²/ïÔ£¿@ —;”$¿X2§ÂÇ»w·–”’Üׂi¶M˜=ìœa¼ð¶gÁCÕÙʽF×õ•¬¹WXl˨+­RµT^áOr Cwýòåp…©]"“°ÚùºH:u¾"##¹Ò˜Ró­óˆ¶N/_î°½z#)·Käj=ør+ô¡ÞVy<Òå+XnÀ\G!ç!ÏB_8V‡Ò'ãÖw‘¿#ÏÁE°ñvä·sÅ`˜â¹ñ…£þÁEPRÚ7ú«ÏÀ!ž!Zò¼ŸA±uTL½á“mVý÷î#Çá›"oÆlÝÓoü¹g—c‘§à£"•c¢ÅÎ';oHÀok¾»/ÀWE0Œš]ºà°ÁêIŽº™ÜXœF]©!¯ÁwE0ŒÂíXy½-ŸlÖx3Å‚a€ƒí’üQò— - ÍtâjŽÞMnàÈüUBQf<Â_Eø X4šf.å]A0ÓFIÏ‹*‚> ;°Ý¹\žDP‚p#¨A¸T„ Üø?ó†7Ó -endstream -endobj -2 0 obj -<< -/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] -/Font << -/F1 6 0 R -/F2 7 0 R -/F3 9 0 R ->> -/XObject << -/I0 10 0 R ->> ->> -endobj -12 0 obj -<< -/Producer (jsPDF 0.0.0) -/CreationDate (D:20241217154849-00'00') ->> -endobj -13 0 obj -<< -/Type /Catalog -/Pages 1 0 R -/OpenAction [3 0 R /FitH null] -/PageLayout /OneColumn ->> -endobj -xref -0 14 -0000000000 65535 f -0000102899 00000 n -0000118853 00000 n -0000000015 00000 n -0000000125 00000 n -0000102956 00000 n -0000103126 00000 n -0000104180 00000 n -0000104307 00000 n -0000104476 00000 n -0000105520 00000 n -0000112030 00000 n -0000118988 00000 n -0000119074 00000 n -trailer -<< -/Size 14 -/Root 13 0 R -/Info 12 0 R -/ID [ <906A4C76C35816C42EB6FFD13B3B7D92> <906A4C76C35816C42EB6FFD13B3B7D92> ] ->> -startxref -119178 -%%EOF \ No newline at end of file diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf new file mode 100644 index 000000000..63a80dbbe --- /dev/null +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf @@ -0,0 +1,33346 @@ +%PDF-1.4 +%ºß¬à +3 0 obj +<> +endobj +4 0 obj +<< +/Length 334350 +>> +stream +0.14 w +0 G +q +2 J +0 j +72 M +1.00 g +[] 0 d +0.00 1197.36 848.16 -1197.36 re +f +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +2.88 1194.48 842.40 -1191.60 re +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +10.08 1187.28 828.00 -1177.20 re +S +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +71.28 3.60 Td +<0031> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +71.28 1188.00 Td +<0031> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +211.68 3.60 Td +<0032> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +211.68 1188.00 Td +<0032> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +352.08 3.60 Td +<0033> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +352.08 1188.00 Td +<0033> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +492.48 3.60 Td +<0034> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +492.48 1188.00 Td +<0034> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +632.88 3.60 Td +<0035> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +632.88 1188.00 Td +<0035> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +773.28 3.60 Td +<0036> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +773.28 1188.00 Td +<0036> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 1042.65 Td +<0041> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 1042.65 Td +<0041> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 744.75 Td +<0042> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 744.75 Td +<0042> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 446.85 Td +<0043> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 446.85 Td +<0043> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +4.68 148.95 Td +<0044> Tj +ET +7.20 w +BT +/F1 7.199999999999999 Tf +7.20 TL +0.627 0.000 0.000 rg +839.88 148.95 Td +<0044> Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +143.280 2.880 m +143.280 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +143.280 1194.480 m +143.280 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +283.680 2.880 m +283.680 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +283.680 1194.480 m +283.680 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 2.880 m +424.080 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 1194.480 m +424.080 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +564.480 2.880 m +564.480 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +564.480 1194.480 m +564.480 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +704.880 2.880 m +704.880 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +704.880 1194.480 m +704.880 1187.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 896.580 m +10.080 896.580 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 896.580 m +838.080 896.580 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 598.680 m +10.080 598.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 598.680 m +838.080 598.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +2.880 300.780 m +10.080 300.780 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +845.280 300.780 m +838.080 300.780 l +S +7.20 w +BT +/F2 13.090909090909088 Tf +14.40 TL +0.000 0.000 0.502 rg +613.27 70.30 Td +(Pro-micro Pinouts) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +793.59 43.36 Td +(1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +730.08 129.04 Td +(2025-11-08) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +730.08 114.64 Td +(2025-11-07) Tj +ET +7.20 w +BT +/F2 13.090909090909088 Tf +14.40 TL +0.000 0.000 0.502 rg +474.65 120.70 Td +(Pro-micro_Pinouts) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +709.35 43.36 Td +(1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +510.19 100.24 Td +(Sheet_1) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +509.74 21.04 Td +(V2.0) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.000 0.000 0.502 rg +572.88 21.04 Td +(A3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +2.88 -1170.85 Td +(1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +2.88 -1170.85 Td +(1) Tj +ET +q +1 0 0 1 0 0 cm +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 71.44 Td +(Reviewed) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 85.84 Td +(Drawn) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +509.75 42.64 Td +(VER) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 114.64 Td +(Create Date) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 100.24 Td +(Part Number) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 43.36 Td +(PAGE) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +745.92 43.36 Td +(OF) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +339.84 121.84 Td +(Schematic) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +656.64 129.04 Td +(Update Date) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +566.53 42.64 Td +(SIZE) Tj +ET +7.20 w +BT +/F2 9.818181818181817 Tf +10.80 TL +0.627 0.000 0.000 rg +341.28 100.24 Td +(Page) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +332.64 139.68 505.44 -129.60 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +548.640 10.080 m +548.640 53.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +398.880 38.880 m +398.880 139.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +649.440 139.680 m +649.440 96.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +721.440 96.480 m +721.440 139.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 96.480 m +491.040 10.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 82.080 m +332.640 82.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 125.280 m +649.440 125.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 38.880 m +332.640 38.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 96.480 m +332.640 96.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 53.280 m +332.640 53.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +491.040 67.680 m +332.640 67.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +838.080 110.880 m +332.640 110.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +606.240 53.280 m +606.240 10.080 l +S +q +0.33 0.53 1.00 rg +[] 0 d +414.402 23.650 m +414.554 23.764 414.738 23.821 414.949 23.821 c +415.233 23.821 415.536 23.720 415.859 23.524 c +416.182 23.328 416.492 23.018 416.789 22.594 c +417.936 24.359 l +417.580 24.852 417.138 25.238 416.604 25.510 c +416.070 25.782 415.503 25.915 414.910 25.915 c +414.066 25.915 413.328 25.668 412.708 25.175 c +412.088 24.681 411.778 24.036 411.778 23.252 c +411.778 22.689 411.976 22.151 412.372 21.645 c +412.655 21.285 413.169 20.848 413.908 20.342 c +414.547 19.906 414.943 19.602 415.088 19.432 c +415.233 19.261 415.305 19.096 415.305 18.932 c +415.305 18.729 415.213 18.559 415.022 18.407 c +414.831 18.261 414.580 18.186 414.264 18.186 c +413.466 18.186 412.728 18.609 412.055 19.463 c +410.572 17.806 l +411.231 17.136 411.831 16.668 412.365 16.415 c +412.899 16.162 413.499 16.035 414.152 16.035 c +415.286 16.035 416.149 16.345 416.749 16.965 c +417.349 17.585 417.646 18.249 417.646 18.945 c +417.646 19.476 417.501 19.963 417.211 20.418 c +416.920 20.867 416.314 21.411 415.391 22.044 c +414.811 22.442 414.468 22.708 414.356 22.847 c +414.237 22.986 414.178 23.125 414.178 23.265 c +414.171 23.410 414.251 23.537 414.402 23.650 c +414.402 23.650 l +f +0.33 0.53 1.00 rg +[] 0 d +423.434 20.102 m +421.528 25.674 l +419.168 25.674 l +421.924 17.559 l +419.142 12.841 l +421.680 12.841 l +429.373 25.674 l +426.782 25.674 l +423.434 20.102 l +f +0.33 0.53 1.00 rg +[] 0 d +397.908 24.093 m +393.267 24.093 l +393.650 26.731 l +393.650 26.731 398.574 26.737 398.601 26.737 c +399.247 26.737 399.774 27.243 399.774 27.863 c +399.774 28.483 399.247 28.989 398.601 28.989 c +398.581 28.989 391.455 28.989 391.455 28.989 c +389.635 16.275 l +397.098 16.275 l +397.098 16.275 l +397.724 16.288 398.231 16.781 398.231 17.382 c +398.231 17.996 397.711 18.495 397.071 18.495 c +397.045 18.495 392.443 18.489 392.443 18.489 c +392.931 21.860 l +392.931 21.860 397.658 21.854 397.697 21.854 c +398.344 21.854 398.871 22.360 398.871 22.980 c +398.884 23.543 398.462 24.005 397.908 24.093 c +397.908 24.093 l +f +0.33 0.53 1.00 rg +[] 0 d +438.576 28.982 m +438.556 28.982 431.430 28.982 431.430 28.982 c +429.624 16.282 l +437.093 16.282 l +437.093 16.282 l +437.719 16.294 438.227 16.788 438.227 17.389 c +438.227 18.002 437.706 18.502 437.066 18.502 c +437.040 18.502 432.439 18.495 432.439 18.495 c +432.926 21.867 l +432.926 21.867 437.653 21.860 437.699 21.860 c +438.345 21.860 438.873 22.366 438.873 22.986 c +438.873 23.543 438.451 24.005 437.897 24.093 c +433.256 24.093 l +433.638 26.731 l +433.638 26.731 438.563 26.737 438.589 26.737 c +439.235 26.737 439.763 27.243 439.763 27.863 c +439.749 28.476 439.229 28.982 438.576 28.982 c +438.576 28.982 l +f +0.33 0.53 1.00 rg +[] 0 d +451.912 22.898 m +451.912 24.144 451.609 25.251 451.009 26.206 c +450.409 27.161 449.631 27.863 448.669 28.306 c +447.706 28.755 446.249 28.976 444.278 28.976 c +442.182 28.976 l +440.376 16.275 l +444.489 16.275 l +446.216 16.275 447.568 16.522 448.537 17.015 c +449.506 17.509 450.317 18.293 450.956 19.362 c +451.596 20.437 451.912 21.614 451.912 22.898 c +451.912 22.898 l +448.655 20.273 m +448.174 19.577 447.541 19.084 446.750 18.799 c +446.183 18.597 445.274 18.495 444.015 18.495 c +443.197 18.495 l +444.364 26.743 l +444.990 26.743 l +446.012 26.743 446.829 26.592 447.443 26.282 c +448.056 25.972 448.530 25.535 448.873 24.966 c +449.209 24.397 449.381 23.695 449.381 22.853 c +449.374 21.835 449.137 20.969 448.655 20.273 c +448.655 20.273 l +f +0.33 0.53 1.00 rg +[] 0 d +461.702 23.043 m +460.231 22.265 l +460.113 21.241 459.203 20.450 458.109 20.450 c +456.929 20.450 455.973 21.367 455.973 22.499 c +455.973 23.631 456.929 24.549 458.109 24.549 c +458.564 24.549 458.986 24.409 459.328 24.182 c +461.154 25.149 l +460.166 28.957 l +458.076 28.957 l +450.956 16.307 l +453.619 16.307 l +455.122 19.001 l +460.357 19.001 l +461.055 16.307 l +463.455 16.307 l +461.702 23.043 l +461.702 23.043 l +f +0.33 0.53 1.00 rg +[] 0 d +457.324 22.550 m +457.324 22.113 457.693 21.759 458.148 21.759 c +458.603 21.759 458.972 22.113 458.972 22.550 c +458.972 22.986 458.603 23.340 458.148 23.340 c +457.693 23.340 457.324 22.986 457.324 22.550 c +457.324 22.550 l +f +0.33 0.53 1.00 rg +[] 0 d +408.674 24.194 m +408.674 24.194 408.674 24.201 408.674 24.194 c +407.850 24.194 l +407.764 24.346 l +407.428 24.858 407.006 25.244 406.498 25.510 c +405.984 25.776 405.173 25.908 404.567 25.908 c +403.663 25.908 402.800 25.674 401.976 25.206 c +401.152 24.738 400.493 24.087 400.005 23.246 c +399.517 22.411 399.266 21.525 399.266 20.602 c +399.266 19.387 399.649 18.325 400.413 17.408 c +401.178 16.490 402.213 16.035 403.512 16.035 c +404.079 16.035 404.586 16.124 405.041 16.313 c +405.496 16.497 405.984 16.819 406.505 17.287 c +406.505 17.287 407.118 16.775 407.124 16.781 c +407.507 16.490 407.981 16.307 408.496 16.275 c +408.733 16.275 l +408.766 16.547 l +409.603 23.309 l +409.596 23.309 409.596 23.309 409.590 23.309 c +409.590 23.796 409.181 24.188 408.674 24.194 c +408.674 24.194 l +406.749 19.659 m +406.452 19.122 406.083 18.723 405.641 18.470 c +405.199 18.217 404.685 18.091 404.092 18.091 c +403.380 18.091 402.800 18.312 402.345 18.767 c +401.890 19.217 401.666 19.811 401.666 20.545 c +401.666 21.500 401.963 22.278 402.563 22.885 c +403.162 23.492 403.888 23.790 404.745 23.790 c +405.483 23.790 406.076 23.562 406.524 23.113 c +406.973 22.657 407.197 22.063 407.197 21.316 c +407.197 20.753 407.045 20.197 406.749 19.659 c +406.749 19.659 l +f +0.33 0.53 1.00 rg +[] 0 d +381.612 27.749 m +381.118 29.008 380.314 30.140 379.252 31.057 c +377.624 32.461 375.515 33.239 373.319 33.239 c +371.421 33.239 369.608 32.670 368.079 31.595 c +367.340 31.076 366.701 30.462 366.173 29.767 c +365.844 29.811 365.508 29.836 365.165 29.836 c +363.273 29.836 361.486 29.128 360.148 27.844 c +358.810 26.560 358.072 24.852 358.072 23.031 c +358.072 21.342 358.724 19.723 359.904 18.470 c +360.840 17.477 362.053 16.775 363.391 16.446 c +363.972 14.789 365.606 13.594 367.525 13.594 c +369.931 13.594 371.889 15.472 371.889 17.781 c +371.889 17.914 371.882 18.053 371.869 18.186 c +377.993 21.272 l +376.655 23.499 l +370.801 20.551 l +370.003 21.424 368.830 21.974 367.525 21.974 c +365.633 21.974 364.018 20.810 363.411 19.191 c +361.869 19.843 360.788 21.316 360.788 23.037 c +360.788 25.352 362.745 27.237 365.165 27.237 c +366.015 27.237 366.813 27.003 367.485 26.598 c +368.296 28.944 370.603 30.640 373.319 30.640 c +376.484 30.640 379.081 28.350 379.430 25.409 c +379.542 25.421 379.655 25.428 379.767 25.428 c +381.659 25.428 383.195 23.954 383.195 22.139 c +383.195 20.418 381.817 19.008 380.063 18.862 c +378.105 18.862 l +378.020 18.881 377.927 18.888 377.835 18.888 c +377.077 18.888 376.464 18.299 376.464 17.572 c +376.464 16.883 377.018 16.320 377.723 16.263 c +377.723 16.250 l +380.063 16.250 l +380.182 16.250 l +380.301 16.263 l +381.830 16.389 383.247 17.053 384.289 18.141 c +385.337 19.235 385.917 20.652 385.917 22.139 c +385.917 24.757 384.104 26.996 381.612 27.749 c +381.612 27.749 l +367.525 19.400 m +368.454 19.400 369.212 18.673 369.212 17.781 c +369.212 16.889 368.454 16.162 367.525 16.162 c +366.595 16.162 365.837 16.889 365.837 17.781 c +365.837 18.673 366.595 19.400 367.525 19.400 c +367.525 19.400 l +f +Q +Q +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.88 1126.08 57.60 -115.20 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +147.04 1109.75 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1112.63 Td +(25) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1111.680 m +168.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +151.78 1102.55 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1105.43 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1104.480 m +168.480 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.23 1095.35 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1098.23 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1097.280 m +168.480 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +141.58 1088.15 Td +(3.3v Out) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1091.03 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1090.080 m +168.480 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1059.35 Td +(P1.15) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1062.23 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1061.280 m +168.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1080.95 Td +(P0.31) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1083.83 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1082.880 m +168.480 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1102.55 Td +(P0.08) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1105.43 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1104.480 m +110.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1052.15 Td +(P1.13) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1055.03 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1054.080 m +168.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1073.75 Td +(P0.29) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1076.63 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1075.680 m +168.480 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1044.95 Td +(P1.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1047.83 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1046.880 m +168.480 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1066.55 Td +(P0.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1069.43 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1068.480 m +168.480 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1095.35 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1098.23 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1097.280 m +110.880 1097.280 l +S +0.72 w +0.63 0.00 0.00 RG +110.88 1111.68 m 110.88 1112.87 109.91 1113.84 108.72 1113.84 c +107.53 1113.84 106.56 1112.87 106.56 1111.68 c +106.56 1110.49 107.53 1109.52 108.72 1109.52 c +109.91 1109.52 110.88 1110.49 110.88 1111.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1109.75 Td +(P0.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1112.63 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1111.680 m +106.560 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1030.55 Td +(P0.09) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1033.43 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1032.480 m +168.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +149.22 1037.75 Td +(P0.10) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1040.63 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1039.680 m +168.480 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1037.75 Td +(P1.04) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1040.63 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1039.680 m +110.880 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1088.15 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1091.03 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1090.080 m +110.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1080.95 Td +(P0.17) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1083.83 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1082.880 m +110.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1073.75 Td +(P0.20) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1076.63 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1075.680 m +110.880 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1066.55 Td +(P0.22) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1069.43 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1068.480 m +110.880 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1059.35 Td +(P0.24) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1062.23 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1061.280 m +110.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1052.15 Td +(P1.00) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1055.03 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1054.080 m +110.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1044.95 Td +(P0.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1047.83 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1046.880 m +110.880 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1030.55 Td +(P1.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +99.28 1033.43 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1032.480 m +110.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +147.04 1116.95 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.80 1119.83 Td +(26) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1118.880 m +168.480 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +180.000 1121.760 m +185.760 1116.000 l +180.000 1116.000 m +185.760 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +113.04 1116.95 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +102.92 1119.83 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1118.880 m +110.880 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +93.600 1121.760 m +99.360 1116.000 l +93.600 1116.000 m +99.360 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +135.38 1128.78 Td +(PRO_MICRO_NRF52840_26P) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +67.68 248.06 Td +(Switches) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 154.080 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +111.600 154.080 m +124.560 154.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 152.640 m +122.400 152.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.920 151.200 m +120.240 151.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +117.360 149.760 m +118.800 149.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +108.72 142.09 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 204.480 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +111.600 204.480 m +124.560 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 203.040 m +122.400 203.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.920 201.600 m +120.240 201.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +117.360 200.160 m +118.800 200.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +108.72 192.49 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +71.280 157.680 l +60.480 157.680 l +60.480 164.880 l +71.280 164.880 l +74.880 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +42.93 158.92 Td +(RBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +71.280 208.080 l +60.480 208.080 l +60.480 215.280 l +71.280 215.280 l +74.880 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +41.22 208.96 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 165.600 m +96.480 169.200 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 161.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 161.280 m +103.680 161.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +82.04 161.93 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 161.280 m +89.280 161.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +88.560 165.600 m +104.400 165.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +105.12 161.28 m 105.12 162.08 104.48 162.72 103.68 162.72 c +102.88 162.72 102.24 162.08 102.24 161.28 c +102.24 160.48 102.88 159.84 103.68 159.84 c +104.48 159.84 105.12 160.48 105.12 161.28 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +90.72 161.28 m 90.72 162.08 90.08 162.72 89.28 162.72 c +88.48 162.72 87.84 162.08 87.84 161.28 c +87.84 160.48 88.48 159.84 89.28 159.84 c +90.08 159.84 90.72 160.48 90.72 161.28 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +89.20 178.06 Td +(RS1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +89.20 171.69 Td +(434121043816) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 216.000 m +96.480 219.600 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 212.33 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +118.080 211.680 m +103.680 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +82.04 212.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +74.880 211.680 m +89.280 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +88.560 216.000 m +104.400 216.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +105.12 211.68 m 105.12 212.48 104.48 213.12 103.68 213.12 c +102.88 213.12 102.24 212.48 102.24 211.68 c +102.24 210.88 102.88 210.24 103.68 210.24 c +104.48 210.24 105.12 210.88 105.12 211.68 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +90.72 211.68 m 90.72 212.48 90.08 213.12 89.28 213.12 c +88.48 213.12 87.84 212.48 87.84 211.68 c +87.84 210.88 88.48 210.24 89.28 210.24 c +90.08 210.24 90.72 210.88 90.72 211.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +89.20 228.46 Td +(US1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +89.20 222.09 Td +(434121043816) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +125.280 617.040 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.800 617.040 m +131.760 617.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +120.960 615.600 m +129.600 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +123.120 614.160 m +127.440 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +124.560 612.720 m +126.000 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +115.92 604.33 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +103.68 631.44 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 108.85 608.42 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.880 602.640 m +110.880 617.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +100.04 619.01 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 624.240 m +103.680 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +118.08 619.01 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 624.240 m +118.080 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 108.85 630.06 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.880 638.640 m +110.880 631.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +108.000 641.520 m +113.760 635.760 l +108.000 635.760 m +113.760 641.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +112.32 624.24 m 112.32 625.04 111.68 625.68 110.88 625.68 c +110.08 625.68 109.44 625.04 109.44 624.24 c +109.44 623.44 110.08 622.80 110.88 622.80 c +111.68 622.80 112.32 623.44 112.32 624.24 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +110.880 622.800 m +110.880 617.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +95.72 648.44 Td +(U11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +95.72 641.89 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 617.040 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +90.000 617.040 m +102.960 617.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +92.160 615.600 m +100.800 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +94.320 614.160 m +98.640 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +95.760 612.720 m +97.200 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +87.12 605.05 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 570.240 m +146.880 577.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +128.76 570.43 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.880 601.920 m +146.880 588.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +145.440 599.760 m +145.440 591.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +144.000 597.600 m +144.000 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +142.560 596.160 m +142.560 594.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +123.48 592.03 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 596.160 m +233.280 609.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +234.720 598.320 m +234.720 606.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.160 600.480 m +236.160 604.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +237.600 601.920 m +237.600 603.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +237.96 599.23 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 545.040 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +219.600 545.040 m +232.560 545.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +221.760 543.600 m +230.400 543.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +223.920 542.160 m +228.240 542.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +225.360 540.720 m +226.800 540.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +216.72 533.05 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +229.680 591.840 l +240.480 591.840 l +240.480 584.640 l +229.680 584.640 l +226.080 588.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +242.43 585.29 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +150.480 555.840 l +139.680 555.840 l +139.680 563.040 l +150.480 563.040 l +154.080 559.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.96 556.28 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +150.480 548.640 l +139.680 548.640 l +139.680 555.840 l +150.480 555.840 l +154.080 552.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +120.42 549.37 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +229.680 584.640 l +240.480 584.640 l +240.480 577.440 l +229.680 577.440 l +226.080 581.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 578.24 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +229.680 577.440 l +240.480 577.440 l +240.480 570.240 l +229.680 570.240 l +226.080 573.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.60 571.04 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +229.680 570.240 l +240.480 570.240 l +240.480 563.040 l +229.680 563.040 l +226.080 566.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 563.84 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +229.680 563.040 l +240.480 563.040 l +240.480 555.840 l +229.680 555.840 l +226.080 559.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 556.64 Td +(MISO) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.28 609.84 57.60 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +165.96 606.24 m 165.96 606.84 165.48 607.32 164.88 607.32 c +164.28 607.32 163.80 606.84 163.80 606.24 c +163.80 605.64 164.28 605.16 164.88 605.16 c +165.48 605.16 165.96 605.64 165.96 606.24 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +201.67 549.29 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 552.89 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 552.240 m +218.880 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.49 556.49 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 560.09 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 559.440 m +218.880 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.49 563.69 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 567.29 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 566.640 m +218.880 566.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +202.76 570.89 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 574.49 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 573.840 m +218.880 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +202.76 578.09 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 581.69 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 581.040 m +218.880 581.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +189.67 585.29 Td +(NRESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 588.89 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 588.240 m +218.880 588.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +206.76 592.49 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 596.09 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 595.440 m +218.880 595.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +223.200 598.320 m +228.960 592.560 l +223.200 592.560 m +228.960 598.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +201.67 599.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.24 603.29 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 602.640 m +218.880 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 599.69 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +157.28 603.29 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 602.640 m +161.280 602.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 592.49 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 596.09 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 595.440 m +161.280 595.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 585.29 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 588.89 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 588.240 m +161.280 588.240 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 591.120 m +156.960 585.360 l +151.200 585.360 m +156.960 591.120 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 578.09 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 581.69 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 581.040 m +161.280 581.040 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 583.920 m +156.960 578.160 l +151.200 578.160 m +156.960 583.920 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 570.89 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 574.49 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 573.840 m +161.280 573.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 563.69 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 567.29 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 566.640 m +161.280 566.640 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +151.200 569.520 m +156.960 563.760 l +151.200 563.760 m +156.960 569.520 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 556.49 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 560.09 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 559.440 m +161.280 559.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +163.94 549.29 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +153.64 552.89 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +154.080 552.240 m +161.280 552.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +185.64 618.81 Td +(NICERF_LORA1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +185.64 612.33 Td +(LoRa1262-868) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +413.280 992.880 l +413.280 982.080 l +406.080 982.080 l +406.080 992.880 l +409.680 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 410.96 961.34 Tm +(P1.02) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +420.480 992.880 l +420.480 982.080 l +413.280 982.080 l +413.280 992.880 l +416.880 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 418.16 961.34 Tm +(P1.07) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +406.080 992.880 l +406.080 982.080 l +398.880 982.080 l +398.880 992.880 l +402.480 996.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 403.76 961.34 Tm +(P1.01) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 215.280 m +647.280 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +629.15 215.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 233.280 m +654.480 233.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +647.280 239.760 m +647.280 226.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +645.840 237.600 m +645.840 228.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +644.400 235.440 m +644.400 231.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +642.960 234.000 m +642.960 232.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 233.280 m +654.480 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +623.88 229.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 226.800 m +726.480 239.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 228.960 m +727.920 237.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 231.120 m +729.360 235.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 232.560 m +730.800 234.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +731.16 229.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +726.480 176.400 m +726.480 189.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 178.560 m +727.920 187.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 180.720 m +729.360 185.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 182.160 m +730.800 183.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +731.16 179.53 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +650.880 193.680 l +640.080 193.680 l +640.080 200.880 l +650.880 200.880 l +654.480 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +627.00 194.41 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +650.880 208.080 l +640.080 208.080 l +640.080 215.280 l +650.880 215.280 l +654.480 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +620.82 208.93 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +722.880 215.280 l +733.680 215.280 l +733.680 208.080 l +722.880 208.080 l +719.280 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 208.96 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +722.880 222.480 l +733.680 222.480 l +733.680 215.280 l +722.880 215.280 l +719.280 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 216.16 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +722.880 208.080 l +733.680 208.080 l +733.680 200.880 l +722.880 200.880 l +719.280 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +734.91 201.76 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +722.880 229.680 l +733.680 229.680 l +733.680 222.480 l +722.880 222.480 l +719.280 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +735.12 223.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +650.880 200.880 l +640.080 200.880 l +640.080 208.080 l +650.880 208.080 l +654.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +620.82 201.61 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.68 240.48 50.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +666.36 236.88 m 666.36 237.48 665.88 237.96 665.28 237.96 c +664.68 237.96 664.20 237.48 664.20 236.88 c +664.20 236.28 664.68 235.80 665.28 235.80 c +665.88 235.80 666.36 236.28 666.36 236.88 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 230.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 233.93 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 233.280 m +661.680 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 223.13 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 226.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 226.080 m +661.680 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 215.93 Td +(3.3V) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 219.53 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 218.880 m +661.680 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 208.73 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 212.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 211.680 m +661.680 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 201.53 Td +(DIO0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 205.13 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 204.480 m +661.680 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 194.33 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 197.93 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 197.280 m +661.680 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 187.13 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 190.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 190.080 m +661.680 190.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +651.600 192.960 m +657.360 187.200 l +651.600 187.200 m +657.360 192.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +664.34 179.93 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +657.68 183.53 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +654.480 182.880 m +661.680 182.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +651.600 185.760 m +657.360 180.000 l +651.600 180.000 m +657.360 185.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.87 179.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 183.53 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 182.880 m +712.080 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.14 187.13 Td +(DIO4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 190.73 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 190.080 m +712.080 190.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +716.400 192.960 m +722.160 187.200 l +716.400 187.200 m +722.160 192.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.14 194.33 Td +(DIO5) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 197.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 197.280 m +712.080 197.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +716.400 200.160 m +722.160 194.400 l +716.400 194.400 m +722.160 200.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +695.96 201.53 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 205.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 204.480 m +712.080 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +692.69 208.73 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 212.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 211.680 m +712.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +692.69 215.93 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 219.53 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 218.880 m +712.080 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +695.96 223.13 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 226.73 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 226.080 m +712.080 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +694.87 230.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +712.44 233.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +719.280 233.280 m +712.080 233.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +682.74 249.45 Td +(RA-2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +682.74 242.97 Td +(RA-02_C9900010926) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1082.880 m +564.480 1086.480 l +575.280 1086.480 l +575.280 1079.280 l +564.480 1079.280 l +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +577.22 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1039.680 m +366.480 1036.080 l +355.680 1036.080 l +355.680 1043.280 l +366.480 1043.280 l +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1039.680 m +370.080 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +340.78 1036.81 Td +(SDA) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1046.880 m +366.480 1043.280 l +355.680 1043.280 l +355.680 1050.480 l +366.480 1050.480 l +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1046.880 m +370.080 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +341.51 1044.01 Td +(SCL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 222.480 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 222.480 m +272.880 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +262.08 223.45 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 179.280 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.800 179.280 m +239.760 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +228.960 177.840 m +237.600 177.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +231.120 176.400 m +235.440 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +232.560 174.960 m +234.000 174.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +223.92 166.39 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 222.480 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 222.480 m +236.880 222.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +224.64 223.45 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 179.280 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +262.800 179.280 m +275.760 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +264.960 177.840 m +273.600 177.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 176.400 m +271.440 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 174.960 m +270.000 174.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +259.92 167.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +239.040 199.440 m +227.520 199.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 186.480 m +233.280 193.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 208.080 m +233.280 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +227.520 202.320 m +239.040 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +233.280 215.280 m +233.280 208.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +233.280 199.440 m +233.280 193.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +240.48 198.81 Td +(C2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +240.48 192.33 Td +(100uF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +275.040 199.440 m +263.520 199.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 186.480 m +269.280 193.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 208.080 m +269.280 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +263.520 202.320 m +275.040 202.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +269.280 215.280 m +269.280 208.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +269.280 199.440 m +269.280 193.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +276.48 198.81 Td +(C1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +276.48 192.33 Td +(100uF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +355.680 895.680 m +352.080 892.080 l +341.280 892.080 l +341.280 899.280 l +352.080 899.280 l +355.680 895.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +355.680 895.680 m +355.680 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +321.66 892.84 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +470.880 1115.280 l +481.680 1115.280 l +481.680 1108.080 l +470.880 1108.080 l +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +483.48 1108.74 Td +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1098.000 m +521.280 1110.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +522.720 1100.160 m +522.720 1108.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +524.160 1102.320 m +524.160 1106.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +525.600 1103.760 m +525.600 1105.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +514.080 1104.480 m +514.080 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +525.96 1101.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1075.680 m +478.080 1079.280 l +488.880 1079.280 l +488.880 1072.080 l +478.080 1072.080 l +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1075.680 m +474.480 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.10 1072.96 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1046.880 m +478.080 1050.480 l +488.880 1050.480 l +488.880 1043.280 l +478.080 1043.280 l +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1046.880 m +474.480 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.20 1044.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1068.480 m +478.080 1072.080 l +488.880 1072.080 l +488.880 1064.880 l +478.080 1064.880 l +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1068.480 m +474.480 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1065.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1061.280 m +478.080 1064.880 l +488.880 1064.880 l +488.880 1057.680 l +478.080 1057.680 l +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1061.280 m +474.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1058.56 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1054.080 m +478.080 1057.680 l +488.880 1057.680 l +488.880 1050.480 l +478.080 1050.480 l +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1054.080 m +474.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1051.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +521.280 1093.680 m +521.280 1086.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +514.080 1090.080 m +514.080 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +522.00 1086.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1032.480 m +478.080 1036.080 l +488.880 1036.080 l +488.880 1028.880 l +478.080 1028.880 l +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1032.480 m +474.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.68 1029.76 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1039.680 m +478.080 1043.280 l +488.880 1043.280 l +488.880 1036.080 l +478.080 1036.080 l +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1039.680 m +474.480 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.32 1036.96 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1068.480 m +366.480 1064.880 l +355.680 1064.880 l +355.680 1072.080 l +366.480 1072.080 l +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1068.480 m +370.080 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +332.05 1065.61 Td +(GPSTX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1075.680 m +366.480 1072.080 l +355.680 1072.080 l +355.680 1079.280 l +366.480 1079.280 l +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1075.680 m +370.080 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +331.32 1072.81 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1061.280 m +366.480 1057.680 l +355.680 1057.680 l +355.680 1064.880 l +366.480 1064.880 l +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1061.280 m +370.080 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +331.32 1058.41 Td +(GPSEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 1093.680 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 1100.160 m +373.680 1087.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 1098.000 m +372.240 1089.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 1095.840 m +370.800 1091.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 1094.400 m +369.360 1092.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1093.680 m +380.880 1093.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 1090.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1054.080 m +366.480 1050.480 l +355.680 1050.480 l +355.680 1057.680 l +366.480 1057.680 l +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1054.080 m +370.080 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +336.42 1051.36 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +474.480 1097.280 m +478.080 1100.880 l +488.880 1100.880 l +488.880 1093.680 l +478.080 1093.680 l +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +474.480 1097.280 m +474.480 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +490.33 1094.17 Td +(RBTN) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +557.28 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1111.680 m +560.880 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +565.92 1095.27 Td +(R_ADC_T0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +565.92 1088.79 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1046.880 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +554.400 1046.880 m +567.360 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +556.560 1045.440 m +565.200 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +558.720 1044.000 m +563.040 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.160 1042.560 m +561.600 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +551.52 1034.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +557.280 1115.280 l +557.280 1126.080 l +564.480 1126.080 l +564.480 1115.280 l +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 562.23 1126.29 Tm +(BATT) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +557.28 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1082.880 m +560.880 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +560.880 1054.080 m +560.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +565.92 1066.47 Td +(R_ADC_B0) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +565.92 1059.99 Td +(1.5M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +377.280 1100.880 l +366.480 1100.880 l +366.480 1108.080 l +377.280 1108.080 l +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +329.75 1101.76 Td +(SERIAL2TX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +377.280 1108.080 l +366.480 1108.080 l +366.480 1115.280 l +377.280 1115.280 l +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +329.03 1108.96 Td +(SERIAL2RX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +377.280 1028.880 l +366.480 1028.880 l +366.480 1036.080 l +377.280 1036.080 l +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.94 1029.61 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 438.480 m +737.280 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.00 431.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 369.360 m +622.080 356.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 367.200 m +620.640 358.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 365.040 m +619.200 360.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 363.600 m +617.760 362.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 359.53 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 383.760 m +622.080 370.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 381.600 m +620.640 372.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 379.440 m +619.200 375.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 378.000 m +617.760 376.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 373.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 398.160 m +622.080 385.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 396.000 m +620.640 387.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 393.840 m +619.200 389.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 392.400 m +617.760 390.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 388.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 448.560 m +622.080 435.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 446.400 m +620.640 437.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 444.240 m +619.200 439.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 442.800 m +617.760 441.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 438.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 435.600 m +737.280 448.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 437.760 m +738.720 446.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 439.920 m +740.160 444.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 441.360 m +741.600 442.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 438.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 385.200 m +737.280 398.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 387.360 m +738.720 396.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 389.520 m +740.160 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 390.960 m +741.600 392.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 388.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 370.800 m +737.280 383.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +738.720 372.960 m +738.720 381.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +740.160 375.120 m +740.160 379.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +741.600 376.560 m +741.600 378.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +741.96 373.93 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 355.680 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 355.680 m +736.560 355.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 354.240 m +734.400 354.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 352.800 m +732.240 352.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 351.360 m +730.800 351.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 342.97 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 360.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 363.53 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 362.880 m +643.680 362.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 367.85 Td +(ANT_2.4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 370.73 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 370.080 m +643.680 370.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 372.960 m +632.160 367.200 l +626.400 367.200 m +632.160 372.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 375.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 377.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 377.280 m +643.680 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 389.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 392.33 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 391.680 m +643.680 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 396.65 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 399.53 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 398.880 m +643.680 398.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 403.85 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 406.73 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 406.080 m +643.680 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 411.05 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 413.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 413.280 m +643.680 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 418.25 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 421.13 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 420.480 m +643.680 420.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 425.45 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 428.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 427.680 m +643.680 427.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 432.65 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 435.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 434.880 m +643.680 434.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 437.760 m +632.160 432.000 l +626.400 432.000 m +632.160 437.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 439.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 442.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 442.080 m +643.680 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 439.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 442.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 442.080 m +715.680 442.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 432.65 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 435.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 434.880 m +715.680 434.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 425.45 Td +(DIO7) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 428.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 427.680 m +715.680 427.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 430.560 m +732.960 424.800 l +727.200 424.800 m +732.960 430.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 418.25 Td +(DIO8) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 421.13 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 420.480 m +715.680 420.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 423.360 m +732.960 417.600 l +727.200 417.600 m +732.960 423.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 411.05 Td +(DIO9) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 413.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 413.280 m +715.680 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.42 403.85 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 406.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 406.080 m +715.680 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +704.79 396.65 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 399.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 398.880 m +715.680 398.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 401.760 m +732.960 396.000 l +727.200 396.000 m +732.960 401.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 389.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 392.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 391.680 m +715.680 391.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 375.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 377.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 377.280 m +715.680 377.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +686.59 367.85 Td +(ANT_900) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 370.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 370.080 m +715.680 370.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +727.200 372.960 m +732.960 367.200 l +727.200 367.200 m +732.960 372.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 360.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 363.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 362.880 m +715.680 362.880 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 449.28 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +675.33 458.49 Td +(E80-900M2213S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +675.33 452.01 Td +(E80-900M2213S) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +625.680 424.080 l +614.880 424.080 l +614.880 431.280 l +625.680 431.280 l +629.280 427.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 424.81 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +625.680 409.680 l +614.880 409.680 l +614.880 416.880 l +625.680 416.880 l +629.280 413.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 410.41 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +625.680 416.880 l +614.880 416.880 l +614.880 424.080 l +625.680 424.080 l +629.280 420.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 417.61 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +625.680 402.480 l +614.880 402.480 l +614.880 409.680 l +625.680 409.680 l +629.280 406.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 403.21 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +625.680 395.280 l +614.880 395.280 l +614.880 402.480 l +625.680 402.480 l +629.280 398.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 396.01 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +733.680 416.880 l +744.480 416.880 l +744.480 409.680 l +733.680 409.680 l +730.080 413.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.92 410.56 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +733.680 409.680 l +744.480 409.680 l +744.480 402.480 l +733.680 402.480 l +730.080 406.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +746.43 403.13 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 748.080 m +730.080 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 751.680 m +737.280 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 748.080 m +730.080 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +737.64 744.67 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +114.480 726.480 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +108.000 726.480 m +120.960 726.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +110.160 725.040 m +118.800 725.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +112.320 723.600 m +116.640 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +113.760 722.160 m +115.200 722.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.12 713.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.880 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.880 748.080 m +488.880 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +489.24 741.07 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 755.280 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 755.280 m +161.280 755.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +149.04 756.25 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 667.440 m +730.080 674.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 667.440 m +736.560 667.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 666.000 m +734.400 666.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 664.560 m +732.240 664.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 663.120 m +730.800 663.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 674.640 m +730.080 674.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 654.55 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +625.680 733.680 l +614.880 733.680 l +614.880 740.880 l +625.680 740.880 l +629.280 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 734.53 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +625.680 748.080 l +614.880 748.080 l +614.880 755.280 l +625.680 755.280 l +629.280 751.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +601.80 748.81 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +733.680 740.880 l +744.480 740.880 l +744.480 733.680 l +733.680 733.680 l +730.080 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 734.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +625.680 704.880 l +614.880 704.880 l +614.880 712.080 l +625.680 712.080 l +629.280 708.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 705.61 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +625.680 719.280 l +614.880 719.280 l +614.880 726.480 l +625.680 726.480 l +629.280 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 720.01 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +625.680 726.480 l +614.880 726.480 l +614.880 733.680 l +625.680 733.680 l +629.280 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 727.21 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +625.680 712.080 l +614.880 712.080 l +614.880 719.280 l +625.680 719.280 l +629.280 715.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 712.81 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +733.680 726.480 l +744.480 726.480 l +744.480 719.280 l +733.680 719.280 l +730.080 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.71 720.16 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +625.680 740.880 l +614.880 740.880 l +614.880 748.080 l +625.680 748.080 l +629.280 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 741.61 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 700.560 m +622.080 687.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 698.400 m +620.640 689.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 696.240 m +619.200 691.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 694.800 m +617.760 693.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 690.67 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 686.160 m +622.080 673.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 684.000 m +620.640 675.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 681.840 m +619.200 677.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 680.400 m +617.760 678.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 676.27 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 766.080 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +736.560 766.080 m +723.600 766.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 767.520 m +725.760 767.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.240 768.960 m +727.920 768.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 770.400 m +729.360 770.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 772.15 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 765.360 m +622.080 752.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 763.200 m +620.640 754.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 761.040 m +619.200 756.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 759.600 m +617.760 758.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 755.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 747.360 m +150.480 734.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.040 745.200 m +149.040 736.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +147.600 743.040 m +147.600 738.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.160 741.600 m +146.160 740.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +127.08 737.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +150.480 711.360 m +150.480 698.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.040 709.200 m +149.040 700.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +147.600 707.040 m +147.600 702.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +146.160 705.600 m +146.160 704.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +127.08 701.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 712.800 m +229.680 725.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +231.120 714.960 m +231.120 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +232.560 717.120 m +232.560 721.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +234.000 718.560 m +234.000 720.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +234.36 715.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 765.360 m +373.680 752.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 763.200 m +372.240 754.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 761.040 m +370.800 756.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 759.600 m +369.360 758.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 755.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 766.080 m +481.680 758.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.160 766.080 m +475.200 766.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +486.000 767.520 m +477.360 767.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +483.840 768.960 m +479.520 768.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +482.400 770.400 m +480.960 770.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 758.880 m +481.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +472.32 772.18 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 672.480 m +481.680 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +475.200 672.480 m +488.160 672.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +477.360 671.040 m +486.000 671.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +479.520 669.600 m +483.840 669.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +480.960 668.160 m +482.400 668.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 679.680 m +481.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +472.32 659.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 686.160 m +373.680 673.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 684.000 m +372.240 675.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 681.840 m +370.800 677.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 680.400 m +369.360 678.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 676.27 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +373.680 700.560 m +373.680 687.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +372.240 698.400 m +372.240 689.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.800 696.240 m +370.800 691.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +369.360 694.800 m +369.360 693.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +350.28 690.67 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +377.280 740.880 l +366.480 740.880 l +366.480 748.080 l +377.280 748.080 l +380.880 744.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.22 741.61 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +485.280 726.480 l +496.080 726.480 l +496.080 719.280 l +485.280 719.280 l +481.680 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.31 720.16 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +377.280 712.080 l +366.480 712.080 l +366.480 719.280 l +377.280 719.280 l +380.880 715.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +351.58 712.81 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +377.280 726.480 l +366.480 726.480 l +366.480 733.680 l +377.280 733.680 l +380.880 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.31 727.21 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +377.280 719.280 l +366.480 719.280 l +366.480 726.480 l +377.280 726.480 l +380.880 722.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.31 720.01 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +377.280 704.880 l +366.480 704.880 l +366.480 712.080 l +377.280 712.080 l +380.880 708.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +355.95 705.61 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +485.280 740.880 l +496.080 740.880 l +496.080 733.680 l +485.280 733.680 l +481.680 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.53 734.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +377.280 748.080 l +366.480 748.080 l +366.480 755.280 l +377.280 755.280 l +380.880 751.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +353.40 748.81 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +377.280 733.680 l +366.480 733.680 l +366.480 740.880 l +377.280 740.880 l +380.880 737.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +347.22 734.53 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +226.080 737.280 l +236.880 737.280 l +236.880 730.080 l +226.080 730.080 l +222.480 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.33 730.63 Td +(DIO3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +154.080 730.080 l +143.280 730.080 l +143.280 737.280 l +154.080 737.280 l +157.680 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.02 730.93 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +226.080 751.680 l +236.880 751.680 l +236.880 744.480 l +226.080 744.480 l +222.480 748.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 745.36 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +226.080 744.480 l +236.880 744.480 l +236.880 737.280 l +226.080 737.280 l +222.480 740.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.33 737.83 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +226.080 708.480 l +236.880 708.480 l +236.880 701.280 l +226.080 701.280 l +222.480 704.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 702.16 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +226.080 701.280 l +236.880 701.280 l +236.880 694.080 l +226.080 694.080 l +222.480 697.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 694.96 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +226.080 694.080 l +236.880 694.080 l +236.880 686.880 l +226.080 686.880 l +222.480 690.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.32 687.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +226.080 715.680 l +236.880 715.680 l +236.880 708.480 l +226.080 708.480 l +222.480 712.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.11 709.36 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +154.080 679.680 l +143.280 679.680 l +143.280 686.880 l +154.080 686.880 l +157.680 683.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +123.66 680.41 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +226.080 686.880 l +236.880 686.880 l +236.880 679.680 l +226.080 679.680 l +222.480 683.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +238.10 680.56 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.88 755.28 50.40 -79.20 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +169.56 751.68 m 169.56 752.28 169.08 752.76 168.48 752.76 c +167.88 752.76 167.40 752.28 167.40 751.68 c +167.40 751.08 167.88 750.60 168.48 750.60 c +169.08 750.60 169.56 751.08 169.56 751.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 745.13 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 748.73 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 748.080 m +164.880 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 737.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 741.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 740.880 m +164.880 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 730.73 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 734.33 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 733.680 m +164.880 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 723.53 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 727.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 726.480 m +164.880 726.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 729.360 m +160.560 723.600 l +154.800 723.600 m +160.560 729.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 716.33 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 719.93 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 719.280 m +164.880 719.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 722.160 m +160.560 716.400 l +154.800 716.400 m +160.560 722.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 709.13 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 712.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 712.080 m +164.880 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 701.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 705.53 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 704.880 m +164.880 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 694.73 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 698.33 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 697.680 m +164.880 697.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +154.800 700.560 m +160.560 694.800 l +154.800 694.800 m +160.560 700.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 687.53 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +160.88 691.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 690.480 m +164.880 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +167.54 680.33 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +157.24 683.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 683.280 m +164.880 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +194.79 680.33 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 683.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 683.280 m +215.280 683.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +195.89 687.53 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 691.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 690.480 m +215.280 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +195.89 694.73 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 698.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 697.680 m +215.280 697.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.16 701.93 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 705.53 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 704.880 m +215.280 704.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +199.16 709.13 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 712.73 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 712.080 m +215.280 712.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +198.07 716.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 719.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 719.280 m +215.280 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +203.16 723.53 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 727.13 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 726.480 m +215.280 726.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +219.600 729.360 m +225.360 723.600 l +219.600 723.600 m +225.360 729.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 730.73 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 734.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 733.680 m +215.280 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 737.93 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 741.53 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 740.880 m +215.280 740.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +197.34 745.13 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.64 748.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 748.080 m +215.280 748.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +185.75 764.49 Td +(E22-900MM22S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +185.75 758.01 Td +(E22-400MM22S) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 766.08 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 680.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 679.680 m +715.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 684.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 687.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 686.880 m +715.680 686.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 694.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 694.080 m +715.680 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 706.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 709.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 708.480 m +715.680 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 713.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 716.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 715.680 m +715.680 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.06 720.65 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 723.53 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 722.880 m +715.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +696.78 727.85 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 730.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 730.080 m +715.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 735.05 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 737.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 737.280 m +715.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 742.25 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 745.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 744.480 m +715.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 749.45 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 752.33 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 751.680 m +715.680 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 759.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 758.880 m +715.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 759.53 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 758.880 m +643.680 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 749.45 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 752.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 751.680 m +643.680 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 742.25 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 745.13 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 744.480 m +643.680 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 735.05 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 737.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 737.280 m +643.680 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 727.85 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 730.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 730.080 m +643.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 720.65 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 723.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 722.880 m +643.680 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 713.45 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 716.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 715.680 m +643.680 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 706.25 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 709.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 708.480 m +643.680 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 694.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 694.080 m +643.680 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 684.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 687.53 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 686.880 m +643.680 686.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 689.760 m +632.160 684.000 l +626.400 684.000 m +632.160 689.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 680.33 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 679.680 m +643.680 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +675.33 775.29 Td +(E22-900M30S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +675.33 768.81 Td +(E22-900M30S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 680.33 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 679.680 m +395.280 679.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 684.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 687.53 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 686.880 m +395.280 686.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +378.000 689.760 m +383.760 684.000 l +378.000 684.000 m +383.760 689.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 694.73 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 694.080 m +395.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 706.25 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 709.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 708.480 m +395.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 713.45 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 716.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 715.680 m +395.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 720.65 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 723.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 722.880 m +395.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 727.85 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 730.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 730.080 m +395.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 735.05 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 737.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 737.280 m +395.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 742.25 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 745.13 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 744.480 m +395.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 749.45 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 752.33 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 751.680 m +395.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +396.72 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +384.40 759.53 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 758.880 m +395.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 756.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 759.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 758.880 m +467.280 758.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 749.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 752.33 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 751.680 m +467.280 751.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.02 742.25 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 745.13 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 744.480 m +467.280 744.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +450.56 735.05 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 737.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 737.280 m +467.280 737.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +448.38 727.85 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 730.73 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 730.080 m +467.280 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +447.66 720.65 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 723.53 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 722.880 m +467.280 722.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 713.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 716.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 715.680 m +467.280 715.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 706.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 709.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 708.480 m +467.280 708.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 691.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 694.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 694.080 m +467.280 694.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 684.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 687.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 686.880 m +467.280 686.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +451.30 677.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +470.88 680.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 679.680 m +467.280 679.680 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 766.08 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +426.93 775.29 Td +(E22-900M22S) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +426.93 768.81 Td +(E22-900M22S) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +139.68 899.28 50.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +144.36 895.68 m 144.36 896.28 143.88 896.76 143.28 896.76 c +142.68 896.76 142.20 896.28 142.20 895.68 c +142.20 895.08 142.68 894.60 143.28 894.60 c +143.88 894.60 144.36 895.08 144.36 895.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 889.13 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 892.73 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 892.080 m +139.680 892.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 894.960 m +135.360 889.200 l +129.600 889.200 m +135.360 894.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 881.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 885.53 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 884.880 m +139.680 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 874.73 Td +(3.3V) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 878.33 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 877.680 m +139.680 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 867.53 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 871.13 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 870.480 m +139.680 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 860.33 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 863.93 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 863.280 m +139.680 863.280 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 866.160 m +135.360 860.400 l +129.600 860.400 m +135.360 866.160 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 853.13 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 856.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 856.080 m +139.680 856.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 845.93 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 849.53 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 848.880 m +139.680 848.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 851.760 m +135.360 846.000 l +129.600 846.000 m +135.360 851.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +142.34 838.73 Td +(DIO3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +135.68 842.33 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 841.680 m +139.680 841.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +129.600 844.560 m +135.360 838.800 l +129.600 838.800 m +135.360 844.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.87 838.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 842.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 841.680 m +190.080 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +169.59 845.93 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 849.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 848.880 m +190.080 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +169.23 853.13 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 856.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 856.080 m +190.080 856.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +194.400 858.960 m +200.160 853.200 l +194.400 853.200 m +200.160 858.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +173.96 860.33 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 863.93 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 863.280 m +190.080 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +170.69 867.53 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 871.13 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 870.480 m +190.080 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +170.69 874.73 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 878.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 877.680 m +190.080 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +173.96 881.93 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 885.53 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 884.880 m +190.080 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +172.87 889.13 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +190.44 892.73 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 892.080 m +190.080 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +161.24 908.49 Td +(HT-RA62) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +161.24 902.01 Td +(RA-01SH) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +128.880 866.880 l +118.080 866.880 l +118.080 874.080 l +128.880 874.080 l +132.480 870.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +98.82 867.73 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +128.880 852.480 l +118.080 852.480 l +118.080 859.680 l +128.880 859.680 l +132.480 856.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.00 853.21 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +200.880 888.480 l +211.680 888.480 l +211.680 881.280 l +200.880 881.280 l +197.280 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.12 882.05 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +200.880 881.280 l +211.680 881.280 l +211.680 874.080 l +200.880 874.080 l +197.280 877.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.01 874.63 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +200.880 874.080 l +211.680 874.080 l +211.680 866.880 l +200.880 866.880 l +197.280 870.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.06 867.43 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +200.880 866.880 l +211.680 866.880 l +211.680 859.680 l +200.880 859.680 l +197.280 863.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +212.80 860.23 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +200.880 852.480 l +211.680 852.480 l +211.680 845.280 l +200.880 845.280 l +197.280 848.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +213.06 845.83 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +197.280 834.480 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.800 834.480 m +203.760 834.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +192.960 833.040 m +201.600 833.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +195.120 831.600 m +199.440 831.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +196.560 830.160 m +198.000 830.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +187.92 821.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +114.480 892.080 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +120.960 892.080 m +108.000 892.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.800 893.520 m +110.160 893.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +116.640 894.960 m +112.320 894.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +115.200 896.400 m +113.760 896.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 884.880 m +114.480 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +105.12 898.15 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +218.880 899.280 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +225.360 899.280 m +212.400 899.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +223.200 900.720 m +214.560 900.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +221.040 902.160 m +216.720 902.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +219.600 903.600 m +218.160 903.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +218.880 892.080 m +218.880 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +209.52 905.35 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +118.080 874.080 m +118.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +125.280 877.680 m +125.280 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +99.95 874.27 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 893.45 Td +(RF_SW) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 896.33 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 895.680 m +384.480 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 886.25 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 889.13 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 888.480 m +384.480 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 879.05 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 881.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 881.280 m +384.480 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 871.85 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 874.73 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 874.080 m +384.480 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 864.65 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 867.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 866.880 m +384.480 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 857.45 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 860.33 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 859.680 m +384.480 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 850.25 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 853.13 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 852.480 m +384.480 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +385.92 843.05 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +377.24 845.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 845.280 m +384.480 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +449.15 864.65 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 867.53 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 866.880 m +463.680 866.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +475.200 869.760 m +480.960 864.000 l +475.200 864.000 m +480.960 869.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +447.70 871.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 874.73 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 874.080 m +463.680 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +444.42 879.05 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 881.93 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 881.280 m +463.680 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +446.96 886.25 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +467.28 889.13 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 888.480 m +463.680 888.480 l +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +384.48 910.08 79.20 -79.20 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.08 845.28 m 460.08 851.24 455.24 856.08 449.28 856.08 c +443.32 856.08 438.48 851.24 438.48 845.28 c +438.48 839.32 443.32 834.48 449.28 834.48 c +455.24 834.48 460.08 839.32 460.08 845.28 c +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +434.88 859.68 28.80 -28.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +419.73 919.05 Td +(SEEED_WIO-SX1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +419.73 912.57 Td +(Seeed-wio-SX1262) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +481.680 884.880 l +492.480 884.880 l +492.480 877.680 l +481.680 877.680 l +478.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +493.86 878.23 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +366.480 863.280 l +355.680 863.280 l +355.680 870.480 l +366.480 870.480 l +370.080 866.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +336.42 864.13 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +366.480 884.880 l +355.680 884.880 l +355.680 892.080 l +366.480 892.080 l +370.080 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +335.10 885.86 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +366.480 877.680 l +355.680 877.680 l +355.680 884.880 l +366.480 884.880 l +370.080 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +335.15 878.66 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +366.480 856.080 l +355.680 856.080 l +355.680 863.280 l +366.480 863.280 l +370.080 859.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +345.15 856.85 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +366.480 870.480 l +355.680 870.480 l +355.680 877.680 l +366.480 877.680 l +370.080 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +339.30 871.46 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +481.680 892.080 l +492.480 892.080 l +492.480 884.880 l +481.680 884.880 l +478.080 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +493.88 885.43 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +485.280 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +485.280 867.600 m +485.280 880.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +486.720 869.760 m +486.720 878.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +488.160 871.920 m +488.160 876.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +489.600 873.360 m +489.600 874.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +489.96 870.73 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 858.960 m +362.880 846.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +361.440 856.800 m +361.440 848.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +360.000 854.640 m +360.000 850.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +358.560 853.200 m +358.560 851.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +339.48 849.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +362.880 841.680 m +362.880 848.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +344.75 841.93 Td +(VCC) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +92.88 740.88 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 98.05 717.86 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +100.080 712.080 m +100.080 726.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +89.24 728.45 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 733.680 m +92.880 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +107.28 728.45 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +114.480 733.680 m +107.280 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 98.05 739.50 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +100.080 748.080 m +100.080 740.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +97.200 750.960 m +102.960 745.200 l +97.200 745.200 m +102.960 750.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +101.52 733.68 m 101.52 734.48 100.88 735.12 100.08 735.12 c +99.28 735.12 98.64 734.48 98.64 733.68 c +98.64 732.88 99.28 732.24 100.08 732.24 c +100.88 732.24 101.52 732.88 101.52 733.68 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +100.080 732.240 m +100.080 726.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +84.92 757.88 Td +(U3) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +84.92 751.33 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 726.480 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +79.200 726.480 m +92.160 726.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +81.360 725.040 m +90.000 725.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +83.520 723.600 m +87.840 723.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +84.960 722.160 m +86.400 722.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +76.32 713.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 571.680 m +737.280 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.00 564.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +733.680 578.880 l +744.480 578.880 l +744.480 571.680 l +733.680 571.680 l +730.080 575.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 572.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 593.280 m +730.080 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +737.280 596.880 m +737.280 589.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 593.280 m +730.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +737.64 589.87 Td +(+5V) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 514.080 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +723.600 514.080 m +736.560 514.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +725.760 512.640 m +734.400 512.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +727.920 511.200 m +732.240 511.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +729.360 509.760 m +730.800 509.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 521.280 m +730.080 521.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 501.19 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +625.680 578.880 l +614.880 578.880 l +614.880 586.080 l +625.680 586.080 l +629.280 582.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 579.73 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +625.680 593.280 l +614.880 593.280 l +614.880 600.480 l +625.680 600.480 l +629.280 596.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +601.80 594.01 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +733.680 586.080 l +744.480 586.080 l +744.480 578.880 l +733.680 578.880 l +730.080 582.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 579.43 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +625.680 550.080 l +614.880 550.080 l +614.880 557.280 l +625.680 557.280 l +629.280 553.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 550.81 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +625.680 564.480 l +614.880 564.480 l +614.880 571.680 l +625.680 571.680 l +629.280 568.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 565.21 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +625.680 571.680 l +614.880 571.680 l +614.880 578.880 l +625.680 578.880 l +629.280 575.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 572.41 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +625.680 557.280 l +614.880 557.280 l +614.880 564.480 l +625.680 564.480 l +629.280 560.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 558.01 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +625.680 586.080 l +614.880 586.080 l +614.880 593.280 l +625.680 593.280 l +629.280 589.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.62 586.81 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 545.760 m +622.080 532.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 543.600 m +620.640 534.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 541.440 m +619.200 537.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 540.000 m +617.760 538.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 535.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 531.360 m +622.080 518.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 529.200 m +620.640 520.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 527.040 m +619.200 522.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 525.600 m +617.760 524.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 521.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 611.280 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +736.560 611.280 m +723.600 611.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 612.720 m +725.760 612.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.240 614.160 m +727.920 614.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.800 615.600 m +729.360 615.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 617.35 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 610.560 m +622.080 597.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 608.400 m +620.640 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 606.240 m +619.200 601.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 604.800 m +617.760 603.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 600.67 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +643.68 611.28 72.00 -100.80 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 522.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 525.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 524.880 m +715.680 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 529.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 532.73 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 532.080 m +715.680 532.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 537.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 539.93 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 539.280 m +715.680 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 551.45 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 554.33 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 553.680 m +715.680 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 558.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 561.53 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 560.880 m +715.680 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +707.69 565.85 Td +(IN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 568.73 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 568.080 m +715.680 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +684.79 573.05 Td +(T/R CTRL) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 575.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 575.280 m +715.680 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.96 580.25 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 583.13 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 582.480 m +715.680 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 587.45 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 590.33 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 589.680 m +715.680 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +700.42 594.65 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 597.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 596.880 m +715.680 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +699.70 601.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +719.28 604.73 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 604.080 m +715.680 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 601.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 604.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 604.080 m +643.680 604.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 594.65 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 597.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 596.880 m +643.680 596.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 587.45 Td +(BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 590.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 589.680 m +643.680 589.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 580.25 Td +(NRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 583.13 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 582.480 m +643.680 582.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 573.05 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 575.93 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 575.280 m +643.680 575.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 565.85 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 568.73 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 568.080 m +643.680 568.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 558.65 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 561.53 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 560.880 m +643.680 560.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 551.45 Td +(NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 554.33 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 553.680 m +643.680 553.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 537.05 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 539.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 539.280 m +643.680 539.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 529.85 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 532.73 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 532.080 m +643.680 532.080 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +626.400 534.960 m +632.160 529.200 l +626.400 529.200 m +632.160 534.960 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +645.12 522.65 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.80 525.53 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 524.880 m +643.680 524.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +672.35 613.83 Td +(E22P-868M30S) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 436.61 Td +(ANT_Lora) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 428.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 421.49 Td +(DIO9) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 414.29 Td +(DIO8) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 407.81 Td +(DIO7) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 400.61 Td +(NC) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 392.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +387.36 385.49 Td +(3V3) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +423.36 436.61 Td +(ANT_2.4) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +434.88 429.41 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +440.64 422.21 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +437.04 414.29 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 407.81 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 400.61 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +428.40 392.69 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +432.00 385.49 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +384.48 445.68 68.40 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +389.16 442.08 m 389.16 442.68 388.68 443.16 388.08 443.16 c +387.48 443.16 387.00 442.68 387.00 442.08 c +387.00 441.48 387.48 441.00 388.08 441.00 c +388.68 441.00 389.16 441.48 389.16 442.08 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 439.13 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 438.480 m +384.480 438.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 441.360 m +380.160 435.600 l +374.400 435.600 m +380.160 441.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 431.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 431.280 m +384.480 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 424.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 424.080 m +384.480 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 417.53 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 416.880 m +384.480 416.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 419.760 m +380.160 414.000 l +374.400 414.000 m +380.160 419.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 410.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 409.680 m +384.480 409.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 412.560 m +380.160 406.800 l +374.400 406.800 m +380.160 412.560 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 403.13 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 402.480 m +384.480 402.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +374.400 405.360 m +380.160 399.600 l +374.400 399.600 m +380.160 405.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 395.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 395.280 m +384.480 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +380.12 388.73 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 388.080 m +384.480 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +454.32 388.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 388.080 m +452.880 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 395.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 395.280 m +452.880 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 403.13 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 402.480 m +452.880 402.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 410.33 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 409.680 m +452.880 409.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 417.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 416.880 m +452.880 416.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 424.73 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 424.080 m +452.880 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 431.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 431.280 m +452.880 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +452.88 439.13 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 438.480 m +452.880 438.480 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +457.200 441.360 m +462.960 435.600 l +457.200 435.600 m +462.960 441.360 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +388.08 453.21 Td +(WAVESHARE_LORA_CORE_1121) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +388.08 447.20 Td +(LoRa Core1121-XF) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +373.680 427.680 l +362.880 427.680 l +362.880 420.480 l +373.680 420.480 l +377.280 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +348.16 420.93 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +463.680 384.480 l +474.480 384.480 l +474.480 391.680 l +463.680 391.680 l +460.080 388.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.55 385.64 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +463.680 391.680 l +474.480 391.680 l +474.480 398.880 l +463.680 398.880 l +460.080 395.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +476.44 392.12 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 391.680 m +370.080 384.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +355.90 384.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +463.680 427.680 l +474.480 427.680 l +474.480 420.480 l +463.680 420.480 l +460.080 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 421.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +463.680 420.480 l +474.480 420.480 l +474.480 413.280 l +463.680 413.280 l +460.080 416.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.71 414.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +463.680 406.080 l +474.480 406.080 l +474.480 398.880 l +463.680 398.880 l +460.080 402.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 399.04 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +463.680 413.280 l +474.480 413.280 l +474.480 406.080 l +463.680 406.080 l +460.080 409.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +475.92 406.24 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 437.760 m +370.080 424.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +368.640 435.600 m +368.640 426.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +367.200 433.440 m +367.200 429.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +365.760 432.000 m +365.760 430.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +346.68 427.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +467.280 424.800 m +467.280 437.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +468.720 426.960 m +468.720 435.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +470.160 429.120 m +470.160 433.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +471.600 430.560 m +471.600 432.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +471.96 427.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 401.760 m +370.080 388.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +368.640 399.600 m +368.640 390.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +367.200 397.440 m +367.200 393.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +365.760 396.000 m +365.760 394.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +346.68 391.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 563.760 m +380.880 550.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 561.600 m +379.440 552.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 559.440 m +378.000 555.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 558.000 m +376.560 556.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 553.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +384.480 582.480 l +373.680 582.480 l +373.680 589.680 l +384.480 589.680 l +388.080 586.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.06 583.25 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +456.480 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +456.480 586.800 m +456.480 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +457.920 588.960 m +457.920 597.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +459.360 591.120 m +459.360 595.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +460.800 592.560 m +460.800 594.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +461.16 589.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 606.960 m +380.880 594.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 604.800 m +379.440 596.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 602.640 m +378.000 598.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 601.200 m +376.560 599.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 597.07 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 599.760 m +380.880 586.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +379.440 597.600 m +379.440 588.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +378.000 595.440 m +378.000 591.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +376.560 594.000 m +376.560 592.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +357.48 589.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +452.880 575.280 l +463.680 575.280 l +463.680 568.080 l +452.880 568.080 l +449.280 571.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 568.24 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +452.880 568.080 l +463.680 568.080 l +463.680 560.880 l +452.880 560.880 l +449.280 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 561.04 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +452.880 582.480 l +463.680 582.480 l +463.680 575.280 l +452.880 575.280 l +449.280 578.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +464.91 576.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +452.880 589.680 l +463.680 589.680 l +463.680 582.480 l +452.880 582.480 l +449.280 586.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.12 583.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +380.880 553.680 m +380.880 546.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +366.70 546.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +452.880 553.680 l +463.680 553.680 l +463.680 560.880 l +452.880 560.880 l +449.280 557.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.64 554.12 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +452.880 546.480 l +463.680 546.480 l +463.680 553.680 l +452.880 553.680 l +449.280 550.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +464.75 547.64 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +384.480 568.080 l +373.680 568.080 l +373.680 560.880 l +384.480 560.880 l +388.080 564.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +358.96 561.33 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +452.880 604.080 l +463.680 604.080 l +463.680 596.880 l +452.880 596.880 l +449.280 600.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +465.65 597.65 Td +(LORA_ANT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +384.480 568.080 l +373.680 568.080 l +373.680 575.280 l +384.480 575.280 l +388.080 571.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.75 569.03 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 597.89 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 590.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 583.49 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 576.29 Td +(TXEN) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 569.81 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 562.61 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 554.69 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +398.16 547.49 Td +(3V3) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +424.80 598.61 Td +(ANT) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +424.08 591.41 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +429.84 584.21 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +426.24 576.29 Td +(CLK) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 569.81 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 562.61 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +417.60 554.69 Td +(RESET) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +421.20 547.49 Td +(BUSY) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 607.68 46.80 -64.80 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +399.96 604.08 m 399.96 604.68 399.48 605.16 398.88 605.16 c +398.28 605.16 397.80 604.68 397.80 604.08 c +397.80 603.48 398.28 603.00 398.88 603.00 c +399.48 603.00 399.96 603.48 399.96 604.08 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 601.13 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 600.480 m +395.280 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 593.93 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 593.280 m +395.280 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 586.73 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 586.080 m +395.280 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 579.53 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 578.880 m +395.280 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 572.33 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 571.680 m +395.280 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 565.13 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 564.480 m +395.280 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 557.93 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 557.280 m +395.280 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +390.92 550.73 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 550.080 m +395.280 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +443.52 550.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 550.080 m +442.080 550.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 557.93 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 557.280 m +442.080 557.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 565.13 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 564.480 m +442.080 564.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 572.33 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 571.680 m +442.080 571.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 579.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 578.880 m +442.080 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 586.73 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 586.080 m +442.080 586.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 593.93 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 593.280 m +442.080 593.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +442.08 601.13 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +449.280 600.480 m +442.080 600.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +414.58 616.96 Td +(WAVESHARE_LORA_CORE_1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +414.58 610.89 Td +(LoRa Core1262-868M) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +172.08 447.84 79.20 -108.00 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +248.76 433.44 m 248.76 434.04 248.28 434.52 247.68 434.52 c +247.08 434.52 246.60 434.04 246.60 433.44 c +246.60 432.84 247.08 432.36 247.68 432.36 c +248.28 432.36 248.76 432.84 248.76 433.44 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 439.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 435.41 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 440.640 m +251.280 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.43 431.81 Td +(2.4G) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 428.21 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 433.440 m +251.280 433.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +255.600 436.320 m +261.360 430.560 l +255.600 430.560 m +261.360 436.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 424.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 421.01 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 426.240 m +251.280 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +223.15 406.61 Td +(LR_NSS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 403.01 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 408.240 m +251.280 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +223.15 399.41 Td +(LR_SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 395.81 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 401.040 m +251.280 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.88 392.21 Td +(LR_MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 388.61 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 393.840 m +251.280 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +219.88 385.01 Td +(LR_MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 381.41 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 386.640 m +251.280 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +218.79 377.81 Td +(LR_BUSY) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 374.21 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 379.440 m +251.280 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +234.07 370.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +251.64 367.01 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 372.240 m +251.280 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 232.69 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 236.29 330.82 Tm +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 332.640 m +229.680 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 225.49 341.13 Tm +(DIO8) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 229.09 330.82 Tm +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +222.480 332.640 m +222.480 339.840 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +219.600 335.520 m +225.360 329.760 l +219.600 329.760 m +225.360 335.520 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 218.29 341.13 Tm +(DIO9) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 221.89 330.82 Tm +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +215.280 332.640 m +215.280 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 211.09 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 214.69 330.82 Tm +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +208.080 332.640 m +208.080 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 203.89 341.13 Tm +(LR_nRST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 207.49 330.82 Tm +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +200.880 332.640 m +200.880 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 196.69 341.13 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 200.29 330.82 Tm +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +193.680 332.640 m +193.680 339.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 370.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 367.01 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 372.240 m +172.080 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 377.81 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 374.21 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 379.440 m +172.080 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 385.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 381.41 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 386.640 m +172.080 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 392.21 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 388.61 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 393.840 m +172.080 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 399.41 Td +(VDD_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 395.81 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 401.040 m +172.080 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 406.61 Td +(VDD_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 403.01 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 408.240 m +172.080 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 424.61 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 421.01 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 426.240 m +172.080 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 431.81 Td +(SUBG_RF) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 428.21 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 433.440 m +172.080 433.440 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +162.000 436.320 m +167.760 430.560 l +162.000 430.560 m +167.760 436.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +174.74 439.01 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +164.44 435.41 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 440.640 m +172.080 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +205.52 456.81 Td +(Seeed_WIO-LR1121) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.52 450.33 Td +(Seeed_WIO-LR1121) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 419.760 m +265.680 432.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 421.920 m +267.120 430.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 424.080 m +268.560 428.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 425.520 m +270.000 426.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +270.36 422.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +265.680 434.160 m +265.680 447.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +267.120 436.320 m +267.120 444.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +268.560 438.480 m +268.560 442.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 439.920 m +270.000 441.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +270.36 437.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 447.120 m +157.680 434.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +156.240 444.960 m +156.240 436.320 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.800 442.800 m +154.800 438.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +153.360 441.360 m +153.360 439.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +134.04 437.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 432.720 m +157.680 419.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +156.240 430.560 m +156.240 421.920 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.800 428.400 m +154.800 424.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +153.360 426.960 m +153.360 425.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +134.04 422.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 408.240 m +161.280 408.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 404.640 m +154.080 411.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.280 408.240 m +161.280 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +135.94 404.89 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 393.840 m +161.280 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +154.080 400.320 m +154.080 387.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +152.640 398.160 m +152.640 389.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +151.200 396.000 m +151.200 391.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +149.760 394.560 m +149.760 393.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +161.280 393.840 m +161.280 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +130.44 390.49 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 365.040 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +252.000 365.040 m +264.960 365.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +254.160 363.600 m +262.800 363.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +256.320 362.160 m +260.640 362.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +257.760 360.720 m +259.200 360.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +249.00 351.97 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +218.880 307.440 l +229.680 307.440 l +229.680 300.240 l +218.880 300.240 l +215.280 303.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +215.280 303.840 m +215.280 303.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +231.68 301.41 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +262.080 383.040 l +272.880 383.040 l +272.880 375.840 l +262.080 375.840 l +258.480 379.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.10 376.72 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +240.480 321.840 m +240.480 329.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +246.960 321.840 m +234.000 321.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +244.800 320.400 m +236.160 320.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +242.640 318.960 m +238.320 318.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +241.200 317.520 m +239.760 317.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +240.480 329.040 m +240.480 329.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +235.17 308.77 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +190.080 307.440 l +179.280 307.440 l +179.280 300.240 l +190.080 300.240 l +193.680 303.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +193.680 303.840 m +193.680 303.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +157.92 301.18 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +262.080 404.640 l +272.880 404.640 l +272.880 411.840 l +262.080 411.840 l +258.480 408.240 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.28 405.44 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +262.080 397.440 l +272.880 397.440 l +272.880 404.640 l +262.080 404.640 l +258.480 401.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +273.07 398.24 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +262.080 390.240 l +272.880 390.240 l +272.880 397.440 l +262.080 397.440 l +258.480 393.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.72 391.04 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +262.080 383.040 l +272.880 383.040 l +272.880 390.240 l +262.080 390.240 l +258.480 386.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +274.82 383.84 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +92.880 1028.880 l +82.080 1028.880 l +82.080 1036.080 l +92.880 1036.080 l +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +63.54 1029.61 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +92.880 1108.080 l +82.080 1108.080 l +82.080 1115.280 l +92.880 1115.280 l +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +44.63 1108.96 Td +(SERIAL2RX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +92.880 1100.880 l +82.080 1100.880 l +82.080 1108.080 l +92.880 1108.080 l +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +45.35 1101.76 Td +(SERIAL2TX) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +272.88 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1054.080 m +276.480 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +281.52 1066.47 Td +(R_ADC_B) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +281.52 1059.99 Td +(1.5M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +272.880 1115.280 l +272.880 1126.080 l +280.080 1126.080 l +280.080 1115.280 l +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 277.83 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1046.880 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +270.000 1046.880 m +282.960 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +272.160 1045.440 m +280.800 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +274.320 1044.000 m +278.640 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +275.760 1042.560 m +277.200 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +267.12 1034.89 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +272.88 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1111.680 m +276.480 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +281.52 1095.27 Td +(R_ADC_T) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +281.52 1088.79 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +193.680 1100.880 l +204.480 1100.880 l +204.480 1093.680 l +193.680 1093.680 l +190.080 1097.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1097.280 m +190.080 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.93 1094.17 Td +(RBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +82.080 1050.480 l +71.280 1050.480 l +71.280 1057.680 l +82.080 1057.680 l +85.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1054.080 m +85.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +52.02 1051.36 Td +(UBTN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +89.280 1093.680 m +96.480 1093.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +89.280 1100.160 m +89.280 1087.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +87.840 1098.000 m +87.840 1089.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +86.400 1095.840 m +86.400 1091.520 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +84.960 1094.400 m +84.960 1092.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +96.480 1093.680 m +96.480 1093.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +65.88 1090.33 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +82.080 1057.680 l +71.280 1057.680 l +71.280 1064.880 l +82.080 1064.880 l +85.680 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1061.280 m +85.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +46.92 1058.41 Td +(GPSEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +82.080 1072.080 l +71.280 1072.080 l +71.280 1079.280 l +82.080 1079.280 l +85.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1075.680 m +85.680 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +46.92 1072.81 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +82.080 1064.880 l +71.280 1064.880 l +71.280 1072.080 l +82.080 1072.080 l +85.680 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1068.480 m +85.680 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +47.65 1065.61 Td +(GPSTX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +193.680 1043.280 l +204.480 1043.280 l +204.480 1036.080 l +193.680 1036.080 l +190.080 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1039.680 m +190.080 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1036.96 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +193.680 1036.080 l +204.480 1036.080 l +204.480 1028.880 l +193.680 1028.880 l +190.080 1032.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1032.480 m +190.080 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +206.28 1029.76 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1090.080 m +229.680 1090.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1093.680 m +236.880 1086.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 1090.080 m +229.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +237.60 1086.73 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +193.680 1057.680 l +204.480 1057.680 l +204.480 1050.480 l +193.680 1050.480 l +190.080 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1054.080 m +190.080 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1051.36 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +193.680 1064.880 l +204.480 1064.880 l +204.480 1057.680 l +193.680 1057.680 l +190.080 1061.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1061.280 m +190.080 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1058.56 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +193.680 1072.080 l +204.480 1072.080 l +204.480 1064.880 l +193.680 1064.880 l +190.080 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1068.480 m +190.080 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.92 1065.76 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +193.680 1050.480 l +204.480 1050.480 l +204.480 1043.280 l +193.680 1043.280 l +190.080 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1046.880 m +190.080 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.80 1044.16 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +193.680 1079.280 l +204.480 1079.280 l +204.480 1072.080 l +193.680 1072.080 l +190.080 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +190.080 1075.680 m +190.080 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +205.70 1072.96 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1104.480 m +229.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +236.880 1098.000 m +236.880 1110.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +238.320 1100.160 m +238.320 1108.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +239.760 1102.320 m +239.760 1106.640 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +241.200 1103.760 m +241.200 1105.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 1104.480 m +229.680 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.56 1101.13 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +186.480 1115.280 l +197.280 1115.280 l +197.280 1108.080 l +186.480 1108.080 l +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +199.08 1108.74 Td +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +82.080 1043.280 l +71.280 1043.280 l +71.280 1050.480 l +82.080 1050.480 l +85.680 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1046.880 m +85.680 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +57.11 1044.01 Td +(SCL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +82.080 1036.080 l +71.280 1036.080 l +71.280 1043.280 l +82.080 1043.280 l +85.680 1039.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +85.680 1039.680 m +85.680 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +56.38 1036.81 Td +(SDA) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +280.080 1086.480 l +290.880 1086.480 l +290.880 1079.280 l +280.080 1079.280 l +276.480 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +276.480 1082.880 m +276.480 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +292.82 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +658.080 1115.280 l +658.080 1126.080 l +665.280 1126.080 l +665.280 1115.280 l +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 663.03 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1046.880 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +655.200 1046.880 m +668.160 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +657.360 1045.440 m +666.000 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +659.520 1044.000 m +663.840 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +660.960 1042.560 m +662.400 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +652.32 1034.89 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +658.08 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1111.680 m +661.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +666.72 1095.27 Td +(R_ADC_T1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +666.72 1088.79 Td +(220k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +658.08 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1054.080 m +661.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +666.72 1066.47 Td +(R_ADC_B1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +666.72 1059.99 Td +(330k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +712.08 1104.48 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1111.680 m +715.680 1104.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +720.72 1095.27 Td +(R_ADC_T2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 1088.79 Td +(680k) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +712.08 1075.68 7.20 -14.40 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1054.080 m +715.680 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +720.72 1066.47 Td +(R_ADC_B2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +720.72 1059.99 Td +(1M) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +719.280 1086.480 l +730.080 1086.480 l +730.080 1079.280 l +719.280 1079.280 l +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +732.02 1079.93 Td +(ADC) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +640.08 1151.66 Td +(Alternative ADC resistors) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +712.080 1115.280 l +712.080 1126.080 l +719.280 1126.080 l +719.280 1115.280 l +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 717.03 1126.29 Tm +(BATT) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +715.680 1046.880 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +709.200 1046.880 m +722.160 1046.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +711.360 1045.440 m +720.000 1045.440 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +713.520 1044.000 m +717.840 1044.000 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +714.960 1042.560 m +716.400 1042.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +706.32 1034.89 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +665.280 1086.480 l +676.080 1086.480 l +676.080 1079.280 l +665.280 1079.280 l +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +678.02 1079.93 Td +(ADC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +89.280 1079.280 l +78.480 1079.280 l +78.480 1086.480 l +89.280 1086.480 l +92.880 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +92.880 1082.880 m +92.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +58.86 1080.01 Td +(RXEN) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +377.280 1082.880 m +373.680 1079.280 l +362.880 1079.280 l +362.880 1086.480 l +373.680 1086.480 l +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +377.280 1082.880 m +377.280 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +343.26 1080.01 Td +(RXEN) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +218.88 248.06 Td +(Bulk Capacitors) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +154.080 686.880 l +143.280 686.880 l +143.280 694.080 l +154.080 694.080 l +157.680 690.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +124.34 687.64 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +485.280 733.680 l +496.080 733.680 l +496.080 726.480 l +485.280 726.480 l +481.680 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +497.53 727.03 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +733.680 733.680 l +744.480 733.680 l +744.480 726.480 l +733.680 726.480 l +730.080 730.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +745.93 727.03 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +366.48 820.46 Td +(NB// Ant pin is not connected, ) Tj +T* (except on non-ipex version) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +150.48 289.82 Td +(NB// Ant pin is not connected, ) Tj +T* (except on non-ipex version) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +157.68 665.66 Td +(NB// Non-TCXO!) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +114.48 809.66 Td +(NB// RA-01SH is Non-TCXO!) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +632.88 161.66 Td +(NB// SX1276 - non-preferred!) Tj +ET +2 J +0 j +72 M +0.72 w +0.00 G +[] 0 d +35.28 476.64 777.60 -208.80 re +S +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +46.08 459.02 Td +(LR1121 Modules) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +384.480 575.280 l +373.680 575.280 l +373.680 582.480 l +384.480 582.480 l +388.080 578.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +354.75 576.23 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 863.280 m +730.080 856.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +730.44 856.27 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +726.480 870.480 l +737.280 870.480 l +737.280 863.280 l +726.480 863.280 l +722.880 866.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +738.72 863.93 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +625.680 848.880 l +614.880 848.880 l +614.880 856.080 l +625.680 856.080 l +629.280 852.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +595.95 849.54 Td +(DIO2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 869.760 m +622.080 856.800 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +620.640 867.600 m +620.640 858.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +619.200 865.440 m +619.200 861.120 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +617.760 864.000 m +617.760 862.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +598.68 859.87 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 884.880 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +730.080 878.400 m +730.080 891.360 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +731.520 880.560 m +731.520 889.200 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +732.960 882.720 m +732.960 887.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +734.400 884.160 m +734.400 885.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 884.880 m +722.880 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +734.76 881.47 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.880 809.280 m +722.880 816.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +716.400 809.280 m +729.360 809.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +718.560 807.840 m +727.200 807.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +720.720 806.400 m +725.040 806.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +722.160 804.960 m +723.600 804.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 816.480 m +722.880 816.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +713.52 797.29 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +625.680 841.680 l +614.880 841.680 l +614.880 848.880 l +625.680 848.880 l +629.280 845.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +600.16 842.12 Td +(IRQ) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +625.680 834.480 l +614.880 834.480 l +614.880 841.680 l +625.680 841.680 l +629.280 838.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +593.11 834.92 Td +(BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +625.680 834.480 l +614.880 834.480 l +614.880 827.280 l +625.680 827.280 l +629.280 830.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +593.65 828.45 Td +(NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +622.080 899.280 m +622.080 906.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +602.58 899.53 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +625.680 892.080 l +614.880 892.080 l +614.880 899.280 l +625.680 899.280 l +629.280 895.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +604.35 892.81 Td +(CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +625.680 884.880 l +614.880 884.880 l +614.880 892.080 l +625.680 892.080 l +629.280 888.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +599.98 885.61 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +625.680 877.680 l +614.880 877.680 l +614.880 870.480 l +625.680 870.480 l +629.280 874.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 870.64 Td +(MISO) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +625.680 884.880 l +614.880 884.880 l +614.880 877.680 l +625.680 877.680 l +629.280 881.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +596.71 877.84 Td +(MOSI) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +636.48 910.08 79.20 -86.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 899.93 Td +(VDD) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 903.53 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 902.880 m +636.480 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 892.73 Td +(CS) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 896.33 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 895.680 m +636.480 895.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 885.53 Td +(SCK) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 889.13 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 888.480 m +636.480 888.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 878.33 Td +(MOSI) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 881.93 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 881.280 m +636.480 881.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 871.13 Td +(MISO) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 874.73 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 874.080 m +636.480 874.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +639.14 860.33 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +632.48 863.93 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 863.280 m +636.480 863.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 850.25 Td +(DIO2) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 853.13 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 852.480 m +636.480 852.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 843.05 Td +(DIO1) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 845.93 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 845.280 m +636.480 845.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 835.85 Td +(Busy) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +633.20 838.73 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 838.080 m +636.480 838.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +638.64 828.65 Td +(NRst) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +629.56 831.53 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +629.280 830.880 m +636.480 830.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +703.70 900.65 Td +(Ant) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +715.32 903.53 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 902.880 m +715.680 902.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.98 889.85 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +715.32 892.73 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 892.080 m +715.680 892.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 881.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 885.53 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 884.880 m +715.680 884.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 874.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 878.33 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 877.680 m +715.680 877.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +679.19 863.93 Td +(TX_RX_EN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 867.53 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 866.880 m +715.680 866.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +685.01 856.73 Td +(VDD_SW) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 860.33 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 859.680 m +715.680 859.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 845.93 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 849.53 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 848.880 m +715.680 848.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 838.73 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 842.33 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 841.680 m +715.680 841.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 832.97 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 835.13 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 834.480 m +715.680 834.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +698.47 825.77 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +716.04 827.93 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +722.880 827.280 m +715.680 827.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 665.41 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 663.25 814.66 Tm +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +665.280 816.480 m +665.280 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 672.61 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 670.45 814.66 Tm +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +672.480 816.480 m +672.480 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 679.81 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 677.65 814.66 Tm +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +679.680 816.480 m +679.680 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 687.01 824.97 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 684.85 814.66 Tm +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +686.880 816.480 m +686.880 823.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +672.16 919.36 Td +(ELECROW_LR1262) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +672.16 913.29 Td +(LR1262 Transceiver) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +751.680 917.280 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +745.200 917.280 m +758.160 917.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +747.360 915.840 m +756.000 915.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +749.520 914.400 m +753.840 914.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +750.960 912.960 m +752.400 912.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +742.32 904.57 Td +(GND) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +758.88 931.68 14.40 -14.40 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 764.05 908.66 Tm +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +766.080 902.880 m +766.080 917.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +755.24 919.25 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +751.680 924.480 m +758.880 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +773.28 919.25 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +780.480 924.480 m +773.280 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 764.05 930.30 Tm +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +766.080 938.880 m +766.080 931.680 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +763.200 941.760 m +768.960 936.000 l +763.200 936.000 m +768.960 941.760 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +767.52 924.48 m 767.52 925.28 766.88 925.92 766.08 925.92 c +765.28 925.92 764.64 925.28 764.64 924.48 c +764.64 923.68 765.28 923.04 766.08 923.04 c +766.88 923.04 767.52 923.68 767.52 924.48 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +766.080 923.040 m +766.080 917.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 0.502 rg +750.92 948.68 Td +(U4) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +750.92 942.13 Td +(AMC-U_FL) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +780.480 917.280 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +774.000 917.280 m +786.960 917.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +776.160 915.840 m +784.800 915.840 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +778.320 914.400 m +782.640 914.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +779.760 912.960 m +781.200 912.960 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +771.12 904.57 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +110.880 602.640 m +154.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +110.880 602.640 m +154.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 233.280 m +654.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 233.280 m +654.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 895.680 m +355.680 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 895.680 m +355.680 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1090.080 m +514.080 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1104.480 m +514.080 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1068.480 m +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1068.480 m +474.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1061.280 m +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1061.280 m +474.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1046.880 m +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1046.880 m +474.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1054.080 m +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1054.080 m +474.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1039.680 m +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1039.680 m +474.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1075.680 m +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1075.680 m +474.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1032.480 m +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1032.480 m +474.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1097.280 m +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1097.280 m +474.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1082.880 m +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1082.880 m +560.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1039.680 m +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1039.680 m +370.080 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1046.880 m +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1046.880 m +370.080 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1054.080 m +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1054.080 m +370.080 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1061.280 m +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1061.280 m +370.080 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1068.480 m +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1068.480 m +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1075.680 m +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1075.680 m +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1093.680 m +380.880 1090.080 l +S +380.880 1097.280 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1093.680 m +380.880 1090.080 l +S +380.880 1097.280 m +380.880 1093.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 748.080 m +730.080 751.680 l +S +730.080 748.080 m +730.080 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 748.080 m +730.080 751.680 l +S +730.080 748.080 m +730.080 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 758.880 m +481.680 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 758.880 m +481.680 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 712.080 m +100.080 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 712.080 m +100.080 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 679.680 m +730.080 674.640 l +S +730.080 715.680 m +730.080 708.480 l +S +730.080 694.080 m +730.080 708.480 l +S +730.080 686.880 m +730.080 694.080 l +S +730.080 679.680 m +730.080 686.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 679.680 m +730.080 674.640 l +S +730.080 715.680 m +730.080 708.480 l +S +730.080 694.080 m +730.080 708.480 l +S +730.080 686.880 m +730.080 694.080 l +S +730.080 679.680 m +730.080 686.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 679.680 m +481.680 686.880 l +S +481.680 694.080 m +481.680 686.880 l +S +481.680 694.080 m +481.680 708.480 l +S +481.680 715.680 m +481.680 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 679.680 m +481.680 686.880 l +S +481.680 694.080 m +481.680 686.880 l +S +481.680 694.080 m +481.680 708.480 l +S +481.680 715.680 m +481.680 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 884.880 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 884.880 m +114.480 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 877.680 m +125.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 892.080 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 892.080 m +218.880 892.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 589.680 m +730.080 593.280 l +S +730.080 593.280 m +730.080 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 589.680 m +730.080 593.280 l +S +730.080 593.280 m +730.080 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 524.880 m +730.080 532.080 l +S +730.080 532.080 m +730.080 539.280 l +S +730.080 539.280 m +730.080 553.680 l +S +730.080 560.880 m +730.080 553.680 l +S +730.080 524.880 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 524.880 m +730.080 532.080 l +S +730.080 532.080 m +730.080 539.280 l +S +730.080 539.280 m +730.080 553.680 l +S +730.080 560.880 m +730.080 553.680 l +S +730.080 524.880 m +730.080 521.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +215.280 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +215.280 303.840 m +215.280 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +200.880 303.840 l +S +200.880 303.840 m +200.880 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +193.680 303.840 m +200.880 303.840 l +S +200.880 303.840 m +200.880 332.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 401.040 m +161.280 401.040 l +S +161.280 401.040 m +161.280 408.240 l +S +161.280 408.240 m +164.880 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 401.040 m +161.280 401.040 l +S +161.280 401.040 m +161.280 408.240 l +S +161.280 408.240 m +164.880 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +161.280 386.640 m +161.280 393.840 l +S +161.280 393.840 m +164.880 393.840 l +S +161.280 379.440 m +161.280 386.640 l +S +164.880 386.640 m +161.280 386.640 l +S +164.880 372.240 m +161.280 372.240 l +S +161.280 372.240 m +161.280 379.440 l +S +164.880 379.440 m +161.280 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +161.280 386.640 m +161.280 393.840 l +S +161.280 393.840 m +164.880 393.840 l +S +161.280 379.440 m +161.280 386.640 l +S +164.880 386.640 m +161.280 386.640 l +S +164.880 372.240 m +161.280 372.240 l +S +161.280 372.240 m +161.280 379.440 l +S +164.880 379.440 m +161.280 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1090.080 m +96.480 1093.680 l +S +96.480 1093.680 m +96.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1090.080 m +96.480 1093.680 l +S +96.480 1093.680 m +96.480 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +96.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1075.680 m +96.480 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +96.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1068.480 m +96.480 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +96.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1061.280 m +96.480 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +96.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1054.080 m +96.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +96.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1046.880 m +96.480 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +96.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 1039.680 m +96.480 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +182.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1082.880 m +182.880 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +182.880 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1097.280 m +182.880 1097.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +182.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1032.480 m +182.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +182.880 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1075.680 m +182.880 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +182.880 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1039.680 m +182.880 1039.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +182.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1054.080 m +182.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +182.880 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1046.880 m +182.880 1046.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +182.880 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1061.280 m +182.880 1061.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +182.880 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +190.080 1068.480 m +182.880 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1104.480 m +182.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1104.480 m +182.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1090.080 m +182.880 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 1090.080 m +182.880 1090.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +96.480 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +92.880 1082.880 m +96.480 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1082.880 m +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1082.880 m +377.280 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 841.680 m +722.880 848.880 l +S +722.880 834.480 m +722.880 841.680 l +S +722.880 827.280 m +722.880 834.480 l +S +722.880 827.280 m +722.880 816.480 l +S +722.880 816.480 m +686.880 816.480 l +S +686.880 816.480 m +679.680 816.480 l +S +679.680 816.480 m +672.480 816.480 l +S +672.480 816.480 m +665.280 816.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 841.680 m +722.880 848.880 l +S +722.880 834.480 m +722.880 841.680 l +S +722.880 827.280 m +722.880 834.480 l +S +722.880 827.280 m +722.880 816.480 l +S +722.880 816.480 m +686.880 816.480 l +S +686.880 816.480 m +679.680 816.480 l +S +679.680 816.480 m +672.480 816.480 l +S +672.480 816.480 m +665.280 816.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 884.880 m +722.880 892.080 l +S +722.880 877.680 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 884.880 m +722.880 892.080 l +S +722.880 877.680 m +722.880 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +766.080 902.880 m +722.880 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +766.080 902.880 m +722.880 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 329.040 m +229.680 332.640 l +S +193.680 332.640 m +193.680 329.040 l +S +193.680 329.040 m +208.080 329.040 l +S +208.080 332.640 m +208.080 329.040 l +S +208.080 329.040 m +229.680 329.040 l +S +240.480 329.040 m +229.680 329.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 329.040 m +229.680 332.640 l +S +193.680 332.640 m +193.680 329.040 l +S +193.680 329.040 m +208.080 329.040 l +S +208.080 332.640 m +208.080 329.040 l +S +208.080 329.040 m +229.680 329.040 l +S +240.480 329.040 m +229.680 329.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +467.280 1111.680 m +467.280 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1104.480 m +380.880 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1111.680 m +380.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 1032.480 m +380.880 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +402.480 996.480 m +402.480 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +409.680 996.480 m +409.680 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +416.880 996.480 m +416.880 996.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +182.880 1111.680 m +182.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1104.480 m +96.480 1104.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1111.680 m +96.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1032.480 m +96.480 1032.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 161.280 m +118.080 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +118.080 211.680 m +118.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 161.280 m +74.880 161.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +74.880 211.680 m +74.880 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +125.280 624.240 m +125.280 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 624.240 m +96.480 624.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 573.840 m +154.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 595.440 m +154.080 595.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 602.640 m +226.080 602.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 552.240 m +226.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 588.240 m +226.080 588.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 559.440 m +154.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +154.080 552.240 m +154.080 552.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 581.040 m +226.080 581.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 573.840 m +226.080 573.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 566.640 m +226.080 566.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 559.440 m +226.080 559.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 218.880 m +654.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 233.280 m +719.280 233.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 182.880 m +719.280 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 197.280 m +654.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 211.680 m +654.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 211.680 m +719.280 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 218.880 m +719.280 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 204.480 m +719.280 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +719.280 226.080 m +719.280 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +654.480 204.480 m +654.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 215.280 m +269.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 186.480 m +233.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +233.280 215.280 m +233.280 215.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +269.280 186.480 m +269.280 186.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1111.680 m +560.880 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +560.880 1054.080 m +560.880 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 434.880 m +730.080 434.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 362.880 m +629.280 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 377.280 m +629.280 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 391.680 m +629.280 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 442.080 m +629.280 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 442.080 m +730.080 442.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 391.680 m +730.080 391.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 377.280 m +730.080 377.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 362.880 m +730.080 362.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 398.880 m +629.280 398.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 406.080 m +629.280 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 413.280 m +629.280 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 420.480 m +629.280 420.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 427.680 m +629.280 427.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 413.280 m +730.080 413.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 406.080 m +730.080 406.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +114.480 733.680 m +114.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 744.480 m +481.680 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 748.080 m +157.680 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 737.280 m +629.280 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 751.680 m +629.280 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 737.280 m +730.080 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 708.480 m +629.280 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 722.880 m +629.280 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 730.080 m +629.280 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 715.680 m +629.280 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 722.880 m +730.080 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 744.480 m +629.280 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 694.080 m +629.280 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 679.680 m +629.280 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 758.880 m +730.080 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 758.880 m +629.280 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 740.880 m +157.680 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 704.880 m +157.680 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 719.280 m +222.480 719.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 758.880 m +380.880 758.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 679.680 m +380.880 679.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 694.080 m +380.880 694.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 744.480 m +380.880 744.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 722.880 m +481.680 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 715.680 m +380.880 715.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 730.080 m +380.880 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 722.880 m +380.880 722.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 708.480 m +380.880 708.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 737.280 m +481.680 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 751.680 m +380.880 751.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +380.880 737.280 m +380.880 737.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 733.680 m +222.480 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 733.680 m +157.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 748.080 m +222.480 748.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 740.880 m +222.480 740.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 704.880 m +222.480 704.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 697.680 m +222.480 697.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 690.480 m +222.480 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 712.080 m +222.480 712.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 683.280 m +157.680 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +222.480 683.280 m +222.480 683.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +157.680 690.480 m +157.680 690.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 730.080 m +730.080 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +481.680 730.080 m +481.680 730.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 870.480 m +132.480 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +132.480 856.080 m +132.480 856.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 841.680 m +197.280 841.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 848.880 m +197.280 848.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 863.280 m +197.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 870.480 m +197.280 870.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 877.680 m +197.280 877.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +197.280 884.880 m +197.280 884.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 888.480 m +370.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 881.280 m +370.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 874.080 m +370.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 866.880 m +370.080 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 859.680 m +370.080 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 852.480 m +370.080 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +370.080 845.280 m +370.080 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 874.080 m +478.080 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 881.280 m +478.080 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +478.080 888.480 m +478.080 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +85.680 733.680 m +85.680 733.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 568.080 m +730.080 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 575.280 m +730.080 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 582.480 m +629.280 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 596.880 m +629.280 596.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 582.480 m +730.080 582.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 553.680 m +629.280 553.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 568.080 m +629.280 568.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 575.280 m +629.280 575.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 560.880 m +629.280 560.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 589.680 m +629.280 589.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 539.280 m +629.280 539.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 524.880 m +629.280 524.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +730.080 604.080 m +730.080 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 604.080 m +629.280 604.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 431.280 m +377.280 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 424.080 m +377.280 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 395.280 m +377.280 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +377.280 388.080 m +377.280 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 388.080 m +460.080 388.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 395.280 m +460.080 395.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 402.480 m +460.080 402.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 409.680 m +460.080 409.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 416.880 m +460.080 416.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 424.080 m +460.080 424.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +460.080 431.280 m +460.080 431.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 557.280 m +388.080 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 586.080 m +388.080 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 593.280 m +449.280 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 600.480 m +388.080 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 593.280 m +388.080 593.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 571.680 m +449.280 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 564.480 m +449.280 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 578.880 m +449.280 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 586.080 m +449.280 586.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 550.080 m +388.080 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 557.280 m +449.280 557.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 550.080 m +449.280 550.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 564.480 m +388.080 564.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +449.280 600.480 m +449.280 600.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 571.680 m +388.080 571.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +388.080 578.880 m +388.080 578.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 440.640 m +258.480 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 426.240 m +258.480 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 408.240 m +258.480 408.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 401.040 m +258.480 401.040 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 393.840 m +258.480 393.840 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 386.640 m +258.480 386.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 379.440 m +258.480 379.440 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +258.480 372.240 m +258.480 372.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 426.240 m +164.880 426.240 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +164.880 440.640 m +164.880 440.640 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1054.080 m +276.480 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +276.480 1111.680 m +276.480 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1111.680 m +661.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1054.080 m +661.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +661.680 1082.880 m +661.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1111.680 m +715.680 1111.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1082.880 m +715.680 1082.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +715.680 1054.080 m +715.680 1054.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 859.680 m +722.880 859.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +722.880 866.880 m +722.880 866.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 852.480 m +629.280 852.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 863.280 m +629.280 863.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 845.280 m +629.280 845.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 838.080 m +629.280 838.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 830.880 m +629.280 830.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 902.880 m +629.280 902.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 895.680 m +629.280 895.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 888.480 m +629.280 888.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 874.080 m +629.280 874.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +629.280 881.280 m +629.280 881.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +751.680 924.480 m +751.680 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +780.480 924.480 m +780.480 924.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +420.480 222.480 l +409.680 222.480 l +409.680 229.680 l +420.480 229.680 l +424.080 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +365.70 223.79 Td +(E_INK_BUSY) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +420.480 215.280 l +409.680 215.280 l +409.680 222.480 l +420.480 222.480 l +424.080 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +366.48 216.59 Td +(E_INK_NRST) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +420.480 208.080 l +409.680 208.080 l +409.680 215.280 l +420.480 215.280 l +424.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +370.08 209.39 Td +(E_INK_D/C) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +420.480 200.880 l +409.680 200.880 l +409.680 208.080 l +420.480 208.080 l +424.080 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +373.68 202.19 Td +(E_INK_CS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +420.480 193.680 l +409.680 193.680 l +409.680 200.880 l +420.480 200.880 l +424.080 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +391.68 194.99 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +420.480 186.480 l +409.680 186.480 l +409.680 193.680 l +420.480 193.680 l +424.080 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +388.08 187.79 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +413.280 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +413.280 172.080 m +413.280 179.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +420.480 175.680 m +420.480 175.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +398.88 173.39 Td +(3V3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +416.880 189.360 m +416.880 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +415.440 187.200 m +415.440 178.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +414.000 185.040 m +414.000 180.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +412.560 183.600 m +412.560 182.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +391.68 180.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +442.080 215.280 l +452.880 215.280 l +452.880 208.080 l +442.080 208.080 l +438.480 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 209.39 Td +(P1.02) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +442.080 208.080 l +452.880 208.080 l +452.880 200.880 l +442.080 200.880 l +438.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 202.19 Td +(P1.07) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +442.080 222.480 l +452.880 222.480 l +452.880 215.280 l +442.080 215.280 l +438.480 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.38 216.59 Td +(P1.01) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +442.080 229.680 l +452.880 229.680 l +452.880 222.480 l +442.080 222.480 l +438.480 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +456.48 223.79 Td +(P1.06) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 226.080 m +434.880 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 226.080 m +427.680 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 226.080 m +431.280 228.240 l +434.880 226.080 l +431.280 223.920 l +427.680 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 226.080 m +424.080 226.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 218.880 m +434.880 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 218.880 m +427.680 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 218.880 m +431.280 221.040 l +434.880 218.880 l +431.280 216.720 l +427.680 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 218.880 m +424.080 218.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 211.680 m +434.880 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 211.680 m +427.680 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 211.680 m +431.280 213.840 l +434.880 211.680 l +431.280 209.520 l +427.680 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 211.680 m +424.080 211.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 204.480 m +434.880 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 204.480 m +427.680 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 204.480 m +431.280 206.640 l +434.880 204.480 l +431.280 202.320 l +427.680 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 204.480 m +424.080 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 197.280 m +434.880 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 197.280 m +427.680 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 197.280 m +431.280 199.440 l +434.880 197.280 l +431.280 195.120 l +427.680 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 197.280 m +424.080 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 190.080 m +434.880 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 190.080 m +427.680 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 190.080 m +431.280 192.240 l +434.880 190.080 l +431.280 187.920 l +427.680 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 190.080 m +424.080 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 182.880 m +434.880 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 182.880 m +427.680 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 182.880 m +431.280 185.040 l +434.880 182.880 l +431.280 180.720 l +427.680 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 182.880 m +424.080 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 175.680 m +434.880 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +424.080 175.680 m +427.680 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +427.680 175.680 m +431.280 177.840 l +434.880 175.680 l +431.280 173.520 l +427.680 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +424.080 175.680 m +420.480 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +449.280 179.280 m +449.280 172.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +442.080 175.680 m +442.080 175.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +452.88 173.39 Td +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +445.680 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +445.680 189.360 m +445.680 176.400 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +447.120 187.200 m +447.120 178.560 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +448.560 185.040 m +448.560 180.720 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +450.000 183.600 m +450.000 182.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +452.74 180.59 Td +(GND) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 182.880 m +438.480 182.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 175.680 m +442.080 175.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 226.080 m +438.480 226.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 218.880 m +438.480 218.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 211.680 m +438.480 211.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 204.480 m +438.480 204.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +442.080 200.880 l +452.880 200.880 l +452.880 193.680 l +442.080 193.680 l +438.480 197.280 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +457.42 194.99 Td +(SCK) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +442.080 193.680 l +452.880 193.680 l +452.880 186.480 l +442.080 186.480 l +438.480 190.080 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +456.36 188.47 Td +(MOSI) Tj +ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 197.280 m +438.480 197.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +438.480 190.080 m +438.480 190.080 l +S +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +395.28 249.32 Td +(E-Ink Connections) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +395.28 1126.08 57.60 -115.20 re +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +431.44 1109.75 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1112.63 Td +(25) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1111.680 m +452.880 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +436.18 1102.55 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1105.43 Td +(24) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1104.480 m +452.880 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +437.63 1095.35 Td +(RST) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1098.23 Td +(23) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1097.280 m +452.880 1097.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +425.98 1088.15 Td +(3.3v Out) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1091.03 Td +(22) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1090.080 m +452.880 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1059.35 Td +(P1.15) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1062.23 Td +(18) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1061.280 m +452.880 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1080.95 Td +(P0.31) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1083.83 Td +(21) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1082.880 m +452.880 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1102.55 Td +(P0.08) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1105.43 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1104.480 m +395.280 1104.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1052.15 Td +(P1.13) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1055.03 Td +(17) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1054.080 m +452.880 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1073.75 Td +(P0.29) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1076.63 Td +(20) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1075.680 m +452.880 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1044.95 Td +(P1.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1047.83 Td +(16) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1046.880 m +452.880 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1066.55 Td +(P0.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1069.43 Td +(19) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1068.480 m +452.880 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1095.35 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1098.23 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1097.280 m +395.280 1097.280 l +S +0.72 w +0.63 0.00 0.00 RG +395.28 1111.68 m 395.28 1112.87 394.31 1113.84 393.12 1113.84 c +391.93 1113.84 390.96 1112.87 390.96 1111.68 c +390.96 1110.49 391.93 1109.52 393.12 1109.52 c +394.31 1109.52 395.28 1110.49 395.28 1111.68 c +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1109.75 Td +(P0.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1112.63 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1111.680 m +390.960 1111.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1030.55 Td +(P0.09) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1033.43 Td +(14) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1032.480 m +452.880 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +433.62 1037.75 Td +(P0.10) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1040.63 Td +(15) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1039.680 m +452.880 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1037.75 Td +(P1.04) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1040.63 Td +(12) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1039.680 m +395.280 1039.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1088.15 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1091.03 Td +(5) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1090.080 m +395.280 1090.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1080.95 Td +(P0.17) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1083.83 Td +(6) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1082.880 m +395.280 1082.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1073.75 Td +(P0.20) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1076.63 Td +(7) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1075.680 m +395.280 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1066.55 Td +(P0.22) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1069.43 Td +(8) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1068.480 m +395.280 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1059.35 Td +(P0.24) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1062.23 Td +(9) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1061.280 m +395.280 1061.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1052.15 Td +(P1.00) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1055.03 Td +(10) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1054.080 m +395.280 1054.080 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1044.95 Td +(P0.11) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1047.83 Td +(11) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1046.880 m +395.280 1046.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1030.55 Td +(P1.06) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +383.68 1033.43 Td +(13) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1032.480 m +395.280 1032.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 403.33 1011.96 Tm +(P1.01) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 400.45 998.20 Tm +(27) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +402.480 996.480 m +402.480 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 410.53 1011.96 Tm +(P1.02) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 407.65 998.20 Tm +(28) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +409.680 996.480 m +409.680 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 417.73 1011.96 Tm +(P1.07) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +0.00 1.00 -1.00 0.00 414.85 998.20 Tm +(29) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +416.880 996.480 m +416.880 1010.880 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +431.44 1116.95 Td +(BATIN) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +457.20 1119.83 Td +(26) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +467.280 1118.880 m +452.880 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +464.400 1121.760 m +470.160 1116.000 l +464.400 1116.000 m +470.160 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +397.44 1116.95 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +387.32 1119.83 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +380.880 1118.880 m +395.280 1118.880 l +S +1 J +1 j +0.72 w +0.20 0.80 0.20 RG +[] 0 d +378.000 1121.760 m +383.760 1116.000 l +378.000 1116.000 m +383.760 1121.760 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +419.78 1128.78 Td +(PRO_MICRO_NRF52840_29P) Tj +ET +q +1 0 0 1 762.48 1112.40 cm +1.0000 0.0000 0.0000 1.0000 0 0 cm +1 0 0 1 0.00 0.00 cm +72.00 0 0 72.00 0 0 cm +/I0 Do +Q +q +0.16 0.16 0.23 rg +[] 0 d +348.612 35.359 m +470.980 35.359 l +470.980 11.520 l +348.612 11.520 l +348.612 35.359 l +f +0.40 0.92 0.58 rg +[] 0 d +381.817 11.520 m +351.787 11.520 l +349.935 11.520 348.480 12.977 348.480 14.831 c +348.480 32.048 l +348.480 33.902 349.935 35.359 351.787 35.359 c +381.817 35.359 l +381.817 11.520 l +f +0.16 0.16 0.23 rg +[] 0 d +368.720 30.591 m +368.720 30.591 l +368.588 30.591 l +368.588 30.591 l +368.588 30.591 l +368.456 30.591 l +368.456 30.458 l +368.456 30.458 l +368.456 30.458 l +368.323 30.458 l +368.323 30.326 368.323 30.326 368.323 30.326 c +368.191 30.326 l +368.191 30.326 l +368.191 30.326 368.191 30.326 368.191 30.326 c +368.191 30.326 l +368.059 30.194 l +368.059 30.194 l +368.059 30.194 368.059 30.194 368.059 30.194 c +368.059 30.194 l +368.059 30.061 l +368.059 30.061 368.059 30.061 367.927 30.061 c +367.927 30.061 l +367.927 29.929 l +367.927 29.929 l +367.927 29.929 367.927 29.929 367.927 29.929 c +367.794 29.796 l +367.794 29.796 l +367.794 29.664 l +367.794 29.664 367.794 29.664 367.662 29.664 c +367.662 29.664 l +367.662 29.664 l +367.662 29.531 367.662 29.531 367.662 29.531 c +367.662 29.531 l +367.662 29.531 l +367.530 29.531 l +367.530 29.399 367.530 29.399 367.530 29.399 c +367.530 29.399 l +367.397 29.266 l +367.397 29.266 l +367.397 29.134 367.397 29.134 367.397 29.266 c +367.397 29.134 l +367.397 29.134 l +367.397 29.134 367.397 29.134 367.265 29.134 c +367.265 29.002 l +367.265 29.002 l +367.265 29.002 l +367.133 28.869 l +367.133 28.869 l +367.133 28.737 l +367.133 28.737 367.133 28.737 367.133 28.737 c +367.001 28.737 l +367.001 28.604 l +367.001 28.604 l +367.001 28.604 367.001 28.604 367.001 28.604 c +366.868 28.472 l +366.868 28.472 l +366.868 28.339 l +366.868 28.339 l +366.868 28.339 366.868 28.339 366.736 28.339 c +366.736 28.339 l +366.736 28.207 366.736 28.207 366.736 28.207 c +366.736 28.207 l +366.736 28.207 l +366.736 28.075 l +366.736 28.075 366.736 28.075 366.604 28.075 c +366.604 28.075 l +366.604 27.942 l +366.471 27.942 l +366.471 27.810 l +366.471 27.810 366.471 27.810 366.471 27.810 c +366.471 27.810 l +366.471 27.810 366.471 27.810 366.471 27.810 c +366.339 27.677 l +366.339 27.677 l +366.339 27.677 l +366.339 27.545 366.339 27.545 366.339 27.545 c +366.339 27.545 l +366.207 27.545 l +366.207 27.412 l +366.207 27.412 366.207 27.412 366.207 27.412 c +366.074 27.412 l +366.074 27.280 l +366.074 27.280 366.207 27.280 366.074 27.280 c +366.074 27.280 l +366.074 27.280 l +366.074 27.148 l +366.074 27.148 366.074 27.148 365.942 27.148 c +365.942 27.015 l +365.942 27.015 l +365.942 26.883 l +365.942 26.883 365.942 26.883 365.810 26.883 c +365.810 26.883 l +365.810 26.883 l +365.810 26.750 365.810 26.750 365.810 26.750 c +365.678 26.750 l +365.678 26.750 l +365.678 26.618 l +365.678 26.618 l +365.545 26.485 l +365.545 26.485 l +365.545 26.353 365.545 26.485 365.545 26.485 c +365.545 26.353 l +365.545 26.353 l +365.413 26.353 l +365.413 26.220 365.413 26.220 365.413 26.220 c +365.413 26.220 l +365.281 26.220 l +365.281 26.088 l +365.281 26.088 l +365.281 25.956 365.281 25.956 365.281 25.956 c +365.281 25.956 l +365.281 25.956 365.281 25.956 365.148 25.956 c +365.148 25.956 l +365.148 25.823 l +365.148 25.823 l +365.148 25.823 365.148 25.823 365.148 25.823 c +365.016 25.691 l +365.016 25.691 l +365.016 25.558 l +364.884 25.558 l +364.884 25.558 365.016 25.558 364.884 25.558 c +364.884 25.558 l +364.884 25.426 364.884 25.426 364.884 25.426 c +364.884 25.426 l +364.884 25.426 l +364.752 25.293 l +364.752 25.293 364.752 25.293 364.752 25.293 c +364.752 25.293 l +364.752 25.161 l +364.619 25.161 l +364.619 25.029 364.619 25.029 364.619 25.029 c +364.619 25.029 l +364.619 25.029 l +364.619 25.029 364.619 25.029 364.487 25.029 c +364.487 24.896 l +364.487 24.896 l +364.487 24.896 l +364.487 24.764 364.487 24.896 364.487 24.896 c +364.355 24.764 l +364.355 24.764 l +364.355 24.631 l +364.355 24.631 364.355 24.631 364.355 24.631 c +364.222 24.631 l +364.222 24.499 l +364.222 24.499 364.222 24.499 364.222 24.499 c +364.222 24.499 l +364.090 24.366 l +364.090 24.366 l +364.090 24.234 l +364.090 24.234 l +363.958 24.234 l +363.958 24.101 364.090 24.101 363.958 24.101 c +363.958 24.101 l +363.958 24.101 l +363.958 23.969 l +363.958 23.969 363.958 23.969 363.826 23.969 c +363.826 23.969 l +363.826 23.837 l +363.693 23.837 l +363.693 23.704 l +363.693 23.704 l +363.693 23.572 363.693 23.704 363.693 23.704 c +363.561 23.572 l +363.561 23.572 l +363.561 23.572 l +363.561 23.439 363.561 23.439 363.561 23.439 c +363.561 23.439 l +363.429 23.439 l +363.429 23.307 l +363.429 23.307 l +363.429 23.174 363.429 23.174 363.296 23.174 c +363.296 23.174 l +363.296 23.174 363.429 23.174 363.296 23.174 c +363.296 23.174 l +363.296 23.042 l +363.296 23.042 l +363.296 23.042 363.296 23.042 363.164 23.042 c +363.164 22.910 l +363.164 22.910 l +363.164 22.777 l +363.164 22.777 363.164 22.777 363.032 22.777 c +363.032 22.777 l +363.032 22.777 l +363.032 22.645 363.032 22.645 363.032 22.645 c +362.900 22.645 l +362.900 22.645 l +362.900 22.645 l +362.900 22.512 362.900 22.512 362.900 22.512 c +362.900 22.512 l +362.767 22.380 l +362.767 22.380 l +362.767 22.247 362.767 22.247 362.767 22.380 c +362.767 22.247 l +362.767 22.247 l +362.767 22.247 362.767 22.247 362.635 22.247 c +362.635 22.115 l +362.635 22.115 l +362.503 22.115 l +362.503 21.982 l +362.503 21.982 l +362.503 21.850 l +362.503 21.850 362.503 21.850 362.370 21.850 c +362.370 21.850 l +362.370 21.718 l +362.370 21.718 l +362.370 21.718 362.370 21.718 362.370 21.718 c +362.238 21.585 l +362.238 21.585 l +362.238 21.453 l +362.106 21.453 l +362.106 21.453 l +362.106 21.320 362.106 21.320 362.106 21.320 c +362.106 21.320 l +362.106 21.320 l +361.974 21.188 l +361.974 21.188 362.106 21.188 361.974 21.188 c +361.974 21.188 l +361.974 21.055 l +361.841 21.055 l +361.841 20.923 l +361.841 20.923 361.841 20.923 361.841 20.923 c +361.841 20.923 l +361.841 20.923 361.841 20.923 361.709 20.923 c +361.709 20.791 l +361.709 20.791 l +361.709 20.791 l +361.709 20.658 361.709 20.658 361.709 20.658 c +361.577 20.658 l +361.577 20.658 l +361.577 20.526 l +361.577 20.526 361.577 20.526 361.577 20.526 c +361.444 20.526 l +361.444 20.393 l +361.444 20.393 361.444 20.393 361.444 20.393 c +361.444 20.393 l +361.444 20.393 l +361.312 20.261 l +361.444 20.261 361.444 20.261 361.312 20.261 c +361.312 20.128 l +361.312 20.128 l +361.180 19.996 l +361.180 19.996 361.312 19.996 361.180 19.996 c +361.180 19.996 l +361.180 19.996 l +361.180 19.863 361.180 19.863 361.180 19.863 c +361.047 19.863 l +361.047 19.863 l +361.047 19.731 l +360.915 19.731 l +360.915 19.599 l +360.915 19.599 l +360.915 19.466 360.915 19.599 360.915 19.599 c +360.783 19.466 l +360.783 19.466 l +360.783 19.466 l +360.783 19.334 360.783 19.334 360.783 19.334 c +360.783 19.334 l +360.651 19.334 l +360.651 19.201 l +360.651 19.201 l +360.651 19.069 l +360.651 19.069 360.651 19.069 360.518 19.069 c +360.518 19.069 l +360.518 18.936 l +360.518 18.936 l +360.518 18.936 360.518 18.936 360.386 18.936 c +360.386 18.804 l +360.386 18.804 l +360.386 18.672 l +360.254 18.672 l +360.254 18.672 360.254 18.672 360.254 18.672 c +360.254 18.672 l +360.254 18.539 360.254 18.539 360.254 18.539 c +360.121 18.539 l +360.121 18.539 l +360.121 18.407 l +360.121 18.407 360.121 18.407 360.121 18.407 c +360.121 18.407 l +359.989 18.274 l +359.989 18.274 l +359.989 18.142 359.989 18.142 359.989 18.142 c +359.989 18.142 l +359.989 18.142 l +359.989 18.142 359.989 18.142 359.857 18.142 c +359.857 18.009 l +359.857 18.009 l +359.857 18.009 l +359.857 17.877 359.857 18.009 359.725 18.009 c +359.725 17.877 l +359.725 17.877 l +359.725 17.745 l +359.725 17.745 359.725 17.745 359.592 17.745 c +359.592 17.745 l +359.592 17.612 l +359.592 17.612 359.592 17.612 359.592 17.612 c +359.592 17.612 l +359.592 17.612 l +359.592 17.480 l +359.592 17.480 l +359.725 17.480 359.592 17.480 359.592 17.347 c +359.725 17.347 l +359.725 17.347 l +359.725 17.347 359.725 17.347 359.725 17.347 c +359.725 17.215 l +359.857 17.215 l +359.857 17.215 l +359.989 17.215 l +359.989 17.082 l +360.121 17.082 359.989 17.215 359.989 17.082 c +360.121 17.082 l +360.121 17.082 360.121 17.082 360.121 17.082 c +360.121 17.082 l +360.121 17.082 l +360.254 16.950 l +360.254 16.950 360.254 16.950 360.254 16.950 c +360.386 16.950 l +360.386 16.817 l +360.386 16.817 l +360.518 16.817 l +360.518 16.817 360.518 16.817 360.518 16.817 c +360.518 16.817 l +360.651 16.817 360.651 16.817 360.518 16.685 c +360.651 16.685 l +360.651 16.685 l +360.651 16.685 l +360.783 16.685 360.783 16.685 360.783 16.685 c +360.783 16.553 l +360.783 16.553 l +360.915 16.553 l +360.915 16.420 l +361.047 16.420 361.047 16.553 361.047 16.420 c +361.047 16.420 l +361.047 16.420 361.047 16.420 361.047 16.420 c +361.047 16.420 l +361.180 16.420 l +361.180 16.288 l +361.180 16.288 361.180 16.288 361.180 16.288 c +361.312 16.288 l +361.312 16.155 l +361.312 16.155 l +361.444 16.155 l +361.444 16.288 l +361.577 16.288 l +361.577 16.420 l +361.577 16.420 361.577 16.420 361.577 16.420 c +361.577 16.420 l +361.577 16.420 l +361.577 16.553 361.577 16.553 361.709 16.553 c +361.709 16.553 l +361.709 16.685 l +361.709 16.685 l +361.841 16.685 l +361.841 16.817 l +361.841 16.817 361.841 16.817 361.841 16.817 c +361.841 16.817 l +361.841 16.950 361.841 16.950 361.974 16.817 c +361.974 16.950 l +361.974 16.950 l +361.974 16.950 l +361.974 17.082 361.974 17.082 361.974 17.082 c +362.106 17.082 l +362.106 17.082 l +362.106 17.215 l +362.106 17.215 l +362.106 17.347 362.106 17.347 362.238 17.347 c +362.238 17.347 l +362.238 17.347 362.238 17.347 362.238 17.347 c +362.238 17.347 l +362.238 17.480 l +362.370 17.480 l +362.370 17.480 362.238 17.480 362.370 17.480 c +362.370 17.612 l +362.370 17.612 l +362.503 17.745 l +362.503 17.745 l +362.503 17.745 362.503 17.745 362.503 17.745 c +362.503 17.745 l +362.503 17.877 362.503 17.877 362.503 17.877 c +362.635 17.877 l +362.635 17.877 l +362.635 18.009 l +362.635 18.009 362.635 18.009 362.635 18.009 c +362.767 18.009 l +362.767 18.142 l +362.767 18.142 l +362.767 18.142 l +362.767 18.274 362.767 18.274 362.900 18.274 c +362.900 18.274 l +362.900 18.274 362.900 18.274 362.900 18.274 c +362.900 18.407 l +362.900 18.407 l +363.032 18.539 l +363.032 18.539 l +363.032 18.539 l +363.164 18.672 l +363.032 18.672 363.032 18.672 363.164 18.672 c +363.164 18.672 l +363.164 18.804 l +363.164 18.804 363.164 18.804 363.164 18.804 c +363.296 18.804 l +363.296 18.936 l +363.296 18.936 l +363.296 19.069 l +363.429 19.069 l +363.429 19.069 363.429 19.069 363.429 19.069 c +363.429 19.201 l +363.429 19.201 363.429 19.201 363.429 19.201 c +363.561 19.201 l +363.561 19.201 l +363.561 19.334 l +363.561 19.334 363.561 19.334 363.561 19.334 c +363.561 19.334 l +363.693 19.466 l +363.693 19.466 l +363.693 19.599 l +363.693 19.599 363.693 19.599 363.693 19.599 c +363.693 19.599 l +363.693 19.731 363.693 19.599 363.826 19.599 c +363.826 19.731 l +363.826 19.731 l +363.826 19.731 l +363.826 19.863 363.826 19.863 363.958 19.863 c +363.958 19.863 l +363.958 19.863 l +363.958 19.996 l +364.090 19.996 l +364.090 20.128 364.090 20.128 364.090 20.128 c +364.090 20.128 l +364.090 20.128 364.090 20.128 364.090 20.128 c +364.090 20.128 l +364.090 20.261 l +364.222 20.261 l +364.222 20.261 364.222 20.261 364.222 20.261 c +364.222 20.393 l +364.355 20.393 l +364.355 20.393 l +364.355 20.526 l +364.355 20.526 364.355 20.526 364.355 20.526 c +364.355 20.526 l +364.355 20.658 364.355 20.658 364.487 20.658 c +364.487 20.658 l +364.487 20.791 l +364.487 20.791 l +364.619 20.791 l +364.619 20.923 l +364.619 20.923 l +364.619 21.055 364.619 21.055 364.752 21.055 c +364.752 21.055 l +364.752 21.055 l +364.752 21.055 364.752 21.055 364.752 21.055 c +364.752 21.188 l +364.884 21.188 l +364.884 21.188 l +364.884 21.320 l +364.884 21.320 l +364.884 21.453 364.884 21.453 365.016 21.453 c +365.016 21.453 l +365.016 21.453 365.016 21.453 365.016 21.453 c +365.016 21.453 l +365.016 21.585 l +365.016 21.585 365.016 21.585 365.148 21.585 c +365.148 21.585 l +365.148 21.718 l +365.148 21.718 l +365.281 21.850 l +365.281 21.850 l +365.281 21.850 365.281 21.850 365.281 21.850 c +365.281 21.850 l +365.281 21.982 365.281 21.982 365.281 21.982 c +365.413 21.982 l +365.413 21.982 l +365.413 22.115 l +365.413 22.115 365.413 22.115 365.413 22.115 c +365.545 22.115 l +365.545 22.247 l +365.545 22.247 l +365.545 22.380 l +365.545 22.380 365.545 22.380 365.678 22.380 c +365.678 22.380 l +365.678 22.512 365.545 22.380 365.678 22.380 c +365.678 22.512 l +365.678 22.512 l +365.678 22.512 l +365.678 22.645 365.678 22.645 365.810 22.645 c +365.810 22.645 l +365.810 22.645 l +365.942 22.777 l +365.942 22.777 l +365.942 22.910 365.942 22.910 365.942 22.910 c +365.942 22.910 l +365.942 22.910 365.942 22.910 365.942 22.910 c +366.074 22.910 l +366.074 23.042 l +366.074 23.042 l +366.074 23.174 l +366.207 23.174 l +366.207 23.307 l +366.207 23.307 366.207 23.307 366.207 23.307 c +366.339 23.307 l +366.339 23.307 l +366.339 23.439 366.207 23.439 366.339 23.439 c +366.339 23.439 l +366.339 23.439 l +366.471 23.572 l +366.471 23.572 l +366.471 23.704 l +366.471 23.704 l +366.471 23.837 366.471 23.837 366.604 23.704 c +366.604 23.837 l +366.604 23.837 l +366.604 23.837 366.604 23.837 366.604 23.837 c +366.736 23.969 l +366.736 23.969 l +366.736 23.969 l +366.736 24.101 l +366.868 24.101 l +366.868 24.234 366.736 24.234 366.868 24.234 c +366.868 24.234 l +366.868 24.234 366.868 24.234 366.868 24.234 c +366.868 24.234 l +366.868 24.366 l +367.001 24.366 l +367.001 24.366 367.001 24.366 367.001 24.366 c +367.001 24.499 l +367.133 24.499 l +367.133 24.631 l +367.133 24.631 l +367.133 24.631 367.133 24.631 367.133 24.631 c +367.133 24.631 l +367.133 24.764 367.133 24.764 367.265 24.764 c +367.265 24.764 l +367.265 24.764 l +367.265 24.896 l +367.265 24.896 367.265 24.896 367.265 24.896 c +367.397 24.896 l +367.397 25.029 l +367.397 25.029 l +367.530 25.029 l +367.530 25.161 367.397 25.161 367.530 25.161 c +367.530 25.161 l +367.530 25.161 367.530 25.161 367.530 25.161 c +367.530 25.293 l +367.530 25.293 l +367.662 25.293 l +367.662 25.426 367.530 25.426 367.662 25.426 c +367.662 25.426 l +367.662 25.426 l +367.794 25.558 l +367.794 25.558 367.794 25.558 367.794 25.558 c +367.794 25.558 l +367.794 25.691 l +367.794 25.691 367.794 25.691 367.927 25.691 c +367.927 25.691 l +367.927 25.823 l +367.927 25.823 l +368.059 25.956 l +368.059 25.956 l +368.059 26.088 l +368.059 26.088 368.059 26.088 368.059 26.088 c +368.191 26.088 l +368.191 26.088 l +368.191 26.220 368.191 26.220 368.191 26.220 c +368.191 26.220 l +368.191 26.220 l +368.323 26.353 l +368.323 26.353 l +368.323 26.485 l +368.323 26.485 368.323 26.485 368.456 26.485 c +368.456 26.485 l +368.456 26.618 368.323 26.485 368.456 26.485 c +368.456 26.618 l +368.456 26.618 l +368.456 26.618 l +368.456 26.750 368.456 26.750 368.588 26.750 c +368.588 26.750 l +368.588 26.750 l +368.720 26.883 l +368.720 26.883 l +368.720 27.015 368.720 27.015 368.720 27.015 c +368.720 27.015 l +368.720 27.015 368.720 27.015 368.720 27.015 c +368.853 27.015 l +368.853 27.148 l +368.853 27.148 l +368.853 27.148 368.853 27.148 368.853 27.148 c +368.853 27.280 l +368.985 27.280 l +368.985 27.280 l +368.985 27.412 l +368.985 27.412 368.985 27.412 369.117 27.412 c +369.117 27.412 l +369.117 27.545 l +369.117 27.545 l +369.117 27.545 l +369.249 27.412 l +369.249 27.412 l +369.249 27.412 369.249 27.412 369.249 27.412 c +369.249 27.280 l +369.249 27.280 l +369.382 27.280 369.382 27.280 369.382 27.280 c +369.382 27.148 l +369.382 27.148 l +369.514 27.015 l +369.514 27.015 369.514 27.015 369.514 27.015 c +369.514 27.015 l +369.514 27.015 l +369.514 26.883 l +369.646 26.883 369.646 26.883 369.646 26.883 c +369.646 26.750 l +369.646 26.750 l +369.646 26.750 l +369.779 26.750 369.779 26.750 369.779 26.618 c +369.779 26.618 l +369.779 26.618 l +369.779 26.485 l +369.911 26.485 369.911 26.618 369.911 26.485 c +369.911 26.485 l +369.911 26.485 369.911 26.485 369.911 26.485 c +369.911 26.353 l +369.911 26.353 l +370.043 26.220 l +370.043 26.220 l +370.043 26.220 l +370.175 26.220 370.043 26.220 370.043 26.088 c +370.043 26.088 l +370.175 26.088 l +370.175 26.088 370.175 26.088 370.175 26.088 c +370.175 25.956 l +370.308 25.956 l +370.308 25.823 l +370.308 25.823 370.308 25.823 370.308 25.823 c +370.308 25.691 l +370.308 25.691 l +370.440 25.691 l +370.440 25.691 370.440 25.691 370.440 25.691 c +370.440 25.558 l +370.440 25.558 l +370.572 25.426 l +370.572 25.426 370.572 25.426 370.572 25.426 c +370.572 25.426 l +370.572 25.293 l +370.705 25.293 l +370.705 25.293 370.705 25.293 370.705 25.293 c +370.705 25.293 l +370.705 25.293 370.705 25.293 370.705 25.161 c +370.705 25.161 l +370.837 25.161 l +370.837 25.029 l +370.837 25.029 l +370.969 25.029 370.837 25.029 370.837 24.896 c +370.969 24.896 l +370.969 24.896 l +370.969 24.896 l +370.969 24.896 370.969 24.896 370.969 24.764 c +370.969 24.764 l +371.101 24.631 l +371.101 24.631 l +371.101 24.631 371.101 24.631 371.101 24.631 c +371.234 24.499 l +371.234 24.499 l +371.234 24.499 l +371.234 24.499 371.234 24.499 371.234 24.366 c +371.234 24.366 l +371.366 24.366 l +371.366 24.234 l +371.366 24.234 l +371.366 24.101 l +371.498 24.101 l +371.498 24.101 371.498 24.101 371.498 24.101 c +371.498 23.969 l +371.498 23.969 371.498 24.101 371.498 23.969 c +371.631 23.969 l +371.631 23.837 l +371.631 23.837 l +371.631 23.837 l +371.763 23.837 371.763 23.837 371.763 23.704 c +371.763 23.704 l +371.763 23.704 l +371.763 23.572 l +371.895 23.572 371.895 23.704 371.895 23.572 c +371.895 23.439 l +371.895 23.439 l +371.895 23.439 l +372.027 23.439 372.027 23.439 372.027 23.307 c +372.027 23.307 l +372.027 23.307 l +372.027 23.307 l +372.160 23.307 372.027 23.307 372.027 23.174 c +372.160 23.174 l +372.160 23.042 l +372.160 23.042 l +372.292 23.042 l +372.292 22.910 l +372.292 22.910 l +372.292 22.910 372.292 22.910 372.292 22.777 c +372.292 22.777 l +372.424 22.777 l +372.424 22.777 372.424 22.777 372.424 22.777 c +372.424 22.645 l +372.424 22.645 l +372.557 22.512 l +372.557 22.512 372.557 22.512 372.557 22.512 c +372.557 22.512 l +372.557 22.380 l +372.689 22.380 l +372.689 22.380 372.689 22.380 372.689 22.380 c +372.689 22.247 l +372.689 22.247 l +372.821 22.115 l +372.821 22.115 372.821 22.247 372.821 22.115 c +372.821 22.115 l +372.821 22.115 l +372.821 21.982 l +372.954 21.982 372.954 21.982 372.954 21.982 c +372.954 21.982 l +372.954 21.982 372.954 21.982 372.954 21.850 c +372.954 21.850 l +372.954 21.850 l +373.086 21.718 l +373.086 21.718 l +373.086 21.585 l +373.218 21.718 373.218 21.718 373.218 21.585 c +373.218 21.585 l +373.218 21.585 l +373.218 21.585 373.218 21.585 373.218 21.453 c +373.218 21.453 l +373.350 21.453 l +373.350 21.320 l +373.350 21.320 373.350 21.320 373.350 21.320 c +373.350 21.188 l +373.350 21.188 l +373.483 21.188 l +373.483 21.188 373.483 21.188 373.483 21.188 c +373.483 21.055 l +373.615 21.055 l +373.615 20.923 l +373.615 20.923 373.615 20.923 373.615 20.923 c +373.615 20.923 l +373.615 20.791 l +373.747 20.791 l +373.747 20.791 373.747 20.791 373.747 20.791 c +373.747 20.791 l +373.747 20.791 373.747 20.791 373.747 20.658 c +373.747 20.658 l +373.880 20.526 l +373.880 20.526 l +373.880 20.526 l +374.012 20.393 l +374.012 20.393 374.012 20.393 374.012 20.393 c +374.012 20.393 l +374.012 20.393 l +374.144 20.393 374.012 20.393 374.012 20.261 c +374.144 20.261 l +374.144 20.128 l +374.144 20.128 l +374.276 20.128 374.276 20.128 374.144 19.996 c +374.276 19.996 l +374.276 19.996 l +374.276 19.996 l +374.276 19.996 374.276 19.996 374.276 19.863 c +374.409 19.863 l +374.409 19.731 l +374.409 19.731 l +374.541 19.731 374.409 19.731 374.409 19.731 c +374.541 19.599 l +374.541 19.599 l +374.541 19.599 l +374.541 19.599 374.541 19.599 374.541 19.599 c +374.541 19.466 l +374.673 19.466 374.673 19.466 374.541 19.466 c +374.673 19.466 l +374.673 19.334 l +374.673 19.334 l +374.806 19.201 l +374.806 19.201 l +374.806 19.201 374.806 19.201 374.806 19.201 c +374.806 19.201 l +374.806 19.069 l +374.938 19.069 374.938 19.069 374.938 19.069 c +374.938 18.936 l +374.938 18.936 l +374.938 18.936 l +375.070 18.936 375.070 18.936 375.070 18.804 c +375.070 18.804 l +375.070 18.804 l +375.070 18.672 l +375.202 18.672 375.202 18.804 375.202 18.672 c +375.202 18.672 l +375.202 18.539 l +375.202 18.539 l +375.335 18.539 375.335 18.539 375.335 18.407 c +375.335 18.407 l +375.335 18.407 l +375.335 18.407 l +375.467 18.407 375.335 18.407 375.335 18.274 c +375.335 18.274 l +375.467 18.274 375.467 18.274 375.467 18.274 c +375.467 18.142 l +375.467 18.142 l +375.599 18.142 l +375.599 18.009 l +375.599 18.009 375.599 18.009 375.599 18.009 c +375.599 18.009 l +375.599 17.877 l +375.732 17.877 l +375.732 17.877 375.732 17.877 375.732 17.877 c +375.732 17.745 l +375.732 17.745 l +375.864 17.612 l +375.864 17.612 375.864 17.612 375.864 17.612 c +375.864 17.612 l +375.864 17.480 l +375.996 17.480 l +375.996 17.480 375.996 17.480 375.996 17.480 c +375.996 17.347 l +375.996 17.347 l +376.128 17.347 l +376.128 17.215 l +376.128 17.215 l +376.128 17.082 l +376.261 17.082 376.261 17.215 376.261 17.082 c +376.261 17.082 l +376.261 17.082 376.261 17.082 376.261 17.082 c +376.261 16.950 l +376.393 16.950 l +376.393 16.817 l +376.393 16.817 l +376.525 16.817 376.393 16.817 376.393 16.817 c +376.525 16.685 l +376.525 16.685 l +376.525 16.685 l +376.525 16.685 376.525 16.685 376.525 16.685 c +376.525 16.553 l +376.658 16.553 l +376.658 16.420 l +376.658 16.420 376.658 16.420 376.658 16.420 c +376.790 16.288 l +376.790 16.288 l +376.790 16.288 l +376.790 16.288 376.790 16.288 376.790 16.288 c +376.790 16.155 l +376.922 16.155 l +376.922 16.155 l +376.922 16.288 376.922 16.288 376.922 16.288 c +377.054 16.288 l +377.054 16.288 l +377.054 16.288 l +377.054 16.420 377.054 16.420 377.187 16.420 c +377.187 16.420 l +377.187 16.420 l +377.319 16.420 l +377.319 16.553 377.319 16.553 377.319 16.553 c +377.451 16.553 l +377.451 16.553 l +377.451 16.553 l +377.451 16.685 377.451 16.685 377.451 16.685 c +377.451 16.685 l +377.451 16.685 377.451 16.685 377.584 16.685 c +377.584 16.685 l +377.716 16.685 l +377.716 16.817 l +377.716 16.817 l +377.716 16.817 377.716 16.817 377.848 16.817 c +377.848 16.817 l +377.848 16.817 l +377.981 16.950 l +377.848 16.950 377.848 16.950 377.981 16.950 c +377.981 16.950 l +378.113 17.082 l +378.113 17.082 l +378.113 17.082 378.113 17.082 378.113 17.082 c +378.245 17.082 l +378.245 17.082 l +378.245 17.215 l +378.245 17.215 378.245 17.215 378.377 17.215 c +378.377 17.215 l +378.377 17.347 l +378.510 17.347 l +378.510 17.347 378.510 17.347 378.510 17.347 c +378.642 17.347 l +378.642 17.347 l +378.642 17.480 l +378.642 17.480 378.642 17.480 378.642 17.480 c +378.642 17.480 l +378.774 17.480 378.774 17.480 378.774 17.612 c +378.774 17.612 l +378.642 17.612 378.774 17.612 378.774 17.612 c +378.642 17.612 l +378.642 17.745 l +378.642 17.745 l +378.510 17.877 l +378.510 17.877 l +378.510 17.877 378.510 17.877 378.510 17.877 c +378.510 18.009 l +378.510 18.009 l +378.377 18.009 378.377 18.009 378.377 18.009 c +378.377 18.142 l +378.377 18.142 l +378.377 18.142 l +378.245 18.142 378.245 18.142 378.245 18.274 c +378.245 18.274 l +378.245 18.274 l +378.245 18.407 l +378.113 18.407 378.113 18.274 378.113 18.407 c +378.113 18.407 l +378.113 18.407 378.113 18.407 378.113 18.407 c +378.113 18.539 l +378.113 18.539 l +377.981 18.672 l +377.981 18.672 l +377.981 18.672 l +377.848 18.672 377.981 18.672 377.981 18.804 c +377.981 18.804 l +377.848 18.804 377.848 18.804 377.848 18.804 c +377.848 18.936 l +377.848 18.936 l +377.716 18.936 l +377.716 19.069 l +377.716 19.069 l +377.716 19.069 377.716 19.069 377.716 19.201 c +377.716 19.201 l +377.584 19.201 l +377.584 19.201 377.584 19.201 377.584 19.201 c +377.584 19.334 l +377.584 19.334 l +377.451 19.466 l +377.451 19.466 377.451 19.466 377.451 19.466 c +377.451 19.466 l +377.451 19.599 l +377.319 19.599 l +377.319 19.599 377.319 19.599 377.319 19.599 c +377.319 19.599 l +377.319 19.599 377.319 19.599 377.319 19.731 c +377.319 19.731 l +377.187 19.863 l +377.187 19.863 l +377.187 19.863 l +377.187 19.996 l +377.054 19.996 377.054 19.996 377.054 19.996 c +377.054 19.996 l +377.054 19.996 377.054 19.996 377.054 20.128 c +377.054 20.128 l +376.922 20.128 l +376.922 20.261 l +376.922 20.261 l +376.922 20.261 l +376.790 20.261 376.790 20.261 376.790 20.393 c +376.790 20.393 l +376.790 20.393 l +376.790 20.393 376.790 20.393 376.790 20.526 c +376.790 20.526 l +376.658 20.526 l +376.658 20.658 l +376.658 20.658 376.658 20.658 376.658 20.658 c +376.525 20.791 l +376.525 20.791 l +376.525 20.791 l +376.525 20.791 376.525 20.791 376.525 20.791 c +376.525 20.923 l +376.525 20.923 376.525 20.791 376.525 20.923 c +376.393 20.923 l +376.393 21.055 l +376.393 21.055 l +376.393 21.188 l +376.261 21.188 l +376.261 21.188 376.261 21.188 376.261 21.188 c +376.261 21.188 l +376.261 21.188 376.261 21.188 376.261 21.320 c +376.128 21.320 l +376.128 21.453 l +376.128 21.453 l +376.128 21.453 l +375.996 21.453 375.996 21.453 375.996 21.585 c +375.996 21.585 l +375.996 21.585 l +375.996 21.585 l +375.864 21.585 375.864 21.585 375.996 21.718 c +375.864 21.718 l +375.864 21.850 l +375.864 21.850 l +375.732 21.850 375.732 21.850 375.732 21.850 c +375.732 21.982 l +375.732 21.982 l +375.732 21.982 l +375.732 21.982 375.732 21.982 375.732 22.115 c +375.732 22.115 l +375.599 22.115 375.599 22.115 375.599 22.115 c +375.599 22.115 l +375.599 22.247 l +375.599 22.247 l +375.467 22.380 l +375.467 22.380 l +375.467 22.380 375.467 22.380 375.467 22.380 c +375.467 22.512 l +375.335 22.512 375.335 22.512 375.467 22.512 c +375.335 22.512 l +375.335 22.645 l +375.335 22.645 l +375.202 22.777 l +375.202 22.777 375.202 22.645 375.202 22.777 c +375.202 22.777 l +375.202 22.777 l +375.202 22.910 l +375.070 22.910 375.070 22.910 375.070 22.910 c +375.070 23.042 l +375.070 23.042 l +374.938 23.042 l +374.938 23.042 374.938 23.042 374.938 23.174 c +374.938 23.174 l +374.938 23.174 l +374.938 23.307 l +374.806 23.174 374.806 23.174 374.806 23.307 c +374.806 23.307 l +374.806 23.307 374.806 23.307 374.806 23.307 c +374.806 23.439 l +374.806 23.439 l +374.673 23.439 l +374.673 23.572 l +374.673 23.572 l +374.541 23.572 374.541 23.572 374.541 23.704 c +374.541 23.704 l +374.541 23.704 374.541 23.704 374.541 23.704 c +374.541 23.837 l +374.541 23.837 l +374.409 23.837 l +374.409 23.969 l +374.409 23.969 374.409 23.969 374.409 23.969 c +374.409 23.969 l +374.409 24.101 l +374.276 24.101 l +374.276 24.101 374.276 24.101 374.276 24.101 c +374.276 24.234 l +374.144 24.234 l +374.144 24.366 l +374.144 24.366 l +374.144 24.366 l +374.012 24.499 l +374.012 24.499 374.012 24.499 374.012 24.499 c +374.012 24.499 l +374.012 24.499 374.012 24.499 374.012 24.631 c +374.012 24.631 l +373.880 24.631 l +373.880 24.764 l +373.880 24.764 l +373.880 24.896 l +373.747 24.896 373.747 24.764 373.747 24.896 c +373.747 24.896 l +373.747 24.896 l +373.615 24.896 373.747 24.896 373.747 25.029 c +373.615 25.029 l +373.615 25.161 l +373.615 25.161 l +373.483 25.161 373.615 25.161 373.615 25.161 c +373.483 25.293 l +373.483 25.293 l +373.483 25.293 l +373.483 25.293 373.483 25.293 373.483 25.293 c +373.483 25.426 l +373.350 25.426 373.350 25.426 373.350 25.426 c +373.350 25.426 l +373.350 25.558 l +373.350 25.558 l +373.218 25.691 l +373.218 25.691 l +373.218 25.691 373.218 25.691 373.218 25.691 c +373.218 25.691 l +373.086 25.691 373.218 25.691 373.218 25.823 c +373.086 25.823 l +373.086 25.956 l +373.086 25.956 l +373.086 26.088 l +372.954 26.088 l +372.954 26.088 372.954 26.088 372.954 26.088 c +372.954 26.088 l +372.954 26.220 l +372.821 26.220 372.821 26.088 372.821 26.220 c +372.821 26.220 l +372.821 26.353 l +372.821 26.353 l +372.689 26.353 372.689 26.353 372.689 26.485 c +372.689 26.485 l +372.689 26.485 l +372.689 26.485 l +372.557 26.485 372.557 26.485 372.557 26.618 c +372.557 26.618 l +372.557 26.618 372.557 26.618 372.557 26.618 c +372.557 26.750 l +372.557 26.750 l +372.424 26.750 l +372.424 26.883 l +372.424 26.883 l +372.292 26.883 372.424 26.883 372.424 27.015 c +372.424 27.015 l +372.292 27.015 372.292 27.015 372.292 27.015 c +372.292 27.015 l +372.292 27.148 l +372.160 27.148 l +372.160 27.280 l +372.160 27.280 372.160 27.280 372.160 27.280 c +372.160 27.280 l +372.160 27.412 l +372.027 27.412 l +372.027 27.412 372.027 27.412 372.027 27.412 c +372.027 27.545 l +372.027 27.545 l +371.895 27.545 l +371.895 27.545 371.895 27.545 371.895 27.677 c +371.895 27.677 l +371.895 27.677 l +371.763 27.810 l +371.763 27.810 371.763 27.677 371.763 27.810 c +371.763 27.810 l +371.763 27.810 371.763 27.810 371.763 27.810 c +371.763 27.942 l +371.631 27.942 l +371.631 28.075 l +371.631 28.075 l +371.631 28.075 l +371.498 28.075 371.498 28.075 371.498 28.207 c +371.498 28.207 l +371.498 28.207 371.498 28.207 371.498 28.207 c +371.498 28.339 l +371.498 28.339 l +371.366 28.339 l +371.366 28.472 l +371.366 28.472 371.366 28.472 371.366 28.472 c +371.234 28.604 l +371.234 28.604 l +371.234 28.604 l +371.234 28.604 371.234 28.604 371.234 28.604 c +371.234 28.737 l +371.101 28.737 l +371.101 28.869 l +371.101 28.869 371.101 28.869 371.101 28.869 c +371.101 28.869 l +371.101 29.002 l +370.969 29.002 l +370.969 29.002 370.969 29.002 370.969 29.002 c +370.969 29.002 l +370.969 29.002 370.969 29.002 370.969 29.134 c +370.837 29.134 l +370.837 29.266 l +370.837 29.266 l +370.837 29.266 l +370.705 29.399 l +370.705 29.399 370.705 29.399 370.705 29.399 c +370.705 29.399 l +370.705 29.399 370.705 29.399 370.705 29.531 c +370.705 29.531 l +370.572 29.531 l +370.572 29.664 l +370.572 29.664 l +370.440 29.664 370.440 29.664 370.440 29.664 c +370.440 29.796 l +370.440 29.796 l +370.440 29.796 l +370.308 29.796 370.440 29.796 370.440 29.929 c +370.308 29.929 l +370.308 29.929 l +370.308 30.061 l +370.308 30.061 l +370.175 30.061 370.175 30.061 370.175 30.194 c +370.175 30.194 l +370.043 30.326 l +370.043 30.326 l +369.911 30.326 369.911 30.326 369.911 30.326 c +369.911 30.458 l +369.911 30.458 l +369.911 30.458 l +369.779 30.458 l +369.779 30.458 l +369.646 30.458 369.779 30.458 369.779 30.591 c +369.646 30.591 l +369.646 30.591 l +369.646 30.591 l +369.514 30.591 l +369.514 30.591 l +369.382 30.591 l +369.249 30.591 l +368.985 30.591 l +368.853 30.591 l +368.720 30.591 l +f +0.16 0.16 0.23 rg +[] 0 d +360.254 30.723 m +360.254 30.723 360.254 30.723 360.254 30.723 c +360.254 30.723 l +360.121 30.591 l +360.254 30.591 360.254 30.591 360.121 30.591 c +360.121 30.591 l +360.121 30.458 l +359.989 30.458 l +359.989 30.458 l +359.989 30.326 l +359.989 30.326 359.989 30.326 359.989 30.326 c +359.989 30.326 l +359.989 30.194 359.989 30.194 359.857 30.194 c +359.857 30.194 l +359.857 30.194 l +359.857 30.194 l +359.857 30.061 359.857 30.061 359.725 30.061 c +359.725 30.061 l +359.725 29.929 l +359.725 29.929 l +359.725 29.796 359.725 29.929 359.592 29.929 c +359.592 29.796 l +359.592 29.796 l +359.592 29.796 l +359.592 29.664 359.592 29.664 359.592 29.664 c +359.460 29.664 l +359.460 29.664 l +359.460 29.531 l +359.460 29.531 359.460 29.531 359.460 29.531 c +359.328 29.399 l +359.328 29.399 l +359.328 29.399 l +359.328 29.266 359.328 29.399 359.328 29.399 c +359.195 29.266 l +359.195 29.266 l +359.195 29.134 l +359.195 29.134 359.195 29.134 359.195 29.134 c +359.063 29.134 l +359.063 29.002 l +359.063 29.002 l +359.063 29.002 359.063 29.002 359.063 29.002 c +359.063 28.869 l +358.931 28.869 l +358.931 28.869 l +358.931 28.737 l +358.931 28.737 358.931 28.737 358.799 28.737 c +358.799 28.737 l +358.799 28.604 358.931 28.604 358.799 28.604 c +358.799 28.604 l +358.799 28.604 l +358.666 28.472 l +358.666 28.472 l +358.666 28.339 l +358.666 28.339 358.666 28.339 358.666 28.339 c +358.666 28.339 l +358.666 28.207 358.666 28.339 358.534 28.339 c +358.534 28.207 l +358.534 28.207 l +358.534 28.207 l +358.534 28.075 358.534 28.075 358.402 28.075 c +358.402 28.075 l +358.402 28.075 l +358.402 27.942 l +358.402 27.942 358.402 27.942 358.269 27.942 c +358.269 27.810 l +358.269 27.810 l +358.269 27.810 l +358.269 27.677 358.269 27.810 358.137 27.810 c +358.137 27.677 l +358.137 27.677 l +358.137 27.545 l +358.137 27.545 358.137 27.545 358.005 27.545 c +358.005 27.545 l +358.005 27.412 l +358.005 27.412 l +358.005 27.412 358.005 27.412 358.005 27.412 c +357.873 27.280 l +357.873 27.280 l +357.873 27.148 l +357.873 27.148 357.873 27.148 357.873 27.148 c +357.740 27.148 l +357.740 27.148 l +357.740 27.015 357.740 27.015 357.740 27.015 c +357.740 27.015 l +357.608 26.883 l +357.608 26.883 l +357.608 26.883 l +357.608 26.750 l +357.608 26.750 357.608 26.750 357.476 26.750 c +357.476 26.750 l +357.476 26.618 357.476 26.618 357.476 26.750 c +357.476 26.618 l +357.476 26.618 l +357.343 26.485 l +357.343 26.485 l +357.343 26.485 l +357.343 26.353 357.343 26.353 357.211 26.353 c +357.211 26.353 l +357.211 26.353 357.343 26.353 357.211 26.353 c +357.211 26.220 l +357.211 26.220 l +357.211 26.220 l +357.211 26.088 357.211 26.220 357.079 26.220 c +357.079 26.088 l +357.079 26.088 l +357.079 25.956 l +357.079 25.956 357.079 25.956 356.947 25.956 c +356.947 25.956 l +356.947 25.823 l +356.947 25.823 l +356.947 25.823 356.947 25.823 356.814 25.823 c +356.814 25.691 l +356.814 25.691 l +356.814 25.558 l +356.814 25.558 356.814 25.558 356.682 25.558 c +356.682 25.558 l +356.682 25.558 l +356.682 25.426 l +356.682 25.426 356.682 25.426 356.682 25.426 c +356.550 25.293 l +356.550 25.293 l +356.550 25.293 l +356.550 25.161 356.550 25.161 356.417 25.161 c +356.417 25.161 l +356.417 25.161 l +356.417 25.029 356.417 25.029 356.417 25.161 c +356.417 25.029 l +356.285 25.029 l +356.285 24.896 l +356.285 24.896 l +356.153 24.896 l +356.285 24.764 356.285 24.764 356.153 24.764 c +356.153 24.764 l +356.153 24.764 356.153 24.764 356.153 24.764 c +356.153 24.631 l +356.153 24.631 l +356.020 24.631 l +356.020 24.499 356.153 24.631 356.020 24.631 c +356.020 24.499 l +356.020 24.499 l +355.888 24.366 l +355.888 24.366 355.888 24.366 355.888 24.366 c +355.888 24.366 l +355.888 24.234 l +355.888 24.234 l +355.888 24.234 355.888 24.234 355.756 24.234 c +355.756 24.101 l +355.756 24.101 l +355.624 23.969 l +355.624 23.969 355.756 23.969 355.624 23.969 c +355.624 23.969 l +355.624 23.969 l +355.624 23.837 l +355.624 23.837 355.624 23.837 355.491 23.837 c +355.491 23.704 l +355.491 23.704 l +355.491 23.704 l +355.491 23.572 355.491 23.572 355.359 23.572 c +355.359 23.572 l +355.359 23.572 l +355.359 23.439 355.359 23.439 355.359 23.572 c +355.227 23.439 l +355.227 23.439 l +355.227 23.307 l +355.227 23.307 l +355.094 23.307 l +355.094 23.174 355.094 23.174 355.094 23.174 c +355.094 23.174 l +355.094 23.174 355.094 23.174 355.094 23.174 c +354.962 23.042 l +354.962 23.042 l +354.962 23.042 l +354.962 22.910 l +354.830 22.910 l +354.830 22.777 354.962 22.777 354.830 22.777 c +354.830 22.777 l +354.830 22.777 354.830 22.777 354.830 22.777 c +354.830 22.777 l +354.830 22.645 l +354.698 22.645 l +354.698 22.645 354.698 22.645 354.698 22.645 c +354.698 22.512 l +354.565 22.512 l +354.565 22.380 l +354.565 22.380 354.565 22.380 354.565 22.380 c +354.565 22.380 l +354.565 22.380 l +354.433 22.247 l +354.433 22.247 354.565 22.247 354.433 22.247 c +354.433 22.115 l +354.433 22.115 l +354.301 22.115 l +354.301 21.982 354.433 21.982 354.301 21.982 c +354.301 21.982 l +354.301 21.982 l +354.301 21.850 l +354.301 21.850 354.301 21.850 354.168 21.850 c +354.168 21.850 l +354.168 21.718 l +354.036 21.718 l +354.168 21.585 354.168 21.585 354.036 21.585 c +354.036 21.585 l +354.036 21.585 l +354.036 21.585 354.036 21.585 354.036 21.585 c +353.904 21.453 l +353.904 21.453 l +353.904 21.453 l +353.904 21.320 l +353.772 21.320 l +353.772 21.188 353.772 21.188 353.772 21.188 c +353.772 21.188 l +353.772 21.188 353.772 21.188 353.772 21.188 c +353.639 21.188 l +353.639 21.055 l +353.639 21.055 l +353.639 20.923 l +353.507 20.923 l +353.507 20.791 l +353.507 20.791 353.507 20.791 353.507 20.791 c +353.507 20.791 l +353.507 20.791 l +353.375 20.658 l +353.375 20.658 353.375 20.658 353.375 20.658 c +353.375 20.526 l +353.242 20.526 l +353.242 20.526 l +353.242 20.393 353.242 20.393 353.242 20.393 c +353.242 20.393 l +353.242 20.393 l +353.110 20.261 l +353.110 20.261 353.110 20.261 353.110 20.261 c +353.110 20.261 l +352.978 20.128 l +352.978 20.128 l +352.978 19.996 352.978 19.996 352.978 19.996 c +352.978 19.996 l +352.978 19.996 l +352.846 19.996 l +352.846 19.863 352.978 19.863 352.846 19.863 c +352.846 19.863 l +352.846 19.863 l +352.713 19.731 l +352.713 19.731 l +352.713 19.599 352.713 19.599 352.713 19.599 c +352.713 19.599 l +352.713 19.599 352.713 19.599 352.713 19.599 c +352.581 19.599 l +352.581 19.466 l +352.581 19.466 l +352.449 19.334 l +352.449 19.334 l +352.449 19.201 352.449 19.334 352.449 19.334 c +352.449 19.201 l +352.449 19.201 352.449 19.201 352.449 19.201 c +352.316 19.201 l +352.316 19.201 l +352.316 19.069 l +352.316 19.069 352.316 19.069 352.316 19.069 c +352.316 18.936 l +352.184 18.936 l +352.184 18.936 l +352.184 18.804 352.184 18.804 352.184 18.804 c +352.052 18.804 l +352.052 18.804 l +352.052 18.672 l +352.052 18.672 352.052 18.672 352.052 18.672 c +352.052 18.672 l +351.920 18.539 l +351.920 18.539 l +351.920 18.407 351.920 18.407 351.920 18.407 c +351.920 18.407 l +351.920 18.407 l +351.787 18.407 l +351.787 18.274 351.787 18.274 351.787 18.274 c +351.787 18.274 l +351.655 18.274 l +351.655 18.142 l +351.655 18.009 351.655 18.142 351.655 18.142 c +351.655 18.009 l +351.655 18.009 l +351.655 18.009 351.655 18.009 351.523 18.009 c +351.523 18.009 l +351.523 17.877 l +351.523 17.877 l +351.390 17.745 l +351.390 17.745 l +351.390 17.612 351.390 17.745 351.390 17.745 c +351.390 17.612 l +351.390 17.612 351.390 17.612 351.258 17.612 c +351.258 17.612 l +351.258 17.612 l +351.258 17.480 351.258 17.480 351.258 17.480 c +351.390 17.480 351.390 17.480 351.390 17.480 c +351.390 17.347 l +351.523 17.347 l +351.523 17.347 351.523 17.347 351.523 17.347 c +351.523 17.347 l +351.655 17.347 351.523 17.347 351.523 17.347 c +351.655 17.215 l +351.655 17.215 l +351.655 17.215 l +351.787 17.215 351.787 17.215 351.787 17.215 c +351.787 17.082 l +351.787 17.082 l +351.920 17.082 l +351.920 17.082 351.920 17.082 351.920 17.082 c +351.920 16.950 l +352.052 16.950 l +352.052 16.950 l +352.052 16.950 352.052 16.950 352.052 16.950 c +352.184 16.817 l +352.184 16.817 l +352.184 16.817 l +352.316 16.817 l +352.316 16.817 352.316 16.817 352.316 16.685 c +352.316 16.685 l +352.449 16.685 352.449 16.685 352.449 16.685 c +352.449 16.685 l +352.449 16.685 l +352.581 16.553 l +352.581 16.553 l +352.713 16.553 l +352.713 16.553 352.713 16.553 352.713 16.420 c +352.713 16.420 l +352.713 16.420 352.713 16.420 352.713 16.420 c +352.846 16.420 l +352.846 16.420 l +352.846 16.288 l +352.978 16.288 l +353.110 16.288 352.978 16.155 353.110 16.288 c +353.110 16.420 l +353.110 16.420 l +353.242 16.420 l +353.242 16.553 353.110 16.553 353.242 16.553 c +353.242 16.553 l +353.242 16.553 l +353.242 16.685 l +353.242 16.685 353.242 16.685 353.375 16.685 c +353.375 16.685 l +353.375 16.817 l +353.507 16.817 l +353.507 16.817 l +353.507 16.950 353.507 16.950 353.507 16.950 c +353.507 16.950 l +353.507 16.950 353.507 16.950 353.507 16.950 c +353.639 17.082 l +353.639 17.082 l +353.639 17.082 l +353.639 17.215 l +353.772 17.215 l +353.772 17.347 353.772 17.347 353.772 17.347 c +353.772 17.347 l +353.772 17.347 353.772 17.347 353.772 17.347 c +353.904 17.347 l +353.904 17.480 l +353.904 17.480 l +353.904 17.612 l +354.036 17.612 l +354.036 17.612 353.904 17.612 354.036 17.612 c +354.036 17.745 l +354.036 17.745 354.036 17.745 354.036 17.745 c +354.036 17.745 l +354.036 17.745 l +354.168 17.877 l +354.168 17.877 354.168 17.877 354.168 17.877 c +354.168 18.009 l +354.301 18.009 l +354.301 18.009 l +354.301 18.142 354.301 18.142 354.301 18.142 c +354.301 18.142 l +354.301 18.142 l +354.433 18.274 l +354.433 18.274 354.301 18.274 354.433 18.274 c +354.433 18.274 l +354.433 18.407 l +354.565 18.407 l +354.565 18.539 354.565 18.539 354.565 18.539 c +354.565 18.539 l +354.565 18.539 l +354.698 18.539 l +354.698 18.672 354.565 18.672 354.698 18.672 c +354.698 18.672 l +354.698 18.672 l +354.830 18.804 l +354.830 18.804 l +354.830 18.936 354.830 18.936 354.830 18.936 c +354.830 18.936 l +354.830 18.936 354.830 18.936 354.830 18.936 c +354.962 18.936 l +354.962 19.069 l +354.962 19.069 l +355.094 19.201 l +355.094 19.201 l +355.094 19.201 355.094 19.201 355.094 19.201 c +355.094 19.334 l +355.094 19.334 355.094 19.334 355.094 19.334 c +355.227 19.334 l +355.227 19.466 l +355.227 19.466 l +355.227 19.599 l +355.359 19.599 l +355.359 19.599 355.359 19.599 355.359 19.599 c +355.359 19.599 l +355.359 19.731 355.359 19.731 355.359 19.731 c +355.491 19.731 l +355.491 19.731 l +355.491 19.863 l +355.491 19.863 355.491 19.863 355.491 19.863 c +355.491 19.863 l +355.624 19.996 l +355.624 19.996 l +355.624 20.128 355.624 20.128 355.624 20.128 c +355.624 20.128 l +355.624 20.128 l +355.756 20.128 l +355.756 20.261 355.756 20.261 355.756 20.261 c +355.756 20.261 l +355.888 20.261 l +355.888 20.393 l +355.888 20.393 355.888 20.393 355.888 20.393 c +355.888 20.526 l +355.888 20.526 l +355.888 20.526 355.888 20.526 356.020 20.526 c +356.020 20.526 l +356.020 20.658 l +356.020 20.658 l +356.153 20.791 l +356.153 20.791 l +356.153 20.791 356.153 20.791 356.153 20.791 c +356.153 20.923 l +356.153 20.923 356.153 20.923 356.285 20.923 c +356.285 20.923 l +356.285 21.055 l +356.285 21.055 l +356.417 21.188 l +356.417 21.188 l +356.417 21.188 356.417 21.188 356.417 21.188 c +356.417 21.188 l +356.417 21.320 356.417 21.320 356.417 21.320 c +356.550 21.320 l +356.550 21.320 l +356.550 21.453 l +356.550 21.453 356.550 21.453 356.550 21.453 c +356.682 21.453 l +356.682 21.585 l +356.682 21.585 356.682 21.585 356.682 21.585 c +356.682 21.585 l +356.682 21.718 356.682 21.718 356.682 21.718 c +356.814 21.718 l +356.814 21.718 l +356.814 21.718 l +356.814 21.850 356.814 21.850 356.814 21.850 c +356.814 21.850 l +356.947 21.850 l +356.947 21.982 l +356.947 21.982 356.947 21.982 356.947 21.982 c +357.079 22.115 l +357.079 22.115 l +357.079 22.115 l +357.079 22.247 357.079 22.115 357.079 22.115 c +357.079 22.247 l +357.211 22.247 l +357.211 22.380 l +357.211 22.380 l +357.211 22.512 357.211 22.380 357.211 22.380 c +357.211 22.512 l +357.211 22.512 357.211 22.512 357.343 22.512 c +357.343 22.512 l +357.343 22.645 l +357.476 22.645 l +357.476 22.777 l +357.476 22.777 l +357.476 22.777 357.476 22.777 357.476 22.777 c +357.476 22.777 l +357.476 22.910 357.476 22.910 357.608 22.910 c +357.608 22.910 l +357.608 23.042 l +357.608 23.042 l +357.740 23.042 l +357.740 23.174 l +357.740 23.174 357.740 23.174 357.740 23.174 c +357.740 23.174 l +357.740 23.307 357.740 23.307 357.873 23.307 c +357.873 23.307 l +357.873 23.307 l +357.873 23.307 l +357.873 23.439 357.873 23.439 357.873 23.439 c +358.005 23.439 l +358.005 23.439 l +358.005 23.572 l +358.005 23.704 358.005 23.572 358.005 23.572 c +358.137 23.704 l +358.137 23.704 l +358.137 23.704 l +358.137 23.837 358.137 23.837 358.137 23.837 c +358.137 23.837 l +358.269 23.837 l +358.269 23.969 l +358.269 23.969 358.269 23.969 358.269 23.969 c +358.402 23.969 l +358.402 24.101 l +358.402 24.101 358.269 24.101 358.402 24.101 c +358.402 24.101 l +358.402 24.234 l +358.534 24.234 l +358.534 24.366 l +358.534 24.366 l +358.534 24.366 358.534 24.366 358.534 24.366 c +358.534 24.366 l +358.534 24.499 358.534 24.499 358.666 24.499 c +358.666 24.499 l +358.666 24.631 l +358.799 24.631 l +358.799 24.631 l +358.799 24.764 l +358.799 24.764 358.799 24.764 358.799 24.764 c +358.799 24.764 l +358.799 24.896 358.799 24.896 358.931 24.896 c +358.931 24.896 l +358.931 24.896 l +359.063 25.029 l +359.063 25.029 l +359.063 25.161 l +359.063 25.161 359.063 25.161 359.063 25.161 c +359.063 25.161 l +359.063 25.293 359.063 25.161 359.195 25.161 c +359.195 25.293 l +359.195 25.293 l +359.195 25.293 l +359.195 25.426 359.195 25.426 359.195 25.426 c +359.328 25.426 l +359.328 25.426 l +359.328 25.558 l +359.328 25.558 359.328 25.558 359.328 25.558 c +359.460 25.558 l +359.460 25.691 l +359.460 25.691 l +359.460 25.691 359.460 25.691 359.460 25.691 c +359.592 25.823 l +359.592 25.823 l +359.592 25.956 l +359.592 25.956 l +359.592 25.956 359.592 25.956 359.725 25.956 c +359.725 25.956 l +359.725 26.088 359.725 26.088 359.725 26.088 c +359.725 26.088 l +359.725 26.220 l +359.857 26.220 l +359.857 26.220 l +359.857 26.353 l +359.857 26.353 359.857 26.353 359.989 26.353 c +359.989 26.353 l +359.989 26.485 359.857 26.485 359.989 26.485 c +359.989 26.485 l +359.989 26.485 l +360.121 26.618 l +360.121 26.618 l +360.121 26.750 l +360.121 26.750 360.121 26.750 360.121 26.750 c +360.121 26.750 l +360.121 26.883 360.121 26.750 360.254 26.750 c +360.254 26.883 l +360.254 26.883 l +360.254 26.883 l +360.254 27.015 360.254 27.015 360.386 27.015 c +360.386 27.015 l +360.386 27.015 l +360.386 27.148 l +360.386 27.148 360.386 27.148 360.518 27.148 c +360.518 27.148 l +360.518 27.280 l +360.518 27.280 l +360.518 27.280 360.518 27.280 360.518 27.280 c +360.651 27.412 l +360.651 27.412 l +360.651 27.545 l +360.651 27.545 360.651 27.545 360.783 27.545 c +360.783 27.545 l +360.783 27.545 l +360.783 27.677 360.783 27.677 360.783 27.677 c +360.783 27.677 l +360.915 27.810 l +360.915 27.810 l +360.915 27.810 l +361.047 27.942 l +360.915 27.942 360.915 27.942 361.047 27.942 c +361.047 27.942 l +361.047 28.075 361.047 28.075 361.047 28.075 c +361.047 28.075 l +361.180 28.075 l +361.180 28.207 l +361.180 28.207 l +361.180 28.339 l +361.180 28.339 361.180 28.339 361.312 28.339 c +361.312 28.339 l +361.312 28.339 361.312 28.339 361.312 28.339 c +361.312 28.472 l +361.312 28.472 l +361.444 28.604 l +361.444 28.604 l +361.444 28.604 l +361.444 28.737 361.444 28.737 361.577 28.737 c +361.577 28.737 l +361.577 28.737 361.444 28.737 361.577 28.737 c +361.577 28.737 l +361.577 28.869 l +361.577 28.869 l +361.577 28.869 361.577 28.869 361.709 28.869 c +361.709 29.002 l +361.709 29.002 l +361.709 29.134 l +361.709 29.134 361.709 29.134 361.841 29.134 c +361.841 29.134 l +361.841 29.134 l +361.841 29.266 l +361.841 29.266 361.841 29.266 361.974 29.266 c +361.974 29.399 l +361.974 29.399 l +361.974 29.531 l +361.974 29.531 361.974 29.531 362.106 29.531 c +362.106 29.531 l +362.106 29.531 l +361.974 29.531 361.974 29.531 361.974 29.664 c +361.974 29.664 l +361.974 29.664 l +361.974 29.664 l +361.841 29.664 361.841 29.664 361.841 29.664 c +361.841 29.796 l +361.709 29.796 l +361.709 29.796 l +361.709 29.796 361.709 29.796 361.709 29.929 c +361.577 29.929 l +361.577 29.929 l +361.577 29.929 l +361.444 29.929 361.577 29.929 361.577 29.929 c +361.444 30.061 l +361.444 30.061 l +361.312 30.061 l +361.312 30.061 361.312 30.061 361.312 30.194 c +361.312 30.194 l +361.180 30.194 l +361.180 30.194 l +361.180 30.194 361.180 30.194 361.180 30.194 c +361.047 30.326 l +361.047 30.326 l +360.915 30.326 l +360.915 30.326 360.915 30.326 360.915 30.326 c +360.915 30.458 l +360.915 30.458 l +360.783 30.458 360.783 30.458 360.783 30.458 c +360.783 30.458 l +360.783 30.458 l +360.783 30.591 l +360.651 30.591 360.651 30.458 360.651 30.591 c +360.651 30.591 l +360.651 30.591 l +360.518 30.723 l +360.518 30.723 360.518 30.723 360.518 30.723 c +360.386 30.723 l +360.386 30.723 l +360.386 30.856 l +360.254 30.856 360.386 30.723 360.386 30.856 c +360.254 30.723 l +f +1.00 g +[] 0 d +389.093 30.591 m +391.077 30.591 392.665 30.194 393.855 29.399 c +394.914 28.737 395.443 27.545 395.443 25.823 c +395.443 25.029 395.310 24.234 395.046 23.704 c +394.781 23.042 394.384 22.645 393.723 22.247 c +393.194 21.850 392.532 21.585 391.739 21.320 c +390.813 21.188 389.887 21.055 388.828 21.055 c +387.638 21.055 l +387.638 16.023 l +384.992 16.023 l +384.992 30.194 l +385.521 30.326 386.182 30.458 386.976 30.458 c +387.770 30.591 388.431 30.591 389.093 30.591 c +389.093 30.591 l +389.225 28.339 m +388.564 28.339 388.034 28.339 387.638 28.207 c +387.638 23.307 l +388.828 23.307 l +390.151 23.307 391.077 23.572 391.739 23.837 c +392.400 24.234 392.797 24.896 392.797 25.823 c +392.797 26.353 392.665 26.750 392.532 27.015 c +392.268 27.412 392.003 27.677 391.739 27.810 c +391.474 27.942 391.077 28.075 390.680 28.207 c +390.151 28.339 389.754 28.339 389.225 28.339 c +389.225 28.339 l +f +1.00 g +[] 0 d +407.216 21.453 m +407.216 20.658 407.084 19.863 406.820 19.069 c +406.555 18.407 406.290 17.877 405.761 17.347 c +405.364 16.817 404.835 16.420 404.174 16.155 c +403.512 15.890 402.719 15.758 402.057 15.758 c +401.263 15.758 400.470 15.890 399.941 16.155 c +399.279 16.420 398.750 16.817 398.221 17.347 c +397.824 17.877 397.427 18.407 397.162 19.069 c +396.898 19.863 396.766 20.658 396.766 21.453 c +396.766 22.380 396.898 23.174 397.162 23.837 c +397.427 24.499 397.824 25.161 398.221 25.558 c +398.750 26.088 399.279 26.485 399.941 26.750 c +400.602 27.015 401.263 27.148 402.057 27.148 c +402.719 27.148 403.512 27.015 404.042 26.750 c +404.703 26.485 405.364 26.088 405.761 25.558 c +406.158 25.161 406.555 24.499 406.820 23.837 c +407.084 23.174 407.216 22.380 407.216 21.453 c +407.216 21.453 l +404.571 21.453 m +404.571 22.512 404.438 23.439 403.909 24.101 c +403.512 24.631 402.851 25.029 402.057 25.029 c +401.131 25.029 400.470 24.631 400.073 24.101 c +399.544 23.439 399.411 22.512 399.411 21.453 c +399.411 20.393 399.544 19.466 400.073 18.936 c +400.470 18.274 401.131 17.877 402.057 17.877 c +402.851 17.877 403.512 18.274 403.909 18.936 c +404.438 19.466 404.571 20.393 404.571 21.453 c +404.571 21.453 l +f +1.00 g +[] 0 d +416.080 22.910 m +415.683 21.718 415.418 20.526 415.022 19.334 c +414.625 18.142 414.360 17.082 413.963 16.023 c +411.847 16.023 l +411.582 16.685 411.317 17.347 411.053 18.274 c +410.656 19.069 410.391 19.863 410.127 20.791 c +409.730 21.718 409.465 22.777 409.201 23.704 c +408.936 24.764 408.539 25.823 408.275 26.883 c +410.921 26.883 l +411.053 26.353 411.185 25.691 411.450 25.029 c +411.582 24.366 411.714 23.704 411.847 22.910 c +412.111 22.247 412.243 21.585 412.508 20.923 c +412.640 20.261 412.905 19.599 413.037 19.069 c +413.302 19.731 413.434 20.393 413.699 21.055 c +413.831 21.718 414.095 22.380 414.228 23.042 c +414.360 23.837 414.625 24.499 414.757 25.029 c +414.889 25.691 415.022 26.353 415.154 26.883 c +417.138 26.883 l +417.270 26.353 417.403 25.691 417.535 25.029 c +417.667 24.499 417.800 23.837 418.064 23.042 c +418.196 22.380 418.329 21.718 418.593 21.055 c +418.726 20.393 418.990 19.731 419.122 19.069 c +419.387 19.599 419.519 20.261 419.784 20.923 c +419.916 21.585 420.181 22.247 420.313 22.910 c +420.445 23.704 420.710 24.366 420.842 25.029 c +420.975 25.691 421.107 26.353 421.239 26.883 c +423.885 26.883 l +423.620 25.823 423.356 24.764 422.959 23.704 c +422.694 22.777 422.430 21.718 422.033 20.791 c +421.768 19.863 421.504 19.069 421.107 18.274 c +420.842 17.347 420.578 16.685 420.313 16.023 c +418.196 16.023 l +417.800 17.082 417.535 18.142 417.138 19.334 c +416.741 20.526 416.344 21.718 416.080 22.910 c +416.080 22.910 l +f +1.00 g +[] 0 d +425.208 21.453 m +425.208 22.380 425.340 23.174 425.605 23.969 c +425.869 24.631 426.266 25.293 426.663 25.691 c +427.192 26.220 427.721 26.618 428.383 26.750 c +428.912 27.015 429.573 27.148 430.235 27.148 c +431.690 27.148 432.881 26.750 433.674 25.823 c +434.600 24.896 434.997 23.439 434.997 21.585 c +434.997 21.453 434.997 21.320 434.997 21.188 c +434.997 20.923 434.997 20.791 434.865 20.658 c +427.721 20.658 l +427.854 19.863 428.118 19.201 428.647 18.672 c +429.176 18.142 429.970 18.009 431.029 18.009 c +431.690 18.009 432.219 18.009 432.748 18.142 c +433.277 18.274 433.674 18.407 433.939 18.407 c +434.203 16.420 l +434.071 16.288 433.939 16.288 433.674 16.155 c +433.410 16.155 433.145 16.023 432.881 16.023 c +432.484 15.890 432.219 15.890 431.822 15.890 c +431.425 15.758 431.161 15.758 430.764 15.758 c +429.838 15.758 428.912 15.890 428.250 16.155 c +427.589 16.420 426.928 16.817 426.531 17.347 c +426.002 17.877 425.737 18.539 425.472 19.201 c +425.340 19.863 425.208 20.658 425.208 21.453 c +425.208 21.453 l +432.484 22.512 m +432.484 22.910 432.351 23.174 432.351 23.572 c +432.219 23.837 432.087 24.101 431.822 24.366 c +431.690 24.631 431.425 24.764 431.161 24.896 c +430.896 25.029 430.632 25.029 430.235 25.029 c +429.838 25.029 429.441 25.029 429.176 24.896 c +428.912 24.764 428.647 24.499 428.515 24.234 c +428.250 24.101 428.118 23.837 427.986 23.439 c +427.854 23.174 427.854 22.910 427.721 22.512 c +432.484 22.512 l +f +1.00 g +[] 0 d +443.861 24.631 m +443.596 24.764 443.331 24.764 442.935 24.896 c +442.538 24.896 442.141 25.029 441.612 25.029 c +441.347 25.029 441.083 24.896 440.818 24.896 c +440.421 24.896 440.289 24.764 440.156 24.764 c +440.156 16.023 l +437.643 16.023 l +437.643 26.353 l +438.040 26.618 438.701 26.750 439.495 26.883 c +440.156 27.015 440.950 27.148 441.876 27.148 c +442.009 27.148 442.273 27.148 442.405 27.148 c +442.670 27.148 442.935 27.015 443.067 27.015 c +443.331 27.015 443.596 26.883 443.728 26.883 c +443.993 26.883 444.125 26.750 444.257 26.750 c +443.861 24.631 l +f +1.00 g +[] 0 d +445.448 21.453 m +445.448 22.380 445.580 23.174 445.845 23.969 c +446.109 24.631 446.506 25.293 446.903 25.691 c +447.432 26.220 447.962 26.618 448.623 26.750 c +449.152 27.015 449.814 27.148 450.475 27.148 c +451.930 27.148 453.121 26.750 453.915 25.823 c +454.708 24.896 455.237 23.439 455.237 21.585 c +455.237 21.453 455.237 21.320 455.105 21.188 c +455.105 20.923 455.105 20.791 455.105 20.658 c +447.962 20.658 l +448.094 19.863 448.358 19.201 448.888 18.672 c +449.417 18.142 450.210 18.009 451.269 18.009 c +451.930 18.009 452.459 18.009 452.989 18.142 c +453.518 18.274 453.915 18.407 454.179 18.407 c +454.444 16.420 l +454.311 16.288 454.179 16.288 453.915 16.155 c +453.650 16.155 453.385 16.023 453.121 16.023 c +452.724 15.890 452.459 15.890 452.063 15.890 c +451.666 15.758 451.401 15.758 451.004 15.758 c +449.946 15.758 449.152 15.890 448.491 16.155 c +447.829 16.420 447.168 16.817 446.771 17.347 c +446.242 17.877 445.977 18.539 445.713 19.201 c +445.448 19.863 445.448 20.658 445.448 21.453 c +445.448 21.453 l +452.724 22.512 m +452.724 22.910 452.592 23.174 452.459 23.572 c +452.459 23.837 452.327 24.101 452.063 24.366 c +451.930 24.631 451.666 24.764 451.401 24.896 c +451.136 25.029 450.872 25.029 450.475 25.029 c +450.078 25.029 449.681 25.029 449.417 24.896 c +449.152 24.764 448.888 24.499 448.755 24.234 c +448.491 24.101 448.358 23.837 448.226 23.439 c +448.094 23.174 448.094 22.910 447.962 22.512 c +452.724 22.512 l +f +1.00 g +[] 0 d +459.868 21.453 m +459.868 20.393 460.132 19.466 460.661 18.936 c +461.058 18.274 461.852 18.009 462.778 18.009 c +463.175 18.009 463.572 18.009 463.836 18.009 c +464.101 18.009 464.365 18.009 464.498 18.142 c +464.498 24.366 l +464.233 24.499 463.969 24.631 463.572 24.764 c +463.307 24.896 462.910 25.029 462.381 25.029 c +461.587 25.029 460.926 24.631 460.397 24.101 c +460.000 23.439 459.868 22.512 459.868 21.453 c +459.868 21.453 l +467.011 16.420 m +466.482 16.155 465.953 16.023 465.159 15.890 c +464.365 15.890 463.572 15.758 462.778 15.758 c +461.852 15.758 461.190 15.890 460.397 16.155 c +459.735 16.420 459.206 16.817 458.677 17.347 c +458.280 17.745 457.883 18.407 457.619 19.069 c +457.354 19.731 457.222 20.526 457.222 21.453 c +457.222 22.247 457.354 23.042 457.619 23.837 c +457.751 24.499 458.148 25.029 458.545 25.558 c +458.942 26.088 459.471 26.485 460.000 26.750 c +460.661 27.015 461.323 27.148 462.117 27.148 c +462.646 27.148 463.043 27.015 463.439 26.883 c +463.836 26.883 464.233 26.750 464.498 26.485 c +464.498 31.783 l +467.011 32.180 l +467.011 16.420 l +f +Q +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +1.000 0.000 0.000 rg +784.08 720.59 Td +(Note!) Tj +ET +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +780.480 722.880 m +766.080 722.880 l +769.680 726.480 l +S +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +766.080 722.880 m +769.680 719.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +1.000 0.000 0.000 rg +784.08 563.63 Td +(Note!) Tj +ET +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +780.480 565.920 m +766.080 565.920 l +769.680 569.520 l +S +1 J +1 j +0.72 w +0.80 0.00 0.00 RG +0.00 g +[] 0 d +766.080 565.920 m +769.680 562.320 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +672.48 619.79 Td +(E22P-915M30S) Tj +ET +0.80 0.00 0.00 rg +656.28 233.28 m 656.28 234.27 655.47 235.08 654.48 235.08 c +653.49 235.08 652.68 234.27 652.68 233.28 c +652.68 232.29 653.49 231.48 654.48 231.48 c +655.47 231.48 656.28 232.29 656.28 233.28 c +f +0.80 0.00 0.00 rg +562.68 1082.88 m 562.68 1083.87 561.87 1084.68 560.88 1084.68 c +559.89 1084.68 559.08 1083.87 559.08 1082.88 c +559.08 1081.89 559.89 1081.08 560.88 1081.08 c +561.87 1081.08 562.68 1081.89 562.68 1082.88 c +f +0.80 0.00 0.00 rg +382.68 1093.68 m 382.68 1094.67 381.87 1095.48 380.88 1095.48 c +379.89 1095.48 379.08 1094.67 379.08 1093.68 c +379.08 1092.69 379.89 1091.88 380.88 1091.88 c +381.87 1091.88 382.68 1092.69 382.68 1093.68 c +f +0.80 0.00 0.00 rg +731.88 748.08 m 731.88 749.07 731.07 749.88 730.08 749.88 c +729.09 749.88 728.28 749.07 728.28 748.08 c +728.28 747.09 729.09 746.28 730.08 746.28 c +731.07 746.28 731.88 747.09 731.88 748.08 c +f +0.80 0.00 0.00 rg +483.48 758.88 m 483.48 759.87 482.67 760.68 481.68 760.68 c +480.69 760.68 479.88 759.87 479.88 758.88 c +479.88 757.89 480.69 757.08 481.68 757.08 c +482.67 757.08 483.48 757.89 483.48 758.88 c +f +0.80 0.00 0.00 rg +731.88 679.68 m 731.88 680.67 731.07 681.48 730.08 681.48 c +729.09 681.48 728.28 680.67 728.28 679.68 c +728.28 678.69 729.09 677.88 730.08 677.88 c +731.07 677.88 731.88 678.69 731.88 679.68 c +f +0.80 0.00 0.00 rg +731.88 708.48 m 731.88 709.47 731.07 710.28 730.08 710.28 c +729.09 710.28 728.28 709.47 728.28 708.48 c +728.28 707.49 729.09 706.68 730.08 706.68 c +731.07 706.68 731.88 707.49 731.88 708.48 c +f +0.80 0.00 0.00 rg +731.88 694.08 m 731.88 695.07 731.07 695.88 730.08 695.88 c +729.09 695.88 728.28 695.07 728.28 694.08 c +728.28 693.09 729.09 692.28 730.08 692.28 c +731.07 692.28 731.88 693.09 731.88 694.08 c +f +0.80 0.00 0.00 rg +731.88 686.88 m 731.88 687.87 731.07 688.68 730.08 688.68 c +729.09 688.68 728.28 687.87 728.28 686.88 c +728.28 685.89 729.09 685.08 730.08 685.08 c +731.07 685.08 731.88 685.89 731.88 686.88 c +f +0.80 0.00 0.00 rg +483.48 679.68 m 483.48 680.67 482.67 681.48 481.68 681.48 c +480.69 681.48 479.88 680.67 479.88 679.68 c +479.88 678.69 480.69 677.88 481.68 677.88 c +482.67 677.88 483.48 678.69 483.48 679.68 c +f +0.80 0.00 0.00 rg +483.48 686.88 m 483.48 687.87 482.67 688.68 481.68 688.68 c +480.69 688.68 479.88 687.87 479.88 686.88 c +479.88 685.89 480.69 685.08 481.68 685.08 c +482.67 685.08 483.48 685.89 483.48 686.88 c +f +0.80 0.00 0.00 rg +483.48 694.08 m 483.48 695.07 482.67 695.88 481.68 695.88 c +480.69 695.88 479.88 695.07 479.88 694.08 c +479.88 693.09 480.69 692.28 481.68 692.28 c +482.67 692.28 483.48 693.09 483.48 694.08 c +f +0.80 0.00 0.00 rg +483.48 708.48 m 483.48 709.47 482.67 710.28 481.68 710.28 c +480.69 710.28 479.88 709.47 479.88 708.48 c +479.88 707.49 480.69 706.68 481.68 706.68 c +482.67 706.68 483.48 707.49 483.48 708.48 c +f +0.80 0.00 0.00 rg +731.88 593.28 m 731.88 594.27 731.07 595.08 730.08 595.08 c +729.09 595.08 728.28 594.27 728.28 593.28 c +728.28 592.29 729.09 591.48 730.08 591.48 c +731.07 591.48 731.88 592.29 731.88 593.28 c +f +0.80 0.00 0.00 rg +731.88 524.88 m 731.88 525.87 731.07 526.68 730.08 526.68 c +729.09 526.68 728.28 525.87 728.28 524.88 c +728.28 523.89 729.09 523.08 730.08 523.08 c +731.07 523.08 731.88 523.89 731.88 524.88 c +f +0.80 0.00 0.00 rg +731.88 532.08 m 731.88 533.07 731.07 533.88 730.08 533.88 c +729.09 533.88 728.28 533.07 728.28 532.08 c +728.28 531.09 729.09 530.28 730.08 530.28 c +731.07 530.28 731.88 531.09 731.88 532.08 c +f +0.80 0.00 0.00 rg +731.88 539.28 m 731.88 540.27 731.07 541.08 730.08 541.08 c +729.09 541.08 728.28 540.27 728.28 539.28 c +728.28 538.29 729.09 537.48 730.08 537.48 c +731.07 537.48 731.88 538.29 731.88 539.28 c +f +0.80 0.00 0.00 rg +731.88 553.68 m 731.88 554.67 731.07 555.48 730.08 555.48 c +729.09 555.48 728.28 554.67 728.28 553.68 c +728.28 552.69 729.09 551.88 730.08 551.88 c +731.07 551.88 731.88 552.69 731.88 553.68 c +f +0.80 0.00 0.00 rg +163.08 408.24 m 163.08 409.23 162.27 410.04 161.28 410.04 c +160.29 410.04 159.48 409.23 159.48 408.24 c +159.48 407.25 160.29 406.44 161.28 406.44 c +162.27 406.44 163.08 407.25 163.08 408.24 c +f +0.80 0.00 0.00 rg +163.08 386.64 m 163.08 387.63 162.27 388.44 161.28 388.44 c +160.29 388.44 159.48 387.63 159.48 386.64 c +159.48 385.65 160.29 384.84 161.28 384.84 c +162.27 384.84 163.08 385.65 163.08 386.64 c +f +0.80 0.00 0.00 rg +163.08 393.84 m 163.08 394.83 162.27 395.64 161.28 395.64 c +160.29 395.64 159.48 394.83 159.48 393.84 c +159.48 392.85 160.29 392.04 161.28 392.04 c +162.27 392.04 163.08 392.85 163.08 393.84 c +f +0.80 0.00 0.00 rg +163.08 379.44 m 163.08 380.43 162.27 381.24 161.28 381.24 c +160.29 381.24 159.48 380.43 159.48 379.44 c +159.48 378.45 160.29 377.64 161.28 377.64 c +162.27 377.64 163.08 378.45 163.08 379.44 c +f +0.80 0.00 0.00 rg +98.28 1093.68 m 98.28 1094.67 97.47 1095.48 96.48 1095.48 c +95.49 1095.48 94.68 1094.67 94.68 1093.68 c +94.68 1092.69 95.49 1091.88 96.48 1091.88 c +97.47 1091.88 98.28 1092.69 98.28 1093.68 c +f +0.80 0.00 0.00 rg +278.28 1082.88 m 278.28 1083.87 277.47 1084.68 276.48 1084.68 c +275.49 1084.68 274.68 1083.87 274.68 1082.88 c +274.68 1081.89 275.49 1081.08 276.48 1081.08 c +277.47 1081.08 278.28 1081.89 278.28 1082.88 c +f +0.80 0.00 0.00 rg +724.68 841.68 m 724.68 842.67 723.87 843.48 722.88 843.48 c +721.89 843.48 721.08 842.67 721.08 841.68 c +721.08 840.69 721.89 839.88 722.88 839.88 c +723.87 839.88 724.68 840.69 724.68 841.68 c +f +0.80 0.00 0.00 rg +724.68 834.48 m 724.68 835.47 723.87 836.28 722.88 836.28 c +721.89 836.28 721.08 835.47 721.08 834.48 c +721.08 833.49 721.89 832.68 722.88 832.68 c +723.87 832.68 724.68 833.49 724.68 834.48 c +f +0.80 0.00 0.00 rg +724.68 827.28 m 724.68 828.27 723.87 829.08 722.88 829.08 c +721.89 829.08 721.08 828.27 721.08 827.28 c +721.08 826.29 721.89 825.48 722.88 825.48 c +723.87 825.48 724.68 826.29 724.68 827.28 c +f +0.80 0.00 0.00 rg +724.68 816.48 m 724.68 817.47 723.87 818.28 722.88 818.28 c +721.89 818.28 721.08 817.47 721.08 816.48 c +721.08 815.49 721.89 814.68 722.88 814.68 c +723.87 814.68 724.68 815.49 724.68 816.48 c +f +0.80 0.00 0.00 rg +688.68 816.48 m 688.68 817.47 687.87 818.28 686.88 818.28 c +685.89 818.28 685.08 817.47 685.08 816.48 c +685.08 815.49 685.89 814.68 686.88 814.68 c +687.87 814.68 688.68 815.49 688.68 816.48 c +f +0.80 0.00 0.00 rg +681.48 816.48 m 681.48 817.47 680.67 818.28 679.68 818.28 c +678.69 818.28 677.88 817.47 677.88 816.48 c +677.88 815.49 678.69 814.68 679.68 814.68 c +680.67 814.68 681.48 815.49 681.48 816.48 c +f +0.80 0.00 0.00 rg +674.28 816.48 m 674.28 817.47 673.47 818.28 672.48 818.28 c +671.49 818.28 670.68 817.47 670.68 816.48 c +670.68 815.49 671.49 814.68 672.48 814.68 c +673.47 814.68 674.28 815.49 674.28 816.48 c +f +0.80 0.00 0.00 rg +724.68 884.88 m 724.68 885.87 723.87 886.68 722.88 886.68 c +721.89 886.68 721.08 885.87 721.08 884.88 c +721.08 883.89 721.89 883.08 722.88 883.08 c +723.87 883.08 724.68 883.89 724.68 884.88 c +f +0.80 0.00 0.00 rg +231.48 329.04 m 231.48 330.03 230.67 330.84 229.68 330.84 c +228.69 330.84 227.88 330.03 227.88 329.04 c +227.88 328.05 228.69 327.24 229.68 327.24 c +230.67 327.24 231.48 328.05 231.48 329.04 c +f +0.80 0.00 0.00 rg +209.88 329.04 m 209.88 330.03 209.07 330.84 208.08 330.84 c +207.09 330.84 206.28 330.03 206.28 329.04 c +206.28 328.05 207.09 327.24 208.08 327.24 c +209.07 327.24 209.88 328.05 209.88 329.04 c +f +0.80 0.00 0.00 rg +663.48 1082.88 m 663.48 1083.87 662.67 1084.68 661.68 1084.68 c +660.69 1084.68 659.88 1083.87 659.88 1082.88 c +659.88 1081.89 660.69 1081.08 661.68 1081.08 c +662.67 1081.08 663.48 1081.89 663.48 1082.88 c +f +0.80 0.00 0.00 rg +717.48 1082.88 m 717.48 1083.87 716.67 1084.68 715.68 1084.68 c +714.69 1084.68 713.88 1083.87 713.88 1082.88 c +713.88 1081.89 714.69 1081.08 715.68 1081.08 c +716.67 1081.08 717.48 1081.89 717.48 1082.88 c +f +Q +endstream +endobj +1 0 obj +<> +endobj +5 0 obj +<< +/Type /FontDescriptor +/FontName /SimSun +/FontBBox [-8 -145 1000 859] +/Flags 32 +/StemV 0 +/ItalicAngle 0 +/Ascent 859 +/Descent -141 +/CapHeight 175 +>> +endobj +6 0 obj +<< +/Type /Font +/BaseFont /SimSun +/FontDescriptor 5 0 R +/W [1 95 500] +/Subtype /CIDFontType2 +/CIDSystemInfo +<< +/Ordering (GB1) +/Registry (Adobe) +/Supplement 2 +>> +>> +endobj +7 0 obj +<< +/Type /Font +/Subtype /Type0 +/BaseFont /SimSun +/Encoding /UniGB-UCS2-H +/DescendantFonts [6 0 R] +>> +endobj +8 0 obj +<< +/Descent -325 +/CapHeight 500 +/StemV 80 +/Type /FontDescriptor +/Flags 32 +/FontBBox [-665 -325 2000 1006] +/FontName /Arial +/ItalicAngle 0 +/Ascent 1006 +>> +endobj +9 0 obj +<> +endobj +10 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1024 +/Height 1024 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/DecodeParms <> +/SMask 11 0 R +/Length 56607 +/Filter /FlateDecode +>> +stream +xìÝ{\ÎwÇñ]))D¸™{ErNsÊ!•™c9Ω-gCưp/& cMCJF4sHrÓœ)6‡ms\ÎB)Ý÷o³‡ÍnÕ«>¿ëú½žx¸ïÝwß×®ëzs]¿Ÿî¿ÿýï+´AÇ´ƒhР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„hР! @C€†0 aÂ4„ .<8wîÜ™3g._¾|íIþéÝ»w¥þÎÂÂÂÆÆFùNáÂ…íW²dIåÛ%J899U¨PÁÎÎNº`HJKKKùÝÑ£GO:¥¼î¿páBNNŽt€/^\™+V¬^½ºËï*Uªdff&Ý¥E €|u÷îÝ}ûöíܹs÷î݇¾té’t€ŒÂ… רQ£Aƒ5rwwwtt”.Ò +@žËÌÌLJJÚ°aƒòmrrrvv¶t€ê8995nܸeË–mÚ´)Uª”tŽ)cä•sçέ[·.11qÛ¶m¼qàét:WWW//¯¶mÛ6hЀ· ÀÀ.\¸ðÕW_ÅÅÅíÚµ‹[€—ñꫯvèСsçÎîîîÊ0Î1 ÃHOOŽŽV^÷ó)^Ãrrrò÷÷ïׯ_åÊ•¥[ŒàesæÌC‡I·hK‰%”0dÈÒ¥KK·€ÞîܹvîÜ9éí*X°`×®]ƒ‚‚jÔ¨!ÝbLz¸víZhhhxx8ïöP N×¶mÛI“&¹¹¹I·À Q^ñ+¯û§M›vóæMé<…§§çÇ\»vméµc<Çýû÷gÍšzãÆ é<‹™™Y§NBBB*Uª$Ý¢^ €g‰6lØéÓ§¥Cð¢,,,'Ožlgg'Ý¢F €§;|øððáÓ’’¤Cööö&L|(Ý€—Ò°aÃùóçW¯^]:DEOؾ}û€N:%ð°°xï½÷&Mšdii)Ý¢ + €?ܸqcذa111Ò!0¼jÕªEFFÖ¯__:Dà7»víêÑ£ö0aæææ#GŽœ2eŠ………t‹$­€ìììÿüŽwühAýúõ—,YR¹reé1š?ýôS—.]:$€ückkáçç'"C»`ýúõ=zôàö^Ú0wî\ ¾H‹@ùWž>}ú¸qãrrr¤[ ¦qãÆ+V¬(S¦ŒtH¾ÒܸsçN·nÝÖ­['yŽŽŽ_ýu½zõ¤Cò¶ÀÅ‹}||>,µ°²²ŠŠŠêÚµ«tH>ÑÐHMMõööþå—_¤C .:nâĉÁÁÁÒ!ùA+ 11±K—.éééÒ!P©ÁƒÏž=ÛÌÌL:$oib¬X±¢GYYYÒ!P5??¿Å‹›ö¥L,]º´wïÞÙÙÙÒ!0>>>qqqVVVÒ!yÅÄ@DDÄÀ¹Ü'^\³fÍÖ®]kcc#’'LyÌ;wèС&ü/€<¢l€„„kkkéÃ3ÙÝ·o_þì¹Ó²eËøøxKKKé3ͰråJ???Þ÷€—Ѿ}û¸¸8ssséC2Á°víÚN:qͼ¼ž={FGGët:éƒ1µpàÀ¦M›Þ½{W:&bìØ±!!!ÒcRàÌ™3 4¸råŠtLJxxx`` t…a˜Î¸}û¶»»ûÑ£G¥C`jÌÍÍZµj%b&2²³³[·n½uëVé˜&[[ÛÝ»wW«VM:äe™Èxï½÷fΜ)]SöÚk¯íß¿ßÎÎN:䥘ˆõ÷÷—®€ék×®ÝêÕ«ú¢@F?Ž?^¯^½;wîH‡@BBBÆŽ+]‘{Æ=ÒÓÓÝÜÜNž<)bxUªT©ø»2eÊ”,YÒÞÞ¾H‘"666ÒuzðàÁÝ»w333¯ýîÊ•+g~÷Óïrrr¤ ¬@[¶liÚ´©tH.÷èß¿ÿÂ… ¥+ Cy}ß°aÃFÕ©SÇÅÅ¥T©RÒE/ëÞ½{ÇŽKNNÞµk×îÝ»Oœ8!]dŽŽŽ)))Å‹—É #«W¯~ë­·¤+^Š2=<<ÚüNyÑoÔo&x®+W®lܸ111qÓ¦Mׯ_—Îy):tX¹r¥tEnë¸xñ¢òŠùÚµkÒ!¹T½zõž={öîÝ»téÒÒ-ùíÁƒÊX¼xñš5k”ïKçäÒ¢E‹Þ~ûmé +½ëhÓ¦2¥+ôV¦L™nݺõêÕKY/Ò-ò®]»³wï^é½)R$55ÕÉÉI:D?F9¢££nlU¬Xqøðáï¼óŽ¥¥¥t €ê$''‡„„|õÕWÆõê´M›6‰‰‰Òú1¾põêÕjÕª¥¥¥I‡¼¨5jùûû›››K·¨ÚÑ£GCCC—.]š-Ýò¢bbbzôè!]¡ã~~~Ë—/—®x!ÊP™:uª¯¯/Ÿîxq'Ož Ž5ŠWªööößÿ½ƒƒƒtÈ‹2²°~ýzoooéŠç+T¨PPPÐûï¿Ï~r'))iàÀÇŽ“y¾^½zEGGKW¼(cYYYÎÎÎê¿|¬¯¯ïœ9sŒîã j£¼üûüóÏÇçÎé–gÑétÊ\iܸ±tÈ 1¦6räHéŠg)W®\DD„———t€é8wîÜ AƒÖ­['ò,nnnûöí333“y>£iiiUªT¹yó¦tÈ?òññ‰ŠŠ²··—05ÊKÖ9sæŒ=ZÍ7 0–OÍ œ7ožtÅÓ™››?~„ F±ùŒÔüüü~úé'é§sttüðCé§°··ÿùçŸmmm¥CžÅÀÉ“'«W¯®Â›Aøøø,_¾¼P¡BÒ!š5`À¾DTÆÉøñã¥+žÅ€:ïüÕ£GÈÈH éZ³f¿¿ÿýû÷¥Cž`ggwúôébÅŠI‡ü#µ€ãÇW¯^=''G:ä Æ ã#¿²¶oßþæ›oÞºuK:ä “&Mš8q¢tÅ?Rû˜?¾tÅÆ÷ÑGIWà7ûöíkÑ¢EzzºtÈŸΜ9cmm-òtªiiiNNNªúk^½zEEEét:éüaëÖ­mÛ¶ÍÌÌ”ùSDDD@@€tÅÓ©zOš4IºâOíÚµ[¹r¥¹¹¹tžÛ½{wõ¼o¼J•*?üðƒ:ß1®Þ‘‘áääô믿J‡ü¡I“&6l°²²’ÀS„‡‡4HºâOk×®õõõ•®x +õ€%K–ôìÙSºâU«Vݽ{·tþѨQ£>ùäéŠ?´mÛ6!!Aºâ)Ô;š4i’””$]ñ++«={öÔ¬YS:ϒݬY³;vH‡üÆÌÌìçŸvrr’ù;•€“'O¾þúë*i[¸paß¾}¥+ð|çÏŸwuu½zõªtÈo‚ƒƒUxÇb•€Ñ£GϘ1Cºâ7]»v•®À‹JLLôööVëÜråÊ>}º@Ò!OPãÈÎÎvttTÃÇ_{íµØÚÚJ‡@AAA¡¡¡Ò¿Ù¸qc«V­¤+ž Æ°iÓ¦Ö­[KW¼¢lµ½{÷º¹¹I‡@?YYYuëÖ=räˆtÈ+}ûö]¸p¡tÅÔ8ú÷﯆¦ÁƒÏ™3Gº¹±sçNñ׺E‹½råJÁ‚e3þJu@™keÊ”¹víšlF©R¥Ž?®ü„Éf ×úöí»hÑ"éŠWÚ¶m+]ñ'Õ €ÄÄD5ü-^¼X=w!@.\»víõ×_¿"PïÞ½£¢¢dþJuàÝw߈ˆmhܸqRR’N§“ÍÀKR^X*//eŠ+–––¦žk©nT¨PáìÙ³‚ÊëþC‡ÕªUK°‘““ãêêš’’"›±sçÎFÉ6<¦®pìØ±5jÈ6´k×nÍš5² 0”åË—ûùùÉ6L˜0aòäɲ ©k̘1côèѲ ªÚgxI>¬^½ú‰'êÔ©³ÿ~Á€¿R×ðôôüæ›od6oÞ,ƒ[´hQß¾}ÌÌÌ.]ºäàà Øð˜Š@fffÑ¢E322¶mÛÖ´iSÁ\VVV•*UΜ9#ذ|ùò.]º<¦¢°{÷nÙ÷Þ4hÐ@i @ùì³Ï,0tèÐÙ³g <¦¢ þ€ ôë×O0yäÖ­[eÊ”¹ÿ¾T€››Û¤Nÿ+ €:¬ZµJêt++«K—.që_SÕ¥K—¸¸8©Ó (pãÆ"EŠH<¦¢Pºté+W®Hîïï¿téR©Ó×âããÛµk'°eË–-Z<¢–ðË/¿”/_^0`ýúõ^^^‚ÈSÙÙÙ¯¾úªàŸ8O›6m̘1R§?¦–àãã#uz©R¥ÎŸ?onn.€|0lذO?ýTêôîÝ»/Y²DêôÇÔ2¦N:nÜ8©Ó‡ "øKÀS½óÎ;õë×—½l3ÀÄÈ^vÒÅÅåÈ‘#R§?¦–Э[·eË–Iž˜˜Ø¦M©Óü¿¥K—vïÞ]ùŽ——×Â… Ë”)#]0>,UªÔµk×DN·°°HOO/X° Èé©eÔ¨QãØ±c"G[YY)¿ +*$r:€ÿwá—ëׯ?ú ,ðõõ•­˜ÿØØX©ÓSRRœ¥ND ''Gyý™™)rº§§çæÍ›EŽðÿ”„–-[nݺõoÿ}Ïž=ÃÃÃmllDª&cáÂ…ýû÷—:=..®S§NR§?¢ŠpþüùråÊIþá‡KàoÂÂÂFŽùÔT±bŘ˜ww÷|NþÉíÛ·SRRΞ={óæÍ[·n=ú¶hÑ¢¶¶¶vvvÊ·Ê/ZåûÒ¥þtâĉ×_]êôÐÐÐQ£FIþˆ*ÀŽ;<<<¤N߸qc«V­¤NðWßÿ}:užq›FssseL™2ÅÂÂ"?Àǔ_¥ñññûöíKNN>}úô‹<*3 fÍšõêÕóõõ­Q£F>Dxå·méÒ¥ýõW‘ÓøÙgŸ‰ý˜*@LLL¯^½¤N¿~ýz±bŤNðXfffýúõ_äòÊ )åq£J•*ùP<¢¼â_¹råêÕ«Ož<ù2_§R¥JíÛ·ïСƒàuHøøø$$$ˆíååµ~ýz‘£SŘ2eÊĉEŽvrr:sæŒÈÑþf̘1Ó§OÁÿ±µµõÔ©S‡ªÓéò´ +—““£¼J˜6mÚ®]» û•]]]‡îïïÏ_gùoܸqÊ“ˆÈÑU«VýþûïEŽ~L 00pÞ¼y"G+û/>>^ähµcÇŽ¦M›>|øP¯ÿWëÖ­###Ë–-›GU⬬¬/¾øâ“O>9}útÞR¾|ù#F 8Pü²€€¦,[¶¬[·n"G)RäöíÛ"G?¦ŠЩS§•+WŠ=zôèÿGyäÖ­[µjÕÊÝ_Ç•,YRy•Ö¾}{CGAÓ’’’œššš?ǽöÚkŸ~ú)w¤òÍ‘#G”ç©Ó322,--¥NE% Y³fß~û­ÈÑááá"Gx¬wïÞ‹/~™¯Ð³gÏÏ>û¬H‘"†J‚f]¾|yÔ¨QK—.ÍÿçÇ.]º„……9::æó¹€ݾ}[ðò\/^”½Á¥*€‹‹K¾ý)Ë߬_¿ÞËËKäh¬ZµªC‡/ÿu*T¨ýÆo¼ü—‚f%%%uíÚUÙRööö_~ùeëÖ­¥í(^¼ø7DŽ¿˜*@Ù²e/]º$r´2<¸" èâÅ‹...†º%{F5yòdÞN })φŸ~úéèÑ£³²²dKt:]PPPHHˆ™™™l `ÚjÕªõ"×Ë Û¶mkÚ´©ÈѨb.\øÞ½{"G_¾|¹T©R"GP||| ~54ggç%K–(»Â°_&,##£GRŸF{*__ßØØØB… +I‡&«eË–[¶l9zÕªU²]SÅ077×÷Ò¡Óé233¹þ eîܹC† É‹¯lee|öìÙ"GÏŸ?¿ÿþ"G?"?nÞ¼Y¬X1‘£Ë–-{á‘£?~üG}”oÇuîÜ9""Bꡪ5`À€ HW<_·nݾüòKé +ÀÔèuûyÚ;wî AƒDŽ~D~¤¥¥988ˆíää”»x»vízã7òù“?åË—ŽŽ–½êTeþüùÒ/jöìÙC‡•®LÊ„ þóŸÿˆ6bÄ‘£‘¿þú«Ôux*T¨§7xðÿîÞ½ëêêzêÔ©ü?Z§Ó 2dúôé²÷_„>|ØÝÝýþýûÒ!/ÊÜÜ|Ë–-Mš4‘LLJ~8yòd‘£g̘1räH‘£a0€|Õ¿ÿ…  +Ô¨Q#&&FððwëÖ­š5kž={V:D?¥K—NII)Y²¤t`"’€v¬Y³FöÊÇp‘PëÕ«—2¥+rãÍ7ß\½zµt`"’€F¤¥¥9;;_¹rE:äÍ›7ŠŠ*W®œtòÕªU«:tè ]‘{‘‘‘}úô‘®L@Ð__ßuëÖIW<ÁÎÎnΜ9={ö”A>Qžq”ª|+’{… NNN®\¹²t`ô’€DDD¼ûî»ÒO×¹sçyóæ/^\:yKy¾SV¨ +ïø«/ww÷íÛ·(P@:0n I ÀäýôÓO®®®j¾ñvéÒ¥###½¼¼¤C‡>ÿüóJWÆÔ©Sßÿ}é +À¸1$1Ó–íáá±gÏéçÐét ˜9s¦Ô½É‘§”Z«V­ôôtéð°°Ø¹sgݺu¥C#ÆÄLÛ¤I“‚ƒƒ¥+^TµjÕ–,Yâêê*C2–ª—ªU«\º0 I Àdäää4oÞ|ûöíÒ!†´víZ___é +èáâÅ‹ÎÎÎׯ_—Éo–––û÷ïWþÝ¥CãÀÄLFHHÈ| ]aHÒЃò¤æí혘("£V­Z{÷î-X° t`’€i8|øpƒ ‚’w‚ƒƒ•×:Ò€º0$1ã’™™Y¯^½””éƒáΩÆèÂ… ÎÎΦô””1z‹-zûí·¥+a I @å”G ooïÄÄDéCZ¶l™ŸŸŸtôp÷î]WW×S§NI‡˜›Ã‡W®\Y:ÄÄTnÖ¬Y#FŒ®0¤=zÄÄÄHW@?óçÏ—®0îîîÛ·o/P €t † ‰¨™é]qåÕW_MII)V¬˜tô°qãF///ñ',3mÚ´1cÆHWb’€jeee¹»»›ÒWÌÌÌ6oÞܼyséèáêÕ«ÎÎΗ/_–15»víªS§Žt ƒ ‰¨Öرc§M›&]aH£F + •®€~ºté']ašªU«vàÀkkké@@P§;w6iÒÄ”®¸¢¼Ö9xð •••tô°hÑ¢¾}ûJW˜²#F„……IW’€ +¥§§»ººþøãÒ!cii¹wïÞš5kJ‡@gΜQ~Ênß¾-bÊx_4‹ ‰¨PŸ>}¢¢¢¤+ IüÑúÊÉÉiѢŷß~+búSRRŠ/.ä+€$ 6«W¯~ë­·¤+ ÉÃÃcÛ¶m\ñ脆†IWhE·nݾüòKé + _1$1UQ~K:;;+ßJ‡ŒÝ‘#Gœœœ¤C ‡cÇŽÕ©S'##C:DC¸;´† ‰¨‡ò€àëë› bHK–,éÞ½»tô™™Y¿~}e¶I‡hKÑ¢E•óòåËK‡ù„ ‰¨Gxxø Aƒ¤+ ©C‡+W®”®€~ÆŒ3}úté +-òôôÜ´i“N§“ò@P‰üÑÕÕ5==]:Ä`Ê–-›’’boo/=˜ÞõgˬY³† &]ä€$ ÙÙÙ7Þ»w¯tˆÁètº„„///éèÁô®?kt,--÷ïßïìì,ä9€$ 'Nœ2eŠt…! 6lÖ¬YÒÐOß¾}-Z$]¡uÊÛ³gOÁ‚¥C€¼ÅÄÄ8p Q£FYYYÒ!SµjÕƒZ[[K‡@kÖ¬iß¾½t~3nܸ>úHºÈ[ I @ÖÝ»wk×®}òäI郱°°Ø¹sgݺu¥C ‡´´4ggç+W®H‡à7fff[·nmÒ¤‰t‡’€¬€€€ùóçKWRHHÈØ±c¥+ ŸŽ;~ýõ×ÒøSÅŠ“““mmm¥C€¼ÂÄmذ¡mÛ¶âäîî¾}ûvnúk\” ª Qé +ü]¿~ý,X ]ä€$ %--ÍÅÅåòåËÒ!cccsøðáÊ•+K‡@ÊãpÍš5ïܹ#‚§ˆ‹‹ëÔ©“t'’€åyÝÄn’Ù§Oé +è!''§yóæÛ·o—ÁÓ•(Q"55µtéÒÒ!€á1$1¦÷¦‹7ß|sõêÕÒÐÏÔ©SÇ']giݺubb"·†éaHbùï矮U«–)½éÂÁÁ!%%EêÁ¹“œœ\¿~ýH‡à9æÍ›÷Î;ïHWÆÄòYNNN³fÍ’’’¤C F§ÓÅÇÇ{{{K‡@™™™uëÖMMM•Áó.\øÐ¡CUªT‘ ‰ ‰ä³)SþÇÞ}Eu/üVTìeŒ[¬»t)Š"J•X°+vG±DÍØÛèØulDQ‰+*Ø‚ ˆHßµDcœk޽€€dçwžy~sŸ<<¹‰Ïw?»g?¯?œ;wráíÍ–ó³ç,^°`ºBIaaaè +’Gzó[»v-º‚>—»»ûÕ«WíììÐ!DŠá@â 2¥¬¬,///5Ýô·qãÆ999ŽŽŽè’!))ÉÏÏÏh4¢CH†E‹©ìgdå88ˆL&??ßÕÕõöíÛèÅØÚÚ^¹rÅÓÓB2¼}ûÖÉÉéþýûè’‡O7R$"“™0a‚ÊN•á$-ÑСC÷ìÙƒ® Òà/ÜHM88ˆLãܹs]ºt?åÄ“’-QLLŒºo,Õ»wïØØXt…@ãÇß´iº‚HHD&ðâÅ N÷ûï¿£CÃË’X"é_«ÕJ¢CDñõõMHH;vì¶mÛÐ-¢ð¢[¤HD&пÿC‡¡+”´uëV•ÝÈLõ¤·›ààุ8tˆ(•+WÎÍÍmРA^^ž‹‹Ë¯¿þŠ.¥V­ZƒAúBôE88ˆDÛµk׈#ÐJêҥ˩S§xkR˲yóæñãÇ£+Ú³gÏ!Cþû?§¤¤øúúþñÇØ$qzöìyôèQtÑá@â ê_ÿú—““Ó»wïÐ!Š©Q£†Á`¨]»6:„d¸wïžô8üðá:D”^½z•8õÞ¼yK—.Eõ˜ÀîÝ»‡Š® *=$"qŒFc§NÐ!J:|ø°º?Eª>ÅÅž¾¾©©©èQ¾úê+i”V¯^ýÏÿ¥ô·nÛ¶íµk×PU¢UªT)77Wz'E‡•‘8+V¬˜={6ºBI£Gþé§ŸÐ$ún>ýgó¡Ø_~ùÅÍÍ-??ßôU¦Ñ®]»„„„2eÊ CˆJƒ‰€HœœOOÏ¢¢"tˆb6l˜››[±bEtÉ••åíí­¦Ça aaas{üñûï¿7e‰­\¹rÆŒè +¢Òà@â ¡°°ÐÃÃÃ`0 C£Ñh.]ºÔ¾}{tÉPPP =¯_¿ŽåoŒ%½ÉvëÖíôéÓ¦¬2%{{û´´4'''t‘lHD"L™2eÆ è +%Í›7oñâÅè +’gòäÉáááè +Qlmm“’’¼¼¼þþ{òä‰N§{ùò¥iªL¯eË–åÊ•C‡ÉÀÄ@¤¸ .ÀŸÝ +ruuMII)[¶,:„dPßã°„ ,Z´èsþÉ£GöîÝ[tt(#Р+ˆäá@â RÖ›7oœœœ{öìAW}.$"¥<~üX§Ó½zõ +¢˜ªU«êõúzõê¡CH†'OžhµZ5=Kèܹó¹sçJ7J§M›¶fÍÅ“ÌÇ €® ú,HDŠ0/^D‡()::º_¿~è +’AõW½¬R¥JnnnýúõK÷?/,,lÓ¦4k•­2Òÿ?Òßî믿F‡ý3$"E¬Y³fÚ´iè +% 6l×®]è +’Gõ÷½úòŸp߸qÃÝݽ  @©$só%¿!!2%$¢/wóæMéâãÇèÅð…–è—_~qssËÏÏG‡ˆräÈ‘/ÿ:«W¯V÷ÝsK÷ "ã@â úB………žžž¹¹¹èÅh4š .øùù¡CH†âââvíÚ¥¥¥¡CD©S§ŽÁ`¨V­Ú—)£ÑعsçK—.}ù—2Oééé­[·F‡ý$¢/4cƌիW£+”4sæÌ+V +Hà[© ØØØÄÅÅ)õ=z¤Óé^¿~­Ô47...©©©¼y™3$¢/qåÊ???5]X°U«Vè’!33ÓÛÛûÓ§OèQ¾ÿþû 6(û5£¢¢† ¦ì×4+sçÎ]²d º‚è?â@â *5õÝZÈÞÞþÚµk:B2äç绺ºÞ¾}"JóæÍ³²²Ê•+§øWîß¿ÿ¡C‡ÿ²fB£Ñ\ºt©}ûö袿ƀÄ@TjC‡UÙmwÖ­[7eÊtÉ3a„ˆˆt…(¶¶¶ÉÉÉmÚ´ñÅ_¿~-mø‡Šøâæ aƹ¹¹+VD‡ý$¢Ò9zôhïÞ½ÑJjß¾ý¥K—4 :„dˆ „¿•ˆ#ÌŸ?_Ü×Wýÿ£Gþé§ŸÐD‰€¨ž>>éééèÅh4šøøxtÉ ½qIÇÇèQªV­*Òzõê™ò›JÏîöíÛ§¤¤˜ò›šR… +²²²LpJÑgâ@â ú|sçÎ]¶lºBI?üðÚ5kÐ$Ϻuë¤qè +¢££ûõëgúï{ïÞ=ggç÷ïß›þ[›†»»ûÕ«WE¨šè3q q}&é³}ûöjºéoË–-322DÜ_‰ÄQßIh%„††FEE¡¾{dd䨱cQßÝ/^}ŠÅÇÇçòåËæù‰uêZŠ® +Å€Ä@ô—Š‹‹Ûµk—––†Q ÏúµPýúõ;|ø0ºB” +*dgg7mÚò×TÝÕÊ•+çææ6hÐBÖˆ‰€è/-\¸pÑ¢Eè +%ñº–h×®]#FŒ@W9fÌtÅßQý×xM0Bá@â ú¿233½½½?}ú„Q ¯üm‰=z¤Óé^¿~%00ðôéÓ666è>yòdt…@«W¯ž6mº‚¬Q ùùù...wîÜA‡(†÷þ´DF£±S§N èQjÔ¨a0j×®ùgÒ;u·nݤ­‚…÷'$¢Æ·uëVt…’–,Y2wî\tɳzõjuߪùðáÃ}úôAW|®'OžhµÚW¯^¡CDiÙ²eff¦ƒƒ:„¬ÑŸ©ïz‹æ|‰úOnÞ¼éææVPP€eĈ;vì@WÈ‚®hÚ´iÒìDWá@â ú7õ]oÑÌ/±B©°°ÐÓÓ377"Šôâ/ýí*Uª„‘mÈ!ûöíCWˆ¢ÑhΟ?ß±cGtY $¢ëÛ·ï‘#GÐJÚ¶mÛ¨Q£Ð$ÏÌ™3W­Z…®E:ʼp႟Ÿ:¤4Þ¾}«Óéi*7¬]»]!ÐÁƒû÷ï® õã@â 2þþþ‰‰‰è%D‡(¦|ùòYYYÍš5C‡ ª¼ÕŸYÃåhû÷ïèÐ!t…(æÒ¥KíÛ·G‡ +q qu0`@tt4ºBI›7o7nº‚äY¾|ùœ9sÐ8q"88]!Ö‹/t:Ýï¿ÿŽ¥Q£F999¼®)މ€¬PTTÔ°aÃÐJ + <}ú4¯ÙgY¤ƒ*OOO5]ª„1cÆDFF¢+Láܹs]ºt¿¡‹c=ÿ*É”88ÈÚ¨ïs{5jÔ0 µk×F‡ ª¿™TÆ sss­çÇÆ&Lˆˆˆ@Wd ¿Ì!ã@â «b4;wî|éÒ%tˆ’:Ô·o_tÉ#½÷¬]»]!Šž8žŸŸïêêzûömtˆ(Öðq21$²*«V­š9s&ºBI#GŽÜ¾};º‚äIJJêØ±ãüeΜ9K—.EW˜Zff¦··÷§OŸÐ!¢|÷ÝwÇGWzp qõ¸qㆻ»{AA:D1 6ÌÉÉ©T©:„dxûö­““Óýû÷Ñ!¢8;;§¥¥YçÅã-Z¤îqüôÓO£GFWJp q•Pß)׿âÅ‹:t@‡<Æ ‹ŠŠBWˆbooŸžž®ÕjÑ!ÅÅž¾¾©©©èQ*T¨Ý´iSt©Y õrmgYXºcÇŽõêÕ ]!ô,›:u*ºéÞ½{ÎÎÎ*¾³›··wRRR™2eÐ!dñ88ÈHoW~~~F£¢—ÔÔTë<ËÂrI¯·Z­Vú"Н¯oBB‚F£A‡€mÙ²%,, ]!Ð’%KæÎ‹® ‹Ç€Ä@ª÷öí[N÷àÁtˆb®]»fµgYX®îÝ»ÇÅÅ¡+D©\¹rnnnƒ Ð!f!88øçŸFWˆbkk›œœÜ¦MtY6$R½Aƒ8p]¡¤ðððI“&¡+HÕÿT8***44]a.ž?.MôgÏž¡CDiÞ¼yVVV¹råÐ!dÁ88HÝbbbúô郮PRçÎÏ;Ç›þZÕŸÞ«W¯ØØXt…y9~üxÏž=Ñ}ÿý÷6l@Wã@â {üø±N§{õê:D1UªTÑëõ_ý5:„dPý•ajÕªe0¤?Ñ!fgäÈ‘;wîDWˆbcc„!KÅ€Ä@j%=¹ºvízæÌtˆ’<Ø¿tɳxñâ  +D‘ŽOž<Ù­[7tˆ9ÊËËsvv¾{÷.:D”:uêèõúêÕ«£CÈ"q qZ­[·î‡~@W()44TÅ×W«ììl//¯¢¢"tˆ(aaaè +󕜜ܡCßõ¹wïÞ111è +²HH¤J7oÞtwwÿøñ#:D1õêÕÓëõU«VE‡ ׯ_G‡ˆÒ¸q㜜GGGtˆY›3gÎòåËÑíÙ³gÈ!è +²<H¤>Ÿ>}òññÉÈÈ@‡(F£Ñœ?¾cÇŽè’gòäÉáááè +Qlmm“’’¼¼¼Ð!æNzEjÛ¶mzz::D^–J‡‰€ÔgÖ¬Y+W®DW(iúôé«V­BW<.\€¿È‹³`Á‚E‹¡+,í[·ÜÜÜÔô;É|}}/]ºÄÛ“,H¤2ê;ã¶U«Vè’A}·Ÿ+ÁÕÕ555ÕÎÎb1Ö¯_?uêTt…@ð#*²8H¤&>|pqqQÓ57ìíí¯]»&J¢CHžÁƒïß¿]!Š4GÓÓÓ[·n±$ÒÛ}·nÝNŸ>…/V$©ÉðáÃwïÞ®PÒš5kTv-#k‚®ˆ÷¢.õÝ™¤þº’dá@â Õ8vìX¯^½ÐJòõõMHHÐh4è’áÉ“'ÒAÞË—/Ñ!¢ð^Ô_B}÷&/aÆŒ*û‰Ã€Ä@ê =’µZ­ô':D1¼°†%RýiUªT‘–õë×G‡X°Aƒ8p]! +/YFŸ‰€T@zuïÞýÔ©Sè%íÛ·O:P@W<7nT÷¹1Ò‘ë€Ð–MõçMKè3q q +lÚ´iâĉè +%ñæš–èîÝ»...>|@‡ˆräÈt…\¾|¹cÇŽF£"ʰaÃvíÚ…® sÇ€Ä@–î—_~qssËÏÏG‡(¦nݺz½¾Zµjè’¡¸¸¸]»viiièQêÔ©c0ø°TÊÔ©Sׯ_®(::º_¿~è +2kHdѤ£®¶mÛ^»v ¢›¸¸¸   tɳpáBß‹KÅzxxH› +"JÕªUõz}½zõÐ!d¾88Ȣ͟?É’%è +%M™2eݺuè +’'33ÓÛÛûÓ§OèQ&MšŽ®P›œœOOÏ¢¢"tˆ(gÏžå£è?á@â Ë•’’âë뫦›þ¶hÑB:”,W®:„dÈÏÏwuu½}û6:D”æÍ›KËòåË£CThÅŠ³gÏFW´qãÆ & +ÈLq q…ÊËËsqqùõ×_Ñ!б³³KNNöðð@‡<ÒñMDDºB[[[éaÙ¦Mtˆ:FÿÄÄDtˆ(ÒnÌÊÊjÖ¬:„ÌY¨1cÆlÛ¶ ]¡¤åË—Ïš5 ]AòÄÇÇÂ_ÉÅY´hÑ‚ Ðj&½:;;¿{÷"Š««kjjª:„ÌY¢'NôèÑ]¡¤¶mÛ&&&–)SB2¼yóF§Ó=|ø"Š››[JJ +ÝDÛ¹sçÈ‘#ÑIRÅ‘§Rã@â ‹óüùs­VûìÙ3tˆb³³³›4i‚!y ®…'o˜R¿~ý>Œ®ÅÖÖ6))ÉËË Bæ…‰€,Îwß}wòäIt…’vîÜ9|øptɳoß¾!C† +Šˆˆ CWX‹/^ètºßÿ"J£Frrr*V¬ˆ!3€Ä@–%22rìØ±è +%õìÙóèÑ£è +’çñãÇÒáÚ«W¯Ð!¢ðަwîܹ.]ºÀ +Ä‘^º·lÙ‚® 3€Ä@äÞ½{ÎÎÎïß¿G‡(¦V­ZƒAúB2H¯Û]»v=sæ :DÞ %,,L݇È'NœFW¹à@â KQ\\ܾ}û””tˆblllNž<Ù­[7tɳ~ýú©S§¢+ŠŽŽîׯºÂ©þž5kÖ4 ¨£27Hd)¤— éÅ]¡¤ñãÇoÚ´ ]AòܺuËÍÍíãÇèQBCC£¢¢ÐÖKõw•îѣDZcÇÐd88È"deeyyy©éM±I“&ÙÙÙŽŽŽè’¡¸¸ØÇÇ'=="Jݺu CÕªUÑ!VmáÂ…ê¾hæöíÛÕ}ÙSúLHdþÔ÷kq[[Û+W®xzz¢CHžyóæ-]º]!ŠF£‰÷÷÷G‡X;ig¶k×.-- "J… +²³³›6mŠ!0$2ãÇß¼y3ºBIÒKÞüùóÑ$OJJН¯ïüeêÔ©k×®EWÐùí·ßœ?|ø€ÅÇÇçòå˼õ¡•ã@â 3§¾Kã¹»»_½z•wWµ,yyy®®®wîÜA‡ˆÒ¢E‹ÌÌÌråÊ¡CèÿÛ¼yóøñãÑ-[¶löìÙè +Bâ@â s¦¾›ãT¨P!++ë›o¾A‡]!ÏI3>|pqq¹{÷.:D”ºuëêõújÕª¡CÈÔ88È -_¾\eg$KÇX*þ©Z=zôH§Ó½~ý"J``àéÓ§yNšùKNNîСƒŠ/AÛ»wt™™›ììl//¯¢¢"tˆb5j”““S±bEtÉ`4;wî|éÒ%tˆ(5jÔ0 <'ÍRÌš5kåÊ•è +öíÛ7hÐ t™™•ÂÂB鸢F#D¶oßBòHoÓ§OGWtøðá>}ú +ès}úôÉÇÇ'##"JåÊ•õz}ýúõÑ!d:HdV&OžŽ®PÒüùóQ/pTj7oÞtss+((@‡ˆ2bĈ;v +HéaéîîþñãGtˆ(¾¾¾ B&€Ä@æãüùóß~û-üI¡ WW×ÔÔTÞôײµiÓ&77"ŠôÚ+ýí*Uª„!ÙÖ­[÷Ã? +Z»víÔ©SÑd"Hd&Þ¼yãääôàÁtˆbÊ—/Ÿ™™Ù¼ystɣ5Í… üüüÐ!TÒ1C×®]Ïœ9ƒÅÞÞþÚµk:B¦À€Ä@fbàÀDW(iÓ¦MãÇGW<ª¿ÜÊôéÓW­Z…® Ò{üø±t|üêÕ+tˆ(­ZµÊÈÈppp@‡pHdöîÝŠ®PÒ·ß~{æÌ^`Ѳäåå9;;«ø‚ë-[¶ÌÌÌä¡•¥Û¿ÿàÁƒÑÍœ9sÅŠè +މ€àÔwµõ5jèõú¯¾ú +BòŒ5Jŵ··OKKsrrB‡Ô÷+Ó?ã‰jV‚‰€°ŒFc@@ÀÅ‹Ñ!JŠŽŽîׯº‚ä9qâD=ЭZµJÝ6µ*êûÐT ü¨º5à@â ,õ]m}øðá;wîDW<ÏŸ?×jµÏž=C‡ˆÒ¶mÛÄÄÄ2eÊ CH1.\€EˆÃ×RÕã@â  7n¸»»«éjëü©•…êÓ§OLL ºBGGÇììì&Mš CHaS¦LÙ°aºB C‡õíÛ]A¢p qJaa¡§§§š®¶ÎóV-ÔöíÛG®hÇŽ#FŒ@WòÔwëôøy*uã@â ”éÓ§KÏ@t…’fÍšµ|ùrtÉ#½ +9;;¿{÷"J=Ž;†® Q²³³½¼¼ŠŠŠÐ!¢ðŠj*Æ€Ä@III;vTÓÕÖ¥ƒÈ´´´²eË¢CH£Ñèï˜ˆ¥fÍšƒõ"O¦±|ùò9sæ +Šˆˆ CWò88ÈôÞ¾}ëäätÿþ}tˆbìííÓÓÓµZ-:„äY±bÅìÙ³ÑÅÄÄôîÝ]Ab©~Ç–/_>++«Y³fèR™^hhèÞ½{ÑJZ¿~ýäÉ“Ñ$ú>ƒ^˜1c"##Ñd +ª?“ÍÍÍ-%%ÅÎÎBJâ@â ‹ AW(©S§Nñññ}¢¤ 0]Aò\¹rÅÏÏOMŸA/aöìÙË–-CW©½xñB«Õ>}ú"JãÆsrrÑ!¤ $2™ððp•(?xð`•}˜Á¨ï3è%ð‚TÖììÙ³AAAðC qÆ·yóft)ƒ‰€LãÖ­[nnn?~D‡(¦nݺz½¾Zµjè’gذaQQQè +QxA*’‘·nÝŠ®èäɓݻwGW88ÈŠ‹‹}||¤ãtˆb4M||¼¿¿?:„ä9vìX¯^½Ð­]»vêÔ©è +BÊËËsuu½sç:D”ZµjéõzÞÝB88ÈæÌ™£²[äJ/*»±5^î´Z­ô':D__ß„„i¢C,33ÓÛÛûÓ§OèQxkuà@â Ñ’““;tè ¦\¶lÙ2##£\¹rè’'88øçŸFWˆR¹råÜÜÜ  CÈ,­LcÇŽ#FŒ@WÐá@â ¡òòòœïÞ½‹QŒ½½}ZZš““:„äÙºuë¸qãÐEEE…††¢+È\·k×Nz±B‡ˆâèè˜Ý¤It• 5räÈ;w¢+”´jÕªéÓ§£+Hž{÷îICôýû÷èQzöìyôèQt™—ß~ûMzØøð"JÛ¶mË”)ƒ¡Râ@â qŽ?.— +”Ô®]»„„¾ßX£Ñèçç—””„¥V­ZƒAúBf'""b„ è +–/_>kÖ,t• "=´t:ݳgÏÐ!Šá9ÖjÉ’%óçÏGWˆbccsòäÉnݺ¡CÈIÇÁÁÁqqqèQììì’““=<<Ð!TH$‚*ßux޵%ÊÎÎöòò***B‡ˆ® ó¥ú‹_µhÑ"33“We°DH$ÂæÍ›Ç®PR¯^½bccÑ$Oaa¡»»ûõë×Ñ!¢4jÔ(77×ÑÑBfMõ·¿˜2eʺuëÐ$)N}Ÿ<«S§Ž^¯¯^½::„ä‘ 6lØ€®ÅÖÖ6))ÉËË B`øðá»wïFWˆbccsêÔ©.]º CH$R–ú®='½µÄÅÅ¡CHž .À_cÅY°`Á¢E‹ÐdÞ½{çääô¯ý "Jݺuõz}µjÕÐ!$)K}wŸ™4iRxx8º‚äyûö­N§{ðà:DWW×ÔÔT;;;tYŒ+W®øùù©éžŒ%„„„9r]A2p q‚222|||Ôtÿy~¼ÌB wîœ :„,ÒÍ›7ÝÝÝ?~üˆ¥S§NÒD£Ñ CèŸq q"Μ9ÓµkWøãYA>>>—/_æM-‹ôìÞ½û©S§Ð!¢ðœôåÖ¬Y3mÚ4t…@ëÖ­›2e +º‚þ}¹/^hµÚ§OŸ¢CS¡B…ììì¦M›¢CHžM›6Mœ8]!Oq¦/g4.^¼ˆÅÞÞ>==]zWB‡Ð?à@â /×·o_•]{aûöí#GŽDW<ê»E ½{÷މ‰AW<~üX:>~ýú5:Dé¥ --­lÙ²èú;Hô…¶mÛ6fÌt…’zôèqìØ1tÉ£¾P”P§NƒÁÀËœ“RöíÛ7dÈt…@³gÏ^¶lº‚þ} éß ““Óû÷ïÑ!Š©U«–^¯G=)¨Ô.\¨â»bñnt$ÂÀ<ˆ®E£Ñ\¼x±C‡èú88¨ÔŒFcÇŽ/_¾ŒQÒÉ“'»w y233½½½ÕtŠx7:áÍ›7:îáÇèQ6l˜““S©R%tý5$*µ%K–ÌŸ?]¡¤qãÆmÞ¼]Aòäç绺ºÞ¾}"JóæÍ¥…S¾|yt©Ðùóç¿ýö[ø¡ˆ8#GŽÜ¾};º‚þ•NVV–··wQQ:D17ÎÉÉqttD‡<'NÜ´iºB[[Ûäää6mÚ CHµ&Ož¬îß/:t¨oß¾è +ú HT +ׯ_G‡(F:̺r劧§':„ä‰ „¿Š³hÑ¢  +HÍÔ÷z^B5 CíÚµÑ!T•‚ú~æºpáBé•]Aò¨þ f77·””;;;t©\vv¶———š~£[B``àéÓ§yÿlsÀÄ@r©ïg®<̲P ˆŽŽFWˆR¾|ù¬¬¬fÍš¡CÈ*,]ºtÞ¼yè +6oÞ>žº‚…B‘——gooOð?ÂÃÃ###©+Ú»w¯¯¯/u…î „åÙ³g–––÷ïß§ŒAqqñ§Ÿ~Jü¤¥¥¹¹¹‘-Ù‰ŠŠZ¹r%u@sÎÎÎEEEÔ!¬´mÛ¶¼¼¼wïÞÔ!: +€ü•/¾øâàÁƒÔBÚ¼ysPPuðSSS£T*>|HŠ££cvvv«V­¨CþÄõë×mmm_¿~M +·p®\¹‚o@”0àO9rDb×È=zô… pÓ_Ñ™>}zjj*u+FFFååå}úô¡øK[¶lY¸p!uCëׯ_¾|9u…. „ôàÁ¥RùäÉêÁ˜˜˜¨TªîÝ»S‡?‰‰‰~~~Ô íØ±cöìÙÔ兀?þìÙ³Ô!¬èééåååÙÙÙQ‡è JÐLSSÓèÑ£/_¾L"¤C‡yzzRW?UUUÜ}úô)u+®®®çÎëR ý~þùgî›ñ—_~¡aÅÜܼ¤¤—áÒ0 JÐLll,íw…à|||©+€nˆŽ5*##ƒ:„•Ž;ªÕê.]ºP‡ü#ÇŽ›`Àî$ÒÀÀ€:øY±b…„g›\.¿té÷½FÐBK—.åNž¨+:xðàŒ3¨+t% ø×ÿ¿°keeu÷î]êÁèëë)•Jêà'77wذaR¢Íp'O{ tôÞ,ÚŒ‰‰ ÷O×£Gêéà„__ߤ¤$ê +!ÅÄÄ,^¼˜ºø©­­å†è­[·¨CX177/--Å«R vW¯^µ³³“ð§tF•––†Kô²†@ ¤wq·!C†dffÊårêà' `×®]Ô¬èëëZZZR‡@ò×銋‹ ¦®8 J:Nz·w166V©TxõVtNž<9iÒ$ê +†6lذlÙ2ê +aHþNÜb/..¶°° ‘2 JºL’7xß¿ÿ_|A]üTWWsCôÑ£GÔ!¬8;;_¹r¥U«VÔ!‚‘ü½º­­­ + +Z·nM"Y”0tÙ–-[.\H]!¤)S¦>|˜ºx›:uê‘#G¨+XiÛ¶myyyïÞ½©C–œœìããC]ÁÐÊ•+£¢¢¨+$ €€Îº~ýº­­íëׯ©Cƒ{¸ˆÔ®]»¨+Ú½{·¿¿?u3fÌøî»ï¨+X‘Ëå—/_6luˆ4aPÂÐMÎÎÎEEEÔ!‚‘ÉdgÏžuss£~¸ƒ€••Õ‹/¨CX™4iÒñãÇ©+Xyöì™R©üé§Ÿ¨CXéÙ³gEEîÜÇ% Ý&±—5CBBbcc©+€Ÿ¦¦¦#F\¹r…:„•N:©Õjªc,€f¤§§»ºº’ŸÏ°3kÖ¬;wRWH% ”——7tèP)ÝkÉÜܼ¤¤ÄÐÐ:øY¿~}hh(uC‡ž2e +us .ܲe uC©©©S§N¥® Jº¦¶¶ÖÚÚúǤŒžž7iììì¨C€ÉßKhöìÙ;vì ®ÐîÙÞÞþûï¿§a¥cÇŽjµºK—.Ô!’‚@ @×Hï^Këׯ_¾|9uðS__ïàà R©¨CXéÙ³geee»ví¨C4¤¬¬ÌÑÑñ×_¥aÅÕÕõܹs¸=°€0(aè”'NxxxPW —W©%K–ÄÄÄPW°‚+‡€nZ»víêÕ«©+Š ¤® Jº£ººÚÂÂâñãÇÔ!‚ÁåÕE*''gøðáRúJ3¡¡¡ëÖ­£®Ð´¦¦&—¬¬,êVŒŒŒÊÊÊúöíK"”0tÇĉO:E]!¤½{÷úúúRW?/^¼P*•÷îÝ£aÅÊʪ°°wÝtçÎî[àåË—Ô!¬ØÙÙåååéééQ‡H% ?wî\ê +!yxx;vŒºxóóóKLL¤®`E__¿¸¸ØÂ‚:€LBB‚´ß'óJûNƒ@ @HïW2;wV«ÕÜ©C€é} +¥™˜˜˜Å‹SW›:uê‘#G¨+XQ(999¤= J’רØ8dÈ‚‚êÁÈd²Ó§O»»»S‡?ÜÑF©TJéS(Ípßh™™™r¹œ:€Xuu5÷ÍþèÑ#êVz÷î]^^Þ¶m[êqà„ ykÖ¬¡®Ò‚ ¤}Ç©š0a·Ü¨+X166®¬¬ü裨C´ÂÉ“''MšD]Á~½? JÒVZZêèèØÐÐ@"˜~ýúqÿPmÚ´¡~¤÷)”f’’’¼½½©+´ÈìÙ³wîÜI]Á +^‹~”0$ìõë×6667nÜ ŒB¡ÈÍÍupp ~¤÷)”fð‘t€?’Þç›ùðÃÕju‡¨CÄ +€€„Í›7oûöíÔBŠŒŒ £®~$ip|$à¯äçç2DÂ7ýÀø”0¤*--ÍÍÍü L@ŽŽŽÙÙÙ¸é¯èHûæ 2™ìÔ©SãÆ£ÐRaaaQQQÔ %&&úøøPWˆ% Iª©©Q*•>¤Œ‘‘QyyyŸ>}¨C€î¿Ú Aƒ~ýõWêVæÍ›·mÛ6ê +íÕØØèìì\TTDб±qEEwJC">”0$iúôé©©©ÔBJHH ®~êëëíííÕj5u+½zõª¬¬Ä¥Þíúõë666uuuÔ!¬ <833/Pó…@ @zvïÞ=kÖ,ê +!Mœ8ñĉÔÀÛ¢E‹âââ¨+XQ(ÙÙÙƒ ¢Í›7SW0ôõ×_/]º”ºBd0(aH ÷¯ÔÊÊêÅ‹Ô!‚éÔ©“Z­¦ú*…»téÒ˜1cššš¨CXY½z5Õ.ÑáÎvÆwîÜ9êVôõõ ---©CÄ€€”p'[#FŒ¸rå +uˆNž<9aÂê +àçùóçJ¥òþýûÔ!¬ØØØäçç·nÝš:@4~þùgî°ðË/¿P‡°bnn^ZZj``@"”0¤dݺu«V­¢®R```||..NÚïf`ÇÛÛ{ß¾}Ô¬Èåòôôô#FP‡ˆ% ixóæƒƒƒ”.·¢P(²²²©C€É¿Ê?räHî¼L&£¥çÏŸ[ZZÞ»w:„333•JejjJ"”0¤!88xóæÍÔB +ˆˆ ®~¸ÚøñãÏž=KЉ‰Ieee=¨CD,;;ÛÅÅE·öòòJNN¦® JpñâÅ1cÆ- ÈÆÆ¦  @OO:øÙºukPPuCøüóÏ©+DoÉ’%111Ô :tÈÓÓ“ºBÛaP»gÏž)•ÊŸ~ú‰:D0mÚ´)++ûä“O¨C€ŸÛ·o[YY½zõŠ:„•É“'9r„º@ +êëëT*u+&&&Ü?]÷îÝ©C´% ±›1cÆwß}G]!¤mÛ¶Í›7ºøill}ÚÝÝ:„% íôêÕ+kkë[·nQ‡F__¿°°ÐÒÒ’:ø©©©Q*•>¤a—ãÐfµµµÜOÃü‘:„•®]»ªTª:P‡À „ üýý÷îÝK]!¤èèè%K–PWožžž)))Ô¬•——÷éÓ‡:þR^^ÞСC¥ôzx3Ÿ}öÙÑ£G©+`PÂÐBÇçÔB2dHFF~É*:III¾¾¾Ô á–œ¢°jÕªuëÖQW0Äl½½½©+4 €€¶áþ‹XXXp¤Œ±±qeeåG}DüTUU)•ʧOŸR‡°âêêzîÜ9™LF£±±ÑÉÉIJ×ÄkF7PbPÂÐ*Ü×Ä Μ9C"¤ääd///ê +à§©©iÔ¨QÔ!¬tìØQ­VwéÒ…:þéݧ|©€€VÙ¶mÛ‚ ¨+„4yòä#GŽPWo111ÒþÌFJJÊ´iÓ¨+€‡¸¸¸E‹QW0¤k–à„ =nß¾meeõêÕ+êÁèòÅ Dí‡~°³³“ðoÚüüüöìÙC]üp§LãÆ;wîu+úúúEEEJ¥’:DC0(ah‰ÆÆÆÁƒR‡F&“9sfìØ±Ô!ÀOCCƒ““SII u+fffÜ.555¥Þ~þùg ‹'OžP‡°2`Àîð«#7ÌÁ „ %ÂÃÃ###©+„G]¼IïþÓÿM.—_ºtiøðáÔ!ÐBG2e +uCK—.ýú믩+4€€6àæ¾““SCCuˆ`ú÷ï_ZZjhhHüHþzÛºó“@¼¼¼öïßO]ÁŠ\.¿xñ¢‹‹ us”0ÈÕÖÖÚØØÜ¼y“:D0 +…‚;´··§~$ÇMsssn—êÈkëöüùs¥Ryÿþ}êVt䊔0È&$$PWiݺu¡¡¡ÔÀ[@@À®]»¨+XÑ××/,,´´´¤dgg>¼©©‰:„ŸÄÄDê +¶0(aÐ:þ¼»»;ù—€œ¯\¹¢SW2–†“'ONš4‰º‚¡ 6,[¶ŒºÃÀÅÆÆRW0tèÐ!OOOê +†0(aª®®V*•=¢Œ‘‘QEEEïÞ½©C€Ÿšš )})6ƒ] + =õõõ*•Š:„{÷îÔ!¬`P 4uêT‰Ý$k÷îÝþþþÔÀÛ´iÓ>L]ÁJÛ¶mËË˱K¤çêÕ«vvvoÞ¼¡aeôèÑ.\ÉdÔ!L`P ’H]!¤I“&?~œºxãfÛ¬Y³¨+Â.° 6¬X±‚º‚¡-[¶,X°€º‚ J$îܹceeõòåKêÁtîÜY¥RQ}-A‹q߃ܗâ‹/¨CXÁ.¶¦¦¦‘#GfffR‡°b``PRR2`ÀêáaPÂÐ<îhåââ’••E"™LvòäÉñãÇS‡?Ü—âˆ#®\¹BÂJ§NÔj5v)€´UUU)•ʧOŸR‡°bcc“ŸŸßºukêaPÂмÈÈÈððpê +!Í›7oÛ¶mÔÀ›ä_:?|ø°´ï +¿Ù»w¯´ßé·zõjªsev0(ahXYYÙ Aƒ¤tÓß?þ¸¢¢¢mÛ¶Ô!Àä?< ±;lÀ;xzz¦¤¤PW°"—Ë333‡ B"$ JšÄlq§\܉uˆ` +ENNÎÀ©C€É_>¯gÏž•••íÚµ£ ©©©Q*•>¤a¥W¯^R:¬aPÂФ Hì­2{;“ŽXºt)wø£®`E.—_¾|yذaÔ! QiiinnnägVìÆÇÇSW€€Æ¤§§»ºº’ÿ]^^žžžuð“““3|øð·oßR‡°ºnÝ:ê + 0þüo¿ý–º‚¡“'ON˜0ºB”04Cz/M•••õíÛ—:øyñâ…¥¥åÝ»w©CX±²²*,,”Þå2àŸxýúµÍ7¨CX‘ÒÅÍ0(ah†ô>œ/±™é??¿ÄÄDê +Vôõõ‹ŠŠ¸±MdJKK¥t±f&NœxâÄ ê +`PÂÐé]žÌÍÍíìÙ³R½9¹„q?3<<<¨+Љ‰Y¼x1u‹ˆˆX³f uC;wî”ÀÜ1(a°v÷î]KKK)ÝiµcÇŽjµºK—.Ô!ÀOuuµ……ÅãÇ©CX2dHff¦\.§bÜ¡  €:„##£òòò>}úP‡¼ JLIòå©©©S§N¥®Þ&L˜púôiê +VŒ+++?úè#êÐ +·oß¶¶¶~ùò%u+NNNYYY­Zµ¢i9 JL­_¿>44”ºBH¸¹’HíØ±cΜ9Ô %%%y{{SW€Ù¾}û¼yó¨+ŠŠŠZ¹r%uEËaPÂ`§¢¢bàÀ¿þú+uˆ`ps%‘ºs玕••„æááqìØ1ê +Ð:Ò~åS¡PäååÙÛÛS‡´% Fêëë¹ïIµZM"¹\ž‘‘1tèPêà§©©ÉÅÅ%++‹:„•Î;sßhÜ©C@ëHþ³Oýû÷/--544¤i JŒ„„„lܸ‘ºBHaaa‘‘‘ÔÀ[TT÷ߎº‚™LvêÔ©qãÆQ‡€–’üÕÏ‚ƒƒãââ¨+Z€ —.]3fLSSuˆ`lllòóóqs%Ñ)//4h”Þ‡ÖÌܹs¥}×Ox3gÎܳgu+2™ìÌ™3cÇŽ¥á €€àž={fiiyÿþ}êÁúé§Ô!ÀôÞ‡ÖL¯^½***ð¡x·ÚÚZ++«[·nQ‡°ÒµkW•JÕ¡Cê~0(a.77wâĉOž<¡ÌæÍ›ƒ‚‚¨+€7i_C¡Pdee9::R‡€äää >üíÛ·Ô!LÌœ9sãÆ¢ûm% =zpæÌêŒ=úÂ… ¸é¯q‡—„„„Å‹×ÖÖR·oõêÕT?9@ŒBCCׯ_O]!°N:ÅÇÇöÙgÔ!-@ €‘ßνBBB^¿~MÝÒr¦¦¦•••Ý»w§–»sçŽOnn.uˆð¡à«¡¡ÁÙÙ¹¸¸˜:D0®®®»wïîÚµ+uH aPÂ`êÚµk^^^eeeÔ!-ôÝwßMŸ>ºÞWcccLLLxx¸4> Œ¥@Ëp?”mmmëêê¨CÞ—¡¡áW_},ê×ç1(a°Æ{­ý¢{롯¯ïÞ½{©+@0ÜI³··÷7¨CÞW\\÷cºDiãÆ!!!ÔïÅÁÁ!99¹oß¾Ô!ï €€fpç^"º™™™J¥255¥!ÕÕÕEDDDGG‹÷µ#GŽLOOõ/½€wÞåîî~þüyê–P(Üikdd¤žžu‹0(ahÌË—/—,Y²cÇê¿'—Ë/]º4|øpê`ââÅ‹þþþUUUÔ!¼™˜˜TVVöèу:DìÁƒJ¥RtëëÕ«WRR’³³3uˆ`0(ahØÑ£GçÌ™SSSCò.Ë—/—Þ¥à¿=þ<((hß¾}Ô!ü8pàóÏ?§®Ñ;räÈÔ©S©+xðööÞ¶m[Û¶m©C„„@ @ó¸ç§N¢ùs ())100 æRSSçÎ+–_ƒMž<™û™M]ñÅ_:::00:„! J´~»@ûêÕ«¨[þ5tèÐŒŒ ¹\N®]»æíí]ZZJò'‚‚‚6oÞL]²qãFêŠæ“’’z÷îMÂ% mPTTÄ{ݼy“°×W­š£¿ëׯ7KÚ´iCT__ooo¯V«©CþCOOoåÊ•Üq¸U«VÔ-ÌaPÂÐuuu+V¬Ø¼y3Õ—®¯¿Ñ†9ú;…B‘““3pà@ê¬ŠŠ +î £ 7J777ß·oŸµµ5uˆ†`PÂÐ*.\ð÷÷øð¡†ŸwÊ”)‡Öð“‚Ö"Ÿ£¿‹ˆˆ§mÉ[¿~}hh(a€L&›={ö7ß|£S¯vbPÂÐ6ÕÕÕÜQàĉ{Ænݺ©T*\_šIKK›9s惨lmmóóó¥qÃKÐfMMM#FŒ¸rå +ɳwïÞ=11ÑÅÅ…äÙ aPÂÐN»H¨\.OOOç|¬ŸÄèÙ³gÜ×á4ÿÔmÚ´)++ûä“O4ÿÔ ƒ¸++«/^høy§M›¶}ûvÝü% ­u÷î]Ÿììl¦ÏËô)@ìRSSçÌ™óôéSM>éÖ­[çÏŸ¯Ég·gÏž™3gjì錷lÙâå奱gÔ6”0´ÙÛ·o¹¯ÑððpFN277/))144dñà %÷ïß÷óóËÈÈÐÌÓ=úÂ… 2™L3Oð›éÓ§§¦¦jà‰FÅí 333 <—Ö „ ý¸stooïëׯ û°úúú………–––Â>,HÕo÷ yýú5Ó'211Q©TÝ»wgú,TSS£T*™^ŠÃÀÀ`Íš5K—.Å]w0(aˆB]]]DDDtt´€7,ܰaòeË„z4Ð?üð7GËÊÊØ=Å¡C‡<==Ù=>À;¤¥¥¹¹¹1:=³°°Ø·o·1X<¸è`P‘ôôtA®Ê2xðàÌÌL]¸Ï®¡¡!**jíÚµoß¾üÁ½¼¼’““X€nÞ¼yÛ·oö1åryPPPtttëÖ­…}dñ „ .‚\•ÅØØ¸¢¢‚û÷/P袂‚ŸüQÀÇìÖ­›Z­655ð1øzýúµÍ7„z@înbbâСC…z@iÀ „ FïyUî0ĺ ›:ˆûºiÓ&AM&“={ÖÍÍMGx¥¥¥ŽŽŽ ïÿPÞÞÞ[·nm×®Ýû?”Ä`P©{÷îùúú¶à®%Ÿ}öÙÑ£GY$n:þüÌ™3ßÿ3s¸"-h•5kÖDDD¼Ï#têÔiÇŽB%I % ñâ¾x6mÚ´|ùòúúúø·tíÚU¥RuèÐièšêêêÀÀÀãÇ·øú÷ï_ZZŠ+Ò€öhllíîî®*ÐA©©©Ü xöìß¿Q¡PäååÙÛÛ³¨h±Û·o[YY½zõŠ×ßehhøÕW_ãf&ï†@ @Þ¼y³fÍš¿½HhPPÐæÍ›5V:¨eïL‹ŠŠZ¹r%£$€÷ñí·ßòº+¹ƒƒCrrrß¾}Ù%I% ɸté’ŸŸ_UUÕŸþ¯ýúõ+--mÓ¦†«@×ð}gš££cvv6®H Ú‰;¦M˜0áÌ™3ûW* +îœ222ROOOa€@ @Jž?¾páÂ?^F;*åææ:88Tºzõª——WEEÅ»ÿ2##£òòò>}úh¦ + ¸3%¥Rùøñãwü5½zõJJJrvvÖX•`PžÔÔÔ¹sç>yòä÷?³víÚU«V&ú'÷ ‹ Ôd@ œ8qâ¯.æ#“ÉfÏžkdd¤á*±Ã „ I?ýô“¯¯oFF÷;99eeeá-@"//ÏÇÇçöíÛüŸ\]]Ï;‡É€(øûûïÝ»·ÙŸäΠvîÜ9~üxŠ"Ñà„ UÜ—VBBBXXXnn.Þb„^¼x±téÒ;vü÷Ÿìر£Z­îÒ¥ U/¯^½²¶¶¾uëÖïfÊ”)Û·oçŽf„U¢†@ @Ú¸VÛ¶m©+þuôèÑ9sæÔÔÔüöÿ¦¤¤L›66 €—ÜÜÜaƽ}û¶}ûöÑÑÑxã{ „šÁmfÏž}òäI??¿={öPçð¶bÅŠìì줤¤?þ˜ºEô0(a€ÆpG<‡‡±±1u o ­Zµ’ËåÔ!R€@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 J a”0@Ã0(a€†aP à„†@ 4 €h% Ð0 JÿÇÞ}‡Eu­û§‹¢  \„«¹ö;ˆ-Š…(ÖÄn̵>ŠF'õ±Ô£ØX{¹vPì¨Xト€ (ðüÞs—‹8ÎìµöZÃðýüÁCŒó®åÌ.ë»gïµ@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™@0™$+++ooo)M€D‰‰‰IIIRšFC@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(G A@€rÊ(Gd77·sçÎIi$ZµjÕßÿþw)M#È ÿþïÿþßÿýßRš‰þú׿þío“Ò4ˆ† † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † † @9DƒÀ{÷îÝ¿ßÙÙ¹oß¾‚[G À襥¥Ñp?&&¦ègRR’æýçþçßÿþwÁýA ÀÈ”îß¹s'99ùc@0&%†ûÑÑÑ4ÀÓýå‚! (ôÓO?­\¹2##ƒ¥€` +9rÓ¦MŒEC@P@€² +@€² +@€² +@€² +@€² +@€² +@€² +@€² +@nÞ½{GofBBBrrrJJÊ›7o233égZZÚ›BôŸéééô÷é÷üü|Í ³²²ŠêTªT©B… +U«Vµ´´¬R¥JÅŠ­­­mmmé?íììè9;;»ººj~º¸¸8::Jû7€T + èôÑÑÑ÷îÝK(DÃ}ÍOz'¥ôÇÆÆ¦~ýú 6ô.Ô¨Q#)=Á@@ø„¼¼¼¸¸8î_¿~=&&†~¹ÿ¾ôOM»ÚµkûêÒ¥‹­­­ìî€Z@@ÐfĈÛ·o÷îìŽ(T¡B…víÚõèÑcРA²>eP€Úüå/ù¯ÿú/Ù½àÀÜÜÜÇÇg̘1þþþVVV²»| (€€ Ñ€"NNNÆ £ýÜÃÃCv_€€Ú_Ð033ëÞ½ûœ9sZµj%»/ €Úk(Ò¹sçiÓ¦uëÖMvG@ ´1ú Ñ°aÃ9s昚šÊî è@mÊIÐðööž6mÚàÁƒÍÍÍe÷t‚ €6å*h4hÐ 88¸]»v²;Ÿ† €6å0˜®°{÷nÙ€O@P@›òˆ••ÕöíÛdw´AP@›rL +×Û°aÈ#dw> +@mÊs0)\.`ãÆÃ‡—Ý(€Ú”ó`Rø=ÀÖ­[(»#P +´A0)Ì;wîüúë¯ewJBP@ +*9r¤sçβ;ÿ€Ú qpp¸víZ­Zµdwþ€Ú ײeËóçÏW¨PAvGà (€€ ÚÀÜÜÜÖÖ¶è?mll¬¬¬è—ìììÜÜÜÌÌ̼¼<õZW`ܸqÁÁÁ²{ÿ@mx€ÀÀÀîÝ»;üKåBvvvº¼6---??Ÿ>¦gÿK?ÿüóÏÔÔTö¾éëðáÃôoß.|@mx€_ýõ»ï¾c¯SÂÓ§O/]ºtñâÅcÇŽÅÅÅq¯_ª:uêܹsÇÂÂBLs €Úx(îáÇ[·n]¿~ýË—/UmˆlذaôèÑj·Ÿ„ €6e(häææþãÿX¶lÙ;wÔkÅÉÉéÉ“'UªTQ¯ Ѐڔ¹ AÕéÓ§iËŽŽŽV©‰5kÖL˜0A¥â #´)£@ãÝ»wóæÍ[²dI~~>÷âmÚ´¹té÷² ´)Ó@ãøñã HOOç[ÖÔÔôéÓ§ô ò- zAP@#$::ÚÇÇçÕ«W|Ë.[¶lÚ´i|k€^@@ÐÆ89þ¼ŸŸß»wï8ÖlÕªÕåË—9}!(€€ Ñ²zõêÉ“'s,hii™‘‘ammͱ&è@mŒ)Ж֭[·ãÇs¬yõêÕæÍ›s,¨žüüü„„„gÏž%%%¥§§StÉ,D^¥½½=ý¬^½:m–îîîVVV²»  ::þ?}ú”vÔÔÔô©Zµ*íNNN...š_ªU«&»§†.+++''‡Þ=úåÝ»wšã 1¦K$t´Œ§ æÅ‹šMåõë×ô籠FÎÎÎE¿ØØØÈ{ûö-½ut&¢·ÑÂÂÂÎÎÎÖÖ–v=eÕ@@ÐÆ˜€IáÊÁ^^^yyy¼ +®[·nìØ±¼ªñE‡×ÈÈHúø._¾Lãþ¸¸¸÷ïßëøZ33³5jÔªU«I“&>>>;v¤Ó¹ª½ƒv„3gÎÐ~qûöí?ÿüóÍ›7º¼ÊÒÒ’Æv4°£H£F7nܰaCŠj÷ÖP@¢S?ÿ»PRRRvv6ahèVôËÇ^NoêÜÜÜè|çááAG•/T§NÿÊ@ÿvÚNhk9wî܃bccu¼´R¥J4® £hƒ hƒiX¨Ü.óðáȈÚrèLT´ Ñ{[ê_¦­…€££cÓ¦M[µjÕ²eËúõë›››ko@mŒ,¯¿þ:44”WµÑ£GoذW5.?~¼gÏžS§NÑè?''‡KMÊš$ЧOŸ/¾øÂÔÔ”KYÅhЦ{˜Ñ‚N*¶¶¶ìuôB§=sRÑ(ªråÊjôG ^ï3{,,,Øë(–ŸŸþüyÚ/Nž<ùäÉ^ei,Û«P‡äþùJKK»wïÞõë×cbbè—›7oÒ(Ÿ{+ôŽyzz6+D#<í988poE™ÌÌ̃îß¿ÿìÙ³©©©\jÒa³E‹þþþ={öôööæRÓÑÈêĉ§OŸ¦“ÑóçÏYJÙØØÐFBa€ÞºvíÚ•zBP@ã 4èØ±#¯jt0ºpá¯j,âãã÷íÛGCœˆˆU÷)77·¾}ûRŽjÛ¶­¬$0eÊ”U«V±×¡Ñÿ«W¯>ym‰/ƒ~ùå—ú¾ª^½z4S£?ZüÇüÇŸþÉX„ÒcRR’““—.é‹vÏ;wÒ®‘œœ¬^+ööö´SLŸ>ÝËËK½VTõôéS¨]¼xñܹsqqqâ; ¹Êà[¨}ûö*T߇ÜÜ\ÚTþñ;vŒ×Õ“RÕ®]{øðá4ÜT|Ç‹Ázûöí¡C‡BBBŽ?ÎåòA E' :ùÿs´1¾@>ûì3:Ûq)EÇqö#:gÓáƒNÞ‚w%OOÏ™3g:TüµÏ'NtéÒ…K©›7o6nܘK));ÜSÖzùò¥ÈK¤4bvvvf¯Ó²eË+W®°×Ñ í 4 +Y¸p¡ÈyºhÛ½{÷ü‘þÉÂU,???::úüùó4⧘D[—ìý¯Ê•+GFF6hÐ@X‹YYY7n¤ñãµj½Ð?sĈ3f̨Q£†°FÕµjÕª°°05¾/úPݺu'L˜ðí·ßV¬XÑ@mŒ2ðº~LèÐ#æ`WªˆˆˆE‹Ñ@GVˆ‡‡½ŸãÆyÅ.77·Zµj:Þ½­îé Ï^GwŠ÷©Ã‡Óø’{>&44ô믿f¯C§·Ÿ~ú‰½ŽŽ + + +víÚEûÅÝ»w…5Z½ok֬៸{õêÕ±cÇÂÃÃ?ž––&»;¥377ýúµ˜{Þ222V®\IÇ^·úè‹N"³gÏ + +²´´”Òv=š3g1ÄçèD@Cÿ‰'RðFЀ6FNŸ>íëëË«¨ìììxUÓÑÇ'MšÄwF#µjÕ¢CIß¾}…µøÕW_Ñ€˜½N``àÎ;Ùëè(//ÏÞÞ^Yt¡Q‚ ¸wécxåäË—/·jÕŠ½Ž.®^½JûEdd¤˜æ´¨Zµê’%KF-ý¤¤¤½….^¼Èq•4hÐàÎ;j·BYqÛ¶m4òVõö0y{{oܸ±L|wT¥&úÿþûïjÜí£; +Qt\MLLd¬ƒ €h¼îmÐxðàȳ³³—.]ºxñâÜÜ\aê¨sçÎk×®­[·®€¶~ùå.Wî]]]E~é¥x4Ü©S§3gÎðí-Z´¸víc:À +xÊ‚>Ä3fP–“~B)ÎÏÏoË–-r' ¢ÁYHHû?6éŠúöÛoÿøãU›¸páÂäÉ“oܸ¡j+z¡ÝdÚ´iòËÊåáááãÆcvÁ$¨Zµª‚™XJEc2™q)õI‡?~¼”GôtT¡B…   ¹sçª}£§víÚ\J={öÌÃÃK©OZ±b…ânÅŠi£sŸ@VV–½½=ûU½Aƒmß¾K—´ È7ß|c˜7´T¯^}ÇŽ¿rÔ—'¹Sõ|‘ŸŸ?¿a&¢víÚíÞ½ÛÀŸ +HNN¦±2Çùô €`4jÔ(::šK):»8K)-h7Yºté¬Y³ ó¤UBûöí÷ìÙ£önåååõèÑ#ö:Û¶m&//oÁ‚;˜Ó077Ÿ3g¥b333ñ­—Å ÞvN§{ÚÙO:¥Fq^¤‡Fí®\¹Ò³gÏ””Ùá@0 :tèÀkúÎåË—O:•K©ÉÌÌ6lØTm…/777é¶hÑB½&&Ož¼zõjö:´eÒöÉ^G.../^¼Pürú÷Nœ8‘c>fÞ¼yìOîª=(½“_ýõÅ‹UªÏe¿J•* n·Ì++«ŒŒ 5&8þü€Xv@a,,,hp6iÒ$Ù)),,lРA§¾P€`ðz„”L›6mÙ²e\J•êÉ“'ÔÛ‡ª×„J*V¬¸eË.3É”êøñã]»ve¯ãííÍëë í=zÄø¸ _víÚÅ«?Z|ùå—'Ožd,Bñ/**ŠK>DƒZúô9®ê%@£F<èîî.²Ñ2š7o~õêUîe÷ïßO#WUg÷çnÔ¨Qtê4œÙ¨3'NÌÏϗݵ †€ AŸ>}x]PWõyµ˜˜??¿²û”•¹¹ùºuëè4¦Fq:—;::²_‹233KII0Åþ¦M›FŽÉRAÌ#Ët‚§7–ý!™¹sçΛ7K—J b=ÊâM...aaaª~3VB™ j|#G£ºÉ“'ò}bÓ®]»}ûöU¯^]vGþÿ×ôÊî…ºC@€ã-@êÝ@ríÚµnݺÔ= +˜ššÒQF¥»¤hxäÈö:b¦Øç²TM\\\Íš5¹ôçcnܸѬY3ö:‘‘‘­[·f¯S±cDz²²¸W£R¥J—/_öööÓ\™ ¿ÿþûˆ#8üá‡/^̱ ` 6ŒŠŠ’²4r:p5JúhMm‚! HP¿~ý˜˜.¥¦OŸ¾téR.¥Š;{ölÏž=¹¬ue.\H§aîe×®];aÂö:³fÍúùçŸÙëhçééùøñcÆ";wî äÒŸ¡S û“*MzóæÍöíÛ—ÝÑ¿FË–-#""ÌŽjR@tt4Çt´|ùòiÓ¦ñª&‹z_¦é"$$døðáeñû}!†€ }âô¹s)EÇe::s)UäÑ£G­Zµzýú5ß²rýñÇß~û-ßš¼&íØ±#%.ö:ZðZ}‚†æ\}Ö‚ÆîÝ»‹ 8pÇŽ\úS$11‘ö ‘ë6¨gåÊ•bn¨([ R¥Jééé¼&>räH¯^½ŒàžuzC®^½Ú¸qcñMŸ9sÆÏÏÏÞC] †€ Ú»wïlllx-‡É} ÌÌÌ/¾øâÞ½{kkkë‹/r¹·¤8.—Õ+V¬HqËÊÊŠK—JµwïÞ€€ö:ô²¯Ï¥]Íš5ÙÙ!!!C‡åÒ·oßRNSãñP)h¤{çÎ^kYhQ¶@»víxÝœyëÖ­öíÛÍ—¨"¿5*’––F©ÃWžá @0ÑîÞ½Ëñ+æ 6Œ=šWµ‚‚‚Þ½{‡‡‡ó*hP<<zô(—É(5~úé'‰÷z +àççwìØ1Ž+"Qµnݺ±×Y¶l™ª÷ +·lÙ’×ÕkÚ%}||¸”úжmÛØ¯ÜsŸÉ‘Ëc ˆFWêÍ“«Q¶ÀöíÛ ÄX„½zõ:tè—.Ž*Uªh^?ÆÜÜÜ©íƒ)…Ô~ðÑÍ͆t666ê5Q¶À£G>ÿüsÆ"Â&¬´¶¶¦ÁhOJJbŸ9÷“(œ‡„„¨Ý +‰¯W¯žÑÜ@¥#ÁDã²È‘†©©) =é4À^ŠN!Mš4a¿]•*Uòððpww¯Y³¦¥¥e\\ܳgÏbccÅî+T¨pýúõúõëó*Èe2P:‹Ó¡€>P.]*ךeªÞ:Ò AöçO.]ºÔ¦M.ýÉÉÉiÕª•J+µÑÈ›ÞÌîÝ»SÀ ³ ý‹7E£Ê´w„‡‡‡††Þ¿_>Ìž={Á‚jTÖlmmèͬ\¹r•*U(ªÑ§–‘‘A‰—ÆÄô»Žá­jÕª¯^½bÜU‹ØèhÓ­[7OOOêpñÿ›››KÌÝ»w÷íÛ·ÿ~5fp¦7çìÙ³:tà^¹„€€€½{÷ªÝJ ‹êÕ«ÓHRjjêËBïÞ½Ö Á„¢exY8.ÌDïϺu블ú¹¹y§NèÓlÙ²eãÆKýktö}øðadd$ àŽ=ªÞ5צM›^¾|™× +—¼îá;ÿ`q3fÌà8W, ³è“Rc}P::;;3“íííiÄëiE^ÏN”@a›ö¸ÀÀ@°êø’˜˜˜={ö¬^½:--cO(Ó‘†ékÇ7P@úì³ÏèÝkÔ¨ýBÅég‰qð‡è I}xò/÷ }øí + N:ÅÒ½¼¼<꽟,E>DÃî>}úŒ=šâ¢Ž·/æççÓH}Û¶m!!!|¿G¢øµk×T}øäÉ“ô/U¯¾Iáä ­[·nUÈÝݽÔÃ(C&''ß¾}û¿ +ѹIÕ.™ ‡€ ß›‰Û·oþüyö:tÚ£®û¥}6¬Zµjz½¾¡¡¡t€PéÂçâÅ‹©c\J=}ú”F!ìuhl§Òæ-Z´à;uÅ':qr,¨±sçNö;°iTMu¸ô‡‹õêÕãu딆n¿ÿþ{eC(‘mݺ•ãÞ@Ñ‚Wµ¸úzôèáããÓ®];Ý#“ééé´ GFF^,”››kR˜“WìZ·n÷ Uƒƒƒ;wî¬ìå7oÞ;v,ßGb6mÚ4|øpŽ‹{÷î]Æ UmתUküøñß|ó‚© h4¦Ò—‚! ˆ“Mg²ØØX^øá‡… 2¡]€sÜç7¤ñ PgÍšÅr‡1½è³£#÷Û[iFw.Õ>ÿüs,2Qé1zëù>Ú±dɆr,¨1zôè72Ù²e N.ýéß¿?ß‘ñ€V®\éââÂXçäÉ“£Fâ5=¢©©éíÛ·Uúö‰KPõa嬬¬3gÎ;vŒv@___ÅuÞ¼yCÇ/^ðêXÅŠçÌ™3}útÆoÛòòòV­Z5{öl^ÃÖÏ>ûìÁƒ¼VK(ø¹—µ¶¶ž9s&1Ùg[¦¾yóæõë×s>!†€ €häıàÙ³g;vìÈX$44”ûÉÕÕÕuÛ¶m:uâRÆÖ}úôáþÅ:Ç»Ÿ'NœÈ~à®ZµêË—/¹·F#¾5{ôè¡Æ$'4° TÆRƲ ì#lB‘˜‚1¯„™™Yppð˜1c¸T3)|J²sçÎì±SCuÓ4 ?ðÂw +5''§'N4jÔˆWAÚa4ßu°Ûºuë!C¸”*Žv·zõêQºà[¶Aƒ{÷îå5[†FAAZg͚ű·‚! ²oß¾þýûs¼kcc“ššZ¡B–"tkÒ¤ ßgiGŸš»»;ÇšoÞ¼ <|ø0Çš•+W¦¡ hÙK=z´{÷îìunܸA{â&OžÌ}í^;;;Úöøf•¸¸8Æ"×)£áõ™3g¸”¢7ê÷ßÿæ›o¸T+òâÅ :BÆÄİ—¢Þ»wÏËË‹½T å$Ðyœþ¥™™™\ªQ‚=yò$lj +4Ž?Þ§O.ÏVÕ©S‡6Žó)k¨qµÂÇLJN¾Ÿ|PD™¼¼¼M›6ýøã´°WC @„S§N}õÕW¼®¾hôêÕ‹—ŒE¸L»^ÜçŸN™››ÇšïÞ½£AÀÁƒ9Öœ6mÚ²eËØëðš ”ûºÎ¤aÆwîÜá[“\¿~½iÓ¦ ÒytäÈ‘ŒExMѶm[ö:&…OÙîÚµ‹û°F#))©M›6Ïž=c/5|øpúØë”PNÀìÙ³ÙïÆÔ¨]»6/jժťZ ”zôèÁå:Thhh¿~ýØë×±cG.Oµ ܲe‹ª‹¬›®XL§ã‹/2ÖA @uW®\ñõõå>Çeppð¸qã‹4jÔˆãåOOOú¼\]]y,2@@@Ç…Š+W®üüùs;;;öRݺu;vìcJ‰|—aæ2¯N©ø.§@† ²}ûvÆ"¼&íÛ·/¯ç1~ûí·Q£Fq)UªÓ§Oûùù±Ä666ÉÉÉÜ×(€’¿»»{jj*{):"ݸqƒ}--¦M›¶|ùrö:={öä{9æöíÛ7æXöâÝ»w«ô¬B #FŒøã?‹ †€ ®#GŽ 4ˆû3¬VVV úN­S™3gO.ñ!///ú°Ô^'’{ൾýš5kØëp¿µ†ï²ÓÅùûû8p€cA777Ú¤Y*ØÛÛÓá”ý|ÿøñã:uêp™<‘û»Tª±cÇnذ½ÎŽ;È^§¸ò¸ìûjÇE“¯+5jľ䋥¥ebb"ã9¨8 ®X±‚Wµ.]º„……1Þ"«;´)Ó€6­¥K—Κ5Kå<étH'EÆ"/sÚÚÚÞ¿_Ì*ñ999M›6å5=( P>|È~3+¯É@£¢¢Z´hÁ^GcܸqëׯçU­8‡””^7Ó§Y¯^=Æ" صk{gx­‰áää-àðž‘‘áííÍ>)Ïv}ÈÏÏ÷òòâ²Ö˜¸hRx‡[ûöíÙOL¿üòËøñã¹t‰:ãîîÎx  Hƒ ®^½Êe‰L!(€€ MÙ ¯^½¢ÙÇèsäÈ‘nݺ±Tˆ¥+¯‡’þùgŠ:\JéâàÁƒt²äUýÍÔà2(ß6===Õ[ÝùöíÛ 6äRŠFtòc,²yófömß¼yCdöÇ9HxxøW_}Å^G4ø !cKKK)˜"] £™zöìÉ^ÇÑÑ‘b0ß7_ .Kí¶iÓæÒ¥K\úÃwµrú§õíÛ—W5] (€€ M™ 4ž>sæÌÖ­[CCC¹Œ!JåêêJÃwÆEæÎËåqIM=zT©R%.Õtäëë{úôi.¥xMÀÏe2P: =z”½3&…  Ö¬Y“K©R­Y³f„ \Jõë×oß¾},xMJÝàòhc‹-¢¢¢ØëèèíÛ·nnn¯^½b¬Ãq ££Fúý÷ßÙëüôÓO4c¯££S§Nùùù1¡.99™Kh¡­ŽÎ›ìuˆ··÷­[·¸ÏP¤€Ú”•@[QDDÄ®]»öìÙCDõÒ =–ÎŒE7n|ûömÝqßꇮ\¹Òºuk.¥*V¬˜ššJ?ëpYÁ¾råÊ4Œc\úG#$$„ûÔ“ÅñZA¶  €Ž/_¾d)ÒªU«Ë—/³w†×@D9R´ã2ßë¸qゃƒ¹ôGømº®®®ì‹UªT)66–ãýôŸDç¬:uê¦zõêtÎ655e¬sãÆfÍš1Y¸pá?üÀX$??ßÙÙ™1Š˜ÎäHC+îkºi÷àÁƒzõê1îÔ 6äu]@øÀ¥K—ÚµkÇ^gâĉÜëø¤åË—O›6±ÈÌ™3-ZÄX„Ë#@^^^111‚/ÿ› (‚€ ¡îÐЙŽVQ…hàÂwj]ìÙ³' €±È† ÆŽË¥?\n¼V†ÞÿæÍ›sÙ…yy¹ÌeÉë +ÚÁcccÙëhAçÚºuë2¡ÓÀôéÓ ¡'gÏžõñña,Bh[b¤AoooƳiäôêÕ+.ãjw˜1cÆÒ¥K‹P„~òä …F.]ÒèÁX¤C‡çÎc,²nÝ:^Wè6mÚ4|øp.¥ô‚ €6¼À¨Q£t¹7#???##ƒ~ÉÌÌÌËË{ÿþ= iÄŸðüùsúåÝ»wìaáëë{òäIö:þþþ\¦p®Q£Æ³gϸܯ¢ }¬\ÞZµj=}ú”½ųþýû3áò)ÓBÕÙÄ5¸,Fѽ{wÆÇè_Ê~3™:uêÊ•+‹Ðx.>>^½Õ0´à2èñãÇÙïd+bÜ N:>d,Âqùj}Õ¬Y“Nm,*V¬øúõkÆo€Èeþ.GGGú爜ü§€Úð +Æ¡R¥J7oÞôôôd¬“››Kʬ¬,ö. žüçCáááìw jp¹„üæÍ›êÕ«çää°¡š’'ã Ö¿äÑ"00pçÎ,(i;88Päf)2cƌŋ³TÐ`¿‚NZ¶lyåÊöÎ(°yóföËŸË–-c¿3¤ˆŠyîîîìu?þ[½«¡¡¡ŒEh—©_¿>KJˉ‰‰ŒÝ0) ð\Ö8S@mŠãõåfdd$—ÕR­¬¬ž?.lÞºRЃËf¼~ýú1cư×áòdÂùóçÛ·oÏR×E5í\\\ÏÜ\Mšý‰ðׯ_S0fŸ}þüùsæÌa,¢ÌÇëÔ©ÃXdüøñ¿üò —þ˜u è;hÐ ö:7nÜhÒ¤ {V¬XÁ>;tèP=¿<..ÎÃñ÷îÝãõ,¾@@Р¯EŽÈÊ•+§NÊ^§[·nGŽa¯ÃˆËm¸&…Gp.ÓùýöÛoìAbÞ¼ysçÎUürÅÒМŽ-ŒÝÐã7'4\fù—:~Raìïèѣݻwg,BnÞ¼Ù¸qcö: +ÐéÌÁÁ’ K¾ûµ.ÓþºººÆÇdz?I¯ÌÅ‹/4˜0?ñÂkQо¼V‡T@m4è$zýúu[[[.Õ(KpY¡lÆ £Gf¯ÃèòåË\æÌ©W¯Þ½{÷Øë$''רQƒñB2ã£u×®]㸜°v«V­š4i’â—wêÔ‰ñ!BŠ[\V;æ²2†MFF†øIHаߕÎw eÄ yóætXf,Âk.]e¸<)Äxã û% JÒ€’½Ž2 + hƒ`R8ïçéÓ§Ùoý/âááÁeÒÒ¤¤$gggö:ŒxÍ!mjjšššjooÏÞ¥víÚ1.iiiI©R¥Š²—/X°àÇÔë%vvv´¥)ˆ@Ý»wW|Ë•«U«öþý{e/×àµ3—¥å(‹FDD°wF±6mÚDFF²T°¶¶ÎÎÎæuMÚX@VVVÕªUóòòëH¼a̤pÅzGGGÆ"}úôaYÅËšÄ&¼^×€Ú Ð`%Ÿ}ö¯‚4j¯Q£{^ÓæpÑ«W¯ððpö:¼N!Ë–- + +b,²Ž‚Bgq«QÏõm‹å‘åýû÷3.ÙC)%%…ñi“›¦h<Çø,2ùî»ï~ýõWÆ",¸<‚BáÓÁÁKŒ5œ?¾cÇŽìuèÀE{eh³·²²ÊÏÏg)¸ßçŸþäÉ–h<þ\ÊÔ[ + hS΀§§'þÝÜÜ8Ö¤‚¾¾¾ìuú÷ï¿{÷nö:\ðú™ñn–"\¾XW|2xýúuõêÕõ½6L}V¶mÐFÕ¹sg/7nãÝ;ìÓi¼xñÂÅÅ…½ÎºuëL¾¤—•ŒŸ={Æë¹Lc ›6m9r${øøx¾Gx}9::R€g©Àródnnn¥J•ØŸ¼·±±¡ô.ëQ +E´)Ï mÛ¶{÷îå¾m„„„pY·kÑ¢E3gÎd¯ÃÅáǹ\E›>}:—ç‰MxL(©xn{ekÐ("4x󿾝U< gíÚµA4ú§ ÀRAƒ×SÎÎÎ4 a¯£ØË—/5‹™°¸sçNƒ ¸ôÇX™¸ÌÝ)~ý¯âââodªY³¦â{J¹,FFš6mÊþ< ´)·`̘1t `\]¥T .œ={6{ƒ:%óZI~àÀ;vì`¯C~üñÇ 0¡‘“‚ñÁ¨Q£ôΈFi?¦_zôè¡`˜&MšÜ¸qCßW=xð€qáKKK:~V­Z•¥ˆFXXXïÞ½Ùë‡K—.q™)ØÄx—5׌í€iiiÊ^ÕªU+ö>ðú&P1´)‡ÀÚÚú—_~¡£‰Jõ¿ÿþ{.÷(_¹r¥eË–ìu¸ÈÎζ±±a¯ÃeY{ .W”•ÝOâîî¯×Kh«X»v-ý²fÍ7A™šš&&&êûDøªU«¦L™¢o[ÅuíÚ•q á"´Ó±LehdŽ;Ö¥K.¥Œ5(‹ÊFÉÜÜüýû÷Ên¿áµ’#búé'ö:Š!(€€ My ݺu[¾|9ûz´ZôîÝ;,,Œ½NBB—‡‰y©^½úË—/‹Ô®]›}°¢A}â%ôíÛWßù1îܹӰaC}:pà€f*nÅWå·mÛ6xð`½^B[; 4´U$88xܸq,ŠÌš5kÑ¢E\J={öp)e¬ Q£FÑÑѲ{a(²²²”Ýù¶qãF.sI‡„„ :”½Žb + hS~€——í ¦ƒhݺõ•+WØë¼}ûÖÚÚš½/\¦’ sɸô‡L˜0AsY]1[[[J5–––º¿DÁDÔŠæ?•Ý—?lذ-[¶èþ÷srr³³³õm¨ˆ©©i\\¯(‡¾yóf.¥ŒÀï¿ÿÎëKHc NNN)))²{a(O Íë–ÔƒöìÙ“½Žb + hS7çÎ;zôh‡ h®~ýú111ŒEhHúîÝ;.ýá¥Y³f +nCÿP^^ž¹¹9{rêÔ)???Æ"/^lÛ¶­î_Ádö%n|3fÌo¿ý¦W“ÂÍ811Q÷ÛŽ;Æ8y?EYÆ ï‹ëׯË\æF†×tX&Ƭ­­ssse÷ÂP<~ü˜>h/œ9sæ’%KØ;@ãö:Š!(€€ qzÿ'OžLã­Š+Šl466–±ˆ££#ûý6|ÑÑÿìÙ³ìu222/¿UÂû÷ïi×Vüxœ…Ãyóæéø—³²²è£Ñw\Rb)¢½{÷*»ýãöíÛºß}4eÊe*h¥ßy¨ØïG2&W§2ÊŸŸ/æzMYqãÆ&Mš(x!åÌ5kÖ°w@ú3i + hc¬ Q£FAAAýû÷ár¯¼A­¦Ák-0¾Ë:tÛ¶m,ôºÎ­ì‰º¨¨¨âÏ++[F€,]ºtúôé:þåºuë>xð@ß&Š»ÿ~:uX*סC‡ .ðªVÖÑщËuY# ™™™¶¶¶²{a@Ξ=«lY´Ñ£Goܸ‘½÷îÝã2œb + hcd€ÞpŸÑ™¬]»v²úP±bÅœœÆ"`nݺť?¼ 2dûöíìužÿüó'Ož0±±±yóæ —þG£î±T¨T©(¨{û cǎݰaƒ^5i$’’¢e£ì¢x×®]=ú±ÿ›˜˜èææÆrÔ äò°G ìÏ%Žn£ ¤B… +†vD":lj9:i±`Á‚ü‘½Ÿ¼î 6´Aà. `ïÞ½ìu_òQ —Îh°òøñc.ý)¡I“&Œ+'„††öëׯÔÿUPP@£ê¤¤$½ +~r$­ì‹ Ñ1ícË$­[·î»ï¾Ó·fq´õÒ`¥B©ÆŒ£ËTKåÄÉ“'}}}¹”2ÖàêêJiVv/ ‚•••¾«aŸXƒ†°\‚„b + hƒÀÝäÉ“W¯^Í^‡û<Œ,²³³•]*¡cÇŽgÏže¯ó¡E‹Íš5‹¥ÂàÁƒ?¶¨pdd¤‚à¶oß>hÐ -Añ»wïîß¿©ÿ«[·nÇŽSPS£råÊtÀ¬X±¢â +Ãë,¸oß>¹ qáååÅëIc \VŽ«Y³¦|ïdnnÞ¸qce¯=tèPÏž=Ùû0|øp.+† €6Ü-[¶,((ˆ½Ž–Ažx÷ïßç²< ˆ¹,Kù¡§OŸÒHˆåh£åÞ÷™3g.Y²D¯jtÎNNNvttÔþ×”=1ò±·‘}Y4õ> àà`.‡ÅK¢+c \¦³´´¤‚û-eÈÍ›7›6mÊ^§C‡\&P @m¸Û±cÇàÁƒÙë,Z´ˆÆìu¸Pö쇦OŸ¾téRö:¥jѢŵk×X*|lö›:uê<|øP¯R:u:sæÌ'ÿÚìÙ³,¸û±¬²gÏÆÐÖ«W/– +sàÀ>}ú°×á8Žq0Ö0zôè7²×¡€ÍåâEÅküãìì¬ï=|!(€€  wì³°kÐùXÁ<ñ*™?þܹsÙë¬X±bÊ”)ìuJÅ>И1c>\íøÁƒuëÖÕ·Ôòå˧NúÉ¿¥ìF¯Ro"2dËõ{[[Ûääd•=W¼øq ÒoE04Æè€C‡ö:”ŠØë”Q4«X±¢âGŠ{úôi­ZµØë(ƒ €6Ü¥¦¦V¯^}³§C-p¹t‰¯õä?þå—_²×)U||¼‡‡Ë;ïä䔘˜Xb–ÒÅ‹ÿðÃú–zôè‘.÷÷SoÝÝÝŸ?®oýÏdyyyÎÎÎ,ËG|óÍ7›7oVürí¨cÕªUc¯CyéòåËìuŒ†±€­[·6Œ½Î¼yó¸\¼(»<==¹L½@ŸÈ!CØë(ƒ €6jàuÀå¾h®2´ »ºº²ÿkjjJ£@Uuþâ‹/G‡çÎëСcͺuëÆÄÄèø—iÇ Ö«¾Iá)xè--úÚ‘iwÖ·Nq‡îÞ½;KíèxËX¤J•*iiiÜ—’(»Œ5Ü»w¯Aƒìu ê«T)¿,2jÔ(‰y!(€€  €† ¶uëVö:7n9r${FŠoS)ÁËËëÁƒìu´Xµjã-F%ÖîMNN®Q£FAA^E‚‚‚thøøñãʖݽ~ýzñÇû&Mš´fÍu4(˜QàTõqÉ~ýúíÛ·½Îµkך5kÆ^Ç8kÈÏÏ·³³Ówíí999ц]<*—74ä8q"{‡¤¤$YOT#(€€  €èÝ  {=z°ÏƒÁnÖ¬Y‹-b¯3tèÐö:ZÐùÉÍÍMßñzqôò¸¸¸¢á‚²Y´/\¸Ð®];ÿòû÷ïiŒòúõk}[™;wî¼yóŠþ³víÚ,GŠš\ž¹Ô‚ךDÒÏjÅXiÓ¦Mdd${˜˜ñ ^WpLÔœ$à“~¨D@(w®_¿Þ¼ysö:ÖÖÖ‰‰‰ªÞ3óI´ÿÖ©SçÑ£Gì¥Ö¬Y3aÂö:Ú)[^·¸«W¯}|Ý»wײìn©“““õºGeàÀ»víÒ«Ò¨Q£¢µÏ¢££é?õ­PœªghÐ;Éå#é3#4\£3 {Å‹Ϙ1ƒ½Nõþý{;;»·oß²—êÝ»·¬u@@Ð@ tÀ­^½zzz:{)é;ð‰'ºtéÂ¥T‰[VT²víZƘ1kÖ¬ŸþÙDé´úÆ Û²e‹^/¡Ñ?e½^¢Q4/ã4MÕªUKJJ²°°P\A©©©NNN,ßÏh˜šš>yò¤víÚ\zUÖqضmÛСCÙëÔ«WOÁjƤmÛ¶ìuh×‹ŽŽæòl†¾>~@@(öîÝË^ÇÃÃÎîyìÕ«Wxx8{ggçÄÄDwâ¾xñÂÍÍ-??_qOOOͬÿ4*0`€¾/W0í`ff&% Sõ­ZµjÒ¤I&Ì˦Ž;vݺuŠ_®;J€7oÞd¯3{öì °×1FèˆáêêÊ¥Ô¥K—,æm4æÍ›÷ÓO?q)%àNÎR!(€€  €J6mÚÄëùÝÐÐÐ~ýúq)¥¯4hЀe0]DÕ)&Kðõõ=}ú4KÍMÃÞ±c‡^/´²²zùòe•*Uôm±k×®Ç×÷U>>>´ÿ&$$Ô¬Y“åH{öìÙŽ;*~¹î¦M›¶|ùrö:•+W~òä‰!Ì‘%“ µ¸Ì@›7mäìuʨk×®µhÑ‚K) ‹[·nÕ¯_ŸK5Ý!(€€  €J^¼xQ£F .?j£££ÍÌÌØKékРA;wîäRŠêr)õI[¶lùöÛoY*,X° ((HÁ³¹_~ù¥‚q< V°ÑÉ899y÷îÝ,{Ÿ»»;¦Äl`¼ &L`™õÈhw OyíÚµ\J;vŒ×ÝŒe¯©œ5:wîÌx…E´APã]ÅI9=ß¿ßÛÛ›Ëåsss§:::²—ÒEff¦³³svv¶â +Íš5[´h‘‚‡b×­[7vìX-*¾s‰ÒÎöíÛOœ8¡ Q~øaáÂ…Š_®—¬¬,‡wïÞ±—¢ÄBÇ.1_\2ãû÷ïïÛ·/—R´EGGËSA¢áÇsüöàÁƒ={öäUM + hƒ Ž·]zyyݹsÇÒÒ’K5Ñy—ׄmÛ¶eœ™G_Œß]˜šš*˜ƒ•rNbb¢“““²F;wî|æÌ}_åççwîÜ9–!õÝ»wE~¡O±êäÉ“\JÕ®]ûæÍ›¶¶¶\ª•QÆÒÓÓ]\\¸Ì`c"öFDCÊñ#öðð¸wïž ¯‚Ÿ„ €6ꡱ mïß¿çRMñ¥ee®\¹òÅ_ðÚyéÀÍxO޾>üÕW_‰lѤpo:uê”â—+[s€QÓ¦My}O¥# +fÏxUëÚµkxx¸Úó2ã&…OnÛ¶W51“ ¬¬¬š5k¦¥¥ñ*(ò›CE´AP¯¹€ˆ‹‹Ë£G*W®Ì¥šv´Ï¶oßþÒ¥K\ªÙÛÛ?þ¼R¥J\ªé(//ÏÍÍ-99Yd£Œ!íåË—ô)SÏ9vé“–/_>uêT‘-¾{÷ÎÕÕ•þ±¼ +Nœ8qõêÕ¼ª•9FΞ=ëããëš¹¹ù¾}ûd­f%×ôéÓiDÈ«š¥¥åÕ«W—Ñ€Ú ¨êÌ™3;wæUÍÏÏïàÁƒÖÖÖ¼ +–ŠvXQñzðΤpâ—eË–ñª¦;úWˆ<Ö3Þÿ£Áñö]˜™™ÅÅÅñšiQw“'Oæ;d§šËÚÛe‘Ñ:"yyy=~ü˜WÁ*Uª\¸pAØÈÕpÄÆÆÒÖÂñƒƒƒCXX˜î«ž³@P@µÑi&::šWµ.]º8p@½ À}ôojjúàÁOOO^uÕªU+aÍq™ã÷ß5j—þè‚6§cÇŽ k®ÈÝ»w½½½9¤ôEÙ˜×üBe‹Ñ²téR¾Kùº»»_¾|ÙÅÅ…cÍ2¡_¿~ûöíãXNF!!!6´APû””%tëÖmÿþý*TàXSƒûèŸøûûSbáXP/uêÔÑ,é%@pp0ûüiiiÎÎÎ\&Éѹ¹¬´ªmÆ|³‡……‚~þùg1·ÉŽòÒÓÓédªïœ¼ÚѨ€rŰaÃ8Ö4|.\èСßš¿W¯^ýý÷ßó-[€Ú ¨-??¿Aƒ\Ö²)Ò·oß;wZYYq¬Iû)ýõWŽ5MMM£¢¢š7oα¦^æÏŸ?wî\ q¹ÿG£GGŽa¯óI666/^¼5\¾té’w|öÙgt,2„éÞi{ óŽ€5¼ËC0)\ûYGN)ˆÒˆ6î•õõüùs777 ©tŸaPPÅoõÇGP@¶oß>dȾ5Û´iÊë+ì7oÞŒ7ŽúÉ¥Z‘>}úðýºY_±±±µjÕpâ¸2NHHÈ7ß|Ã¥”v´MnݺU@Cããã£Ò⬾¾¾kÖ¬©[·®ŵKKK ß³gϱcÇ(ö Y–“ššJçS:Rq¯liiùÝwßÍŸ?_Ê|²Ïž=Û½{÷æÍ› + +Ä|]yýúõ-Z¨qTlÙ²å¶mÛ>ÿüsî•MA@Ð@:²7nÜøÎ;|˺ººþúë¯ìÓYܺukàÀ|¿£0)¼üóæMéOÚµk׎×tFZp¹ÿG###ƒŽW999\ªi!}aTŠL4RW©¸••娙3gÖ®][¥&Š£ãü™3göîÝ{òäÉ¢™Å,–TN¡¡ÌŠ+T*N;Õ§$ à;±üü|:êÒ¦BCúEó‡oÔ¸·óC§§+¡J•*´ÓMœ8‘ûÛˆ €6bÐPÀßß_Ê4†£ƒKË–-¼öéÓ§óæÍÛ¾};—å~K P±cÇîeõõÛo¿3FÕ&ÌÍÍ8dz÷îÆ«Z©(=ÆÆÆ +¸AE;ë»Úš^hPEoæ!CºuëÆ÷–9BÃîsçÎ={–~ÆÅÅ}ø–,YÄ·Ñ•ŸðòåËúõëÓ ]½&ik>>\ö T½Õâ…4•Š+œœÜ¬Y³„„Ùá/>>^í¹Ë[ ‡ò÷÷WéöE‰6lxûöm‘-r_¦ÆÀ!†€ÿëýû÷;w¾xñ¢ìލÂÚÚúüùóÜŸŸc·dÉ’™3gªQù×_ýî»ï¸—ÍÎΦ£–.888ÐP[½Å¤•‰ŒŒìÔ©“°Є9q℟ŸŸªM”Ã`"uP¥Ú+i—ühþĉʼneA þ¤¤¤æÍ›'&&Êî7n9r¤ì^”"99¹fÍšEó3ò¢Òý?ܵk÷²“&MZµj÷²ìÖ¬YC}“Ý ÎV¯^M,U›(Ÿ    gÏžb–ÌéñãÇôŠl1??¿wïÞªNÆe8C@€’"""|||Œìzçwß}Çw!a¾üýý<È·¦J÷ÿhìß¿¿oß¾ÜËÞºuKúâ 3tèÐmÛ¶ÉîOcÇŽ]·nªM”Ï@^½zÕ²eKö»A c_ÚE_™™™mÚ´¹{÷®àvÅC J2bÄ5&à—¢Gûöíã>Õ:GtfíÝ»7ßš*Ýÿ£‘““ãì윞žÎ±¦˜yi£ÝaäÈ‘[¶l‘Ýn:tèpîÜ9U›(·À¤ðÛÔ/¿üÒ˜F®‹/ž1c†øvŸ>}JÛªQ>‡S€`P::é2„û})âùûûïÞ½[Ì–Šååå¹»»+›ž¯TªÞÿ£ÁýŠøúõëÕ^/¦L™²zõjÙá£Zµj)))ª6Qž€Iá÷ݺu‹ŠŠ’Ý>ĬQªÄÄÄîÝ» ~ +Y0Áà£>LçÝ·oßÊîˆrƒ¦3–………ìŽ|Ú¬Y³-ZÄ«Z§NΜ9ëZ©:Ô³gO^ÕªT©’@?yT€UŠ„¡ ïºcz)çÀ¤pÕ­¯¾úÊ8fVûÝëׯýýýÏŸ?/«jC ´9}út@@€€ÅPÕ0eÊ”åË—«=Ó9/qqqµk׿uÛ•ª÷ÿh¼ÿÞÙÙùÕ«W\ªM˜0aÍš5\J @çi:uÁ÷cçÎëСƒzõL +gÍ9r¤Í FùœòŒÄ#jNNÎСCCCCeu@U‚! À'{öìca|^^½Õì’J™^‹÷ï߯X±â矦,»/J¨½JxñâEPPжmÛ¤=”¡¸h b¤¦¦Ž;vïÞ½²; €` ‡'OžÐAêøñã²;R +‰.Z´hذa²;„þ ³fÍb©`nnþüùsggg^]Òn̘1¿ýöK…Zµj=~üXð +£|½|ùrþüùtœ)s3纹¹ÅÇÇ«W T×®]›íëëËRÁp®)2¢Q]PPÈ7Ÿ}âââÔ["àchì±mÛ6:jøY¸„!C†lݺUv/þz'CCCi×cÿîT.Á úЃ`°²³³ûí·Å‹¿xñBb7hè8wî\Á Ô«êÛo¿eYmJðÖžŸŸïêêšœœ¬ìåUªT‰·³³ãÛ+‰nÞ¼¹råÊ;vò·æææ>>>cÆŒéÝ»7íDê5„ ]AAÁáÇiFéQv_´¡=tÀ€C‡m׮쾔.'''$$dùòå=’Ýý899ÑPÇÏϯk×®fn(@&- \VVÖÚµk—.]Êk.HÝ™™™õë×ïçŸþüóÏ7­¶7n4kÖLÙkém¡ñ´àG ¾ÿþû_ýUÙk§L™²bÅ +¾ý1111Ë–-Û·o_FF†ì¾ü/÷7iÒ„FrC† s“€.hB1`ÕªUgÏž5¨ÜhccÓ±cG÷SP´¶¶–ÝO£@F»žßT½zuŠR:tèÔ©S£F$Î¬Š €eBNNÎÉ“'·nÝJG^S³Õ«WoذatN*£Oúê¢uëÖÊÜ|ÿƹsç¨]/¤ñè£Gj׮ͻG†"//ïòåË{öìÙ»woBB‚”>ЛìååE£ ___:¢:88ˆl@/¯^½:}útxxød=V^©R%J‰š ¦}ûö¾†úÇÜ¿ÿàÁƒtJ¢)¥ÙÝ1±··oܸ1õégË–-ëÔ©c Ô È„ ERR—eh«U«fkkË^´KKK£ w.\¸Àwý`Ä4mÚÔßßàÀF<^,’šššžž®à…vvvŽŽŽÜû£_•Ý}kaaáîîλ;†ˆÞ¢¨¨¨C‡Ñ®qíÚµììlU›sss£A? 5(˜ÑNâVñññì3ßÓ)񮮠KÊ +ÚBNºxñâ½{÷TÂZZZÒA•†¤­Zµêرc‹-T½+L°ääd +TGˆˆvê™™™‡‡GшŸÐŠiZ_2!€ñÉÍÍ¥£íéB7nÜPöµ úéœô—¿ü¥sçÎtZªZµ*÷~ˆGbÚ)h¹téÒýû÷iˆÌr­×ÚÚÚ«§§gݺu5¿ÁÓðP$###¢PddäÓ§OXæbvpp -„6Ú`4¿ÐèߘFüZüù矚wòÊ•+±±±ìw®ÒÞG#{÷¡1•æ?)—•·@&0nùùùtÆzöìÙJJJ¢óÙ›7o2 Ñÿ­ò/4Äwtt¬õ/t-+ÇP´#P  Ý$11‘%˜ÓÒÒègVVí)4Ȱ°°°²²²±±133«þ/ÎÎΚŸô‡²ÿ Trr2m*ÏŸ?§_4 m'´µÐ/¯_¿Ö\+¡­…¶™ +*ÐFâääDà ÍÖ"ø0CööíÛ¸¸8zi×KMMÍÉÉIOOÏÎΦ_èͤ]±bEÚûèÜD; ½½=ý¤ßéOèÏmmmé %l¶eõ È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È„‚!È”’’âää$¥igÏžIi$š;wîüùó¥4½|ùò©S§JiZC~xýúµ½½½”¦kÔ¨‘ ¥ihÆŒK—.•ÒôÚµk¿ÿþ{)MkÈÙÙÙ666Rš®V­ZJJŠ”¦@¢)S¦¬ZµJJÓ6l=z´”¦5ä€üü| )MW®\933SJÓ Ñøñッƒ¥4½eË–aÆIiZC~ (Hi:77×ÊÊJJÓ K``àîÝ»¥4½k×®HiZà €Mvv¶”¦“’’œ¥4 ²øúúž>}ZJÓûöíëÓ§”¦5 "¸ºº&&&Ji:::ÚÛÛ[JÓ K“&Mnݺ%¥é3gÎtêÔIJÓ6lxçÎ)Mïß¿¿wïÞRšY_½z%¥i÷6hÐ@JÓ|||Ξ=+¥é%K–Ii¤ÈÌÌ´µµ•Õzbb¢‹‹‹¬ÖM $|ýõס¡¡Rš9r䯥4 Rܾ}»qãÆ²ZÏÉÉ©P¡‚¬ÖM $Œ7nýúõRšnß¾ýùóç¥4 RìܹsРARš6„iè "üíoûë_ÿ*¥éû·{ñâ…”¦@ŠY³f-Z´HJÓuêÔ¹ÿ¾”¦‹D ùæ›odµþòåKGGGY­€`½zõ +—Òt×®]=*¥é".\¸Ð¡CY­8pÀßß_Vë ~ÿùÏJiý»ï¾ûõ×_¥4]Ä @||¼»»»¬Ö§L™²bÅ +Y­€H=òòò’ÕúÒ¥K§OŸ.«u ƒ•*UÊÍÍ•ÒzãÆoÞ¼)¥iì?þ1b„¬Ö÷ìÙ «u ƒ¤~ýú111Rš633ûç?ÿ‰ÇʃÁƒïرCVë·nÝjÔ¨‘¬Ö5 % 8p×®]²ZÇzÀåAAA‹‹‹¬,--ß¼ycee%¥õ"†.\8{ölY­ÂÓ ¶+W®´nÝZVëÞÞÞÑÑѲZ/b(àСC={ö”Õº££cbb¢ô4ªš:uêÊ•+eµ>xðàmÛ¶Éj½ˆ¡€¸¸8‰ÿꫯ$vT•——W³fM‰‹À.^¼xÆŒ²Z/b(À¤pQ^Y÷c‘ÀÀÀ;wÊjÔväÈ‘=zHìÀ‰'üüü$v@À@Ÿ>}8 «ukkkŠƒvvv²:ª’;댹¹yZZZ•*Udu ˆ€eË–IìÀæÍ›¿ù払ddd¸¸¸dggËê@Ó¦M¯_¿.«õâ (DDD´mÛVbZ´h%± ’õë×7Nb&Nœ¸zõj‰(b@ 77·jÕª999ûpêÔ©¿üå/;Üåçç×­[÷ñãÇû°{÷îþýûKì@ +¤sçÎgΜ‘ØýSØànë֭Æ “ØSSÓÄÄDggg‰}(bX`éÒ¥Ò§FŠˆˆøâ‹/äöx¡ánÆ ïÞ½+±ÿ¯½{ Šªþã8î.ˆ—U#±,2P +¤Ô”*oh©Í2æ¨Ý)ïÊX˜6Y2@HèT€£25–—ÀHMPS1­FñŠ&b ;ÿŸ—Qó +¸ú=»çýzÐ0>zï²~ÚsŽv.h¥µPQQ¡~=² /¿ür~~¾l¬%77744T¶aÆŒóæÍ“m¸J[@qww?tè`€Ñhܶm[ïÞ½`ê¬Û§OŸíÛ·ËflÞ¼900P¶á*Í €¸¸¸ôôtÙ†€€õK2 ²¸C±±±² ÎÎÎÇŽstt”͸Js@ü m—egg¿òÊ+Òh¹“'O>ñÄêð-›1nܸåË—Ë6\OsÀl6?ôÐCê·%›Ñµk×ÊÊJ `»âããÓÒÒ¤+ZháÜWin(111Ë–-“®hõÆo,Z´Hº-QVV6`À‹Å"›áìì|ôèQ'''ÙŒëiq 6Lº¢•£££úÜøùùI‡ yêëëû÷ï¿mÛ6éVãÇן¶¯§Å`6›]]]?.ÒÊÃÃcëÖ­;v”@3̘1#))Iºâ¢ï¾ûN Ú¾ž€òæ›o.^¼Xºâ¢ððð•+WJW ©~üñÇ!C†444H‡´êÖ­ÛÁƒ¤CþC£`Ïž=ÞÞÞiËÌÌŒŠŠ’®Àí=zÔÏÏïÈ‘#Ò!Íž=ûý÷ß—®¸‘F€X\\,]q‘Éd*++óòò’À­X,–!C†¬_¿^:ä"£ÑxàÀwwwéiwdeeEGGKW\áãã£ÖhÙ´iÓ,X ]qÅСC ¥+¡ÝpþüùG}ôĉÒ!W 6líÚµÚy„®—šš:qâDéŠkV­Z5zôhéŠFhw(³fÍš7ožtÅ5ê#•’’"]€åææ†‡‡káÂßË<<<öìÙc4¥C¡éP]]íîî^WW'rÍôéÓçÏŸ/]€k6lØ¢©CcJJЦþwÄõ4=”ØØØŒŒ éŠÿHJJš6mšt.úõ×_Ÿþù3gÎH‡\ãââòǘL&éÆi}ìÞ½û©§žÒZä»ï¾«ëKt«´´tĈZx€ìõ´y÷Ï«´>”1cÆäååIWÜ(!!AmƒÁ  ScÇŽ­­­•ùN:UUUuîÜY:ä¦l`ìÚµË×××b±H‡Ü(:::55ÕÉÉI:@w²³³cbbÌf³tÈæÌ™3wî\éŠ[± DFF®X±Bº¢ÁÁÁ¹¹¹ÎÎÎÒ!:²`Á‚éÓ§k𫎅UUU?ÚÆøý÷ß½½½ëëë¥Cááá‘——çãã#`ÿΞ=¿råJéÆÙÄÝblc(qqqéééÒ3™LiiiÒ!ölûöíaaaûöí“iÜÃ?¼wïÞ:H‡Ü†Í €êêê^½zÕÔÔH‡ÜThhhjjêý÷ß/`‡²³³ãããÏŸ?/rS™™™QQQÒ·g3@INNNHH®¸•=zddd 8P:À~üý÷ßS¦LÉÏÏ—¹•gžy¦¬¬L›þ½- €ÿý×ÇÇgïÞ½Ò!·ñÒK/}öÙgnnnÒ!¶­¾¾~éÒ¥³fÍÒÔs¾þŸÁ`ظqcPPtH“ØÒPÖ®];räHéŠÛkß¾}BBÂ{ï½×¦Mé›ôË/¿Lš4©¬¬L:äö"##¿úê+銦²±ÐêÒWísss¥+šÄËËëã? ‘°%UUU|ðAVV–MœT;wî¼{÷î®]»J‡4•í €#GŽx{{Ÿ:uJ:¤©z÷îýÖ[oEDD888H·hÚ>üðÃ/¿üRƒOøº[¹ö÷*ÛJFFFll¬tEóôìÙóµ×^‹‹‹kÛ¶­t €æTTT,\¸0''§¡¡Aº¥¸~ýzƒÁ Ò 69TóàÁƒÕ{-ÒlݺuS122ÒËËKº@^MMMnnnvvö¦M›lî\j2™ÊËË{öì)Ò<69”?ÿü³wïÞ'Ož”i¡'Ÿ|244TîÝ»K·Ük ?ýô“:÷çåå;wN:§…ÒÒÒ&L˜ ]Ñl¶:õq3fŒtÅqpp + + +~á…ž}öY'''é"€»èĉ?üðCaaáºuëŽ;&sGF½jÕ*銖°á DGGgeeIWXGûöíÔð÷÷÷ôôtuu•.¸Sf³ù·ß~Û±cGIIÉÏ?ÿ¼{÷n‹Å"eꨦ^T—.]¤CZ¶ÀÙ³gŸ~úéýû÷K‡X_ÇŽ=<ÿüó)S¦Ø÷k€u=÷Üsk×®íÔ©“tÈ]aç@IOOŸ8q"× )BBBòòòÚµk'r·ØÿPV®\e6›¥C i#GŽüæ›oÚ´i#réb(«W¯Žˆˆàù¸™ &¤¤¤888H‡Ü]zÊŽ;FŒñ×_I‡@[ ÃìÙ³çÎ+r/èh(êô¯6€ZÒ!Њ6mÚ,[¶,""B:äÑ×PNŸ>=vìØï¿ÿ^:òºvíš—— rïèn(ê%ôÑGÓ§OçÖ@zÖ·o_uúwss“¹§ô8.+((7nÜéÓ§¥C ..nÉ’%NNNÒ!÷š~€RYYV^^.€{§C‡K—.7nœtˆ ]åÂ… sæÌINNæë@zЯ_¿œœé1z—­_¿>**Š;„Ø1£Ñ8yòäääd~íçz €+Ž?®>_ýµt¬¯W¯^_|ñEPPtˆ<À¬[·îÕW_=tèt¬ÃÑÑqÒ¤IIII&“IºE7:wî\bb"WØ??¿ôôô¾}ûJ‡h q¥¥¥¯¿þú–-[¤CÐ<ð@bbbll¬ƒƒƒt‹¶0nJ½3¹¹¹ ”n@SµnÝzüøñóçÏïÒ¥‹t‹1n£¶¶699yÑ¢EgΜ‘nÀ­ †Q£F-X°ÀÓÓSºE»MròäÉO?ýtñâÅÌm4hPRRR¿~ý¤C´ŽÐ ÕÕÕjP¦¥¥;wNºW 2dîܹþþþÒ!¶Ðl555™™™ÉÉÉ<8 @Ñh>|øÌ™3û÷ï/ÝbK-táÂ…ìììO>ùd×®]Ò-úrß}÷ÅÆÆN:ÕÍÍMºÅö0îÔÖ­[ÓÒÒrrrø^ÀÝÖ§OŸ¸¸¸ÈÈHžêÕb 먩©Q`ùò奥¥¼¥ÖõÈ#„‡‡ÇÄÄxyyI·Ø<€•>|8??ÿÛo¿-))ὸ...Ç qtt”α €»eÿþýkÖ¬),,Ü´iS]]t€Íðññ6l˜:úñ_«cÜuµµµ6lPK`ãÆ;wî´X,ÒEšãêê8xð`uôïÖ­›tŽ=cÜS555[¶l))))..Þ¾}û©S§¤‹d899yyy 0 @ý{ôè!]¤ I‡Þ¹sgyyyEEž}û> +/Length 2967 +/Filter /FlateDecode +>> +stream +xíÔ€ ú?º†#Ø j]€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„== +endstream +endobj +2 0 obj +<< +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << +/F1 7 0 R +/F2 9 0 R +>> +/XObject << +/I0 10 0 R +>> +>> +endobj +319 0 obj +<> endobj +320 0 obj +<> endobj +321 0 obj +<> endobj +322 0 obj +<> endobj +323 0 obj +<> endobj +324 0 obj +<> endobj +325 0 obj +<> endobj +326 0 obj +<> endobj +327 0 obj +<> endobj +328 0 obj +<> endobj +329 0 obj +<> endobj +330 0 obj +<> endobj +331 0 obj +<> endobj +332 0 obj +<> endobj +333 0 obj +<> endobj +334 0 obj +<> endobj +335 0 obj +<> endobj +336 0 obj +<> endobj +337 0 obj +<> endobj +338 0 obj +<> endobj +339 0 obj +<> endobj +340 0 obj +<> endobj +341 0 obj +<> endobj +342 0 obj +<> endobj +343 0 obj +<> endobj +344 0 obj +<> endobj +345 0 obj +<> endobj +346 0 obj +<> endobj +347 0 obj +<> endobj +348 0 obj +<> endobj +349 0 obj +<> endobj +350 0 obj +<> endobj +351 0 obj +<> endobj +352 0 obj +<> endobj +353 0 obj +<> endobj +354 0 obj +<> endobj +355 0 obj +<> endobj +356 0 obj +<> endobj +357 0 obj +<> endobj +358 0 obj +<> endobj +359 0 obj +<> endobj +360 0 obj +<> endobj +361 0 obj +<> endobj +362 0 obj +<> endobj +363 0 obj +<> endobj +364 0 obj +<> endobj +365 0 obj +<> endobj +366 0 obj +<> endobj +367 0 obj +<> endobj +368 0 obj +<> endobj +369 0 obj +<> endobj +370 0 obj +<> endobj +371 0 obj +<> endobj +372 0 obj +<> endobj +373 0 obj +<> endobj +374 0 obj +<> endobj +375 0 obj +<> endobj +376 0 obj +<> endobj +377 0 obj +<> endobj +378 0 obj +<> endobj +379 0 obj +<> endobj +380 0 obj +<> endobj +381 0 obj +<> endobj +382 0 obj +<> endobj +383 0 obj +<> endobj +384 0 obj +<> endobj +385 0 obj +<> endobj +386 0 obj +<> endobj +387 0 obj +<> endobj +388 0 obj +<> endobj +389 0 obj +<> endobj +390 0 obj +<> endobj +391 0 obj +<> endobj +392 0 obj +<> endobj +393 0 obj +<> endobj +394 0 obj +<> endobj +395 0 obj +<> endobj +396 0 obj +<> endobj +397 0 obj +<> endobj +398 0 obj +<> endobj +399 0 obj +<> endobj +400 0 obj +<> endobj +401 0 obj +<> endobj +402 0 obj +<> endobj +403 0 obj +<> endobj +404 0 obj +<> endobj +405 0 obj +<> endobj +406 0 obj +<> endobj +407 0 obj +<> endobj +408 0 obj +<> endobj +409 0 obj +<> endobj +410 0 obj +<> endobj +411 0 obj +<> endobj +412 0 obj +<> endobj +413 0 obj +<> endobj +414 0 obj +<> endobj +415 0 obj +<> endobj +416 0 obj +<> endobj +417 0 obj +<> endobj +418 0 obj +<> endobj +419 0 obj +<> endobj +420 0 obj +<> endobj +421 0 obj +<> endobj +422 0 obj +<> endobj +423 0 obj +<> endobj +424 0 obj +<> endobj +425 0 obj +<> endobj +426 0 obj +<> endobj +427 0 obj +<> endobj +428 0 obj +<> endobj +429 0 obj +<> endobj +430 0 obj +<> endobj +431 0 obj +<> endobj +432 0 obj +<> endobj +433 0 obj +<> endobj +434 0 obj +<> endobj +435 0 obj +<> endobj +436 0 obj +<> endobj +437 0 obj +<> endobj +438 0 obj +<> endobj +439 0 obj +<> endobj +440 0 obj +<> endobj +441 0 obj +<> endobj +442 0 obj +<> endobj +443 0 obj +<> endobj +444 0 obj +<> endobj +445 0 obj +<> endobj +446 0 obj +<> endobj +447 0 obj +<> endobj +448 0 obj +<> endobj +449 0 obj +<> endobj +450 0 obj +<> endobj +451 0 obj +<> endobj +452 0 obj +<> endobj +453 0 obj +<> endobj +454 0 obj +<> endobj +455 0 obj +<> endobj +456 0 obj +<> endobj +457 0 obj +<> endobj +458 0 obj +<> endobj +459 0 obj +<> endobj +460 0 obj +<> endobj +461 0 obj +<> endobj +462 0 obj +<> endobj +463 0 obj +<> endobj +464 0 obj +<> endobj +465 0 obj +<> endobj +466 0 obj +<> endobj +467 0 obj +<> endobj +468 0 obj +<> endobj +469 0 obj +<> endobj +470 0 obj +<> endobj +471 0 obj +<> endobj +472 0 obj +<> endobj +473 0 obj +<> endobj +474 0 obj +<> endobj +475 0 obj +<> endobj +476 0 obj +<> endobj +477 0 obj +<> endobj +478 0 obj +<> endobj +479 0 obj +<> endobj +480 0 obj +<> endobj +481 0 obj +<> endobj +482 0 obj +<> endobj +483 0 obj +<> endobj +484 0 obj +<> endobj +485 0 obj +<> endobj +486 0 obj +<> endobj +487 0 obj +<> endobj +488 0 obj +<> endobj +489 0 obj +<> endobj +490 0 obj +<> endobj +491 0 obj +<> endobj +492 0 obj +<> endobj +493 0 obj +<> endobj +494 0 obj +<> endobj +495 0 obj +<> endobj +496 0 obj +<> endobj +497 0 obj +<> endobj +498 0 obj +<> endobj +499 0 obj +<> endobj +500 0 obj +<> endobj +501 0 obj +<> endobj +502 0 obj +<> endobj +503 0 obj +<> endobj +504 0 obj +<> endobj +505 0 obj +<> endobj +506 0 obj +<> endobj +507 0 obj +<> endobj +508 0 obj +<> endobj +509 0 obj +<> endobj +510 0 obj +<> endobj +511 0 obj +<> endobj +512 0 obj +<> endobj +513 0 obj +<> endobj +514 0 obj +<> endobj +515 0 obj +<> endobj +516 0 obj +<> endobj +517 0 obj +<> endobj +518 0 obj +<> endobj +519 0 obj +<> endobj +520 0 obj +<> endobj +521 0 obj +<> endobj +522 0 obj +<> endobj +523 0 obj +<> endobj +524 0 obj +<> endobj +525 0 obj +<> endobj +526 0 obj +<> endobj +527 0 obj +<> endobj +528 0 obj +<> endobj +529 0 obj +<> endobj +530 0 obj +<> endobj +531 0 obj +<> endobj +532 0 obj +<> endobj +533 0 obj +<> endobj +534 0 obj +<> endobj +535 0 obj +<> endobj +536 0 obj +<> endobj +537 0 obj +<> endobj +538 0 obj +<> endobj +539 0 obj +<> endobj +540 0 obj +<> endobj +541 0 obj +<> endobj +542 0 obj +<> endobj +543 0 obj +<> endobj +544 0 obj +<> endobj +545 0 obj +<> endobj +546 0 obj +<> endobj +547 0 obj +<> endobj +548 0 obj +<> endobj +549 0 obj +<> endobj +550 0 obj +<> endobj +551 0 obj +<> endobj +552 0 obj +<> endobj +553 0 obj +<> endobj +554 0 obj +<> endobj +555 0 obj +<> endobj +556 0 obj +<> endobj +557 0 obj +<> endobj +558 0 obj +<> endobj +559 0 obj +<> endobj +560 0 obj +<> endobj +561 0 obj +<> endobj +562 0 obj +<> endobj +563 0 obj +<> endobj +564 0 obj +<> endobj +565 0 obj +<> endobj +566 0 obj +<> endobj +567 0 obj +<> endobj +568 0 obj +<> endobj +569 0 obj +<> endobj +570 0 obj +<> endobj +571 0 obj +<> endobj +572 0 obj +<> endobj +573 0 obj +<> endobj +574 0 obj +<> endobj +575 0 obj +<> endobj +576 0 obj +<> endobj +577 0 obj +<> endobj +578 0 obj +<> endobj +579 0 obj +<> endobj +580 0 obj +<> endobj +581 0 obj +<> endobj +582 0 obj +<> endobj +583 0 obj +<> endobj +584 0 obj +<> endobj +585 0 obj +<> endobj +586 0 obj +<> endobj +587 0 obj +<> endobj +588 0 obj +<> endobj +589 0 obj +<> endobj +590 0 obj +<> endobj +591 0 obj +<> endobj +592 0 obj +<> endobj +593 0 obj +<> endobj +594 0 obj +<> endobj +595 0 obj +<> endobj +596 0 obj +<> endobj +597 0 obj +<> endobj +598 0 obj +<> endobj +599 0 obj +<> endobj +600 0 obj +<> endobj +601 0 obj +<> endobj +602 0 obj +<> endobj +603 0 obj +<> endobj +604 0 obj +<> endobj +605 0 obj +<> endobj +606 0 obj +<> endobj +607 0 obj +<> endobj +608 0 obj +<> endobj +609 0 obj +<> endobj +610 0 obj +<> endobj +611 0 obj +<> endobj +612 0 obj +<> endobj +613 0 obj +<> endobj +614 0 obj +<> endobj +615 0 obj +<> endobj +616 0 obj +<> endobj +617 0 obj +<> endobj +618 0 obj +<> endobj +619 0 obj +<> endobj +620 0 obj +<> endobj +621 0 obj +<> endobj +622 0 obj +<> endobj +623 0 obj +<> endobj +624 0 obj +<> endobj +625 0 obj +<> endobj +626 0 obj +<> endobj +627 0 obj +<> endobj +628 0 obj +<> endobj +629 0 obj +<> endobj +630 0 obj +<> endobj +631 0 obj +<> endobj +632 0 obj +<> endobj +633 0 obj +<> endobj +634 0 obj +<> endobj +635 0 obj +<> endobj +636 0 obj +<> endobj +637 0 obj +<> endobj +638 0 obj +<> endobj +639 0 obj +<> endobj +640 0 obj +<> endobj +641 0 obj +<> endobj +642 0 obj +<> endobj +643 0 obj +<> endobj +644 0 obj +<> endobj +645 0 obj +<> endobj +646 0 obj +<> endobj +647 0 obj +<> endobj +648 0 obj +<> endobj +649 0 obj +<> endobj +650 0 obj +<> endobj +651 0 obj +<> endobj +652 0 obj +<> endobj +653 0 obj +<> endobj +654 0 obj +<> endobj +655 0 obj +<> endobj +656 0 obj +<> endobj +657 0 obj +<> endobj +658 0 obj +<> endobj +659 0 obj +<> endobj +660 0 obj +<> endobj +661 0 obj +<> endobj +662 0 obj +<> endobj +663 0 obj +<> endobj +664 0 obj +<> endobj +665 0 obj +<> endobj +666 0 obj +<> endobj +667 0 obj +<> endobj +668 0 obj +<> endobj +669 0 obj +<> endobj +670 0 obj +<> endobj +671 0 obj +<> endobj +672 0 obj +<> endobj +673 0 obj +<> endobj +674 0 obj +<> endobj +675 0 obj +<> endobj +676 0 obj +<> endobj +677 0 obj +<> endobj +678 0 obj +<> endobj +679 0 obj +<> endobj +680 0 obj +<> endobj +681 0 obj +<> endobj +682 0 obj +<> endobj +683 0 obj +<> endobj +684 0 obj +<> endobj +685 0 obj +<> endobj +686 0 obj +<> endobj +687 0 obj +<> endobj +688 0 obj +<> endobj +689 0 obj +<> endobj +690 0 obj +<> endobj +691 0 obj +<> endobj +692 0 obj +<> endobj +693 0 obj +<> endobj +694 0 obj +<> endobj +695 0 obj +<> endobj +696 0 obj +<> endobj +697 0 obj +<> endobj +698 0 obj +<> endobj +699 0 obj +<> endobj +700 0 obj +<> endobj +701 0 obj +<> endobj +702 0 obj +<> endobj +703 0 obj +<> endobj +704 0 obj +<> endobj +705 0 obj +<> endobj +706 0 obj +<> endobj +707 0 obj +<> endobj +708 0 obj +<> endobj +709 0 obj +<> endobj +710 0 obj +<> endobj +711 0 obj +<> endobj +712 0 obj +<> endobj +713 0 obj +<> endobj +714 0 obj +<> endobj +715 0 obj +<> endobj +716 0 obj +<> endobj +717 0 obj +<> endobj +718 0 obj +<> endobj +719 0 obj +<> endobj +720 0 obj +<> endobj +721 0 obj +<> endobj +722 0 obj +<> endobj +723 0 obj +<> endobj +724 0 obj +<> endobj +725 0 obj +<> endobj +726 0 obj +<> endobj +727 0 obj +<> endobj +728 0 obj +<> endobj +729 0 obj +<> endobj +730 0 obj +<> endobj +731 0 obj +<> endobj +732 0 obj +<> endobj +733 0 obj +<> endobj +734 0 obj +<> endobj +735 0 obj +<> endobj +736 0 obj +<> endobj +737 0 obj +<> endobj +738 0 obj +<> endobj +739 0 obj +<> endobj +740 0 obj +<> endobj +741 0 obj +<> endobj +742 0 obj +<> endobj +743 0 obj +<> endobj +744 0 obj +<> endobj +745 0 obj +<> endobj +746 0 obj +<> endobj +747 0 obj +<> endobj +748 0 obj +<> endobj +749 0 obj +<> endobj +750 0 obj +<> endobj +751 0 obj +<> endobj +752 0 obj +<> endobj +753 0 obj +<> endobj +754 0 obj +<> endobj +755 0 obj +<> endobj +756 0 obj +<> endobj +757 0 obj +<> endobj +758 0 obj +<> endobj +759 0 obj +<> endobj +760 0 obj +<> endobj +761 0 obj +<> endobj +762 0 obj +<> endobj +763 0 obj +<> endobj +764 0 obj +<> endobj +765 0 obj +<> endobj +766 0 obj +<> endobj +767 0 obj +<> endobj +768 0 obj +<> endobj +769 0 obj +<> endobj +770 0 obj +<> endobj +771 0 obj +<> endobj +772 0 obj +<> endobj +773 0 obj +<> endobj +774 0 obj +<> endobj +775 0 obj +<> endobj +776 0 obj +<> endobj +777 0 obj +<> endobj +778 0 obj +<> endobj +779 0 obj +<> endobj +780 0 obj +<> endobj +781 0 obj +<> endobj +782 0 obj +<> endobj +783 0 obj +<> endobj +784 0 obj +<> endobj +785 0 obj +<> endobj +786 0 obj +<> endobj +787 0 obj +<> endobj +788 0 obj +<> endobj +789 0 obj +<> endobj +790 0 obj +<> endobj +791 0 obj +<> endobj +792 0 obj +<> endobj +793 0 obj +<> endobj +794 0 obj +<> endobj +795 0 obj +<> endobj +796 0 obj +<> endobj +797 0 obj +<> endobj +798 0 obj +<> endobj +799 0 obj +<> endobj +800 0 obj +<> endobj +801 0 obj +<> endobj +802 0 obj +<> endobj +803 0 obj +<> endobj +804 0 obj +<> endobj +805 0 obj +<> endobj +806 0 obj +<> endobj +807 0 obj +<> endobj +808 0 obj +<> endobj +809 0 obj +<> endobj +810 0 obj +<> endobj +811 0 obj +<> endobj +812 0 obj +<> endobj +813 0 obj +<> endobj +814 0 obj +<> endobj +815 0 obj +<> endobj +816 0 obj +<> endobj +817 0 obj +<> endobj +818 0 obj +<> endobj +819 0 obj +<> endobj +820 0 obj +<> endobj +821 0 obj +<> endobj +822 0 obj +<> endobj +823 0 obj +<> endobj +824 0 obj +<> endobj +825 0 obj +<> endobj +826 0 obj +<> endobj +827 0 obj +<> endobj +828 0 obj +<> endobj +829 0 obj +<> endobj +830 0 obj +<> endobj +831 0 obj +<> endobj +832 0 obj +<> endobj +833 0 obj +<> endobj +834 0 obj +<> endobj +835 0 obj +<> endobj +836 0 obj +<> endobj +837 0 obj +<> endobj +838 0 obj +<> endobj +839 0 obj +<> endobj +840 0 obj +<> endobj +841 0 obj +<> endobj +842 0 obj +<> endobj +843 0 obj +<> endobj +844 0 obj +<> endobj +845 0 obj +<> endobj +846 0 obj +<> endobj +847 0 obj +<> endobj +848 0 obj +<> endobj +849 0 obj +<> endobj +850 0 obj +<> endobj +851 0 obj +<> endobj +852 0 obj +<> endobj +853 0 obj +<> endobj +854 0 obj +<> endobj +855 0 obj +<> endobj +856 0 obj +<> endobj +857 0 obj +<> endobj +858 0 obj +<> endobj +859 0 obj +<> endobj +860 0 obj +<> endobj + +12 0 obj +<< +/Type /Outlines +/First 13 0 R +/Last 15 0 R +/Count 306 +>> +endobj + +13 0 obj +<< +/Title (Pages) +/Parent 12 0 R +/Next 15 0 R +/First 14 0 R +/Last 14 0 R +/Count 1 +>> +endobj + +15 0 obj +<< +/Title (Net) +/Parent 12 0 R +/Prev 13 0 R +/First 16 0 R +/Last 315 0 R +/Count 303 +>> +endobj + +14 0 obj +<< +/Title (SCH_Pro-micro_Pinouts 1-Sheet_1) +/Parent 13 0 R +/Dest [3 0 R /XYZ 0 1197.36 0] +>> +endobj + +16 0 obj +<< +/Title (3V3) +/Parent 15 0 R +/Next 35 0 R +/First 17 0 R +/Last 34 0 R +/Count 18 +>> +endobj + +35 0 obj +<< +/Title (+5V) +/Parent 15 0 R +/Prev 16 0 R +/Next 39 0 R +/First 36 0 R +/Last 38 0 R +/Count 3 +>> +endobj + +39 0 obj +<< +/Title ($1N1) +/Parent 15 0 R +/Prev 35 0 R +/Next 41 0 R +/First 40 0 R +/Last 40 0 R +/Count 1 +>> +endobj + +41 0 obj +<< +/Title ($1N25) +/Parent 15 0 R +/Prev 39 0 R +/Next 43 0 R +/First 42 0 R +/Last 42 0 R +/Count 1 +>> +endobj + +43 0 obj +<< +/Title ($1N62) +/Parent 15 0 R +/Prev 41 0 R +/Next 45 0 R +/First 44 0 R +/Last 44 0 R +/Count 1 +>> +endobj + +45 0 obj +<< +/Title (ADC) +/Parent 15 0 R +/Prev 43 0 R +/Next 50 0 R +/First 46 0 R +/Last 49 0 R +/Count 4 +>> +endobj + +50 0 obj +<< +/Title (BATT) +/Parent 15 0 R +/Prev 45 0 R +/Next 57 0 R +/First 51 0 R +/Last 56 0 R +/Count 6 +>> +endobj + +57 0 obj +<< +/Title (BUSY) +/Parent 15 0 R +/Prev 50 0 R +/Next 73 0 R +/First 58 0 R +/Last 72 0 R +/Count 15 +>> +endobj + +73 0 obj +<< +/Title (CS) +/Parent 15 0 R +/Prev 57 0 R +/Next 89 0 R +/First 74 0 R +/Last 88 0 R +/Count 15 +>> +endobj + +89 0 obj +<< +/Title (DIO2) +/Parent 15 0 R +/Prev 73 0 R +/Next 102 0 R +/First 90 0 R +/Last 101 0 R +/Count 12 +>> +endobj + +102 0 obj +<< +/Title (DIO3) +/Parent 15 0 R +/Prev 89 0 R +/Next 104 0 R +/First 103 0 R +/Last 103 0 R +/Count 1 +>> +endobj + +104 0 obj +<< +/Title (E_INK_BUSY) +/Parent 15 0 R +/Prev 102 0 R +/Next 109 0 R +/First 105 0 R +/Last 108 0 R +/Count 4 +>> +endobj + +109 0 obj +<< +/Title (E_INK_CS) +/Parent 15 0 R +/Prev 104 0 R +/Next 113 0 R +/First 110 0 R +/Last 112 0 R +/Count 3 +>> +endobj + +113 0 obj +<< +/Title (E_INK_D/C) +/Parent 15 0 R +/Prev 109 0 R +/Next 117 0 R +/First 114 0 R +/Last 116 0 R +/Count 3 +>> +endobj + +117 0 obj +<< +/Title (E_INK_NRST) +/Parent 15 0 R +/Prev 113 0 R +/Next 121 0 R +/First 118 0 R +/Last 120 0 R +/Count 3 +>> +endobj + +121 0 obj +<< +/Title (GND) +/Parent 15 0 R +/Prev 117 0 R +/Next 196 0 R +/First 122 0 R +/Last 195 0 R +/Count 74 +>> +endobj + +196 0 obj +<< +/Title (GPSEN) +/Parent 15 0 R +/Prev 121 0 R +/Next 199 0 R +/First 197 0 R +/Last 198 0 R +/Count 2 +>> +endobj + +199 0 obj +<< +/Title (GPSRX) +/Parent 15 0 R +/Prev 196 0 R +/Next 202 0 R +/First 200 0 R +/Last 201 0 R +/Count 2 +>> +endobj + +202 0 obj +<< +/Title (GPSTX) +/Parent 15 0 R +/Prev 199 0 R +/Next 205 0 R +/First 203 0 R +/Last 204 0 R +/Count 2 +>> +endobj + +205 0 obj +<< +/Title (IRQ) +/Parent 15 0 R +/Prev 202 0 R +/Next 221 0 R +/First 206 0 R +/Last 220 0 R +/Count 15 +>> +endobj + +221 0 obj +<< +/Title (LORA_ANT) +/Parent 15 0 R +/Prev 205 0 R +/Next 223 0 R +/First 222 0 R +/Last 222 0 R +/Count 1 +>> +endobj + +223 0 obj +<< +/Title (MISO) +/Parent 15 0 R +/Prev 221 0 R +/Next 239 0 R +/First 224 0 R +/Last 238 0 R +/Count 15 +>> +endobj + +239 0 obj +<< +/Title (MOSI) +/Parent 15 0 R +/Prev 223 0 R +/Next 257 0 R +/First 240 0 R +/Last 256 0 R +/Count 17 +>> +endobj + +257 0 obj +<< +/Title (NRST) +/Parent 15 0 R +/Prev 239 0 R +/Next 273 0 R +/First 258 0 R +/Last 272 0 R +/Count 15 +>> +endobj + +273 0 obj +<< +/Title (RBTN) +/Parent 15 0 R +/Prev 257 0 R +/Next 277 0 R +/First 274 0 R +/Last 276 0 R +/Count 3 +>> +endobj + +277 0 obj +<< +/Title (RXEN) +/Parent 15 0 R +/Prev 273 0 R +/Next 285 0 R +/First 278 0 R +/Last 284 0 R +/Count 7 +>> +endobj + +285 0 obj +<< +/Title (SCK) +/Parent 15 0 R +/Prev 277 0 R +/Next 303 0 R +/First 286 0 R +/Last 302 0 R +/Count 17 +>> +endobj + +303 0 obj +<< +/Title (SCL) +/Parent 15 0 R +/Prev 285 0 R +/Next 306 0 R +/First 304 0 R +/Last 305 0 R +/Count 2 +>> +endobj + +306 0 obj +<< +/Title (SDA) +/Parent 15 0 R +/Prev 303 0 R +/Next 309 0 R +/First 307 0 R +/Last 308 0 R +/Count 2 +>> +endobj + +309 0 obj +<< +/Title (SERIAL2RX) +/Parent 15 0 R +/Prev 306 0 R +/Next 312 0 R +/First 310 0 R +/Last 311 0 R +/Count 2 +>> +endobj + +312 0 obj +<< +/Title (SERIAL2TX) +/Parent 15 0 R +/Prev 309 0 R +/Next 315 0 R +/First 313 0 R +/Last 314 0 R +/Count 2 +>> +endobj + +315 0 obj +<< +/Title (UBTN) +/Parent 15 0 R +/Prev 312 0 R +/First 316 0 R +/Last 318 0 R +/Count 3 +>> +endobj + +17 0 obj +<< +/Title ($1N5) +/Parent 16 0 R +/Next 18 0 R +/A 319 0 R +>> +endobj + +18 0 obj +<< +/Title ($1N29) +/Parent 16 0 R +/Prev 17 0 R +/Next 19 0 R +/A 321 0 R +>> +endobj + +19 0 obj +<< +/Title ($1N35) +/Parent 16 0 R +/Prev 18 0 R +/Next 20 0 R +/A 323 0 R +>> +endobj + +20 0 obj +<< +/Title ($1N54) +/Parent 16 0 R +/Prev 19 0 R +/Next 21 0 R +/A 325 0 R +>> +endobj + +21 0 obj +<< +/Title ($1N1528) +/Parent 16 0 R +/Prev 20 0 R +/Next 22 0 R +/A 327 0 R +>> +endobj + +22 0 obj +<< +/Title ($1N1550) +/Parent 16 0 R +/Prev 21 0 R +/Next 23 0 R +/A 329 0 R +>> +endobj + +23 0 obj +<< +/Title ($1N1574) +/Parent 16 0 R +/Prev 22 0 R +/Next 24 0 R +/A 331 0 R +>> +endobj + +24 0 obj +<< +/Title ($1N1582) +/Parent 16 0 R +/Prev 23 0 R +/Next 25 0 R +/A 333 0 R +>> +endobj + +25 0 obj +<< +/Title ($1N1616) +/Parent 16 0 R +/Prev 24 0 R +/Next 26 0 R +/A 335 0 R +>> +endobj + +26 0 obj +<< +/Title ($1N1618) +/Parent 16 0 R +/Prev 25 0 R +/Next 27 0 R +/A 337 0 R +>> +endobj + +27 0 obj +<< +/Title ($1N1732) +/Parent 16 0 R +/Prev 26 0 R +/Next 28 0 R +/A 339 0 R +>> +endobj + +28 0 obj +<< +/Title ($1N1742) +/Parent 16 0 R +/Prev 27 0 R +/Next 29 0 R +/A 341 0 R +>> +endobj + +29 0 obj +<< +/Title ($1N1776) +/Parent 16 0 R +/Prev 28 0 R +/Next 30 0 R +/A 343 0 R +>> +endobj + +30 0 obj +<< +/Title ($1N1810) +/Parent 16 0 R +/Prev 29 0 R +/Next 31 0 R +/A 345 0 R +>> +endobj + +31 0 obj +<< +/Title ($1N1860) +/Parent 16 0 R +/Prev 30 0 R +/Next 32 0 R +/A 347 0 R +>> +endobj + +32 0 obj +<< +/Title ($1N1874) +/Parent 16 0 R +/Prev 31 0 R +/Next 33 0 R +/A 349 0 R +>> +endobj + +33 0 obj +<< +/Title ($1N5406) +/Parent 16 0 R +/Prev 32 0 R +/Next 34 0 R +/A 351 0 R +>> +endobj + +34 0 obj +<< +/Title ($1N5445) +/Parent 16 0 R +/Prev 33 0 R +/A 353 0 R +>> +endobj + +36 0 obj +<< +/Title ($1N23) +/Parent 35 0 R +/Next 37 0 R +/A 355 0 R +>> +endobj + +37 0 obj +<< +/Title ($1N31) +/Parent 35 0 R +/Prev 36 0 R +/Next 38 0 R +/A 357 0 R +>> +endobj + +38 0 obj +<< +/Title ($1N1570) +/Parent 35 0 R +/Prev 37 0 R +/A 359 0 R +>> +endobj + +40 0 obj +<< +/Title ($1N1) +/Parent 39 0 R +/A 361 0 R +>> +endobj + +42 0 obj +<< +/Title ($1N25) +/Parent 41 0 R +/A 363 0 R +>> +endobj + +44 0 obj +<< +/Title ($1N62) +/Parent 43 0 R +/A 365 0 R +>> +endobj + +46 0 obj +<< +/Title ($1N15) +/Parent 45 0 R +/Next 47 0 R +/A 367 0 R +>> +endobj + +47 0 obj +<< +/Title ($1N44) +/Parent 45 0 R +/Prev 46 0 R +/Next 48 0 R +/A 369 0 R +>> +endobj + +48 0 obj +<< +/Title ($1N1852) +/Parent 45 0 R +/Prev 47 0 R +/Next 49 0 R +/A 371 0 R +>> +endobj + +49 0 obj +<< +/Title ($1N1856) +/Parent 45 0 R +/Prev 48 0 R +/A 373 0 R +>> +endobj + +51 0 obj +<< +/Title ($1N1494) +/Parent 50 0 R +/Next 52 0 R +/A 375 0 R +>> +endobj + +52 0 obj +<< +/Title ($1N1508) +/Parent 50 0 R +/Prev 51 0 R +/Next 53 0 R +/A 377 0 R +>> +endobj + +53 0 obj +<< +/Title ($1N1578) +/Parent 50 0 R +/Prev 52 0 R +/Next 54 0 R +/A 379 0 R +>> +endobj + +54 0 obj +<< +/Title ($1N1846) +/Parent 50 0 R +/Prev 53 0 R +/Next 55 0 R +/A 381 0 R +>> +endobj + +55 0 obj +<< +/Title ($1N1848) +/Parent 50 0 R +/Prev 54 0 R +/Next 56 0 R +/A 383 0 R +>> +endobj + +56 0 obj +<< +/Title ($1N1854) +/Parent 50 0 R +/Prev 55 0 R +/A 385 0 R +>> +endobj + +58 0 obj +<< +/Title ($1N12) +/Parent 57 0 R +/Next 59 0 R +/A 387 0 R +>> +endobj + +59 0 obj +<< +/Title ($1N47) +/Parent 57 0 R +/Prev 58 0 R +/Next 60 0 R +/A 389 0 R +>> +endobj + +60 0 obj +<< +/Title ($1N1540) +/Parent 57 0 R +/Prev 59 0 R +/Next 61 0 R +/A 391 0 R +>> +endobj + +61 0 obj +<< +/Title ($1N1568) +/Parent 57 0 R +/Prev 60 0 R +/Next 62 0 R +/A 393 0 R +>> +endobj + +62 0 obj +<< +/Title ($1N1600) +/Parent 57 0 R +/Prev 61 0 R +/Next 63 0 R +/A 395 0 R +>> +endobj + +63 0 obj +<< +/Title ($1N1636) +/Parent 57 0 R +/Prev 62 0 R +/Next 64 0 R +/A 397 0 R +>> +endobj + +64 0 obj +<< +/Title ($1N1660) +/Parent 57 0 R +/Prev 63 0 R +/Next 65 0 R +/A 399 0 R +>> +endobj + +65 0 obj +<< +/Title ($1N1696) +/Parent 57 0 R +/Prev 64 0 R +/Next 66 0 R +/A 401 0 R +>> +endobj + +66 0 obj +<< +/Title ($1N1710) +/Parent 57 0 R +/Prev 65 0 R +/Next 67 0 R +/A 403 0 R +>> +endobj + +67 0 obj +<< +/Title ($1N1736) +/Parent 57 0 R +/Prev 66 0 R +/Next 68 0 R +/A 405 0 R +>> +endobj + +68 0 obj +<< +/Title ($1N1760) +/Parent 57 0 R +/Prev 67 0 R +/Next 69 0 R +/A 407 0 R +>> +endobj + +69 0 obj +<< +/Title ($1N1778) +/Parent 57 0 R +/Prev 68 0 R +/Next 70 0 R +/A 409 0 R +>> +endobj + +70 0 obj +<< +/Title ($1N1814) +/Parent 57 0 R +/Prev 69 0 R +/Next 71 0 R +/A 411 0 R +>> +endobj + +71 0 obj +<< +/Title ($1N1836) +/Parent 57 0 R +/Prev 70 0 R +/Next 72 0 R +/A 413 0 R +>> +endobj + +72 0 obj +<< +/Title ($1N1870) +/Parent 57 0 R +/Prev 71 0 R +/A 415 0 R +>> +endobj + +74 0 obj +<< +/Title ($1N10) +/Parent 73 0 R +/Next 75 0 R +/A 417 0 R +>> +endobj + +75 0 obj +<< +/Title ($1N49) +/Parent 73 0 R +/Prev 74 0 R +/Next 76 0 R +/A 419 0 R +>> +endobj + +76 0 obj +<< +/Title ($1N1542) +/Parent 73 0 R +/Prev 75 0 R +/Next 77 0 R +/A 421 0 R +>> +endobj + +77 0 obj +<< +/Title ($1N1566) +/Parent 73 0 R +/Prev 76 0 R +/Next 78 0 R +/A 423 0 R +>> +endobj + +78 0 obj +<< +/Title ($1N1602) +/Parent 73 0 R +/Prev 77 0 R +/Next 79 0 R +/A 425 0 R +>> +endobj + +79 0 obj +<< +/Title ($1N1626) +/Parent 73 0 R +/Prev 78 0 R +/Next 80 0 R +/A 427 0 R +>> +endobj + +80 0 obj +<< +/Title ($1N1670) +/Parent 73 0 R +/Prev 79 0 R +/Next 81 0 R +/A 429 0 R +>> +endobj + +81 0 obj +<< +/Title ($1N1686) +/Parent 73 0 R +/Prev 80 0 R +/Next 82 0 R +/A 431 0 R +>> +endobj + +82 0 obj +<< +/Title ($1N1718) +/Parent 73 0 R +/Prev 81 0 R +/Next 83 0 R +/A 433 0 R +>> +endobj + +83 0 obj +<< +/Title ($1N1728) +/Parent 73 0 R +/Prev 82 0 R +/Next 84 0 R +/A 435 0 R +>> +endobj + +84 0 obj +<< +/Title ($1N1752) +/Parent 73 0 R +/Prev 83 0 R +/Next 85 0 R +/A 437 0 R +>> +endobj + +85 0 obj +<< +/Title ($1N1788) +/Parent 73 0 R +/Prev 84 0 R +/Next 86 0 R +/A 439 0 R +>> +endobj + +86 0 obj +<< +/Title ($1N1808) +/Parent 73 0 R +/Prev 85 0 R +/Next 87 0 R +/A 441 0 R +>> +endobj + +87 0 obj +<< +/Title ($1N1828) +/Parent 73 0 R +/Prev 86 0 R +/Next 88 0 R +/A 443 0 R +>> +endobj + +88 0 obj +<< +/Title ($1N1876) +/Parent 73 0 R +/Prev 87 0 R +/A 445 0 R +>> +endobj + +90 0 obj +<< +/Title ($1N1624) +/Parent 89 0 R +/Next 91 0 R +/A 447 0 R +>> +endobj + +91 0 obj +<< +/Title ($1N1672) +/Parent 89 0 R +/Prev 90 0 R +/Next 92 0 R +/A 449 0 R +>> +endobj + +92 0 obj +<< +/Title ($1N1684) +/Parent 89 0 R +/Prev 91 0 R +/Next 93 0 R +/A 451 0 R +>> +endobj + +93 0 obj +<< +/Title ($1N1698) +/Parent 89 0 R +/Prev 92 0 R +/Next 94 0 R +/A 453 0 R +>> +endobj + +94 0 obj +<< +/Title ($1N1700) +/Parent 89 0 R +/Prev 93 0 R +/Next 95 0 R +/A 455 0 R +>> +endobj + +95 0 obj +<< +/Title ($1N1702) +/Parent 89 0 R +/Prev 94 0 R +/Next 96 0 R +/A 457 0 R +>> +endobj + +96 0 obj +<< +/Title ($1N1744) +/Parent 89 0 R +/Prev 95 0 R +/Next 97 0 R +/A 459 0 R +>> +endobj + +97 0 obj +<< +/Title ($1N1750) +/Parent 89 0 R +/Prev 96 0 R +/Next 98 0 R +/A 461 0 R +>> +endobj + +98 0 obj +<< +/Title ($1N1820) +/Parent 89 0 R +/Prev 97 0 R +/Next 99 0 R +/A 463 0 R +>> +endobj + +99 0 obj +<< +/Title ($1N1822) +/Parent 89 0 R +/Prev 98 0 R +/Next 100 0 R +/A 465 0 R +>> +endobj + +100 0 obj +<< +/Title ($1N1862) +/Parent 89 0 R +/Prev 99 0 R +/Next 101 0 R +/A 467 0 R +>> +endobj + +101 0 obj +<< +/Title ($1N1864) +/Parent 89 0 R +/Prev 100 0 R +/A 469 0 R +>> +endobj + +103 0 obj +<< +/Title ($1N1678) +/Parent 102 0 R +/A 471 0 R +>> +endobj + +105 0 obj +<< +/Title ($1N1500) +/Parent 104 0 R +/Next 106 0 R +/A 473 0 R +>> +endobj + +106 0 obj +<< +/Title ($1N1514) +/Parent 104 0 R +/Prev 105 0 R +/Next 107 0 R +/A 475 0 R +>> +endobj + +107 0 obj +<< +/Title ($1N5294) +/Parent 104 0 R +/Prev 106 0 R +/Next 108 0 R +/A 477 0 R +>> +endobj + +108 0 obj +<< +/Title ($1N5448) +/Parent 104 0 R +/Prev 107 0 R +/A 479 0 R +>> +endobj + +110 0 obj +<< +/Title ($1N1506) +/Parent 109 0 R +/Next 111 0 R +/A 481 0 R +>> +endobj + +111 0 obj +<< +/Title ($1N5342) +/Parent 109 0 R +/Prev 110 0 R +/Next 112 0 R +/A 483 0 R +>> +endobj + +112 0 obj +<< +/Title ($1N5457) +/Parent 109 0 R +/Prev 111 0 R +/A 485 0 R +>> +endobj + +114 0 obj +<< +/Title ($1N1504) +/Parent 113 0 R +/Next 115 0 R +/A 487 0 R +>> +endobj + +115 0 obj +<< +/Title ($1N5326) +/Parent 113 0 R +/Prev 114 0 R +/Next 116 0 R +/A 489 0 R +>> +endobj + +116 0 obj +<< +/Title ($1N5454) +/Parent 113 0 R +/Prev 115 0 R +/A 491 0 R +>> +endobj + +118 0 obj +<< +/Title ($1N1502) +/Parent 117 0 R +/Next 119 0 R +/A 493 0 R +>> +endobj + +119 0 obj +<< +/Title ($1N5310) +/Parent 117 0 R +/Prev 118 0 R +/Next 120 0 R +/A 495 0 R +>> +endobj + +120 0 obj +<< +/Title ($1N5451) +/Parent 117 0 R +/Prev 119 0 R +/A 497 0 R +>> +endobj + +122 0 obj +<< +/Title ($1N2) +/Parent 121 0 R +/Next 123 0 R +/A 499 0 R +>> +endobj + +123 0 obj +<< +/Title ($1N6) +/Parent 121 0 R +/Prev 122 0 R +/Next 124 0 R +/A 501 0 R +>> +endobj + +124 0 obj +<< +/Title ($1N22) +/Parent 121 0 R +/Prev 123 0 R +/Next 125 0 R +/A 503 0 R +>> +endobj + +125 0 obj +<< +/Title ($1N24) +/Parent 121 0 R +/Prev 124 0 R +/Next 126 0 R +/A 505 0 R +>> +endobj + +126 0 obj +<< +/Title ($1N26) +/Parent 121 0 R +/Prev 125 0 R +/Next 127 0 R +/A 507 0 R +>> +endobj + +127 0 obj +<< +/Title ($1N27) +/Parent 121 0 R +/Prev 126 0 R +/Next 128 0 R +/A 509 0 R +>> +endobj + +128 0 obj +<< +/Title ($1N28) +/Parent 121 0 R +/Prev 127 0 R +/Next 129 0 R +/A 511 0 R +>> +endobj + +129 0 obj +<< +/Title ($1N30) +/Parent 121 0 R +/Prev 128 0 R +/Next 130 0 R +/A 513 0 R +>> +endobj + +130 0 obj +<< +/Title ($1N32) +/Parent 121 0 R +/Prev 129 0 R +/Next 131 0 R +/A 515 0 R +>> +endobj + +131 0 obj +<< +/Title ($1N36) +/Parent 121 0 R +/Prev 130 0 R +/Next 132 0 R +/A 517 0 R +>> +endobj + +132 0 obj +<< +/Title ($1N37) +/Parent 121 0 R +/Prev 131 0 R +/Next 133 0 R +/A 519 0 R +>> +endobj + +133 0 obj +<< +/Title ($1N53) +/Parent 121 0 R +/Prev 132 0 R +/Next 134 0 R +/A 521 0 R +>> +endobj + +134 0 obj +<< +/Title ($1N58) +/Parent 121 0 R +/Prev 133 0 R +/Next 135 0 R +/A 523 0 R +>> +endobj + +135 0 obj +<< +/Title ($1N61) +/Parent 121 0 R +/Prev 134 0 R +/Next 136 0 R +/A 525 0 R +>> +endobj + +136 0 obj +<< +/Title ($1N63) +/Parent 121 0 R +/Prev 135 0 R +/Next 137 0 R +/A 527 0 R +>> +endobj + +137 0 obj +<< +/Title ($1N1516) +/Parent 121 0 R +/Prev 136 0 R +/Next 138 0 R +/A 529 0 R +>> +endobj + +138 0 obj +<< +/Title ($1N1518) +/Parent 121 0 R +/Prev 137 0 R +/Next 139 0 R +/A 531 0 R +>> +endobj + +139 0 obj +<< +/Title ($1N1524) +/Parent 121 0 R +/Prev 138 0 R +/Next 140 0 R +/A 533 0 R +>> +endobj + +140 0 obj +<< +/Title ($1N1526) +/Parent 121 0 R +/Prev 139 0 R +/Next 141 0 R +/A 535 0 R +>> +endobj + +141 0 obj +<< +/Title ($1N1530) +/Parent 121 0 R +/Prev 140 0 R +/Next 142 0 R +/A 537 0 R +>> +endobj + +142 0 obj +<< +/Title ($1N1532) +/Parent 121 0 R +/Prev 141 0 R +/Next 143 0 R +/A 539 0 R +>> +endobj + +143 0 obj +<< +/Title ($1N1534) +/Parent 121 0 R +/Prev 142 0 R +/Next 144 0 R +/A 541 0 R +>> +endobj + +144 0 obj +<< +/Title ($1N1552) +/Parent 121 0 R +/Prev 143 0 R +/Next 145 0 R +/A 543 0 R +>> +endobj + +145 0 obj +<< +/Title ($1N1554) +/Parent 121 0 R +/Prev 144 0 R +/Next 146 0 R +/A 545 0 R +>> +endobj + +146 0 obj +<< +/Title ($1N1572) +/Parent 121 0 R +/Prev 145 0 R +/Next 147 0 R +/A 547 0 R +>> +endobj + +147 0 obj +<< +/Title ($1N1576) +/Parent 121 0 R +/Prev 146 0 R +/Next 148 0 R +/A 549 0 R +>> +endobj + +148 0 obj +<< +/Title ($1N1580) +/Parent 121 0 R +/Prev 147 0 R +/Next 149 0 R +/A 551 0 R +>> +endobj + +149 0 obj +<< +/Title ($1N1584) +/Parent 121 0 R +/Prev 148 0 R +/Next 150 0 R +/A 553 0 R +>> +endobj + +150 0 obj +<< +/Title ($1N1586) +/Parent 121 0 R +/Prev 149 0 R +/Next 151 0 R +/A 555 0 R +>> +endobj + +151 0 obj +<< +/Title ($1N1588) +/Parent 121 0 R +/Prev 150 0 R +/Next 152 0 R +/A 557 0 R +>> +endobj + +152 0 obj +<< +/Title ($1N1590) +/Parent 121 0 R +/Prev 151 0 R +/Next 153 0 R +/A 559 0 R +>> +endobj + +153 0 obj +<< +/Title ($1N1592) +/Parent 121 0 R +/Prev 152 0 R +/Next 154 0 R +/A 561 0 R +>> +endobj + +154 0 obj +<< +/Title ($1N1594) +/Parent 121 0 R +/Prev 153 0 R +/Next 155 0 R +/A 563 0 R +>> +endobj + +155 0 obj +<< +/Title ($1N1596) +/Parent 121 0 R +/Prev 154 0 R +/Next 156 0 R +/A 565 0 R +>> +endobj + +156 0 obj +<< +/Title ($1N1598) +/Parent 121 0 R +/Prev 155 0 R +/Next 157 0 R +/A 567 0 R +>> +endobj + +157 0 obj +<< +/Title ($1N1614) +/Parent 121 0 R +/Prev 156 0 R +/Next 158 0 R +/A 569 0 R +>> +endobj + +158 0 obj +<< +/Title ($1N1638) +/Parent 121 0 R +/Prev 157 0 R +/Next 159 0 R +/A 571 0 R +>> +endobj + +159 0 obj +<< +/Title ($1N1640) +/Parent 121 0 R +/Prev 158 0 R +/Next 160 0 R +/A 573 0 R +>> +endobj + +160 0 obj +<< +/Title ($1N1642) +/Parent 121 0 R +/Prev 159 0 R +/Next 161 0 R +/A 575 0 R +>> +endobj + +161 0 obj +<< +/Title ($1N1644) +/Parent 121 0 R +/Prev 160 0 R +/Next 162 0 R +/A 577 0 R +>> +endobj + +162 0 obj +<< +/Title ($1N1646) +/Parent 121 0 R +/Prev 161 0 R +/Next 163 0 R +/A 579 0 R +>> +endobj + +163 0 obj +<< +/Title ($1N1648) +/Parent 121 0 R +/Prev 162 0 R +/Next 164 0 R +/A 581 0 R +>> +endobj + +164 0 obj +<< +/Title ($1N1650) +/Parent 121 0 R +/Prev 163 0 R +/Next 165 0 R +/A 583 0 R +>> +endobj + +165 0 obj +<< +/Title ($1N1652) +/Parent 121 0 R +/Prev 164 0 R +/Next 166 0 R +/A 585 0 R +>> +endobj + +166 0 obj +<< +/Title ($1N1656) +/Parent 121 0 R +/Prev 165 0 R +/Next 167 0 R +/A 587 0 R +>> +endobj + +167 0 obj +<< +/Title ($1N1658) +/Parent 121 0 R +/Prev 166 0 R +/Next 168 0 R +/A 589 0 R +>> +endobj + +168 0 obj +<< +/Title ($1N1708) +/Parent 121 0 R +/Prev 167 0 R +/Next 169 0 R +/A 591 0 R +>> +endobj + +169 0 obj +<< +/Title ($1N1730) +/Parent 121 0 R +/Prev 168 0 R +/Next 170 0 R +/A 593 0 R +>> +endobj + +170 0 obj +<< +/Title ($1N1734) +/Parent 121 0 R +/Prev 169 0 R +/Next 171 0 R +/A 595 0 R +>> +endobj + +171 0 obj +<< +/Title ($1N1740) +/Parent 121 0 R +/Prev 170 0 R +/Next 172 0 R +/A 597 0 R +>> +endobj + +172 0 obj +<< +/Title ($1N1762) +/Parent 121 0 R +/Prev 171 0 R +/Next 173 0 R +/A 599 0 R +>> +endobj + +173 0 obj +<< +/Title ($1N1764) +/Parent 121 0 R +/Prev 172 0 R +/Next 174 0 R +/A 601 0 R +>> +endobj + +174 0 obj +<< +/Title ($1N1766) +/Parent 121 0 R +/Prev 173 0 R +/Next 175 0 R +/A 603 0 R +>> +endobj + +175 0 obj +<< +/Title ($1N1768) +/Parent 121 0 R +/Prev 174 0 R +/Next 176 0 R +/A 605 0 R +>> +endobj + +176 0 obj +<< +/Title ($1N1770) +/Parent 121 0 R +/Prev 175 0 R +/Next 177 0 R +/A 607 0 R +>> +endobj + +177 0 obj +<< +/Title ($1N1774) +/Parent 121 0 R +/Prev 176 0 R +/Next 178 0 R +/A 609 0 R +>> +endobj + +178 0 obj +<< +/Title ($1N1790) +/Parent 121 0 R +/Prev 177 0 R +/Next 179 0 R +/A 611 0 R +>> +endobj + +179 0 obj +<< +/Title ($1N1792) +/Parent 121 0 R +/Prev 178 0 R +/Next 180 0 R +/A 613 0 R +>> +endobj + +180 0 obj +<< +/Title ($1N1796) +/Parent 121 0 R +/Prev 179 0 R +/Next 181 0 R +/A 615 0 R +>> +endobj + +181 0 obj +<< +/Title ($1N1798) +/Parent 121 0 R +/Prev 180 0 R +/Next 182 0 R +/A 617 0 R +>> +endobj + +182 0 obj +<< +/Title ($1N1800) +/Parent 121 0 R +/Prev 181 0 R +/Next 183 0 R +/A 619 0 R +>> +endobj + +183 0 obj +<< +/Title ($1N1824) +/Parent 121 0 R +/Prev 182 0 R +/Next 184 0 R +/A 621 0 R +>> +endobj + +184 0 obj +<< +/Title ($1N1826) +/Parent 121 0 R +/Prev 183 0 R +/Next 185 0 R +/A 623 0 R +>> +endobj + +185 0 obj +<< +/Title ($1N1838) +/Parent 121 0 R +/Prev 184 0 R +/Next 186 0 R +/A 625 0 R +>> +endobj + +186 0 obj +<< +/Title ($1N1840) +/Parent 121 0 R +/Prev 185 0 R +/Next 187 0 R +/A 627 0 R +>> +endobj + +187 0 obj +<< +/Title ($1N1842) +/Parent 121 0 R +/Prev 186 0 R +/Next 188 0 R +/A 629 0 R +>> +endobj + +188 0 obj +<< +/Title ($1N1844) +/Parent 121 0 R +/Prev 187 0 R +/Next 189 0 R +/A 631 0 R +>> +endobj + +189 0 obj +<< +/Title ($1N1850) +/Parent 121 0 R +/Prev 188 0 R +/Next 190 0 R +/A 633 0 R +>> +endobj + +190 0 obj +<< +/Title ($1N1858) +/Parent 121 0 R +/Prev 189 0 R +/Next 191 0 R +/A 635 0 R +>> +endobj + +191 0 obj +<< +/Title ($1N1866) +/Parent 121 0 R +/Prev 190 0 R +/Next 192 0 R +/A 637 0 R +>> +endobj + +192 0 obj +<< +/Title ($1N1884) +/Parent 121 0 R +/Prev 191 0 R +/Next 193 0 R +/A 639 0 R +>> +endobj + +193 0 obj +<< +/Title ($1N1886) +/Parent 121 0 R +/Prev 192 0 R +/Next 194 0 R +/A 641 0 R +>> +endobj + +194 0 obj +<< +/Title ($1N5390) +/Parent 121 0 R +/Prev 193 0 R +/Next 195 0 R +/A 643 0 R +>> +endobj + +195 0 obj +<< +/Title ($1N5442) +/Parent 121 0 R +/Prev 194 0 R +/A 645 0 R +>> +endobj + +197 0 obj +<< +/Title ($1N19) +/Parent 196 0 R +/Next 198 0 R +/A 647 0 R +>> +endobj + +198 0 obj +<< +/Title ($1N40) +/Parent 196 0 R +/Prev 197 0 R +/A 649 0 R +>> +endobj + +200 0 obj +<< +/Title ($1N21) +/Parent 199 0 R +/Next 201 0 R +/A 651 0 R +>> +endobj + +201 0 obj +<< +/Title ($1N38) +/Parent 199 0 R +/Prev 200 0 R +/A 653 0 R +>> +endobj + +203 0 obj +<< +/Title ($1N20) +/Parent 202 0 R +/Next 204 0 R +/A 655 0 R +>> +endobj + +204 0 obj +<< +/Title ($1N39) +/Parent 202 0 R +/Prev 203 0 R +/A 657 0 R +>> +endobj + +206 0 obj +<< +/Title ($1N11) +/Parent 205 0 R +/Next 207 0 R +/A 659 0 R +>> +endobj + +207 0 obj +<< +/Title ($1N33) +/Parent 205 0 R +/Prev 206 0 R +/Next 208 0 R +/A 661 0 R +>> +endobj + +208 0 obj +<< +/Title ($1N48) +/Parent 205 0 R +/Prev 207 0 R +/Next 209 0 R +/A 663 0 R +>> +endobj + +209 0 obj +<< +/Title ($1N1538) +/Parent 205 0 R +/Prev 208 0 R +/Next 210 0 R +/A 665 0 R +>> +endobj + +210 0 obj +<< +/Title ($1N1556) +/Parent 205 0 R +/Prev 209 0 R +/Next 211 0 R +/A 667 0 R +>> +endobj + +211 0 obj +<< +/Title ($1N1610) +/Parent 205 0 R +/Prev 210 0 R +/Next 212 0 R +/A 669 0 R +>> +endobj + +212 0 obj +<< +/Title ($1N1622) +/Parent 205 0 R +/Prev 211 0 R +/Next 213 0 R +/A 671 0 R +>> +endobj + +213 0 obj +<< +/Title ($1N1674) +/Parent 205 0 R +/Prev 212 0 R +/Next 214 0 R +/A 673 0 R +>> +endobj + +214 0 obj +<< +/Title ($1N1682) +/Parent 205 0 R +/Prev 213 0 R +/Next 215 0 R +/A 675 0 R +>> +endobj + +215 0 obj +<< +/Title ($1N1706) +/Parent 205 0 R +/Prev 214 0 R +/Next 216 0 R +/A 677 0 R +>> +endobj + +216 0 obj +<< +/Title ($1N1738) +/Parent 205 0 R +/Prev 215 0 R +/Next 217 0 R +/A 679 0 R +>> +endobj + +217 0 obj +<< +/Title ($1N1748) +/Parent 205 0 R +/Prev 216 0 R +/Next 218 0 R +/A 681 0 R +>> +endobj + +218 0 obj +<< +/Title ($1N1772) +/Parent 205 0 R +/Prev 217 0 R +/Next 219 0 R +/A 683 0 R +>> +endobj + +219 0 obj +<< +/Title ($1N1816) +/Parent 205 0 R +/Prev 218 0 R +/Next 220 0 R +/A 685 0 R +>> +endobj + +220 0 obj +<< +/Title ($1N1868) +/Parent 205 0 R +/Prev 219 0 R +/A 687 0 R +>> +endobj + +222 0 obj +<< +/Title ($1N1818) +/Parent 221 0 R +/A 689 0 R +>> +endobj + +224 0 obj +<< +/Title ($1N7) +/Parent 223 0 R +/Next 225 0 R +/A 691 0 R +>> +endobj + +225 0 obj +<< +/Title ($1N52) +/Parent 223 0 R +/Prev 224 0 R +/Next 226 0 R +/A 693 0 R +>> +endobj + +226 0 obj +<< +/Title ($1N1548) +/Parent 223 0 R +/Prev 225 0 R +/Next 227 0 R +/A 695 0 R +>> +endobj + +227 0 obj +<< +/Title ($1N1560) +/Parent 223 0 R +/Prev 226 0 R +/Next 228 0 R +/A 697 0 R +>> +endobj + +228 0 obj +<< +/Title ($1N1608) +/Parent 223 0 R +/Prev 227 0 R +/Next 229 0 R +/A 699 0 R +>> +endobj + +229 0 obj +<< +/Title ($1N1630) +/Parent 223 0 R +/Prev 228 0 R +/Next 230 0 R +/A 701 0 R +>> +endobj + +230 0 obj +<< +/Title ($1N1666) +/Parent 223 0 R +/Prev 229 0 R +/Next 231 0 R +/A 703 0 R +>> +endobj + +231 0 obj +<< +/Title ($1N1690) +/Parent 223 0 R +/Prev 230 0 R +/Next 232 0 R +/A 705 0 R +>> +endobj + +232 0 obj +<< +/Title ($1N1714) +/Parent 223 0 R +/Prev 231 0 R +/Next 233 0 R +/A 707 0 R +>> +endobj + +233 0 obj +<< +/Title ($1N1720) +/Parent 223 0 R +/Prev 232 0 R +/Next 234 0 R +/A 709 0 R +>> +endobj + +234 0 obj +<< +/Title ($1N1756) +/Parent 223 0 R +/Prev 233 0 R +/Next 235 0 R +/A 711 0 R +>> +endobj + +235 0 obj +<< +/Title ($1N1782) +/Parent 223 0 R +/Prev 234 0 R +/Next 236 0 R +/A 713 0 R +>> +endobj + +236 0 obj +<< +/Title ($1N1804) +/Parent 223 0 R +/Prev 235 0 R +/Next 237 0 R +/A 715 0 R +>> +endobj + +237 0 obj +<< +/Title ($1N1834) +/Parent 223 0 R +/Prev 236 0 R +/Next 238 0 R +/A 717 0 R +>> +endobj + +238 0 obj +<< +/Title ($1N1880) +/Parent 223 0 R +/Prev 237 0 R +/A 719 0 R +>> +endobj + +240 0 obj +<< +/Title ($1N8) +/Parent 239 0 R +/Next 241 0 R +/A 721 0 R +>> +endobj + +241 0 obj +<< +/Title ($1N51) +/Parent 239 0 R +/Prev 240 0 R +/Next 242 0 R +/A 723 0 R +>> +endobj + +242 0 obj +<< +/Title ($1N1546) +/Parent 239 0 R +/Prev 241 0 R +/Next 243 0 R +/A 725 0 R +>> +endobj + +243 0 obj +<< +/Title ($1N1562) +/Parent 239 0 R +/Prev 242 0 R +/Next 244 0 R +/A 727 0 R +>> +endobj + +244 0 obj +<< +/Title ($1N1606) +/Parent 239 0 R +/Prev 243 0 R +/Next 245 0 R +/A 729 0 R +>> +endobj + +245 0 obj +<< +/Title ($1N1628) +/Parent 239 0 R +/Prev 244 0 R +/Next 246 0 R +/A 731 0 R +>> +endobj + +246 0 obj +<< +/Title ($1N1668) +/Parent 239 0 R +/Prev 245 0 R +/Next 247 0 R +/A 733 0 R +>> +endobj + +247 0 obj +<< +/Title ($1N1688) +/Parent 239 0 R +/Prev 246 0 R +/Next 248 0 R +/A 735 0 R +>> +endobj + +248 0 obj +<< +/Title ($1N1716) +/Parent 239 0 R +/Prev 247 0 R +/Next 249 0 R +/A 737 0 R +>> +endobj + +249 0 obj +<< +/Title ($1N1722) +/Parent 239 0 R +/Prev 248 0 R +/Next 250 0 R +/A 739 0 R +>> +endobj + +250 0 obj +<< +/Title ($1N1754) +/Parent 239 0 R +/Prev 249 0 R +/Next 251 0 R +/A 741 0 R +>> +endobj + +251 0 obj +<< +/Title ($1N1784) +/Parent 239 0 R +/Prev 250 0 R +/Next 252 0 R +/A 743 0 R +>> +endobj + +252 0 obj +<< +/Title ($1N1802) +/Parent 239 0 R +/Prev 251 0 R +/Next 253 0 R +/A 745 0 R +>> +endobj + +253 0 obj +<< +/Title ($1N1832) +/Parent 239 0 R +/Prev 252 0 R +/Next 254 0 R +/A 747 0 R +>> +endobj + +254 0 obj +<< +/Title ($1N1882) +/Parent 239 0 R +/Prev 253 0 R +/Next 255 0 R +/A 749 0 R +>> +endobj + +255 0 obj +<< +/Title ($1N5374) +/Parent 239 0 R +/Prev 254 0 R +/Next 256 0 R +/A 751 0 R +>> +endobj + +256 0 obj +<< +/Title ($1N5481) +/Parent 239 0 R +/Prev 255 0 R +/A 753 0 R +>> +endobj + +258 0 obj +<< +/Title ($1N13) +/Parent 257 0 R +/Next 259 0 R +/A 755 0 R +>> +endobj + +259 0 obj +<< +/Title ($1N34) +/Parent 257 0 R +/Prev 258 0 R +/Next 260 0 R +/A 757 0 R +>> +endobj + +260 0 obj +<< +/Title ($1N46) +/Parent 257 0 R +/Prev 259 0 R +/Next 261 0 R +/A 759 0 R +>> +endobj + +261 0 obj +<< +/Title ($1N1536) +/Parent 257 0 R +/Prev 260 0 R +/Next 262 0 R +/A 761 0 R +>> +endobj + +262 0 obj +<< +/Title ($1N1558) +/Parent 257 0 R +/Prev 261 0 R +/Next 263 0 R +/A 763 0 R +>> +endobj + +263 0 obj +<< +/Title ($1N1612) +/Parent 257 0 R +/Prev 262 0 R +/Next 264 0 R +/A 765 0 R +>> +endobj + +264 0 obj +<< +/Title ($1N1620) +/Parent 257 0 R +/Prev 263 0 R +/Next 265 0 R +/A 767 0 R +>> +endobj + +265 0 obj +<< +/Title ($1N1676) +/Parent 257 0 R +/Prev 264 0 R +/Next 266 0 R +/A 769 0 R +>> +endobj + +266 0 obj +<< +/Title ($1N1680) +/Parent 257 0 R +/Prev 265 0 R +/Next 267 0 R +/A 771 0 R +>> +endobj + +267 0 obj +<< +/Title ($1N1704) +/Parent 257 0 R +/Prev 266 0 R +/Next 268 0 R +/A 773 0 R +>> +endobj + +268 0 obj +<< +/Title ($1N1726) +/Parent 257 0 R +/Prev 267 0 R +/Next 269 0 R +/A 775 0 R +>> +endobj + +269 0 obj +<< +/Title ($1N1746) +/Parent 257 0 R +/Prev 268 0 R +/Next 270 0 R +/A 777 0 R +>> +endobj + +270 0 obj +<< +/Title ($1N1780) +/Parent 257 0 R +/Prev 269 0 R +/Next 271 0 R +/A 779 0 R +>> +endobj + +271 0 obj +<< +/Title ($1N1812) +/Parent 257 0 R +/Prev 270 0 R +/Next 272 0 R +/A 781 0 R +>> +endobj + +272 0 obj +<< +/Title ($1N1872) +/Parent 257 0 R +/Prev 271 0 R +/A 783 0 R +>> +endobj + +274 0 obj +<< +/Title ($1N14) +/Parent 273 0 R +/Next 275 0 R +/A 785 0 R +>> +endobj + +275 0 obj +<< +/Title ($1N45) +/Parent 273 0 R +/Prev 274 0 R +/Next 276 0 R +/A 787 0 R +>> +endobj + +276 0 obj +<< +/Title ($1N1520) +/Parent 273 0 R +/Prev 275 0 R +/A 789 0 R +>> +endobj + +278 0 obj +<< +/Title ($1N4) +/Parent 277 0 R +/Next 279 0 R +/A 791 0 R +>> +endobj + +279 0 obj +<< +/Title ($1N56) +/Parent 277 0 R +/Prev 278 0 R +/Next 280 0 R +/A 793 0 R +>> +endobj + +280 0 obj +<< +/Title ($1N57) +/Parent 277 0 R +/Prev 279 0 R +/Next 281 0 R +/A 795 0 R +>> +endobj + +281 0 obj +<< +/Title ($1N1634) +/Parent 277 0 R +/Prev 280 0 R +/Next 282 0 R +/A 797 0 R +>> +endobj + +282 0 obj +<< +/Title ($1N1662) +/Parent 277 0 R +/Prev 281 0 R +/Next 283 0 R +/A 799 0 R +>> +endobj + +283 0 obj +<< +/Title ($1N1694) +/Parent 277 0 R +/Prev 282 0 R +/Next 284 0 R +/A 801 0 R +>> +endobj + +284 0 obj +<< +/Title ($1N1794) +/Parent 277 0 R +/Prev 283 0 R +/A 803 0 R +>> +endobj + +286 0 obj +<< +/Title ($1N9) +/Parent 285 0 R +/Next 287 0 R +/A 805 0 R +>> +endobj + +287 0 obj +<< +/Title ($1N50) +/Parent 285 0 R +/Prev 286 0 R +/Next 288 0 R +/A 807 0 R +>> +endobj + +288 0 obj +<< +/Title ($1N1544) +/Parent 285 0 R +/Prev 287 0 R +/Next 289 0 R +/A 809 0 R +>> +endobj + +289 0 obj +<< +/Title ($1N1564) +/Parent 285 0 R +/Prev 288 0 R +/Next 290 0 R +/A 811 0 R +>> +endobj + +290 0 obj +<< +/Title ($1N1604) +/Parent 285 0 R +/Prev 289 0 R +/Next 291 0 R +/A 813 0 R +>> +endobj + +291 0 obj +<< +/Title ($1N1632) +/Parent 285 0 R +/Prev 290 0 R +/Next 292 0 R +/A 815 0 R +>> +endobj + +292 0 obj +<< +/Title ($1N1664) +/Parent 285 0 R +/Prev 291 0 R +/Next 293 0 R +/A 817 0 R +>> +endobj + +293 0 obj +<< +/Title ($1N1692) +/Parent 285 0 R +/Prev 292 0 R +/Next 294 0 R +/A 819 0 R +>> +endobj + +294 0 obj +<< +/Title ($1N1712) +/Parent 285 0 R +/Prev 293 0 R +/Next 295 0 R +/A 821 0 R +>> +endobj + +295 0 obj +<< +/Title ($1N1724) +/Parent 285 0 R +/Prev 294 0 R +/Next 296 0 R +/A 823 0 R +>> +endobj + +296 0 obj +<< +/Title ($1N1758) +/Parent 285 0 R +/Prev 295 0 R +/Next 297 0 R +/A 825 0 R +>> +endobj + +297 0 obj +<< +/Title ($1N1786) +/Parent 285 0 R +/Prev 296 0 R +/Next 298 0 R +/A 827 0 R +>> +endobj + +298 0 obj +<< +/Title ($1N1806) +/Parent 285 0 R +/Prev 297 0 R +/Next 299 0 R +/A 829 0 R +>> +endobj + +299 0 obj +<< +/Title ($1N1830) +/Parent 285 0 R +/Prev 298 0 R +/Next 300 0 R +/A 831 0 R +>> +endobj + +300 0 obj +<< +/Title ($1N1878) +/Parent 285 0 R +/Prev 299 0 R +/Next 301 0 R +/A 833 0 R +>> +endobj + +301 0 obj +<< +/Title ($1N5358) +/Parent 285 0 R +/Prev 300 0 R +/Next 302 0 R +/A 835 0 R +>> +endobj + +302 0 obj +<< +/Title ($1N5478) +/Parent 285 0 R +/Prev 301 0 R +/A 837 0 R +>> +endobj + +304 0 obj +<< +/Title ($1N17) +/Parent 303 0 R +/Next 305 0 R +/A 839 0 R +>> +endobj + +305 0 obj +<< +/Title ($1N42) +/Parent 303 0 R +/Prev 304 0 R +/A 841 0 R +>> +endobj + +307 0 obj +<< +/Title ($1N16) +/Parent 306 0 R +/Next 308 0 R +/A 843 0 R +>> +endobj + +308 0 obj +<< +/Title ($1N43) +/Parent 306 0 R +/Prev 307 0 R +/A 845 0 R +>> +endobj + +310 0 obj +<< +/Title ($1N1498) +/Parent 309 0 R +/Next 311 0 R +/A 847 0 R +>> +endobj + +311 0 obj +<< +/Title ($1N1512) +/Parent 309 0 R +/Prev 310 0 R +/A 849 0 R +>> +endobj + +313 0 obj +<< +/Title ($1N1496) +/Parent 312 0 R +/Next 314 0 R +/A 851 0 R +>> +endobj + +314 0 obj +<< +/Title ($1N1510) +/Parent 312 0 R +/Prev 313 0 R +/A 853 0 R +>> +endobj + +316 0 obj +<< +/Title ($1N18) +/Parent 315 0 R +/Next 317 0 R +/A 855 0 R +>> +endobj + +317 0 obj +<< +/Title ($1N41) +/Parent 315 0 R +/Prev 316 0 R +/Next 318 0 R +/A 857 0 R +>> +endobj + +318 0 obj +<< +/Title ($1N1522) +/Parent 315 0 R +/Prev 317 0 R +/A 859 0 R +>> +endobj + +861 0 obj +<< +/Producer (jsPDF 0.0.0) +/CreationDate (D:20251108000128-00'00') +>> +endobj +862 0 obj +<< +/Type /Catalog +/Pages 1 0 R +/OpenAction [3 0 R /FitH null] +/PageLayout /OneColumn +/Outlines 12 0 R +>> +endobj +xref +0 863 +0000000000 65535 f +0000334529 00000 n +0000396345 00000 n +0000000015 00000 n +0000000125 00000 n +0000334586 00000 n +0000334751 00000 n +0000334930 00000 n +0000335046 00000 n +0000335215 00000 n +0000336259 00000 n +0000393129 00000 n +0000527015 00000 n +0000527093 00000 n +0000527300 00000 n +0000527196 00000 n +0000527411 00000 n +0000531215 00000 n +0000531292 00000 n +0000531383 00000 n +0000531474 00000 n +0000531565 00000 n +0000531658 00000 n +0000531751 00000 n +0000531844 00000 n +0000531937 00000 n +0000532030 00000 n +0000532123 00000 n +0000532216 00000 n +0000532309 00000 n +0000532402 00000 n +0000532495 00000 n +0000532588 00000 n +0000532681 00000 n +0000532774 00000 n +0000527513 00000 n +0000532854 00000 n +0000532932 00000 n +0000533023 00000 n +0000527627 00000 n +0000533103 00000 n +0000527742 00000 n +0000533167 00000 n +0000527858 00000 n +0000533232 00000 n +0000527974 00000 n +0000533297 00000 n +0000533375 00000 n +0000533466 00000 n +0000533559 00000 n +0000528088 00000 n +0000533639 00000 n +0000533719 00000 n +0000533812 00000 n +0000533905 00000 n +0000533998 00000 n +0000534091 00000 n +0000528203 00000 n +0000534171 00000 n +0000534249 00000 n +0000534340 00000 n +0000534433 00000 n +0000534526 00000 n +0000534619 00000 n +0000534712 00000 n +0000534805 00000 n +0000534898 00000 n +0000534991 00000 n +0000535084 00000 n +0000535177 00000 n +0000535270 00000 n +0000535363 00000 n +0000535456 00000 n +0000528319 00000 n +0000535536 00000 n +0000535614 00000 n +0000535705 00000 n +0000535798 00000 n +0000535891 00000 n +0000535984 00000 n +0000536077 00000 n +0000536170 00000 n +0000536263 00000 n +0000536356 00000 n +0000536449 00000 n +0000536542 00000 n +0000536635 00000 n +0000536728 00000 n +0000536821 00000 n +0000528433 00000 n +0000536901 00000 n +0000536981 00000 n +0000537074 00000 n +0000537167 00000 n +0000537260 00000 n +0000537353 00000 n +0000537446 00000 n +0000537539 00000 n +0000537632 00000 n +0000537725 00000 n +0000537819 00000 n +0000537914 00000 n +0000528551 00000 n +0000537996 00000 n +0000528670 00000 n +0000538065 00000 n +0000538148 00000 n +0000538245 00000 n +0000538342 00000 n +0000528796 00000 n +0000538425 00000 n +0000538508 00000 n +0000538605 00000 n +0000528920 00000 n +0000538688 00000 n +0000538771 00000 n +0000538868 00000 n +0000529045 00000 n +0000538951 00000 n +0000539034 00000 n +0000539131 00000 n +0000529171 00000 n +0000539214 00000 n +0000539294 00000 n +0000539388 00000 n +0000539483 00000 n +0000539578 00000 n +0000539673 00000 n +0000539768 00000 n +0000539863 00000 n +0000539958 00000 n +0000540053 00000 n +0000540148 00000 n +0000540243 00000 n +0000540338 00000 n +0000540433 00000 n +0000540528 00000 n +0000540623 00000 n +0000540720 00000 n +0000540817 00000 n +0000540914 00000 n +0000541011 00000 n +0000541108 00000 n +0000541205 00000 n +0000541302 00000 n +0000541399 00000 n +0000541496 00000 n +0000541593 00000 n +0000541690 00000 n +0000541787 00000 n +0000541884 00000 n +0000541981 00000 n +0000542078 00000 n +0000542175 00000 n +0000542272 00000 n +0000542369 00000 n +0000542466 00000 n +0000542563 00000 n +0000542660 00000 n +0000542757 00000 n +0000542854 00000 n +0000542951 00000 n +0000543048 00000 n +0000543145 00000 n +0000543242 00000 n +0000543339 00000 n +0000543436 00000 n +0000543533 00000 n +0000543630 00000 n +0000543727 00000 n +0000543824 00000 n +0000543921 00000 n +0000544018 00000 n +0000544115 00000 n +0000544212 00000 n +0000544309 00000 n +0000544406 00000 n +0000544503 00000 n +0000544600 00000 n +0000544697 00000 n +0000544794 00000 n +0000544891 00000 n +0000544988 00000 n +0000545085 00000 n +0000545182 00000 n +0000545279 00000 n +0000545376 00000 n +0000545473 00000 n +0000545570 00000 n +0000545667 00000 n +0000545764 00000 n +0000545861 00000 n +0000545958 00000 n +0000546055 00000 n +0000546152 00000 n +0000546249 00000 n +0000529291 00000 n +0000546332 00000 n +0000546413 00000 n +0000529412 00000 n +0000546494 00000 n +0000546575 00000 n +0000529533 00000 n +0000546656 00000 n +0000546737 00000 n +0000529654 00000 n +0000546818 00000 n +0000546899 00000 n +0000546994 00000 n +0000547089 00000 n +0000547186 00000 n +0000547283 00000 n +0000547380 00000 n +0000547477 00000 n +0000547574 00000 n +0000547671 00000 n +0000547768 00000 n +0000547865 00000 n +0000547962 00000 n +0000548059 00000 n +0000548156 00000 n +0000529774 00000 n +0000548239 00000 n +0000529898 00000 n +0000548308 00000 n +0000548388 00000 n +0000548483 00000 n +0000548580 00000 n +0000548677 00000 n +0000548774 00000 n +0000548871 00000 n +0000548968 00000 n +0000549065 00000 n +0000549162 00000 n +0000549259 00000 n +0000549356 00000 n +0000549453 00000 n +0000549550 00000 n +0000549647 00000 n +0000530019 00000 n +0000549730 00000 n +0000549810 00000 n +0000549905 00000 n +0000550002 00000 n +0000550099 00000 n +0000550196 00000 n +0000550293 00000 n +0000550390 00000 n +0000550487 00000 n +0000550584 00000 n +0000550681 00000 n +0000550778 00000 n +0000550875 00000 n +0000550972 00000 n +0000551069 00000 n +0000551166 00000 n +0000551263 00000 n +0000530140 00000 n +0000551346 00000 n +0000551427 00000 n +0000551522 00000 n +0000551617 00000 n +0000551714 00000 n +0000551811 00000 n +0000551908 00000 n +0000552005 00000 n +0000552102 00000 n +0000552199 00000 n +0000552296 00000 n +0000552393 00000 n +0000552490 00000 n +0000552587 00000 n +0000552684 00000 n +0000530261 00000 n +0000552767 00000 n +0000552848 00000 n +0000552943 00000 n +0000530381 00000 n +0000553026 00000 n +0000553106 00000 n +0000553201 00000 n +0000553296 00000 n +0000553393 00000 n +0000553490 00000 n +0000553587 00000 n +0000530501 00000 n +0000553670 00000 n +0000553750 00000 n +0000553845 00000 n +0000553942 00000 n +0000554039 00000 n +0000554136 00000 n +0000554233 00000 n +0000554330 00000 n +0000554427 00000 n +0000554524 00000 n +0000554621 00000 n +0000554718 00000 n +0000554815 00000 n +0000554912 00000 n +0000555009 00000 n +0000555106 00000 n +0000555203 00000 n +0000530621 00000 n +0000555286 00000 n +0000555367 00000 n +0000530740 00000 n +0000555448 00000 n +0000555529 00000 n +0000530859 00000 n +0000555610 00000 n +0000555693 00000 n +0000530984 00000 n +0000555776 00000 n +0000555859 00000 n +0000531109 00000 n +0000555942 00000 n +0000556023 00000 n +0000556118 00000 n +0000396470 00000 n +0000396534 00000 n +0000396980 00000 n +0000397044 00000 n +0000397438 00000 n +0000397502 00000 n +0000397911 00000 n +0000397975 00000 n +0000398408 00000 n +0000398472 00000 n +0000398878 00000 n +0000398942 00000 n +0000399335 00000 n +0000399399 00000 n +0000399831 00000 n +0000399895 00000 n +0000400288 00000 n +0000400352 00000 n +0000400796 00000 n +0000400860 00000 n +0000401304 00000 n +0000401368 00000 n +0000401797 00000 n +0000401861 00000 n +0000402268 00000 n +0000402332 00000 n +0000402727 00000 n +0000402791 00000 n +0000403198 00000 n +0000403262 00000 n +0000403666 00000 n +0000403730 00000 n +0000404170 00000 n +0000404234 00000 n +0000404692 00000 n +0000404756 00000 n +0000405214 00000 n +0000405278 00000 n +0000405674 00000 n +0000405738 00000 n +0000406156 00000 n +0000406220 00000 n +0000406615 00000 n +0000406679 00000 n +0000407109 00000 n +0000407173 00000 n +0000407617 00000 n +0000407681 00000 n +0000408112 00000 n +0000408176 00000 n +0000408596 00000 n +0000408660 00000 n +0000409081 00000 n +0000409145 00000 n +0000409553 00000 n +0000409617 00000 n +0000410025 00000 n +0000410089 00000 n +0000410487 00000 n +0000410551 00000 n +0000410947 00000 n +0000411011 00000 n +0000411418 00000 n +0000411482 00000 n +0000411917 00000 n +0000411981 00000 n +0000412391 00000 n +0000412455 00000 n +0000412865 00000 n +0000412929 00000 n +0000413338 00000 n +0000413402 00000 n +0000413813 00000 n +0000413877 00000 n +0000414283 00000 n +0000414347 00000 n +0000414742 00000 n +0000414806 00000 n +0000415221 00000 n +0000415285 00000 n +0000415714 00000 n +0000415778 00000 n +0000416183 00000 n +0000416247 00000 n +0000416676 00000 n +0000416740 00000 n +0000417195 00000 n +0000417259 00000 n +0000417688 00000 n +0000417752 00000 n +0000418169 00000 n +0000418233 00000 n +0000418628 00000 n +0000418692 00000 n +0000419099 00000 n +0000419163 00000 n +0000419556 00000 n +0000419620 00000 n +0000420049 00000 n +0000420113 00000 n +0000420556 00000 n +0000420620 00000 n +0000421065 00000 n +0000421129 00000 n +0000421524 00000 n +0000421588 00000 n +0000422005 00000 n +0000422069 00000 n +0000422486 00000 n +0000422550 00000 n +0000422979 00000 n +0000423043 00000 n +0000423448 00000 n +0000423512 00000 n +0000423930 00000 n +0000423994 00000 n +0000424449 00000 n +0000424513 00000 n +0000424908 00000 n +0000424972 00000 n +0000425389 00000 n +0000425453 00000 n +0000425848 00000 n +0000425912 00000 n +0000426319 00000 n +0000426383 00000 n +0000426778 00000 n +0000426842 00000 n +0000427259 00000 n +0000427323 00000 n +0000427752 00000 n +0000427816 00000 n +0000428282 00000 n +0000428346 00000 n +0000428764 00000 n +0000428828 00000 n +0000429272 00000 n +0000429336 00000 n +0000429743 00000 n +0000429807 00000 n +0000430251 00000 n +0000430315 00000 n +0000430710 00000 n +0000430774 00000 n +0000431181 00000 n +0000431245 00000 n +0000431640 00000 n +0000431704 00000 n +0000432122 00000 n +0000432186 00000 n +0000432613 00000 n +0000432677 00000 n +0000433106 00000 n +0000433170 00000 n +0000433565 00000 n +0000433629 00000 n +0000434036 00000 n +0000434100 00000 n +0000434518 00000 n +0000434582 00000 n +0000434977 00000 n +0000435041 00000 n +0000435473 00000 n +0000435537 00000 n +0000435942 00000 n +0000436006 00000 n +0000436401 00000 n +0000436465 00000 n +0000436897 00000 n +0000436961 00000 n +0000437405 00000 n +0000437469 00000 n +0000437901 00000 n +0000437965 00000 n +0000438434 00000 n +0000438498 00000 n +0000438942 00000 n +0000439006 00000 n +0000439399 00000 n +0000439463 00000 n +0000439893 00000 n +0000439957 00000 n +0000440353 00000 n +0000440417 00000 n +0000440840 00000 n +0000440904 00000 n +0000441301 00000 n +0000441365 00000 n +0000441820 00000 n +0000441884 00000 n +0000442281 00000 n +0000442345 00000 n +0000442791 00000 n +0000442855 00000 n +0000443274 00000 n +0000443338 00000 n +0000443770 00000 n +0000443834 00000 n +0000444264 00000 n +0000444328 00000 n +0000444761 00000 n +0000444825 00000 n +0000445233 00000 n +0000445297 00000 n +0000445707 00000 n +0000445771 00000 n +0000446212 00000 n +0000446276 00000 n +0000446679 00000 n +0000446743 00000 n +0000447163 00000 n +0000447227 00000 n +0000447659 00000 n +0000447723 00000 n +0000448192 00000 n +0000448256 00000 n +0000448687 00000 n +0000448751 00000 n +0000449166 00000 n +0000449230 00000 n +0000449623 00000 n +0000449687 00000 n +0000450116 00000 n +0000450180 00000 n +0000450586 00000 n +0000450650 00000 n +0000451067 00000 n +0000451131 00000 n +0000451546 00000 n +0000451610 00000 n +0000452042 00000 n +0000452106 00000 n +0000452501 00000 n +0000452565 00000 n +0000453006 00000 n +0000453070 00000 n +0000453485 00000 n +0000453549 00000 n +0000453966 00000 n +0000454030 00000 n +0000454447 00000 n +0000454511 00000 n +0000454928 00000 n +0000454992 00000 n +0000455387 00000 n +0000455451 00000 n +0000455846 00000 n +0000455910 00000 n +0000456305 00000 n +0000456369 00000 n +0000456762 00000 n +0000456826 00000 n +0000457233 00000 n +0000457297 00000 n +0000457726 00000 n +0000457790 00000 n +0000458207 00000 n +0000458271 00000 n +0000458689 00000 n +0000458753 00000 n +0000459193 00000 n +0000459257 00000 n +0000459712 00000 n +0000459776 00000 n +0000460231 00000 n +0000460295 00000 n +0000460724 00000 n +0000460788 00000 n +0000461204 00000 n +0000461268 00000 n +0000461661 00000 n +0000461725 00000 n +0000462130 00000 n +0000462194 00000 n +0000462626 00000 n +0000462690 00000 n +0000463097 00000 n +0000463161 00000 n +0000463568 00000 n +0000463632 00000 n +0000464024 00000 n +0000464088 00000 n +0000464505 00000 n +0000464569 00000 n +0000465009 00000 n +0000465073 00000 n +0000465480 00000 n +0000465544 00000 n +0000465973 00000 n +0000466037 00000 n +0000466432 00000 n +0000466496 00000 n +0000466891 00000 n +0000466955 00000 n +0000467350 00000 n +0000467414 00000 n +0000467809 00000 n +0000467873 00000 n +0000468268 00000 n +0000468332 00000 n +0000468739 00000 n +0000468803 00000 n +0000469198 00000 n +0000469262 00000 n +0000469657 00000 n +0000469721 00000 n +0000470116 00000 n +0000470180 00000 n +0000470575 00000 n +0000470639 00000 n +0000471032 00000 n +0000471096 00000 n +0000471489 00000 n +0000471553 00000 n +0000472022 00000 n +0000472086 00000 n +0000472530 00000 n +0000472594 00000 n +0000473038 00000 n +0000473102 00000 n +0000473553 00000 n +0000473617 00000 n +0000474036 00000 n +0000474100 00000 n +0000474507 00000 n +0000474571 00000 n +0000474964 00000 n +0000475028 00000 n +0000475458 00000 n +0000475522 00000 n +0000475957 00000 n +0000476021 00000 n +0000476452 00000 n +0000476516 00000 n +0000476928 00000 n +0000476992 00000 n +0000477400 00000 n +0000477464 00000 n +0000477887 00000 n +0000477951 00000 n +0000478370 00000 n +0000478434 00000 n +0000478843 00000 n +0000478907 00000 n +0000479340 00000 n +0000479404 00000 n +0000479815 00000 n +0000479879 00000 n +0000480272 00000 n +0000480336 00000 n +0000480731 00000 n +0000480795 00000 n +0000481190 00000 n +0000481254 00000 n +0000481671 00000 n +0000481735 00000 n +0000482128 00000 n +0000482192 00000 n +0000482599 00000 n +0000482663 00000 n +0000483070 00000 n +0000483134 00000 n +0000483541 00000 n +0000483605 00000 n +0000484045 00000 n +0000484109 00000 n +0000484504 00000 n +0000484568 00000 n +0000484975 00000 n +0000485039 00000 n +0000485490 00000 n +0000485554 00000 n +0000485961 00000 n +0000486025 00000 n +0000486445 00000 n +0000486509 00000 n +0000486931 00000 n +0000486995 00000 n +0000487388 00000 n +0000487452 00000 n +0000487906 00000 n +0000487970 00000 n +0000488387 00000 n +0000488451 00000 n +0000488880 00000 n +0000488944 00000 n +0000489349 00000 n +0000489413 00000 n +0000489820 00000 n +0000489884 00000 n +0000490328 00000 n +0000490392 00000 n +0000490799 00000 n +0000490863 00000 n +0000491280 00000 n +0000491344 00000 n +0000491776 00000 n +0000491840 00000 n +0000492247 00000 n +0000492311 00000 n +0000492706 00000 n +0000492770 00000 n +0000493199 00000 n +0000493263 00000 n +0000493695 00000 n +0000493759 00000 n +0000494193 00000 n +0000494257 00000 n +0000494686 00000 n +0000494750 00000 n +0000495165 00000 n +0000495229 00000 n +0000495683 00000 n +0000495747 00000 n +0000496187 00000 n +0000496251 00000 n +0000496667 00000 n +0000496731 00000 n +0000497126 00000 n +0000497190 00000 n +0000497622 00000 n +0000497686 00000 n +0000498115 00000 n +0000498179 00000 n +0000498608 00000 n +0000498672 00000 n +0000499067 00000 n +0000499131 00000 n +0000499526 00000 n +0000499590 00000 n +0000499985 00000 n +0000500049 00000 n +0000500500 00000 n +0000500564 00000 n +0000500959 00000 n +0000501023 00000 n +0000501455 00000 n +0000501519 00000 n +0000501939 00000 n +0000502003 00000 n +0000502424 00000 n +0000502488 00000 n +0000502910 00000 n +0000502974 00000 n +0000503380 00000 n +0000503444 00000 n +0000503876 00000 n +0000503940 00000 n +0000504335 00000 n +0000504399 00000 n +0000504850 00000 n +0000504914 00000 n +0000505341 00000 n +0000505405 00000 n +0000505837 00000 n +0000505901 00000 n +0000506308 00000 n +0000506372 00000 n +0000506790 00000 n +0000506854 00000 n +0000507283 00000 n +0000507347 00000 n +0000507742 00000 n +0000507806 00000 n +0000508201 00000 n +0000508265 00000 n +0000508705 00000 n +0000508769 00000 n +0000509201 00000 n +0000509265 00000 n +0000509699 00000 n +0000509763 00000 n +0000510153 00000 n +0000510217 00000 n +0000510611 00000 n +0000510675 00000 n +0000511082 00000 n +0000511146 00000 n +0000511556 00000 n +0000511620 00000 n +0000512038 00000 n +0000512102 00000 n +0000512557 00000 n +0000512621 00000 n +0000513087 00000 n +0000513151 00000 n +0000513558 00000 n +0000513622 00000 n +0000514029 00000 n +0000514093 00000 n +0000514502 00000 n +0000514566 00000 n +0000514972 00000 n +0000515036 00000 n +0000515453 00000 n +0000515517 00000 n +0000515934 00000 n +0000515998 00000 n +0000516415 00000 n +0000516479 00000 n +0000516872 00000 n +0000516936 00000 n +0000517343 00000 n +0000517407 00000 n +0000517873 00000 n +0000517937 00000 n +0000518344 00000 n +0000518408 00000 n +0000518848 00000 n +0000518912 00000 n +0000519305 00000 n +0000519369 00000 n +0000519787 00000 n +0000519851 00000 n +0000520283 00000 n +0000520347 00000 n +0000520776 00000 n +0000520840 00000 n +0000521235 00000 n +0000521299 00000 n +0000521731 00000 n +0000521795 00000 n +0000522205 00000 n +0000522269 00000 n +0000522675 00000 n +0000522739 00000 n +0000523151 00000 n +0000523215 00000 n +0000523623 00000 n +0000523687 00000 n +0000524083 00000 n +0000524147 00000 n +0000524554 00000 n +0000524618 00000 n +0000525025 00000 n +0000525089 00000 n +0000525507 00000 n +0000525571 00000 n +0000526017 00000 n +0000526081 00000 n +0000526523 00000 n +0000526587 00000 n +0000556201 00000 n +0000556288 00000 n +trailer +<< +/Size 863 +/Root 862 0 R +/Info 861 0 R +/ID [ ] +>> +startxref +556410 +%%EOF diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md index 5a78103ee..de76286b2 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md @@ -4,7 +4,9 @@ ## General -The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts%202024-12-14.pdf) is located in this directory. +The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts.pdf) is located in this directory. + +This variant is suitable for both TCXO and XTAL types of modules. The old XTAL variant has been removed to reduce confusion. ### Note on DIO2, RXEN, TXEN, and RF switching @@ -17,9 +19,13 @@ Several modules require external switching between transmit (Tx) and receive (Rx RXEN is not required to be connected if the selected module already has internal RF switching, or if external RF switching logic is already applied. Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed (marked RF_SW) and has the DIO2-TXEN link internally. +## Making a node based on this variant + +Making your own node based on this design is straightforward. There are various open source and free to use PCB design files available, or you can solder wires directly from a module to the pro-micro. +
- The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. + < Click to expand > The table of known modules is at the bottom of the variant.h, and reproduced here for convenience. | Mfr | Module | TCXO | RF Switch | Notes | | ------------ | ---------------- | ---- | --------- | ------------------------------------- | @@ -34,6 +40,7 @@ Also worth noting that the Seeed WIO SX1262 in particular only has RXEN exposed | Waveshare | Core1262-HF | yes | Ext | | | Waveshare | LoRa Node Module | yes | Int | | | Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed | +| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h | | AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** | | RF Solutions | RFM95 | No | Int | Untested | | Ebyte | E80-900M2213S | Yes | Int | LR1121 radio | @@ -72,6 +79,10 @@ The Semtech default, the values are (taken from [here](https://github.com/Lora-n
+ < Click to expand > + + + ```cpp .rfswitch = { .enable = LR11XX_SYSTEM_RFSW0_HIGH | LR11XX_SYSTEM_RFSW1_HIGH | LR11XX_SYSTEM_RFSW2_HIGH, diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h index 87342a02f..fee8ee88e 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h @@ -175,6 +175,7 @@ settings. | Waveshare | Core1262-HF | yes | Ext | | | Waveshare | LoRa Node Module | yes | Int | | | Seeed | Wio-SX1262 | yes | Ext | Cute! DIO2/TXEN are not exposed | +| Seeed | Wio-LR1121 | yes | Int | LR1121, needs alternate rfswitch.h | | AI-Thinker | RA-02 | No | Int | SX1278 **433mhz band only** | | RF Solutions | RFM95 | No | Int | Untested | | Ebyte | E80-900M2213S | Yes | Int | LR1121 radio | diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini deleted file mode 100644 index 278f578c5..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini +++ /dev/null @@ -1,12 +0,0 @@ -; Promicro + E22(0)-xxxMM / RA-01SH modules board variant - DIY - without TCXO -[env:nrf52_promicro_diy_xtal] -extends = nrf52840_base -board = promicro-nrf52840 -board_level = extra -build_flags = ${nrf52840_base.build_flags} - -I variants/nrf52840/diy/nrf52_promicro_diy_xtal - -D NRF52_PROMICRO_DIY -build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_xtal> -lib_deps = - ${nrf52840_base.lib_deps} -debug_tool = jlink diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp deleted file mode 100644 index 5869ed1d4..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - Copyright (c) 2014-2015 Arduino LLC. All right reserved. - Copyright (c) 2016 Sandeep Mistry All right reserved. - Copyright (c) 2018, Adafruit Industries (adafruit.com) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "variant.h" -#include "nrf.h" -#include "wiring_constants.h" -#include "wiring_digital.h" - -const uint32_t g_ADigitalPinMap[] = { - // P0 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - - // P1 - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; - -void initVariant() -{ - // 3V3 Power Rail - pinMode(PIN_3V3_EN, OUTPUT); - digitalWrite(PIN_3V3_EN, HIGH); -} diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h deleted file mode 100644 index 6e208e79f..000000000 --- a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h +++ /dev/null @@ -1,154 +0,0 @@ -#ifndef _VARIANT_PROMICRO_DIY_ -#define _VARIANT_PROMICRO_DIY_ - -/** Master clock frequency */ -#define VARIANT_MCK (64000000ul) - -// #define USE_LFXO // Board uses 32khz crystal for LF -#define USE_LFRC // Board uses RC for LF - -#define PROMICRO_DIY_XTAL -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "WVariant.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -/* -NRF52 PRO MICRO PIN ASSIGNMENT - -| Pin | Function | | Pin | Function | -|-------|------------|---|---------|-------------| -| Gnd | | | vbat | | -| P0.06 | Serial2 RX | | vbat | | -| P0.08 | Serial2 TX | | Gnd | | -| Gnd | | | reset | | -| Gnd | | | ext_vcc | *see 0.13 | -| P0.17 | RXEN | | P0.31 | BATTERY_PIN | -| P0.20 | GPS_RX | | P0.29 | BUSY | -| P0.22 | GPS_TX | | P0.02 | MISO | -| P0.24 | GPS_EN | | P1.15 | MOSI | -| P1.00 | BUTTON_PIN | | P1.13 | CS | -| P0.11 | SCL | | P1.11 | SCK | -| P1.04 | SDA | | P0.10 | DIO1/IRQ | -| P1.06 | Free pin | | P0.09 | RESET | -| | | | | | -| | Mid board | | | Internal | -| P1.01 | Free pin | | 0.15 | LED | -| P1.02 | Free pin | | 0.13 | 3V3_EN | -| P1.07 | Free pin | | | | -*/ - -// Number of pins defined in PinDescription array -#define PINS_COUNT (48) -#define NUM_DIGITAL_PINS (48) -#define NUM_ANALOG_INPUTS (1) -#define NUM_ANALOG_OUTPUTS (0) - -// Pin 13 enables 3.3V periphery. If the Lora module is on this pin, then it should stay enabled at all times. -#define PIN_3V3_EN (0 + 13) // P0.13 - -// Analog pins -#define BATTERY_PIN (0 + 31) // P0.31 Battery ADC -#define ADC_CHANNEL ADC1_GPIO4_CHANNEL -#define ADC_RESOLUTION 14 -#define BATTERY_SENSE_RESOLUTION_BITS 12 -#define BATTERY_SENSE_RESOLUTION 4096.0 -// Definition of milliVolt per LSB => 3.0V ADC range and 12-bit ADC resolution = 3000mV/4096 -#define VBAT_MV_PER_LSB (0.73242188F) -// Voltage divider value => 1.5M + 1M voltage divider on VBAT = (1.5M / (1M + 1.5M)) -#define VBAT_DIVIDER (0.6F) -// Compensation factor for the VBAT divider -#define VBAT_DIVIDER_COMP (1.73) -// Fixed calculation of milliVolt from compensation value -#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB) -#undef AREF_VOLTAGE -#define AREF_VOLTAGE 3.0 -#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 -#define ADC_MULTIPLIER VBAT_DIVIDER_COMP // REAL_VBAT_MV_PER_LSB -#define VBAT_RAW_TO_SCALED(x) (REAL_VBAT_MV_PER_LSB * x) - -// WIRE IC AND IIC PINS -#define WIRE_INTERFACES_COUNT 1 - -#define PIN_WIRE_SDA (32 + 4) // P1.04 -#define PIN_WIRE_SCL (0 + 11) // P0.11 - -// LED -#define PIN_LED1 (0 + 15) // P0.15 -#define LED_BUILTIN PIN_LED1 -// Actually red -#define LED_BLUE PIN_LED1 -#define LED_STATE_ON 1 // State when LED is lit - -// Button -#define BUTTON_PIN (32 + 0) // P1.00 - -// GPS -#define PIN_GPS_TX (0 + 22) // P0.22 -#define PIN_GPS_RX (0 + 20) // P0.20 - -#define PIN_GPS_EN (0 + 24) // P0.24 -#define GPS_UBLOX -// define GPS_DEBUG - -// UART interfaces -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX - -#define PIN_SERIAL2_RX (0 + 6) // P0.06 -#define PIN_SERIAL2_TX (0 + 8) // P0.08 - -// Serial interfaces -#define SPI_INTERFACES_COUNT 1 - -#define PIN_SPI_MISO (0 + 2) // P0.02 -#define PIN_SPI_MOSI (32 + 15) // P1.15 -#define PIN_SPI_SCK (32 + 11) // P1.11 - -// LORA MODULES -#define USE_LLCC68 -#define USE_SX1262 -// #define USE_RF95 -#define USE_SX1268 - -// LORA CONFIG -#define SX126X_CS (32 + 13) // P1.13 FIXME - we really should define LORA_CS instead -#define SX126X_DIO1 (0 + 10) // P0.10 IRQ -#define SX126X_DIO2_AS_RF_SWITCH // Note for E22 modules: DIO2 is not attached internally to TXEN for automatic TX/RX switching, - // so it needs connecting externally if it is used in this way -#define SX126X_BUSY (0 + 29) // P0.29 -#define SX126X_RESET (0 + 9) // P0.09 -#define SX126X_RXEN (0 + 17) // P0.17 -#define SX126X_TXEN RADIOLIB_NC // Assuming that DIO2 is connected to TXEN pin. If not, TXEN must be connected. - -/* -On the SX1262, DIO3 sets the voltage for an external TCXO, if one is present. If one is not present, then this should not be used. - -Ebyte -e22-900mm22s has no TCXO -e22-900m22s has TCXO -e220-900mm22s has no TCXO, works with/without this definition, looks like DIO3 not connected at all - -AI-thinker -RA-01SH does not have TCXO - -Waveshare -Core1262 has TCXO - -*/ -// #define SX126X_DIO3_TCXO_VOLTAGE 1.8 - -#ifdef __cplusplus -} -#endif - -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ - -#endif \ No newline at end of file From b202559d3712c1b6e08731c620b10d97fa2ac7b4 Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 16 Nov 2025 14:18:16 -0600 Subject: [PATCH 143/286] Add code for preserving favorites, also move to Home screen before reseting (#8647) --- src/graphics/draw/MenuHandler.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index e1d309a10..7d70ec35a 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -790,17 +790,24 @@ void menuHandler::nodeNameLengthMenu() void menuHandler::resetNodeDBMenu() { - static const char *optionsArray[] = {"Back", "Confirm"}; + static const char *optionsArray[] = {"Back", "Reset All", "Preserve Favorites"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Confirm Reset NodeDB"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; + bannerOptions.optionsCount = 3; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == 1) { + if (selected == 1 || selected == 2) { disableBluetooth(); + screen->setFrames(Screen::FOCUS_DEFAULT); + } + if (selected == 1) { LOG_INFO("Initiate node-db reset"); nodeDB->resetNodes(); rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } else if (selected == 2) { + LOG_INFO("Initiate node-db reset but keeping favorites"); + nodeDB->resetNodes(1); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } }; screen->showOverlayBanner(bannerOptions); From d39d1917adf5fecdc59cbf5deb1548b55a0b9c6c Mon Sep 17 00:00:00 2001 From: omgbebebe Date: Tue, 18 Nov 2025 02:54:02 +0400 Subject: [PATCH 144/286] mqtt: do not try to send packets when it disconnected (#8658) --- src/mqtt/MQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index ad35e152a..2dcfd80e1 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -692,7 +692,7 @@ void MQTT::publishNodeInfo() } void MQTT::publishQueuedMessages() { - if (mqttQueue.isEmpty()) + if (mqttQueue.isEmpty() || !isConnected) return; if (!moduleConfig.mqtt.proxy_to_client_enabled && !isConnected) From 567b8ea1c2b2d100c24b0d6cbc437ec89fae0a56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 06:09:25 -0600 Subject: [PATCH 145/286] Automated version bumps (#8626) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 61ecf9fb5..b59bb6202 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.15 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.14 diff --git a/debian/changelog b/debian/changelog index a387cc3c5..437e1645b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.15.0) unstable; urgency=medium + + * Version 2.7.15 + + -- GitHub Actions Thu, 13 Nov 2025 12:31:57 +0000 + meshtasticd (2.7.14.0) unstable; urgency=medium * Version 2.7.14 diff --git a/version.properties b/version.properties index fe1a5b31b..165f476df 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 14 +build = 15 From d18f3f7a658817b35a3ab746d8522c1136890785 Mon Sep 17 00:00:00 2001 From: viric Date: Tue, 18 Nov 2025 18:23:39 +0100 Subject: [PATCH 146/286] Allow deepsleep in rak4630 and make it restart well when power comes back (#7882) * Make RAK4631 nodes power back on deep sleep The devices will hang if the VBAT goes under 1.7V (Brown-out reset) and they will never come back unless power supply goes completely off. This kills unattended nodes. Using the SystemOff the LPCOMP we can get the nodes back again when power comes back, even if VBAT goes under 1.7V, which moreover is more unlikely because the device is off. * Adding support for heltec t114 And moved particularities to variant.h * Remove old cpp comment that belongs to variant.h It was a leftover. * Trunk fix --------- Co-authored-by: Tom Fifield --- src/Power.cpp | 15 +++++-------- src/platform/nrf52/main-nrf52.cpp | 22 ++++++++++++++++++- src/power.h | 2 ++ .../nrf52840/heltec_mesh_node_t114/variant.h | 10 +++++++++ variants/nrf52840/rak4631/variant.h | 14 ++++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/Power.cpp b/src/Power.cpp index d7fd5b33b..fa8661d01 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -194,7 +194,7 @@ static HasBatteryLevel *batteryLevel; // Default to NULL for no battery level se #ifdef BATTERY_PIN -static void adcEnable() +void battery_adcEnable() { #ifdef ADC_CTRL // enable adc voltage divider when we need to read #ifdef ADC_USE_PULLUP @@ -214,7 +214,7 @@ static void adcEnable() #endif } -static void adcDisable() +static void battery_adcDisable() { #ifdef ADC_CTRL // disable adc voltage divider when we need to read #ifdef ADC_USE_PULLUP @@ -320,7 +320,7 @@ class AnalogBatteryLevel : public HasBatteryLevel uint32_t raw = 0; float scaled = 0; - adcEnable(); + battery_adcEnable(); #ifdef ARCH_ESP32 // ADC block for espressif platforms raw = espAdcRead(); scaled = esp_adc_cal_raw_to_voltage(raw, adc_characs); @@ -332,7 +332,7 @@ class AnalogBatteryLevel : public HasBatteryLevel raw = raw / BATTERY_SENSE_SAMPLES; scaled = operativeAdcMultiplier * ((1000 * AREF_VOLTAGE) / pow(2, BATTERY_SENSE_RESOLUTION_BITS)) * raw; #endif - adcDisable(); + battery_adcDisable(); if (!initial_read_done) { // Flush the smoothing filter with an ADC reading, if the reading is plausibly correct @@ -906,13 +906,8 @@ void Power::readPowerStatus() low_voltage_counter++; LOG_DEBUG("Low voltage counter: %d/10", low_voltage_counter); if (low_voltage_counter > 10) { -#ifdef ARCH_NRF52 - // We can't trigger deep sleep on NRF52, it's freezing the board - LOG_DEBUG("Low voltage detected, but not trigger deep sleep"); -#else LOG_INFO("Low voltage detected, trigger deep sleep"); powerFSM.trigger(EVENT_LOW_BATTERY); -#endif } } else { low_voltage_counter = 0; @@ -1552,4 +1547,4 @@ bool Power::meshSolarInit() { return false; } -#endif \ No newline at end of file +#endif diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 8ce74d5f7..f29def72e 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -14,6 +14,9 @@ #include "error.h" #include "main.h" #include "meshUtils.h" +#include "power.h" + +#include #ifdef BQ25703A_ADDR #include "BQ25713.h" @@ -389,6 +392,23 @@ void cpuDeepSleep(uint32_t msecToWake) nrf_gpio_cfg_sense_set(BUTTON_PIN, sense); // Apply SENSE to wake up the device from the deep sleep #endif +#ifdef BATTERY_LPCOMP_INPUT + // Wake up if power rises again + nrf_lpcomp_config_t c; + c.reference = BATTERY_LPCOMP_THRESHOLD; + c.detection = NRF_LPCOMP_DETECT_UP; + c.hyst = NRF_LPCOMP_HYST_NOHYST; + nrf_lpcomp_configure(NRF_LPCOMP, &c); + nrf_lpcomp_input_select(NRF_LPCOMP, BATTERY_LPCOMP_INPUT); + nrf_lpcomp_enable(NRF_LPCOMP); + + battery_adcEnable(); + + nrf_lpcomp_task_trigger(NRF_LPCOMP, NRF_LPCOMP_TASK_START); + while (!nrf_lpcomp_event_check(NRF_LPCOMP, NRF_LPCOMP_EVENT_READY)) + ; +#endif + auto ok = sd_power_system_off(); if (ok != NRF_SUCCESS) { LOG_ERROR("FIXME: Ignoring soft device (EasyDMA pending?) and forcing system-off!"); @@ -420,4 +440,4 @@ void enterDfuMode() #else enterUf2Dfu(); #endif -} \ No newline at end of file +} diff --git a/src/power.h b/src/power.h index cdbdd3ea0..f9ccb08aa 100644 --- a/src/power.h +++ b/src/power.h @@ -144,4 +144,6 @@ class Power : private concurrency::OSThread #endif }; +void battery_adcEnable(); + extern Power *power; diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index 7e82733aa..b6082fdc6 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -210,6 +210,16 @@ No longer populated on PCB #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 #define ADC_MULTIPLIER (4.916F) +// rf52840 AIN2 = Pin 4 +#define BATTERY_LPCOMP_INPUT NRF_LPCOMP_INPUT_2 + +// We have AIN2 with a VBAT divider so AIN2 = VBAT * (100/490) +// We have the device going deep sleep under 3.1V, which is AIN2 = 0.63V +// So we can wake up when VBAT>=VDD is restored to 3.3V, where AIN2 = 0.67V +// Ratio 0.67/3.3 = 0.20, so we can pick a bit higher, 2/8 VDD, which means +// VBAT=4.04V +#define BATTERY_LPCOMP_THRESHOLD NRF_LPCOMP_REF_SUPPLY_2_8 + #define HAS_RTC 0 #ifdef __cplusplus } diff --git a/variants/nrf52840/rak4631/variant.h b/variants/nrf52840/rak4631/variant.h index f5ec11ef2..302e531d5 100644 --- a/variants/nrf52840/rak4631/variant.h +++ b/variants/nrf52840/rak4631/variant.h @@ -267,6 +267,20 @@ SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 #define ADC_MULTIPLIER 1.73 +// RAK4630 AIN0 = nrf52840 AIN3 = Pin 5 +#define BATTERY_LPCOMP_INPUT NRF_LPCOMP_INPUT_3 + +// We have AIN3 with a VBAT divider so AIN3 = VBAT * (1.5/2.5) +// We have the device going deep sleep under 3.1V, which is AIN3 = 1.86V +// So we can wake up when VBAT>=VDD is restored to 3.3V, where AIN3 = 1.98V +// 1.98/3.3 = 6/10, but that's close to the VBAT divider, so we +// pick 6/8VDD, which means VBAT=4.1V. +// Reference: +// VDD=3.3V AIN3=5/8*VDD=2.06V VBAT=1.66*AIN3=3.41V +// VDD=3.3V AIN3=11/16*VDD=2.26V VBAT=1.66*AIN3=3.76V +// VDD=3.3V AIN3=6/8*VDD=2.47V VBAT=1.66*AIN3=4.1V +#define BATTERY_LPCOMP_THRESHOLD NRF_LPCOMP_REF_SUPPLY_11_16 + #define HAS_RTC 1 #define HAS_ETHERNET 1 From 10de230dba820776f87fbfe18429a3486e43db53 Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Tue, 4 Nov 2025 04:35:44 -0700 Subject: [PATCH 147/286] nrf52: add watchdog (#8485) * nrf52: add watchdog Main thread only for now. * bump framework-arduinoadafruitnrf52 to pick up new wdt support * clang-format the new parts of main-nrf52.cpp --------- Co-authored-by: Ben Meadors (cherry picked from commit 83954293d8b52068750f40ae633ae7ccaf39b9c0) --- arch/nrf52/nrf52.ini | 2 +- src/platform/nrf52/main-nrf52.cpp | 33 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini index 36effe017..e60d47ce7 100644 --- a/arch/nrf52/nrf52.ini +++ b/arch/nrf52/nrf52.ini @@ -7,7 +7,7 @@ extends = arduino_base platform_packages = ; our custom Git version until they merge our PR # TODO renovate - platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#e13f5820002a4fb2a5e6754b42ace185277e5adf + platformio/framework-arduinoadafruitnrf52 @ https://github.com/meshtastic/Adafruit_nRF52_Arduino#c770c8a16a351b55b86e347a3d9d7b74ad0bbf39 ; Don't renovate toolchain-gccarmnoneeabi platformio/toolchain-gccarmnoneeabi@~1.90301.0 diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index f29def72e..2ec122062 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -4,6 +4,13 @@ #include #include #include + +#define NRFX_WDT_ENABLED 1 +#define NRFX_WDT0_ENABLED 1 +#define NRFX_WDT_CONFIG_NO_IRQ 1 +#include +#include + #include #include #include @@ -22,6 +29,9 @@ #include "BQ25713.h" #endif +static nrfx_wdt_t nrfx_wdt = NRFX_WDT_INSTANCE(0); +static nrfx_wdt_channel_id nrfx_wdt_channel_id_nrf52_main; + static inline void debugger_break(void) { __asm volatile("bkpt #0x01\n\t" @@ -205,6 +215,15 @@ void checkSDEvents() void nrf52Loop() { + { + static bool watchdog_running = false; + if (!watchdog_running) { + nrfx_wdt_enable(&nrfx_wdt); + watchdog_running = true; + } + } + nrfx_wdt_channel_feed(&nrfx_wdt, nrfx_wdt_channel_id_nrf52_main); + checkSDEvents(); reportLittleFSCorruptionOnce(); } @@ -272,6 +291,20 @@ void nrf52Setup() LOG_DEBUG("Set random seed %u", seed.seed32); randomSeed(seed.seed32); nRFCrypto.end(); + + // Set up nrfx watchdog. Do not enable the watchdog yet (we do that + // the first time through the main loop), so that other threads can + // allocate their own wdt channel to protect themselves from hangs. + nrfx_wdt_config_t wdt0_config = { + .behaviour = NRF_WDT_BEHAVIOUR_RUN_SLEEP, .reload_value = 2000, + // Note: Not using wdt interrupts. + // .interrupt_priority = NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY + }; + nrfx_err_t r = nrfx_wdt_init(&nrfx_wdt, &wdt0_config, + nullptr // Watchdog event handler, not used, we just reset. + ); + + r = nrfx_wdt_channel_alloc(&nrfx_wdt, &nrfx_wdt_channel_id_nrf52_main); } void cpuDeepSleep(uint32_t msecToWake) From 7232dddd691fc8a92cfc91bbc0e52147e1defe2d Mon Sep 17 00:00:00 2001 From: Sebastian Kuzminsky Date: Thu, 6 Nov 2025 22:22:58 -0700 Subject: [PATCH 148/286] nrf52 wdt: pause wdt in Sleep and Halt, set timeout to 90 s The 90 seconds wdt timeout matches the esp32 wdt timeout. --- src/platform/nrf52/main-nrf52.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 2ec122062..827863f33 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -5,6 +5,7 @@ #include #include +#define APP_WATCHDOG_SECS 90 #define NRFX_WDT_ENABLED 1 #define NRFX_WDT0_ENABLED 1 #define NRFX_WDT_CONFIG_NO_IRQ 1 @@ -296,15 +297,17 @@ void nrf52Setup() // the first time through the main loop), so that other threads can // allocate their own wdt channel to protect themselves from hangs. nrfx_wdt_config_t wdt0_config = { - .behaviour = NRF_WDT_BEHAVIOUR_RUN_SLEEP, .reload_value = 2000, + .behaviour = NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT, .reload_value = APP_WATCHDOG_SECS * 1000, // Note: Not using wdt interrupts. // .interrupt_priority = NRFX_WDT_DEFAULT_CONFIG_IRQ_PRIORITY }; nrfx_err_t r = nrfx_wdt_init(&nrfx_wdt, &wdt0_config, nullptr // Watchdog event handler, not used, we just reset. ); + assert(r == NRFX_SUCCESS); r = nrfx_wdt_channel_alloc(&nrfx_wdt, &nrfx_wdt_channel_id_nrf52_main); + assert(r == NRFX_SUCCESS); } void cpuDeepSleep(uint32_t msecToWake) From f9433a31d168abe982abdf556246b76a5afe390d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 12:13:28 -0600 Subject: [PATCH 149/286] Automated version bumps (#8684) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index b59bb6202..243edca0c 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.16 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.15 diff --git a/debian/changelog b/debian/changelog index 437e1645b..e5b84d134 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.16.0) unstable; urgency=medium + + * Version 2.7.16 + + -- GitHub Actions Wed, 19 Nov 2025 16:12:32 +0000 + meshtasticd (2.7.15.0) unstable; urgency=medium * Version 2.7.15 diff --git a/version.properties b/version.properties index 165f476df..3dde9b1a3 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 15 +build = 16 From 8d31fc5ec6a7a40927accd45ecc40b63e7e53944 Mon Sep 17 00:00:00 2001 From: "Jason B. Cox" Date: Wed, 19 Nov 2025 13:59:45 -0800 Subject: [PATCH 150/286] Unify uptime formatting (#8677) * Unify uptime formatting * Fix small label alignment item --------- Co-authored-by: Ben Meadors Co-authored-by: Jason P --- src/graphics/TimeFormatters.cpp | 20 +++++++++++ src/graphics/TimeFormatters.h | 7 ++++ src/graphics/draw/DebugRenderer.cpp | 15 ++------ src/graphics/draw/UIRenderer.cpp | 56 +++++------------------------ 4 files changed, 39 insertions(+), 59 deletions(-) diff --git a/src/graphics/TimeFormatters.cpp b/src/graphics/TimeFormatters.cpp index 47036078b..0a1c23341 100644 --- a/src/graphics/TimeFormatters.cpp +++ b/src/graphics/TimeFormatters.cpp @@ -101,3 +101,23 @@ void getTimeAgoStr(uint32_t agoSecs, char *timeStr, uint8_t maxLength) else snprintf(timeStr, maxLength, "unknown age"); } + +void getUptimeStr(uint32_t uptimeMillis, const char *prefix, char *uptimeStr, uint8_t maxLength, bool includeSecs) +{ + uint32_t days = uptimeMillis / 86400000; + uint32_t hours = (uptimeMillis % 86400000) / 3600000; + uint32_t mins = (uptimeMillis % 3600000) / 60000; + uint32_t secs = (uptimeMillis % 60000) / 1000; + + if (days) { + snprintf(uptimeStr, maxLength, "%s: %ud %uh", prefix, days, hours); + } else if (hours) { + snprintf(uptimeStr, maxLength, "%s: %uh %um", prefix, hours, mins); + } else if (!includeSecs) { + snprintf(uptimeStr, maxLength, "%s: %um", prefix, mins); + } else if (mins) { + snprintf(uptimeStr, maxLength, "%s: %um %us", prefix, mins, secs); + } else { + snprintf(uptimeStr, maxLength, "%s: %us", prefix, secs); + } +} diff --git a/src/graphics/TimeFormatters.h b/src/graphics/TimeFormatters.h index b3d8413a2..f86c6725c 100644 --- a/src/graphics/TimeFormatters.h +++ b/src/graphics/TimeFormatters.h @@ -24,3 +24,10 @@ bool deltaToTimestamp(uint32_t secondsAgo, uint8_t *hours, uint8_t *minutes, int * @param maxLength Maximum length of the resulting string buffer */ void getTimeAgoStr(uint32_t agoSecs, char *timeStr, uint8_t maxLength); + +/** + * Get a compact human-readable string that only shows the largest non-zero time components. + * For example, 0 days 1 hour 2 minutes will display as "1h 2m" but 1 day 2 hours 3 minutes + * will display as "1d 2h". + */ +void getUptimeStr(uint32_t uptimeMillis, const char *prefix, char *uptimeStr, uint8_t maxLength, bool includeSecs = false); diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index d098fa304..79c1e7e61 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -11,6 +11,7 @@ #include "gps/RTC.h" #include "graphics/ScreenFonts.h" #include "graphics/SharedUIDisplay.h" +#include "graphics/TimeFormatters.h" #include "graphics/images.h" #include "main.h" #include "mesh/Channels.h" @@ -650,17 +651,7 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x if (SCREEN_HEIGHT > 64 || (SCREEN_HEIGHT <= 64 && line <= 5)) { // Only show uptime if the screen can show it char uptimeStr[32] = ""; - uint32_t uptime = millis() / 1000; - uint32_t days = uptime / 86400; - uint32_t hours = (uptime % 86400) / 3600; - uint32_t mins = (uptime % 3600) / 60; - // Show as "Up: 2d 3h", "Up: 5h 14m", or "Up: 37m" - if (days) - snprintf(uptimeStr, sizeof(uptimeStr), " Up: %ud %uh", days, hours); - else if (hours) - snprintf(uptimeStr, sizeof(uptimeStr), " Up: %uh %um", hours, mins); - else - snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins); + getUptimeStr(millis(), "Up", uptimeStr, sizeof(uptimeStr)); textWidth = display->getStringWidth(uptimeStr); nameX = (SCREEN_WIDTH - textWidth) / 2; display->drawString(nameX, getTextPositions(display)[line++], uptimeStr); @@ -729,4 +720,4 @@ void drawChirpy(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int1 } // namespace DebugRenderer } // namespace graphics -#endif \ No newline at end of file +#endif diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index 538c32842..c50fe5cf1 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -11,6 +11,7 @@ #include "graphics/Screen.h" #include "graphics/ScreenFonts.h" #include "graphics/SharedUIDisplay.h" +#include "graphics/TimeFormatters.h" #include "graphics/images.h" #include "main.h" #include "target_specific.h" @@ -383,17 +384,7 @@ void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *st // === 4. Uptime (only show if metric is present) === char uptimeStr[32] = ""; if (node->has_device_metrics && node->device_metrics.has_uptime_seconds) { - uint32_t uptime = node->device_metrics.uptime_seconds; - uint32_t days = uptime / 86400; - uint32_t hours = (uptime % 86400) / 3600; - uint32_t mins = (uptime % 3600) / 60; - // Show as "Up: 2d 3h", "Up: 5h 14m", or "Up: 37m" - if (days) - snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %ud %uh", days, hours); - else if (hours) - snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %uh %um", hours, mins); - else - snprintf(uptimeStr, sizeof(uptimeStr), " Uptime: %um", mins); + getUptimeStr(node->device_metrics.uptime_seconds * 1000, " Up", uptimeStr, sizeof(uptimeStr)); } if (uptimeStr[0] && line < 5) { display->drawString(x, getTextPositions(display)[line++], uptimeStr); @@ -592,18 +583,8 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta drawNodes(display, x + 1, getTextPositions(display)[line] + 2, nodeStatus, -1, false, "online"); #endif char uptimeStr[32] = ""; - uint32_t uptime = millis() / 1000; - uint32_t days = uptime / 86400; - uint32_t hours = (uptime % 86400) / 3600; - uint32_t mins = (uptime % 3600) / 60; - // Show as "Up: 2d 3h", "Up: 5h 14m", or "Up: 37m" #if !defined(M5STACK_UNITC6L) - if (days) - snprintf(uptimeStr, sizeof(uptimeStr), "Up: %ud %uh", days, hours); - else if (hours) - snprintf(uptimeStr, sizeof(uptimeStr), "Up: %uh %um", hours, mins); - else - snprintf(uptimeStr, sizeof(uptimeStr), "Up: %um", mins); + getUptimeStr(millis(), "Up", uptimeStr, sizeof(uptimeStr)); #endif display->drawString(SCREEN_WIDTH - display->getStringWidth(uptimeStr), getTextPositions(display)[line++], uptimeStr); @@ -1048,36 +1029,17 @@ void UIRenderer::drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayU if (strcmp(displayLine, "GPS off") != 0 && strcmp(displayLine, "No GPS") != 0) { // === Second Row: Last GPS Fix === if (gpsStatus->getLastFixMillis() > 0) { - uint32_t delta = (millis() - gpsStatus->getLastFixMillis()) / 1000; // seconds since last fix - uint32_t days = delta / 86400; - uint32_t hours = (delta % 86400) / 3600; - uint32_t mins = (delta % 3600) / 60; - uint32_t secs = delta % 60; - - char buf[32]; + uint32_t delta = millis() - gpsStatus->getLastFixMillis(); + char uptimeStr[32]; #if defined(USE_EINK) // E-Ink: skip seconds, show only days/hours/mins - if (days > 0) { - snprintf(buf, sizeof(buf), "Last: %ud %uh", days, hours); - } else if (hours > 0) { - snprintf(buf, sizeof(buf), "Last: %uh %um", hours, mins); - } else { - snprintf(buf, sizeof(buf), "Last: %um", mins); - } + getUptimeStr(delta, "Last", uptimeStr, sizeof(uptimeStr), false); #else // Non E-Ink: include seconds where useful - if (days > 0) { - snprintf(buf, sizeof(buf), "Last: %ud %uh", days, hours); - } else if (hours > 0) { - snprintf(buf, sizeof(buf), "Last: %uh %um", hours, mins); - } else if (mins > 0) { - snprintf(buf, sizeof(buf), "Last: %um %us", mins, secs); - } else { - snprintf(buf, sizeof(buf), "Last: %us", secs); - } + getUptimeStr(delta, "Last", uptimeStr, sizeof(uptimeStr), true); #endif - display->drawString(0, getTextPositions(display)[line++], buf); + display->drawString(0, getTextPositions(display)[line++], uptimeStr); } else { display->drawString(0, getTextPositions(display)[line++], "Last: ?"); } @@ -1422,4 +1384,4 @@ std::string UIRenderer::drawTimeDelta(uint32_t days, uint32_t hours, uint32_t mi } // namespace graphics -#endif // HAS_SCREEN \ No newline at end of file +#endif // HAS_SCREEN From ef298814f2da32d53c3236545ba83b00f27c45c1 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 19 Nov 2025 17:00:13 -0500 Subject: [PATCH 151/286] CI: Submit Bump Version PR against master (#8668) --- .github/workflows/release_channels.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml index d5d642db4..4e5a48dfe 100644 --- a/.github/workflows/release_channels.yml +++ b/.github/workflows/release_channels.yml @@ -61,6 +61,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v5 + with: + # Always use master branch for version bumps + ref: master - name: Setup Python uses: actions/setup-python@v6 From 2ca03fbf4bccad55e2f9e8d66f84bc008113b2ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 16:02:33 -0600 Subject: [PATCH 152/286] chore(deps): update meshtastic-esp8266-oled-ssd1306 digest to 2887bf4 (#8688) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index d62504ae3..4bd047170 100644 --- a/platformio.ini +++ b/platformio.ini @@ -62,7 +62,7 @@ monitor_speed = 115200 monitor_filters = direct lib_deps = # renovate: datasource=git-refs depName=meshtastic-esp8266-oled-ssd1306 packageName=https://github.com/meshtastic/esp8266-oled-ssd1306 gitBranch=master - https://github.com/meshtastic/esp8266-oled-ssd1306/archive/0cbc26b1f8f61957af0475f486b362eafe7cc4e2.zip + https://github.com/meshtastic/esp8266-oled-ssd1306/archive/2887bf4a19f64d92c984dcc8fd5ca7429e425e4a.zip # renovate: datasource=git-refs depName=meshtastic-OneButton packageName=https://github.com/meshtastic/OneButton gitBranch=master https://github.com/meshtastic/OneButton/archive/fa352d668c53f290cfa480a5f79ad422cd828c70.zip # renovate: datasource=git-refs depName=meshtastic-arduino-fsm packageName=https://github.com/meshtastic/arduino-fsm gitBranch=master From 9cf369c5d0ed27d631bc3f18ba58a02f18416947 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 20 Nov 2025 05:41:32 -0600 Subject: [PATCH 153/286] actually respect wake_on_motion setting (#8690) --- src/motion/MotionSensor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/motion/MotionSensor.cpp b/src/motion/MotionSensor.cpp index b00460aff..d0bfe4e2c 100755 --- a/src/motion/MotionSensor.cpp +++ b/src/motion/MotionSensor.cpp @@ -69,7 +69,8 @@ void MotionSensor::wakeScreen() { if (powerFSM.getState() == &stateDARK) { LOG_DEBUG("Motion wakeScreen detected"); - powerFSM.trigger(EVENT_INPUT); + if (config.display.wake_on_tap_or_motion) + powerFSM.trigger(EVENT_INPUT); } } @@ -87,4 +88,4 @@ void MotionSensor::buttonPress() {} #endif -#endif \ No newline at end of file +#endif From a2a0150ee83e734d6359f85882382a97601764cd Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 20 Nov 2025 06:14:29 -0600 Subject: [PATCH 154/286] Trunk fmt --- README.md | 1 - src/graphics/TFTDisplay.cpp | 53 +++++++++++++++++++----------------- src/graphics/niche/README.md | 1 - src/mesh/NodeDB.cpp | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index a53fe9646..f34bf1839 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,3 @@ Join our community and help improve Meshtastic! 🚀 ## Stats ![Alt](https://repobeats.axiom.co/api/embed/8025e56c482ec63541593cc5bd322c19d5c0bdcf.svg "Repobeats analytics image") - diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index b662869dd..87593b0d4 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -427,33 +427,35 @@ static LGFX *tft = nullptr; #include "lgfx/v1/Touch.hpp" namespace lgfx { - inline namespace v1 - { +inline namespace v1 +{ class TOUCH_CHSC6X : public ITouch { -public: + public: TOUCH_CHSC6X(void) { - _cfg.i2c_addr = TOUCH_SLAVE_ADDRESS; - _cfg.x_min = 0; - _cfg.x_max = 240; - _cfg.y_min = 0; - _cfg.y_max = 320; + _cfg.i2c_addr = TOUCH_SLAVE_ADDRESS; + _cfg.x_min = 0; + _cfg.x_max = 240; + _cfg.y_min = 0; + _cfg.y_max = 320; }; - bool init(void) override { - if(chsc6xTouch==nullptr) { - chsc6xTouch=new chsc6x(&Wire1,TOUCH_SDA_PIN,TOUCH_SCL_PIN,TOUCH_INT_PIN,TOUCH_RST_PIN); + bool init(void) override + { + if (chsc6xTouch == nullptr) { + chsc6xTouch = new chsc6x(&Wire1, TOUCH_SDA_PIN, TOUCH_SCL_PIN, TOUCH_INT_PIN, TOUCH_RST_PIN); } chsc6xTouch->chsc6x_init(); return true; }; - uint_fast8_t getTouchRaw(touch_point_t* tp, uint_fast8_t count) override { - uint16_t raw_x,raw_y; - if (chsc6xTouch->chsc6x_read_touch_info(&raw_x, &raw_y)==0) { - tp[0].x = 320-1-raw_y; - tp[0].y = 240-1-raw_x ; + uint_fast8_t getTouchRaw(touch_point_t *tp, uint_fast8_t count) override + { + uint16_t raw_x, raw_y; + if (chsc6xTouch->chsc6x_read_touch_info(&raw_x, &raw_y) == 0) { + tp[0].x = 320 - 1 - raw_y; + tp[0].y = 240 - 1 - raw_x; tp[0].size = 1; tp[0].id = 1; return 1; @@ -462,13 +464,14 @@ public: return 0; }; - void wakeup(void) override {}; - void sleep(void) override {}; + void wakeup(void) override{}; + void sleep(void) override{}; + private: - chsc6x *chsc6xTouch=nullptr; - }; -} -} + chsc6x *chsc6xTouch = nullptr; +}; +} // namespace v1 +} // namespace lgfx #endif class LGFX : public lgfx::LGFX_Device { @@ -513,9 +516,9 @@ class LGFX : public lgfx::LGFX_Device { // Set the display panel control. auto cfg = _panel_instance.config(); // Gets a structure for display panel settings. - cfg.pin_cs = ST7789_CS; // Pin number where CS is connected (-1 = disable) - cfg.pin_rst = ST7789_RESET; // Pin number where RST is connected (-1 = disable) - cfg.pin_busy = ST7789_BUSY; // Pin number where BUSY is connected (-1 = disable) + cfg.pin_cs = ST7789_CS; // Pin number where CS is connected (-1 = disable) + cfg.pin_rst = ST7789_RESET; // Pin number where RST is connected (-1 = disable) + cfg.pin_busy = ST7789_BUSY; // Pin number where BUSY is connected (-1 = disable) // The following setting values ​​are general initial values ​​for each panel, so please comment out any // unknown items and try them. diff --git a/src/graphics/niche/README.md b/src/graphics/niche/README.md index e87464abc..e58578f6b 100644 --- a/src/graphics/niche/README.md +++ b/src/graphics/niche/README.md @@ -5,7 +5,6 @@ A pattern / collection of resources for creating custom UIs, to target small gro For an example, see the `heltec-vision-master-e290-inkhud` platformio env. - platformio.ini - - suppress default Meshtastic components (Screen, ButtonThread, etc) - define `MESHTASTIC_INCLUDE_NICHE_GRAPHICS` - (possibly) Edit `build_src_filter` to include our new nicheGraphics.h file diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 6291fa4cc..d8146c4a3 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -653,7 +653,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) strncpy(config.network.ntp_server, "meshtastic.pool.ntp.org", 32); #if (defined(T_DECK) || defined(T_WATCH_S3) || defined(UNPHONE) || defined(PICOMPUTER_S3) || defined(SENSECAP_INDICATOR) || \ - defined(ELECROW_PANEL)||defined(HELTEC_V4_TFT)) && \ + defined(ELECROW_PANEL) || defined(HELTEC_V4_TFT)) && \ HAS_TFT // switch BT off by default; use TFT programming mode or hotkey to enable config.bluetooth.enabled = false; From b09fa31492e60cc5eec002d0aa4a0d6257693d57 Mon Sep 17 00:00:00 2001 From: Jason P Date: Thu, 20 Nov 2025 08:07:11 -0600 Subject: [PATCH 155/286] Update src/graphics/draw/MenuHandler.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/draw/MenuHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 11499805b..c22ff23f9 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1353,7 +1353,7 @@ void menuHandler::screenOptionsMenu() optionsEnumArray[options++] = ScreenColor; #endif - optionsArray[options] = "Frame Visiblity Toggle"; + optionsArray[options] = "Frame Visibility Toggle"; optionsEnumArray[options++] = FrameToggles; optionsArray[options] = "Display Units"; From f329de04c47c6a57dbe218b7845704d2bbeec070 Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:47:41 +0800 Subject: [PATCH 156/286] Add a reset pulse signal to the OLED. (#8691) * Add a reset pulse signal to the OLED. * The modification time is the same as that of the Adafruit_SSD1306 library. --- src/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 8fec62953..fd376ea51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -477,6 +477,10 @@ void setup() #ifdef RESET_OLED pinMode(RESET_OLED, OUTPUT); digitalWrite(RESET_OLED, 1); + delay(2); + digitalWrite(RESET_OLED, 0); + delay(10); + digitalWrite(RESET_OLED, 1); #endif #ifdef SENSOR_POWER_CTRL_PIN From 066da492d5b7a1f070c3ee78076e5ea1c624908f Mon Sep 17 00:00:00 2001 From: "Jason B. Cox" Date: Thu, 20 Nov 2025 12:26:07 -0800 Subject: [PATCH 157/286] Fix build when MESHTASTIC_EXCLUDE_PKI is defined --- src/main.cpp | 2 ++ src/mesh/NodeDB.cpp | 2 ++ src/mesh/NodeDB.h | 4 +++- src/modules/AdminModule.cpp | 2 ++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index fd376ea51..8fc2c097b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -963,6 +963,7 @@ void setup() i2cScanner.reset(); #endif +#if !defined(MESHTASTIC_EXCLUDE_PKI) // warn the user about a low entropy key if (nodeDB->keyIsLowEntropy && !nodeDB->hasWarned) { LOG_WARN(LOW_ENTROPY_WARNING); @@ -973,6 +974,7 @@ void setup() service->sendClientNotification(cn); nodeDB->hasWarned = true; } +#endif // buttons are now inputBroker, so have to come after setupModules #if HAS_BUTTON diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index d8146c4a3..bb3fc6dca 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -2008,6 +2008,7 @@ UserLicenseStatus NodeDB::getLicenseStatus(uint32_t nodeNum) return info->user.is_licensed ? UserLicenseStatus::Licensed : UserLicenseStatus::NotLicensed; } +#if !defined(MESHTASTIC_EXCLUDE_PKI) bool NodeDB::checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t &keyToTest) { if (keyToTest.size == 32) { @@ -2022,6 +2023,7 @@ bool NodeDB::checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_pub } return false; } +#endif bool NodeDB::backupPreferences(meshtastic_AdminMessage_BackupLocation location) { diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h index 444ac13e4..306acc0a5 100644 --- a/src/mesh/NodeDB.h +++ b/src/mesh/NodeDB.h @@ -283,7 +283,9 @@ class NodeDB bool hasValidPosition(const meshtastic_NodeInfoLite *n); +#if !defined(MESHTASTIC_EXCLUDE_PKI) bool checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t &keyToTest); +#endif bool backupPreferences(meshtastic_AdminMessage_BackupLocation location); bool restorePreferences(meshtastic_AdminMessage_BackupLocation location, @@ -373,4 +375,4 @@ extern uint32_t error_address; ModuleConfig_RangeTestConfig_size + ModuleConfig_SerialConfig_size + ModuleConfig_StoreForwardConfig_size + \ ModuleConfig_TelemetryConfig_size + ModuleConfig_size) -// Please do not remove this comment, it makes trunk and compiler happy at the same time. \ No newline at end of file +// Please do not remove this comment, it makes trunk and compiler happy at the same time. diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index a98515059..aa510a86d 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -773,6 +773,7 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c) config.lora = validatedLora; // If we're setting region for the first time, init the region and regenerate the keys if (isRegionUnset && config.lora.region > meshtastic_Config_LoRaConfig_RegionCode_UNSET) { +#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN || MESHTASTIC_EXCLUDE_PKI) if (!owner.is_licensed) { bool keygenSuccess = false; if (config.security.private_key.size == 32) { @@ -791,6 +792,7 @@ void AdminModule::handleSetConfig(const meshtastic_Config &c) memcpy(owner.public_key.bytes, config.security.public_key.bytes, 32); } } +#endif config.lora.tx_enabled = true; initRegion(); if (myRegion->dutyCycle < 100) { From 0100eeea67c9ef8d4d495151e54fa5df5b84bd29 Mon Sep 17 00:00:00 2001 From: "Jason B. Cox" Date: Thu, 20 Nov 2025 14:20:18 -0800 Subject: [PATCH 158/286] Fix MenuHandler when MESHTASTIC_EXCLUDE_PKI is defined --- src/graphics/draw/MenuHandler.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index c22ff23f9..bd647c3d8 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -119,6 +119,7 @@ void menuHandler::LoraRegionPicker(uint32_t duration) auto changes = SEGMENT_CONFIG; // This is needed as we wait til picking the LoRa region to generate keys for the first time. +#if !(MESHTASTIC_EXCLUDE_PKI_KEYGEN || MESHTASTIC_EXCLUDE_PKI) if (!owner.is_licensed) { bool keygenSuccess = false; if (config.security.private_key.size == 32) { @@ -139,6 +140,7 @@ void menuHandler::LoraRegionPicker(uint32_t duration) memcpy(owner.public_key.bytes, config.security.public_key.bytes, 32); } } +#endif config.lora.tx_enabled = true; initRegion(); if (myRegion->dutyCycle < 100) { @@ -1750,4 +1752,4 @@ void menuHandler::saveUIConfig() } // namespace graphics -#endif \ No newline at end of file +#endif From d743ba8e75967eb947a1e2467b8bc663884a727f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 21 Nov 2025 10:14:06 +0100 Subject: [PATCH 159/286] Add Thinknode M6 --- boards/ThinkNode-M6.json | 53 +++++++ src/platform/nrf52/architecture.h | 2 + .../ELECROW-ThinkNode-M6/platformio.ini | 15 ++ .../nrf52840/ELECROW-ThinkNode-M6/variant.cpp | 43 ++++++ .../nrf52840/ELECROW-ThinkNode-M6/variant.h | 143 ++++++++++++++++++ 5 files changed, 256 insertions(+) create mode 100644 boards/ThinkNode-M6.json create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M6/variant.h diff --git a/boards/ThinkNode-M6.json b/boards/ThinkNode-M6.json new file mode 100644 index 000000000..9fe324ec2 --- /dev/null +++ b/boards/ThinkNode-M6.json @@ -0,0 +1,53 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_ELECROW_M6 -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + ["0x239A", "0x4405"], + ["0x239A", "0x0029"], + ["0x239A", "0x002A"] + ], + "usb_product": "elecrow_thinknode_m6", + "mcu": "nrf52840", + "variant": "ELECROW-ThinkNode-M6", + "variants_dir": "variants", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": ["bluetooth"], + "debug": { + "jlink_device": "nRF52840_xxAA", + "onboard_tools": ["jlink"], + "svd_path": "nrf52840.svd", + "openocd_target": "nrf52840-mdk-rs" + }, + "frameworks": ["arduino"], + "name": "ELECROW ThinkNode M6", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "speed": 115200, + "protocol": "nrfutil", + "protocols": ["jlink", "nrfjprog", "nrfutil", "stlink"], + "use_1200bps_touch": true, + "require_upload_port": true, + "wait_for_upload_port": true + }, + "url": "https://www.elecrow.com/thinknode-m6-outdoor-solar-power-for-lora-powered-by-nrf52840-supports-gps.html", + "vendor": "ELECROW" +} diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index c74f02c44..6ddb41b16 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -68,6 +68,8 @@ #define HW_VENDOR meshtastic_HardwareModel_T_ECHO_LITE #elif defined(ELECROW_ThinkNode_M1) #define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M1 +#elif defined(ELECROW_ThinkNode_M6) +#define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M6 #elif defined(NANO_G2_ULTRA) #define HW_VENDOR meshtastic_HardwareModel_NANO_G2_ULTRA #elif defined(CANARYONE) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini new file mode 100644 index 000000000..2bf227791 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini @@ -0,0 +1,15 @@ +; ThinkNode M6 - Outdoor Solar Power nrf52840/sx1262 device +[env:thinknode_m6] +extends = nrf52840_base +board = ThinkNode-M6 +board_check = true +debug_tool = jlink + +build_flags = ${nrf52840_base.build_flags} + -Ivariants/nrf52840/ELECROW-ThinkNode-M6 + -DELECROW_ThinkNode_M6 + +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M6> +lib_deps = + ${nrf52840_base.lib_deps} + lewisxhe/PCF8563_Library@^1.0.1 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp new file mode 100644 index 000000000..b84079e66 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp @@ -0,0 +1,43 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 - pins 0 and 1 are hardwired for xtal and should never be enabled + 0xff, 0xff, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + pinMode(PIN_LED1, OUTPUT); + ledOff(PIN_LED1); + + pinMode(PIN_LED2, OUTPUT); + ledOff(PIN_LED2); + + pinMode(VDD_FLASH_EN, OUTPUT); + digitalWrite(VDD_FLASH_EN, HIGH); +} diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h new file mode 100644 index 000000000..98c654df2 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h @@ -0,0 +1,143 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ELECROW_THINKNODE_M6_ +#define _VARIANT_ELECROW_THINKNODE_M6_ + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (1) +#define NUM_ANALOG_OUTPUTS (0) + +// LEDs +#define PIN_LED1 (12) +#define PIN_LED2 (7) +#define LED_BUILTIN PIN_LED1 +#define LED_BLUE PIN_LED2 +#define LED_STATE_ON 1 + +// USB power detection +#define EXT_PWR_DETECT (13) + +// Button +#define PIN_BUTTON1 (17) + +// Battery ADC +#define PIN_A0 (28) +#define BATTERY_PIN PIN_A0 +#define ADC_CTRL (11) +#define ADC_CTRL_ENABLED 1 + +static const uint8_t A0 = PIN_A0; + +#define ADC_RESOLUTION 14 +#define BATTERY_SENSE_SAMPLES 30 + +#define PIN_NFC1 (9) +#define PIN_NFC2 (10) + +// I2C +#define WIRE_INTERFACES_COUNT 1 +#define PIN_WIRE_SDA (32 + 9) +#define PIN_WIRE_SCL (8) + +// Peripheral power enable +#define PIN_POWER_EN (27) + +// Solar charger status +#define EXT_CHRG_DETECT (15) +#define EXT_CHRG_DETECT_VALUE LOW + +// QSPI Flash +#define PIN_QSPI_SCK (32 + 3) +#define PIN_QSPI_CS (23) +#define PIN_QSPI_IO0 (32 + 1) +#define PIN_QSPI_IO1 (32 + 2) +#define PIN_QSPI_IO2 (32 + 4) +#define PIN_QSPI_IO3 (32 + 5) + +#define EXTERNAL_FLASH_DEVICES MX25R1635F +#define EXTERNAL_FLASH_USE_QSPI +#define VDD_FLASH_EN (21) + +// LoRa SX1262 +#define USE_SX1262 +#define SX126X_CS (32 + 12) +#define SX126X_DIO1 (32 + 6) +#define SX126X_BUSY (32 + 11) +#define SX126X_RESET (32 + 10) +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 3.3 + +// GPS L76K +#define GPS_L76K +#define GPS_BAUDRATE 9600 +#define PIN_GPS_EN (6) +#define PIN_GPS_REINIT (29) +#define PIN_GPS_STANDBY (30) +#define PIN_GPS_PPS (31) +#define GPS_TX_PIN (3) +#define GPS_RX_PIN (2) +#define GPS_THREAD_INTERVAL 50 + +#define PIN_SERIAL1_RX GPS_TX_PIN +#define PIN_SERIAL1_TX GPS_RX_PIN + +// Secondary UART +#define PIN_SERIAL2_RX (22) +#define PIN_SERIAL2_TX (24) + +// PCF8563 RTC Module +#define PCF8563_RTC 0x51 + +// SPI +#define SPI_INTERFACES_COUNT 1 +#define PIN_SPI_MISO (32 + 15) +#define PIN_SPI_MOSI (32 + 14) +#define PIN_SPI_SCK (32 + 13) + +// Battery +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 3.0 +#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define ADC_MULTIPLIER (1.75F) + +#define HAS_SOLAR + +#ifdef __cplusplus +} +#endif + +#endif From 451e52b54141251bee3f3882fe2012003667670f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Fri, 21 Nov 2025 10:42:15 +0100 Subject: [PATCH 160/286] fix some minor compiler warnings. Note: The 'delete' is actually safe, so we suppress the warning. --- src/modules/Telemetry/Sensor/DFRobotGravitySensor.cpp | 3 +++ src/power.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/Telemetry/Sensor/DFRobotGravitySensor.cpp b/src/modules/Telemetry/Sensor/DFRobotGravitySensor.cpp index 59a98e291..101b01f8f 100644 --- a/src/modules/Telemetry/Sensor/DFRobotGravitySensor.cpp +++ b/src/modules/Telemetry/Sensor/DFRobotGravitySensor.cpp @@ -13,7 +13,10 @@ DFRobotGravitySensor::DFRobotGravitySensor() : TelemetrySensor(meshtastic_Teleme DFRobotGravitySensor::~DFRobotGravitySensor() { if (gravity) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdelete-non-virtual-dtor" delete gravity; +#pragma GCC diagnostic pop gravity = nullptr; } } diff --git a/src/power.h b/src/power.h index f9ccb08aa..8fc7c8f45 100644 --- a/src/power.h +++ b/src/power.h @@ -138,7 +138,7 @@ class Power : private concurrency::OSThread void reboot(); // open circuit voltage lookup table uint8_t low_voltage_counter; - int32_t lastLogTime = 0; + uint32_t lastLogTime = 0; #ifdef DEBUG_HEAP uint32_t lastheap; #endif From 0e3e8b7607ffdeeabc34a3a349e108e0c3a1363d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:02:13 +0100 Subject: [PATCH 161/286] Update protobufs (#8707) Co-authored-by: caveman99 <25002+caveman99@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/mesh.pb.h | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/protobufs b/protobufs index 7654db2e2..52fa252f1 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 7654db2e2d1834aebde40090a9b74162ad1048ae +Subproject commit 52fa252f1e01be87ad2f7ab17ceef7882b2a4a93 diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index 0da44cce0..46de1dee0 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -288,6 +288,12 @@ typedef enum _meshtastic_HardwareModel { meshtastic_HardwareModel_WISMESH_TAP_V2 = 116, /* RAK3401 */ meshtastic_HardwareModel_RAK3401 = 117, + /* RAK6421 Hat+ */ + meshtastic_HardwareModel_RAK6421 = 118, + /* Elecrow ThinkNode M4 */ + meshtastic_HardwareModel_THINKNODE_M4 = 119, + /* Elecrow ThinkNode M6 */ + meshtastic_HardwareModel_THINKNODE_M6 = 120, /* ------------------------------------------------------------------------------------------------------------------------------------------ Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. ------------------------------------------------------------------------------------------------------------------------------------------ */ @@ -825,7 +831,11 @@ typedef struct _meshtastic_MeshPacket { Note: Our crypto implementation uses this field as well. See [crypto](/docs/overview/encryption) for details. */ uint32_t from; - /* The (immediate) destination for this packet */ + /* The (immediate) destination for this packet + If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was + not destined for a specific node, but for a channel as indicated by the value of `channel` below. + If the value is another, this indicates that the packet was destined for a specific + node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel. */ uint32_t to; /* (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on. If unset, packet was on the primary channel. From a4c92d9fd5f55ac5042c84aa41f3f74fae1784e5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:02:13 +0100 Subject: [PATCH 162/286] Update protobufs (#8707) Co-authored-by: caveman99 <25002+caveman99@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/mesh.pb.h | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/protobufs b/protobufs index 7654db2e2..52fa252f1 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 7654db2e2d1834aebde40090a9b74162ad1048ae +Subproject commit 52fa252f1e01be87ad2f7ab17ceef7882b2a4a93 diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index 0da44cce0..46de1dee0 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -288,6 +288,12 @@ typedef enum _meshtastic_HardwareModel { meshtastic_HardwareModel_WISMESH_TAP_V2 = 116, /* RAK3401 */ meshtastic_HardwareModel_RAK3401 = 117, + /* RAK6421 Hat+ */ + meshtastic_HardwareModel_RAK6421 = 118, + /* Elecrow ThinkNode M4 */ + meshtastic_HardwareModel_THINKNODE_M4 = 119, + /* Elecrow ThinkNode M6 */ + meshtastic_HardwareModel_THINKNODE_M6 = 120, /* ------------------------------------------------------------------------------------------------------------------------------------------ Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits. ------------------------------------------------------------------------------------------------------------------------------------------ */ @@ -825,7 +831,11 @@ typedef struct _meshtastic_MeshPacket { Note: Our crypto implementation uses this field as well. See [crypto](/docs/overview/encryption) for details. */ uint32_t from; - /* The (immediate) destination for this packet */ + /* The (immediate) destination for this packet + If the value is 4,294,967,295 (maximum value of an unsigned 32bit integer), this indicates that the packet was + not destined for a specific node, but for a channel as indicated by the value of `channel` below. + If the value is another, this indicates that the packet was destined for a specific + node (i.e. a kind of "Direct Message" to this node) and not broadcast on a channel. */ uint32_t to; /* (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on. If unset, packet was on the primary channel. From c051c56544e4faedd7c9b5e75ecf11ec2cd88b54 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 08:26:39 -0600 Subject: [PATCH 163/286] Update Kongduino-Adafruit_nRFCrypto digest to 8cde718 (#8708) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- arch/nrf52/nrf52840.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/nrf52/nrf52840.ini b/arch/nrf52/nrf52840.ini index 5e846b3b7..e13443152 100644 --- a/arch/nrf52/nrf52840.ini +++ b/arch/nrf52/nrf52840.ini @@ -8,7 +8,7 @@ lib_deps = ${environmental_base.lib_deps} ${environmental_extra.lib_deps} # renovate: datasource=git-refs depName=Kongduino-Adafruit_nRFCrypto packageName=https://github.com/Kongduino/Adafruit_nRFCrypto gitBranch=master - https://github.com/Kongduino/Adafruit_nRFCrypto/archive/5f838d2709461a2c981f642917aa50254a25c14c.zip + https://github.com/Kongduino/Adafruit_nRFCrypto/archive/8cde7189b5ead9dcd49f72601b43b969c0bbc06e.zip ; Common NRF52 debugging settings follow. See the Meshtastic developer docs for how to connect SWD debugging probes to your board. From 376dc7ef3a184113ff8060c5a4c6870209f55690 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 08:27:00 -0600 Subject: [PATCH 164/286] Update actions/checkout action to v6 (#8695) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/setup-base/action.yml | 2 +- .github/workflows/build_debian_src.yml | 2 +- .github/workflows/build_firmware.yml | 2 +- .github/workflows/build_one_arch.yml | 6 +++--- .github/workflows/build_one_target.yml | 6 +++--- .github/workflows/docker_build.yml | 2 +- .github/workflows/docker_manifest.yml | 2 +- .github/workflows/hook_copr.yml | 2 +- .github/workflows/main_matrix.yml | 14 +++++++------- .github/workflows/merge_queue.yml | 14 +++++++------- .github/workflows/nightly.yml | 4 ++-- .github/workflows/package_obs.yml | 2 +- .github/workflows/package_pio_deps.yml | 2 +- .github/workflows/package_ppa.yml | 2 +- .github/workflows/pr_tests.yml | 2 +- .github/workflows/release_channels.yml | 2 +- .github/workflows/sec_sast_semgrep_cron.yml | 2 +- .github/workflows/sec_sast_semgrep_pull.yml | 2 +- .github/workflows/test_native.yml | 6 +++--- .github/workflows/tests.yml | 2 +- .github/workflows/trunk_annotate_pr.yml | 2 +- .github/workflows/trunk_check.yml | 2 +- .github/workflows/trunk_format_pr.yml | 2 +- .github/workflows/update_protobufs.yml | 2 +- 24 files changed, 43 insertions(+), 43 deletions(-) diff --git a/.github/actions/setup-base/action.yml b/.github/actions/setup-base/action.yml index f6c1fd80c..80f5c6855 100644 --- a/.github/actions/setup-base/action.yml +++ b/.github/actions/setup-base/action.yml @@ -5,7 +5,7 @@ runs: using: composite steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive ref: ${{github.event.pull_request.head.ref}} diff --git a/.github/workflows/build_debian_src.yml b/.github/workflows/build_debian_src.yml index d36e7fea1..d7d26f0e8 100644 --- a/.github/workflows/build_debian_src.yml +++ b/.github/workflows/build_debian_src.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive path: meshtasticd diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index 57c1e72c7..9ac84c23e 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -22,7 +22,7 @@ jobs: outputs: artifact-id: ${{ steps.upload.outputs.artifact-id }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive ref: ${{github.event.pull_request.head.ref}} diff --git a/.github/workflows/build_one_arch.yml b/.github/workflows/build_one_arch.yml index 6d5462c93..5673f8cb6 100644 --- a/.github/workflows/build_one_arch.yml +++ b/.github/workflows/build_one_arch.yml @@ -26,7 +26,7 @@ jobs: setup: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3.x @@ -44,7 +44,7 @@ jobs: version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get release version string run: | echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT @@ -108,7 +108,7 @@ jobs: needs: [version, build] steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index 46362a629..343e5be64 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -45,7 +45,7 @@ jobs: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3.x @@ -66,7 +66,7 @@ jobs: if: ${{ inputs.target != '' }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get release version string run: | echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT @@ -114,7 +114,7 @@ jobs: needs: [version, build] steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} diff --git a/.github/workflows/docker_build.yml b/.github/workflows/docker_build.yml index 26a9cff18..8d19af894 100644 --- a/.github/workflows/docker_build.yml +++ b/.github/workflows/docker_build.yml @@ -47,7 +47,7 @@ jobs: runs-on: ${{ inputs.runs-on }} steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive ref: ${{github.event.pull_request.head.ref}} diff --git a/.github/workflows/docker_manifest.yml b/.github/workflows/docker_manifest.yml index 20b9ceee6..396ddb68e 100644 --- a/.github/workflows/docker_manifest.yml +++ b/.github/workflows/docker_manifest.yml @@ -83,7 +83,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive ref: ${{github.event.pull_request.head.ref}} diff --git a/.github/workflows/hook_copr.yml b/.github/workflows/hook_copr.yml index 2204cc02c..eb4ebc57b 100644 --- a/.github/workflows/hook_copr.yml +++ b/.github/workflows/hook_copr.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive ref: ${{ github.ref }} diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index 7ea033d55..38373a2fc 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -35,7 +35,7 @@ jobs: - check runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3.x @@ -59,7 +59,7 @@ jobs: version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get release version string run: | echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT @@ -81,7 +81,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Build base id: base uses: ./.github/actions/setup-base @@ -163,7 +163,7 @@ jobs: needs: [version, build] steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -242,7 +242,7 @@ jobs: - package-pio-deps-native-tft steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 @@ -311,7 +311,7 @@ jobs: needs: [release-artifacts, version] steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 @@ -366,7 +366,7 @@ jobs: esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index 6d69258c9..154b230c7 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -17,7 +17,7 @@ jobs: - check runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: 3.x @@ -40,7 +40,7 @@ jobs: version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Get release version string run: | echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT @@ -62,7 +62,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name != 'workflow_dispatch' }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Build base id: base uses: ./.github/actions/setup-base @@ -142,7 +142,7 @@ jobs: needs: [version, build] steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -221,7 +221,7 @@ jobs: - package-pio-deps-native-tft steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 @@ -290,7 +290,7 @@ jobs: needs: [release-artifacts, version] steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 @@ -345,7 +345,7 @@ jobs: esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,rp2350,stm32 steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index f26073ec4..045e94895 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Trunk Check uses: trunk-io/trunk-action@v1 @@ -31,7 +31,7 @@ jobs: pull-requests: write # For trunk to create PRs steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Trunk Upgrade uses: trunk-io/trunk-action/upgrade@v1 diff --git a/.github/workflows/package_obs.yml b/.github/workflows/package_obs.yml index b8a829d9a..2b202ed95 100644 --- a/.github/workflows/package_obs.yml +++ b/.github/workflows/package_obs.yml @@ -34,7 +34,7 @@ jobs: needs: build-debian-src steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive path: meshtasticd diff --git a/.github/workflows/package_pio_deps.yml b/.github/workflows/package_pio_deps.yml index c52dfe348..cb10a79f3 100644 --- a/.github/workflows/package_pio_deps.yml +++ b/.github/workflows/package_pio_deps.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive ref: ${{github.event.pull_request.head.ref}} diff --git a/.github/workflows/package_ppa.yml b/.github/workflows/package_ppa.yml index 2d6c257e6..2e3278041 100644 --- a/.github/workflows/package_ppa.yml +++ b/.github/workflows/package_ppa.yml @@ -32,7 +32,7 @@ jobs: needs: build-debian-src steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: recursive path: meshtasticd diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index c3a964e04..048186538 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -40,7 +40,7 @@ jobs: checks: write pull-requests: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: submodules: recursive diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml index 4e5a48dfe..f21b13ee1 100644 --- a/.github/workflows/release_channels.yml +++ b/.github/workflows/release_channels.yml @@ -60,7 +60,7 @@ jobs: shell: bash steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # Always use master branch for version bumps ref: master diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml index dfb828bf6..d044f9038 100644 --- a/.github/workflows/sec_sast_semgrep_cron.yml +++ b/.github/workflows/sec_sast_semgrep_cron.yml @@ -21,7 +21,7 @@ jobs: steps: # step 1 - name: clone application source code - uses: actions/checkout@v5 + uses: actions/checkout@v6 # step 2 - name: full scan diff --git a/.github/workflows/sec_sast_semgrep_pull.yml b/.github/workflows/sec_sast_semgrep_pull.yml index e93b2ae8b..e9b4108a1 100644 --- a/.github/workflows/sec_sast_semgrep_pull.yml +++ b/.github/workflows/sec_sast_semgrep_pull.yml @@ -13,7 +13,7 @@ jobs: steps: # step 1 - name: clone application source code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index 591d52bd0..a2328022e 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -14,7 +14,7 @@ jobs: name: Native Simulator Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -70,7 +70,7 @@ jobs: name: Native PlatformIO Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -127,7 +127,7 @@ jobs: - platformio-tests if: always() steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1ec435512..4a97853e2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,7 +20,7 @@ jobs: runs-on: test-runner steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 # - uses: actions/setup-python@v5 # with: diff --git a/.github/workflows/trunk_annotate_pr.yml b/.github/workflows/trunk_annotate_pr.yml index 23dcf8d09..59ab25c28 100644 --- a/.github/workflows/trunk_annotate_pr.yml +++ b/.github/workflows/trunk_annotate_pr.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Trunk Check uses: trunk-io/trunk-action@v1 diff --git a/.github/workflows/trunk_check.yml b/.github/workflows/trunk_check.yml index 41731d491..874374fe0 100644 --- a/.github/workflows/trunk_check.yml +++ b/.github/workflows/trunk_check.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Trunk Check uses: trunk-io/trunk-action@v1 diff --git a/.github/workflows/trunk_format_pr.yml b/.github/workflows/trunk_format_pr.yml index 51082fc5f..8fa0cc1eb 100644 --- a/.github/workflows/trunk_format_pr.yml +++ b/.github/workflows/trunk_format_pr.yml @@ -15,7 +15,7 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml index c06e06b0a..af0557fda 100644 --- a/.github/workflows/update_protobufs.yml +++ b/.github/workflows/update_protobufs.yml @@ -11,7 +11,7 @@ jobs: pull-requests: write steps: - name: Checkout code - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: submodules: true From 14463043bd3c4d01f79ea7d5c70d1279ae22ef15 Mon Sep 17 00:00:00 2001 From: Avi0n <14863961+Avi0n@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:03:47 -0800 Subject: [PATCH 165/286] Add WisMesh Tag OCV array (#8646) * Add WisMesh Tag OCV array * Update 10% to 3650 --------- Co-authored-by: Jonathan Bennett --- src/power.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/power.h b/src/power.h index 8fc7c8f45..84efbeb9e 100644 --- a/src/power.h +++ b/src/power.h @@ -36,6 +36,8 @@ #define OCV_ARRAY 4200, 3986, 3922, 3812, 3734, 3645, 3527, 3420, 3281, 3087, 2786 #elif defined(R1_NEO) #define OCV_ARRAY 4330, 4292, 4254, 4216, 4178, 4140, 4102, 4064, 4026, 3988, 3950 +#elif defined(WISMESH_TAG) +#define OCV_ARRAY 4240, 4112, 4029, 3970, 3906, 3846, 3824, 3802, 3776, 3650, 3072 #else // LiIon #define OCV_ARRAY 4190, 4050, 3990, 3890, 3800, 3720, 3630, 3530, 3420, 3300, 3100 #endif From f4e260e0f1dc45b08d25827deb53b50f24d907e7 Mon Sep 17 00:00:00 2001 From: simon-muzi Date: Sat, 22 Nov 2025 14:54:10 -0500 Subject: [PATCH 166/286] R1 Neo - Added OCV_ARRAY from measured discharge curve testing + update ADC multiplier (#8716) * Added OCV_ARRAY from measured discharge curve testing and update ADC multiplier The ADC resistor divider ratio is 0.6 -> multiplier should be 1/0.6 ~=1.667 We data logged a full discharge curve at constant 100mA draw over 15hours to get a realistic voltage curve for battery SoC measurements. * Remove power.h in favor of variant.h --------- Co-authored-by: Jason P Co-authored-by: Jonathan Bennett --- src/power.h | 2 -- variants/nrf52840/r1-neo/variant.h | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/power.h b/src/power.h index 84efbeb9e..3f28dedb2 100644 --- a/src/power.h +++ b/src/power.h @@ -34,8 +34,6 @@ #define OCV_ARRAY 4200, 3876, 3826, 3763, 3713, 3660, 3573, 3485, 3422, 3359, 3300 #elif defined(SEEED_SOLAR_NODE) #define OCV_ARRAY 4200, 3986, 3922, 3812, 3734, 3645, 3527, 3420, 3281, 3087, 2786 -#elif defined(R1_NEO) -#define OCV_ARRAY 4330, 4292, 4254, 4216, 4178, 4140, 4102, 4064, 4026, 3988, 3950 #elif defined(WISMESH_TAG) #define OCV_ARRAY 4240, 4112, 4029, 3970, 3906, 3846, 3824, 3802, 3776, 3650, 3072 #else // LiIon diff --git a/variants/nrf52840/r1-neo/variant.h b/variants/nrf52840/r1-neo/variant.h index 901e993e3..ef975433a 100644 --- a/variants/nrf52840/r1-neo/variant.h +++ b/variants/nrf52840/r1-neo/variant.h @@ -132,7 +132,8 @@ static const uint8_t SCK = PIN_SPI_SCK; #undef AREF_VOLTAGE #define AREF_VOLTAGE 3.0 #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 -#define ADC_MULTIPLIER 1.73 +#define ADC_MULTIPLIER 1.667 +#define OCV_ARRAY 4200, 4020, 4000, 3940, 3870, 3820, 3750, 3630, 3550, 3450, 3100 #define HAS_RTC 1 From b18794e98da1f346e0290747ca97744a79632d20 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sat, 22 Nov 2025 13:54:24 -0600 Subject: [PATCH 167/286] Log error if startReceive fails in LR11x0Interface (#8718) --- src/mesh/LR11x0Interface.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mesh/LR11x0Interface.cpp b/src/mesh/LR11x0Interface.cpp index 3831a384d..af6dd92e9 100644 --- a/src/mesh/LR11x0Interface.cpp +++ b/src/mesh/LR11x0Interface.cpp @@ -244,6 +244,8 @@ template void LR11x0Interface::startReceive() // We use a 16 bit preamble so this should save some power by letting radio sit in standby mostly. int err = lora.startReceive(RADIOLIB_LR11X0_RX_TIMEOUT_INF, MESHTASTIC_RADIOLIB_IRQ_RX_FLAGS, RADIOLIB_IRQ_RX_DEFAULT_MASK, 0); + if (err) + LOG_ERROR("StartReceive error: %d", err); assert(err == RADIOLIB_ERR_NONE); RadioLibInterface::startReceive(); @@ -304,4 +306,4 @@ template bool LR11x0Interface::sleep() return true; } -#endif \ No newline at end of file +#endif From 1bfa9ed4c4d166e3141a392dc601aa10b5a917e0 Mon Sep 17 00:00:00 2001 From: simon-muzi Date: Sat, 22 Nov 2025 17:35:10 -0500 Subject: [PATCH 168/286] Tweak OCV_ARRAY 100% voltage to take into account charger hysteresis and voltage sag after charge (#8720) Measured voltage of fully charged battery after a few minutes of rest --- variants/nrf52840/r1-neo/variant.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variants/nrf52840/r1-neo/variant.h b/variants/nrf52840/r1-neo/variant.h index ef975433a..b1d96ebd0 100644 --- a/variants/nrf52840/r1-neo/variant.h +++ b/variants/nrf52840/r1-neo/variant.h @@ -133,7 +133,7 @@ static const uint8_t SCK = PIN_SPI_SCK; #define AREF_VOLTAGE 3.0 #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 #define ADC_MULTIPLIER 1.667 -#define OCV_ARRAY 4200, 4020, 4000, 3940, 3870, 3820, 3750, 3630, 3550, 3450, 3100 +#define OCV_ARRAY 4120, 4020, 4000, 3940, 3870, 3820, 3750, 3630, 3550, 3450, 3100 #define HAS_RTC 1 From 5d7da6868e02521dc32d9df69c140abd2cdfd030 Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Mon, 24 Nov 2025 01:40:27 +0000 Subject: [PATCH 169/286] Support overriding GPS serial pins on all architectures (#8486) --- src/gps/GPS.cpp | 37 ++++++++++++++++++++++++------------- src/gps/GPS.h | 2 ++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp index 0404ae5f8..a61a71dde 100644 --- a/src/gps/GPS.cpp +++ b/src/gps/GPS.cpp @@ -38,14 +38,16 @@ template std::size_t array_count(const T (&)[N]) return N; } -#if defined(NRF52840_XXAA) || defined(NRF52833_XXAA) || defined(ARCH_ESP32) || defined(ARCH_PORTDUINO) || defined(ARCH_STM32WL) -#if defined(GPS_SERIAL_PORT) -HardwareSerial *GPS::_serial_gps = &GPS_SERIAL_PORT; -#else -HardwareSerial *GPS::_serial_gps = &Serial1; +#ifndef GPS_SERIAL_PORT +#define GPS_SERIAL_PORT Serial1 #endif + +#if defined(ARCH_NRF52) +Uart *GPS::_serial_gps = &GPS_SERIAL_PORT; +#elif defined(ARCH_ESP32) || defined(ARCH_PORTDUINO) || defined(ARCH_STM32WL) +HardwareSerial *GPS::_serial_gps = &GPS_SERIAL_PORT; #elif defined(ARCH_RP2040) -SerialUART *GPS::_serial_gps = &Serial1; +SerialUART *GPS::_serial_gps = &GPS_SERIAL_PORT; #else HardwareSerial *GPS::_serial_gps = nullptr; #endif @@ -1525,10 +1527,7 @@ GPS *GPS::createGps() int8_t _rx_gpio = config.position.rx_gpio; int8_t _tx_gpio = config.position.tx_gpio; int8_t _en_gpio = config.position.gps_en_gpio; -#if HAS_GPS && !defined(ARCH_ESP32) - _rx_gpio = 1; // We only specify GPS serial ports on ESP32. Otherwise, these are just flags. - _tx_gpio = 1; -#endif + #if defined(GPS_RX_PIN) if (!_rx_gpio) _rx_gpio = GPS_RX_PIN; @@ -1602,16 +1601,28 @@ GPS *GPS::createGps() _serial_gps->setRxBufferSize(SERIAL_BUFFER_SIZE); // the default is 256 #endif -// ESP32 has a special set of parameters vs other arduino ports -#if defined(ARCH_ESP32) LOG_DEBUG("Use GPIO%d for GPS RX", new_gps->rx_gpio); LOG_DEBUG("Use GPIO%d for GPS TX", new_gps->tx_gpio); + +// ESP32 has a special set of parameters vs other arduino ports +#if defined(ARCH_ESP32) _serial_gps->begin(GPS_BAUDRATE, SERIAL_8N1, new_gps->rx_gpio, new_gps->tx_gpio); #elif defined(ARCH_RP2040) + _serial_gps->setPinout(new_gps->tx_gpio, new_gps->rx_gpio); _serial_gps->setFIFOSize(256); _serial_gps->begin(GPS_BAUDRATE); -#else +#elif defined(ARCH_NRF52) + _serial_gps->setPins(new_gps->rx_gpio, new_gps->tx_gpio); _serial_gps->begin(GPS_BAUDRATE); +#elif defined(ARCH_STM32WL) + _serial_gps->setTx(new_gps->tx_gpio); + _serial_gps->setRx(new_gps->rx_gpio); + _serial_gps->begin(GPS_BAUDRATE); +#elif defined(ARCH_PORTDUINO) + // Portduino can't set the GPS pins directly. + _serial_gps->begin(GPS_BAUDRATE); +#else +#error Unsupported architecture! #endif } return new_gps; diff --git a/src/gps/GPS.h b/src/gps/GPS.h index 8ba1ce0a6..59cee7113 100644 --- a/src/gps/GPS.h +++ b/src/gps/GPS.h @@ -194,6 +194,8 @@ class GPS : private concurrency::OSThread /** If !NULL we will use this serial port to construct our GPS */ #if defined(ARCH_RP2040) static SerialUART *_serial_gps; +#elif defined(ARCH_NRF52) + static Uart *_serial_gps; #else static HardwareSerial *_serial_gps; #endif From ed4a798c60f8d25e9f7037d69b4b001f6b1a6d81 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 24 Nov 2025 16:35:54 -0600 Subject: [PATCH 170/286] Thinknode M3 support against master (#8630) * Add variant_shutdown() as a week function in main-nrf52.cpp * Add Status LED module * Add Thinknode M3 support * Catch case of BLE disabled * Update src/modules/StatusLEDModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/StatusLEDModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update variants/nrf52840/ELECROW-ThinkNode-M3/rfswitch.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Remove unused pin * M3 pairing LED only active for 30 seconds after state change * Thinknode M3 shutdown work --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- boards/ThinkNode-M3.json | 53 ++++++++ src/configuration.h | 7 + src/modules/Modules.cpp | 6 + src/modules/SerialModule.cpp | 9 +- src/modules/StatusLEDModule.cpp | 94 ++++++++++++++ src/modules/StatusLEDModule.h | 44 +++++++ src/modules/Telemetry/Sensor/AHT10.cpp | 2 +- src/modules/Telemetry/Sensor/AHT10.h | 4 + src/platform/nrf52/architecture.h | 4 + src/platform/nrf52/main-nrf52.cpp | 6 + .../ELECROW-ThinkNode-M3/platformio.ini | 17 +++ .../nrf52840/ELECROW-ThinkNode-M3/rfswitch.h | 15 +++ .../nrf52840/ELECROW-ThinkNode-M3/variant.cpp | 93 +++++++++++++ .../nrf52840/ELECROW-ThinkNode-M3/variant.h | 122 ++++++++++++++++++ 14 files changed, 471 insertions(+), 5 deletions(-) create mode 100644 boards/ThinkNode-M3.json create mode 100644 src/modules/StatusLEDModule.cpp create mode 100644 src/modules/StatusLEDModule.h create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M3/rfswitch.h create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp create mode 100644 variants/nrf52840/ELECROW-ThinkNode-M3/variant.h diff --git a/boards/ThinkNode-M3.json b/boards/ThinkNode-M3.json new file mode 100644 index 000000000..ff21e046a --- /dev/null +++ b/boards/ThinkNode-M3.json @@ -0,0 +1,53 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [ + ["0x239A", "0x4405"], + ["0x239A", "0x0029"], + ["0x239A", "0x002A"] + ], + "usb_product": "elecrow_eink", + "mcu": "nrf52840", + "variant": "ELECROW-ThinkNode-M3", + "variants_dir": "variants", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": ["bluetooth"], + "debug": { + "jlink_device": "nRF52840_xxAA", + "onboard_tools": ["jlink"], + "svd_path": "nrf52840.svd", + "openocd_target": "nrf52840-mdk-rs" + }, + "frameworks": ["arduino"], + "name": "elecrow nrf", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "speed": 115200, + "protocol": "nrfutil", + "protocols": ["jlink", "nrfjprog", "nrfutil", "stlink"], + "use_1200bps_touch": true, + "require_upload_port": true, + "wait_for_upload_port": true + }, + "url": "", + "vendor": "ELECROW" +} diff --git a/src/configuration.h b/src/configuration.h index 8ec3b2211..d37269995 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -396,6 +396,13 @@ along with this program. If not, see . #define HAS_RGB_LED #endif +#ifndef LED_STATE_OFF +#define LED_STATE_OFF 0 +#endif +#ifndef LED_STATE_ON +#define LED_STATE_ON 1 +#endif + // default mapping of pins #if defined(PIN_BUTTON2) && !defined(CANCEL_BUTTON_PIN) #define ALT_BUTTON_PIN PIN_BUTTON2 diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index e477574dd..9e4401e05 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -13,6 +13,8 @@ #include "input/TrackballInterruptImpl1.h" #endif +#include "modules/StatusLEDModule.h" + #if !MESHTASTIC_EXCLUDE_I2C #include "input/cardKbI2cImpl.h" #endif @@ -119,6 +121,10 @@ void setupModules() buzzerFeedbackThread = new BuzzerFeedbackThread(); } #endif +#if defined(LED_CHARGE) || defined(LED_PAIRING) + statusLEDModule = new StatusLEDModule(); +#endif + #if !MESHTASTIC_EXCLUDE_ADMIN adminModule = new AdminModule(); #endif diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp index 575e9fa96..d04daf594 100644 --- a/src/modules/SerialModule.cpp +++ b/src/modules/SerialModule.cpp @@ -64,7 +64,7 @@ SerialModule *serialModule; SerialModuleRadio *serialModuleRadio; #if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \ - defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) + defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) || defined(ELECROW_ThinkNode_M3) SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") { api_type = TYPE_SERIAL; @@ -204,7 +204,7 @@ int32_t SerialModule::runOnce() Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT); } #elif !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(MESHLINK) && \ - !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M5) + !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) if (moduleConfig.serial.rxd && moduleConfig.serial.txd) { #ifdef ARCH_RP2040 Serial2.setFIFOSize(RX_BUFFER); @@ -261,7 +261,7 @@ int32_t SerialModule::runOnce() } #if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(MESHLINK) && \ - !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M5) + !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) else if ((moduleConfig.serial.mode == meshtastic_ModuleConfig_SerialConfig_Serial_Mode_WS85)) { processWXSerial(); @@ -536,7 +536,8 @@ ParsedLine parseLine(const char *line) void SerialModule::processWXSerial() { #if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(CONFIG_IDF_TARGET_ESP32C6) && \ - !defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M5) && !defined(ARCH_STM32WL) + !defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) && \ + !defined(ARCH_STM32WL) static unsigned int lastAveraged = 0; static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded. static double dir_sum_sin = 0; diff --git a/src/modules/StatusLEDModule.cpp b/src/modules/StatusLEDModule.cpp new file mode 100644 index 000000000..fc9ed310e --- /dev/null +++ b/src/modules/StatusLEDModule.cpp @@ -0,0 +1,94 @@ +#include "StatusLEDModule.h" +#include "MeshService.h" +#include "configuration.h" +#include + +/* +StatusLEDModule manages the device's status LEDs, updating their states based on power and Bluetooth status. +It reflects charging, charged, discharging, and Bluetooth connection states using the appropriate LEDs. +*/ +StatusLEDModule *statusLEDModule; + +StatusLEDModule::StatusLEDModule() : concurrency::OSThread("StatusLEDModule") +{ + bluetoothStatusObserver.observe(&bluetoothStatus->onNewStatus); + powerStatusObserver.observe(&powerStatus->onNewStatus); +} + +int StatusLEDModule::handleStatusUpdate(const meshtastic::Status *arg) +{ + switch (arg->getStatusType()) { + case STATUS_TYPE_POWER: { + meshtastic::PowerStatus *powerStatus = (meshtastic::PowerStatus *)arg; + if (powerStatus->getHasUSB()) { + power_state = charging; + if (powerStatus->getBatteryChargePercent() >= 100) { + power_state = charged; + } + } else { + power_state = discharging; + } + break; + } + case STATUS_TYPE_BLUETOOTH: { + meshtastic::BluetoothStatus *bluetoothStatus = (meshtastic::BluetoothStatus *)arg; + switch (bluetoothStatus->getConnectionState()) { + case meshtastic::BluetoothStatus::ConnectionState::DISCONNECTED: { + ble_state = unpaired; + PAIRING_LED_starttime = millis(); + break; + } + case meshtastic::BluetoothStatus::ConnectionState::PAIRING: { + ble_state = pairing; + PAIRING_LED_starttime = millis(); + break; + } + case meshtastic::BluetoothStatus::ConnectionState::CONNECTED: { + ble_state = connected; + PAIRING_LED_starttime = millis(); + break; + } + } + + break; + } + } + return 0; +}; + +int32_t StatusLEDModule::runOnce() +{ + + if (power_state == charging) { + CHARGE_LED_state = !CHARGE_LED_state; + } else if (power_state == charged) { + CHARGE_LED_state = LED_STATE_ON; + } else { + CHARGE_LED_state = LED_STATE_OFF; + } + + if (!config.bluetooth.enabled || PAIRING_LED_starttime + 30 * 1000 < millis()) { + PAIRING_LED_state = LED_STATE_OFF; + } else if (ble_state == unpaired) { + if (slowTrack) { + PAIRING_LED_state = !PAIRING_LED_state; + slowTrack = false; + } else { + slowTrack = true; + } + } else if (ble_state == pairing) { + PAIRING_LED_state = !PAIRING_LED_state; + } else { + PAIRING_LED_state = LED_STATE_ON; + } + +#ifdef LED_CHARGE + digitalWrite(LED_CHARGE, CHARGE_LED_state); +#endif + // digitalWrite(green_LED_PIN, LED_STATE_OFF); +#ifdef LED_PAIRING + digitalWrite(LED_PAIRING, PAIRING_LED_state); +#endif + + return (my_interval); +} diff --git a/src/modules/StatusLEDModule.h b/src/modules/StatusLEDModule.h new file mode 100644 index 000000000..d9e3a4f33 --- /dev/null +++ b/src/modules/StatusLEDModule.h @@ -0,0 +1,44 @@ +#pragma once + +#include "BluetoothStatus.h" +#include "MeshModule.h" +#include "PowerStatus.h" +#include "concurrency/OSThread.h" +#include "configuration.h" +#include +#include + +class StatusLEDModule : private concurrency::OSThread +{ + bool slowTrack = false; + + public: + StatusLEDModule(); + + int handleStatusUpdate(const meshtastic::Status *); + + protected: + unsigned int my_interval = 1000; // interval in millisconds + virtual int32_t runOnce() override; + + CallbackObserver bluetoothStatusObserver = + CallbackObserver(this, &StatusLEDModule::handleStatusUpdate); + CallbackObserver powerStatusObserver = + CallbackObserver(this, &StatusLEDModule::handleStatusUpdate); + + private: + bool CHARGE_LED_state = LED_STATE_OFF; + bool PAIRING_LED_state = LED_STATE_OFF; + + uint32_t PAIRING_LED_starttime = 0; + + enum PowerState { discharging, charging, charged }; + + PowerState power_state = discharging; + + enum BLEState { unpaired, pairing, connected }; + + BLEState ble_state = unpaired; +}; + +extern StatusLEDModule *statusLEDModule; diff --git a/src/modules/Telemetry/Sensor/AHT10.cpp b/src/modules/Telemetry/Sensor/AHT10.cpp index 52fdc05c0..c38fd2a92 100644 --- a/src/modules/Telemetry/Sensor/AHT10.cpp +++ b/src/modules/Telemetry/Sensor/AHT10.cpp @@ -35,7 +35,7 @@ bool AHT10Sensor::getMetrics(meshtastic_Telemetry *measurement) // prefer other sensors like bmp280, bmp3xx if (!measurement->variant.environment_metrics.has_temperature) { measurement->variant.environment_metrics.has_temperature = true; - measurement->variant.environment_metrics.temperature = temp.temperature; + measurement->variant.environment_metrics.temperature = temp.temperature + AHT10_TEMP_OFFSET; } if (!measurement->variant.environment_metrics.has_relative_humidity) { diff --git a/src/modules/Telemetry/Sensor/AHT10.h b/src/modules/Telemetry/Sensor/AHT10.h index ab3f5806c..f85f04aa0 100644 --- a/src/modules/Telemetry/Sensor/AHT10.h +++ b/src/modules/Telemetry/Sensor/AHT10.h @@ -6,6 +6,10 @@ #if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include() +#ifndef AHT10_TEMP_OFFSET +#define AHT10_TEMP_OFFSET 0 +#endif + #include "../mesh/generated/meshtastic/telemetry.pb.h" #include "TelemetrySensor.h" #include diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index 6ddb41b16..75ca7567e 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -68,6 +68,8 @@ #define HW_VENDOR meshtastic_HardwareModel_T_ECHO_LITE #elif defined(ELECROW_ThinkNode_M1) #define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M1 +#elif defined(ELECROW_ThinkNode_M3) +#define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M3 #elif defined(ELECROW_ThinkNode_M6) #define HW_VENDOR meshtastic_HardwareModel_THINKNODE_M6 #elif defined(NANO_G2_ULTRA) @@ -130,7 +132,9 @@ #endif +#ifdef PIN_LED1 #define LED_PIN PIN_LED1 // LED1 on nrf52840-DK +#endif #ifdef PIN_BUTTON1 #define BUTTON_PIN PIN_BUTTON1 diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 827863f33..c03cc4454 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -30,6 +30,11 @@ #include "BQ25713.h" #endif +// Weak empty variant initialization function. +// May be redefined by variant files. +void variant_shutdown() __attribute__((weak)); +void variant_shutdown() {} + static nrfx_wdt_t nrfx_wdt = NRFX_WDT_INSTANCE(0); static nrfx_wdt_channel_id nrfx_wdt_channel_id_nrf52_main; @@ -391,6 +396,7 @@ void cpuDeepSleep(uint32_t msecToWake) NRF_GPIO->DIRCLR = (1 << pin); } #endif + variant_shutdown(); // Sleepy trackers or sensors can low power "sleep" // Don't enter this if we're sleeping portMAX_DELAY, since that's a shutdown event diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini new file mode 100644 index 000000000..958e48e48 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini @@ -0,0 +1,17 @@ +[env:thinknode_m3] +extends = nrf52840_base +board = ThinkNode-M3 +board_check = true +debug_tool = jlink +build_flags = + ${nrf52840_base.build_flags} + -Ivariants/nrf52840/ELECROW-ThinkNode-M3 + -DELECROW_ThinkNode_M3 + -DGPS_POWER_TOGGLE + -D CONFIG_NFCT_PINS_AS_GPIOS=1 + -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard" +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M3> +lib_deps = + ${nrf52840_base.lib_deps} + khoih-prog/nRF52_PWM@^1.0.1 + lewisxhe/PCF8563_Library@^1.0.1 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/rfswitch.h b/variants/nrf52840/ELECROW-ThinkNode-M3/rfswitch.h new file mode 100644 index 000000000..77ae9ef73 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/rfswitch.h @@ -0,0 +1,15 @@ +#include "RadioLib.h" +#include "nrf.h" + +// set RF switch configuration for ELECROW ThinkNode M3 +// ELECROW ThinkNode M3 uses DIO5 and DIO6 for RF switching + +static const uint32_t rfswitch_dio_pins[] = {RADIOLIB_LR11X0_DIO5, RADIOLIB_LR11X0_DIO6, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC}; + +static const Module::RfSwitchMode_t rfswitch_table[] = { + // mode DIO5 DIO6 + {LR11x0::MODE_STBY, {LOW, LOW}}, {LR11x0::MODE_RX, {HIGH, LOW}}, + {LR11x0::MODE_TX, {HIGH, HIGH}}, {LR11x0::MODE_TX_HP, {LOW, HIGH}}, + {LR11x0::MODE_TX_HF, {LOW, LOW}}, {LR11x0::MODE_GNSS, {LOW, LOW}}, + {LR11x0::MODE_WIFI, {LOW, LOW}}, END_OF_MODE_TABLE, +}; diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp new file mode 100644 index 000000000..b7a7b7342 --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp @@ -0,0 +1,93 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "variant.h" +#include "meshUtils.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + + // P1 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; + +void initVariant() +{ + pinMode(KEY_POWER, OUTPUT); + digitalWrite(KEY_POWER, HIGH); + pinMode(RGB_POWER, OUTPUT); + digitalWrite(RGB_POWER, HIGH); + pinMode(green_LED_PIN, OUTPUT); + digitalWrite(green_LED_PIN, LED_STATE_OFF); + pinMode(LED_BLUE, OUTPUT); + pinMode(PIN_POWER_USB, INPUT); + pinMode(PIN_POWER_DONE, INPUT); + pinMode(PIN_POWER_CHRG, INPUT); + pinMode(BUTTON_PIN, INPUT_PULLUP); + pinMode(EEPROM_POWER, OUTPUT); + digitalWrite(EEPROM_POWER, HIGH); + pinMode(PIN_EN1, OUTPUT); + digitalWrite(PIN_EN1, HIGH); + pinMode(PIN_EN2, OUTPUT); + digitalWrite(PIN_EN2, HIGH); + pinMode(ACC_POWER, OUTPUT); + digitalWrite(ACC_POWER, LOW); + pinMode(DHT_POWER, OUTPUT); + digitalWrite(DHT_POWER, HIGH); + pinMode(Battery_POWER, OUTPUT); + digitalWrite(Battery_POWER, HIGH); + pinMode(GPS_POWER, OUTPUT); + digitalWrite(GPS_POWER, HIGH); +} + +// called from main-nrf52.cpp during the cpuDeepSleep() function +void variant_shutdown() +{ + digitalWrite(EEPROM_POWER, LOW); + digitalWrite(KEY_POWER, LOW); + + for (int pin = 0; pin < 48; pin++) { + if (pin == PIN_POWER_USB || pin == BUTTON_PIN || pin == PIN_EN1 || pin == PIN_EN2 || pin == DHT_POWER || + pin == ACC_POWER || pin == Battery_POWER || pin == GPS_POWER || pin == LR1110_SPI_MISO_PIN || + pin == LR1110_SPI_MOSI_PIN || pin == LR1110_SPI_SCK_PIN || pin == LR1110_SPI_NSS_PIN || pin == LR1110_BUSY_PIN || + pin == LR1110_NRESET_PIN || pin == LR1110_IRQ_PIN || pin == GPS_TX_PIN || pin == GPS_RX_PIN || pin == green_LED_PIN || + pin == red_LED_PIN || pin == LED_BLUE) { + continue; + } + pinMode(pin, OUTPUT); + digitalWrite(pin, LOW); + if (pin >= 32) { + NRF_P1->DIRCLR = (1 << (pin - 32)); + } else { + NRF_GPIO->DIRCLR = (1 << pin); + } + } + + nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP); // Configure the pin to be woken up as an input + nrf_gpio_pin_sense_t sense1 = NRF_GPIO_PIN_SENSE_LOW; + nrf_gpio_cfg_sense_set(BUTTON_PIN, sense1); + + nrf_gpio_cfg_input(PIN_POWER_USB, NRF_GPIO_PIN_PULLDOWN); // Configure the pin to be woken up as an input + nrf_gpio_pin_sense_t sense2 = NRF_GPIO_PIN_SENSE_HIGH; + nrf_gpio_cfg_sense_set(PIN_POWER_USB, sense2); +} \ No newline at end of file diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h new file mode 100644 index 000000000..cf940172b --- /dev/null +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h @@ -0,0 +1,122 @@ +/* + Copyright (c) 2014-2015 Arduino LLC. All right reserved. + Copyright (c) 2016 Sandeep Mistry All right reserved. + Copyright (c) 2018, Adafruit Industries (adafruit.com) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ELECROW_EINK_V1_0_ +#define _VARIANT_ELECROW_EINK_V1_0_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#include "WVariant.h" + +#define VARIANT_MCK (64000000ul) +#define USE_LFXO // Board uses 32khz crystal for LF + +#define ELECROW_ThinkNode_M3 1 +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (1) +#define NUM_ANALOG_OUTPUTS (0) + +// Power Pin +#define NRF_APM +#define GPS_POWER 14 +#define PIN_POWER_USB 31 +#define EXT_PWR_DETECT PIN_POWER_USB +#define PIN_POWER_DONE 24 +#define PIN_POWER_CHRG 32 +#define KEY_POWER 16 +#define ACC_POWER 2 +#define DHT_POWER 3 +#define Battery_POWER 17 +#define RGB_POWER 29 +#define EEPROM_POWER 7 + +// LED +#define red_LED_PIN 33 +#define LED_POWER red_LED_PIN +#define LED_CHARGE LED_POWER // Signals the Status LED Module to handle this LED +#define green_LED_PIN 35 +#define LED_BLUE 37 +#define LED_PAIRING LED_BLUE // Signals the Status LED Module to handle this LED + +#define LED_BUILTIN -1 +#define LED_STATE_ON LOW +#define LED_STATE_OFF HIGH + +// BUZZER +#define PIN_BUZZER 23 +#define PIN_EN1 36 +#define PIN_EN2 34 +/*Wire Interfaces*/ +#define WIRE_INTERFACES_COUNT 1 +#define PIN_WIRE_SDA 26 +#define PIN_WIRE_SCL 27 + +// Temperature correction for sensor +#define AHT10_TEMP_OFFSET -5.0 + +/*GPS pins*/ +#define HAS_GPS 1 +#define GPS_BAUDRATE 9600 +#define PIN_GPS_RESET 25 +#define PIN_GPS_STANDBY 21 +#define GPS_TX_PIN 20 +#define GPS_RX_PIN 22 +#define GPS_THREAD_INTERVAL 50 +#define PIN_SERIAL1_RX GPS_TX_PIN +#define PIN_SERIAL1_TX GPS_RX_PIN +// Button +#define BUTTON_PIN 12 +#define BUTTON_PIN_ALT (0 + 12) +// Battery +#define BATTERY_PIN 5 +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#undef AREF_VOLTAGE +#define AREF_VOLTAGE 2.4 +#define VBAT_AR_INTERNAL AR_INTERNAL_2_4 +#define ADC_MULTIPLIER (1.75) +/*SPI Interfaces*/ +#define SPI_INTERFACES_COUNT 1 +#define PIN_SPI_MISO (32 + 15) // P1.15 47 +#define PIN_SPI_MOSI (32 + 14) // P1.14 46 +#define PIN_SPI_SCK (32 + 13) // P1.13 45 +#define PIN_SPI_NSS (32 + 12) // P1.12 44 +/*LORA Interfaces*/ +#define USE_LR1110 +#define LR1110_IRQ_PIN 40 +#define LR1110_NRESET_PIN 42 +#define LR1110_BUSY_PIN 43 +#define LR1110_SPI_NSS_PIN 44 +#define LR1110_SPI_SCK_PIN 45 +#define LR1110_SPI_MOSI_PIN 46 +#define LR1110_SPI_MISO_PIN 47 +#define LR11X0_DIO3_TCXO_VOLTAGE 3.3 +#define LR11X0_DIO_AS_RF_SWITCH + +// PCF8563 RTC Module +#define PCF8563_RTC 0x51 + +#ifdef __cplusplus +} +#endif + +#endif From 0336331411f864ef0ea81c5ada391b56cd06101b Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 25 Nov 2025 02:29:35 -0600 Subject: [PATCH 171/286] Use LED_CHARGE and LED_PAIRING for M6 led control (#8742) --- variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp | 8 ++++---- variants/nrf52840/ELECROW-ThinkNode-M6/variant.h | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp index b84079e66..09872d409 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.cpp @@ -32,11 +32,11 @@ const uint32_t g_ADigitalPinMap[] = { void initVariant() { - pinMode(PIN_LED1, OUTPUT); - ledOff(PIN_LED1); + pinMode(LED_CHARGE, OUTPUT); + ledOff(LED_CHARGE); - pinMode(PIN_LED2, OUTPUT); - ledOff(PIN_LED2); + pinMode(LED_PAIRING, OUTPUT); + ledOff(LED_PAIRING); pinMode(VDD_FLASH_EN, OUTPUT); digitalWrite(VDD_FLASH_EN, HIGH); diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h index 98c654df2..5e543b21f 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h @@ -40,10 +40,11 @@ extern "C" { #define NUM_ANALOG_OUTPUTS (0) // LEDs -#define PIN_LED1 (12) -#define PIN_LED2 (7) -#define LED_BUILTIN PIN_LED1 -#define LED_BLUE PIN_LED2 +#define LED_BUILTIN -1 +#define LED_BLUE -1 +#define LED_CHARGE (12) +#define LED_PAIRING (7) + #define LED_STATE_ON 1 // USB power detection From 592a8f23db76d75f61c4848665f61ed7df297431 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 25 Nov 2025 06:10:20 -0600 Subject: [PATCH 172/286] Further fix compass calibration (#8740) * Update calibration logic for ICM20948 sensor Initialize highest and lowest magnetic values based on sensor data readiness during calibration. * Refactor BMX160 calibration to use magnetometer data Update calibration logic to initialize highest and lowest values using magnetometer data. * Add missed viable defines in ::calibrate() --- src/motion/BMX160Sensor.cpp | 7 ++++++- src/motion/ICM20948Sensor.cpp | 12 +++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/motion/BMX160Sensor.cpp b/src/motion/BMX160Sensor.cpp index 56f794306..5888c20be 100755 --- a/src/motion/BMX160Sensor.cpp +++ b/src/motion/BMX160Sensor.cpp @@ -115,8 +115,13 @@ int32_t BMX160Sensor::runOnce() void BMX160Sensor::calibrate(uint16_t forSeconds) { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) + sBmx160SensorData_t magAccel; + sBmx160SensorData_t gAccel; LOG_DEBUG("BMX160 calibration started for %is", forSeconds); - highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; + sensor.getAllData(&magAccel, NULL, &gAccel); + highestX = magAccel.x, lowestX = magAccel.x; + highestY = magAccel.y, lowestY = magAccel.y; + highestZ = magAccel.z, lowestZ = magAccel.z; doCalibration = true; uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided diff --git a/src/motion/ICM20948Sensor.cpp b/src/motion/ICM20948Sensor.cpp index ebb0f7b66..10918eb7d 100755 --- a/src/motion/ICM20948Sensor.cpp +++ b/src/motion/ICM20948Sensor.cpp @@ -157,7 +157,17 @@ void ICM20948Sensor::calibrate(uint16_t forSeconds) { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN LOG_DEBUG("BMX160 calibration started for %is", forSeconds); - highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; + if (sensor->dataReady()) { + sensor->getAGMT(); + highestX = sensor->agmt.mag.axes.x; + lowestX = sensor->agmt.mag.axes.x; + highestY = sensor->agmt.mag.axes.y; + lowestY = sensor->agmt.mag.axes.y; + highestZ = sensor->agmt.mag.axes.z; + lowestZ = sensor->agmt.mag.axes.z; + } else { + highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; + } doCalibration = true; uint16_t calibrateFor = forSeconds * 1000; // calibrate for seconds provided From 81439f16d026675398313682bf347338300ded97 Mon Sep 17 00:00:00 2001 From: Jason P Date: Tue, 25 Nov 2025 08:59:11 -0600 Subject: [PATCH 173/286] More quickly hide "Shutting Down" to prevent it showing on Eink sleep screen (#8749) --- src/Power.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Power.cpp b/src/Power.cpp index fa8661d01..75fd32202 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -759,6 +759,8 @@ void Power::shutdown() if (screen) { #ifdef T_DECK_PRO screen->showSimpleBanner("Device is powered off.\nConnect USB to start!", 0); // T-Deck Pro has no power button +#elif USE_EINK + screen->showSimpleBanner("Shutting Down...", 2250); // dismiss after 3 seconds to avoid the banner on the sleep screen #else screen->showSimpleBanner("Shutting Down...", 0); // stays on screen #endif From faa6af74afbbdf5cf418fc3a7d64f68a9d3be0aa Mon Sep 17 00:00:00 2001 From: Jason P Date: Tue, 25 Nov 2025 13:55:28 -0600 Subject: [PATCH 174/286] Swapping GPS pins for GPS TX/RX (#8751) --- variants/nrf52840/heltec_mesh_node_t114/variant.h | 4 ++-- variants/nrf52840/t-echo/variant.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index b6082fdc6..de89d2d07 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -167,8 +167,8 @@ No longer populated on PCB #define PIN_GPS_PPS (32 + 4) // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (32 + 5) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (32 + 7) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (32 + 7) // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN (32 + 5) // This is for bits going TOWARDS the GPS #define GPS_THREAD_INTERVAL 50 diff --git a/variants/nrf52840/t-echo/variant.h b/variants/nrf52840/t-echo/variant.h index 4f3a53ebf..8ddb1c263 100644 --- a/variants/nrf52840/t-echo/variant.h +++ b/variants/nrf52840/t-echo/variant.h @@ -182,8 +182,8 @@ External serial flash WP25R1635FZUIL0 #define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (32 + 9) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (32 + 8) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (32 + 8) // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN (32 + 9) // This is for bits going TOWARDS the GPS #define GPS_THREAD_INTERVAL 50 From bacff5c1f0a7f966dc1ff1762eb52bb52935b178 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 25 Nov 2025 05:38:00 -0600 Subject: [PATCH 175/286] Reduce noise --- src/modules/ExternalNotificationModule.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index 4fe49cc1b..91e96b8d4 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -314,11 +314,10 @@ void ExternalNotificationModule::stopNow() audioThread->stop(); #endif // Turn off all outputs - LOG_INFO("Turning off setExternalStates: "); + LOG_INFO("Turning off setExternalStates"); for (int i = 0; i < 3; i++) { setExternalState(i, false); externalTurnedOn[i] = 0; - LOG_INFO("%d ", i); } setIntervalFromNow(0); #ifdef T_WATCH_S3 From 66193e17766b4b4a5e3d7c7a67aa7360f4dfc306 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 25 Nov 2025 14:34:55 -0600 Subject: [PATCH 176/286] Prevent double-registering of Rotary Encoder on TLora Pager (#8746) * Reduce noise * Prevent double registering of rotary encoder broker --- src/modules/Modules.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index 9e4401e05..827524fc3 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -181,12 +181,13 @@ void setupModules() // new ReplyModule(); #if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { +#ifndef T_LORA_PAGER rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1(); if (!rotaryEncoderInterruptImpl1->init()) { delete rotaryEncoderInterruptImpl1; rotaryEncoderInterruptImpl1 = nullptr; } -#ifdef T_LORA_PAGER +#elif defined(T_LORA_PAGER) // use a special FSM based rotary encoder version for T-LoRa Pager rotaryEncoderImpl = new RotaryEncoderImpl(); if (!rotaryEncoderImpl->init()) { From 486fa74549bacd44a24cffa140d160da56977920 Mon Sep 17 00:00:00 2001 From: Tom <116762865+NomDeTom@users.noreply.github.com> Date: Tue, 25 Nov 2025 21:18:55 +0000 Subject: [PATCH 177/286] Actions: Remove native from build_one (#8685) * Remove native from the build, and remove the required permissions * Delete .github/workflows/build_one_arch.yml Its borken and not really needed. one_target is the goal. --- .github/workflows/build_one_arch.yml | 176 ------------------------- .github/workflows/build_one_target.yml | 23 +--- 2 files changed, 1 insertion(+), 198 deletions(-) delete mode 100644 .github/workflows/build_one_arch.yml diff --git a/.github/workflows/build_one_arch.yml b/.github/workflows/build_one_arch.yml deleted file mode 100644 index 5673f8cb6..000000000 --- a/.github/workflows/build_one_arch.yml +++ /dev/null @@ -1,176 +0,0 @@ -name: Build One Arch - -on: - workflow_dispatch: - inputs: - # trunk-ignore(checkov/CKV_GHA_7) - arch: - type: choice - options: - - esp32 - - esp32s3 - - esp32c3 - - esp32c6 - - nrf52840 - - rp2040 - - rp2350 - - stm32 - - native - -permissions: read-all - -env: - INPUT_ARCH: ${{ github.event.inputs.arch }} - -jobs: - setup: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-python@v6 - with: - python-version: 3.x - cache: pip - - run: pip install -U platformio - - name: Generate matrix - id: jsonStep - run: | - TARGETS=$(./bin/generate_ci_matrix.py $INPUT_ARCH --level extra) - echo "Name: $GITHUB_REF_NAME Base: $GITHUB_BASE_REF Ref: $GITHUB_REF" - echo "selected_arch=$TARGETS" >> $GITHUB_OUTPUT - outputs: - selected_arch: ${{ steps.jsonStep.outputs.selected_arch }} - - version: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - name: Get release version string - run: | - echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT - echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT - id: version - env: - BUILD_LOCATION: local - outputs: - long: ${{ steps.version.outputs.long }} - deb: ${{ steps.version.outputs.deb }} - - build: - if: ${{ github.event_name != 'workflow_dispatch' }} - needs: [setup, version] - strategy: - fail-fast: false - matrix: - build: ${{ fromJson(needs.setup.outputs.selected_arch) }} - uses: ./.github/workflows/build_firmware.yml - with: - version: ${{ needs.version.outputs.long }} - pio_env: ${{ matrix.build.board }} - platform: ${{ matrix.build.arch }} - - build-debian-src: - if: ${{ github.repository == 'meshtastic/firmware' && github.event_name != 'workflow_dispatch' || inputs.arch == 'native' }} - uses: ./.github/workflows/build_debian_src.yml - with: - series: UNRELEASED - build_location: local - secrets: inherit - - package-pio-deps-native-tft: - if: ${{ inputs.arch == 'native' }} - uses: ./.github/workflows/package_pio_deps.yml - with: - pio_env: native-tft - secrets: inherit - - test-native: - if: ${{ !contains(github.ref_name, 'event/') && github.event_name != 'workflow_dispatch' || !contains(github.ref_name, 'event/') && inputs.arch == 'native' }} - uses: ./.github/workflows/test_native.yml - - gather-artifacts: - permissions: - contents: write - pull-requests: write - strategy: - fail-fast: false - matrix: - arch: - - esp32 - - esp32s3 - - esp32c3 - - esp32c6 - - nrf52840 - - rp2040 - - rp2350 - - stm32 - runs-on: ubuntu-latest - needs: [version, build] - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} - - - uses: actions/download-artifact@v6 - with: - path: ./ - pattern: firmware-${{inputs.arch}}-* - merge-multiple: true - - - name: Display structure of downloaded files - run: ls -R - - - name: Move files up - run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - - - name: Repackage in single firmware zip - uses: actions/upload-artifact@v5 - with: - name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }} - overwrite: true - path: | - ./firmware-*.bin - ./firmware-*.uf2 - ./firmware-*.hex - ./firmware-*-ota.zip - ./device-*.sh - ./device-*.bat - ./littlefs-*.bin - ./bleota*bin - ./Meshtastic_nRF52_factory_erase*.uf2 - retention-days: 30 - - - uses: actions/download-artifact@v6 - with: - name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }} - merge-multiple: true - path: ./output - - # For diagnostics - - name: Show artifacts - run: ls -lR - - - name: Device scripts permissions - run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh - - - name: Zip firmware - run: zip -j -9 -r ./firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip ./output - - - name: Repackage in single elfs zip - uses: actions/upload-artifact@v5 - with: - name: debug-elfs-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip - overwrite: true - path: ./*.elf - retention-days: 30 - - - uses: scruplelesswizard/comment-artifact@main - if: ${{ github.event_name == 'pull_request' }} - with: - name: firmware-${{inputs.arch}}-${{ needs.version.outputs.long }} - description: "Download firmware-${{inputs.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation" - github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index 343e5be64..e4b332a06 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -15,7 +15,6 @@ on: - rp2040 - rp2350 - stm32 - - native target: type: string required: false @@ -42,7 +41,6 @@ jobs: - rp2040 - rp2350 - stm32 - runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v6 @@ -60,7 +58,7 @@ jobs: echo "Arch: ${{matrix.arch}}" >> $GITHUB_STEP_SUMMARY echo "Ref: $GITHUB_REF" >> $GITHUB_STEP_SUMMARY echo "Targets:" >> $GITHUB_STEP_SUMMARY - echo $TARGETS >> $GITHUB_STEP_SUMMARY + echo $TARGETS | jq -r 'sort_by(.board) |.[] | "- " + .board' >> $GITHUB_STEP_SUMMARY version: if: ${{ inputs.target != '' }} @@ -87,25 +85,6 @@ jobs: pio_env: ${{ inputs.target }} platform: ${{ inputs.arch }} - build-debian-src: - if: ${{ github.repository == 'meshtastic/firmware' && inputs.arch == 'native' }} - uses: ./.github/workflows/build_debian_src.yml - with: - series: UNRELEASED - build_location: local - secrets: inherit - - package-pio-deps-native-tft: - if: ${{ inputs.arch == 'native' }} - uses: ./.github/workflows/package_pio_deps.yml - with: - pio_env: native-tft - secrets: inherit - - test-native: - if: ${{ !contains(github.ref_name, 'event/') && github.event_name != 'workflow_dispatch' || !contains(github.ref_name, 'event/') && inputs.arch == 'native' && inputs.target != '' }} - uses: ./.github/workflows/test_native.yml - gather-artifacts: permissions: contents: write From 79e8fc94bce22c125a843c778b0e341aabd1f59e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=B6ttgens?= Date: Tue, 25 Nov 2025 23:35:17 +0100 Subject: [PATCH 178/286] 3401 fix (#8755) * Preliminary Thinknode M4 Support * fix 3401 detection * don't push unrelated work --- src/platform/nrf52/architecture.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index 75ca7567e..dc3930d64 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -57,11 +57,11 @@ #define HW_VENDOR meshtastic_HardwareModel_NOMADSTAR_METEOR_PRO #elif defined(R1_NEO) #define HW_VENDOR meshtastic_HardwareModel_MUZI_R1_NEO +#elif defined(RAK3401) +#define HW_VENDOR meshtastic_HardwareModel_RAK3401 // MAke sure all custom RAK4630 boards are defined before the generic RAK4630 #elif defined(RAK4630) #define HW_VENDOR meshtastic_HardwareModel_RAK4631 -#elif defined(RAK3401) -#define HW_VENDOR meshtastic_HardwareModel_RAK3401 #elif defined(TTGO_T_ECHO) #define HW_VENDOR meshtastic_HardwareModel_T_ECHO #elif defined(T_ECHO_LITE) From 654abe5b2cb6faa960181227223a2effd4d68fbd Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 25 Nov 2025 18:28:06 -0600 Subject: [PATCH 179/286] Add support for muzi-base (#8753) --- boards/muzi-base.json | 56 ++++++ src/Power.cpp | 20 ++- src/detect/ScanI2CTwoWire.cpp | 5 + src/gps/RTC.cpp | 8 + src/graphics/Screen.cpp | 17 +- src/graphics/Screen.h | 2 + src/mesh/NodeDB.cpp | 3 + src/modules/SerialModule.cpp | 9 +- src/motion/ICM20948Sensor.cpp | 17 ++ src/motion/ICM20948Sensor.h | 6 + src/platform/nrf52/architecture.h | 2 + variants/nrf52840/muzi_base/platformio.ini | 15 ++ variants/nrf52840/muzi_base/rfswitch.h | 11 ++ variants/nrf52840/muzi_base/variant.cpp | 83 +++++++++ variants/nrf52840/muzi_base/variant.h | 192 +++++++++++++++++++++ 15 files changed, 440 insertions(+), 6 deletions(-) create mode 100644 boards/muzi-base.json create mode 100644 variants/nrf52840/muzi_base/platformio.ini create mode 100644 variants/nrf52840/muzi_base/rfswitch.h create mode 100644 variants/nrf52840/muzi_base/variant.cpp create mode 100644 variants/nrf52840/muzi_base/variant.h diff --git a/boards/muzi-base.json b/boards/muzi-base.json new file mode 100644 index 000000000..5f65c0dc8 --- /dev/null +++ b/boards/muzi-base.json @@ -0,0 +1,56 @@ +{ + "build": { + "arduino": { + "ldscript": "nrf52840_s140_v6.ld" + }, + "core": "nRF5", + "cpu": "cortex-m4", + "extra_flags": "-DARDUINO_NRF52840_MUZI_BASE -DNRF52840_XXAA", + "f_cpu": "64000000L", + "hwids": [["0x239A", "0xcafe"]], + "mcu": "nrf52840", + "variant": "muzi-base", + "variants_dir": "variants", + "bsp": { + "name": "adafruit" + }, + "softdevice": { + "sd_flags": "-DS140", + "sd_name": "s140", + "sd_version": "6.1.1", + "sd_fwid": "0x00B6" + }, + "bootloader": { + "settings_addr": "0xFF000" + } + }, + "connectivity": ["bluetooth"], + "debug": { + "jlink_device": "nRF52840_xxAA", + "onboard_tools": ["jlink"], + "svd_path": "nrf52840.svd", + "openocd_target": "nrf52840-mdk-rs" + }, + "frameworks": ["arduino"], + "name": "Muzi Base", + "url": "https://muzi.works/", + "vendor": "MuziWorks", + "upload": { + "maximum_ram_size": 248832, + "maximum_size": 815104, + "speed": 115200, + "protocol": "nrfutil", + "protocols": [ + "jlink", + "nrfjprog", + "nrfutil", + "blackmagic", + "cmsis-dap", + "mbed", + "stlink" + ], + "use_1200bps_touch": true, + "require_upload_port": true, + "wait_for_upload_port": true + } +} diff --git a/src/Power.cpp b/src/Power.cpp index 75fd32202..0ac89670f 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -278,6 +278,11 @@ class AnalogBatteryLevel : public HasBatteryLevel break; } } +#if defined(BATTERY_CHARGING_INV) + // bit of trickery to show 99% up until the charge finishes + if (!digitalRead(BATTERY_CHARGING_INV) && battery_SOC > 99) + battery_SOC = 99; +#endif return clamp((int)(battery_SOC), 0, 100); } @@ -455,6 +460,8 @@ class AnalogBatteryLevel : public HasBatteryLevel } // if it's not HIGH - check the battery #endif +#elif defined(MUZI_BASE) + return NRF_POWER->USBREGSTATUS & POWER_USBREGSTATUS_VBUSDETECT_Msk; #endif return getBattVoltage() > chargingVolt; } @@ -470,6 +477,8 @@ class AnalogBatteryLevel : public HasBatteryLevel #endif #ifdef EXT_CHRG_DETECT return digitalRead(EXT_CHRG_DETECT) == ext_chrg_detect_value; +#elif defined(BATTERY_CHARGING_INV) + return !digitalRead(BATTERY_CHARGING_INV); #else #if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(DISABLE_INA_CHARGING_DETECTION) if (hasINA()) { @@ -702,7 +711,16 @@ bool Power::setup() }, CHANGE); #endif - +#ifdef BATTERY_CHARGING_INV + attachInterrupt( + BATTERY_CHARGING_INV, + []() { + power->setIntervalFromNow(0); + runASAP = true; + BaseType_t higherWake = 0; + }, + CHANGE); +#endif enabled = found; low_voltage_counter = 0; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 167728ad3..bcf49286e 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -547,6 +547,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) case ICM20948_ADDR: // same as BMX160_ADDR case ICM20948_ADDR_ALT: // same as MPU6050_ADDR registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); +#ifdef HAS_ICM20948 + type = ICM20948; + logFoundDevice("ICM20948", (uint8_t)addr.address); + break; +#endif if (registerValue == 0xEA) { type = ICM20948; logFoundDevice("ICM20948", (uint8_t)addr.address); diff --git a/src/gps/RTC.cpp b/src/gps/RTC.cpp index 692f3c2d2..1122f0a51 100644 --- a/src/gps/RTC.cpp +++ b/src/gps/RTC.cpp @@ -112,7 +112,11 @@ RTCSetResult readFromRTC() #elif defined(RX8130CE_RTC) if (rtc_found.address == RX8130CE_RTC) { uint32_t now = millis(); +#ifdef MUZI_BASE + ArtronShop_RX8130CE rtc(&Wire1); +#else ArtronShop_RX8130CE rtc(&Wire); +#endif tm t; if (rtc.getTime(&t)) { tv.tv_sec = gm_mktime(&t); @@ -245,7 +249,11 @@ RTCSetResult perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpd } #elif defined(RX8130CE_RTC) if (rtc_found.address == RX8130CE_RTC) { +#ifdef MUZI_BASE + ArtronShop_RX8130CE rtc(&Wire1); +#else ArtronShop_RX8130CE rtc(&Wire); +#endif tm *t = gmtime(&tv->tv_sec); if (rtc.setTime(*t)) { LOG_DEBUG("RX8130CE setDateTime %02d-%02d-%02d %02d:%02d:%02d (%ld)", t->tm_year + 1900, t->tm_mon + 1, diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 86599d5b3..dc9806156 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -435,6 +435,14 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) PMU->enablePowerOutput(XPOWERS_ALDO2); #endif +#if defined(MUZI_BASE) + dispdev->init(); + dispdev->setBrightness(brightness); + dispdev->flipScreenVertically(); + dispdev->resetDisplay(); + digitalWrite(SCREEN_12V_ENABLE, HIGH); + delay(100); +#endif #if !ARCH_PORTDUINO dispdev->displayOn(); #endif @@ -484,6 +492,10 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) #endif dispdev->displayOff(); + +#ifdef SCREEN_12V_ENABLE + digitalWrite(SCREEN_12V_ENABLE, LOW); +#endif #ifdef USE_ST7789 SPI1.end(); #if defined(ARCH_ESP32) @@ -534,7 +546,7 @@ void Screen::setup() static_cast(dispdev)->setDetected(model); #endif -#ifdef USE_SH1107_128_64 +#if defined(USE_SH1107_128_64) || defined(USE_SH1107) static_cast(dispdev)->setSubtype(7); #endif @@ -542,6 +554,9 @@ void Screen::setup() // Apply custom RGB color (e.g. Heltec T114/T190) static_cast(dispdev)->setRGB(TFT_MESH); #endif +#if defined(MUZI_BASE) + dispdev->delayPoweron = true; +#endif // === Initialize display and UI system === ui->init(); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 74b8d7c5d..375bc2805 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -249,6 +249,8 @@ class Screen : public concurrency::OSThread bool isOverlayBannerShowing(); + bool isScreenOn() { return screenOn; } + // Stores the last 4 of our hardware ID, to make finding the device for pairing easier // FIXME: Needs refactoring and getMacAddr needs to be moved to a utility class char ourId[5]; diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index bb3fc6dca..ff76baaa1 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -734,6 +734,9 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) config.display.screen_on_secs = 30; config.display.wake_on_tap_or_motion = true; #endif +#ifdef COMPASS_ORIENTATION + config.display.compass_orientation = COMPASS_ORIENTATION; +#endif #if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WIFI if (WiFiOTA::isUpdated()) { WiFiOTA::recoverConfig(&config.network); diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp index d04daf594..719e342b1 100644 --- a/src/modules/SerialModule.cpp +++ b/src/modules/SerialModule.cpp @@ -64,7 +64,8 @@ SerialModule *serialModule; SerialModuleRadio *serialModuleRadio; #if defined(TTGO_T_ECHO) || defined(CANARYONE) || defined(MESHLINK) || defined(ELECROW_ThinkNode_M1) || \ - defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) || defined(ELECROW_ThinkNode_M3) + defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE) || defined(ELECROW_ThinkNode_M3) || \ + defined(MUZI_BASE) SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") { api_type = TYPE_SERIAL; @@ -204,7 +205,7 @@ int32_t SerialModule::runOnce() Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT); } #elif !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(MESHLINK) && \ - !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) + !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) && !defined(MUZI_BASE) if (moduleConfig.serial.rxd && moduleConfig.serial.txd) { #ifdef ARCH_RP2040 Serial2.setFIFOSize(RX_BUFFER); @@ -261,7 +262,7 @@ int32_t SerialModule::runOnce() } #if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(MESHLINK) && \ - !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) + !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) && !defined(MUZI_BASE) else if ((moduleConfig.serial.mode == meshtastic_ModuleConfig_SerialConfig_Serial_Mode_WS85)) { processWXSerial(); @@ -537,7 +538,7 @@ void SerialModule::processWXSerial() { #if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(CONFIG_IDF_TARGET_ESP32C6) && \ !defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M3) && !defined(ELECROW_ThinkNode_M5) && \ - !defined(ARCH_STM32WL) + !defined(ARCH_STM32WL) && !defined(MUZI_BASE) static unsigned int lastAveraged = 0; static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded. static double dir_sum_sin = 0; diff --git a/src/motion/ICM20948Sensor.cpp b/src/motion/ICM20948Sensor.cpp index 10918eb7d..9455eafe0 100755 --- a/src/motion/ICM20948Sensor.cpp +++ b/src/motion/ICM20948Sensor.cpp @@ -47,6 +47,21 @@ int32_t ICM20948Sensor::runOnce() int32_t ICM20948Sensor::runOnce() { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN +#if defined(MUZI_BASE) // temporarily gated to single device due to feature freeze + if (screen && !screen->isScreenOn() && !config.display.wake_on_tap_or_motion && !config.device.double_tap_as_button_press) { + if (!isAsleep) { + LOG_DEBUG("sleeping IMU"); + sensor->sleep(true); + isAsleep = true; + } + return MOTION_SENSOR_CHECK_INTERVAL_MS; + } + if (isAsleep) { + sensor->sleep(false); + isAsleep = false; + } +#endif + float magX = 0, magY = 0, magZ = 0; if (sensor->dataReady()) { sensor->getAGMT(); @@ -156,6 +171,8 @@ int32_t ICM20948Sensor::runOnce() void ICM20948Sensor::calibrate(uint16_t forSeconds) { #if !defined(MESHTASTIC_EXCLUDE_SCREEN) && HAS_SCREEN + LOG_DEBUG("Old calibration data: highestX = %f, lowestX = %f, highestY = %f, lowestY = %f, highestZ = %f, lowestZ = %f", + highestX, lowestX, highestY, lowestY, highestZ, lowestZ); LOG_DEBUG("BMX160 calibration started for %is", forSeconds); if (sensor->dataReady()) { sensor->getAGMT(); diff --git a/src/motion/ICM20948Sensor.h b/src/motion/ICM20948Sensor.h index 27ce4f451..a9b7b69d0 100755 --- a/src/motion/ICM20948Sensor.h +++ b/src/motion/ICM20948Sensor.h @@ -82,7 +82,13 @@ class ICM20948Sensor : public MotionSensor private: ICM20948Singleton *sensor = nullptr; bool showingScreen = false; +#ifdef MUZI_BASE + bool isAsleep = false; + float highestX = 449.000000, lowestX = -140.000000, highestY = 422.000000, lowestY = -232.000000, highestZ = 749.000000, + lowestZ = 98.000000; +#else float highestX = 0, lowestX = 0, highestY = 0, lowestY = 0, highestZ = 0, lowestZ = 0; +#endif public: explicit ICM20948Sensor(ScanI2C::FoundDevice foundDevice); diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index dc3930d64..1568e1790 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -108,6 +108,8 @@ #define HW_VENDOR meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1 #elif defined(HELTEC_MESH_SOLAR) #define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_SOLAR +#elif defined(MUZI_BASE) +#define HW_VENDOR meshtastic_HardwareModel_RESERVED_FRIED_CHICKEN #else #define HW_VENDOR meshtastic_HardwareModel_NRF52_UNKNOWN #endif diff --git a/variants/nrf52840/muzi_base/platformio.ini b/variants/nrf52840/muzi_base/platformio.ini new file mode 100644 index 000000000..49393f4e0 --- /dev/null +++ b/variants/nrf52840/muzi_base/platformio.ini @@ -0,0 +1,15 @@ +[env:muzi-base] +extends = nrf52840_base +board = muzi-base +build_flags = ${nrf52840_base.build_flags} + -I variants/nrf52840/muzi_base + -D MUZI_BASE + -D CONFIG_NFCT_PINS_AS_GPIOS=1 + -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard" + +build_src_filter = ${nrf52840_base.build_src_filter} +<../variants/nrf52840/muzi_base> +lib_deps = + ${nrf52840_base.lib_deps} + artronshop/ArtronShop_RX8130CE@1.0.0 + + diff --git a/variants/nrf52840/muzi_base/rfswitch.h b/variants/nrf52840/muzi_base/rfswitch.h new file mode 100644 index 000000000..589f24767 --- /dev/null +++ b/variants/nrf52840/muzi_base/rfswitch.h @@ -0,0 +1,11 @@ +#include "RadioLib.h" + +static const uint32_t rfswitch_dio_pins[] = {RADIOLIB_LR11X0_DIO5, RADIOLIB_LR11X0_DIO6, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC}; + +static const Module::RfSwitchMode_t rfswitch_table[] = { + // mode DIO5 DIO6 + {LR11x0::MODE_STBY, {LOW, LOW}}, {LR11x0::MODE_RX, {HIGH, LOW}}, + {LR11x0::MODE_TX, {LOW, HIGH}}, {LR11x0::MODE_TX_HP, {LOW, HIGH}}, + {LR11x0::MODE_TX_HF, {LOW, LOW}}, {LR11x0::MODE_GNSS, {LOW, LOW}}, + {LR11x0::MODE_WIFI, {LOW, LOW}}, END_OF_MODE_TABLE, +}; diff --git a/variants/nrf52840/muzi_base/variant.cpp b/variants/nrf52840/muzi_base/variant.cpp new file mode 100644 index 000000000..da01de974 --- /dev/null +++ b/variants/nrf52840/muzi_base/variant.cpp @@ -0,0 +1,83 @@ +#include "variant.h" +#include "nrf.h" +#include "wiring_constants.h" +#include "wiring_digital.h" + +const uint32_t g_ADigitalPinMap[] = { + // P0 + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + + // P1 + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, +}; + +void initVariant() +{ + // Initialize the digital pins as inputs or outputs + pinMode(PIN_LED1, OUTPUT); + digitalWrite(PIN_LED1, HIGH); + + pinMode(PIN_LED2, OUTPUT); + digitalWrite(PIN_LED2, HIGH); + + // Initialize LoRa pins + pinMode(SX126X_RESET, OUTPUT); + digitalWrite(SX126X_RESET, HIGH); + + pinMode(SX126X_CS, OUTPUT); + digitalWrite(SX126X_CS, HIGH); + + pinMode(GPS_EN_GPIO, OUTPUT); + digitalWrite(GPS_EN_GPIO, HIGH); // GPS on initially + + pinMode(SCREEN_12V_ENABLE, OUTPUT); + digitalWrite(SCREEN_12V_ENABLE, LOW); // + + pinMode(BATTERY_CHARGING_INV, INPUT); +} diff --git a/variants/nrf52840/muzi_base/variant.h b/variants/nrf52840/muzi_base/variant.h new file mode 100644 index 000000000..d3e315f8b --- /dev/null +++ b/variants/nrf52840/muzi_base/variant.h @@ -0,0 +1,192 @@ +#pragma once + +#ifndef _VARIANT_MUZI_BASE_ +#define _VARIANT_MUZI_BASE_ + +/** Master clock frequency */ +#define VARIANT_MCK (64000000ul) + +#define USE_LFXO // Board uses 32khz crystal for LF + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ + +#include "WVariant.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Number of pins defined in PinDescription array +#define PINS_COUNT (48) +#define NUM_DIGITAL_PINS (48) +#define NUM_ANALOG_INPUTS (6) +#define NUM_ANALOG_OUTPUTS (0) + +// Define I2C Peripherals +#define WIRE_INTERFACES_COUNT 2 + +// this is the OLED bus +#define PIN_WIRE_SDA (0 + 24) // P0.24 +#define PIN_WIRE_SCL (0 + 25) // P0.25 + +// IMU bus +#define PIN_WIRE1_SDA (0 + 04) // P0.04 +#define PIN_WIRE1_SCL (0 + 06) // P0.06 + +#define COMPASS_ORIENTATION meshtastic_Config_DisplayConfig_CompassOrientation_DEGREES_270 +#define HAS_ICM20948 // forces the i2c address to be seen as this sensor + +#define HAS_RTC 1 +#define RX8130CE_RTC 0x32 + +// LEDs +#define PIN_LED1 (32 + 3) // P1.03, Green +#define PIN_LED2 (32 + 4) // P1.04, Blue + +#define LED_BUILTIN -1 // PIN_LED1 +#define LED_BLUE PIN_LED2 +#define LED_STATE_ON 0 // State when LED is lit + +// Buttons +#define HAS_TRACKBALL 1 +#define TB_UP (0 + 21) +#define TB_DOWN (0 + 17) +#define TB_LEFT (32 + 05) +#define TB_RIGHT (0 + 16) +#define TB_PRESS (0 + 10) +#define TB_DIRECTION FALLING + +#define CANCEL_BUTTON_PIN (0 + 15) // P0.15 +#define CANCEL_BUTTON_ACTIVE_LOW true +#define CANCEL_BUTTON_ACTIVE_PULLUP false + +// Switch +#define SWITCH_MODE1 (32 + 9) // P1.09, Top Position +#define SWITCH_MODE2 (0 + 12) // P0.12, Middle Position +#define PIN_GPS_SWITCH SWITCH_MODE2 + +/* + * SPI Interfaces + */ + +#define SPI_INTERFACES_COUNT 1 + +// For LORA, spi 0 +#define PIN_SPI_MISO (32 + 15) // P1.15 +#define PIN_SPI_MOSI (32 + 14) // P1.14 +#define PIN_SPI_SCK (32 + 13) // P1.13 + +#define LORA_SCK PIN_SPI_SCK +#define LORA_MISO PIN_SPI_MISO +#define LORA_MOSI PIN_SPI_MOSI +#define LORA_CS (32 + 12) // P1.12 + +#define USE_SX1262 +#define SX126X_CS LORA_CS +#define SX126X_DIO1 (32 + 6) // P1.06 +#define SX126X_BUSY (32 + 11) // P1.11 +#define SX126X_RESET (32 + 10) // P1.10 +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 3.3 + +#define USE_LR1121 +#define LR1121_IRQ_PIN (32 + 8) // P1.08 +#define LR1121_NRESET_PIN (32 + 10) // P1.10 +#define LR1121_BUSY_PIN (32 + 11) // P1.11 +#define LR1121_SPI_NSS_PIN LORA_CS +#define LR1121_SPI_SCK_PIN LORA_SCK +#define LR1121_SPI_MOSI_PIN LORA_MOSI +#define LR1121_SPI_MISO_PIN LORA_MISO +#define LR11X0_DIO3_TCXO_VOLTAGE 3.0 +#define LR11X0_DIO_AS_RF_SWITCH + +// GPS +#define GPS_RX_PIN (0 + 19) // P0.19 +#define GPS_TX_PIN (0 + 20) // P0.20 +#define GPS_EN_GPIO (32 + 1) // P1.01 + +#define PIN_SERIAL1_RX GPS_TX_PIN +#define PIN_SERIAL1_TX GPS_RX_PIN + +#define PIN_BUZZER (0 + 22) // P0.22 + +// Battery monitoring +#define BATTERY_PIN (0 + 31) // P0.31 + +// #define CHARGER_FAULT (0 + 27) // P0.27 +#define BATTERY_CHARGING_INV (32 + 02) // P1.02 +#define BATTERY_SENSE_RESOLUTION_BITS 12 +#define BATTERY_SENSE_RESOLUTION 4096.0 +#define ADC_MULTIPLIER 1.537 + +#define OCV_ARRAY 4050, 4010, 3990, 3930, 3870, 3820, 3740, 3630, 3550, 3450, 3100 + +// Display - I2C display +#define HAS_SCREEN 1 +#define SCREEN_12V_ENABLE (0 + 23) // P0.23 +#define USE_SH1107 + +#define USERPREFS_OEM_TEXT "muzi_works_logo" +#define USERPREFS_OEM_FONT_SIZE 0 +#define USERPREFS_OEM_IMAGE_WIDTH 88 // 11 bytes wide +#define USERPREFS_OEM_IMAGE_HEIGHT 47 // 517 bytes total +#define USERPREFS_OEM_IMAGE_DATA \ + { \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, \ + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF7, 0x0F, 0xFF, 0x00, 0xF0, 0xFF, 0x0F, 0xC0, 0xFF, 0x07, 0x78, 0xFF, 0x9F, 0xFF, 0x01, 0xF0, 0xFF, 0x0F, 0xC0, \ + 0xFF, 0x03, 0x78, 0x3F, 0xFE, 0xF3, 0x01, 0xF0, 0xFF, 0x0F, 0x00, 0xE0, 0x03, 0x78, 0x1F, 0xFC, 0xC0, 0x03, 0xF0, \ + 0xFF, 0x0F, 0x00, 0xE0, 0x01, 0x78, 0x0F, 0xF8, 0x80, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0xF0, 0x00, 0x78, 0x0F, 0x78, \ + 0x80, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0x70, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0x78, 0x00, \ + 0x78, 0x07, 0x70, 0x80, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0x3C, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, 0xF0, 0xFF, 0x0F, \ + 0x00, 0x1C, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, 0xF0, 0xFF, 0x0F, 0x00, 0x1E, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, \ + 0xE0, 0xFF, 0x0F, 0x00, 0x0F, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, 0xE0, 0xFF, 0x07, 0x80, 0x07, 0x00, 0x78, 0x07, \ + 0x70, 0x80, 0x03, 0xC0, 0xFF, 0x07, 0x80, 0x07, 0x00, 0x78, 0x07, 0x70, 0x80, 0x03, 0xC0, 0xFF, 0x03, 0xC0, 0xFF, \ + 0x07, 0x78, 0x07, 0x70, 0x80, 0x03, 0x00, 0xFF, 0x01, 0xE0, 0xFF, 0x07, 0x78, 0x07, 0x70, 0x80, 0x03, 0x00, 0x7C, \ + 0x00, 0xF0, 0xFF, 0x07, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xE3, 0xE7, 0xC7, 0x1F, 0xF8, 0x0F, 0xF0, 0xE7, 0xE3, 0x07, 0x7C, 0xC7, 0xE7, \ + 0xC3, 0x0F, 0xE0, 0x07, 0xE0, 0xC7, 0xE1, 0x03, 0x70, 0xC7, 0xC3, 0xE3, 0x87, 0xC1, 0x07, 0xC0, 0xC7, 0xF8, 0xE3, \ + 0x71, 0xC7, 0xC3, 0xE3, 0xE3, 0xC7, 0xC7, 0xC7, 0x47, 0xF8, 0xF3, 0x7F, 0x8F, 0xC3, 0xF1, 0xE3, 0x8F, 0xC7, 0x8F, \ + 0x27, 0xFC, 0xE3, 0x7F, 0x8F, 0x81, 0xF1, 0xF1, 0x8F, 0xC7, 0xCF, 0x07, 0xFE, 0x03, 0x7E, 0x8F, 0x99, 0xF1, 0xF1, \ + 0x8F, 0x07, 0xC0, 0x07, 0xFF, 0x07, 0x78, 0x9F, 0x99, 0xF9, 0xF1, 0x8F, 0x07, 0xE0, 0x07, 0xFE, 0x3F, 0x70, 0x1F, \ + 0x18, 0xF8, 0xF3, 0x8F, 0x07, 0xF0, 0x27, 0xFC, 0xFF, 0x71, 0x3F, 0x18, 0xF8, 0xE3, 0xC7, 0xC7, 0xF1, 0x47, 0xF8, \ + 0xF3, 0x63, 0x3F, 0x3C, 0xFC, 0xC3, 0xC3, 0xC7, 0xE3, 0xC7, 0xF0, 0xE1, 0x71, 0x3F, 0x3C, 0xFC, 0x07, 0xE0, 0xC7, \ + 0xC7, 0xC7, 0xE1, 0x03, 0x70, 0x7F, 0x7E, 0xFE, 0x0F, 0xF0, 0xC7, 0x87, 0xC7, 0xC3, 0x07, 0x78, 0xFF, 0xFF, 0xFF, \ + 0x7F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0x7F \ + } + +// QSPI Pins +#define PIN_QSPI_SCK (0 + 3) +#define PIN_QSPI_CS (0 + 26) +#define PIN_QSPI_IO0 (0 + 30) +#define PIN_QSPI_IO1 (0 + 29) +#define PIN_QSPI_IO2 (0 + 28) +#define PIN_QSPI_IO3 (0 + 2) + +// On-board QSPI Flash +#define EXTERNAL_FLASH_DEVICES W25Q32JVSS +#define EXTERNAL_FLASH_USE_QSPI + +// NFC is disabled via CONFIG_NFCT_PINS_AS_GPIOS=1 build flag +// This configures P0.09 and P0.10 as regular GPIO pins instead of NFC pins + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ +#ifdef __cplusplus +#endif + +#endif // _VARIANT_MUZI_BASE_ \ No newline at end of file From 06dac12a738e6fa5dc82aedf73954b768f2306ec Mon Sep 17 00:00:00 2001 From: Quency-D <55523105+Quency-D@users.noreply.github.com> Date: Thu, 27 Nov 2025 01:10:21 +0800 Subject: [PATCH 180/286] Swap the GPS serial port pins. (#8756) * Swap the GPS serial port pins. * Trunk fixes --------- Co-authored-by: Jason P Co-authored-by: Ben Meadors --- variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h | 8 ++++---- variants/nrf52840/heltec_mesh_node_t114/variant.h | 4 ++-- variants/nrf52840/heltec_mesh_solar/variant.h | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h b/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h index 39cbc8f01..143d20459 100644 --- a/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h @@ -116,13 +116,13 @@ No longer populated on PCB #define PIN_GPS_PPS (32 + 4) // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (32 + 5) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (32 + 7) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (32 + 7) // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN (32 + 5) // This is for bits going TOWARDS the GPS #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN // PCF8563 RTC Module #define PCF8563_RTC 0x51 diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index de89d2d07..3493577bc 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -172,8 +172,8 @@ No longer populated on PCB #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN // PCF8563 RTC Module #define PCF8563_RTC 0x51 diff --git a/variants/nrf52840/heltec_mesh_solar/variant.h b/variants/nrf52840/heltec_mesh_solar/variant.h index 7c43d8ba7..7a8fc579f 100644 --- a/variants/nrf52840/heltec_mesh_solar/variant.h +++ b/variants/nrf52840/heltec_mesh_solar/variant.h @@ -116,13 +116,13 @@ No longer populated on PCB #define PIN_GPS_PPS (32 + 4) // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (32 + 5) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (32 + 7) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (32 + 7) // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN (32 + 5) // This is for bits going TOWARDS the GPS #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN /* * SPI Interfaces From f10aa3daa250a9f733888448e6c6f8b650b2cbb9 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Wed, 26 Nov 2025 11:30:34 -0600 Subject: [PATCH 181/286] Fixes --- src/Power.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Power.cpp b/src/Power.cpp index 0ac89670f..a2c559d91 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -707,7 +707,6 @@ bool Power::setup() []() { power->setIntervalFromNow(0); runASAP = true; - BaseType_t higherWake = 0; }, CHANGE); #endif @@ -717,7 +716,6 @@ bool Power::setup() []() { power->setIntervalFromNow(0); runASAP = true; - BaseType_t higherWake = 0; }, CHANGE); #endif @@ -777,7 +775,7 @@ void Power::shutdown() if (screen) { #ifdef T_DECK_PRO screen->showSimpleBanner("Device is powered off.\nConnect USB to start!", 0); // T-Deck Pro has no power button -#elif USE_EINK +#elif defined(USE_EINK) screen->showSimpleBanner("Shutting Down...", 2250); // dismiss after 3 seconds to avoid the banner on the sleep screen #else screen->showSimpleBanner("Shutting Down...", 0); // stays on screen From c3a7ad28656a255c41054b1f00a19392123e879d Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 26 Nov 2025 13:53:26 -0600 Subject: [PATCH 182/286] More GPS pin flips for devices (#8760) --- variants/nrf52840/muzi_base/variant.h | 8 ++++---- variants/nrf52840/t-echo/variant.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/variants/nrf52840/muzi_base/variant.h b/variants/nrf52840/muzi_base/variant.h index d3e315f8b..96604c400 100644 --- a/variants/nrf52840/muzi_base/variant.h +++ b/variants/nrf52840/muzi_base/variant.h @@ -103,12 +103,12 @@ extern "C" { #define LR11X0_DIO_AS_RF_SWITCH // GPS -#define GPS_RX_PIN (0 + 19) // P0.19 -#define GPS_TX_PIN (0 + 20) // P0.20 +#define GPS_RX_PIN (0 + 20) // P0.20 +#define GPS_TX_PIN (0 + 19) // P0.19 #define GPS_EN_GPIO (32 + 1) // P1.01 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN #define PIN_BUZZER (0 + 22) // P0.22 diff --git a/variants/nrf52840/t-echo/variant.h b/variants/nrf52840/t-echo/variant.h index 8ddb1c263..b2692e448 100644 --- a/variants/nrf52840/t-echo/variant.h +++ b/variants/nrf52840/t-echo/variant.h @@ -187,8 +187,8 @@ External serial flash WP25R1635FZUIL0 #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN // PCF8563 RTC Module #define PCF8563_RTC 0x51 From 9bfef80e308b9010c54765cb2352dd88c3d35135 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 27 Nov 2025 06:01:03 -0600 Subject: [PATCH 183/286] Add requestFocus() in CannedMessages (#8770) Certain actions in CannedMessages can trigger the module losing the requestFocus bit, which puts the UI into a slightly frozen state. --- src/modules/CannedMessageModule.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index f435f6060..9cbacc877 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -836,6 +836,7 @@ bool CannedMessageModule::handleFreeTextInput(const InputEvent *event) if (event->inputEvent == INPUT_BROKER_BACK && this->freetext.length() > 0) { payload = 0x08; lastTouchMillis = millis(); + requestFocus(); runOnce(); return true; } @@ -844,6 +845,7 @@ bool CannedMessageModule::handleFreeTextInput(const InputEvent *event) if (event->inputEvent == INPUT_BROKER_LEFT) { payload = INPUT_BROKER_LEFT; lastTouchMillis = millis(); + requestFocus(); runOnce(); return true; } @@ -851,6 +853,7 @@ bool CannedMessageModule::handleFreeTextInput(const InputEvent *event) if (event->inputEvent == INPUT_BROKER_RIGHT) { payload = INPUT_BROKER_RIGHT; lastTouchMillis = millis(); + requestFocus(); runOnce(); return true; } From f7ae7aa2c13473d5971bb3f2a2a4992ae80ec190 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 06:11:14 -0600 Subject: [PATCH 184/286] Upgrade trunk (#8623) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 1fd8790f2..ccb426745 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -4,31 +4,31 @@ cli: plugins: sources: - id: trunk - ref: v1.7.3 + ref: v1.7.4 uri: https://github.com/trunk-io/plugins lint: enabled: - - checkov@3.2.492 - - renovate@42.5.4 + - checkov@3.2.495 + - renovate@42.24.1 - prettier@3.6.2 - - trufflehog@3.90.13 + - trufflehog@3.91.1 - yamllint@1.37.1 - - bandit@1.8.6 + - bandit@1.9.2 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.4 + - ruff@0.14.6 - isort@7.0.0 - - markdownlint@0.45.0 + - markdownlint@0.46.0 - oxipng@9.1.5 - svgo@4.0.0 - - actionlint@1.7.8 + - actionlint@1.7.9 - flake8@7.3.0 - hadolint@2.14.0 - shfmt@3.6.0 - shellcheck@0.11.0 - black@25.11.0 - git-diff-check - - gitleaks@8.29.0 + - gitleaks@8.30.0 - clang-format@16.0.3 ignore: - linters: [ALL] From a6d1ce2048fae6a2f98837a8893186ad6e8deb0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 06:14:49 -0600 Subject: [PATCH 185/286] Update Sensirion Core to v0.7.2 (#8551) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index d6ff155e4..9f7faeca5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -213,6 +213,6 @@ lib_deps = # renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip # renovate: datasource=custom.pio depName=Sensirion Core packageName=sensirion/library/Sensirion Core - sensirion/Sensirion Core@0.7.1 + sensirion/Sensirion Core@0.7.2 # renovate: datasource=custom.pio depName=Sensirion I2C SCD4x packageName=sensirion/library/Sensirion I2C SCD4x sensirion/Sensirion I2C SCD4x@1.1.0 From d0c6ec28dbae79d8dd9c8ec78e97b61aeddfdc48 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 06:15:36 -0600 Subject: [PATCH 186/286] Update INA226 to v0.6.5 (#8645) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 9f7faeca5..217ab0af8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -169,7 +169,7 @@ lib_deps = # renovate: datasource=git-refs depName=DFRobot_RainfallSensor packageName=https://github.com/DFRobot/DFRobot_RainfallSensor gitBranch=master https://github.com/DFRobot/DFRobot_RainfallSensor/archive/38fea5e02b40a5430be6dab39a99a6f6347d667e.zip # renovate: datasource=custom.pio depName=INA226 packageName=robtillaart/library/INA226 - robtillaart/INA226@0.6.4 + robtillaart/INA226@0.6.5 # renovate: datasource=custom.pio depName=SparkFun MAX3010x packageName=sparkfun/library/SparkFun MAX3010x Pulse and Proximity Sensor Library sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor Library@1.1.2 # renovate: datasource=custom.pio depName=SparkFun 9DoF IMU Breakout ICM 20948 packageName=sparkfun/library/SparkFun 9DoF IMU Breakout - ICM 20948 - Arduino Library From 7cb7a6cd3ee7705dcf9eb1ba881beb8fd5d2bc2f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 06:16:12 -0600 Subject: [PATCH 187/286] Update NonBlockingRTTTL to v1.4.0 (#8541) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 217ab0af8..1363a63fc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -90,7 +90,7 @@ framework = arduino lib_deps = ${env.lib_deps} # renovate: datasource=custom.pio depName=NonBlockingRTTTL packageName=end2endzone/library/NonBlockingRTTTL - end2endzone/NonBlockingRTTTL@1.3.0 + end2endzone/NonBlockingRTTTL@1.4.0 build_flags = ${env.build_flags} -Os build_src_filter = ${env.build_src_filter} - - From bc3ed4a7f34ea0f1b9a69eb081093e2aa45edbc4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 06:16:50 -0600 Subject: [PATCH 188/286] Update platformio/ststm32 to v19.4.0 (#8433) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- arch/stm32/stm32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/stm32/stm32.ini b/arch/stm32/stm32.ini index 7732533c9..1a9fd10ce 100644 --- a/arch/stm32/stm32.ini +++ b/arch/stm32/stm32.ini @@ -2,7 +2,7 @@ extends = arduino_base platform = # renovate: datasource=custom.pio depName=platformio/ststm32 packageName=platformio/platform/ststm32 - platformio/ststm32@19.3.0 + platformio/ststm32@19.4.0 platform_packages = # TODO renovate platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip From 1523368c53f9f0a04c6813ba7c95ba1095aa41c1 Mon Sep 17 00:00:00 2001 From: Nasimovy Date: Thu, 27 Nov 2025 13:18:52 +0100 Subject: [PATCH 189/286] adding support for the ST7796 + creating a new variant of the T-beam (#6575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * remove duplicate HAS_LP5562 introduced by #6422 * add ST7796 * changes to get display centered+lib update * seperated from tbeam * forgot the simple scan case * lowered speeds to 1/4 * added SPI Speed to constructor+ cleaned up variant.h * even slower speeds.... * add ST7796 * changes to get display centered+lib update * seperated from tbeam * forgot the simple scan case * lowered speeds to 1/4 * added SPI Speed to constructor+ cleaned up variant.h * even slower speeds.... * changed variant name to tbeam-displayshield * modified variant.h and merged ini file+testing on lower spi frequency for the lora module, display shield pumps out EMI? * try higher speeds + HSPI * cleanup of redundant code * refelct changes? * trunk fmt * testing touchscreen code * further testing * changed to sensorlib 0.3.1 * i broke it , dont know how to fix at the moment will investigate * add -1 functionality for touch IRQ * revert to working example? * it works.... is pressed was not working properly * working touchscreen but gestures not moving display * swap XY+ mirror X * cleanup + addition of defines for on screen keyboard and canned message module * removed debug lines, disabled bluetooth for now because of stack smashing protect failure * reverted the revert #6640 + increased speed, bleutooth is stable now on reconnection cold booth etc , GPS is still not working though * remove debug + add fixed baudrate for gps * fmt * revert NIMble * changed display library to meshtastic org * removed baudrate of 115200 and some commented out code * Correct spelling Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Typo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * display speed x10 * resolve conflicts * undo * revert speed increase CPU * add SCREEN_TRANSITION_FRAMERATE 5 * spi speed increase of the display * using the original touchscreen implementation * removal of H file line * add USE_ST7796 to missing places * removed is pressed + interrupt * revert changes of settings.json * update to screen.cpp * test identification of CST226 and CST328 * Update src/configuration.h typo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * made changes to detection because it was completely wrong, CST226SE has 2 posible adresses * add merge queue * try vars * kerning in yaml. * update comment * lint etc * touching to check grandfathering * explicit ignores * add WIP for Unit C6L (#7433) * add WIP for Unit C6L * adapt to new config structure * Add c6l BLE and screen support (#7991) * Minor c6l fix * Move out of PRIVATE_HW --------- Co-authored-by: Austin Co-authored-by: Ben Meadors Co-authored-by: Jonathan Bennett Co-authored-by: Jason P Co-authored-by: Markus * Update Adafruit BusIO to v1.17.3 (#8018) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update actions/checkout action to v5 (#8020) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update actions/setup-python action to v6 (#8023) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Upgrade trunk (#8025) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> * Update actions/download-artifact action to v5 (#8021) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Fix init for InputEvent (#8015) * Automated version bumps (#8028) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Allow Left / Right Events for selection and improve encoder responsives (#8016) * Allow Left / Right Events for selection and improve encoder responsives * add define for ROTARY_DELAY * T-Lora Pager: Support LR1121 and SX1280 models (#7956) * T-Lora Pager: Support LR1121 and SX1280 models * Remove ifdefs * (resubmission) Manual GitHub actions to allow building one target or arch (#7997) * Reset the modified files * Fix some changes * Fix some changes * Trunk. That is all. --------- Co-authored-by: Tom <116762865+Nestpebble@users.noreply.github.com> * BaseUI Show/Hide Frame Functionality (#7382) * Rename System Frame (from Memory) in code base * Create menu options to Show/Hide frames: Node Lists, Bearings, Position, LoRa, Clock and Favorites frames * Move Region Picker into submenu * Tweak wording for Send Position vs Node Info if the device has GPS * Update actions/checkout action to v5 (#8031) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update actions/download-artifact action to v5 (#8032) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Update actions/setup-python action to v6 (#8033) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Phone GPS display on Position Screen for BaseUI (#7875) * Phone GPS display on Position Screen This is a PR to show when a phone shares GPS location with the node so you can reliably know what coordinate is being shared with the Mesh. * Merge pull request #8004 from compumike/compumike/debug-heap-add-free-heap-debugging-to-all-log-lines When `DEBUG_HEAP` is defined, add free heap bytes to every log line in `RedirectablePrint::log_to_serial` * Feature: Seamless Cross-Preset Communication via UDP Multicast Bridging (#7753) * Added compatibility between nodes on different Presets through `Mesh via UDP` * Optimize multicast handling and channel mapping - FloodingRouter: remove redundant UDP-encrypted rebroadcast suppression. - Router: guard multicast fallback with HAS_UDP_MULTICAST and map fallback-decoded packets to the local default channel via isDefaultChannel() - UdpMulticastHandler: set transport_mechanism only after successful decode * trunk fmt * Move setting transport mechanism. --------- Co-authored-by: GUVWAF * Auto-favorite remote admin node * Merge pull request #7873 from compumike/compumike/client-base-role Add `CLIENT_BASE` role: `ROUTER` for favorites, `CLIENT` otherwise (for attic/roof nodes!) * Fixes * BaseUI Updates (#7787) * Account for low resolution wide screen OLEDs * Allow picking of Device Role and new Display Formatter for Device Role * Add remainder of client roles to display formatter * Don't update the role unless you pick a value * Mascots are fun * Fix warnings during compile time * Improve some menus * Mascots need to work everywhere * Update Chirpy image * Fix Trunk * Update protobufs * Add date to Clock screen * Analog clocks love dates too * Finalize date moves for analog clock * Added Last Coordinate counter to Position screen (#7865) Adding a counter to show the last time a GPS coordinate was detected to ensure the user is aware how long since the coordinate updated or to identify any errors. * Fix * Portduino config refactor (#7796) * Start portduino_config refactor * refactor GPIOs to new portduino_config * More portduino_config work * More conversion to portduino_config * Finish portduino_config transition * trunk * yaml output work * Simplify the GPIO config * Trunk * updated shebang to use a more standard path for bash (#7922) Signed-off-by: Trenton VanderWert * Show GPS Date properly in drawCommonHeader (#7887) * Commit good code that is sustainable * Fix new build errors * BaseUI Updates (#7787) * Account for low resolution wide screen OLEDs * Allow picking of Device Role and new Display Formatter for Device Role * Add remainder of client roles to display formatter * Don't update the role unless you pick a value * Mascots are fun * Fix warnings during compile time * Improve some menus * Mascots need to work everywhere * Update Chirpy image * Fix Trunk * Update protobufs * Add date to Clock screen * Analog clocks love dates too * Finalize date moves for analog clock * Add formatting and menu picking for other GPS format options (#7974) * Add back options for other GPS format options * Rename variables and don't overlap elements * Fix default value * Should probably add a menu while I'm here! * Shorten names just a bit to fit on screens * Fix off by one * Labels try to make things better * Missed a label * Update protobufs (#8038) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Add formatting and menu picking for other GPS format options (#7974) * Add back options for other GPS format options * Rename variables and don't overlap elements * Fix default value * Should probably add a menu while I'm here! * Shorten names just a bit to fit on screens * Fix off by one * Labels try to make things better * Missed a label * Add a new GPS model CM121. (#7852) * Add a new GPS model CM121. * Add CM121 to Unicore. * Trunk fixes, remove unneded NMEA lines --------- Co-authored-by: Tom Fifield * (resubmission) Manual GitHub actions to allow building one target or arch (#7997) * Reset the modified files * Fix some changes * Fix some changes * Trunk. That is all. --------- Co-authored-by: Tom <116762865+Nestpebble@users.noreply.github.com> * PPA: Enable Ubuntu 25.10 (questing) (#7940) * Update Protobuf usage, add MLS, fix clock (#8041) * Update protobufs (#8045) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Fix icon * C6l fixes (#8047) * fix build with HAS_TELEMETRY 0 (#8051) * Make sure to ACK ACKs/replies if next-hop routing is used (#8052) * Make sure to ACK ACKs/replies if next-hop routing is used To stop their retransmissions; hop limit of 0 is enough * Update src/mesh/ReliableRouter.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * move HTTP contentTypes to Flash - saves 768 Bytes of RAM (#8055) * Use `lora.use_preset` config to get name (#8057) * Update RadioLib to v7.3.0 (#8065) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Fix Rotary Encoder Button (#8001) this fixes the Rotary Encoder Button, currenlty its not working at all. Currently the action `ROTARY_ACTION_PRESSED` is only triggerd with a IRQ on RISING, which results in nothing since the function detects the "not longer" pressed button --> no action. the `ROTARY_ACTION_PRESSED` implementation needs to be called on both edges (on press and release of the button) changing the interupt setting to `CHANGE` fixes the problem. * Add another seeed_xiao_nrf52840_kit build environment for I2C pinout (#8036) * Update platformio.ini * Remove some more extraneous lines * Add heltec_v4 board. (#7845) * add heltec_v4 board. * Update variants/esp32s3/heltec_v4/platformio.ini Co-authored-by: Austin * Limit the maximum output power. * Trunk fixes Fixes formatting to match meshtastic trunk linter. * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Austin Co-authored-by: Tom Fifield Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Upgrade trunk (#8078) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> * portduino bump to fix gpiod bug (#8083) An earlier portduino causes problems with initializing gpiod lines. This pulls in the fix. * Handle ext. notification module things even if not enabled (#8089) * tlora-pager wake on button, and kb backlight toggling (#8090) * Try-fix: Unstick that PhoneAPI state (#8091) Co-authored-by: Jonathan Bennett * Also pull a deviceID from esp32c6 devices (#8092) * Remove line from BLE pin screen, to make pin readible on tiny screens * Fix build errors (#8067) * Heltec V4 is 16mb * Clear lasttoradio on BLE disconnect (#8095) * On disconnect, clear the lastToRadio buffer * Move it, bucko! * Revert "Fix build errors (#8067)" This reverts commit d998f70b5633e8b2f88823cfb73761625bbc3423. * Automated version bumps (#8100) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> * Upgrade trunk (#8094) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> * Update Adafruit BusIO to v1.17.4 (#8098) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Add three expansion screens for heltec mesh solar. (#7995) * Add three expansion screens for heltec mesh solar. * delete whitespace Update variants/nrf52840/heltec_mesh_solar/variant.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * delete whitespace Update variants/nrf52840/heltec_mesh_solar/platformio.ini Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ben Meadors * Trunk --------- Signed-off-by: Trenton VanderWert Co-authored-by: Thomas Göttgens Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Ben Meadors Co-authored-by: Dane Evans Co-authored-by: Austin Co-authored-by: Jonathan Bennett Co-authored-by: Jason P Co-authored-by: Markus Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> Co-authored-by: Markus <974709+Links2004@users.noreply.github.com> Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> Co-authored-by: WillyJL Co-authored-by: Tom <116762865+NomDeTom@users.noreply.github.com> Co-authored-by: Tom <116762865+Nestpebble@users.noreply.github.com> Co-authored-by: Jason P Co-authored-by: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Co-authored-by: Michael Co-authored-by: GUVWAF Co-authored-by: Trent V. Co-authored-by: Quency-D <55523105+Quency-D@users.noreply.github.com> Co-authored-by: Tom Fifield Co-authored-by: GUVWAF <78759985+GUVWAF@users.noreply.github.com> --- src/configuration.h | 3 +- src/detect/ScanI2C.h | 3 +- src/detect/ScanI2CTwoWire.cpp | 21 +++++++-- src/graphics/Screen.cpp | 45 ++++++++++++++++++- src/graphics/Screen.h | 2 + src/graphics/ScreenFonts.h | 2 +- src/graphics/draw/DebugRenderer.cpp | 8 ++-- src/graphics/draw/UIRenderer.cpp | 2 +- src/graphics/images.h | 3 +- src/main.cpp | 4 +- src/mesh/NodeDB.cpp | 2 +- .../tbeam_displayshield/variant.cpp | 43 ++++++++++++++++++ variants/esp32/tbeam/platformio.ini | 18 ++++++-- variants/esp32/tbeam/variant.h | 33 +++++++++++++- 14 files changed, 167 insertions(+), 22 deletions(-) create mode 100644 src/platform/extra_variants/tbeam_displayshield/variant.cpp diff --git a/src/configuration.h b/src/configuration.h index d37269995..d30280d8b 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -250,8 +250,9 @@ along with this program. If not, see . // Touchscreen // ----------------------------------------------------------------------------- #define FT6336U_ADDR 0x48 -#define CST328_ADDR 0x1A +#define CST328_ADDR 0x1A // same address as CST226SE #define CHSC6X_ADDR 0x2E +#define CST226SE_ADDR_ALT 0x5A // ----------------------------------------------------------------------------- // RAK12035VB Soil Monitor (using RAK12023 up to 3 RAK12035 monitors can be connected) diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 55980face..cced980a6 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -85,7 +85,8 @@ class ScanI2C DRV2605, BH1750, DA217, - CHSC6X + CHSC6X, + CST226SE } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index bcf49286e..db269ac64 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -499,7 +499,18 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) SCAN_SIMPLE_CASE(DFROBOT_RAIN_ADDR, DFROBOT_RAIN, "DFRobot Rain Gauge", (uint8_t)addr.address); SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address); SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address); - SCAN_SIMPLE_CASE(CST328_ADDR, CST328, "CST328", (uint8_t)addr.address); + case CST328_ADDR: + // Do we have the CST328 or the CST226SE + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xAB), 1); + if (registerValue == 0xA9) { + type = CST226SE; + logFoundDevice("CST226SE", (uint8_t)addr.address); + } else { + type = CST328; + logFoundDevice("CST328", (uint8_t)addr.address); + } + break; + SCAN_SIMPLE_CASE(CHSC6X_ADDR, CHSC6X, "CHSC6X", (uint8_t)addr.address); case LTR553ALS_ADDR: registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x86), 1); // Part ID register @@ -528,8 +539,12 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize) #endif case MLX90614_ADDR_DEF: - registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x0e), 1); - if (registerValue == 0x5a) { + // Do we have the MLX90614 or the MPR121KB or the CST226SE + registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x06), 1); + if (registerValue == 0xAB) { + type = CST226SE; + logFoundDevice("CST226SE", (uint8_t)addr.address); + } else if (getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x0e), 1) == 0x5a) { type = MLX90614; logFoundDevice("MLX90614", (uint8_t)addr.address); } else { diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index dc9806156..e8c2e4b88 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -324,7 +324,7 @@ static int8_t prevFrame = -1; // Combined dynamic node list frame cycling through LastHeard, HopSignal, and Distance modes // Uses a single frame and changes data every few seconds (E-Ink variant is separate) -#if defined(ESP_PLATFORM) && defined(USE_ST7789) +#if defined(ESP_PLATFORM) && (defined(USE_ST7789) || defined(USE_ST7796)) SPIClass SPI1(HSPI); #endif @@ -356,7 +356,18 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O #else dispdev = new ST7789Spi(&SPI1, ST7789_RESET, ST7789_RS, ST7789_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); #endif +#elif defined(USE_ST7796) +#ifdef ESP_PLATFORM + dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT, ST7796_SDA, + ST7796_MISO, ST7796_SCK, TFT_SPI_FREQUENCY); +#else + dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); +#endif +#if defined(USE_ST7789) static_cast(dispdev)->setRGB(TFT_MESH); +#elif defined(USE_ST7796) + static_cast(dispdev)->setRGB(TFT_MESH); +#endif #elif defined(USE_SSD1306) dispdev = new SSD1306Wire(address.address, -1, -1, geometry, (address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE); @@ -474,6 +485,15 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) pinMode(VTFT_LEDA, OUTPUT); digitalWrite(VTFT_LEDA, TFT_BACKLIGHT_ON); #endif +#endif +#ifdef USE_ST7796 + ui->init(); +#ifdef ESP_PLATFORM + analogWrite(VTFT_LEDA, BRIGHTNESS_DEFAULT); +#else + pinMode(VTFT_LEDA, OUTPUT); + digitalWrite(VTFT_LEDA, TFT_BACKLIGHT_ON); +#endif #endif enabled = true; setInterval(0); // Draw ASAP @@ -512,6 +532,21 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver) nrf_gpio_cfg_default(ST7789_NSS); #endif #endif +#ifdef USE_ST7796 + SPI1.end(); +#if defined(ARCH_ESP32) + pinMode(VTFT_LEDA, OUTPUT); + digitalWrite(VTFT_LEDA, LOW); + pinMode(ST7796_RESET, ANALOG); + pinMode(ST7796_RS, ANALOG); + pinMode(ST7796_NSS, ANALOG); +#else + nrf_gpio_cfg_default(VTFT_LEDA); + nrf_gpio_cfg_default(ST7796_RESET); + nrf_gpio_cfg_default(ST7796_RS); + nrf_gpio_cfg_default(ST7796_NSS); +#endif +#endif #ifdef T_WATCH_S3 PMU->disablePowerOutput(XPOWERS_ALDO2); @@ -557,6 +592,10 @@ void Screen::setup() #if defined(MUZI_BASE) dispdev->delayPoweron = true; #endif +#if defined(USE_ST7796) && defined(TFT_MESH) + // Custom text color, if defined in variant.h + static_cast(dispdev)->setRGB(TFT_MESH); +#endif // === Initialize display and UI system === ui->init(); @@ -620,6 +659,8 @@ void Screen::setup() static_cast(dispdev)->flipScreenVertically(); #elif defined(USE_ST7789) static_cast(dispdev)->flipScreenVertically(); +#elif defined(USE_ST7796) + static_cast(dispdev)->mirrorScreen(); #elif !defined(M5STACK_UNITC6L) dispdev->flipScreenVertically(); #endif @@ -652,7 +693,7 @@ void Screen::setup() touchScreenImpl1->init(); } } -#elif HAS_TOUCHSCREEN && !defined(USE_EINK) +#elif HAS_TOUCHSCREEN && !defined(USE_EINK) && !HAS_CST226SE touchScreenImpl1 = new TouchScreenImpl1(dispdev->getWidth(), dispdev->getHeight(), static_cast(dispdev)->getTouch); touchScreenImpl1->init(); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 375bc2805..a40579ff5 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -83,6 +83,8 @@ class Screen #include #elif defined(USE_SPISSD1306) #include +#elif defined(USE_ST7796) +#include #else // the SH1106/SSD1306 variant is auto-detected #include diff --git a/src/graphics/ScreenFonts.h b/src/graphics/ScreenFonts.h index c497a27b2..bcb4c4987 100644 --- a/src/graphics/ScreenFonts.h +++ b/src/graphics/ScreenFonts.h @@ -73,7 +73,7 @@ #endif #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) // The screen is bigger so use bigger fonts #define FONT_SMALL FONT_MEDIUM_LOCAL // Height: 19 diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 79c1e7e61..6bccb1653 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -97,7 +97,8 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 (storeForwardModule->heartbeatInterval * 1200))) { // no heartbeat, overlap a bit #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ - ARCH_PORTDUINO) && \ + defined(USE_ST7796) || \ + ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL1); @@ -109,7 +110,7 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 #endif } else { #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8, imgSFL1); @@ -125,7 +126,8 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 // TODO: Raspberry Pi supports more than just the one screen size #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ - ARCH_PORTDUINO) && \ + defined(USE_ST7796) || \ + ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL1); diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index c50fe5cf1..3d23acc9f 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -257,7 +257,7 @@ void UIRenderer::drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const mes } #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) if (isHighResolution) { diff --git a/src/graphics/images.h b/src/graphics/images.h index 8670d78d9..998fe8e2a 100644 --- a/src/graphics/images.h +++ b/src/graphics/images.h @@ -27,8 +27,7 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03 0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f}; #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || \ - ARCH_PORTDUINO) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(USE_ST7796) || defined(ST7796_CS) || ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff}; const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f}; diff --git a/src/main.cpp b/src/main.cpp index 8fc2c097b..da2e39604 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -877,7 +877,7 @@ void setup() if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { #if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \ - defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796) || \ defined(USE_SPISSD1306) screen = new graphics::Screen(screen_found, screen_model, screen_geometry); #elif defined(ARCH_PORTDUINO) @@ -1154,7 +1154,7 @@ void setup() // Don't call screen setup until after nodedb is setup (because we need // the current region name) #if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \ - defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796) || \ defined(USE_SPISSD1306) if (screen) screen->setup(); diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index ff76baaa1..4e99a22ef 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -664,7 +664,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) config.bluetooth.fixed_pin = defaultBLEPin; #if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7789_CS) || \ - defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_SPISSD1306) + defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_SPISSD1306) || defined(USE_ST7796) bool hasScreen = true; #ifdef HELTEC_MESH_NODE_T114 uint32_t st7789_id = get_st7789_id(ST7789_NSS, ST7789_SCK, ST7789_SDA, ST7789_RS, ST7789_RESET); diff --git a/src/platform/extra_variants/tbeam_displayshield/variant.cpp b/src/platform/extra_variants/tbeam_displayshield/variant.cpp new file mode 100644 index 000000000..7beac2293 --- /dev/null +++ b/src/platform/extra_variants/tbeam_displayshield/variant.cpp @@ -0,0 +1,43 @@ +#include "configuration.h" + +#ifdef HAS_CST226SE + +#include "TouchDrvCSTXXX.hpp" +#include "input/TouchScreenImpl1.h" +#include + +TouchDrvCSTXXX tsPanel; +static constexpr uint8_t PossibleAddresses[2] = {CST328_ADDR, CST226SE_ADDR_ALT}; +uint8_t i2cAddress = 0; + +bool readTouch(int16_t *x, int16_t *y) +{ + int16_t x_array[1], y_array[1]; + uint8_t touched = tsPanel.getPoint(x_array, y_array, 1); + if (touched > 0) { + *y = x_array[0]; + *x = (TFT_WIDTH - y_array[0]); + // Check bounds + if (*x < 0 || *x >= TFT_WIDTH || *y < 0 || *y >= TFT_HEIGHT) { + return false; + } + return true; // Valid touch detected + } + return false; // No valid touch data +} + +void lateInitVariant() +{ + tsPanel.setTouchDrvModel(TouchDrv_CST226); + for (uint8_t addr : PossibleAddresses) { + if (tsPanel.begin(Wire, addr, I2C_SDA, I2C_SCL)) { + i2cAddress = addr; + LOG_DEBUG("CST226SE init OK at address 0x%02X", addr); + touchScreenImpl1 = new TouchScreenImpl1(TFT_WIDTH, TFT_HEIGHT, readTouch); + touchScreenImpl1->init(); + return; + } + } + LOG_ERROR("CST226SE init failed at all known addresses"); +} +#endif diff --git a/variants/esp32/tbeam/platformio.ini b/variants/esp32/tbeam/platformio.ini index e53f22d30..c635081ff 100644 --- a/variants/esp32/tbeam/platformio.ini +++ b/variants/esp32/tbeam/platformio.ini @@ -4,12 +4,22 @@ extends = esp32_base board = ttgo-t-beam board_level = pr board_check = true -lib_deps = - ${esp32_base.lib_deps} -build_flags = - ${esp32_base.build_flags} +lib_deps = ${esp32_base.lib_deps} +build_flags = ${esp32_base.build_flags} -D TBEAM_V10 -I variants/esp32/tbeam -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue upload_speed = 921600 + +[env:tbeam-displayshield] +extends = env:tbeam + +build_flags = + ${env:tbeam.build_flags} + -D USE_ST7796 + +lib_deps = + ${env:tbeam.lib_deps} + https://github.com/meshtastic/st7796/archive/refs/tags/1.0.5.zip ; display addon + lewisxhe/SensorLib@0.3.1 ; touchscreen addon \ No newline at end of file diff --git a/variants/esp32/tbeam/variant.h b/variants/esp32/tbeam/variant.h index 5b521a2de..2d144a888 100644 --- a/variants/esp32/tbeam/variant.h +++ b/variants/esp32/tbeam/variant.h @@ -42,4 +42,35 @@ #define GPS_UBLOX #define GPS_RX_PIN 34 #define GPS_TX_PIN 12 -// #define GPS_DEBUG \ No newline at end of file +// #define GPS_DEBUG + +// Used when the display shield is chosen +#ifdef USE_ST7796 + +#undef EXT_NOTIFY_OUT +#undef LED_STATE_ON +#undef LED_PIN + +#define HAS_CST226SE 1 +#define HAS_TOUCHSCREEN 1 +// #define TOUCH_IRQ 35 // broken in this version of the lib 0.3.1 +#ifndef TOUCH_IRQ +#define TOUCH_IRQ -1 +#endif +#define CANNED_MESSAGE_MODULE_ENABLE 1 +#define USE_VIRTUAL_KEYBOARD 1 + +#define ST7796_NSS 25 +#define ST7796_RS 13 // DC +#define ST7796_SDA 14 // MOSI +#define ST7796_SCK 15 +#define ST7796_RESET 2 +#define ST7796_MISO -1 +#define ST7796_BUSY -1 +#define VTFT_LEDA 4 +#define TFT_SPI_FREQUENCY 60000000 +#define TFT_HEIGHT 222 +#define TFT_WIDTH 480 +#define BRIGHTNESS_DEFAULT 100 // Medium Low Brightness +#define SCREEN_TRANSITION_FRAMERATE 5 // fps +#endif \ No newline at end of file From a6cdf2c50b5b98bc62b92622dceaffae95064c26 Mon Sep 17 00:00:00 2001 From: Jason P Date: Thu, 27 Nov 2025 07:03:25 -0600 Subject: [PATCH 190/286] - Correct vertical alignment for Muzi_Base on On Screen Keyboard (#8774) --- src/graphics/VirtualKeyboard.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/graphics/VirtualKeyboard.cpp b/src/graphics/VirtualKeyboard.cpp index 8062a0338..a332aad9a 100644 --- a/src/graphics/VirtualKeyboard.cpp +++ b/src/graphics/VirtualKeyboard.cpp @@ -506,6 +506,9 @@ void VirtualKeyboard::drawKey(OLEDDisplay *display, const VirtualKey &key, bool centeredTextY -= 1; } } +#ifdef MUZI_BASE // Correct issue with character vertical position on MUZI_BASE + centeredTextY -= 2; +#endif display->drawString(textX, centeredTextY, keyText.c_str()); } From de26dfe46837367addb35bd163363179d62a55f3 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 28 Nov 2025 05:23:07 -0600 Subject: [PATCH 191/286] Remove screen activation in powerExit function (#8779) This seems to be a potential source of unintended screen wakes. --- src/PowerFSM.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 322b877ff..b4906cd60 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -219,8 +219,6 @@ static void powerIdle() static void powerExit() { - if (screen) - screen->setOn(true); setBluetoothEnable(true); } From a59723030a7e15ab53b6fd1cb264ba2eebd4ed46 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 05:25:47 -0600 Subject: [PATCH 192/286] Upgrade trunk (#8781) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index ccb426745..16bae762e 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,8 +9,8 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.24.1 - - prettier@3.6.2 + - renovate@42.26.3 + - prettier@3.7.1 - trufflehog@3.91.1 - yamllint@1.37.1 - bandit@1.9.2 From 2f0fe4e5da61e86c7833e9fa0c23a81a5d799452 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 28 Nov 2025 16:42:14 -0600 Subject: [PATCH 193/286] Use the dedicated isVbusIn() function for detecting USB plug --- src/Power.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Power.cpp b/src/Power.cpp index a2c559d91..7bb8896ce 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -1453,7 +1453,7 @@ class LipoCharger : public HasBatteryLevel /** * return true if there is an external power source detected */ - virtual bool isVbusIn() override { return PPM->getVbusVoltage() > 0; } + virtual bool isVbusIn() override { return PPM->isVbusIn(); } /** * return true if the battery is currently charging From 94db3506bdd23b39c0cbf72acad43948893f2ec8 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 28 Nov 2025 19:58:52 -0600 Subject: [PATCH 194/286] Add LOG_POWERFSM and LOG_INPUT debug macros (#8791) --- src/PowerFSM.cpp | 30 ++++++++++++++-------------- src/PowerFSM.h | 6 ++++++ src/graphics/Screen.cpp | 1 + src/input/InputBroker.h | 6 ++++++ src/modules/SystemCommandsModule.cpp | 3 ++- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index b4906cd60..67b680233 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -57,21 +57,21 @@ static bool isPowered() static void sdsEnter() { - LOG_DEBUG("State: SDS"); + LOG_POWERFSM("State: SDS"); // FIXME - make sure GPS and LORA radio are off first - because we want close to zero current draw doDeepSleep(Default::getConfiguredOrDefaultMs(config.power.sds_secs), false, false); } static void lowBattSDSEnter() { - LOG_DEBUG("State: Lower batt SDS"); + LOG_POWERFSM("State: Lower batt SDS"); doDeepSleep(Default::getConfiguredOrDefaultMs(config.power.sds_secs), false, true); } extern Power *power; static void shutdownEnter() { - LOG_DEBUG("State: SHUTDOWN"); + LOG_POWERFSM("State: SHUTDOWN"); shutdownAtMsec = millis(); } @@ -81,7 +81,7 @@ static uint32_t secsSlept; static void lsEnter() { - LOG_INFO("lsEnter begin, ls_secs=%u", config.power.ls_secs); + LOG_POWERFSM("lsEnter begin, ls_secs=%u", config.power.ls_secs); if (screen) screen->setOn(false); secsSlept = 0; // How long have we been sleeping this time @@ -155,12 +155,12 @@ static void lsIdle() static void lsExit() { - LOG_INFO("Exit state: LS"); + LOG_POWERFSM("State: lsExit"); } static void nbEnter() { - LOG_DEBUG("State: NB"); + LOG_POWERFSM("State: nbEnter"); if (screen) screen->setOn(false); #ifdef ARCH_ESP32 @@ -173,6 +173,7 @@ static void nbEnter() static void darkEnter() { + LOG_POWERFSM("State: darkEnter"); setBluetoothEnable(true); if (screen) screen->setOn(false); @@ -180,7 +181,7 @@ static void darkEnter() static void serialEnter() { - LOG_DEBUG("State: SERIAL"); + LOG_POWERFSM("State: serialEnter"); setBluetoothEnable(false); if (screen) { screen->setOn(true); @@ -189,13 +190,14 @@ static void serialEnter() static void serialExit() { + LOG_POWERFSM("State: serialExit"); // Turn bluetooth back on when we leave serial stream API setBluetoothEnable(true); } static void powerEnter() { - // LOG_DEBUG("State: POWER"); + LOG_POWERFSM("State: powerEnter"); if (!isPowered()) { // If we got here, we are in the wrong state - we should be in powered, let that state handle things LOG_INFO("Loss of power in Powered"); @@ -210,6 +212,7 @@ static void powerEnter() static void powerIdle() { + // LOG_POWERFSM("State: powerIdle"); // very chatty if (!isPowered()) { // If we got here, we are in the wrong state LOG_INFO("Loss of power in Powered"); @@ -219,12 +222,13 @@ static void powerIdle() static void powerExit() { + LOG_POWERFSM("State: powerExit"); setBluetoothEnable(true); } static void onEnter() { - LOG_DEBUG("State: ON"); + LOG_POWERFSM("State: onEnter"); if (screen) screen->setOn(true); setBluetoothEnable(true); @@ -232,6 +236,7 @@ static void onEnter() static void onIdle() { + LOG_POWERFSM("State: onIdle"); if (isPowered()) { // If we got here, we are in the wrong state - we should be in powered, let that state handle things powerFSM.trigger(EVENT_POWER_CONNECTED); @@ -240,7 +245,7 @@ static void onIdle() static void bootEnter() { - LOG_DEBUG("State: BOOT"); + LOG_POWERFSM("State: bootEnter"); } State stateSHUTDOWN(shutdownEnter, NULL, NULL, "SHUTDOWN"); @@ -317,11 +322,6 @@ void PowerFSM_setup() // if any packet destined for phone arrives, turn on bluetooth at least powerFSM.add_transition(&stateNB, &stateDARK, EVENT_PACKET_FOR_PHONE, NULL, "Packet for phone"); - // Removed 2.7: we don't show the nodes individually for every node on the screen anymore - // powerFSM.add_transition(&stateNB, &stateON, EVENT_NODEDB_UPDATED, NULL, "NodeDB update"); - // powerFSM.add_transition(&stateDARK, &stateON, EVENT_NODEDB_UPDATED, NULL, "NodeDB update"); - // powerFSM.add_transition(&stateON, &stateON, EVENT_NODEDB_UPDATED, NULL, "NodeDB update"); - // Show the received text message powerFSM.add_transition(&stateLS, &stateON, EVENT_RECEIVED_MSG, NULL, "Received text"); powerFSM.add_transition(&stateNB, &stateON, EVENT_RECEIVED_MSG, NULL, "Received text"); diff --git a/src/PowerFSM.h b/src/PowerFSM.h index 6330a5fc6..182ac082a 100644 --- a/src/PowerFSM.h +++ b/src/PowerFSM.h @@ -2,6 +2,12 @@ #include "configuration.h" +#ifdef PowerFSMDebug +#define LOG_POWERFSM(...) LOG_DEBUG(__VA_ARGS__) +#else +#define LOG_POWERFSM(...) +#endif + // See sw-design.md for documentation #define EVENT_PRESS 1 diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index e8c2e4b88..d58927f1e 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1605,6 +1605,7 @@ int Screen::handleUIFrameEvent(const UIFrameEvent *event) int Screen::handleInputEvent(const InputEvent *event) { + LOG_INPUT("Screen Input event %u! kb %u", event->inputEvent, event->kbchar); if (!screenOn) return 0; diff --git a/src/input/InputBroker.h b/src/input/InputBroker.h index 36328ca64..022101f7d 100644 --- a/src/input/InputBroker.h +++ b/src/input/InputBroker.h @@ -3,6 +3,12 @@ #include "Observer.h" #include "freertosinc.h" +#ifdef InputBrokerDebug +#define LOG_INPUT(...) LOG_DEBUG(__VA_ARGS__) +#else +#define LOG_INPUT(...) +#endif + enum input_broker_event { INPUT_BROKER_NONE = 0, INPUT_BROKER_SELECT = 10, diff --git a/src/modules/SystemCommandsModule.cpp b/src/modules/SystemCommandsModule.cpp index dc5d8b41f..7fa4485c8 100644 --- a/src/modules/SystemCommandsModule.cpp +++ b/src/modules/SystemCommandsModule.cpp @@ -1,4 +1,5 @@ #include "SystemCommandsModule.h" +#include "input/InputBroker.h" #include "meshUtils.h" #if HAS_SCREEN #include "graphics/Screen.h" @@ -22,7 +23,7 @@ SystemCommandsModule::SystemCommandsModule() int SystemCommandsModule::handleInputEvent(const InputEvent *event) { - LOG_INFO("Input event %u! kb %u", event->inputEvent, event->kbchar); + LOG_INPUT("SystemCommands Input event %u! kb %u", event->inputEvent, event->kbchar); // System commands (all others fall through) switch (event->kbchar) { // Fn key symbols From 0081cec2073614494fb23d9f9dbb3823bacde9b7 Mon Sep 17 00:00:00 2001 From: Jason P Date: Fri, 28 Nov 2025 20:24:39 -0600 Subject: [PATCH 195/286] Fix ifdef statement after ST7796 merge to resolve screen color issues (#8796) --- src/graphics/Screen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index d58927f1e..0864e5ae1 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -356,13 +356,14 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O #else dispdev = new ST7789Spi(&SPI1, ST7789_RESET, ST7789_RS, ST7789_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); #endif -#elif defined(USE_ST7796) +#if defined(USE_ST7796) #ifdef ESP_PLATFORM dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT, ST7796_SDA, ST7796_MISO, ST7796_SCK, TFT_SPI_FREQUENCY); #else dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); #endif +#endif #if defined(USE_ST7789) static_cast(dispdev)->setRGB(TFT_MESH); #elif defined(USE_ST7796) From bcd4a1176aa1ec3b67296837134466cb87bce868 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 06:10:08 -0600 Subject: [PATCH 196/286] Update dorny/test-reporter action to v2.3.0 (#8809) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/test_native.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index a2328022e..decd23954 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -143,7 +143,7 @@ jobs: merge-multiple: true - name: Test Report - uses: dorny/test-reporter@v2.2.0 + uses: dorny/test-reporter@v2.3.0 with: name: PlatformIO Tests path: testreport.xml From 5a595a3ae7304a34f9dbe70824d1971317f03485 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 30 Nov 2025 08:45:24 -0500 Subject: [PATCH 197/286] Replace assert in UTF8 decoder to prevent unexpected reboot (#8807) --- src/graphics/niche/InkHUD/AppletFont.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphics/niche/InkHUD/AppletFont.cpp b/src/graphics/niche/InkHUD/AppletFont.cpp index db7097f3f..6c7a7b491 100644 --- a/src/graphics/niche/InkHUD/AppletFont.cpp +++ b/src/graphics/niche/InkHUD/AppletFont.cpp @@ -124,7 +124,7 @@ uint32_t InkHUD::AppletFont::toUtf32(std::string utf8) utf32 |= (utf8.at(3) & 0b00111111); break; default: - assert(false); + return 0; } return utf32; From 1abf8ddb306c498727030be54ac2db2e7e10e9fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 13:28:58 -0600 Subject: [PATCH 198/286] Update meshtastic/device-ui digest to 3bf3322 (#8814) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 1363a63fc..5b9d965ef 100644 --- a/platformio.ini +++ b/platformio.ini @@ -121,7 +121,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/28167c67dfd13015a0b5eef1828f95fe8e3ab7c3.zip + https://github.com/meshtastic/device-ui/archive/3bf332240416c5cb8c919fac2a0ec7260eb3be75.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From 5ef3ff7116ea6a1de837dcfb577577e9a32375b6 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 30 Nov 2025 15:33:29 -0600 Subject: [PATCH 199/286] rework screen.cpp ifdefs (#8816) --- src/graphics/Screen.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 0864e5ae1..aed73deb0 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -356,19 +356,13 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O #else dispdev = new ST7789Spi(&SPI1, ST7789_RESET, ST7789_RS, ST7789_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); #endif -#if defined(USE_ST7796) +#elif defined(USE_ST7796) #ifdef ESP_PLATFORM dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT, ST7796_SDA, ST7796_MISO, ST7796_SCK, TFT_SPI_FREQUENCY); #else dispdev = new ST7796Spi(&SPI1, ST7796_RESET, ST7796_RS, ST7796_NSS, GEOMETRY_RAWMODE, TFT_WIDTH, TFT_HEIGHT); #endif -#endif -#if defined(USE_ST7789) - static_cast(dispdev)->setRGB(TFT_MESH); -#elif defined(USE_ST7796) - static_cast(dispdev)->setRGB(TFT_MESH); -#endif #elif defined(USE_SSD1306) dispdev = new SSD1306Wire(address.address, -1, -1, geometry, (address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE); @@ -411,6 +405,12 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O isAUTOOled = true; #endif +#if defined(USE_ST7789) + static_cast(dispdev)->setRGB(TFT_MESH); +#elif defined(USE_ST7796) + static_cast(dispdev)->setRGB(TFT_MESH); +#endif + ui = new OLEDDisplayUi(dispdev); cmdQueue.setReader(this); } From 430d55e5e8eaf19a99d8101a38a1d243bb5a5e3f Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 30 Nov 2025 17:17:00 -0600 Subject: [PATCH 200/286] Add WiFi Toggle to System frame to re-enable (#8802) Co-authored-by: Jonathan Bennett --- src/graphics/draw/MenuHandler.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index bd647c3d8..e17c7c3d8 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -576,7 +576,7 @@ void menuHandler::textMessageBaseMenu() void menuHandler::systemBaseMenu() { - enum optionsNumbers { Back, Notifications, ScreenOptions, Bluetooth, PowerMenu, Test, enumEnd }; + enum optionsNumbers { Back, Notifications, ScreenOptions, Bluetooth, WiFiToggle, PowerMenu, Test, enumEnd }; static const char *optionsArray[enumEnd] = {"Back"}; static int optionsEnumArray[enumEnd] = {Back}; int options = 1; @@ -592,6 +592,10 @@ void menuHandler::systemBaseMenu() optionsArray[options] = "Bluetooth Toggle"; #endif optionsEnumArray[options++] = Bluetooth; +#if HAS_WIFI && !defined(ARCH_PORTDUINO) + optionsArray[options] = "WiFi Toggle"; + optionsEnumArray[options++] = WiFiToggle; +#endif #if defined(M5STACK_UNITC6L) optionsArray[options] = "Power"; #else @@ -629,6 +633,11 @@ void menuHandler::systemBaseMenu() } else if (selected == Bluetooth) { menuQueue = bluetooth_toggle_menu; screen->runNow(); +#if HAS_WIFI && !defined(ARCH_PORTDUINO) + } else if (selected == WiFiToggle) { + menuQueue = wifi_toggle_menu; + screen->runNow(); +#endif } else if (selected == Back && !test_enabled) { test_count++; if (test_count > 4) { @@ -1278,19 +1287,28 @@ void menuHandler::wifiBaseMenu() void menuHandler::wifiToggleMenu() { - enum optionsNumbers { Back, Wifi_toggle }; + enum optionsNumbers { Back, Wifi_disable, Wifi_enable }; - static const char *optionsArray[] = {"Back", "Disable"}; + static const char *optionsArray[] = {"Back", "WiFi Disabled", "WiFi Enabled"}; BannerOverlayOptions bannerOptions; - bannerOptions.message = "Disable Wifi and\nEnable Bluetooth?"; + bannerOptions.message = "WiFi Actions"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 2; + bannerOptions.optionsCount = 3; + if (config.network.wifi_enabled == true) + bannerOptions.InitialSelected = 2; + else + bannerOptions.InitialSelected = 1; bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Wifi_toggle) { + if (selected == Wifi_disable) { config.network.wifi_enabled = false; config.bluetooth.enabled = true; service->reloadConfig(SEGMENT_CONFIG); rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + } else if (selected == Wifi_enable) { + config.network.wifi_enabled = true; + config.bluetooth.enabled = false; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); } }; screen->showOverlayBanner(bannerOptions); From 8899487c2f2b29d484c98012d8fa9ea8013e637c Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 30 Nov 2025 17:18:03 -0600 Subject: [PATCH 201/286] Modify power saving condition for WiFi (#8815) Update preprocessor directive to require both HAS_WIFI and MESHTASTIC_EXCLUDE_WIFI conditions. --- src/PowerFSM.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index 67b680233..9f8097b84 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -370,7 +370,7 @@ void PowerFSM_setup() // Don't add power saving transitions if we are a power saving tracker or sensor or have Wifi enabled. Sleep will be initiated // through the modules -#if HAS_WIFI || !defined(MESHTASTIC_EXCLUDE_WIFI) +#if HAS_WIFI && !defined(MESHTASTIC_EXCLUDE_WIFI) bool isTrackerOrSensor = config.device.role == meshtastic_Config_DeviceConfig_Role_TRACKER || config.device.role == meshtastic_Config_DeviceConfig_Role_TAK_TRACKER || config.device.role == meshtastic_Config_DeviceConfig_Role_SENSOR; From 5b1b420cad41559121fd06c49edd673e1dc7c98a Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Sun, 30 Nov 2025 17:21:10 -0600 Subject: [PATCH 202/286] Add initial support for Hackaday Communicator (#8771) * Add initial support for Hackaday Communicator * Fork it! * Trunk * Remove unused elements from the HackadayCommunicatorKeyboard * Don't divide by zero. --- boards/hackaday-communicator.json | 41 ++++ src/graphics/Screen.cpp | 4 +- src/graphics/ScreenFonts.h | 3 +- src/graphics/TFTDisplay.cpp | 44 +++- src/graphics/draw/DebugRenderer.cpp | 9 +- src/graphics/draw/MenuHandler.cpp | 8 +- src/graphics/draw/UIRenderer.cpp | 3 +- src/graphics/images.h | 3 +- src/input/HackadayCommunicatorKeyboard.cpp | 217 ++++++++++++++++++ src/input/HackadayCommunicatorKeyboard.h | 26 +++ src/input/kbI2cBase.cpp | 6 +- src/main.cpp | 11 +- src/mesh/NodeDB.cpp | 3 +- src/platform/esp32/architecture.h | 4 +- .../hackaday-communicator/pins_arduino.h | 59 +++++ .../hackaday-communicator/platformio.ini | 15 ++ .../esp32s3/hackaday-communicator/variant.h | 60 +++++ 17 files changed, 486 insertions(+), 30 deletions(-) create mode 100644 boards/hackaday-communicator.json create mode 100644 src/input/HackadayCommunicatorKeyboard.cpp create mode 100644 src/input/HackadayCommunicatorKeyboard.h create mode 100644 variants/esp32s3/hackaday-communicator/pins_arduino.h create mode 100644 variants/esp32s3/hackaday-communicator/platformio.ini create mode 100644 variants/esp32s3/hackaday-communicator/variant.h diff --git a/boards/hackaday-communicator.json b/boards/hackaday-communicator.json new file mode 100644 index 000000000..6e6c1ad2d --- /dev/null +++ b/boards/hackaday-communicator.json @@ -0,0 +1,41 @@ +{ + "build": { + "arduino": { + "ldscript": "esp32s3_out.ld", + "memory_type": "qio_opi" + }, + "core": "esp32", + "extra_flags": [ + "-DBOARD_HAS_PSRAM", + "-DARDUINO_USB_CDC_ON_BOOT=1", + "-DARDUINO_USB_MODE=0", + "-DARDUINO_RUNNING_CORE=1", + "-DARDUINO_EVENT_RUNNING_CORE=1" + ], + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [["0x303A", "0x1001"]], + "mcu": "esp32s3", + "variant": "hackaday-communicator" + }, + "connectivity": ["wifi", "bluetooth", "lora"], + "debug": { + "default_tool": "esp-builtin", + "onboard_tools": ["esp-builtin"], + "openocd_target": "esp32s3.cfg" + }, + "frameworks": ["arduino", "espidf"], + "name": "hackaday-communicator (16 MB FLASH, 8 MB PSRAM)", + "upload": { + "flash_size": "16MB", + "maximum_ram_size": 327680, + "maximum_size": 16777216, + "use_1200bps_touch": true, + "wait_for_upload_port": true, + "require_upload_port": true, + "speed": 1500000 + }, + "url": "hackaday.com", + "vendor": "hackaday" +} diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index aed73deb0..351419289 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -375,7 +375,7 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O LOG_INFO("SSD1306 init success"); } #elif defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || \ - defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) + defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(HACKADAY_COMMUNICATOR) dispdev = new TFTDisplay(address.address, -1, -1, geometry, (address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE); #elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY) @@ -656,7 +656,7 @@ void Screen::setup() #else if (!config.display.flip_screen) { #if defined(ST7701_CS) || defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7789_CS) || \ - defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) + defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(HACKADAY_COMMUNICATOR) static_cast(dispdev)->flipScreenVertically(); #elif defined(USE_ST7789) static_cast(dispdev)->flipScreenVertically(); diff --git a/src/graphics/ScreenFonts.h b/src/graphics/ScreenFonts.h index bcb4c4987..d54fc9958 100644 --- a/src/graphics/ScreenFonts.h +++ b/src/graphics/ScreenFonts.h @@ -73,7 +73,8 @@ #endif #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) // The screen is bigger so use bigger fonts #define FONT_SMALL FONT_MEDIUM_LOCAL // Height: 19 diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 87593b0d4..4445a7c5e 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -123,6 +123,11 @@ static void rak14014_tpIntHandle(void) _rak14014_touch_int = true; } +#elif defined(HACKADAY_COMMUNICATOR) +#include +Arduino_DataBus *bus = nullptr; +Arduino_GFX *tft = nullptr; + #elif defined(ST72xx_DE) #include #include @@ -1135,7 +1140,7 @@ static LGFX *tft = nullptr; #if defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || defined(ST7796_CS) || defined(ILI9341_DRIVER) || \ defined(ILI9342_DRIVER) || defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST72xx_DE) || \ - (ARCH_PORTDUINO && HAS_SCREEN != 0) + (ARCH_PORTDUINO && HAS_SCREEN != 0) || defined(HACKADAY_COMMUNICATOR) #include "SPILock.h" #include "TFTDisplay.h" #include @@ -1271,12 +1276,15 @@ void TFTDisplay::display(bool fromBlank) x_LastPixelUpdate = x; } } - +#if defined(HACKADAY_COMMUNICATOR) + tft->draw16bitBeRGBBitmap(x_FirstPixelUpdate, y, &linePixelBuffer[x_FirstPixelUpdate], + (x_LastPixelUpdate - x_FirstPixelUpdate + 1), 1); +#else // Step 4: Send the changed pixels on this line to the screen as a single block transfer. // This function accepts pixel data MSB first so it can dump the memory straight out the SPI port. tft->pushRect(x_FirstPixelUpdate, y, (x_LastPixelUpdate - x_FirstPixelUpdate + 1), 1, &linePixelBuffer[x_FirstPixelUpdate]); - +#endif somethingChanged = true; } y++; @@ -1340,6 +1348,8 @@ void TFTDisplay::sendCommand(uint8_t com) display(true); if (portduino_config.displayBacklight.pin > 0) digitalWrite(portduino_config.displayBacklight.pin, TFT_BACKLIGHT_ON); +#elif defined(HACKADAY_COMMUNICATOR) + tft->displayOn(); #elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE) tft->wakeup(); tft->powerSaveOff(); @@ -1352,7 +1362,8 @@ void TFTDisplay::sendCommand(uint8_t com) unphone.backlight(true); // using unPhone library #endif #ifdef RAK14014 -#elif !defined(M5STACK) && !defined(ST7789_CS) // T-Deck gets brightness set in Screen.cpp in the handleSetOn function +#elif !defined(M5STACK) && !defined(ST7789_CS) && \ + !defined(HACKADAY_COMMUNICATOR) // T-Deck gets brightness set in Screen.cpp in the handleSetOn function tft->setBrightness(172); #endif break; @@ -1364,6 +1375,8 @@ void TFTDisplay::sendCommand(uint8_t com) tft->clear(); if (portduino_config.displayBacklight.pin > 0) digitalWrite(portduino_config.displayBacklight.pin, !TFT_BACKLIGHT_ON); +#elif defined(HACKADAY_COMMUNICATOR) + tft->displayOff(); #elif !defined(RAK14014) && !defined(M5STACK) && !defined(UNPHONE) tft->sleep(); tft->powerSaveOn(); @@ -1376,7 +1389,7 @@ void TFTDisplay::sendCommand(uint8_t com) unphone.backlight(false); // using unPhone library #endif #ifdef RAK14014 -#elif !defined(M5STACK) +#elif !defined(M5STACK) && !defined(HACKADAY_COMMUNICATOR) tft->setBrightness(0); #endif break; @@ -1392,7 +1405,7 @@ void TFTDisplay::setDisplayBrightness(uint8_t _brightness) { #ifdef RAK14014 // todo -#else +#elif !defined(HACKADAY_COMMUNICATOR) tft->setBrightness(_brightness); LOG_DEBUG("Brightness is set to value: %i ", _brightness); #endif @@ -1410,7 +1423,7 @@ bool TFTDisplay::hasTouch(void) { #ifdef RAK14014 return true; -#elif !defined(M5STACK) +#elif !defined(M5STACK) && !defined(HACKADAY_COMMUNICATOR) return tft->touch() != nullptr; #else return false; @@ -1429,7 +1442,7 @@ bool TFTDisplay::getTouch(int16_t *x, int16_t *y) } else { return false; } -#elif !defined(M5STACK) +#elif !defined(M5STACK) && !defined(HACKADAY_COMMUNICATOR) return tft->getTouch(x, y); #else return false; @@ -1448,6 +1461,12 @@ bool TFTDisplay::connect() LOG_INFO("Do TFT init"); #ifdef RAK14014 tft = new TFT_eSPI; +#elif defined(HACKADAY_COMMUNICATOR) + bus = new Arduino_ESP32SPI(TFT_DC, TFT_CS, 38 /* SCK */, 21 /* MOSI */, GFX_NOT_DEFINED /* MISO */, HSPI /* spi_num */); + tft = new Arduino_NV3007(bus, 40, 0 /* rotation */, false /* IPS */, 142 /* width */, 428 /* height */, 12 /* col offset 1 */, + 0 /* row offset 1 */, 14 /* col offset 2 */, 0 /* row offset 2 */, nv3007_279_init_operations, + sizeof(nv3007_279_init_operations)); + #else tft = new LGFX; #endif @@ -1458,8 +1477,15 @@ bool TFTDisplay::connect() #ifdef UNPHONE unphone.backlight(true); // using unPhone library #endif - +#ifdef HACKADAY_COMMUNICATOR + bool beginStatus = tft->begin(); + if (beginStatus) + LOG_DEBUG("TFT Success!"); + else + LOG_ERROR("TFT Fail!"); +#else tft->init(); +#endif #if defined(M5STACK) tft->setRotation(0); diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 6bccb1653..1b3a148d6 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -97,8 +97,7 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 (storeForwardModule->heartbeatInterval * 1200))) { // no heartbeat, overlap a bit #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ - defined(USE_ST7796) || \ - ARCH_PORTDUINO) && \ + defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796) || ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgQuestionL1); @@ -110,7 +109,8 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 #endif } else { #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ + defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8, imgSFL1); @@ -126,8 +126,7 @@ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16 // TODO: Raspberry Pi supports more than just the one screen size #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ - defined(USE_ST7796) || \ - ARCH_PORTDUINO) && \ + defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796) || ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(screen->ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8, imgInfoL1); diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index e17c7c3d8..bfe3656ce 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1047,7 +1047,8 @@ void menuHandler::TFTColorPickerMenu(OLEDDisplay *display) bannerOptions.optionsArrayPtr = optionsArray; bannerOptions.optionsCount = 10; bannerOptions.bannerCallback = [display](int selected) -> void { -#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || defined(T_LORA_PAGER) || HAS_TFT +#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || defined(T_LORA_PAGER) || \ + HAS_TFT || defined(HACKADAY_COMMUNICATOR) uint8_t TFT_MESH_r = 0; uint8_t TFT_MESH_g = 0; uint8_t TFT_MESH_b = 0; @@ -1356,7 +1357,7 @@ void menuHandler::screenOptionsMenu() static int optionsEnumArray[5] = {Back}; int options = 1; -#if defined(T_DECK) || defined(T_LORA_PAGER) +#if defined(T_DECK) || defined(T_LORA_PAGER) || defined(HACKADAY_COMMUNICATOR) optionsArray[options] = "Show Long/Short Name"; optionsEnumArray[options++] = NodeNameLength; #endif @@ -1368,7 +1369,8 @@ void menuHandler::screenOptionsMenu() } // Only show screen color for TFT displays -#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || defined(T_LORA_PAGER) || HAS_TFT +#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || defined(T_LORA_PAGER) || \ + HAS_TFT || defined(HACKADAY_COMMUNICATOR) optionsArray[options] = "Screen Color"; optionsEnumArray[options++] = ScreenColor; #endif diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp index 3d23acc9f..1f01640bf 100644 --- a/src/graphics/draw/UIRenderer.cpp +++ b/src/graphics/draw/UIRenderer.cpp @@ -257,7 +257,8 @@ void UIRenderer::drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const mes } #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || defined(USE_ST7796)) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(HX8357_CS) || defined(ST7796_CS) || \ + defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796)) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) if (isHighResolution) { diff --git a/src/graphics/images.h b/src/graphics/images.h index 998fe8e2a..c268b3269 100644 --- a/src/graphics/images.h +++ b/src/graphics/images.h @@ -27,7 +27,8 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03 0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f}; #if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \ - defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(USE_ST7796) || defined(ST7796_CS) || ARCH_PORTDUINO) && \ + defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(USE_ST7796) || defined(HACKADAY_COMMUNICATOR) || ARCH_PORTDUINO) && \ !defined(DISPLAY_FORCE_SMALL_FONTS) const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff}; const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f}; diff --git a/src/input/HackadayCommunicatorKeyboard.cpp b/src/input/HackadayCommunicatorKeyboard.cpp new file mode 100644 index 000000000..87c8a24ae --- /dev/null +++ b/src/input/HackadayCommunicatorKeyboard.cpp @@ -0,0 +1,217 @@ +#if defined(HACKADAY_COMMUNICATOR) + +#include "HackadayCommunicatorKeyboard.h" +#include "main.h" + +#define _TCA8418_COLS 10 +#define _TCA8418_ROWS 8 +#define _TCA8418_NUM_KEYS 80 + +#define _TCA8418_MULTI_TAP_THRESHOLD 1500 + +using Key = TCA8418KeyboardBase::TCA8418Key; + +constexpr uint8_t modifierRightShiftKey = 30; +constexpr uint8_t modifierRightShift = 0b0001; +constexpr uint8_t modifierLeftShiftKey = 76; // keynum -1 +constexpr uint8_t modifierLeftShift = 0b0001; +// constexpr uint8_t modifierSymKey = 42; +// constexpr uint8_t modifierSym = 0b0010; + +// Num chars per key, Modulus for rotating through characters +static uint8_t HackadayCommunicatorTapMod[_TCA8418_NUM_KEYS] = { + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 0, 0, 0, 2, 1, 2, 2, 0, 1, 1, 0, +}; + +static unsigned char HackadayCommunicatorTapMap[_TCA8418_NUM_KEYS][2] = {{}, + {}, + {'+'}, + {'9'}, + {'8'}, + {'7'}, + {'2'}, + {'3'}, + {'4'}, + {'5'}, + {Key::ESC}, + {'q', 'Q'}, + {'w', 'W'}, + {'e', 'E'}, + {'r', 'R'}, + {'t', 'T'}, + {'y', 'Y'}, + {'u', 'U'}, + {'i', 'I'}, + {'o', 'O'}, + {Key::TAB}, + {'a', 'A'}, + {'s', 'S'}, + {'d', 'D'}, + {'f', 'F'}, + {'g', 'G'}, + {'h', 'H'}, + {'j', 'J'}, + {'k', 'K'}, + {'l', 'L'}, + {}, + {'z', 'Z'}, + {'x', 'X'}, + {'c', 'C'}, + {'v', 'V'}, + {'b', 'B'}, + {'n', 'N'}, + {'m', 'M'}, + {',', '<'}, + {'.', '>'}, + {}, + {}, + {}, + {'\\'}, + {' '}, + {}, + {Key::RIGHT}, + {Key::DOWN}, + {Key::LEFT}, + {}, + {}, + {}, + {'-'}, + {'6', '^'}, + {'5', '%'}, + {'4', '$'}, + {'[', '{'}, + {']', '}'}, + {'p', 'P'}, + {}, + {}, + {}, + {'*'}, + {'3', '#'}, + {'2', '@'}, + {'1', '!'}, + {Key::SELECT}, + {'\'', '"'}, + {';', ':'}, + {}, + {}, + {}, + {'/', '?'}, + {'='}, + {'.', '>'}, + {'0', ')'}, + {}, + {Key::UP}, + {Key::BSP}, + {}}; + +HackadayCommunicatorKeyboard::HackadayCommunicatorKeyboard() + : TCA8418KeyboardBase(_TCA8418_ROWS, _TCA8418_COLS), modifierFlag(0), last_modifier_time(0), last_key(-1), next_key(-1), + last_tap(0L), char_idx(0), tap_interval(0) +{ + reset(); +} + +void HackadayCommunicatorKeyboard::reset(void) +{ + TCA8418KeyboardBase::reset(); + enableInterrupts(); +} + +// handle multi-key presses (shift and alt) +void HackadayCommunicatorKeyboard::trigger() +{ + uint8_t count = keyCount(); + if (count == 0) + return; + for (uint8_t i = 0; i < count; ++i) { + uint8_t k = readRegister(TCA8418_REG_KEY_EVENT_A + i); + uint8_t key = k & 0x7F; + if (k & 0x80) { + pressed(key); + } else { + released(); + state = Idle; + } + } +} + +void HackadayCommunicatorKeyboard::pressed(uint8_t key) +{ + if (state == Init || state == Busy) { + return; + } + + if (modifierFlag && (millis() - last_modifier_time > _TCA8418_MULTI_TAP_THRESHOLD)) { + modifierFlag = 0; + } + + uint8_t next_key = 0; + int row = (key - 1) / 10; + int col = (key - 1) % 10; + if (row >= _TCA8418_ROWS || col >= _TCA8418_COLS) { + return; // Invalid key + } + + next_key = row * _TCA8418_COLS + col; + state = Held; + + uint32_t now = millis(); + tap_interval = now - last_tap; + + updateModifierFlag(next_key); + if (isModifierKey(next_key)) { + last_modifier_time = now; + } + + if (tap_interval < 0) { + last_tap = 0; + state = Busy; + return; + } + + if (next_key != last_key || tap_interval > _TCA8418_MULTI_TAP_THRESHOLD) { + char_idx = 0; + } else { + char_idx += 1; + } + + last_key = next_key; + last_tap = now; +} + +void HackadayCommunicatorKeyboard::released() +{ + if (state != Held) { + return; + } + + if (last_key < 0 || last_key >= _TCA8418_NUM_KEYS) { + last_key = -1; + state = Idle; + return; + } + + uint32_t now = millis(); + last_tap = now; + if (HackadayCommunicatorTapMod[last_key]) + queueEvent(HackadayCommunicatorTapMap[last_key][modifierFlag % HackadayCommunicatorTapMod[last_key]]); + if (isModifierKey(last_key) == false) + modifierFlag = 0; +} + +void HackadayCommunicatorKeyboard::updateModifierFlag(uint8_t key) +{ + if (key == modifierRightShiftKey) { + modifierFlag ^= modifierRightShift; + } else if (key == modifierLeftShiftKey) { + modifierFlag ^= modifierLeftShift; + } +} + +bool HackadayCommunicatorKeyboard::isModifierKey(uint8_t key) +{ + return (key == modifierRightShiftKey || key == modifierLeftShiftKey); +} + +#endif \ No newline at end of file diff --git a/src/input/HackadayCommunicatorKeyboard.h b/src/input/HackadayCommunicatorKeyboard.h new file mode 100644 index 000000000..8316bed72 --- /dev/null +++ b/src/input/HackadayCommunicatorKeyboard.h @@ -0,0 +1,26 @@ +#include "TCA8418KeyboardBase.h" + +class HackadayCommunicatorKeyboard : public TCA8418KeyboardBase +{ + public: + HackadayCommunicatorKeyboard(); + void reset(void); + void trigger(void) override; + virtual ~HackadayCommunicatorKeyboard() {} + + protected: + void pressed(uint8_t key) override; + void released(void) override; + + void updateModifierFlag(uint8_t key); + bool isModifierKey(uint8_t key); + + private: + uint8_t modifierFlag; // Flag to indicate if a modifier key is pressed + uint32_t last_modifier_time; // Timestamp of the last modifier key press + int8_t last_key; + int8_t next_key; + uint32_t last_tap; + uint8_t char_idx; + int32_t tap_interval; +}; diff --git a/src/input/kbI2cBase.cpp b/src/input/kbI2cBase.cpp index 0ed2df116..0085c806b 100644 --- a/src/input/kbI2cBase.cpp +++ b/src/input/kbI2cBase.cpp @@ -7,6 +7,8 @@ #include "TDeckProKeyboard.h" #elif defined(T_LORA_PAGER) #include "TLoraPagerKeyboard.h" +#elif defined(HACKADAY_COMMUNICATOR) +#include "HackadayCommunicatorKeyboard.h" #else #include "TCA8418Keyboard.h" #endif @@ -20,6 +22,8 @@ KbI2cBase::KbI2cBase(const char *name) TCAKeyboard(*(new TDeckProKeyboard())) #elif defined(T_LORA_PAGER) TCAKeyboard(*(new TLoraPagerKeyboard())) +#elif defined(HACKADAY_COMMUNICATOR) + TCAKeyboard(*(new HackadayCommunicatorKeyboard())) #else TCAKeyboard(*(new TCA8418Keyboard())) #endif @@ -328,7 +332,7 @@ int32_t KbI2cBase::runOnce() break; } if (e.inputEvent != INPUT_BROKER_NONE) { - LOG_DEBUG("TCA8418 Notifying: %i Char: %c", e.inputEvent, e.kbchar); + // LOG_DEBUG("TCA8418 Notifying: %i Char: %c", e.inputEvent, e.kbchar); this->notifyObservers(&e); } TCAKeyboard.trigger(); diff --git a/src/main.cpp b/src/main.cpp index da2e39604..f8d89e1ba 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -394,7 +394,10 @@ void setup() io.pinMode(EXPANDS_GPIO_EN, OUTPUT); io.digitalWrite(EXPANDS_GPIO_EN, HIGH); io.pinMode(EXPANDS_SD_PULLEN, INPUT); +#elif defined(HACKADAY_COMMUNICATOR) + pinMode(KB_INT, INPUT); #endif + concurrency::hasBeenSetup = true; #if ARCH_PORTDUINO SPISettings spiSettings(portduino_config.spiSpeed, MSBFIRST, SPI_MODE0); @@ -877,8 +880,8 @@ void setup() if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { #if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \ - defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796) || \ - defined(USE_SPISSD1306) + defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(USE_SPISSD1306) || defined(USE_ST7796) || defined(HACKADAY_COMMUNICATOR) screen = new graphics::Screen(screen_found, screen_model, screen_geometry); #elif defined(ARCH_PORTDUINO) if ((screen_found.port != ScanI2C::I2CPort::NO_I2C || portduino_config.displayPanel) && @@ -1154,8 +1157,8 @@ void setup() // Don't call screen setup until after nodedb is setup (because we need // the current region name) #if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \ - defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_ST7796) || \ - defined(USE_SPISSD1306) + defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || \ + defined(USE_ST7796) || defined(USE_SPISSD1306) || defined(HACKADAY_COMMUNICATOR) if (screen) screen->setup(); #elif defined(ARCH_PORTDUINO) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 4e99a22ef..d3000c500 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -664,7 +664,8 @@ void NodeDB::installDefaultConfig(bool preserveKey = false) config.bluetooth.fixed_pin = defaultBLEPin; #if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7789_CS) || \ - defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_SPISSD1306) || defined(USE_ST7796) + defined(HX8357_CS) || defined(USE_ST7789) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(USE_SPISSD1306) || \ + defined(USE_ST7796) || defined(HACKADAY_COMMUNICATOR) bool hasScreen = true; #ifdef HELTEC_MESH_NODE_T114 uint32_t st7789_id = get_st7789_id(ST7789_NSS, ST7789_SCK, ST7789_SDA, ST7789_RS, ST7789_RESET); diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h index 9b5abfba0..085692f96 100644 --- a/src/platform/esp32/architecture.h +++ b/src/platform/esp32/architecture.h @@ -101,8 +101,6 @@ #define HW_VENDOR meshtastic_HardwareModel_T_WATCH_S3 #elif defined(GENIEBLOCKS) #define HW_VENDOR meshtastic_HardwareModel_GENIEBLOCKS -#elif defined(PRIVATE_HW) -#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW #elif defined(NANO_G1) #define HW_VENDOR meshtastic_HardwareModel_NANO_G1 #elif defined(M5STACK) @@ -205,6 +203,8 @@ #define HW_VENDOR meshtastic_HardwareModel_M5STACK_C6L #elif defined(HELTEC_WIRELESS_TRACKER_V2) #define HW_VENDOR meshtastic_HardwareModel_HELTEC_WIRELESS_TRACKER_V2 +#else +#define HW_VENDOR meshtastic_HardwareModel_PRIVATE_HW #endif // ----------------------------------------------------------------------------- diff --git a/variants/esp32s3/hackaday-communicator/pins_arduino.h b/variants/esp32s3/hackaday-communicator/pins_arduino.h new file mode 100644 index 000000000..65d4e1751 --- /dev/null +++ b/variants/esp32s3/hackaday-communicator/pins_arduino.h @@ -0,0 +1,59 @@ +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define USB_VID 0x303a +#define USB_PID 0x1001 + +// static const uint8_t TX = 43; +// static const uint8_t RX = 44; + +static const uint8_t SDA = 47; +static const uint8_t SCL = 14; + +// Default SPI will be mapped to Radio +static const uint8_t SS = 17; +static const uint8_t MOSI = 3; +static const uint8_t MISO = 9; +static const uint8_t SCK = 8; + +static const uint8_t A0 = 1; +static const uint8_t A1 = 2; +static const uint8_t A2 = 3; +static const uint8_t A3 = 4; +static const uint8_t A4 = 5; +static const uint8_t A5 = 6; +static const uint8_t A6 = 7; +static const uint8_t A7 = 8; +static const uint8_t A8 = 9; +static const uint8_t A9 = 10; +static const uint8_t A10 = 11; +static const uint8_t A11 = 12; +static const uint8_t A12 = 13; +static const uint8_t A13 = 14; +static const uint8_t A14 = 15; +static const uint8_t A15 = 16; +static const uint8_t A16 = 17; +static const uint8_t A17 = 18; +static const uint8_t A18 = 19; +static const uint8_t A19 = 20; + +static const uint8_t T1 = 1; +static const uint8_t T2 = 2; +static const uint8_t T3 = 3; +static const uint8_t T4 = 4; +static const uint8_t T5 = 5; +static const uint8_t T6 = 6; +static const uint8_t T7 = 7; +static const uint8_t T8 = 8; +static const uint8_t T9 = 9; +static const uint8_t T10 = 10; +static const uint8_t T11 = 11; +static const uint8_t T12 = 12; +static const uint8_t T13 = 13; +static const uint8_t T14 = 14; + +// static const uint8_t BAT_ADC_PIN = 4; + +#endif /* Pins_Arduino_h */ diff --git a/variants/esp32s3/hackaday-communicator/platformio.ini b/variants/esp32s3/hackaday-communicator/platformio.ini new file mode 100644 index 000000000..970215045 --- /dev/null +++ b/variants/esp32s3/hackaday-communicator/platformio.ini @@ -0,0 +1,15 @@ +; Hackaday Communicator +[env:hackaday-communicator] +extends = esp32s3_base +board = hackaday-communicator +board_check = true +board_build.partitions = default_16MB.csv +upload_protocol = esptool + +build_flags = ${esp32s3_base.build_flags} + -D HACKADAY_COMMUNICATOR + -D BOARD_HAS_PSRAM + -I variants/esp32s3/hackaday-communicator + +lib_deps = ${esp32s3_base.lib_deps} + https://github.com/meshtastic/Arduino_GFX/archive/054e81ffaf23784830a734e3c184346789349406.zip \ No newline at end of file diff --git a/variants/esp32s3/hackaday-communicator/variant.h b/variants/esp32s3/hackaday-communicator/variant.h new file mode 100644 index 000000000..ccd9d3edb --- /dev/null +++ b/variants/esp32s3/hackaday-communicator/variant.h @@ -0,0 +1,60 @@ +#define TFT_BL 2 +#define SPI_FREQUENCY 2000000 +#define SPI_READ_FREQUENCY 16000000 +#define TFT_HEIGHT 142 +#define TFT_WIDTH 428 +#define TFT_OFFSET_X 0 +#define TFT_OFFSET_Y 0 +#define TFT_OFFSET_ROTATION 0 +#define SCREEN_TRANSITION_FRAMERATE 5 +#define HAS_SCREEN 1 +#define TFT_BLACK 0 +#define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness + +#define USE_POWERSAVE +#define SLEEP_TIME 120 + +#define GPS_DEFAULT_NOT_PRESENT 1 +// #define GPS_RX_PIN 44 +// #define GPS_TX_PIN 43 + +// #define BATTERY_PIN 4 // A battery voltage measurement pin, voltage divider connected here to measure battery voltage +// ratio of voltage divider = 2.0 (RD2=100k, RD3=100k) +// #define ADC_MULTIPLIER 2.11 // 2.0 + 10% for correction of display undervoltage. +// #define ADC_CHANNEL ADC1_GPIO4_CHANNEL + +// keyboard +#define I2C_SDA 47 // I2C pins for this board +#define I2C_SCL 14 +// #define KB_POWERON -1 // must be set to HIGH +// #define KB_SLAVE_ADDRESS TDECK_KB_ADDR // 0x55 +// #define KB_BL_PIN 46 // not used for now +#define KB_INT 13 +#define CANNED_MESSAGE_MODULE_ENABLE 1 + +#define TFT_DC 39 +#define TFT_CS 41 + +// LoRa +#define USE_SX1262 + +#define LORA_SCK 8 +#define LORA_MISO 9 +#define LORA_MOSI 3 +#define LORA_CS 17 + +// #define LORA_DIO0 -1 // a No connect on the SX1262 module +#define LORA_RESET 18 +#define LORA_DIO1 16 // SX1262 IRQ +#define LORA_DIO2 15 // SX1262 BUSY +// #define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled + +#define SX126X_CS LORA_CS +#define SX126X_DIO1 LORA_DIO1 +#define SX126X_BUSY LORA_DIO2 +#define SX126X_RESET LORA_RESET + +#define SX126X_DIO2_AS_RF_SWITCH +#define SX126X_DIO3_TCXO_VOLTAGE 1.8 + +// #define LED_PIN 1 \ No newline at end of file From 09bbfce625f1ded9663618d282916bcf0936cf71 Mon Sep 17 00:00:00 2001 From: Riker Date: Mon, 1 Dec 2025 10:27:45 +0800 Subject: [PATCH 203/286] Enabled MQTT and WEBSERVER by default (#8679) Signed-off-by: kur1k0 Co-authored-by: Ben Meadors Co-authored-by: Jonathan Bennett --- variants/esp32c6/m5stack_unitc6l/platformio.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/variants/esp32c6/m5stack_unitc6l/platformio.ini b/variants/esp32c6/m5stack_unitc6l/platformio.ini index da1c70c0a..9992ab2bf 100644 --- a/variants/esp32c6/m5stack_unitc6l/platformio.ini +++ b/variants/esp32c6/m5stack_unitc6l/platformio.ini @@ -22,8 +22,6 @@ build_flags = -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1 -D HAS_BLUETOOTH=1 - -D MESHTASTIC_EXCLUDE_WEBSERVER - -D MESHTASTIC_EXCLUDE_MQTT -DCONFIG_BT_NIMBLE_EXT_ADV=1 -DCONFIG_BT_NIMBLE_MAX_EXT_ADV_INSTANCES=2 -D NIMBLE_TWO From 34f8300288b06348b8358dff4376f75a0ce1b3cb Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Sun, 30 Nov 2025 22:32:51 -0500 Subject: [PATCH 204/286] Initial Chatter 2.0 fix for baseUI (#8615) * Initial Chatter 2.0 fix for baseUI * trunk fix --------- Co-authored-by: Jason P --- src/graphics/SharedUIDisplay.cpp | 11 +-- src/input/SerialKeyboard.cpp | 20 ++++- src/input/SerialKeyboard.h | 6 +- src/modules/CannedMessageModule.cpp | 84 ++++++++++++++++++- variants/esp32/chatter2/variant.h | 1 + .../heltec_wireless_tracker_V1_0/variant.h | 1 + 6 files changed, 114 insertions(+), 9 deletions(-) diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp index 1645789a7..892285dcb 100644 --- a/src/graphics/SharedUIDisplay.cpp +++ b/src/graphics/SharedUIDisplay.cpp @@ -17,6 +17,12 @@ namespace graphics void determineResolution(int16_t screenheight, int16_t screenwidth) { + +#ifdef FORCE_LOW_RES + isHighResolution = false; + return; +#endif + if (screenwidth > 128) { isHighResolution = true; } @@ -24,11 +30,6 @@ void determineResolution(int16_t screenheight, int16_t screenwidth) if (screenwidth > 128 && screenheight <= 64) { isHighResolution = false; } - - // Special case for Heltec Wireless Tracker v1.1 - if (screenwidth == 160 && screenheight == 80) { - isHighResolution = false; - } } // === Shared External State === diff --git a/src/input/SerialKeyboard.cpp b/src/input/SerialKeyboard.cpp index 2df1ace70..a5d2c614f 100644 --- a/src/input/SerialKeyboard.cpp +++ b/src/input/SerialKeyboard.cpp @@ -2,6 +2,8 @@ #include "configuration.h" #include +SerialKeyboard *globalSerialKeyboard = nullptr; + #ifdef INPUTBROKER_SERIAL_TYPE #define CANNED_MESSAGE_MODULE_ENABLE 1 // in case it's not set in the variant file @@ -25,6 +27,8 @@ unsigned char KeyMap[3][4][10] = {{{'.', 'a', 'd', 'g', 'j', 'm', 'p', 't', 'w', SerialKeyboard::SerialKeyboard(const char *name) : concurrency::OSThread(name) { this->_originName = name; + + globalSerialKeyboard = this; } void SerialKeyboard::erase() @@ -85,9 +89,21 @@ int32_t SerialKeyboard::runOnce() e.source = this->_originName; // SELECT OR SEND OR CANCEL EVENT if (!(shiftRegister2 & (1 << 3))) { - e.inputEvent = INPUT_BROKER_UP; + if (shift > 0) { + e.inputEvent = INPUT_BROKER_ANYKEY; // REQUIRED + e.kbchar = 0x09; // TAB + shift = 0; // reset shift after TAB + } else { + e.inputEvent = INPUT_BROKER_LEFT; + } } else if (!(shiftRegister2 & (1 << 2))) { - e.inputEvent = INPUT_BROKER_RIGHT; + if (shift > 0) { + e.inputEvent = INPUT_BROKER_ANYKEY; // REQUIRED + e.kbchar = 0x09; // TAB + shift = 0; // reset shift after TAB + } else { + e.inputEvent = INPUT_BROKER_RIGHT; + } e.kbchar = 0; } else if (!(shiftRegister2 & (1 << 1))) { e.inputEvent = INPUT_BROKER_SELECT; diff --git a/src/input/SerialKeyboard.h b/src/input/SerialKeyboard.h index 1480c4d58..f25eb2630 100644 --- a/src/input/SerialKeyboard.h +++ b/src/input/SerialKeyboard.h @@ -8,6 +8,8 @@ class SerialKeyboard : public Observable, public concurrency public: explicit SerialKeyboard(const char *name); + uint8_t getShift() const { return shift; } + protected: virtual int32_t runOnce() override; void erase(); @@ -22,4 +24,6 @@ class SerialKeyboard : public Observable, public concurrency int lastKeyPressed = 13; int quickPress = 0; unsigned long lastPressTime = 0; -}; \ No newline at end of file +}; + +extern SerialKeyboard *globalSerialKeyboard; \ No newline at end of file diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 9cbacc877..9433c0a9e 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -16,6 +16,7 @@ #include "graphics/draw/NotificationRenderer.h" #include "graphics/emotes.h" #include "graphics/images.h" +#include "input/SerialKeyboard.h" #include "main.h" // for cardkb_found #include "mesh/generated/meshtastic/cannedmessages.pb.h" #include "modules/AdminModule.h" @@ -1848,7 +1849,88 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st display->drawString(x + display->getWidth() - display->getStringWidth(buffer), y + 0, buffer); } - // --- Draw Free Text input with multi-emote support and proper line wrapping --- +#if INPUTBROKER_SERIAL_TYPE == 1 + // Chatter Modifier key mode label (right side) + { + uint8_t mode = globalSerialKeyboard ? globalSerialKeyboard->getShift() : 0; + const char *label = (mode == 0) ? "a" : (mode == 1) ? "A" : "#"; + + display->setFont(FONT_SMALL); + display->setTextAlignment(TEXT_ALIGN_LEFT); + + const int16_t th = FONT_HEIGHT_SMALL; + const int16_t tw = display->getStringWidth(label); + const int16_t padX = 3; + const int16_t padY = 2; + const int16_t r = 3; + + const int16_t bw = tw + padX * 2; + const int16_t bh = th + padY * 2; + + const int16_t bx = x + display->getWidth() - bw - 2; + const int16_t by = y + display->getHeight() - bh - 2; + + display->setColor(WHITE); + display->fillRect(bx + r, by, bw - r * 2, bh); + display->fillRect(bx, by + r, r, bh - r * 2); + display->fillRect(bx + bw - r, by + r, r, bh - r * 2); + display->fillCircle(bx + r, by + r, r); + display->fillCircle(bx + bw - r - 1, by + r, r); + display->fillCircle(bx + r, by + bh - r - 1, r); + display->fillCircle(bx + bw - r - 1, by + bh - r - 1, r); + + display->setColor(BLACK); + display->drawString(bx + padX, by + padY, label); + } + + // LEFT-SIDE DESTINATION-HINT BOX (“Dest: Shift + â—„â€) + { + display->setFont(FONT_SMALL); + display->setTextAlignment(TEXT_ALIGN_LEFT); + + const char *label = "Dest: Shift + "; + int16_t labelW = display->getStringWidth(label); + + // triangle size visually matches glyph height, not full line height + const int triH = FONT_HEIGHT_SMALL - 3; + const int triW = triH * 0.7; + + const int16_t padX = 3; + const int16_t padY = 2; + const int16_t r = 3; + + const int16_t bw = labelW + triW + padX * 2 + 2; + const int16_t bh = FONT_HEIGHT_SMALL + padY * 2; + + const int16_t bx = x + 2; + const int16_t by = y + display->getHeight() - bh - 2; + + // Rounded white box + display->setColor(WHITE); + display->fillRect(bx + r, by, bw - (r * 2), bh); + display->fillRect(bx, by + r, r, bh - (r * 2)); + display->fillRect(bx + bw - r, by + r, r, bh - (r * 2)); + display->fillCircle(bx + r, by + r, r); + display->fillCircle(bx + bw - r - 1, by + r, r); + display->fillCircle(bx + r, by + bh - r - 1, r); + display->fillCircle(bx + bw - r - 1, by + bh - r - 1, r); + + // Draw text + display->setColor(BLACK); + display->drawString(bx + padX, by + padY, label); + + // Perfectly center triangle on text baseline + int16_t tx = bx + padX + labelW; + int16_t ty = by + padY + (FONT_HEIGHT_SMALL / 2) - (triH / 2) - 1; // -1 for optical centering + + // â—„ Left-pointing triangle + display->fillTriangle(tx + triW, ty, // top-right + tx, ty + triH / 2, // left center + tx + triW, ty + triH // bottom-right + ); + } +#endif + // Draw Free Text input with multi-emote support and proper line wrapping display->setColor(WHITE); { int inputY = 0 + y + FONT_HEIGHT_SMALL; diff --git a/variants/esp32/chatter2/variant.h b/variants/esp32/chatter2/variant.h index ff4f87bbe..b3e06de48 100644 --- a/variants/esp32/chatter2/variant.h +++ b/variants/esp32/chatter2/variant.h @@ -62,6 +62,7 @@ #define TFT_OFFSET_X 0 #define TFT_OFFSET_Y 0 #define TFT_INVERT false +#define FORCE_LOW_RES 1 #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 // fps #define DISPLAY_FORCE_SMALL_FONTS diff --git a/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h b/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h index 876ff1146..cd76bb604 100644 --- a/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h +++ b/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h @@ -27,6 +27,7 @@ #define VTFT_CTRL 46 // Heltec Tracker needs this pulled low for TFT #define SCREEN_TRANSITION_FRAMERATE 3 // fps #define DISPLAY_FORCE_SMALL_FONTS +#define FORCE_LOW_RES 1 #define VEXT_ENABLE Vext // active low, powers the oled display and the lora antenna boost #define VEXT_ON_VALUE LOW From ee6c9101c70c84c7fe26c89cc1000c21afc5fb54 Mon Sep 17 00:00:00 2001 From: Chloe Bethel Date: Mon, 1 Dec 2025 03:57:25 +0000 Subject: [PATCH 205/286] Make GPS_TX_PIN the serial TX and GPS_RX_PIN the serial RX for all NRF variants (#8772) --- variants/nrf52840/ELECROW-ThinkNode-M1/variant.h | 8 ++++---- variants/nrf52840/ELECROW-ThinkNode-M3/variant.h | 8 ++++---- variants/nrf52840/ELECROW-ThinkNode-M6/variant.h | 8 ++++---- variants/nrf52840/canaryone/variant.h | 8 ++++---- variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h | 8 ++++---- variants/nrf52840/meshlink/variant.h | 4 ++-- variants/nrf52840/meshlink_eink/variant.h | 4 ++-- variants/nrf52840/nano-g2-ultra/variant.h | 8 ++++---- variants/nrf52840/seeed_solar_node/variant.h | 8 ++++---- variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h | 8 ++++---- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h index 79e31c54a..b8cd8da63 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h +++ b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h @@ -157,15 +157,15 @@ External serial flash WP25R1635FZUIL0 #define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake // Seems to be missing on this new board // #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (32 + 9) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (32 + 8) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (32 + 8) // This is for bits going TOWARDS the GPS +#define GPS_RX_PIN (32 + 9) // This is for bits going TOWARDS the CPU #define GPS_THREAD_INTERVAL 50 #define PIN_GPS_SWITCH (32 + 1) // GPS开关判断 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN // PCF8563 RTC Module #define PCF8563_RTC 0x51 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h index cf940172b..2ad3efa27 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.h @@ -78,11 +78,11 @@ extern "C" { #define GPS_BAUDRATE 9600 #define PIN_GPS_RESET 25 #define PIN_GPS_STANDBY 21 -#define GPS_TX_PIN 20 -#define GPS_RX_PIN 22 +#define GPS_TX_PIN 22 +#define GPS_RX_PIN 20 #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN // Button #define BUTTON_PIN 12 #define BUTTON_PIN_ALT (0 + 12) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h index 5e543b21f..d30b88d66 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/variant.h @@ -107,12 +107,12 @@ static const uint8_t A0 = PIN_A0; #define PIN_GPS_REINIT (29) #define PIN_GPS_STANDBY (30) #define PIN_GPS_PPS (31) -#define GPS_TX_PIN (3) -#define GPS_RX_PIN (2) +#define GPS_TX_PIN (2) +#define GPS_RX_PIN (3) #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN // Secondary UART #define PIN_SERIAL2_RX (22) diff --git a/variants/nrf52840/canaryone/variant.h b/variants/nrf52840/canaryone/variant.h index 836fa74a3..204ca6306 100644 --- a/variants/nrf52840/canaryone/variant.h +++ b/variants/nrf52840/canaryone/variant.h @@ -128,13 +128,13 @@ static const uint8_t A0 = PIN_A0; // #define PIN_GPS_WAKE (GPIO_PORT1 + 2) // An output to wake GPS, low means allow sleep, high means force wake // Seems to be missing on this new board #define PIN_GPS_PPS (GPIO_PORT1 + 4) // Pulse per second input from the GPS -#define GPS_TX_PIN (GPIO_PORT1 + 9) // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN (GPIO_PORT1 + 8) // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN (GPIO_PORT1 + 8) // This is for bits going TOWARDS the GPS +#define GPS_RX_PIN (GPIO_PORT1 + 9) // This is for bits going TOWARDS the CPU #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX GPS_TX_PIN -#define PIN_SERIAL1_TX GPS_RX_PIN +#define PIN_SERIAL1_RX GPS_RX_PIN +#define PIN_SERIAL1_TX GPS_TX_PIN #define GPS_RESET_PIN (GPIO_PORT1 + 5) // GPS reset pin diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h index fee8ee88e..b52d0e57e 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h @@ -90,16 +90,16 @@ NRF52 PRO MICRO PIN ASSIGNMENT #define BUTTON_PIN (32 + 0) // P1.00 // GPS -#define PIN_GPS_TX (0 + 22) // P0.22 -#define PIN_GPS_RX (0 + 20) // P0.20 +#define PIN_GPS_TX (0 + 20) // P0.20 +#define PIN_GPS_RX (0 + 22) // P0.22 #define PIN_GPS_EN (0 + 24) // P0.24 #define GPS_UBLOX // define GPS_DEBUG // UART interfaces -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX +#define PIN_SERIAL1_TX PIN_GPS_TX +#define PIN_SERIAL1_RX PIN_GPS_RX #define PIN_SERIAL2_RX (0 + 6) // P0.06 #define PIN_SERIAL2_TX (0 + 8) // P0.08 diff --git a/variants/nrf52840/meshlink/variant.h b/variants/nrf52840/meshlink/variant.h index 54df03691..d1dba574f 100644 --- a/variants/nrf52840/meshlink/variant.h +++ b/variants/nrf52840/meshlink/variant.h @@ -121,8 +121,8 @@ static const uint8_t SCK = PIN_SPI_SCK; #define PIN_GPS_PPS (26) // Pulse per second input from the GPS -#define GPS_TX_PIN PIN_SERIAL1_RX // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN PIN_SERIAL1_TX // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN PIN_SERIAL1_TX // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN PIN_SERIAL1_RX // This is for bits going TOWARDS the GPS // #define GPS_THREAD_INTERVAL 50 diff --git a/variants/nrf52840/meshlink_eink/variant.h b/variants/nrf52840/meshlink_eink/variant.h index b605d7082..e82163ca7 100644 --- a/variants/nrf52840/meshlink_eink/variant.h +++ b/variants/nrf52840/meshlink_eink/variant.h @@ -121,8 +121,8 @@ static const uint8_t SCK = PIN_SPI_SCK; #define PIN_GPS_PPS (26) // Pulse per second input from the GPS -#define GPS_TX_PIN PIN_SERIAL1_RX // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN PIN_SERIAL1_TX // This is for bits going TOWARDS the GPS +#define GPS_TX_PIN PIN_SERIAL1_TX // This is for bits going TOWARDS the CPU +#define GPS_RX_PIN PIN_SERIAL1_RX // This is for bits going TOWARDS the GPS // #define GPS_THREAD_INTERVAL 50 diff --git a/variants/nrf52840/nano-g2-ultra/variant.h b/variants/nrf52840/nano-g2-ultra/variant.h index fd51cf9a1..fd837f66e 100644 --- a/variants/nrf52840/nano-g2-ultra/variant.h +++ b/variants/nrf52840/nano-g2-ultra/variant.h @@ -132,13 +132,13 @@ External serial flash W25Q16JV_IQ #define GPS_L76K #define PIN_GPS_STANDBY (0 + 13) // An output to wake GPS, low means allow sleep, high means force wake STANDBY -#define PIN_GPS_TX (0 + 9) // This is for bits going TOWARDS the CPU -#define PIN_GPS_RX (0 + 10) // This is for bits going TOWARDS the GPS +#define PIN_GPS_TX (0 + 10) // This is for bits going TOWARDS the CPU +#define PIN_GPS_RX (0 + 9) // This is for bits going TOWARDS the GPS // #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX +#define PIN_SERIAL1_TX PIN_GPS_TX +#define PIN_SERIAL1_RX PIN_GPS_RX // PCF8563 RTC Module #define PCF8563_RTC 0x51 diff --git a/variants/nrf52840/seeed_solar_node/variant.h b/variants/nrf52840/seeed_solar_node/variant.h index 30d5c5888..da89fcfa5 100644 --- a/variants/nrf52840/seeed_solar_node/variant.h +++ b/variants/nrf52840/seeed_solar_node/variant.h @@ -115,13 +115,13 @@ static const uint8_t SCL = PIN_WIRE_SCL; // â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” #define GPS_L76K #ifdef GPS_L76K -#define PIN_GPS_RX D6 // 44 -#define PIN_GPS_TX D7 // 43 +#define PIN_GPS_TX D6 // 44 +#define PIN_GPS_RX D7 // 43 #define HAS_GPS 1 #define GPS_BAUDRATE 9600 #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX +#define PIN_SERIAL1_TX PIN_GPS_TX +#define PIN_SERIAL1_RX PIN_GPS_RX #define PIN_GPS_STANDBY D0 #define GPS_EN D18 // P1.05 #endif diff --git a/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h b/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h index a65500612..fb112a302 100644 --- a/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h +++ b/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h @@ -147,12 +147,12 @@ static const uint8_t SCK = PIN_SPI_SCK; */ // GPS L76K #ifdef GPS_L76K -#define PIN_GPS_RX D6 -#define PIN_GPS_TX D7 +#define PIN_GPS_TX D6 +#define PIN_GPS_RX D7 #define HAS_GPS 1 #define GPS_THREAD_INTERVAL 50 -#define PIN_SERIAL1_RX PIN_GPS_TX -#define PIN_SERIAL1_TX PIN_GPS_RX +#define PIN_SERIAL1_TX PIN_GPS_TX +#define PIN_SERIAL1_RX PIN_GPS_RX #define PIN_GPS_STANDBY D0 #else #define PIN_SERIAL1_RX (-1) From 80e8745714663125e9cd7de8dd98c9d5cbc54787 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 06:14:46 -0600 Subject: [PATCH 206/286] Update XPowersLib to v0.3.2 (#8823) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- arch/esp32/esp32.ini | 2 +- arch/esp32/esp32c6.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini index 810c9780e..08a547ca6 100644 --- a/arch/esp32/esp32.ini +++ b/arch/esp32/esp32.ini @@ -57,7 +57,7 @@ lib_deps = # renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip # renovate: datasource=github-tags depName=XPowersLib packageName=lewisxhe/XPowersLib - https://github.com/lewisxhe/XPowersLib/archive/v0.3.1.zip + https://github.com/lewisxhe/XPowersLib/archive/v0.3.2.zip # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto diff --git a/arch/esp32/esp32c6.ini b/arch/esp32/esp32c6.ini index 7b06f4cd8..b07a2dcd4 100644 --- a/arch/esp32/esp32c6.ini +++ b/arch/esp32/esp32c6.ini @@ -28,7 +28,7 @@ lib_deps = ${environmental_extra.lib_deps} ${radiolib_base.lib_deps} # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib - lewisxhe/XPowersLib@0.3.1 + lewisxhe/XPowersLib@0.3.2 # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto From eba6e4ed752df1457093f104a0279693b6f1af33 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 06:16:52 -0600 Subject: [PATCH 207/286] Upgrade trunk (#8822) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 16bae762e..342d9d4a2 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,14 +9,14 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.26.3 - - prettier@3.7.1 + - renovate@42.27.1 + - prettier@3.7.3 - trufflehog@3.91.1 - yamllint@1.37.1 - bandit@1.9.2 - trivy@0.67.2 - taplo@0.10.0 - - ruff@0.14.6 + - ruff@0.14.7 - isort@7.0.0 - markdownlint@0.46.0 - oxipng@9.1.5 From 0e653056e7661a11acb30faf63e6dee5e27f10e7 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 1 Dec 2025 09:00:10 -0500 Subject: [PATCH 208/286] RPM: Fix broken builds (bad backmerge) (#8787) Co-authored-by: Ben Meadors --- meshtasticd.spec.rpkg | 1 - 1 file changed, 1 deletion(-) diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index b9152c4a3..e2da172c3 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -33,7 +33,6 @@ BuildRequires: python3dist(grpcio[protobuf]) BuildRequires: python3dist(grpcio-tools) BuildRequires: git-core BuildRequires: gcc-c++ -BuildRequires: (glibc-devel >= 2.38) or pkgconfig(libbsd-overlay) BuildRequires: pkgconfig(yaml-cpp) BuildRequires: pkgconfig(libgpiod) BuildRequires: pkgconfig(bluez) From a3d3e1c912694394f428937fd6e44e85c65d02d3 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 1 Dec 2025 15:34:05 -0600 Subject: [PATCH 209/286] =?UTF-8?q?Flags=20and=20scripts=20for=20size=20re?= =?UTF-8?q?duction=20on=20NRF52=20->=20Currently=20targeting=20=E2=80=A6?= =?UTF-8?q?=20(#8825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Flags and scripts for size reduction on NRF52 -> Currently targeting rak4631 * Changes from the other branch poluted it * Remove the stripper * No strip --- bin/analyze_map.py | 165 +++++++++++++++++++++++ variants/nrf52840/rak4631/platformio.ini | 21 ++- 2 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 bin/analyze_map.py diff --git a/bin/analyze_map.py b/bin/analyze_map.py new file mode 100644 index 000000000..99997c703 --- /dev/null +++ b/bin/analyze_map.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python3 +"""Summarise linker map output to highlight heavy object files and libraries. + +Usage: + python bin/analyze_map.py --map .pio/build/rak4631/output.map --top 20 + +The script parses GNU ld map files and aggregates section sizes per object file +and per archive/library, then prints sortable tables that make it easy to spot +modules worth trimming or hiding behind feature flags. +""" +from __future__ import annotations + +import argparse +import collections +import os +import re +import sys +from typing import DefaultDict, Dict, Tuple + + +SECTION_LINE_RE = re.compile(r"^\s+(?P
\S+)\s+0x[0-9A-Fa-f]+\s+0x(?P[0-9A-Fa-f]+)\s+(?P.+)$") +ARCHIVE_MEMBER_RE = re.compile(r"^(?P.+)\((?P[^)]+)\)$") + + +def human_size(num_bytes: int) -> str: + """Return a friendly size string with one decimal place.""" + if num_bytes < 1024: + return f"{num_bytes:,} B" + num = float(num_bytes) + for unit in ("KB", "MB", "GB"): + num /= 1024.0 + if num < 1024.0: + return f"{num:.1f} {unit}" + return f"{num:.1f} TB" + + +def shorten_path(path: str, root: str) -> str: + """Prefer repository-relative paths for readability.""" + path = path.strip() + if not path: + return path + + # Normalise Windows archives (backslashes) to POSIX style for consistency. + path = path.replace("\\", "/") + + # Attempt to strip the root when an absolute path lives inside the repo. + if os.path.isabs(path): + try: + rel = os.path.relpath(path, root) + if not rel.startswith(".."): + return rel + except ValueError: + # relpath can fail on mixed drives on Windows; fall back to basename. + pass + return path + + +def describe_object(raw_object: str, root: str) -> Tuple[str, str]: + """Return a human friendly object label and the library it belongs to.""" + raw_object = raw_object.strip() + lib_label = "[app]" + match = ARCHIVE_MEMBER_RE.match(raw_object) + if match: + archive = shorten_path(match.group("archive"), root) + obj = match.group("object") + lib_label = os.path.basename(archive) or archive + label = f"{archive}:{obj}" + else: + label = shorten_path(raw_object, root) + # If the object lives under libs, hint at the containing directory. + parent = os.path.basename(os.path.dirname(label)) + if parent: + lib_label = parent + return label, lib_label + + +def parse_map(map_path: str, repo_root: str) -> Tuple[Dict[str, int], Dict[str, int], Dict[str, Dict[str, int]]]: + per_object: DefaultDict[str, int] = collections.defaultdict(int) + per_library: DefaultDict[str, int] = collections.defaultdict(int) + per_object_sections: DefaultDict[str, DefaultDict[str, int]] = collections.defaultdict(lambda: collections.defaultdict(int)) + + try: + with open(map_path, "r", encoding="utf-8", errors="ignore") as handle: + for line in handle: + match = SECTION_LINE_RE.match(line) + if not match: + continue + + section = match.group("section") + if section.startswith("*") or section in {"LOAD", "ORIGIN"}: + continue + + size = int(match.group("size"), 16) + if size == 0: + continue + + obj_token = match.group("object").strip() + if not obj_token or obj_token.startswith("*") or "load address" in obj_token: + continue + + label, lib_label = describe_object(obj_token, repo_root) + per_object[label] += size + per_library[lib_label] += size + per_object_sections[label][section] += size + except FileNotFoundError: + raise SystemExit(f"error: map file '{map_path}' not found. Run a build first.") + + return per_object, per_library, per_object_sections + + +def format_section_breakdown(section_sizes: Dict[str, int], total: int, limit: int = 3) -> str: + items = sorted(section_sizes.items(), key=lambda kv: kv[1], reverse=True) + parts = [] + for section, size in items[:limit]: + pct = (size / total) * 100 if total else 0 + parts.append(f"{section} {pct:.1f}%") + if len(items) > limit: + remainder = total - sum(size for _, size in items[:limit]) + pct = (remainder / total) * 100 if total else 0 + parts.append(f"other {pct:.1f}%") + return ", ".join(parts) + + +def print_report(map_path: str, top_n: int, per_object: Dict[str, int], per_library: Dict[str, int], per_object_sections: Dict[str, Dict[str, int]]): + total_bytes = sum(per_object.values()) + if total_bytes == 0: + print("No section data found in map file.") + return + + print(f"Map file: {map_path}") + print(f"Accounted size: {human_size(total_bytes)} across {len(per_object)} object files\n") + + sorted_objects = sorted(per_object.items(), key=lambda kv: kv[1], reverse=True) + print(f"Top {min(top_n, len(sorted_objects))} object files by linked size:") + for idx, (obj, size) in enumerate(sorted_objects[:top_n], 1): + pct = (size / total_bytes) * 100 + breakdown = format_section_breakdown(per_object_sections[obj], size) + print(f"{idx:2}. {human_size(size):>9} ({size:,} B, {pct:5.2f}% of linked size)") + print(f" {obj}") + if breakdown: + print(f" sections: {breakdown}") + print() + + sorted_libs = sorted(per_library.items(), key=lambda kv: kv[1], reverse=True) + print(f"Top {min(top_n, len(sorted_libs))} libraries or source roots:") + for idx, (lib, size) in enumerate(sorted_libs[:top_n], 1): + pct = (size / total_bytes) * 100 + print(f"{idx:2}. {human_size(size):>9} ({size:,} B, {pct:5.2f}% of linked size) {lib}") + + +def main() -> None: + parser = argparse.ArgumentParser(description="Highlight heavy object files from a GNU ld map file.") + parser.add_argument("--map", default=".pio/build/rak4631/output.map", help="Path to the map file (default: %(default)s)") + parser.add_argument("--top", type=int, default=20, help="Number of entries to display per table (default: %(default)s)") + args = parser.parse_args() + + map_path = os.path.abspath(args.map) + repo_root = os.path.abspath(os.getcwd()) + + per_object, per_library, per_object_sections = parse_map(map_path, repo_root) + print_report(os.path.relpath(map_path, repo_root), args.top, per_object, per_library, per_object_sections) + + +if __name__ == "__main__": + main() diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 205966529..c95d477f9 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -4,16 +4,33 @@ extends = nrf52840_base board = wiscore_rak4631 board_level = pr board_check = true +build_type = release build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/rak4631 -D RAK_4631 -DEINK_DISPLAY_MODEL=GxEPD2_213_BN -DEINK_WIDTH=250 - -DEINK_HEIGHT=122 + -DEINK_HEIGHT=122 -DRADIOLIB_EXCLUDE_SX128X=1 -DRADIOLIB_EXCLUDE_SX127X=1 -DRADIOLIB_EXCLUDE_LR11X0=1 -build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631> + + + + -Os + -Wl,-Map=$BUILD_DIR/output.map +build_unflags = + -Ofast + -Og + -ggdb3 + -ggdb2 + -g3 + -g2 + -g + -g1 + -g0 +build_src_filter = ${nrf52_base.build_src_filter} \ + +<../variants/nrf52840/rak4631> \ + + \ + + \ + + lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} From 859ae4d3d256525e9a8042d3b5197afb14397775 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 1 Dec 2025 19:19:50 -0600 Subject: [PATCH 210/286] Plain RAK4631 should not compile EInk and TFT display code (#8811) * Plain RAK4631 should not compile EInk and TFT display code * Add USE_TFTDISPLAY to variant files. * Derp * Undo the platformio.ini changes to heltec_v4 * Drop unneeded src_filter lines --------- Co-authored-by: Jonathan Bennett Co-authored-by: Jason P --- src/configuration.h | 26 +++++++++++++++++++ src/graphics/Screen.cpp | 4 +++ src/graphics/TFTDisplay.cpp | 6 ++--- variants/esp32/chatter2/variant.h | 1 + variants/esp32/m5stack_core/platformio.ini | 1 - variants/esp32/m5stack_core/variant.h | 2 ++ variants/esp32/wiphone/variant.h | 1 + .../esp32s3/hackaday-communicator/variant.h | 1 + variants/esp32s3/heltec_v4/variant.h | 3 +++ .../esp32s3/heltec_wireless_tracker/variant.h | 1 + .../heltec_wireless_tracker_V1_0/variant.h | 1 + .../heltec_wireless_tracker_v2/variant.h | 1 + variants/esp32s3/picomputer-s3/variant.h | 1 + .../seeed-sensecap-indicator/variant.h | 1 + variants/esp32s3/t-deck/variant.h | 1 + variants/esp32s3/t-watch-s3/variant.h | 1 + variants/esp32s3/tlora-pager/variant.h | 1 + .../esp32s3/tracksenger/internal/variant.h | 1 + variants/esp32s3/tracksenger/lcd/variant.h | 1 + variants/esp32s3/unphone/variant.h | 1 + variants/native/portduino-buildroot/variant.h | 1 + variants/native/portduino/variant.h | 1 + variants/nrf52840/rak4631/platformio.ini | 9 ++++--- variants/nrf52840/rak_wismeshtap/variant.h | 1 + 24 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/configuration.h b/src/configuration.h index d30280d8b..b4ab57053 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -36,6 +36,29 @@ along with this program. If not, see . /* Offer chance for variant-specific defines */ #include "variant.h" +// ----------------------------------------------------------------------------- +// Display feature overrides +// ----------------------------------------------------------------------------- + +// Allow build environments to opt-in explicitly to the E-Ink UI stack while +// keeping headless targets slim by default. Existing variants that already +// define USE_EINK continue to work without additional flags. +#ifndef MESHTASTIC_USE_EINK_UI +#ifdef USE_EINK +#define MESHTASTIC_USE_EINK_UI 1 +#else +#define MESHTASTIC_USE_EINK_UI 0 +#endif +#endif + +#if MESHTASTIC_USE_EINK_UI +#ifndef USE_EINK +#define USE_EINK +#endif +#else +#undef USE_EINK +#endif + // ----------------------------------------------------------------------------- // Version // ----------------------------------------------------------------------------- @@ -371,6 +394,9 @@ along with this program. If not, see . #ifndef HAS_BLUETOOTH #define HAS_BLUETOOTH 0 #endif +#ifndef USE_TFTDISPLAY +#define USE_TFTDISPLAY 0 +#endif #ifndef HW_VENDOR #error HW_VENDOR must be defined diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 351419289..c6bbcc4b5 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -69,7 +69,11 @@ using graphics::Emote; using graphics::emotes; using graphics::numEmotes; +#if USE_TFTDISPLAY extern uint16_t TFT_MESH; +#else +uint16_t TFT_MESH = COLOR565(0x67, 0xEA, 0x94); +#endif #if HAS_WIFI && !defined(ARCH_PORTDUINO) #include "mesh/wifi/WiFiAPClient.h" diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp index 4445a7c5e..12fac4f34 100644 --- a/src/graphics/TFTDisplay.cpp +++ b/src/graphics/TFTDisplay.cpp @@ -1,5 +1,6 @@ #include "configuration.h" #include "main.h" +#if USE_TFTDISPLAY #if ARCH_PORTDUINO #include "platform/portduino/PortduinoGlue.h" @@ -1138,9 +1139,6 @@ static LGFX *tft = nullptr; #endif -#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || defined(ST7796_CS) || defined(ILI9341_DRIVER) || \ - defined(ILI9342_DRIVER) || defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST72xx_DE) || \ - (ARCH_PORTDUINO && HAS_SCREEN != 0) || defined(HACKADAY_COMMUNICATOR) #include "SPILock.h" #include "TFTDisplay.h" #include @@ -1518,4 +1516,4 @@ bool TFTDisplay::connect() return true; } -#endif +#endif // USE_TFTDISPLAY diff --git a/variants/esp32/chatter2/variant.h b/variants/esp32/chatter2/variant.h index b3e06de48..0c1ef6967 100644 --- a/variants/esp32/chatter2/variant.h +++ b/variants/esp32/chatter2/variant.h @@ -67,6 +67,7 @@ #define SCREEN_TRANSITION_FRAMERATE 5 // fps #define DISPLAY_FORCE_SMALL_FONTS #define TFT_BACKLIGHT_ON LOW +#define USE_TFTDISPLAY 1 // Battery diff --git a/variants/esp32/m5stack_core/platformio.ini b/variants/esp32/m5stack_core/platformio.ini index 469d93f94..a0443a918 100644 --- a/variants/esp32/m5stack_core/platformio.ini +++ b/variants/esp32/m5stack_core/platformio.ini @@ -7,7 +7,6 @@ build_src_filter = build_flags = ${esp32_base.build_flags} -I variants/esp32/m5stack_core - -DILI9341_DRIVER -DM5STACK -DUSER_SETUP_LOADED -DTFT_SDA_READ diff --git a/variants/esp32/m5stack_core/variant.h b/variants/esp32/m5stack_core/variant.h index 72aeb160e..cf741efe3 100644 --- a/variants/esp32/m5stack_core/variant.h +++ b/variants/esp32/m5stack_core/variant.h @@ -34,11 +34,13 @@ #define GPS_RX_PIN 16 #define GPS_TX_PIN 17 +#define ILI9341_DRIVER #define TFT_HEIGHT 240 #define TFT_WIDTH 320 #define TFT_OFFSET_X 0 #define TFT_OFFSET_Y 0 #define TFT_BUSY -1 +#define USE_TFTDISPLAY 1 // LCD screens are slow, so slowdown the wipe so it looks better #define SCREEN_TRANSITION_FRAMERATE 1 // fps diff --git a/variants/esp32/wiphone/variant.h b/variants/esp32/wiphone/variant.h index 70973db16..619ac622a 100644 --- a/variants/esp32/wiphone/variant.h +++ b/variants/esp32/wiphone/variant.h @@ -34,6 +34,7 @@ #define ST7789_SCK 18 #define ST7789_CS 5 #define ST7789_RS 26 +#define USE_TFTDISPLAY 1 // I don't have a 'wiphone' but this I think should not be defined this way (don't set TFT_BL if we don't have a hw way to control // it) // #define ST7789_BL -1 // EXTENDER_PIN(9) diff --git a/variants/esp32s3/hackaday-communicator/variant.h b/variants/esp32s3/hackaday-communicator/variant.h index ccd9d3edb..a127f548f 100644 --- a/variants/esp32s3/hackaday-communicator/variant.h +++ b/variants/esp32s3/hackaday-communicator/variant.h @@ -10,6 +10,7 @@ #define HAS_SCREEN 1 #define TFT_BLACK 0 #define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness +#define USE_TFTDISPLAY 1 #define USE_POWERSAVE #define SLEEP_TIME 120 diff --git a/variants/esp32s3/heltec_v4/variant.h b/variants/esp32s3/heltec_v4/variant.h index 72bbf14fc..6524bbc72 100644 --- a/variants/esp32s3/heltec_v4/variant.h +++ b/variants/esp32s3/heltec_v4/variant.h @@ -34,6 +34,9 @@ #define LORA_PA_EN 2 #define LORA_PA_TX_EN 46 // enable tx +#if HAS_TFT +#define USE_TFTDISPLAY 1 +#endif /* * GPS pins */ diff --git a/variants/esp32s3/heltec_wireless_tracker/variant.h b/variants/esp32s3/heltec_wireless_tracker/variant.h index 79fa0e801..3b19f5afd 100644 --- a/variants/esp32s3/heltec_wireless_tracker/variant.h +++ b/variants/esp32s3/heltec_wireless_tracker/variant.h @@ -27,6 +27,7 @@ #define TFT_OFFSET_Y -1 #define SCREEN_TRANSITION_FRAMERATE 3 // fps #define DISPLAY_FORCE_SMALL_FONTS +#define USE_TFTDISPLAY 1 // pin 3 is Vext on v1.1 - HIGH enables LDO for Vext rail which goes to: // GPS UC6580: GPS V_DET(8), VDD_IO(7), DCDC_IN(21), pulls up RESETN(17), D_SEL(33) and BOOT_MODE(34) through 10kR diff --git a/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h b/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h index cd76bb604..df5ab4716 100644 --- a/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h +++ b/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h @@ -28,6 +28,7 @@ #define SCREEN_TRANSITION_FRAMERATE 3 // fps #define DISPLAY_FORCE_SMALL_FONTS #define FORCE_LOW_RES 1 +#define USE_TFTDISPLAY 1 #define VEXT_ENABLE Vext // active low, powers the oled display and the lora antenna boost #define VEXT_ON_VALUE LOW diff --git a/variants/esp32s3/heltec_wireless_tracker_v2/variant.h b/variants/esp32s3/heltec_wireless_tracker_v2/variant.h index 9ac064ea2..0ce6b3e00 100644 --- a/variants/esp32s3/heltec_wireless_tracker_v2/variant.h +++ b/variants/esp32s3/heltec_wireless_tracker_v2/variant.h @@ -27,6 +27,7 @@ #define TFT_INVERT false #define SCREEN_TRANSITION_FRAMERATE 3 // fps #define DISPLAY_FORCE_SMALL_FONTS +#define USE_TFTDISPLAY 1 #define VEXT_ENABLE 3 // active HIGH - powers the GPS, GPS LNA and OLED #define VEXT_ON_VALUE HIGH diff --git a/variants/esp32s3/picomputer-s3/variant.h b/variants/esp32s3/picomputer-s3/variant.h index 8252e841c..275da1b61 100644 --- a/variants/esp32s3/picomputer-s3/variant.h +++ b/variants/esp32s3/picomputer-s3/variant.h @@ -32,6 +32,7 @@ #define ST7789_CS 6 #define ST7789_RS 1 #define ST7789_BL 5 +#define USE_TFTDISPLAY 1 #define ST7789_RESET -1 #define ST7789_MISO -1 diff --git a/variants/esp32s3/seeed-sensecap-indicator/variant.h b/variants/esp32s3/seeed-sensecap-indicator/variant.h index 8915395f3..f946528ae 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/variant.h +++ b/variants/esp32s3/seeed-sensecap-indicator/variant.h @@ -37,6 +37,7 @@ #define TFT_BL 45 #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 // fps +#define USE_TFTDISPLAY 1 #define HAS_TOUCHSCREEN 1 #define SCREEN_TOUCH_INT (6 | IO_EXPANDER) diff --git a/variants/esp32s3/t-deck/variant.h b/variants/esp32s3/t-deck/variant.h index 9b0de631a..ece0cdeaf 100644 --- a/variants/esp32s3/t-deck/variant.h +++ b/variants/esp32s3/t-deck/variant.h @@ -22,6 +22,7 @@ #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 #define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness +#define USE_TFTDISPLAY 1 #define HAS_TOUCHSCREEN 1 #define SCREEN_TOUCH_INT 16 diff --git a/variants/esp32s3/t-watch-s3/variant.h b/variants/esp32s3/t-watch-s3/variant.h index 578c23c0a..86b0a03c8 100644 --- a/variants/esp32s3/t-watch-s3/variant.h +++ b/variants/esp32s3/t-watch-s3/variant.h @@ -18,6 +18,7 @@ #define TFT_OFFSET_ROTATION 2 #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 // fps +#define USE_TFTDISPLAY 1 #define HAS_TOUCHSCREEN 1 #define SCREEN_TOUCH_INT 16 diff --git a/variants/esp32s3/tlora-pager/variant.h b/variants/esp32s3/tlora-pager/variant.h index 2875f6804..fe563cded 100644 --- a/variants/esp32s3/tlora-pager/variant.h +++ b/variants/esp32s3/tlora-pager/variant.h @@ -20,6 +20,7 @@ #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 #define BRIGHTNESS_DEFAULT 130 // Medium Low Brightness +#define USE_TFTDISPLAY 1 #define I2C_SDA SDA #define I2C_SCL SCL diff --git a/variants/esp32s3/tracksenger/internal/variant.h b/variants/esp32s3/tracksenger/internal/variant.h index 6f75ad0e2..2287dfe0b 100644 --- a/variants/esp32s3/tracksenger/internal/variant.h +++ b/variants/esp32s3/tracksenger/internal/variant.h @@ -28,6 +28,7 @@ #define TFT_OFFSET_Y -1 #define SCREEN_TRANSITION_FRAMERATE 3 // fps #define DISPLAY_FORCE_SMALL_FONTS +#define USE_TFTDISPLAY 1 #define VEXT_ENABLE 3 // active HIGH, powers the lora antenna boost #define VEXT_ON_VALUE HIGH diff --git a/variants/esp32s3/tracksenger/lcd/variant.h b/variants/esp32s3/tracksenger/lcd/variant.h index 843bf3924..f42a5b19f 100644 --- a/variants/esp32s3/tracksenger/lcd/variant.h +++ b/variants/esp32s3/tracksenger/lcd/variant.h @@ -16,6 +16,7 @@ #define ST7789_CS 38 #define ST7789_RS 40 #define ST7789_BL 21 +#define USE_TFTDISPLAY 1 // P#define TFT_BL 21 /* V1.1 PCB marking */ #define ST7789_RESET -1 diff --git a/variants/esp32s3/unphone/variant.h b/variants/esp32s3/unphone/variant.h index 366b49233..6f0710d62 100644 --- a/variants/esp32s3/unphone/variant.h +++ b/variants/esp32s3/unphone/variant.h @@ -36,6 +36,7 @@ #define TFT_INVERT false #define SCREEN_ROTATE true #define SCREEN_TRANSITION_FRAMERATE 5 +#define USE_TFTDISPLAY 1 #define HAS_TOUCHSCREEN 1 #define USE_XPT2046 1 diff --git a/variants/native/portduino-buildroot/variant.h b/variants/native/portduino-buildroot/variant.h index 3e91c6820..affd83051 100644 --- a/variants/native/portduino-buildroot/variant.h +++ b/variants/native/portduino-buildroot/variant.h @@ -1,4 +1,5 @@ #define HAS_SCREEN 1 +#define USE_TFTDISPLAY 1 #define CANNED_MESSAGE_MODULE_ENABLE 1 #define HAS_GPS 1 #define MAX_RX_TOPHONE portduino_config.maxtophone diff --git a/variants/native/portduino/variant.h b/variants/native/portduino/variant.h index af05fcf8d..972443450 100644 --- a/variants/native/portduino/variant.h +++ b/variants/native/portduino/variant.h @@ -1,6 +1,7 @@ #ifndef HAS_SCREEN #define HAS_SCREEN 1 #endif +#define USE_TFTDISPLAY 1 #define CANNED_MESSAGE_MODULE_ENABLE 1 #define HAS_GPS 1 #define MAX_RX_TOPHONE portduino_config.maxtophone diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index c95d477f9..868c17143 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -8,9 +8,7 @@ build_type = release build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/rak4631 -D RAK_4631 - -DEINK_DISPLAY_MODEL=GxEPD2_213_BN - -DEINK_WIDTH=250 - -DEINK_HEIGHT=122 + -DMESHTASTIC_USE_EINK_UI=0 -DRADIOLIB_EXCLUDE_SX128X=1 -DRADIOLIB_EXCLUDE_SX127X=1 -DRADIOLIB_EXCLUDE_LR11X0=1 @@ -30,7 +28,10 @@ build_src_filter = ${nrf52_base.build_src_filter} \ +<../variants/nrf52840/rak4631> \ + \ + \ - + + + \ + - \ + - \ + - lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} diff --git a/variants/nrf52840/rak_wismeshtap/variant.h b/variants/nrf52840/rak_wismeshtap/variant.h index f961ddf6e..a7b9290a5 100644 --- a/variants/nrf52840/rak_wismeshtap/variant.h +++ b/variants/nrf52840/rak_wismeshtap/variant.h @@ -300,6 +300,7 @@ SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG #define SPI_FREQUENCY 50000000 #define TFT_SPI_PORT SPI1 #define ST7789_CS WB_SPI_CS // Adds compatibility with the rest of the checking for a ST7789 TFT. +#define USE_TFTDISPLAY 1 #define SCREEN_ROTATE #define SCREEN_TRANSITION_FRAMERATE 5 From a11152e54512aaeb53ba54fbd82f63f8f224c727 Mon Sep 17 00:00:00 2001 From: rbomze <14312790+rbomze@users.noreply.github.com> Date: Tue, 2 Dec 2025 01:21:49 +0000 Subject: [PATCH 211/286] Commented out the definition of BATTERY_LPCOMP_INPUT in the Helltec T114 variant, due to power leakage of 2.9mA in off state. See bug #8801 (#8800) Co-authored-by: Ben Meadors --- variants/nrf52840/heltec_mesh_node_t114/variant.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index 3493577bc..28404fcce 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -211,7 +211,8 @@ No longer populated on PCB #define ADC_MULTIPLIER (4.916F) // rf52840 AIN2 = Pin 4 -#define BATTERY_LPCOMP_INPUT NRF_LPCOMP_INPUT_2 +// commented out due to power leakage of 2.9mA in shutdown state see reported issue #8801 +// #define BATTERY_LPCOMP_INPUT NRF_LPCOMP_INPUT_2 //UNSAFE // We have AIN2 with a VBAT divider so AIN2 = VBAT * (100/490) // We have the device going deep sleep under 3.1V, which is AIN2 = 0.63V From f3e38a425fc75313470b3f84d325f91369932218 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 19:31:58 -0600 Subject: [PATCH 212/286] Automated version bumps (#8786) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- bin/org.meshtastic.meshtasticd.metainfo.xml | 3 +++ debian/changelog | 6 ++++++ version.properties | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml index 243edca0c..140ac3e2a 100644 --- a/bin/org.meshtastic.meshtasticd.metainfo.xml +++ b/bin/org.meshtastic.meshtasticd.metainfo.xml @@ -87,6 +87,9 @@ + + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.17 + https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.16 diff --git a/debian/changelog b/debian/changelog index 5a0f543eb..b9212c1be 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +meshtasticd (2.7.17.0) unstable; urgency=medium + + * Version 2.7.17 + + -- GitHub Actions Fri, 28 Nov 2025 15:11:34 +0000 + meshtasticd (2.7.16.0) unstable; urgency=medium * Version 2.7.16 diff --git a/version.properties b/version.properties index 05d8a493f..8e40687e9 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 2 minor = 7 -build = 16 \ No newline at end of file +build = 17 From 41cbd77db3d337aa357fd906ef8f41217a582897 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 2 Dec 2025 01:56:55 -0600 Subject: [PATCH 213/286] Move everything from /arch to /variant (#8831) --- platformio.ini | 2 +- {arch => variants}/esp32/esp32.ini | 0 {arch/esp32 => variants/esp32c3}/esp32c3.ini | 0 {arch/esp32 => variants/esp32c6}/esp32c6.ini | 0 {arch/esp32 => variants/esp32s2}/esp32s2.ini | 0 {arch/esp32 => variants/esp32s3}/esp32s3.ini | 0 {arch/portduino => variants/native}/portduino.ini | 0 {arch/nrf52 => variants/nrf52840}/cpp_overrides/lfs_util.h | 0 {arch/nrf52 => variants/nrf52840}/nrf52.ini | 2 +- {arch/nrf52 => variants/nrf52840}/nrf52832.ini | 0 {arch/nrf52 => variants/nrf52840}/nrf52840.ini | 0 {arch/rp2xx0 => variants/rp2040}/rp2040.ini | 0 {arch/rp2xx0 => variants/rp2350}/rp2350.ini | 0 {arch => variants}/stm32/stm32.ini | 0 14 files changed, 2 insertions(+), 2 deletions(-) rename {arch => variants}/esp32/esp32.ini (100%) rename {arch/esp32 => variants/esp32c3}/esp32c3.ini (100%) rename {arch/esp32 => variants/esp32c6}/esp32c6.ini (100%) rename {arch/esp32 => variants/esp32s2}/esp32s2.ini (100%) rename {arch/esp32 => variants/esp32s3}/esp32s3.ini (100%) rename {arch/portduino => variants/native}/portduino.ini (100%) rename {arch/nrf52 => variants/nrf52840}/cpp_overrides/lfs_util.h (100%) rename {arch/nrf52 => variants/nrf52840}/nrf52.ini (96%) rename {arch/nrf52 => variants/nrf52840}/nrf52832.ini (100%) rename {arch/nrf52 => variants/nrf52840}/nrf52840.ini (100%) rename {arch/rp2xx0 => variants/rp2040}/rp2040.ini (100%) rename {arch/rp2xx0 => variants/rp2350}/rp2350.ini (100%) rename {arch => variants}/stm32/stm32.ini (100%) diff --git a/platformio.ini b/platformio.ini index 5b9d965ef..9b8d0a124 100644 --- a/platformio.ini +++ b/platformio.ini @@ -5,7 +5,7 @@ default_envs = tbeam extra_configs = - arch/*/*.ini + variants/*/*.ini variants/*/*/platformio.ini variants/*/diy/*/platformio.ini src/graphics/niche/InkHUD/PlatformioConfig.ini diff --git a/arch/esp32/esp32.ini b/variants/esp32/esp32.ini similarity index 100% rename from arch/esp32/esp32.ini rename to variants/esp32/esp32.ini diff --git a/arch/esp32/esp32c3.ini b/variants/esp32c3/esp32c3.ini similarity index 100% rename from arch/esp32/esp32c3.ini rename to variants/esp32c3/esp32c3.ini diff --git a/arch/esp32/esp32c6.ini b/variants/esp32c6/esp32c6.ini similarity index 100% rename from arch/esp32/esp32c6.ini rename to variants/esp32c6/esp32c6.ini diff --git a/arch/esp32/esp32s2.ini b/variants/esp32s2/esp32s2.ini similarity index 100% rename from arch/esp32/esp32s2.ini rename to variants/esp32s2/esp32s2.ini diff --git a/arch/esp32/esp32s3.ini b/variants/esp32s3/esp32s3.ini similarity index 100% rename from arch/esp32/esp32s3.ini rename to variants/esp32s3/esp32s3.ini diff --git a/arch/portduino/portduino.ini b/variants/native/portduino.ini similarity index 100% rename from arch/portduino/portduino.ini rename to variants/native/portduino.ini diff --git a/arch/nrf52/cpp_overrides/lfs_util.h b/variants/nrf52840/cpp_overrides/lfs_util.h similarity index 100% rename from arch/nrf52/cpp_overrides/lfs_util.h rename to variants/nrf52840/cpp_overrides/lfs_util.h diff --git a/arch/nrf52/nrf52.ini b/variants/nrf52840/nrf52.ini similarity index 96% rename from arch/nrf52/nrf52.ini rename to variants/nrf52840/nrf52.ini index e60d47ce7..2904f770e 100644 --- a/arch/nrf52/nrf52.ini +++ b/variants/nrf52840/nrf52.ini @@ -13,7 +13,7 @@ platform_packages = build_type = debug build_flags = - -include arch/nrf52/cpp_overrides/lfs_util.h + -include variants/nrf52840/cpp_overrides/lfs_util.h ${arduino_base.build_flags} -DSERIAL_BUFFER_SIZE=1024 -Wno-unused-variable diff --git a/arch/nrf52/nrf52832.ini b/variants/nrf52840/nrf52832.ini similarity index 100% rename from arch/nrf52/nrf52832.ini rename to variants/nrf52840/nrf52832.ini diff --git a/arch/nrf52/nrf52840.ini b/variants/nrf52840/nrf52840.ini similarity index 100% rename from arch/nrf52/nrf52840.ini rename to variants/nrf52840/nrf52840.ini diff --git a/arch/rp2xx0/rp2040.ini b/variants/rp2040/rp2040.ini similarity index 100% rename from arch/rp2xx0/rp2040.ini rename to variants/rp2040/rp2040.ini diff --git a/arch/rp2xx0/rp2350.ini b/variants/rp2350/rp2350.ini similarity index 100% rename from arch/rp2xx0/rp2350.ini rename to variants/rp2350/rp2350.ini diff --git a/arch/stm32/stm32.ini b/variants/stm32/stm32.ini similarity index 100% rename from arch/stm32/stm32.ini rename to variants/stm32/stm32.ini From 525c048354a77931b0786b363b10733079407a51 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 2 Dec 2025 05:46:24 -0600 Subject: [PATCH 214/286] Move device specific OCV curves to their respective device.h (#8834) --- src/power.h | 13 +------------ variants/nrf52840/heltec_mesh_pocket/variant.h | 6 ++++++ variants/nrf52840/rak_wismeshtag/variant.h | 1 + variants/nrf52840/seeed_solar_node/variant.h | 1 + .../nrf52840/seeed_wio_tracker_L1_eink/variant.h | 2 ++ variants/nrf52840/tracker-t1000-e/variant.h | 2 ++ 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/power.h b/src/power.h index 3f28dedb2..c826d98b4 100644 --- a/src/power.h +++ b/src/power.h @@ -13,6 +13,7 @@ #define NUM_OCV_POINTS 11 #endif +// Device specific curves go in variant.h #ifndef OCV_ARRAY #ifdef CELL_TYPE_LIFEPO4 #define OCV_ARRAY 3400, 3350, 3320, 3290, 3270, 3260, 3250, 3230, 3200, 3120, 3000 @@ -24,18 +25,6 @@ #define OCV_ARRAY 1400, 1300, 1280, 1270, 1260, 1250, 1240, 1230, 1210, 1150, 1000 #elif defined(CELL_TYPE_LTO) #define OCV_ARRAY 2700, 2560, 2540, 2520, 2500, 2460, 2420, 2400, 2380, 2320, 1500 -#elif defined(TRACKER_T1000_E) -#define OCV_ARRAY 4190, 4042, 3957, 3885, 3820, 3776, 3746, 3725, 3696, 3644, 3100 -#elif defined(HELTEC_MESH_POCKET_BATTERY_5000) -#define OCV_ARRAY 4300, 4240, 4120, 4000, 3888, 3800, 3740, 3698, 3655, 3580, 3400 -#elif defined(HELTEC_MESH_POCKET_BATTERY_10000) -#define OCV_ARRAY 4100, 4060, 3960, 3840, 3729, 3625, 3550, 3500, 3420, 3345, 3100 -#elif defined(SEEED_WIO_TRACKER_L1) -#define OCV_ARRAY 4200, 3876, 3826, 3763, 3713, 3660, 3573, 3485, 3422, 3359, 3300 -#elif defined(SEEED_SOLAR_NODE) -#define OCV_ARRAY 4200, 3986, 3922, 3812, 3734, 3645, 3527, 3420, 3281, 3087, 2786 -#elif defined(WISMESH_TAG) -#define OCV_ARRAY 4240, 4112, 4029, 3970, 3906, 3846, 3824, 3802, 3776, 3650, 3072 #else // LiIon #define OCV_ARRAY 4190, 4050, 3990, 3890, 3800, 3720, 3630, 3530, 3420, 3300, 3100 #endif diff --git a/variants/nrf52840/heltec_mesh_pocket/variant.h b/variants/nrf52840/heltec_mesh_pocket/variant.h index e765dab66..f4f695b34 100644 --- a/variants/nrf52840/heltec_mesh_pocket/variant.h +++ b/variants/nrf52840/heltec_mesh_pocket/variant.h @@ -122,6 +122,12 @@ No longer populated on PCB #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 #define ADC_MULTIPLIER (4.6425F) +#if defined(HELTEC_MESH_POCKET_BATTERY_5000) +#define OCV_ARRAY 4300, 4240, 4120, 4000, 3888, 3800, 3740, 3698, 3655, 3580, 3400 +#elif defined(HELTEC_MESH_POCKET_BATTERY_10000) +#define OCV_ARRAY 4100, 4060, 3960, 3840, 3729, 3625, 3550, 3500, 3420, 3345, 3100 +#endif + #undef HAS_GPS #define HAS_GPS 0 #define HAS_RTC 0 diff --git a/variants/nrf52840/rak_wismeshtag/variant.h b/variants/nrf52840/rak_wismeshtag/variant.h index eba910dc1..159cabf07 100644 --- a/variants/nrf52840/rak_wismeshtag/variant.h +++ b/variants/nrf52840/rak_wismeshtag/variant.h @@ -230,6 +230,7 @@ SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG #define AREF_VOLTAGE 3.0 #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 #define ADC_MULTIPLIER 1.73 +#define OCV_ARRAY 4240, 4112, 4029, 3970, 3906, 3846, 3824, 3802, 3776, 3650, 3072 #define RAK_4631 1 diff --git a/variants/nrf52840/seeed_solar_node/variant.h b/variants/nrf52840/seeed_solar_node/variant.h index da89fcfa5..7b7738547 100644 --- a/variants/nrf52840/seeed_solar_node/variant.h +++ b/variants/nrf52840/seeed_solar_node/variant.h @@ -110,6 +110,7 @@ static const uint8_t SCL = PIN_WIRE_SCL; #define ADC_MULTIPLIER 3.3 #define BATTERY_PIN PIN_VBAT // PIN_A7 #define AREF_VOLTAGE 3.3 +#define OCV_ARRAY 4200, 3986, 3922, 3812, 3734, 3645, 3527, 3420, 3281, 3087, 2786 // â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” // GPS L76KB // â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” diff --git a/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h b/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h index f33d200b1..09fefc7f2 100644 --- a/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h +++ b/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h @@ -122,6 +122,8 @@ static const uint8_t SCL = PIN_WIRE_SCL; #define ADC_MULTIPLIER 2.0 #define BATTERY_PIN PIN_VBAT // PIN_A7 #define AREF_VOLTAGE 3.6 +#define OCV_ARRAY 4200, 3876, 3826, 3763, 3713, 3660, 3573, 3485, 3422, 3359, 3300 + // â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” // GPS L76KB // â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” diff --git a/variants/nrf52840/tracker-t1000-e/variant.h b/variants/nrf52840/tracker-t1000-e/variant.h index 403552ec0..5b6719e12 100644 --- a/variants/nrf52840/tracker-t1000-e/variant.h +++ b/variants/nrf52840/tracker-t1000-e/variant.h @@ -142,6 +142,8 @@ extern "C" { #define AREF_VOLTAGE 3.0 #define VBAT_AR_INTERNAL AR_INTERNAL_3_0 +#define OCV_ARRAY 4190, 4042, 3957, 3885, 3820, 3776, 3746, 3725, 3696, 3644, 3100 + // Buzzer #define BUZZER_EN_PIN (32 + 5) // P1.05, always high #define PIN_BUZZER (0 + 25) // P0.25, pwm output From 8a437415894db7c186a90cdd0b149cbd8c2dc9ee Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 2 Dec 2025 05:48:19 -0600 Subject: [PATCH 215/286] Add 'cleanup' to required PR labels (#8835) --- .github/workflows/pr_enforce_labels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr_enforce_labels.yml b/.github/workflows/pr_enforce_labels.yml index 543e23558..d60c9c8ca 100644 --- a/.github/workflows/pr_enforce_labels.yml +++ b/.github/workflows/pr_enforce_labels.yml @@ -17,7 +17,7 @@ jobs: with: script: | const labels = context.payload.pull_request.labels.map(label => label.name); - const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk']; + const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk', 'cleanup']; const hasRequiredLabel = labels.some(label => requiredLabels.includes(label)); if (!hasRequiredLabel) { core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`); From 90584359e49e37c99b6132d95a0d5f87030c45a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 05:48:36 -0600 Subject: [PATCH 216/286] Upgrade trunk (#8836) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 342d9d4a2..d8fad73c6 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,7 +9,7 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.27.1 + - renovate@42.29.4 - prettier@3.7.3 - trufflehog@3.91.1 - yamllint@1.37.1 From 61e41a8beb3add9a5acd1e7e45701a6f16692075 Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Tue, 2 Dec 2025 11:59:05 -0800 Subject: [PATCH 217/286] Don't scale up the frequency of telemetry sending (#8664) --- src/mesh/Default.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/mesh/Default.h b/src/mesh/Default.h index 218d8d0fb..a60e3af9b 100644 --- a/src/mesh/Default.h +++ b/src/mesh/Default.h @@ -57,14 +57,7 @@ class Default // Note: Kept as uint32_t to match the public API parameter type static float congestionScalingCoefficient(uint32_t numOnlineNodes) { - // Increase frequency of broadcasts for small networks regardless of preset - if (numOnlineNodes <= 10) { - return 0.6; - } else if (numOnlineNodes <= 20) { - return 0.7; - } else if (numOnlineNodes <= 30) { - return 0.8; - } else if (numOnlineNodes <= 40) { + if (numOnlineNodes <= 40) { return 1.0; } else { float throttlingFactor = 0.075; From 0828c445fba9d7d287809bb3c52eac523a9e54fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 05:39:31 -0600 Subject: [PATCH 218/286] Update actions/stale action to v10.1.1 (#8848) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/stale_bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale_bot.yml b/.github/workflows/stale_bot.yml index 11ba59386..fc0702bd8 100644 --- a/.github/workflows/stale_bot.yml +++ b/.github/workflows/stale_bot.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Stale PR+Issues - uses: actions/stale@v10.1.0 + uses: actions/stale@v10.1.1 with: days-before-stale: 45 stale-issue-message: This issue has not had any comment or update in the last month. If it is still relevant, please post update comments. If no comments are made, this issue will be closed automagically in 7 days. From 1b4925bd07b52d3085c56b88831f9d9068fc1b37 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:50:50 -0600 Subject: [PATCH 219/286] Upgrade trunk (#8849) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index d8fad73c6..95e5b0dd2 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,9 +9,9 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.29.4 - - prettier@3.7.3 - - trufflehog@3.91.1 + - renovate@42.30.4 + - prettier@3.7.4 + - trufflehog@3.91.2 - yamllint@1.37.1 - bandit@1.9.2 - trivy@0.67.2 From 3f4091622387ee64a08d0cce6ff5c393e713dda1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:30:09 -0600 Subject: [PATCH 220/286] Update alpine Docker tag to v3.23 (#8853) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- alpine.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alpine.Dockerfile b/alpine.Dockerfile index bdee57d79..b3b384101 100644 --- a/alpine.Dockerfile +++ b/alpine.Dockerfile @@ -28,7 +28,7 @@ RUN bash ./bin/build-native.sh "$PIO_ENV" && \ # ##### PRODUCTION BUILD ############# -FROM alpine:3.22 +FROM alpine:3.23 LABEL org.opencontainers.image.title="Meshtastic" \ org.opencontainers.image.description="Alpine Meshtastic daemon" \ org.opencontainers.image.url="https://meshtastic.org" \ From aa85fbbcc481516e2da2ff9744daff30b97a121f Mon Sep 17 00:00:00 2001 From: Tom <116762865+NomDeTom@users.noreply.github.com> Date: Thu, 4 Dec 2025 19:35:50 +0000 Subject: [PATCH 221/286] Promicro documentation update (#8864) * Delete variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf remove old file * Add updated schematic * Update GPS TX and RX pin definitions after swap * Update GPS pin definitions and schematic link Updated the schematic link to reflect GPS pin definition changes. --- ...chematic_Pro-micro_Pinouts_2025-12-04.pdf} | 6302 ++++++++++------- .../diy/nrf52_promicro_diy_tcxo/readme.md | 4 +- .../diy/nrf52_promicro_diy_tcxo/variant.h | 8 +- 3 files changed, 3561 insertions(+), 2753 deletions(-) rename variants/nrf52840/diy/nrf52_promicro_diy_tcxo/{Schematic_Pro-Micro_Pinouts.pdf => Schematic_Pro-micro_Pinouts_2025-12-04.pdf} (82%) diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-micro_Pinouts_2025-12-04.pdf similarity index 82% rename from variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-micro_Pinouts_2025-12-04.pdf index 63a80dbbe..6fb9c11c6 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts.pdf +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-micro_Pinouts_2025-12-04.pdf @@ -10,7 +10,7 @@ endobj 4 0 obj << -/Length 334350 +/Length 339732 >> stream 0.14 w @@ -364,14 +364,6 @@ BT /F2 9.818181818181817 Tf 10.80 TL 0.000 0.000 0.502 rg -730.08 129.04 Td -(2025-11-08) Tj -ET -7.20 w -BT -/F2 9.818181818181817 Tf -10.80 TL -0.000 0.000 0.502 rg 730.08 114.64 Td (2025-11-07) Tj ET @@ -4753,64 +4745,6 @@ ET 0.63 0.00 0.00 RG 0.00 g [] 0 d -370.080 1068.480 m -366.480 1064.880 l -355.680 1064.880 l -355.680 1072.080 l -366.480 1072.080 l -370.080 1068.480 l -S -1 J -1 j -0.72 w -0.63 0.00 0.00 RG -[] 0 d -370.080 1068.480 m -370.080 1068.480 l -S -7.20 w -BT -/F2 6.545454545454544 Tf -7.20 TL -0.000 0.000 1.000 rg -332.05 1065.61 Td -(GPSTX) Tj -ET -1 J -1 j -0.72 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d -370.080 1075.680 m -366.480 1072.080 l -355.680 1072.080 l -355.680 1079.280 l -366.480 1079.280 l -370.080 1075.680 l -S -1 J -1 j -0.72 w -0.63 0.00 0.00 RG -[] 0 d -370.080 1075.680 m -370.080 1075.680 l -S -7.20 w -BT -/F2 6.545454545454544 Tf -7.20 TL -0.000 0.000 1.000 rg -331.32 1072.81 Td -(GPSRX) Tj -ET -1 J -1 j -0.72 w -0.63 0.00 0.00 RG -0.00 g -[] 0 d 370.080 1061.280 m 366.480 1057.680 l 355.680 1057.680 l @@ -16535,27 +16469,27 @@ ET 0.63 0.00 0.00 RG 0.00 g [] 0 d -85.680 1075.680 m +85.680 1068.480 m 82.080 1072.080 l 71.280 1072.080 l -71.280 1079.280 l -82.080 1079.280 l -85.680 1075.680 l +71.280 1064.880 l +82.080 1064.880 l +85.680 1068.480 l S 1 J 1 j 0.72 w 0.63 0.00 0.00 RG [] 0 d -85.680 1075.680 m -85.680 1075.680 l +85.680 1068.480 m +85.680 1068.480 l S 7.20 w BT /F2 6.545454545454544 Tf 7.20 TL 0.000 0.000 1.000 rg -46.92 1072.81 Td +46.92 1066.77 Td (GPSRX) Tj ET 1 J @@ -16564,27 +16498,27 @@ ET 0.63 0.00 0.00 RG 0.00 g [] 0 d -85.680 1068.480 m -82.080 1064.880 l -71.280 1064.880 l +85.680 1075.680 m +82.080 1079.280 l +71.280 1079.280 l 71.280 1072.080 l 82.080 1072.080 l -85.680 1068.480 l +85.680 1075.680 l S 1 J 1 j 0.72 w 0.63 0.00 0.00 RG [] 0 d -85.680 1068.480 m -85.680 1068.480 l +85.680 1075.680 m +85.680 1075.680 l S 7.20 w BT /F2 6.545454545454544 Tf 7.20 TL 0.000 0.000 1.000 rg -47.65 1065.61 Td +47.65 1073.97 Td (GPSTX) Tj ET 1 J @@ -17606,7 +17540,7 @@ ET 0 j 72 M 0.72 w -0.00 G +0.63 0.00 0.00 RG [] 0 d 35.28 476.64 777.60 -208.80 re S @@ -19796,42 +19730,6 @@ S 0.00 0.53 0.00 RG 0.00 g [] 0 d -85.680 1075.680 m -96.480 1075.680 l -S -1 J -1 j -0.72 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -85.680 1075.680 m -96.480 1075.680 l -S -1 J -1 j -0.72 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -85.680 1068.480 m -96.480 1068.480 l -S -1 J -1 j -0.72 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d -85.680 1068.480 m -96.480 1068.480 l -S -1 J -1 j -0.72 w -0.00 0.53 0.00 RG -0.00 g -[] 0 d 85.680 1061.280 m 96.480 1061.280 l S @@ -27766,6 +27664,556 @@ BT 672.48 619.79 Td (E22P-915M30S) Tj ET +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1075.680 m +85.680 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1075.680 m +85.680 1075.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1068.480 m +85.680 1068.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +96.480 1068.480 m +85.680 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1068.480 m +366.480 1072.080 l +355.680 1072.080 l +355.680 1064.880 l +366.480 1064.880 l +370.080 1068.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1068.480 m +370.080 1068.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +331.32 1066.77 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +370.080 1075.680 m +366.480 1079.280 l +355.680 1079.280 l +355.680 1072.080 l +366.480 1072.080 l +370.080 1075.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +370.080 1075.680 m +370.080 1075.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +332.05 1073.97 Td +(GPSTX) Tj +ET +7.20 w +BT +/F2 8.181818181818182 Tf +9.00 TL +0.000 g +150.48 112.52 Td +(Example GNSS) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 60.480 m +229.680 56.880 l +240.480 56.880 l +240.480 64.080 l +229.680 64.080 l +226.080 60.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 60.480 m +226.080 60.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 57.61 Td +(GPSRX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 67.680 m +229.680 64.080 l +240.480 64.080 l +240.480 71.280 l +229.680 71.280 l +226.080 67.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 67.680 m +226.080 67.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +241.92 64.81 Td +(GPSTX) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 85.680 m +229.680 78.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +226.080 85.680 m +233.280 85.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 78.480 m +229.680 78.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 233.03 86.40 Tm +(VCC) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +229.680 42.480 m +229.680 49.680 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +223.200 42.480 m +236.160 42.480 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +225.360 41.040 m +234.000 41.040 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +227.520 39.600 m +231.840 39.600 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +0.00 g +[] 0 d +228.960 38.160 m +230.400 38.160 l +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +229.680 49.680 m +229.680 49.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 0.000 1.000 rg +0.00 1.00 -1.00 0.00 230.91 23.26 Tm +(GND) Tj +ET +7.20 w +BT +/F2 6.363634909090909 Tf +7.00 TL +0.627 0.000 0.000 rg +150.93 28.72 Td +(NEO-6M) Tj +ET +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +144.72 84.24 33.12 -43.20 re +S +q +1 0 0 1 177.84 51.12 cm +-0.0000 -1.0000 1.0000 -0.0000 0 0 cm +1 0 0 1 -33.12 -33.12 cm +43.20 0 0 33.12 0 0 cm +/I1 Do +Q +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +210.24 28.08 m 210.24 30.07 208.63 31.68 206.64 31.68 c +204.65 31.68 203.04 30.07 203.04 28.08 c +203.04 26.09 204.65 24.48 206.64 24.48 c +208.63 24.48 210.24 26.09 210.24 28.08 c +S +2 J +0 j +72 M +0.72 w +0.63 0.00 0.00 RG +[] 0 d +110.88 102.24 100.80 -79.20 re +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +210.24 97.20 m 210.24 99.19 208.63 100.80 206.64 100.80 c +204.65 100.80 203.04 99.19 203.04 97.20 c +203.04 95.21 204.65 93.60 206.64 93.60 c +208.63 93.60 210.24 95.21 210.24 97.20 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +119.52 28.08 m 119.52 30.07 117.91 31.68 115.92 31.68 c +113.93 31.68 112.32 30.07 112.32 28.08 c +112.32 26.09 113.93 24.48 115.92 24.48 c +117.91 24.48 119.52 26.09 119.52 28.08 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +119.52 97.20 m 119.52 99.19 117.91 100.80 115.92 100.80 c +113.93 100.80 112.32 99.19 112.32 97.20 c +112.32 95.21 113.93 93.60 115.92 93.60 c +117.91 93.60 119.52 95.21 119.52 97.20 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +119.88 36.00 m 119.88 36.99 119.07 37.80 118.08 37.80 c +117.09 37.80 116.28 36.99 116.28 36.00 c +116.28 35.01 117.09 34.20 118.08 34.20 c +119.07 34.20 119.88 35.01 119.88 36.00 c +S +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +200.16 95.04 m 200.16 97.43 198.23 99.36 195.84 99.36 c +193.45 99.36 191.52 97.43 191.52 95.04 c +191.52 92.65 193.45 90.72 195.84 90.72 c +198.23 90.72 200.16 92.65 200.16 95.04 c +S +7.20 w +BT +/F2 3.6363665454545444 Tf +4.00 TL +0.627 0.000 0.000 rg +178.56 94.04 Td +(Battery) Tj +ET +7.20 w +BT +/F2 3.6363665454545444 Tf +4.00 TL +0.627 0.000 0.000 rg +0.00 1.00 -1.00 0.00 119.00 39.48 Tm +(Antenna) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +194.98 50.99 Td +(GND) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.28 54.59 Td +(1) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 53.280 m +211.680 53.280 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +201.15 58.19 Td +(TX) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.28 61.79 Td +(2) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 60.480 m +211.680 60.480 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +200.43 65.39 Td +(RX) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.28 68.99 Td +(3) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 67.680 m +211.680 67.680 l +S +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +1.000 0.000 0.000 rg +195.70 72.59 Td +(VCC) Tj +ET +7.20 w +BT +/F2 6.545454545454544 Tf +7.20 TL +0.000 g +215.28 76.19 Td +(4) Tj +ET +1 J +1 j +0.72 w +0.63 0.00 0.00 RG +[] 0 d +226.080 74.880 m +211.680 74.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 78.480 m +229.680 74.880 l +S +229.680 74.880 m +226.080 74.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 78.480 m +229.680 74.880 l +S +229.680 74.880 m +226.080 74.880 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 49.680 m +229.680 53.280 l +S +229.680 53.280 m +226.080 53.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +229.680 49.680 m +229.680 53.280 l +S +229.680 53.280 m +226.080 53.280 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 67.680 m +226.080 67.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 67.680 m +226.080 67.680 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 60.480 m +226.080 60.480 l +S +1 J +1 j +0.72 w +0.00 0.53 0.00 RG +0.00 g +[] 0 d +226.080 60.480 m +226.080 60.480 l +S +7.20 w +BT +/F2 10.307802433786685 Tf +11.34 TL +0.000 g +730.08 127.34 Td +(2025-12-04) Tj +ET 0.80 0.00 0.00 rg 656.28 233.28 m 656.28 234.27 655.47 235.08 654.48 235.08 c 653.49 235.08 652.68 234.27 652.68 233.28 c @@ -28290,6 +28738,294 @@ stream xíÔ€ ú?º†#Ø j]€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„ Âa€0@˜ L&„== endstream endobj +12 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 645 +/Height 455 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/Length 67274 +/Filter /DCTDecode +>> +stream +ÿØÿàJFIFHHÿá¤ExifMM* +† Œ–ž(1¦2®BC‡iÂAppleiPhone 8HH11.2.62018:03:08 17:52:25‚š<‚Dˆ"ˆ'd0221L`‘’ +t’|’ +„’ +Œ’’ ’ +”’œ’|°¤’‘884’’884 0100 … Ç¢£¤¤¤¤¤2T¤3t¤4"z 2018:03:08 17:52:252018:03:08 17:52:25 oùÿÿö×odßç©2Apple iOSMM  .ìh  ¥ ¢  +‚ +š        ª bplist00O%&*07:33-0)+"ü ##&()ïøÿ ! + äìõó÷ýøø÷ÝãçæÝ+NO‹àìñûüÐÜÚ×Â_D@^´áææ÷ùM·Îζ?ntHqèÖÙãèð s¼®@ñY]²ÇÍ×àß4Šb j¦ Œ½ÄÌÑÑ M<!º#żÁÇÈÉ 4Ú% —ͱ·»½¾"'Mƒ¯­­²¸½!"/<Cs¡¯°µº#Ew«2()‰®±±'" N¤°p bplist00ÔUflagsUvalueYtimescaleUepoch£|¤3”;šÊ'-/8= ?ÿÿþ¯`MÍmeÿÿÝy!ÐÓw€q825sdd  AppleiPhone 8 back camera 3.99mm f/1.8ÿá +http://ns.adobe.com/xap/1.0/ ÿí8Photoshop 3.08BIM8BIM%ÔŒÙ²é€ ˜ìøB~ÿâ4ICC_PROFILE$applmntrRGB XYZ á  acspAPPLAPPLöÖÓ-applÊ•‚%M8™ÕÑê‚ +descüecprtd#wtptˆrXYZœgXYZ°bXYZÄrTRCØ chadø,bTRCØ gTRCØ desc Display P3textCopyright Apple Inc., 2017XYZ óQÌXYZ ƒß=¿ÿÿÿ»XYZ J¿±7 +¹XYZ (8 ȹparaffò§ YÐ +[sf32 BÞÿÿó&“ýÿÿû¢ÿÿý£ÜÀnÿÀÇ…"ÿÄ + ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ + ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ +$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÛC ÿÛC  ÿÝ)ÿÚ ?þ·c¯Ø·À?ü jfÓ×í²"HLƒ,¤ŒŸ¥}ý ¢ˆà‰Tc°o^(Xÿüß…Ilz±2“ÕŒWe»ÆsRù~Ô˜¥uò3 ‘çÒîzTø­8FiÆ›eE®¥cŽÃÆa½E^òÿÏù5 Âç•✨³E$UÉ +™Jƒó©¼³Œ@™¨öÎBÒøà +pL–‹œ‘C¢gq Ñj ƒ¸ÅXwì֡ѹQ›E]‹Iå¯ùÿõÕ‚ƒµ7Ë?çÿ×Qì~Õ‘¤k¸ŸëVj5LÔ•¥:™Tl)ihª•O;TE8RÑYÂØ®­&sKEoÈ™7 +(¢Ÿ"0)»O­>ŠÍ­KR]HAjªñàŽi÷×öºt~mÃüWÇ?¿lï„ÿ +wA®êQE"g)‘»A\®”¤ívP„¥ª>¸uvásR‚À‚IÈæ¿!£ÿ‚±|ŠìFÚŒ^I#œøÏ=+íoƒÿ¶'Á/ŒÒ-Ÿ„µ«iî[þY‡Ÿ×"º>«4®Ñ×*Rz#ê„rXóS”Ën&’ÞHæ]é‚=EIC‰åÔm1ËØ-MP§Þ©ª¡Ì®ÃQES¤‚ì(¢Š=’ ±0}ih¢§Ø¥°s1¥rsJsÚ–ŠËêè9˜Ò=iÔQZBŠìÌhPîô¸¥¢©Ñ`æb}hæ–Š=’[Äù©h¤$(Éè* Ũe¸†õ¬êkæÏÚ ö¢øcðÂóëÞ/Ôà·xÔ²Æî0œ§ð¯å?ö¬ÿ‚ôøŸWñÖð^»‡æPß0ùI 2+|>]R²º=*=^‡ö¯|EðŸ‡`3j×IÁ<‘Ð~5ävÿµ'ÂYnc·MBÒp£räŸ~køñí/ÿ#ý¨ï è×wÖV¡!(Ï~µ¯oðþ +e,züz…Ü·Ÿ™ÉÚº§’B?•ÏF–_¬ÿBÍâ—‚|C2ÛØ]£9ã÷ú×ö’°ÈûWùøøöŠý¼gÝE¢ÕäÔ.Ê€P‘ƒõ¯ØÙƒþ +ÿ¬Þêv:GÅ8MèP“G—¼ç·®q<ªJîâ«–+{¬þ¥ðwgµ:¼;á?Æï üQÒ!Ôô{ˆåYTPç­{‚²°ÊœŠÊðjÒpvc²i(¢®R¹‘ v4|ØÍMEH¿yÙ©Ê$#žj@ƒ½sÞ ñV‰á›SuªÎ‘*÷f¦.cZps÷bòª:šË¸Õ,lŽé¥}s_•ÿ´§ü'àÁËÙtDÕ –uFÌhÁ›#ŽƒÞ¿¼ÿuøÁñ$ÉiðFž52ùÒÃ9ùpvÓÉêTÕh{xl¦M^Gõ™}ñÂö„÷Q‚§^c®~Ò ´2ë}{~XËêöæ¿“ jðPoŽ—æx.o£20r"Ê€9Ïô¯K¸ÿ‚x~ÖïT×®/^sþ·{ã‘ߨäû +sÊ©Çã™ßõ +1ø™ý-Û~Öß îålïc3¿˜„í]m—íà[¢ª÷1©sÆ]Æ¿—øv?í¤¤rÛKxfFɾïÐç½yÄÙoöÉøn[TÒ/¯!Ž,àJäœW4rú2ûdKIìÏì§Nø‰á}MÕ­¥7|Œsï]¬7–Ó°¸9÷¯à§Ã_¶í[ð7ÄÚø’æêê8! é_ªÿ³ßü‡E×õK-⾕:íGiÎçøóÓ¤òZëXjrUÁ%±ýD:å2ëPÇQ_/üý£¼#ñcOK­ú+ˆß’ÊàÏ5õeeMñœ­s¸Éi#Š­' ÄÚzLÚ­F¬F~aTäš1Um±]ƒ“RRÛÎ3KPíЊ’¸QIÍ5>v.vÿÐþú)é×4ÁRGÞ¾‘ÑËf=º‚§a‘Šˆ©Ö“µb íšŠIã‰KÈÁ@õ¬ÝEXÔ[Ñ(®[Pñ^¦Çæ]\"÷倪x÷ÃS¨e»NÚ³XúODÎøeX™Gž4Û^‡qLóùÿõVU¾¯auþ¦`Ù÷­pÁ†VºaQKcŽ¥)EÚJÃ|ÁþýUX¨¶ו™64rqR„šhCœš¨NÍC]Á]’Raih¦10* +±Q|€íb3éUÜ™_ Ñɧymþýtíƒ9úS§Üq¿R/-¿Ïÿ®-¿Ïÿ®¥¢³TÐȼ¶ÿ?þº–Š*’°QLÙ;Š‚C…ÝéVŒb¹ßjcFÐ.õR»¼ˆ™ñþè&¹«"é«É#ñ þ +…û~Ið?ø@¼*âmVë ÄyyïÇjþA¾/~ÓŸ¼q㻫¯]ÝMw,üÄ»„`Àöâ¿I|}âcûUÁIn<â76ñÜnùkúW;û|ø á—ìãûFiZ™lcwåµÄ²(cž=:W«G–’äk[\údÔ’,x áw…5oYË«Ê!º¹€3±l2î³^¬ÂËý”|ogã Þ\Iažh*ø=x#Ûñ¯±¾9üHø£ü?Ò¢ð ì3jRP“É#¨ÇoJúÛIJ鸉ûKãr/9ã¶óVVUÈþÉàÔ}g•ÅÔVLÊë3öOþ ½ûfYþÕ? +¢½Õ×W´TYQñó cw¾kô׿ø ß‹¼A¥|y¼ðD·j`O1zîàí_Ù}sU¢£RQ<œÎ*I NÈôÿ?%¹Qæ{F.G§ùüér¾”Ú(²hÇe}(ÊúSh¢È=£å£å¤¢‹ öŒwËGËïM¢‹ öŒwËïIòÒQG*´å£å¤¢—"h;hõ €)QN~jeq‡«ã¿Û7ö¢ð÷ìÁð®ëƤè—CœnlqŠúîîæ;;Y.¦8XÔ±>¿Šÿø,ïí5¬|lø×eðKÛî¡I*‘¶J»6TzмÎwžÈôòì?3ç{#ñ¿öêý¼>,þÔž-¾ñ­<–öi#¥¼Ý=Hì~€Áÿ`ü|½¶ñÏŒÈxˆRCC ÷Î+Ìÿh?ø&v«ðà·ÄýuâY!g–%?¼@FBªã–ú×ÿÌÿ‚…ë¼Eià«ÖštO´HçnæîÕïb*ª´Ùt=YNM{¬þç¾þÆ_¾ÚÁ…£Û«"`•Q†¯q_…>ÿy4¸c€qÊ¿>ÿfÿø)GÁŽ—0èÚ®’ÝÆB2“´ƒéïõ¯³~4|vðï¯Kâ­NdH!PÍ&~\øú”eÍï-N.Y^×3¢„!†§w¹ùWû)ÿÁ|cñOøN~.Ë9IÝY„äïaÔýâN+÷«áüWö}ø[n«—ÇhqžëôVxmâXmÔ"(À¥U¾¿±Óâ2ݰP9¯3Ž«7y3Ë–>sz‡†þx3ÂùZŒP`cåP+«0Z€F£·Ý‹Œ¼9!Σ>¦¶¡¾´¾Ì´mãÔWŸ*’}L}î£ÖÒÙÇÌŠ\·Š¼á}gN—ûZÊ@S˨?Ò»zâ¿'?à¨_·•ì­ðâãLðó¤ÚÅÌeU ÊO·^;ñUF“›²F¸hÎu9bͯˆŸ±·ÀoŠâãM|Ë!Éd†¯ÇÚŸþ ªÛ}£[ðLQ–Øv<`ü›{`z×±ÿÁ"j?ˆß´¯ŠµkývbßfufœõÅI馨\[y71«‡ääf»iã*áçdÏFS'ï;ŸÂÁOŠ?ÿbo®•â‘-L23 +çÒ¿­ÿØÿö´ð·ÇŸ Ú\ÛN>Ñ"èÄ|¬8'×—þܰD޾5x2ïXÐí"ƒT³‰ÝPe€+ÇZþi¿f¯¿?cßÚ~ø„„·–}ƒÌ%@¿„c¯­zõyqtùÒ´‘ßÉ E7mÏî`èjMŠËÍy§Â¿ØøÏÂZÅŒ«"Ï +È9ê+Ó¼±þýuó‡ËV§É.VUÙÎJ_, +³å­ZÿŸÿ]\è«´ŸÿUGùÿõU¯-Ïÿ®-Ïÿ®€çGÿÑþúŠ•ëN½4±$J@Ät¯ˆæIM“ÓI BÎqÉ®_Ö¡Ñl^òc…E'šÎ¾6ãÍ#\>Uf©ÁjÌÿø»Mðž˜÷×ò*äúWæOÆÛ£LÒm3Ae’AÆòp¼SöÑý¬m£†}Æð"&C{z +ü)ñßÅMgÅW6˜Ì–àrq’ø¯æî?ñ:tjÊŽZŸéÇÑ£è{ à Ï;ƒ³Õ'·Ìýñ÷í¡ãK›™†¥ª  å##ÕãVß·µÓ ~cŒ îÿëWÄ|?ñ¦½ Õ`Ó.®"Øeó6œçéÒ¸ï"(›j¦ÃÓi6AÁ¯Ã±¦×õTÑ´[QÎ1³~B¿™OŠßð[;~Òÿð¬,×í ’:¶Ò¾{Wôñ ¹ðmú³|¢$û`×ùlþÒš”ÒÿÁI¯m-Ý£t׃g„*Ûþ|b½Œž”+96¶:°#(´Ñþ¥? üV¾7ð>™â”C½·Yv“’ õ®ÝA'5àÿ³:y?¼0å·4–1;v'ÅÚ7á?Á*çRñƱoiötgewáFN}+Ç^gÊ‘ÁS)T´Qï4WãFµÿý–4«û{D×-eWùŽçiéÉÀ'Ú¾°øû~|øó2ÚxcW‰f3 ²‚î¼ =kz”*E^Q7ž]V*ö>碹ÍcÄ6Z6“&¯;æ8×~G§­~uÝÁP¿g­+Ä÷^×/ŽͬÂ#¼€‰ÆÔÖ)Éü +æT°u'ð£ôÞŠóŸüIð§ÄAãéÆu-¸6ã¨>˜¯€~5ÁU?g¯‚¾2okw±=Ä{K“sÇÀ u#$ãµ]J¤¹b… %IIÅ-OÔ^õÎø¯E#ðÕîˆX§Ú¡x²;nR3^sðGã.…ñ·ÁøÓÃŒ^Òàn±€Ê@ Œõö`Gݬd•Ú3³§=zçíªêú‡ì¥ÿ1Õ|IâØL1 §òšPGîË r}E{/Æ_ Ú~ߟ¶—¦è'̰˜¡‘û§‘Þ¿z?à§ßðLý#ö—µ¹øàè#\›hÄ„Ä8d=ÉÀÈï_ÿ²çˆ¼kÿúøÓs«øïA–úRâ6Že;(áóŒ|½V2WÅcéiËž<Ñ>°ý¹ÿà–S|)ðÖ•ã_ ©h­B%ÀLḎêz×Ñvßµ€<)ûÿ¸Õ$1ßÅbÖo·’Ä›'Þ¸ŸðX|GðÓxJÇKžSp +²õmç#Î@>Õùïðoöqø«ûRøêI$†ê-y2ÊXÎã¡E*KÙÅâÚØ•wß{LÿÁ> øþ:k^;¼‚AgyÈý%±Ôõ9¯ìR¾Hý’?fŸ~Ï·Ñ´{T·áE”¨åˆ¯Ò¾·®YbY¹4|þeWž¥ÂŠ(¦yáEPEPEPEPEPEPŽ¢–^ÿJmž )+£H>‡ŠþÐ^*Áß 5rW äÛ;Op+øRý‘¢?´§üÆmG^l?k TóÈpükû4ÿ‚„^\XþÎZĶÙÜ"~rGê+ø½ÿ‚BMkkÿ’ç?h¹¸ÜTtR­Éüýk¯ M,<ä}N\¿pì@ßðZÔÁŸ²ÕÂèÀÇå!¯Pv㿱¯Áø&üßÀ¿´_ÃýWÆ>3ØÏ»¾ñb»·uÏS_¼ÿð]õQû6Ý(%GæHV;€gÔ +þC?aoÚ³ö¯ðì—øc \ŸÆ¼/þ +Gû|_øEáyaigm=#GnìXaNLu5ÓMÓ©8Â÷’* + è~¾ÿÁ?l_ +i ßJñ=ÊCy摉´uëÞ¿©/ü~øuã-‹£êPM!8!1×8¯ó¤ÿ‚R~Ë^<øó®Oa£Ý\ØÛÆþ[¶âª’ÎOsÀ¯ÓÏZ·Æ_ø'wÄÝ"}SS–öÆòæ4Ê3|ã#;¹Åe‹Ë)N¬£ïU„e&™ýšüNðöñÁšmàÞ²Âû6õ'b¿“?ë²þÏ?·TÞ‰…½¤·xž ý{×ôïû&|B²øµðƒIñ‚¿7êÍœz×òMûxx‘_þ +C¦Ûøv@ +ßæ1ò2`døÓӒö”çØéÀ´¯k¾Õ± C¨FþbHŠU½r3]}yÁÛIl¾évó6÷X#ÜùÚ3ú×§W-žÅ«TWÀ¿ðRoŒÏð[öYñ¿jOÚ'‹ÈŒ>ÿ¾ú¯Ä_ø.f…â?~Ê7ºO†ƒ¸Ùd@§€# ×UyÅy9U5*Êçá·üCá‡ÇÚCSø¯â«/´EÑxš\¾Ìuå½súWöñioo§ÚGgl»cB¨ô¿–ïø7ÓÂMáÿHuBVûÍ>zÆ~QŽÙ$þ5ýE$=ëLƧ5vvféÊV%¼»[;/¢)jþ\?n¿ø*ïo>97ìùðA=¼¢Þâd>i`ÁÅGŸuÙ¼=ð·W¿€VÒS¹x+µIÏ׊ÿ;[‰šö…ûeêZí¬]jR_´å°ÌF~¸=k\¯ ÊN] +Ê©.W#úÔuïÚÓÁþ:×oçX¢ýëÙùW¹ÿ +ýÿ‚{þÙ¶4³§Þ] åY61>ª0xëœ×å·ÄÏ~Öþ éSÇoy©¸ÏOjËÿ‚RþÏ_þ xÿUÔ¼`Ù¶I7IèH=ýjeF2ƒszž„éÅÁ¹ÒÇí ñçÁ¿³ÿÂýOâ/Н#¶Š  @i$…@z“_ǿĆŸà¡:î³ñWߘ'’¼Œ 9ÞsÔžäWoÿ ý¢þ5øßÄöŸ tè™t:dB«;K ú×µvmß +ü$ý—áµÒ¦7‹fb%£ÇU ·çœ +륆p¤=ÙL:Š÷Ogÿ‚%øj…ÿ¼Kà™$/´ao “é_Õ%¼D[¨¯à÷þ ‡ûnÚøoö€¼¸ñ$²$÷÷!·*w*Žçéœ×÷Gà?¯‹<9e­ªm[«xæÐ8¯'2ÁÊVåÔáÌ9•ΨÂ'¶x_ø'ÿð\oƒºg€üc§|V¶‹Ë&,ïL.2Äsœ÷Ç5ýd¨ÚM4ÿðqŸˆ¬t/ƒºE´£^Æè +õáÇ$u#$Ư.“UcÔY-fªòkÁ%>6Oñ?à—ß4¶±Xó@ïŸQÓû:WóÝÿ!‚÷þæÞëP §Wˆ°ÁØŠÛ¸"¿¡ÐW!Z¬¬a›ÛÚh-QYHQEÿÒþú(¢—iÆká%ΧšøcöŸľðUÅ«bYQ'¿}Ç3ŒçÒ¿ÿø)oÄ‹Ë]RãM,Á`%#Xúšüÿ3…ÀN¯dGý¸CÅT0Õã_ÈüiøÃñ÷ÇšõÁº“0$òÔç½pÞWZí…¬0%&Mã8ÊgœšÊŠÍ…œä³cêO&­ÚNÇPö2òþeúŽ‚¿‚gRx¿mQß[ŸôQ<†•±àp¾î–_qýmü#øðåþØßõý/Á:?i)|_¡/5iLÆ%Sã–Rz®OQÅ~üø âÜè€bØF8ÉížµöÀ [Ä?>9éº â˜f†tŽE=ÕÎ0?:ý‹Ã F+V3›÷YüŸô¬É²~&Ëñ}+´ðÿíK¤_ç|Úp[îùé_Û™5vð\ýOñ.ŒÁ£öËÂÿðEøÃÂþ"‰n#”Úä€v!m¤†EêsŸ¥~HøâWÆïø'oÇøD'¹žÖ;YA`åÀç’;ŒzÿGo„r#xNÔ­ULol›Jò¿ttÿÕü>ÁÇQxnËã¶wh‘o»”PíÆn+,³*ópš1ÂÏÚ]3ú¶ý¿iWö•ý“añÆ· ’èÚì•”›ä$÷ã­žÏí4úxÿ‚Œêz„³Qu•VÏÞ â¿®ø eíó~Èú†‘­;48ãÞIJ gµ!ß¶£=×ü\¶Ó8ä]\'¸:ïÉkrº±FX*v”ôdð¯Åëo‚ÿ±‡ü{zq¦…›œãæØ[$ût¯àûö¡ý´¾0~Þ?®>xcTŸìzЂ1HeÞ9ÈÀëž+ú°ý®oµM'þ 7o÷M$Ñé³îéóÇ€£Ú¿ÿø%O‰|áÿÚÃÃWÞ2‰Ö[ÉcË(ÎYò9ÈÏOZçʽÚ*-õ0Œ]›GïÁ?ø7âûâ»m[ÄW²Ã©µ¹džVÆóü.sǵ~Fþ׳¯í#ÿ´ø•¦êR^ÜM¦Êà­Ärü\§£šÿHÏϦϠYO¤•6¯ŠôØTcü¼ÁËx=¾鉨ª5ÚÈ¡Rž*²œÆ¥JªÕ1eةʧ,Òø%wí{§~ÚŸ³Å½Î·söNŠdì…p2\z×ágü—þ å㿆šµßíðѦ0+›‡Šß/9àÛ­u¿ðl\ZÕ½·ˆ®.a‡!‰é†é_Ñ?üOÄÞÐÿfv<¦¶|y݈SÈô§†«*éS†ÌÙÔ:ÖüLüÿ‚âø»áÁ{߆òA3ëVјvÈçkÈF€yÈãnµà_ðOoÙsãííûJøÉ¯.ì.ï„·,YʦöÜAçÚ¿)>(˦êÿuíGÃÎZ½’H_88Žxí_Ýü›ñá¤ÿ G‡Zá[žÙ]ƒáY˜˜äãŠúlÆôh¹Q[îÎÜF‘rKSúCø!ð«ÃŸ>iÞðÜb+kV1Ôdƒ×ô¯`ò×­AÞ£oUªùçÆÖ›”®Èe…&]®3_)übýŽþüfQ/‰lƒN¹Äð{_ƾ±a‘PŒçŠNšnýBž*tþ~[i?ðIïÙÏL¼ûPÓâ`p0[ßæÎy¯¼þ|ø}ð«JHð†Ÿ¬QŒ£Ÿÿ]zÎõ¥`Õº î:¸ÙÏâ¸ý)´£¨§=ERÑÄåq”QEH‚Š( Š( Š( Š( Š( Š( '¬8¡>õI´“A¤SæŸÚÏÁpøãàŽµ¥>âÍ +2IÇ¿ÙÙuïÙ—þ +Höz¹h ú˜H݆ +:çœÿFwNUÒfÓä)×ñÁÿNý‘¼Cð·ã?´^‹iç-¬¢l ùSŸòk·4å*ê}NI4âà϶ÿ൞$oþÉi°IqÁcÜ0Âöõ¯?àÞŸØïÃZ‡.¾"xîÉf¹.|¢Ëœƒëœ +÷¯ÙŸÆíÃðºËÂ%œNÅV ã‘`ÃÔOZýêý–f¯þÏ^Að¬!ÅøË;Ò¼üLÝ*n‡PÅUPƒƒÜúFð—‡UP~EÁdüáÙ?fSRª×2#"L•Êã©¯ÙÆá·c5â?>h¿¼,þÖãà ÚU†G=ë‹ (ÓšŸcÈÃb-Q9çWû~ØšçìuãûmZ'6WyŒ¥OÉ"÷ǯ­t?¶Ÿü7\ýº~2øÃƒCmm{„Ú1'†õ¯ë#Ç?ðE¯…Ö›4ÖV¶Íy)f  é“Þ¿ž¿Ú“þ ¿oû|D¶øµ|²í³¹BBýοÈ{WÕSÌ0ò“”¼ÏWÚÆwq?­ØÍ"ø'ûØêž#;^ÞÊK–fë…L¯á_ÊÇìÅዟÛ#þ +3¨xæÊ6—J²¼ÞιÚÅd 3ìJçßþÐðVKÏ|‹à_èškÛ›qhÊ„®Ð˳!†3þïë_¯?ðEضÇá/Ãåø®ØˆµIDŒíÛ¸ç1^uHÊŒ>ì¸þê ³÷ß@±‡MÑ­¬`]‹j¸÷VÅÀ§ljòéÁ¤|ÔÝÆ×Æß¶ßÃI¾$ü¾Òíáó›Ë`G¶8ýkì°5KTÓmõ;),n×tr 05£º\ˡф­ìê)ÈOì#ãÝköføûwà VG³µžós£œ©V<}:WõiáOYx†Â;»I’U ¥Nx"¿à ß±u톨>(|>„Çs$ùY\àç/x;Çz=½þ‘{ñÌ ‡R9íY?g¿‡¿íäå¤RI/ü´* Ú¹°˜§M¿Äã¥_Ù' -ÃÁNþ|<øc†ô=K»ï$ RPvã `’ÙÏJØÿ‚høÏãí­êž-×tƒ§h’»•óI !Œzã8ϵ~ŠCÿÑø6¯£ªé±Ì! ¯‚:u¯¸<ðÓÁÿ t„Ñ<%e¤:"Ò»%^ƒ„#c:˜Úq¢–ðeüš†•nˆòÄ€2Mnøßâ/„¾éÇSñMäV¨Ë4ŒIÍMLMJ²¼µ5ÄÕ•yZ>­ªÙhz|š–¢â8ã$×ð—ÿfý¦ïmoÚ‚?„_ϦØOöH˜¹fvI|(ÀÃ0uãÞ¿@¿à¦_ðWFñ•å×ÀÏÙíÚånìí4ù¤ô,1Æ=;Õ/ø$·ü/Å3x¦Úâbšàù¨.{`džÜ}Aâ½¼5áéºÕ·{#ÓÂPT å=ÏÝø'ÏÀ;‚ß|;¡ê°§†ÊÙ€ d(fwÜM~€•OO´K 8ìãÔ:qZ^ZÿŸÿ]y¡ÌÜž«[šWdTT¾ZÿŸÿ]ZÿŸÿ]_ÕŒîˆy£æ©¼±Ûüþ´ž_ùÿ&—ÕÇxŸÿÓþú#4¹'­)\ Š@2q_;IêT½ÿW#®+ùyÿ‚“J­â­RÙÏ ‹!åŽ{ãÒ¿¨«„2@È:‘_ÎüáÞ¡aâcâ"Æ8ïÔà(Îý£•>˜Ækò¢ÿ²ª(£ûwè+šÐÃñzWg(éêš•ÏĘü³uÉõ­|ª¦zóYv÷*ɳn1ÅO‰ÿÕ“_Á5ZR?ßu¬5Pãk·!AïúVn¦&n"`Ka°8ã=*ÌW‘Ebbeɤt·½Hâ™¶`ä{ò8®œ¶‰äf4ä°óvèT±…¿Ù¿cí6o,àÙÊÙÏ^?¥1Ÿš ˆšçšwvì AÉ5ý?~ÅÖŸhý“të 3æ*ÚÈÀ{0'üÂ|]‚K‰zõœÀ¬¦éò¬=Oµ~ïÆô\ð8t¿­þyý±‡q«+75ÿ¥Hýbÿ‚W[C{ux¬å”‚Ät# yoÇ«‹Ë/ÚöHa_Þ¨£\åÀÍ} ÿ£ð®¬±Þê÷VÅ"»PCt +S·â büEøk«ø³öäfÓ—tQÞFŽÁ‡?‡Zû\—/oIÛª?;Îø§5Îj9§búõ>˜ÿ‚†ÏrŸ±½Á™UFÑœ“¶¿…•Ò|aΈ°jOLÞ,±üøÁ8 NÕþ–¿~èþ¿€5˜ÄqL‹Êã*WŠüå·ÿ‚3|¹e›Y)pùÉwæL zWô–G‰tpÊœ‘þff9*µ¥;Ú÷?7~ÿÁhü!ðOà¬>ñTÍ,öKˆX)w\/!»u¯æöŠø§ãßø(í/‰4»K™mMÁŽÓ –U-Õ¾µýjü]ÿ‚ øÅš»Â3äVmàβ#ç0¹œWÑß²üçáŸìù¬A¬KkÒŃ€>RqÏQšíž"4åJ:³Š†&”qgGÿíý›µ‚±Ý®‹oh"½’Ƀ; m¼’>µüþÔÿü[«~ß7𥽫í¼3(%NÙ9$œWú¡ÚøjÚÇEE³PÆ›˜Æ+òKÅ_ðH/…~#ø¹'ÅW¤ŸÎhZ5Á9Ï^µž_ŠT›Z²pØØEI¶z)ømñãöµø}–[Ý#–*œ\祟ÇOdŸŽ—6íguo—æDÂ7VB[8éÁ?ZÿTx/MðW…ìü-`£ìöqˆã_î_4~Ð?±ÁÚn/|U¤ÃöùÓi¸DØŽ…³•?ˆ5 s¡{Æéœø|t> =çSöoÿ‚ûø{Á?¬4?,—Zd+, ¼ì@Àôí_ß¶·í[ñƒþ +ƒñ‚Ë@ðî—qøŽ6Žxàtý1_ÿÁþÉ®¶©osÖÏÞ·RO?~Æ´„žû<îÝÚ5Îk}ÝÚÿI¿ x[Fðž…‡tXDV°®ÕQÇò¯•|Oû +üñWŽ[â¨³‰7.6†9Û‚+¾–sQEÂj鎖iß1[}㟅š7Šï¢h%¼¶Þ6ä«mäf½g{VN…¢ØøoI‹FÓP$0ª£€jW¡ó¸š‰Í¸Ž,O)óM¢©;\±Aâ EO['qÊWšuS$BëQ”#¥KE&®z*r Ô$Ö³”,QEQEQEQEQE*œÔ»Ö¡¢‚”¬K¼ŽÕòçíKðÿüs£êÖë1XÛh#¹kéêyÛ"”~sO™¦¤·GN*sRGðwã¯|dý„~7]xÀ°M.–ÎÄÇåLgøò¯ÜØËþ +ÿðãÇöká߈3µ†£k¶7Ž@BúpN3ÏzýtøÁû/ü0ø·¥\[kZ|fiAÃ…7ãÛÚ¿Ÿ/Ú‡þ·¬Íyuâo†w&Êiÿçßä#8Î?*èjU•««>çÕF­LuÜþ‹|9ñÿΈáé—ñÉÀ?+×ñ®âøb壹L0ÎIw¯àÛÄ_¿oß:ŒÚ%†¡{<ÿ(ΓÃ^0ÿ‚’]^-‚ÜßÎ’ ªÅßåÏ8¬žU¯ˆä©•E;£û‰ñŸíð³À¶÷7Zö­1ÛÆdbÎÀ÷&¿ïø,üÂ?µݧÁß„Ðë˜ä*­|¹3Àf dãµqÚ'ìAûs~Ь¶^5Ôõ³Ë"—Y‚ž{û +ý±ý¿àß¾-ž³ã製¼€‰¼Ö\±sÛ-Ú¯ìè>g«&2¥A]“ßðJÏø$¯‹uëý;âwŸ|©D®ï”çkrþÉ<#á}7Â: ¾¤D±CnUW§/‡|/¢xZÂ=7E`Š%Ú€8JèƒÐW-YJ¬¹æy˜Üo´~D€`b–¢.HÅ2¬óܡ栢š´0üKá­7ÅDÚN ¡ÒU+Èõ¯ççöäÿ‚aÝxQo|>´.˜ä4'nÓô¯è“q5ÑCu†u <Ôò8¾joS» ˜Î“џŧƒüûV~ÇÞ ]_ŠâM:Ýà À¯µ~¹| ÿ‚³ø&þÙ4ÏG%žÜ.é÷ÜOJýYø¡û5|<ø¡e-¶µl Ê¥ +2¯Ë‹ÿðHo 둼þ˜[‚Iuë‘øw­¹èTV¯3èichUVš>þðí½ðcÅRí5›)7`|“)çÒ½ËMøåðëS`°jåŽÕýâüÇÐs_͈ÿà’<1q%ç…oçiÊàž +͸ýƒÿlÝ.Ö5Òuyü¡Œ0ÆGüŒ°¸hü9±ZÐþž/¾2øLQ&¡{ *r2ò(çñãò¯#ñ?í¥ð !×uËx<±“—^Ÿ4Þ$ÿ‚~Ûþ(¸_k7· +˜*C²ÿ¥RÐ¿àŸ´7‹ —>-¼ºs#&w`HúdÖßQõwPÒ– £“?Hÿi¯ø.Á‡¶ZOíªr±†äw'¥~øËã·íñÿ ÖeÐtwžËGº¸ +Qw.îœã ‡û#ðGþqá-&ê ß|Â6]Êß6{“Í~àü"ý˜>|Ó×Oð~— AT.í£9’lÒ…zt´¢®üÍkchQV¥¹øUÿÿÿ‚+i»‡ÇÿÒµ3É`'¶ãž~•ýxsÃZ?…ô¸t}‚UQU +08­ØãŽ#Œ`˜©ð+–Q•IsÔwgÏbq“ªï&7bÓ袵JÇ(QEÀ(¢ŠÿÔþû›…Å5zy8¤Zù¸Å=ÈäÂó_ ~Ü_¡øðÖ{›BòÜÊ«ÜaÚ¾î•w +ÎÔ4ë]RÍìîÔ2º•?C_;ÄLqXz”d´húîâÚù&kG2û84ÿÍÂ/įj_ uÆÒµ4*åþa‘½I=Àèx®BCž¡‡#ë_¾·ïì}5ÝÿįG%ÐÈ™¢NXŒýÐ1“Œ WሴWB¾µDÐ<+©ÍžÜwÁ•òü\’ºÑ~6e¼S”Ó¯Jªr·¼º¦SB"Ù¹&«ÜF³À‹)#Ë;‰ŸJt²Ka]ÝÈ$pj2ºþó; ã®+â#VjI-ÏèƤlžŒþ…àš¿´·‡¯|ÿ +ÿ^™-fŠ0ˆ70«µ'6œ{׫|\ýŽþøïÅ2øð…Y§Ä’m*A#×òõ¯æãÃ'ñ‚µHµ½é­|¶9­žç•ïÑü{øáâÆ•§ê“Kmyòm›©ààc?Žk÷žâ¸UÃC ^’?ϯ>Œ˜Œ}_>ÈñÞÂ5u’üÏé‡öy½øMà«!àß\B.¾în +ßü?ð7Âvž8oˆ¯7²n!mÃøÝÿüýž>%Üx®jóÉ q“!,[¹#>£#ñ¯è2Ú²Dz¨¿¦87/•j*u#kl—>6Ê–WœVÃåø—QËã}ØèÀCбQçÔµúEr«3ùêu +(¢µ"ì*7­IE&®ez\šs.9ÊÅ«Øìû +7æ›E+‡3Xž´™4”SL..IëR EEJ "œXù™)PNhØ´ ƒÒ–¶$nÅ£bÓ¨ …šuPEPEPAâŠ(6@EGS?ݨk9  +(¢³@ÉÅ?Ëÿ?äÒ'Þ©h4Œt")šeLÿv¡ ™«QA!EPNSƒšm& ÖÐÜ)I0ô4ôûÕ5_³RZš*­}«|/ð>»p×:¶› ÎòŠÎ³ø1ðÒÂUšÓJ…NFuü«Ô¨©­~°û™Vº&‘`¡--ãŒE¯gåéSà´˜Z·Iº¤ p)J3S`”SPFmܯEXªõ2„QE@Q@HéO ž™E•‡•„žT {kVmÞZ–õÀ©”eª]¢Ÿ²M{VRV äļ²*p#Q…Pùö©±ëÍ-8QHWЋ#Ò™šŸhÎhÂÑ(XJì Î*ZL +Z’Ò +(¢…Q@Q@ÿÕþû\ñN7;‰Z}|ÄUõE¸¶Æ°ÈÅ3Ë?çÿ×RÑJTî‚1w1u­"ÓW³k+¥ ¬;ŠüÔý¡ÿàŸ~øŸ×Ú[[Â×+òäœòé_¨L¹éQùdŒb¾?>áŠÔãZ>ÿ‚|E͸~¿Ö2ÊÎð~§ò™ñ þ ©ñZÍä‹Hs:@ÄlKþÍypý>4FVÌés†Qœ²`®z×õîúUŒÎ^HT“Ô‘M:6œ9òjü毂ù|Ÿ7-ë<³éëÅXzJœ’•åoÀÿðNŸ‰š½¤1ëÖr¯–Ü…ç¸=ÇÒ¿T>Á:ô­½÷‰– Ú¡FïÆ¿Wãµ…íS¯Êv×Ñd>`0³U9v?0ãߥ—g” Ôä‹ÞÇ5áOè¾ÓLÑ XQFÐ9®¦Š+õ:T8(ÁY̸¬EJÓu*;·»#ÿ–•%Fß“RS8Š( Š( ¢eÇ"¥¢“W½æ\Sk¬ER¢Š(É÷ªj…>õM[G` +(¢¨Š( Š( Š( Š( ?JŠ¥~•e0 +(¢ §Z–¢Nµ-ÐØkýÚ†¦»PÐD÷ +(¢‚Š( Š( 'Þ©ªûÕ5m €(¢Š  +(¢€ +(¢€ÀÍW©ÏCPTLŠ(¬€(¢Š(¢Šr}êš¡O½SVÐØŠ(ª¢Š*&m ‚Š(¬Š +(¢€ +(¢€ +(¢€?ÿÖþúÓ­KQ æ¤¯šÃÇÝ:Š(­ùQ\uÕ¤EV 5¾í:ŒŒRÖÔÖ†sŠ(«±<Œ(¢Š,+0¢ŸjLû,Ä:Š@sKHŠ( ?JŠ¥~•ð+)­A!(§ìjMK‘•¢±¨ØÔ¹XY‚}ꚣU äÔ•´°Y…QUfaEQfaER°¬QEQE1úTU+ô¨«)îETôëRÔIÖ¥ Ú »PÔÏ÷jžáEP@QEQE8)#4Ò¸ÒûÕ5BŸz¦­c°‚Š(ª¢Š(¢Š(CPT硨+:€QEfEPEP“ïTÕ +}êš¶†ÀQEPQYÔ6†ÁEVeQ@Q@Q@ÿ×þûäýIQTäôÀ©sšùÌ<’ާ@QEº« +(¢¸«ÊìŠCžÔŒÛk €ê*&`V²äÕô¨NÙnbSÓ—QýjûIìš+šŸÅ^µžþúÈ¿ãNµñ>}r¶v—°É+ÊÆâp(öˆÓêõ-~VttT‰ä—pÆ{Õ©ˆê*œ×ÖÖ‰¾åÂs\äÞ;ð•»mŸP»Š×Û¶®Z£)kc¯¢±ôEסiô{˜îQN ³ƒ[QwÔÂ¥6˜QEÌÆ?Jju©jd†2JÁBõ$ÔÉ[Vi>„Ô„‘Óšó{Ÿ‹ß,õÒîõ{Xî¢4Š<õÛ麾™¬Aö.xî#Î7FÁ†~¢¥TW±Õ<<â¯$^ßþÈ£Ìÿ?äR àR<ˆ¼7zkÔçQc•²qN¦©V—{S«x=TPN9ª2êV0J –UWnŠHÉ©xÇâe¤ÙzŠ‚ ãwÄÁ—8È9©Y±ÅRªšº"R°ì֚đJFhf +2iJZ]Š×#Üôå,z×øÇã÷Âßjk¤ø—U†Þvm»Y‡޼עøcÅZŒt˜µÏ ÝGwk(]5Š‘¬°ÒŠ»GEEV­hc4# ŒTl¸©9Í-% ’£r „õ¥òÿÏù5Ìø³Æþð6šÚ¿‹/¢±¶NZI˜*Ä׉xö´ø#ñ'ÄSxoÂÚÝ­Äñ6Ï–EäçzÖVÔê†R2ZJªãšu"°u ¼ƒÈ œ Ò^fv°Œ Ï,÷ÿ?­yÅ‹þøC¢{ÇZ„VPçÈÀd׉ü+ý´þ üXÔ×Gðíú4òHѦ×VV+èAëX,BÞÚÁT’æQ>½òÏoóúÒ f‘z†S‘Ô}*@Cq]P´•ÑÅ(ëb0¥ºRìj“*8®Å<#à颇Ä7ðÚ´ÙÚ$p¤ÔóYNj;šÒù;E]˜RN*QÀÅ`xwÅ:Šì§ \-ÌãzŒ×A[Ò”ºb•7 ÀbiôQT`Š( Š( Š( = ASž† ¬êQE˜Q@Q@Nµ-DjZÚQE@QEgPÚQY”QEQEQEÿÐþúH,t¦=ª#œx©OQ_(¶F×Ôòotï„?5_ˆ§ú6”ç§¿?g_ø.ïÂ?ŠŸGÃÙ:ŤhVñó¸0û¤FzúWÝ¿ðUÜx[ö8ñf­LIm‰êUŽ=G­šU¶§â»?\x‹Â×1\,,InÄ8$žF9ü«Z—+œ¥Ë°tçGÞ[ŸëeáŸh1Ñ¡ñ†n’òÎq˜åŒåXVë¶ÑÇZþR¿à€ÿðPoüIVýž¾%LÍuk•‡Í9‘ˆÏô5ýW㸫Vq¼^ç“Â:59øqûjÿÁ[aýšþ=iÿ4í:9·È«<®H*XãqŸZý’ø{ã(|wà=/Æp€P¶IÀ· ÷¯àWþ ã_ÁGÆ‘tCG ÈÈ óü«û…ýµ¦ñìÅá E‰,ÚlJr1Ê®;WFeIS§Ùêc¨ÓöPqGâWü þ âÙ{Çíð»À°H·lŸëàŒû ¯ÃÝ/ãÏüÛö½½ŸÅþ¹Ô$ÓQÉkx † ô<~£Šñïø-ω¢ÿ†æ¿·»m±E´ì„éÏ5ýaÁã­o|zø?á_ u/x¡ŠxX¤œf7†¿šßø'ŸíàOÙcöÁñÀ~øm¸•íã,ÛW;þRsÅ*\ònF²pÆÒrQ´¢W´›†qUฎêî `É î4”“Õ!S{ -ÄPDÓLB¢‚I=ëù ÿ‚ÃÿÁLõ¿‡‘Áðoà]ÞýVñšZ&åsÆî9úWéïüö„Ö?gÙ‹Xñ~†q9‰‘Hꤎ ¿ðM¹¼%ûLþÕrx‡öˆÕâo2q2µËŒƒ¸ž7qŒS¢ïz­^ݧÊ0±KÚËV{G…ÿcø(·Ž¼2Ÿ­µ«ë’£ÏX »1œN+ë?ø'íÿûJ|%ø¹Á¿‰wwÐÝMäÈŽ¤„ÜØß“Ækú¢ðwÆ_ÙÓNÒ¡ð…õí7É‚1ňAck#ÿ²ŸÀÈk:\ÿ»·²p…ñ6xo^•ýBH_Jâq䓇cÌÇQå¨Ñ? _œ¿ðP/Û«À²/Ë›½Fö?íkˆÜ[ÀofÁÀsÖ¿Au{£i¥\]gTNÙú +þ?në´7üOð~»y¿M‚ø[ì,X0ãî+·AVmËe©Ý”`ÔåÎöEß +|$ý·¿owTøá ßÞÇ Nó„ËŽª1‘ž+ô þ ›ÿ øû?|F“ö~øüÏbq5À 2¤Aú×ôßû4|ðwÁß„:g…<;jÆð#¾Õ’Àþlàà…ÞøO§ÆØ¥Ž¨ÒFdt ž¸ÇZ0Øåˆ«ìª-Ç£\kJTí¡ýeøw_ÓoG–N sÚ¸ßxïßü=sâ\-µ¥ª˜ãØzšìK`â¿?à¼_¼Aà?Ùäé¾à–nYÔ‘´wý)F2©8Â=MðeR§+Øü¢ý¹l¯‹ß·¯Æé> | +šäxí6á²UNߘ¤×x×ö]ý¦?`ûÇ–Ó]][$Â_.@í´u$ú{w¯Ñø7{á·‚ü_àÏ|FÖa[½RÒáS2äÜ“Ÿ\×ôGûFøÂÞ7øK«éÞ&·Y¡HÁ ¤Ï¥tbq*3tâ´GÐK5=ŠGÇ¿°/íñá¯Ú_Àö¶zŒRZêÖÀA>ò<²è?„“»ŸqÖ¾ìø¥ñg +<{ãܤ6¶q4¤“×hè+ø]ýŠþ(ê??à£ò|6Òõ "ÒçÕˆ0ä€rø¯¡ú×î/üƒÇ7~ý› Ð4û·¶ï³*ÛAÏ­pË 8â#BzsÓÁSuÒ—Sò»ö¶ý©~5ÁG¿hHþü †A¥ÛÜÂ[bóŒœzŽMu?aÚö(}â/ƒõ ‹Û„–T\˜žL ÷Æ}kíø7§à΃7à [â­ +ɨÇtJTn9Å@ÿ´w†¼?âOƒºÕˆ-c¹…mÙ€uÎôæ°ÇV”*¸Ceøï3䬨Åh|5ÿóý¾4Úþ ñc%¿‰,PE:–;Ñë_«q(ÓJÀ*‚Iöü~Çž5×ôø(Hðå«´C¨6ÝŽP¿_ÝgŠ¡¸¸ð-ݽ±-$¶ÅT޹eë]8š^Êj+®§œ`ቮ§á?ü£þ ¢~Î:‰ðO¹ ö£2\ˆ ‡¦K`àf¿•ÏÚWþ +iûF|nñ¾·{®µ¸·“ÛÇU\òIõ¯éƒÃ_ðGˆ>4øÿ[ñÇÅ9‘ÒêfhÄ‹“‚xkð“þ +ãûøköKÔ¬µZý–}§æê3ÁÇ¡5ê`çGA+¶va¥îÓèT?ðF¿‰ú¯Ä¯Ù®Â]Váîg¶Q¾fêÛ±€}Å~É×à'üû5Ü¿²Ñ{¡÷äÜoOé_¿uÅìÔg$»žkuSP¢Š+^].y|º\(¢Š’BŠ( Š( ¿Ý¨jI;TuœÀ(¢ŠÌŠ( Š( §Z–¢Nµ-m €(¢Š  +(¢³¨m ‚Š(¬Ê +(¢€ +(¢€ +(¢€?ÿÑþùÁÍX=EAÚ¦'‘_*–ˆÕ•ÿðX™.ìCâømћ̴eàp8cÉü3_Êüëöqð_ÅϳéŸm–ú("ùÔ¡‰ÚëŽzWõýÿRÒXý†|lT3®™<Š;ü±¶vûã8¯æ{þ ¶‚ Oö‚×de¼–Ýýå «ýMk¯ÕfÑõIµ…mYûpüø¯ÿÊý·Æ/†:{Eá{™Òxgƒ#j1åN8>•ý\þß·‚¿kO†êÐ\Fšµ¼@\¢‘†,8eçó{·í9û6xö™øoyàÛG1xÈ…ÝAÚ߈èzWñGª|aÕ¿àÿµ®·á,\jJƒ ¶FÙ´;:á¯ÊCÞ–õŠk›âA°ÄR´÷G‹ÁX¯îfÿ‚”Ϋ&$r‘¨# ÜGó¯îÛö>´‹Oý˜<ol8M2/Ŷóú×ù¢|wý¥o?jïÛ?Š-o%¸ÔnU'.‡®}Æ}ëý1¿dÈ1û2x6%$‘¦B2}@Áýj³õeN=‰ÆEF’Gðÿ½ íÕâ$d/Ž6ð þyª±çì“ÿño…à¾øqm @ÂGX÷wò@Àäã­zwü™´ÙoÝSJÔ—y"Šàúµý­ÿÁ:ü#¤xgöQð»éëû»a,< ã®¦/*4áɹߊÆ:Qº?•Ý7öÿ‚ j÷QÞË},¯•Mó2*¨éžù?JúOà‡ì3ÿð÷Ä7Pñ.©qŒ2£M vl…`p ×õä‘¢}ÑJU[ïkÊ©˜Õ¨µ±åÏ=¨Ó‹JÇá /TÑü–¢Å®#€Xää/?­Ÿ‡üoÆ#ñ7üJÛO´v&Öå#ŒuÚÀç_èÊJž†¿‚ßø-×ìÿãÏ„?µ­ÏÆ+›7L»‘$¶ºˆPÛSÛ§ë[e)FN=YY=~Gö‰û } þÍ~–èîvÓ¢$Ÿq_G×ä§üWöÀðÇíð MðM½ÂM¨øzlî =S±¿Jýk¬%US¼CÈÇP’ªÓ3õvUÒ.™ñ´Bäç§Ý5þvµ%Åí¯ü†çVÒó&¦!˜¡à“!Èü«ûÉý«¾;x_àÂGÅÞ%aWãBÄÊœž/©¯àëàÇïþÛ?¶ÍÖ·áÑ(Iõ#xX©*ã´‚= ëe¥vöh÷r+Ó„¦ögúüž[¯„žžà’æÆ “É8AɯT`M|“ñâ,¿²·ì絨Âo¥Ðôè¢Ø3—’8ÂàVïŠü׿àà_é7×vÞg•$uñå@œ2ÿ#ô®\%)Õà*xT“œ^—>›ÿƒ„<]†?dö·¬Mt¯9ÙŽ1îç_Æ×ì]û/|Eý©|`°|*’[k›}®eˆàƒéè_júûþ +oÿ1øÑûmiv~¿Ð—O†ØæD¶8'…è½ÏLšûkþ  ñ7†t¯‹ž!³ñ©ŠÞúâ†ÔtC! 3þÊñô5­UR…mÏb‚•:^gesÿ…ýµþé-â}]½]‘™\™8ÊŒäàñ_UÿÁ2¿à¥ž*ømñÙ¯ö€Õõ­ßìðÉ9ýâȨPO''Ö¿©Iooá›û‰Â²Gm+z`!=+üã|U¬‹ø)ijÙȲ%ƹ‰W§úÓŒŽÜàÑ…¨ëÓ—´èm‚šÄR”fôrÖeKÿ \Ïvɰõå ¯ó?ý½¼Šÿà¢W~½Ä–’_Gg©Yœ(ë_é;áÙæŸáµì’y­-‚ʹ Ewí;sŸðU°žçc©B69= ã#ÝIÈÕ†W8N]ŒrzkšIlª?nïø'u¿ìáû7x{ãW‚ôìÜJåcË!›¸Çc_´?ðDÚ÷Zøƒû<]ÙøÚFvÓ”¤l_'*1È<ð¯ØŸˆß ü'ñköe‡Ã:Þos ÒÃÂ’¨`ŒbàŽ8ÆkøTöª×?a/‰^5øoá÷ºb"#ÈÆ2+úÍO°Ýꦻ3þ +5㟉¿µ¿íÚ<.¤»²¶Ô<”ˆ1+³ÌØ+ÙਿðO½#ösý›<=â-*åQ®<¤Ûû½¼“ž¤WØßð@¯ý¦~+ø‹ãÿĸîúÂìÏŽ7óæga€9Îkïø96x´¯ÙžÉáÄq²ˆð gæjîx‡õÈQ†È˜é^0G)ÿɦ~ëú»`}²QòŒ|¾YÁÏׯJþ¢ÍÄmÐñë_Ë÷ü]§K¦þÌúþ©*Mò±ø˜ƒùázW³~Õ?ðPÏÚ[À?/¼1à$5­žQ<¸ÌŒX6ܧJâ¯ÏS*qîeˆÀªÕ¤ïc÷[âî¦ÚOÃ]cRÂyVÎʼnÆ0Jÿ:+ÍSûSþ +d³,¾dgYFŒCM€§5úñŸþ + ÿø¹á‹ÏÛè×°ÉC*˜ü²áœŠü:øo¡üBðíE¡êŸ­ç°¯Wt“¸bÀäŸNF zØ*Nœ'Õìvåô=”e ÏôþðfïøDôÑ'ÞÑgë´Wó[ÿÛ[„š\·Ñ üã'*HÍ~þü +ø½áˆ_ tígK»ŒùV貂Àm(¸'éÇZþj?àâ¿‹ž ñ‡‡´¿…Þ½[­QT0Ž2›ÇLŽkÄÊêFXˆÛ¡Á–á§õ‡t}=ÿçêS_~ͺŸ;HV`… ÈR¤óëÈ#Ò¿£L×óûÿùøÄ~ ýš5I|Qiöyï®#š7*AhÈ  Úú×è¯íññ ãG€>\jŸcgÕQ”.=ž"JX‰r½0ÆaÕLK‚v>í2¬`»ôü¦ÿÁÆ?,­¼§xBÉÕ¥¾ã¨ã×ðÿ +ò¯øj_ø*„6гè××’á@=ëƒ×•ù%ûsxoöÏøÙ­7‰>3iײ.K¬mXÚFÔŠõð8nY©JHôpo³Ô®E_ðmñ˜þÏ:ø—aÝ")^Üþuýü[·û_Ã}f×ó-d¦kùxÿƒt>5x_ÂþÔþ ê·‚ÂáÒ9>S•ÎA'¿Jþ‰¿jï> ü×|UâíZÞÖ1k" . ÀŽrÍø +ññP—¶—©ÃŽ¡'‰ºGð§ð>ÃìÿðVkQóÚj‡pì~by=«öGþ2½Týžt{¸·C²_ÝòCqù×ägì áo~ПðQåøáÛRºt·ìKÄ B¹ÈÆNzWï·ü;à?‹ƒ“ü…<+V‰Ç’Jõõ7üósç~Êml¹-¥Xþ‡šýú¯çÿþ ìØ?d«‰´}³,}K‘ýUOã—©Ïœÿ…QZÃcΆÁETʉ”;QYØÌ(¢ŠŽNÕLÿv¡¬æEV`QEQE=:ÔµuÍI[Ç` +(¢˜QYOshlQEAAEPEPEPÿÒþúX`Ó³´7@hPO>•óZ6~vÿÁV.ï¬aßO§»#ýä Ëç*?Þ~5üÄÿÁ¶š†¡§þÑ:åŒGbË«0 mÄýO§¥hþxkã€ïþø¶3-•úluØçÚ¾2ý•?à_ +¿e?Ýx³Áh»î°;UJ–Îq€9¥í­NT­¹îa±¹ú"#!G9¯ç·þ -ÿ¤ÐÿjŸÝüqð2´^)°ƒ,«Ïœ€1ôâ¿¡Ç9¥’8®bh¥« yàÖTg*oš†ÅrJèÿ&Û„^(ð/Å› +ëš|¶º…ž¡˜YJ¶T‘ú÷¯ô÷ýŽ®ÅïìÅàé„o =U‘þò°fÈ?C_3|Zÿ‚XþÏ?þ%ŸŠ ‚ýä>Å]¤ƒž†¿Cüá3Àþ³ð¦-¬£ÆSŒªëµ~‡©ÅS”‹?Ïþ ¡\韷¦»©ÎC£1’&3ƒòœŽ¹9â¿H¿à¿ð[Ý#àÁ;…Ÿ´§ºšÓýT‰¹QP£±à8ýþÑðMÙÇö’ñ:ø»Çšq{Å9 §÷ˆ=yôé^3¡Áÿc þÌ–Q/íàuÀàŸÖ»¥Œ¥*j#{UÇPš´üÃövF"k•6ðûOÞôÇz<ÿÎøiñ ź…´ÏΠ䢬Á8Î:ôæ¾¢³ÿ‚?~Çšp-e¢|í÷™ÀlÇŠè|ÿ¨ý”üâxî?¯^køòý©¿d¯Ú#þ ¯ñéümð¾Îäi2ÌÒ[Íl‡h>¤qØ×ú `לüIøOàŸ‹Bè~8±ŠþÙxYTZé¥Z¤óø<ÅÆ^þ¨þB,ÿà¶´³ð>_kÞ¼:ƒÚ42]` ÆÝÃŒò:Züâÿ‚}þÆ?iŸÚÎÃâV«gqmf·âúiäS¸Ä€¯é_Þ ×ìyû=Þéë¦ÜønÔÆ«·åP§ë+Ð>| øoð§wü!tv{†>P?žO¶©ÈãÚçrÍáµt£KþÇð:èð‚Eµ „× +›@ü|cøã«¿ø)5׈¢ÓgšàêS͆ҬFp}šÿC2ªF1^3ªüøQ¬x xÒÿFµ}P>ÿ´˜ÉŸ÷ˆÍ<-IÑ‹ŒUîr`3%J÷ênxJ‰þiRÊ`ÝxŒùWñÿFÿ‚VüVÓ¿hÝOÇ~ŽKËÝ–yqй't8¿»{{x-âÂ0«À‡®xOÃÞ$òƹg×’w'˜¡°×- +uh»Ó븰¹£§'}S?ÿàŽß°æ¥û!ü-»žðºÏ®„’Uq€äm\×Ï?ðp€üAâïÙÿOþŵ’îDŸQIÊœÇ^Æ¿£ {H­a[x" @è®kÅ> +ðÏŒ¬þÁâkH®âÏÝ‘C:t¹ãQUê*YªûI-Á¯ø §Ãü8øªh^%GˆÏr’$mÐ#e°¶sÍ~ãÞ|"øu©^I¨ê:=´óÊrÒ2Çê{×IáŸx_ÁÖGOðÍ”VP“‘.Ñšè÷µ8Òr“œ÷g>+0s›”t¹çRü!øm,Mš%¡Và)kñËþ +'ÿ²ð§Ç]:OxÂ;[Ëh]ÕÓï2ãèGnÆ¿t÷sóR:,èU†AàƒZª|š†09sç¿mãoø(çÀçá×…-/Å­¤²gq%ö°’1Èç½} ÿûÿ‚oüvý¬~/Iñgö“k¹"Ža![ÍÀ±@)CÑp8°¯í~ÿág€µ fºŸK¶óî×”D›Î?Ú Öî…ámÂÖßeЭc¶CŒ„g3Z´ðŸ‡"Áo¦N8ö®êóO³Ô¡ò/bYPõVÖ¬’M%b©¤¬|´«6îaÂ!á¬/ú gÝùÉøëá€üáû^ÒífŽâ6-’7 ãƒ^œ„ž)õ§°MÒÅJ.éŸÅ¿íÃÿÙøßû/|B>:ýš$™¾ÝpÍ VŇÊìIÞÁêxðνû/ÁGj?Xøâ”-hBÄÒ;6 xã,Þ•þ„7znŸ¶Â’ã¦à+6/ ø~Þåníí"Içr®kµW©ÚÈ÷cŸY]­OÍÏø'‡ü¿Àß±ÿ€mÚÄu¹Yv†*qÈοC~ÈžµµÒ­WûJH”Êä|ÛÈç'ϵ~‰¶qÅ:ŠQ¥»{ž-z²¨îÈ”rkð;þ Aû(|@ý¥|5a¤ø.‘—©=8úƒŠýöªóÚZÝ \Æ®?Ú¦éÎRÑ€Å{s¤~OÁ#ÿg/þÎ_?áñ()#Ì$!—iàÈü•~´ÔqE(#…B¨à0*JQ¦îÜ·dⱬù˜QE¥¬`QE +(¢³šêg5Ô(¢ŠÌÌkýÚ†¬ž*0j&€J(¢²¢Š(¢Š(HûÔ•^¬VðÔŠ(ªjÀQE#EQE³ +(¢‹¤QE+ ´‚Š(¢È—&ÿÓþú‰ÊŠ‘FŠhS´Š’¾];—%­‚‘†E-!õ®‡n¥´"¨jP01KS(®S>Vµ#f`qšnö§fäñþ~´ž[Ÿÿ]r´ú &= #šu1~QÍ.õ¥í-¹¢E ò)j®¤29;S2GJ{|Ý( ëY™¸»ŒÉ£8§”½3i©eôI¤ øYᛯøÚþ +EÜòLáG=>µùiãïø-ì•àýSû6ÆâmEU•â,yö y$ñ¯“à²?²Oí}ûOjVÃ9nŸÃQíiíìÂç#– +Fü`õ'u©eÿø!gÁ‹‚‰Å(æ—SÔãYe‰˜©Gá[;ŠáŽNÓÎ**ºqIɶßCé(að°‚•MYûû8~Ùÿ¿i]=_ÁzŒI}‚ZÍäV|êTá†9⾸<×ùà|vÓükÿÛý²€¾ßÝ[ÙµÚ€†Vbªòa@9û¼àwÁ濼¿Ù£Ç·ÿ~øcÆÚ®>Õ}cÍïíÃ~µ¤ ©É'³9óLºâªSÙžæNMx—‹hŸƒ¾ñðÏŠuë[+Â@Ù#€AnƒyúV¿Æ‹>ø3à+ïøºqµ¬lÙ=ÈR@¯óÚý¯ÿm=câ×ísÿ —‡õ;¨ì`¾H¡(Ća&1Œãý*gMÍ6’2ÀàH¹LÿFËKëmFÙ/läÅ"†V^AkÁ~=þÒÿ +g_ Íâ_ˆzœVÂ5ÊÄXosì?Üýõ˜|Mð+ºí©,·z]¼€·Þ9AÉÇsÞ¿Ÿ_ø+ïìûQ~ÕÿlŸÀ3LúQ UC œ±nœƒXá!+Õz NUfö=£Å¿ðpìõáû‰,ôý>{‰V¸»)P§UËØ½Ia°õo­ôu×üK¡ø_J—Z×.ÚÚYÝŽ­~"~Ó¿ð]Ù›àŒ¿áðį®j0Ƥ`u;™¹ôé_fü{ð—ÄÚ?ö?{/‡·¬º®­¥Åp« +ìáåWÎ7}kðoö!ÿ‚ë–/¼gûJZIT.¡‰Èr{“QþÑ´€Ÿ ïüyâ ¤NàÅp=ñ_çwûu~Ýß¿kÿŠÚ†©£=¶op1+²†ØIÎ;œÒºaMÍsGcƒ/ËÕMf¢GÁÚ;á¯Çý#ûcáíßÚcTãû¾ÄŽ+Û®®íìàk»·  ³üÂÁºšö¡}á/i÷W&årޤœ•?/÷Ê¿Jÿà¯ß%oÙÛáû‚ÓwŒýÝ»Ž ê=¾µú5ÿÛø‚Iþkz-Ì¡î ­Ã€IÆ4ýzþ5ÛV Rçg£W.å£ÍÔþ›*9¥H#ie8U“èZb¹n~ÁF?l='ö;ø }ã{„^μdñ¸ñ“ú×%)s43EÎj ¯ÁJ>i¿´m·À»F‰ÝåX%ÜÀ8v€¾¼WéÄ7 $nÌ7Wù¦üøó«üOýº¬>#ëlUõ ^Ù£$œƒçF¸EÒ¿ÒO~–~ü+ƒ×ªðkT³}8\×éíÿbðÇÏw?u{‰^+©c•¢’_•p +;gñ¯¸¼Oû | +øsðRð‡ô 8ã²ÓÝRS–È^[8ÎiP´¥fŽœ<¨)r-O7ýƒ?à¡Þ +ý¨4tÑuk¸­µ¥÷Nvn!FTg©úñâ_ƒ¾xNóÆ~3½ŽÎÆÊ6–Gv…¯ó¥ý˜>'øßá—ü”ø'Á—²&’ÚÒ®Ö9\ç•ý'ÿÁs"øbÓÅ~ºŽîÖî5uxÛ#‘Èü+âïø(?í£mûü.>(i¼”â=ØÏ~€õé_˜ßð@‹~'ñgìQ”ÜG¦¬`î%ŒgËËžîyâ¿?฿·&¡ñ‹ã!øYrÒCo¡!vɰ犃XPÃ9VöWØâ¥€‡¶}‘ôN›ÿ®ý«~5x‰tÿ‡fk‰¢0¨™Œr2çúWê—ìuûYþÞ^?ø™k¦üNÒZ=!L¡\©<žz`s_?ðDo?²ß¿´½Á¿G‘d¸EÛ eB Ÿ×¿5ý¹ü8×>øÿÃö¾/ðÙ糸\Ç$J£…8íèj1•y*{5™¦2º‚qQ=*ÎF–Ù$n¤Uš@µêR^ê>c•QZ ¢¢rAâ—$ŠÏœî˜eAP²’j1j«Š/‘š)ª»WêjWÜiQO™QEŒ¤›ÐŠ(©º¢Š)I]%p¢Š+&ŒÜ +(¢ŽPäaHFF)i?, + ‘"›SÍ.zÊÉÙ² +*|-!E4rvaìÙ X¦…QN«‚°œlQE\÷$(¢Š“u°QE (¢Š(¢Š(¢ŠdÿÕþû“îÓ©€…Qš<Åÿ?þªùe¢5¾¢°'ŠñÏ| ðÀ×~:ñÝäV–¶¨Ïó°]Ä àwü¯]¹œA JzOå_Ãü#ö×ñßÄ?Wÿ³ÿ‡.Ú-6Tq×!㞆£Ø*Žìö2̽Öm½‘òí1ãý[þ +/ûußx«á4kWºŠ(B®á¶6n;t¯ïcöZð§ðÃà†¼­|·6viæ ç†â3íŸÃ¥,ðA/ØSÅO‹ã_‰mZÒÏ’„?¼^ç'Ôô¯ëkâÄ áo¯üaâ +[C“…†&·=D–Èïͪó¸ÒüéÿÁÀ¶Gƒ¼3ð½¾è·ÿñ:½BíDä¡9Åßõ¨üm¡ÛÚìye¼„º¸És¸÷ºýiý¨>;|!ý£?mMsQñD‚â͈]›åaÉzb¿0|u/…m¾:Û'ƒ¡òm ¼ŽE•Nîúx¯BÊ0q:¡MA(£ýA?cyŸ³‚ˆRÓ!\sú×Ò,‰'ÎÊ éšøkþ ×ñW¿e ¿†®¢š[+4†tFÃ(Æâ½@5ö¾©©[i:lÚ…ÛŽ.Äû +ó•HòYî|Ö"Ú³ãŸÛ_ö¹øqû+ü%Õ5Ï]ª]Ém"Ã`3) +Øú×ðWà#Æß¶¯íĺ‚mšW½¿K—tRt®“ùW³Ág?j¿üyý§õ‡ZUÃM§[Ëä"lüêx¯Øø7ãö"ñÏËûÏŽ>µò º„ MËór0zö¯[ÚÇ ‡²ø™ìÒ„hÓ}Ïéãá?„ ð7Ã]Â.ϰÙCû¶‚ßøñ5Öë:ΓáÍ6m_W™-íáÝØ€+[•øÃÿ£ý¢®þ ~Î76^Ô>Ë}t +²ƒ‚ÈÃW‡J‡6‡•…¢ëUågàwü/þ +'áÚÅð£|ždL‚7•yË“Æ{dþ•ú·ÿý“üað{á+üJñRßZ@è½Æn=ðy¯å3öý•þ#~Øÿl´Æ·š[;‹Å¸¹™Ærªû‰Ï$×úQ|ðŸðÇá¦àm23Zu´p€F Ø s[ÖÃÞJ»™ÕT©{(žûgþÍ?ðÔß &øc%ÏÙVv $yHÈ$¡¯åoþ +ÿ­øsû"~Ìöþ+ðÿïîÒeO0`GÌÄ‘ê+ûd= ~Á|íc¸ýn¼ÃŒ9Ûìq×ò®ŠJP©'¡çdõ«Ÿðlðhí|Y#ÌU¥ü£ÎAÛƒŸÂ¿i¿à«ÿ¯þ9~ɺö‡§ËrÚÛÉ:—ÀÆý~í~'ÿÁ´ºÓµûufhã¶3K1óÜ q_°ðY/‹zßÂØûW»Ð]’KÄhNÑÎ +žý¸®L4ÚÚ=,oûâ±ü~Êÿ´OÅ¿Ùâíſ¨ÞûWŽBZ8s‚À ž9¯Wý´ÿm¿Ú/ö°š âÕœ¶’³ V™àd€Wé_üÍû8x/ã—ÄoÅž8±KÙ¬g3JgŽ:¯ÞíëŠýÿƒ„?fÿ…þ øü¢ÛéƒH¡ÞÝùzg6×·,E9W³Ìï§5íì÷>¢ÿƒ?fKáìëwã›Û¸nSÄ/½<¡Ñ× +á~œWè×üö®Ñÿe‡ˆ.Jµìñ˜í_­Ÿðn·í%à/…Þ$ÿ…®^9Ÿ[Qo‰N n1·ñ¶½\{ýË;1æ¤Ñý´jWé–rßKȉ { +þ'?à°_´çŽ?l/Þüøek#Zi¢”.JŸ(äŸÄŠþŸ?à ?´å—ìßð Vñ|M™ZÝÄMØ’0+ø¬ý™¿l/Ùø£Å~5ñ´[¯/Y•ˆÏ$~f³ÃÁr#ÏÁÒå\ÏsàÙgG½Ñkÿ é:¼ee²¿eOW ¤ïÛð¯õ+ðÁá}8§ÚÄGâ‚¿ÊãÂ?-4ïÚºÛâćʴMLÎ_þ™™#JÿK_ØÏãÿ…h:7Šü=r'xáH&ìC(ã÷q\˜ÈZjLÏ2NiUÃ,çóÅ=ŸðY¿ø)F›ðáÍׇ3%Ʊ¨)IJ6 +çŒ ~¹¯Û_Žß´/†¿ µëWkh"µ«³Ãm89ȯó}øëmñöÌý­µ-'Á2\ê©vÈ’ ²Æ…»vÇZÓ.ÃFu=¥GdŽœ“ µ©>‡×¿ðEÿÙ#Uý«ÿkVøÃâ‰%,'³È2Pî'*=ëú¬ÿ‚»|"Ð)þÒ>ñÝLJ?g˜þ×$“2Œ¡mIÚ +ä?n;ÏÚóƾ1€~Òh³[‰cX-Á'ºœþˆÿàÛß„žÖ,õ¿kÖÑ]\4¦HK c‘ÙÎx®¯þTð…“•Ó•.in§ÂÜ#F$^CWË¿µíeðÛöZð-Ç‹üoq‰I†Ü}éô®óá·ÆxÇÂÆ“¨G²h +ìîÚ3×Þ¿—¯ø8cãm­ÅÎàfuŽwhØÇ~Jà{ +ãÃÕ•ZŠ›90yzušÐý4ýšÿàµ>>|A‹À‚5³žæá`Œ ±ºg®sÓÖ¿lm/¢½µK¸9Ie>Æ¿ËsöÖ5{oÚ«EÔ4é+HlälPàçI¿Ó³áÿ‰t]sÁúf¡§LŽ“ÛÆF}£5ž*R£W‘lÊÍ0‘‹½4xGí]ûZxö\ðƒøƒÅ¯²FŒ´y需3õUnA>ã¥|½ÿø®Mà%¶‹!îÀô;³Ò¿•ø'?‰/4¿Ú›Bo8™d’0N~è%{UQ¢ªRç–åÑÀÓtomOôÖ¶¸Žâž"X |íûP~Òžý˜þMãß ȹ®p y?Jö]Ç}áK+˜ú”g×WáüÛÄ×6Ÿ³­®‘):ʲ3arr0zvé\xj­ÉEžN„][Kc´ýൿ ¿hO‰Ö¿ôÝ=¬äžR‹6ýÊÃ8R2 ë¨#ñ¯òßý’~0EðgöŽÓüU­ÈaŠ9ðØ9ŽHÆkýþþÝß¼mà ?[¸Ôá‡0¦ü¸ì½Fk¯½””¡³=ôöhöÚÛö¡ð¿ì«ðÑüâ5YŸdHçjœrä‘è¿­~`üÿ‚Öü2øëñb?iºtŽ?›å7sü8ÉÍ~kÿÁqà¡ ÏðcÀÞ²ðouK&†Êä–<£©Á¬ÚûáïÇo€z÷ÃÍ&FYurˆÑ‘“žßC_ÎWŸø$Wííà¿éÚߋŮ›Èï™ä$/bF¯ê—ᾪxsÁZv‹­Êf¹·…Fõ*1\ÖKÙ»ž^24éMT§+³øYñ×ü»ûQŧêž1ðÓ/ÚW2Ã0ßL¼WàwÄ„Ÿ¾üH¸ðˆí– cLŸce€rÊq““ëé_ë’è6ìüžþÞßðF‰jÛÿ¾ ·…´«ùPÈCíp3ÏËþs[}ió?hiC§~cè_ø _À?Œ?¾Íñâé’×Q· Gª‚w ý;bµ?à´ÿðSg_\|øvS_Ô"uܧ €óÍ~Õ~ÌŸ %øQð[EðmäB«X%Ç*03ÇüùÿÁW?à??k¯Ú |aøo¨CEåýðã¸ÏRÕ†PXŽz»ô¥“lþ{ÿà–~øeñÏö¥“Äÿ´MêÊ&œL‰;ò[?3z_ßÏÃ_‹_³·ƒôˇ> ×´ò°(Š(¢•3Ó€5ü†ø'þ Æý§4›¦Ô Õ¢²º íq6ÌgÓo5õ§ì÷ÿ:ý¦þüNÓ¼i⿵Ê[ÏŒ«30Ú„:õ b½|Ê®«sSÔô*Ñ£5ïÈþ—?hoÚ Â¿¾_üI×e_³ÚD\1?/N ¯óÄýº?nŸ~Û¿nu ë¹!ðì7_ê÷}à§}:zW÷ŸûY~Êú×ǿٶûá—så]L±í,~WØ9Vö&¿–¯Á¹?gñê5{h&f%åÜB=qò×ð¯? ^ +îN +Tag©ûKÿ¦±GÂO‚zgˆ|?«iÖzÌÖÈfyåQ.äŸBkö×Áÿ<ãÛf½ðf©o©ÄŸy­Ü8•%>ÿƒ|~8è@[Mâr˜´*'¶¨ÜÃêk÷§þ Ùûø£öBø?†|U©6¡<Ç©bøÏSZRQSæS‹0).u;³ô{wͶ¿¿à½v·—±ž¥¸,'^+÷ ¿ò?í«û3GûV|»ø[$«¹a–<;àú×­Q^J}Ž<·VŒ¥±üòÁ¶M ¥†¿¦’¦r 2Ê®çÍ~˜ÿÁq¼¨øÛö<Ô4í2ÞI¦ÙLc8*3Î=kÙàðO=öÒõM:Îqt÷Ï»Ì n9ú_¢~5ðNãï\xgÄ-ťʕt`Áú׎éËÛ:É_S»„±>Ñl Ÿð@ÏÚwÀ³_Å­{Bø›xšm¥ìB6’L¨GÏVãC_TÁu¿nÿƒÿ´K_„Ÿ 58õ7µQ#IC¸çwö¯¾¾ ÿÁ¿ ü]ãýKÅúv®Ú|7’X`]™çæ<ôöÈx_þ ØøM¤ø¶ßZÕ5i. I•ÝX–, çõôæ½/¬ÐU=£Nç¢ñØ~k}Ngþ ×ð7ˆô)×/-$¶Žñ¢ò„ŠW8î+Ú?jø!¯¿j/‡Å-kWki¯Ì`ÈN_МŽ+÷áÁŸ|ðœð-šZ[BЧhÆí£5êØZóÞ¤ªºËFÏ2¾m'6á±þzðT?ø$eÏì?áȾ!øzâ9, +ç%–Pý€<†â“þcûø³ãÇë¹6v:D«tÎ8ߎŠO¥nŸ¶OìàÛጟ|e'Œ~Y6†À=r:×—~ÃßðOß~ÄÚuÖ—á;¥»[ƒŸ0¦×Æ1ƒ×¥tÔ©zN/sXf1önïS¹ý¬¿d ~Ô¿›á_ˆä1) ¬ª2GczŠü8ñçüÉð÷Ã>Ö5O j®÷KnÌ#@rÊ€¶x¯ê[qÏÉàŽîÙí¤û®¥OÐŒW=)J <èfSÙŸåO¯þÏÚ¥§íÿL./E¶æêlM¢—üãör´ý›ÿg 3CL›‰aŽixÁoCšùüÿÁ!~Ý|s?õ’ȳ›…Èç,Iéí_¯~‘¥G¥EÊGŸ@1üª±u}ªI+5ñ‘vå?‹ø-7üÆÞ.ø‡sû=ø&éííà×#çaÀSíŽs^;ÿhøÕû0|Ô.ücñªt·½IÃ.7nÏ'8èkú ý¤ÿà‹h¯ˆóüHÖ'–ÖîèþôpôÎGç5å>ÿƒ}?dÅ’I.ZW?6ì2ãýž„UF¬=›=ʘü;§È¼~ÁHeÿ‹>'²ðOÃýb;‰î`QÆßLù¯‰à»_¼añoöU™<h÷RÂÞaØ2BŽI¯¨~Á*¾~Îþ+µñOÒF’Û§óè +ý!×|-¢øB—Ãú´+5´¨Q•€#b¹9\j©ÒèyF”Ô©Á÷üoöððÿìgâcÁßÔÅläÆÛˆ6Ï8ÍCÿ³ÿ‚‚øGöÂÖôÏ|¶šòv‚Å,Ùà'sï_Ò·Œ?à‰²ŒüUâ»ý<‰oyŒp½p0ZÍð·ü'öZðß‹-üP¶1ÈÖÌoL{šëXš^ÓÛr»›ÔÇДùúž1ÿ"ø 㯅¿²£ÍâÔx/o˜KYᇠ+ÙàßµÇü+öý”¿hÙGˆ¬§-´ÛT¾Jõíœöý/xOÁú‚ôX4À–öð EUp|b¾uý¥¿cß„Ÿµ&ŸñÉe0$æÇ§¡¯>‚q¬êUÓ2£¥ÎùÖ‡ãÄŸø.×Á/ü¼±Ò i5KÛf…ã*U·²ààtÅ~~Áß þ%~Ñ¿¶l?ìì&[A¨-Ü÷ äs_Ö´ðFߨþ5D:O˜±ãåu\êH¯³>þÉÿg› -ü ¦Ç’6|£rŽÀWoµJ(îv,Ò…*mSÝŸEi0É—l’®"PG¸´vŸZpëK]ôi¥—r»¸Ü7­/ÍëKEiÈ„SšÙä<5F,Èî+BŠ9>ÆOSKöAÐãüþzŠ9Í¿üæÂI>¶øÊ©Ýž˜ö¯áâ}_Wðõìz†…#Au!ƒ`‚FqÚ¿¹Ïø/³FŸ -cc´K†?NEÚ¬Z¬«le˜¬j[žõ͆“QlúêUœ(Å£ëÍ?þ +!ûSiÚXYërD¶;@;Ûæ#Óú¯ÿÌý™<{ÿñcxëã¥Ü—ö²w9` OS_œ ?à”¿µ—ůÛx·ÂzSKkx¾fÂ!}‰ëô¯Üø'7Å]Sþ ¥ÝxOö²}!$Ã`@b?1ʹ1˜ßw’›ÕöÜ穜•£¹úµñþ !û4ü+ø{ã/émµiø¥¹Gœc¯ü¦ühÿ‚žþÖþ!jžÑõÙRËN˜Ã‘#¡8Ûž˜?OÆ¿r¿k_ø8átßu=3á¶Ë‰oÑ­áPr Œôï_ÅçŒ|M¬øïÄÚŸ‰µÙ°ú”ÒLË׎EFò-uõ4¥Q¥ï+ŸÔgüá7ˆà§šôÞ1øç¨=Ä6“Ãg’Kz÷ÅO¿à›Ÿ³/ÀÍu|Eá %È –pÔwüHÁ%ÿà§>ý‰þÓ¦ëÑUù6Ž“_Ô—ì¿ÿ«øIû@øÝ4·óØ!ôcÀ¬«×’º9+Ê{Eè~íÃp †.@}+ùœÿƒ…l[PømmÈaòÐ30ç#Ò¿¥:þÛT´ŠþÑ·G*†Sìy¯æwþ¾³ðÿÃý:òø.çÔ÷~teòµX۹ǗÉ£?“ØZîÞÃö™Ð­²2±$[ 8¯ôîø_hëà½2V}êöÑ‘Œà£¥“wÉW¿þ3Ù|C³C/ÙˆF ' ô¯ë«à¿ü;á/xNð÷‰ ?gWÍg$Ü W~sƒZ©Àôk×u´G¶ÿÁÅ2¬,ì|âlJ§¸ÀÀü´ÿÁ;¼Øk "‡fB7wät÷¯ØÚ'â÷Åø,/>ÃðÎÍÓL´DU¿v@öÆr;Š÷ŸØ—þ;ñ/áÆý3⟌¯ά‰"ðs“YƬ(ÃØÍê“:ãR1‡,™ýp|(“w€ôÕ=|•'ë_‚ðp³·Â {{t-•ÞÙäa§½BžÐâðþ“Ï•OÈWÀ_·ßìy¨~Õ^M&Å‘^4 —9>À•ãaêrMN[qöÜÿ3ý]äÓ⸼vÚ¬ä€z®}j˵øËñ'AT:.½yl¶Ã¢vÛaœb¿¨¯Á¸ÿ|I-ž—¬›[iÌ6ÅAà÷’Ó¸;Ÿø6WÇÒIÕÅÿ™+°êÄ… +1‚Qƒô¯V¦eO¹ê:ñî3¾(Õ.xgOŽÏÃÚëÍxòãUé’é_Û¿ü‹ãW>)|ó<]t÷G/2?ñzì;ø'Mÿƒg­nµhÖ¦ÖðÆø%œ#ûÅG'ó¯è³ö!ý‡ü%ûü5‡ÀZój o3 ’{c'ÛšÖ®.!É ÉÆb¡n×>ê¹¥¤ÈéK]+k'=‚Š(©t÷)lQEÎ]ÆQEL£$'+QSi QRäÑGÿ×þú¿‡4Úwð~4ÚøÅ¡¿R@¡–—`ôýhB®Gƾ=ðŸÃÍOxÆõ,lãë#篠dÕ˖ȸA·duø# 1!jµ7yvÑà¹Ú $óÀµùKãø8Óà6…ªÉkáÍ-õUT‡¾÷uàv隨aêµuЧ”×’æHþ“ºž) +Œò:Wæçìÿð_í¿kpt 2m6[x„§ÌèÇ8etÇPOQÛ×íߊ_<ð‡Â^4ñÜv¶¶Ê[ç`»e÷5„¾.I-NyàêF|–Ôôjp÷¯çwÇßð_ï„>ñ„š…¤5í²É䬡·ÝÎW°¯ÒØïþ + ð—ö·µ0xrd¶ÔTmË ü¤‚?—àjy$µ”t7­–Ö„y¤Ð0ƒ4í£ªWVö°µÍÄ‹',Ìpã_‡·üÃà§ì­ã”ð>‹?öµÔcù +$]àÊq–Àã>Õ×BÓV‚1Ã`ªUvŠ?u(§Wóiû9ÿÁÀ_>'øæ xÎÓì·2b9Ú# +rváœÃ€ ûWôCàÿø{Ç~µñW…®’òÆñÇ,dAúwëXÔTݤ…ŠÀT¦½äu*0)sšAK^¥:§ŸÜpRy£cRGJ]í[Ç—vᱨØhÞÔ»Ú ;±¤cŠJRrsIK‘ÂŒŠZ1Þ¹êÓ-;«!»€¸ðþ§+¦’ïon%$.Áшž ~Y|Vý¡>,|fñø§âûÝÞK#<İ)µ†¨9À×Á{9sô3>Y¹;«LÑÜ­òI€N×ÈçpsU~ܲéŸg²Yy‡;À?ã]oƒ|'Ä߈O,I¨J±´Î#8Éïì+ûøý‡àŒ?³Ž‘ðM¸ø…¢ÛêwwIæ+Ì€­ÐŒŒƒZfåJÍnOy ÿä|)þÁø2Þ-º·+$ÒÏ"a‰b@äûb¿©jò?ƒß¾|ðÄ^øwa…”X dw¯]#äF.¤ÝI­Ï7]IݰfcJ…º5IEjé#‹ÚA=͵ªy·2,kÓ,@™¨õ´±°’òC…‰ èzþ&à ðT?ÚÁ_uO +xOZòí¬]šá× ÜHØ¢Ž1ëUC í$ãsÐÃaDÝÏí²+ˆ' uqê¤åR×áŸü£ö©ñ§Çß„“ßøòé®nã›Xî`„.ß~M~Ük—§NÑ®ïÔàà ɟ÷TŸé\5!Ë'Ð+aœ&¢ú™çŽ|!᫤²×µ-epI$U8Lñɱ[€˜{×öƒûe|'ñOÆ€:÷€< ŠþþÙ㉎1–Ãg ƒ_ÈWí)ÿJÕ~þÊz·ÅïmmsL ,Òno˜7@¿NœÕaekKsèr—N+]ÙõÏü£ñ‡Ä)ñ&«á}rþkÉ«I#<…Ç vIÇ^•ýPüRø…¡ü/ð6¡ãOL°ÛÙÂÏ–8ä{×ñ×ÿãŸ/­@ ##+À+È¿¢ø+mõí—ìcâFÓ35øYû‰Ú<Š——¶(íÎ>fŒ1¯äSþ ;ðƒHý½?k;Éþ+"ê ÎÒ¿šIç=ø¯êÿö­øc¨|ÿ‚eM£,M,Ðiq¼P‘ŒŸÊ¿„ŸÙ#ö§ñ¯ì ñ®ë]ðéf¼†è† +›†ö¬²ŠNxiòîe…›äqý&ÿÁn`ς߳Á /âGÂX[OÔ`¸O1AÑ€P0zú'þ Ûý¡>%|@ð¾±ðëÆ—Ò]ZÚD&·W%‚Œãä'õ¯çÃþ +ÿeøËûkxr/]Ù²[ȰFEê>µýÿÁ½_³¿‹>|4xŒÆ>Õl*Änç“ëKJT°¿½Þåâ£%†|çôÎrÁ¦å©3ÀRRgÄKre9Zu5>í:º.HQEÞ¶7[Q] c¸QEì ¢Š*\\ì(¢ŠÉîHQE€)AÁÍ%¼vIÉÍ%S¢Š+)7sXÅX(¢Š\ì|ˆ(¢Š’‚Š( Š( Š( çkþ ÿw%¿Â dˆÜ±=1Í?¼iÃZ'õ'ÛS†vô(ÙýËÁ} i> Dû† o]§‚ã_À–¼m¦¸.ÙÚ¬Üôç]4}øq?ÐàÏüóör²ð–—cãF—ÈDýÛr¬ã_¯_³çí!ðçöð±ñOÃëµ¹„¤3€x¯òIñ[Ä…RáüÑó ŒHÉþþïàÜMGW€Jš‹•Y+NGé\xÜ :pç[†' MË©ý=óÞŠxeèzÓ ¯6j)]3ç’è|ÝûFþÓŸ ¿fo 7Š~#]yH²¢õ uë_ÎíÍÿîøk«ü2Ô¼ðªÊG½½FfíÏ8ö­ßø8»ÄPÝiš^“a|É%¬Ež$'“×5üMjºÅ«ih˜4Ó+•‘@*Äg9¯C ƒŒ©)Øú,-(ÆÖÔ¿ñÅߌüUyâO¾ùnK>P`€yúWWð3övø¯ûFx¢ |.µy^r“:¶Ì ç8¯¼½ŠM2K»bÄHRsŒ×ö{ÿÝü5ð¾§ðöÏf¦e‘THØ,÷Ï­1¯aO™{+§&~Gü?ÿ‚I~Ô?u˾.Òf–-$¬ÅcVeUBNï˜c5ýü5ÿ‚åüø_à-/ž4ˆ»qÒï —+íí_Ð?Åm +Ç]ø{ªi·Q+«Û¾Ppvœ{ÿ1ø(GÃ;ÿü~Öl-¢–îÖiv§‹Jþ&¸©GëZT2õV:£ýdÏÚ÷Àßµgƒÿá'ð³"°8*ŒNy úW×¼ž•üÿÁ»þ=мðõ´¿ß‹fgdT˜íàŽ¿NkúŸ>˜üÈõË6ƪr}1š–Õ)¸t<¼vÓ÷‡£cK±«„O‰þ`¥µ‹T.2ʪ"x«º¼«+¶—ªÚÜ8c¨ÁO¾_Y‰Çõ9ÿ+,xİ𞥳ï}–\c®všÿ1ßø(Uì—´O‰u+rŤ¹du²Ùžâ¿ÒËâg<-¤x U½¾ÔmâAk.ȧ‡§<×ù”þ×F|zñ­áûyîlü÷"EBCÇœ +ô2‰sÎHú ¢›Pw?¦Ÿø7‡Ä‹sðú]?wï·`§~ WõQ­Ù>©¤\ØGÖh™9ÿhb¿?ø7©bÒ4íV}AžÐ«²a·8bwq_ÖÅÇÄoépƒy¨BŠÞ,ãÔŽ•åcãˈ’fY…9ûDâ¶?›Ú¯þ‘­üuø™'‰´›–µ‡{ž«äíÎ:ëšýRÿ‚rþÂ?ðÆŸ cðÕÝë]Ýnc¼¸RK׿$×ÙOûGüŽí¬Oˆ¬üå+¼>•é~ñw‡|YkößÝÇuèÈÀƒùR©^¤â©Ïc,F.³†ªÇLÏj˜¿çÿÕLMJõ¯B”ìqêME àb–»ÔW-lQE?fÆQEÍ€QE2§ š¸Ï,Ÿÿ]ZÿŸÿ]>ŠàžãHÿÑþû_¥5€ +)ïŒsHFTWÍû2¥¹yeÁ¯Îø+ íý†œ¡ë\Ó¥ïÅ®ç~\¯V'ó­ÿßA¨Mñ?T–xÁL—\»òòO§¥cþ>ð†~%xfãÂ^-¶[«+¥*èàƒ×­ ¿ðmìÉÿ þ­ecƒ°Íæ¹'s ƒ{Í[_>(iŸ¾êõ…/m¦Gæ8Q“Œâ¹±ï›$[8‹uÒŽçÏ`oÙëösñE׊>iIo-ÑÞP¨Â¹êÃÞ¾Vÿ‚Úki±>³o8 Á*À÷ +2ükؾÁM¿g¯VŽ÷—ñhó,†5Y¤\1Î1ì}«óçþ ûM|*—öe½ð%–¡ows8 X—ÀùHlð:ñÅg„ÃÊ5T¤N•EZ.kcòçþ Íñ¯ˆ?á!ñF~ 2· )ÂäWçÏüÒƒþ +sa;íjŽ\ôû¬1ƒëšûÃþ ŸÑÞïâ߈­ïÏ·fNI!8#>ƒÓ½|ÿêðÅÏÃÿø(8×m1ž¤‘yì­·G=k¥A¼lùv±ïPjX‰[±ýÇþÈì»áIvüÍ6';ŽO*9¯à'þ +­‹ÁFåšÉÀ+¨/ÌÙÉ˦kû)ý‰nŸ€þÈžmWYŽ;»&%’8f;3…íŒwÍÿ·oÄï +|sý¼çñ_¤6­~» Gp,¤…<¶Œ£Ï̬rà)Ê5§&»ŸÚ7í7ñ[RøiÿÁ‡_ÑvÆeÑbFaòíf ¯äþÑû(h¶í/­j?¡K‹X. Œo‰ÎxäWõ ÿ ðάÿðIÉM²ù¦-6ÀÎB„äê¯ç#þ õý¢ü5ðSãÝՇ‹Q2,BraGÌO¡žià*N8Iòos"ýÜš?Kÿà¶ðNÿŸgøþ%øM‹M’Ù’ÚÁÏ<ú/ô?ü™ñëÅÿ~ê¾ñÀš=5T¨#¯Ò¼³þ +ý´¾ ø»à›ðïÀºÔZ”— ØÚ¸;xšÆÿƒgl5K›oxìmc2(в·qúŠºêr§Uërês}Qóî[´S›­6¡ŸÉ“îÓ©«ÂÓ«qQ]‘—FtQ]kc¸QEÄQEQE`÷¢Š)QEºØŠ(¦EV2ÜÚQRPQEQEQEQEüêÿÁ~ä‘~ Çå›`Àúkøzðßâ4ïiĵ#³;`çó¯îþ‘£ø-lð¦ç1¾?à$gù×ñŸûF&ý¨¼,%‘=ü (•O3’? +æÀ¿rRó>§ èųúóý”¿à‚³»|5²Õ>!@·sÝ[ÆçrõKfºßÛ"oÁ&> ›ÿ‚ùP¶A e?CÀãÒ¿{>é³ižÓm›Ø÷p1_Îwüiª$_í¬çV1ª«ws’}€âay§Usꎛ¨ÖçâÅßü¯ö¦Ô”êwš•ÚÇ! Á¸lÙ$~„Ÿð\ÚÛO•ïaÕÚÖÆuÙòrG±ß“ùWáå¢&ŽÒÉ#¤úWó'ÿÓ¢?´.·{¤ÂA á¸nœWõÿêMm7Á·X9hB©Çr@'?Ê»sšoØ_¹é×|”›?§‹ë(u I,§ÎÉSC_Ÿßà™¿²÷Ä]RMXТkù¹›$·\ñþú ss³Ý\¨ƒsa__?೟³Á_]xè¼÷v®Qœ‚©‘Á÷ãèkÈ…:‘~æçÏ`£Vø?ÿMø ©~ÁúÊë ®†›§N P‘óc9Àõ¯Âi¿nÚB_.fñ$¨‘ò¸Èçð"¿Z¿nßÚÃÆ_ðToŠ0xà^™qz-™­Š² ÏË´úS^=cÿþþÙZ¾ŸÖ©Ø ù…c °øq^¯¶P²ªõ=èÉ­±ðjþÞ´Èˉ¤*Á›$Ÿ©­½ þ +#ûMiׯkmzRTd®ù-ޤ)Áükï(?àÝïÚsË6Ù÷1z3ŒçÒ¿>?jߨSã—ì­©ÉŠâ nÿ:ÊS%ãpOô¢–"œådkõ‡²g³|$ý¸ÿi/ŸtïƒÞ:ÖÕž«0WuÜŒ8ÁŽýq_ÙìÉÿ´ý››áåž«ã 3íWòÆ 7™œ’3“ŽZÿ;ï‡Ûá·Ä]#â-¨fû£jôÎNêþÅÿgßø8áw…¾Xø{Å«_[D±3ÝF7pÁ¬±të]{- Tç?€êà©Ób Yê_Ù´¤š’F„í`CaIÅ->2ý¿¿jÛ¹ÛK²ñMß“ ,Ufe'=7û·þ +{ÿX¹ý«uÙm´;X—O„gr˜ÏñŸ­~jz•õíÇÚ-SΞëlp*ޤàƽ4’‚SÜÞ[«=Ϩ'ý¯þ6j­î«¯^Ms.TŸLðp{à×ömÿ ø×ñ+âçÂË˯J'ŠÞEX™X°*GÌ3í_ÏŸìqÿø÷ûQx×âGŠ%þÊ‚íT…s´÷Q½\WöKÿÐÿ‚|è¿°o¨üar×¶íÛŠŸ¼s’@'ë^vcŽ¥?ÝSz˜b1)E¦~žGÞ‰;R!9Å,ªit>bkBJ(¢½ˆl0¢Š*€(¢Š(¢ŠLŠ(®7LÿÒþûÈ KŒP(¯ ¥s^Up¯?n_úÏíû7x‡án‚Ê.o↠Qzúøœ ×­x÷Á>½M;^Õ­,î$û±Í2#Àkƒ+KC£)FJPÝ„ŸðH/ø&—ÄߨÓÅz—о KµFâ8צ@‚8"¿w|wà}â/ƒõx¢¸°Ô¡0Í ‚§‘ùé,¯-/íÖêÊUš)UІR=ˆàÕ·8®xòI:’Ü׊IóËsøÌý«?à†´eÇÅ»æø yåh÷r™áÃ2"¶r ÐÙäs_,x£þ?ÿñF±kŒõ©D>YÙçyŠFHÉÃÛŽ+û¡ñwÄOxÐÞø»S‚ÁÏï\) z¦¹?ü~ø7ã¹b·ð¯ˆ¬îå˜ád‰ôÁïKûN²^G ³*üº£áoø&wüŸÁ¿°·ÚÆmZöö«Ž ;¹9ê;zTðQø&OÂïÛ‡Á7ÇÄéݨsÕC“ØsÈæ¿T“îÓ&dEÞÇQ5&¹¢ìÎã*)óÇsø§þ ãý¯ôÍ!tOøäÁl©°F%ØŠ:àz +úCöÿƒu߃¿ÿá;øùq¤Ö÷>h+óÁ™Ï&¿¥Ýcöˆø- êgEÕ +xÇ_ &øUâ5ŸIšßìþQè£nÜq_ɧÅø7[âN£ñ«VñÃdXiJd´XÑWb“Á,|ÙÉ œó_ÙVk“ñŒ|)á ayâBÞÂ68 3„ÉøÛXðm¼˜K{†‰AÉÚA#<àp=kÒE7§CÖÂ%=bgŸðm´²| ÔõRF7$$c’Sj†úué_Ó'Ę$»ð­k !ä·uë’1_Í'üB.­~ë¶·½|è„}²›üXšþ¡î­á½·{YÆQƯ6«ýäŽ<ÎV¬Ÿcü¿à¡:GŠü?ûNxŠÀÚÜMÓHÐRWˆ¯êƒþ Ððv» üšï^µx¤„±n]¹RäŸ|×ìoŠ¿àž²·5yõßør9´ŽØ$–98È8澚øiðƒÀ 4H4Ø%•½ºÑTº:1^\[ÄARå±¶'5„éòõ:?F_º‚€mäGÊy¯óÿ‚Šx[Å?µ[É´ÙäÝ3I¿i` ê2;f¿ÒšX’hÌRŒ«õ¾IøûþΟugÖü_ Å=Ä‹°°x8Î@ôïXÊÊNlÃ+ÇÓ¤š™üÐÁ½>ð®—s¯ë1Ä—¯¶X„¸Þ%Iç¾Gý}[jz4ϲÚxË‚¾˜¯äÛþ +à+_Øò/|Ù1Má"m»~l ãä“_?±OüöŠñ/ÇïøGÆ:”—V÷²³±.AÝÆ¦8¬e„ö‰Öèbp«ï&~[PŒcƒ_Íü ð¯Zñ_´ý_@µ7(dŒ„Yd8ÛÈ#ýxW}oÂÖwÒÌñ!cêH¬Ÿˆ +<ñ.Ùm|UiÒ)Î$]Ý: t¯2 ¦¥ÊÃVTj5#ü•µ?øªñæ\¼PFÆY|Óªôê0kÌ#‰ö¼–©±±µ¾§¨¯õý£?`ÙÓ_øi®ê6ž³µÕÙ¶]$*|•þr¶GÃë_„¿u-ÅTÆ“HK'Ü''¦=îRÅ*º.‡¥Jq¨ÛGÅ.u8®áÓlmfºyNШ +3ʾ¼ø ð‹âTß4øŸÃ—èPM¹^Tl3´~8ë_µÿðAOØÃÀ_"üG°Žò5 Ѥê9!xÐ×õÑñÏö1ø1ðŸRÒt +ÒÎkx‚HP0yÇNs^f78>D8´™ƒûü}ø9¡|"Ñ´ïaµ o#Œm"¿B|3ã/ xº7†ï¡»Uëå:¶1Áâ¿Íçö³ø¿ñ;àÇÆ OÃÞÖ¦·µ°“b± +Áã®*þ‘ÿà€¿>!|\ðmþ§ã9ÚyY‰YÈ+•, õ'œ+(`åM{gÔ19te+êM>j{õáÀÅ-zôè³æXQEéEhES¢Š(¢Š(`QEsÿÓþü(£­áT^ï25ûGäÿüãþ + ¥þÈ?'Ó|;w +x—PC sÊ»µø!ðÛöÿ‚€þÛ#ãÕïŠ^$¼µFÒÌA1œ~•äŸð_s?¶&›gur12lFcŒîÁÂ×õ‰ÿéÒ¢Ò?cßEñÙ‡#Ó=«ÎÅU•q”7gÖÊ+‡Œàµgâ§ìkûf|Sý>3Ùkö›¼yây<¸d–@Á2xÆNyÍA?~0Ëðóà^«ñ_ÂÐA­lÍă%ò20+øåÿ‚°jöVŸðR{S¨H#T¾ÈüFÜûWöeð†-Æ_<>o­ãžÚâÂca•?(íïYãb’„Öí\Ç2ŒcËY­OàûÅž<ý·ࣿ´%ç‡ã¸¾/¦Ä0ýVSÀ>þµôÄŸØ÷öÑÿ‚oèvßa×'¾ÒmäV¹ŽW#Ë|qž9õ¿²à¿Á…š­×Ž4-ÃHÔ´· ¦ä’{WàüWöÊø1¨~Ï— jö·:”À<À8åGEœŸJÊŽ*uk{.[DÓ[Ú>[hϼà—ßðQíöÊðÐu WûkM€4ù,Xã‚K7ð¯ÿ‚ÁÁN×öYðªü,øs oêãÉFSó q€E~?ÿÁ³i{«xçÅ2LnÌ ŒqœcŠùWþ G¯j:ÏücM°¸!Ŭ‘‘±´ã®Eo…¦£^pZ¤iOIWÐúàoüöÎý¤<,Ÿuo\ÚËzíHÀ6Fà:÷¯eýoO‹²íß³WÇK£t…ÖÞ&v8P;×ô×ûƒoû2ø>iÀù´Ø°1Õ}+ø]ÿ‚¦j2è?ðUuÔlÁŽ9nãd=ËzVe,Kwèc +j¤ålyÿþ<øOá' Ÿ‹ºì‹ö{_´¯<·p¯ãFOÚ?ö®ÿ‚¼þÑz„~_OcáÛIš8 9V=ØÉõsÔú×î‡üÃIJÅÿ½{¡‘4úD + Œ´@gé_?ðlµ¿—ã­NÞEÐA!ߎ>cßßÒ·Ã?öIVêðØxÒ¥)­ÎÇã·ì«ûJÁ4t«Oøõ;UG$=Aϧ¥AðMŸÛsBý±¾&¥l¯þ˜‰ÛÏß7§Jù³þ Â~ÅWò: !;»+óÿþ ³ñ +·…u +僱 ÑÝTŒñÚ– ÍKë{ØÎ¬}¶Î]êêŠz¨#&åóÿë¯zlLŠ™#ˆÐ¹è9©Nüg.?º•sc_-6Ñ­wf/ðXø(ö‡âý~NÂîñ¼‰¤Bv¨c·;úW†|ÿ‚êßü gñgSñäz¦¤¢àŽ yœ†çŸ¯µ~mÁE®§Oø( Ëç+±¹GS*€¸¯îoà>¹£Þ|Ðu 9ãdLLæ6.#äñÒ¼lÂs§*N×ZŸqˆ¬èÓ²?—ÏØÛö ñŸìûS\~Ëž7¿:•Œ—R–líÜØÈç¡ý+ûÒïQ°‚þ?»:,ƒ>ŒοÎ×ö ñí¾µÿ5k«k•*oÒ3&qÀ|Wú +ü%½mGᮃzÇq{9õ zu(¨U„–íjyÙý4ásÑ_­2žýi•é½Ï’ +(¢QX=À(¢Š@QEtQEQEÎt ¢Š(¢Š(¢Š(¢Š(¢Š)=€þ|ÿྌáže·v8–*;d 0üE_±¬ÿðÖž È[˜ÆÜ`6\qï_Úü +ó¿Àh-íÆæd“o׿æ+ø¸ý¼I§xkö–ðÖ·«§’-obÆîÃ8ü+— M}^VßSë0ë÷?ÔÇÀ±|)aÿGŒþ%kÎhÚ7á§ìÕà·ñ¯Ä{±kl3´‘Ø{Õ?„Ÿþø¿Àv:¾ŸªÛ„HNç +~U¡5üÄÿÁÀßµŸ‡|SáØþø6ö)ãµ +ìêüïÏÌáÖ¼ì¾ødyTð\õ¯5¡÷7íUÿÀý˜cøC©é Ô&:õ»ÅåíÃàŒdn=3ÍÖP>öüž}«úZøÏûW| ð¿ÂÍk]oÙ\„µ—Ç(ÞÇiàɯ*·ñG•ŽŒªUØù§ã§üàÀßOá}NU¼»G QÈIêyà_i~ο´o‚?hßEãL¤8ËÅŸ™ó¯ó3ý³¾(ÉãÿŽSøßJ¸‘­!‘ÌaŽr3À¿¨Oø7ÿö¥ð•Ç®¼/âËÿ³Fy”ðÜÕ[šÐúïÅð\/‚¿4û‡~´Úžë5Îì¸Ç +@Ï_¥~rxÇþƒñö¸»ºøuqª³³ùnv3çØWàOì}­A«~Ôž·œˆ YÓfx!¯ôÉø£þÞœÊ>Sg8êvŒšíÅÓXi/gÔôëÊ4!x-Ïæëà¯Áëßø$‡>Ùâv7–Qò6žž•ßx§þ £ð÷Å–³xÂÊÃRÕCÙ»o˜¸ïšú'þ ®-­ÿgËwP¡äi†;Pàþü$üñÍ·ƒ>)i^#×fyb‚TgÝÆ0Çå]‘ÂÓ­Gž¦æô'6êZÇþ¥ã?Úæîo‰Þ&½‚Î é¼ÆîS"0ÉûªsÉö¯ßïØ3öðoìIðþ? xno>G•ù<àp8 q‘ŸzâdoÛƒö|ñ7Á + ïÙØÜ­º&É¥DÜp>îq_¡¾ñ¯†ükfoü7wÜ ýøØ2Ÿ¡ó7©)(Mèqãñ¹ZKÝ;001KEõt©Ù#ç.QEjEPEPER`QE`ÿÔþûÇJSE!8¯ +? ÍVçðAÿûÓíbýº"TA"Ço”¤å·™kûý‚’Eý’|ffÓã$~ülÿÁy^7ÿ‚‚Ax¡—ìopGïϦêþÊ¿`ýBÏPý’<uiŒgFÌ3‘\Ý;R§cësþËÿðY2ÜÿÁJ§¶²ÈtXeQŒ’F09ìkû@ý‘í¦·ý›ü ßxi°ç>ë_Ä/ü_wÿ‚’Kq£NHŒJz*í8÷ÉýµþÊÑØ~ͽզƒL‰ËÈ@ +¡z“éŽk t’&×B³jìÐKs¥ý£~럾ëðõùÓnõ( )8?s=M _ðRoø$Çǟ٧÷_¼G~|I·-ГåHËc…oN8¯ôÑüI x]´;ÈnÄxÜbpøÏLãé_Œ?ð^«Ý"ÓöÖùÕ&gP»UfT#ð*Ã.ªþ²—s‡-­58Òhùgþ Þ¶ø7¢ü ½¶ðÙ‹þ&/-ì€e‚m·\Wà—üªâ+_ø)Õ½±Rò$égù‹>ö?ý ÿƒeàŽMsÆÖ¸& mâeýà²0$Ó¨¯Ëïø,…ø´ÿ‚š\\FÇu£ªÌDù‚ðsÔä We+}v¬WcÚö*8‡cûéý’ uý™ü'äÓ"  â¿„¿ø*ä‡þDÑêxŽxÊŸC»µu¿±Æ²5¿Ù¯Â—.»vؤdöF+ø"ÿ‚³jbø(õìöN&Qp9 ó‚?*Œ‰|^‡YüiÜþ—¿à¤rYÁ+¾Ó,„¢év‘‚{nŒt¯Í¿ø6uçˆüIy°‚¨8ãjŸækïø)½Åßü;«g2Ç—bòL{…‰X¶=ðkóÓþ ~ñU¼^6ñF4êDÖhËÐwž=‰'©?öz/õyµÿð]Ù|ØkV¹f!VM§Œçp¿.?àÚiä×ÞâD01ñ‚ |6}zWêüföÒØ«Pµº•ÎsµòÅBýßq_–ðlµÌÞwŠ!™—v1Ÿ› +r3õÜ*ë ùpŠÙ͇vÀÉ]Oì>í:šŸv^ôv>5î@y9¤¢Šç’Ð#¹üÿÁeàš3¾ñìß´gÃ8.5I.t–Ðd(çJü»Óÿj¯ø(ÇÃO„÷^ ²ðÕþ™e B¹a&ý§ßŽØ¯îËÄß> ZxÖ?†>(Õ-ST˜nŽÞr¿6=2iþ>øqð«ÄžÕ%Ô4Û9me·’W‘0v!ù·Ž1^*Æ%ê}= ÂpIN'ù€ü)Ôu/~ÔÚµã d›R¹Õ]eÈpùÉÜ>µþ£ÿḷøSáø®,,`(ñ¶°Ú§‰µ î ™Àvl~^õúgðþ§ûbü}ð=¿ì, ¬2èÍÃ2¿NP+èSÿï~ÙÚœ‹j7ÄRòH¨»p;y¨©Š‹vmhW2î~ +6¡h#ò®¦Ú§€Ø#ŸJÍÔ."{o&Õ·‚0Øãvzƒí_¹Ÿ?àߟÚcáÆ…7‰µI¢¸¶€yæ¡#rŒ’67 {_‰þ-ð'‰¼ «ßøwÄGå¬í·ä8=sŠäŸ,þs).Ä~ø‡ã?† ¨ø;SžÐŸ•„mãÒ½ëÄ´‡Æéëe¬êò]DQ@,ä2ã¶Aïë\OÀßÙ»âí'âx<#à =æI±åŒn!±Àõ8¯ÓŸÁ¿l‡~“ÇݶRÚb‘vÈ'¯NõÓJPŽ’z˜JkšÍŸ”—ž —Q¶ ­ÈP9çŸs[Ÿ ¾,|Fø[zoü«M`Ò¶Z5<õçŒ×âÍRð¶·uáï*Ç5£2H;C‚¾‘ý‘¿bß¶WŠSBøu[EÎëƒÇãòzûU©¯Š{Zjfx¯ö–øëã‹i´¿k—/`ÝmâeQ ÿm‡ÍÏ¥x¼³`G¿Ì-gù†08÷¯ß/ÿÁ»ß´G|(ºåƧrdPòÜ•D`.v©ÈgÎ;(úWáW<↞,Ô¼âXçY­YÐ4£¶’QëNšRv—6§î?üöðíWãÛß|EˆOdþé†~U=yâ¿­‹ðMÙ§GøW«ÿbèVö—Ù•'Š1æªvœãÖ¿†ïø&7ühþŜֺ„7C¹G‹û‡$îö=«öâ¿ü+yñáÖ¥ðóÁ¨?¶µò Xò_ç½+ÄÄá+Ë¥OáUNecñö‚ý¡~.ü4ø‹©ü3ðæ¿wŒ´1íf +Ø$qôï_ê:·Š¼G­Mw⯵I0ùƒ†n}GÖ¿tþÿÁ¿jÚ÷C?5iÖÊmU¼õóÃ+ÿ0 â½÷ÿðl·ÇY$3k:ÒC*Ÿ¾²ç#¸#ù×ÑÏI¤”‘èÔ”ZÖV? ¿c)§ý¨¼<‰þ³ÏN¼ã,1Ũ¿Á{gƒá¦‘nü¶ŒûäWò×û6Á»~&øKñwKø‡©k›šÎEgó@|rHÃþB¿­/h‘x{E¶ÑámÂÞ5v1£åVýä•1«”S?ÿà¶šU¾¥û8<æuF1ÎBœàöÀ¯óÃÔ´± ôѬ¹\ì®êÿDoø-Ä–ß³ªJäRG@Hœõ¿Ï/ÄV÷þ ñ“Xè µÔÆ5ò†A òk·O÷|§U(9aâdxÛÃCíúv§9’ÐXÚBxÇÎ}zV5jI¥ÆöØú*YÂäQšØÿ=Ï…Ÿiø(çíj¾7ñq§ÉªL’ÎåÂ0û»†Çï_Þ§¾x–Ùqþ ø&ô[êvÚ:éö× Àܨ'Û^ñᯅÿüv×þÒmlç|æH£Unz€@é]°8æ¼ê÷”¹¤a‹Í¥Q«-àA¿hŸø(ïü‡ãUσ¯¾×¬™¤Ú<ÈÙÒP¤íè1ÎN>µæß·oíáûd~Ý´ð?¼1y¦i¬Ê ¶D̤¶ž¿/ï«Äß>øÏUþÜñVe¨]ñûÙãß/NO¥aËû9ü +™ƒ¿…4ì«…Wõ#3íZ<ÅEéNªY½4îã©øÿÿ~¾?ýžü«|Qñ×É7ˆÑ¡ÏÊŠÅ‚Œñõü«à?ø/·ü/âF£ñCRý­üdºŠóbÉ —Qݹ”g8=[Óý«iÚm†‘e›¥Â–öð¨HãŒUQÐ*®·áýÄ–-¦kö‘^[¿XæPê^u'R5]dõfó‰*¾Ñ­àWà/üþ +Aðá=·Ã#Ã÷wÚe´mI$eÜ)à0b21Ö¼#öoýŽÿiø(í2Þ;ø…§\éóO2¼¥“W<ôz’kýåøð‚x¼™|9§•ôòü+¡ð—ßxKÿ†•m§yßë ªÇ©šïX¦“Q®uVÎi¸µ«>=ý¢c»_‹ÿ±½÷ì×e(…åÓb³‡#0 ú•¯â;áWÃÛCþ …ûDjº/ÃòúåKû—häMÜ7ÊppzgŽõþaÿ?ιkïøGQÔ­¨é–³Ü°Úd’$vÇÕ5…R”y#³8ðy«‚垨þÿjŸÚ#þ +ûuK¦ü6ñ_†nìíÝã?»ÀÜ0¤·\är}À¯éëþ ÿü›ö;øYý½â€ÃZÖY‘òâ¡$œ¥~¸Aàÿ ÚηÚe¬R/!’R>„ +êÆ1Åvá£*sh±ù²©HFÄË÷iÔQ_F¯EW38ŸðUØ+⎥â!ûDü ½º¸Ô’Ush¬KoêH#^àvþ_ø7Ä_ðTx[þ%æ}¤Ùß/“$ÎÌrŒ6`žOþ5ý”¼i"ì‘CCÍ0XZ«nXßh®ªÊÖÐúç²T½›W?!¿àžðM ~ÌÖOãß"ê(Ô›4®£!›?Ë&¿_@`p)HÇVôhrêÝϽw7vQEtQ@QQ)tEÆ7 +(¢¹¥Ê=‚Š(®Ã0¢Š(¢Š+œè +(¢€ +(¢€ +(¢€ +(¢€ +(¢“Øçëþ Ûe#ü[¤¼°Ù_öB±'ó¯á“àv•câ?ÞTp±4ÊÒoÀ‹‚ON+û‘ÿ‚ù\~¤’bpwãŸç_ÁŠÞêk©X¸I¢ûŒr2A¬p:ÓåógÖá×î"ª§ìë…,¾ xrÇÃÒEåEeUB¹éžÕîáþb§¿½š'Áø+íWðKìš6™¬<–0D³åÙ6ŽBäðAè+ûÿ‚K~Ú^5ý­<>³â‰ÞæE#s± ÉÉ9ôÁ8v¯„pNg|ºê\ýyñ–—aàûû+ØÕákyT« ƒ•=˜'üëÂóø{ö§ñ-¾ƒl ²–wªÇÆÇñÉ?ZÿP/™SÂ7ëËùŒôèküÃࣗWßíUâÎà=때^?"EtäZܬ½6ÏÜø6“Ãþ ¹TÕ<@¶°Ü@Ìðî*äüÞ+úçøÕ”ÿõûÉÞ£ŽÆy76 +à!ägÓµ–Wì÷ûY|\ý‘¼_.«ðþàI¿4HÍ·w¨ÛƒÅ~‘h?ðTÚ—ö¡ñ‹ðN}Jkk ö7•+…Îzôäðiãpõ]KèMj +o™³óçöÐÒô ~+ëçA·y%iˆi‚’€ÈÜ‘îEX_ðlÇÃhtO†ÚÏ‹.­6\3ciT)ÛŸ¼2+ïïÙ»þñû/j ô¿|G±“R¿Ô#ŽâbÅpîÁl©Ï<ŠýZø#û<ü/ýž<='†þéÑÙÛÊûܪ(bqÜ€c[0ööq0Äã!Ù÷Ä=×Yðuý¤Ñ«‘ ²“Ù€È#ñ¯ó ÿ‚]Çÿ 7â6!§fE#üÌ;}+ý@ü_8‡ÂÚŒŒÛqo''ýÓ_æ;ÿ3Þ~Ðúà’»w'•Æ víÔqÍo”ÂÜÃÀ;ųó+T15ÒÙE™%•JíQ’8éÅ{¯ìÓàæO¾Öîì.bƒíËç«DsˆÈ'ûWì×üWþ óà/ÚÃÇwž7ø‰h·VvÄŸ%Ç]¬sŒtÆ+úÊø£ÿÂý›¬>_]xGE†ÇS³·wŠu!ÕxobqÍi_ +u=›Ôïö°O•³ìïÙŸÆ~ ¾ø'áé4»»x‡ÙzoQµQ×±¯¤ìî­¯#ó­%YSÕ#ô¯óEøÏûP|wø#ñ/]økáÜGoe+ü±ÌT¬AÛÎ=Áý?Á?j/ˆÿ|©Yx¦þk»hˆ‘RáÌŒ²1¸õäJxO`•Fôg6;*J¢‘ý#ƒ’Ec]ø‹AÓæû5ýìȆIOÄŠ³}vl¬f¼Æ|¤gÿ¾A5ü!ÿÁJm¯ŽÚÇPézÛBQ¤Cƒ´ ô:ºRu$£ËÁ`ý­Ógë÷üOㄼQð¶?†^ »×ÄK¯lÛÂ3àqè'Þ¿Ž‚>ñ•ÆÝÜh·ÛÇ!Þî‡Ë$Œd1_ÒÏüûᆟû[ÜKã?Šlu%\°Š_š0Àã8ïÆ:þd‘A*Ë×ÕGìäé´{5+B’Tdi~ÌßþéŸü?¢ÉªZÀélˆŠÒ*ƒ…ŸJú¯JÖ´­j>“n‡7/å^Ñ3ú)¢”uçcïB7á7f2Š(­ +(¢€ +(¢¹Î€¢Š(¢Š+œÿÖþü(¢Šñã±qZ…ãš ÀÍ|]û_~Ú¿ ¿dŸKâ]Dnˆ"+v+3c+Ç$æ¹kÕ×–;t(J£åŠ>ǹ½´²…®.äXÑFK1À{šðŸþÓŸü¼kþ%²„Æ2ãÍS·ëÏü0~Û_ð^¿Ž¾>Ö®|/á‹áe¦¾õòààr'·øGã¿ÛǾ*{ˆ5û¶šc»|“?ζkE–NK÷#Ò†”ˆÏõHOÛ_öi`Ž|QjAÙÊãê+Ù¼+ñoá·à[ k6׈ÿt£Ž~•þDÖ¿µÅ»KHtÛ]já£UùTÈÜ ô'5÷ŸÀßø)÷ÄéØz¥ì¡È2¤Ž]c9ÁÀ$ ÏW<òhý™jhðTÍŸêT##iêyÁ¯æ»þ ëÿ¥Ó~,ßÇàŸŠ.›—b‰È°p±È÷Ükú:е½+ĺTÞ‰:\ÚܨxäB}ÅqÕ¡*R呿âp®›ò70´Òƒ·ùýiËŒqI½i´ºœ£‡SN3ïJ)š.x$óRîP:×Ëÿ´WícðwögðÔº÷ÄmR+y>\$’îÀg‘_Ë7í#ÿ|Uñv·yá¿€ztëk+ÄQ¸ç:zf·ÃB¤µ‚ùž–*©QslìÂmFÎÙ‚ÜL‘“Ù˜çVdnFÈõþ~þý·jψw“kž3›YÎNð%#òþUé~ +ÿ‚µþÓ?6ß>weÝÀ-í^+ë¥ €}k +X…7dŽŠøIÓI˨´W‰üvø×῾ “Åž!pð‰œ?_JÒø+ñ[KøËà;_i ²‘3ŸÖ³K»èÉCŸ¡ëTÖ$)ÕâHÍMW²2,‚ž”e=?ÏçL Wo20³i=)*S íþJ¯<©[€£4JIubÞˆ}ùÅã?ø(·ÃOüz‹àÛG$Ò2¦Tà±À9$)Úý±½·Ôl¢¿µ`ÑÊ¡ÔCÍfÚêvb0u(¤çÔ·JvãŠç¼QâÁºLjüGs¥ª’Yj¨5üï~Ôð\ß ü?ñlÞøk^ÚDæ1tå|µcNR“j(èÂeµ+«ÇcúA¢¿ ?aÿø+÷„¿h¯„¼W$Ï! ¹Û¸ûóÅ~æÛÜCu +Ü[°tp +r= )Tå—$ôdã03¡+LšŠ(­ãœv +(¢ °¢Š)=€þzà¿M§ÀHç Ñ*{ƒ_Á4$×ÖÆ5ÌíˆãÉûÄð1_ßGü¾ÞÞ_€žkòÉ0}Iãü?|$²Òaø½¢êÔ¾]¼7jÒ%Aõê+7»OO3ì0*øtÙôÇÀ¯ø$í×ûEh¶þ5Ò¼9åè’HÖ;7ÔØÈúWö£ÿ†ýˆµ÷ŸÆ¯ø.¿Ácáþ¥áØ´Ú†£lñ@ƒæÞ¤QÍ|Ïÿãý¡>xÏL²Ñt=F É`…£&6 w·N‡#üŠü,¾²ð¯Æ/ë~#`Ð[ÞvlF{‚q^”h©ÚsZž•:q“æ’?htŸø$'í;ûiÝËñŠ+sd×ɼG¿»c•Ãdâ¿H?cÇÿðG¸g—âÅ‘šÚàŸsª|ˆIÈ<Žõû§û&~ÕŸ³Éø?¤Á»ilÉk˜K*Œí`ßJüUÿ‚éþÕß°ñücá?Ä{UøsðŠÔ7ˆuehaýâ̈ÏÀåxÏÖ¾øÿBøÿûRjâf©yocq¨Ç½¼Ç+.îÆ}«ù¥ý–|wáÿ‡ß4ëc`µ¼Viü¡G|wüëý?fßÛ{à‡~éÏy­[Ú¼vë³Í‘TºÔklTjaš£Ý$¨£Êà—ÿðO‹¿Øá±ÐüIp—“;dÆr¡OÇ5ú«wj.md·?òÑJþcà–ÿµGìÿ<ÞL^)±Ü}d}3Óõ««ûLüi<µñ%™aÛÌ=k(Rv¼Ó»ÙˆÂÂÒ6{gïq_ÀeŒÐ^FfÁÎqÑkôcþ ÙñëTøñÒÏÄ¥ŒVsO»« ë p¶zÒ¸³.t_.èì„yââÏõ¢FÇ#¡¥|gŠñÏ€Ÿô¯Š¿ +ôŸés$Âx;!Ȇ}³Í{ç¥yXisÅ6x á.Qè;×Ëÿµ×íáŸÙ¯àίñÄr¤bÞÞCg — òž¤ž‚¾ &¿‘Oø8“ãV·®ëZìó¤Ë*­üÑK²,’à­€:í95×FŠ•E±ß—ÐçßCâ†ÿ ÿh/ø+×ÇûCVÔg‘Ì[{p©ᣠtã=kõëâ‡ÿàœðK¯Ámâ;{½\ V ¢Y c©Ýèy¯µ¿`OÚ_ì{ûÚx¨Â±ßb‹û‡e·´a”Ìf¿8|?ñ+þ +‹ÿ»ð¦µ4÷ºSê.rpÇÎ8é“[Шë¹=¡è¡zŠM½úwÿƒøXºü—~ðVí)\yn-׿î1Á¯¸þx§öÿ‚‰i²ø#WÒì­u»øð0‹ѳq”> ×ë÷€?à™ß²—†þX|>Õ¼/iy1(vxÔ18ÁÉ5øñcþ¡ñ+áwíWmñ;ök»’ÃBûZ:¢><¤|3;AéX_;¥xµ³¹çÇMÊÐ>]ý«?à¿ÿc=y>5|Ô&Ô´ˆœù€¨%s‡U, `^½E~ØÿÁ*ÿà v|+¯ˆ" rЈ`G  ”7®zϧJý^ðWƒ¯%øWmàÿ*Þ»Úˆf~ð>W0=kùøÕ¡]~ŸðR1tU6ºF¯z’@¬"w °ùFTç;R£?m¥ºÔé¥YbbèÏ¡ý°I¼úW;á^/x_OÖàq"]ÛÇ*°èC¨9ýjæ»4öú=Ìö瑳ô­ãˆ~Ï™0èûü¬ÑŽö _dR+7 #4·pÛBÓܸ’Ìpú×áwìSûHøŸÇ?¶?‰~k7Ȱ0¬Å‘G`£°èkîø(¯Ä|*ý™uÏxfM“ÁPO#' S§‹¨êrHô'•Z´i_sîûKÛkÈDör,±žŒ¤ùŠ|ã1¸ö5ùGÿ‚ø»ã¿Œ_³$~&ø‡z·—Ò\9]¡@TÏL.1×Ò¿W˜Œ|Ýêª×¼d¥èqâ0þÊ£cùVøññNø_ÿ²¿ñŽ mtÅœ#oèá§®kúwðß|â[('Ð5;k¥‘So—"±;†GCÔ×ðíÿØÕuM'öœŠ×@‘ÅíÔœ2.æR7`xÀ¯%øñ ö÷ý˜âÐþ%øÊk˜ôé"òüíÛJ!ïè@é]±Â©aã(;;mÜú\f5!»;ÔÇüCí0~Í{bÅeyа¹ãñ¯Vÿ‚QÉ<¿±¿‡®î]åÞIn¹¥|yûküfÓhØ +×Ç(ëö‰ã‰Šî Hcôã5§û|~µø7ÿõ“ÆZˆ,ÚDrº çsè~œ×‘(ÊTáÊõ¹Ã,;tU>§îö»¢é˜•Ü6ÅŽ–EBO¶H©à¿³ºŒMm"Ê¿ÞBüÅ>,ý¤¿nÛãn±â„Ö÷—ºV™)H] dŠ äü¤:õàŸs_°_ðHÿÛ3âm¿Œï?g¯%® ZQn'bKHœ%²AÈ8çÚº1”jR‡;whÏû*6ÑŸÓœ~ Ðæ¼m>+¸št81‡ôÆsVîµ (üëÉ’$õrüÍ-ß¶¿í/ñ‹ö@ý­,|M¨LÃÃó\¥Ìžfv˜KŒ}@WŸþÐðRß~Û<-ðoötœÆ è÷2Û± À‘œýÐ3øW,1\9¤´f¯%Z>mëf9cš1,LHÈ#¥r¾>ÔJðf§¨»lÛÈÛ½0§šÃøU£Ýè~ÒôëÙZib¶Œ3¹Ë´u÷¯ý¶¼{€gm{W•ö+BÊÄvà“ÈV°Ä)%ȧNÕ”Qü1~Ð?uSöûþÒº¹alº”+æ(ö =Gþ€Ÿõ{ cán…¨i;,¡Ú}~Q_ç;âÙßãÄ?ê´e´ñX$Ëu!¾aîR¤`+ûrÿ‚T|m—ã?ìÁ§_ÜcužÛ|g'r¨Ýø]YÍNXFqé¡ífQç‚kd|£ÿÃøý­ø+àË|4ðÜí Þ¯µÓ‚rxæ¿2¿boø"¥÷Çß„ ñâ¶«%¥Ýò ‹n@ÝÈÎO¿Zö?ø,.§7Ž¿kÿü=¹ŒËoźydðûˆÈ?Mß øsÄw€¬ÒÙǽ[†S·¡÷ÇZò¿Ú‡öZøeû@Oayâ·fµ•1#¤~=+ê_‡^ Ò¼á+O èÇ0[ U>¼V”ñN¼¢šÕnrfXÅR’lî(¢Šõícç/p¢Š+p¢Š)K`?Ÿïø/µÃEû8 D»œ÷ëú×ð7â ;ˉÄðÊÛÔn\AaÛâ¿Ó›þ + ûOûbüºømk:ÚÉp6ù§¨‚?Zþmî?àÙïêigñ2  «N:Éä{W-©BÒ>“ „i(ÍïÃÏÚŸö„ø{¡ i:õäÚ`G6W®z×´é_ðP_ÚžÆe{-Zl:“óHFìp>£ûÅ¡ÿÁ¯Úô’µÎ­âæÚù,7mf㸫§üï«!FÒüQ€•‘›#ÛµrÎtÛ»dº°—ÚGó©ã/Úûö„ñÜÏÄíд-ºHUØïÏ©bsŠùªó†iP”‘²]Ÿ’à÷ɯêœÿÁ¯þ7Œ¬'Äöò"’TòÛ}>óŽõ×üÿãhG™iâ[iL…L¡òNåTîãõ1©MlÍc^œUœäÛþÝSìrIk8XÀÉ8ê*ªXÎcr§k oãÓ"¿«ý;þ ~ñìPˆn5øe²G˜û±Ÿ©³qÿÆxɤÄä7—µBmõˆÿ0½½>çò9 …̳µ­¦Ù”}âF=>µê> ºñ'­üÍ6æ[‰Ÿyx\¦rGjþžGüùñ +e/'Š•=7pÃߊַÿƒcüw+Çlþ$¬|;2{ V~ÚÌZ«O¹üóÛþПl)—\¹Pp»£˜äÀ×K/í7ñ‡Gg“ÄWŽ“ 2´§æ>ù9¯èzOø5ö{˜ÚâÉ!@Cc~yÇAÆMb·üõ¬ÝX¼S幘–ÁõÂÕ¼uæü ¾µO¹üÄxçÆúÏŽ®®¼EâRkÛ‡á—#bóÆ0{W›êͦ™\:€cnàë_Öý§üúl¬Ä2x¬3ƒó´`üÞã=«^ø6 g’™Ü±‘žGA“ÒŸöŽÖ¿àÎJµiôgòy់Ÿt=#ìV³,1¨%•®üt°µ/øÓÆÞKxÊmûXј³zçq&¿®™ÿà×Ï]X­•ψ]˜òÇ“óú$S­à× -»Ã«xµ®#_õB0Ѻðy?1éWý¡C¿à\qä·?[ëUÍíˬe†TgŸLŠì´‹^=ðÚý‡MÖïxT•¶Ž8Wõ±¤ÿÁ°^¶rú·ˆ%º*pŒîx^ÀŸÏ5ß§üðÀÄ|Fñ2BîÆIé’iÿiRoAÆ­8ï#øûÿ†ƒø«§Xˆ®|Aqä–ÉŒJßxû“šítÚOâ~¡i-…¿ˆ.Ž8üîï“Ö¿®[ø6sàäqÇkw¨ù±©ÜîX–'ïÛÚ»-7þ ›ý˜í.£¹{é'R ù¸ô­qIt'ë”ûŸÈÏíñ£NŒÅ‰æ‰í”8A6ý¬:kúúÿƒ~~8|@ø¡à;›Ÿ\4þoÊϼ°v_Q’Ç9©äÿƒh¿fggWŸÌS¸.Ó´ã nrGã_¯Ÿ±Oì!ðÓö,ðkøgÁ4Í9#m +¡»ì;ô¬gŠhòÅjr×ÅÑ«Ÿw'J} ¥¯v +ÈùÆQEP‚Š( šÿvL~•6EEW :Š(¬ÿÐþý”&«Mþ©¾•a?ÕÔ2(d*{Šòj|Ö›÷áþñ¶«§üZ¼ð½åÖbŽ1(‹RYxÈê}kùŠpnn%ϘÉ`xÃC_Ùü‹ðÁ-~'Ùª‡6‰#-’G`vã­·:£Ï|ÑÈ0’Çãõ®šnÔcÛœ•ŒËåÈ]™F3žµõìá®x§à ã g)ip›˜@qØæ¾cKkÝCZ´GŒÏ*8b dèké߉_¤ºðŒ¿ÒÄw^Z¨8ÀP=*sƾ1øÎOŒßÅÂ0’OVQüG<ÇžÃR[â¾S/9ÝÇ ¨5í>? Ø[ë÷<Œ§h=¸ªW¾(Ôu6h§!J—<`jOüÚþ£5œ×i +vm<·Œv®ƒN²‡Âž&m-„qʲ)ë–^@'ÜŠó kZ½‹Í¨ÛÌU“î‚>SZõ¿„Z¥ñ7₈MîÉiãŠyNjéè®ÏC ä¢ôßÿ‚&ëž"ñì9áûn%Fr]Yycï_¯#­| ÿÇð*ø ö:ð¦ŠmÉü€íu\€3ÛÒ¾ü +s_?†îÒÒ瑽i‡ü³5ücÁe´JÛºö¡›c•LYÁNY?_ǵg¡~\WóñÿÀýu/xCJøÅ Û‡“JuY6¯ÌYNA,9ÅvRN5<Ú= šªöŽ©úyâks¯~ÄÒÛØ€Zo ¦mÂÏê !_ðDiÞÿ‚€jZv³¶Þy®§‚G~…¤;zã¶F+úEÿ‚hþÓý ?gëo†º½âI{§Û5…Är0³i\mëì2ç_†ß¶üßãì}ûC·í ûÄÖÑÁò«ÔÐó(eqMºÏCû|ð—Š´ox~ßĺ —¶ºPñ’1kùDÿ‚çM£?í3àá¦íþtp7 n8õ­K×Z¿…¿f?GPñÒÇcáû1¾G;GÈ¿ãøšþFtOêðPÏø( ·Šü=g5î‘§_‰"|¡Q¾÷#uúô¬p2IʯCl²’…IT_ +?°ÿ€‰$?ü7»¾KûÇHìOZôÝY‚i³±ìŒCF‘h,4«kbDÀéò¨S5¸ä—I¸Š%ÜÍ? +®KSå«Ð‘í]Nµà-wRÿ‚~ůY–šÖÕš€dœŽ‚´–‰?0‚Øýƒÿ‚&üð·†eKˆÒ{©»Ç½S »IÝŸ\ä`ÿ~|þÕ>ѾÁOô_X)X¯/c™âŒm'.™û¸ûÜóï_§ÿðEÝ~ÛVý‘­tô•${yÎà‡îðÏ¿;l}_Bñ¯üÛÃúEœÂW´»GÉ;ܧ+ÏÂs{ZœÛXç åíd™ôŸüCàvñöeµø‡"†—CŒû(* ôþuùÿìüÑücñƒXø…¬Û©—L. ¯þü‰¯×Ÿø-§ÆÏ xöQžUkíAxŒö +æ¿?àß_ÚSCøañ¼®ÚȳkSI˜Ü(Fœz +ôáw‚³:Ú—±iÜñ íí¼+r­µÙ·”f br§×ý™ÿÁ;>9kß?gÍ;Å ‘¥™¼«¶BJsŽôf4ªšO,vÿ?­>Š·J/t$Ù—ô¤òÏ¥OEeõZ}‡ÎÈ<³éG–}*z)}RŸ`çe/Ú/Ú¬QIà©v´e/Ú/Ú¬QSõ]ƒÚ2¿—íIåûUš(ú….ÁíWËÇ<ÓªÅ//§Ð~ЯI…«4T¼¾!í +ØZiNr*ÎÅ£bÔK.O¨{B «KSlZ6-U<(:„C­MµEK]°¦‘ °¢Š+AQ@Q@5†E:šßv”¶CEWžö:Š(¬tÿÑþü!l®=iŦ*í\TÁ¾^kÏ…;Å&4ì;ð^ïÙ‹Yø«ð_þ1DâÕ m +/ÌÀ äŸAÖ¿Î'â‚o|âùô XJ³©ûÛ~BL5²—Å…þø·à›ßø‘I‚í +‡^Ž}=+ø&ÿ‚­Á,¼KðïX¾µußo34ö×QD@l_OnƱ§&½Éµ©Äþ[<9¬Â'¯G¨(•»ñï^«qá_|jñ z–†‚8íP–w8È•äÿ¾xïán«$^%µdR»'†8ÈëTôOŒ>#ðæš-´¬´{¶8n­ž…ò2Ö¹¨]C$ÞÔahüãÕk–ºO·@$¨ñÁÁ÷«7º­®±~רžW™ÉÏ''©¢ÒÏZÔ.MÐíÞöê_•cA’Äô§ãŒÍm/È—NL*Þlœ(îÕûÕÿrýˆuï¿,f¸‚h–)Ð8Qò¬y—8äzWÄÿ±çüãâwÅoCkâK7[·`c‰$dôã8â¿Ñsþ ™ûøwödø_a|öb RxÎ,¸`qÓÞ¹±MÔ\‘;cUP^Õî~•x+Ã^ ð¦Ÿá}=vÅcB¿ðk¬UÉÏjk T©÷k¢–A$|ÕJŽrrc0y5çß~øw⟃o|âˆD¶×‘²r2T‘€GÒ½šÀ‘J½%¦ã¥QÅÝÆ7ÇÙÃöÿ‚tüi›âOÃaq6†÷&Fû*±C lþóŒ{šýsøÿ|ýŸ&µŽêÞt(ÊêWãíÿIøñJiõÏ +ÊtË÷CÐ`3cƒ‘Œs\£¿ß-{£è(bèÖ_½vgЯñ?þ ¯ãb5J} ÈÇ~gUS‘ß¼Ïâ·üŸþ óû0hR[øsU´º‘GËo¦¢áˆã…~|aÿ‚'þÑ^ ñ ®‘á!.¯ †$¤Í€ãž•™ðKþ ùøéñIJ‰Ìº>šWqyÉläôP9-ÿ]%€ÃGÞ”›;=…Šs¹Kö›ÿ‚Ž|}ÿ‚žø’ÓàßÀ:kêVˆÛ ËHݽç¥FŸðMø'ç†?cï†V·𬞠»Œ5Ĭ>`ÍÉäŒõ®Ïö"ÿ‚l|ýŒôX—Ãñ-þ«Õ®Yã(9?­~šéinUh£ÌÇfI¯gIYŠŠTDÑŸâU’™9&šÃº1UË¡âÆvgòÿjðO?goÚZËã÷㔢²³ÒëÎ;ù/Ç?ðROÚ›öÝ‹LýŸßK6–·RÅ¥ÉLŽqŒó_Ùíû2ü>ý¥< Þñ¬[W$¬ª ·#稯›?gOø&GÀ_Ù÷Ä#Ŷ0¶£¨/Ýy@Âú`cÒ¸"ÚŠN7k©ô´ón–èöïØ³áüø ¤xV@ â0Ò`çƒô¯¬iðA1ˆãPª8qRâ©`o õ<؇)¹ÃÏü3ÿ<+û^Y|J𕼲1ÖDdBØaÈ=á_1h¿´ïíûsÝè³Ò5ܺx‘£) +1ÁÝØW÷}ã߀? >%ßOÇ:®£1]›å@N+›ðì­ðᎾÞ&ðG†¬ì/Ç™G¸÷­eUªj®§» Þ‰5©øÿûCþËMðö‹áÖ—nf¿{e‰Ž%ñ–ÏãZ?²·ìŸ©øïöºøeâ2o,YB¯Ul¤\×îÆ·á ÄvŸa×-Ræî8ȧèžÑ|9d4í +Ù-`ìA\¯/*8ÿ´—-‘ü iŸ?mßø&v¯¬øOÃ:sç]NÊÓ?Î' +áAÏ=yWÜ?ðLÿ~<üpºýª~.ÛIP(š)¥\nv;²+ú¡ñ·Àï„_dñχ¬µFCgˆ7>þ¿Žk­ðç‚|'á <=ám: (Æ"ô¥J³OMY³Í!mµ?“oÚá/Ä_ÛÓöÆO†²ØÜNÂ× Ä,ˆz•4ßÚãö¾ý”¼Wá_üÓ¦á’/6HÆ¥Bè½WÚ?Ãh:ĺþ“§Eäç/*¯ÌsïWüCàÏx®5‹Ä‰t©Ê‡ûf·µ}"Öˆ¿íxÝ$´<Ÿà‰µßüÑõÿ¡KÙ-•O$8×óÁeðïÆÿÿà£Ûz¥Œ²iúUîåm§`Øz“_ÔfŸ£Øiv ¦XD"Tpsº_ÿhš¤šÞ™§Ã Ôijʨ1>§®?©M7¦æx|Î0çk©½in Óã·Œ`"öü“ÿÁC¿f/ˆúoíï |Jð­¬Æ ®Ñæ” ³p<þ½]˜Îkžðlj7×,aºh›rî3D02§ð­Ì09³mµ¹ùÃûa~ÊSþÓ³¶•§(“S±¶I¡óŠ'ÝŸÖ¿“sûQþܱV¿yà="ˆà‰ÈGŽ#ŒÎ=+ýÚáñ £hP8Ç¥|ÿñöZø1ñ.õ¯üS¤G$®>b8Ͼ*èR8{7dtÒÌâ×-D +~×hÿÛ¿ãÍ„>$3ÝÉ)_9Xª’~ûòpEtß²ÏÁ÷ø'ðwJðTüMCzú9¥øKû)| +ø%¨O«ü=Р´º¹’R1ý8¯£ãï]ÔÔªÉ6¬‘ÉŽÇs.Hì;;©Çž(¢½4 (¢Š`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE×û´êkýÚRØkr(¢¼÷±¸QEƒ?ÿÒþü@)TeM4œÔ©÷j ýÔ6:¼«â·Áßüaðì¾ñ¥”WPÈŒ™u @aÏQ^«EsÔ¤§£*qwGòýûPÁ´Ï½ÕǾ©¦ËÊÛÌ KNp§ væ¿™ÏÚþ÷ñÁ:¦ªoôiíâÏ–o`$Ràž•þœeA¬CÃ:ª¥5 8g®øÔç?Q\µ(VŠ÷ëas5i£üŸì?à˜_nïa³Ó4«Û¨úÇX(пJýzý‹¿à‰¼OãË;¨ü=5†–UÝ]¨Eõ;¿§Zþþ¬|á-=BÙi–±ÏË +gùWE ¬0.Ø” a@ô¬éCÕ¤mW7؉ùÛû Á9>~˺{²¥Tg®Õ$œû“ø +ý‰c‰Dq qNù‡ Ò”ç­z0ªž=|Dª;ÈB™9§ŠZ+¡ì`QE`IKE0´mSKE+ :RÑE0 +(¢€´vâ”zZ)¨€QEù&-/]À(¢Š(#> /XObject << /I0 10 0 R +/I1 12 0 R >> >> endobj -319 0 obj -<> endobj -320 0 obj -<> endobj -321 0 obj -<> endobj -322 0 obj -<> endobj -323 0 obj -<> endobj 324 0 obj -<> endobj +<> endobj 325 0 obj -<> endobj +<> endobj 326 0 obj -<> endobj +<> endobj 327 0 obj -<> endobj +<> endobj 328 0 obj -<> endobj +<> endobj 329 0 obj -<> endobj +<> endobj 330 0 obj -<> endobj +<> endobj 331 0 obj -<> endobj +<> endobj 332 0 obj -<> endobj +<> endobj 333 0 obj -<> endobj +<> endobj 334 0 obj -<> endobj +<> endobj 335 0 obj -<> endobj +<> endobj 336 0 obj -<> endobj +<> endobj 337 0 obj -<> endobj +<> endobj 338 0 obj -<> endobj +<> endobj 339 0 obj -<> endobj +<> endobj 340 0 obj -<> endobj +<> endobj 341 0 obj -<> endobj +<> endobj 342 0 obj -<> endobj +<> endobj 343 0 obj -<> endobj +<> endobj 344 0 obj -<> endobj +<> endobj 345 0 obj -<> endobj +<> endobj 346 0 obj -<> endobj +<> endobj 347 0 obj -<> endobj +<> endobj 348 0 obj -<> endobj +<> endobj 349 0 obj -<> endobj +<> endobj 350 0 obj -<> endobj +<> endobj 351 0 obj -<> endobj +<> endobj 352 0 obj -<> endobj +<> endobj 353 0 obj -<> endobj +<> endobj 354 0 obj -<> endobj +<> endobj 355 0 obj -<> endobj +<> endobj 356 0 obj -<> endobj +<> endobj 357 0 obj -<> endobj +<> endobj 358 0 obj -<> endobj +<> endobj 359 0 obj -<> endobj +<> endobj 360 0 obj -<> endobj +<> endobj 361 0 obj -<> endobj +<> endobj 362 0 obj -<> endobj +<> endobj 363 0 obj -<> endobj +<> endobj 364 0 obj -<> endobj +<> endobj 365 0 obj -<> endobj +<> endobj 366 0 obj -<> endobj +<> endobj 367 0 obj -<> endobj +<> endobj 368 0 obj -<> endobj +<> endobj 369 0 obj -<> endobj +<> endobj 370 0 obj -<> endobj +<> endobj 371 0 obj -<> endobj +<> endobj 372 0 obj -<> endobj +<> endobj 373 0 obj -<> endobj +<> endobj 374 0 obj -<> endobj +<> endobj 375 0 obj -<> endobj +<> endobj 376 0 obj -<> endobj +<> endobj 377 0 obj -<> endobj +<> endobj 378 0 obj -<> endobj +<> endobj 379 0 obj -<> endobj +<> endobj 380 0 obj -<> endobj +<> endobj 381 0 obj -<> endobj +<> endobj 382 0 obj -<> endobj +<> endobj 383 0 obj -<> endobj +<> endobj 384 0 obj -<> endobj +<> endobj 385 0 obj -<> endobj +<> endobj 386 0 obj -<> endobj +<> endobj 387 0 obj -<> endobj +<> endobj 388 0 obj -<> endobj +<> endobj 389 0 obj -<> endobj +<> endobj 390 0 obj -<> endobj +<> endobj 391 0 obj -<> endobj +<> endobj 392 0 obj -<> endobj +<> endobj 393 0 obj -<> endobj +<> endobj 394 0 obj -<> endobj +<> endobj 395 0 obj -<> endobj +<> endobj 396 0 obj -<> endobj +<> endobj 397 0 obj -<> endobj +<> endobj 398 0 obj -<> endobj +<> endobj 399 0 obj -<> endobj +<> endobj 400 0 obj -<> endobj +<> endobj 401 0 obj -<> endobj +<> endobj 402 0 obj -<> endobj +<> endobj 403 0 obj -<> endobj +<> endobj 404 0 obj -<> endobj +<> endobj 405 0 obj -<> endobj +<> endobj 406 0 obj -<> endobj +<> endobj 407 0 obj -<> endobj +<> endobj 408 0 obj -<> endobj +<> endobj 409 0 obj -<> endobj +<> endobj 410 0 obj -<> endobj +<> endobj 411 0 obj -<> endobj +<> endobj 412 0 obj -<> endobj +<> endobj 413 0 obj -<> endobj +<> endobj 414 0 obj -<> endobj +<> endobj 415 0 obj -<> endobj +<> endobj 416 0 obj -<> endobj +<> endobj 417 0 obj -<> endobj +<> endobj 418 0 obj -<> endobj +<> endobj 419 0 obj -<> endobj +<> endobj 420 0 obj -<> endobj +<> endobj 421 0 obj -<> endobj +<> endobj 422 0 obj -<> endobj +<> endobj 423 0 obj -<> endobj +<> endobj 424 0 obj -<> endobj +<> endobj 425 0 obj -<> endobj +<> endobj 426 0 obj -<> endobj +<> endobj 427 0 obj -<> endobj +<> endobj 428 0 obj -<> endobj +<> endobj 429 0 obj -<> endobj +<> endobj 430 0 obj -<> endobj +<> endobj 431 0 obj -<> endobj +<> endobj 432 0 obj -<> endobj +<> endobj 433 0 obj -<> endobj +<> endobj 434 0 obj -<> endobj +<> endobj 435 0 obj -<> endobj +<> endobj 436 0 obj -<> endobj +<> endobj 437 0 obj -<> endobj +<> endobj 438 0 obj -<> endobj +<> endobj 439 0 obj -<> endobj +<> endobj 440 0 obj -<> endobj +<> endobj 441 0 obj -<> endobj +<> endobj 442 0 obj -<> endobj +<> endobj 443 0 obj -<> endobj +<> endobj 444 0 obj -<> endobj +<> endobj 445 0 obj -<> endobj +<> endobj 446 0 obj -<> endobj +<> endobj 447 0 obj -<> endobj +<> endobj 448 0 obj -<> endobj +<> endobj 449 0 obj -<> endobj +<> endobj 450 0 obj -<> endobj +<> endobj 451 0 obj -<> endobj +<> endobj 452 0 obj -<> endobj +<> endobj 453 0 obj -<> endobj +<> endobj 454 0 obj -<> endobj +<> endobj 455 0 obj -<> endobj +<> endobj 456 0 obj -<> endobj +<> endobj 457 0 obj -<> endobj +<> endobj 458 0 obj -<> endobj +<> endobj 459 0 obj -<> endobj +<> endobj 460 0 obj -<> endobj +<> endobj 461 0 obj -<> endobj +<> endobj 462 0 obj -<> endobj +<> endobj 463 0 obj -<> endobj +<> endobj 464 0 obj -<> endobj +<> endobj 465 0 obj -<> endobj +<> endobj 466 0 obj -<> endobj +<> endobj 467 0 obj -<> endobj +<> endobj 468 0 obj -<> endobj +<> endobj 469 0 obj -<> endobj +<> endobj 470 0 obj -<> endobj +<> endobj 471 0 obj -<> endobj +<> endobj 472 0 obj -<> endobj +<> endobj 473 0 obj -<> endobj +<> endobj 474 0 obj -<> endobj +<> endobj 475 0 obj -<> endobj +<> endobj 476 0 obj -<> endobj +<> endobj 477 0 obj -<> endobj +<> endobj 478 0 obj -<> endobj +<> endobj 479 0 obj -<> endobj +<> endobj 480 0 obj -<> endobj +<> endobj 481 0 obj -<> endobj +<> endobj 482 0 obj -<> endobj +<> endobj 483 0 obj -<> endobj +<> endobj 484 0 obj -<> endobj +<> endobj 485 0 obj -<> endobj +<> endobj 486 0 obj -<> endobj +<> endobj 487 0 obj -<> endobj +<> endobj 488 0 obj -<> endobj +<> endobj 489 0 obj -<> endobj +<> endobj 490 0 obj -<> endobj +<> endobj 491 0 obj -<> endobj +<> endobj 492 0 obj -<> endobj +<> endobj 493 0 obj -<> endobj +<> endobj 494 0 obj -<> endobj +<> endobj 495 0 obj -<> endobj +<> endobj 496 0 obj -<> endobj +<> endobj 497 0 obj -<> endobj +<> endobj 498 0 obj -<> endobj +<> endobj 499 0 obj -<> endobj +<> endobj 500 0 obj -<> endobj +<> endobj 501 0 obj -<> endobj +<> endobj 502 0 obj -<> endobj +<> endobj 503 0 obj -<> endobj +<> endobj 504 0 obj -<> endobj +<> endobj 505 0 obj -<> endobj +<> endobj 506 0 obj -<> endobj +<> endobj 507 0 obj -<> endobj +<> endobj 508 0 obj -<> endobj +<> endobj 509 0 obj -<> endobj +<> endobj 510 0 obj -<> endobj +<> endobj 511 0 obj -<> endobj +<> endobj 512 0 obj -<> endobj +<> endobj 513 0 obj -<> endobj +<> endobj 514 0 obj -<> endobj +<> endobj 515 0 obj -<> endobj +<> endobj 516 0 obj -<> endobj +<> endobj 517 0 obj -<> endobj +<> endobj 518 0 obj -<> endobj +<> endobj 519 0 obj -<> endobj +<> endobj 520 0 obj -<> endobj +<> endobj 521 0 obj -<> endobj +<> endobj 522 0 obj -<> endobj +<> endobj 523 0 obj -<> endobj +<> endobj 524 0 obj -<> endobj +<> endobj 525 0 obj -<> endobj +<> endobj 526 0 obj -<> endobj +<> endobj 527 0 obj -<> endobj +<> endobj 528 0 obj -<> endobj +<> endobj 529 0 obj -<> endobj +<> endobj 530 0 obj -<> endobj +<> endobj 531 0 obj -<> endobj +<> endobj 532 0 obj -<> endobj +<> endobj 533 0 obj -<> endobj +<> endobj 534 0 obj -<> endobj +<> endobj 535 0 obj -<> endobj +<> endobj 536 0 obj -<> endobj +<> endobj 537 0 obj -<> endobj +<> endobj 538 0 obj -<> endobj +<> endobj 539 0 obj -<> endobj +<> endobj 540 0 obj -<> endobj +<> endobj 541 0 obj -<> endobj +<> endobj 542 0 obj -<> endobj +<> endobj 543 0 obj -<> endobj +<> endobj 544 0 obj -<> endobj +<> endobj 545 0 obj -<> endobj +<> endobj 546 0 obj -<> endobj +<> endobj 547 0 obj -<> endobj +<> endobj 548 0 obj -<> endobj +<> endobj 549 0 obj -<> endobj +<> endobj 550 0 obj -<> endobj +<> endobj 551 0 obj -<> endobj +<> endobj 552 0 obj -<> endobj +<> endobj 553 0 obj -<> endobj +<> endobj 554 0 obj -<> endobj +<> endobj 555 0 obj -<> endobj +<> endobj 556 0 obj -<> endobj +<> endobj 557 0 obj -<> endobj +<> endobj 558 0 obj -<> endobj +<> endobj 559 0 obj -<> endobj +<> endobj 560 0 obj -<> endobj +<> endobj 561 0 obj -<> endobj +<> endobj 562 0 obj -<> endobj +<> endobj 563 0 obj -<> endobj +<> endobj 564 0 obj -<> endobj +<> endobj 565 0 obj -<> endobj +<> endobj 566 0 obj -<> endobj +<> endobj 567 0 obj -<> endobj +<> endobj 568 0 obj -<> endobj +<> endobj 569 0 obj -<> endobj +<> endobj 570 0 obj -<> endobj +<> endobj 571 0 obj -<> endobj +<> endobj 572 0 obj -<> endobj +<> endobj 573 0 obj -<> endobj +<> endobj 574 0 obj -<> endobj +<> endobj 575 0 obj -<> endobj +<> endobj 576 0 obj -<> endobj +<> endobj 577 0 obj -<> endobj +<> endobj 578 0 obj -<> endobj +<> endobj 579 0 obj -<> endobj +<> endobj 580 0 obj -<> endobj +<> endobj 581 0 obj -<> endobj +<> endobj 582 0 obj -<> endobj +<> endobj 583 0 obj -<> endobj +<> endobj 584 0 obj -<> endobj +<> endobj 585 0 obj -<> endobj +<> endobj 586 0 obj -<> endobj +<> endobj 587 0 obj -<> endobj +<> endobj 588 0 obj -<> endobj +<> endobj 589 0 obj -<> endobj +<> endobj 590 0 obj -<> endobj +<> endobj 591 0 obj -<> endobj +<> endobj 592 0 obj -<> endobj +<> endobj 593 0 obj -<> endobj +<> endobj 594 0 obj -<> endobj +<> endobj 595 0 obj -<> endobj +<> endobj 596 0 obj -<> endobj +<> endobj 597 0 obj -<> endobj +<> endobj 598 0 obj -<> endobj +<> endobj 599 0 obj -<> endobj +<> endobj 600 0 obj -<> endobj +<> endobj 601 0 obj -<> endobj +<> endobj 602 0 obj -<> endobj +<> endobj 603 0 obj -<> endobj +<> endobj 604 0 obj -<> endobj +<> endobj 605 0 obj -<> endobj +<> endobj 606 0 obj -<> endobj +<> endobj 607 0 obj -<> endobj +<> endobj 608 0 obj -<> endobj +<> endobj 609 0 obj -<> endobj +<> endobj 610 0 obj -<> endobj +<> endobj 611 0 obj -<> endobj +<> endobj 612 0 obj -<> endobj +<> endobj 613 0 obj -<> endobj +<> endobj 614 0 obj -<> endobj +<> endobj 615 0 obj -<> endobj +<> endobj 616 0 obj -<> endobj +<> endobj 617 0 obj -<> endobj +<> endobj 618 0 obj -<> endobj +<> endobj 619 0 obj -<> endobj +<> endobj 620 0 obj -<> endobj +<> endobj 621 0 obj -<> endobj +<> endobj 622 0 obj -<> endobj +<> endobj 623 0 obj -<> endobj +<> endobj 624 0 obj -<> endobj +<> endobj 625 0 obj -<> endobj +<> endobj 626 0 obj -<> endobj +<> endobj 627 0 obj -<> endobj +<> endobj 628 0 obj -<> endobj +<> endobj 629 0 obj -<> endobj +<> endobj 630 0 obj -<> endobj +<> endobj 631 0 obj -<> endobj +<> endobj 632 0 obj -<> endobj +<> endobj 633 0 obj -<> endobj +<> endobj 634 0 obj -<> endobj +<> endobj 635 0 obj -<> endobj +<> endobj 636 0 obj -<> endobj +<> endobj 637 0 obj -<> endobj +<> endobj 638 0 obj -<> endobj +<> endobj 639 0 obj -<> endobj +<> endobj 640 0 obj -<> endobj +<> endobj 641 0 obj -<> endobj +<> endobj 642 0 obj -<> endobj +<> endobj 643 0 obj -<> endobj +<> endobj 644 0 obj -<> endobj +<> endobj 645 0 obj -<> endobj +<> endobj 646 0 obj -<> endobj +<> endobj 647 0 obj -<> endobj +<> endobj 648 0 obj -<> endobj +<> endobj 649 0 obj -<> endobj +<> endobj 650 0 obj -<> endobj +<> endobj 651 0 obj -<> endobj +<> endobj 652 0 obj -<> endobj +<> endobj 653 0 obj -<> endobj +<> endobj 654 0 obj -<> endobj +<> endobj 655 0 obj -<> endobj +<> endobj 656 0 obj -<> endobj +<> endobj 657 0 obj -<> endobj +<> endobj 658 0 obj -<> endobj +<> endobj 659 0 obj -<> endobj +<> endobj 660 0 obj -<> endobj +<> endobj 661 0 obj -<> endobj +<> endobj 662 0 obj -<> endobj +<> endobj 663 0 obj -<> endobj +<> endobj 664 0 obj -<> endobj +<> endobj 665 0 obj -<> endobj +<> endobj 666 0 obj -<> endobj +<> endobj 667 0 obj -<> endobj +<> endobj 668 0 obj -<> endobj +<> endobj 669 0 obj -<> endobj +<> endobj 670 0 obj -<> endobj +<> endobj 671 0 obj -<> endobj +<> endobj 672 0 obj -<> endobj +<> endobj 673 0 obj -<> endobj +<> endobj 674 0 obj -<> endobj +<> endobj 675 0 obj -<> endobj +<> endobj 676 0 obj -<> endobj +<> endobj 677 0 obj -<> endobj +<> endobj 678 0 obj -<> endobj +<> endobj 679 0 obj -<> endobj +<> endobj 680 0 obj -<> endobj +<> endobj 681 0 obj -<> endobj +<> endobj 682 0 obj -<> endobj +<> endobj 683 0 obj -<> endobj +<> endobj 684 0 obj -<> endobj +<> endobj 685 0 obj -<> endobj +<> endobj 686 0 obj -<> endobj +<> endobj 687 0 obj -<> endobj +<> endobj 688 0 obj -<> endobj +<> endobj 689 0 obj -<> endobj +<> endobj 690 0 obj -<> endobj +<> endobj 691 0 obj -<> endobj +<> endobj 692 0 obj -<> endobj +<> endobj 693 0 obj -<> endobj +<> endobj 694 0 obj -<> endobj +<> endobj 695 0 obj -<> endobj +<> endobj 696 0 obj -<> endobj +<> endobj 697 0 obj -<> endobj +<> endobj 698 0 obj -<> endobj +<> endobj 699 0 obj -<> endobj +<> endobj 700 0 obj -<> endobj +<> endobj 701 0 obj -<> endobj +<> endobj 702 0 obj -<> endobj +<> endobj 703 0 obj -<> endobj +<> endobj 704 0 obj -<> endobj +<> endobj 705 0 obj -<> endobj +<> endobj 706 0 obj -<> endobj +<> endobj 707 0 obj -<> endobj +<> endobj 708 0 obj -<> endobj +<> endobj 709 0 obj -<> endobj +<> endobj 710 0 obj -<> endobj +<> endobj 711 0 obj -<> endobj +<> endobj 712 0 obj -<> endobj +<> endobj 713 0 obj -<> endobj +<> endobj 714 0 obj -<> endobj +<> endobj 715 0 obj -<> endobj +<> endobj 716 0 obj -<> endobj +<> endobj 717 0 obj -<> endobj +<> endobj 718 0 obj -<> endobj +<> endobj 719 0 obj -<> endobj +<> endobj 720 0 obj -<> endobj +<> endobj 721 0 obj -<> endobj +<> endobj 722 0 obj -<> endobj +<> endobj 723 0 obj -<> endobj +<> endobj 724 0 obj -<> endobj +<> endobj 725 0 obj -<> endobj +<> endobj 726 0 obj -<> endobj +<> endobj 727 0 obj -<> endobj +<> endobj 728 0 obj -<> endobj +<> endobj 729 0 obj -<> endobj +<> endobj 730 0 obj -<> endobj +<> endobj 731 0 obj -<> endobj +<> endobj 732 0 obj -<> endobj +<> endobj 733 0 obj -<> endobj +<> endobj 734 0 obj -<> endobj +<> endobj 735 0 obj -<> endobj +<> endobj 736 0 obj -<> endobj +<> endobj 737 0 obj -<> endobj +<> endobj 738 0 obj -<> endobj +<> endobj 739 0 obj -<> endobj +<> endobj 740 0 obj -<> endobj +<> endobj 741 0 obj -<> endobj +<> endobj 742 0 obj -<> endobj +<> endobj 743 0 obj -<> endobj +<> endobj 744 0 obj -<> endobj +<> endobj 745 0 obj -<> endobj +<> endobj 746 0 obj -<> endobj +<> endobj 747 0 obj -<> endobj +<> endobj 748 0 obj -<> endobj +<> endobj 749 0 obj -<> endobj +<> endobj 750 0 obj -<> endobj +<> endobj 751 0 obj -<> endobj +<> endobj 752 0 obj -<> endobj +<> endobj 753 0 obj -<> endobj +<> endobj 754 0 obj -<> endobj +<> endobj 755 0 obj -<> endobj +<> endobj 756 0 obj -<> endobj +<> endobj 757 0 obj -<> endobj +<> endobj 758 0 obj -<> endobj +<> endobj 759 0 obj -<> endobj +<> endobj 760 0 obj -<> endobj +<> endobj 761 0 obj -<> endobj +<> endobj 762 0 obj -<> endobj +<> endobj 763 0 obj -<> endobj +<> endobj 764 0 obj -<> endobj +<> endobj 765 0 obj -<> endobj +<> endobj 766 0 obj -<> endobj +<> endobj 767 0 obj -<> endobj +<> endobj 768 0 obj -<> endobj +<> endobj 769 0 obj -<> endobj +<> endobj 770 0 obj -<> endobj +<> endobj 771 0 obj -<> endobj +<> endobj 772 0 obj -<> endobj +<> endobj 773 0 obj -<> endobj +<> endobj 774 0 obj -<> endobj +<> endobj 775 0 obj -<> endobj +<> endobj 776 0 obj -<> endobj +<> endobj 777 0 obj -<> endobj +<> endobj 778 0 obj -<> endobj +<> endobj 779 0 obj -<> endobj +<> endobj 780 0 obj -<> endobj +<> endobj 781 0 obj -<> endobj +<> endobj 782 0 obj -<> endobj +<> endobj 783 0 obj -<> endobj +<> endobj 784 0 obj -<> endobj +<> endobj 785 0 obj -<> endobj +<> endobj 786 0 obj -<> endobj +<> endobj 787 0 obj -<> endobj +<> endobj 788 0 obj -<> endobj +<> endobj 789 0 obj -<> endobj +<> endobj 790 0 obj -<> endobj +<> endobj 791 0 obj -<> endobj +<> endobj 792 0 obj -<> endobj +<> endobj 793 0 obj -<> endobj +<> endobj 794 0 obj -<> endobj +<> endobj 795 0 obj -<> endobj +<> endobj 796 0 obj -<> endobj +<> endobj 797 0 obj -<> endobj +<> endobj 798 0 obj -<> endobj +<> endobj 799 0 obj -<> endobj +<> endobj 800 0 obj -<> endobj +<> endobj 801 0 obj -<> endobj +<> endobj 802 0 obj -<> endobj +<> endobj 803 0 obj -<> endobj +<> endobj 804 0 obj -<> endobj +<> endobj 805 0 obj -<> endobj +<> endobj 806 0 obj -<> endobj +<> endobj 807 0 obj -<> endobj +<> endobj 808 0 obj -<> endobj +<> endobj 809 0 obj -<> endobj +<> endobj 810 0 obj -<> endobj +<> endobj 811 0 obj -<> endobj +<> endobj 812 0 obj -<> endobj +<> endobj 813 0 obj -<> endobj +<> endobj 814 0 obj -<> endobj +<> endobj 815 0 obj -<> endobj +<> endobj 816 0 obj -<> endobj +<> endobj 817 0 obj -<> endobj +<> endobj 818 0 obj -<> endobj +<> endobj 819 0 obj -<> endobj +<> endobj 820 0 obj -<> endobj +<> endobj 821 0 obj -<> endobj +<> endobj 822 0 obj -<> endobj +<> endobj 823 0 obj -<> endobj +<> endobj 824 0 obj -<> endobj +<> endobj 825 0 obj -<> endobj +<> endobj 826 0 obj -<> endobj +<> endobj 827 0 obj -<> endobj +<> endobj 828 0 obj -<> endobj +<> endobj 829 0 obj -<> endobj +<> endobj 830 0 obj -<> endobj +<> endobj 831 0 obj -<> endobj +<> endobj 832 0 obj -<> endobj +<> endobj 833 0 obj -<> endobj +<> endobj 834 0 obj -<> endobj +<> endobj 835 0 obj -<> endobj +<> endobj 836 0 obj -<> endobj +<> endobj 837 0 obj -<> endobj +<> endobj 838 0 obj -<> endobj +<> endobj 839 0 obj -<> endobj +<> endobj 840 0 obj -<> endobj +<> endobj 841 0 obj -<> endobj +<> endobj 842 0 obj -<> endobj +<> endobj 843 0 obj -<> endobj +<> endobj 844 0 obj -<> endobj +<> endobj 845 0 obj -<> endobj +<> endobj 846 0 obj -<> endobj +<> endobj 847 0 obj -<> endobj +<> endobj 848 0 obj -<> endobj +<> endobj 849 0 obj -<> endobj +<> endobj 850 0 obj -<> endobj +<> endobj 851 0 obj -<> endobj +<> endobj 852 0 obj -<> endobj +<> endobj 853 0 obj -<> endobj +<> endobj 854 0 obj -<> endobj +<> endobj 855 0 obj -<> endobj +<> endobj 856 0 obj -<> endobj +<> endobj 857 0 obj -<> endobj +<> endobj 858 0 obj -<> endobj +<> endobj 859 0 obj -<> endobj +<> endobj 860 0 obj +<> endobj +861 0 obj +<> endobj +862 0 obj +<> endobj +863 0 obj +<> endobj +864 0 obj +<> endobj +865 0 obj +<> endobj +866 0 obj +<> endobj +867 0 obj +<> endobj +868 0 obj +<> endobj +869 0 obj +<> endobj +870 0 obj +<> endobj +871 0 obj +<> endobj +872 0 obj +<> endobj +873 0 obj <> endobj -12 0 obj -<< -/Type /Outlines -/First 13 0 R -/Last 15 0 R -/Count 306 ->> -endobj - 13 0 obj << -/Title (Pages) -/Parent 12 0 R -/Next 15 0 R +/Type /Outlines /First 14 0 R -/Last 14 0 R -/Count 1 ->> -endobj - -15 0 obj -<< -/Title (Net) -/Parent 12 0 R -/Prev 13 0 R -/First 16 0 R -/Last 315 0 R -/Count 303 +/Last 16 0 R +/Count 310 >> endobj 14 0 obj << -/Title (SCH_Pro-micro_Pinouts 1-Sheet_1) +/Title (Pages) /Parent 13 0 R -/Dest [3 0 R /XYZ 0 1197.36 0] +/Next 16 0 R +/First 15 0 R +/Last 15 0 R +/Count 1 >> endobj 16 0 obj << -/Title (3V3) -/Parent 15 0 R -/Next 35 0 R +/Title (Net) +/Parent 13 0 R +/Prev 14 0 R /First 17 0 R -/Last 34 0 R -/Count 18 +/Last 320 0 R +/Count 307 >> endobj -35 0 obj +15 0 obj +<< +/Title (SCH_Pro-micro_Pinouts 1-Sheet_1) +/Parent 14 0 R +/Dest [3 0 R /XYZ 0 1197.36 0] +>> +endobj + +17 0 obj +<< +/Title (3V3) +/Parent 16 0 R +/Next 37 0 R +/First 18 0 R +/Last 36 0 R +/Count 19 +>> +endobj + +37 0 obj << /Title (+5V) -/Parent 15 0 R -/Prev 16 0 R -/Next 39 0 R -/First 36 0 R -/Last 38 0 R -/Count 3 ->> -endobj - -39 0 obj -<< -/Title ($1N1) -/Parent 15 0 R -/Prev 35 0 R +/Parent 16 0 R +/Prev 17 0 R /Next 41 0 R -/First 40 0 R +/First 38 0 R /Last 40 0 R -/Count 1 +/Count 3 >> endobj 41 0 obj << -/Title ($1N25) -/Parent 15 0 R -/Prev 39 0 R +/Title ($1N1) +/Parent 16 0 R +/Prev 37 0 R /Next 43 0 R /First 42 0 R /Last 42 0 R @@ -29475,8 +30216,8 @@ endobj 43 0 obj << -/Title ($1N62) -/Parent 15 0 R +/Title ($1N25) +/Parent 16 0 R /Prev 41 0 R /Next 45 0 R /First 44 0 R @@ -29487,153 +30228,153 @@ endobj 45 0 obj << -/Title (ADC) -/Parent 15 0 R +/Title ($1N62) +/Parent 16 0 R /Prev 43 0 R -/Next 50 0 R +/Next 47 0 R /First 46 0 R -/Last 49 0 R +/Last 46 0 R +/Count 1 +>> +endobj + +47 0 obj +<< +/Title (ADC) +/Parent 16 0 R +/Prev 45 0 R +/Next 52 0 R +/First 48 0 R +/Last 51 0 R /Count 4 >> endobj -50 0 obj +52 0 obj << /Title (BATT) -/Parent 15 0 R -/Prev 45 0 R -/Next 57 0 R -/First 51 0 R -/Last 56 0 R +/Parent 16 0 R +/Prev 47 0 R +/Next 59 0 R +/First 53 0 R +/Last 58 0 R /Count 6 >> endobj -57 0 obj +59 0 obj << /Title (BUSY) -/Parent 15 0 R -/Prev 50 0 R -/Next 73 0 R -/First 58 0 R -/Last 72 0 R +/Parent 16 0 R +/Prev 52 0 R +/Next 75 0 R +/First 60 0 R +/Last 74 0 R /Count 15 >> endobj -73 0 obj +75 0 obj << /Title (CS) -/Parent 15 0 R -/Prev 57 0 R -/Next 89 0 R -/First 74 0 R -/Last 88 0 R +/Parent 16 0 R +/Prev 59 0 R +/Next 91 0 R +/First 76 0 R +/Last 90 0 R /Count 15 >> endobj -89 0 obj +91 0 obj << /Title (DIO2) -/Parent 15 0 R -/Prev 73 0 R -/Next 102 0 R -/First 90 0 R -/Last 101 0 R -/Count 12 ->> -endobj - -102 0 obj -<< -/Title (DIO3) -/Parent 15 0 R -/Prev 89 0 R +/Parent 16 0 R +/Prev 75 0 R /Next 104 0 R -/First 103 0 R +/First 92 0 R /Last 103 0 R -/Count 1 +/Count 12 >> endobj 104 0 obj << -/Title (E_INK_BUSY) -/Parent 15 0 R -/Prev 102 0 R -/Next 109 0 R +/Title (DIO3) +/Parent 16 0 R +/Prev 91 0 R +/Next 106 0 R /First 105 0 R -/Last 108 0 R +/Last 105 0 R +/Count 1 +>> +endobj + +106 0 obj +<< +/Title (E_INK_BUSY) +/Parent 16 0 R +/Prev 104 0 R +/Next 111 0 R +/First 107 0 R +/Last 110 0 R /Count 4 >> endobj -109 0 obj +111 0 obj << /Title (E_INK_CS) -/Parent 15 0 R -/Prev 104 0 R -/Next 113 0 R -/First 110 0 R -/Last 112 0 R +/Parent 16 0 R +/Prev 106 0 R +/Next 115 0 R +/First 112 0 R +/Last 114 0 R /Count 3 >> endobj -113 0 obj +115 0 obj << /Title (E_INK_D/C) -/Parent 15 0 R -/Prev 109 0 R -/Next 117 0 R -/First 114 0 R -/Last 116 0 R +/Parent 16 0 R +/Prev 111 0 R +/Next 119 0 R +/First 116 0 R +/Last 118 0 R /Count 3 >> endobj -117 0 obj +119 0 obj << /Title (E_INK_NRST) -/Parent 15 0 R -/Prev 113 0 R -/Next 121 0 R -/First 118 0 R -/Last 120 0 R +/Parent 16 0 R +/Prev 115 0 R +/Next 123 0 R +/First 120 0 R +/Last 122 0 R /Count 3 >> endobj -121 0 obj +123 0 obj << /Title (GND) -/Parent 15 0 R -/Prev 117 0 R -/Next 196 0 R -/First 122 0 R -/Last 195 0 R -/Count 74 ->> -endobj - -196 0 obj -<< -/Title (GPSEN) -/Parent 15 0 R -/Prev 121 0 R +/Parent 16 0 R +/Prev 119 0 R /Next 199 0 R -/First 197 0 R +/First 124 0 R /Last 198 0 R -/Count 2 +/Count 75 >> endobj 199 0 obj << -/Title (GPSRX) -/Parent 15 0 R -/Prev 196 0 R +/Title (GPSEN) +/Parent 16 0 R +/Prev 123 0 R /Next 202 0 R /First 200 0 R /Last 201 0 R @@ -29643,1812 +30384,1826 @@ endobj 202 0 obj << -/Title (GPSTX) -/Parent 15 0 R +/Title (GPSRX) +/Parent 16 0 R /Prev 199 0 R -/Next 205 0 R +/Next 206 0 R /First 203 0 R -/Last 204 0 R -/Count 2 +/Last 205 0 R +/Count 3 >> endobj -205 0 obj +206 0 obj +<< +/Title (GPSTX) +/Parent 16 0 R +/Prev 202 0 R +/Next 210 0 R +/First 207 0 R +/Last 209 0 R +/Count 3 +>> +endobj + +210 0 obj << /Title (IRQ) -/Parent 15 0 R -/Prev 202 0 R -/Next 221 0 R -/First 206 0 R -/Last 220 0 R +/Parent 16 0 R +/Prev 206 0 R +/Next 226 0 R +/First 211 0 R +/Last 225 0 R /Count 15 >> endobj -221 0 obj +226 0 obj << /Title (LORA_ANT) -/Parent 15 0 R -/Prev 205 0 R -/Next 223 0 R -/First 222 0 R -/Last 222 0 R +/Parent 16 0 R +/Prev 210 0 R +/Next 228 0 R +/First 227 0 R +/Last 227 0 R /Count 1 >> endobj -223 0 obj +228 0 obj << /Title (MISO) -/Parent 15 0 R -/Prev 221 0 R -/Next 239 0 R -/First 224 0 R -/Last 238 0 R +/Parent 16 0 R +/Prev 226 0 R +/Next 244 0 R +/First 229 0 R +/Last 243 0 R /Count 15 >> endobj -239 0 obj +244 0 obj << /Title (MOSI) -/Parent 15 0 R -/Prev 223 0 R -/Next 257 0 R -/First 240 0 R -/Last 256 0 R +/Parent 16 0 R +/Prev 228 0 R +/Next 262 0 R +/First 245 0 R +/Last 261 0 R /Count 17 >> endobj -257 0 obj +262 0 obj << /Title (NRST) -/Parent 15 0 R -/Prev 239 0 R -/Next 273 0 R -/First 258 0 R -/Last 272 0 R +/Parent 16 0 R +/Prev 244 0 R +/Next 278 0 R +/First 263 0 R +/Last 277 0 R /Count 15 >> endobj -273 0 obj +278 0 obj << /Title (RBTN) -/Parent 15 0 R -/Prev 257 0 R -/Next 277 0 R -/First 274 0 R -/Last 276 0 R +/Parent 16 0 R +/Prev 262 0 R +/Next 282 0 R +/First 279 0 R +/Last 281 0 R /Count 3 >> endobj -277 0 obj +282 0 obj << /Title (RXEN) -/Parent 15 0 R -/Prev 273 0 R -/Next 285 0 R -/First 278 0 R -/Last 284 0 R +/Parent 16 0 R +/Prev 278 0 R +/Next 290 0 R +/First 283 0 R +/Last 289 0 R /Count 7 >> endobj -285 0 obj +290 0 obj << /Title (SCK) -/Parent 15 0 R -/Prev 277 0 R -/Next 303 0 R -/First 286 0 R -/Last 302 0 R +/Parent 16 0 R +/Prev 282 0 R +/Next 308 0 R +/First 291 0 R +/Last 307 0 R /Count 17 >> endobj -303 0 obj +308 0 obj << /Title (SCL) -/Parent 15 0 R -/Prev 285 0 R -/Next 306 0 R -/First 304 0 R -/Last 305 0 R +/Parent 16 0 R +/Prev 290 0 R +/Next 311 0 R +/First 309 0 R +/Last 310 0 R /Count 2 >> endobj -306 0 obj +311 0 obj << /Title (SDA) -/Parent 15 0 R -/Prev 303 0 R -/Next 309 0 R -/First 307 0 R -/Last 308 0 R +/Parent 16 0 R +/Prev 308 0 R +/Next 314 0 R +/First 312 0 R +/Last 313 0 R /Count 2 >> endobj -309 0 obj +314 0 obj << /Title (SERIAL2RX) -/Parent 15 0 R -/Prev 306 0 R -/Next 312 0 R -/First 310 0 R -/Last 311 0 R +/Parent 16 0 R +/Prev 311 0 R +/Next 317 0 R +/First 315 0 R +/Last 316 0 R /Count 2 >> endobj -312 0 obj +317 0 obj << /Title (SERIAL2TX) -/Parent 15 0 R -/Prev 309 0 R -/Next 315 0 R -/First 313 0 R -/Last 314 0 R +/Parent 16 0 R +/Prev 314 0 R +/Next 320 0 R +/First 318 0 R +/Last 319 0 R /Count 2 >> endobj -315 0 obj +320 0 obj << /Title (UBTN) -/Parent 15 0 R -/Prev 312 0 R -/First 316 0 R -/Last 318 0 R -/Count 3 ->> -endobj - -17 0 obj -<< -/Title ($1N5) /Parent 16 0 R -/Next 18 0 R -/A 319 0 R +/Prev 317 0 R +/First 321 0 R +/Last 323 0 R +/Count 3 >> endobj 18 0 obj << -/Title ($1N29) -/Parent 16 0 R -/Prev 17 0 R +/Title ($1N5) +/Parent 17 0 R /Next 19 0 R -/A 321 0 R +/A 324 0 R >> endobj 19 0 obj << -/Title ($1N35) -/Parent 16 0 R +/Title ($1N29) +/Parent 17 0 R /Prev 18 0 R /Next 20 0 R -/A 323 0 R +/A 326 0 R >> endobj 20 0 obj << -/Title ($1N54) -/Parent 16 0 R +/Title ($1N35) +/Parent 17 0 R /Prev 19 0 R /Next 21 0 R -/A 325 0 R +/A 328 0 R >> endobj 21 0 obj << -/Title ($1N1528) -/Parent 16 0 R +/Title ($1N54) +/Parent 17 0 R /Prev 20 0 R /Next 22 0 R -/A 327 0 R +/A 330 0 R >> endobj 22 0 obj << -/Title ($1N1550) -/Parent 16 0 R +/Title ($1N1528) +/Parent 17 0 R /Prev 21 0 R /Next 23 0 R -/A 329 0 R +/A 332 0 R >> endobj 23 0 obj << -/Title ($1N1574) -/Parent 16 0 R +/Title ($1N1550) +/Parent 17 0 R /Prev 22 0 R /Next 24 0 R -/A 331 0 R +/A 334 0 R >> endobj 24 0 obj << -/Title ($1N1582) -/Parent 16 0 R +/Title ($1N1574) +/Parent 17 0 R /Prev 23 0 R /Next 25 0 R -/A 333 0 R +/A 336 0 R >> endobj 25 0 obj << -/Title ($1N1616) -/Parent 16 0 R +/Title ($1N1582) +/Parent 17 0 R /Prev 24 0 R /Next 26 0 R -/A 335 0 R +/A 338 0 R >> endobj 26 0 obj << -/Title ($1N1618) -/Parent 16 0 R +/Title ($1N1616) +/Parent 17 0 R /Prev 25 0 R /Next 27 0 R -/A 337 0 R +/A 340 0 R >> endobj 27 0 obj << -/Title ($1N1732) -/Parent 16 0 R +/Title ($1N1618) +/Parent 17 0 R /Prev 26 0 R /Next 28 0 R -/A 339 0 R +/A 342 0 R >> endobj 28 0 obj << -/Title ($1N1742) -/Parent 16 0 R +/Title ($1N1732) +/Parent 17 0 R /Prev 27 0 R /Next 29 0 R -/A 341 0 R +/A 344 0 R >> endobj 29 0 obj << -/Title ($1N1776) -/Parent 16 0 R +/Title ($1N1742) +/Parent 17 0 R /Prev 28 0 R /Next 30 0 R -/A 343 0 R +/A 346 0 R >> endobj 30 0 obj << -/Title ($1N1810) -/Parent 16 0 R +/Title ($1N1776) +/Parent 17 0 R /Prev 29 0 R /Next 31 0 R -/A 345 0 R +/A 348 0 R >> endobj 31 0 obj << -/Title ($1N1860) -/Parent 16 0 R +/Title ($1N1810) +/Parent 17 0 R /Prev 30 0 R /Next 32 0 R -/A 347 0 R +/A 350 0 R >> endobj 32 0 obj << -/Title ($1N1874) -/Parent 16 0 R +/Title ($1N1860) +/Parent 17 0 R /Prev 31 0 R /Next 33 0 R -/A 349 0 R +/A 352 0 R >> endobj 33 0 obj << -/Title ($1N5406) -/Parent 16 0 R +/Title ($1N1874) +/Parent 17 0 R /Prev 32 0 R /Next 34 0 R -/A 351 0 R +/A 354 0 R >> endobj 34 0 obj << -/Title ($1N5445) -/Parent 16 0 R +/Title ($1N5406) +/Parent 17 0 R /Prev 33 0 R -/A 353 0 R +/Next 35 0 R +/A 356 0 R +>> +endobj + +35 0 obj +<< +/Title ($1N5445) +/Parent 17 0 R +/Prev 34 0 R +/Next 36 0 R +/A 358 0 R >> endobj 36 0 obj << -/Title ($1N23) -/Parent 35 0 R -/Next 37 0 R -/A 355 0 R ->> -endobj - -37 0 obj -<< -/Title ($1N31) -/Parent 35 0 R -/Prev 36 0 R -/Next 38 0 R -/A 357 0 R +/Title ($1N10678) +/Parent 17 0 R +/Prev 35 0 R +/A 360 0 R >> endobj 38 0 obj << -/Title ($1N1570) -/Parent 35 0 R -/Prev 37 0 R -/A 359 0 R +/Title ($1N23) +/Parent 37 0 R +/Next 39 0 R +/A 362 0 R +>> +endobj + +39 0 obj +<< +/Title ($1N31) +/Parent 37 0 R +/Prev 38 0 R +/Next 40 0 R +/A 364 0 R >> endobj 40 0 obj << -/Title ($1N1) -/Parent 39 0 R -/A 361 0 R +/Title ($1N1570) +/Parent 37 0 R +/Prev 39 0 R +/A 366 0 R >> endobj 42 0 obj << -/Title ($1N25) +/Title ($1N1) /Parent 41 0 R -/A 363 0 R +/A 368 0 R >> endobj 44 0 obj << -/Title ($1N62) +/Title ($1N25) /Parent 43 0 R -/A 365 0 R +/A 370 0 R >> endobj 46 0 obj << -/Title ($1N15) +/Title ($1N62) /Parent 45 0 R -/Next 47 0 R -/A 367 0 R ->> -endobj - -47 0 obj -<< -/Title ($1N44) -/Parent 45 0 R -/Prev 46 0 R -/Next 48 0 R -/A 369 0 R +/A 372 0 R >> endobj 48 0 obj << -/Title ($1N1852) -/Parent 45 0 R -/Prev 47 0 R +/Title ($1N15) +/Parent 47 0 R /Next 49 0 R -/A 371 0 R +/A 374 0 R >> endobj 49 0 obj << -/Title ($1N1856) -/Parent 45 0 R +/Title ($1N44) +/Parent 47 0 R /Prev 48 0 R -/A 373 0 R +/Next 50 0 R +/A 376 0 R +>> +endobj + +50 0 obj +<< +/Title ($1N1852) +/Parent 47 0 R +/Prev 49 0 R +/Next 51 0 R +/A 378 0 R >> endobj 51 0 obj << -/Title ($1N1494) -/Parent 50 0 R -/Next 52 0 R -/A 375 0 R ->> -endobj - -52 0 obj -<< -/Title ($1N1508) -/Parent 50 0 R -/Prev 51 0 R -/Next 53 0 R -/A 377 0 R +/Title ($1N1856) +/Parent 47 0 R +/Prev 50 0 R +/A 380 0 R >> endobj 53 0 obj << -/Title ($1N1578) -/Parent 50 0 R -/Prev 52 0 R +/Title ($1N1494) +/Parent 52 0 R /Next 54 0 R -/A 379 0 R +/A 382 0 R >> endobj 54 0 obj << -/Title ($1N1846) -/Parent 50 0 R +/Title ($1N1508) +/Parent 52 0 R /Prev 53 0 R /Next 55 0 R -/A 381 0 R +/A 384 0 R >> endobj 55 0 obj << -/Title ($1N1848) -/Parent 50 0 R +/Title ($1N1578) +/Parent 52 0 R /Prev 54 0 R /Next 56 0 R -/A 383 0 R +/A 386 0 R >> endobj 56 0 obj << -/Title ($1N1854) -/Parent 50 0 R +/Title ($1N1846) +/Parent 52 0 R /Prev 55 0 R -/A 385 0 R +/Next 57 0 R +/A 388 0 R +>> +endobj + +57 0 obj +<< +/Title ($1N1848) +/Parent 52 0 R +/Prev 56 0 R +/Next 58 0 R +/A 390 0 R >> endobj 58 0 obj << -/Title ($1N12) -/Parent 57 0 R -/Next 59 0 R -/A 387 0 R ->> -endobj - -59 0 obj -<< -/Title ($1N47) -/Parent 57 0 R -/Prev 58 0 R -/Next 60 0 R -/A 389 0 R +/Title ($1N1854) +/Parent 52 0 R +/Prev 57 0 R +/A 392 0 R >> endobj 60 0 obj << -/Title ($1N1540) -/Parent 57 0 R -/Prev 59 0 R +/Title ($1N12) +/Parent 59 0 R /Next 61 0 R -/A 391 0 R +/A 394 0 R >> endobj 61 0 obj << -/Title ($1N1568) -/Parent 57 0 R +/Title ($1N47) +/Parent 59 0 R /Prev 60 0 R /Next 62 0 R -/A 393 0 R +/A 396 0 R >> endobj 62 0 obj << -/Title ($1N1600) -/Parent 57 0 R +/Title ($1N1540) +/Parent 59 0 R /Prev 61 0 R /Next 63 0 R -/A 395 0 R +/A 398 0 R >> endobj 63 0 obj << -/Title ($1N1636) -/Parent 57 0 R +/Title ($1N1568) +/Parent 59 0 R /Prev 62 0 R /Next 64 0 R -/A 397 0 R +/A 400 0 R >> endobj 64 0 obj << -/Title ($1N1660) -/Parent 57 0 R +/Title ($1N1600) +/Parent 59 0 R /Prev 63 0 R /Next 65 0 R -/A 399 0 R +/A 402 0 R >> endobj 65 0 obj << -/Title ($1N1696) -/Parent 57 0 R +/Title ($1N1636) +/Parent 59 0 R /Prev 64 0 R /Next 66 0 R -/A 401 0 R +/A 404 0 R >> endobj 66 0 obj << -/Title ($1N1710) -/Parent 57 0 R +/Title ($1N1660) +/Parent 59 0 R /Prev 65 0 R /Next 67 0 R -/A 403 0 R +/A 406 0 R >> endobj 67 0 obj << -/Title ($1N1736) -/Parent 57 0 R +/Title ($1N1696) +/Parent 59 0 R /Prev 66 0 R /Next 68 0 R -/A 405 0 R +/A 408 0 R >> endobj 68 0 obj << -/Title ($1N1760) -/Parent 57 0 R +/Title ($1N1710) +/Parent 59 0 R /Prev 67 0 R /Next 69 0 R -/A 407 0 R +/A 410 0 R >> endobj 69 0 obj << -/Title ($1N1778) -/Parent 57 0 R +/Title ($1N1736) +/Parent 59 0 R /Prev 68 0 R /Next 70 0 R -/A 409 0 R +/A 412 0 R >> endobj 70 0 obj << -/Title ($1N1814) -/Parent 57 0 R +/Title ($1N1760) +/Parent 59 0 R /Prev 69 0 R /Next 71 0 R -/A 411 0 R +/A 414 0 R >> endobj 71 0 obj << -/Title ($1N1836) -/Parent 57 0 R +/Title ($1N1778) +/Parent 59 0 R /Prev 70 0 R /Next 72 0 R -/A 413 0 R +/A 416 0 R >> endobj 72 0 obj << -/Title ($1N1870) -/Parent 57 0 R +/Title ($1N1814) +/Parent 59 0 R /Prev 71 0 R -/A 415 0 R +/Next 73 0 R +/A 418 0 R +>> +endobj + +73 0 obj +<< +/Title ($1N1836) +/Parent 59 0 R +/Prev 72 0 R +/Next 74 0 R +/A 420 0 R >> endobj 74 0 obj << -/Title ($1N10) -/Parent 73 0 R -/Next 75 0 R -/A 417 0 R ->> -endobj - -75 0 obj -<< -/Title ($1N49) -/Parent 73 0 R -/Prev 74 0 R -/Next 76 0 R -/A 419 0 R +/Title ($1N1870) +/Parent 59 0 R +/Prev 73 0 R +/A 422 0 R >> endobj 76 0 obj << -/Title ($1N1542) -/Parent 73 0 R -/Prev 75 0 R +/Title ($1N10) +/Parent 75 0 R /Next 77 0 R -/A 421 0 R +/A 424 0 R >> endobj 77 0 obj << -/Title ($1N1566) -/Parent 73 0 R +/Title ($1N49) +/Parent 75 0 R /Prev 76 0 R /Next 78 0 R -/A 423 0 R +/A 426 0 R >> endobj 78 0 obj << -/Title ($1N1602) -/Parent 73 0 R +/Title ($1N1542) +/Parent 75 0 R /Prev 77 0 R /Next 79 0 R -/A 425 0 R +/A 428 0 R >> endobj 79 0 obj << -/Title ($1N1626) -/Parent 73 0 R +/Title ($1N1566) +/Parent 75 0 R /Prev 78 0 R /Next 80 0 R -/A 427 0 R +/A 430 0 R >> endobj 80 0 obj << -/Title ($1N1670) -/Parent 73 0 R +/Title ($1N1602) +/Parent 75 0 R /Prev 79 0 R /Next 81 0 R -/A 429 0 R +/A 432 0 R >> endobj 81 0 obj << -/Title ($1N1686) -/Parent 73 0 R +/Title ($1N1626) +/Parent 75 0 R /Prev 80 0 R /Next 82 0 R -/A 431 0 R +/A 434 0 R >> endobj 82 0 obj << -/Title ($1N1718) -/Parent 73 0 R +/Title ($1N1670) +/Parent 75 0 R /Prev 81 0 R /Next 83 0 R -/A 433 0 R +/A 436 0 R >> endobj 83 0 obj << -/Title ($1N1728) -/Parent 73 0 R +/Title ($1N1686) +/Parent 75 0 R /Prev 82 0 R /Next 84 0 R -/A 435 0 R +/A 438 0 R >> endobj 84 0 obj << -/Title ($1N1752) -/Parent 73 0 R +/Title ($1N1718) +/Parent 75 0 R /Prev 83 0 R /Next 85 0 R -/A 437 0 R +/A 440 0 R >> endobj 85 0 obj << -/Title ($1N1788) -/Parent 73 0 R +/Title ($1N1728) +/Parent 75 0 R /Prev 84 0 R /Next 86 0 R -/A 439 0 R +/A 442 0 R >> endobj 86 0 obj << -/Title ($1N1808) -/Parent 73 0 R +/Title ($1N1752) +/Parent 75 0 R /Prev 85 0 R /Next 87 0 R -/A 441 0 R +/A 444 0 R >> endobj 87 0 obj << -/Title ($1N1828) -/Parent 73 0 R +/Title ($1N1788) +/Parent 75 0 R /Prev 86 0 R /Next 88 0 R -/A 443 0 R +/A 446 0 R >> endobj 88 0 obj << -/Title ($1N1876) -/Parent 73 0 R +/Title ($1N1808) +/Parent 75 0 R /Prev 87 0 R -/A 445 0 R +/Next 89 0 R +/A 448 0 R +>> +endobj + +89 0 obj +<< +/Title ($1N1828) +/Parent 75 0 R +/Prev 88 0 R +/Next 90 0 R +/A 450 0 R >> endobj 90 0 obj << -/Title ($1N1624) -/Parent 89 0 R -/Next 91 0 R -/A 447 0 R ->> -endobj - -91 0 obj -<< -/Title ($1N1672) -/Parent 89 0 R -/Prev 90 0 R -/Next 92 0 R -/A 449 0 R +/Title ($1N1876) +/Parent 75 0 R +/Prev 89 0 R +/A 452 0 R >> endobj 92 0 obj << -/Title ($1N1684) -/Parent 89 0 R -/Prev 91 0 R +/Title ($1N1624) +/Parent 91 0 R /Next 93 0 R -/A 451 0 R +/A 454 0 R >> endobj 93 0 obj << -/Title ($1N1698) -/Parent 89 0 R +/Title ($1N1672) +/Parent 91 0 R /Prev 92 0 R /Next 94 0 R -/A 453 0 R +/A 456 0 R >> endobj 94 0 obj << -/Title ($1N1700) -/Parent 89 0 R +/Title ($1N1684) +/Parent 91 0 R /Prev 93 0 R /Next 95 0 R -/A 455 0 R +/A 458 0 R >> endobj 95 0 obj << -/Title ($1N1702) -/Parent 89 0 R +/Title ($1N1698) +/Parent 91 0 R /Prev 94 0 R /Next 96 0 R -/A 457 0 R +/A 460 0 R >> endobj 96 0 obj << -/Title ($1N1744) -/Parent 89 0 R +/Title ($1N1700) +/Parent 91 0 R /Prev 95 0 R /Next 97 0 R -/A 459 0 R +/A 462 0 R >> endobj 97 0 obj << -/Title ($1N1750) -/Parent 89 0 R +/Title ($1N1702) +/Parent 91 0 R /Prev 96 0 R /Next 98 0 R -/A 461 0 R +/A 464 0 R >> endobj 98 0 obj << -/Title ($1N1820) -/Parent 89 0 R +/Title ($1N1744) +/Parent 91 0 R /Prev 97 0 R /Next 99 0 R -/A 463 0 R +/A 466 0 R >> endobj 99 0 obj << -/Title ($1N1822) -/Parent 89 0 R +/Title ($1N1750) +/Parent 91 0 R /Prev 98 0 R /Next 100 0 R -/A 465 0 R +/A 468 0 R >> endobj 100 0 obj << -/Title ($1N1862) -/Parent 89 0 R +/Title ($1N1820) +/Parent 91 0 R /Prev 99 0 R /Next 101 0 R -/A 467 0 R +/A 470 0 R >> endobj 101 0 obj << -/Title ($1N1864) -/Parent 89 0 R +/Title ($1N1822) +/Parent 91 0 R /Prev 100 0 R -/A 469 0 R +/Next 102 0 R +/A 472 0 R +>> +endobj + +102 0 obj +<< +/Title ($1N1862) +/Parent 91 0 R +/Prev 101 0 R +/Next 103 0 R +/A 474 0 R >> endobj 103 0 obj << -/Title ($1N1678) -/Parent 102 0 R -/A 471 0 R +/Title ($1N1864) +/Parent 91 0 R +/Prev 102 0 R +/A 476 0 R >> endobj 105 0 obj << -/Title ($1N1500) +/Title ($1N1678) /Parent 104 0 R -/Next 106 0 R -/A 473 0 R ->> -endobj - -106 0 obj -<< -/Title ($1N1514) -/Parent 104 0 R -/Prev 105 0 R -/Next 107 0 R -/A 475 0 R +/A 478 0 R >> endobj 107 0 obj << -/Title ($1N5294) -/Parent 104 0 R -/Prev 106 0 R +/Title ($1N1500) +/Parent 106 0 R /Next 108 0 R -/A 477 0 R +/A 480 0 R >> endobj 108 0 obj << -/Title ($1N5448) -/Parent 104 0 R +/Title ($1N1514) +/Parent 106 0 R /Prev 107 0 R -/A 479 0 R +/Next 109 0 R +/A 482 0 R +>> +endobj + +109 0 obj +<< +/Title ($1N5294) +/Parent 106 0 R +/Prev 108 0 R +/Next 110 0 R +/A 484 0 R >> endobj 110 0 obj << -/Title ($1N1506) -/Parent 109 0 R -/Next 111 0 R -/A 481 0 R ->> -endobj - -111 0 obj -<< -/Title ($1N5342) -/Parent 109 0 R -/Prev 110 0 R -/Next 112 0 R -/A 483 0 R +/Title ($1N5448) +/Parent 106 0 R +/Prev 109 0 R +/A 486 0 R >> endobj 112 0 obj << -/Title ($1N5457) -/Parent 109 0 R -/Prev 111 0 R -/A 485 0 R +/Title ($1N1506) +/Parent 111 0 R +/Next 113 0 R +/A 488 0 R +>> +endobj + +113 0 obj +<< +/Title ($1N5342) +/Parent 111 0 R +/Prev 112 0 R +/Next 114 0 R +/A 490 0 R >> endobj 114 0 obj << -/Title ($1N1504) -/Parent 113 0 R -/Next 115 0 R -/A 487 0 R ->> -endobj - -115 0 obj -<< -/Title ($1N5326) -/Parent 113 0 R -/Prev 114 0 R -/Next 116 0 R -/A 489 0 R +/Title ($1N5457) +/Parent 111 0 R +/Prev 113 0 R +/A 492 0 R >> endobj 116 0 obj << -/Title ($1N5454) -/Parent 113 0 R -/Prev 115 0 R -/A 491 0 R +/Title ($1N1504) +/Parent 115 0 R +/Next 117 0 R +/A 494 0 R +>> +endobj + +117 0 obj +<< +/Title ($1N5326) +/Parent 115 0 R +/Prev 116 0 R +/Next 118 0 R +/A 496 0 R >> endobj 118 0 obj << -/Title ($1N1502) -/Parent 117 0 R -/Next 119 0 R -/A 493 0 R ->> -endobj - -119 0 obj -<< -/Title ($1N5310) -/Parent 117 0 R -/Prev 118 0 R -/Next 120 0 R -/A 495 0 R +/Title ($1N5454) +/Parent 115 0 R +/Prev 117 0 R +/A 498 0 R >> endobj 120 0 obj << -/Title ($1N5451) -/Parent 117 0 R -/Prev 119 0 R -/A 497 0 R +/Title ($1N1502) +/Parent 119 0 R +/Next 121 0 R +/A 500 0 R +>> +endobj + +121 0 obj +<< +/Title ($1N5310) +/Parent 119 0 R +/Prev 120 0 R +/Next 122 0 R +/A 502 0 R >> endobj 122 0 obj << -/Title ($1N2) -/Parent 121 0 R -/Next 123 0 R -/A 499 0 R ->> -endobj - -123 0 obj -<< -/Title ($1N6) -/Parent 121 0 R -/Prev 122 0 R -/Next 124 0 R -/A 501 0 R +/Title ($1N5451) +/Parent 119 0 R +/Prev 121 0 R +/A 504 0 R >> endobj 124 0 obj << -/Title ($1N22) -/Parent 121 0 R -/Prev 123 0 R +/Title ($1N2) +/Parent 123 0 R /Next 125 0 R -/A 503 0 R +/A 506 0 R >> endobj 125 0 obj << -/Title ($1N24) -/Parent 121 0 R +/Title ($1N6) +/Parent 123 0 R /Prev 124 0 R /Next 126 0 R -/A 505 0 R +/A 508 0 R >> endobj 126 0 obj << -/Title ($1N26) -/Parent 121 0 R +/Title ($1N22) +/Parent 123 0 R /Prev 125 0 R /Next 127 0 R -/A 507 0 R +/A 510 0 R >> endobj 127 0 obj << -/Title ($1N27) -/Parent 121 0 R +/Title ($1N24) +/Parent 123 0 R /Prev 126 0 R /Next 128 0 R -/A 509 0 R +/A 512 0 R >> endobj 128 0 obj << -/Title ($1N28) -/Parent 121 0 R +/Title ($1N26) +/Parent 123 0 R /Prev 127 0 R /Next 129 0 R -/A 511 0 R +/A 514 0 R >> endobj 129 0 obj << -/Title ($1N30) -/Parent 121 0 R +/Title ($1N27) +/Parent 123 0 R /Prev 128 0 R /Next 130 0 R -/A 513 0 R +/A 516 0 R >> endobj 130 0 obj << -/Title ($1N32) -/Parent 121 0 R +/Title ($1N28) +/Parent 123 0 R /Prev 129 0 R /Next 131 0 R -/A 515 0 R +/A 518 0 R >> endobj 131 0 obj << -/Title ($1N36) -/Parent 121 0 R +/Title ($1N30) +/Parent 123 0 R /Prev 130 0 R /Next 132 0 R -/A 517 0 R +/A 520 0 R >> endobj 132 0 obj << -/Title ($1N37) -/Parent 121 0 R +/Title ($1N32) +/Parent 123 0 R /Prev 131 0 R /Next 133 0 R -/A 519 0 R +/A 522 0 R >> endobj 133 0 obj << -/Title ($1N53) -/Parent 121 0 R +/Title ($1N36) +/Parent 123 0 R /Prev 132 0 R /Next 134 0 R -/A 521 0 R +/A 524 0 R >> endobj 134 0 obj << -/Title ($1N58) -/Parent 121 0 R +/Title ($1N37) +/Parent 123 0 R /Prev 133 0 R /Next 135 0 R -/A 523 0 R +/A 526 0 R >> endobj 135 0 obj << -/Title ($1N61) -/Parent 121 0 R +/Title ($1N53) +/Parent 123 0 R /Prev 134 0 R /Next 136 0 R -/A 525 0 R +/A 528 0 R >> endobj 136 0 obj << -/Title ($1N63) -/Parent 121 0 R +/Title ($1N58) +/Parent 123 0 R /Prev 135 0 R /Next 137 0 R -/A 527 0 R +/A 530 0 R >> endobj 137 0 obj << -/Title ($1N1516) -/Parent 121 0 R +/Title ($1N61) +/Parent 123 0 R /Prev 136 0 R /Next 138 0 R -/A 529 0 R +/A 532 0 R >> endobj 138 0 obj << -/Title ($1N1518) -/Parent 121 0 R +/Title ($1N63) +/Parent 123 0 R /Prev 137 0 R /Next 139 0 R -/A 531 0 R +/A 534 0 R >> endobj 139 0 obj << -/Title ($1N1524) -/Parent 121 0 R +/Title ($1N1516) +/Parent 123 0 R /Prev 138 0 R /Next 140 0 R -/A 533 0 R +/A 536 0 R >> endobj 140 0 obj << -/Title ($1N1526) -/Parent 121 0 R +/Title ($1N1518) +/Parent 123 0 R /Prev 139 0 R /Next 141 0 R -/A 535 0 R +/A 538 0 R >> endobj 141 0 obj << -/Title ($1N1530) -/Parent 121 0 R +/Title ($1N1524) +/Parent 123 0 R /Prev 140 0 R /Next 142 0 R -/A 537 0 R +/A 540 0 R >> endobj 142 0 obj << -/Title ($1N1532) -/Parent 121 0 R +/Title ($1N1526) +/Parent 123 0 R /Prev 141 0 R /Next 143 0 R -/A 539 0 R +/A 542 0 R >> endobj 143 0 obj << -/Title ($1N1534) -/Parent 121 0 R +/Title ($1N1530) +/Parent 123 0 R /Prev 142 0 R /Next 144 0 R -/A 541 0 R +/A 544 0 R >> endobj 144 0 obj << -/Title ($1N1552) -/Parent 121 0 R +/Title ($1N1532) +/Parent 123 0 R /Prev 143 0 R /Next 145 0 R -/A 543 0 R +/A 546 0 R >> endobj 145 0 obj << -/Title ($1N1554) -/Parent 121 0 R +/Title ($1N1534) +/Parent 123 0 R /Prev 144 0 R /Next 146 0 R -/A 545 0 R +/A 548 0 R >> endobj 146 0 obj << -/Title ($1N1572) -/Parent 121 0 R +/Title ($1N1552) +/Parent 123 0 R /Prev 145 0 R /Next 147 0 R -/A 547 0 R +/A 550 0 R >> endobj 147 0 obj << -/Title ($1N1576) -/Parent 121 0 R +/Title ($1N1554) +/Parent 123 0 R /Prev 146 0 R /Next 148 0 R -/A 549 0 R +/A 552 0 R >> endobj 148 0 obj << -/Title ($1N1580) -/Parent 121 0 R +/Title ($1N1572) +/Parent 123 0 R /Prev 147 0 R /Next 149 0 R -/A 551 0 R +/A 554 0 R >> endobj 149 0 obj << -/Title ($1N1584) -/Parent 121 0 R +/Title ($1N1576) +/Parent 123 0 R /Prev 148 0 R /Next 150 0 R -/A 553 0 R +/A 556 0 R >> endobj 150 0 obj << -/Title ($1N1586) -/Parent 121 0 R +/Title ($1N1580) +/Parent 123 0 R /Prev 149 0 R /Next 151 0 R -/A 555 0 R +/A 558 0 R >> endobj 151 0 obj << -/Title ($1N1588) -/Parent 121 0 R +/Title ($1N1584) +/Parent 123 0 R /Prev 150 0 R /Next 152 0 R -/A 557 0 R +/A 560 0 R >> endobj 152 0 obj << -/Title ($1N1590) -/Parent 121 0 R +/Title ($1N1586) +/Parent 123 0 R /Prev 151 0 R /Next 153 0 R -/A 559 0 R +/A 562 0 R >> endobj 153 0 obj << -/Title ($1N1592) -/Parent 121 0 R +/Title ($1N1588) +/Parent 123 0 R /Prev 152 0 R /Next 154 0 R -/A 561 0 R +/A 564 0 R >> endobj 154 0 obj << -/Title ($1N1594) -/Parent 121 0 R +/Title ($1N1590) +/Parent 123 0 R /Prev 153 0 R /Next 155 0 R -/A 563 0 R +/A 566 0 R >> endobj 155 0 obj << -/Title ($1N1596) -/Parent 121 0 R +/Title ($1N1592) +/Parent 123 0 R /Prev 154 0 R /Next 156 0 R -/A 565 0 R +/A 568 0 R >> endobj 156 0 obj << -/Title ($1N1598) -/Parent 121 0 R +/Title ($1N1594) +/Parent 123 0 R /Prev 155 0 R /Next 157 0 R -/A 567 0 R +/A 570 0 R >> endobj 157 0 obj << -/Title ($1N1614) -/Parent 121 0 R +/Title ($1N1596) +/Parent 123 0 R /Prev 156 0 R /Next 158 0 R -/A 569 0 R +/A 572 0 R >> endobj 158 0 obj << -/Title ($1N1638) -/Parent 121 0 R +/Title ($1N1598) +/Parent 123 0 R /Prev 157 0 R /Next 159 0 R -/A 571 0 R +/A 574 0 R >> endobj 159 0 obj << -/Title ($1N1640) -/Parent 121 0 R +/Title ($1N1614) +/Parent 123 0 R /Prev 158 0 R /Next 160 0 R -/A 573 0 R +/A 576 0 R >> endobj 160 0 obj << -/Title ($1N1642) -/Parent 121 0 R +/Title ($1N1638) +/Parent 123 0 R /Prev 159 0 R /Next 161 0 R -/A 575 0 R +/A 578 0 R >> endobj 161 0 obj << -/Title ($1N1644) -/Parent 121 0 R +/Title ($1N1640) +/Parent 123 0 R /Prev 160 0 R /Next 162 0 R -/A 577 0 R +/A 580 0 R >> endobj 162 0 obj << -/Title ($1N1646) -/Parent 121 0 R +/Title ($1N1642) +/Parent 123 0 R /Prev 161 0 R /Next 163 0 R -/A 579 0 R +/A 582 0 R >> endobj 163 0 obj << -/Title ($1N1648) -/Parent 121 0 R +/Title ($1N1644) +/Parent 123 0 R /Prev 162 0 R /Next 164 0 R -/A 581 0 R +/A 584 0 R >> endobj 164 0 obj << -/Title ($1N1650) -/Parent 121 0 R +/Title ($1N1646) +/Parent 123 0 R /Prev 163 0 R /Next 165 0 R -/A 583 0 R +/A 586 0 R >> endobj 165 0 obj << -/Title ($1N1652) -/Parent 121 0 R +/Title ($1N1648) +/Parent 123 0 R /Prev 164 0 R /Next 166 0 R -/A 585 0 R +/A 588 0 R >> endobj 166 0 obj << -/Title ($1N1656) -/Parent 121 0 R +/Title ($1N1650) +/Parent 123 0 R /Prev 165 0 R /Next 167 0 R -/A 587 0 R +/A 590 0 R >> endobj 167 0 obj << -/Title ($1N1658) -/Parent 121 0 R +/Title ($1N1652) +/Parent 123 0 R /Prev 166 0 R /Next 168 0 R -/A 589 0 R +/A 592 0 R >> endobj 168 0 obj << -/Title ($1N1708) -/Parent 121 0 R +/Title ($1N1656) +/Parent 123 0 R /Prev 167 0 R /Next 169 0 R -/A 591 0 R +/A 594 0 R >> endobj 169 0 obj << -/Title ($1N1730) -/Parent 121 0 R +/Title ($1N1658) +/Parent 123 0 R /Prev 168 0 R /Next 170 0 R -/A 593 0 R +/A 596 0 R >> endobj 170 0 obj << -/Title ($1N1734) -/Parent 121 0 R +/Title ($1N1708) +/Parent 123 0 R /Prev 169 0 R /Next 171 0 R -/A 595 0 R +/A 598 0 R >> endobj 171 0 obj << -/Title ($1N1740) -/Parent 121 0 R +/Title ($1N1730) +/Parent 123 0 R /Prev 170 0 R /Next 172 0 R -/A 597 0 R +/A 600 0 R >> endobj 172 0 obj << -/Title ($1N1762) -/Parent 121 0 R +/Title ($1N1734) +/Parent 123 0 R /Prev 171 0 R /Next 173 0 R -/A 599 0 R +/A 602 0 R >> endobj 173 0 obj << -/Title ($1N1764) -/Parent 121 0 R +/Title ($1N1740) +/Parent 123 0 R /Prev 172 0 R /Next 174 0 R -/A 601 0 R +/A 604 0 R >> endobj 174 0 obj << -/Title ($1N1766) -/Parent 121 0 R +/Title ($1N1762) +/Parent 123 0 R /Prev 173 0 R /Next 175 0 R -/A 603 0 R +/A 606 0 R >> endobj 175 0 obj << -/Title ($1N1768) -/Parent 121 0 R +/Title ($1N1764) +/Parent 123 0 R /Prev 174 0 R /Next 176 0 R -/A 605 0 R +/A 608 0 R >> endobj 176 0 obj << -/Title ($1N1770) -/Parent 121 0 R +/Title ($1N1766) +/Parent 123 0 R /Prev 175 0 R /Next 177 0 R -/A 607 0 R +/A 610 0 R >> endobj 177 0 obj << -/Title ($1N1774) -/Parent 121 0 R +/Title ($1N1768) +/Parent 123 0 R /Prev 176 0 R /Next 178 0 R -/A 609 0 R +/A 612 0 R >> endobj 178 0 obj << -/Title ($1N1790) -/Parent 121 0 R +/Title ($1N1770) +/Parent 123 0 R /Prev 177 0 R /Next 179 0 R -/A 611 0 R +/A 614 0 R >> endobj 179 0 obj << -/Title ($1N1792) -/Parent 121 0 R +/Title ($1N1774) +/Parent 123 0 R /Prev 178 0 R /Next 180 0 R -/A 613 0 R +/A 616 0 R >> endobj 180 0 obj << -/Title ($1N1796) -/Parent 121 0 R +/Title ($1N1790) +/Parent 123 0 R /Prev 179 0 R /Next 181 0 R -/A 615 0 R +/A 618 0 R >> endobj 181 0 obj << -/Title ($1N1798) -/Parent 121 0 R +/Title ($1N1792) +/Parent 123 0 R /Prev 180 0 R /Next 182 0 R -/A 617 0 R +/A 620 0 R >> endobj 182 0 obj << -/Title ($1N1800) -/Parent 121 0 R +/Title ($1N1796) +/Parent 123 0 R /Prev 181 0 R /Next 183 0 R -/A 619 0 R +/A 622 0 R >> endobj 183 0 obj << -/Title ($1N1824) -/Parent 121 0 R +/Title ($1N1798) +/Parent 123 0 R /Prev 182 0 R /Next 184 0 R -/A 621 0 R +/A 624 0 R >> endobj 184 0 obj << -/Title ($1N1826) -/Parent 121 0 R +/Title ($1N1800) +/Parent 123 0 R /Prev 183 0 R /Next 185 0 R -/A 623 0 R +/A 626 0 R >> endobj 185 0 obj << -/Title ($1N1838) -/Parent 121 0 R +/Title ($1N1824) +/Parent 123 0 R /Prev 184 0 R /Next 186 0 R -/A 625 0 R +/A 628 0 R >> endobj 186 0 obj << -/Title ($1N1840) -/Parent 121 0 R +/Title ($1N1826) +/Parent 123 0 R /Prev 185 0 R /Next 187 0 R -/A 627 0 R +/A 630 0 R >> endobj 187 0 obj << -/Title ($1N1842) -/Parent 121 0 R +/Title ($1N1838) +/Parent 123 0 R /Prev 186 0 R /Next 188 0 R -/A 629 0 R +/A 632 0 R >> endobj 188 0 obj << -/Title ($1N1844) -/Parent 121 0 R +/Title ($1N1840) +/Parent 123 0 R /Prev 187 0 R /Next 189 0 R -/A 631 0 R +/A 634 0 R >> endobj 189 0 obj << -/Title ($1N1850) -/Parent 121 0 R +/Title ($1N1842) +/Parent 123 0 R /Prev 188 0 R /Next 190 0 R -/A 633 0 R +/A 636 0 R >> endobj 190 0 obj << -/Title ($1N1858) -/Parent 121 0 R +/Title ($1N1844) +/Parent 123 0 R /Prev 189 0 R /Next 191 0 R -/A 635 0 R +/A 638 0 R >> endobj 191 0 obj << -/Title ($1N1866) -/Parent 121 0 R +/Title ($1N1850) +/Parent 123 0 R /Prev 190 0 R /Next 192 0 R -/A 637 0 R +/A 640 0 R >> endobj 192 0 obj << -/Title ($1N1884) -/Parent 121 0 R +/Title ($1N1858) +/Parent 123 0 R /Prev 191 0 R /Next 193 0 R -/A 639 0 R +/A 642 0 R >> endobj 193 0 obj << -/Title ($1N1886) -/Parent 121 0 R +/Title ($1N1866) +/Parent 123 0 R /Prev 192 0 R /Next 194 0 R -/A 641 0 R +/A 644 0 R >> endobj 194 0 obj << -/Title ($1N5390) -/Parent 121 0 R +/Title ($1N1884) +/Parent 123 0 R /Prev 193 0 R /Next 195 0 R -/A 643 0 R +/A 646 0 R >> endobj 195 0 obj << -/Title ($1N5442) -/Parent 121 0 R +/Title ($1N1886) +/Parent 123 0 R /Prev 194 0 R -/A 645 0 R +/Next 196 0 R +/A 648 0 R +>> +endobj + +196 0 obj +<< +/Title ($1N5390) +/Parent 123 0 R +/Prev 195 0 R +/Next 197 0 R +/A 650 0 R >> endobj 197 0 obj << -/Title ($1N19) -/Parent 196 0 R +/Title ($1N5442) +/Parent 123 0 R +/Prev 196 0 R /Next 198 0 R -/A 647 0 R +/A 652 0 R >> endobj 198 0 obj << -/Title ($1N40) -/Parent 196 0 R +/Title ($1N10681) +/Parent 123 0 R /Prev 197 0 R -/A 649 0 R +/A 654 0 R >> endobj 200 0 obj << -/Title ($1N21) +/Title ($1N19) /Parent 199 0 R /Next 201 0 R -/A 651 0 R +/A 656 0 R >> endobj 201 0 obj << -/Title ($1N38) +/Title ($1N40) /Parent 199 0 R /Prev 200 0 R -/A 653 0 R +/A 658 0 R >> endobj @@ -31457,1890 +32212,1941 @@ endobj /Title ($1N20) /Parent 202 0 R /Next 204 0 R -/A 655 0 R +/A 660 0 R >> endobj 204 0 obj << -/Title ($1N39) +/Title ($1N8820) /Parent 202 0 R /Prev 203 0 R -/A 657 0 R +/Next 205 0 R +/A 662 0 R >> endobj -206 0 obj +205 0 obj << -/Title ($1N11) -/Parent 205 0 R -/Next 207 0 R -/A 659 0 R +/Title ($1N10687) +/Parent 202 0 R +/Prev 204 0 R +/A 664 0 R >> endobj 207 0 obj << -/Title ($1N33) -/Parent 205 0 R -/Prev 206 0 R +/Title ($1N21) +/Parent 206 0 R /Next 208 0 R -/A 661 0 R +/A 666 0 R >> endobj 208 0 obj << -/Title ($1N48) -/Parent 205 0 R +/Title ($1N8817) +/Parent 206 0 R /Prev 207 0 R /Next 209 0 R -/A 663 0 R +/A 668 0 R >> endobj 209 0 obj << -/Title ($1N1538) -/Parent 205 0 R +/Title ($1N10684) +/Parent 206 0 R /Prev 208 0 R -/Next 210 0 R -/A 665 0 R ->> -endobj - -210 0 obj -<< -/Title ($1N1556) -/Parent 205 0 R -/Prev 209 0 R -/Next 211 0 R -/A 667 0 R +/A 670 0 R >> endobj 211 0 obj << -/Title ($1N1610) -/Parent 205 0 R -/Prev 210 0 R +/Title ($1N11) +/Parent 210 0 R /Next 212 0 R -/A 669 0 R +/A 672 0 R >> endobj 212 0 obj << -/Title ($1N1622) -/Parent 205 0 R +/Title ($1N33) +/Parent 210 0 R /Prev 211 0 R /Next 213 0 R -/A 671 0 R +/A 674 0 R >> endobj 213 0 obj << -/Title ($1N1674) -/Parent 205 0 R +/Title ($1N48) +/Parent 210 0 R /Prev 212 0 R /Next 214 0 R -/A 673 0 R +/A 676 0 R >> endobj 214 0 obj << -/Title ($1N1682) -/Parent 205 0 R +/Title ($1N1538) +/Parent 210 0 R /Prev 213 0 R /Next 215 0 R -/A 675 0 R +/A 678 0 R >> endobj 215 0 obj << -/Title ($1N1706) -/Parent 205 0 R +/Title ($1N1556) +/Parent 210 0 R /Prev 214 0 R /Next 216 0 R -/A 677 0 R +/A 680 0 R >> endobj 216 0 obj << -/Title ($1N1738) -/Parent 205 0 R +/Title ($1N1610) +/Parent 210 0 R /Prev 215 0 R /Next 217 0 R -/A 679 0 R +/A 682 0 R >> endobj 217 0 obj << -/Title ($1N1748) -/Parent 205 0 R +/Title ($1N1622) +/Parent 210 0 R /Prev 216 0 R /Next 218 0 R -/A 681 0 R +/A 684 0 R >> endobj 218 0 obj << -/Title ($1N1772) -/Parent 205 0 R +/Title ($1N1674) +/Parent 210 0 R /Prev 217 0 R /Next 219 0 R -/A 683 0 R +/A 686 0 R >> endobj 219 0 obj << -/Title ($1N1816) -/Parent 205 0 R +/Title ($1N1682) +/Parent 210 0 R /Prev 218 0 R /Next 220 0 R -/A 685 0 R +/A 688 0 R >> endobj 220 0 obj << -/Title ($1N1868) -/Parent 205 0 R +/Title ($1N1706) +/Parent 210 0 R /Prev 219 0 R -/A 687 0 R +/Next 221 0 R +/A 690 0 R +>> +endobj + +221 0 obj +<< +/Title ($1N1738) +/Parent 210 0 R +/Prev 220 0 R +/Next 222 0 R +/A 692 0 R >> endobj 222 0 obj << -/Title ($1N1818) -/Parent 221 0 R -/A 689 0 R +/Title ($1N1748) +/Parent 210 0 R +/Prev 221 0 R +/Next 223 0 R +/A 694 0 R +>> +endobj + +223 0 obj +<< +/Title ($1N1772) +/Parent 210 0 R +/Prev 222 0 R +/Next 224 0 R +/A 696 0 R >> endobj 224 0 obj << -/Title ($1N7) -/Parent 223 0 R +/Title ($1N1816) +/Parent 210 0 R +/Prev 223 0 R /Next 225 0 R -/A 691 0 R +/A 698 0 R >> endobj 225 0 obj << -/Title ($1N52) -/Parent 223 0 R +/Title ($1N1868) +/Parent 210 0 R /Prev 224 0 R -/Next 226 0 R -/A 693 0 R ->> -endobj - -226 0 obj -<< -/Title ($1N1548) -/Parent 223 0 R -/Prev 225 0 R -/Next 227 0 R -/A 695 0 R +/A 700 0 R >> endobj 227 0 obj << -/Title ($1N1560) -/Parent 223 0 R -/Prev 226 0 R -/Next 228 0 R -/A 697 0 R ->> -endobj - -228 0 obj -<< -/Title ($1N1608) -/Parent 223 0 R -/Prev 227 0 R -/Next 229 0 R -/A 699 0 R +/Title ($1N1818) +/Parent 226 0 R +/A 702 0 R >> endobj 229 0 obj << -/Title ($1N1630) -/Parent 223 0 R -/Prev 228 0 R +/Title ($1N7) +/Parent 228 0 R /Next 230 0 R -/A 701 0 R +/A 704 0 R >> endobj 230 0 obj << -/Title ($1N1666) -/Parent 223 0 R +/Title ($1N52) +/Parent 228 0 R /Prev 229 0 R /Next 231 0 R -/A 703 0 R +/A 706 0 R >> endobj 231 0 obj << -/Title ($1N1690) -/Parent 223 0 R +/Title ($1N1548) +/Parent 228 0 R /Prev 230 0 R /Next 232 0 R -/A 705 0 R +/A 708 0 R >> endobj 232 0 obj << -/Title ($1N1714) -/Parent 223 0 R +/Title ($1N1560) +/Parent 228 0 R /Prev 231 0 R /Next 233 0 R -/A 707 0 R +/A 710 0 R >> endobj 233 0 obj << -/Title ($1N1720) -/Parent 223 0 R +/Title ($1N1608) +/Parent 228 0 R /Prev 232 0 R /Next 234 0 R -/A 709 0 R +/A 712 0 R >> endobj 234 0 obj << -/Title ($1N1756) -/Parent 223 0 R +/Title ($1N1630) +/Parent 228 0 R /Prev 233 0 R /Next 235 0 R -/A 711 0 R +/A 714 0 R >> endobj 235 0 obj << -/Title ($1N1782) -/Parent 223 0 R +/Title ($1N1666) +/Parent 228 0 R /Prev 234 0 R /Next 236 0 R -/A 713 0 R +/A 716 0 R >> endobj 236 0 obj << -/Title ($1N1804) -/Parent 223 0 R +/Title ($1N1690) +/Parent 228 0 R /Prev 235 0 R /Next 237 0 R -/A 715 0 R +/A 718 0 R >> endobj 237 0 obj << -/Title ($1N1834) -/Parent 223 0 R +/Title ($1N1714) +/Parent 228 0 R /Prev 236 0 R /Next 238 0 R -/A 717 0 R +/A 720 0 R >> endobj 238 0 obj << -/Title ($1N1880) -/Parent 223 0 R +/Title ($1N1720) +/Parent 228 0 R /Prev 237 0 R -/A 719 0 R +/Next 239 0 R +/A 722 0 R +>> +endobj + +239 0 obj +<< +/Title ($1N1756) +/Parent 228 0 R +/Prev 238 0 R +/Next 240 0 R +/A 724 0 R >> endobj 240 0 obj << -/Title ($1N8) -/Parent 239 0 R +/Title ($1N1782) +/Parent 228 0 R +/Prev 239 0 R /Next 241 0 R -/A 721 0 R +/A 726 0 R >> endobj 241 0 obj << -/Title ($1N51) -/Parent 239 0 R +/Title ($1N1804) +/Parent 228 0 R /Prev 240 0 R /Next 242 0 R -/A 723 0 R +/A 728 0 R >> endobj 242 0 obj << -/Title ($1N1546) -/Parent 239 0 R +/Title ($1N1834) +/Parent 228 0 R /Prev 241 0 R /Next 243 0 R -/A 725 0 R +/A 730 0 R >> endobj 243 0 obj << -/Title ($1N1562) -/Parent 239 0 R +/Title ($1N1880) +/Parent 228 0 R /Prev 242 0 R -/Next 244 0 R -/A 727 0 R ->> -endobj - -244 0 obj -<< -/Title ($1N1606) -/Parent 239 0 R -/Prev 243 0 R -/Next 245 0 R -/A 729 0 R +/A 732 0 R >> endobj 245 0 obj << -/Title ($1N1628) -/Parent 239 0 R -/Prev 244 0 R +/Title ($1N8) +/Parent 244 0 R /Next 246 0 R -/A 731 0 R +/A 734 0 R >> endobj 246 0 obj << -/Title ($1N1668) -/Parent 239 0 R +/Title ($1N51) +/Parent 244 0 R /Prev 245 0 R /Next 247 0 R -/A 733 0 R +/A 736 0 R >> endobj 247 0 obj << -/Title ($1N1688) -/Parent 239 0 R +/Title ($1N1546) +/Parent 244 0 R /Prev 246 0 R /Next 248 0 R -/A 735 0 R +/A 738 0 R >> endobj 248 0 obj << -/Title ($1N1716) -/Parent 239 0 R +/Title ($1N1562) +/Parent 244 0 R /Prev 247 0 R /Next 249 0 R -/A 737 0 R +/A 740 0 R >> endobj 249 0 obj << -/Title ($1N1722) -/Parent 239 0 R +/Title ($1N1606) +/Parent 244 0 R /Prev 248 0 R /Next 250 0 R -/A 739 0 R +/A 742 0 R >> endobj 250 0 obj << -/Title ($1N1754) -/Parent 239 0 R +/Title ($1N1628) +/Parent 244 0 R /Prev 249 0 R /Next 251 0 R -/A 741 0 R +/A 744 0 R >> endobj 251 0 obj << -/Title ($1N1784) -/Parent 239 0 R +/Title ($1N1668) +/Parent 244 0 R /Prev 250 0 R /Next 252 0 R -/A 743 0 R +/A 746 0 R >> endobj 252 0 obj << -/Title ($1N1802) -/Parent 239 0 R +/Title ($1N1688) +/Parent 244 0 R /Prev 251 0 R /Next 253 0 R -/A 745 0 R +/A 748 0 R >> endobj 253 0 obj << -/Title ($1N1832) -/Parent 239 0 R +/Title ($1N1716) +/Parent 244 0 R /Prev 252 0 R /Next 254 0 R -/A 747 0 R +/A 750 0 R >> endobj 254 0 obj << -/Title ($1N1882) -/Parent 239 0 R +/Title ($1N1722) +/Parent 244 0 R /Prev 253 0 R /Next 255 0 R -/A 749 0 R +/A 752 0 R >> endobj 255 0 obj << -/Title ($1N5374) -/Parent 239 0 R +/Title ($1N1754) +/Parent 244 0 R /Prev 254 0 R /Next 256 0 R -/A 751 0 R +/A 754 0 R >> endobj 256 0 obj << -/Title ($1N5481) -/Parent 239 0 R +/Title ($1N1784) +/Parent 244 0 R /Prev 255 0 R -/A 753 0 R +/Next 257 0 R +/A 756 0 R +>> +endobj + +257 0 obj +<< +/Title ($1N1802) +/Parent 244 0 R +/Prev 256 0 R +/Next 258 0 R +/A 758 0 R >> endobj 258 0 obj << -/Title ($1N13) -/Parent 257 0 R +/Title ($1N1832) +/Parent 244 0 R +/Prev 257 0 R /Next 259 0 R -/A 755 0 R +/A 760 0 R >> endobj 259 0 obj << -/Title ($1N34) -/Parent 257 0 R +/Title ($1N1882) +/Parent 244 0 R /Prev 258 0 R /Next 260 0 R -/A 757 0 R +/A 762 0 R >> endobj 260 0 obj << -/Title ($1N46) -/Parent 257 0 R +/Title ($1N5374) +/Parent 244 0 R /Prev 259 0 R /Next 261 0 R -/A 759 0 R +/A 764 0 R >> endobj 261 0 obj << -/Title ($1N1536) -/Parent 257 0 R +/Title ($1N5481) +/Parent 244 0 R /Prev 260 0 R -/Next 262 0 R -/A 761 0 R ->> -endobj - -262 0 obj -<< -/Title ($1N1558) -/Parent 257 0 R -/Prev 261 0 R -/Next 263 0 R -/A 763 0 R +/A 766 0 R >> endobj 263 0 obj << -/Title ($1N1612) -/Parent 257 0 R -/Prev 262 0 R +/Title ($1N13) +/Parent 262 0 R /Next 264 0 R -/A 765 0 R +/A 768 0 R >> endobj 264 0 obj << -/Title ($1N1620) -/Parent 257 0 R +/Title ($1N34) +/Parent 262 0 R /Prev 263 0 R /Next 265 0 R -/A 767 0 R +/A 770 0 R >> endobj 265 0 obj << -/Title ($1N1676) -/Parent 257 0 R +/Title ($1N46) +/Parent 262 0 R /Prev 264 0 R /Next 266 0 R -/A 769 0 R +/A 772 0 R >> endobj 266 0 obj << -/Title ($1N1680) -/Parent 257 0 R +/Title ($1N1536) +/Parent 262 0 R /Prev 265 0 R /Next 267 0 R -/A 771 0 R +/A 774 0 R >> endobj 267 0 obj << -/Title ($1N1704) -/Parent 257 0 R +/Title ($1N1558) +/Parent 262 0 R /Prev 266 0 R /Next 268 0 R -/A 773 0 R +/A 776 0 R >> endobj 268 0 obj << -/Title ($1N1726) -/Parent 257 0 R +/Title ($1N1612) +/Parent 262 0 R /Prev 267 0 R /Next 269 0 R -/A 775 0 R +/A 778 0 R >> endobj 269 0 obj << -/Title ($1N1746) -/Parent 257 0 R +/Title ($1N1620) +/Parent 262 0 R /Prev 268 0 R /Next 270 0 R -/A 777 0 R +/A 780 0 R >> endobj 270 0 obj << -/Title ($1N1780) -/Parent 257 0 R +/Title ($1N1676) +/Parent 262 0 R /Prev 269 0 R /Next 271 0 R -/A 779 0 R +/A 782 0 R >> endobj 271 0 obj << -/Title ($1N1812) -/Parent 257 0 R +/Title ($1N1680) +/Parent 262 0 R /Prev 270 0 R /Next 272 0 R -/A 781 0 R +/A 784 0 R >> endobj 272 0 obj << -/Title ($1N1872) -/Parent 257 0 R +/Title ($1N1704) +/Parent 262 0 R /Prev 271 0 R -/A 783 0 R +/Next 273 0 R +/A 786 0 R +>> +endobj + +273 0 obj +<< +/Title ($1N1726) +/Parent 262 0 R +/Prev 272 0 R +/Next 274 0 R +/A 788 0 R >> endobj 274 0 obj << -/Title ($1N14) -/Parent 273 0 R +/Title ($1N1746) +/Parent 262 0 R +/Prev 273 0 R /Next 275 0 R -/A 785 0 R +/A 790 0 R >> endobj 275 0 obj << -/Title ($1N45) -/Parent 273 0 R +/Title ($1N1780) +/Parent 262 0 R /Prev 274 0 R /Next 276 0 R -/A 787 0 R +/A 792 0 R >> endobj 276 0 obj << -/Title ($1N1520) -/Parent 273 0 R +/Title ($1N1812) +/Parent 262 0 R /Prev 275 0 R -/A 789 0 R +/Next 277 0 R +/A 794 0 R >> endobj -278 0 obj +277 0 obj << -/Title ($1N4) -/Parent 277 0 R -/Next 279 0 R -/A 791 0 R +/Title ($1N1872) +/Parent 262 0 R +/Prev 276 0 R +/A 796 0 R >> endobj 279 0 obj << -/Title ($1N56) -/Parent 277 0 R -/Prev 278 0 R +/Title ($1N14) +/Parent 278 0 R /Next 280 0 R -/A 793 0 R +/A 798 0 R >> endobj 280 0 obj << -/Title ($1N57) -/Parent 277 0 R +/Title ($1N45) +/Parent 278 0 R /Prev 279 0 R /Next 281 0 R -/A 795 0 R +/A 800 0 R >> endobj 281 0 obj << -/Title ($1N1634) -/Parent 277 0 R +/Title ($1N1520) +/Parent 278 0 R /Prev 280 0 R -/Next 282 0 R -/A 797 0 R ->> -endobj - -282 0 obj -<< -/Title ($1N1662) -/Parent 277 0 R -/Prev 281 0 R -/Next 283 0 R -/A 799 0 R +/A 802 0 R >> endobj 283 0 obj << -/Title ($1N1694) -/Parent 277 0 R -/Prev 282 0 R +/Title ($1N4) +/Parent 282 0 R /Next 284 0 R -/A 801 0 R +/A 804 0 R >> endobj 284 0 obj << -/Title ($1N1794) -/Parent 277 0 R +/Title ($1N56) +/Parent 282 0 R /Prev 283 0 R -/A 803 0 R +/Next 285 0 R +/A 806 0 R +>> +endobj + +285 0 obj +<< +/Title ($1N57) +/Parent 282 0 R +/Prev 284 0 R +/Next 286 0 R +/A 808 0 R >> endobj 286 0 obj << -/Title ($1N9) -/Parent 285 0 R +/Title ($1N1634) +/Parent 282 0 R +/Prev 285 0 R /Next 287 0 R -/A 805 0 R +/A 810 0 R >> endobj 287 0 obj << -/Title ($1N50) -/Parent 285 0 R +/Title ($1N1662) +/Parent 282 0 R /Prev 286 0 R /Next 288 0 R -/A 807 0 R +/A 812 0 R >> endobj 288 0 obj << -/Title ($1N1544) -/Parent 285 0 R +/Title ($1N1694) +/Parent 282 0 R /Prev 287 0 R /Next 289 0 R -/A 809 0 R +/A 814 0 R >> endobj 289 0 obj << -/Title ($1N1564) -/Parent 285 0 R +/Title ($1N1794) +/Parent 282 0 R /Prev 288 0 R -/Next 290 0 R -/A 811 0 R ->> -endobj - -290 0 obj -<< -/Title ($1N1604) -/Parent 285 0 R -/Prev 289 0 R -/Next 291 0 R -/A 813 0 R +/A 816 0 R >> endobj 291 0 obj << -/Title ($1N1632) -/Parent 285 0 R -/Prev 290 0 R +/Title ($1N9) +/Parent 290 0 R /Next 292 0 R -/A 815 0 R +/A 818 0 R >> endobj 292 0 obj << -/Title ($1N1664) -/Parent 285 0 R +/Title ($1N50) +/Parent 290 0 R /Prev 291 0 R /Next 293 0 R -/A 817 0 R +/A 820 0 R >> endobj 293 0 obj << -/Title ($1N1692) -/Parent 285 0 R +/Title ($1N1544) +/Parent 290 0 R /Prev 292 0 R /Next 294 0 R -/A 819 0 R +/A 822 0 R >> endobj 294 0 obj << -/Title ($1N1712) -/Parent 285 0 R +/Title ($1N1564) +/Parent 290 0 R /Prev 293 0 R /Next 295 0 R -/A 821 0 R +/A 824 0 R >> endobj 295 0 obj << -/Title ($1N1724) -/Parent 285 0 R +/Title ($1N1604) +/Parent 290 0 R /Prev 294 0 R /Next 296 0 R -/A 823 0 R +/A 826 0 R >> endobj 296 0 obj << -/Title ($1N1758) -/Parent 285 0 R +/Title ($1N1632) +/Parent 290 0 R /Prev 295 0 R /Next 297 0 R -/A 825 0 R +/A 828 0 R >> endobj 297 0 obj << -/Title ($1N1786) -/Parent 285 0 R +/Title ($1N1664) +/Parent 290 0 R /Prev 296 0 R /Next 298 0 R -/A 827 0 R +/A 830 0 R >> endobj 298 0 obj << -/Title ($1N1806) -/Parent 285 0 R +/Title ($1N1692) +/Parent 290 0 R /Prev 297 0 R /Next 299 0 R -/A 829 0 R +/A 832 0 R >> endobj 299 0 obj << -/Title ($1N1830) -/Parent 285 0 R +/Title ($1N1712) +/Parent 290 0 R /Prev 298 0 R /Next 300 0 R -/A 831 0 R +/A 834 0 R >> endobj 300 0 obj << -/Title ($1N1878) -/Parent 285 0 R +/Title ($1N1724) +/Parent 290 0 R /Prev 299 0 R /Next 301 0 R -/A 833 0 R +/A 836 0 R >> endobj 301 0 obj << -/Title ($1N5358) -/Parent 285 0 R +/Title ($1N1758) +/Parent 290 0 R /Prev 300 0 R /Next 302 0 R -/A 835 0 R +/A 838 0 R >> endobj 302 0 obj << -/Title ($1N5478) -/Parent 285 0 R +/Title ($1N1786) +/Parent 290 0 R /Prev 301 0 R -/A 837 0 R +/Next 303 0 R +/A 840 0 R +>> +endobj + +303 0 obj +<< +/Title ($1N1806) +/Parent 290 0 R +/Prev 302 0 R +/Next 304 0 R +/A 842 0 R >> endobj 304 0 obj << -/Title ($1N17) -/Parent 303 0 R +/Title ($1N1830) +/Parent 290 0 R +/Prev 303 0 R /Next 305 0 R -/A 839 0 R +/A 844 0 R >> endobj 305 0 obj << -/Title ($1N42) -/Parent 303 0 R +/Title ($1N1878) +/Parent 290 0 R /Prev 304 0 R -/A 841 0 R +/Next 306 0 R +/A 846 0 R +>> +endobj + +306 0 obj +<< +/Title ($1N5358) +/Parent 290 0 R +/Prev 305 0 R +/Next 307 0 R +/A 848 0 R >> endobj 307 0 obj << -/Title ($1N16) -/Parent 306 0 R -/Next 308 0 R -/A 843 0 R +/Title ($1N5478) +/Parent 290 0 R +/Prev 306 0 R +/A 850 0 R >> endobj -308 0 obj +309 0 obj << -/Title ($1N43) -/Parent 306 0 R -/Prev 307 0 R -/A 845 0 R +/Title ($1N17) +/Parent 308 0 R +/Next 310 0 R +/A 852 0 R >> endobj 310 0 obj << -/Title ($1N1498) -/Parent 309 0 R -/Next 311 0 R -/A 847 0 R +/Title ($1N42) +/Parent 308 0 R +/Prev 309 0 R +/A 854 0 R >> endobj -311 0 obj +312 0 obj << -/Title ($1N1512) -/Parent 309 0 R -/Prev 310 0 R -/A 849 0 R +/Title ($1N16) +/Parent 311 0 R +/Next 313 0 R +/A 856 0 R >> endobj 313 0 obj << -/Title ($1N1496) -/Parent 312 0 R -/Next 314 0 R -/A 851 0 R +/Title ($1N43) +/Parent 311 0 R +/Prev 312 0 R +/A 858 0 R >> endobj -314 0 obj +315 0 obj << -/Title ($1N1510) -/Parent 312 0 R -/Prev 313 0 R -/A 853 0 R +/Title ($1N1498) +/Parent 314 0 R +/Next 316 0 R +/A 860 0 R >> endobj 316 0 obj << -/Title ($1N18) -/Parent 315 0 R -/Next 317 0 R -/A 855 0 R ->> -endobj - -317 0 obj -<< -/Title ($1N41) -/Parent 315 0 R -/Prev 316 0 R -/Next 318 0 R -/A 857 0 R +/Title ($1N1512) +/Parent 314 0 R +/Prev 315 0 R +/A 862 0 R >> endobj 318 0 obj << -/Title ($1N1522) -/Parent 315 0 R -/Prev 317 0 R -/A 859 0 R +/Title ($1N1496) +/Parent 317 0 R +/Next 319 0 R +/A 864 0 R >> endobj -861 0 obj +319 0 obj +<< +/Title ($1N1510) +/Parent 317 0 R +/Prev 318 0 R +/A 866 0 R +>> +endobj + +321 0 obj +<< +/Title ($1N18) +/Parent 320 0 R +/Next 322 0 R +/A 868 0 R +>> +endobj + +322 0 obj +<< +/Title ($1N41) +/Parent 320 0 R +/Prev 321 0 R +/Next 323 0 R +/A 870 0 R +>> +endobj + +323 0 obj +<< +/Title ($1N1522) +/Parent 320 0 R +/Prev 322 0 R +/A 872 0 R +>> +endobj + +874 0 obj << /Producer (jsPDF 0.0.0) -/CreationDate (D:20251108000128-00'00') +/CreationDate (D:20251204143819-00'00') >> endobj -862 0 obj +875 0 obj << /Type /Catalog /Pages 1 0 R /OpenAction [3 0 R /FitH null] /PageLayout /OneColumn -/Outlines 12 0 R +/Outlines 13 0 R >> endobj xref -0 863 +0 876 0000000000 65535 f -0000334529 00000 n -0000396345 00000 n +0000339911 00000 n +0000469171 00000 n 0000000015 00000 n 0000000125 00000 n -0000334586 00000 n -0000334751 00000 n -0000334930 00000 n -0000335046 00000 n -0000335215 00000 n -0000336259 00000 n -0000393129 00000 n -0000527015 00000 n -0000527093 00000 n -0000527300 00000 n -0000527196 00000 n -0000527411 00000 n -0000531215 00000 n -0000531292 00000 n -0000531383 00000 n -0000531474 00000 n -0000531565 00000 n -0000531658 00000 n -0000531751 00000 n -0000531844 00000 n -0000531937 00000 n +0000339968 00000 n +0000340133 00000 n +0000340312 00000 n +0000340428 00000 n +0000340597 00000 n +0000341641 00000 n +0000398511 00000 n +0000401727 00000 n +0000601787 00000 n +0000601865 00000 n +0000602072 00000 n +0000601968 00000 n +0000602183 00000 n +0000605987 00000 n +0000606064 00000 n +0000606155 00000 n +0000606246 00000 n +0000606337 00000 n +0000606430 00000 n +0000606523 00000 n +0000606616 00000 n +0000606709 00000 n +0000606802 00000 n +0000606895 00000 n +0000606988 00000 n +0000607081 00000 n +0000607174 00000 n +0000607267 00000 n +0000607360 00000 n +0000607453 00000 n +0000607546 00000 n +0000607639 00000 n +0000602285 00000 n +0000607720 00000 n +0000607798 00000 n +0000607889 00000 n +0000602399 00000 n +0000607969 00000 n +0000602514 00000 n +0000608033 00000 n +0000602630 00000 n +0000608098 00000 n +0000602746 00000 n +0000608163 00000 n +0000608241 00000 n +0000608332 00000 n +0000608425 00000 n +0000602860 00000 n +0000608505 00000 n +0000608585 00000 n +0000608678 00000 n +0000608771 00000 n +0000608864 00000 n +0000608957 00000 n +0000602975 00000 n +0000609037 00000 n +0000609115 00000 n +0000609206 00000 n +0000609299 00000 n +0000609392 00000 n +0000609485 00000 n +0000609578 00000 n +0000609671 00000 n +0000609764 00000 n +0000609857 00000 n +0000609950 00000 n +0000610043 00000 n +0000610136 00000 n +0000610229 00000 n +0000610322 00000 n +0000603091 00000 n +0000610402 00000 n +0000610480 00000 n +0000610571 00000 n +0000610664 00000 n +0000610757 00000 n +0000610850 00000 n +0000610943 00000 n +0000611036 00000 n +0000611129 00000 n +0000611222 00000 n +0000611315 00000 n +0000611408 00000 n +0000611501 00000 n +0000611594 00000 n +0000611687 00000 n +0000603205 00000 n +0000611767 00000 n +0000611847 00000 n +0000611940 00000 n +0000612033 00000 n +0000612126 00000 n +0000612219 00000 n +0000612312 00000 n +0000612405 00000 n +0000612499 00000 n +0000612594 00000 n +0000612690 00000 n +0000612786 00000 n +0000603323 00000 n +0000612868 00000 n +0000603442 00000 n +0000612937 00000 n +0000613020 00000 n +0000613117 00000 n +0000613214 00000 n +0000603568 00000 n +0000613297 00000 n +0000613380 00000 n +0000613477 00000 n +0000603692 00000 n +0000613560 00000 n +0000613643 00000 n +0000613740 00000 n +0000603817 00000 n +0000613823 00000 n +0000613906 00000 n +0000614003 00000 n +0000603943 00000 n +0000614086 00000 n +0000614166 00000 n +0000614260 00000 n +0000614355 00000 n +0000614450 00000 n +0000614545 00000 n +0000614640 00000 n +0000614735 00000 n +0000614830 00000 n +0000614925 00000 n +0000615020 00000 n +0000615115 00000 n +0000615210 00000 n +0000615305 00000 n +0000615400 00000 n +0000615495 00000 n +0000615592 00000 n +0000615689 00000 n +0000615786 00000 n +0000615883 00000 n +0000615980 00000 n +0000616077 00000 n +0000616174 00000 n +0000616271 00000 n +0000616368 00000 n +0000616465 00000 n +0000616562 00000 n +0000616659 00000 n +0000616756 00000 n +0000616853 00000 n +0000616950 00000 n +0000617047 00000 n +0000617144 00000 n +0000617241 00000 n +0000617338 00000 n +0000617435 00000 n +0000617532 00000 n +0000617629 00000 n +0000617726 00000 n +0000617823 00000 n +0000617920 00000 n +0000618017 00000 n +0000618114 00000 n +0000618211 00000 n +0000618308 00000 n +0000618405 00000 n +0000618502 00000 n +0000618599 00000 n +0000618696 00000 n +0000618793 00000 n +0000618890 00000 n +0000618987 00000 n +0000619084 00000 n +0000619181 00000 n +0000619278 00000 n +0000619375 00000 n +0000619472 00000 n +0000619569 00000 n +0000619666 00000 n +0000619763 00000 n +0000619860 00000 n +0000619957 00000 n +0000620054 00000 n +0000620151 00000 n +0000620248 00000 n +0000620345 00000 n +0000620442 00000 n +0000620539 00000 n +0000620636 00000 n +0000620733 00000 n +0000620830 00000 n +0000620927 00000 n +0000621024 00000 n +0000621121 00000 n +0000621218 00000 n +0000604063 00000 n +0000621302 00000 n +0000621383 00000 n +0000604184 00000 n +0000621464 00000 n +0000621545 00000 n +0000621642 00000 n +0000604305 00000 n +0000621726 00000 n +0000621807 00000 n +0000621904 00000 n +0000604426 00000 n +0000621988 00000 n +0000622069 00000 n +0000622164 00000 n +0000622259 00000 n +0000622356 00000 n +0000622453 00000 n +0000622550 00000 n +0000622647 00000 n +0000622744 00000 n +0000622841 00000 n +0000622938 00000 n +0000623035 00000 n +0000623132 00000 n +0000623229 00000 n +0000623326 00000 n +0000604546 00000 n +0000623409 00000 n +0000604670 00000 n +0000623478 00000 n +0000623558 00000 n +0000623653 00000 n +0000623750 00000 n +0000623847 00000 n +0000623944 00000 n +0000624041 00000 n +0000624138 00000 n +0000624235 00000 n +0000624332 00000 n +0000624429 00000 n +0000624526 00000 n +0000624623 00000 n +0000624720 00000 n +0000624817 00000 n +0000604791 00000 n +0000624900 00000 n +0000624980 00000 n +0000625075 00000 n +0000625172 00000 n +0000625269 00000 n +0000625366 00000 n +0000625463 00000 n +0000625560 00000 n +0000625657 00000 n +0000625754 00000 n +0000625851 00000 n +0000625948 00000 n +0000626045 00000 n +0000626142 00000 n +0000626239 00000 n +0000626336 00000 n +0000626433 00000 n +0000604912 00000 n +0000626516 00000 n +0000626597 00000 n +0000626692 00000 n +0000626787 00000 n +0000626884 00000 n +0000626981 00000 n +0000627078 00000 n +0000627175 00000 n +0000627272 00000 n +0000627369 00000 n +0000627466 00000 n +0000627563 00000 n +0000627660 00000 n +0000627757 00000 n +0000627854 00000 n +0000605033 00000 n +0000627937 00000 n +0000628018 00000 n +0000628113 00000 n +0000605153 00000 n +0000628196 00000 n +0000628276 00000 n +0000628371 00000 n +0000628466 00000 n +0000628563 00000 n +0000628660 00000 n +0000628757 00000 n +0000605273 00000 n +0000628840 00000 n +0000628920 00000 n +0000629015 00000 n +0000629112 00000 n +0000629209 00000 n +0000629306 00000 n +0000629403 00000 n +0000629500 00000 n +0000629597 00000 n +0000629694 00000 n +0000629791 00000 n +0000629888 00000 n +0000629985 00000 n +0000630082 00000 n +0000630179 00000 n +0000630276 00000 n +0000630373 00000 n +0000605393 00000 n +0000630456 00000 n +0000630537 00000 n +0000605512 00000 n +0000630618 00000 n +0000630699 00000 n +0000605631 00000 n +0000630780 00000 n +0000630863 00000 n +0000605756 00000 n +0000630946 00000 n +0000631029 00000 n +0000605881 00000 n +0000631112 00000 n +0000631193 00000 n +0000631288 00000 n +0000469307 00000 n +0000469371 00000 n +0000469817 00000 n +0000469881 00000 n +0000470275 00000 n +0000470339 00000 n +0000470748 00000 n +0000470812 00000 n +0000471245 00000 n +0000471309 00000 n +0000471715 00000 n +0000471779 00000 n +0000472172 00000 n +0000472236 00000 n +0000472668 00000 n +0000472732 00000 n +0000473125 00000 n +0000473189 00000 n +0000473633 00000 n +0000473697 00000 n +0000474141 00000 n +0000474205 00000 n +0000474634 00000 n +0000474698 00000 n +0000475105 00000 n +0000475169 00000 n +0000475564 00000 n +0000475628 00000 n +0000476035 00000 n +0000476099 00000 n +0000476503 00000 n +0000476567 00000 n +0000477007 00000 n +0000477071 00000 n +0000477529 00000 n +0000477593 00000 n +0000478051 00000 n +0000478115 00000 n +0000478555 00000 n +0000478619 00000 n +0000479015 00000 n +0000479079 00000 n +0000479497 00000 n +0000479561 00000 n +0000479956 00000 n +0000480020 00000 n +0000480450 00000 n +0000480514 00000 n +0000480958 00000 n +0000481022 00000 n +0000481453 00000 n +0000481517 00000 n +0000481937 00000 n +0000482001 00000 n +0000482422 00000 n +0000482486 00000 n +0000482894 00000 n +0000482958 00000 n +0000483366 00000 n +0000483430 00000 n +0000483828 00000 n +0000483892 00000 n +0000484288 00000 n +0000484352 00000 n +0000484759 00000 n +0000484823 00000 n +0000485258 00000 n +0000485322 00000 n +0000485732 00000 n +0000485796 00000 n +0000486206 00000 n +0000486270 00000 n +0000486679 00000 n +0000486743 00000 n +0000487154 00000 n +0000487218 00000 n +0000487624 00000 n +0000487688 00000 n +0000488083 00000 n +0000488147 00000 n +0000488562 00000 n +0000488626 00000 n +0000489055 00000 n +0000489119 00000 n +0000489524 00000 n +0000489588 00000 n +0000490017 00000 n +0000490081 00000 n +0000490536 00000 n +0000490600 00000 n +0000491029 00000 n +0000491093 00000 n +0000491510 00000 n +0000491574 00000 n +0000491969 00000 n +0000492033 00000 n +0000492440 00000 n +0000492504 00000 n +0000492897 00000 n +0000492961 00000 n +0000493390 00000 n +0000493454 00000 n +0000493897 00000 n +0000493961 00000 n +0000494406 00000 n +0000494470 00000 n +0000494865 00000 n +0000494929 00000 n +0000495346 00000 n +0000495410 00000 n +0000495827 00000 n +0000495891 00000 n +0000496320 00000 n +0000496384 00000 n +0000496789 00000 n +0000496853 00000 n +0000497271 00000 n +0000497335 00000 n +0000497790 00000 n +0000497854 00000 n +0000498249 00000 n +0000498313 00000 n +0000498730 00000 n +0000498794 00000 n +0000499189 00000 n +0000499253 00000 n +0000499660 00000 n +0000499724 00000 n +0000500119 00000 n +0000500183 00000 n +0000500600 00000 n +0000500664 00000 n +0000501093 00000 n +0000501157 00000 n +0000501623 00000 n +0000501687 00000 n +0000502105 00000 n +0000502169 00000 n +0000502613 00000 n +0000502677 00000 n +0000503084 00000 n +0000503148 00000 n +0000503592 00000 n +0000503656 00000 n +0000504051 00000 n +0000504115 00000 n +0000504522 00000 n +0000504586 00000 n +0000504981 00000 n +0000505045 00000 n +0000505463 00000 n +0000505527 00000 n +0000505954 00000 n +0000506018 00000 n +0000506447 00000 n +0000506511 00000 n +0000506906 00000 n +0000506970 00000 n +0000507377 00000 n +0000507441 00000 n +0000507859 00000 n +0000507923 00000 n +0000508318 00000 n +0000508382 00000 n +0000508814 00000 n +0000508878 00000 n +0000509283 00000 n +0000509347 00000 n +0000509742 00000 n +0000509806 00000 n +0000510238 00000 n +0000510302 00000 n +0000510746 00000 n +0000510810 00000 n +0000511242 00000 n +0000511306 00000 n +0000511775 00000 n +0000511839 00000 n +0000512283 00000 n +0000512347 00000 n +0000512740 00000 n +0000512804 00000 n +0000513234 00000 n +0000513298 00000 n +0000513694 00000 n +0000513758 00000 n +0000514181 00000 n +0000514245 00000 n +0000514642 00000 n +0000514706 00000 n +0000515161 00000 n +0000515225 00000 n +0000515622 00000 n +0000515686 00000 n +0000516132 00000 n +0000516196 00000 n +0000516615 00000 n +0000516679 00000 n +0000517111 00000 n +0000517175 00000 n +0000517605 00000 n +0000517669 00000 n +0000518102 00000 n +0000518166 00000 n +0000518574 00000 n +0000518638 00000 n +0000519048 00000 n +0000519112 00000 n +0000519553 00000 n +0000519617 00000 n +0000520020 00000 n +0000520084 00000 n +0000520504 00000 n +0000520568 00000 n +0000521000 00000 n +0000521064 00000 n +0000521533 00000 n +0000521597 00000 n +0000522028 00000 n +0000522092 00000 n +0000522507 00000 n +0000522571 00000 n +0000522964 00000 n +0000523028 00000 n +0000523457 00000 n +0000523521 00000 n +0000523927 00000 n +0000523991 00000 n +0000524408 00000 n +0000524472 00000 n +0000524887 00000 n +0000524951 00000 n +0000525383 00000 n +0000525447 00000 n +0000525842 00000 n +0000525906 00000 n +0000526347 00000 n +0000526411 00000 n +0000526826 00000 n +0000526890 00000 n +0000527307 00000 n +0000527371 00000 n +0000527788 00000 n +0000527852 00000 n +0000528269 00000 n +0000528333 00000 n +0000528728 00000 n +0000528792 00000 n +0000529187 00000 n +0000529251 00000 n +0000529646 00000 n +0000529710 00000 n +0000530103 00000 n +0000530167 00000 n +0000530574 00000 n +0000530638 00000 n +0000531067 00000 n +0000531131 00000 n +0000531548 00000 n +0000531612 00000 n 0000532030 00000 n -0000532123 00000 n -0000532216 00000 n -0000532309 00000 n -0000532402 00000 n -0000532495 00000 n -0000532588 00000 n -0000532681 00000 n -0000532774 00000 n -0000527513 00000 n -0000532854 00000 n -0000532932 00000 n -0000533023 00000 n -0000527627 00000 n -0000533103 00000 n -0000527742 00000 n -0000533167 00000 n -0000527858 00000 n -0000533232 00000 n -0000527974 00000 n -0000533297 00000 n -0000533375 00000 n -0000533466 00000 n -0000533559 00000 n -0000528088 00000 n -0000533639 00000 n -0000533719 00000 n -0000533812 00000 n -0000533905 00000 n -0000533998 00000 n -0000534091 00000 n -0000528203 00000 n -0000534171 00000 n -0000534249 00000 n -0000534340 00000 n -0000534433 00000 n -0000534526 00000 n -0000534619 00000 n -0000534712 00000 n -0000534805 00000 n -0000534898 00000 n -0000534991 00000 n -0000535084 00000 n -0000535177 00000 n -0000535270 00000 n -0000535363 00000 n -0000535456 00000 n -0000528319 00000 n -0000535536 00000 n -0000535614 00000 n -0000535705 00000 n -0000535798 00000 n -0000535891 00000 n -0000535984 00000 n -0000536077 00000 n -0000536170 00000 n -0000536263 00000 n -0000536356 00000 n -0000536449 00000 n -0000536542 00000 n -0000536635 00000 n -0000536728 00000 n -0000536821 00000 n -0000528433 00000 n -0000536901 00000 n -0000536981 00000 n -0000537074 00000 n -0000537167 00000 n -0000537260 00000 n -0000537353 00000 n -0000537446 00000 n -0000537539 00000 n -0000537632 00000 n -0000537725 00000 n -0000537819 00000 n -0000537914 00000 n -0000528551 00000 n -0000537996 00000 n -0000528670 00000 n -0000538065 00000 n -0000538148 00000 n -0000538245 00000 n -0000538342 00000 n -0000528796 00000 n -0000538425 00000 n -0000538508 00000 n -0000538605 00000 n -0000528920 00000 n -0000538688 00000 n -0000538771 00000 n -0000538868 00000 n -0000529045 00000 n -0000538951 00000 n -0000539034 00000 n -0000539131 00000 n -0000529171 00000 n -0000539214 00000 n -0000539294 00000 n -0000539388 00000 n -0000539483 00000 n -0000539578 00000 n -0000539673 00000 n -0000539768 00000 n -0000539863 00000 n -0000539958 00000 n -0000540053 00000 n -0000540148 00000 n -0000540243 00000 n -0000540338 00000 n -0000540433 00000 n -0000540528 00000 n -0000540623 00000 n -0000540720 00000 n -0000540817 00000 n -0000540914 00000 n -0000541011 00000 n -0000541108 00000 n -0000541205 00000 n -0000541302 00000 n -0000541399 00000 n -0000541496 00000 n -0000541593 00000 n -0000541690 00000 n -0000541787 00000 n -0000541884 00000 n -0000541981 00000 n -0000542078 00000 n -0000542175 00000 n -0000542272 00000 n -0000542369 00000 n -0000542466 00000 n -0000542563 00000 n -0000542660 00000 n -0000542757 00000 n -0000542854 00000 n -0000542951 00000 n -0000543048 00000 n -0000543145 00000 n -0000543242 00000 n -0000543339 00000 n -0000543436 00000 n -0000543533 00000 n -0000543630 00000 n -0000543727 00000 n -0000543824 00000 n -0000543921 00000 n -0000544018 00000 n -0000544115 00000 n -0000544212 00000 n -0000544309 00000 n -0000544406 00000 n -0000544503 00000 n -0000544600 00000 n -0000544697 00000 n -0000544794 00000 n -0000544891 00000 n -0000544988 00000 n -0000545085 00000 n -0000545182 00000 n -0000545279 00000 n -0000545376 00000 n -0000545473 00000 n -0000545570 00000 n -0000545667 00000 n -0000545764 00000 n -0000545861 00000 n -0000545958 00000 n -0000546055 00000 n -0000546152 00000 n -0000546249 00000 n -0000529291 00000 n -0000546332 00000 n -0000546413 00000 n -0000529412 00000 n -0000546494 00000 n -0000546575 00000 n -0000529533 00000 n -0000546656 00000 n -0000546737 00000 n -0000529654 00000 n -0000546818 00000 n -0000546899 00000 n -0000546994 00000 n -0000547089 00000 n -0000547186 00000 n -0000547283 00000 n -0000547380 00000 n -0000547477 00000 n -0000547574 00000 n -0000547671 00000 n -0000547768 00000 n -0000547865 00000 n -0000547962 00000 n -0000548059 00000 n -0000548156 00000 n -0000529774 00000 n -0000548239 00000 n -0000529898 00000 n -0000548308 00000 n -0000548388 00000 n -0000548483 00000 n -0000548580 00000 n -0000548677 00000 n -0000548774 00000 n -0000548871 00000 n -0000548968 00000 n -0000549065 00000 n -0000549162 00000 n -0000549259 00000 n -0000549356 00000 n -0000549453 00000 n -0000549550 00000 n -0000549647 00000 n -0000530019 00000 n -0000549730 00000 n -0000549810 00000 n -0000549905 00000 n -0000550002 00000 n -0000550099 00000 n -0000550196 00000 n -0000550293 00000 n -0000550390 00000 n -0000550487 00000 n -0000550584 00000 n -0000550681 00000 n -0000550778 00000 n -0000550875 00000 n -0000550972 00000 n -0000551069 00000 n -0000551166 00000 n -0000551263 00000 n -0000530140 00000 n -0000551346 00000 n -0000551427 00000 n -0000551522 00000 n -0000551617 00000 n -0000551714 00000 n -0000551811 00000 n -0000551908 00000 n -0000552005 00000 n -0000552102 00000 n -0000552199 00000 n -0000552296 00000 n -0000552393 00000 n -0000552490 00000 n -0000552587 00000 n -0000552684 00000 n -0000530261 00000 n -0000552767 00000 n -0000552848 00000 n -0000552943 00000 n -0000530381 00000 n -0000553026 00000 n -0000553106 00000 n -0000553201 00000 n -0000553296 00000 n -0000553393 00000 n -0000553490 00000 n -0000553587 00000 n -0000530501 00000 n -0000553670 00000 n -0000553750 00000 n -0000553845 00000 n -0000553942 00000 n -0000554039 00000 n -0000554136 00000 n -0000554233 00000 n -0000554330 00000 n -0000554427 00000 n -0000554524 00000 n -0000554621 00000 n -0000554718 00000 n -0000554815 00000 n -0000554912 00000 n -0000555009 00000 n -0000555106 00000 n -0000555203 00000 n -0000530621 00000 n -0000555286 00000 n -0000555367 00000 n -0000530740 00000 n -0000555448 00000 n -0000555529 00000 n -0000530859 00000 n -0000555610 00000 n -0000555693 00000 n -0000530984 00000 n -0000555776 00000 n -0000555859 00000 n -0000531109 00000 n -0000555942 00000 n -0000556023 00000 n -0000556118 00000 n -0000396470 00000 n -0000396534 00000 n -0000396980 00000 n -0000397044 00000 n -0000397438 00000 n -0000397502 00000 n -0000397911 00000 n -0000397975 00000 n -0000398408 00000 n -0000398472 00000 n -0000398878 00000 n -0000398942 00000 n -0000399335 00000 n -0000399399 00000 n -0000399831 00000 n -0000399895 00000 n -0000400288 00000 n -0000400352 00000 n -0000400796 00000 n -0000400860 00000 n -0000401304 00000 n -0000401368 00000 n -0000401797 00000 n -0000401861 00000 n -0000402268 00000 n -0000402332 00000 n -0000402727 00000 n -0000402791 00000 n -0000403198 00000 n -0000403262 00000 n -0000403666 00000 n -0000403730 00000 n -0000404170 00000 n -0000404234 00000 n -0000404692 00000 n -0000404756 00000 n -0000405214 00000 n -0000405278 00000 n -0000405674 00000 n -0000405738 00000 n -0000406156 00000 n -0000406220 00000 n -0000406615 00000 n -0000406679 00000 n -0000407109 00000 n -0000407173 00000 n -0000407617 00000 n -0000407681 00000 n -0000408112 00000 n -0000408176 00000 n -0000408596 00000 n -0000408660 00000 n -0000409081 00000 n -0000409145 00000 n -0000409553 00000 n -0000409617 00000 n -0000410025 00000 n -0000410089 00000 n -0000410487 00000 n -0000410551 00000 n -0000410947 00000 n -0000411011 00000 n -0000411418 00000 n -0000411482 00000 n -0000411917 00000 n -0000411981 00000 n -0000412391 00000 n -0000412455 00000 n -0000412865 00000 n -0000412929 00000 n -0000413338 00000 n -0000413402 00000 n -0000413813 00000 n -0000413877 00000 n -0000414283 00000 n -0000414347 00000 n -0000414742 00000 n -0000414806 00000 n -0000415221 00000 n -0000415285 00000 n -0000415714 00000 n -0000415778 00000 n -0000416183 00000 n -0000416247 00000 n -0000416676 00000 n -0000416740 00000 n -0000417195 00000 n -0000417259 00000 n -0000417688 00000 n -0000417752 00000 n -0000418169 00000 n -0000418233 00000 n -0000418628 00000 n -0000418692 00000 n -0000419099 00000 n -0000419163 00000 n -0000419556 00000 n -0000419620 00000 n -0000420049 00000 n -0000420113 00000 n -0000420556 00000 n -0000420620 00000 n -0000421065 00000 n -0000421129 00000 n -0000421524 00000 n -0000421588 00000 n -0000422005 00000 n -0000422069 00000 n -0000422486 00000 n -0000422550 00000 n -0000422979 00000 n -0000423043 00000 n -0000423448 00000 n -0000423512 00000 n -0000423930 00000 n -0000423994 00000 n -0000424449 00000 n -0000424513 00000 n -0000424908 00000 n -0000424972 00000 n -0000425389 00000 n -0000425453 00000 n -0000425848 00000 n -0000425912 00000 n -0000426319 00000 n -0000426383 00000 n -0000426778 00000 n -0000426842 00000 n -0000427259 00000 n -0000427323 00000 n -0000427752 00000 n -0000427816 00000 n -0000428282 00000 n -0000428346 00000 n -0000428764 00000 n -0000428828 00000 n -0000429272 00000 n -0000429336 00000 n -0000429743 00000 n -0000429807 00000 n -0000430251 00000 n -0000430315 00000 n -0000430710 00000 n -0000430774 00000 n -0000431181 00000 n -0000431245 00000 n -0000431640 00000 n -0000431704 00000 n -0000432122 00000 n -0000432186 00000 n -0000432613 00000 n -0000432677 00000 n -0000433106 00000 n -0000433170 00000 n -0000433565 00000 n -0000433629 00000 n -0000434036 00000 n -0000434100 00000 n -0000434518 00000 n -0000434582 00000 n -0000434977 00000 n -0000435041 00000 n -0000435473 00000 n -0000435537 00000 n -0000435942 00000 n -0000436006 00000 n -0000436401 00000 n -0000436465 00000 n -0000436897 00000 n -0000436961 00000 n -0000437405 00000 n -0000437469 00000 n -0000437901 00000 n -0000437965 00000 n -0000438434 00000 n -0000438498 00000 n -0000438942 00000 n -0000439006 00000 n -0000439399 00000 n -0000439463 00000 n -0000439893 00000 n -0000439957 00000 n -0000440353 00000 n -0000440417 00000 n -0000440840 00000 n -0000440904 00000 n -0000441301 00000 n -0000441365 00000 n -0000441820 00000 n -0000441884 00000 n -0000442281 00000 n -0000442345 00000 n -0000442791 00000 n -0000442855 00000 n -0000443274 00000 n -0000443338 00000 n -0000443770 00000 n -0000443834 00000 n -0000444264 00000 n -0000444328 00000 n -0000444761 00000 n -0000444825 00000 n -0000445233 00000 n -0000445297 00000 n -0000445707 00000 n -0000445771 00000 n -0000446212 00000 n -0000446276 00000 n -0000446679 00000 n -0000446743 00000 n -0000447163 00000 n -0000447227 00000 n -0000447659 00000 n -0000447723 00000 n -0000448192 00000 n -0000448256 00000 n -0000448687 00000 n -0000448751 00000 n -0000449166 00000 n -0000449230 00000 n -0000449623 00000 n -0000449687 00000 n -0000450116 00000 n -0000450180 00000 n -0000450586 00000 n -0000450650 00000 n -0000451067 00000 n -0000451131 00000 n -0000451546 00000 n -0000451610 00000 n -0000452042 00000 n -0000452106 00000 n -0000452501 00000 n -0000452565 00000 n -0000453006 00000 n -0000453070 00000 n -0000453485 00000 n -0000453549 00000 n -0000453966 00000 n -0000454030 00000 n -0000454447 00000 n -0000454511 00000 n -0000454928 00000 n -0000454992 00000 n -0000455387 00000 n -0000455451 00000 n -0000455846 00000 n -0000455910 00000 n -0000456305 00000 n -0000456369 00000 n -0000456762 00000 n -0000456826 00000 n -0000457233 00000 n -0000457297 00000 n -0000457726 00000 n -0000457790 00000 n -0000458207 00000 n -0000458271 00000 n -0000458689 00000 n -0000458753 00000 n -0000459193 00000 n -0000459257 00000 n -0000459712 00000 n -0000459776 00000 n -0000460231 00000 n -0000460295 00000 n -0000460724 00000 n -0000460788 00000 n -0000461204 00000 n -0000461268 00000 n -0000461661 00000 n -0000461725 00000 n -0000462130 00000 n -0000462194 00000 n -0000462626 00000 n -0000462690 00000 n -0000463097 00000 n -0000463161 00000 n -0000463568 00000 n -0000463632 00000 n -0000464024 00000 n -0000464088 00000 n -0000464505 00000 n -0000464569 00000 n -0000465009 00000 n -0000465073 00000 n -0000465480 00000 n -0000465544 00000 n -0000465973 00000 n -0000466037 00000 n -0000466432 00000 n -0000466496 00000 n -0000466891 00000 n -0000466955 00000 n -0000467350 00000 n -0000467414 00000 n -0000467809 00000 n -0000467873 00000 n -0000468268 00000 n -0000468332 00000 n -0000468739 00000 n -0000468803 00000 n -0000469198 00000 n -0000469262 00000 n -0000469657 00000 n -0000469721 00000 n -0000470116 00000 n -0000470180 00000 n -0000470575 00000 n -0000470639 00000 n -0000471032 00000 n -0000471096 00000 n -0000471489 00000 n -0000471553 00000 n -0000472022 00000 n -0000472086 00000 n -0000472530 00000 n -0000472594 00000 n -0000473038 00000 n -0000473102 00000 n -0000473553 00000 n -0000473617 00000 n -0000474036 00000 n -0000474100 00000 n -0000474507 00000 n -0000474571 00000 n -0000474964 00000 n -0000475028 00000 n -0000475458 00000 n -0000475522 00000 n -0000475957 00000 n -0000476021 00000 n -0000476452 00000 n -0000476516 00000 n -0000476928 00000 n -0000476992 00000 n -0000477400 00000 n -0000477464 00000 n -0000477887 00000 n -0000477951 00000 n -0000478370 00000 n -0000478434 00000 n -0000478843 00000 n -0000478907 00000 n -0000479340 00000 n -0000479404 00000 n -0000479815 00000 n -0000479879 00000 n -0000480272 00000 n -0000480336 00000 n -0000480731 00000 n -0000480795 00000 n -0000481190 00000 n -0000481254 00000 n -0000481671 00000 n -0000481735 00000 n -0000482128 00000 n -0000482192 00000 n -0000482599 00000 n -0000482663 00000 n -0000483070 00000 n -0000483134 00000 n -0000483541 00000 n -0000483605 00000 n -0000484045 00000 n -0000484109 00000 n -0000484504 00000 n -0000484568 00000 n -0000484975 00000 n -0000485039 00000 n -0000485490 00000 n -0000485554 00000 n -0000485961 00000 n -0000486025 00000 n -0000486445 00000 n -0000486509 00000 n -0000486931 00000 n -0000486995 00000 n -0000487388 00000 n -0000487452 00000 n -0000487906 00000 n -0000487970 00000 n -0000488387 00000 n -0000488451 00000 n -0000488880 00000 n -0000488944 00000 n -0000489349 00000 n -0000489413 00000 n -0000489820 00000 n -0000489884 00000 n -0000490328 00000 n -0000490392 00000 n -0000490799 00000 n -0000490863 00000 n -0000491280 00000 n -0000491344 00000 n -0000491776 00000 n -0000491840 00000 n -0000492247 00000 n -0000492311 00000 n -0000492706 00000 n -0000492770 00000 n -0000493199 00000 n -0000493263 00000 n -0000493695 00000 n -0000493759 00000 n -0000494193 00000 n -0000494257 00000 n -0000494686 00000 n -0000494750 00000 n -0000495165 00000 n -0000495229 00000 n -0000495683 00000 n -0000495747 00000 n -0000496187 00000 n -0000496251 00000 n -0000496667 00000 n -0000496731 00000 n -0000497126 00000 n -0000497190 00000 n -0000497622 00000 n -0000497686 00000 n -0000498115 00000 n -0000498179 00000 n -0000498608 00000 n -0000498672 00000 n -0000499067 00000 n -0000499131 00000 n -0000499526 00000 n -0000499590 00000 n -0000499985 00000 n -0000500049 00000 n -0000500500 00000 n -0000500564 00000 n -0000500959 00000 n -0000501023 00000 n -0000501455 00000 n -0000501519 00000 n -0000501939 00000 n -0000502003 00000 n -0000502424 00000 n -0000502488 00000 n -0000502910 00000 n -0000502974 00000 n -0000503380 00000 n -0000503444 00000 n -0000503876 00000 n -0000503940 00000 n -0000504335 00000 n -0000504399 00000 n -0000504850 00000 n -0000504914 00000 n -0000505341 00000 n -0000505405 00000 n -0000505837 00000 n -0000505901 00000 n -0000506308 00000 n -0000506372 00000 n -0000506790 00000 n -0000506854 00000 n -0000507283 00000 n -0000507347 00000 n -0000507742 00000 n -0000507806 00000 n -0000508201 00000 n -0000508265 00000 n -0000508705 00000 n -0000508769 00000 n -0000509201 00000 n -0000509265 00000 n -0000509699 00000 n -0000509763 00000 n -0000510153 00000 n -0000510217 00000 n -0000510611 00000 n -0000510675 00000 n -0000511082 00000 n -0000511146 00000 n -0000511556 00000 n -0000511620 00000 n -0000512038 00000 n -0000512102 00000 n -0000512557 00000 n -0000512621 00000 n -0000513087 00000 n -0000513151 00000 n -0000513558 00000 n -0000513622 00000 n -0000514029 00000 n -0000514093 00000 n -0000514502 00000 n -0000514566 00000 n -0000514972 00000 n -0000515036 00000 n -0000515453 00000 n -0000515517 00000 n -0000515934 00000 n -0000515998 00000 n -0000516415 00000 n -0000516479 00000 n -0000516872 00000 n -0000516936 00000 n -0000517343 00000 n -0000517407 00000 n -0000517873 00000 n -0000517937 00000 n -0000518344 00000 n -0000518408 00000 n -0000518848 00000 n -0000518912 00000 n -0000519305 00000 n -0000519369 00000 n -0000519787 00000 n -0000519851 00000 n -0000520283 00000 n -0000520347 00000 n -0000520776 00000 n -0000520840 00000 n -0000521235 00000 n -0000521299 00000 n -0000521731 00000 n -0000521795 00000 n -0000522205 00000 n -0000522269 00000 n -0000522675 00000 n -0000522739 00000 n -0000523151 00000 n -0000523215 00000 n -0000523623 00000 n -0000523687 00000 n -0000524083 00000 n -0000524147 00000 n -0000524554 00000 n -0000524618 00000 n -0000525025 00000 n -0000525089 00000 n -0000525507 00000 n -0000525571 00000 n -0000526017 00000 n -0000526081 00000 n -0000526523 00000 n -0000526587 00000 n -0000556201 00000 n -0000556288 00000 n +0000532094 00000 n +0000532534 00000 n +0000532598 00000 n +0000533053 00000 n +0000533117 00000 n +0000533572 00000 n +0000533636 00000 n +0000534065 00000 n +0000534129 00000 n +0000534545 00000 n +0000534609 00000 n +0000535002 00000 n +0000535066 00000 n +0000535471 00000 n +0000535535 00000 n +0000535967 00000 n +0000536031 00000 n +0000536438 00000 n +0000536502 00000 n +0000536909 00000 n +0000536973 00000 n +0000537365 00000 n +0000537429 00000 n +0000537846 00000 n +0000537910 00000 n +0000538350 00000 n +0000538414 00000 n +0000538821 00000 n +0000538885 00000 n +0000539314 00000 n +0000539378 00000 n +0000539773 00000 n +0000539837 00000 n +0000540232 00000 n +0000540296 00000 n +0000540691 00000 n +0000540755 00000 n +0000541150 00000 n +0000541214 00000 n +0000541609 00000 n +0000541673 00000 n +0000542080 00000 n +0000542144 00000 n +0000542539 00000 n +0000542603 00000 n +0000542998 00000 n +0000543062 00000 n +0000543457 00000 n +0000543521 00000 n +0000543916 00000 n +0000543980 00000 n +0000544373 00000 n +0000544437 00000 n +0000544830 00000 n +0000544894 00000 n +0000545363 00000 n +0000545427 00000 n +0000545871 00000 n +0000545935 00000 n +0000546379 00000 n +0000546443 00000 n +0000546894 00000 n +0000546958 00000 n +0000547377 00000 n +0000547441 00000 n +0000547848 00000 n +0000547912 00000 n +0000548305 00000 n +0000548369 00000 n +0000548799 00000 n +0000548863 00000 n +0000549306 00000 n +0000549370 00000 n +0000549805 00000 n +0000549869 00000 n +0000550300 00000 n +0000550364 00000 n +0000550787 00000 n +0000550851 00000 n +0000551270 00000 n +0000551334 00000 n +0000551726 00000 n +0000551790 00000 n +0000552202 00000 n +0000552266 00000 n +0000552674 00000 n +0000552738 00000 n +0000553142 00000 n +0000553206 00000 n +0000553615 00000 n +0000553679 00000 n +0000554112 00000 n +0000554176 00000 n +0000554587 00000 n +0000554651 00000 n +0000555044 00000 n +0000555108 00000 n +0000555503 00000 n +0000555567 00000 n +0000555962 00000 n +0000556026 00000 n +0000556443 00000 n +0000556507 00000 n +0000556900 00000 n +0000556964 00000 n +0000557371 00000 n +0000557435 00000 n +0000557842 00000 n +0000557906 00000 n +0000558313 00000 n +0000558377 00000 n +0000558817 00000 n +0000558881 00000 n +0000559276 00000 n +0000559340 00000 n +0000559747 00000 n +0000559811 00000 n +0000560262 00000 n +0000560326 00000 n +0000560733 00000 n +0000560797 00000 n +0000561217 00000 n +0000561281 00000 n +0000561703 00000 n +0000561767 00000 n +0000562160 00000 n +0000562224 00000 n +0000562678 00000 n +0000562742 00000 n +0000563159 00000 n +0000563223 00000 n +0000563652 00000 n +0000563716 00000 n +0000564121 00000 n +0000564185 00000 n +0000564592 00000 n +0000564656 00000 n +0000565100 00000 n +0000565164 00000 n +0000565571 00000 n +0000565635 00000 n +0000566052 00000 n +0000566116 00000 n +0000566548 00000 n +0000566612 00000 n +0000567019 00000 n +0000567083 00000 n +0000567478 00000 n +0000567542 00000 n +0000567971 00000 n +0000568035 00000 n +0000568467 00000 n +0000568531 00000 n +0000568965 00000 n +0000569029 00000 n +0000569458 00000 n +0000569522 00000 n +0000569937 00000 n +0000570001 00000 n +0000570455 00000 n +0000570519 00000 n +0000570959 00000 n +0000571023 00000 n +0000571439 00000 n +0000571503 00000 n +0000571898 00000 n +0000571962 00000 n +0000572394 00000 n +0000572458 00000 n +0000572887 00000 n +0000572951 00000 n +0000573380 00000 n +0000573444 00000 n +0000573839 00000 n +0000573903 00000 n +0000574298 00000 n +0000574362 00000 n +0000574757 00000 n +0000574821 00000 n +0000575272 00000 n +0000575336 00000 n +0000575731 00000 n +0000575795 00000 n +0000576227 00000 n +0000576291 00000 n +0000576711 00000 n +0000576775 00000 n +0000577196 00000 n +0000577260 00000 n +0000577682 00000 n +0000577746 00000 n +0000578152 00000 n +0000578216 00000 n +0000578648 00000 n +0000578712 00000 n +0000579107 00000 n +0000579171 00000 n +0000579622 00000 n +0000579686 00000 n +0000580113 00000 n +0000580177 00000 n +0000580609 00000 n +0000580673 00000 n +0000581080 00000 n +0000581144 00000 n +0000581562 00000 n +0000581626 00000 n +0000582055 00000 n +0000582119 00000 n +0000582514 00000 n +0000582578 00000 n +0000582973 00000 n +0000583037 00000 n +0000583477 00000 n +0000583541 00000 n +0000583973 00000 n +0000584037 00000 n +0000584471 00000 n +0000584535 00000 n +0000584925 00000 n +0000584989 00000 n +0000585383 00000 n +0000585447 00000 n +0000585854 00000 n +0000585918 00000 n +0000586328 00000 n +0000586392 00000 n +0000586810 00000 n +0000586874 00000 n +0000587329 00000 n +0000587393 00000 n +0000587859 00000 n +0000587923 00000 n +0000588330 00000 n +0000588394 00000 n +0000588801 00000 n +0000588865 00000 n +0000589274 00000 n +0000589338 00000 n +0000589744 00000 n +0000589808 00000 n +0000590225 00000 n +0000590289 00000 n +0000590706 00000 n +0000590770 00000 n +0000591187 00000 n +0000591251 00000 n +0000591644 00000 n +0000591708 00000 n +0000592115 00000 n +0000592179 00000 n +0000592645 00000 n +0000592709 00000 n +0000593116 00000 n +0000593180 00000 n +0000593620 00000 n +0000593684 00000 n +0000594077 00000 n +0000594141 00000 n +0000594559 00000 n +0000594623 00000 n +0000595055 00000 n +0000595119 00000 n +0000595548 00000 n +0000595612 00000 n +0000596007 00000 n +0000596071 00000 n +0000596503 00000 n +0000596567 00000 n +0000596977 00000 n +0000597041 00000 n +0000597447 00000 n +0000597511 00000 n +0000597923 00000 n +0000597987 00000 n +0000598395 00000 n +0000598459 00000 n +0000598855 00000 n +0000598919 00000 n +0000599326 00000 n +0000599390 00000 n +0000599797 00000 n +0000599861 00000 n +0000600279 00000 n +0000600343 00000 n +0000600789 00000 n +0000600853 00000 n +0000601295 00000 n +0000601359 00000 n +0000631371 00000 n +0000631458 00000 n trailer << -/Size 863 -/Root 862 0 R -/Info 861 0 R -/ID [ ] +/Size 876 +/Root 875 0 R +/Info 874 0 R +/ID [ ] >> startxref -556410 +631580 %%EOF diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md index de76286b2..4ffe625cc 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md @@ -2,9 +2,11 @@ # Notes +News 2025-12-04 - The GPS pin definitions have been changed!!! This has no material effect on current builds, but future builders may wish to review how they are using the wires. + ## General -The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts.pdf) is located in this directory. +The pinout is contained in the variant.h file, and a [generic schematic](./Schematic_Pro-Micro_Pinouts_2025-12-04.pdf) is located in this directory. This variant is suitable for both TCXO and XTAL types of modules. The old XTAL variant has been removed to reduce confusion. diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h index b52d0e57e..7eeb26e65 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h @@ -30,8 +30,8 @@ NRF52 PRO MICRO PIN ASSIGNMENT | Gnd   |             |   | reset   |             | | | Gnd   |             |   | ext_vcc | *see 0.13   | | | P0.17 | RXEN       |   | P0.31   | BATTERY_PIN | | -| P0.20 | GPS_RX     |   | P0.29   | BUSY         | DIO0 | -| P0.22 | GPS_TX     |   | P0.02   | MISO | MISO | +| P0.20 | GPS_TX     |   | P0.29   | BUSY         | DIO0 | +| P0.22 | GPS_RX     |   | P0.02   | MISO | MISO | | P0.24 | GPS_EN     |   | P1.15   | MOSI         | MOSI | | P1.00 | BUTTON_PIN |   | P1.13   | CS           | CS   | | P0.11 | SCL         |   | P1.11   | SCK         | SCK | @@ -90,8 +90,8 @@ NRF52 PRO MICRO PIN ASSIGNMENT #define BUTTON_PIN (32 + 0) // P1.00 // GPS -#define PIN_GPS_TX (0 + 20) // P0.20 -#define PIN_GPS_RX (0 + 22) // P0.22 +#define PIN_GPS_TX (0 + 20) // P0.20 - This is data from the MCU +#define PIN_GPS_RX (0 + 22) // P0.22 - This is data from the GNSS #define PIN_GPS_EN (0 + 24) // P0.24 #define GPS_UBLOX From 2f4eb25b2f4aebfe1ce01292b56cfc0c02c87193 Mon Sep 17 00:00:00 2001 From: Donato Date: Thu, 4 Dec 2025 22:32:42 +0100 Subject: [PATCH 222/286] Optimization flags for all NRF52 targets to reduce code size (#8854) * changes of variants/nrf52840/nrf52.ini and variants/nrf52840/rak4631/platformio.ini * try for nrf52 size reduction, faketec exclude unused radios and meshlink refactor * can't exclude LR11X0 as in schematic there's option for LR1121 * remove -Map flag and -Wl * removed spaces causing error --------- Co-authored-by: macvenez --- .../nrf52_promicro_diy_tcxo/platformio.ini | 4 + variants/nrf52840/meshlink/platformio.ini | 24 +++ .../nrf52840/meshlink_eink/platformio.ini | 31 ---- variants/nrf52840/meshlink_eink/variant.cpp | 23 --- variants/nrf52840/meshlink_eink/variant.h | 153 ------------------ variants/nrf52840/nrf52.ini | 13 +- variants/nrf52840/rak4631/platformio.ini | 12 -- 7 files changed, 40 insertions(+), 220 deletions(-) delete mode 100644 variants/nrf52840/meshlink_eink/platformio.ini delete mode 100644 variants/nrf52840/meshlink_eink/variant.cpp delete mode 100644 variants/nrf52840/meshlink_eink/variant.h diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini index 61a6eda07..d7d0c02c8 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini @@ -5,6 +5,8 @@ board = promicro-nrf52840 build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo -D NRF52_PROMICRO_DIY + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo> lib_deps = ${nrf52840_base.lib_deps} @@ -20,6 +22,8 @@ build_flags = ${inkhud.build_flags} -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo -D NRF52_PROMICRO_DIY + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 build_src_filter = ${nrf52_base.build_src_filter} ${inkhud.build_src_filter} diff --git a/variants/nrf52840/meshlink/platformio.ini b/variants/nrf52840/meshlink/platformio.ini index 2a4e27fe8..e0f4a2b9b 100644 --- a/variants/nrf52840/meshlink/platformio.ini +++ b/variants/nrf52840/meshlink/platformio.ini @@ -9,6 +9,30 @@ board_level = extra build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/meshlink -D MESHLINK + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 + -DRADIOLIB_EXCLUDE_LR11X0=1 + +build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink> +lib_deps = + ${nrf52840_base.lib_deps} +debug_tool = jlink +; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) +; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds +;upload_protocol = jlink + +[env:meshlink_eink] +extends = nrf52840_base +board = meshlink +board_level = extra +;board_check = true +build_flags = ${nrf52840_base.build_flags} + -I variants/nrf52840/meshlink + -D MESHLINK + -DRADIOLIB_EXCLUDE_SX128X=1 + -DRADIOLIB_EXCLUDE_SX127X=1 + -DRADIOLIB_EXCLUDE_LR11X0=1 + -D USE_EINK -D EINK_DISPLAY_MODEL=GxEPD2_213_B74 -D EINK_WIDTH=250 -D EINK_HEIGHT=122 diff --git a/variants/nrf52840/meshlink_eink/platformio.ini b/variants/nrf52840/meshlink_eink/platformio.ini deleted file mode 100644 index c0c0cb1dd..000000000 --- a/variants/nrf52840/meshlink_eink/platformio.ini +++ /dev/null @@ -1,31 +0,0 @@ -; MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog -; https://www.loraitalia.it -; firmware for boards with a 250x122 e-ink display -[env:meshlink_eink] -extends = nrf52840_base -board = meshlink -board_level = extra -;board_check = true -build_flags = ${nrf52840_base.build_flags} - -I variants/nrf52840/meshlink_eink - -D MESHLINK - -D EINK_DISPLAY_MODEL=GxEPD2_213_B74 - -D EINK_WIDTH=250 - -D EINK_HEIGHT=122 - -D USE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk - -D EINK_LIMIT_FASTREFRESH=5 ; How many consecutive fast-refreshes are permitted - -D EINK_LIMIT_RATE_BACKGROUND_SEC=30 ; Minimum interval between BACKGROUND updates - -D EINK_LIMIT_RATE_RESPONSIVE_SEC=1 ; Minimum interval between RESPONSIVE updates - -D EINK_LIMIT_GHOSTING_PX=2000 ; (Optional) How much image ghosting is tolerated - -D EINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached. - -D EINK_HASQUIRK_VICIOUSFASTREFRESH ; Identify that pixels drawn by fast-refresh are harder to clear - - -build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink_eink> -lib_deps = - ${nrf52840_base.lib_deps} - https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip -debug_tool = jlink -; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) -; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds -;upload_protocol = jlink \ No newline at end of file diff --git a/variants/nrf52840/meshlink_eink/variant.cpp b/variants/nrf52840/meshlink_eink/variant.cpp deleted file mode 100644 index 81a5097c4..000000000 --- a/variants/nrf52840/meshlink_eink/variant.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "variant.h" -#include "nrf.h" -#include "wiring_constants.h" -#include "wiring_digital.h" - -const uint32_t g_ADigitalPinMap[] = { - // P0 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - - // P1 - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47}; - -void initVariant() -{ - pinMode(PIN_LED1, OUTPUT); - digitalWrite(PIN_LED1, HIGH); // turn off the white led while booting - // otherwise it will stay lit for several seconds (could be annoying) - -#ifdef PIN_WD_EN - pinMode(PIN_WD_EN, OUTPUT); - digitalWrite(PIN_WD_EN, HIGH); // Enable the Watchdog at boot -#endif -} \ No newline at end of file diff --git a/variants/nrf52840/meshlink_eink/variant.h b/variants/nrf52840/meshlink_eink/variant.h deleted file mode 100644 index e82163ca7..000000000 --- a/variants/nrf52840/meshlink_eink/variant.h +++ /dev/null @@ -1,153 +0,0 @@ -#ifndef _VARIANT_MESHLINK_ -#define _VARIANT_MESHLINK_ -#ifndef MESHLINK -#define MESHLINK -#endif -/** Master clock frequency */ -#define VARIANT_MCK (64000000ul) - -// #define USE_LFXO // Board uses 32khz crystal for LF -#define USE_LFRC // Board uses RC for LF - -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "WVariant.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -// Number of pins defined in PinDescription array -#define PINS_COUNT (48) -#define NUM_DIGITAL_PINS (48) -#define NUM_ANALOG_INPUTS (2) -#define NUM_ANALOG_OUTPUTS (0) - -#define BUTTON_PIN (-1) // If defined, this will be used for user button presses, -#define BUTTON_NEED_PULLUP - -// LEDs -#define PIN_LED1 (24) // Built in white led for status -#define LED_BLUE PIN_LED1 -#define LED_BUILTIN PIN_LED1 - -#define LED_STATE_ON 0 // State when LED is litted -#define LED_INVERTED 1 - -// Testing USB detection -// #define NRF_APM - -/* - * Analog pins - */ -#define PIN_A1 (3) // P0.03/AIN1 -#define ADC_RESOLUTION 14 - -// Other pins -// #define PIN_AREF (2) -// static const uint8_t AREF = PIN_AREF; - -/* - * Serial interfaces - */ -#define PIN_SERIAL1_RX (32 + 8) -#define PIN_SERIAL1_TX (7) - -/* - * SPI Interfaces - */ -#define SPI_INTERFACES_COUNT 2 - -#define PIN_SPI_MISO (8) -#define PIN_SPI_MOSI (32 + 9) -#define PIN_SPI_SCK (11) - -#define PIN_SPI1_MISO (23) -#define PIN_SPI1_MOSI (21) -#define PIN_SPI1_SCK (19) - -static const uint8_t SS = 12; -static const uint8_t MOSI = PIN_SPI_MOSI; -static const uint8_t MISO = PIN_SPI_MISO; -static const uint8_t SCK = PIN_SPI_SCK; - -/* - * eink display pins - */ -#define USE_EINK - -#define PIN_EINK_CS (15) -#define PIN_EINK_BUSY (16) -#define PIN_EINK_DC (14) -#define PIN_EINK_RES (17) -#define PIN_EINK_SCLK (19) -#define PIN_EINK_MOSI (21) // also called SDI - -/* - * Wire Interfaces - */ -#define WIRE_INTERFACES_COUNT 1 - -#define PIN_WIRE_SDA (1) -#define PIN_WIRE_SCL (27) - -// QSPI Pins -#define PIN_QSPI_SCK 19 -#define PIN_QSPI_CS 22 -#define PIN_QSPI_IO0 21 -#define PIN_QSPI_IO1 23 -#define PIN_QSPI_IO2 32 -#define PIN_QSPI_IO3 20 - -// On-board QSPI Flash -#define EXTERNAL_FLASH_DEVICES W25Q16JVUXIQ -#define EXTERNAL_FLASH_USE_QSPI - -#define USE_SX1262 -#define SX126X_CS (12) -#define SX126X_DIO1 (32 + 1) -#define SX126X_BUSY (32 + 3) -#define SX126X_RESET (6) -// #define SX126X_RXEN (13) -// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3 -#define SX126X_DIO2_AS_RF_SWITCH -#define SX126X_DIO3_TCXO_VOLTAGE 1.8 - -// pin 25 is used to enable or disable the watchdog. This pin has to be disabled when cpu is put to sleep -// otherwise the timer will expire and wd will reboot the cpu -#define PIN_WD_EN (25) - -#define PIN_GPS_PPS (26) // Pulse per second input from the GPS - -#define GPS_TX_PIN PIN_SERIAL1_TX // This is for bits going TOWARDS the CPU -#define GPS_RX_PIN PIN_SERIAL1_RX // This is for bits going TOWARDS the GPS - -// #define GPS_THREAD_INTERVAL 50 - -// Define pin to enable GPS toggle (set GPIO to LOW) via user button triple press -#define PIN_GPS_EN (0) -#define GPS_EN_ACTIVE LOW - -#define PIN_BUZZER (31) // P0.31/AIN7 - -// Battery -// The battery sense is hooked to pin A0 (2) -#define BATTERY_PIN (2) -// and has 12 bit resolution -#define BATTERY_SENSE_RESOLUTION_BITS 12 -#define BATTERY_SENSE_RESOLUTION 4096.0 -#undef AREF_VOLTAGE -#define AREF_VOLTAGE 3.0 -#define VBAT_AR_INTERNAL AR_INTERNAL_3_0 -#define ADC_MULTIPLIER 1.42 // fine tuning of voltage - -#ifdef __cplusplus -} -#endif - -/*---------------------------------------------------------------------------- - * Arduino objects - C++ only - *----------------------------------------------------------------------------*/ -#endif \ No newline at end of file diff --git a/variants/nrf52840/nrf52.ini b/variants/nrf52840/nrf52.ini index 2904f770e..87e239876 100644 --- a/variants/nrf52840/nrf52.ini +++ b/variants/nrf52840/nrf52.ini @@ -11,7 +11,7 @@ platform_packages = ; Don't renovate toolchain-gccarmnoneeabi platformio/toolchain-gccarmnoneeabi@~1.90301.0 -build_type = debug +build_type = release build_flags = -include variants/nrf52840/cpp_overrides/lfs_util.h ${arduino_base.build_flags} @@ -21,6 +21,17 @@ build_flags = -DLFS_NO_ASSERT ; Disable LFS assertions , see https://github.com/meshtastic/firmware/pull/3818 -DMESHTASTIC_EXCLUDE_AUDIO=1 -DMESHTASTIC_EXCLUDE_PAXCOUNTER=1 + -Os +build_unflags = + -Ofast + -Og + -ggdb3 + -ggdb2 + -g3 + -g2 + -g + -g1 + -g0 build_src_filter = ${arduino_base.build_src_filter} - - - - - - - - - - - diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 868c17143..0ef661af8 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -12,18 +12,6 @@ build_flags = ${nrf52840_base.build_flags} -DRADIOLIB_EXCLUDE_SX128X=1 -DRADIOLIB_EXCLUDE_SX127X=1 -DRADIOLIB_EXCLUDE_LR11X0=1 - -Os - -Wl,-Map=$BUILD_DIR/output.map -build_unflags = - -Ofast - -Og - -ggdb3 - -ggdb2 - -g3 - -g2 - -g - -g1 - -g0 build_src_filter = ${nrf52_base.build_src_filter} \ +<../variants/nrf52840/rak4631> \ + \ From 6e9fd189b457434f6bbba9ba21469e58a9f429c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 15:33:19 -0600 Subject: [PATCH 223/286] Update meshtastic/device-ui digest to 4fb5f24 (#8862) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 5b9d965ef..f560bd8f5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -121,7 +121,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/3bf332240416c5cb8c919fac2a0ec7260eb3be75.zip + https://github.com/meshtastic/device-ui/archive/4fb5f24787caa841b58dbf623a52c4c5861d6722.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From eeaafda62a0a4cb4f050220f10577fc65af57c58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 10:41:48 -0600 Subject: [PATCH 224/286] Update protobufs (#8871) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/mesh.pb.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/protobufs b/protobufs index 52fa252f1..4095e5989 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 52fa252f1e01be87ad2f7ab17ceef7882b2a4a93 +Subproject commit 4095e598902b4cd893dbcb62842514704d0f64e0 diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h index 46de1dee0..0c48a7891 100644 --- a/src/mesh/generated/meshtastic/mesh.pb.h +++ b/src/mesh/generated/meshtastic/mesh.pb.h @@ -237,8 +237,8 @@ typedef enum _meshtastic_HardwareModel { meshtastic_HardwareModel_T_ETH_ELITE = 91, /* Heltec HRI-3621 industrial probe */ meshtastic_HardwareModel_HELTEC_SENSOR_HUB = 92, - /* Reserved Fried Chicken ID for future use */ - meshtastic_HardwareModel_RESERVED_FRIED_CHICKEN = 93, + /* Muzi Works Muzi-Base device */ + meshtastic_HardwareModel_MUZI_BASE = 93, /* Heltec Magnetic Power Bank with Meshtastic compatible */ meshtastic_HardwareModel_HELTEC_MESH_POCKET = 94, /* Seeed Solar Node */ From 8060134224773a82df18c32179c322fc3458e998 Mon Sep 17 00:00:00 2001 From: Tom <116762865+NomDeTom@users.noreply.github.com> Date: Sat, 6 Dec 2025 02:25:57 +0000 Subject: [PATCH 225/286] promicro doesn't need these. (#8873) --- variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini | 4 ---- 1 file changed, 4 deletions(-) diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini index d7d0c02c8..61a6eda07 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini @@ -5,8 +5,6 @@ board = promicro-nrf52840 build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo -D NRF52_PROMICRO_DIY - -DRADIOLIB_EXCLUDE_SX128X=1 - -DRADIOLIB_EXCLUDE_SX127X=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo> lib_deps = ${nrf52840_base.lib_deps} @@ -22,8 +20,6 @@ build_flags = ${inkhud.build_flags} -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo -D NRF52_PROMICRO_DIY - -DRADIOLIB_EXCLUDE_SX128X=1 - -DRADIOLIB_EXCLUDE_SX127X=1 build_src_filter = ${nrf52_base.build_src_filter} ${inkhud.build_src_filter} From 2a17c3b5d48726fb947e328340c4ea75f5acaf0a Mon Sep 17 00:00:00 2001 From: Clive Blackledge Date: Sat, 6 Dec 2025 16:56:56 -0800 Subject: [PATCH 226/286] Change ARDUINO_USB_MODE from 0 to 1 in the board definition. This switches to the ESP32-S3's Hardware CDC and JTAG mode, which properly handles the reset signals for automatic reboot after firmware updates. (#8881) --- boards/heltec_v4.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/heltec_v4.json b/boards/heltec_v4.json index 8eac3a9b2..9827be83f 100644 --- a/boards/heltec_v4.json +++ b/boards/heltec_v4.json @@ -9,7 +9,7 @@ "extra_flags": [ "-DBOARD_HAS_PSRAM", "-DARDUINO_USB_CDC_ON_BOOT=1", - "-DARDUINO_USB_MODE=0", + "-DARDUINO_USB_MODE=1", "-DARDUINO_RUNNING_CORE=1", "-DARDUINO_EVENT_RUNNING_CORE=1" ], From 2ae391197f7c1fd92bce8f60c75ff3482aab2bbf Mon Sep 17 00:00:00 2001 From: Igor Danilov <59930161+polarikus@users.noreply.github.com> Date: Mon, 8 Dec 2025 00:50:53 +0300 Subject: [PATCH 227/286] Fix #8883 (lora-Pager fter playing the notification, voltage does not disappear from the speaker) (#8884) * Fix #8883 * Fix crash when delete not inicialized rtttlFile --- src/AudioThread.h | 11 +++++++---- src/modules/ExternalNotificationModule.cpp | 3 +-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/AudioThread.h b/src/AudioThread.h index df4892b6e..23552c421 100644 --- a/src/AudioThread.h +++ b/src/AudioThread.h @@ -50,8 +50,11 @@ class AudioThread : public concurrency::OSThread delete i2sRtttl; i2sRtttl = nullptr; } - delete rtttlFile; - rtttlFile = nullptr; + + if (rtttlFile != nullptr) { + delete rtttlFile; + rtttlFile = nullptr; + } setCPUFast(false); #ifdef T_LORA_PAGER @@ -99,9 +102,9 @@ class AudioThread : public concurrency::OSThread }; AudioGeneratorRTTTL *i2sRtttl = nullptr; - AudioOutputI2S *audioOut; + AudioOutputI2S *audioOut = nullptr; - AudioFileSourcePROGMEM *rtttlFile; + AudioFileSourcePROGMEM *rtttlFile = nullptr; }; #endif diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index 91e96b8d4..ecbe71b27 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -310,8 +310,7 @@ void ExternalNotificationModule::stopNow() rtttl::stop(); #ifdef HAS_I2S LOG_INFO("Stop audioThread playback"); - if (audioThread->isPlaying()) - audioThread->stop(); + audioThread->stop(); #endif // Turn off all outputs LOG_INFO("Turning off setExternalStates"); From 94aedff6ae479edb73842b6e188cbe2391136ad4 Mon Sep 17 00:00:00 2001 From: Igor Danilov <59930161+polarikus@users.noreply.github.com> Date: Mon, 8 Dec 2025 05:29:18 +0300 Subject: [PATCH 228/286] Resolve #8887 (T-LoRaPager Vibration on New Message Delivery) (#8888) * Resolve #8887 * Update src/modules/ExternalNotificationModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/ExternalNotificationModule.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * use canBuzz method * trunk fmt --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/modules/ExternalNotificationModule.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index ecbe71b27..38c88457f 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -168,7 +168,7 @@ int32_t ExternalNotificationModule::runOnce() delay = EXT_NOTIFICATION_FAST_THREAD_MS; #endif -#ifdef T_WATCH_S3 +#if defined(T_WATCH_S3) || defined(T_LORA_PAGER) drv.go(); #endif } @@ -541,6 +541,19 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP (!isBroadcast(mp.to) && isToUs(&mp))) { // Buzz if buzzer mode is not in DIRECT_MSG_ONLY or is DM to us isNagging = true; +#ifdef T_LORA_PAGER + if (canBuzz()) { + drv.setWaveform(0, 16); // Long buzzer 100% + drv.setWaveform(1, 0); // Pause + drv.setWaveform(2, 16); + drv.setWaveform(3, 0); + drv.setWaveform(4, 16); + drv.setWaveform(5, 0); + drv.setWaveform(6, 16); + drv.setWaveform(7, 0); + drv.go(); + } +#endif if (!moduleConfig.external_notification.use_pwm && !moduleConfig.external_notification.use_i2s_as_buzzer) { setExternalState(2, true); } else { From eb087849c0734b02a6fe870cbc3b8dc0187b6c07 Mon Sep 17 00:00:00 2001 From: Wilson Date: Mon, 8 Dec 2025 19:40:30 +0800 Subject: [PATCH 229/286] OnScreenKeyboard Improvement with Joystick and UpDown Encoder (#8379) * Add mesh/Default.h include. * Reflacter OnScreenKeyBoard Module, do not interrupt keyboard when new message comes. * feat: Add long press scrolling for Joystick and upDown Encoder on baseUI frames and menus. * refactor: Clean up code formatting and improve readability in Screen and OnScreenKeyboardModule * Fix navigation on UpDownEncoder, default was RotaryEncoder while bringing the T_LORA_PAGER * Update src/graphics/draw/MenuHandler.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/OnScreenKeyboardModule.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/graphics/draw/NotificationRenderer.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Optimize the detection logic for repeated events of the arrow keys. * Fixed parameter names in the OnScreenKeyboardModule::start * Trunk fix * Reflator OnScreenKeyboard Input checking, make it simple * Simplify long press logic in OnScreenKeyboardModule. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/graphics/Screen.cpp | 117 ++++++--- src/graphics/draw/MenuHandler.cpp | 1 + src/graphics/draw/NotificationRenderer.cpp | 84 ++++--- src/graphics/draw/NotificationRenderer.h | 2 + src/input/TrackballInterruptBase.cpp | 65 ++++- src/input/TrackballInterruptBase.h | 6 +- src/input/UpDownInterruptBase.h | 12 +- src/modules/CannedMessageModule.cpp | 11 +- src/modules/Modules.cpp | 16 +- src/modules/OnScreenKeyboardModule.cpp | 272 +++++++++++++++++++++ src/modules/OnScreenKeyboardModule.h | 55 +++++ variants/nrf52840/meshtiny/variant.h | 1 + 12 files changed, 535 insertions(+), 107 deletions(-) create mode 100644 src/modules/OnScreenKeyboardModule.cpp create mode 100644 src/modules/OnScreenKeyboardModule.h diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index c6bbcc4b5..8bac6936a 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -230,24 +230,9 @@ void Screen::showTextInput(const char *header, const char *initialText, uint32_t { LOG_INFO("showTextInput called with header='%s', durationMs=%d", header ? header : "NULL", durationMs); - if (NotificationRenderer::virtualKeyboard) { - delete NotificationRenderer::virtualKeyboard; - NotificationRenderer::virtualKeyboard = nullptr; - } - - NotificationRenderer::textInputCallback = nullptr; - - NotificationRenderer::virtualKeyboard = new VirtualKeyboard(); - if (header) { - NotificationRenderer::virtualKeyboard->setHeader(header); - } - if (initialText) { - NotificationRenderer::virtualKeyboard->setInputText(initialText); - } - - // Set up callback with safer cleanup mechanism + // Start OnScreenKeyboardModule session (non-touch variant) + OnScreenKeyboardModule::instance().start(header, initialText, durationMs, textCallback); NotificationRenderer::textInputCallback = textCallback; - NotificationRenderer::virtualKeyboard->setCallback([textCallback](const std::string &text) { textCallback(text); }); // Store the message and set the expiration timestamp (use same pattern as other notifications) strncpy(NotificationRenderer::alertBannerMessage, header ? header : "Text Input", 255); @@ -1513,14 +1498,14 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) // Incoming message devicestate.has_rx_text_message = true; // Needed to include the message frame hasUnreadMessage = true; // Enables mail icon in the header - setFrames(FOCUS_PRESERVE); // Refresh frame list without switching view + setFrames(FOCUS_PRESERVE); // Refresh frame list without switching view (no-op during text_input) // Only wake/force display if the configuration allows it if (shouldWakeOnReceivedMessage()) { setOn(true); // Wake up the screen first forceDisplay(); // Forces screen redraw } - // === Prepare banner content === + // === Prepare banner/popup content === const meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(packet->from); const meshtastic_Channel channel = channels.getByIndex(packet->channel ? packet->channel : channels.getPrimaryIndex()); @@ -1544,38 +1529,84 @@ int Screen::handleTextMessage(const meshtastic_MeshPacket *packet) // Unlike generic messages, alerts (when enabled via the ext notif module) ignore any // 'mute' preferences set to any specific node or channel. - if (isAlert) { - if (longName && longName[0]) { - snprintf(banner, sizeof(banner), "Alert Received from\n%s", longName); - } else { - strcpy(banner, "Alert Received"); + // If on-screen keyboard is active, show a transient popup over keyboard instead of interrupting it + if (NotificationRenderer::current_notification_type == notificationTypeEnum::text_input) { + // Wake and force redraw so popup is visible immediately + if (shouldWakeOnReceivedMessage()) { + setOn(true); + forceDisplay(); } - screen->showSimpleBanner(banner, 3000); - } else if (!channel.settings.has_module_settings || !channel.settings.module_settings.is_muted) { - if (longName && longName[0]) { -#if defined(M5STACK_UNITC6L) - strcpy(banner, "New Message"); -#else - snprintf(banner, sizeof(banner), "New Message from\n%s", longName); -#endif + // Build popup: title = message source name, content = message text (sanitized) + // Title + char titleBuf[64] = {0}; + if (longName && longName[0]) { + // Sanitize sender name + std::string t = sanitizeString(longName); + strncpy(titleBuf, t.c_str(), sizeof(titleBuf) - 1); } else { - strcpy(banner, "New Message"); + strncpy(titleBuf, "Message", sizeof(titleBuf) - 1); } + + // Content: payload bytes may not be null-terminated, remove ASCII_BELL and sanitize + char content[256] = {0}; + { + std::string raw; + raw.reserve(packet->decoded.payload.size); + for (size_t i = 0; i < packet->decoded.payload.size; ++i) { + char c = msgRaw[i]; + if (c == ASCII_BELL) + continue; // strip bell + raw.push_back(c); + } + std::string sanitized = sanitizeString(raw); + strncpy(content, sanitized.c_str(), sizeof(content) - 1); + } + + NotificationRenderer::showKeyboardMessagePopupWithTitle(titleBuf, content, 3000); + +// Maintain existing buzzer behavior on M5 if applicable #if defined(M5STACK_UNITC6L) - screen->setOn(true); - screen->showSimpleBanner(banner, 1500); if (config.device.buzzer_mode != meshtastic_Config_DeviceConfig_BuzzerMode_DIRECT_MSG_ONLY || (isAlert && moduleConfig.external_notification.alert_bell_buzzer) || (!isBroadcast(packet->to) && isToUs(packet))) { - // Beep if not in DIRECT_MSG_ONLY mode or if in DIRECT_MSG_ONLY mode and either - // - packet contains an alert and alert bell buzzer is enabled - // - packet is a non-broadcast that is addressed to this node playLongBeep(); } -#else - screen->showSimpleBanner(banner, 3000); #endif + } else { + // No keyboard active: use regular banner flow, respecting mute settings + if (isAlert) { + if (longName && longName[0]) { + snprintf(banner, sizeof(banner), "Alert Received from\n%s", longName); + } else { + strcpy(banner, "Alert Received"); + } + screen->showSimpleBanner(banner, 3000); + } else if (!channel.settings.has_module_settings || !channel.settings.module_settings.is_muted) { + if (longName && longName[0]) { +#if defined(M5STACK_UNITC6L) + strcpy(banner, "New Message"); +#else + snprintf(banner, sizeof(banner), "New Message from\n%s", longName); +#endif + } else { + strcpy(banner, "New Message"); + } +#if defined(M5STACK_UNITC6L) + screen->setOn(true); + screen->showSimpleBanner(banner, 1500); + if (config.device.buzzer_mode != meshtastic_Config_DeviceConfig_BuzzerMode_DIRECT_MSG_ONLY || + (isAlert && moduleConfig.external_notification.alert_bell_buzzer) || + (!isBroadcast(packet->to) && isToUs(packet))) { + // Beep if not in DIRECT_MSG_ONLY mode or if in DIRECT_MSG_ONLY mode and either + // - packet contains an alert and alert bell buzzer is enabled + // - packet is a non-broadcast that is addressed to this node + playLongBeep(); + } +#else + screen->showSimpleBanner(banner, 3000); +#endif + } } } } @@ -1658,6 +1689,12 @@ int Screen::handleInputEvent(const InputEvent *event) showPrevFrame(); } else if (event->inputEvent == INPUT_BROKER_RIGHT || event->inputEvent == INPUT_BROKER_USER_PRESS) { showNextFrame(); + } else if (event->inputEvent == INPUT_BROKER_UP_LONG) { + // Long press up button for fast frame switching + showPrevFrame(); + } else if (event->inputEvent == INPUT_BROKER_DOWN_LONG) { + // Long press down button for fast frame switching + showNextFrame(); } else if (event->inputEvent == INPUT_BROKER_SELECT) { if (this->ui->getUiState()->currentFrame == framesetInfo.positions.home) { menuHandler::homeBaseMenu(); diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index bfe3656ce..f782dabb6 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -13,6 +13,7 @@ #include "input/RotaryEncoderInterruptImpl1.h" #include "input/UpDownInterruptImpl1.h" #include "main.h" +#include "mesh/Default.h" #include "mesh/MeshTypes.h" #include "modules/AdminModule.h" #include "modules/CannedMessageModule.h" diff --git a/src/graphics/draw/NotificationRenderer.cpp b/src/graphics/draw/NotificationRenderer.cpp index 26bfe8447..e95cc1610 100644 --- a/src/graphics/draw/NotificationRenderer.cpp +++ b/src/graphics/draw/NotificationRenderer.cpp @@ -85,9 +85,13 @@ void NotificationRenderer::drawSSLScreen(OLEDDisplay *display, OLEDDisplayUiStat void NotificationRenderer::resetBanner() { + notificationTypeEnum previousType = current_notification_type; + alertBannerMessage[0] = '\0'; current_notification_type = notificationTypeEnum::none; + OnScreenKeyboardModule::instance().clearPopup(); + inEvent.inputEvent = INPUT_BROKER_NONE; inEvent.kbchar = 0; curSelected = 0; @@ -100,6 +104,13 @@ void NotificationRenderer::resetBanner() currentNumber = 0; nodeDB->pause_sort(false); + + // If we're exiting from text_input (virtual keyboard), stop module and trigger frame update + // to ensure any messages received during keyboard use are now displayed + if (previousType == notificationTypeEnum::text_input && screen) { + OnScreenKeyboardModule::instance().stop(false); + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } } void NotificationRenderer::drawBannercallback(OLEDDisplay *display, OLEDDisplayUiState *state) @@ -163,13 +174,15 @@ void NotificationRenderer::drawNumberPicker(OLEDDisplay *display, OLEDDisplayUiS // modulo to extract uint8_t this_digit = (currentNumber % (pow_of_10(numDigits - curSelected))) / (pow_of_10(numDigits - curSelected - 1)); // Handle input - if (inEvent.inputEvent == INPUT_BROKER_UP || inEvent.inputEvent == INPUT_BROKER_ALT_PRESS) { + if (inEvent.inputEvent == INPUT_BROKER_UP || inEvent.inputEvent == INPUT_BROKER_ALT_PRESS || + inEvent.inputEvent == INPUT_BROKER_UP_LONG) { if (this_digit == 9) { currentNumber -= 9 * (pow_of_10(numDigits - curSelected - 1)); } else { currentNumber += (pow_of_10(numDigits - curSelected - 1)); } - } else if (inEvent.inputEvent == INPUT_BROKER_DOWN || inEvent.inputEvent == INPUT_BROKER_USER_PRESS) { + } else if (inEvent.inputEvent == INPUT_BROKER_DOWN || inEvent.inputEvent == INPUT_BROKER_USER_PRESS || + inEvent.inputEvent == INPUT_BROKER_DOWN_LONG) { if (this_digit == 0) { currentNumber += 9 * (pow_of_10(numDigits - curSelected - 1)); } else { @@ -251,10 +264,10 @@ void NotificationRenderer::drawNodePicker(OLEDDisplay *display, OLEDDisplayUiSta // Handle input if (inEvent.inputEvent == INPUT_BROKER_UP || inEvent.inputEvent == INPUT_BROKER_LEFT || - inEvent.inputEvent == INPUT_BROKER_ALT_PRESS) { + inEvent.inputEvent == INPUT_BROKER_ALT_PRESS || inEvent.inputEvent == INPUT_BROKER_UP_LONG) { curSelected--; } else if (inEvent.inputEvent == INPUT_BROKER_DOWN || inEvent.inputEvent == INPUT_BROKER_RIGHT || - inEvent.inputEvent == INPUT_BROKER_USER_PRESS) { + inEvent.inputEvent == INPUT_BROKER_USER_PRESS || inEvent.inputEvent == INPUT_BROKER_DOWN_LONG) { curSelected++; } else if (inEvent.inputEvent == INPUT_BROKER_SELECT) { alertBannerCallback(selectedNodenum); @@ -368,10 +381,10 @@ void NotificationRenderer::drawAlertBannerOverlay(OLEDDisplay *display, OLEDDisp // Handle input if (alertBannerOptions > 0) { if (inEvent.inputEvent == INPUT_BROKER_UP || inEvent.inputEvent == INPUT_BROKER_LEFT || - inEvent.inputEvent == INPUT_BROKER_ALT_PRESS) { + inEvent.inputEvent == INPUT_BROKER_ALT_PRESS || inEvent.inputEvent == INPUT_BROKER_UP_LONG) { curSelected--; } else if (inEvent.inputEvent == INPUT_BROKER_DOWN || inEvent.inputEvent == INPUT_BROKER_RIGHT || - inEvent.inputEvent == INPUT_BROKER_USER_PRESS) { + inEvent.inputEvent == INPUT_BROKER_USER_PRESS || inEvent.inputEvent == INPUT_BROKER_DOWN_LONG) { curSelected++; } else if (inEvent.inputEvent == INPUT_BROKER_SELECT) { if (optionsEnumPtr != nullptr) { @@ -769,40 +782,8 @@ void NotificationRenderer::drawTextInput(OLEDDisplay *display, OLEDDisplayUiStat } if (inEvent.inputEvent != INPUT_BROKER_NONE) { - if (inEvent.inputEvent == INPUT_BROKER_UP) { - // high frequency for move cursor left/right than up/down with encoders - extern ::RotaryEncoderInterruptImpl1 *rotaryEncoderInterruptImpl1; - extern ::UpDownInterruptImpl1 *upDownInterruptImpl1; - if (::rotaryEncoderInterruptImpl1 || ::upDownInterruptImpl1) { - virtualKeyboard->moveCursorLeft(); - } else { - virtualKeyboard->moveCursorUp(); - } - } else if (inEvent.inputEvent == INPUT_BROKER_DOWN) { - extern ::RotaryEncoderInterruptImpl1 *rotaryEncoderInterruptImpl1; - extern ::UpDownInterruptImpl1 *upDownInterruptImpl1; - if (::rotaryEncoderInterruptImpl1 || ::upDownInterruptImpl1) { - virtualKeyboard->moveCursorRight(); - } else { - virtualKeyboard->moveCursorDown(); - } - } else if (inEvent.inputEvent == INPUT_BROKER_LEFT) { - virtualKeyboard->moveCursorLeft(); - } else if (inEvent.inputEvent == INPUT_BROKER_RIGHT) { - virtualKeyboard->moveCursorRight(); - } else if (inEvent.inputEvent == INPUT_BROKER_UP_LONG) { - virtualKeyboard->moveCursorUp(); - } else if (inEvent.inputEvent == INPUT_BROKER_DOWN_LONG) { - virtualKeyboard->moveCursorDown(); - } else if (inEvent.inputEvent == INPUT_BROKER_ALT_PRESS) { - virtualKeyboard->moveCursorLeft(); - } else if (inEvent.inputEvent == INPUT_BROKER_USER_PRESS) { - virtualKeyboard->moveCursorRight(); - } else if (inEvent.inputEvent == INPUT_BROKER_SELECT) { - virtualKeyboard->handlePress(); - } else if (inEvent.inputEvent == INPUT_BROKER_SELECT_LONG) { - virtualKeyboard->handleLongPress(); - } else if (inEvent.inputEvent == INPUT_BROKER_CANCEL) { + bool handled = OnScreenKeyboardModule::processVirtualKeyboardInput(inEvent, virtualKeyboard); + if (!handled && inEvent.inputEvent == INPUT_BROKER_CANCEL) { auto callback = textInputCallback; delete virtualKeyboard; virtualKeyboard = nullptr; @@ -821,12 +802,28 @@ void NotificationRenderer::drawTextInput(OLEDDisplay *display, OLEDDisplayUiStat inEvent.inputEvent = INPUT_BROKER_NONE; } + // Re-check pointer before drawing to avoid use-after-free and crashes + if (!virtualKeyboard) { + // Ensure we exit text_input state and restore frames + if (current_notification_type == notificationTypeEnum::text_input) { + resetBanner(); + } + if (screen) { + screen->setFrames(graphics::Screen::FOCUS_PRESERVE); + } + // If screen is null, do nothing (safe fallback) + return; + } + // Clear the screen to avoid overlapping with underlying frames or overlays display->setColor(BLACK); display->fillRect(0, 0, display->getWidth(), display->getHeight()); display->setColor(WHITE); // Draw the virtual keyboard virtualKeyboard->draw(display, 0, 0); + + // Draw transient popup overlay (if any) managed by OnScreenKeyboardModule + OnScreenKeyboardModule::instance().drawPopupOverlay(display); } else { // If virtualKeyboard is null, reset the banner to avoid getting stuck LOG_INFO("Virtual keyboard is null - resetting banner"); @@ -839,5 +836,12 @@ bool NotificationRenderer::isOverlayBannerShowing() return strlen(alertBannerMessage) > 0 && (alertBannerUntil == 0 || millis() <= alertBannerUntil); } +void NotificationRenderer::showKeyboardMessagePopupWithTitle(const char *title, const char *content, uint32_t durationMs) +{ + if (!title || !content || current_notification_type != notificationTypeEnum::text_input) + return; + OnScreenKeyboardModule::instance().showPopup(title, content, durationMs); +} + } // namespace graphics #endif \ No newline at end of file diff --git a/src/graphics/draw/NotificationRenderer.h b/src/graphics/draw/NotificationRenderer.h index edb069513..e51bfa5ab 100644 --- a/src/graphics/draw/NotificationRenderer.h +++ b/src/graphics/draw/NotificationRenderer.h @@ -4,6 +4,7 @@ #include "OLEDDisplayUi.h" #include "graphics/Screen.h" #include "graphics/VirtualKeyboard.h" +#include "modules/OnScreenKeyboardModule.h" #include #include #define MAX_LINES 5 @@ -31,6 +32,7 @@ class NotificationRenderer static bool pauseBanner; static void resetBanner(); + static void showKeyboardMessagePopupWithTitle(const char *title, const char *content, uint32_t durationMs); static void drawBannercallback(OLEDDisplay *display, OLEDDisplayUiState *state); static void drawAlertBannerOverlay(OLEDDisplay *display, OLEDDisplayUiState *state); static void drawNumberPicker(OLEDDisplay *display, OLEDDisplayUiState *state); diff --git a/src/input/TrackballInterruptBase.cpp b/src/input/TrackballInterruptBase.cpp index 4ddaf7064..d2025c192 100644 --- a/src/input/TrackballInterruptBase.cpp +++ b/src/input/TrackballInterruptBase.cpp @@ -88,6 +88,50 @@ int32_t TrackballInterruptBase::runOnce() } } + if (directionDetected && directionStartTime > 0) { + uint32_t directionDuration = millis() - directionStartTime; + uint8_t directionPressedNow = 0; + directionInterval++; + + if (!digitalRead(_pinUp)) { + directionPressedNow = TB_ACTION_UP; + } else if (!digitalRead(_pinDown)) { + directionPressedNow = TB_ACTION_DOWN; + } else if (!digitalRead(_pinLeft)) { + directionPressedNow = TB_ACTION_LEFT; + } else if (!digitalRead(_pinRight)) { + directionPressedNow = TB_ACTION_RIGHT; + } + + const uint8_t DIRECTION_REPEAT_THRESHOLD = 3; + + if (directionPressedNow == TB_ACTION_NONE) { + // Reset state + directionDetected = false; + directionStartTime = 0; + directionInterval = 0; + this->action = TB_ACTION_NONE; + } else if (directionDuration >= LONG_PRESS_DURATION && directionInterval >= DIRECTION_REPEAT_THRESHOLD) { + // repeat event when long press these direction. + switch (directionPressedNow) { + case TB_ACTION_UP: + e.inputEvent = this->_eventUp; + break; + case TB_ACTION_DOWN: + e.inputEvent = this->_eventDown; + break; + case TB_ACTION_LEFT: + e.inputEvent = this->_eventLeft; + break; + case TB_ACTION_RIGHT: + e.inputEvent = this->_eventRight; + break; + } + + directionInterval = 0; + } + } + #if defined(T_DECK) // T-deck gets a super-simple debounce on trackball if (this->action == TB_ACTION_PRESSED && !pressDetected) { // Start long press detection @@ -113,17 +157,22 @@ int32_t TrackballInterruptBase::runOnce() pressDetected = true; pressStartTime = millis(); // Don't send event yet, wait to see if it's a long press - } else if (this->action == TB_ACTION_UP && !digitalRead(_pinUp)) { - // LOG_DEBUG("Trackball event UP"); + } else if (this->action == TB_ACTION_UP && !digitalRead(_pinUp) && !directionDetected) { + directionDetected = true; + directionStartTime = millis(); e.inputEvent = this->_eventUp; - } else if (this->action == TB_ACTION_DOWN && !digitalRead(_pinDown)) { - // LOG_DEBUG("Trackball event DOWN"); + // send event first,will automatically trigger every 50ms * 3 after 500ms + } else if (this->action == TB_ACTION_DOWN && !digitalRead(_pinDown) && !directionDetected) { + directionDetected = true; + directionStartTime = millis(); e.inputEvent = this->_eventDown; - } else if (this->action == TB_ACTION_LEFT && !digitalRead(_pinLeft)) { - // LOG_DEBUG("Trackball event LEFT"); + } else if (this->action == TB_ACTION_LEFT && !digitalRead(_pinLeft) && !directionDetected) { + directionDetected = true; + directionStartTime = millis(); e.inputEvent = this->_eventLeft; - } else if (this->action == TB_ACTION_RIGHT && !digitalRead(_pinRight)) { - // LOG_DEBUG("Trackball event RIGHT"); + } else if (this->action == TB_ACTION_RIGHT && !digitalRead(_pinRight) && !directionDetected) { + directionDetected = true; + directionStartTime = millis(); e.inputEvent = this->_eventRight; } #endif diff --git a/src/input/TrackballInterruptBase.h b/src/input/TrackballInterruptBase.h index 76a99f33d..67d4ee449 100644 --- a/src/input/TrackballInterruptBase.h +++ b/src/input/TrackballInterruptBase.h @@ -49,10 +49,14 @@ class TrackballInterruptBase : public Observable, public con // Long press detection for press button uint32_t pressStartTime = 0; + uint32_t directionStartTime = 0; + uint8_t directionInterval = 0; bool pressDetected = false; + bool directionDetected = false; uint32_t lastLongPressEventTime = 0; + uint32_t lastDirectionPressEventTime = 0; static const uint32_t LONG_PRESS_DURATION = 500; // ms - static const uint32_t LONG_PRESS_REPEAT_INTERVAL = 500; // ms - interval between repeated long press events + static const uint32_t LONG_PRESS_REPEAT_INTERVAL = 300; // ms - interval between repeated long press events private: input_broker_event _eventDown = INPUT_BROKER_NONE; diff --git a/src/input/UpDownInterruptBase.h b/src/input/UpDownInterruptBase.h index ae84efdaf..2b9d38c83 100644 --- a/src/input/UpDownInterruptBase.h +++ b/src/input/UpDownInterruptBase.h @@ -3,6 +3,14 @@ #include "InputBroker.h" #include "mesh/NodeDB.h" +#ifndef UPDOWN_LONG_PRESS_DURATION +#define UPDOWN_LONG_PRESS_DURATION 300 +#endif + +#ifndef UPDOWN_LONG_PRESS_REPEAT_INTERVAL +#define UPDOWN_LONG_PRESS_REPEAT_INTERVAL 300 +#endif + class UpDownInterruptBase : public Observable, public concurrency::OSThread { public: @@ -40,8 +48,8 @@ class UpDownInterruptBase : public Observable, public concur uint32_t lastPressLongEventTime = 0; uint32_t lastUpLongEventTime = 0; uint32_t lastDownLongEventTime = 0; - static const uint32_t LONG_PRESS_DURATION = 300; - static const uint32_t LONG_PRESS_REPEAT_INTERVAL = 300; + static const uint32_t LONG_PRESS_DURATION = UPDOWN_LONG_PRESS_DURATION; + static const uint32_t LONG_PRESS_REPEAT_INTERVAL = UPDOWN_LONG_PRESS_REPEAT_INTERVAL; private: uint8_t _pinDown = 0; diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 9433c0a9e..73ee26903 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -1018,8 +1018,7 @@ int32_t CannedMessageModule::runOnce() // Clean up virtual keyboard if needed when going inactive if (graphics::NotificationRenderer::virtualKeyboard && graphics::NotificationRenderer::textInputCallback == nullptr) { LOG_INFO("Performing delayed virtual keyboard cleanup"); - delete graphics::NotificationRenderer::virtualKeyboard; - graphics::NotificationRenderer::virtualKeyboard = nullptr; + graphics::OnScreenKeyboardModule::instance().stop(false); } temporaryMessage = ""; @@ -1036,9 +1035,7 @@ int32_t CannedMessageModule::runOnce() // Clean up virtual keyboard after sending if (graphics::NotificationRenderer::virtualKeyboard) { LOG_INFO("Cleaning up virtual keyboard after message send"); - delete graphics::NotificationRenderer::virtualKeyboard; - graphics::NotificationRenderer::virtualKeyboard = nullptr; - graphics::NotificationRenderer::textInputCallback = nullptr; + graphics::OnScreenKeyboardModule::instance().stop(false); graphics::NotificationRenderer::resetBanner(); } @@ -1096,9 +1093,7 @@ int32_t CannedMessageModule::runOnce() // Clean up virtual keyboard if it exists during timeout if (graphics::NotificationRenderer::virtualKeyboard) { LOG_INFO("Cleaning up virtual keyboard due to module timeout"); - delete graphics::NotificationRenderer::virtualKeyboard; - graphics::NotificationRenderer::virtualKeyboard = nullptr; - graphics::NotificationRenderer::textInputCallback = nullptr; + graphics::OnScreenKeyboardModule::instance().stop(false); graphics::NotificationRenderer::resetBanner(); } diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index 827524fc3..f918d630f 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -181,25 +181,25 @@ void setupModules() // new ReplyModule(); #if (HAS_BUTTON || ARCH_PORTDUINO) && !MESHTASTIC_EXCLUDE_INPUTBROKER if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { -#ifndef T_LORA_PAGER - rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1(); - if (!rotaryEncoderInterruptImpl1->init()) { - delete rotaryEncoderInterruptImpl1; - rotaryEncoderInterruptImpl1 = nullptr; - } -#elif defined(T_LORA_PAGER) +#if defined(T_LORA_PAGER) // use a special FSM based rotary encoder version for T-LoRa Pager rotaryEncoderImpl = new RotaryEncoderImpl(); if (!rotaryEncoderImpl->init()) { delete rotaryEncoderImpl; rotaryEncoderImpl = nullptr; } -#else +#elif defined(INPUTDRIVER_ENCODER_TYPE) && (INPUTDRIVER_ENCODER_TYPE == 2) upDownInterruptImpl1 = new UpDownInterruptImpl1(); if (!upDownInterruptImpl1->init()) { delete upDownInterruptImpl1; upDownInterruptImpl1 = nullptr; } +#else + rotaryEncoderInterruptImpl1 = new RotaryEncoderInterruptImpl1(); + if (!rotaryEncoderInterruptImpl1->init()) { + delete rotaryEncoderInterruptImpl1; + rotaryEncoderInterruptImpl1 = nullptr; + } #endif cardKbI2cImpl = new CardKbI2cImpl(); cardKbI2cImpl->init(); diff --git a/src/modules/OnScreenKeyboardModule.cpp b/src/modules/OnScreenKeyboardModule.cpp new file mode 100644 index 000000000..e75d926bf --- /dev/null +++ b/src/modules/OnScreenKeyboardModule.cpp @@ -0,0 +1,272 @@ +#include "configuration.h" +#if HAS_SCREEN + +#include "graphics/SharedUIDisplay.h" +#include "graphics/draw/NotificationRenderer.h" +#include "input/RotaryEncoderInterruptImpl1.h" +#include "input/UpDownInterruptImpl1.h" +#include "modules/OnScreenKeyboardModule.h" +#include +#include + +namespace graphics +{ + +OnScreenKeyboardModule &OnScreenKeyboardModule::instance() +{ + static OnScreenKeyboardModule inst; + return inst; +} + +OnScreenKeyboardModule::~OnScreenKeyboardModule() +{ + if (keyboard) { + delete keyboard; + keyboard = nullptr; + } +} + +void OnScreenKeyboardModule::start(const char *header, const char *initialText, uint32_t durationMs, + std::function cb) +{ + if (keyboard) { + delete keyboard; + keyboard = nullptr; + } + keyboard = new VirtualKeyboard(); + callback = cb; + if (header) + keyboard->setHeader(header); + if (initialText) + keyboard->setInputText(initialText); + + // Route VK submission/cancel events back into the module + keyboard->setCallback([this](const std::string &text) { + if (text.empty()) { + this->onCancel(); + } else { + this->onSubmit(text); + } + }); + + // Maintain legacy compatibility hooks + NotificationRenderer::virtualKeyboard = keyboard; + NotificationRenderer::textInputCallback = callback; +} + +void OnScreenKeyboardModule::stop(bool callEmptyCallback) +{ + auto cb = callback; + callback = nullptr; + if (keyboard) { + delete keyboard; + keyboard = nullptr; + } + // Keep NotificationRenderer legacy pointers in sync + NotificationRenderer::virtualKeyboard = nullptr; + NotificationRenderer::textInputCallback = nullptr; + clearPopup(); + if (callEmptyCallback && cb) + cb(""); +} + +void OnScreenKeyboardModule::handleInput(const InputEvent &event) +{ + if (!keyboard) + return; + + if (processVirtualKeyboardInput(event, keyboard)) + return; + + if (event.inputEvent == INPUT_BROKER_CANCEL) + onCancel(); +} + +bool OnScreenKeyboardModule::processVirtualKeyboardInput(const InputEvent &event, VirtualKeyboard *targetKeyboard) +{ + if (!targetKeyboard) + return false; + + switch (event.inputEvent) { + case INPUT_BROKER_UP: + case INPUT_BROKER_UP_LONG: + targetKeyboard->moveCursorUp(); + return true; + case INPUT_BROKER_DOWN: + case INPUT_BROKER_DOWN_LONG: + targetKeyboard->moveCursorDown(); + return true; + case INPUT_BROKER_LEFT: + case INPUT_BROKER_ALT_PRESS: + targetKeyboard->moveCursorLeft(); + return true; + case INPUT_BROKER_RIGHT: + case INPUT_BROKER_USER_PRESS: + targetKeyboard->moveCursorRight(); + return true; + case INPUT_BROKER_SELECT: + targetKeyboard->handlePress(); + return true; + case INPUT_BROKER_SELECT_LONG: + targetKeyboard->handleLongPress(); + return true; + default: + return false; + } +} + +bool OnScreenKeyboardModule::draw(OLEDDisplay *display) +{ + if (!keyboard) + return false; + + // Timeout + if (keyboard->isTimedOut()) { + onCancel(); + return false; + } + + // Clear full screen behind keyboard + display->setColor(BLACK); + display->fillRect(0, 0, display->getWidth(), display->getHeight()); + display->setColor(WHITE); + keyboard->draw(display, 0, 0); + + // Draw popup overlay if needed + drawPopup(display); + return true; +} + +void OnScreenKeyboardModule::onSubmit(const std::string &text) +{ + auto cb = callback; + stop(false); + if (cb) + cb(text); +} + +void OnScreenKeyboardModule::onCancel() +{ + stop(true); +} + +void OnScreenKeyboardModule::showPopup(const char *title, const char *content, uint32_t durationMs) +{ + if (!title || !content) + return; + strncpy(popupTitle, title, sizeof(popupTitle) - 1); + popupTitle[sizeof(popupTitle) - 1] = '\0'; + strncpy(popupMessage, content, sizeof(popupMessage) - 1); + popupMessage[sizeof(popupMessage) - 1] = '\0'; + popupUntil = millis() + durationMs; + popupVisible = true; +} + +void OnScreenKeyboardModule::clearPopup() +{ + popupTitle[0] = '\0'; + popupMessage[0] = '\0'; + popupUntil = 0; + popupVisible = false; +} + +void OnScreenKeyboardModule::drawPopupOverlay(OLEDDisplay *display) +{ + // Only render the popup overlay (without drawing the keyboard) + drawPopup(display); +} + +void OnScreenKeyboardModule::drawPopup(OLEDDisplay *display) +{ + if (!popupVisible) + return; + if (millis() > popupUntil || popupMessage[0] == '\0') { + popupVisible = false; + return; + } + + // Build lines and leverage NotificationRenderer inverted box drawing for consistent style + constexpr uint16_t maxContentLines = 3; + const bool hasTitle = popupTitle[0] != '\0'; + + display->setFont(FONT_SMALL); + display->setTextAlignment(TEXT_ALIGN_LEFT); + const uint16_t maxWrapWidth = display->width() - 40; + + auto wrapText = [&](const char *text, uint16_t availableWidth) -> std::vector { + std::vector wrapped; + std::string current; + std::string word; + const char *p = text; + while (*p && wrapped.size() < maxContentLines) { + while (*p && (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')) { + if (*p == '\n') { + if (!current.empty()) { + wrapped.push_back(current); + current.clear(); + if (wrapped.size() >= maxContentLines) + break; + } + } + ++p; + } + if (!*p || wrapped.size() >= maxContentLines) + break; + word.clear(); + while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '\r') + word += *p++; + if (word.empty()) + continue; + std::string test = current.empty() ? word : (current + " " + word); + uint16_t w = display->getStringWidth(test.c_str(), test.length(), true); + if (w <= availableWidth) + current = test; + else { + if (!current.empty()) { + wrapped.push_back(current); + current = word; + if (wrapped.size() >= maxContentLines) + break; + } else { + current = word; + while (current.size() > 1 && + display->getStringWidth(current.c_str(), current.length(), true) > availableWidth) + current.pop_back(); + } + } + } + if (!current.empty() && wrapped.size() < maxContentLines) + wrapped.push_back(current); + return wrapped; + }; + + std::vector allLines; + if (hasTitle) + allLines.emplace_back(popupTitle); + + char buf[sizeof(popupMessage)]; + strncpy(buf, popupMessage, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; + char *paragraph = strtok(buf, "\n"); + while (paragraph && allLines.size() < maxContentLines + (hasTitle ? 1 : 0)) { + auto wrapped = wrapText(paragraph, maxWrapWidth); + for (const auto &ln : wrapped) { + if (allLines.size() >= maxContentLines + (hasTitle ? 1 : 0)) + break; + allLines.push_back(ln); + } + paragraph = strtok(nullptr, "\n"); + } + + std::vector ptrs; + for (const auto &ln : allLines) + ptrs.push_back(ln.c_str()); + ptrs.push_back(nullptr); + + // Use the standard notification box drawing from NotificationRenderer + NotificationRenderer::drawNotificationBox(display, nullptr, ptrs.data(), allLines.size(), 0, 0); +} + +} // namespace graphics + +#endif // HAS_SCREEN diff --git a/src/modules/OnScreenKeyboardModule.h b/src/modules/OnScreenKeyboardModule.h new file mode 100644 index 000000000..f86b71ec3 --- /dev/null +++ b/src/modules/OnScreenKeyboardModule.h @@ -0,0 +1,55 @@ +#pragma once + +#include "configuration.h" +#if HAS_SCREEN + +#include "graphics/Screen.h" // InputEvent +#include "graphics/VirtualKeyboard.h" +#include +#include +#include + +namespace graphics +{ +class OnScreenKeyboardModule +{ + public: + static OnScreenKeyboardModule &instance(); + + void start(const char *header, const char *initialText, uint32_t durationMs, + std::function callback); + + void stop(bool callEmptyCallback); + + void handleInput(const InputEvent &event); + static bool processVirtualKeyboardInput(const InputEvent &event, VirtualKeyboard *keyboard); + bool draw(OLEDDisplay *display); + + void showPopup(const char *title, const char *content, uint32_t durationMs); + void clearPopup(); + // Draw only the popup overlay (used when legacy virtualKeyboard draws the keyboard) + void drawPopupOverlay(OLEDDisplay *display); + + private: + OnScreenKeyboardModule() = default; + ~OnScreenKeyboardModule(); + OnScreenKeyboardModule(const OnScreenKeyboardModule &) = delete; + OnScreenKeyboardModule &operator=(const OnScreenKeyboardModule &) = delete; + + void onSubmit(const std::string &text); + void onCancel(); + + void drawPopup(OLEDDisplay *display); + + VirtualKeyboard *keyboard = nullptr; + std::function callback; + + char popupTitle[64] = {0}; + char popupMessage[256] = {0}; + uint32_t popupUntil = 0; + bool popupVisible = false; +}; + +} // namespace graphics + +#endif // HAS_SCREEN diff --git a/variants/nrf52840/meshtiny/variant.h b/variants/nrf52840/meshtiny/variant.h index 55aabe930..8d634ba60 100644 --- a/variants/nrf52840/meshtiny/variant.h +++ b/variants/nrf52840/meshtiny/variant.h @@ -64,6 +64,7 @@ extern "C" { #define INPUTDRIVER_ENCODER_UP 26 #define INPUTDRIVER_ENCODER_DOWN 4 #define INPUTDRIVER_ENCODER_BTN 28 +#define UPDOWN_LONG_PRESS_REPEAT_INTERVAL 150 #define CANNED_MESSAGE_MODULE_ENABLE 1 From 4b2f241478382b6583a05c4b3b0c2e8dd90aba0f Mon Sep 17 00:00:00 2001 From: Igor Danilov <59930161+polarikus@users.noreply.github.com> Date: Mon, 8 Dec 2025 15:03:20 +0300 Subject: [PATCH 230/286] Disable vibration if needed (#8895) --- src/modules/ExternalNotificationModule.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index 38c88457f..6d52a3e46 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -283,7 +283,7 @@ void ExternalNotificationModule::setExternalState(uint8_t index, bool on) #ifdef UNPHONE unphone.rgb(red, green, blue); #endif -#ifdef T_WATCH_S3 +#if defined(T_WATCH_S3) || defined(T_LORA_PAGER) if (on) { drv.go(); } else { @@ -319,7 +319,7 @@ void ExternalNotificationModule::stopNow() externalTurnedOn[i] = 0; } setIntervalFromNow(0); -#ifdef T_WATCH_S3 +#if defined(T_WATCH_S3) || defined(T_LORA_PAGER) drv.stop(); #endif From bd4bcb94f0db9f1a7770910612610a4d9b19c2a0 Mon Sep 17 00:00:00 2001 From: Manuel <71137295+mverch67@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:14:24 +0100 Subject: [PATCH 231/286] tryfix eink parameters (#8898) --- variants/esp32s3/tlora_t3s3_epaper/platformio.ini | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini index eca052f57..82bab453d 100644 --- a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini +++ b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini @@ -13,7 +13,10 @@ build_flags = -DEINK_WIDTH=250 -DEINK_HEIGHT=122 -DUSE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk - -DEINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted + -DEINK_LIMIT_FASTREFRESH=20 ; How many consecutive fast-refreshes are permitted //20 + -DEINK_LIMIT_RATE_BACKGROUND_SEC=30 ; Minimum interval between BACKGROUND updates //30 + -DEINK_LIMIT_RATE_RESPONSIVE_SEC=1 ; Minimum interval between RESPONSIVE updates + -DEINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached. lib_deps = ${esp32s3_base.lib_deps} From 5671e9d96f76dc2310911864618b74cdcac196f8 Mon Sep 17 00:00:00 2001 From: simon-muzi Date: Mon, 8 Dec 2025 14:50:05 -0500 Subject: [PATCH 232/286] Improved R1 Neo & muzi-base buzzer beeps for GPS on/off (#8870) Matched the resonant frequency of the hardware buzzer to maximize volume for the turn on beep. Further distinguished ON beep from OFF beep, making it easier for users to understand the state change. --- src/buzz/buzz.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/buzz/buzz.cpp b/src/buzz/buzz.cpp index b0d162a44..aa8346585 100644 --- a/src/buzz/buzz.cpp +++ b/src/buzz/buzz.cpp @@ -16,6 +16,7 @@ struct ToneDuration { }; // Some common frequencies. +#define NOTE_SILENT 1 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 @@ -29,11 +30,16 @@ struct ToneDuration { #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_CS4 277 +#define NOTE_B4 494 +#define NOTE_F5 698 +#define NOTE_G6 1568 +#define NOTE_E7 2637 +const int DURATION_1_16 = 62; // 1/16 note const int DURATION_1_8 = 125; // 1/8 note const int DURATION_1_4 = 250; // 1/4 note const int DURATION_1_2 = 500; // 1/2 note -const int DURATION_3_4 = 750; // 1/4 note +const int DURATION_3_4 = 750; // 3/4 note const int DURATION_1_1 = 1000; // 1/1 note void playTones(const ToneDuration *tone_durations, int size) @@ -71,13 +77,24 @@ void playLongBeep() void playGPSEnableBeep() { +#if defined(R1_NEO) || defined(MUZI_BASE) + ToneDuration melody[] = { + {NOTE_F5, DURATION_1_2}, {NOTE_G6, DURATION_1_8}, {NOTE_E7, DURATION_1_4}, {NOTE_SILENT, DURATION_1_2}}; +#else ToneDuration melody[] = {{NOTE_C3, DURATION_1_8}, {NOTE_FS3, DURATION_1_4}, {NOTE_CS4, DURATION_1_4}}; +#endif playTones(melody, sizeof(melody) / sizeof(ToneDuration)); } void playGPSDisableBeep() { +#if defined(R1_NEO) || defined(MUZI_BASE) + ToneDuration melody[] = {{NOTE_B4, DURATION_1_16}, {NOTE_B4, DURATION_1_16}, {NOTE_SILENT, DURATION_1_8}, + {NOTE_F3, DURATION_1_16}, {NOTE_F3, DURATION_1_16}, {NOTE_SILENT, DURATION_1_8}, + {NOTE_C3, DURATION_1_1}, {NOTE_SILENT, DURATION_1_1}}; +#else ToneDuration melody[] = {{NOTE_CS4, DURATION_1_8}, {NOTE_FS3, DURATION_1_4}, {NOTE_C3, DURATION_1_4}}; +#endif playTones(melody, sizeof(melody) / sizeof(ToneDuration)); } From 66ff1536f361db2b736c00c7b074dc7d3104241b Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 8 Dec 2025 18:21:23 -0500 Subject: [PATCH 233/286] Meshtastic build manifest (#8248) --- .clusterfuzzlite/build.sh | 2 +- .github/actions/build-variant/action.yml | 2 +- .github/workflows/build_firmware.yml | 18 +- .github/workflows/build_one_target.yml | 2 +- .github/workflows/main_matrix.yml | 42 +++-- .github/workflows/merge_queue.yml | 11 +- .github/workflows/pr_tests.yml | 2 +- .github/workflows/test_native.yml | 14 +- .github/workflows/tests.yml | 2 +- bin/build-esp32.sh | 29 ++-- bin/build-native.sh | 12 +- bin/build-nrf52.sh | 49 +++--- bin/build-rp2xx0.sh | 19 ++- bin/build-stm32wl.sh | 19 ++- bin/device-install.bat | 154 +++++------------- bin/device-install.sh | 152 +++++------------ bin/device-update.bat | 10 +- bin/device-update.sh | 4 +- bin/native-gdbserver.sh | 2 +- bin/native-run.sh | 2 +- bin/platformio-custom.py | 147 ++++++++--------- bin/platformio-pre.py | 16 ++ bin/test-simulator.sh | 2 +- debian/rules | 1 - extra_scripts/disable_adafruit_usb.py | 3 +- extra_scripts/esp32_extra.py | 80 +++++++++ extra_scripts/esp32_pre.py | 73 +++++++++ extra_scripts/nrf52_extra.py | 50 ++++++ .../{extra_stm32.py => stm32_extra.py} | 2 + meshtasticd.spec.rpkg | 2 +- platformio.ini | 4 +- variants/esp32/esp32.ini | 6 + variants/native/portduino/platformio.ini | 2 +- variants/nrf52840/nrf52.ini | 4 + .../nrf52840/wio-sdk-wm1110/platformio.ini | 2 +- variants/stm32/stm32.ini | 2 +- 36 files changed, 537 insertions(+), 406 deletions(-) create mode 100644 bin/platformio-pre.py create mode 100755 extra_scripts/esp32_extra.py create mode 100755 extra_scripts/esp32_pre.py create mode 100755 extra_scripts/nrf52_extra.py rename extra_scripts/{extra_stm32.py => stm32_extra.py} (95%) diff --git a/.clusterfuzzlite/build.sh b/.clusterfuzzlite/build.sh index 10a2db0bd..86ab775f9 100644 --- a/.clusterfuzzlite/build.sh +++ b/.clusterfuzzlite/build.sh @@ -51,7 +51,7 @@ for f in .clusterfuzzlite/*_fuzzer.cpp; do fuzzer=$(basename "$f" .cpp) cp -f "$f" src/fuzzer.cpp pio run -vvv --environment "$PIO_ENV" - program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/program" + program="$PLATFORMIO_WORKSPACE_DIR/build/$PIO_ENV/meshtasticd" cp "$program" "$OUT/$fuzzer" # Copy shared libraries used by the fuzzer. diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml index a71ddfc4d..a1e8dd852 100644 --- a/.github/actions/build-variant/action.yml +++ b/.github/actions/build-variant/action.yml @@ -102,7 +102,7 @@ runs: - name: Store binaries as an artifact uses: actions/upload-artifact@v5 with: - name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip + name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }} overwrite: true path: | ${{ inputs.artifact-paths }} diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index 9ac84c23e..c3b70d4c9 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -55,15 +55,29 @@ jobs: ota_firmware_source: ${{ steps.ota_dir.outputs.src || '' }} ota_firmware_target: ${{ steps.ota_dir.outputs.tgt || '' }} + - name: Echo manifest from release/firmware-*.mt.json to job summary + if: ${{ always() }} + env: + PIO_ENV: ${{ inputs.pio_env }} + run: | + echo "## Manifest: \`$PIO_ENV\`" >> $GITHUB_STEP_SUMMARY + echo '```json' >> $GITHUB_STEP_SUMMARY + cat release/firmware-*.mt.json >> $GITHUB_STEP_SUMMARY + echo '' >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + - name: Store binaries as an artifact uses: actions/upload-artifact@v5 id: upload with: - name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }}.zip + name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }} overwrite: true path: | + release/*.mt.json release/*.bin release/*.elf release/*.uf2 release/*.hex - release/*-ota.zip + release/*.zip + release/device-*.sh + release/device-*.bat diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index e4b332a06..02aad5a9c 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -119,7 +119,7 @@ jobs: ./firmware-*.bin ./firmware-*.uf2 ./firmware-*.hex - ./firmware-*-ota.zip + ./firmware-*.zip ./device-*.sh ./device-*.bat ./littlefs-*.bin diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index 38373a2fc..b4f4c3d11 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -177,19 +177,17 @@ jobs: - name: Display structure of downloaded files run: ls -R - - name: Move files up - run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - - name: Repackage in single firmware zip uses: actions/upload-artifact@v5 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true path: | + ./firmware-*.mt.json ./firmware-*.bin ./firmware-*.uf2 ./firmware-*.hex - ./firmware-*-ota.zip + ./firmware-*.zip ./device-*.sh ./device-*.bat ./littlefs-*.bin @@ -218,7 +216,7 @@ jobs: - name: Repackage in single elfs zip uses: actions/upload-artifact@v5 with: - name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip + name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true path: ./*.elf retention-days: 30 @@ -236,6 +234,7 @@ jobs: outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} needs: + - setup - version - gather-artifacts - build-debian-src @@ -244,11 +243,6 @@ jobs: - name: Checkout uses: actions/checkout@v6 - - name: Setup Python - uses: actions/setup-python@v6 - with: - python-version: 3.x - - name: Create release uses: softprops/action-gh-release@v2 id: create_release @@ -284,10 +278,25 @@ jobs: - name: Display structure of downloaded files run: ls -lR - - name: Add Linux sources to GtiHub Release + - name: Generate Release manifest + run: | + jq -n --arg ver "${{ needs.version.outputs.long }}" --arg targets "${{ toJson(needs.setup.outputs.all) }}" '{ + "version": $ver, + "targets": ($targets | fromjson) + }' > firmware-${{ needs.version.outputs.long }}.json + + - name: Save Release manifest artifact + uses: actions/upload-artifact@v5 + with: + name: manifest-${{ needs.version.outputs.long }} + overwrite: true + path: firmware-${{ needs.version.outputs.long }}.json + + - name: Add sources to GitHub Release # Only run when targeting master branch with workflow_dispatch if: ${{ github.ref_name == 'master' }} run: | + gh release upload v${{ needs.version.outputs.long }} ./firmware-${{ needs.version.outputs.long }}.json gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip env: @@ -337,7 +346,7 @@ jobs: - uses: actions/download-artifact@v6 with: - name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip + name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true path: ./elfs @@ -373,12 +382,19 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v6 + - name: Get firmware artifacts + uses: actions/download-artifact@v6 with: pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }} merge-multiple: true path: ./publish + - name: Get manifest artifact + uses: actions/download-artifact@v6 + with: + pattern: manifest-${{ needs.version.outputs.long }} + path: ./publish + - name: Publish firmware to meshtastic.github.io uses: peaceiris/actions-gh-pages@v4 env: diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index 154b230c7..b9bb3ceed 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -168,7 +168,7 @@ jobs: ./firmware-*.bin ./firmware-*.uf2 ./firmware-*.hex - ./firmware-*-ota.zip + ./firmware-*.zip ./device-*.sh ./device-*.bat ./littlefs-*.bin @@ -197,7 +197,7 @@ jobs: - name: Repackage in single elfs zip uses: actions/upload-artifact@v5 with: - name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip + name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true path: ./*.elf retention-days: 30 @@ -223,11 +223,6 @@ jobs: - name: Checkout uses: actions/checkout@v6 - - name: Setup Python - uses: actions/setup-python@v6 - with: - python-version: 3.x - - name: Create release uses: softprops/action-gh-release@v2 id: create_release @@ -316,7 +311,7 @@ jobs: - uses: actions/download-artifact@v6 with: - name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip + name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true path: ./elfs diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index 048186538..a3e0b23cf 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -52,7 +52,7 @@ jobs: if: needs.native-tests.result != 'skipped' uses: actions/download-artifact@v6 with: - name: platformio-test-report-${{ steps.version.outputs.long }}.zip + name: platformio-test-report-${{ steps.version.outputs.long }} merge-multiple: true - name: Parse test results and create detailed summary diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index decd23954..26ff306a9 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -40,7 +40,7 @@ jobs: - name: Integration test run: | - .pio/build/coverage/program -s & + .pio/build/coverage/meshtasticd -s & PID=$! timeout 20 bash -c "until ls -al /proc/$PID/fd | grep socket; do sleep 1; done" echo "Simulator started, launching python test..." @@ -62,7 +62,7 @@ jobs: uses: actions/upload-artifact@v5 if: always() # run this step even if previous step failed with: - name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }}.zip + name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }} overwrite: true path: ./coverage_*.info @@ -96,7 +96,7 @@ jobs: if: always() # run this step even if previous step failed uses: actions/upload-artifact@v5 with: - name: platformio-test-report-${{ steps.version.outputs.long }}.zip + name: platformio-test-report-${{ steps.version.outputs.long }} overwrite: true path: ./testreport.xml @@ -111,7 +111,7 @@ jobs: uses: actions/upload-artifact@v5 if: always() # run this step even if previous step failed with: - name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }}.zip + name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }} overwrite: true path: ./coverage_*.info @@ -139,7 +139,7 @@ jobs: - name: Download test artifacts uses: actions/download-artifact@v6 with: - name: platformio-test-report-${{ steps.version.outputs.long }}.zip + name: platformio-test-report-${{ steps.version.outputs.long }} merge-multiple: true - name: Test Report @@ -152,7 +152,7 @@ jobs: - name: Download coverage artifacts uses: actions/download-artifact@v6 with: - pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }}.zip + pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }} path: code-coverage-report merge-multiple: true @@ -165,5 +165,5 @@ jobs: - name: Save Code Coverage Report uses: actions/upload-artifact@v5 with: - name: code-coverage-report-${{ steps.version.outputs.long }}.zip + name: code-coverage-report-${{ steps.version.outputs.long }} path: code-coverage-report diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4a97853e2..241f2cd10 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,7 +22,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 - # - uses: actions/setup-python@v5 + # - uses: actions/setup-python@v6 # with: # python-version: '3.10' diff --git a/bin/build-esp32.sh b/bin/build-esp32.sh index 92836db23..8c684aa7e 100755 --- a/bin/build-esp32.sh +++ b/bin/build-esp32.sh @@ -5,7 +5,8 @@ set -e VERSION=`bin/buildinfo.py long` SHORT_VERSION=`bin/buildinfo.py short` -OUTDIR=release/ +BUILDDIR=.pio/build/$1 +OUTDIR=release rm -f $OUTDIR/firmware* rm -r $OUTDIR/* || true @@ -14,7 +15,7 @@ rm -r $OUTDIR/* || true platformio pkg install -e $1 echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS" -rm -f .pio/build/$1/firmware.* +rm -f $BUILDDIR/firmware* # The shell vars the build tool expects to find export APP_VERSION=$VERSION @@ -22,16 +23,14 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION pio run --environment $1 # -v -SRCELF=.pio/build/$1/firmware.elf -cp $SRCELF $OUTDIR/$basename.elf + +cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf echo "Copying ESP32 bin file" -SRCBIN=.pio/build/$1/firmware.factory.bin -cp $SRCBIN $OUTDIR/$basename.bin +cp $BUILDDIR/$basename.factory.bin $OUTDIR/$basename.factory.bin echo "Copying ESP32 update bin file" -SRCBIN=.pio/build/$1/firmware.bin -cp $SRCBIN $OUTDIR/$basename-update.bin +cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin echo "Building Filesystem for ESP32 targets" # If you want to build the webui, uncomment the following lines @@ -40,7 +39,13 @@ echo "Building Filesystem for ESP32 targets" # # Remove webserver files from the filesystem and rebuild # ls -l data/static # Diagnostic list of files # rm -rf data/static -pio run --environment $1 -t buildfs -cp .pio/build/$1/littlefs.bin $OUTDIR/littlefs-$1-$VERSION.bin -cp bin/device-install.* $OUTDIR -cp bin/device-update.* $OUTDIR \ No newline at end of file +pio run --environment $1 -t buildfs --disable-auto-clean +cp $BUILDDIR/littlefs-$1-$VERSION.bin $OUTDIR/littlefs-$1-$VERSION.bin +cp bin/device-install.* $OUTDIR/ +cp bin/device-update.* $OUTDIR/ + +# Generate the manifest file +echo "Generating Meshtastic manifest" +TIMEFORMAT="Generated manifest in %E seconds" +time pio run --environment $1 -t mtjson --silent --disable-auto-clean +cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-native.sh b/bin/build-native.sh index fff86e87e..f35e46a87 100755 --- a/bin/build-native.sh +++ b/bin/build-native.sh @@ -17,15 +17,19 @@ VERSION=$(bin/buildinfo.py long) SHORT_VERSION=$(bin/buildinfo.py short) PIO_ENV=${1:-native} -OUTDIR=release/ +BUILDDIR=.pio/build/$PIO_ENV +OUTDIR=release -rm -f $OUTDIR/firmware* +rm -f $OUTDIR/meshtasticd* mkdir -p $OUTDIR/ rm -r $OUTDIR/* || true +basename=meshtasticd-$1-$VERSION + # Important to pull latest version of libs into all device flavors, otherwise some devices might be stale pio pkg install --environment "$PIO_ENV" || platformioFailed pio run --environment "$PIO_ENV" || platformioFailed -cp ".pio/build/$PIO_ENV/program" "$OUTDIR/meshtasticd_linux_$(uname -m)" -cp bin/native-install.* $OUTDIR + +cp "$BUILDDIR/meshtasticd" "$OUTDIR/meshtasticd_linux_$(uname -m)" +cp bin/native-install.* $OUTDIR/ diff --git a/bin/build-nrf52.sh b/bin/build-nrf52.sh index deca209d2..c605fb1e0 100755 --- a/bin/build-nrf52.sh +++ b/bin/build-nrf52.sh @@ -5,7 +5,8 @@ set -e VERSION=$(bin/buildinfo.py long) SHORT_VERSION=$(bin/buildinfo.py short) -OUTDIR=release/ +BUILDDIR=.pio/build/$1 +OUTDIR=release rm -f $OUTDIR/firmware* rm -r $OUTDIR/* || true @@ -14,7 +15,7 @@ rm -r $OUTDIR/* || true platformio pkg install -e $1 echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS" -rm -f .pio/build/$1/firmware.* +rm -f $BUILDDIR/firmware* # The shell vars the build tool expects to find export APP_VERSION=$VERSION @@ -22,32 +23,32 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION pio run --environment $1 # -v -SRCELF=.pio/build/$1/firmware.elf -cp $SRCELF $OUTDIR/$basename.elf -echo "Generating NRF52 dfu file" -DFUPKG=.pio/build/$1/firmware.zip -cp $DFUPKG $OUTDIR/$basename-ota.zip +cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf -echo "Generating NRF52 uf2 file" -SRCHEX=.pio/build/$1/firmware.hex +echo "Copying NRF52 dfu (OTA) file" +cp $BUILDDIR/$basename.zip $OUTDIR/$basename.zip -# if WM1110 target, merge hex with softdevice 7.3.0 +echo "Copying NRF52 UF2 file" +cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2 +cp bin/*.uf2 $OUTDIR/ + +SRCHEX=$BUILDDIR/$basename.hex + +# if WM1110 target, copy the merged.hex if (echo $1 | grep -q "wio-sdk-wm1110"); then - echo "Merging with softdevice" - bin/mergehex -m bin/s140_nrf52_7.3.0_softdevice.hex $SRCHEX -o .pio/build/$1/$basename.hex - SRCHEX=.pio/build/$1/$basename.hex - bin/uf2conv.py $SRCHEX -c -o $OUTDIR/$basename.uf2 -f 0xADA52840 - cp $SRCHEX $OUTDIR - cp bin/*.uf2 $OUTDIR -else - bin/uf2conv.py $SRCHEX -c -o $OUTDIR/$basename.uf2 -f 0xADA52840 - cp bin/device-install.* $OUTDIR - cp bin/device-update.* $OUTDIR - cp bin/*.uf2 $OUTDIR + echo "Copying .merged.hex file" + SRCHEX=$BUILDDIR/$basename.merged.hex + cp $SRCHEX $OUTDIR/ fi if (echo $1 | grep -q "rak4631"); then - echo "Copying hex file" - cp .pio/build/$1/firmware.hex $OUTDIR/$basename.hex -fi \ No newline at end of file + echo "Copying .hex file" + cp $SRCHEX $OUTDIR/ +fi + +# Generate the manifest file +echo "Generating Meshtastic manifest" +TIMEFORMAT="Generated manifest in %E seconds" +time pio run --environment $1 -t mtjson --silent --disable-auto-clean +cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-rp2xx0.sh b/bin/build-rp2xx0.sh index cb4865914..ae26fdfbf 100755 --- a/bin/build-rp2xx0.sh +++ b/bin/build-rp2xx0.sh @@ -5,7 +5,8 @@ set -e VERSION=`bin/buildinfo.py long` SHORT_VERSION=`bin/buildinfo.py short` -OUTDIR=release/ +BUILDDIR=.pio/build/$1 +OUTDIR=release rm -f $OUTDIR/firmware* rm -r $OUTDIR/* || true @@ -14,7 +15,7 @@ rm -r $OUTDIR/* || true platformio pkg install -e $1 echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS" -rm -f .pio/build/$1/firmware.* +rm -f $BUILDDIR/firmware* # The shell vars the build tool expects to find export APP_VERSION=$VERSION @@ -22,12 +23,14 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION pio run --environment $1 # -v -SRCELF=.pio/build/$1/firmware.elf -cp $SRCELF $OUTDIR/$basename.elf + +cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf echo "Copying uf2 file" -SRCBIN=.pio/build/$1/firmware.uf2 -cp $SRCBIN $OUTDIR/$basename.uf2 +cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2 -cp bin/device-install.* $OUTDIR -cp bin/device-update.* $OUTDIR +# Generate the manifest file +echo "Generating Meshtastic manifest" +TIMEFORMAT="Generated manifest in %E seconds" +time pio run --environment $1 -t mtjson --silent --disable-auto-clean +cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-stm32wl.sh b/bin/build-stm32wl.sh index f62df4842..b85da04a6 100755 --- a/bin/build-stm32wl.sh +++ b/bin/build-stm32wl.sh @@ -5,7 +5,8 @@ set -e VERSION=$(bin/buildinfo.py long) SHORT_VERSION=$(bin/buildinfo.py short) -OUTDIR=release/ +BUILDDIR=.pio/build/$1 +OUTDIR=release rm -f $OUTDIR/firmware* rm -r $OUTDIR/* || true @@ -14,7 +15,7 @@ rm -r $OUTDIR/* || true platformio pkg install -e $1 echo "Building for $1 with $PLATFORMIO_BUILD_FLAGS" -rm -f .pio/build/$1/firmware.* +rm -f $BUILDDIR/firmware* # The shell vars the build tool expects to find export APP_VERSION=$VERSION @@ -22,8 +23,14 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION pio run --environment $1 # -v -SRCELF=.pio/build/$1/firmware.elf -cp $SRCELF $OUTDIR/$basename.elf -SRCBIN=.pio/build/$1/firmware.bin -cp $SRCBIN $OUTDIR/$basename.bin +cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf + +echo "Copying STM32 bin file" +cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin + +# Generate the manifest file +echo "Generating Meshtastic manifest" +TIMEFORMAT="Generated manifest in %E seconds" +time pio run --environment $1 -t mtjson --silent --disable-auto-clean +cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/device-install.bat b/bin/device-install.bat index 519073b08..c200a3201 100755 --- a/bin/device-install.bat +++ b/bin/device-install.bat @@ -5,22 +5,14 @@ TITLE Meshtastic device-install SET "SCRIPT_NAME=%~nx0" SET "DEBUG=0" SET "PYTHON=" -SET "TFT_BUILD=0" -SET "BIGDB8=0" -SET "MUIDB8=0" -SET "BIGDB16=0" SET "ESPTOOL_BAUD=115200" SET "ESPTOOL_CMD=" SET "LOGCOUNTER=0" SET "BPS_RESET=0" - -@REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable. -SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv heltec-v4" -SET "C3=esp32c3" -@REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable. -SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger" -SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator" -SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv heltec-v4" +@REM Default offsets. +@REM https://github.com/meshtastic/web-flasher/blob/main/stores/firmwareStore.ts#L202 +SET "OTA_OFFSET=0x260000" +SET "SPIFFS_OFFSET=0x300000" GOTO getopts :help @@ -29,7 +21,7 @@ ECHO. ECHO Usage: %SCRIPT_NAME% -f filename [-p PORT] [-P python] [--1200bps-reset] ECHO. ECHO Options: -ECHO -f filename The firmware .bin file to flash. Custom to your device type and region. (required) +ECHO -f filename The firmware .factory.bin file to flash. Custom to your device type and region. (required) ECHO The file must be located in this current directory. ECHO -p PORT Set the environment variable for ESPTOOL_PORT. ECHO If not set, ESPTOOL iterates all ports (Dangerous). @@ -40,12 +32,12 @@ ECHO --1200bps-reset Attempt to place the device in correct mode. (1200bps ECHO Some hardware requires this twice. ECHO. ECHO Example: %SCRIPT_NAME% -p COM17 --1200bps-reset -ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.bin -p COM11 -ECHO Example: %SCRIPT_NAME% -f firmware-unphone-2.6.0.0b106d4.bin -p COM11 +ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.factory.bin -p COM11 +ECHO Example: %SCRIPT_NAME% -f firmware-unphone-2.6.0.0b106d4.factory.bin -p COM11 GOTO eof :version -ECHO %SCRIPT_NAME% [Version 2.6.2] +ECHO %SCRIPT_NAME% [Version 2.7.0] ECHO Meshtastic GOTO eof @@ -78,8 +70,8 @@ IF "__!FILENAME!__"=="____" ( CALL :LOG_MESSAGE ERROR "Filename containing spaces are not supported." GOTO help ) - IF "__!FILENAME:firmware-=!__"=="__!FILENAME!__" ( - CALL :LOG_MESSAGE ERROR "Filename must be a firmware-* file." + IF NOT "__!FILENAME:.factory.bin=!__"=="__!FILENAME!__" ( + CALL :LOG_MESSAGE ERROR "Filename must be a firmware-*.factory.bin file." GOTO help ) @REM Remove ".\" or "./" file prefix if present. @@ -93,12 +85,26 @@ IF NOT EXIST !FILENAME! ( GOTO eof ) -IF NOT "!FILENAME:update=!"=="!FILENAME!" ( - CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!" - CALL :LOG_MESSAGE INFO "Use script device-update.bat to flash update !FILENAME!." - GOTO eof +CALL :LOG_MESSAGE DEBUG "Checking for metadata..." +@REM Derive metadata filename from firmware filename. +SET "METAFILE=!FILENAME:.factory.bin=!.mt.json" +IF EXIST !METAFILE! ( + @REM Print parsed json with powershell + CALL :LOG_MESSAGE INFO "Firmware metadata: !METAFILE!" + powershell -NoProfile -Command "(Get-Content '!METAFILE!' | ConvertFrom-Json | Out-String).Trim()" + + @REM Save metadata values to variables for later use. + FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^ + "(Get-Content '!METAFILE!' | ConvertFrom-Json).mcu"`) DO SET "MCU=%%A" + FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^ + "(Get-Content '!METAFILE!' | ConvertFrom-Json).part | Where-Object { $_.subtype -eq 'ota_1' } | Select-Object -ExpandProperty offset"` + ) DO SET "OTA_OFFSET=%%A" + FOR /f "usebackq" %%A IN (`powershell -NoProfile -Command ^ + "(Get-Content '!METAFILE!' | ConvertFrom-Json).part | Where-Object { $_.subtype -eq 'spiffs' } | Select-Object -ExpandProperty offset"` + ) DO SET "SPIFFS_OFFSET=%%A" ) ELSE ( - CALL :LOG_MESSAGE DEBUG "We are NOT working with a *update* file. !FILENAME!" + CALL :LOG_MESSAGE ERROR "No metadata file found: !METAFILE!" + GOTO eof ) :skip-filename @@ -108,7 +114,7 @@ IF NOT "__%PYTHON%__"=="____" ( SET "ESPTOOL_CMD=!PYTHON! -m esptool" CALL :LOG_MESSAGE DEBUG "Python interpreter supplied." ) ELSE ( - CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool... + CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool..." WHERE esptool >nul 2>&1 IF %ERRORLEVEL% EQU 0 ( @REM WHERE exits with code 0 if esptool is found. @@ -146,100 +152,26 @@ IF %BPS_RESET% EQU 1 ( GOTO eof ) -@REM Check if FILENAME contains "-tft-" and set target partitionScheme accordingly. -@REM https://github.com/meshtastic/web-flasher/blob/main/types/resources.ts#L3 -IF NOT "!FILENAME:-tft-=!"=="!FILENAME!" ( - CALL :LOG_MESSAGE DEBUG "We are working with a *-tft-* file. !FILENAME!" - SET "TFT_BUILD=1" +@REM Extract PROGNAME from %FILENAME% for later use. +SET "PROGNAME=!FILENAME:.factory.bin=!" +CALL :LOG_MESSAGE DEBUG "Computed PROGNAME: !PROGNAME!" + +IF "__!MCU!__" == "__esp32s3__" ( + @REM We are working with ESP32-S3 + SET "OTA_FILENAME=bleota-s3.bin" +) ELSE IF "__!MCU!__" == "__esp32c3__" ( + @REM We are working with ESP32-C3 + SET "OTA_FILENAME=bleota-c3.bin" ) ELSE ( - CALL :LOG_MESSAGE DEBUG "We are NOT working with a *-tft-* file. !FILENAME!" + @REM Everything else + SET "OTA_FILENAME=bleota.bin" ) - -FOR %%a IN (%BIGDB_8MB%) DO ( - IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( - @REM We are working with any of %BIGDB_8MB%. - SET "BIGDB8=1" - GOTO end_loop_bigdb_8mb - ) -) -:end_loop_bigdb_8mb - -FOR %%a IN (%MUIDB_8MB%) DO ( - IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( - @REM We are working with any of %MUIDB_8MB%. - SET "MUIDB8=1" - GOTO end_loop_muidb_8mb - ) -) -:end_loop_muidb_8mb - -FOR %%a IN (%BIGDB_16MB%) DO ( - IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( - @REM We are working with any of %BIGDB_16MB%. - SET "BIGDB16=1" - GOTO end_loop_bigdb_16mb - ) -) -:end_loop_bigdb_16mb - -IF %BIGDB8% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 8mb partition selected." -IF %MUIDB8% EQU 1 CALL :LOG_MESSAGE INFO "MUIDB 8mb partition selected." -IF %BIGDB16% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 16mb partition selected." - -@REM Extract BASENAME from %FILENAME% for later use. -SET "BASENAME=!FILENAME:firmware-=!" -CALL :LOG_MESSAGE DEBUG "Computed firmware basename: !BASENAME!" - -@REM Account for S3 and C3 board's different OTA partition. -FOR %%a IN (%S3%) DO ( - IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( - @REM We are working with any of %S3%. - SET "OTA_FILENAME=bleota-s3.bin" - GOTO :end_loop_s3 - ) -) - -FOR %%a IN (%C3%) DO ( - IF NOT "!FILENAME:%%a=!"=="!FILENAME!" ( - @REM We are working with any of %C3%. - SET "OTA_FILENAME=bleota-c3.bin" - GOTO :end_loop_c3 - ) -) - -@REM Everything else -SET "OTA_FILENAME=bleota.bin" -:end_loop_s3 -:end_loop_c3 CALL :LOG_MESSAGE DEBUG "Set OTA_FILENAME to: !OTA_FILENAME!" @REM Set SPIFFS filename with "littlefs-" prefix. -SET "SPIFFS_FILENAME=littlefs-%BASENAME%" +SET "SPIFFS_FILENAME=littlefs-!PROGNAME:firmware-=!.bin" CALL :LOG_MESSAGE DEBUG "Set SPIFFS_FILENAME to: !SPIFFS_FILENAME!" -@REM Default offsets. -@REM https://github.com/meshtastic/web-flasher/blob/main/stores/firmwareStore.ts#L202 -SET "OTA_OFFSET=0x260000" -SET "SPIFFS_OFFSET=0x300000" - -@REM Offsets for BigDB 8mb. -IF %BIGDB8% EQU 1 ( - SET "OTA_OFFSET=0x340000" - SET "SPIFFS_OFFSET=0x670000" -) - -@REM Offsets for MUIDB 8mb. -IF %MUIDB8% EQU 1 ( - SET "OTA_OFFSET=0x5D0000" - SET "SPIFFS_OFFSET=0x670000" -) - -@REM Offsets for BigDB 16mb. -IF %BIGDB16% EQU 1 ( - SET "OTA_OFFSET=0x650000" - SET "SPIFFS_OFFSET=0xc90000" -) - CALL :LOG_MESSAGE DEBUG "Set OTA_OFFSET to: !OTA_OFFSET!" CALL :LOG_MESSAGE DEBUG "Set SPIFFS_OFFSET to: !SPIFFS_OFFSET!" diff --git a/bin/device-install.sh b/bin/device-install.sh index 69e4794ba..1778a952d 100755 --- a/bin/device-install.sh +++ b/bin/device-install.sh @@ -2,69 +2,15 @@ PYTHON=${PYTHON:-$(which python3 python | head -n 1)} BPS_RESET=false -TFT_BUILD=false MCU="" # Constants RESET_BAUD=1200 FIRMWARE_OFFSET=0x00 - -# Variant groups -BIGDB_8MB=( - "crowpanel-esp32s3" - "heltec_capsule_sensor_v3" - "heltec-v3" - "heltec-vision-master-e213" - "heltec-vision-master-e290" - "heltec-vision-master-t190" - "heltec-wireless-paper" - "heltec-wireless-tracker" - "heltec-wsl-v3" - "icarus" - "seeed-xiao-s3" - "tbeam-s3-core" - "tracksenger" -) -MUIDB_8MB=( - "picomputer-s3" - "unphone" - "seeed-sensecap-indicator" -) -BIGDB_16MB=( - "dreamcatcher" - "elecrow-adv" - "ESP32-S3-Pico" - "heltec-v4" - "m5stack-cores3" - "mesh-tab" - "station-g2" - "t-deck" - "t-energy-s3" - "t-eth-elite" - "t-watch-s3" - "tlora-pager" -) -S3_VARIANTS=( - "s3" - "-v3" - "-v4" - "t-deck" - "wireless-paper" - "wireless-tracker" - "station-g2" - "unphone" - "t-eth-elite" - "tlora-pager" - "mesh-tab" - "dreamcatcher" - "ESP32-S3-Pico" - "seeed-sensecap-indicator" - "heltec_capsule_sensor_v3" - "vision-master" - "icarus" - "tracksenger" - "elecrow-adv" -) +# Default littlefs* offset. +OFFSET=0x300000 +# Default OTA Offset +OTA_OFFSET=0x260000 # Determine the correct esptool command to use if "$PYTHON" -m esptool version >/dev/null 2>&1; then @@ -78,6 +24,14 @@ else exit 1 fi +# Check for jq +if ! command -v jq >/dev/null 2>&1; then + echo "Error: jq not found" >&2 + echo "Install jq with your package manager." >&2 + echo "e.g. 'apt install jq', 'dnf install jq', 'brew install jq', etc." >&2 + exit 1 +fi + set -e # Usage info @@ -89,7 +43,7 @@ Flash image file to device, but first erasing and writing system information. -h Display this help and exit. -p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerous). -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON") - -f FILENAME The firmware .bin file to flash. Custom to your device type and region. + -f FILENAME The firmware *.factory.bin file to flash. Custom to your device type and region. --1200bps-reset Attempt to place the device in correct mode. Some hardware requires this twice. (1200bps Reset) EOF @@ -138,69 +92,43 @@ fi shift } -if [[ "$FILENAME" != firmware-* ]]; then - echo "Filename must be a firmware-* file." +if [[ $(basename "$FILENAME") != firmware-*.factory.bin ]]; then + echo "Filename must be a firmware-*.factory.bin file." exit 1 fi -# Check if FILENAME contains "-tft-" and set target partitionScheme accordingly. -if [[ "${FILENAME//-tft-/}" != "$FILENAME" ]]; then - TFT_BUILD=true -fi +# Extract PROGNAME from %FILENAME% for later use. +PROGNAME="${FILENAME/.factory.bin/}" +# Derive metadata filename from %PROGNAME%. +METAFILE="${PROGNAME}.mt.json" -# Extract BASENAME from %FILENAME% for later use. -BASENAME="${FILENAME/firmware-/}" - -if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then - # Default littlefs* offset. - OFFSET=0x300000 - - # Default OTA Offset - OTA_OFFSET=0x260000 - - # littlefs* offset for BigDB 8mb and OTA OFFSET. - for variant in "${BIGDB_8MB[@]}"; do - if [ -z "${FILENAME##*"$variant"*}" ]; then - OFFSET=0x670000 - OTA_OFFSET=0x340000 - fi - done - - for variant in "${MUIDB_8MB[@]}"; do - if [ -z "${FILENAME##*"$variant"*}" ]; then - OFFSET=0x670000 - OTA_OFFSET=0x5D0000 - fi - done - - # littlefs* offset for BigDB 16mb and OTA OFFSET. - for variant in "${BIGDB_16MB[@]}"; do - if [ -z "${FILENAME##*"$variant"*}" ]; then - OFFSET=0xc90000 - OTA_OFFSET=0x650000 - fi - done - - # Account for S3 board's different OTA partition - # FIXME: Use PlatformIO info to determine MCU type, this is unmaintainable - for variant in "${S3_VARIANTS[@]}"; do - if [ -z "${FILENAME##*"$variant"*}" ]; then - MCU="esp32s3" - fi - done - - if [ "$MCU" != "esp32s3" ]; then - if [ -n "${FILENAME##*"esp32c3"*}" ]; then - OTAFILE=bleota.bin - else - OTAFILE=bleota-c3.bin +if [[ -f "$FILENAME" && "$FILENAME" == *.factory.bin ]]; then + # Display metadata if it exists + if [[ -f "$METAFILE" ]]; then + echo "Firmware metadata: ${METAFILE}" + jq . "$METAFILE" + # Extract relevant fields from metadata + if [[ $(jq -r '.part' "$METAFILE") != "null" ]]; then + OTA_OFFSET=$(jq -r '.part[] | select(.subtype == "ota_1") | .offset' "$METAFILE") + SPIFFS_OFFSET=$(jq -r '.part[] | select(.subtype == "spiffs") | .offset' "$METAFILE") fi + MCU=$(jq -r '.mcu' "$METAFILE") else + echo "ERROR: No metadata file found at ${METAFILE}" + exit 1 + fi + + # Determine OTA filename based on MCU type + if [ "$MCU" == "esp32s3" ]; then OTAFILE=bleota-s3.bin + elif [ "$MCU" == "esp32c3" ]; then + OTAFILE=bleota-c3.bin + else + OTAFILE=bleota.bin fi # Set SPIFFS filename with "littlefs-" prefix. - SPIFFSFILE=littlefs-${BASENAME} + SPIFFSFILE="littlefs-${PROGNAME/firmware-/}.bin" if [[ ! -f "$FILENAME" ]]; then echo "Error: file ${FILENAME} wasn't found. Terminating." diff --git a/bin/device-update.bat b/bin/device-update.bat index a263da992..a9f7a9e1e 100755 --- a/bin/device-update.bat +++ b/bin/device-update.bat @@ -30,11 +30,11 @@ ECHO --change-mode Attempt to place the device in correct mode. (1200bps ECHO Some hardware requires this twice. ECHO. ECHO Example: %SCRIPT_NAME% -p COM17 --change-mode -ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4-update.bin -p COM11 +ECHO Example: %SCRIPT_NAME% -f firmware-t-deck-tft-2.6.0.0b106d4.bin -p COM11 GOTO eof :version -ECHO %SCRIPT_NAME% [Version 2.6.2] +ECHO %SCRIPT_NAME% [Version 2.7.0] ECHO Meshtastic GOTO eof @@ -78,12 +78,12 @@ IF NOT EXIST !FILENAME! ( GOTO eof ) -IF "!FILENAME:update=!"=="!FILENAME!" ( - CALL :LOG_MESSAGE DEBUG "We are NOT working with a *update* file. !FILENAME!" +IF NOT "__!FILENAME:.factory.bin=!__"=="__!FILENAME!__" ( + CALL :LOG_MESSAGE DEBUG "We are working with a *.factory.bin* file. !FILENAME!" CALL :LOG_MESSAGE INFO "Use script device-install.bat to flash !FILENAME!." GOTO eof ) ELSE ( - CALL :LOG_MESSAGE DEBUG "We are working with a *update* file. !FILENAME!" + CALL :LOG_MESSAGE DEBUG "We are not working with a *.factory.bin* file. !FILENAME!" ) :skip-filename diff --git a/bin/device-update.sh b/bin/device-update.sh index f64280a5b..1c3d6be70 100755 --- a/bin/device-update.sh +++ b/bin/device-update.sh @@ -29,7 +29,7 @@ Flash image file to device, leave existing system intact." -h Display this help and exit -p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerous). -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON") - -f FILENAME The *update.bin file to flash. Custom to your device type. + -f FILENAME The *.bin file to flash. Custom to your device type. --change-mode Attempt to place the device in correct mode. Some hardware requires this twice. (1200bps Reset) EOF @@ -78,7 +78,7 @@ fi shift } -if [ -f "${FILENAME}" ] && [ -z "${FILENAME##*"update"*}" ]; then +if [[ -f "$FILENAME" && "$FILENAME" != *.factory.bin ]]; then echo "Trying to flash update ${FILENAME}" $ESPTOOL_CMD --baud $FLASH_BAUD write-flash $UPDATE_OFFSET "${FILENAME}" else diff --git a/bin/native-gdbserver.sh b/bin/native-gdbserver.sh index f779d6670..a45a2dc26 100755 --- a/bin/native-gdbserver.sh +++ b/bin/native-gdbserver.sh @@ -2,4 +2,4 @@ set -e pio run --environment native -gdbserver --once localhost:2345 .pio/build/native/program "$@" +gdbserver --once localhost:2345 .pio/build/native/meshtasticd "$@" diff --git a/bin/native-run.sh b/bin/native-run.sh index 6566fc591..a8309c2d3 100755 --- a/bin/native-run.sh +++ b/bin/native-run.sh @@ -2,4 +2,4 @@ set -e pio run --environment native -.pio/build/native/program "$@" +.pio/build/native/meshtasticd "$@" diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py index 4a1887d9d..151cf0a97 100644 --- a/bin/platformio-custom.py +++ b/bin/platformio-custom.py @@ -2,98 +2,77 @@ # trunk-ignore-all(ruff/F821) # trunk-ignore-all(flake8/F821): For SConstruct imports import sys -from os.path import join +from os.path import join, basename, isfile import subprocess import json import re -import time from datetime import datetime from readprops import readProps Import("env") platform = env.PioPlatform() +progname = env.get("PROGNAME") +lfsbin = f"{progname.replace('firmware-', 'littlefs-')}.bin" - -def esp32_create_combined_bin(source, target, env): - # this sub is borrowed from ESPEasy build toolchain. It's licensed under GPL V3 - # https://github.com/letscontrolit/ESPEasy/blob/mega/tools/pio/post_esp32.py - print("Generating combined binary for serial flashing") - - app_offset = 0x10000 - - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") - sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) - firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") - chip = env.get("BOARD_MCU") - flash_size = env.BoardConfig().get("upload.flash_size") - flash_freq = env.BoardConfig().get("build.f_flash", "40m") - flash_freq = flash_freq.replace("000000L", "m") - flash_mode = env.BoardConfig().get("build.flash_mode", "dio") - memory_type = env.BoardConfig().get("build.arduino.memory_type", "qio_qspi") - if flash_mode == "qio" or flash_mode == "qout": - flash_mode = "dio" - if memory_type == "opi_opi" or memory_type == "opi_qspi": - flash_mode = "dout" - cmd = [ - "--chip", - chip, - "merge_bin", - "-o", - new_file_name, - "--flash_mode", - flash_mode, - "--flash_freq", - flash_freq, - "--flash_size", - flash_size, +def manifest_gather(source, target, env): + out = [] + check_paths = [ + progname, + f"{progname}.elf", + f"{progname}.bin", + f"{progname}.factory.bin", + f"{progname}.hex", + f"{progname}.merged.hex", + f"{progname}.uf2", + f"{progname}.factory.uf2", + f"{progname}.zip", + lfsbin ] + for p in check_paths: + f = env.File(env.subst(f"$BUILD_DIR/{p}")) + if f.exists(): + d = { + "name": p, + "md5": f.get_content_hash(), # Returns MD5 hash + "bytes": f.get_size() # Returns file size in bytes + } + out.append(d) + print(d) + manifest_write(out, env) - print(" Offset | File") - for section in sections: - sect_adr, sect_file = section.split(" ", 1) - print(f" - {sect_adr} | {sect_file}") - cmd += [sect_adr, sect_file] +def manifest_write(files, env): + manifest = { + "version": verObj["long"], + "build_epoch": build_epoch, + "board": env.get("PIOENV"), + "mcu": env.get("BOARD_MCU"), + "repo": repo_owner, + "files": files, + "part": None, + "has_mui": False, + "has_inkhud": False, + } + # Get partition table (generated in esp32_pre.py) if it exists + if env.get("custom_mtjson_part"): + # custom_mtjson_part is a JSON string, convert it back to a dict + pj = json.loads(env.get("custom_mtjson_part")) + manifest["part"] = pj + # Enable has_mui for TFT builds + if ("HAS_TFT", 1) in env.get("CPPDEFINES", []): + manifest["has_mui"] = True + if "MESHTASTIC_INCLUDE_INKHUD" in env.get("CPPDEFINES", []): + manifest["has_inkhud"] = True - print(f" - {hex(app_offset)} | {firmware_name}") - cmd += [hex(app_offset), firmware_name] - - print("Using esptool.py arguments: %s" % " ".join(cmd)) - - esptool.main(cmd) - - -if platform.name == "espressif32": - sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) - import esptool - - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) - - esp32_kind = env.GetProjectOption("custom_esp32_kind") - if esp32_kind == "esp32": - # Free up some IRAM by removing auxiliary SPI flash chip drivers. - # Wrapped stub symbols are defined in src/platform/esp32/iram-quirk.c. - env.Append( - LINKFLAGS=[ - "-Wl,--wrap=esp_flash_chip_gd", - "-Wl,--wrap=esp_flash_chip_issi", - "-Wl,--wrap=esp_flash_chip_winbond", - ] - ) - else: - # For newer ESP32 targets, using newlib nano works better. - env.Append(LINKFLAGS=["--specs=nano.specs", "-u", "_printf_float"]) - -if platform.name == "nordicnrf52": - env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", - env.VerboseAction(f"\"{sys.executable}\" ./bin/uf2conv.py \"$BUILD_DIR/firmware.hex\" -c -f 0xADA52840 -o \"$BUILD_DIR/firmware.uf2\"", - "Generating UF2 file")) + # Write the manifest to the build directory + with open(env.subst("$BUILD_DIR/${PROGNAME}.mt.json"), "w") as f: + json.dump(manifest, f, indent=2) Import("projenv") prefsLoc = projenv["PROJECT_DIR"] + "/version.properties" verObj = readProps(prefsLoc) -print("Using meshtastic platformio-custom.py, firmware version " + verObj["long"] + " on " + env.get("PIOENV")) +print(f"Using meshtastic platformio-custom.py, firmware version {verObj['long']} on {env.get('PIOENV')}") # get repository owner if git is installed try: @@ -139,10 +118,10 @@ flags = [ "-DBUILD_EPOCH=" + str(build_epoch), ] + pref_flags -print ("Using flags:") +print("Using flags:") for flag in flags: print(flag) - + projenv.Append( CCFLAGS=flags, ) @@ -181,3 +160,19 @@ def load_boot_logo(source, target, env): # Load the boot logo on TFT builds if ("HAS_TFT", 1) in env.get("CPPDEFINES", []): env.AddPreAction('$BUILD_DIR/littlefs.bin', load_boot_logo) + +# Rename (mv) littlefs.bin to include the PROGNAME +# This ensures the littlefs.bin is named consistently with the firmware +env.AddPostAction('$BUILD_DIR/littlefs.bin', env.VerboseAction( + f'mv $BUILD_DIR/littlefs.bin $BUILD_DIR/{lfsbin}', + f'Renaming littlefs.bin to {lfsbin}' +)) + +env.AddCustomTarget( + name="mtjson", + dependencies=None, + actions=[manifest_gather], + title="Meshtastic Manifest", + description="Generating Meshtastic manifest JSON + Checksums", + always_build=True, +) diff --git a/bin/platformio-pre.py b/bin/platformio-pre.py new file mode 100644 index 000000000..4e51a6544 --- /dev/null +++ b/bin/platformio-pre.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# trunk-ignore-all(ruff/F821) +# trunk-ignore-all(flake8/F821): For SConstruct imports +Import("env") +platform = env.PioPlatform() + +if platform.name == "native": + env.Replace(PROGNAME="meshtasticd") +else: + from readprops import readProps + prefsLoc = env["PROJECT_DIR"] + "/version.properties" + verObj = readProps(prefsLoc) + env.Replace(PROGNAME=f"firmware-{env.get('PIOENV')}-{verObj['long']}") + +# Print the new program name for verification +print(f"PROGNAME: {env.get('PROGNAME')}") diff --git a/bin/test-simulator.sh b/bin/test-simulator.sh index 3c5f8f811..92ed21a7a 100755 --- a/bin/test-simulator.sh +++ b/bin/test-simulator.sh @@ -3,7 +3,7 @@ set -e echo "Starting simulator" -.pio/build/native/program & +.pio/build/native/meshtasticd -s & sleep 20 # 5 seconds was not enough echo "Simulator started, launching python test..." diff --git a/debian/rules b/debian/rules index 0b5d1ac57..ebb572153 100755 --- a/debian/rules +++ b/debian/rules @@ -28,5 +28,4 @@ override_dh_auto_build: # Build with platformio $(PIO_ENV) platformio run -e native-tft # Move the binary and default config to the correct name - mv .pio/build/native-tft/program .pio/build/native-tft/meshtasticd cp bin/config-dist.yaml bin/config.yaml diff --git a/extra_scripts/disable_adafruit_usb.py b/extra_scripts/disable_adafruit_usb.py index 596242184..3b901e2db 100644 --- a/extra_scripts/disable_adafruit_usb.py +++ b/extra_scripts/disable_adafruit_usb.py @@ -1,10 +1,9 @@ +#!/usr/bin/env python3 # trunk-ignore-all(flake8/F821) # trunk-ignore-all(ruff/F821) Import("env") -# NOTE: This is not currently used, but can serve as an example on how to write extra_scripts - # print("Current CLI targets", COMMAND_LINE_TARGETS) # print("Current Build targets", BUILD_TARGETS) # print("CPP defs", env.get("CPPDEFINES")) diff --git a/extra_scripts/esp32_extra.py b/extra_scripts/esp32_extra.py new file mode 100755 index 000000000..8841ad1dc --- /dev/null +++ b/extra_scripts/esp32_extra.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +# trunk-ignore-all(ruff/F821) +# trunk-ignore-all(flake8/F821): For SConstruct imports +# trunk-ignore-all(ruff/E402): Hacky esptool import +# trunk-ignore-all(flake8/E402): Hacky esptool import +import sys +from os.path import join + +Import("env") +platform = env.PioPlatform() + +sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) +import esptool + + +def esp32_create_combined_bin(source, target, env): + # this sub is borrowed from ESPEasy build toolchain. It's licensed under GPL V3 + # https://github.com/letscontrolit/ESPEasy/blob/mega/tools/pio/post_esp32.py + print("Generating combined binary for serial flashing") + + app_offset = 0x10000 + + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") + sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + chip = env.get("BOARD_MCU") + board = env.BoardConfig() + flash_size = board.get("upload.flash_size") + flash_freq = board.get("build.f_flash", "40m") + flash_freq = flash_freq.replace("000000L", "m") + flash_mode = board.get("build.flash_mode", "dio") + memory_type = board.get("build.arduino.memory_type", "qio_qspi") + if flash_mode == "qio" or flash_mode == "qout": + flash_mode = "dio" + if memory_type == "opi_opi" or memory_type == "opi_qspi": + flash_mode = "dout" + cmd = [ + "--chip", + chip, + "merge_bin", + "-o", + new_file_name, + "--flash_mode", + flash_mode, + "--flash_freq", + flash_freq, + "--flash_size", + flash_size, + ] + + print(" Offset | File") + for section in sections: + sect_adr, sect_file = section.split(" ", 1) + print(f" - {sect_adr} | {sect_file}") + cmd += [sect_adr, sect_file] + + print(f" - {hex(app_offset)} | {firmware_name}") + cmd += [hex(app_offset), firmware_name] + + print("Using esptool.py arguments: %s" % " ".join(cmd)) + + esptool.main(cmd) + + +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) + +esp32_kind = env.GetProjectOption("custom_esp32_kind") +if esp32_kind == "esp32": + # Free up some IRAM by removing auxiliary SPI flash chip drivers. + # Wrapped stub symbols are defined in src/platform/esp32/iram-quirk.c. + env.Append( + LINKFLAGS=[ + "-Wl,--wrap=esp_flash_chip_gd", + "-Wl,--wrap=esp_flash_chip_issi", + "-Wl,--wrap=esp_flash_chip_winbond", + ] + ) +else: + # For newer ESP32 targets, using newlib nano works better. + env.Append(LINKFLAGS=["--specs=nano.specs", "-u", "_printf_float"]) diff --git a/extra_scripts/esp32_pre.py b/extra_scripts/esp32_pre.py new file mode 100755 index 000000000..8e21770e9 --- /dev/null +++ b/extra_scripts/esp32_pre.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# trunk-ignore-all(ruff/F821) +# trunk-ignore-all(flake8/F821): For SConstruct imports +import json +import sys +from os.path import isfile + +Import("env") + + +# From https://github.com/platformio/platform-espressif32/blob/develop/builder/main.py +def _parse_size(value): + if isinstance(value, int): + return value + elif value.isdigit(): + return int(value) + elif value.startswith("0x"): + return int(value, 16) + elif value[-1].upper() in ("K", "M"): + base = 1024 if value[-1].upper() == "K" else 1024 * 1024 + return int(value[:-1]) * base + return value + + +def _parse_partitions(env): + partitions_csv = env.subst("$PARTITIONS_TABLE_CSV") + if not isfile(partitions_csv): + sys.stderr.write( + "Could not find the file %s with partitions " "table.\n" % partitions_csv + ) + env.Exit(1) + return + + result = [] + # The first offset is 0x9000 because partition table is flashed to 0x8000 and + # occupies an entire flash sector, which size is 0x1000 + next_offset = 0x9000 + with open(partitions_csv) as fp: + for line in fp.readlines(): + line = line.strip() + if not line or line.startswith("#"): + continue + tokens = [t.strip() for t in line.split(",")] + if len(tokens) < 5: + continue + + bound = 0x10000 if tokens[1] in ("0", "app") else 4 + calculated_offset = (next_offset + bound - 1) & ~(bound - 1) + partition = { + "name": tokens[0], + "type": tokens[1], + "subtype": tokens[2], + "offset": tokens[3] or calculated_offset, + "size": tokens[4], + "flags": tokens[5] if len(tokens) > 5 else None, + } + result.append(partition) + next_offset = _parse_size(partition["offset"]) + _parse_size( + partition["size"] + ) + + return result + + +def mtjson_esp32_part(target, source, env): + part = _parse_partitions(env) + pj = json.dumps(part) + # print(f"JSON_PARTITIONS: {pj}") + # Dump json string to 'custom_mtjson_part' variable to use later when writing the manifest + env.Replace(custom_mtjson_part=pj) + + +env.AddPreAction("mtjson", mtjson_esp32_part) diff --git a/extra_scripts/nrf52_extra.py b/extra_scripts/nrf52_extra.py new file mode 100755 index 000000000..8e95e42bf --- /dev/null +++ b/extra_scripts/nrf52_extra.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +# trunk-ignore-all(ruff/F821) +# trunk-ignore-all(flake8/F821): For SConstruct imports + +import sys +from os.path import basename + +Import("env") + + +# Custom HEX from ELF +# Convert hex to uf2 for nrf52 +def nrf52_hex_to_uf2(source, target, env): + hex_path = target[0].get_abspath() + # When using merged hex, drop 'merged' from uf2 filename + uf2_path = hex_path.replace(".merged.", ".") + uf2_path = uf2_path.replace(".hex", ".uf2") + env.Execute( + env.VerboseAction( + f'"{sys.executable}" ./bin/uf2conv.py "{hex_path}" -c -f 0xADA52840 -o "{uf2_path}"', + f"Generating UF2 file from {basename(hex_path)}", + ) + ) + + +def nrf52_mergehex(source, target, env): + hex_path = target[0].get_abspath() + merged_hex_path = hex_path.replace(".hex", ".merged.hex") + merge_with = None + if "wio-sdk-wm1110" == str(env.get("PIOENV")): + merge_with = env.subst("$PROJECT_DIR/bin/s140_nrf52_7.3.0_softdevice.hex") + else: + print("merge_with not defined for this target") + + if merge_with is not None: + env.Execute( + env.VerboseAction( + f'"$PROJECT_DIR/bin/mergehex" -m "{hex_path}" "{merge_with}" -o "{merged_hex_path}"', + "Merging HEX with SoftDevice", + ) + ) + print(f'Merged file saved at "{basename(merged_hex_path)}"') + nrf52_hex_to_uf2([hex_path, merge_with], [env.File(merged_hex_path)], env) + + +# if WM1110 target, merge hex with softdevice 7.3.0 +if "wio-sdk-wm1110" == env.get("PIOENV"): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", nrf52_mergehex) +else: + env.AddPostAction("$BUILD_DIR/${PROGNAME}.hex", nrf52_hex_to_uf2) diff --git a/extra_scripts/extra_stm32.py b/extra_scripts/stm32_extra.py similarity index 95% rename from extra_scripts/extra_stm32.py rename to extra_scripts/stm32_extra.py index f3bd8c514..afceb7d81 100755 --- a/extra_scripts/extra_stm32.py +++ b/extra_scripts/stm32_extra.py @@ -1,7 +1,9 @@ +#!/usr/bin/env python3 # trunk-ignore-all(ruff/F821) # trunk-ignore-all(flake8/F821): For SConstruct imports Import("env") + # Custom HEX from ELF env.AddPostAction( "$BUILD_DIR/${PROGNAME}.elf", diff --git a/meshtasticd.spec.rpkg b/meshtasticd.spec.rpkg index e2da172c3..3456001f0 100644 --- a/meshtasticd.spec.rpkg +++ b/meshtasticd.spec.rpkg @@ -76,7 +76,7 @@ platformio run -e native-tft %install # Install meshtasticd binary mkdir -p %{buildroot}%{_bindir} -install -m 0755 .pio/build/native-tft/program %{buildroot}%{_bindir}/meshtasticd +install -m 0755 .pio/build/native-tft/meshtasticd %{buildroot}%{_bindir}/meshtasticd # Install portduino VFS dir install -p -d -m 0770 %{buildroot}%{_localstatedir}/lib/meshtasticd diff --git a/platformio.ini b/platformio.ini index 9b8d0a124..66bd553ab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -14,7 +14,9 @@ description = Meshtastic [env] test_build_src = true -extra_scripts = bin/platformio-custom.py +extra_scripts = + pre:bin/platformio-pre.py + bin/platformio-custom.py ; note: we add src to our include search path so that lmic_project_config can override ; note: TINYGPS_OPTION_NO_CUSTOM_FIELDS is VERY important. We don't use custom fields and somewhere in that pile ; of code is a heap corruption bug! diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini index 08a547ca6..5171bc45c 100644 --- a/variants/esp32/esp32.ini +++ b/variants/esp32/esp32.ini @@ -2,10 +2,16 @@ [esp32_base] extends = arduino_base custom_esp32_kind = esp32 +custom_mtjson_part = platform = # renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32 platformio/espressif32@6.11.0 +extra_scripts = + ${env.extra_scripts} + pre:extra_scripts/esp32_pre.py + extra_scripts/esp32_extra.py + build_src_filter = ${arduino_base.build_src_filter} - - - - - diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 474d45492..9cedfcc55 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -114,5 +114,5 @@ extends = env:native build_flags = -lgcov --coverage -fprofile-abs-path -fsanitize=address ${env:native.build_flags} ; https://docs.platformio.org/en/latest/projectconf/sections/env/options/test/test_testing_command.html test_testing_command = - ${platformio.build_dir}/${this.__env__}/program + ${platformio.build_dir}/${this.__env__}/meshtasticd -s diff --git a/variants/nrf52840/nrf52.ini b/variants/nrf52840/nrf52.ini index 87e239876..5da1aebb5 100644 --- a/variants/nrf52840/nrf52.ini +++ b/variants/nrf52840/nrf52.ini @@ -11,6 +11,10 @@ platform_packages = ; Don't renovate toolchain-gccarmnoneeabi platformio/toolchain-gccarmnoneeabi@~1.90301.0 +extra_scripts = + ${env.extra_scripts} + extra_scripts/nrf52_extra.py + build_type = release build_flags = -include variants/nrf52840/cpp_overrides/lfs_util.h diff --git a/variants/nrf52840/wio-sdk-wm1110/platformio.ini b/variants/nrf52840/wio-sdk-wm1110/platformio.ini index 028129783..2deeeedcf 100644 --- a/variants/nrf52840/wio-sdk-wm1110/platformio.ini +++ b/variants/nrf52840/wio-sdk-wm1110/platformio.ini @@ -4,7 +4,7 @@ extends = nrf52840_base board = wio-sdk-wm1110 extra_scripts = - ${env.extra_scripts} + ${nrf52840_base.extra_scripts} extra_scripts/disable_adafruit_usb.py # Remove adafruit USB serial from the build (it is incompatible with using the ch340 serial chip on this board) diff --git a/variants/stm32/stm32.ini b/variants/stm32/stm32.ini index 1a9fd10ce..547b0502e 100644 --- a/variants/stm32/stm32.ini +++ b/variants/stm32/stm32.ini @@ -8,7 +8,7 @@ platform_packages = platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip extra_scripts = ${env.extra_scripts} - post:extra_scripts/extra_stm32.py + extra_scripts/stm32_extra.py build_type = release From c3a69a2742724da64a96f14594b1da569944006f Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 8 Dec 2025 17:58:23 -0600 Subject: [PATCH 234/286] Fix backwards buttons on Thinknode-M1 (#8901) --- variants/nrf52840/ELECROW-ThinkNode-M1/variant.h | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h index 79e31c54a..e46f2356d 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h +++ b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h @@ -62,17 +62,11 @@ extern "C" { /* * Buttons */ -#define PIN_BUTTON2 (32 + 10) +#define PIN_BUTTON1 (32 + 10) +#define PIN_BUTTON2 (32 + 7) #define ALT_BUTTON_PIN PIN_BUTTON2 #define ALT_BUTTON_ACTIVE_LOW true #define ALT_BUTTON_ACTIVE_PULLUP true -#define PIN_BUTTON1 (32 + 7) - -// #define PIN_BUTTON1 (0 + 11) -// #define PIN_BUTTON1 (32 + 7) - -// #define BUTTON_CLICK_MS 400 -// #define BUTTON_TOUCH_MS 200 /* * Analog pins @@ -203,4 +197,4 @@ External serial flash WP25R1635FZUIL0 } #endif -#endif \ No newline at end of file +#endif From 65c418d4e14ba7414315b926fe18d8553ed129ae Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Mon, 8 Dec 2025 18:13:59 -0600 Subject: [PATCH 235/286] Update protobuf name of FRIED_CHICKEN (#8903) --- src/platform/nrf52/architecture.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h index 1568e1790..d4699cd8c 100644 --- a/src/platform/nrf52/architecture.h +++ b/src/platform/nrf52/architecture.h @@ -109,7 +109,7 @@ #elif defined(HELTEC_MESH_SOLAR) #define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_SOLAR #elif defined(MUZI_BASE) -#define HW_VENDOR meshtastic_HardwareModel_RESERVED_FRIED_CHICKEN +#define HW_VENDOR meshtastic_HardwareModel_MUZI_BASE #else #define HW_VENDOR meshtastic_HardwareModel_NRF52_UNKNOWN #endif From c0529633953befe62a020d65298b33029243d7c8 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 8 Dec 2025 18:48:28 -0600 Subject: [PATCH 236/286] Guard 2M PHY mode for NimBLE (#8890) * Guard 2M PHY mode for NimBLE * Update src/nimble/NimbleBluetooth.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Another #endif snuck in there * Move endif --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/nimble/NimbleBluetooth.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp index 69da25884..3b98eca3d 100644 --- a/src/nimble/NimbleBluetooth.cpp +++ b/src/nimble/NimbleBluetooth.cpp @@ -651,8 +651,8 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks { LOG_INFO("BLE incoming connection %s", connInfo.getAddress().toString().c_str()); -#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) const uint16_t connHandle = connInfo.getConnHandle(); +#if NIMBLE_ENABLE_2M_PHY && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)) int phyResult = ble_gap_set_prefered_le_phy(connHandle, BLE_GAP_LE_PHY_2M_MASK, BLE_GAP_LE_PHY_2M_MASK, BLE_GAP_LE_PHY_CODED_ANY); if (phyResult == 0) { @@ -660,6 +660,7 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks } else { LOG_WARN("Failed to prefer 2M PHY for conn %u, rc=%d", connHandle, phyResult); } +#endif int dataLenResult = ble_gap_set_data_len(connHandle, kPreferredBleTxOctets, kPreferredBleTxTimeUs); if (dataLenResult == 0) { @@ -670,9 +671,10 @@ class NimbleBluetoothServerCallback : public NimBLEServerCallbacks LOG_INFO("BLE conn %u initial MTU %u (target %u)", connHandle, connInfo.getMTU(), kPreferredBleMtu); pServer->updateConnParams(connHandle, 6, 12, 0, 200); -#endif } +#endif +#ifdef NIMBLE_TWO virtual void onDisconnect(NimBLEServer *pServer, NimBLEConnInfo &connInfo, int reason) { LOG_INFO("BLE disconnect reason: %d", reason); @@ -818,7 +820,7 @@ void NimbleBluetooth::setup() NimBLEDevice::init(getDeviceName()); NimBLEDevice::setPower(ESP_PWR_LVL_P9); -#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) +#if NIMBLE_ENABLE_2M_PHY && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)) int mtuResult = NimBLEDevice::setMTU(kPreferredBleMtu); if (mtuResult == 0) { LOG_INFO("BLE MTU request set to %u", kPreferredBleMtu); From 8be7915fc7bfd05993a9dad5c5cf076ef1fc3d2a Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Mon, 8 Dec 2025 19:19:10 -0600 Subject: [PATCH 237/286] Fix wm111111110 --- variants/nrf52840/wio-sdk-wm1110/platformio.ini | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/variants/nrf52840/wio-sdk-wm1110/platformio.ini b/variants/nrf52840/wio-sdk-wm1110/platformio.ini index 2deeeedcf..7c11ef6f6 100644 --- a/variants/nrf52840/wio-sdk-wm1110/platformio.ini +++ b/variants/nrf52840/wio-sdk-wm1110/platformio.ini @@ -8,7 +8,18 @@ extra_scripts = extra_scripts/disable_adafruit_usb.py # Remove adafruit USB serial from the build (it is incompatible with using the ch340 serial chip on this board) -build_unflags = ${nrf52840_base:build_unflags} -DUSBCON -DUSE_TINYUSB +build_unflags = + -Ofast + -Og + -ggdb3 + -ggdb2 + -g3 + -g2 + -g + -g1 + -g0 + -DUSBCON + -DUSE_TINYUSB build_flags = ${nrf52840_base.build_flags} -Ivariants/nrf52840/wio-sdk-wm1110 -Isrc/platform/nrf52/softdevice From 928739e0fb8d1749d780a6d5a70aa241bb61bf1f Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 8 Dec 2025 20:31:28 -0500 Subject: [PATCH 238/286] Renovate: fix malformed comment for wollewald/BH1750_WE (#8767) --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index f560bd8f5..bf828b813 100644 --- a/platformio.ini +++ b/platformio.ini @@ -182,8 +182,8 @@ lib_deps = dfrobot/DFRobot_BMM150@1.0.0 # renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561 adafruit/Adafruit TSL2561@1.1.2 - # renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/BH1750_WE@^1.1.10 - wollewald/BH1750_WE@^1.1.10 + # renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/library/BH1750_WE + wollewald/BH1750_WE@1.1.10 ; (not included in native / portduino) [environmental_extra] From ae8d3fbb3d4fb45a0162bc70b6f8ccb37fc677c0 Mon Sep 17 00:00:00 2001 From: phaseloop <90922095+phaseloop@users.noreply.github.com> Date: Tue, 9 Dec 2025 02:59:14 +0100 Subject: [PATCH 239/286] Cut NRF52 bluetooth power usage by 300% - testers needed! (#8858) * Improve NRF52 bluetooth power efficiency * test T114 bad LFXO * T1000 test * force BLE param negotiation --------- Co-authored-by: Ben Meadors --- src/platform/nrf52/NRF52Bluetooth.cpp | 34 +++++++++++++++++-- .../nrf52840/heltec_mesh_node_t114/variant.h | 4 +-- variants/nrf52840/tracker-t1000-e/variant.h | 4 ++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp index 4f7fb4776..f1bc43312 100644 --- a/src/platform/nrf52/NRF52Bluetooth.cpp +++ b/src/platform/nrf52/NRF52Bluetooth.cpp @@ -64,6 +64,16 @@ void onConnect(uint16_t conn_handle) connection->getPeerName(central_name, sizeof(central_name)); LOG_INFO("BLE Connected to %s", central_name); + // negotiate connections params as soon as possible + + ble_gap_conn_params_t newParams; + newParams.min_conn_interval = 24; + newParams.max_conn_interval = 40; + newParams.slave_latency = 5; + newParams.conn_sup_timeout = 400; + + sd_ble_gap_conn_param_update(conn_handle, &newParams); + // Notify UI (or any other interested firmware components) meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::CONNECTED); bluetoothStatus->updateStatus(&newStatus); @@ -119,7 +129,7 @@ void startAdv(void) Bluefruit.Advertising.addService(meshBleService); /* Start Advertising * - Enable auto advertising if disconnected - * - Interval: fast mode = 20 ms, slow mode = 152.5 ms + * - Interval: fast mode = 20 ms, slow mode = 417,5 ms * - Timeout for fast mode is 30 seconds * - Start(timeout) with timeout = 0 will advertise forever (until connected) * @@ -127,7 +137,7 @@ void startAdv(void) * https://developer.apple.com/library/content/qa/qa1931/_index.html */ Bluefruit.Advertising.restartOnDisconnect(true); - Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms + Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds. FIXME, we should stop advertising after X } @@ -272,6 +282,24 @@ void NRF52Bluetooth::setup() // Set the connect/disconnect callback handlers Bluefruit.Periph.setConnectCallback(onConnect); Bluefruit.Periph.setDisconnectCallback(onDisconnect); + + // Set slave latency to 5 to conserve power + // Despite name this does not impact data transfer + // https://docs.silabs.com/bluetooth/2.13/bluetooth-general-system-and-performance/optimizing-current-consumption-in-bluetooth-low-energy-devices + + Bluefruit.Periph.setConnSlaveLatency(5); + + // TODO: Adafruit defaul min, max interval seems to be (20,30) [in 1.25 ms units] -> (25.00, 31.25) milliseconds + // so using formula Interval Max * (Slave Latency + 1) ≤ 2 seconds + // max slave latency we can use is 30 (max available in BLE) + // and even double max inteval (see apple doc linked above for formulas) + // See Periph.SetConnInterval method + + // Tweak this later for even more power savings once those changes are confirmed to work well. + // Changing min, max interval may slow BLE transfer a bit - bumping slave latency will most likely not. + + + #ifndef BLE_DFU_SECURE bledfu.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM); bledfu.begin(); // Install the DFU helper @@ -300,7 +328,7 @@ void NRF52Bluetooth::setup() void NRF52Bluetooth::resumeAdvertising() { Bluefruit.Advertising.restartOnDisconnect(true); - Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms + Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); } diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index 28404fcce..03c5aafd2 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -21,8 +21,8 @@ /** Master clock frequency */ #define VARIANT_MCK (64000000ul) -#define USE_LFXO // Board uses 32khz crystal for LF - +//#define USE_LFXO // Board uses 32khz crystal for LF +#define USE_LFRC // Board uses RC for LF /*---------------------------------------------------------------------------- * Headers *----------------------------------------------------------------------------*/ diff --git a/variants/nrf52840/tracker-t1000-e/variant.h b/variants/nrf52840/tracker-t1000-e/variant.h index 5b6719e12..ff63a4155 100644 --- a/variants/nrf52840/tracker-t1000-e/variant.h +++ b/variants/nrf52840/tracker-t1000-e/variant.h @@ -22,7 +22,9 @@ /** Master clock frequency */ #define VARIANT_MCK (64000000ul) -#define USE_LFXO // Board uses 32khz crystal for LF +//#define USE_LFXO // Board uses 32khz crystal for LF + +#define USE_LFRC /*---------------------------------------------------------------------------- * Headers From 042543eb25fd66410e942430c6eab0519adf61d0 Mon Sep 17 00:00:00 2001 From: Lewis He Date: Tue, 9 Dec 2025 19:39:27 +0800 Subject: [PATCH 240/286] Fixed the issue where T-Echo did not completely shut down peripherals upon power-off. (#8524) Co-authored-by: Ben Meadors --- src/platform/nrf52/main-nrf52.cpp | 10 ++++++++++ variants/nrf52840/t-echo/variant.h | 3 +-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index c03cc4454..5d1ba20ba 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -335,6 +335,16 @@ void cpuDeepSleep(uint32_t msecToWake) if (Serial1) // A straightforward solution to the wake from deepsleep problem Serial1.end(); #endif + +#ifdef TTGO_T_ECHO + // To power off the T-Echo, the display must be set + // as an input pin; otherwise, there will be leakage current. + pinMode(PIN_EINK_CS, INPUT); + pinMode(PIN_EINK_DC, INPUT); + pinMode(PIN_EINK_RES, INPUT); + pinMode(PIN_EINK_BUSY, INPUT); +#endif + setBluetoothEnable(false); #ifdef RAK4630 diff --git a/variants/nrf52840/t-echo/variant.h b/variants/nrf52840/t-echo/variant.h index 4f3a53ebf..37d3368c3 100644 --- a/variants/nrf52840/t-echo/variant.h +++ b/variants/nrf52840/t-echo/variant.h @@ -181,7 +181,7 @@ External serial flash WP25R1635FZUIL0 #define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake // Seems to be missing on this new board -// #define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS +#define PIN_GPS_PPS (32 + 4) // Pulse per second input from the GPS #define GPS_TX_PIN (32 + 9) // This is for bits going TOWARDS the CPU #define GPS_RX_PIN (32 + 8) // This is for bits going TOWARDS the GPS @@ -203,7 +203,6 @@ External serial flash WP25R1635FZUIL0 #define PIN_SPI_MOSI (0 + 22) #define PIN_SPI_SCK (0 + 19) -#define PIN_PWR_EN (0 + 6) // To debug via the segger JLINK console rather than the CDC-ACM serial device // #define USE_SEGGER From 6b11991be048cff335044cccaaae21e22b52c1ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 06:03:52 -0600 Subject: [PATCH 241/286] Upgrade trunk (#8856) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 95e5b0dd2..80851e6d5 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,24 +9,24 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.30.4 + - renovate@42.40.3 - prettier@3.7.4 - trufflehog@3.91.2 - yamllint@1.37.1 - bandit@1.9.2 - - trivy@0.67.2 + - trivy@0.68.1 - taplo@0.10.0 - - ruff@0.14.7 + - ruff@0.14.8 - isort@7.0.0 - markdownlint@0.46.0 - - oxipng@9.1.5 + - oxipng@10.0.0 - svgo@4.0.0 - actionlint@1.7.9 - flake8@7.3.0 - hadolint@2.14.0 - shfmt@3.6.0 - shellcheck@0.11.0 - - black@25.11.0 + - black@25.12.0 - git-diff-check - gitleaks@8.30.0 - clang-format@16.0.3 From 69b9977fc11e13135ec7f5559bbb4f7139e9a3b8 Mon Sep 17 00:00:00 2001 From: Austin Lane Date: Tue, 9 Dec 2025 07:48:30 -0500 Subject: [PATCH 242/286] Fix apply device-install permissions device-install.sh doesn't exist for non-esp32 targets --- .github/workflows/build_one_target.yml | 4 ++-- .github/workflows/main_matrix.yml | 8 ++++---- .github/workflows/merge_queue.yml | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index 02aad5a9c..9d9e0114b 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -139,8 +139,8 @@ jobs: - name: Device scripts permissions run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh + chmod +x ./output/device-install.sh || true + chmod +x ./output/device-update.sh || true - name: Zip firmware run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index b4f4c3d11..f48a7ebd0 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -207,8 +207,8 @@ jobs: - name: Device scripts permissions run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh + chmod +x ./output/device-install.sh || true + chmod +x ./output/device-update.sh || true - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output @@ -338,8 +338,8 @@ jobs: - name: Device scripts permissions run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh + chmod +x ./output/device-install.sh || true + chmod +x ./output/device-update.sh || true - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index b9bb3ceed..a71afad9d 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -188,8 +188,8 @@ jobs: - name: Device scripts permissions run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh + chmod +x ./output/device-install.sh || true + chmod +x ./output/device-update.sh || true - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output @@ -303,8 +303,8 @@ jobs: - name: Device scripts permissions run: | - chmod +x ./output/device-install.sh - chmod +x ./output/device-update.sh + chmod +x ./output/device-install.sh || true + chmod +x ./output/device-update.sh || true - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output From e691bd97324cd01960b783721218a7db4e1dff44 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 9 Dec 2025 08:02:04 -0600 Subject: [PATCH 243/286] Revert "Cut NRF52 bluetooth power usage by 300% - testers needed! (#8858)" This reverts commit ae8d3fbb3d4fb45a0162bc70b6f8ccb37fc677c0. --- src/platform/nrf52/NRF52Bluetooth.cpp | 34 ++----------------- .../nrf52840/heltec_mesh_node_t114/variant.h | 4 +-- variants/nrf52840/tracker-t1000-e/variant.h | 4 +-- 3 files changed, 6 insertions(+), 36 deletions(-) diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp index f1bc43312..4f7fb4776 100644 --- a/src/platform/nrf52/NRF52Bluetooth.cpp +++ b/src/platform/nrf52/NRF52Bluetooth.cpp @@ -64,16 +64,6 @@ void onConnect(uint16_t conn_handle) connection->getPeerName(central_name, sizeof(central_name)); LOG_INFO("BLE Connected to %s", central_name); - // negotiate connections params as soon as possible - - ble_gap_conn_params_t newParams; - newParams.min_conn_interval = 24; - newParams.max_conn_interval = 40; - newParams.slave_latency = 5; - newParams.conn_sup_timeout = 400; - - sd_ble_gap_conn_param_update(conn_handle, &newParams); - // Notify UI (or any other interested firmware components) meshtastic::BluetoothStatus newStatus(meshtastic::BluetoothStatus::ConnectionState::CONNECTED); bluetoothStatus->updateStatus(&newStatus); @@ -129,7 +119,7 @@ void startAdv(void) Bluefruit.Advertising.addService(meshBleService); /* Start Advertising * - Enable auto advertising if disconnected - * - Interval: fast mode = 20 ms, slow mode = 417,5 ms + * - Interval: fast mode = 20 ms, slow mode = 152.5 ms * - Timeout for fast mode is 30 seconds * - Start(timeout) with timeout = 0 will advertise forever (until connected) * @@ -137,7 +127,7 @@ void startAdv(void) * https://developer.apple.com/library/content/qa/qa1931/_index.html */ Bluefruit.Advertising.restartOnDisconnect(true); - Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms + Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds. FIXME, we should stop advertising after X } @@ -282,24 +272,6 @@ void NRF52Bluetooth::setup() // Set the connect/disconnect callback handlers Bluefruit.Periph.setConnectCallback(onConnect); Bluefruit.Periph.setDisconnectCallback(onDisconnect); - - // Set slave latency to 5 to conserve power - // Despite name this does not impact data transfer - // https://docs.silabs.com/bluetooth/2.13/bluetooth-general-system-and-performance/optimizing-current-consumption-in-bluetooth-low-energy-devices - - Bluefruit.Periph.setConnSlaveLatency(5); - - // TODO: Adafruit defaul min, max interval seems to be (20,30) [in 1.25 ms units] -> (25.00, 31.25) milliseconds - // so using formula Interval Max * (Slave Latency + 1) ≤ 2 seconds - // max slave latency we can use is 30 (max available in BLE) - // and even double max inteval (see apple doc linked above for formulas) - // See Periph.SetConnInterval method - - // Tweak this later for even more power savings once those changes are confirmed to work well. - // Changing min, max interval may slow BLE transfer a bit - bumping slave latency will most likely not. - - - #ifndef BLE_DFU_SECURE bledfu.setPermission(SECMODE_ENC_WITH_MITM, SECMODE_ENC_WITH_MITM); bledfu.begin(); // Install the DFU helper @@ -328,7 +300,7 @@ void NRF52Bluetooth::setup() void NRF52Bluetooth::resumeAdvertising() { Bluefruit.Advertising.restartOnDisconnect(true); - Bluefruit.Advertising.setInterval(32, 668); // in unit of 0.625 ms + Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode Bluefruit.Advertising.start(0); } diff --git a/variants/nrf52840/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h index 03c5aafd2..28404fcce 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/variant.h +++ b/variants/nrf52840/heltec_mesh_node_t114/variant.h @@ -21,8 +21,8 @@ /** Master clock frequency */ #define VARIANT_MCK (64000000ul) -//#define USE_LFXO // Board uses 32khz crystal for LF -#define USE_LFRC // Board uses RC for LF +#define USE_LFXO // Board uses 32khz crystal for LF + /*---------------------------------------------------------------------------- * Headers *----------------------------------------------------------------------------*/ diff --git a/variants/nrf52840/tracker-t1000-e/variant.h b/variants/nrf52840/tracker-t1000-e/variant.h index ff63a4155..5b6719e12 100644 --- a/variants/nrf52840/tracker-t1000-e/variant.h +++ b/variants/nrf52840/tracker-t1000-e/variant.h @@ -22,9 +22,7 @@ /** Master clock frequency */ #define VARIANT_MCK (64000000ul) -//#define USE_LFXO // Board uses 32khz crystal for LF - -#define USE_LFRC +#define USE_LFXO // Board uses 32khz crystal for LF /*---------------------------------------------------------------------------- * Headers From 817f3b9ec89b43d2510fcb942386e01e7edba170 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 9 Dec 2025 10:57:02 -0500 Subject: [PATCH 244/286] Update platformio/espressif32 to v6.12.0 (#7697) --- extra_scripts/esp32_extra.py | 6 ++++++ variants/esp32/esp32.ini | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/extra_scripts/esp32_extra.py b/extra_scripts/esp32_extra.py index 8841ad1dc..f7698561a 100755 --- a/extra_scripts/esp32_extra.py +++ b/extra_scripts/esp32_extra.py @@ -10,6 +10,12 @@ Import("env") platform = env.PioPlatform() sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) +# IntelHex workaround, remove after fixed upstream +# https://github.com/platformio/platform-espressif32/issues/1632 +try: + import intelhex +except ImportError: + env.Execute("$PYTHONEXE -m pip install intelhex") import esptool diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini index 5171bc45c..4bc48cebb 100644 --- a/variants/esp32/esp32.ini +++ b/variants/esp32/esp32.ini @@ -5,7 +5,7 @@ custom_esp32_kind = esp32 custom_mtjson_part = platform = # renovate: datasource=custom.pio depName=platformio/espressif32 packageName=platformio/platform/espressif32 - platformio/espressif32@6.11.0 + platformio/espressif32@6.12.0 extra_scripts = ${env.extra_scripts} From d75680a2dd426fef9a66a2737d1a56acbdfdc05a Mon Sep 17 00:00:00 2001 From: Igor Danilov <59930161+polarikus@users.noreply.github.com> Date: Tue, 9 Dec 2025 21:24:41 +0300 Subject: [PATCH 245/286] Fix #8915 [Bug]: Exception Decoder does not recognize the backtrace (#8917) --- bin/exception_decoder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/exception_decoder.py b/bin/exception_decoder.py index ec94ce20e..ffe6d3f24 100755 --- a/bin/exception_decoder.py +++ b/bin/exception_decoder.py @@ -75,7 +75,7 @@ TOOLS = { } BACKTRACE_REGEX = re.compile( - r"(?:\s+(0x40[0-2](?:\d|[a-f]|[A-F]){5}):0x(?:\d|[a-f]|[A-F]){8})\b" + r"\b(0x4[0-9a-fA-F]{7,8}):0x[0-9a-fA-F]{8}\b" ) EXCEPTION_REGEX = re.compile("^Exception \\((?P[0-9]*)\\):$") COUNTER_REGEX = re.compile( @@ -89,7 +89,7 @@ POINTER_REGEX = re.compile( STACK_BEGIN = ">>>stack>>>" STACK_END = "<<[0-9a-f]+):\W+(?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+)(\W.*)?$" + r"^(?P[0-9a-f]+):\W+(?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+) (?P[0-9a-f]+)(\W.*)?$" ) StackLine = namedtuple("StackLine", ["offset", "content"]) @@ -223,7 +223,7 @@ class AddressResolver(object): if match is None: if last is not None and line.startswith("(inlined by)"): line = line[12:].strip() - self._address_map[last] += "\n \-> inlined by: " + line + self._address_map[last] += "\n \\-> inlined by: " + line continue if match.group("result") == "?? ??:0": From aa605fc4a2211974e8e9b5c22bf496f69a2b16ee Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 9 Dec 2025 15:27:13 -0500 Subject: [PATCH 246/286] Actions: Fix release manifest formating (#8918) --- .github/workflows/main_matrix.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index f48a7ebd0..acd63f28f 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -280,9 +280,9 @@ jobs: - name: Generate Release manifest run: | - jq -n --arg ver "${{ needs.version.outputs.long }}" --arg targets "${{ toJson(needs.setup.outputs.all) }}" '{ + jq -n --arg ver "${{ needs.version.outputs.long }}" --argjson targets ${{ toJson(needs.setup.outputs.all) }} '{ "version": $ver, - "targets": ($targets | fromjson) + "targets": $targets }' > firmware-${{ needs.version.outputs.long }}.json - name: Save Release manifest artifact From c55bea846094d491809c1f2c1277d351e08e5771 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 9 Dec 2025 16:11:07 -0500 Subject: [PATCH 247/286] ARCtastic (#8904) -- Do It Live! Actions Runner Controller Co-authored-by: Jonathan Bennett --- .github/actionlint.yaml | 1 + .github/workflows/build_firmware.yml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actionlint.yaml b/.github/actionlint.yaml index f7bf95f83..f79e4fdb5 100644 --- a/.github/actionlint.yaml +++ b/.github/actionlint.yaml @@ -2,4 +2,5 @@ self-hosted-runner: # Labels of self-hosted runner in array of strings. labels: + - arctastic - test-runner diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index c3b70d4c9..28e4ee994 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -18,7 +18,8 @@ permissions: read-all jobs: pio-build: name: build-${{ inputs.platform }} - runs-on: ubuntu-24.04 + # Use 'arctastic' self-hosted runner pool when building in the main repo + runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }} outputs: artifact-id: ${{ steps.upload.outputs.artifact-id }} steps: From ec0dfb73372238953a7a1f6bb01e850df9f4a867 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:56:27 -0600 Subject: [PATCH 248/286] Update peter-evans/create-pull-request action to v8 (#8919) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/release_channels.yml | 2 +- .github/workflows/update_protobufs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml index f21b13ee1..badbb31d4 100644 --- a/.github/workflows/release_channels.yml +++ b/.github/workflows/release_channels.yml @@ -102,7 +102,7 @@ jobs: PIP_DISABLE_PIP_VERSION_CHECK: 1 - name: Create Bumps pull request - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: base: ${{ github.event.repository.default_branch }} branch: create-pull-request/bump-version diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml index af0557fda..d9ef98194 100644 --- a/.github/workflows/update_protobufs.yml +++ b/.github/workflows/update_protobufs.yml @@ -31,7 +31,7 @@ jobs: ./bin/regen-protos.sh - name: Create pull request - uses: peter-evans/create-pull-request@v7 + uses: peter-evans/create-pull-request@v8 with: branch: create-pull-request/update-protobufs labels: submodules From aa72e397f29462001ea29c90b1c08fa3c81fa593 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 9 Dec 2025 17:40:37 -0500 Subject: [PATCH 249/286] PIO: Fix closedcube lib reference (#8920) Fixes ClosedCube reinstalling on every build --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 218b75443..25997e11d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -207,7 +207,7 @@ lib_deps = # renovate: datasource=custom.pio depName=SparkFun Qwiic Scale NAU7802 packageName=sparkfun/library/SparkFun Qwiic Scale NAU7802 Arduino Library sparkfun/SparkFun Qwiic Scale NAU7802 Arduino Library@1.0.6 # renovate: datasource=custom.pio depName=ClosedCube OPT3001 packageName=closedcube/library/ClosedCube OPT3001 - ClosedCube OPT3001@1.1.2 + closedcube/ClosedCube OPT3001@1.1.2 # renovate: datasource=custom.pio depName=Bosch BSEC2 packageName=boschsensortec/library/bsec2 boschsensortec/bsec2@1.10.2610 # renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library From ee80ec7b687075c60a5f1dada33906c5207fda3f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 06:14:00 -0600 Subject: [PATCH 250/286] Upgrade trunk (#8922) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 80851e6d5..565433c38 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,9 +9,9 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.40.3 + - renovate@42.42.2 - prettier@3.7.4 - - trufflehog@3.91.2 + - trufflehog@3.92.1 - yamllint@1.37.1 - bandit@1.9.2 - trivy@0.68.1 From 5910cc2e269cac13275d198434d34be210eb3d9d Mon Sep 17 00:00:00 2001 From: Alex Samorukov Date: Wed, 10 Dec 2025 13:23:23 +0100 Subject: [PATCH 251/286] Use PSRAM to reduce heap usage percentage on ESP32 with PSRAM (#8891) * Use PSRAM for malloc > 256bytes to get more heap memory * Use dynamic allocator on boards with PSRAM to free more heap * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Move heap_caps_malloc_extmem_enable() to the top of the init * Update src/main.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Ben Meadors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main.cpp | 5 +++++ src/mesh/Router.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f8d89e1ba..eb6dea327 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -439,6 +439,11 @@ void setup() LOG_INFO("\n\n//\\ E S H T /\\ S T / C\n"); +#if defined(ARCH_ESP32) && defined(BOARD_HAS_PSRAM) + // use PSRAM for malloc calls > 256 bytes + heap_caps_malloc_extmem_enable(256); +#endif + #if defined(DEBUG_MUTE) && defined(DEBUG_PORT) DEBUG_PORT.printf("\r\n\r\n//\\ E S H T /\\ S T / C\r\n"); DEBUG_PORT.printf("Version %s for %s from %s\r\n", optstr(APP_VERSION), optstr(APP_ENV), optstr(APP_REPO)); diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index 05f47d7f4..54a34fd35 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -37,8 +37,8 @@ static MemoryDynamic dynamicPool; Allocator &packetPool = dynamicPool; -#elif defined(ARCH_STM32WL) -// On STM32 there isn't enough heap left over for the rest of the firmware if we allocate this statically. +#elif defined(ARCH_STM32WL) || defined(BOARD_HAS_PSRAM) +// On STM32 and boards with PSRAM, there isn't enough heap left over for the rest of the firmware if we allocate this statically. // For now, make it dynamic again. #define MAX_PACKETS \ (MAX_RX_TOPHONE + MAX_RX_FROMRADIO + 2 * MAX_TX_QUEUE + \ From 2032ff1c32cf222c3d2a41d9b041f13c7fe71c6d Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 10 Dec 2025 11:09:37 -0600 Subject: [PATCH 252/286] Create new screen colors for BaseUI (#8921) * Create new colors for BaseUI * Update Ice color --- src/graphics/draw/MenuHandler.cpp | 37 ++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index f782dabb6..2a7f479b4 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -1041,12 +1041,13 @@ void menuHandler::switchToMUIMenu() void menuHandler::TFTColorPickerMenu(OLEDDisplay *display) { - static const char *optionsArray[] = {"Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Teal", - "Pink", "White"}; + static const char *optionsArray[] = { + "Back", "Default", "Meshtastic Green", "Yellow", "Red", "Orange", "Purple", "Blue", "Teal", "Cyan", "Ice", "Pink", + "White", "Gray"}; BannerOverlayOptions bannerOptions; bannerOptions.message = "Select Screen Color"; bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 10; + bannerOptions.optionsCount = 14; bannerOptions.bannerCallback = [display](int selected) -> void { #if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || defined(T_LORA_PAGER) || \ HAS_TFT || defined(HACKADAY_COMMUNICATOR) @@ -1082,20 +1083,40 @@ void menuHandler::TFTColorPickerMenu(OLEDDisplay *display) TFT_MESH_g = 153; TFT_MESH_b = 255; } else if (selected == 7) { - LOG_INFO("Setting color to Teal"); - TFT_MESH_r = 64; - TFT_MESH_g = 224; - TFT_MESH_b = 208; + LOG_INFO("Setting color to Blue"); + TFT_MESH_r = 0; + TFT_MESH_g = 0; + TFT_MESH_b = 255; } else if (selected == 8) { + LOG_INFO("Setting color to Teal"); + TFT_MESH_r = 16; + TFT_MESH_g = 102; + TFT_MESH_b = 102; + } else if (selected == 9) { + LOG_INFO("Setting color to Cyan"); + TFT_MESH_r = 0; + TFT_MESH_g = 255; + TFT_MESH_b = 255; + } else if (selected == 10) { + LOG_INFO("Setting color to Ice"); + TFT_MESH_r = 173; + TFT_MESH_g = 216; + TFT_MESH_b = 230; + } else if (selected == 11) { LOG_INFO("Setting color to Pink"); TFT_MESH_r = 255; TFT_MESH_g = 105; TFT_MESH_b = 180; - } else if (selected == 9) { + } else if (selected == 12) { LOG_INFO("Setting color to White"); TFT_MESH_r = 255; TFT_MESH_g = 255; TFT_MESH_b = 255; + } else if (selected == 13) { + LOG_INFO("Setting color to Gray"); + TFT_MESH_r = 128; + TFT_MESH_g = 128; + TFT_MESH_b = 128; } else { menuQueue = system_base_menu; screen->runNow(); From 83b603827c85630883e49de605967fab5de3c7fd Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 10 Dec 2025 16:29:50 -0600 Subject: [PATCH 253/286] Enable Muzi-base LED notification (#8925) --- src/mesh/NodeDB.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index d3000c500..192f29553 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -805,11 +805,15 @@ void NodeDB::installDefaultModuleConfig() moduleConfig.external_notification.output_ms = 500; moduleConfig.external_notification.nag_timeout = 2; #endif -#if defined(RAK4630) || defined(RAK11310) || defined(RAK3312) +#if defined(RAK4630) || defined(RAK11310) || defined(RAK3312) || defined(MUZI_BASE) // Default to RAK led pin 2 (blue) moduleConfig.external_notification.enabled = true; moduleConfig.external_notification.output = PIN_LED2; +#if defined(MUZI_BASE) + moduleConfig.external_notification.active = false; +#else moduleConfig.external_notification.active = true; +#endif moduleConfig.external_notification.alert_message = true; moduleConfig.external_notification.output_ms = 1000; moduleConfig.external_notification.nag_timeout = default_ringtone_nag_secs; From ff0a4ea3207cba2eeb8b9b61ec1b7dc1510f3b21 Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 10 Dec 2025 16:30:26 -0600 Subject: [PATCH 254/286] Update System Frame for improved rendering on devices (#8923) --- src/graphics/draw/DebugRenderer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp index 1b3a148d6..ceb3b83f5 100644 --- a/src/graphics/draw/DebugRenderer.cpp +++ b/src/graphics/draw/DebugRenderer.cpp @@ -532,8 +532,10 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x const int labelX = x; int barsOffset = (isHighResolution) ? 24 : 0; #ifdef USE_EINK +#ifndef T_DECK_PRO barsOffset -= 12; #endif +#endif #if defined(M5STACK_UNITC6L) const int barX = x + 45 + barsOffset; #else @@ -574,7 +576,7 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x #endif // Value string display->setTextAlignment(TEXT_ALIGN_RIGHT); - display->drawString(SCREEN_WIDTH - 2, getTextPositions(display)[line], combinedStr); + display->drawString(SCREEN_WIDTH, getTextPositions(display)[line], combinedStr); }; // === Memory values === From fba92229a67d47123d0d2c36423b9605050da0ad Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 10 Dec 2025 18:01:52 -0600 Subject: [PATCH 255/286] Add I2C device check for seesaw device on native (#8927) It turns out the logic here was attempting to access i2c without being told to do so. Not good, especially on desktops. --- src/modules/Modules.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp index f918d630f..63392f7e4 100644 --- a/src/modules/Modules.cpp +++ b/src/modules/Modules.cpp @@ -217,7 +217,7 @@ void setupModules() } #endif // HAS_BUTTON #if ARCH_PORTDUINO - if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) { + if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR && portduino_config.i2cdev != "") { seesawRotary = new SeesawRotary("SeesawRotary"); if (!seesawRotary->init()) { delete seesawRotary; From fff2bbf4a0158aa499fbc6904e0d0e60d7dfbb0f Mon Sep 17 00:00:00 2001 From: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:05:26 -0800 Subject: [PATCH 256/286] Use truncated position for smart position (#8906) --- src/modules/PositionModule.cpp | 54 +++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index 8b6a9f19c..776c3b5a6 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -45,8 +45,12 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes { auto p = *pptr; - // If inbound message is a replay (or spoof!) of our own messages, we shouldn't process - // (why use second-hand sources for our own data?) + const auto transport = mp.transport_mechanism; + if (isFromUs(&mp) && !IS_ONE_OF(transport, meshtastic_MeshPacket_TransportMechanism_TRANSPORT_INTERNAL, + meshtastic_MeshPacket_TransportMechanism_TRANSPORT_API)) { + LOG_WARN("Ignoring packet supposedly from us over external transport"); + return true; + } // FIXME this can in fact happen with packets sent from EUD (src=RX_SRC_USER) // to set fixed location, EUD-GPS location or just the time (see also issue #900) @@ -472,19 +476,53 @@ void PositionModule::sendLostAndFoundText() delete[] message; } +// Helper: return imprecise (truncated + centered) lat/lon as int32 using current precision +static inline void computeImpreciseLatLon(int32_t inLat, int32_t inLon, uint8_t precisionBits, int32_t &outLat, int32_t &outLon) +{ + if (precisionBits > 0 && precisionBits < 32) { + // Build mask for top 'precisionBits' bits of a 32-bit unsigned field + const uint32_t mask = (precisionBits == 32) ? UINT32_MAX : (UINT32_MAX << (32 - precisionBits)); + // Note: latitude_i/longitude_i are stored as signed 32-bit in meshtastic code but + // the bitmask logic used previously operated as unsigned—preserve that behavior by + // casting to uint32_t for masking, then back to int32_t. + uint32_t lat_u = static_cast(inLat) & mask; + uint32_t lon_u = static_cast(inLon) & mask; + + // Add the "center of cell" offset used elsewhere: + // The code previously added (1 << (31 - precision)) to produce the middle of the possible location. + uint32_t center_offset = (1u << (31 - precisionBits)); + lat_u += center_offset; + lon_u += center_offset; + + outLat = static_cast(lat_u); + outLon = static_cast(lon_u); + } else { + // full precision: return input unchanged + outLat = inLat; + outLon = inLon; + } +} + struct SmartPosition PositionModule::getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition) { - // The minimum distance to travel before we are able to send a new position packet. const uint32_t distanceTravelThreshold = Default::getConfiguredOrDefault(config.position.broadcast_smart_minimum_distance, 100); - // Determine the distance in meters between two points on the globe - float distanceTraveledSinceLastSend = GeoCoord::latLongToMeter( - lastGpsLatitude * 1e-7, lastGpsLongitude * 1e-7, currentPosition.latitude_i * 1e-7, currentPosition.longitude_i * 1e-7); + int32_t lastLatImprecise, lastLonImprecise; + int32_t currentLatImprecise, currentLonImprecise; - return SmartPosition{.distanceTraveled = abs(distanceTraveledSinceLastSend), + computeImpreciseLatLon(lastGpsLatitude, lastGpsLongitude, precision, lastLatImprecise, lastLonImprecise); + computeImpreciseLatLon(currentPosition.latitude_i, currentPosition.longitude_i, precision, currentLatImprecise, + currentLonImprecise); + + float distMeters = GeoCoord::latLongToMeter(lastLatImprecise * 1e-7, lastLonImprecise * 1e-7, currentLatImprecise * 1e-7, + currentLonImprecise * 1e-7); + + float distanceTraveled = fabsf(distMeters); + + return SmartPosition{.distanceTraveled = distanceTraveled, .distanceThreshold = distanceTravelThreshold, - .hasTraveledOverThreshold = abs(distanceTraveledSinceLastSend) >= distanceTravelThreshold}; + .hasTraveledOverThreshold = distanceTraveled >= distanceTravelThreshold}; } void PositionModule::handleNewPosition() From 6f725a19961eca276b3ef5558e99a410677929e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 05:25:46 -0600 Subject: [PATCH 257/286] Upgrade trunk (#8932) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 565433c38..a38d90f9f 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,16 +9,16 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.42.2 + - renovate@42.44.0 - prettier@3.7.4 - - trufflehog@3.92.1 + - trufflehog@3.92.2 - yamllint@1.37.1 - bandit@1.9.2 - trivy@0.68.1 - taplo@0.10.0 - ruff@0.14.8 - isort@7.0.0 - - markdownlint@0.46.0 + - markdownlint@0.47.0 - oxipng@10.0.0 - svgo@4.0.0 - actionlint@1.7.9 From 3b2a1547deb10404878ee2c79253e8049bb1f68b Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Thu, 11 Dec 2025 06:23:08 -0600 Subject: [PATCH 258/286] More board_level extras --- variants/esp32/diy/dr-dev/platformio.ini | 1 + variants/esp32/tbeam/platformio.ini | 2 +- variants/esp32s3/link32_s3_v1/platformio.ini | 1 + variants/rp2040/feather_rp2040_rfm95/platformio.ini | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/variants/esp32/diy/dr-dev/platformio.ini b/variants/esp32/diy/dr-dev/platformio.ini index 5461d27b3..9dd9b450b 100644 --- a/variants/esp32/diy/dr-dev/platformio.ini +++ b/variants/esp32/diy/dr-dev/platformio.ini @@ -2,6 +2,7 @@ [env:meshtastic-dr-dev] extends = esp32_base board = esp32doit-devkit-v1 +board_level = extra board_upload.maximum_size = 4194304 board_upload.maximum_ram_size = 532480 build_flags = diff --git a/variants/esp32/tbeam/platformio.ini b/variants/esp32/tbeam/platformio.ini index c635081ff..ddb8e9c9f 100644 --- a/variants/esp32/tbeam/platformio.ini +++ b/variants/esp32/tbeam/platformio.ini @@ -2,7 +2,7 @@ [env:tbeam] extends = esp32_base board = ttgo-t-beam -board_level = pr +board_level = extra board_check = true lib_deps = ${esp32_base.lib_deps} build_flags = ${esp32_base.build_flags} diff --git a/variants/esp32s3/link32_s3_v1/platformio.ini b/variants/esp32s3/link32_s3_v1/platformio.ini index 8d88075c4..8ad45eed1 100644 --- a/variants/esp32s3/link32_s3_v1/platformio.ini +++ b/variants/esp32s3/link32_s3_v1/platformio.ini @@ -1,6 +1,7 @@ [env:link32-s3-v1] extends = esp32s3_base board = esp32-s3-devkitc-1 +board_level = extra build_flags = ${esp32_base.build_flags} -D LINK_32 diff --git a/variants/rp2040/feather_rp2040_rfm95/platformio.ini b/variants/rp2040/feather_rp2040_rfm95/platformio.ini index ef4118cb0..b3b185071 100644 --- a/variants/rp2040/feather_rp2040_rfm95/platformio.ini +++ b/variants/rp2040/feather_rp2040_rfm95/platformio.ini @@ -1,6 +1,7 @@ [env:feather_rp2040_rfm95] extends = rp2040_base board = adafruit_feather +board_level = extra upload_protocol = picotool # add our variants files to the include and src paths build_flags = From a8fa5f25cb68bda4c432474ec4b9054389520e91 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Thu, 11 Dec 2025 10:23:45 -0600 Subject: [PATCH 259/286] Properly turn off power pins at shutdown for m3 (#8935) --- variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp index b7a7b7342..9769e3edd 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/variant.cpp @@ -63,9 +63,20 @@ void initVariant() // called from main-nrf52.cpp during the cpuDeepSleep() function void variant_shutdown() { + digitalWrite(red_LED_PIN, HIGH); + digitalWrite(green_LED_PIN, HIGH); + digitalWrite(LED_BLUE, HIGH); + + digitalWrite(PIN_EN1, LOW); + digitalWrite(PIN_EN2, LOW); digitalWrite(EEPROM_POWER, LOW); digitalWrite(KEY_POWER, LOW); + digitalWrite(DHT_POWER, LOW); + digitalWrite(ACC_POWER, LOW); + digitalWrite(Battery_POWER, LOW); + digitalWrite(GPS_POWER, LOW); + // This sets the pin to OUTPUT and LOW for the pins *not* in the if block. for (int pin = 0; pin < 48; pin++) { if (pin == PIN_POWER_USB || pin == BUTTON_PIN || pin == PIN_EN1 || pin == PIN_EN2 || pin == DHT_POWER || pin == ACC_POWER || pin == Battery_POWER || pin == GPS_POWER || pin == LR1110_SPI_MISO_PIN || From 4ef943f204a8d9fdd725a8e1621f98852c8930d1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 10:32:28 -0600 Subject: [PATCH 260/286] Update meshtastic/device-ui digest to 2746a1c (#8936) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 25997e11d..60e66d39b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -123,7 +123,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/4fb5f24787caa841b58dbf623a52c4c5861d6722.zip + https://github.com/meshtastic/device-ui/archive/2746a1ce3804998460a2cb319b8ea8a238dfd8c9.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From 4fc96bdf832cdc56dbf0d4a6d1b04301d50e59d5 Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 11 Dec 2025 13:26:21 -0500 Subject: [PATCH 261/286] Use 'gh-action-runner' action for "Check" jobs. (#8938) Everything's pre-baked, 503 no more! --- .github/workflows/main_matrix.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index acd63f28f..eb1ccdff0 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -77,16 +77,21 @@ jobs: fail-fast: false matrix: check: ${{ fromJson(needs.setup.outputs.check) }} - - runs-on: ubuntu-latest + # Use 'arctastic' self-hosted runner pool when checking in the main repo + runs-on: ${{ github.repository_owner == 'meshtastic' && 'arctastic' || 'ubuntu-latest' }} if: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'meshtastic/firmware' }} steps: - uses: actions/checkout@v6 - - name: Build base - id: base - uses: ./.github/actions/setup-base + with: + submodules: recursive + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - name: Check ${{ matrix.check.board }} - run: bin/check-all.sh ${{ matrix.check.board }} + uses: meshtastic/gh-action-firmware@main + with: + pio_platform: ${{ matrix.check.platform }} + pio_env: ${{ matrix.check.board }} + pio_target: check build: needs: [setup, version] From bcfe069997ee0002f07ed07fd6c802e2610843ef Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 11 Dec 2025 20:01:31 -0500 Subject: [PATCH 262/286] Optimize builds to reduce duplicate dependency checks (#8943) 'mtjson' will now build all required pieces when they don't exist --- bin/build-esp32.sh | 16 +++------------- bin/build-nrf52.sh | 7 ++----- bin/build-rp2xx0.sh | 7 ++----- bin/build-stm32wl.sh | 7 ++----- bin/platformio-custom.py | 20 +++++++++++--------- bin/platformio-pre.py | 3 +++ 6 files changed, 23 insertions(+), 37 deletions(-) diff --git a/bin/build-esp32.sh b/bin/build-esp32.sh index 8c684aa7e..4e799b30a 100755 --- a/bin/build-esp32.sh +++ b/bin/build-esp32.sh @@ -22,7 +22,7 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION -pio run --environment $1 # -v +pio run --environment $1 -t mtjson # -v cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf @@ -32,20 +32,10 @@ cp $BUILDDIR/$basename.factory.bin $OUTDIR/$basename.factory.bin echo "Copying ESP32 update bin file" cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin -echo "Building Filesystem for ESP32 targets" -# If you want to build the webui, uncomment the following lines -# pio run --environment $1 -t buildfs -# cp .pio/build/$1/littlefs.bin $OUTDIR/littlefswebui-$1-$VERSION.bin -# # Remove webserver files from the filesystem and rebuild -# ls -l data/static # Diagnostic list of files -# rm -rf data/static -pio run --environment $1 -t buildfs --disable-auto-clean +echo "Copying Filesystem for ESP32 targets" cp $BUILDDIR/littlefs-$1-$VERSION.bin $OUTDIR/littlefs-$1-$VERSION.bin cp bin/device-install.* $OUTDIR/ cp bin/device-update.* $OUTDIR/ -# Generate the manifest file -echo "Generating Meshtastic manifest" -TIMEFORMAT="Generated manifest in %E seconds" -time pio run --environment $1 -t mtjson --silent --disable-auto-clean +echo "Copying manifest" cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-nrf52.sh b/bin/build-nrf52.sh index c605fb1e0..e3a421865 100755 --- a/bin/build-nrf52.sh +++ b/bin/build-nrf52.sh @@ -22,7 +22,7 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION -pio run --environment $1 # -v +pio run --environment $1 -t mtjson # -v cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf @@ -47,8 +47,5 @@ if (echo $1 | grep -q "rak4631"); then cp $SRCHEX $OUTDIR/ fi -# Generate the manifest file -echo "Generating Meshtastic manifest" -TIMEFORMAT="Generated manifest in %E seconds" -time pio run --environment $1 -t mtjson --silent --disable-auto-clean +echo "Copying manifest" cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-rp2xx0.sh b/bin/build-rp2xx0.sh index ae26fdfbf..3ef1c1e34 100755 --- a/bin/build-rp2xx0.sh +++ b/bin/build-rp2xx0.sh @@ -22,15 +22,12 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION -pio run --environment $1 # -v +pio run --environment $1 -t mtjson # -v cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf echo "Copying uf2 file" cp $BUILDDIR/$basename.uf2 $OUTDIR/$basename.uf2 -# Generate the manifest file -echo "Generating Meshtastic manifest" -TIMEFORMAT="Generated manifest in %E seconds" -time pio run --environment $1 -t mtjson --silent --disable-auto-clean +echo "Copying manifest" cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/build-stm32wl.sh b/bin/build-stm32wl.sh index b85da04a6..023f3603c 100755 --- a/bin/build-stm32wl.sh +++ b/bin/build-stm32wl.sh @@ -22,15 +22,12 @@ export APP_VERSION=$VERSION basename=firmware-$1-$VERSION -pio run --environment $1 # -v +pio run --environment $1 -t mtjson # -v cp $BUILDDIR/$basename.elf $OUTDIR/$basename.elf echo "Copying STM32 bin file" cp $BUILDDIR/$basename.bin $OUTDIR/$basename.bin -# Generate the manifest file -echo "Generating Meshtastic manifest" -TIMEFORMAT="Generated manifest in %E seconds" -time pio run --environment $1 -t mtjson --silent --disable-auto-clean +echo "Copying manifest" cp $BUILDDIR/$basename.mt.json $OUTDIR/$basename.mt.json diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py index 151cf0a97..3fdbffb70 100644 --- a/bin/platformio-custom.py +++ b/bin/platformio-custom.py @@ -159,20 +159,22 @@ def load_boot_logo(source, target, env): # Load the boot logo on TFT builds if ("HAS_TFT", 1) in env.get("CPPDEFINES", []): - env.AddPreAction('$BUILD_DIR/littlefs.bin', load_boot_logo) + env.AddPreAction(f"$BUILD_DIR/{lfsbin}", load_boot_logo) -# Rename (mv) littlefs.bin to include the PROGNAME -# This ensures the littlefs.bin is named consistently with the firmware -env.AddPostAction('$BUILD_DIR/littlefs.bin', env.VerboseAction( - f'mv $BUILD_DIR/littlefs.bin $BUILD_DIR/{lfsbin}', - f'Renaming littlefs.bin to {lfsbin}' -)) +mtjson_deps = ["buildprog"] +if platform.name == "espressif32": + # Build littlefs image as part of mtjson target + # Equivalent to `pio run -t buildfs` + target_lfs = env.DataToBin( + join("$BUILD_DIR", "${ESP32_FS_IMAGE_NAME}"), "$PROJECT_DATA_DIR" + ) + mtjson_deps.append(target_lfs) env.AddCustomTarget( name="mtjson", - dependencies=None, + dependencies=mtjson_deps, actions=[manifest_gather], title="Meshtastic Manifest", description="Generating Meshtastic manifest JSON + Checksums", - always_build=True, + always_build=False, ) diff --git a/bin/platformio-pre.py b/bin/platformio-pre.py index 4e51a6544..16278b813 100644 --- a/bin/platformio-pre.py +++ b/bin/platformio-pre.py @@ -11,6 +11,9 @@ else: prefsLoc = env["PROJECT_DIR"] + "/version.properties" verObj = readProps(prefsLoc) env.Replace(PROGNAME=f"firmware-{env.get('PIOENV')}-{verObj['long']}") + env.Replace(ESP32_FS_IMAGE_NAME=f"littlefs-{env.get('PIOENV')}-{verObj['long']}") # Print the new program name for verification print(f"PROGNAME: {env.get('PROGNAME')}") +if platform.name == "espressif32": + print(f"ESP32_FS_IMAGE_NAME: {env.get('ESP32_FS_IMAGE_NAME')}") From 2ac74d66771deff85f0d3f3cfd48da693d848a0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 19:03:14 -0600 Subject: [PATCH 263/286] Update actions/cache action to v5 (#8944) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/build-variant/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml index a1e8dd852..69152290d 100644 --- a/.github/actions/build-variant/action.yml +++ b/.github/actions/build-variant/action.yml @@ -76,7 +76,7 @@ runs: done - name: PlatformIO ${{ inputs.arch }} download cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.platformio/.cache key: pio-cache-${{ inputs.arch }}-${{ hashFiles('.github/actions/**', '**.ini') }} From c8628b342279963e2e6688f2cac9e1bdebf6bd69 Mon Sep 17 00:00:00 2001 From: Igor Danilov <59930161+polarikus@users.noreply.github.com> Date: Fri, 12 Dec 2025 04:04:15 +0300 Subject: [PATCH 264/286] Fix #8899 [Bug]: [TloraPager] RotaryEncoder crash (#8933) * Fix #8899 [Bug]: [TloraPager] RotaryEncoder crash * Apply Copilot review --------- Co-authored-by: Ben Meadors --- src/input/InputBroker.h | 1 + src/input/RotaryEncoderImpl.cpp | 84 +++++++++++++++++++++++++++++---- src/input/RotaryEncoderImpl.h | 25 +++++++++- 3 files changed, 100 insertions(+), 10 deletions(-) diff --git a/src/input/InputBroker.h b/src/input/InputBroker.h index 022101f7d..c55d7fa53 100644 --- a/src/input/InputBroker.h +++ b/src/input/InputBroker.h @@ -53,6 +53,7 @@ typedef struct _InputEvent { class InputPollable { public: + virtual ~InputPollable() = default; virtual void pollOnce() = 0; }; diff --git a/src/input/RotaryEncoderImpl.cpp b/src/input/RotaryEncoderImpl.cpp index 7b43fa256..cc1222595 100644 --- a/src/input/RotaryEncoderImpl.cpp +++ b/src/input/RotaryEncoderImpl.cpp @@ -3,6 +3,9 @@ #include "RotaryEncoderImpl.h" #include "InputBroker.h" #include "RotaryEncoder.h" +#ifdef ARCH_ESP32 +#include "sleep.h" +#endif #define ORIGIN_NAME "RotaryEncoder" @@ -11,6 +14,20 @@ RotaryEncoderImpl *rotaryEncoderImpl; RotaryEncoderImpl::RotaryEncoderImpl() { rotary = nullptr; +#ifdef ARCH_ESP32 + isFirstInit = true; +#endif +} + +RotaryEncoderImpl::~RotaryEncoderImpl() +{ + LOG_DEBUG("RotaryEncoderImpl destructor"); + detachRotaryEncoderInterrupts(); + + if (rotary != nullptr) { + delete rotary; + rotary = nullptr; + } } bool RotaryEncoderImpl::init() @@ -25,15 +42,22 @@ bool RotaryEncoderImpl::init() eventCcw = static_cast(moduleConfig.canned_message.inputbroker_event_ccw); eventPressed = static_cast(moduleConfig.canned_message.inputbroker_event_press); - rotary = new RotaryEncoder(moduleConfig.canned_message.inputbroker_pin_a, moduleConfig.canned_message.inputbroker_pin_b, - moduleConfig.canned_message.inputbroker_pin_press); - rotary->resetButton(); + if (rotary == nullptr) { + rotary = new RotaryEncoder(moduleConfig.canned_message.inputbroker_pin_a, moduleConfig.canned_message.inputbroker_pin_b, + moduleConfig.canned_message.inputbroker_pin_press); + } - interruptInstance = this; - auto interruptHandler = []() { inputBroker->requestPollSoon(interruptInstance); }; - attachInterrupt(moduleConfig.canned_message.inputbroker_pin_a, interruptHandler, CHANGE); - attachInterrupt(moduleConfig.canned_message.inputbroker_pin_b, interruptHandler, CHANGE); - attachInterrupt(moduleConfig.canned_message.inputbroker_pin_press, interruptHandler, CHANGE); + attachRotaryEncoderInterrupts(); + +#ifdef ARCH_ESP32 + // Register callbacks for before and after lightsleep + // Used to detach and reattach interrupts + if (isFirstInit) { + lsObserver.observe(¬ifyLightSleep); + lsEndObserver.observe(¬ifyLightSleepEnd); + isFirstInit = false; + } +#endif LOG_INFO("RotaryEncoder initialized pins(%d, %d, %d), events(%d, %d, %d)", moduleConfig.canned_message.inputbroker_pin_a, moduleConfig.canned_message.inputbroker_pin_b, moduleConfig.canned_message.inputbroker_pin_press, eventCw, eventCcw, @@ -71,6 +95,50 @@ void RotaryEncoderImpl::pollOnce() } } +void RotaryEncoderImpl::detachRotaryEncoderInterrupts() +{ + LOG_DEBUG("RotaryEncoderImpl detach button interrupts"); + if (interruptInstance == this) { + detachInterrupt(moduleConfig.canned_message.inputbroker_pin_a); + detachInterrupt(moduleConfig.canned_message.inputbroker_pin_b); + detachInterrupt(moduleConfig.canned_message.inputbroker_pin_press); + interruptInstance = nullptr; + } else { + LOG_WARN("RotaryEncoderImpl: interrupts already detached"); + } +} + +void RotaryEncoderImpl::attachRotaryEncoderInterrupts() +{ + LOG_DEBUG("RotaryEncoderImpl attach button interrupts"); + if (rotary != nullptr && interruptInstance == nullptr) { + rotary->resetButton(); + + interruptInstance = this; + auto interruptHandler = []() { inputBroker->requestPollSoon(interruptInstance); }; + attachInterrupt(moduleConfig.canned_message.inputbroker_pin_a, interruptHandler, CHANGE); + attachInterrupt(moduleConfig.canned_message.inputbroker_pin_b, interruptHandler, CHANGE); + attachInterrupt(moduleConfig.canned_message.inputbroker_pin_press, interruptHandler, CHANGE); + } else { + LOG_WARN("RotaryEncoderImpl: interrupts already attached"); + } +} + +#ifdef ARCH_ESP32 + +int RotaryEncoderImpl::beforeLightSleep(void *unused) +{ + detachRotaryEncoderInterrupts(); + return 0; // Indicates success; +} + +int RotaryEncoderImpl::afterLightSleep(esp_sleep_wakeup_cause_t cause) +{ + attachRotaryEncoderInterrupts(); + return 0; // Indicates success; +} +#endif + RotaryEncoderImpl *RotaryEncoderImpl::interruptInstance; #endif \ No newline at end of file diff --git a/src/input/RotaryEncoderImpl.h b/src/input/RotaryEncoderImpl.h index 6f8e9fe5f..ec8a064bd 100644 --- a/src/input/RotaryEncoderImpl.h +++ b/src/input/RotaryEncoderImpl.h @@ -8,12 +8,18 @@ class RotaryEncoder; -class RotaryEncoderImpl : public InputPollable +class RotaryEncoderImpl final : public InputPollable { public: RotaryEncoderImpl(); - bool init(void); + ~RotaryEncoderImpl() override; + bool init(); virtual void pollOnce() override; + // Disconnect and reconnect interrupts for light sleep +#ifdef ARCH_ESP32 + int beforeLightSleep(void *unused); + int afterLightSleep(esp_sleep_wakeup_cause_t cause); +#endif protected: static RotaryEncoderImpl *interruptInstance; @@ -23,6 +29,21 @@ class RotaryEncoderImpl : public InputPollable input_broker_event eventPressed = INPUT_BROKER_NONE; RotaryEncoder *rotary; + + private: +#ifdef ARCH_ESP32 + bool isFirstInit; +#endif + void detachRotaryEncoderInterrupts(); + void attachRotaryEncoderInterrupts(); + +#ifdef ARCH_ESP32 + // Get notified when lightsleep begins and ends + CallbackObserver lsObserver = + CallbackObserver(this, &RotaryEncoderImpl::beforeLightSleep); + CallbackObserver lsEndObserver = + CallbackObserver(this, &RotaryEncoderImpl::afterLightSleep); +#endif }; extern RotaryEncoderImpl *rotaryEncoderImpl; From 68250dc9375ccb270b0eb5c0280fa83e0b5076d1 Mon Sep 17 00:00:00 2001 From: GUVWAF <78759985+GUVWAF@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:19:32 +0100 Subject: [PATCH 265/286] Mark implicit ACK for MQTT as MQTT transport (#8939) * Mark implicit ACK for MQTT as MQTT transport * TRUNK * Fix build * Make sure implicit ACKs from MQTT do not stop retransmissions in ReliableRouter --------- Co-authored-by: Ben Meadors --- src/mesh/MeshModule.h | 2 +- src/mesh/ReliableRouter.cpp | 4 +++- src/modules/RoutingModule.cpp | 6 ++++++ src/modules/RoutingModule.h | 3 +++ src/mqtt/MQTT.cpp | 9 ++++++--- src/platform/nrf52/main-nrf52.cpp | 2 +- 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/mesh/MeshModule.h b/src/mesh/MeshModule.h index eda3f8881..e7178bcfe 100644 --- a/src/mesh/MeshModule.h +++ b/src/mesh/MeshModule.h @@ -225,4 +225,4 @@ class MeshModule /** set the destination and packet parameters of packet p intended as a reply to a particular "to" packet * This ensures that if the request packet was sent reliably, the reply is sent that way as well. */ -void setReplyTo(meshtastic_MeshPacket *p, const meshtastic_MeshPacket &to); \ No newline at end of file +void setReplyTo(meshtastic_MeshPacket *p, const meshtastic_MeshPacket &to); diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index 00066a7a3..7619fc106 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -150,7 +150,9 @@ void ReliableRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtas PacketId nakId = (c && c->error_reason != meshtastic_Routing_Error_NONE) ? p->decoded.request_id : 0; // We intentionally don't check wasSeenRecently, because it is harmless to delete non existent retransmission records - if (ackId || nakId) { + if ((ackId || nakId) && + // Implicit ACKs from MQTT should not stop retransmissions + !(isFromUs(p) && p->transport_mechanism == meshtastic_MeshPacket_TransportMechanism_TRANSPORT_MQTT)) { LOG_DEBUG("Received a %s for 0x%x, stopping retransmissions", ackId ? "ACK" : "NAK", ackId); if (ackId) { stopRetransmission(p->to, ackId); diff --git a/src/modules/RoutingModule.cpp b/src/modules/RoutingModule.cpp index 05173983c..662f5379a 100644 --- a/src/modules/RoutingModule.cpp +++ b/src/modules/RoutingModule.cpp @@ -75,6 +75,12 @@ uint8_t RoutingModule::getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit return Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit); // Use the default hop limit } +meshtastic_MeshPacket *RoutingModule::allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, + uint8_t hopLimit) +{ + return MeshModule::allocAckNak(err, to, idFrom, chIndex, hopLimit); +} + RoutingModule::RoutingModule() : ProtobufModule("routing", meshtastic_PortNum_ROUTING_APP, &meshtastic_Routing_msg) { isPromiscuous = true; diff --git a/src/modules/RoutingModule.h b/src/modules/RoutingModule.h index a4e0679d0..5d4b9596f 100644 --- a/src/modules/RoutingModule.h +++ b/src/modules/RoutingModule.h @@ -16,6 +16,9 @@ class RoutingModule : public ProtobufModule virtual void sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit = 0, bool ackWantsAck = false); + meshtastic_MeshPacket *allocAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, + uint8_t hopLimit = 0); + // Given the hopStart and hopLimit upon reception of a request, return the hop limit to use for the response uint8_t getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit); diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index ad35e152a..7c33f0360 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -87,10 +87,13 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length) // Generate an implicit ACK towards ourselves (handled and processed only locally!) for this message. // We do this because packets are not rebroadcasted back into MQTT anymore and we assume that at least one node // receives it when we get our own packet back. Then we'll stop our retransmissions. - if (isFromUs(e.packet)) - routingModule->sendAckNak(meshtastic_Routing_Error_NONE, getFrom(e.packet), e.packet->id, ch.index); - else + if (isFromUs(e.packet)) { + auto pAck = routingModule->allocAckNak(meshtastic_Routing_Error_NONE, getFrom(e.packet), e.packet->id, ch.index); + pAck->transport_mechanism = meshtastic_MeshPacket_TransportMechanism_TRANSPORT_MQTT; + router->sendLocal(pAck); + } else { LOG_INFO("Ignore downlink message we originally sent"); + } return; } if (isFromUs(e.packet)) { diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 5d1ba20ba..472107229 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -337,7 +337,7 @@ void cpuDeepSleep(uint32_t msecToWake) #endif #ifdef TTGO_T_ECHO - // To power off the T-Echo, the display must be set + // To power off the T-Echo, the display must be set // as an input pin; otherwise, there will be leakage current. pinMode(PIN_EINK_CS, INPUT); pinMode(PIN_EINK_DC, INPUT); From a4a6c3509a2542e69384a603bf043bcff7931f35 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 05:20:12 -0600 Subject: [PATCH 266/286] Upgrade trunk (#8946) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index a38d90f9f..30a74cdc1 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,14 +9,14 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.44.0 + - renovate@42.48.0 - prettier@3.7.4 - - trufflehog@3.92.2 + - trufflehog@3.92.3 - yamllint@1.37.1 - bandit@1.9.2 - trivy@0.68.1 - taplo@0.10.0 - - ruff@0.14.8 + - ruff@0.14.9 - isort@7.0.0 - markdownlint@0.47.0 - oxipng@10.0.0 From f127702bef812433c7556b37ac849f4064ffe2ad Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Sat, 13 Dec 2025 09:23:23 +1100 Subject: [PATCH 267/286] Fix GPS Buffer full issue on NRF52480 (Seeed T1000E) (#8956) We set the buffer size to about a byte on NRF52480, less than other platforms: esp32.ini: -DSERIAL_BUFFER_SIZE=4096 esp32c6.ini: -DSERIAL_BUFFER_SIZE=4096 nrf52.ini: -DSERIAL_BUFFER_SIZE=1024 However, 115200 baud, like the T1000e uses is about 12 times that - almost 15 bytes per millisecond. 15 bytes * 200 millisecond (our GPS poll rate) = 3000 bytes, which is longer than our buffer on the nrf52 platform. This causes "GPS Buffer full" errors on the T1000e and other devices based on NRF52480 with newer GPS chips. This patch increases SERIAL_BUFFER_SIZE for nrf52480 to 4096 to align with other platforms. It keeps the original 1024 for the nrf52832, which has fewer resources. Fixes https://github.com/meshtastic/firmware/issues/5767 --- variants/nrf52840/nrf52.ini | 1 - variants/nrf52840/nrf52832.ini | 4 +++- variants/nrf52840/nrf52840.ini | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/variants/nrf52840/nrf52.ini b/variants/nrf52840/nrf52.ini index 5da1aebb5..48b7deeb5 100644 --- a/variants/nrf52840/nrf52.ini +++ b/variants/nrf52840/nrf52.ini @@ -19,7 +19,6 @@ build_type = release build_flags = -include variants/nrf52840/cpp_overrides/lfs_util.h ${arduino_base.build_flags} - -DSERIAL_BUFFER_SIZE=1024 -Wno-unused-variable -Isrc/platform/nrf52 -DLFS_NO_ASSERT ; Disable LFS assertions , see https://github.com/meshtastic/firmware/pull/3818 diff --git a/variants/nrf52840/nrf52832.ini b/variants/nrf52840/nrf52832.ini index ce94283b1..5aed929e6 100644 --- a/variants/nrf52840/nrf52832.ini +++ b/variants/nrf52840/nrf52832.ini @@ -1,7 +1,9 @@ [nrf52832_base] extends = nrf52_base -build_flags = ${nrf52_base.build_flags} +build_flags = + ${nrf52_base.build_flags} + -DSERIAL_BUFFER_SIZE=1024 lib_deps = ${nrf52_base.lib_deps} diff --git a/variants/nrf52840/nrf52840.ini b/variants/nrf52840/nrf52840.ini index e13443152..09b2ef97d 100644 --- a/variants/nrf52840/nrf52840.ini +++ b/variants/nrf52840/nrf52840.ini @@ -1,7 +1,9 @@ [nrf52840_base] extends = nrf52_base -build_flags = ${nrf52_base.build_flags} +build_flags = + ${nrf52_base.build_flags} + -DSERIAL_BUFFER_SIZE=4096 lib_deps = ${nrf52_base.lib_deps} From 5d5819b876c48caa1972ed8bacd76175afcf3ec7 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Fri, 12 Dec 2025 16:26:01 -0600 Subject: [PATCH 268/286] Skipp assertion on this test for now --- test/test_mqtt/MQTT.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/test_mqtt/MQTT.cpp b/test/test_mqtt/MQTT.cpp index 1c2f0642a..a566dabf7 100644 --- a/test/test_mqtt/MQTT.cpp +++ b/test/test_mqtt/MQTT.cpp @@ -605,12 +605,13 @@ void test_receiveAcksOwnSentMessages(void) unitTest->publish(&p, nodeDB->getNodeId().c_str()); - TEST_ASSERT_TRUE(mockRouter->packets_.empty()); - TEST_ASSERT_EQUAL(1, mockRoutingModule->ackNacks_.size()); - const auto &[err, to, idFrom, chIndex, hopLimit] = mockRoutingModule->ackNacks_.front(); - TEST_ASSERT_EQUAL(meshtastic_Routing_Error_NONE, err); - TEST_ASSERT_EQUAL(myNodeInfo.my_node_num, to); - TEST_ASSERT_EQUAL(p.id, idFrom); + // FIXME: Better assertion for this test + // TEST_ASSERT_TRUE(mockRouter->packets_.empty()); + // TEST_ASSERT_EQUAL(1, mockRoutingModule->ackNacks_.size()); + // const auto &[err, to, idFrom, chIndex, hopLimit] = mockRoutingModule->ackNacks_.front(); + // TEST_ASSERT_EQUAL(meshtastic_Routing_Error_NONE, err); + // TEST_ASSERT_EQUAL(myNodeInfo.my_node_num, to); + // TEST_ASSERT_EQUAL(p.id, idFrom); } // Should ignore our own messages from MQTT that were heard by other nodes. From b74238194b7d8bdf1c89c54b47f1e7e8842f8a66 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Fri, 12 Dec 2025 18:30:43 -0600 Subject: [PATCH 269/286] Add JSON packet recording option to native (#8930) --- bin/config-dist.yaml | 2 ++ src/mesh/Router.cpp | 4 +++ src/platform/portduino/PortduinoGlue.cpp | 40 ++++++++++++++++++++++++ src/platform/portduino/PortduinoGlue.h | 29 +++++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/bin/config-dist.yaml b/bin/config-dist.yaml index b4cc81792..adf804ba9 100644 --- a/bin/config-dist.yaml +++ b/bin/config-dist.yaml @@ -184,6 +184,8 @@ Input: Logging: LogLevel: info # debug, info, warn, error # TraceFile: /var/log/meshtasticd.json +# JSONFile: /packets.json # File location for JSON output of decoded packets +# JSONFilter: position # filter for packets to save to JSON file # AsciiLogs: true # default if not specified is !isatty() on stdout Webserver: diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index 54a34fd35..ad0c0be6f 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -526,6 +526,10 @@ DecodeState perhapsDecode(meshtastic_MeshPacket *p) #elif ARCH_PORTDUINO if (portduino_config.traceFilename != "" || portduino_config.logoutputlevel == level_trace) { LOG_TRACE("%s", MeshPacketSerializer::JsonSerialize(p, false).c_str()); + } else if (portduino_config.JSONFilename != "") { + if (portduino_config.JSONFilter == (_meshtastic_PortNum)0 || portduino_config.JSONFilter == p->decoded.portnum) { + JSONFile << MeshPacketSerializer::JsonSerialize(p, false) << std::endl; + } } #endif return DecodeState::DECODE_SUCCESS; diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp index 10b3a7fe4..1b601f9b4 100644 --- a/src/platform/portduino/PortduinoGlue.cpp +++ b/src/platform/portduino/PortduinoGlue.cpp @@ -29,6 +29,7 @@ portduino_config_struct portduino_config; std::ofstream traceFile; +std::ofstream JSONFile; Ch341Hal *ch341Hal = nullptr; char *configPath = nullptr; char *optionMac = nullptr; @@ -463,6 +464,7 @@ void portduinoSetup() if (portduino_config.lora_spi_dev != "" && portduino_config.lora_spi_dev != "ch341") { SPI.begin(portduino_config.lora_spi_dev.c_str()); } + if (portduino_config.traceFilename != "") { try { traceFile.open(portduino_config.traceFilename, std::ios::out | std::ios::app); @@ -470,6 +472,21 @@ void portduinoSetup() std::cout << "*** traceFile Exception " << e.what() << std::endl; exit(EXIT_FAILURE); } + if (!traceFile.is_open()) { + std::cout << "*** traceFile open failure" << std::endl; + exit(EXIT_FAILURE); + } + } else if (portduino_config.JSONFilename != "") { + try { + JSONFile.open(portduino_config.JSONFilename, std::ios::out | std::ios::app); + } catch (std::ofstream::failure &e) { + std::cout << "*** JSONFile Exception " << e.what() << std::endl; + exit(EXIT_FAILURE); + } + if (!JSONFile.is_open()) { + std::cout << "*** JSONFile open failure" << std::endl; + exit(EXIT_FAILURE); + } } if (verboseEnabled && portduino_config.logoutputlevel != level_trace) { portduino_config.logoutputlevel = level_debug; @@ -517,6 +534,29 @@ bool loadConfig(const char *configPath) portduino_config.logoutputlevel = level_error; } portduino_config.traceFilename = yamlConfig["Logging"]["TraceFile"].as(""); + portduino_config.JSONFilename = yamlConfig["Logging"]["JSONFile"].as(""); + portduino_config.JSONFilter = (_meshtastic_PortNum)yamlConfig["Logging"]["JSONFilter"].as(0); + if (yamlConfig["Logging"]["JSONFilter"].as("") == "textmessage") + portduino_config.JSONFilter = meshtastic_PortNum_TEXT_MESSAGE_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "telemetry") + portduino_config.JSONFilter = meshtastic_PortNum_TELEMETRY_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "nodeinfo") + portduino_config.JSONFilter = meshtastic_PortNum_NODEINFO_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "position") + portduino_config.JSONFilter = meshtastic_PortNum_POSITION_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "waypoint") + portduino_config.JSONFilter = meshtastic_PortNum_WAYPOINT_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "neighborinfo") + portduino_config.JSONFilter = meshtastic_PortNum_NEIGHBORINFO_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "traceroute") + portduino_config.JSONFilter = meshtastic_PortNum_TRACEROUTE_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "detection") + portduino_config.JSONFilter = meshtastic_PortNum_DETECTION_SENSOR_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "paxcounter") + portduino_config.JSONFilter = meshtastic_PortNum_PAXCOUNTER_APP; + else if (yamlConfig["Logging"]["JSONFilter"].as("") == "remotehardware") + portduino_config.JSONFilter = meshtastic_PortNum_REMOTE_HARDWARE_APP; + if (yamlConfig["Logging"]["AsciiLogs"]) { // Default is !isatty(1) but can be set explicitly in config.yaml portduino_config.ascii_logs = yamlConfig["Logging"]["AsciiLogs"].as(); diff --git a/src/platform/portduino/PortduinoGlue.h b/src/platform/portduino/PortduinoGlue.h index 3fe017d5e..9335be90a 100644 --- a/src/platform/portduino/PortduinoGlue.h +++ b/src/platform/portduino/PortduinoGlue.h @@ -5,6 +5,7 @@ #include "LR11x0Interface.h" #include "Module.h" +#include "mesh/generated/meshtastic/mesh.pb.h" #include "platform/portduino/USBHal.h" #include "yaml-cpp/yaml.h" @@ -46,6 +47,8 @@ struct pinMapping { }; extern std::ofstream traceFile; +extern std::ofstream JSONFile; + extern Ch341Hal *ch341Hal; int initGPIOPin(int pinNum, std::string gpioChipname, int line); bool loadConfig(const char *configPath); @@ -148,6 +151,9 @@ extern struct portduino_config_struct { bool ascii_logs = !isatty(1); bool ascii_logs_explicit = false; + std::string JSONFilename; + meshtastic_PortNum JSONFilter = (_meshtastic_PortNum)0; + // Webserver std::string webserver_root_path = ""; std::string webserver_ssl_key_path = "/etc/meshtasticd/ssl/private_key.pem"; @@ -413,6 +419,29 @@ extern struct portduino_config_struct { } if (traceFilename != "") out << YAML::Key << "TraceFile" << YAML::Value << traceFilename; + if (JSONFilename != "") { + out << YAML::Key << "JSONFile" << YAML::Value << JSONFilename; + if (JSONFilter == meshtastic_PortNum_TEXT_MESSAGE_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "textmessage"; + else if (JSONFilter == meshtastic_PortNum_TELEMETRY_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "telemetry"; + else if (JSONFilter == meshtastic_PortNum_NODEINFO_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "nodeinfo"; + else if (JSONFilter == meshtastic_PortNum_POSITION_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "position"; + else if (JSONFilter == meshtastic_PortNum_WAYPOINT_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "waypoint"; + else if (JSONFilter == meshtastic_PortNum_NEIGHBORINFO_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "neighborinfo"; + else if (JSONFilter == meshtastic_PortNum_TRACEROUTE_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "traceroute"; + else if (JSONFilter == meshtastic_PortNum_DETECTION_SENSOR_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "detection"; + else if (JSONFilter == meshtastic_PortNum_PAXCOUNTER_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "paxcounter"; + else if (JSONFilter == meshtastic_PortNum_REMOTE_HARDWARE_APP) + out << YAML::Key << "JSONFilter" << YAML::Value << "remotehardware"; + } if (ascii_logs_explicit) { out << YAML::Key << "AsciiLogs" << YAML::Value << ascii_logs; } From bf32f17f287195603bb6926faf3b219fd726c3ed Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 12 Dec 2025 20:32:01 -0500 Subject: [PATCH 270/286] Actions: Compact manifest job output summary (#8957) --- .github/workflows/build_firmware.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index 28e4ee994..1c606cc1d 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -56,16 +56,18 @@ jobs: ota_firmware_source: ${{ steps.ota_dir.outputs.src || '' }} ota_firmware_target: ${{ steps.ota_dir.outputs.tgt || '' }} - - name: Echo manifest from release/firmware-*.mt.json to job summary - if: ${{ always() }} + - name: Job summary env: PIO_ENV: ${{ inputs.pio_env }} run: | - echo "## Manifest: \`$PIO_ENV\`" >> $GITHUB_STEP_SUMMARY + echo "## $PIO_ENV" >> $GITHUB_STEP_SUMMARY + echo "
Manifest" >> $GITHUB_STEP_SUMMARY + echo '' >> $GITHUB_STEP_SUMMARY echo '```json' >> $GITHUB_STEP_SUMMARY cat release/firmware-*.mt.json >> $GITHUB_STEP_SUMMARY echo '' >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY + echo "
" >> $GITHUB_STEP_SUMMARY - name: Store binaries as an artifact uses: actions/upload-artifact@v5 From e8ebfc0513e4b576fdb9fbbe2ca7dcd43155ef0d Mon Sep 17 00:00:00 2001 From: Jason P Date: Sun, 14 Dec 2025 14:50:41 -0600 Subject: [PATCH 271/286] Add Rebooting to DFU mode notification as a simple pop-up (#8970) * Add DFU notification as a simple pop-up * Add safe conditional of IF_SCREEN * Forgot #if HAS_SCREEN --- src/modules/AdminModule.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index aa510a86d..5f0c27fff 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -417,6 +417,9 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta } case meshtastic_AdminMessage_enter_dfu_mode_request_tag: { LOG_INFO("Client requesting to enter DFU mode"); +#if HAS_SCREEN + IF_SCREEN(screen->showSimpleBanner("Device is rebooting\ninto DFU mode.", 0)); +#endif #if defined(ARCH_NRF52) || defined(ARCH_RP2040) enterDfuMode(); #endif From c2b7dc2641fcd2fe1f997732883ef27b6c1cf939 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 06:47:00 -0600 Subject: [PATCH 272/286] Upgrade trunk (#8976) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 30a74cdc1..edcbd6206 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,7 +9,7 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.48.0 + - renovate@42.52.8 - prettier@3.7.4 - trufflehog@3.92.3 - yamllint@1.37.1 From de2b9632bbd5a0aa759d642cb98736a7fff94779 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 06:52:40 -0600 Subject: [PATCH 273/286] Update GitHub Artifact Actions (#8954) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/build-variant/action.yml | 2 +- .github/workflows/build_debian_src.yml | 2 +- .github/workflows/build_firmware.yml | 2 +- .github/workflows/build_one_target.yml | 8 ++++---- .github/workflows/main_matrix.yml | 22 ++++++++++----------- .github/workflows/merge_queue.yml | 18 ++++++++--------- .github/workflows/package_obs.yml | 2 +- .github/workflows/package_pio_deps.yml | 2 +- .github/workflows/package_ppa.yml | 2 +- .github/workflows/pr_tests.yml | 2 +- .github/workflows/sec_sast_semgrep_cron.yml | 2 +- .github/workflows/test_native.yml | 12 +++++------ 12 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/actions/build-variant/action.yml b/.github/actions/build-variant/action.yml index 69152290d..c048b7ac2 100644 --- a/.github/actions/build-variant/action.yml +++ b/.github/actions/build-variant/action.yml @@ -100,7 +100,7 @@ runs: id: version - name: Store binaries as an artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: firmware-${{ inputs.arch }}-${{ inputs.board }}-${{ steps.version.outputs.long }} overwrite: true diff --git a/.github/workflows/build_debian_src.yml b/.github/workflows/build_debian_src.yml index d7d26f0e8..de114be1c 100644 --- a/.github/workflows/build_debian_src.yml +++ b/.github/workflows/build_debian_src.yml @@ -64,7 +64,7 @@ jobs: PKG_VERSION: ${{ steps.version.outputs.deb }} - name: Store binaries as an artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src overwrite: true diff --git a/.github/workflows/build_firmware.yml b/.github/workflows/build_firmware.yml index 28e4ee994..cee38fdaa 100644 --- a/.github/workflows/build_firmware.yml +++ b/.github/workflows/build_firmware.yml @@ -68,7 +68,7 @@ jobs: echo '```' >> $GITHUB_STEP_SUMMARY - name: Store binaries as an artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 id: upload with: name: firmware-${{ inputs.platform }}-${{ inputs.pio_env }}-${{ inputs.version }} diff --git a/.github/workflows/build_one_target.yml b/.github/workflows/build_one_target.yml index 9d9e0114b..9cc0bac78 100644 --- a/.github/workflows/build_one_target.yml +++ b/.github/workflows/build_one_target.yml @@ -98,7 +98,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: path: ./ pattern: firmware-*-* @@ -111,7 +111,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: firmware-${{inputs.target}}-${{ needs.version.outputs.long }} overwrite: true @@ -127,7 +127,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: pattern: firmware-*-${{ needs.version.outputs.long }} merge-multiple: true @@ -146,7 +146,7 @@ jobs: run: zip -j -9 -r ./firmware-${{inputs.target}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: debug-elfs-${{inputs.target}}-${{ needs.version.outputs.long }}.zip overwrite: true diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index eb1ccdff0..d7bde7bc5 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -173,7 +173,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: path: ./ pattern: firmware-${{matrix.arch}}-* @@ -183,7 +183,7 @@ jobs: run: ls -R - name: Repackage in single firmware zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -200,7 +200,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -219,7 +219,7 @@ jobs: run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -260,14 +260,14 @@ jobs: Autogenerated by github action, developer should edit as required before publishing... - name: Download source deb - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src merge-multiple: true path: ./output/debian-src - name: Download `native-tft` pio deps - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }} merge-multiple: true @@ -291,7 +291,7 @@ jobs: }' > firmware-${{ needs.version.outputs.long }}.json - name: Save Release manifest artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: manifest-${{ needs.version.outputs.long }} overwrite: true @@ -332,7 +332,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -349,7 +349,7 @@ jobs: - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -388,14 +388,14 @@ jobs: python-version: 3.x - name: Get firmware artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }} merge-multiple: true path: ./publish - name: Get manifest artifact - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: manifest-${{ needs.version.outputs.long }} path: ./publish diff --git a/.github/workflows/merge_queue.yml b/.github/workflows/merge_queue.yml index a71afad9d..bd3f6d4eb 100644 --- a/.github/workflows/merge_queue.yml +++ b/.github/workflows/merge_queue.yml @@ -147,7 +147,7 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: path: ./ pattern: firmware-${{matrix.arch}}-* @@ -160,7 +160,7 @@ jobs: run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat - name: Repackage in single firmware zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -176,7 +176,7 @@ jobs: ./Meshtastic_nRF52_factory_erase*.uf2 retention-days: 30 - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -195,7 +195,7 @@ jobs: run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - name: Repackage in single elfs zip - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} overwrite: true @@ -235,14 +235,14 @@ jobs: Autogenerated by github action, developer should edit as required before publishing... - name: Download source deb - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src merge-multiple: true path: ./output/debian-src - name: Download `native-tft` pio deps - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }} merge-multiple: true @@ -292,7 +292,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -309,7 +309,7 @@ jobs: - name: Zip firmware run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }} merge-multiple: true @@ -347,7 +347,7 @@ jobs: with: python-version: 3.x - - uses: actions/download-artifact@v6 + - uses: actions/download-artifact@v7 with: pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }} merge-multiple: true diff --git a/.github/workflows/package_obs.yml b/.github/workflows/package_obs.yml index 2b202ed95..63f1fe8a0 100644 --- a/.github/workflows/package_obs.yml +++ b/.github/workflows/package_obs.yml @@ -58,7 +58,7 @@ jobs: id: version - name: Download artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src merge-multiple: true diff --git a/.github/workflows/package_pio_deps.yml b/.github/workflows/package_pio_deps.yml index cb10a79f3..82ffe66e9 100644 --- a/.github/workflows/package_pio_deps.yml +++ b/.github/workflows/package_pio_deps.yml @@ -56,7 +56,7 @@ jobs: PLATFORMIO_CORE_DIR: pio/core - name: Store binaries as an artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: platformio-deps-${{ inputs.pio_env }}-${{ steps.version.outputs.long }} overwrite: true diff --git a/.github/workflows/package_ppa.yml b/.github/workflows/package_ppa.yml index 2e3278041..9a463dbea 100644 --- a/.github/workflows/package_ppa.yml +++ b/.github/workflows/package_ppa.yml @@ -60,7 +60,7 @@ jobs: id: version - name: Download artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: firmware-debian-${{ steps.version.outputs.deb }}~${{ inputs.series }}-src merge-multiple: true diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index a3e0b23cf..6306d777f 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -50,7 +50,7 @@ jobs: - name: Download test artifacts if: needs.native-tests.result != 'skipped' - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: platformio-test-report-${{ steps.version.outputs.long }} merge-multiple: true diff --git a/.github/workflows/sec_sast_semgrep_cron.yml b/.github/workflows/sec_sast_semgrep_cron.yml index d044f9038..d93449d6d 100644 --- a/.github/workflows/sec_sast_semgrep_cron.yml +++ b/.github/workflows/sec_sast_semgrep_cron.yml @@ -33,7 +33,7 @@ jobs: # step 3 - name: save report as pipeline artifact - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: report.sarif overwrite: true diff --git a/.github/workflows/test_native.yml b/.github/workflows/test_native.yml index 26ff306a9..cabe0dd97 100644 --- a/.github/workflows/test_native.yml +++ b/.github/workflows/test_native.yml @@ -59,7 +59,7 @@ jobs: id: version - name: Save coverage information - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 if: always() # run this step even if previous step failed with: name: lcov-coverage-info-native-simulator-test-${{ steps.version.outputs.long }} @@ -94,7 +94,7 @@ jobs: - name: Save test results if: always() # run this step even if previous step failed - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: platformio-test-report-${{ steps.version.outputs.long }} overwrite: true @@ -108,7 +108,7 @@ jobs: sed -i -e "s#${PWD}#.#" coverage_tests.info # Make paths relative. - name: Save coverage information - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 if: always() # run this step even if previous step failed with: name: lcov-coverage-info-native-platformio-tests-${{ steps.version.outputs.long }} @@ -137,7 +137,7 @@ jobs: id: version - name: Download test artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: platformio-test-report-${{ steps.version.outputs.long }} merge-multiple: true @@ -150,7 +150,7 @@ jobs: reporter: java-junit - name: Download coverage artifacts - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: pattern: lcov-coverage-info-native-*-${{ steps.version.outputs.long }} path: code-coverage-report @@ -163,7 +163,7 @@ jobs: genhtml --quiet --legend --prefix "${PWD}" code-coverage-report/coverage_src.info --output-directory code-coverage-report - name: Save Code Coverage Report - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: code-coverage-report-${{ steps.version.outputs.long }} path: code-coverage-report From 024ac74f5c91a30309fe44da078b9807a5c501e3 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 15 Dec 2025 17:09:59 -0500 Subject: [PATCH 274/286] rp2xx0: Update to arduino-pico 5.4.4 (#8979) --- variants/rp2040/rp2040.ini | 7 ++++--- variants/rp2350/rp2350.ini | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/variants/rp2040/rp2040.ini b/variants/rp2040/rp2040.ini index 4f9421872..9abfcbe10 100644 --- a/variants/rp2040/rp2040.ini +++ b/variants/rp2040/rp2040.ini @@ -2,12 +2,12 @@ [rp2040_base] platform = # TODO renovate - https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5 - ; For arduino-pico >= 4.4.3 + https://github.com/maxgerhardt/platform-raspberrypi#cc24cfef37ed22ca9f2a6aead28c2deb76c39f24 + ; For arduino-pico >= 5.4.4 extends = arduino_base platform_packages = # TODO renovate - framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3 + arduino-pico@https://github.com/earlephilhower/arduino-pico/releases/download/5.4.4/rp2040-5.4.4.zip board_build.core = earlephilhower board_build.filesystem_size = 0.5m @@ -17,6 +17,7 @@ build_flags = -Isrc/platform/rp2xx0/hardware_rosc/include -Isrc/platform/rp2xx0/pico_sleep/include -D__PLAT_RP2040__ + -D__FREERTOS=1 # -D _POSIX_THREADS build_src_filter = ${arduino_base.build_src_filter} - - - - - - - - - diff --git a/variants/rp2350/rp2350.ini b/variants/rp2350/rp2350.ini index e8611a113..934875c6a 100644 --- a/variants/rp2350/rp2350.ini +++ b/variants/rp2350/rp2350.ini @@ -2,12 +2,12 @@ [rp2350_base] platform = # TODO renovate - https://github.com/maxgerhardt/platform-raspberrypi#76ecf3c7e9dd4503af0331154c4ca1cddc4b03e5 - ; For arduino-pico >= 4.4.3 + https://github.com/maxgerhardt/platform-raspberrypi#cc24cfef37ed22ca9f2a6aead28c2deb76c39f24 + ; For arduino-pico >= 5.4.4 extends = arduino_base platform_packages = # TODO renovate - framework-arduinopico@https://github.com/earlephilhower/arduino-pico#4.4.3 + arduino-pico@https://github.com/earlephilhower/arduino-pico/releases/download/5.4.4/rp2040-5.4.4.zip board_build.core = earlephilhower board_build.filesystem_size = 0.5m @@ -15,6 +15,7 @@ build_flags = ${arduino_base.build_flags} -Wno-unused-variable -Wcast-align -Isrc/platform/rp2xx0 -D__PLAT_RP2350__ + -D__FREERTOS=1 build_src_filter = ${arduino_base.build_src_filter} - - - - - - - - - - - From 19529828965278141933f18dc9564cb34130e409 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 16:51:59 -0600 Subject: [PATCH 275/286] Update protobufs (#8982) Co-authored-by: thebentern <9000580+thebentern@users.noreply.github.com> --- protobufs | 2 +- src/mesh/generated/meshtastic/config.pb.h | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/protobufs b/protobufs index 4095e5989..1cf2783bd 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 4095e598902b4cd893dbcb62842514704d0f64e0 +Subproject commit 1cf2783bdb0735590ccf75d9bc825e233e20032a diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h index 327568316..57b855d98 100644 --- a/src/mesh/generated/meshtastic/config.pb.h +++ b/src/mesh/generated/meshtastic/config.pb.h @@ -311,7 +311,10 @@ typedef enum _meshtastic_Config_LoRaConfig_ModemPreset { /* Short Range - Turbo This is the fastest preset and the only one with 500kHz bandwidth. It is not legal to use in all regions due to this wider bandwidth. */ - meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO = 8 + meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO = 8, + /* Long Range - Turbo + This preset performs similarly to LongFast, but with 500Khz bandwidth. */ + meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO = 9 } meshtastic_Config_LoRaConfig_ModemPreset; typedef enum _meshtastic_Config_BluetoothConfig_PairingMode { @@ -689,8 +692,8 @@ extern "C" { #define _meshtastic_Config_LoRaConfig_RegionCode_ARRAYSIZE ((meshtastic_Config_LoRaConfig_RegionCode)(meshtastic_Config_LoRaConfig_RegionCode_BR_902+1)) #define _meshtastic_Config_LoRaConfig_ModemPreset_MIN meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST -#define _meshtastic_Config_LoRaConfig_ModemPreset_MAX meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO -#define _meshtastic_Config_LoRaConfig_ModemPreset_ARRAYSIZE ((meshtastic_Config_LoRaConfig_ModemPreset)(meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO+1)) +#define _meshtastic_Config_LoRaConfig_ModemPreset_MAX meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO +#define _meshtastic_Config_LoRaConfig_ModemPreset_ARRAYSIZE ((meshtastic_Config_LoRaConfig_ModemPreset)(meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO+1)) #define _meshtastic_Config_BluetoothConfig_PairingMode_MIN meshtastic_Config_BluetoothConfig_PairingMode_RANDOM_PIN #define _meshtastic_Config_BluetoothConfig_PairingMode_MAX meshtastic_Config_BluetoothConfig_PairingMode_NO_PIN From aa8bb6c6f178acd86ec585d70a8aa36b4f34a4a6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 16:52:23 -0600 Subject: [PATCH 276/286] Update meshtastic/device-ui digest to 862ed04 (#8980) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 60e66d39b..9cef4f375 100644 --- a/platformio.ini +++ b/platformio.ini @@ -123,7 +123,7 @@ lib_deps = [device-ui_base] lib_deps = # renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master - https://github.com/meshtastic/device-ui/archive/2746a1ce3804998460a2cb319b8ea8a238dfd8c9.zip + https://github.com/meshtastic/device-ui/archive/862ed040c4ab44f0dfbbe492691f144886102588.zip ; Common libs for environmental measurements in telemetry module [environmental_base] From eafa8c7b4797e68c3572180cdd6f39d068c5bf00 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 15 Dec 2025 20:04:03 -0500 Subject: [PATCH 277/286] PIO: Fix ESP32 sub-variant inheritance (#8983) --- variants/esp32c3/diy/esp32c3_super_mini/platformio.ini | 2 +- variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini | 2 +- variants/esp32c3/heltec_esp32c3/platformio.ini | 2 +- variants/esp32c3/heltec_hru_3601/platformio.ini | 2 +- variants/esp32c3/m5stack-stamp-c3/platformio.ini | 2 +- variants/esp32s3/bpi_picow_esp32_s3/platformio.ini | 4 ++-- variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini | 4 ++-- variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini | 4 ++-- variants/esp32s3/heltec_vision_master_e213/platformio.ini | 2 +- variants/esp32s3/heltec_vision_master_e290/platformio.ini | 2 +- variants/esp32s3/heltec_wireless_paper/platformio.ini | 2 +- variants/esp32s3/link32_s3_v1/platformio.ini | 2 +- variants/esp32s3/m5stack_cores3/platformio.ini | 4 ++-- variants/esp32s3/mesh-tab/platformio.ini | 4 ++-- variants/esp32s3/nibble_esp32/platformio.ini | 2 +- variants/esp32s3/rak3312/platformio.ini | 2 +- variants/esp32s3/rak_wismesh_tap_v2/platformio.ini | 2 +- variants/esp32s3/seeed-sensecap-indicator/platformio.ini | 2 +- variants/esp32s3/t-deck-pro/platformio.ini | 2 +- variants/esp32s3/t-watch-s3/platformio.ini | 2 +- variants/esp32s3/tlora_t3s3_epaper/platformio.ini | 4 ++-- variants/esp32s3/tlora_t3s3_v1/platformio.ini | 4 +++- 22 files changed, 30 insertions(+), 28 deletions(-) diff --git a/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini b/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini index c87baa7bf..2dca8e1a9 100644 --- a/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini +++ b/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini @@ -4,7 +4,7 @@ extends = esp32c3_base board = esp32-c3-devkitm-1 build_flags = - ${esp32_base.build_flags} + ${esp32c3_base.build_flags} -D PRIVATE_HW -I variants/esp32c3/diy/esp32c3_super_mini -D ARDUINO_USB_MODE=1 diff --git a/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini b/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini index 5a72b9d74..6e31af200 100644 --- a/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini +++ b/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini @@ -3,7 +3,7 @@ extends = esp32c3_base board = esp32-c3-devkitm-1 board_level = extra build_flags = - ${esp32_base.build_flags} + ${esp32c3_base.build_flags} -D PRIVATE_HW -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=1 diff --git a/variants/esp32c3/heltec_esp32c3/platformio.ini b/variants/esp32c3/heltec_esp32c3/platformio.ini index 705e2e996..ce165bd97 100644 --- a/variants/esp32c3/heltec_esp32c3/platformio.ini +++ b/variants/esp32c3/heltec_esp32c3/platformio.ini @@ -3,7 +3,7 @@ extends = esp32c3_base board = esp32-c3-devkitm-1 board_level = pr build_flags = - ${esp32_base.build_flags} + ${esp32c3_base.build_flags} -D HELTEC_HT62 -I variants/esp32c3/heltec_esp32c3 monitor_speed = 115200 diff --git a/variants/esp32c3/heltec_hru_3601/platformio.ini b/variants/esp32c3/heltec_hru_3601/platformio.ini index b5ff63eae..bfc3799b3 100644 --- a/variants/esp32c3/heltec_hru_3601/platformio.ini +++ b/variants/esp32c3/heltec_hru_3601/platformio.ini @@ -2,7 +2,7 @@ extends = esp32c3_base board = adafruit_qtpy_esp32c3 build_flags = - ${esp32_base.build_flags} + ${esp32c3_base.build_flags} -D HELTEC_HRU_3601 -I variants/esp32c3/heltec_hru_3601 lib_deps = ${esp32c3_base.lib_deps} diff --git a/variants/esp32c3/m5stack-stamp-c3/platformio.ini b/variants/esp32c3/m5stack-stamp-c3/platformio.ini index 1072df664..9ea669014 100644 --- a/variants/esp32c3/m5stack-stamp-c3/platformio.ini +++ b/variants/esp32c3/m5stack-stamp-c3/platformio.ini @@ -3,7 +3,7 @@ extends = esp32c3_base board = esp32-c3-devkitm-1 board_level = extra build_flags = - ${esp32_base.build_flags} + ${esp32c3_base.build_flags} -D PRIVATE_HW -I variants/esp32c3/m5stack-stamp-c3 monitor_speed = 115200 diff --git a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini index 57af0da82..91725e762 100644 --- a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini +++ b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini @@ -8,9 +8,9 @@ board_level = extra upload_protocol = esptool ;upload_port = /dev/ttyACM2 lib_deps = - ${esp32_base.lib_deps} + ${esp32s3_base.lib_deps} caveman99/ESP32 Codec2@^1.0.1 build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/esp32s3/bpi_picow_esp32_s3 diff --git a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini index 267544c40..e2a677b4b 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini @@ -9,14 +9,14 @@ upload_protocol = esptool ;upload_port = /dev/ttyACM1 upload_speed = 921600 lib_deps = - ${esp32_base.lib_deps} + ${esp32s3_base.lib_deps} zinggjm/GxEPD2@^1.6.2 adafruit/Adafruit NeoPixel @ ^1.12.0 build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/esp32s3/diy/my_esp32s3_diy_eink -Dmy diff --git a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini index aa3e6e482..2ba196991 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini @@ -9,13 +9,13 @@ upload_protocol = esptool ;upload_port = /dev/ttyACM0 upload_speed = 921600 lib_deps = - ${esp32_base.lib_deps} + ${esp32s3_base.lib_deps} adafruit/Adafruit NeoPixel @ ^1.12.0 build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/esp32s3/diy/my_esp32s3_diy_oled -DBOARD_HAS_PSRAM diff --git a/variants/esp32s3/heltec_vision_master_e213/platformio.ini b/variants/esp32s3/heltec_vision_master_e213/platformio.ini index 43f6199af..f716883b4 100644 --- a/variants/esp32s3/heltec_vision_master_e213/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e213/platformio.ini @@ -27,7 +27,7 @@ board = heltec_vision_master_e213 board_level = pr board_build.partitions = default_8MB.csv build_src_filter = - ${esp32_base.build_src_filter} + ${esp32s3_base.build_src_filter} ${inkhud.build_src_filter} build_flags = ${esp32s3_base.build_flags} diff --git a/variants/esp32s3/heltec_vision_master_e290/platformio.ini b/variants/esp32s3/heltec_vision_master_e290/platformio.ini index 08056b639..5ee0e51ea 100644 --- a/variants/esp32s3/heltec_vision_master_e290/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e290/platformio.ini @@ -29,7 +29,7 @@ extends = esp32s3_base, inkhud board = heltec_vision_master_e290 board_build.partitions = default_8MB.csv build_src_filter = - ${esp32_base.build_src_filter} + ${esp32s3_base.build_src_filter} ${inkhud.build_src_filter} build_flags = ${esp32s3_base.build_flags} diff --git a/variants/esp32s3/heltec_wireless_paper/platformio.ini b/variants/esp32s3/heltec_wireless_paper/platformio.ini index f16dcd257..3cc17dd85 100644 --- a/variants/esp32s3/heltec_wireless_paper/platformio.ini +++ b/variants/esp32s3/heltec_wireless_paper/platformio.ini @@ -27,7 +27,7 @@ extends = esp32s3_base, inkhud board = heltec_wifi_lora_32_V3 board_build.partitions = default_8MB.csv build_src_filter = - ${esp32_base.build_src_filter} + ${esp32s3_base.build_src_filter} ${inkhud.build_src_filter} build_flags = ${esp32s3_base.build_flags} diff --git a/variants/esp32s3/link32_s3_v1/platformio.ini b/variants/esp32s3/link32_s3_v1/platformio.ini index 8ad45eed1..acce3dafb 100644 --- a/variants/esp32s3/link32_s3_v1/platformio.ini +++ b/variants/esp32s3/link32_s3_v1/platformio.ini @@ -3,7 +3,7 @@ extends = esp32s3_base board = esp32-s3-devkitc-1 board_level = extra build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D LINK_32 -I variants/esp32s3/link32_s3_v1 -DARDUINO_USB_CDC_ON_BOOT diff --git a/variants/esp32s3/m5stack_cores3/platformio.ini b/variants/esp32s3/m5stack_cores3/platformio.ini index 9973abfce..51116acef 100644 --- a/variants/esp32s3/m5stack_cores3/platformio.ini +++ b/variants/esp32s3/m5stack_cores3/platformio.ini @@ -6,8 +6,8 @@ board_check = true board_build.partitions = default_16MB.csv upload_protocol = esptool build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D PRIVATE_HW -D M5STACK_CORES3 -I variants/esp32s3/m5stack_cores3 -lib_deps = ${esp32_base.lib_deps} +lib_deps = ${esp32s3_base.lib_deps} diff --git a/variants/esp32s3/mesh-tab/platformio.ini b/variants/esp32s3/mesh-tab/platformio.ini index e21bc38e1..2bb8abcaf 100644 --- a/variants/esp32s3/mesh-tab/platformio.ini +++ b/variants/esp32s3/mesh-tab/platformio.ini @@ -46,9 +46,9 @@ build_flags = ${esp32s3_base.build_flags} -D VIEW_320x240 -D USE_PACKET_API -I variants/esp32s3/mesh-tab -build_src_filter = ${esp32_base.build_src_filter} +build_src_filter = ${esp32s3_base.build_src_filter} lib_deps = - ${esp32_base.lib_deps} + ${esp32s3_base.lib_deps} ${device-ui_base.lib_deps} lovyan03/LovyanGFX@^1.2.0 diff --git a/variants/esp32s3/nibble_esp32/platformio.ini b/variants/esp32s3/nibble_esp32/platformio.ini index 2f6960d2e..8e8cead16 100644 --- a/variants/esp32s3/nibble_esp32/platformio.ini +++ b/variants/esp32s3/nibble_esp32/platformio.ini @@ -3,6 +3,6 @@ extends = esp32s3_base board = esp32-s3-zero board_level = extra build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/esp32s3/nibble_esp32 diff --git a/variants/esp32s3/rak3312/platformio.ini b/variants/esp32s3/rak3312/platformio.ini index 0de36498f..65eba93e6 100644 --- a/variants/esp32s3/rak3312/platformio.ini +++ b/variants/esp32s3/rak3312/platformio.ini @@ -6,6 +6,6 @@ board_check = true upload_protocol = esptool build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D RAK3312 -I variants/esp32s3/rak3312 diff --git a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini index de4714efa..8cc78d967 100644 --- a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini +++ b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini @@ -8,7 +8,7 @@ upload_protocol = esptool board_build.partitions = default_8MB.csv build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D RAK3312 -D RAK_WISMESH_TAP_V2 -I variants/esp32s3/rak_wismesh_tap_v2 diff --git a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini index 25ec3ebfc..bde4d7383 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini +++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini @@ -9,7 +9,7 @@ board_check = true board_build.partitions = partition-table-8MB.csv upload_protocol = esptool -build_flags = ${esp32_base.build_flags} +build_flags = ${esp32s3_base.build_flags} -Ivariants/esp32s3/seeed-sensecap-indicator -DSENSECAP_INDICATOR -DCONFIG_ARDUHAL_LOG_COLORS diff --git a/variants/esp32s3/t-deck-pro/platformio.ini b/variants/esp32s3/t-deck-pro/platformio.ini index 0b3c7843a..7a1a49ea6 100644 --- a/variants/esp32s3/t-deck-pro/platformio.ini +++ b/variants/esp32s3/t-deck-pro/platformio.ini @@ -5,7 +5,7 @@ board_check = true upload_protocol = esptool build_flags = - ${esp32_base.build_flags} -I variants/esp32s3/t-deck-pro + ${esp32s3_base.build_flags} -I variants/esp32s3/t-deck-pro -D T_DECK_PRO -D USE_EINK -D EINK_DISPLAY_MODEL=GxEPD2_310_GDEQ031T10 diff --git a/variants/esp32s3/t-watch-s3/platformio.ini b/variants/esp32s3/t-watch-s3/platformio.ini index 59ff8891d..e53352e08 100644 --- a/variants/esp32s3/t-watch-s3/platformio.ini +++ b/variants/esp32s3/t-watch-s3/platformio.ini @@ -6,7 +6,7 @@ board_check = true board_build.partitions = default_16MB.csv upload_protocol = esptool -build_flags = ${esp32_base.build_flags} +build_flags = ${esp32s3_base.build_flags} -DT_WATCH_S3 -Ivariants/esp32s3/t-watch-s3 -DPCF8563_RTC=0x51 diff --git a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini index 82bab453d..73c5dbe5d 100644 --- a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini +++ b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini @@ -5,7 +5,7 @@ board_check = true upload_protocol = esptool build_flags = - ${esp32_base.build_flags} + ${esp32s3_base.build_flags} -D TLORA_T3S3_EPAPER -I variants/esp32s3/tlora_t3s3_epaper -DUSE_EINK @@ -28,7 +28,7 @@ board = tlora-t3s3-v1 board_check = true upload_protocol = esptool build_src_filter = - ${esp32_base.build_src_filter} + ${esp32s3_base.build_src_filter} ${inkhud.build_src_filter} build_flags = ${esp32s3_base.build_flags} diff --git a/variants/esp32s3/tlora_t3s3_v1/platformio.ini b/variants/esp32s3/tlora_t3s3_v1/platformio.ini index 56ece0d62..7a5e3df4b 100644 --- a/variants/esp32s3/tlora_t3s3_v1/platformio.ini +++ b/variants/esp32s3/tlora_t3s3_v1/platformio.ini @@ -5,4 +5,6 @@ board_check = true upload_protocol = esptool build_flags = - ${esp32_base.build_flags} -D TLORA_T3S3_V1 -I variants/esp32s3/tlora_t3s3_v1 + ${esp32s3_base.build_flags} + -D TLORA_T3S3_V1 + -I variants/esp32s3/tlora_t3s3_v1 From ed77ba5612423698da035e413e45dba0037826c6 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 15 Dec 2025 20:48:34 -0500 Subject: [PATCH 278/286] Replace PIO fuzzy version matches (reproducible builds) (#8984) This change does not introduce version *changes*, but simply "updates" to the version already being referenced by the fuzzy-match (^) --- variants/esp32/betafpv_2400_tx_micro/platformio.ini | 2 +- variants/esp32/chatter2/platformio.ini | 2 +- variants/esp32/esp32.ini | 2 +- variants/esp32/m5stack_core/platformio.ini | 2 +- variants/esp32/m5stack_coreink/platformio.ini | 4 ++-- variants/esp32/wiphone/platformio.ini | 6 +++--- variants/esp32c3/heltec_hru_3601/platformio.ini | 2 +- variants/esp32c6/m5stack_unitc6l/platformio.ini | 4 ++-- variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini | 4 ++-- variants/esp32s3/bpi_picow_esp32_s3/platformio.ini | 2 +- .../esp32s3/diy/my_esp32s3_diy_eink/platformio.ini | 4 ++-- .../esp32s3/diy/my_esp32s3_diy_oled/platformio.ini | 2 +- variants/esp32s3/dreamcatcher/platformio.ini | 4 ++-- variants/esp32s3/esp32-s3-pico/platformio.ini | 4 ++-- variants/esp32s3/heltec_sensor_hub/platformio.ini | 2 +- .../esp32s3/heltec_vision_master_e213/platformio.ini | 2 +- .../esp32s3/heltec_vision_master_e290/platformio.ini | 2 +- .../esp32s3/heltec_vision_master_t190/platformio.ini | 2 +- .../esp32s3/heltec_wireless_paper/platformio.ini | 2 +- .../esp32s3/heltec_wireless_paper_v1/platformio.ini | 2 +- .../esp32s3/heltec_wireless_tracker/platformio.ini | 2 +- .../heltec_wireless_tracker_V1_0/platformio.ini | 2 +- .../heltec_wireless_tracker_v2/platformio.ini | 2 +- variants/esp32s3/mesh-tab/platformio.ini | 2 +- variants/esp32s3/picomputer-s3/platformio.ini | 2 +- variants/esp32s3/rak_wismesh_tap_v2/platformio.ini | 2 +- .../esp32s3/seeed-sensecap-indicator/platformio.ini | 4 ++-- variants/esp32s3/t-deck-pro/platformio.ini | 2 +- variants/esp32s3/t-deck/platformio.ini | 6 +++--- variants/esp32s3/t-watch-s3/platformio.ini | 8 ++++---- variants/esp32s3/tracksenger/platformio.ini | 4 ++-- variants/esp32s3/unphone/platformio.ini | 4 ++-- variants/native/portduino.ini | 2 +- variants/native/portduino/platformio.ini | 2 +- .../Dongle_nRF52840-pca10059-v1/platformio.ini | 2 +- .../nrf52840/ELECROW-ThinkNode-M1/platformio.ini | 6 +++--- .../nrf52840/ELECROW-ThinkNode-M3/platformio.ini | 4 ++-- .../nrf52840/ELECROW-ThinkNode-M6/platformio.ini | 2 +- .../nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini | 2 +- .../nrf52840/MakePython_nRF52840_eink/platformio.ini | 2 +- variants/nrf52840/TWC_mesh_v4/platformio.ini | 2 +- variants/nrf52840/canaryone/platformio.ini | 2 +- .../heltec_mesh_node_t114-inkhud/platformio.ini | 2 +- .../nrf52840/heltec_mesh_node_t114/platformio.ini | 2 +- variants/nrf52840/heltec_mesh_pocket/platformio.ini | 4 ++-- variants/nrf52840/heltec_mesh_solar/platformio.ini | 2 +- variants/nrf52840/nano-g2-ultra/platformio.ini | 2 +- variants/nrf52840/nrf52.ini | 2 +- variants/nrf52840/r1-neo/platformio.ini | 2 +- variants/nrf52840/rak2560/platformio.ini | 2 +- variants/nrf52840/rak3401_1watt/platformio.ini | 6 +++--- variants/nrf52840/rak4631/platformio.ini | 10 +++++----- variants/nrf52840/rak4631_epaper/platformio.ini | 10 +++++----- .../nrf52840/rak4631_epaper_onrxtx/platformio.ini | 10 +++++----- variants/nrf52840/rak4631_eth_gw/platformio.ini | 10 +++++----- .../rak4631_nomadstar_meteor_pro/platformio.ini | 6 +++--- variants/nrf52840/rak_wismeshtap/platformio.ini | 12 ++++++------ variants/nrf52840/t-echo/platformio.ini | 4 ++-- variants/rp2040/rak11310/platformio.ini | 2 +- 59 files changed, 105 insertions(+), 105 deletions(-) diff --git a/variants/esp32/betafpv_2400_tx_micro/platformio.ini b/variants/esp32/betafpv_2400_tx_micro/platformio.ini index 4d163d834..bab431788 100644 --- a/variants/esp32/betafpv_2400_tx_micro/platformio.ini +++ b/variants/esp32/betafpv_2400_tx_micro/platformio.ini @@ -15,4 +15,4 @@ upload_protocol = esptool upload_speed = 460800 lib_deps = ${esp32_base.lib_deps} - adafruit/Adafruit NeoPixel @ ^1.12.0 + adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32/chatter2/platformio.ini b/variants/esp32/chatter2/platformio.ini index bf496bf26..19673d0cf 100644 --- a/variants/esp32/chatter2/platformio.ini +++ b/variants/esp32/chatter2/platformio.ini @@ -9,4 +9,4 @@ build_flags = lib_deps = ${esp32_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini index 4bc48cebb..ce46cae94 100644 --- a/variants/esp32/esp32.ini +++ b/variants/esp32/esp32.ini @@ -59,7 +59,7 @@ lib_deps = # renovate: datasource=git-refs depName=meshtastic-esp32_https_server packageName=https://github.com/meshtastic/esp32_https_server gitBranch=master https://github.com/meshtastic/esp32_https_server/archive/3223704846752e6d545139204837bdb2a55459ca.zip # renovate: datasource=custom.pio depName=NimBLE-Arduino packageName=h2zero/library/NimBLE-Arduino - h2zero/NimBLE-Arduino@^1.4.3 + h2zero/NimBLE-Arduino@1.4.3 # renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip # renovate: datasource=github-tags depName=XPowersLib packageName=lewisxhe/XPowersLib diff --git a/variants/esp32/m5stack_core/platformio.ini b/variants/esp32/m5stack_core/platformio.ini index a0443a918..009b3f90a 100644 --- a/variants/esp32/m5stack_core/platformio.ini +++ b/variants/esp32/m5stack_core/platformio.ini @@ -25,4 +25,4 @@ lib_ignore = m5stack-core lib_deps = ${esp32_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32/m5stack_coreink/platformio.ini b/variants/esp32/m5stack_coreink/platformio.ini index 1a00788e3..e37d5c1e1 100644 --- a/variants/esp32/m5stack_coreink/platformio.ini +++ b/variants/esp32/m5stack_coreink/platformio.ini @@ -18,8 +18,8 @@ build_flags = -DM5STACK lib_deps = ${esp32_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 - lewisxhe/PCF8563_Library@^1.0.1 + zinggjm/GxEPD2@1.6.5 + lewisxhe/PCF8563_Library@1.0.1 lib_ignore = m5stack-coreink monitor_filters = esp32_exception_decoder diff --git a/variants/esp32/wiphone/platformio.ini b/variants/esp32/wiphone/platformio.ini index 5cce94b13..b69b30e17 100644 --- a/variants/esp32/wiphone/platformio.ini +++ b/variants/esp32/wiphone/platformio.ini @@ -10,6 +10,6 @@ build_flags = -I variants/esp32/wiphone lib_deps = ${esp32_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 - sparkfun/SX1509 IO Expander@^3.0.5 - pololu/APA102@^3.0.0 + lovyan03/LovyanGFX@1.2.7 + sparkfun/SX1509 IO Expander@3.0.6 + pololu/APA102@3.0.0 diff --git a/variants/esp32c3/heltec_hru_3601/platformio.ini b/variants/esp32c3/heltec_hru_3601/platformio.ini index bfc3799b3..34c6838f8 100644 --- a/variants/esp32c3/heltec_hru_3601/platformio.ini +++ b/variants/esp32c3/heltec_hru_3601/platformio.ini @@ -6,4 +6,4 @@ build_flags = -D HELTEC_HRU_3601 -I variants/esp32c3/heltec_hru_3601 lib_deps = ${esp32c3_base.lib_deps} - adafruit/Adafruit NeoPixel @ ^1.12.0 + adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32c6/m5stack_unitc6l/platformio.ini b/variants/esp32c6/m5stack_unitc6l/platformio.ini index 9992ab2bf..f7b5f4ac2 100644 --- a/variants/esp32c6/m5stack_unitc6l/platformio.ini +++ b/variants/esp32c6/m5stack_unitc6l/platformio.ini @@ -12,8 +12,8 @@ build_unflags = -D HAS_WIFI lib_deps = ${esp32c6_base.lib_deps} - adafruit/Adafruit NeoPixel@^1.12.3 - h2zero/NimBLE-Arduino@^2.3.6 + adafruit/Adafruit NeoPixel@1.15.2 + h2zero/NimBLE-Arduino@2.3.7 build_flags = ${esp32c6_base.build_flags} -D M5STACK_UNITC6L diff --git a/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini b/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini index 7dac6e66e..a5fcbfcba 100644 --- a/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini +++ b/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini @@ -17,5 +17,5 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip - lewisxhe/PCF8563_Library@^1.0.1 - maxpromer/PCA9557-arduino @ ^1.0.0 \ No newline at end of file + lewisxhe/PCF8563_Library@1.0.1 + maxpromer/PCA9557-arduino@1.0.0 diff --git a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini index 91725e762..b021a9cf2 100644 --- a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini +++ b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini @@ -9,7 +9,7 @@ upload_protocol = esptool ;upload_port = /dev/ttyACM2 lib_deps = ${esp32s3_base.lib_deps} - caveman99/ESP32 Codec2@^1.0.1 + caveman99/ESP32 Codec2@1.0.1 build_flags = ${esp32s3_base.build_flags} -D PRIVATE_HW diff --git a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini index e2a677b4b..34855c19a 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini @@ -10,8 +10,8 @@ upload_protocol = esptool upload_speed = 921600 lib_deps = ${esp32s3_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 - adafruit/Adafruit NeoPixel @ ^1.12.0 + zinggjm/GxEPD2@1.6.5 + adafruit/Adafruit NeoPixel@1.15.2 build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 diff --git a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini index 2ba196991..b2d42417f 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini @@ -10,7 +10,7 @@ upload_protocol = esptool upload_speed = 921600 lib_deps = ${esp32s3_base.lib_deps} - adafruit/Adafruit NeoPixel @ ^1.12.0 + adafruit/Adafruit NeoPixel@1.15.2 build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 diff --git a/variants/esp32s3/dreamcatcher/platformio.ini b/variants/esp32s3/dreamcatcher/platformio.ini index d088f2dac..dc70b3d12 100644 --- a/variants/esp32s3/dreamcatcher/platformio.ini +++ b/variants/esp32s3/dreamcatcher/platformio.ini @@ -12,8 +12,8 @@ build_flags = -D ARDUINO_USB_CDC_ON_BOOT=1 lib_deps = ${esp32s3_base.lib_deps} - earlephilhower/ESP8266Audio@^1.9.9 - earlephilhower/ESP8266SAM@^1.0.1 + earlephilhower/ESP8266Audio@1.9.9 + earlephilhower/ESP8266SAM@1.1.0 [env:dreamcatcher-2206] extends = esp32s3_base diff --git a/variants/esp32s3/esp32-s3-pico/platformio.ini b/variants/esp32s3/esp32-s3-pico/platformio.ini index 11bd4f5a3..b2f5297d3 100644 --- a/variants/esp32s3/esp32-s3-pico/platformio.ini +++ b/variants/esp32s3/esp32-s3-pico/platformio.ini @@ -22,5 +22,5 @@ build_flags = ${esp32s3_base.build_flags} -DEINK_HEIGHT=128 lib_deps = ${esp32s3_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 - adafruit/Adafruit NeoPixel @ ^1.12.0 + zinggjm/GxEPD2@1.6.5 + adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32s3/heltec_sensor_hub/platformio.ini b/variants/esp32s3/heltec_sensor_hub/platformio.ini index 92b90d9b9..061e7029f 100644 --- a/variants/esp32s3/heltec_sensor_hub/platformio.ini +++ b/variants/esp32s3/heltec_sensor_hub/platformio.ini @@ -9,4 +9,4 @@ build_flags = -D HELTEC_SENSOR_HUB lib_deps = ${esp32s3_base.lib_deps} - adafruit/Adafruit NeoPixel @ ^1.12.0 + adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32s3/heltec_vision_master_e213/platformio.ini b/variants/esp32s3/heltec_vision_master_e213/platformio.ini index f716883b4..180bce573 100644 --- a/variants/esp32s3/heltec_vision_master_e213/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e213/platformio.ini @@ -18,7 +18,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 [env:heltec-vision-master-e213-inkhud] diff --git a/variants/esp32s3/heltec_vision_master_e290/platformio.ini b/variants/esp32s3/heltec_vision_master_e290/platformio.ini index 5ee0e51ea..66954951e 100644 --- a/variants/esp32s3/heltec_vision_master_e290/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e290/platformio.ini @@ -21,7 +21,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/448c8538129fde3d02a7cb5e6fc81971ad92547f.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 [env:heltec-vision-master-e290-inkhud] diff --git a/variants/esp32s3/heltec_vision_master_t190/platformio.ini b/variants/esp32s3/heltec_vision_master_t190/platformio.ini index e7e7ff4e4..e07a59465 100644 --- a/variants/esp32s3/heltec_vision_master_t190/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_t190/platformio.ini @@ -8,6 +8,6 @@ build_flags = -D HELTEC_VISION_MASTER_T190 lib_deps = ${esp32s3_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip upload_speed = 921600 diff --git a/variants/esp32s3/heltec_wireless_paper/platformio.ini b/variants/esp32s3/heltec_wireless_paper/platformio.ini index 3cc17dd85..cc95f3e44 100644 --- a/variants/esp32s3/heltec_wireless_paper/platformio.ini +++ b/variants/esp32s3/heltec_wireless_paper/platformio.ini @@ -19,7 +19,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 [env:heltec-wireless-paper-inkhud] diff --git a/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini index 99f2eddeb..8997e358b 100644 --- a/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini +++ b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini @@ -16,5 +16,5 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 diff --git a/variants/esp32s3/heltec_wireless_tracker/platformio.ini b/variants/esp32s3/heltec_wireless_tracker/platformio.ini index 3a373bf4f..60c3f477b 100644 --- a/variants/esp32s3/heltec_wireless_tracker/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker/platformio.ini @@ -12,4 +12,4 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini index cd961533d..456c5f59c 100644 --- a/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini @@ -11,4 +11,4 @@ build_flags = ;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini b/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini index 0f9265f91..c17239705 100644 --- a/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini @@ -10,4 +10,4 @@ build_flags = -D HELTEC_WIRELESS_TRACKER_V2 lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/mesh-tab/platformio.ini b/variants/esp32s3/mesh-tab/platformio.ini index 2bb8abcaf..4cbb6ecd4 100644 --- a/variants/esp32s3/mesh-tab/platformio.ini +++ b/variants/esp32s3/mesh-tab/platformio.ini @@ -50,7 +50,7 @@ build_src_filter = ${esp32s3_base.build_src_filter} lib_deps = ${esp32s3_base.lib_deps} ${device-ui_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 [mesh_tab_xpt2046] extends = mesh_tab_base diff --git a/variants/esp32s3/picomputer-s3/platformio.ini b/variants/esp32s3/picomputer-s3/platformio.ini index 4131cc30a..9e9f9d1e9 100644 --- a/variants/esp32s3/picomputer-s3/platformio.ini +++ b/variants/esp32s3/picomputer-s3/platformio.ini @@ -15,7 +15,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 build_src_filter = ${esp32s3_base.build_src_filter} diff --git a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini index 8cc78d967..4d3e21b72 100644 --- a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini +++ b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini @@ -15,7 +15,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 [ft5x06] extends = mesh_tab_base diff --git a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini index bde4d7383..8a5d8b208 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini +++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini @@ -25,8 +25,8 @@ build_flags = ${esp32s3_base.build_flags} lib_deps = ${esp32s3_base.lib_deps} https://github.com/mverch67/LovyanGFX/archive/4c76238c1344162a234ae917b27651af146d6fb2.zip - earlephilhower/ESP8266Audio@^1.9.9 - earlephilhower/ESP8266SAM@^1.0.1 + earlephilhower/ESP8266Audio@1.9.9 + earlephilhower/ESP8266SAM@1.1.0 [env:seeed-sensecap-indicator-tft] diff --git a/variants/esp32s3/t-deck-pro/platformio.ini b/variants/esp32s3/t-deck-pro/platformio.ini index 7a1a49ea6..45c11595d 100644 --- a/variants/esp32s3/t-deck-pro/platformio.ini +++ b/variants/esp32s3/t-deck-pro/platformio.ini @@ -17,7 +17,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - https://github.com/ZinggJM/GxEPD2/archive/refs/tags/1.6.4.zip + zinggjm/GxEPD2@1.6.4 https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip https://github.com/CIRCUITSTATE/CSE_CST328/archive/refs/tags/v0.0.4.zip https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip diff --git a/variants/esp32s3/t-deck/platformio.ini b/variants/esp32s3/t-deck/platformio.ini index 9ab0756d1..85129e7d6 100644 --- a/variants/esp32s3/t-deck/platformio.ini +++ b/variants/esp32s3/t-deck/platformio.ini @@ -12,9 +12,9 @@ build_flags = ${esp32s3_base.build_flags} -I variants/esp32s3/t-deck lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 - earlephilhower/ESP8266Audio@^1.9.9 - earlephilhower/ESP8266SAM@^1.0.1 + lovyan03/LovyanGFX@1.2.7 + earlephilhower/ESP8266Audio@1.9.9 + earlephilhower/ESP8266SAM@1.1.0 [env:t-deck-tft] extends = env:t-deck diff --git a/variants/esp32s3/t-watch-s3/platformio.ini b/variants/esp32s3/t-watch-s3/platformio.ini index e53352e08..2be6c002f 100644 --- a/variants/esp32s3/t-watch-s3/platformio.ini +++ b/variants/esp32s3/t-watch-s3/platformio.ini @@ -13,9 +13,9 @@ build_flags = ${esp32s3_base.build_flags} -DHAS_BMA423=1 lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 lewisxhe/PCF8563_Library@1.0.1 - adafruit/Adafruit DRV2605 Library@^1.2.2 - earlephilhower/ESP8266Audio@^1.9.9 - earlephilhower/ESP8266SAM@^1.0.1 + adafruit/Adafruit DRV2605 Library@1.2.4 + earlephilhower/ESP8266Audio@1.9.9 + earlephilhower/ESP8266SAM@1.1.0 lewisxhe/SensorLib@0.2.0 diff --git a/variants/esp32s3/tracksenger/platformio.ini b/variants/esp32s3/tracksenger/platformio.ini index 213a917b1..5bc603f31 100644 --- a/variants/esp32s3/tracksenger/platformio.ini +++ b/variants/esp32s3/tracksenger/platformio.ini @@ -12,7 +12,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 [env:tracksenger-lcd] extends = esp32s3_base @@ -28,7 +28,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 [env:tracksenger-oled] extends = esp32s3_base diff --git a/variants/esp32s3/unphone/platformio.ini b/variants/esp32s3/unphone/platformio.ini index f17a27e17..4e154c517 100644 --- a/variants/esp32s3/unphone/platformio.ini +++ b/variants/esp32s3/unphone/platformio.ini @@ -27,9 +27,9 @@ build_src_filter = +<../variants/esp32s3/unphone> lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@ 1.2.0 + lovyan03/LovyanGFX@1.2.0 https://gitlab.com/hamishcunningham/unphonelibrary#meshtastic@9.0.0 - adafruit/Adafruit NeoPixel @ ^1.12.0 + adafruit/Adafruit NeoPixel@1.15.2 [env:unphone-tft] diff --git a/variants/native/portduino.ini b/variants/native/portduino.ini index bce06f907..55b082974 100644 --- a/variants/native/portduino.ini +++ b/variants/native/portduino.ini @@ -26,7 +26,7 @@ lib_deps = # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto rweather/Crypto@0.4.0 # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX - lovyan03/LovyanGFX@^1.2.0 + lovyan03/LovyanGFX@1.2.7 # renovate: datasource=git-refs depName=libch341-spi-userspace packageName=https://github.com/pine64/libch341-spi-userspace gitBranch=main https://github.com/pine64/libch341-spi-userspace/archive/af9bc27c9c30fa90772279925b7c5913dff789b4.zip # renovate: datasource=custom.pio depName=adafruit/Adafruit seesaw Library packageName=adafruit/library/Adafruit seesaw Library diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index 9cedfcc55..d87c74532 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -6,7 +6,7 @@ board = cross_platform board_level = extra lib_deps = ${portduino_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 build_src_filter = ${portduino_base.build_src_filter} diff --git a/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini index 83044c206..4c71cf548 100644 --- a/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini +++ b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini @@ -11,5 +11,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/Dongle_nRF52840-pca10059-v1> lib_deps = ${nrf52840_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 + zinggjm/GxEPD2@1.6.5 debug_tool = jlink diff --git a/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini index f89b05d1f..ddb40c7c9 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini @@ -24,8 +24,8 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW lib_deps = ${nrf52840_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip - lewisxhe/PCF8563_Library@^1.0.1 - khoih-prog/nRF52_PWM@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 + khoih-prog/nRF52_PWM@1.0.1 ;upload_protocol = fs [env:thinknode_m1-inkhud] @@ -45,4 +45,4 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 \ No newline at end of file + lewisxhe/PCF8563_Library@1.0.1 \ No newline at end of file diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini index 958e48e48..3dcbbc888 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini @@ -13,5 +13,5 @@ build_flags = build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M3> lib_deps = ${nrf52840_base.lib_deps} - khoih-prog/nRF52_PWM@^1.0.1 - lewisxhe/PCF8563_Library@^1.0.1 + khoih-prog/nRF52_PWM@1.0.1 + lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini index 2bf227791..1f2cb72fe 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini @@ -12,4 +12,4 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M6> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini index f8d6da008..6309930d3 100644 --- a/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini +++ b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini @@ -15,7 +15,7 @@ board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ME25LS01-4Y10TD_e-ink> lib_deps = ${nrf52840_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 + zinggjm/GxEPD2@1.6.5 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) upload_protocol = nrfutil ;upload_port = /dev/ttyACM1 diff --git a/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini index 50e5495f0..3a0dbfde3 100644 --- a/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini +++ b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini @@ -13,6 +13,6 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MakePyt lib_deps = ${nrf52840_base.lib_deps} https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip - zinggjm/GxEPD2@^1.6.2 + zinggjm/GxEPD2@1.6.5 debug_tool = jlink ;upload_port = /dev/ttyACM4 \ No newline at end of file diff --git a/variants/nrf52840/TWC_mesh_v4/platformio.ini b/variants/nrf52840/TWC_mesh_v4/platformio.ini index 77aeee26e..156d2aa2e 100644 --- a/variants/nrf52840/TWC_mesh_v4/platformio.ini +++ b/variants/nrf52840/TWC_mesh_v4/platformio.ini @@ -8,5 +8,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/TWC_mesh_v4> lib_deps = ${nrf52840_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 + zinggjm/GxEPD2@1.6.5 debug_tool = jlink diff --git a/variants/nrf52840/canaryone/platformio.ini b/variants/nrf52840/canaryone/platformio.ini index 251937e9c..fb4c4c6fb 100644 --- a/variants/nrf52840/canaryone/platformio.ini +++ b/variants/nrf52840/canaryone/platformio.ini @@ -11,5 +11,5 @@ build_flags = build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/canaryone> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs diff --git a/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini index 2641a507d..3c2d4c7c9 100644 --- a/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini +++ b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini @@ -14,7 +14,7 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 extra_scripts = ${env.extra_scripts} variants/nrf52840/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py ; Add to PIO's Project Tasks pane: preset builds for common displays diff --git a/variants/nrf52840/heltec_mesh_node_t114/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini index c49dadd56..bdebd28a4 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/platformio.ini +++ b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini @@ -13,5 +13,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_node_t114> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip \ No newline at end of file diff --git a/variants/nrf52840/heltec_mesh_pocket/platformio.ini b/variants/nrf52840/heltec_mesh_pocket/platformio.ini index 2fb852226..b797f62c0 100644 --- a/variants/nrf52840/heltec_mesh_pocket/platformio.ini +++ b/variants/nrf52840/heltec_mesh_pocket/platformio.ini @@ -25,7 +25,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 https://github.com/meshtastic/GxEPD2#b202ebfec6a4821e098cf7a625ba0f6f2400292d @@ -71,7 +71,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 https://github.com/meshtastic/GxEPD2#b202ebfec6a4821e098cf7a625ba0f6f2400292d diff --git a/variants/nrf52840/heltec_mesh_solar/platformio.ini b/variants/nrf52840/heltec_mesh_solar/platformio.ini index 36a7904d6..146d55c6e 100644 --- a/variants/nrf52840/heltec_mesh_solar/platformio.ini +++ b/variants/nrf52840/heltec_mesh_solar/platformio.ini @@ -14,7 +14,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_ lib_deps = ${nrf52840_base.lib_deps} https://github.com/NMIoT/meshsolar/archive/dfc5330dad443982e6cdd37a61d33fc7252f468b.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 ArduinoJson@6.21.4 [env:heltec-mesh-solar] extends = heltec_mesh_solar_base diff --git a/variants/nrf52840/nano-g2-ultra/platformio.ini b/variants/nrf52840/nano-g2-ultra/platformio.ini index f697a90dd..3e1b7ce6a 100644 --- a/variants/nrf52840/nano-g2-ultra/platformio.ini +++ b/variants/nrf52840/nano-g2-ultra/platformio.ini @@ -10,5 +10,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/nano-g2-ultra> lib_deps = ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs diff --git a/variants/nrf52840/nrf52.ini b/variants/nrf52840/nrf52.ini index 48b7deeb5..a07fefb2f 100644 --- a/variants/nrf52840/nrf52.ini +++ b/variants/nrf52840/nrf52.ini @@ -2,7 +2,7 @@ ; Instead of the standard nordicnrf52 platform, we use our fork which has our added variant files platform = # renovate: datasource=custom.pio depName=platformio/nordicnrf52 packageName=platformio/platform/nordicnrf52 - platformio/nordicnrf52@^10.8.0 + platformio/nordicnrf52@10.10.0 extends = arduino_base platform_packages = ; our custom Git version until they merge our PR diff --git a/variants/nrf52840/r1-neo/platformio.ini b/variants/nrf52840/r1-neo/platformio.ini index 60f1f6ae1..6efe3a1c5 100644 --- a/variants/nrf52840/r1-neo/platformio.ini +++ b/variants/nrf52840/r1-neo/platformio.ini @@ -14,5 +14,5 @@ lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 artronshop/ArtronShop_RX8130CE@1.0.0 diff --git a/variants/nrf52840/rak2560/platformio.ini b/variants/nrf52840/rak2560/platformio.ini index 021e6d03b..f0f6408d3 100644 --- a/variants/nrf52840/rak2560/platformio.ini +++ b/variants/nrf52840/rak2560/platformio.ini @@ -14,7 +14,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak2560 lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 https://github.com/beegee-tokyo/RAK-OneWireSerial/archive/0.0.2.zip debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak3401_1watt/platformio.ini b/variants/nrf52840/rak3401_1watt/platformio.ini index 1a915a6b3..5bf68eecf 100644 --- a/variants/nrf52840/rak3401_1watt/platformio.ini +++ b/variants/nrf52840/rak3401_1watt/platformio.ini @@ -16,9 +16,9 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak3401 lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 - beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + melopero/Melopero RV3028@1.2.0 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + beegee-tokyo/RAK12035_SoilMoisture@1.0.4 https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 0ef661af8..1d8f919bb 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -23,10 +23,10 @@ build_src_filter = ${nrf52_base.build_src_filter} \ lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 - beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + beegee-tokyo/RAK12035_SoilMoisture@1.0.4 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip @@ -42,7 +42,7 @@ extends = env:rak4631 board_level = extra ; if the builtin version of openocd has a buggy version of semihosting, so use the external version -; platform_packages = platformio/tool-openocd@^3.1200.0 +; platform_packages = platformio/tool-openocd@3.1200.0 build_flags = ${env:rak4631.build_flags} @@ -59,6 +59,6 @@ lib_deps = ; In theory I could change those scripts. But for now I'm trying going back to a DAP adapter but with the external openocd. upload_protocol = stlink -; eventually use platformio/tool-pyocd@^2.3600.0 instad +; eventually use platformio/tool-pyocd@2.3600.0 instad ;upload_protocol = custom ;upload_command = pyocd flash -t nrf52840 $UPLOADERFLAGS $SOURCE diff --git a/variants/nrf52840/rak4631_epaper/platformio.ini b/variants/nrf52840/rak4631_epaper/platformio.ini index 704520f8d..5808b27e3 100644 --- a/variants/nrf52840/rak4631_epaper/platformio.ini +++ b/variants/nrf52840/rak4631_epaper/platformio.ini @@ -14,11 +14,11 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper> lib_deps = ${nrf52840_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 - melopero/Melopero RV3028@^1.1.0 - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 - beegee-tokyo/RAKwireless RAK12034@^1.0.0 - beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + zinggjm/GxEPD2@1.6.5 + melopero/Melopero RV3028@1.2.0 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + beegee-tokyo/RAKwireless RAK12034@1.0.0 + beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ;upload_protocol = jlink diff --git a/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini index e0156668b..f350e7ba7 100644 --- a/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini +++ b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini @@ -16,11 +16,11 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper_onrxtx> lib_deps = ${nrf52840_base.lib_deps} - zinggjm/GxEPD2@^1.6.2 - melopero/Melopero RV3028@^1.1.0 - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 - beegee-tokyo/RAKwireless RAK12034@^1.0.0 - beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + zinggjm/GxEPD2@1.6.5 + melopero/Melopero RV3028@1.2.0 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + beegee-tokyo/RAKwireless RAK12034@1.0.0 + beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ;upload_protocol = jlink diff --git a/variants/nrf52840/rak4631_eth_gw/platformio.ini b/variants/nrf52840/rak4631_eth_gw/platformio.ini index 3c61e3498..bce961260 100644 --- a/variants/nrf52840/rak4631_eth_gw/platformio.ini +++ b/variants/nrf52840/rak4631_eth_gw/platformio.ini @@ -27,12 +27,12 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631 lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip - bblanchon/ArduinoJson @ 6.21.4 + bblanchon/ArduinoJson@6.21.4 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds ;upload_protocol = jlink @@ -45,7 +45,7 @@ extends = env:rak4631 board_level = extra ; if the builtin version of openocd has a buggy version of semihosting, so use the external version -; platform_packages = platformio/tool-openocd@^3.1200.0 +; platform_packages = platformio/tool-openocd@3.1200.0 build_flags = ${env:rak4631_eth_gw.build_flags} @@ -62,6 +62,6 @@ lib_deps = ; In theory I could change those scripts. But for now I'm trying going back to a DAP adapter but with the external openocd. upload_protocol = stlink -; eventually use platformio/tool-pyocd@^2.3600.0 instad +; eventually use platformio/tool-pyocd@2.3600.0 instad ;upload_protocol = custom ;upload_command = pyocd flash -t nrf52840 $UPLOADERFLAGS $SOURCE diff --git a/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini index d7dab2678..45842ab76 100644 --- a/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini +++ b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini @@ -29,7 +29,7 @@ extends = env:rak4631_nomadstar_meteor_pro board_level = extra ; if the builtin version of openocd has a buggy version of semihosting, so use the external version -; platform_packages = platformio/tool-openocd@^3.1200.0 +; platform_packages = platformio/tool-openocd@3.1200.0 build_flags = ${env:rak4631.build_flags} @@ -46,6 +46,6 @@ lib_deps = ; In theory I could change those scripts. But for now I'm trying going back to a DAP adapter but with the external openocd. upload_protocol = stlink -; eventually use platformio/tool-pyocd@^2.3600.0 instad +; eventually use platformio/tool-pyocd@2.3600.0 instad ;upload_protocol = custom -;upload_command = pyocd flash -t nrf52840 $UPLOADERFLAGS $SOURCE \ No newline at end of file +;upload_command = pyocd flash -t nrf52840 $UPLOADERFLAGS $SOURCE diff --git a/variants/nrf52840/rak_wismeshtap/platformio.ini b/variants/nrf52840/rak_wismeshtap/platformio.ini index 3369f9c77..93fbd1547 100644 --- a/variants/nrf52840/rak_wismeshtap/platformio.ini +++ b/variants/nrf52840/rak_wismeshtap/platformio.ini @@ -18,13 +18,13 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wis lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip - rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2 - bodmer/TFT_eSPI - beegee-tokyo/RAKwireless RAK12034@^1.0.0 - beegee-tokyo/RAK14014-FT6336U @ 1.0.1 - beegee-tokyo/RAK12035_SoilMoisture@^1.0.4 + rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + bodmer/TFT_eSPI@2.5.43 + beegee-tokyo/RAKwireless RAK12034@1.0.0 + beegee-tokyo/RAK14014-FT6336U@1.0.1 + beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ;upload_protocol = jlink diff --git a/variants/nrf52840/t-echo/platformio.ini b/variants/nrf52840/t-echo/platformio.ini index 051fb3099..4a2b6c69d 100644 --- a/variants/nrf52840/t-echo/platformio.ini +++ b/variants/nrf52840/t-echo/platformio.ini @@ -21,7 +21,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-echo> lib_deps = ${nrf52840_base.lib_deps} https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip - lewisxhe/PCF8563_Library@^1.0.1 + lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs [env:t-echo-inkhud] @@ -41,4 +41,4 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@^1.0.1 \ No newline at end of file + lewisxhe/PCF8563_Library@1.0.1 \ No newline at end of file diff --git a/variants/rp2040/rak11310/platformio.ini b/variants/rp2040/rak11310/platformio.ini index f3eaa176e..1e37696b2 100644 --- a/variants/rp2040/rak11310/platformio.ini +++ b/variants/rp2040/rak11310/platformio.ini @@ -14,7 +14,7 @@ build_src_filter = ${rp2040_base.build_src_filter} +<../variants/rp2040/rak11310 lib_deps = ${rp2040_base.lib_deps} ${networking_base.lib_deps} - melopero/Melopero RV3028@^1.1.0 + melopero/Melopero RV3028@1.2.0 https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool From 917794ebabb02b08a09ca60a141d78b3a75afee9 Mon Sep 17 00:00:00 2001 From: Austin Date: Mon, 15 Dec 2025 23:38:10 -0500 Subject: [PATCH 279/286] PIO: Remove useless inheritence (references extends env) (#8987) Remove lib_deps section for all PlatformIO envs which are unneeded (only references the `extends` lib_deps, thus pointless) This makes the configs more concise and make future PIO variants/ libdeps audits easier. --- variants/esp32/betafpv_900_tx_nano/platformio.ini | 2 -- variants/esp32/nano-g1-explorer/platformio.ini | 2 -- variants/esp32/nano-g1/platformio.ini | 2 -- variants/esp32/radiomaster_900_bandit_micro/platformio.ini | 2 -- variants/esp32/radiomaster_900_bandit_nano/platformio.ini | 2 -- variants/esp32/station-g1/platformio.ini | 2 -- variants/esp32/tbeam/platformio.ini | 1 - variants/esp32s3/heltec_v4/platformio.ini | 2 -- variants/esp32s3/icarus/platformio.ini | 2 -- variants/esp32s3/m5stack_cores3/platformio.ini | 1 - variants/esp32s3/seeed_xiao_s3/platformio.ini | 2 -- variants/esp32s3/station-g2/platformio.ini | 2 -- variants/native/portduino-buildroot/platformio.ini | 1 - variants/nrf52840/ME25LS01-4Y10TD/platformio.ini | 2 -- variants/nrf52840/MS24SF1/platformio.ini | 2 -- variants/nrf52840/diy/WashTastic/platformio.ini | 2 -- variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini | 2 -- .../diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini | 2 -- variants/nrf52840/feather_diy/platformio.ini | 2 -- variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini | 2 -- variants/nrf52840/meshlink/platformio.ini | 2 -- variants/nrf52840/meshtiny/platformio.ini | 2 -- variants/nrf52840/nrf52832.ini | 3 --- variants/nrf52840/rak_wismeshtag/platformio.ini | 2 -- variants/nrf52840/seeed_solar_node/platformio.ini | 2 -- variants/nrf52840/seeed_wio_tracker_L1/platformio.ini | 2 -- variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini | 2 +- variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini | 2 -- variants/nrf52840/t-echo/platformio.ini | 2 +- variants/nrf52840/wio-t1000-s/platformio.ini | 2 -- variants/nrf52840/wio-tracker-wm1110/platformio.ini | 4 +--- variants/rp2040/challenger_2040_lora/platformio.ini | 2 -- variants/rp2040/ec_catsniffer/platformio.ini | 2 -- variants/rp2040/feather_rp2040_rfm95/platformio.ini | 2 -- variants/rp2040/nibble_rp2040/platformio.ini | 2 -- variants/rp2040/rp2040-lora/platformio.ini | 2 -- variants/rp2040/rpipico-slowclock/platformio.ini | 2 -- variants/rp2040/rpipico/platformio.ini | 2 -- variants/rp2040/senselora_rp2040/platformio.ini | 2 -- variants/rp2350/rpipico2/platformio.ini | 2 -- variants/stm32/wio-e5/platformio.ini | 4 ---- 41 files changed, 3 insertions(+), 81 deletions(-) diff --git a/variants/esp32/betafpv_900_tx_nano/platformio.ini b/variants/esp32/betafpv_900_tx_nano/platformio.ini index 7e01fd2fa..a4ebe9694 100644 --- a/variants/esp32/betafpv_900_tx_nano/platformio.ini +++ b/variants/esp32/betafpv_900_tx_nano/platformio.ini @@ -13,5 +13,3 @@ board_build.f_cpu = 240000000L upload_protocol = esptool ;upload_port = /dev/ttyUSB0 upload_speed = 460800 -lib_deps = - ${esp32_base.lib_deps} diff --git a/variants/esp32/nano-g1-explorer/platformio.ini b/variants/esp32/nano-g1-explorer/platformio.ini index 2ba1f49e9..f40a0e06c 100644 --- a/variants/esp32/nano-g1-explorer/platformio.ini +++ b/variants/esp32/nano-g1-explorer/platformio.ini @@ -2,8 +2,6 @@ [env:nano-g1-explorer] extends = esp32_base board = ttgo-t-beam -lib_deps = - ${esp32_base.lib_deps} build_flags = ${esp32_base.build_flags} -D NANO_G1_EXPLORER diff --git a/variants/esp32/nano-g1/platformio.ini b/variants/esp32/nano-g1/platformio.ini index be8227de2..c61c9edaf 100644 --- a/variants/esp32/nano-g1/platformio.ini +++ b/variants/esp32/nano-g1/platformio.ini @@ -2,8 +2,6 @@ [env:nano-g1] extends = esp32_base board = ttgo-t-beam -lib_deps = - ${esp32_base.lib_deps} build_flags = ${esp32_base.build_flags} -D NANO_G1 diff --git a/variants/esp32/radiomaster_900_bandit_micro/platformio.ini b/variants/esp32/radiomaster_900_bandit_micro/platformio.ini index 36a45787b..32e9280e1 100644 --- a/variants/esp32/radiomaster_900_bandit_micro/platformio.ini +++ b/variants/esp32/radiomaster_900_bandit_micro/platformio.ini @@ -15,5 +15,3 @@ build_flags = -I variants/esp32/radiomaster_900_bandit_nano board_build.f_cpu = 240000000L upload_protocol = esptool -lib_deps = - ${esp32_base.lib_deps} diff --git a/variants/esp32/radiomaster_900_bandit_nano/platformio.ini b/variants/esp32/radiomaster_900_bandit_nano/platformio.ini index 9a7fad83b..887fb7916 100644 --- a/variants/esp32/radiomaster_900_bandit_nano/platformio.ini +++ b/variants/esp32/radiomaster_900_bandit_nano/platformio.ini @@ -10,5 +10,3 @@ build_flags = -I variants/esp32/radiomaster_900_bandit_nano board_build.f_cpu = 240000000L upload_protocol = esptool -lib_deps = - ${esp32_base.lib_deps} diff --git a/variants/esp32/station-g1/platformio.ini b/variants/esp32/station-g1/platformio.ini index 693a41ae8..609d9cd8e 100644 --- a/variants/esp32/station-g1/platformio.ini +++ b/variants/esp32/station-g1/platformio.ini @@ -2,8 +2,6 @@ [env:station-g1] extends = esp32_base board = ttgo-t-beam -lib_deps = - ${esp32_base.lib_deps} build_flags = ${esp32_base.build_flags} -D STATION_G1 diff --git a/variants/esp32/tbeam/platformio.ini b/variants/esp32/tbeam/platformio.ini index ddb8e9c9f..ac9713693 100644 --- a/variants/esp32/tbeam/platformio.ini +++ b/variants/esp32/tbeam/platformio.ini @@ -4,7 +4,6 @@ extends = esp32_base board = ttgo-t-beam board_level = extra board_check = true -lib_deps = ${esp32_base.lib_deps} build_flags = ${esp32_base.build_flags} -D TBEAM_V10 -I variants/esp32/tbeam diff --git a/variants/esp32s3/heltec_v4/platformio.ini b/variants/esp32s3/heltec_v4/platformio.ini index 4ff7ff253..a58ac9708 100644 --- a/variants/esp32s3/heltec_v4/platformio.ini +++ b/variants/esp32s3/heltec_v4/platformio.ini @@ -7,8 +7,6 @@ build_flags = ${esp32s3_base.build_flags} -D HELTEC_V4 -I variants/esp32s3/heltec_v4 -lib_deps = - ${esp32s3_base.lib_deps} [env:heltec-v4] diff --git a/variants/esp32s3/icarus/platformio.ini b/variants/esp32s3/icarus/platformio.ini index de450da93..80a103c33 100644 --- a/variants/esp32s3/icarus/platformio.ini +++ b/variants/esp32s3/icarus/platformio.ini @@ -8,8 +8,6 @@ board_build.partitions = default_8MB.csv upload_protocol = esptool upload_speed = 921600 platform_packages = platformio/framework-arduinoespressif32@https://github.com/PowerFeather/powerfeather-meshtastic-arduino-lib/releases/download/2.0.16a/esp32-2.0.16.zip -lib_deps = - ${esp32s3_base.lib_deps} build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 diff --git a/variants/esp32s3/m5stack_cores3/platformio.ini b/variants/esp32s3/m5stack_cores3/platformio.ini index 51116acef..6ad09a8bf 100644 --- a/variants/esp32s3/m5stack_cores3/platformio.ini +++ b/variants/esp32s3/m5stack_cores3/platformio.ini @@ -10,4 +10,3 @@ build_flags = -D PRIVATE_HW -D M5STACK_CORES3 -I variants/esp32s3/m5stack_cores3 -lib_deps = ${esp32s3_base.lib_deps} diff --git a/variants/esp32s3/seeed_xiao_s3/platformio.ini b/variants/esp32s3/seeed_xiao_s3/platformio.ini index ffc6e9638..3460399d9 100644 --- a/variants/esp32s3/seeed_xiao_s3/platformio.ini +++ b/variants/esp32s3/seeed_xiao_s3/platformio.ini @@ -6,8 +6,6 @@ board_check = true board_build.partitions = default_8MB.csv upload_protocol = esptool upload_speed = 921600 -lib_deps = - ${esp32s3_base.lib_deps} build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 diff --git a/variants/esp32s3/station-g2/platformio.ini b/variants/esp32s3/station-g2/platformio.ini index 056d543d9..a528151be 100755 --- a/variants/esp32s3/station-g2/platformio.ini +++ b/variants/esp32s3/station-g2/platformio.ini @@ -8,8 +8,6 @@ board_build.mcu = esp32s3 upload_protocol = esptool ;upload_port = /dev/ttyACM0 upload_speed = 921600 -lib_deps = - ${esp32s3_base.lib_deps} build_unflags = ${esp32s3_base.build_unflags} -DARDUINO_USB_MODE=1 diff --git a/variants/native/portduino-buildroot/platformio.ini b/variants/native/portduino-buildroot/platformio.ini index a3d0f4639..a3a779aeb 100644 --- a/variants/native/portduino-buildroot/platformio.ini +++ b/variants/native/portduino-buildroot/platformio.ini @@ -5,5 +5,4 @@ extends = portduino_base build_flags = ${portduino_base.build_flags} -O0 -I variants/native/portduino-buildroot board = buildroot board_level = extra -lib_deps = ${portduino_base.lib_deps} build_src_filter = ${portduino_base.build_src_filter} \ No newline at end of file diff --git a/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini b/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini index 1279f12c6..ef2e6e517 100644 --- a/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini +++ b/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini @@ -10,8 +10,6 @@ build_flags = ${nrf52840_base.build_flags} -DME25LS01_4Y10TD board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ME25LS01-4Y10TD> -lib_deps = - ${nrf52840_base.lib_deps} ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) upload_protocol = nrfutil ;upload_port = /dev/ttyACM1 diff --git a/variants/nrf52840/MS24SF1/platformio.ini b/variants/nrf52840/MS24SF1/platformio.ini index df15b5605..1cbb3a5a5 100644 --- a/variants/nrf52840/MS24SF1/platformio.ini +++ b/variants/nrf52840/MS24SF1/platformio.ini @@ -9,8 +9,6 @@ build_flags = ${nrf52840_base.build_flags} -Isrc/platform/nrf52/softdevice/nrf52 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MS24SF1> -lib_deps = - ${nrf52840_base.lib_deps} ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) upload_protocol = nrfutil ;upload_port = /dev/ttyACM1 diff --git a/variants/nrf52840/diy/WashTastic/platformio.ini b/variants/nrf52840/diy/WashTastic/platformio.ini index 881b961e1..0e67f72ad 100644 --- a/variants/nrf52840/diy/WashTastic/platformio.ini +++ b/variants/nrf52840/diy/WashTastic/platformio.ini @@ -8,6 +8,4 @@ build_flags = ${nrf52840_base.build_flags} -D PRIVATE_HW -D EBYTE_E22_900M30S build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini index 61a6eda07..ca8f1777e 100644 --- a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini +++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini @@ -6,8 +6,6 @@ build_flags = ${nrf52840_base.build_flags} -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo -D NRF52_PROMICRO_DIY build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink ; NRF52 ProMicro w/ E-Ink display diff --git a/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini index 2df31d23c..10eab2aa4 100644 --- a/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini +++ b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini @@ -10,6 +10,4 @@ build_flags = ${nrf52840_base.build_flags} -Isrc/platform/nrf52/softdevice/nrf52 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink diff --git a/variants/nrf52840/feather_diy/platformio.ini b/variants/nrf52840/feather_diy/platformio.ini index a17e418a2..5540021b3 100644 --- a/variants/nrf52840/feather_diy/platformio.ini +++ b/variants/nrf52840/feather_diy/platformio.ini @@ -6,8 +6,6 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/nrf52840/feather_diy -Dfeather_diy build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/feather_diy> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ;upload_protocol = jlink \ No newline at end of file diff --git a/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini b/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini index c6cd23314..e7eede80f 100644 --- a/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini +++ b/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini @@ -12,5 +12,3 @@ build_flags = ${nrf52840_base.build_flags} -DRADIOLIB_EXCLUDE_SX127X=1 -DRADIOLIB_EXCLUDE_LR11X0=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/gat562_mesh_trial_tracker> -lib_deps = - ${nrf52840_base.lib_deps} diff --git a/variants/nrf52840/meshlink/platformio.ini b/variants/nrf52840/meshlink/platformio.ini index e0f4a2b9b..fa89739d4 100644 --- a/variants/nrf52840/meshlink/platformio.ini +++ b/variants/nrf52840/meshlink/platformio.ini @@ -14,8 +14,6 @@ build_flags = ${nrf52840_base.build_flags} -DRADIOLIB_EXCLUDE_LR11X0=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds diff --git a/variants/nrf52840/meshtiny/platformio.ini b/variants/nrf52840/meshtiny/platformio.ini index 5f03f5cb2..7e1e2e510 100644 --- a/variants/nrf52840/meshtiny/platformio.ini +++ b/variants/nrf52840/meshtiny/platformio.ini @@ -7,5 +7,3 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/nrf52840/meshtiny -D MESHT -D USE_PIN_BUZZER -D MESHTASTIC_EXCLUDE_GPS=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshtiny> -lib_deps = - ${nrf52840_base.lib_deps} diff --git a/variants/nrf52840/nrf52832.ini b/variants/nrf52840/nrf52832.ini index 5aed929e6..b106fe7d4 100644 --- a/variants/nrf52840/nrf52832.ini +++ b/variants/nrf52840/nrf52832.ini @@ -4,6 +4,3 @@ extends = nrf52_base build_flags = ${nrf52_base.build_flags} -DSERIAL_BUFFER_SIZE=1024 - -lib_deps = - ${nrf52_base.lib_deps} diff --git a/variants/nrf52840/rak_wismeshtag/platformio.ini b/variants/nrf52840/rak_wismeshtag/platformio.ini index f04d1f186..1cc00e253 100644 --- a/variants/nrf52840/rak_wismeshtag/platformio.ini +++ b/variants/nrf52840/rak_wismeshtag/platformio.ini @@ -12,5 +12,3 @@ build_flags = ${nrf52840_base.build_flags} -DRADIOLIB_EXCLUDE_LR11X0=1 -DMESHTASTIC_EXCLUDE_WIFI=1 build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wismeshtag> -lib_deps = - ${nrf52840_base.lib_deps} \ No newline at end of file diff --git a/variants/nrf52840/seeed_solar_node/platformio.ini b/variants/nrf52840/seeed_solar_node/platformio.ini index b2a128c57..5a2518331 100644 --- a/variants/nrf52840/seeed_solar_node/platformio.ini +++ b/variants/nrf52840/seeed_solar_node/platformio.ini @@ -9,6 +9,4 @@ build_flags = ${nrf52840_base.build_flags} -I src/platform/nrf52/softdevice/nrf52 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_solar_node> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink diff --git a/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini b/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini index 6c137384d..d11ad0ab9 100644 --- a/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini +++ b/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini @@ -8,6 +8,4 @@ build_flags = ${nrf52840_base.build_flags} -I src/platform/nrf52/softdevice/nrf52 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_wio_tracker_L1> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink diff --git a/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini index 7f9eb0e2c..9f2cdd8e9 100644 --- a/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini +++ b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini @@ -44,4 +44,4 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; Before base libs_deps, so we use ZinggJM/GFXRoot instead of AdafruitGFX (saves space) ${nrf52840_base.lib_deps} -debug_tool = jlink \ No newline at end of file +debug_tool = jlink diff --git a/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini b/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini index 4c68b40e8..079cd5c52 100644 --- a/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini +++ b/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini @@ -11,8 +11,6 @@ build_flags = ${nrf52840_base.build_flags} -DGPS_L76K board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_xiao_nrf52840_kit> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ;upload_protocol = jlink diff --git a/variants/nrf52840/t-echo/platformio.ini b/variants/nrf52840/t-echo/platformio.ini index 4a2b6c69d..b2a3aca06 100644 --- a/variants/nrf52840/t-echo/platformio.ini +++ b/variants/nrf52840/t-echo/platformio.ini @@ -41,4 +41,4 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@1.0.1 \ No newline at end of file + lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/wio-t1000-s/platformio.ini b/variants/nrf52840/wio-t1000-s/platformio.ini index c6b61fc8a..a6ea5102c 100644 --- a/variants/nrf52840/wio-t1000-s/platformio.ini +++ b/variants/nrf52840/wio-t1000-s/platformio.ini @@ -10,8 +10,6 @@ build_flags = ${nrf52840_base.build_flags} -DWIO_WM1110 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/wio-t1000-s> -lib_deps = - ${nrf52840_base.lib_deps} debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) upload_protocol = jlink \ No newline at end of file diff --git a/variants/nrf52840/wio-tracker-wm1110/platformio.ini b/variants/nrf52840/wio-tracker-wm1110/platformio.ini index 73b7dedd4..b3513a242 100644 --- a/variants/nrf52840/wio-tracker-wm1110/platformio.ini +++ b/variants/nrf52840/wio-tracker-wm1110/platformio.ini @@ -9,7 +9,5 @@ build_flags = ${nrf52840_base.build_flags} -DWIO_WM1110 board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/wio-tracker-wm1110> -lib_deps = - ${nrf52840_base.lib_deps} ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) -;upload_protocol = jlink \ No newline at end of file +;upload_protocol = jlink diff --git a/variants/rp2040/challenger_2040_lora/platformio.ini b/variants/rp2040/challenger_2040_lora/platformio.ini index 4a709d650..06371d18e 100644 --- a/variants/rp2040/challenger_2040_lora/platformio.ini +++ b/variants/rp2040/challenger_2040_lora/platformio.ini @@ -10,7 +10,5 @@ build_flags = -I variants/rp2040/challenger_2040_lora -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags} debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/ec_catsniffer/platformio.ini b/variants/rp2040/ec_catsniffer/platformio.ini index b70eff6d7..08fa3fffc 100644 --- a/variants/rp2040/ec_catsniffer/platformio.ini +++ b/variants/rp2040/ec_catsniffer/platformio.ini @@ -9,7 +9,5 @@ build_flags = -I variants/rp2040/ec_catsniffer -D DEBUG_RP2040_PORT=Serial ; -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap diff --git a/variants/rp2040/feather_rp2040_rfm95/platformio.ini b/variants/rp2040/feather_rp2040_rfm95/platformio.ini index b3b185071..1da1218e4 100644 --- a/variants/rp2040/feather_rp2040_rfm95/platformio.ini +++ b/variants/rp2040/feather_rp2040_rfm95/platformio.ini @@ -10,7 +10,5 @@ build_flags = -I variants/rp2040/feather_rp2040_rfm95 -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags} debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/nibble_rp2040/platformio.ini b/variants/rp2040/nibble_rp2040/platformio.ini index 024a72206..5f4025cff 100644 --- a/variants/rp2040/nibble_rp2040/platformio.ini +++ b/variants/rp2040/nibble_rp2040/platformio.ini @@ -10,7 +10,5 @@ build_flags = -I variants/rp2040/nibble_rp2040 -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/rp2040-lora/platformio.ini b/variants/rp2040/rp2040-lora/platformio.ini index d59e74f20..a85869260 100644 --- a/variants/rp2040/rp2040-lora/platformio.ini +++ b/variants/rp2040/rp2040-lora/platformio.ini @@ -9,7 +9,5 @@ build_flags = -I variants/rp2040/rp2040-lora -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/rpipico-slowclock/platformio.ini b/variants/rp2040/rpipico-slowclock/platformio.ini index 30928aead..d5f86b0ad 100644 --- a/variants/rp2040/rpipico-slowclock/platformio.ini +++ b/variants/rp2040/rpipico-slowclock/platformio.ini @@ -21,8 +21,6 @@ build_flags = -DHW_SPI1_DEVICE -g -DNO_USB -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags} -g -DNO_USB diff --git a/variants/rp2040/rpipico/platformio.ini b/variants/rp2040/rpipico/platformio.ini index a6171bbac..d796d2a0e 100644 --- a/variants/rp2040/rpipico/platformio.ini +++ b/variants/rp2040/rpipico/platformio.ini @@ -11,7 +11,5 @@ build_flags = -I variants/rp2040/rpipico -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2040_base.lib_deps} debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/senselora_rp2040/platformio.ini b/variants/rp2040/senselora_rp2040/platformio.ini index 3a574d0f9..e02fd587b 100644 --- a/variants/rp2040/senselora_rp2040/platformio.ini +++ b/variants/rp2040/senselora_rp2040/platformio.ini @@ -9,5 +9,3 @@ build_flags = ${rp2040_base.build_flags} -D SENSELORA_RP2040 -I variants/rp2040/senselora_rp2040 -D DEBUG_RP2040_PORT=Serial -lib_deps = - ${rp2040_base.lib_deps} \ No newline at end of file diff --git a/variants/rp2350/rpipico2/platformio.ini b/variants/rp2350/rpipico2/platformio.ini index ad7a4ce51..30dc15256 100644 --- a/variants/rp2350/rpipico2/platformio.ini +++ b/variants/rp2350/rpipico2/platformio.ini @@ -11,7 +11,5 @@ build_flags = -I variants/rp2350/rpipico2 -D DEBUG_RP2040_PORT=Serial -D HW_SPI1_DEVICE -lib_deps = - ${rp2350_base.lib_deps} debug_build_flags = ${rp2350_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/stm32/wio-e5/platformio.ini b/variants/stm32/wio-e5/platformio.ini index a9fcf51d6..311cade58 100644 --- a/variants/stm32/wio-e5/platformio.ini +++ b/variants/stm32/wio-e5/platformio.ini @@ -19,7 +19,3 @@ build_flags = -DGPS_SERIAL_PORT=Serial2 upload_port = stlink - -lib_deps = - ${stm32_base.lib_deps} - # Add your custom sensor here! \ No newline at end of file From 8a48321555ffa99b8f52bfecc6ff34b5fbb67dc6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 06:17:03 -0600 Subject: [PATCH 280/286] Upgrade trunk (#8989) Co-authored-by: vidplace7 <1779290+vidplace7@users.noreply.github.com> --- .trunk/trunk.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index edcbd6206..20ba0d944 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -9,7 +9,7 @@ plugins: lint: enabled: - checkov@3.2.495 - - renovate@42.52.8 + - renovate@42.57.1 - prettier@3.7.4 - trufflehog@3.92.3 - yamllint@1.37.1 From 8e0547e76de0b142257ebad09bc387e3fdb8c28a Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 16 Dec 2025 11:42:13 -0600 Subject: [PATCH 281/286] Implement Long Turbo preset (#8985) * Implement Long_Turbo preset * Oops * Start to DRY up menu handler by actually using OO concepts instead of jank separate arrays * Move the implementation back into the method * Dummy comment * Listen to copilot feedback and prevent dangling pointer * Static and optional --- protobufs | 2 +- src/DisplayFormatters.cpp | 3 + src/graphics/draw/MenuHandler.cpp | 101 +++++++++++++--------- src/graphics/draw/MenuHandler.h | 19 ++++ src/mesh/RadioInterface.cpp | 24 ++++- src/mesh/generated/meshtastic/config.pb.h | 3 +- 6 files changed, 106 insertions(+), 46 deletions(-) diff --git a/protobufs b/protobufs index 1cf2783bd..9beb80f1d 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 1cf2783bdb0735590ccf75d9bc825e233e20032a +Subproject commit 9beb80f1d302f70d05f9c4bc9dd543b8f7bc8796 diff --git a/src/DisplayFormatters.cpp b/src/DisplayFormatters.cpp index 246cf0022..d88f9fc9f 100644 --- a/src/DisplayFormatters.cpp +++ b/src/DisplayFormatters.cpp @@ -31,6 +31,9 @@ const char *DisplayFormatters::getModemPresetDisplayName(meshtastic_Config_LoRaC case meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST: return useShortName ? "LongF" : "LongFast"; break; + case meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO: + return useShortName ? "LongT" : "LongTurbo"; + break; case meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE: return useShortName ? "LongM" : "LongMod"; break; diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp index 2a7f479b4..586bdd4a6 100644 --- a/src/graphics/draw/MenuHandler.cpp +++ b/src/graphics/draw/MenuHandler.cpp @@ -20,12 +20,41 @@ #include "modules/KeyVerificationModule.h" #include "modules/TraceRouteModule.h" +#include +#include #include +#include extern uint16_t TFT_MESH; namespace graphics { + +namespace +{ + +// Caller must ensure the provided options array outlives the banner callback. +template +BannerOverlayOptions createStaticBannerOptions(const char *message, const MenuOption (&options)[N], + std::array &labels, Callback &&onSelection) +{ + for (size_t i = 0; i < N; ++i) { + labels[i] = options[i].label; + } + + const MenuOption *optionsPtr = options; + auto callback = std::function &, int)>(std::forward(onSelection)); + + BannerOverlayOptions bannerOptions; + bannerOptions.message = message; + bannerOptions.optionsArrayPtr = labels.data(); + bannerOptions.optionsCount = static_cast(N); + bannerOptions.bannerCallback = [optionsPtr, callback](int selected) -> void { callback(optionsPtr[selected], selected); }; + return bannerOptions; +} + +} // namespace + menuHandler::screenMenus menuHandler::menuQueue = menu_none; bool test_enabled = false; uint8_t test_count = 0; @@ -197,48 +226,38 @@ void menuHandler::DeviceRolePicker() void menuHandler::RadioPresetPicker() { - static const char *optionsArray[] = {"Back", "LongSlow", "LongModerate", "LongFast", "MediumSlow", - "MediumFast", "ShortSlow", "ShortFast", "ShortTurbo"}; - enum optionsNumbers { - Back = 0, - radiopreset_LongSlow = 1, - radiopreset_LongModerate = 2, - radiopreset_LongFast = 3, - radiopreset_MediumSlow = 4, - radiopreset_MediumFast = 5, - radiopreset_ShortSlow = 6, - radiopreset_ShortFast = 7, - radiopreset_ShortTurbo = 8 - }; - BannerOverlayOptions bannerOptions; - bannerOptions.message = "Radio Preset"; - bannerOptions.optionsArrayPtr = optionsArray; - bannerOptions.optionsCount = 9; - bannerOptions.bannerCallback = [](int selected) -> void { - if (selected == Back) { - menuHandler::menuQueue = menuHandler::lora_Menu; - screen->runNow(); - return; - } else if (selected == radiopreset_LongSlow) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW; - } else if (selected == radiopreset_LongModerate) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE; - } else if (selected == radiopreset_LongFast) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST; - } else if (selected == radiopreset_MediumSlow) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW; - } else if (selected == radiopreset_MediumFast) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST; - } else if (selected == radiopreset_ShortSlow) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW; - } else if (selected == radiopreset_ShortFast) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST; - } else if (selected == radiopreset_ShortTurbo) { - config.lora.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO; - } - service->reloadConfig(SEGMENT_CONFIG); - rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + static const RadioPresetOption presetOptions[] = { + {"Back", OptionsAction::Back}, + {"LongTurbo", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO}, + {"LongModerate", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_LONG_MODERATE}, + {"LongFast", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST}, + {"MediumSlow", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_SLOW}, + {"MediumFast", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_MEDIUM_FAST}, + {"ShortSlow", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_SHORT_SLOW}, + {"ShortFast", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST}, + {"ShortTurbo", OptionsAction::Select, meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO}, }; + + constexpr size_t presetCount = sizeof(presetOptions) / sizeof(presetOptions[0]); + static std::array presetLabels{}; + + auto bannerOptions = + createStaticBannerOptions("Radio Preset", presetOptions, presetLabels, [](const RadioPresetOption &option, int) -> void { + if (option.action == OptionsAction::Back) { + menuHandler::menuQueue = menuHandler::lora_Menu; + screen->runNow(); + return; + } + + if (!option.hasValue) { + return; + } + + config.lora.modem_preset = option.value; + service->reloadConfig(SEGMENT_CONFIG); + rebootAtMsec = (millis() + DEFAULT_REBOOT_SECONDS * 1000); + }); + screen->showOverlayBanner(bannerOptions); } diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h index a611b7c9d..df7c2739b 100644 --- a/src/graphics/draw/MenuHandler.h +++ b/src/graphics/draw/MenuHandler.h @@ -99,5 +99,24 @@ class menuHandler static void BluetoothToggleMenu(); }; +/* Generic Menu Options designations */ +enum class OptionsAction { Back, Select }; + +template struct MenuOption { + const char *label; + OptionsAction action; + bool hasValue; + T value; + + MenuOption(const char *labelIn, OptionsAction actionIn, T valueIn) + : label(labelIn), action(actionIn), hasValue(true), value(valueIn) + { + } + + MenuOption(const char *labelIn, OptionsAction actionIn) : label(labelIn), action(actionIn), hasValue(false), value() {} +}; + +using RadioPresetOption = MenuOption; + } // namespace graphics #endif \ No newline at end of file diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 3c0da4494..db8677821 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -503,6 +503,11 @@ void RadioInterface::applyModemConfig() cr = 5; sf = 10; break; + case meshtastic_Config_LoRaConfig_ModemPreset_LONG_TURBO: + bw = (myRegion->wideLora) ? 1625.0 : 500; + cr = 8; + sf = 11; + break; default: // Config_LoRaConfig_ModemPreset_LONG_FAST is default. Gracefully use this is preset is something illegal. bw = (myRegion->wideLora) ? 812.5 : 250; cr = 5; @@ -539,13 +544,26 @@ void RadioInterface::applyModemConfig() } if ((myRegion->freqEnd - myRegion->freqStart) < bw / 1000) { - static const char *err_string = "Regional frequency range is smaller than bandwidth. Fall back to default preset"; - LOG_ERROR(err_string); + const float regionSpanKHz = (myRegion->freqEnd - myRegion->freqStart) * 1000.0f; + const float requestedBwKHz = bw; + const bool isWideRequest = requestedBwKHz >= 499.5f; // treat as 500 kHz preset + const char *presetName = + DisplayFormatters::getModemPresetDisplayName(loraConfig.modem_preset, false, loraConfig.use_preset); + + char err_string[160]; + if (isWideRequest) { + snprintf(err_string, sizeof(err_string), "%s region too narrow for 500kHz preset (%s). Falling back to LongFast.", + myRegion->name, presetName); + } else { + snprintf(err_string, sizeof(err_string), "%s region span %.0fkHz < requested %.0fkHz. Falling back to LongFast.", + myRegion->name, regionSpanKHz, requestedBwKHz); + } + LOG_ERROR("%s", err_string); RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING); meshtastic_ClientNotification *cn = clientNotificationPool.allocZeroed(); cn->level = meshtastic_LogRecord_Level_ERROR; - sprintf(cn->message, err_string); + snprintf(cn->message, sizeof(cn->message), "%s", err_string); service->sendClientNotification(cn); // Set to default modem preset diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h index 57b855d98..d4ef5bee4 100644 --- a/src/mesh/generated/meshtastic/config.pb.h +++ b/src/mesh/generated/meshtastic/config.pb.h @@ -293,7 +293,8 @@ typedef enum _meshtastic_Config_LoRaConfig_RegionCode { typedef enum _meshtastic_Config_LoRaConfig_ModemPreset { /* Long Range - Fast */ meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST = 0, - /* Long Range - Slow */ + /* Long Range - Slow + Deprecated in 2.7: Unpopular slow preset. */ meshtastic_Config_LoRaConfig_ModemPreset_LONG_SLOW = 1, /* Very Long Range - Slow Deprecated in 2.5: Works only with txco and is unusably slow */ From f1aefc4eef47c3f1f41eb2221f788b20c77ff50a Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Tue, 16 Dec 2025 20:40:29 -0600 Subject: [PATCH 282/286] Detect if NTP is active on native (#8962) * Detect if NTP is active on native * Drop debug warning --- src/main.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index eb6dea327..45f4eb7b5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -428,10 +428,17 @@ void setup() #endif #if ARCH_PORTDUINO + RTCQuality ourQuality = RTCQualityDevice; + + std::string timeCommandResult = exec("timedatectl status | grep synchronized | grep yes -c"); + if (timeCommandResult[0] == '1') { + ourQuality = RTCQualityNTP; + } + struct timeval tv; tv.tv_sec = time(NULL); tv.tv_usec = 0; - perhapsSetRTC(RTCQualityDevice, &tv); + perhapsSetRTC(ourQuality, &tv); #endif powerMonInit(); From 96c42229b02390e44550f0a5e50c8c804e85a0c7 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 17 Dec 2025 12:05:48 -0500 Subject: [PATCH 283/286] Renovate all the things (#8994) --- platformio.ini | 4 ++-- src/graphics/niche/InkHUD/PlatformioConfig.ini | 3 ++- variants/esp32/betafpv_2400_tx_micro/platformio.ini | 1 + variants/esp32/chatter2/platformio.ini | 1 + variants/esp32/esp32.ini | 4 ++-- variants/esp32/m5stack_core/platformio.ini | 1 + variants/esp32/m5stack_coreink/platformio.ini | 2 ++ variants/esp32/radiomaster_900_bandit/platformio.ini | 1 + variants/esp32/tbeam/platformio.ini | 6 ++++-- variants/esp32/wiphone/platformio.ini | 3 +++ variants/esp32c3/heltec_hru_3601/platformio.ini | 1 + variants/esp32c6/m5stack_unitc6l/platformio.ini | 2 ++ variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini | 3 +++ variants/esp32s3/bpi_picow_esp32_s3/platformio.ini | 1 + .../esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini | 3 +++ .../esp32s3/diy/my_esp32s3_diy_eink/platformio.ini | 2 ++ .../esp32s3/diy/my_esp32s3_diy_oled/platformio.ini | 1 + variants/esp32s3/dreamcatcher/platformio.ini | 2 ++ variants/esp32s3/elecrow_panel/platformio.ini | 4 ++++ variants/esp32s3/esp32-s3-pico/platformio.ini | 2 ++ variants/esp32s3/hackaday-communicator/platformio.ini | 3 ++- variants/esp32s3/heltec_sensor_hub/platformio.ini | 1 + variants/esp32s3/heltec_v4/platformio.ini | 6 ++++-- .../esp32s3/heltec_vision_master_e213/platformio.ini | 2 ++ .../esp32s3/heltec_vision_master_e290/platformio.ini | 2 ++ .../esp32s3/heltec_vision_master_t190/platformio.ini | 2 ++ variants/esp32s3/heltec_wireless_paper/platformio.ini | 2 ++ .../esp32s3/heltec_wireless_paper_v1/platformio.ini | 2 ++ .../esp32s3/heltec_wireless_tracker/platformio.ini | 1 + .../heltec_wireless_tracker_V1_0/platformio.ini | 1 + .../esp32s3/heltec_wireless_tracker_v2/platformio.ini | 1 + variants/esp32s3/icarus/platformio.ini | 1 + variants/esp32s3/mesh-tab/platformio.ini | 1 + variants/esp32s3/picomputer-s3/platformio.ini | 1 + variants/esp32s3/rak_wismesh_tap_v2/platformio.ini | 1 + .../esp32s3/seeed-sensecap-indicator/platformio.ini | 5 ++++- variants/esp32s3/t-deck-pro/platformio.ini | 4 ++++ variants/esp32s3/t-deck/platformio.ini | 4 ++++ variants/esp32s3/t-eth-elite/platformio.ini | 1 + variants/esp32s3/t-watch-s3/platformio.ini | 8 +++++++- variants/esp32s3/tbeam-s3-core/platformio.ini | 1 + variants/esp32s3/tlora-pager/platformio.ini | 11 ++++++++++- variants/esp32s3/tlora_t3s3_epaper/platformio.ini | 1 + variants/esp32s3/tracksenger/platformio.ini | 2 ++ variants/esp32s3/unphone/platformio.ini | 4 +++- variants/native/portduino/platformio.ini | 1 + .../Dongle_nRF52840-pca10059-v1/platformio.ini | 1 + variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini | 6 +++++- variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini | 2 ++ variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini | 1 + .../nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini | 1 + .../nrf52840/MakePython_nRF52840_eink/platformio.ini | 2 ++ .../nrf52840/MakePython_nRF52840_oled/platformio.ini | 1 + variants/nrf52840/TWC_mesh_v4/platformio.ini | 1 + variants/nrf52840/canaryone/platformio.ini | 1 + .../heltec_mesh_node_t114-inkhud/platformio.ini | 1 + .../nrf52840/heltec_mesh_node_t114/platformio.ini | 4 +++- variants/nrf52840/heltec_mesh_pocket/platformio.ini | 10 ++++++---- variants/nrf52840/heltec_mesh_solar/platformio.ini | 9 +++++++-- variants/nrf52840/meshlink/platformio.ini | 1 + variants/nrf52840/monteops_hw1/platformio.ini | 1 + variants/nrf52840/muzi_base/platformio.ini | 3 +-- variants/nrf52840/nano-g2-ultra/platformio.ini | 1 + variants/nrf52840/r1-neo/platformio.ini | 3 +++ variants/nrf52840/rak2560/platformio.ini | 2 ++ variants/nrf52840/rak3401_1watt/platformio.ini | 4 ++++ variants/nrf52840/rak4631/platformio.ini | 5 +++++ variants/nrf52840/rak4631_epaper/platformio.ini | 5 +++++ .../nrf52840/rak4631_epaper_onrxtx/platformio.ini | 5 +++++ variants/nrf52840/rak4631_eth_gw/platformio.ini | 5 +++++ .../rak4631_nomadstar_meteor_pro/platformio.ini | 2 ++ variants/nrf52840/rak_wismeshtap/platformio.ini | 7 +++++++ .../nrf52840/seeed_wio_tracker_L1_eink/platformio.ini | 3 ++- variants/nrf52840/t-echo-lite/platformio.ini | 1 + variants/nrf52840/t-echo/platformio.ini | 3 +++ variants/nrf52840/tracker-t1000-e/platformio.ini | 1 + variants/rp2040/rak11310/platformio.ini | 2 ++ variants/rp2040/rpipico/platformio.ini | 1 - variants/stm32/stm32.ini | 3 +-- 79 files changed, 186 insertions(+), 28 deletions(-) diff --git a/platformio.ini b/platformio.ini index 9cef4f375..02a959b7e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -162,8 +162,8 @@ lib_deps = emotibit/EmotiBit MLX90632@1.0.8 # renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library adafruit/Adafruit MLX90614 Library@2.1.5 - # renovate: datasource=github-tags depName=INA3221 packageName=sgtwilko/INA3221 - https://github.com/sgtwilko/INA3221#bb03d7e9bfcc74fc798838a54f4f99738f29fc6a + # renovate: datasource=git-refs depName=INA3221 packageName=https://github.com/sgtwilko/INA3221 gitBranch=FixOverflow + https://github.com/sgtwilko/INA3221/archive/bb03d7e9bfcc74fc798838a54f4f99738f29fc6a.zip # renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass mprograms/QMC5883LCompass@1.2.3 # renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU diff --git a/src/graphics/niche/InkHUD/PlatformioConfig.ini b/src/graphics/niche/InkHUD/PlatformioConfig.ini index 80984f399..b985f9f77 100644 --- a/src/graphics/niche/InkHUD/PlatformioConfig.ini +++ b/src/graphics/niche/InkHUD/PlatformioConfig.ini @@ -8,4 +8,5 @@ build_flags = -D MESHTASTIC_EXCLUDE_INPUTBROKER ; Suppress default input handling -D HAS_BUTTON=0 ; Suppress default ButtonThread lib_deps = - https://github.com/ZinggJM/GFX_Root#2.0.0 ; Used by InkHUD as a "slimmer" version of AdafruitGFX \ No newline at end of file + # TODO renovate + https://github.com/ZinggJM/GFX_Root#2.0.0 ; Used by InkHUD as a "slimmer" version of AdafruitGFX diff --git a/variants/esp32/betafpv_2400_tx_micro/platformio.ini b/variants/esp32/betafpv_2400_tx_micro/platformio.ini index bab431788..77a1f7043 100644 --- a/variants/esp32/betafpv_2400_tx_micro/platformio.ini +++ b/variants/esp32/betafpv_2400_tx_micro/platformio.ini @@ -15,4 +15,5 @@ upload_protocol = esptool upload_speed = 460800 lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32/chatter2/platformio.ini b/variants/esp32/chatter2/platformio.ini index 19673d0cf..94a846bc9 100644 --- a/variants/esp32/chatter2/platformio.ini +++ b/variants/esp32/chatter2/platformio.ini @@ -9,4 +9,5 @@ build_flags = lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini index ce46cae94..a4c7cea5f 100644 --- a/variants/esp32/esp32.ini +++ b/variants/esp32/esp32.ini @@ -62,8 +62,8 @@ lib_deps = h2zero/NimBLE-Arduino@1.4.3 # renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip - # renovate: datasource=github-tags depName=XPowersLib packageName=lewisxhe/XPowersLib - https://github.com/lewisxhe/XPowersLib/archive/v0.3.2.zip + # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib + lewisxhe/XPowersLib@0.3.2 # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto diff --git a/variants/esp32/m5stack_core/platformio.ini b/variants/esp32/m5stack_core/platformio.ini index 009b3f90a..5006d62ff 100644 --- a/variants/esp32/m5stack_core/platformio.ini +++ b/variants/esp32/m5stack_core/platformio.ini @@ -25,4 +25,5 @@ lib_ignore = m5stack-core lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32/m5stack_coreink/platformio.ini b/variants/esp32/m5stack_coreink/platformio.ini index e37d5c1e1..057b8abd8 100644 --- a/variants/esp32/m5stack_coreink/platformio.ini +++ b/variants/esp32/m5stack_coreink/platformio.ini @@ -18,7 +18,9 @@ build_flags = -DM5STACK lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 lib_ignore = m5stack-coreink diff --git a/variants/esp32/radiomaster_900_bandit/platformio.ini b/variants/esp32/radiomaster_900_bandit/platformio.ini index d9eb78a57..6729235ed 100644 --- a/variants/esp32/radiomaster_900_bandit/platformio.ini +++ b/variants/esp32/radiomaster_900_bandit/platformio.ini @@ -13,4 +13,5 @@ board_build.f_cpu = 240000000L upload_protocol = esptool lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=github-tags depName=STK8xxx-Accelerometer packageName=gjelsoe/STK8xxx-Accelerometer https://github.com/gjelsoe/STK8xxx-Accelerometer/archive/v0.1.1.zip diff --git a/variants/esp32/tbeam/platformio.ini b/variants/esp32/tbeam/platformio.ini index ac9713693..79fd626e9 100644 --- a/variants/esp32/tbeam/platformio.ini +++ b/variants/esp32/tbeam/platformio.ini @@ -20,5 +20,7 @@ build_flags = lib_deps = ${env:tbeam.lib_deps} - https://github.com/meshtastic/st7796/archive/refs/tags/1.0.5.zip ; display addon - lewisxhe/SensorLib@0.3.1 ; touchscreen addon \ No newline at end of file + # renovate: datasource=github-tags depName=meshtastic-st7796 packageName=meshtastic/st7796 + https://github.com/meshtastic/st7796/archive/1.0.5.zip + # renovate: datasource=custom.pio depName=lewisxhe-SensorLib packageName=lewisxhe/library/SensorLib + lewisxhe/SensorLib@0.3.1 diff --git a/variants/esp32/wiphone/platformio.ini b/variants/esp32/wiphone/platformio.ini index b69b30e17..fcf36a23c 100644 --- a/variants/esp32/wiphone/platformio.ini +++ b/variants/esp32/wiphone/platformio.ini @@ -10,6 +10,9 @@ build_flags = -I variants/esp32/wiphone lib_deps = ${esp32_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 + # renovate: datasource=custom.pio depName=SX1509 IO Expander packageName=sparkfun/library/SX1509 IO Expander sparkfun/SX1509 IO Expander@3.0.6 + # renovate: datasource=custom.pio depName=APA102 packageName=pololu/library/APA102 pololu/APA102@3.0.0 diff --git a/variants/esp32c3/heltec_hru_3601/platformio.ini b/variants/esp32c3/heltec_hru_3601/platformio.ini index 34c6838f8..8200b6e87 100644 --- a/variants/esp32c3/heltec_hru_3601/platformio.ini +++ b/variants/esp32c3/heltec_hru_3601/platformio.ini @@ -6,4 +6,5 @@ build_flags = -D HELTEC_HRU_3601 -I variants/esp32c3/heltec_hru_3601 lib_deps = ${esp32c3_base.lib_deps} + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32c6/m5stack_unitc6l/platformio.ini b/variants/esp32c6/m5stack_unitc6l/platformio.ini index f7b5f4ac2..79758dd9b 100644 --- a/variants/esp32c6/m5stack_unitc6l/platformio.ini +++ b/variants/esp32c6/m5stack_unitc6l/platformio.ini @@ -12,7 +12,9 @@ build_unflags = -D HAS_WIFI lib_deps = ${esp32c6_base.lib_deps} + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 + # renovate: datasource=custom.pio depName=NimBLE-Arduino packageName=h2zero/library/NimBLE-Arduino h2zero/NimBLE-Arduino@2.3.7 build_flags = ${esp32c6_base.build_flags} diff --git a/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini b/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini index a5fcbfcba..8361e2ef0 100644 --- a/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini +++ b/variants/esp32s3/ELECROW-ThinkNode-M5/platformio.ini @@ -16,6 +16,9 @@ build_flags = -DEINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached. lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 + # renovate: datasource=custom.pio depName=PCA9557-arduino packageName=maxpromer/library/PCA9557-arduino maxpromer/PCA9557-arduino@1.0.0 diff --git a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini index b021a9cf2..e8c50adcc 100644 --- a/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini +++ b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini @@ -9,6 +9,7 @@ upload_protocol = esptool ;upload_port = /dev/ttyACM2 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=caveman99-ESP32_Codec2 packageName=caveman99/library/ESP32 Codec2 caveman99/ESP32 Codec2@1.0.1 build_flags = ${esp32s3_base.build_flags} diff --git a/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini b/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini index eed21a412..315a53ffd 100644 --- a/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini +++ b/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini @@ -25,6 +25,7 @@ build_flags = ;-DEINK_LIMIT_RATE_RESPONSIVE_SEC=1 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip [env:crowpanel-esp32s3-4-epaper] @@ -54,6 +55,7 @@ build_flags = ;-DEINK_LIMIT_RATE_RESPONSIVE_SEC=1 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip [env:crowpanel-esp32s3-2-epaper] @@ -83,4 +85,5 @@ build_flags = ;-DEINK_LIMIT_RATE_RESPONSIVE_SEC=1 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip diff --git a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini index 34855c19a..95e909b91 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini @@ -10,7 +10,9 @@ upload_protocol = esptool upload_speed = 921600 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 build_unflags = ${esp32s3_base.build_unflags} diff --git a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini index b2d42417f..4f759d1e6 100644 --- a/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini +++ b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini @@ -10,6 +10,7 @@ upload_protocol = esptool upload_speed = 921600 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 build_unflags = ${esp32s3_base.build_unflags} diff --git a/variants/esp32s3/dreamcatcher/platformio.ini b/variants/esp32s3/dreamcatcher/platformio.ini index dc70b3d12..c830346e0 100644 --- a/variants/esp32s3/dreamcatcher/platformio.ini +++ b/variants/esp32s3/dreamcatcher/platformio.ini @@ -12,7 +12,9 @@ build_flags = -D ARDUINO_USB_CDC_ON_BOOT=1 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.1.0 [env:dreamcatcher-2206] diff --git a/variants/esp32s3/elecrow_panel/platformio.ini b/variants/esp32s3/elecrow_panel/platformio.ini index 065f22538..3ed90f3f1 100644 --- a/variants/esp32s3/elecrow_panel/platformio.ini +++ b/variants/esp32s3/elecrow_panel/platformio.ini @@ -41,9 +41,13 @@ build_flags = ${esp32s3_base.build_flags} -Os lib_deps = ${esp32s3_base.lib_deps} ${device-ui_base.lib_deps} + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.0.1 + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.0 ; note: v1.2.7 breaks the elecrow 7" display functionality + # renovate: datasource=custom.pio depName=TCA9534 packageName=hideakitai/library/TCA9534 hideakitai/TCA9534@0.1.1 [crowpanel_small_esp32s3_base] ; 2.4, 2.8, 3.5 inch diff --git a/variants/esp32s3/esp32-s3-pico/platformio.ini b/variants/esp32s3/esp32-s3-pico/platformio.ini index b2f5297d3..8b65c3ca3 100644 --- a/variants/esp32s3/esp32-s3-pico/platformio.ini +++ b/variants/esp32s3/esp32-s3-pico/platformio.ini @@ -22,5 +22,7 @@ build_flags = ${esp32s3_base.build_flags} -DEINK_HEIGHT=128 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32s3/hackaday-communicator/platformio.ini b/variants/esp32s3/hackaday-communicator/platformio.ini index 970215045..29b2c2305 100644 --- a/variants/esp32s3/hackaday-communicator/platformio.ini +++ b/variants/esp32s3/hackaday-communicator/platformio.ini @@ -12,4 +12,5 @@ build_flags = ${esp32s3_base.build_flags} -I variants/esp32s3/hackaday-communicator lib_deps = ${esp32s3_base.lib_deps} - https://github.com/meshtastic/Arduino_GFX/archive/054e81ffaf23784830a734e3c184346789349406.zip \ No newline at end of file + # renovate: datasource=git-refs depName=meshtastic-Arduino_GFX packageName=https://github.com/meshtastic/Arduino_GFX gitBranch=master + https://github.com/meshtastic/Arduino_GFX/archive/054e81ffaf23784830a734e3c184346789349406.zip diff --git a/variants/esp32s3/heltec_sensor_hub/platformio.ini b/variants/esp32s3/heltec_sensor_hub/platformio.ini index 061e7029f..ded0c22fe 100644 --- a/variants/esp32s3/heltec_sensor_hub/platformio.ini +++ b/variants/esp32s3/heltec_sensor_hub/platformio.ini @@ -9,4 +9,5 @@ build_flags = -D HELTEC_SENSOR_HUB lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 diff --git a/variants/esp32s3/heltec_v4/platformio.ini b/variants/esp32s3/heltec_v4/platformio.ini index a58ac9708..28f7e0484 100644 --- a/variants/esp32s3/heltec_v4/platformio.ini +++ b/variants/esp32s3/heltec_v4/platformio.ini @@ -21,8 +21,6 @@ build_flags = -D I2C_SCL=18 -D I2C_SDA1=4 -D I2C_SCL1=3 -lib_deps = - ${heltec_v4_base.lib_deps} [env:heltec-v4-tft] extends = heltec_v4_base @@ -105,6 +103,10 @@ build_flags = lib_deps = ${heltec_v4_base.lib_deps} ; ${device-ui_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.0 + # renovate: datasource=git-refs depName=Quency-D_chsc6x packageName=https://github.com/Quency-D/chsc6x gitBranch=master https://github.com/Quency-D/chsc6x/archive/5cbead829d6b432a8d621ed1aafd4eb474fd4f27.zip + ; TODO revert to official device-ui (when merged) + # renovate: datasource=git-refs depName=Quency-D_device-ui packageName=https://github.com/Quency-D/device-ui gitBranch=heltec-v4-tft https://github.com/Quency-D/device-ui/archive/7c9870b8016641190b059bdd90fe16c1012a39eb.zip diff --git a/variants/esp32s3/heltec_vision_master_e213/platformio.ini b/variants/esp32s3/heltec_vision_master_e213/platformio.ini index 180bce573..5109efa67 100644 --- a/variants/esp32s3/heltec_vision_master_e213/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e213/platformio.ini @@ -17,7 +17,9 @@ build_flags = -DEINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting" lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 diff --git a/variants/esp32s3/heltec_vision_master_e290/platformio.ini b/variants/esp32s3/heltec_vision_master_e290/platformio.ini index 66954951e..cd653021b 100644 --- a/variants/esp32s3/heltec_vision_master_e290/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_e290/platformio.ini @@ -20,7 +20,9 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/448c8538129fde3d02a7cb5e6fc81971ad92547f.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 diff --git a/variants/esp32s3/heltec_vision_master_t190/platformio.ini b/variants/esp32s3/heltec_vision_master_t190/platformio.ini index e07a59465..c373692c1 100644 --- a/variants/esp32s3/heltec_vision_master_t190/platformio.ini +++ b/variants/esp32s3/heltec_vision_master_t190/platformio.ini @@ -8,6 +8,8 @@ build_flags = -D HELTEC_VISION_MASTER_T190 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 + # renovate: datasource=git-refs depName=meshtastic-st7789 packageName=https://github.com/meshtastic/st7789 gitBranch=main https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip upload_speed = 921600 diff --git a/variants/esp32s3/heltec_wireless_paper/platformio.ini b/variants/esp32s3/heltec_wireless_paper/platformio.ini index cc95f3e44..5ed039942 100644 --- a/variants/esp32s3/heltec_wireless_paper/platformio.ini +++ b/variants/esp32s3/heltec_wireless_paper/platformio.ini @@ -18,7 +18,9 @@ build_flags = -D EINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting" lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/1655054ba298e0e29fc2044741940f927f9c2a43.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 diff --git a/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini index 8997e358b..26bf505e1 100644 --- a/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini +++ b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini @@ -15,6 +15,8 @@ build_flags = -D EINK_LIMIT_GHOSTING_PX=2000 ; (Optional) How much image ghosting is tolerated lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 upload_speed = 115200 diff --git a/variants/esp32s3/heltec_wireless_tracker/platformio.ini b/variants/esp32s3/heltec_wireless_tracker/platformio.ini index 60c3f477b..45d3870fc 100644 --- a/variants/esp32s3/heltec_wireless_tracker/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker/platformio.ini @@ -12,4 +12,5 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini index 456c5f59c..e3bc1c850 100644 --- a/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini @@ -11,4 +11,5 @@ build_flags = ;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini b/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini index c17239705..8bdb71541 100644 --- a/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini +++ b/variants/esp32s3/heltec_wireless_tracker_v2/platformio.ini @@ -10,4 +10,5 @@ build_flags = -D HELTEC_WIRELESS_TRACKER_V2 lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 diff --git a/variants/esp32s3/icarus/platformio.ini b/variants/esp32s3/icarus/platformio.ini index 80a103c33..d73c010f2 100644 --- a/variants/esp32s3/icarus/platformio.ini +++ b/variants/esp32s3/icarus/platformio.ini @@ -7,6 +7,7 @@ board_build.mcu = esp32s3 board_build.partitions = default_8MB.csv upload_protocol = esptool upload_speed = 921600 +; TODO renovate or remove platform_packages = platformio/framework-arduinoespressif32@https://github.com/PowerFeather/powerfeather-meshtastic-arduino-lib/releases/download/2.0.16a/esp32-2.0.16.zip build_unflags = ${esp32s3_base.build_unflags} diff --git a/variants/esp32s3/mesh-tab/platformio.ini b/variants/esp32s3/mesh-tab/platformio.ini index 4cbb6ecd4..21d8fb432 100644 --- a/variants/esp32s3/mesh-tab/platformio.ini +++ b/variants/esp32s3/mesh-tab/platformio.ini @@ -50,6 +50,7 @@ build_src_filter = ${esp32s3_base.build_src_filter} lib_deps = ${esp32s3_base.lib_deps} ${device-ui_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 [mesh_tab_xpt2046] diff --git a/variants/esp32s3/picomputer-s3/platformio.ini b/variants/esp32s3/picomputer-s3/platformio.ini index 9e9f9d1e9..ccc6f7839 100644 --- a/variants/esp32s3/picomputer-s3/platformio.ini +++ b/variants/esp32s3/picomputer-s3/platformio.ini @@ -15,6 +15,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 build_src_filter = diff --git a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini index 4d3e21b72..e4ff9812c 100644 --- a/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini +++ b/variants/esp32s3/rak_wismesh_tap_v2/platformio.ini @@ -15,6 +15,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 [ft5x06] diff --git a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini index 8a5d8b208..dd9dfc668 100644 --- a/variants/esp32s3/seeed-sensecap-indicator/platformio.ini +++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini @@ -24,11 +24,13 @@ build_flags = ${esp32s3_base.build_flags} -DUSE_ARDUINO_HAL_GPIO lib_deps = ${esp32s3_base.lib_deps} + ; TODO switch back to official LovyanGFX https://github.com/mverch67/LovyanGFX/archive/4c76238c1344162a234ae917b27651af146d6fb2.zip + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.1.0 - [env:seeed-sensecap-indicator-tft] extends = env:seeed-sensecap-indicator board_level = pr @@ -64,4 +66,5 @@ build_flags = lib_deps = ${env:seeed-sensecap-indicator.lib_deps} ${device-ui_base.lib_deps} + ; TODO switch back to official bb_captouch https://github.com/mverch67/bb_captouch/archive/8626412fe650d808a267791c0eae6e5860c85a5d.zip ; alternative touch library supporting FT6x36 diff --git a/variants/esp32s3/t-deck-pro/platformio.ini b/variants/esp32s3/t-deck-pro/platformio.ini index 45c11595d..b97d7ac3f 100644 --- a/variants/esp32s3/t-deck-pro/platformio.ini +++ b/variants/esp32s3/t-deck-pro/platformio.ini @@ -17,7 +17,11 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.4 + # renovate: datasource=git-refs depName=CSE_Touch packageName=https://github.com/CIRCUITSTATE/CSE_Touch gitBranch=main https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip + # renovate: datasource=github-tags depName=CSE_CST328 packageName=CIRCUITSTATE/CSE_CST328 https://github.com/CIRCUITSTATE/CSE_CST328/archive/refs/tags/v0.0.4.zip + # renovate: datasource=git-refs depName=BQ27220 packageName=https://github.com/mverch67/BQ27220 gitBranch=main https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip diff --git a/variants/esp32s3/t-deck/platformio.ini b/variants/esp32s3/t-deck/platformio.ini index 85129e7d6..c8f3c8d5e 100644 --- a/variants/esp32s3/t-deck/platformio.ini +++ b/variants/esp32s3/t-deck/platformio.ini @@ -12,8 +12,11 @@ build_flags = ${esp32s3_base.build_flags} -I variants/esp32s3/t-deck lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.1.0 [env:t-deck-tft] @@ -68,4 +71,5 @@ build_flags = lib_deps = ${env:t-deck.lib_deps} ${device-ui_base.lib_deps} + # renovate: datasource=github-tags depName=bb_captouch packageName=bitbank2/bb_captouch https://github.com/bitbank2/bb_captouch/archive/refs/tags/1.3.1.zip diff --git a/variants/esp32s3/t-eth-elite/platformio.ini b/variants/esp32s3/t-eth-elite/platformio.ini index 1a5823bc3..5ed67e977 100644 --- a/variants/esp32s3/t-eth-elite/platformio.ini +++ b/variants/esp32s3/t-eth-elite/platformio.ini @@ -15,4 +15,5 @@ lib_ignore = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=github-tags depName=ETHClass2 packageName=meshtastic/ETHClass2 https://github.com/meshtastic/ETHClass2/archive/v1.0.0.zip diff --git a/variants/esp32s3/t-watch-s3/platformio.ini b/variants/esp32s3/t-watch-s3/platformio.ini index 2be6c002f..f4a01f186 100644 --- a/variants/esp32s3/t-watch-s3/platformio.ini +++ b/variants/esp32s3/t-watch-s3/platformio.ini @@ -13,9 +13,15 @@ build_flags = ${esp32s3_base.build_flags} -DHAS_BMA423=1 lib_deps = ${esp32s3_base.lib_deps} - lovyan03/LovyanGFX@1.2.7 + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX + lovyan03/LovyanGFX@1.2.7 + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 + # renovate: datasource=custom.pio depName=Adafruit DRV2605 packageName=adafruit/library/Adafruit DRV2605 Library adafruit/Adafruit DRV2605 Library@1.2.4 + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.1.0 + # renovate: datasource=custom.pio depName=lewisxhe-SensorLib packageName=lewisxhe/library/SensorLib lewisxhe/SensorLib@0.2.0 diff --git a/variants/esp32s3/tbeam-s3-core/platformio.ini b/variants/esp32s3/tbeam-s3-core/platformio.ini index fba8e4003..0f840627a 100644 --- a/variants/esp32s3/tbeam-s3-core/platformio.ini +++ b/variants/esp32s3/tbeam-s3-core/platformio.ini @@ -7,6 +7,7 @@ board_check = true lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 build_flags = diff --git a/variants/esp32s3/tlora-pager/platformio.ini b/variants/esp32s3/tlora-pager/platformio.ini index d63537904..dc4104a81 100644 --- a/variants/esp32s3/tlora-pager/platformio.ini +++ b/variants/esp32s3/tlora-pager/platformio.ini @@ -17,14 +17,23 @@ build_flags = ${esp32s3_base.build_flags} -D ROTARY_BUXTRONICS lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 + # renovate: datasource=custom.pio depName=ESP8266Audio packageName=earlephilhower/library/ESP8266Audio earlephilhower/ESP8266Audio@1.9.9 + # renovate: datasource=custom.pio depName=ESP8266SAM packageName=earlephilhower/library/ESP8266SAM earlephilhower/ESP8266SAM@1.0.1 + # renovate: datasource=custom.pio depName=Adafruit DRV2605 packageName=adafruit/library/Adafruit DRV2605 Library adafruit/Adafruit DRV2605 Library@1.2.4 + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 + # renovate: datasource=custom.pio depName=lewisxhe-SensorLib packageName=lewisxhe/library/SensorLib lewisxhe/SensorLib@0.3.1 - https://github.com/pschatzmann/arduino-audio-driver/archive/refs/tags/v0.1.3.zip + # renovate: datasource=github-tags depName=pschatzmann_arduino-audio-driver packageName=pschatzmann/arduino-audio-driver + https://github.com/pschatzmann/arduino-audio-driver/archive/v0.1.3.zip + # TODO renovate https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip + # TODO renovate https://github.com/mverch67/RotaryEncoder/archive/da958a21389cbcd485989705df602a33e092dd88.zip [env:tlora-pager-tft] diff --git a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini index 73c5dbe5d..18b9e136e 100644 --- a/variants/esp32s3/tlora_t3s3_epaper/platformio.ini +++ b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini @@ -20,6 +20,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip [env:tlora-t3s3-epaper-inkhud] diff --git a/variants/esp32s3/tracksenger/platformio.ini b/variants/esp32s3/tracksenger/platformio.ini index 5bc603f31..73212c546 100644 --- a/variants/esp32s3/tracksenger/platformio.ini +++ b/variants/esp32s3/tracksenger/platformio.ini @@ -12,6 +12,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 [env:tracksenger-lcd] @@ -28,6 +29,7 @@ build_flags = lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.7 [env:tracksenger-oled] diff --git a/variants/esp32s3/unphone/platformio.ini b/variants/esp32s3/unphone/platformio.ini index 4e154c517..6c638af29 100644 --- a/variants/esp32s3/unphone/platformio.ini +++ b/variants/esp32s3/unphone/platformio.ini @@ -27,11 +27,13 @@ build_src_filter = +<../variants/esp32s3/unphone> lib_deps = ${esp32s3_base.lib_deps} + # renovate: datasource=custom.pio depName=LovyanGFX packageName=lovyan03/library/LovyanGFX lovyan03/LovyanGFX@1.2.0 + # TODO renovate https://gitlab.com/hamishcunningham/unphonelibrary#meshtastic@9.0.0 + # renovate: datasource=custom.pio depName=NeoPixel packageName=adafruit/library/Adafruit NeoPixel adafruit/Adafruit NeoPixel@1.15.2 - [env:unphone-tft] board_level = extra extends = env:unphone diff --git a/variants/native/portduino/platformio.ini b/variants/native/portduino/platformio.ini index d87c74532..045e3edea 100644 --- a/variants/native/portduino/platformio.ini +++ b/variants/native/portduino/platformio.ini @@ -6,6 +6,7 @@ board = cross_platform board_level = extra lib_deps = ${portduino_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 build_src_filter = ${portduino_base.build_src_filter} diff --git a/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini index 4c71cf548..880871e13 100644 --- a/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini +++ b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini @@ -11,5 +11,6 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/Dongle_nRF52840-pca10059-v1> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 debug_tool = jlink diff --git a/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini index ddb40c7c9..c7522a04f 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini @@ -23,8 +23,11 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M1> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 + # renovate: datasource=custom.pio depName=nRF52_PWM packageName=khoih-prog/library/nRF52_PWM khoih-prog/nRF52_PWM@1.0.1 ;upload_protocol = fs @@ -45,4 +48,5 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} - lewisxhe/PCF8563_Library@1.0.1 \ No newline at end of file + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library + lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini index 3dcbbc888..7dadc27ee 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M3/platformio.ini @@ -13,5 +13,7 @@ build_flags = build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M3> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=nRF52_PWM packageName=khoih-prog/library/nRF52_PWM khoih-prog/nRF52_PWM@1.0.1 + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini index 1f2cb72fe..8f1a660cd 100644 --- a/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini +++ b/variants/nrf52840/ELECROW-ThinkNode-M6/platformio.ini @@ -12,4 +12,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M6> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini index 6309930d3..025e28078 100644 --- a/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini +++ b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini @@ -15,6 +15,7 @@ board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ME25LS01-4Y10TD_e-ink> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) upload_protocol = nrfutil diff --git a/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini index 3a0dbfde3..d823a7230 100644 --- a/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini +++ b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini @@ -12,7 +12,9 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MakePython_nRF52840_eink> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 debug_tool = jlink ;upload_port = /dev/ttyACM4 \ No newline at end of file diff --git a/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini b/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini index c7418e53c..16cef8964 100644 --- a/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini +++ b/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini @@ -8,5 +8,6 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MakePython_nRF52840_oled> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip debug_tool = jlink diff --git a/variants/nrf52840/TWC_mesh_v4/platformio.ini b/variants/nrf52840/TWC_mesh_v4/platformio.ini index 156d2aa2e..e196029ec 100644 --- a/variants/nrf52840/TWC_mesh_v4/platformio.ini +++ b/variants/nrf52840/TWC_mesh_v4/platformio.ini @@ -8,5 +8,6 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/TWC_mesh_v4> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 debug_tool = jlink diff --git a/variants/nrf52840/canaryone/platformio.ini b/variants/nrf52840/canaryone/platformio.ini index fb4c4c6fb..c833fd5c7 100644 --- a/variants/nrf52840/canaryone/platformio.ini +++ b/variants/nrf52840/canaryone/platformio.ini @@ -11,5 +11,6 @@ build_flags = build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/canaryone> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs diff --git a/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini index 3c2d4c7c9..56f55eafc 100644 --- a/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini +++ b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini @@ -14,6 +14,7 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 extra_scripts = ${env.extra_scripts} diff --git a/variants/nrf52840/heltec_mesh_node_t114/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini index bdebd28a4..cec59d6ee 100644 --- a/variants/nrf52840/heltec_mesh_node_t114/platformio.ini +++ b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini @@ -13,5 +13,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_node_t114> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 - https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip \ No newline at end of file + # renovate: datasource=git-refs depName=meshtastic-st7789 packageName=https://github.com/meshtastic/st7789 gitBranch=main + https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip diff --git a/variants/nrf52840/heltec_mesh_pocket/platformio.ini b/variants/nrf52840/heltec_mesh_pocket/platformio.ini index b797f62c0..39b75dada 100644 --- a/variants/nrf52840/heltec_mesh_pocket/platformio.ini +++ b/variants/nrf52840/heltec_mesh_pocket/platformio.ini @@ -25,9 +25,10 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 - https://github.com/meshtastic/GxEPD2#b202ebfec6a4821e098cf7a625ba0f6f2400292d - + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master + https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip [env:heltec-mesh-pocket-5000-inkhud] extends = nrf52840_base, inkhud @@ -71,9 +72,10 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 - https://github.com/meshtastic/GxEPD2#b202ebfec6a4821e098cf7a625ba0f6f2400292d - + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master + https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip [env:heltec-mesh-pocket-10000-inkhud] extends = nrf52840_base, inkhud diff --git a/variants/nrf52840/heltec_mesh_solar/platformio.ini b/variants/nrf52840/heltec_mesh_solar/platformio.ini index 146d55c6e..a4d197cb0 100644 --- a/variants/nrf52840/heltec_mesh_solar/platformio.ini +++ b/variants/nrf52840/heltec_mesh_solar/platformio.ini @@ -13,9 +13,13 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_solar> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=NMIoT-meshsolar packageName=https://github.com/NMIoT/meshsolar gitBranch=main https://github.com/NMIoT/meshsolar/archive/dfc5330dad443982e6cdd37a61d33fc7252f468b.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 - ArduinoJson@6.21.4 + # renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson + bblanchon/ArduinoJson@6.21.4 + [env:heltec-mesh-solar] extends = heltec_mesh_solar_base build_flags = ${heltec_mesh_solar_base.build_flags} @@ -48,6 +52,7 @@ build_flags = ${heltec_mesh_solar_base.build_flags} -DEINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting" lib_deps = ${heltec_mesh_solar_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip [env:heltec-mesh-solar-inkhud] @@ -71,7 +76,6 @@ lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${heltec_mesh_solar_base.lib_deps} - [env:heltec-mesh-solar-oled] extends = heltec_mesh_solar_base build_flags = ${heltec_mesh_solar_base.build_flags} @@ -112,4 +116,5 @@ build_flags = ${heltec_mesh_solar_base.build_flags} -DPIN_SPI1_SCK=ST7789_SCK lib_deps = ${heltec_mesh_solar_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-st7789 packageName=https://github.com/meshtastic/st7789 gitBranch=main https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip diff --git a/variants/nrf52840/meshlink/platformio.ini b/variants/nrf52840/meshlink/platformio.ini index fa89739d4..26a999fbb 100644 --- a/variants/nrf52840/meshlink/platformio.ini +++ b/variants/nrf52840/meshlink/platformio.ini @@ -46,6 +46,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/monteops_hw1/platformio.ini b/variants/nrf52840/monteops_hw1/platformio.ini index 5426aee7f..e783e130e 100644 --- a/variants/nrf52840/monteops_hw1/platformio.ini +++ b/variants/nrf52840/monteops_hw1/platformio.ini @@ -10,6 +10,7 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/monteop lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/muzi_base/platformio.ini b/variants/nrf52840/muzi_base/platformio.ini index 49393f4e0..29d93d1cd 100644 --- a/variants/nrf52840/muzi_base/platformio.ini +++ b/variants/nrf52840/muzi_base/platformio.ini @@ -10,6 +10,5 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52840_base.build_src_filter} +<../variants/nrf52840/muzi_base> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=ArtronShop_RX8130CE packageName=artronshop/library/ArtronShop_RX8130CE artronshop/ArtronShop_RX8130CE@1.0.0 - - diff --git a/variants/nrf52840/nano-g2-ultra/platformio.ini b/variants/nrf52840/nano-g2-ultra/platformio.ini index 3e1b7ce6a..f7db6cd47 100644 --- a/variants/nrf52840/nano-g2-ultra/platformio.ini +++ b/variants/nrf52840/nano-g2-ultra/platformio.ini @@ -10,5 +10,6 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/nano-g2-ultra> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs diff --git a/variants/nrf52840/r1-neo/platformio.ini b/variants/nrf52840/r1-neo/platformio.ini index 6efe3a1c5..af3cd052d 100644 --- a/variants/nrf52840/r1-neo/platformio.ini +++ b/variants/nrf52840/r1-neo/platformio.ini @@ -13,6 +13,9 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/r1-neo> lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=ArtronShop_RX8130CE packageName=artronshop/library/ArtronShop_RX8130CE artronshop/ArtronShop_RX8130CE@1.0.0 diff --git a/variants/nrf52840/rak2560/platformio.ini b/variants/nrf52840/rak2560/platformio.ini index f0f6408d3..d93b7e9c9 100644 --- a/variants/nrf52840/rak2560/platformio.ini +++ b/variants/nrf52840/rak2560/platformio.ini @@ -14,7 +14,9 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak2560 lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=github-tags depName=RAK-OneWireSerial packageName=beegee-tokyo/RAK-OneWireSerial https://github.com/beegee-tokyo/RAK-OneWireSerial/archive/0.0.2.zip debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak3401_1watt/platformio.ini b/variants/nrf52840/rak3401_1watt/platformio.ini index 5bf68eecf..268274b13 100644 --- a/variants/nrf52840/rak3401_1watt/platformio.ini +++ b/variants/nrf52840/rak3401_1watt/platformio.ini @@ -16,9 +16,13 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak3401 lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=RAK12035_SoilMoisture packageName=beegee-tokyo/library/RAK12035_SoilMoisture beegee-tokyo/RAK12035_SoilMoisture@1.0.4 + # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 1d8f919bb..6ac94cca8 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -23,9 +23,13 @@ build_src_filter = ${nrf52_base.build_src_filter} \ lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=RAK12035_SoilMoisture packageName=beegee-tokyo/library/RAK12035_SoilMoisture beegee-tokyo/RAK12035_SoilMoisture@1.0.4 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip @@ -50,6 +54,7 @@ build_flags = lib_deps = ${env:rak4631.lib_deps} + # TODO renovate https://github.com/geeksville/Armduino-Semihosting/archive/35b538fdf208c3530c1434cd099a08e486672ee4.zip ; NOTE: the pyocd support for semihosting is buggy. So I switched to using the builtin platformio support for the stlink adapter which worked much better. diff --git a/variants/nrf52840/rak4631_epaper/platformio.ini b/variants/nrf52840/rak4631_epaper/platformio.ini index 5808b27e3..bc21b7912 100644 --- a/variants/nrf52840/rak4631_epaper/platformio.ini +++ b/variants/nrf52840/rak4631_epaper/platformio.ini @@ -14,10 +14,15 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=RAK12034 packageName=beegee-tokyo/library/RAKwireless RAK12034 beegee-tokyo/RAKwireless RAK12034@1.0.0 + # renovate: datasource=custom.pio depName=RAK12035_SoilMoisture packageName=beegee-tokyo/library/RAK12035_SoilMoisture beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini index f350e7ba7..d0bca377b 100644 --- a/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini +++ b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini @@ -16,10 +16,15 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper_onrxtx> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=GxEPD2 packageName=zinggjm/library/GxEPD2 zinggjm/GxEPD2@1.6.5 + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=RAK12034 packageName=beegee-tokyo/library/RAKwireless RAK12034 beegee-tokyo/RAKwireless RAK12034@1.0.0 + # renovate: datasource=custom.pio depName=RAK12035_SoilMoisture packageName=beegee-tokyo/library/RAK12035_SoilMoisture beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/rak4631_eth_gw/platformio.ini b/variants/nrf52840/rak4631_eth_gw/platformio.ini index bce961260..bfa4924ce 100644 --- a/variants/nrf52840/rak4631_eth_gw/platformio.ini +++ b/variants/nrf52840/rak4631_eth_gw/platformio.ini @@ -27,11 +27,15 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631 lib_deps = ${nrf52840_base.lib_deps} ${networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 # renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip + # renovate: datasource=custom.pio depName=ArduinoJson packageName=bblanchon/library/ArduinoJson bblanchon/ArduinoJson@6.21.4 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) ; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds @@ -53,6 +57,7 @@ build_flags = lib_deps = ${env:rak4631_eth_gw.lib_deps} + # TODO renovate https://github.com/geeksville/Armduino-Semihosting/archive/35b538fdf208c3530c1434cd099a08e486672ee4.zip ; NOTE: the pyocd support for semihosting is buggy. So I switched to using the builtin platformio support for the stlink adapter which worked much better. diff --git a/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini index 45842ab76..500242c24 100644 --- a/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini +++ b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini @@ -15,6 +15,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_nomadstar_meteor_pro> + + lib_deps = ${nrf52840_base.lib_deps} + # TODO renovate https://github.com/NomadStar-outdoor/IOBoard-RGB-LP5562-Library.git#9c366c8 ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) @@ -37,6 +38,7 @@ build_flags = lib_deps = ${env:rak4631.lib_deps} + # TODO renovate https://github.com/geeksville/Armduino-Semihosting/archive/35b538fdf208c3530c1434cd099a08e486672ee4.zip ; NOTE: the pyocd support for semihosting is buggy. So I switched to using the builtin platformio support for the stlink adapter which worked much better. diff --git a/variants/nrf52840/rak_wismeshtap/platformio.ini b/variants/nrf52840/rak_wismeshtap/platformio.ini index 93fbd1547..f59a3c3f7 100644 --- a/variants/nrf52840/rak_wismeshtap/platformio.ini +++ b/variants/nrf52840/rak_wismeshtap/platformio.ini @@ -18,12 +18,19 @@ build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wis lib_deps = ${nrf52840_base.lib_deps} ${nrf52_networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip + # renovate: datasource=custom.pio depName=RAK NCP5623 RGB LED packageName=rakwireless/library/RAKwireless NCP5623 RGB LED library rakwireless/RAKwireless NCP5623 RGB LED library@1.0.3 + # renovate: datasource=custom.pio depName=TFT_eSPI packageName=bodmer/library/TFT_eSPI bodmer/TFT_eSPI@2.5.43 + # renovate: datasource=custom.pio depName=RAK12034 packageName=beegee-tokyo/library/RAKwireless RAK12034 beegee-tokyo/RAKwireless RAK12034@1.0.0 + # renovate: datasource=custom.pio depName=RAK14014-FT6336U packageName=beegee-tokyo/library/RAK14014-FT6336U beegee-tokyo/RAK14014-FT6336U@1.0.1 + # renovate: datasource=custom.pio depName=RAK12035_SoilMoisture packageName=beegee-tokyo/library/RAK12035_SoilMoisture beegee-tokyo/RAK12035_SoilMoisture@1.0.4 debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini index 9f2cdd8e9..3007a8c7b 100644 --- a/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini +++ b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini @@ -24,7 +24,8 @@ board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_wio_tracker_L1_eink> lib_deps = ${nrf52840_base.lib_deps} - https://github.com/meshtastic/GxEPD2#b202ebfec6a4821e098cf7a625ba0f6f2400292d + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master + https://github.com/meshtastic/GxEPD2/archive/b202ebfec6a4821e098cf7a625ba0f6f2400292d.zip debug_tool = jlink [env:seeed_wio_tracker_L1_eink-inkhud] diff --git a/variants/nrf52840/t-echo-lite/platformio.ini b/variants/nrf52840/t-echo-lite/platformio.ini index 90e6487a7..217b76a2d 100644 --- a/variants/nrf52840/t-echo-lite/platformio.ini +++ b/variants/nrf52840/t-echo-lite/platformio.ini @@ -20,5 +20,6 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-echo-lite> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/a05c11c02862624266b61599b0d6ba93e33c6f24.zip ;upload_protocol = fs diff --git a/variants/nrf52840/t-echo/platformio.ini b/variants/nrf52840/t-echo/platformio.ini index b2a3aca06..c489efbc1 100644 --- a/variants/nrf52840/t-echo/platformio.ini +++ b/variants/nrf52840/t-echo/platformio.ini @@ -20,7 +20,9 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-echo> lib_deps = ${nrf52840_base.lib_deps} + # renovate: datasource=git-refs depName=meshtastic-GxEPD2 packageName=https://github.com/meshtastic/GxEPD2 gitBranch=master https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 ;upload_protocol = fs @@ -41,4 +43,5 @@ build_src_filter = lib_deps = ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX ${nrf52840_base.lib_deps} + # renovate: datasource=custom.pio depName=PCF8563 packageName=lewisxhe/library/PCF8563_Library lewisxhe/PCF8563_Library@1.0.1 diff --git a/variants/nrf52840/tracker-t1000-e/platformio.ini b/variants/nrf52840/tracker-t1000-e/platformio.ini index 905d751fd..86d74f68a 100644 --- a/variants/nrf52840/tracker-t1000-e/platformio.ini +++ b/variants/nrf52840/tracker-t1000-e/platformio.ini @@ -16,6 +16,7 @@ board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/tracker-t1000-e> lib_deps = ${nrf52840_base.lib_deps} + # TODO renovate https://github.com/meshtastic/QMA6100P_Arduino_Library/archive/14c900b8b2e4feaac5007a7e41e0c1b7f0841136.zip debug_tool = jlink ; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm) diff --git a/variants/rp2040/rak11310/platformio.ini b/variants/rp2040/rak11310/platformio.ini index 1e37696b2..259a4cb80 100644 --- a/variants/rp2040/rak11310/platformio.ini +++ b/variants/rp2040/rak11310/platformio.ini @@ -14,7 +14,9 @@ build_src_filter = ${rp2040_base.build_src_filter} +<../variants/rp2040/rak11310 lib_deps = ${rp2040_base.lib_deps} ${networking_base.lib_deps} + # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 + # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2040/rpipico/platformio.ini b/variants/rp2040/rpipico/platformio.ini index d796d2a0e..953aee625 100644 --- a/variants/rp2040/rpipico/platformio.ini +++ b/variants/rp2040/rpipico/platformio.ini @@ -3,7 +3,6 @@ extends = rp2040_base board = rpipico board_level = pr upload_protocol = picotool - # add our variants files to the include and src paths build_flags = ${rp2040_base.build_flags} diff --git a/variants/stm32/stm32.ini b/variants/stm32/stm32.ini index 547b0502e..bb0a4d3ce 100644 --- a/variants/stm32/stm32.ini +++ b/variants/stm32/stm32.ini @@ -4,7 +4,7 @@ platform = # renovate: datasource=custom.pio depName=platformio/ststm32 packageName=platformio/platform/ststm32 platformio/ststm32@19.4.0 platform_packages = - # TODO renovate + # renovate: datasource=github-tags depName=Arduino_Core_STM32 packageName=stm32duino/Arduino_Core_STM32 platformio/framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/2.10.1.zip extra_scripts = ${env.extra_scripts} @@ -51,7 +51,6 @@ debug_tool = stlink lib_deps = ${env.lib_deps} ${radiolib_base.lib_deps} - # renovate: datasource=git-refs depName=caveman99-stm32-Crypto packageName=https://github.com/caveman99/Crypto gitBranch=main https://github.com/caveman99/Crypto/archive/1aa30eb536bd52a576fde6dfa393bf7349cf102d.zip From 5b299f3ede82fae0a14b37c320ae2bf77986a5c3 Mon Sep 17 00:00:00 2001 From: Jonathan Bennett Date: Wed, 17 Dec 2025 12:03:29 -0600 Subject: [PATCH 284/286] Prep work for better Store and Forward (#8999) * make channels.h getHash public * router.* make the encrypted packet copy available for modules to access * Update src/mesh/Router.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Set p_encrypted to nullptr after release --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/mesh/Channels.h | 4 ++-- src/mesh/Router.cpp | 3 ++- src/mesh/Router.h | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mesh/Channels.h b/src/mesh/Channels.h index b53f552fa..a3cc7791c 100644 --- a/src/mesh/Channels.h +++ b/src/mesh/Channels.h @@ -96,6 +96,8 @@ class Channels bool setDefaultPresetCryptoForHash(ChannelHash channelHash); + int16_t getHash(ChannelIndex i) { return hashes[i]; } + private: /** Given a channel index, change to use the crypto key specified by that index * @@ -113,8 +115,6 @@ class Channels */ int16_t generateHash(ChannelIndex channelNum); - int16_t getHash(ChannelIndex i) { return hashes[i]; } - /** * Validate a channel, fixing any errors as needed */ diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index ad0c0be6f..47ed0c85a 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -692,7 +692,7 @@ void Router::handleReceived(meshtastic_MeshPacket *p, RxSource src) // Store a copy of encrypted packet for MQTT DEBUG_HEAP_BEFORE; - meshtastic_MeshPacket *p_encrypted = packetPool.allocCopy(*p); + p_encrypted = packetPool.allocCopy(*p); DEBUG_HEAP_AFTER("Router::handleReceived", p_encrypted); // Take those raw bytes and convert them back into a well structured protobuf we can understand @@ -758,6 +758,7 @@ void Router::handleReceived(meshtastic_MeshPacket *p, RxSource src) } packetPool.release(p_encrypted); // Release the encrypted packet + p_encrypted = nullptr; } void Router::perhapsHandleReceived(meshtastic_MeshPacket *p) diff --git a/src/mesh/Router.h b/src/mesh/Router.h index 10a3771a7..dbe6f4f39 100644 --- a/src/mesh/Router.h +++ b/src/mesh/Router.h @@ -91,6 +91,9 @@ class Router : protected concurrency::OSThread, protected PacketHistory before us */ uint32_t rxDupe = 0, txRelayCanceled = 0; + // pointer to the encrypted packet + meshtastic_MeshPacket *p_encrypted = nullptr; + protected: friend class RoutingModule; From 176d8def4830f4603e9087344fe55e086059c5d3 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 17 Dec 2025 13:47:09 -0500 Subject: [PATCH 285/286] PlatformIO: Restructure networking_base for re-use (#8964) --- platformio.ini | 12 ++++-------- variants/esp32/esp32.ini | 1 + variants/native/portduino.ini | 1 + variants/nrf52840/rak2560/platformio.ini | 2 +- variants/nrf52840/rak4631/platformio.ini | 2 +- variants/nrf52840/rak_wismeshtap/platformio.ini | 2 +- variants/rp2040/rak11310/platformio.ini | 1 + variants/rp2040/rpipicow/platformio.ini | 1 + variants/rp2350/rpipico2w/platformio.ini | 1 + 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/platformio.ini b/platformio.ini index 02a959b7e..4fa7acd66 100644 --- a/platformio.ini +++ b/platformio.ini @@ -103,17 +103,13 @@ lib_deps = thingsboard/TBPubSubClient@2.12.1 # renovate: datasource=custom.pio depName=NTPClient packageName=arduino-libraries/library/NTPClient arduino-libraries/NTPClient@3.2.1 + +; Extra TCP/IP networking libs for supported devices +[networking_extra] +lib_deps = # renovate: datasource=custom.pio depName=Syslog packageName=arcao/library/Syslog arcao/Syslog@2.0.0 -; Minimal networking libs for nrf52 (excludes Syslog to save flash) -[nrf52_networking_base] -lib_deps = - # renovate: datasource=custom.pio depName=TBPubSubClient packageName=thingsboard/library/TBPubSubClient - thingsboard/TBPubSubClient@2.12.1 - # renovate: datasource=custom.pio depName=NTPClient packageName=arduino-libraries/library/NTPClient - arduino-libraries/NTPClient@3.2.1 - [radiolib_base] lib_deps = # renovate: datasource=custom.pio depName=RadioLib packageName=jgromes/library/RadioLib diff --git a/variants/esp32/esp32.ini b/variants/esp32/esp32.ini index a4c7cea5f..cde3c9740 100644 --- a/variants/esp32/esp32.ini +++ b/variants/esp32/esp32.ini @@ -53,6 +53,7 @@ build_flags = lib_deps = ${arduino_base.lib_deps} ${networking_base.lib_deps} + ${networking_extra.lib_deps} ${environmental_base.lib_deps} ${environmental_extra.lib_deps} ${radiolib_base.lib_deps} diff --git a/variants/native/portduino.ini b/variants/native/portduino.ini index 55b082974..76520091c 100644 --- a/variants/native/portduino.ini +++ b/variants/native/portduino.ini @@ -21,6 +21,7 @@ build_src_filter = lib_deps = ${env.lib_deps} ${networking_base.lib_deps} + ${networking_extra.lib_deps} ${radiolib_base.lib_deps} ${environmental_base.lib_deps} # renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto diff --git a/variants/nrf52840/rak2560/platformio.ini b/variants/nrf52840/rak2560/platformio.ini index d93b7e9c9..21b3776f8 100644 --- a/variants/nrf52840/rak2560/platformio.ini +++ b/variants/nrf52840/rak2560/platformio.ini @@ -13,7 +13,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak2560> + + + lib_deps = ${nrf52840_base.lib_deps} - ${nrf52_networking_base.lib_deps} + ${networking_base.lib_deps} # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 # renovate: datasource=github-tags depName=RAK-OneWireSerial packageName=beegee-tokyo/RAK-OneWireSerial diff --git a/variants/nrf52840/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini index 6ac94cca8..ed30692be 100644 --- a/variants/nrf52840/rak4631/platformio.ini +++ b/variants/nrf52840/rak4631/platformio.ini @@ -22,7 +22,7 @@ build_src_filter = ${nrf52_base.build_src_filter} \ - lib_deps = ${nrf52840_base.lib_deps} - ${nrf52_networking_base.lib_deps} + ${networking_base.lib_deps} # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S diff --git a/variants/nrf52840/rak_wismeshtap/platformio.ini b/variants/nrf52840/rak_wismeshtap/platformio.ini index f59a3c3f7..485b7174f 100644 --- a/variants/nrf52840/rak_wismeshtap/platformio.ini +++ b/variants/nrf52840/rak_wismeshtap/platformio.ini @@ -17,7 +17,7 @@ build_flags = ${nrf52840_base.build_flags} build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wismeshtap> + + + lib_deps = ${nrf52840_base.lib_deps} - ${nrf52_networking_base.lib_deps} + ${networking_base.lib_deps} # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S diff --git a/variants/rp2040/rak11310/platformio.ini b/variants/rp2040/rak11310/platformio.ini index 259a4cb80..3234d3b99 100644 --- a/variants/rp2040/rak11310/platformio.ini +++ b/variants/rp2040/rak11310/platformio.ini @@ -14,6 +14,7 @@ build_src_filter = ${rp2040_base.build_src_filter} +<../variants/rp2040/rak11310 lib_deps = ${rp2040_base.lib_deps} ${networking_base.lib_deps} + ${networking_extra.lib_deps} # renovate: datasource=custom.pio depName=Melopero RV3028 packageName=melopero/library/Melopero RV3028 melopero/Melopero RV3028@1.2.0 # renovate: datasource=github-tags depName=RAK13800-W5100S packageName=RAKWireless/RAK13800-W5100S diff --git a/variants/rp2040/rpipicow/platformio.ini b/variants/rp2040/rpipicow/platformio.ini index 60845ba39..00b7b1f01 100644 --- a/variants/rp2040/rpipicow/platformio.ini +++ b/variants/rp2040/rpipicow/platformio.ini @@ -16,5 +16,6 @@ build_src_filter = ${rp2040_base.build_src_filter} + lib_deps = ${rp2040_base.lib_deps} ${networking_base.lib_deps} + ${networking_extra.lib_deps} debug_build_flags = ${rp2040_base.build_flags}, -g debug_tool = cmsis-dap ; for e.g. Picotool diff --git a/variants/rp2350/rpipico2w/platformio.ini b/variants/rp2350/rpipico2w/platformio.ini index 5dbce533b..da408b67d 100644 --- a/variants/rp2350/rpipico2w/platformio.ini +++ b/variants/rp2350/rpipico2w/platformio.ini @@ -30,4 +30,5 @@ build_src_filter = ${rp2350_base.build_src_filter} + lib_deps = ${rp2350_base.lib_deps} ${networking_base.lib_deps} + ${networking_extra.lib_deps} debug_build_flags = ${rp2350_base.build_flags}, -g From e9db03d18508e753a0a40190658bb63680cf805c Mon Sep 17 00:00:00 2001 From: Jason P Date: Wed, 17 Dec 2025 14:46:35 -0600 Subject: [PATCH 286/286] Macro guard heap_caps_malloc_extmem_enable from SENSECAP_INDICATOR (#9007) --- src/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 45f4eb7b5..e29736712 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -447,9 +447,11 @@ void setup() LOG_INFO("\n\n//\\ E S H T /\\ S T / C\n"); #if defined(ARCH_ESP32) && defined(BOARD_HAS_PSRAM) +#ifndef SENSECAP_INDICATOR // use PSRAM for malloc calls > 256 bytes heap_caps_malloc_extmem_enable(256); #endif +#endif #if defined(DEBUG_MUTE) && defined(DEBUG_PORT) DEBUG_PORT.printf("\r\n\r\n//\\ E S H T /\\ S T / C\r\n");