From 15f215f5463cf56f5d114b603411dfc5f70aacd8 Mon Sep 17 00:00:00 2001 From: Manuel Roesel Date: Fri, 29 Oct 2021 19:18:39 +0200 Subject: [PATCH] legacy packet validation --- README.md | 2 +- ognbase/APRS.cpp | 32 +- ognbase/Log.cpp | 9 + ognbase/Log.h | 79 ++--- ognbase/OLED.cpp | 20 +- ognbase/PVALID.cpp | 103 ++++--- ognbase/Platform_ESP32.cpp | 10 +- ognbase/Protocol_Legacy.cpp | 12 +- ognbase/Protocol_Legacy.h | 285 +++++++++--------- ognbase/config.cpp | 17 +- ognbase/data/config.json | 10 +- ognbase/global.h | 10 +- ognbase/ognbase.ino | 17 +- ognbase/sdcard/config.json | 16 +- ognbase/version.h | 10 +- pictures/TBEAM.png | Bin 0 -> 55276 bytes pictures/TTGO.png | Bin 0 -> 54358 bytes tools/aprs_decode/client.py | 141 +++++++++ tools/aprs_decode/main.py | 28 ++ tools/aprs_decode/settings.py | 13 + tools/iv.bin | 1 + tools/key.bin | 1 + .../__pycache__/AircraftPos.cpython-39.pyc | Bin 2858 -> 0 bytes .../ogn/__pycache__/OneMessage.cpython-39.pyc | Bin 3646 -> 0 bytes tools/ogn/__pycache__/__init__.cpython-39.pyc | Bin 136 -> 0 bytes tools/{udp_server.py => udp_log_server.py} | 0 26 files changed, 504 insertions(+), 312 deletions(-) create mode 100644 pictures/TBEAM.png create mode 100644 pictures/TTGO.png create mode 100644 tools/aprs_decode/client.py create mode 100644 tools/aprs_decode/main.py create mode 100644 tools/aprs_decode/settings.py create mode 100644 tools/iv.bin create mode 100644 tools/key.bin delete mode 100644 tools/ogn/__pycache__/AircraftPos.cpython-39.pyc delete mode 100644 tools/ogn/__pycache__/OneMessage.cpython-39.pyc delete mode 100644 tools/ogn/__pycache__/__init__.cpython-39.pyc rename tools/{udp_server.py => udp_log_server.py} (100%) diff --git a/README.md b/README.md index 2c67104..63f732a 100644 --- a/README.md +++ b/README.md @@ -91,13 +91,13 @@ RF position packets AES128 encrypted * install latest Arduino IDE * git clone https://github.com/roema/Open-Glider-Network-Groundstation.git --recursive * make sure the arduino ide is using the correct libraries. +* **take a look at pictures folder for arduino configuration*** ## Installation * git clone --recursive https://github.com/roema/Open-Glider-Network-Groundstation.git * Install arduino ide - make sure you are using the correct librarys -* ~~Install ESP32 Filesystem Uploader~~ * Compile and upload Sketch and files (.css and .html) * Connect to OGN Wifi AP and configure * You can update you installation http://you-ogn-ground-ip/update diff --git a/ognbase/APRS.cpp b/ognbase/APRS.cpp index 5cd12ae..29ffeb5 100644 --- a/ognbase/APRS.cpp +++ b/ognbase/APRS.cpp @@ -95,34 +95,6 @@ static short AprsPasscode(const char* theCall) return hash & 0x7fff; } -static long double toRadians(const long double degree) -{ - long double one_deg = (M_PI) / 180; - return one_deg * degree; -} - -static long double distance(long double lat1, long double long1, long double lat2, long double long2) -{ - lat1 = toRadians(lat1); - long1 = toRadians(long1); - lat2 = toRadians(lat2); - long2 = toRadians(long2); - - long double dlong = long2 - long1; - long double dlat = lat2 - lat1; - - long double ans = pow(sin(dlat / 2), 2) + - cos(lat1) * cos(lat2) * - pow(sin(dlong / 2), 2); - - ans = 2 * asin(sqrt(ans)); - - long double R = 6371; - ans = ans * R; - - return ans * 1000; -} - static bool OGN_APRS_Connect() { if (SoC->WiFi_connect_TCP(ogn_server.c_str(), ogn_port)) @@ -221,7 +193,7 @@ void OGN_APRS_Export() if (Container[i].addr && (this_moment - Container[i].timestamp) <= EXPORT_EXPIRATION_TIME && Container[i].distance < ogn_range * 1000) { - if(!isPacketValid(Container[i].addr, Container[i].latitude, Container[i].longitude, Container[i].speed, Container[i].timestamp) && testmode_enable){ + if(!isPacketValid(Container[i].addr, Container[i].latitude, Container[i].longitude, Container[i].speed, Container[i].timestamp)){ break; } @@ -429,7 +401,7 @@ int OGN_APRS_Register(ufo_t* this_aircraft) void OGN_APRS_KeepAlive() { - String KeepAlivePacket = "#keepalive\n\n"; + String KeepAlivePacket = "#keepalive\n"; Logger_send_udp(&KeepAlivePacket); SoC->WiFi_transmit_TCP(KeepAlivePacket); } diff --git a/ognbase/Log.cpp b/ognbase/Log.cpp index 1ab6d1a..276ff98 100644 --- a/ognbase/Log.cpp +++ b/ognbase/Log.cpp @@ -19,6 +19,7 @@ #include "SoC.h" #include "Log.h" #include "EEPROM.h" +#include "PNET.h" #include "global.h" @@ -30,6 +31,14 @@ void Logger_send_udp(String* buf) byte debug_msg[debug_len]; buf->getBytes(debug_msg, debug_len); SoC->WiFi_transmit_UDP_debug(ogn_debugport, debug_msg, debug_len); + + if(remotelogs_enable){ + char *encrypted; + size_t encrypted_len; + //PNETencrypt(debug_msg, debug_len, &encrypted, &encrypted_len); + //SoC->WiFi_transmit_UDP(remotelogs_server.c_str(), remotelogs_port, (byte*)encrypted, encrypted_len); + //free(encrypted); + } } } diff --git a/ognbase/Log.h b/ognbase/Log.h index 4d592c0..aacaf9b 100644 --- a/ognbase/Log.h +++ b/ognbase/Log.h @@ -1,39 +1,40 @@ -/* - * Log.h - * Copyright (C) 2019-2020 Linar Yusupov - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef LOGHELPER_H -#define LOGHELPER_H - -#include "SoftRF.h" - -void Logger_send_udp(String *); - -#if LOGGER_IS_ENABLED - -#include - -extern File LogFile; -void Logger_setup(void); - -void Logger_loop(void); - -void Logger_fini(void); - -#endif /* LOGGER_IS_ENABLED */ - -#endif /* LOGHELPER_H */ +/* + * Log.h + * Copyright (C) 2019-2020 Linar Yusupov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef LOGHELPER_H +#define LOGHELPER_H + +#include "SoftRF.h" + +void Logger_send_udp(String *); +void Logger_send_enc_udp(String *); + +#if LOGGER_IS_ENABLED + +#include + +extern File LogFile; +void Logger_setup(void); + +void Logger_loop(void); + +void Logger_fini(void); + +#endif /* LOGGER_IS_ENABLED */ + +#endif /* LOGHELPER_H */ diff --git a/ognbase/OLED.cpp b/ognbase/OLED.cpp index a277063..599a438 100644 --- a/ognbase/OLED.cpp +++ b/ognbase/OLED.cpp @@ -75,18 +75,19 @@ byte OLED_setup() void OLED_write(char* text, short x, short y, bool clear) { - if (display_init) - { - display.displayOn(); - if (clear) - display.clear(); - display.drawString(x, y, text); - display.display(); - } + if (!display_enabled){return;} + + display.displayOn(); + if (clear) + display.clear(); + display.drawString(x, y, text); + display.display(); } void OLED_disable() { + if (!display_enabled){return;} + display.clear(); display.displayOff(); display_enabled = false; @@ -322,6 +323,3 @@ void OLED_info(bool ntp) } } } - -void OLED_status() -{} diff --git a/ognbase/PVALID.cpp b/ognbase/PVALID.cpp index ebef921..017d175 100644 --- a/ognbase/PVALID.cpp +++ b/ognbase/PVALID.cpp @@ -32,38 +32,33 @@ bool isPacketValid(uint32_t addr, double lat1, double lon1, double speed, time_t /*V0.1.0-24*/ - if (!testmode_enable){ - return true; - } - - - for(uint8_t i=0;i calcdist){ + if (dist > calcdist) { msg = "Max calculated distance: "; msg += calcdist; - Logger_send_udp(&msg); - + Logger_send_udp(&msg); + msg = "Packet seems to be invalid"; Logger_send_udp(&msg); @@ -71,19 +66,19 @@ bool isPacketValid(uint32_t addr, double lat1, double lon1, double speed, time_t shiftPackets(); return false; } - else{ + else { msg = "Max calculated distance: "; msg += calcdist; - Logger_send_udp(&msg); - + Logger_send_udp(&msg); + uint8_t cnt = ac[i].pkt_counter + 1; msg = "Packet seems to be valid - counter: "; msg += cnt; - Logger_send_udp(&msg); - + Logger_send_udp(&msg); + cleanUpPacket(i); shiftPackets(); appendPacket(addr, lat1, lon1, timestamp, cnt); @@ -95,53 +90,65 @@ bool isPacketValid(uint32_t addr, double lat1, double lon1, double speed, time_t Logger_send_udp(&msg); shiftPackets(); appendPacket(addr, lat1, lon1, timestamp, 0); - return(false); + return (false); } static int distance(double lat1, double lon1, double lat2, double lon2) { double theta, dist; + double r = 6378137.0; + if ((lat1 == lat2) && (lon1 == lon2)) { return 0; } else { - theta = lon1 - lon2; - dist = sin(deg2rad(lat1)) * sin(deg2rad(lat2)) + cos(deg2rad(lat1)) * cos(deg2rad(lat2)) * cos(deg2rad(theta)); - dist = acos(dist); - dist = rad2deg(dist); - dist = dist * 60 * 1.1515; - dist = dist * 1.609344; - } - return (int)(dist); + lat1 = deg2rad(lat1); + lon1 = deg2rad(lon1); + lat2 = deg2rad(lat2); + lon2 = deg2rad(lon2); + + double dlat = lat2 - lat1; + double dlon = lon2 - lon1; + + double dist = 2 * r * asin(sqrt(pow(sin(dlat / 2), 2) + cos(lat1) * cos(lat2) * pow(sin(dlon / 2), 2))); + + return (int)(dist); //distance in meter } +} static int calcMaxDistance(double speed, time_t time_diff) { - return (int)((speed / 3.6 * time_diff) * 2 ); - } - -static bool appendPacket(uint32_t addr, double lat, double lon, time_t timestamp, uint8_t cnt){ - ac[MAX_TRACKING_OBJECTS-1].timestamp = timestamp; - ac[MAX_TRACKING_OBJECTS-1].addr = addr; - ac[MAX_TRACKING_OBJECTS-1].latitude = lat; - ac[MAX_TRACKING_OBJECTS-1].longitude = lon; - ac[MAX_TRACKING_OBJECTS-1].pkt_counter = cnt; + int speed_ms = speed / 3.6; + // 20% more than calculated + return (int)((speed * time_diff) * 1.2 ); +} + +static bool appendPacket(uint32_t addr, double lat, double lon, time_t timestamp, uint8_t cnt) { + ac[MAX_TRACKING_OBJECTS - 1].timestamp = timestamp; + ac[MAX_TRACKING_OBJECTS - 1].addr = addr; + ac[MAX_TRACKING_OBJECTS - 1].latitude = lat; + ac[MAX_TRACKING_OBJECTS - 1].longitude = lon; + ac[MAX_TRACKING_OBJECTS - 1].pkt_counter = cnt; } -static void shiftPackets(void){ - for(uint8_t i=0; iaddr << 8) & 0xffffff); btea((uint32_t *) pkt + 1, -5, key); + for (ndx = 0; ndx < sizeof (legacy_packet_t); ndx++) pkt_parity += parity(*(((unsigned char *) pkt) + ndx)); if (pkt_parity % 2) { - if (settings->nmea_p) - { - msg = "bad parity of decoded legacy packet"; - Logger_send_udp(&msg); - msg = "decoding failed"; - Logger_send_udp(&msg); - } + msg = "bad parity of decoded legacy packet"; + Logger_send_udp(&msg); + msg = "decoding failed"; + Logger_send_udp(&msg); return false; } diff --git a/ognbase/Protocol_Legacy.h b/ognbase/Protocol_Legacy.h index 6b5b977..22f35f7 100644 --- a/ognbase/Protocol_Legacy.h +++ b/ognbase/Protocol_Legacy.h @@ -1,142 +1,143 @@ -/* - * Protocol_Legacy.h - * Copyright (C) 2014-2015 Stanislaw Pusep - * Copyright (C) 2019-2020 Linar Yusupov - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef PROTOCOL_LEGACY_H -#define PROTOCOL_LEGACY_H - -/* IEEE Manchester(F531FAB6) = 55 99 A5 A9 55 66 65 96 */ -#define LEGACY_PREAMBLE_TYPE RF_PREAMBLE_TYPE_55 -#define LEGACY_PREAMBLE_SIZE 1 -#define LEGACY_SYNCWORD {0x99, 0xA5, 0xA9, 0x55, 0x66, 0x65, 0x96} -#define LEGACY_SYNCWORD_SIZE 7 -#define LEGACY_PAYLOAD_SIZE 24 -#define LEGACY_CRC_TYPE RF_CHECKSUM_TYPE_CCITT_FFFF -#define LEGACY_CRC_SIZE 2 - -#define LEGACY_TX_INTERVAL_MIN 600 /* in ms */ -#define LEGACY_TX_INTERVAL_MAX 1400 - -#define LEGACY_KEY1 { 0xe43276df, 0xdca83759, 0x9802b8ac, 0x4675a56b, \ - 0xfc78ea65, 0x804b90ea, 0xb76542cd, 0x329dfa32 } -#define LEGACY_KEY2 0x045d9f3b -#define LEGACY_KEY3 0x87b562f4 - -/* FTD-12 Version: 7.00 */ -enum -{ - ADDR_TYPE_RANDOM, - ADDR_TYPE_ICAO, - ADDR_TYPE_FLARM, - ADDR_TYPE_ANONYMOUS, /* FLARM stealth, OGN */ - ADDR_TYPE_P3I, - ADDR_TYPE_FANET -}; - -enum -{ - AIRCRAFT_TYPE_UNKNOWN, - AIRCRAFT_TYPE_GLIDER, - AIRCRAFT_TYPE_TOWPLANE, - AIRCRAFT_TYPE_HELICOPTER, - AIRCRAFT_TYPE_PARACHUTE, - AIRCRAFT_TYPE_DROPPLANE, - AIRCRAFT_TYPE_HANGGLIDER, - AIRCRAFT_TYPE_PARAGLIDER, - AIRCRAFT_TYPE_POWERED, - AIRCRAFT_TYPE_JET, - AIRCRAFT_TYPE_UFO, - AIRCRAFT_TYPE_BALLOON, - AIRCRAFT_TYPE_ZEPPELIN, - AIRCRAFT_TYPE_UAV, - AIRCRAFT_TYPE_RESERVED, - AIRCRAFT_TYPE_STATIC -}; - -enum -{ - ALARM_LEVEL_NONE, - ALARM_LEVEL_LOW, /* 13-18 seconds to impact */ - ALARM_LEVEL_IMPORTANT, /* 9-12 seconds to impact */ - ALARM_LEVEL_URGENT /* 0-8 seconds to impact */ -}; - -enum -{ - ALARM_TYPE_TRAFFIC, - ALARM_TYPE_SILENT, - ALARM_TYPE_AIRCRAFT, - ALARM_TYPE_OBSTACLE -}; - -enum -{ - GNSS_STATUS_NONE, - GNSS_STATUS_3D_GROUND, - GNSS_STATUS_3D_MOVING -}; - -enum -{ - POWER_STATUS_BAD, - POWER_STATUS_GOOD -}; - -enum -{ - TX_STATUS_OFF, - TX_STATUS_ON -}; - -typedef struct -{ - /********************/ - unsigned int addr : 24; - unsigned int _unk0 : 4; - unsigned int addr_type : 3; - unsigned int _unk1 : 1; - // unsigned int magic:8; - /********************/ - int vs : 10; - unsigned int _unk2 : 2; - unsigned int airborne : 1; - unsigned int stealth : 1; - unsigned int no_track : 1; - unsigned int parity : 1; - unsigned int gps : 12; - unsigned int aircraft_type : 4; - /********************/ - unsigned int lat : 19; - unsigned int alt : 13; - /********************/ - unsigned int lon : 20; - unsigned int _unk3 : 10; - unsigned int smult : 2; - /********************/ - int8_t ns[4]; - int8_t ew[4]; - /********************/ -} legacy_packet_t; - -bool legacy_decode(void *, ufo_t *, ufo_t *); - -size_t legacy_encode(void *, ufo_t *); - -extern const rf_proto_desc_t legacy_proto_desc; - -#endif /* PROTOCOL_LEGACY_H */ +/* + * Protocol_Legacy.h + * Copyright (C) 2014-2015 Stanislaw Pusep + * Copyright (C) 2019-2020 Linar Yusupov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROTOCOL_LEGACY_H +#define PROTOCOL_LEGACY_H + +/* IEEE Manchester(F531FAB6) = 55 99 A5 A9 55 66 65 96 */ +#define LEGACY_PREAMBLE_TYPE RF_PREAMBLE_TYPE_55 +#define LEGACY_PREAMBLE_SIZE 1 +#define LEGACY_SYNCWORD {0x99, 0xA5, 0xA9, 0x55, 0x66, 0x65, 0x96} +#define LEGACY_SYNCWORD_SIZE 7 +#define LEGACY_PAYLOAD_SIZE 24 +#define LEGACY_CRC_TYPE RF_CHECKSUM_TYPE_CCITT_FFFF +#define LEGACY_CRC_SIZE 2 + +#define LEGACY_TX_INTERVAL_MIN 600 /* in ms */ +#define LEGACY_TX_INTERVAL_MAX 1400 + +#define LEGACY_KEY1 { 0xe43276df, 0xdca83759, 0x9802b8ac, 0x4675a56b, \ + 0xfc78ea65, 0x804b90ea, 0xb76542cd, 0x329dfa32 } +#define LEGACY_KEY2 0x045d9f3b +#define LEGACY_KEY3 0x87b562f4 + + +/* FTD-12 Version: 7.00 */ +enum +{ + ADDR_TYPE_RANDOM, + ADDR_TYPE_ICAO, + ADDR_TYPE_FLARM, + ADDR_TYPE_ANONYMOUS, /* FLARM stealth, OGN */ + ADDR_TYPE_P3I, + ADDR_TYPE_FANET +}; + +enum +{ + AIRCRAFT_TYPE_UNKNOWN, + AIRCRAFT_TYPE_GLIDER, + AIRCRAFT_TYPE_TOWPLANE, + AIRCRAFT_TYPE_HELICOPTER, + AIRCRAFT_TYPE_PARACHUTE, + AIRCRAFT_TYPE_DROPPLANE, + AIRCRAFT_TYPE_HANGGLIDER, + AIRCRAFT_TYPE_PARAGLIDER, + AIRCRAFT_TYPE_POWERED, + AIRCRAFT_TYPE_JET, + AIRCRAFT_TYPE_UFO, + AIRCRAFT_TYPE_BALLOON, + AIRCRAFT_TYPE_ZEPPELIN, + AIRCRAFT_TYPE_UAV, + AIRCRAFT_TYPE_RESERVED, + AIRCRAFT_TYPE_STATIC +}; + +enum +{ + ALARM_LEVEL_NONE, + ALARM_LEVEL_LOW, /* 13-18 seconds to impact */ + ALARM_LEVEL_IMPORTANT, /* 9-12 seconds to impact */ + ALARM_LEVEL_URGENT /* 0-8 seconds to impact */ +}; + +enum +{ + ALARM_TYPE_TRAFFIC, + ALARM_TYPE_SILENT, + ALARM_TYPE_AIRCRAFT, + ALARM_TYPE_OBSTACLE +}; + +enum +{ + GNSS_STATUS_NONE, + GNSS_STATUS_3D_GROUND, + GNSS_STATUS_3D_MOVING +}; + +enum +{ + POWER_STATUS_BAD, + POWER_STATUS_GOOD +}; + +enum +{ + TX_STATUS_OFF, + TX_STATUS_ON +}; + +typedef struct +{ + /********************/ + unsigned int addr : 24; + unsigned int _unk0 : 4; + unsigned int addr_type : 3; + unsigned int _unk1 : 1; + // unsigned int magic:8; + /********************/ + int vs : 10; + unsigned int _unk2 : 2; + unsigned int airborne : 1; + unsigned int stealth : 1; + unsigned int no_track : 1; + unsigned int parity : 1; + unsigned int gps : 12; + unsigned int aircraft_type : 4; + /********************/ + unsigned int lat : 19; + unsigned int alt : 13; + /********************/ + unsigned int lon : 20; + unsigned int _unk3 : 10; + unsigned int smult : 2; + /********************/ + int8_t ns[4]; + int8_t ew[4]; + /********************/ +} legacy_packet_t; + +bool legacy_decode(void *, ufo_t *, ufo_t *); + +size_t legacy_encode(void *, ufo_t *); + +extern const rf_proto_desc_t legacy_proto_desc; + +#endif /* PROTOCOL_LEGACY_H */ diff --git a/ognbase/config.cpp b/ognbase/config.cpp index 38d869f..1bfc7db 100644 --- a/ognbase/config.cpp +++ b/ognbase/config.cpp @@ -56,10 +56,12 @@ bool ogn_debug = false; uint16_t ogn_debugport = 12000; bool ogn_itrackbit = false; bool ogn_istealthbit = false; +uint16_t ogn_range = 100; + +//sleep mode bool ogn_sleepmode = false; uint16_t ogn_rxidle = 3600; uint16_t ogn_wakeuptimer = 3600; -uint8_t ogn_range = 100; //position float ogn_lat = 0; @@ -303,6 +305,19 @@ bool OGN_read_config(void) } } + if (obj.containsKey(F("sleepmode"))) + { + //Serial.println(F("found aprs config!")); + if (1) + { + ogn_sleepmode = obj["aprs"]["sleepmode"]; + ogn_rxidle = obj["aprs"]["rxidle"]; + if(ogn_rxidle < 600){ogn_rxidle = 600;} + ogn_wakeuptimer = obj["aprs"]["wakeuptimer"]; + if(ogn_wakeuptimer < 600){ogn_wakeuptimer = 600;} + } + } + if (obj.containsKey(F("zabbix"))) { diff --git a/ognbase/data/config.json b/ognbase/data/config.json index dd24d8e..da3fd57 100644 --- a/ognbase/data/config.json +++ b/ognbase/data/config.json @@ -1,14 +1,14 @@ { "wifi":{ "ssid":[ - "ssid", + "xxxxxxx", "xxxxxxx", "xxxxxxx", "xxxxxxx", "xxxxxxx" ], "pass":[ - "password", + "xxxxxxx", "xxxxxxx", "xxxxxxx", "xxxxxxx", @@ -32,9 +32,9 @@ "enable":false }, "remotelogs":{ - "enable":false, - "server":"5.150.254.37", - "port":12000 + "enable":true, + "server":"10.0.1.200", + "port":12014 }, "aprs":{ "callsign":"Neuenburg", diff --git a/ognbase/global.h b/ognbase/global.h index 226e621..06a72e8 100644 --- a/ognbase/global.h +++ b/ognbase/global.h @@ -24,12 +24,12 @@ extern bool ogn_istealthbit; extern bool ogn_sleepmode; extern uint16_t ogn_rxidle; extern uint16_t ogn_wakeuptimer; -extern uint8_t ogn_range; +extern uint16_t ogn_range; -extern bool fanet_enable; -extern bool zabbix_enable; -extern String zabbix_server; -extern uint16_t zabbix_port; +extern bool fanet_enable; +extern bool zabbix_enable; +extern String zabbix_server; +extern uint16_t zabbix_port; extern String zabbix_key; extern bool beers_show; diff --git a/ognbase/ognbase.ino b/ognbase/ognbase.ino index dabfd24..5447208 100644 --- a/ognbase/ognbase.ino +++ b/ognbase/ognbase.ino @@ -136,6 +136,10 @@ //testing #define TimeToDisableOled() (seconds() - ExportTimeOledDisable >= oled_disable) +//time reregister if failed +#define TIME_TO_REREG 30 +#define TimeToReRegisterOGN() (seconds() - ExportTimeReRegister >= TIME_TO_REREG) + /*Testing FANET service messages*/ #define TIME_TO_EXPORT_FANET_SERVICE 40 /*every 40 sec 10 for testing*/ #define TimeToExportFanetService() (seconds() - ExportTimeFanetService >= TIME_TO_EXPORT_FANET_SERVICE) @@ -172,6 +176,7 @@ unsigned long ExportTimeFanetService = 0; unsigned long ExportTimeCheckKeepAliveOGN = 0; unsigned long ExportTimeCheckWifi = 0; unsigned long ExportTimeOledDisable = 0; +unsigned long ExportTimeReRegister = 0; /*set ground position only once*/ bool position_is_set = false; @@ -251,7 +256,7 @@ void setup() Time_setup(); SoC->WDT_setup(); - if(private_network){ + if(private_network || remotelogs_enable){ aes_init(); } @@ -439,7 +444,13 @@ void ground() } if(ground_registred == -2){ - // + //lost wifi? + OGN_APRS_check_Wifi(); + ExportTimeReRegister = seconds(); + while(TimeToReRegisterOGN()){ + os_runstep(); + } + ground_registred = 0; } if (TimeToExportOGN() && ground_registred == 1) @@ -491,6 +502,8 @@ void ground() esp_sleep_enable_timer_wakeup(ogn_wakeuptimer*1000000LL); esp_sleep_enable_ext0_wakeup(GPIO_NUM_26,1); + OLED_disable(); + if (ogn_sleepmode == 1){ GNSS_sleep(); } diff --git a/ognbase/sdcard/config.json b/ognbase/sdcard/config.json index 71851ba..dd32d24 100644 --- a/ognbase/sdcard/config.json +++ b/ognbase/sdcard/config.json @@ -32,9 +32,9 @@ "enable":false }, "remotelogs":{ - "enable":false, - "server":"5.150.254.37", - "port":12000 + "enable":true, + "server":"10.0.1.200", + "port":12014 }, "aprs":{ "callsign":"Neuenburg", @@ -47,11 +47,13 @@ "debugport":12000, "itrackbit":false, "istealthbit":false, - "sleepmode":false, - "rxidle":3600, - "wakeuptimer":3600, "range":100 }, + "sleepmode":{ + "enable":false, + "rxidle":3600, + "wakeuptimer":3600, + }, "fanetservice":{ "enable":1 }, @@ -61,7 +63,7 @@ "port":12012 }, "private":{ - "enable":1 + "enable":0 }, "oled":{ "disable":0 diff --git a/ognbase/version.h b/ognbase/version.h index e4d6d61..0027328 100644 --- a/ognbase/version.h +++ b/ognbase/version.h @@ -2,10 +2,10 @@ #define _VERSION_MAJOR 0 #define _VERSION_MINOR 1 #define _VERSION_PATCH 0 -#define _VERSION_BUILD 24 -#define _VERSION_DATE "17/10/2021" -#define _VERSION_TIME "11:41:09" +#define _VERSION_BUILD 25 +#define _VERSION_DATE "24/10/2021" +#define _VERSION_TIME "11:41:12" #define _VERSION_ONLY "0.1.0" -#define _VERSION_NOBUILD "0.1.0 (17/10/2021)" -#define _VERSION "0.1.0-24" +#define _VERSION_NOBUILD "0.1.0 (24/10/2021)" +#define _VERSION "0.1.0-25" //The version information is created automatically, more information here: https://github.com/rvdbreemen/autoinc-semver diff --git a/pictures/TBEAM.png b/pictures/TBEAM.png new file mode 100644 index 0000000000000000000000000000000000000000..81ad3c5b75c36494534bfe0028ba3658c2653020 GIT binary patch literal 55276 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

uPY_k*&#GA$qKLTf>M68E);vL&Boy@?=SD1%!Kg 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 literal 0 HcmV?d00001 diff --git a/pictures/TTGO.png b/pictures/TTGO.png new file mode 100644 index 0000000000000000000000000000000000000000..ac826e7d23d38fe0ebad4178aff4c6b040185193 GIT binary patch literal 54358 zcmce8XINC(wr!yxtrA*-WKfZuL2^_KWE7N~bIwrYQV>u{A~~xFNX}Vu4h529k)bSd zh9VSiRd?Ta&b_zK`M&q=_udb_D)z40?7h}pbB;O2SiFC(@{I5X^$iFFLMSiySPcTX zq5^)be!B*ae9U*41uxf~H|KISbul-0 zaJ6!D+rHW;1%cdw$UlDg(lccP0o8kTxYW5zp)Ny;8=HO=-Z!I@I88R#r@&S9@%M-a z$6YTX6gXUwas@LY9D*DidNl%YeFZ;z)_I}!=Y>~})8-hu2+dMM6U?`fOU^z{(nx_w zSPB&ByH&5Edrw;6_glAaMbU~f>DA@V-@kY7o=Jdh26Sobh*oJ@s0-37B_`G{ME&koR zcQZcxxGcvV(amz`;DBYr#-?f~+$u4~q4FKvy)_yF+VxJ}(!%snzE<8+duZL^lgE#j zXOYXxxMshpT&wmzf7RVi*V>JzSI_^l&hKg33J)F~xY?R$wX)zm$$GOS$8BbWPy>%W_&q44DdjkQ287#kfK$oz6QddHL=i z(vI}WRd!2HP40!$2z@r(Ht_WJG@H_lr?0m{_o>^RTion~p@W7p6?XStV_xPypFKzb zgX*&F1Q+6^n(?)ZZ&2G)X`gU;~LztHUiT}V|Uru*b;F=nTAcR8S0f&`J$^iG!rf{oS&kjy=>1PulkBa zKD;06Q_<6I5jTuF>z0XK78m>jvrf1OSHJe=$O zvY}LG{lc`9p^O5H;AwRA0#m+aW9MY!)1%JNQTcAuZ@6TwF4tR=!iFzLo1Eap$1AE- z0?{91UODO19|>p_U2yh3p$=}Yu)XeE=|Gq6UmoyCifv8?V=~VDL+D8P+RQ)TIRfeTc^q&qJ>6jitrj~C}%nvAYI)`T5`3uwVT7%V_ z)sFb}W}Nr9LUt`VpT7AtNuQk%WkGv2`%1erw_Z>i{HhbCks3r-fNNB4qKZ@=?`VlW z&FS%0?1I+CXO<1<$FHWQ#ghcyM|4Kg*SovB^&0&ziu@hNl#iw0)ha5_Yt)!bOias* z6hQn)H}QtKEp!W-LU@P9RJ(RM+m$Sl&B-^r-}9WPFH3S z`)nfb-@QA>H^+SEwrAy4yL8E&H&I$kAlVKz25 z98*~o3OjE`8s=x9NmVBzFAo}*MhagE^zMSix;%%BV{t)!t6yI}9cP(wm>i9{Gwbkf=Ho8(pn&qut|FJijx}_`a@Fk0C)7_0{G{rdD>lO3s!+`0E(-`;&Do ztT~r-H^j?su$DU-Pbi+8|1~Aa1bZ=L^8*?pgwAI zD?S$1%!o@#RJTn9^0_?cs4a`v*|nCb1#aB z+Oz6M(1-Cio*j(OrZvJ`4+O6D_7 zVwp8fJW4A1NyO&Q-^w4d zABu;E(Owx&C4K>ezV?C+oz(FcVzW7(wUm7P(XL+49NWX5?rOAhgwOF-I|7mFveFYJ z4a3wuFa?hu1>@FyU7%YkVV{6cT%Om&#_UI=`WSu0=AJ@By#{yn&MgM)x(tJkaTLtBjJUduQT!m8| zuTq9g&B`gY6;JN$>^Qk;L4qS`pDYK5Q}rYZ`vhEfY>ds5+K!pl&wKZ-3)UU1oQ(EG zi20w+Ig^l(u=>!$nl5J&V;1UNT9?vSmg)X< zbWDVwT{Q0aS*`ts9ik+#t?e-_`U>3Z=4}!>Qdix(*|K$&1iyyG^%L{*T6?RP_Dl+} z4~~~HOWBIKijSJkV+q73xWgv;{`>cIR;?YW`F;a+O>X@F<1(CLGxUuk-%H8udht>J znciLweZLTrXKHFBpk|r(hoOFq6iNFW`421+t|6Pt;jU2E44F4qVC#R>C`(@|s_urX z_*(TQqSlQc>wIfmV7({kVcZN~^xnea;wSrlC#%TeLd4v{(x&n#d#v@uXQ|`{G&5qC z8J=!2a6C6Xce%6lVom4n=hXuW}X14&?;g*KiBd*_J2eHq&X>9x9{6 zt$4EsQk>0nJVX!4NpAO_hSQ)%VUWWsffMzXMfJYmqi-800=>hjNx|8{@2qhJdh&Ji zzpvq4wohsfTjyea8F_EBsRO$JoJuq3SOeB)pG*J=AD4 z`7|mhm}l#)QRy)E5Xr6Y=+i)ia6a|E@J_Ru!hPKlPQ5!OzT^eBX>V_5>a5gnc_c3< z*X5LF-#_EEF;fwmL)sb5VpxGT99Aa+#W;C_@-qX{w*m#NgX(W|mY)@=;qZ^8I9Q!!15-rZQwhpxdn^?|u zGpI6rBPor%mA6>izDm+^7@ER)`{uOA#y9QgnE8><29liPMP<-Aj2>}XLV{e|kogZO z7hK{vE=3T3VKisg#tZdL*N^BDE74Y?>}wAQl#a#rT8XpHZ00HnH>b+8z|Gt1(WEc))Pj_gh1IJ(3iJr+ebycbC5P`3OPcZQ9~^wM8D&5BUwoWp zFNO~_`8EHLst0y<@iwO+_f@yVsF=9u~ zSMRVE-`ZA5`n8jg6{x-(OsH4uHrZgwHVRe?CA!BcB~{(QKy)v;`Tcw0Vx0oY;5X_? z^NXu%PeEiT9Y>G*Wm;o2sbJ(foVUfGsHel9I}WxcufkxkTDR>tqZaN~v>^Lk@-r|n zocsDsR-B2mBkzf^hI-g$r+P};BLF>^*j{4--S+<_K zGG4awoZT0zsCzGSweITIq!;mw=4zM^3+qBWtGxxs{4scz{V7b$LUDYKjj3C^v5k$= zXT~>}vfyT^(q7lp)h%o;`AzQ&lBe7gw)-{-R~<&MgLzDDocy%cU52?}Rhx(uN)_Yt zoN!7Kwhe|h2OQOMrTc#f$$OQloUKAYBYNZYf~;Yde|;?hEq|Ct^WC;iL-V6P6pFqo zF*e@MJiG7WSfJR@&;lkBA7?+c2OlfI#k-c37d@#1I+FX6nwpxc{b}urJRU4At=9~G z%?AGDMx1ya+7uep-w^RoCM3LWfzUJ*@SNCjTRB`G!)E9zNkf*_C}nvt`u8r4PooU~ zO#%D2)$MX|$0I+A-S0@s!7{Vv?`I|GBGjlpD1R6^I``nd9VV`>Q&cy2GPSq1**$~S{RY`6W` zNWvA&G6~xAnzA%8xhHvclnp}vhp;{S?CflcH0(`a2=R;0GH<50V6y>1k2~9V7dET* zj4Htp?Wrz2cT!MLFxihQ=u6~FjXyoK9GKnq`tk5WTu>Ntdax0N^rH{`aF3ZeI5M8A zxxF3lb&J10Hh2d*K?fV<6CxYA=CO$(VsLcK)yPq5y>>Wx02f9@guD$Z^Iv-EeaIkF z-*m@gd(u|A(rnU22l`8{m09&C^rw+Zx~QqN$4S?%+QW?}^-sf5JHD(T5w!B-mTRW@ z#*9yQPbY+j!$o0(Cf5k*h`!<0U^yL#$@L-vYUz z6M(@y0lPNVB;0GIPFwgAYW38Ro42`ELwOn(H~CCY%-Z?W{P*O2Z<1e`SDP`{@T-l( z@jKgT&(6!ysUeXypo;op_&Phyu49Z&ykyeus1&YSxi=E63gPwNBU4G0g73Y1;#>Y8 z;MXroi@vnzFX_3ja-VNCm%5>LNp9YL=CpN=<{Y=H(4pGv`HlTmei!KRmPJ(Ji=TVD ztt;$Xs5;HpIa2ZYTBW631<_pNqlC{A+TK!0CvH7l3B+h_K1e7s;a~a@$5nECe7W~b6@4OWWkejbnD{k4Jz1Q4ONKytrA?ne*I

s#j{1rh!=p*`x*{Fc3>L`*EjreZ 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%0D+{*I>O&r!#!~cuVqMlGBh?E-g7XB?8h}e~y7p z6(yx_mUBQC)p~QBrQAL}oxG3aaoX9rdxMPCC^u5KC_Hb>w+FN`S{H*iQc_ZOxV1hK zufhlR1x3hGz-OAygF*#xvq@Q0T~0z6Kw9i8dw&sqfSO#AmTUmCt_ui0v$;1{^9@Q; z&e8kRy}j`q$5ml4PWBH80IC~Q;!;phKyI9&U*wqJ4g1Y_+e=W>Y%<(o{S4wd|Zh+r?&K6|(O+TensX$Qo?iFjh&QeR`gtjks zecIgrap*BBn>$HQfGB>53EBUJ$aq%!GiI#i9h0vJ3@3_4XwNFu zJ1m*^de^B~Y;3_a^kiNyyj?{cJpqT@aqo|p0 z2A>-61ay8tt3j6wp(vb-1@P#52M5b&6}rSmE51mnJzfa1KizUYBGp&a^Y_qr?y_-r zSJ#Y}G7wOWK<6GvNF&VW-KPZvv$l&&#j8%D+!0h|7G-V=S3XeibZi_;8+CCoYF)Nl zW=%DU?@IzWJaCW`y?d}@2AFgJji#hRcB8X@r=aKrqy*3d1x~|D07eQ~;34)nd7Md3 zN7D{RkHl^VeHeyn z;Pc&9N`9+5@MOWI^Pv5iYUicOG0^xN6NR=vQnKR&L_>EemeK%P55HfZ`KnlK4=;h8 zhHmiQKanAK>BM*X)Zx24IuG0;J$ddZEv7?uUhHj>$Sm+ zGVd4L(YwF+&UPP3NridYKX{e*63`ic@gGKwrZM_wG=QuaWXbdNTb2VX%Cnr;pMLPI z6-B%MD+0vTt($5hU!%6+_m0-lJazDgW_>RN@0dsH=l+9?u_RU(O^wW-%8VVZ?Kc!r zRdeBw6#lLX1l(Pt$x^^?pen~X!Dt0fsAuyL1U?G7v6AbjGR~GasxTAF!B$i)!rj?E zIcKOS2f348CmxC%SOOuVU1`DumPhYSRK~{Sm8S9R-!q>5Pyih}Km4~EV+#jS=U)+| zO@7CSXPqAQ+Qn9UMMN|`wM7jUhtD|p3ur(L#79NZO1LFRUxu+T3kkJud04WroXvqE zu(-9Q@+g3*^9Z!zIM2VF%fb#<&NYc7ZqbFqEg184p(%1yjH04cirgOKb8DEPOg7ic zi=$(pElQm3v|{mZeZEd?nEY%Xx+`B_N3>x54Zrz!?Tl;oVjf?O1Fw~PZE0iMx8B$f z@4D)<rW@h50XrEg-mfLW>A_QXBwZo`4VnRd2G= z6kjo}=(DS*W*oPU(VXqd)~dz!(pcC>8Vh6`T}U9Q4DzEV!A52`v@>)07MY9HnAz6D7eqT#f>=PAI~psrY4(< zwIL9MRSzzks(Loj)vr|6T|7KiTPL?m94~RCbgLpB%7&<~mryGuOR&l61L=AjAQvpD zreD`s$EbQA5PD4u+sBY%^J$OOe#0iP?6k+A|CI@HjY}R8FxcGQnBkAk<7qnBKg?Va zP~A5-yT9-yRiME2UxBp*YR2p%CdIfmV7{Ok9rka3`45=qQr2dt|DmprrxBB6p%=&y zNxuYiCf9oUvc5ua!;yQd>qWQtVBCN}L!JlSBnoH5dRu-XWwppk+As&q9AHpj!(mPB z?LqgR+*sP$O3S`jJ*0NIfG_xY9~m`=Y=dZjuM~OqpCpHkGnfP7JT^9E3VFQu^;M`P zrT7+|zl3+pO$u&)_YMLdpMS*;#hDs3IxiJjrVASi>2`#hS`MU{?hcu6NPB+70?4(n zM1YAwYutC}-PdESuZcO2t}x68>Etl89#r~dJ$?N|ai810(x(YPWKIzEA>!`um)Mb^0w9}ErZ+p?1X-wGjv9I2X)|K9 zI>M%XL_tl`m%JT@JmG2lHqG*~(LsN0yde2YLlyKP1R&EElz`>#-rhHt_78o@0^$f3 zxTEHuL*vX}dP*1z`{Ifm*a!Um#$-*Zua|G0DwZHiJB^x4_s1l@{=`I8avtph=1A6?5MASnc>xWB=wc{LWRV`$J-EuS8)dyO>$gzaEAQJx4i z(!m4NZNMem6WPGiDAKZwz@926@7mQ7ou5uS)-=q{ zI%qfv3dsE%JqRa+B~>H(bH~g4=a|Yrs_3fN*Og5k{2(eUlh;#HKo>TtUR%(KAftxfoB5%_->S;pb0o} zwgd3cMziO7MGGFK0Xg$-e+wr=SbXxNBzo+a`Gc+_v^RDA&V|(Adt&;I%y>i6n z=SL0u>9Vc7BDm6EAuuzE+@ga6pgk1Jqet5ew2x0bh7E2jpk4O5Nihh#6o5j_-2U8* z8lwXCi}NR;sG$rNEG%u^|3WL~av!lfg60X+Y6;n=_`SxMF>)-Yv-*0pQe@O*4H#qR zku!$=3}_@h>XEvRwtgOM{cWI@1orFKTCfU7Q$dLSgqJQqDjPuD#T9CGCsm~H0#u4E znk&>UNxJOM${y)t1*ng*zhXT$(yl%5e2*8(2oxRPV6i0@)dkQ-V>`}gij40fB8)pW zL{V!5G<+YJ-@M^WIl}=?v$!wB!otD|c(}awdymI_%L9-)l|}~%B`G3aLwyf$K=1G; zYW-EDYyTHyb+ejgmc0;lMV5H=-p*2?9r*C>Np(%_;6>)_eI_QHzp$!6H4N5p;wJct zL(>FcRiO7%ovxAGR)}=ax1Qa&PUL&c#TZO1C>WgR3JTIE(tie!8sqFv8#-o`*M#!8 zWNQ-poY=Pb^Q829UpM%Hv4{YQR%)R5;A)Mf=nkSP|D9IKCKez5$5{MJp$ei`=MfGZ zbEYRB<9GKD+Z(N3oF1%o#}!Nu9S%3x(@a%ZD}x{dwx%w(d_Z#V0nir1`68fjf#>;G zPiIiw`uZMh28fp<=NDR!&`&t^pC%*I;5&ALe0)(rpa5X1=5HaJw&Nr11e@ED$GSZ7-$0- zzP`RY`-kS^Tif4LLg!@tU>IRBN376_68|i3d6qSGrdc4{H6)Yq>e z1g&yaqJ1_ME+AvNnD?%F(}7uo`VxT1=zA;0(DL;i69|x4`}*?nTyZXYi!Q~gx@!X9 z2C@Q%qZs_nT4HiQpBoQ2bW%FfR{Z@{S8yQ<<>dLbH3d&A%PhEWBtSJLfLHX{qV4?Z z@8XFA9DyrKukzm4xdag=3tgQzEdO2~@fRpUx4*JJL`??bF*K-llQ8j1ru{pfFJv{X z=b!bvUOFmSVC&%ca<}rZB3X~*s_m8-LYieUt7x7!=G%!eeS*R7|e3)c#>LA^iuYG4nL= z;s6#R8;L!+O7~!5zdzW;`H#Tv8l9t?CsbysqI#?azlF89q}F*1W~sB#=e-C_RL@>U zQv%GP?dzg;aNzTb4!+-fdM@FTi{okLq6x;|c@cv0&vFapx} z-lIS8Q6gV7`H%~L-%Ksmt8(k2s|W<%JMI6kO5tBTT~^?5dnkpM>x{U>=$fd_C@f{Q zAkBP)#`IleWMjegauj9XS0+W}aZoRj`|gGo-gYNlFJ2aDC$93GfoLvY&9L zccF!t;=f_Q=69BdY)D2DK9Kj!X)su0^#mM0Z_^Sz~Vo?7M)HJL-iK`YA$k*9t!zZFQ0o}8ci%UzL(LY08CF=eiEl$tw7a{`e@XBQ2k#` zrp11#HyPu07S8b=J4|$CxUca!w0u+Qb+EhuArA{VmQH!LO)ohVlvQ3@+aT(Ff%PGR zHXHujfmsnkE9LUmLDJ{NKWM#;&LN9n;m-QjA#x7wvLgZd0`jb} zfRXt!6KIYaT4H)6<}sg`owQ_FZdHrLEO)uNBY?0cr=ntUKx3N7=R?$LNN-n!b?!WE zJiT%C>@d?!Mkd&KW@d(!{P!l{C*R%KF>38l4x<-{V~^!<1_`1@XC4GNn_e|9NF0gu z=>kxCapLjbJ!R<4=Wz76{H@#DvZI716_uM&SSPvSr-|DBWu>xd}L zj~*2yrmgd*3Vs8(>BT;)9%!_4RmV%sntc^wSo{Bph&%chv{f>r62iF$xz)dj-uG-! ze->AuC66UKLA3iz`P06(9WN}g*t8^I*yHzaXaMFNg>(bS$x?USTK}mkd)Ydn0ye`! zT6%i=#E8)^`np(r@rg;{r{FoB0vS(#<_p)hTGxulcn1 zA#}+_FXiH*;w|nSBqz@Ny8638MuSY9QFhR(*5?R2NadF{~)Agv(%=_d%q)h%_S*fuv zh+Qmoiuw>MA}+2DTrH2%iNDBB3nh+)gZl)RL5I+n#(Q~tt5w*L1HGcSAkwPr&3|3|Ki&bDA19(`j^lrK9!mJ_cEWxu%Eg2?ZsV@JVst^Updz;2iUW0IUjRY-*HHDD(pb$5VeEo)CIR z^Hr;tWbsRjSiY7xhD{b61(B5!N^!}Hc=qNT&G!7WOvIP#ckbMQwDO8L?R>2N2h^DA z1&~mnTv<0xbDaX1&eXxE8^35H0kUsTrGdrx4{;{@xGqJg3*rAQ)Ud*awO+k4*{Ft!cyCa`^lIBc;RhH!(;;<=&GhW7 z>~j8Ye~PH>Wz0;0xmU#>3l;0~`asU{lkEUc!@u-{q5nl}^x&W`c}<$VxEiKYy3E!< zqqLU3?oWh)QdH5t_ZPxg11@^lW=Jhs;f!g@XzxYp-*Ow%80)IPV{H1qY+JGd9u#W` zo@D4ZUriAmDbkJq+|=ae4oFL{{nTCB%N2@{bVZ9X|C68bi9-95*NCW|mI@};R@eym zth$|L)cto~5kFUN=pk@f&#)C17WSn|hORL9DFG98Uy39?g{39E=VyY=>GEs*jjQHN zdF##qUE~;6IRu|tls-1-av;=(bB*Q-rk8@29My9VP`xJYm;uaech_bC=rDk9n({Bi z@jvh;q5NGkz2Q?(+rKuMoOXk)G+^V%!FLr;EKWr1W86Z-BW>`YeiNF^NC6{4ny#MH{eEyq9$UP=@T!%!4g1%hw*S!GS{>89vB} zHFARuQAVg1Jc*ZEAm`5ZSd=;c+A%&o+&YZZg64vf!e`v`lDS@hdm3%oF<5C>G$)h! zfqbIY6d#lZ;PSB49v^h?N)>c$egt?*pFN>7vgu3u(RyR_xtK*sv~4x+cUl~MKrcq|_Rtc^uTC^LT8S77pv6^z-@kT}bfNu4>9SWc401tt)qSWN=04!Tm&^`hV zY2a~I(bJ=a6h-)l1D$R1tUfA14j6nA#r%TnH>N6Vu|{UF=|agLO3kHHm8lUJjNJ<4 zZs?b4oR$dZ09@67_D7p}-cL?;-P_F_bz7ed1&SwViDSXGfyqeS0u2y`%7CWa19U8) zwnzOrf%|2;g7d!u}tJT9({<^fNW0OV5K zKLx}?ZY+o8q~<@&WQl19z`_1LG&IAkn*`OP7|-4wD}CuEVzwde^g2n99)2)^Fo1R* zZSEW%u3XgY)9OSs+BX_Brm-Xm;e2+^cnbP#y1daO%XLa26Efv1SG7fsuhQoj5WWT* zFF*ne`4Wh~i%xoliyLzvsQN%YOB8dy0?cO4{9;K|Wvh^%zjiw(>m1W1zh?zca!prG zVtwUK%t6aob z_UDM=XM4M^7hldl1oo!u*KbFhpD=vlBL(`smO(XXkh5{3XNWZ2E{k8LVm1PaoV-OC-PgTV$o^#(oBGsgPA*23}A^u+_p(nz^Vdf?I-IRT)=_+6YiC1SF5Vu+3yI&ZsOp^?1o4__N}rcCZrj` zS35G6)T-oUQjGa*dvY^|)gT4PPrV)n*o{*_1gDf*#!_BD=#7!8_bxSG7jhV%7=O0! zRAEELrS=xMz!t$4IpE%(0d#mqr1ZjJ6eAYxW?oU)15R?(RFbx$j>UM?WFx4HW&^lw?t&OmGm20N6wXtk= zdG>~%7y`PA*Xc!$3X@mO<>cgQ&eT53;9z~J*nNk@u|6LGx4>t)N&xhw62DHBEgt3&ZPi-NIWI*PvvSVTD|XPTAjuf|1>VD2#e)F{%yqMx>o z4in(ZlaAT))Ug=*l4t`53?5Wv0F|ke&`~A+BI;;rGT>#HWk-Q3H<^XtrnO5m4pLJgUNU5!eb4ckp`E-knFmrQFh(h-d$lcZ)PF>l8VY;tTKbINZ_ zk=%cWYt5N?RDUl{hcS*-;k!QPtxS*1N=~whw9QOhq%YP)0w^%)XM){PvJ8W(5 z>{Nmw(n})AbwKoZrUqp?+b`pCQEDPb^m0X*V{VISnxt#0Tc|@T8KoU$UL%eux_6BE?Jy6JOi9}T+`_Smo&!~(THvJ?W!MV}gbt6YrFm@tt%fAfi_t%$~e|70P)`J3?=VY5ik&?!> z05`0bD{Jg-o=tleNnZkT%8&s6$-+-#NKYJ_y458!GcztA^#h71To*@FSz{F(=4x73 z-Ws}%ZO>Kl)E#e`PJW2JkC0^%7^J{Ha1n%m?(UG#^;`x^L&~vv_0u&V$r+z~~ zXJq=%+$XO21^GL6m)C~_ES=e;(#p&0`V0@wlLJom6eml~MQNaEx>XJt&shon8XQ)U z(eH6p#9i8*1n@HahqXdB2h_o@%AvL+ckBkQL_F>MS)&W}7ja8iF%I>rGkH>fCRghm z$TB(kvM9?3HY{+NxsEXzVFm00MrUg4a^a4Bnt$?^IhVwYsPFRkSszaf8@&U(tFLeQ zf}#O$YzX*um7)~PWyA32 zHEL&RtIOrUVW=e_qNlY`V&kG=1kL6)`<8vsFOzg8cUU1BaH!Yoc|}2PT7vsRdUV z2UOm2>$OF1*ahNWXtI&r0Oy<-MQgfh4Wt@2CMuFS8ZiozmJ}{7E|AT2uU$c-o#)Ea zb%+pK2Tkno0 z*f1PB*V_VIa8cY1{$vME=##g&*gM3u1Zhfz+&v~~8jyai?{l<92^UbL&%z+Wn?lTK2xtH?e!z;;Ybz ziRV4>Je?&=()_kt5+G$L-y|kZ9pB&Z6%`fLQ~c4t1-ATwH8F3kZZ(`cY74t8#2ks2 zbVe?Xm0LHM=8fh1Y$AOSH|j1y6wN9{Gpl?~kmtKsWzQlmo;DxQgd{)X?>L z-ps}(ATyIGE-vnYvwQnMHVw%9{-e&9jD1{bFsG#CWLr7`0m0E54|!@+J~oBZ2v3wc z*E1`{x;TB-fJ5Dnj7?2t0cQ5vnZL_1p1)EiRqtF}#p2XwrHm-$>Uq9ZP^nleH^4MV-KqDg4K;|{_G|Uivwm4KRMog`#aL2Y=cnkatBk!o6AT-?+$L#uf6W}uXa zYpg<=nWb$D;j~uwGJBwB}l>z-LWW7Z+Dh zd#)|lkMC1(f3^2fm6$3wecEM5_Tk5_@2v+>JlV?QHjOr$VoxLJvdgx)Q^lhaV%ln| z_jOim$AX44>Qoz!%Zul5SkDcvl-nKiWvir*o%`;pNfd6;;~DrEkKZWrzYO~Q(fRhx z8w72gbpo%MCFsIGu$PBFY({}<-9|6oKlqCh*kpQUFV0Zo;xewjfYGFt@{U2fK6>|? zVQ9{KwhO5NT@8Lg!Az5&8=MKkA=~#De~o;RjLuSF+&y(KaK+we96f!$_AcS!`Y4`J z^CA;a<39y`+1Dz05Z2ensqDwd$k-FZ9iEz++Rw+MU;eS9Fub^;g6VV~r@#~p1}oW( zf_SwY+|MeTQ!n#$f@UwIEe~s*w!USp9nvG}ed5(J6^zXfeVLzTs_pJ9$VOb8Fmh-V z8N2*Exia0Uf0C$EVYB95XvxXR`CYAse?0mVG!dhgNWUoQk z-DN*Yuwb~|w2<+_ccikSzk!R33pI!cd1af<(~FQ-W@100MEt1V8|B%6LT)t17kw?Z z4QknL1X=hN8KoSOX!FgF9WoJXeiRCYHzv#~qOYiA*46bQj8Y&D;d2}n8`}=tzHfd= zK3o8f+?BU?fHUe5fZqYx%6A0>qQ56--Em~gwTWdH5fvL^nOCRnjYq1Tn-{pc9UgrR z)wHyEnHL-sgon*NGkaWyDhV>-HlyFQn%}dL29{585~OC6&mWN2xO0ThNR%6ZjmbDo zGksz1c^X3*b;LA`Lc@i!&%poX=mHSR{V4M#yZp(@jhhr9w|VOgcAhp zU&XPSnjp_qlb;zTL_pQlYvMeWk@Q)XzQ8B8)q)4F2yvWvrzcZk8j|#nrN>>X*CfhktsFpH(c(&Wl?a(JgZbcd{hl5cOxJh!hxLK+$M* z|I~(0M1*FM4!avI9Jt$ux~B^hML2L0xlhAJ?;H8R5)S_++EqER zvgn3m>*aum5I3>pnkrKPAI9@ramtByNBq%IQQf&E(9)}=_p*v#^z-LUGt1hVn$JHf zp>^I*8qX90QH=)-4Y|4#`$pbAO^OVMI%0`c7eZ+(wpG@(Wd>-VWZ$OXBzIda+sAmV zqtmcL(34Y8K>xiGcBU{u-kqJ*b_kqvLe?2xib$ILXN7boX6Ei*7B;5((b0P!1)p|| zJL&g*=5oc{Ni`bE-B}wTO%_vLu!qWPwRbGd%*2!ku-&e>qze$-4HE8*D^jt%Jd8Fo zms?v~8Ch6pzvF0WX#wxJa*xLyG<>s_M%<`(o8&yvfm)5frdE7xQ>8Hd*PDZ>PR@== zubr&0cnQQ_8ZPI*Hxfi)-H-ZeOq7DLnL8S*qG0Pdmd`jhnYNoNOcGWQ#a(EOyNs%$>H^lEMVG_Ui_dN+N3 ze#uZVLy1W&{BiP~0Hcgd2<=j{vR1$s4Y^hCeZiiET_a;*Vq#Lk=75q*#4i3ktva&?kw98Sv9}Nd? zMdI?}hKeN9mCR+Bmq?(xXUVKP=Jnrc~O(OX+f+0XOE#98QAnr$(&uIm+cL{=g zCMIL0ZN4*a0q3L@#26YHif^?=f9*4<$a)26)^2ErfTcjNr+hNf;UguZS=wXGmZB&s z)sZl|7rsk<%8aIuVGCXOQJj;cys@h(;&b>xP5W`yb@j`~4i7{`ME;3ZI96CuORA}3 zJ1TUwH24$OjvgYIta|l8hxODwmVN}pGGO1gAex#wgkIGSqlW^R-@_u4J{rT`?++&E z4x@r7#4#ADSVKZoi*j;vXDXuDluKBBY{#8dv(H*W9@hp_Nk@>}tH~TGg2k2y(?l}P zbO@5gLZ|esu7MwaF=4lHwP1K{q9E8}cAUnnH6hOxsqT;EzyM zLjM%iqV-8QYU43nGId`%jTX}13{;KaO`J46sA%o)55wGD##2fCv(o$AV-Epj(3p<2 zMXLq_Dc94|h}asDhlk8g3YP%``)1FzcP*{}=wk zPHSdvZfYJyZ9=b#OH8a~hWz8F+i8tfIz=D2A)4$q-Z4GJy>>&|0gFn}76($qvDuEx zwj+yusoCRHJKH#~2jVIm1~@_l6BFX{usMQ)w~5P;`;U8EbvFZbsR-Hi(TEP(>O(zn zNY9L?sU_ZMIYoy1Gw|4~&i%};k_EaG6LSv(;2aCM4#U<9&s+TYf3@iMfF=`V12yaV z&FIbJd=5ZbKwv3hnI0Yq+`1!)#bCTk;#pnhE`5(U0s&fO^msg z7E0x>`HyW@U!ScE^*R<|0;fRjZFs$XW8!z%6At?i))&S_kJh<;fwR|(1K7&9xx)=T z2MG8bGE&AM5qhw=Lm+aU=x1Tu&7G}nE!fy_YD4((7v9kg{H7KAMDnrD8)hISSgr3; zW3Z%1=xiTZ9~@cLw)acPQ3239x_<9jUWz1Oem+Se4xP!)UndT`9Ii{Zt(@RjuUlr< zpStK+&U3;3@b%8YeLwzFH9D{63C=83NXwNg(0SuZPc$G0XEcTw7w60LxiZvN(~g$O zCa+RNbo7OQ&B=2-`zy1Z`$(u77(YJPTk4;_Kt85A5zLHQ?=G~a5&Gy6~m7V zTZm9nfr(mhny3`$`Pt4(T_fgFS&jk3C3{?4n;JR4T2!!vW{e)HEDnc<=R31) zF*d^)@|YfeNDHP~R2LoCy#o8d1&q)q7-&L7Mdgw66gLu0h)76279v+!q@2&r84Z>C zR$jpD9!$E#hunW~wl#ZxIbEJcAxqgi)mAa8P_I59FzI=THTFALE^|%=@AhIV^ap#d zORs0G4DDAaAd_XAYbf3T<$XS~7uR|tHhY`5M2rIP9h+0t&p{X{7*S<*(|80q)s;fb zBB*0X?|sL*{Cm!~J_E;7a0E`Wt^C?*YR+R@TGG+eu~ttV?UH9?X0jz-`7u83ceFl0 zws&BT;p4kKp$UZqYX7;*gdBGf@g@cJldXj z`|W1sT{&F2BPae(@TDarCDW7=&tuQE{VHp^%x$gL@g=S2dAYNCkMn;}f!KNU2SVFb zqAjXJx#DpQPg)wLKi^x8M;vmpgSRWgny&vMrx<%JGbk%L^4SlMUEwe4Ft)ADn7Oat zB}iDtUIQoMf-4pVaERHiB+=0_TZEi+n!LqPtFkP1G5@<_Yyr7+g|_ql7kHgdBFbFO zJU^Cjku~}y<%nYQuMI}-MnBA7`jVPDJu~yQZ*SG>PBR=QfH0T;+K6W+Kq;-(I!T(a zrQZir2FJx|ygsd>;FLVJxU~*ZxybHh0v?Ntg%sksAdwy}!7jzEd_#tiy8IcCy}X&l zL%ZSI%q%RPUdk~e&6TjxETEVw1Js+BQ}?+N?9$>e;% zm7~O5ycb*&NwBPt`9;*0lwHIqMcu;>EoRUvW-qbr{a0A-#hcZkgy-I#gjmO@n3%sR z<%d2ZL*Iuw0-(AE0Uy_@oR9RI(jJ@b%9|1_vV? zte4FAsHqVZP)EMX(-_ESXHn3r5j~? z&4n7j;lRoe)b(Iwd3z(a?C7E`J z8$xPCB^aGGwXTmfVuw(*4^-Gq{Z@N6g5v_8rpYF=8k6$v@N z0t5oGr1|&ty>+)OEiG?fMIRl>ue|535q8GsYPWQkAzVUeC;~W=Q_`JeBqSvChRV4} zOiZlS`eR)^ZWw-$d#dHau9a)=R7}ZO{`Kp0Hh2GL&M*e)!Oxdev|ZhO6JAVs2F>K?c{SeVzgI9-}Gii>q=JOqLc_P=_ zI`nPVb9c*DRjeOVk-to~m~}L!{T->#sg2r8MgktR5Io=aP5!}u)AP@dEOSv~J^`uh zk$NeNr?q;c^{2oeMNt=i$ND7O?-c?Lf=^{;afJ*<4ef1h+7gp?aKIeozDt%+k7CoW zsU{Q6|CvRhF&|q*Yv8=6*H1UWyaHpP^oPnzp8oNDy3^e#8SiuMu8)KRBhP{9PeCT+ z!B%9E6fKp%rjqR(j*bkLl$DgseoYBGgO9!Ab1m#KqI$YfTCeZnx==TqE;G>_GU8VgHnzwd1x=D=mDOlzRhzb*#>CXg@rMq^ZF@YOh%>}fNd?Hm6 z^))smDg<%g1*%N=ivIxJiB6-`2hJi**s-oSODviTzextXFVEho+TI&c^YNeWK< zBKFVnbKP})p;Xej`cuQ79&6YmNF7fOm@MaA>H`=4!tDn(BerxnsuG~6v=zgu&N&>( zjN!HR`d=uWU=YPJp8iTaJ14!*poYUlvoTA36yl#y9gi*^7=~4Pacc}J5x0al4hXyh znXUu$*PT*QkW(GGoG7WJW2ZouEmy7JRcCZOU0(Ab;3;IQ4Z$cI<*K})+F)9RYA<8^#$s^5IG(QD zGx__YouKF9ij?L?Ug!`CE-Q;3U%h@+>S$vdCjnWMWmkxrv9>w(KS1%?pfUPwdJYae z6u;Ap%E+3X=HP2rB{wknxYW?He@$JTo8+%$jgnKM?V>*%fis%FFuKDk@()koOtJY- z8zPRJ6AgF3Klt#6FY&+eFQ$A0qocj!QK`iRMv_)mKGmxfzyGi)U-RQV<0)L{2h-IT z8ZJsQa`F<~i$R-756DEim!|hv_w?Rpqf){Bzwpi+ml6%S9oiqWni&hun~V(=+q2Mw ziuH{5jk!Xr!2Gi9pZLDrvT|_UI~)E1A@>Q&{y%(&mw)FJe8&OBwuMY}D>htHn&ac#f@ph!< zz&}BH@LpKF2A@fXu2#esx*m=)eglI6wp;#BRB_mIFe6C#9X|n+FdQ)LBs6?e<;^hQ zqSN{PX2wJ@HG-6s)u2^0E*4#M!9>FV?$B@Vr<)z2)rgPF)~>_$R~CR%Bi%)PU;Xlf zXU?E&TP-eJd17NzSpBQHE+AMEXiMJw6h5;VMv^-Y6%~hvn;YVh%;(}1sXzRP%O9th z1md`xS4tA!YEvI%NSg{tg?8jQ7hsxdc5X~uzB@M;A>c$nLh}4N6PaV&c1yUrUepH@f;d5GX67^@K zI23$~asb{LJ2>5FZaB<}AVvEQnFFf70r(Blo?t|802kK#4(Zt#f&P(?N1Xq-3O zO6_5_we1Os=SRB3bT~QCepCweq}pr^^>)<<*FR?+0nq|!oYAWDiDaa7_+y~HZt&RZ z5S6Vn`YbQ0Lw$(Zg4&4slbnzIeE~UeS|71`S4E*}N+cqg4B0^sZ>S$4=yaL@F1&zd zC|;4b$t*@}puQ9E@qa3*X3@)<2qreR>hA7a;^N|9s7%fG_`=l93$Kl}lhbrfOr)R`Z^d?` z8sf2=9xC9*SdH1j8F2~Bf{XXzDFK_nCt{V!-uSXFJC-|3OVC?YrJ&c{h_yRG1*k5A zPPi)+5g6}+0eZ*V$?v~lJ6C(k3H)xZK&PhO$T+S)`)b5ZW>rIFP%v}NUf{3t@^lwg zP~{2D_sj*~7=1223u`7_aClI8`gq%9$g23 z9vIS;{wgdkusURs1)sy=b_(U8F5L|he!;T-%z~fLOxM;Gp2AsXwf0O?_SXDVyJ2Xy zGM<$G8h`dlb)~)~IqcjF`#wvXU#ITA#kT9tm8B42kQnLDWMpQp0dVhihsJDfMY(NL ztI@wFKZh19a8E89wY>bV3h7*ydoh%phw#M=J2Wa9zowrJ6>}2yW@m5n^IFbJ(EvZ_ zI_5Q2EqchkhaVXk`EKp_vD zb+J&IkD+~tXzixvX5qw_dKDU@JiEf3&r}@jzU$O;z#t&JcLDZ^=rtsFpz@HzEjYx= zRrrlKoAF&bjT+BjDrJ0b|2yKf#mIeWwBf>+^7*JLKCb;U#Ty?&cAv44BANLL6`w2D z1k>ct!~7X;oAt3q7%O4;Mgq1_s^)$-1GvU1~l8 z<{&)R8W0&A9=_$Y@#MXhf7u30fk9s{O*9Fwcd7MK=U{X>^~W;E4T@pvFF4QbZyAFxPkhy1+wNX=aTb3vK6y~(&c66EB3AY z@)B|?56TX5A-no(bn-%G?lhIuE#wL(i2Km6MT6X5PerW1JAZ5!sdcy&5fNdwxTXCB zg?>MRsxM#PkLAh7+NzP8{L&1J5>E+{JsIN2a;ZQ?ebS@gF>GKrMAmmRbNq9B$c3@2 z`+=%O-A!#m%e&k4-ci#4F&3u!B7y&*6FXpiPpl3$7c(V+Z<=Zp$$X83^Ieim7Y1*0 zJEcWSkt5fe^K9Qn%@gcAIL;-L zk%6_6xQ*Rnj@)ySUfCo))a-p8YkXF2i}P-Zfu10gPWje5A1s{wpH6?+K3QrNSDzfX z``TGADNWuA&pIAyYD@ZII9Q;|P<6VA1r@5#p7&4(NNIF~Hts27U(JC_ZccfQ5P$H$Bg z5l6%kv}*!{Z7RFR&|hv*_67z_k&(+)$P`>Q`A-9=(` zS~D^Pu?)WIvXG%eYy3Nikl~CP^2l~+h1iO5X z<*2|1Hx3?QRp(0+pheOXYtTsV2LEJ{IEJ~Kg^{BJg^BFc9woM4sYy|Pn0X`@evss0vxb%r+oKsSvNv%mGUUactSW%SY9HdefkcK zd?#HJ@3w_VZhroZ%9M2`bEsIRB1+iY%IaCN?9KRqgl)Uv2HzKz_Q3*K6t_TqSu^?A z@!>WF2S+&5`)Pm$zgoh>$Wx`_>OS_Q7MmS~=%8LInld;X+02hNld?^G-`4B*ITg6q zYk=I?cmq;N)^^N|y*;ag8Lhpw3288bT=Y*m>PS$5@bZ7-WJg&>#xZfQ)PfrgHj`l} zhe_|J`1ZKj1Ai*L{x3NxqwVc}aNuvW{d|QszLY9Y3<+p|MCO?vhAm#z)HM{{gn1QN z2fdj*MbyfIs7^Rvr%DvBNWOkAWH8v_|SHdRLs#8K%}cYw#6|U*a7?5 zjvagPjP!PQ!>6WSh?lj%JcRrsyDANJo0Z`g1A}dk=M~zhV#m}l^W~&g76+#?XM1GQ7}{4 zQ3938OB)K%mP5rkKWik>T0Oe{B_;VLIQcS6IXloQ|GjPU+^KSfV`RT`l459R@@t(Y zBN2amnVFSWecxV{oLZP!7(bI(VG0pT?r$*1z$wykEYhO#C7MMLp3t_}*UygN-+&Yp zc#m&&bwSgr2KyKqsMX#-*wL1b^rpu_OZ*s`|R2<+19~`pP{r}ed&4Qu9>Q-?6l$TId+T8{ia?&z;4GR?bQW5 zk%^^Wc_V&z)wSf~B?#@6K;{_M$j+6GRH!=V@F9bTrth6HNpOz@Idn|*8VFbnzO0O4 zC(d3QGqw-4E0$emNjrFF>z<9#~)-qP!UC-rID?J%b@4m9kK==?fxD8 zD0ZL&z(rJ!ZM|-RcyR%1TgOYqWmIE%@JyYD?KsM7%fy$^jb7!)z?&AO9Ea=c{a@R+ zzSozl=V-n+h9gV=WmV<47JcjZdewaY>IfXll4eatl7}^iiN&R?z2BDM=$m?c;)B?q zPh1;fX^gRM#bC3w)v6xwHa8AI5q-?2S!}ot%B|dKvTp3t@mmXdsYUPD*R|e(CkfM4~fCl^`$e|IDn7B(m@S2B-WvTY} zs!>6*H*To7s7j*+CegjW^azxwHa1$BDF5~UhC~79HUwy%^XY~=qBVx|lk=oMviOkK ziJZ<|TTK6I?m1uX=m?V&ITWFT4{Gtu%nSxPPWGqEL&kyQu)7FOxbAj=G=y(Xv92fT z!}S1;{qcF`<|>Vi@Y#3>fnI}x_U%T{Q9<(nhO1Zbdz@@{8M2C-vL}dAc6cOH!v8`2 zt(T|THmY6oc^H|#dRNuESgWDf{+Z2ReKN?=0<i0O#BMNlJ1e}f0a$pOkWXuz$U`=$$4&n_-jaW<^c9?B^ zyk16zowBi!Y1CjxsxV+bK3_n3!Zy`-4UeeiS;|M^mwVLrdgZ z>RZoSbyVbf|76d}R;qCw?cPZ6G$dmed8QXz+t47Q`$VkVITjm_K~rD<&|f1OZ9|I# z;^rTZeP13L4rU$nD!qDJR;BGP2hqRnN|h%d@UR*!xq~yew{onJ-oA-T1=8A&`XJr#g#ada{S$*F z`Y4#FpDIto)}jbr9W##=zcK&f56CfKs1zPYfIMZmgebr5pI+wCk9?_wg3rrPDf1gY z#ky_h3l|N1w&WlkRVmbgpxBqu()z(o+yjfFYncw|10Pv5Ta|hZ*ecKB?-uW9zj^Z> zysEIfcU6AXfWPO4aPB%enXDE9P3ifp*t*`&zXrg&d5X5!+%R!skaIO^rkF2WG5N$GF-JG(AX*BmxLsmaN4K6Ls|p^cAqbv=1P7cLsQM#>!VF9fl&ySVal)N^qhoc@dh zcZfQi|Baa;1Ws(Ds|fKKce9`%lkbm=(o)(!)QfYPZ;=D($kEitw_QJLj_sANm`ML; z?kO?PmZeeV2NFJ$<&u1*?_g7-@rb6Wt|-95Pkc6NhNLp`R@cxowwszhF(->_>FTCh zNk+szkCT^QUYFsj!0V|Wge=K8+A z5h~}lsT&{9`t!-cO$7fD5Y!`ki5AyQ#=gBOG?}#+&sJnWjG3sHv!TWy{Z~0s;w`=z zZVzVl3rTSbDvod%gYxq8Gjqt(XZ7`u_xm|lAkkzWWAK{{+O6tpk1T@B5Ub}<>)}@h5TF^r$ zfA*#KepT?@xK6aW)O#~Jd{`i9`RtAkWHnCq8cE&S(L>K^#9*;!COXR2&WFT@^Y^-d5jsw|rUpl`N>Wxw5+zraa|TPtcjyx`;)PBHde zXMf!39@j>Nj*StZGoO3Mmmql7Hmb~$Q&`yW2lbNAlojsTgM2B#Lhh>S{+^C-X>NO& z)?$3vxL-nCYia#Ah0$tY=b@0w!e$#5eB;lI)ejy(skt%pF$EOb4KrJY{I-c)F5ds* zD@tcNkg^}VTSQ1vI`&&dXlMNXl&-pMW(ExVnM%Ist^fCIvw?y zlbidqY+8P0-`;0RU!q{gZAuq4adH@P4YK2PhvE}YZo0?kmk7yXF0RgU1$-JElPcwjaY=g{zQ5PUx9l>eUk z^Ed~gziR|N8bPGmvoow!wjH!2%+kLw$Q z!)(G2z3=MpZbBjr-Hrj>K9-Q5O=HnD2z&V7X^j5A&=^4YVm&s!c<(c=AhP$7GD!~B zGzw-@-kZ3r1Enxvw9t6sX>@-k>+T8iZ(YRHAC*}D2msQ3_p8j!y$xWyZQ&-F#>h%2 zn9dwM{~YwQ^A)!SZ9I~n)-Ap2v_a8wo)N6Yny~E2uFrd5&)E6|J)S&{YY_F`V86Jyc$*HU_qir_j45G44|okg{Q9pU!|5;XYS2CQI? z_YTuthfKi#FZ%KHZ|DaE21VBQtHElY6%X669+Y+WKl}jAUFZzQ1+1M^@p-8z2cRBL z!LD~CF7&yRJ^)#VC9o}9NAA$x9W2Vsq`$s2Fo2}{ICOlv59VZaFafP!|Vbcd4D6?xDRf}k&Au|>PT>GL1yzcwc59f6~IW4*_}VXbX(X}}e7w#}`ry-Ql~ zkzgf;DnwQqWAmW912(JL|Fx3{-y#?4JORI5fDINUruAk~@zKb79f^RSYER0cU#3dl z8UkOYny$5t$>j)6?1tXn+vp4#KPj^ho$y^(%xekVJf@brMH9-Uj+e$9b~ML+&Z1R9 z-FWwW`h^oTE|1piuDf!Zg<52$a1}^Di-Y5Dmae*;qqRv*g_!hxk&#iFT3SiF;D*@s znO6ZuXXm~kJGHy4R%~}uT)f5QjeKdODlg9Cxw*Nht)|S8Vp|l6p(0(Xa&QB>Jz;dr zcQ;*8Q(L=v;Eg!cj)1~TvCuQ+W)}=o%BH5r2%4hbfk6}q-h^=BvFaY@?92?~ditgO z^%cq56calKTkVd@^@62)0_NuhP#9`aB|Xq@gB|XsPh7RJ-LXT=7=V7P{YiL0nM;0b zTQ81!)_oywua6y|LF7G-AsKVpx^(gH`gipGXhX&BKE9F^t1CKOxc}B>;ly!(!{ygQ z_(NTiB#(|;t4QKYj0A=B&0Q4hgzPZO-Me=oX{e?DCXp@6dYPk>*{E9%eeB6a!ZFGD6arsRovSJq>vfAwmbT6=HM zJ=hj3i43Yq*(i8sa+!*H5z{-aeF&4F>S#6Bn;I!$&f(Gx%$QO`{ z0x*}F*XBXmE1E2;KVF4LFsv|e2z&bz$E*J|GbR$?nz27yO#~3-U-L}BUxt!?iAq%T z=%S++7$Rz3Ro9*vsL*hgl&~5OyWOJjg29n@&;g7dG<<#WbUF>hBdGot5B49@(`Rv)=IGU2hWkcfG2VkH)EekuDkE0`XVfrauCA;tj>P69 zi7dV1`1hO|Gq_Ti3D9l8$)WcyT-p};mh02yMAc$q3x=aBzU!C#!vwg>i}*WSck^(G zVnX6+vMjoO{!S~bmwM+^G#^5Q-IdU;s9}4$p`l}28|+4!(5tA*Q^uOhO-M?&sl|c{ zFXH(q)4#F+-O2YbiUIt?2pFvUfJ@p@CoC1GNHj!%kRixuz3HpoR}E>=BFf_5<<(I1 z2v51c?4mbne+<6KKkMJJAE6u-Fv=7HriyEZ0Ju;es2 zc>yg!ZM>r8BqSCxP#H#WXa5T(OKs-{z5I9hN3KW{swVY3K_!%i+rR4I)7O7s#1#bL za*JcBwYKqrLz`tddNF-74a+q?z5&T+w|Hp|XeQY)IQ9`s)?D1W^RW=!*EIet`&QH> z8zvQKaY3fzU}r$TR7aAi|6r~)5tuqBW($k~c$gT>B)qTx9o7W}Wxv7H-FSDFp;4Lf zBbnNemX;gozzk|Mq?EVkE0C>MV*TN3fVux28bP*EgJs(r5m~7B)9cS{9*`A2G(Z?C zJ`5wbG4`Y=ym(WbT6p!LprJp-gMNk8&rj2m^Y=czOs;#pidS{(#k0@Pp1YH?Y#)PdStmX$P^T`c8drvRoaeK zg!0$C!hY*e-Zg?V0)JV#!(tbKV9lFoRMV2u5uqQz+7{0yC)0f~ds9K3)RZBmp!V}_Kf+|wU|APi&7 z=TvlRikaxt%H5!KDLAdUE;*5<<*vtqX`AFdjxhUbYJar)9<38(kn!XuT2-7MiX(%v4{SzxGi)^|0G?l?%*JST)! zF07wkwKGQu>3$96WAG|{L#E8eYnk0fzYZwatN}V%wJC38M5k)IcK%Ev3WV%C0~|fG zJ1(K0TtdElDZ5Rl^dznV-BD5g0n)sVM>zM{AIB}qQAUTbz9;{q!@{c~u=y7}DCjE} z4*EkReMIj0M`%m%|Hfa86G8&P?s%uZK-=))L%%3B#I4^!UpX6GlTm!{lom%;7Jpfw zd1mH?`4sCLS&RZAPF4w{sRx) z^!)%s-N7!$Mrgs%la>ShpIQU^Cwo;WnX>mR1Ox;_KcO9H*mm!&#>RQqSzO9Xoqa7t zu~NGEt1Vq!y(W{bCEN4Ymw1=amxyn_7p3|jcz2VWkFOEmWwa<>SUfy1D(dIAg5`yw zMvn%QHvQc<$dtAi7|zts)MHTK=5AaAlXlcbM;ANmgTK>HR9du_>@J%sW`ncwxtf`x zQ68Q=o>Bv*{?u2a`o^{faDXMGQN+i z>jh8G7cqP;H;_mqD1v%Y;9ZQ{(XsdUD+xG7Mg#89kIZa6xrFWM?a!ft0!;Y~fS_Sd z$`GhCdF^_!BaUs5d(f8I%vh<>k-^k#HHX6UB@D`A-P;hiJ_qH35n`MeYv zenqR{W$xQ6k2OkL;e#T$Eh(Q`o*%NEyr1gK1r)26S~>S(qaUhn#eSPwBjXYM=oo@} zE(R8_J7}rqTj2;ZlTM76HWFw=FDH2;;u*iUqtSR_?9Pr=gT#(5T(`#RvUV>VH#nDs zR$Saka7)^Zf;$R`WRCVUCX5EedJBI*^X> z;})m#zag?bGBT29&{k^nqRBU!gUe;}VPRq6(2|mh3OcL}s6cT8n`Zmr+e{XwPt!W=Zeg9Kxu)1x(YzQfs8f`@)0gyd2T zxRz2G85s**nY7V`FuFfxi#r94i(9t#w=cZj22lL=En~aD6Pc|YkvUGdHj>c=dUO&KvLG(0g4I(WRtsmhsKNKs!5| zB>0_SXjem91paAhVW#TMoAy4vz4G_>wa_i66=QRp&-7RcT~~WEWL(8y;GtAs6k9{qC+90p3!G{FBHomBM4KBwb-@+f`E5pyU zJgMt=M#3XyS0{76GU8`k1(IN}V?b{xnu$sN5n}vxq(b^EbZOl?UZkqjsBot~!}aaI z#ECpR-*p{EToH#3~URq7Q{^OY;Z6&{ADeHWiIBTft$P=R)caU1*+zbBEwxbNwn z2d-BHZY5^p-eMJKtRtr?b2$iXnigOhZz@m1v$tMv7}}oS-OR=rdmb)DY+25CbnHuX zjfgD@s_N!x9O-j$aV;>EL|Pge>Zj$ug;eL>`JY^S{q*?gWvY#Fj994V(Y)NdjPy4Fp)p}J%0a3{nt6R_9Cda@B5JyKBt5mu zv#|k!J9)b68qhf_E%sB$q`qM(n-16FYX|REW%p8MK6CQMbNpEmy zYIYhF99+ZyM4()h2QXSj!1qv_e6*x?#a_8t!Sj}KQMDC5>JH%(n2@~C)fe1nIKX6n z!fAurARA%#m{mGEJcEHjTF33`t=Jk*T#t6I%@L>d89*)v4Ii#8xomAd!Mwg8eX=^@ z=8W4=?0IH1{M`=*5G}WmQ&KRom_1Gsxkl!4c9MPD5<2W3DHdj&RfLA#*W-NW2$@>m4t;@tZpY#kGGm$3>T>4yjm+(Y=<2Yp=Dn^*0Plu$pnc z7Z%E@{VqKyqaQ>$#ArfU;a0B;wj4!j%jJP}ixyU_`@z8kT#gaWLr~2v_SZ-;XUDS< z{`<=VNv7)>c6&RNOw^v5!rqnLh1;_&qFtYbzvnVLZ~5|`;WkRgygm+V!)y_UDUI-} z``z>X($j;C%{EvHX_km(9(q0G^Mec8L1yh{vtTa~^B)D!Ltn6Nqb;RrUck5CE?vFN zsH9`8{Sk;s5$-JuCsxM_O{cWwSZ!;#I(b3Z%@cs}OFsAW6)Yx*$Qm@K#$?jP! zwmQ6O(iXKCK2{n0PN;eyxERe#x$GmqT+z^)`XZb539@pjJu-t`fqxE<8qPPVPeVwd z@6qnh{ES6S?IwCJ*_=%G>fJ{_7Qf~}&T{JYRA?L&`pxOH(_(hxpJmChoqDV%#ijy^ zpOYeayBJgt^I6$gF3dCP%rqG(3d7Khjn$s$kKW<{cra7oxBoa)!(Y9cpC8*=X;^6U;RqKb?0NADs5f5KcF zN@xj_B~6wslpy#p*V@4Ck^YR!-0aciAEOEPr%b6{>*}^3`@ZE^95Msj2+ll-BXyav z5j>B6Y_w*6&i2pEetX=0{qTRJ5%I=xozV%hXG( zXgeTv>PRoAl?4~lvl*5*qJgEacaladcgB%H$r*v#{A0BzpgU}SM4-?fQnt8}(TX^g zB!*6D%vr~^&G;>sDwH4Someh|v8xK>0>XgIWzyt*h!2M*h`rFw;a~rTo|uN_IOC?h ztmGBKbULy12$EED2;TW%hm(kF^5m#*`rE+wrA{IW$p?D&c*i8(CFzj z4!~6jOI#Kg^t;Rc2cI#WL48BJ(ryO~L3Mx3vwHC2kKUEr{|EkJvmYjr)s3VwWI<#0sEe(6S$_~C zdouHiEC0!Oo+!lI?rw>s_7G&+a&bq&&*QQ^D}Sn*veO*BQmbpR>|cJQ+*};bNc|4D z?6q-$^z9SFnlBi_%aX)Mfwhs2&&e%2>o}yI2|{?%>`rBDjapmee6fevLV5#5QZ%4U8y7um{^}!D5bFHE|tL?S=n1t7|a&o)c+*X^c+){BB==$6;XLAxqz^zG6 z#O|ErVrmrghyV|xtLm&FA+c6(`174gQk*G}0x*{mClVO5 zLqn?_D4aG@D&s>O@gg6Rk-18{``(v~ZGf4e)QW}I6tmTJ552M%$J23^6|xeZ2R<~q zI`(dD@r6q*$D5dwS-dd1%l$>@Km^KGqft7&&tmPw-W`WHXqi)n`LW4pdGn74LWeWc z?;V-!Zwai7H3s~Ozgeoo7E1eywX`GrF#=Y?ZAc=B#HtkRw1oPFx=ia9s6{e^Z{QhR zb@IW|74r#9wwTIh<9dDTkZvo-e#EA`r-y*0E8ad&r*m|SucH*;uR>VZ;K+!Usi`!K z1$zPf0p@Ta4!xTrppZDwYil%wF6hBHkoquRqNZ>LQVij%c<5dt)3-<$4#Q{x0hoNz zkGZ_Ex~dEfGKIMF|BFUqwn(l9bM$$LJzAX)C)n>;iYPrBJ=~`Bt43I-}Dlj7gKD3`UjIHGvuKc(_GC%p&GDkzI9)!(wR(ccng? zEWe*L{cN%L^7Rq7GDDUlJLEaW@9_-b*=ldJlb)q!C@(su!s(^?{)*l zg@I>NzlMCr1Wxo`j*m2kJ7L{md|Ri>YGYdM8Jwz==X`-yAya4l>_V?$Z-lbt++quV z*-qw{Yj00q6Mj zHJHf-e^T@F)0s|@wA$TD$w6X^_(sE(47s1#t+|Oc_?`09xm_9>8Zgm`X=9^Yr-(9m z&At)%pWEYDlqz+`92|C60y9s%oq`6KI26W1oD`YYEIz|t-Z?3D8I$nUM^y{u8;@ND z3HpS}r#4-5-$;>2!)jaS+Tr&6K>WRP_lU94V<#W_lX5&VG(ZtSm(IgGwDL{nr<=F} zNigzG$9Lb%c-Rfvspf}Lg7}-#TI-tS@YhKbTu^ZK!Wn+$hVmCgSX7i)g@|uSY(T<7 z*<}k~^e!o}_d~A?PEe3n zRf^cZj$}z1*7%MtJqO_+5xOTc#qmmQ7GvfsXIK@^GUNOHp!yOn*z85?Dx3Qo``bw# zy8VNWVZ0wnxq=L16~$t}`4A6$DEvJyuO22C*@}nj{5mOdEaLK!A|7V3Ut)!GLI0(0 zxeEsU*qHM6t|H8P_IBoX!e>noSRKx%T$+#Hh-Z8}ViOW_PU&n{?8ZkATwacV@4JRM z`QP78QVH$u2d)Em(_3VQ*mCtgbPjD-Ecxtiizap9=c7Bw;nLA3RZru;JB&F1PuCgg z2l?v2xdW#)hC9@>mVN8ZNFnE4nu|XwW{!>EUbzl;Cj%><_uHwYbZ*5`N1Cj}# ze%S?m$05Iw&%Y6tv7&?7=C9+cxk0vvbyEGUz-2tFBsiieuu02me?>FDVxF3Bj-hN_ ztTC2J>}V)rzR^jFnVA_{!ZEYw=T&C%$9p5-C%jB_v==rPNRmxMlcW8$u>po2fZCAk z^JFku*FHiWc*cA3+Qe*pO1kLC6beHCn7_xH`fUOjCx!US#e|Y*A^>)l_eeV)ExN}1 zEM_xoNb5=6wJd^L0WUnUd*)Wz3e(ep8q!gW+czedNKFXaJI%$vkd&kVE)&Hz&O*2i zW0gMl8Qk%m&<(j)#Udla`W3-2U=!lw4FfHLV`6-Q<)~dtwa1;pfh=HJR*?wU*XU|B z$Yh%kyU&^Rp^uXyX9e+4I!|a03eQqIXMuvlgcJ@FZd*N^w-nOO!KwIa5q4eT6jFq~ z?h6PPvbW95j>!FPhV}8jV2~>&<-grNbvl;)_V&eN^-9f`MbWzb2$EMcuWA|^=Cs*O zn;htLV@qnukU0;M@ zzzDPq)q)_ju)}18yUK0#766ZPnZuo?BkJjI*2`BS7SIz4K;XnDEi_D@AQgS}fbv)x zx}6Az3WGrchD;pun-zTcR9WCP{KU)=8)Pod`U2kD6$X8eWQ)I7Q*6Q>NNFuw?;c9J zATytvb^eh)3%Q=tPydu$I%2a15zC=kdz(g*!1D`(o z3(gh|v=w5by%5+p7(kmZl6l}vuaUYe;D*IZ$JOnA98oW6US&a*7awG#9U#TuF;;Be>{+yW7R%Royt_O<92R80*;s*8Hm~g5zj5Qnlm698U3h^tAg}9> ze0$|LBF~LJSzf^rDHclCoT=JSwO&^h{K7Iuu$KKMVc`|PPUu?=;x)!GU92hpUA56U z-hGit$fhAZ!vHK+G`&wY*+To28Md53e?~QY`-Skx=*UHs`f&3VT3XtqaP#evp{|Zp z93XI?KKZ-_B(t-(D!nk=H#j^P5Ej;e>`R};_wTa|K8u@Zhoe4Ug`WQcrlyDj9oQ9L z5u8#Tjmnj3{dYd*=d;3F*P*9H_~oaDZ-*8h=E5cOPyDmuG9XXtIo*iXeTNFUB+Q+X z8%LE6%lC*we9K~H`a59Jp5G$bZ`j#eid=rXFxpS+c_mjWYJYtq)oxSMYj2kT9>#~c zi_D#roA#hF994(%PDbqSrP+2~?RvvzHM>^#Q2EXh4m^5?N6{5x^8ek+u`U z(C(xYwo7cj(fL3vhG?mUdhtT?>07`@6{Xgkhb;^+APl57|2)Udhgr`=Em^nlp$+>N z)D=gPNz-ogwnccipM`TxT*st}g+Q0eEkJv~fXDAp)dI5EMI8&|a}z`R=mU_O%j#uOum#!+CFL4^R_*2;we!@!kl8Ra z+T4%4gWt5bZhJx5vS+R};{R*ztD~x3yLGX^1Qi5n6GTd+TLkG)KvGJ&r5jXKq@=r) zMoPL_(hbtx-Q9KP5BK+-ea^S{{m!`O-Z3tJI9$Ef`+H-~=XvHczX-?GXA}#$N&&9# zLCAQWk}}y~yQcH6v8Msr0u;^ctOTGAGv;iKk?gAq3UX7nw7pa{jPigsAZ8~^X=&z5 zLw;bjI!n$1ZZe0lKZ`l~o3l_IOonpl$Jgt#(tK_;MY-cCtwF}nh zab+Cmr6w&JuhdUvET`)a;LlHMtJoKK?lV*51*0`aeJR1fl6)W^{Xxhu2p~pHcU%H0 zLP$--2$&x$9BJ-z14dXv7ZOC7Zim^ zgWDvQ(wac0i~|_WYc(}jz^oXo%+&k0h!LO*Vm`uyy?M=>gwr1{-YEa3$`jojLBDq? z+dYUzT~qTJY;@21pPL?JPBC}3k~R!XFw($MlsG!rEx^ZCe}qRt!xahOeXrwvCW!gE z(^Rx~66rpq$!jvm+moedtTmz*v-WQ7p6cpSYmvV34=sR`5>+|FUtnOt=E==mPL2>P zdt%lCQ8pkUt~Ifuh5)ArmX-&Wn-4){{Vj137zEjeQibNahxcc-A(a78D9OK}QaTQZ zo!^*PX0&vYq)v_kjetPdfH=T6wZ_^BD2E-kVpk>=X@H_INgZkdOkZ7W-}f}Ekxpk@ zQr@uV=JxB)Kc>9tej(FH1@UKOzdag|cMXrU1u$iu{qophZRMQfOGy_s*>$<>cf7~R z9mxz1*_w|{C6C#PmjxP|nywhtJe)lvwO5xaPahrKYH*Aze$L<1RnNQ z$ETc4F))dv!3>kXKbVd6EsTdp*i8CNfkJh)8{KhW%iJRS1r{88dZ%A*vg?n9u#2n7 zUGOZ;Ct70!5c{tQ46GifNAu)yRqm4xgx{=J$HH0dzVzo|dvFw9^!(9BVqz2B34^v$BxPddDMOr4@^`FX8x4*n2PEfTCl(8np?<;2@~eC> z;-}4e!3{!ph198;40YD(Bgix_+3#;?jh-0kUi9SWEeD@P*Q3tZn_`A$8`j)iDZ?vm z{clsEG}Dz=ctMLiUu-tlhs!#Gp}Dx=`}dWzRY$|1MgWw~2k3hs ziR?Khr1o}qCT#Bu=^pDd5J2K4Bq2e*TXqJM1an$cS~?edzN}&thf;x|U!wjJoS(^B zV(?Il8A>@2mO$}(GdtL31{~E_XDM2j-F7#P7>=FTf5?2exAE=CDLdQk`Ic7o8bRU0 zhL9|6{Kp6MBysT%9qr$@jpJEt8AM`NL_rd2Z)=AQ)Km`PQz22|*Xv!WfC~uGrjzjZ zXXoZ>sr}+eQ$FUNLO(~CB6V^Mbs{yb%R>$iCs*t#VSnOMkLPJ)aOx6$CWIYqolL_# zSs$ng6P`+OmC+rf*skuEsBt(1FMh3XA$_y3V^X-WPzT3e77NQvT)pT`=1%~4J~Caf ze#{t>&tR_AJ9gDs(Mp(w1?Q})(etaTdDsvpPeP<1S7471oA9a3Bezg&9KNWdGob&A z6`mB9{w~)#V`iwlvHJE%uD|CI^MlX*7p#D*5p+_ClC>3=HZp{b4KPo!$V=;YKuZm# z^D0T6-C}k5^W%$E8@=ydl~{V7Tc4T>qMV&Zg(lH4CaQR4P1BAHw(kgCs_i<4EGfL` zjSm3sb-?^4Dil1faKRjP&NVdk6w^I+G29IV{#vWkhC%8P$u4@XbRyy>*~4?;Gq+85_MKDj20FQE+`d!np8xPd29@K{rKq3tuznLWx~y5FD{u01H&AlfQiO&K%9bJ`zHHZ z7K$BbHT*At%BKhO;07Z2acvU+@ys~#EG)ALoqJ47T?~3XkCw~Fa@^d#5(JD%b3wEN zM8I0wts};JCfCQHU(5+`dAGY?N5F1L>TFdvKGGu8W#V5 z=`rdiDv`wYG9jy*3~6oxq|L?ldzpqcm{MUjx}cuPI9{6_BvKce`lv)ej;cpg)J zBdBV-5WimqP~Bq(q*`rp=F}5g+rqj!KL{59RhIvuLr0ozSm72YA_qC;#!O$p(}w}N zFHq6IeM*RGs-1t|n zMKX$_PgdK&2}BIV#AFzv(JtEBwvvjJqy_ukN&h#OjR% zT4)eC^OdK7>^`s<0s37C>Jm?_KnG#}nDKB|`u5hU=J2~Sm+@EeJqH!vj7?CWL6!-l z%GbX|lAotr1EdpZVdB1>8tG49#t*^g<0Fw8(Bjj$M-n-xv(OdJ!|P%~PsWc*(=5Vb zh4^uA8;@40x~fU(SUINkYNiGSXAMgvqDJl(9zcwo? z2VS>kP6|J5&jPpIr@L!=*v86+)s@wzD{olZ410d@hGeVL%2mWUM91zDE-eJk zejm=ZXjf&%-6I>kPs2478@%qe4jU-Tb(_mTJkdHmI5-cJGgXH)3Z$g`8PU%uq!Ybc zHyiLi{_2Ul2I8{MXZAN5`m>FMc3RInT!tN)kBD8%n}x!)LJl?EiBaI0;P3C^LBJj< zPD0G`L!0^1bW7YzGpj1P$?TKqLGuq`09(zjSmaZ1)M>t9e(_*=j!`Lfn{dvTl%qDI z5v+vG0hF7Ib~=2C0ytW1x-T=w2o^G1gm}XGT)Ql@gXLGA5}*KQ=NJrPi~NEURV=}9 zT?wWMe;)mildqA{^B=7i<7DD(O`-I%FT!ZjmI~p3yIDCLJ?K&xF}&P0YtE+Ro=ZC8 z$YmjnIs!MVLjE)(?`!l2aYUtCXWH_sU|PE6i(RZ-*m&jfu$cQ~N45XI&1Z~Rah85-IUqG`%XE`%aDPlb7eCV{4Tu?A8 zVOdKl4hBgIOjhI^V-GgxyCzqB&JQRlfwA+bsriOJyHNo&B}Jq03}-dJ_ns|B-wY-l zxZcPVW3?3b{IM9|)d@U@d*-vP*xm7Bvu#Oto39WA;~=^{I?6}hi^I$4na#XrTA~60 z4PHYy_r+m$!FEE#y=wLa`+a+R)Yn!W5DS67#%z!xBus2Bu|L~|hJKUqU+)pcAl%^Q z{Be!97q{aqQ)&v;6-TAG_F0d>hQ>yQ!t{7BEy6JDf8-!@OI^URdi1Wq%=ltl{?dF~ z?n^M!*a?No?Q0|^{x?K|g0r#Wt-CO6Jjo%2m!VQDpQV4XFi;ZqVw~*P%HbY_63eul zOo%R{MC%-SCV>05D0M@b_0gesVnNpn`;b@(TH~&?;jgH^wP>jPhP~r6o1HjHG^Q0% ziV5F%IMHMDJ8`J-iSZHUrF+O=fDKX9x3c}s8#y+#yIkFA$GZ#U5#lv*4YG+l3^D)< z0AJYt^@~hcfFKY+n*H5GrYWx|T(d^^mt(*{$$`ub&Z_aTg%tQnV@rJ=P$n~w5ZMR&ve?+YNL6@g zyEWSoZ=7ekxMu-C-b%%g10QfN!_8lsNk~M)7{eN5(^dc+X}oeV9{7H^@@59zeRmlz+yxt+mznpO&&d}t&xcIJ{Wmd)-W)@ z(ZT|C3%c!vH=-n>c+8k(4{y-j-%mUd3$&}S68_faP7ox}ZEbCV1x;i4*AasjBioQ8 zJF+~kT73>qK_Ru8?IMV~$5zK{K(2>~@c;ozM<(m%)K7yAWFT^VgltO zBlDUfyISkG;QY}trrA)ZZ6vGDAF@UEgHhm8av(v`k>jYGX=Jb1R$IQMJ5976l^^cN5mB{ zU$gbw+4|X}_LoD7_ip8_ZXlIsBwV7kzV~CfgyX=M>1OHPy;dk*(vZ}Le&eh;e1Puhl|Vr7y8B` z{Pzw9(%CC)b6&ahNZ(^Jbqyp~10Ds>KqnvwiBfCZ(ibAR5}ykt%;c$hkX#!J`}if7t-*S+#>*YK^$zv(EL)rD$|Gb(V#nvM+gzwWi@dzTYk(Ue<(cUz<>W=jx&s?C8el*L7W23&XGNnS zvcjQw6%6)6ZOPga02XEDd;_uz!er5#?4JN-ehNi&4Insu1EJH=c#XQ2R&|{eO2fTs zXlO|1z4`c*ShGs;=hW2HvBS*VU3wc(ZZQ?M{1Ix~bJaz?JG8$Lj>o5`_Yf@#ljH+X z$!>Yu625-=g=Q5PSAp@(g9`nEkkw1AfUcPh3>r}6C6!CwR z1D}#7rvDe&a8?fKHGEeWZDxWZM(tm})CN3U>*xX@2YAnm+nQT~v1HgsclXT~p6lOR zbk)`WY)o@QD-Jb<%Zv+4>2#!RW2pAKkGfp3(JCx5^%mW`4 ztgjRyE&v3udmvRzmH0kXB z>FHzSTBC6uO4sU8{il$2ZNM0!{D=Ou#th#OUjAQny%<0Ljv-7+C&eag0DMR^?E23@ zr8&v$3Cnsd_8<;i6m6gVE1-xmSEq2e>w2SmrO&6hUmX#-ev83-T}_Vm8ru(CLK3GMIXu6oaz84Ua! zGdF)qe3C4Z5v%q%5Jf4c${?^36Lr@0g#VyVG~6qa?U+IRkv?3#_si3Kwxd;5yp#Sm z&pIfAw>2%h6M-Sb=ltO+CoezS&tl4OT~U#+ zzIdMoO3mr%6JN%lV_*@NR~3BY;Q+1TR{>cGq(f2V>Uhs#g_l7;(bmHn-i+8Hp^l`N z^!;l9B(;8ZbST`IafKR%li@m&0>1>it)@fYL#EmFZndJ7fj)8_B5N>PHP<(TFgc{wt1w z(piICF$Nbm+hB;uN>&zh1aNk*IYdN;OxL73+QRv;mfl#iof}`c}3vD7cYZDi`(~n7cxsF)++5RpH#)1Q2 z+3}1HG+E*W=_3HY8-y(9J!RB2D4oC|f?-cT@3cgEiecXmk^pDk+)YRiLHG_CP}x}r z{%>_@}hGu`4AMMluw|+ zA@^74xGS3#jUpl7%Cjr2E(^Uycu<-p)*BIo3sVLz!>^IUJ=Q>*e~ErUMKR@Q`WTo( zr2pkaUe!hZ4KG?E=fgmT5jn+923`3iCbFFb2GNkZ0Al3dYd+(*}YAV>%b-ndu~AcJhYaB&K_DUj}Co5AUk`l<@_JbfGyGl$U#v8ou<43>A0 z)v$ny9%0}?;N)xyKOpI478wSX3!&k3dzrIb$(RTz!|Ulv0Z;<%iF4h4fR7J2QcMB* zjsWTfJY^pM>U`_!$e%uj1P^}|x9L{5vpnbP}YL&<~!r4A*6B)n_L14Pz3YMTqs*nr{(j+Isa=#TyF(Z)ci$l65+hAc%}2S4+M4apA# z`MwCrT(V+*in^cUah^{iS{t9N8eleQdh(C@^&=w5lPfy|U^f?$Q!E)NiK>HxVq;!3p+yd@NBm z0W-N&LA=y{7Y#O)KcUcTe*t5YI;^pp49HELqgCCRp<}@@{~2>A0Og$J6XVE^b$|zT zyP1eTK}#(7jlMK-pjQ$`KpP$S$M{W zs~7+0(dPfbd;DJsP`f6+s%$_g0vZdHDf`KFg%^mH2rxGDay(8O`yX*yufYB_d?0< zIyn?y0i8#okbR!GKTo@Mga?Y(9hdm}2QnR&;?z z+ih(fXfV%_4mA*;ARTIcyohl{IVh_9cf?*L!h$D1$E{d&Z9~|#9h3uz{upL88r5F` zcMuBB%zJEOeT^$(*DpPC1I;o*;v-GzKq}66cz}I`UH#8D-QC}9E#S2Spmr^c<0Cky z5jCKs$6{M`J|Ar|KMka+$g`roHBT}Mhcpr^g1Y2+U!ALbd+9Ak#(=v5cQ-AHY%IU& z2Q^D4Nnao&3=8TlKACM$s_I|EKfmwB}ppiTj~QgC!w8a zl6)3AYB>L!icB)UXE%1i$*U&<1_&P!NoL{3 z2KmYUP7LOzdy|2%oeb@(#FDyZwhS!spt;i27oF^^|W3K;%_eK zqE;?u(Qb|$-&#D|p|?4I@kBR$C+yF8dzt2jSGNi(U;}-yor!&G%5w<{<`$P^cdXy{GFmx;k=kzV9hnetY~b! z4153ak~ggU5ACNj(9p2;g!p)*&#T>m96GPRbi8j<-(V=eY^2@`(J1KktmL3;>gv7& zTnB0{f!Qc460pJ~V%t#2Ta_)s$F8tjewhHF5YTDJb+;A*u{-b+U>cUlVH^Z?l0U3_ zO}B_yYT;`k{!+m${7|#m5V}bym!Zc9cJIXT`qRxj5;udU!8BMX7COW3Z3D;AIp39~ zzfA&>m_$Th&I&2_7vKBB-abA&wZ3r(zY9(W%Q&=%U6tRg6{OdCk(y_wF?_W;7he!eZ1 zI<+ozVsRbm0kL8gTEa1j)D==%FKdU&Is~ z51b9n*B734(?ldmCS8a0nL|iIdp*#2*S_uEcj@nyP-e7q=O?$K0V_qUB%MXQhF+Jo z7l3|%R^6tca8=C6;BTPp#X`1;gRBRIW6~fOM0;&i1xzm5%^nn~gWdLN)v53Tw1LmA zJjtD7^s2YCf=_{IiR<2~y5IY`#ZD>iYaGy@b&=hQj@J4V7${XF`2$uIcv4c=-`6LZ zrF8{em#UFg{IM12 zbfAVH0NwEWN1UmoUGP6k3eSeB1Pu~2y56PFtetw-w?SZ0zIfeIl8gL{8olKl-_*h zmKz?eIO?7AFCE4LBl5dD4zjN|TIAeU$$A04Rw#ksv4=xdv6kjuHGZqr&D40S~1|{#grm6A1Y6>`xc(bTd&!}r`e zB{x|FSGlOWP*W%`N*>i=cy2+h=-VA@9zw-;;iHWQM=Py3pWdK9OBrfGX*F-#b5EN! zt1Q>pw}fMBHq3V9wcsR)>SstzTEBYjn$IP#*%5!$Jna5$Hs2*u-qAjb zh26PfX=$0Yt*NGBMQJ|oPPeMpw>38&WSRwKTJ$H}{8U!P>+*nNa4{8|grs?z-BMEC z#=EcYQ&7g`il4LQW9DooMBL3&+qo;dTZ`bA?|myd;A~L@>+Jdi8j4ZS(@-@w-s#Y~ zyR}#Pq0b962JvEoc(e)Ca-nz|;X019P*OzVB zP~Ir|5Q_vpQQbf|bDPwL*BIsL#dQ>{c2{6+f2gFcss5lY<6?Je!ka-`w5RW#XNOV= zd-2_8t`nd8>CvI9F-@bnwjq#2KliyLjn<|>WMzH*E>PHYeq_FR_U8(AcL%N#Hhj%z zk(%DIo-@bQq}FQd&^>$1bkpvDn0im=ZFMs*d}kUCM-mAU8bR03pFba%&fG`cfj=?| z7UXtt?8rU1_1gEnAKdyZbW!}@KiFwEDcr(kD-a4Vs12D3pgehrZjv~BR^`2OlxemAJgvx~e?m-_F&%#1BU*F|~3%<3lX_$n=x%gd%`$&$0RD%r&UP zz*${-2TX~0=XQ^fteM^fTF(8AIID##_Xaq9@jyVjXt_U-4PQr4AO2C@iLgWq7f)yz zon_9_ZizJ1s%cs-smUp^&9Lv4&r84i3?ILk62yh*cdr0gO{djG>rW6)H{nA zHTmRpr_h2Lp6T^b<>K66WL-{KGAYdMUVg(u)X~v#+S@<8oO{T|#f4-S`)~|B112+C z{-9B$V!=hbvGYbm=GfQ?qH)ogZHhIIE(cO6ReOK4daN-MK~=BNxM)T8166$BVWC8W zhwq-{Dj_&gNVu;qK~zR)d|0CFBvePik!N~?0!#Gk@Y{Fy?k7BdrBHuKzw6P#(7nB? zE3bv;E)!wa$Tyi3ywaeq8||`YH_5vUMtJ8spyVLA_m>4+AfK-G@D+2JvZU|d-9%^# z&L-zXSoO!~X5A#htEs=?6ffJNk5;R)O0;a$`?RZk7Y8@x&d=*Vcept`8YWMxnk-4? z8ueHErd$r3rXFAMd59@3-ND{9YjNiE=@}w?Az)-n zM#@}CQVA=4B7~nkJZ@32eq1|qLxcL&6ScC3TTA@{&6x*Tq4eB${m$IDQ7revEhqU> zPo6P1tIe+G7A-RFv@q_1Hwm!9FG_fEu4LGvK>dpcb!c$8qKeSLwqx718KYZ^Xay^S*cvHBjvQ$wcmit?RtUaZWxnM1OD zJQ({ZJa=05bedNcbLEUX`}^$~ycqn$L6w896?2PbVqPShr9q^LKNpcsZOqHLmWzER zo1L6Hg()61tuN4C4IR3eI2}h#6|~QvW+B2H8pw7fW zcU-zYc5)OpHYj5`3ga81(x_N4vuiTadOpsPx@xv#Di_MgaR`fy&axbD_?h%8`+)RF1Fy zaHzp*Q2V6zTv9=}JNPEd2gk=ts|-qc`Pu%)M3`g}p@Km(I`30tN(ZuBzJHG?4R4d5 z@A-CyM~3nlslBzb7qV+Lb%*~tJ3U%A3in>HWH)P@e(_4O9OQ~}!6DBQoA?(t9WG=l zWYi3og>Tp_JfxYb^?8_SY8skCsF!6jR(YYzu;=smj>*u_0S(%yni{o(@TMFUt|Y(L z9d_ullIP&2c9V$1{IhS{;B*cavJXy&6tr|*62qTu3B4#bGA^lP)+89gZ@DB%CgJ4I z7W1WNe$O|ksIrJ*`#o+ny`+I z<93nJX#tWyLhnUb*Jtd8CfFoSYShdN?NdxOm#u1la4609@+Sd;`Na!!A zPj`Q-a4BFMYR>iI`s#_*@E!)`j%QMG@?Dz+mU=Adl}0~_9h}e+j>EBuKnvf95V4op!#B`YPP<1-2 zrYkkJ)J_Z^?_$A74bb25+2{Xau$T*9j&H8u*2(cx+rs0{{pAVVGZFOk?@x^X?Q!yN z9;`Ee6G~@>iyR-?QKhf!9Jr0LhM!IO5{a`#Q1_}NZQtS4&A%gC>1$5pW`)!um%&+*vDPn^8!{(TNsZ5pGBTNZQvfph6E_pF!F zDSPvrxGzOU*on`0pna*jfXJq0+4gN1codDc zg;)DGUY7zYvg&<@74QDutzPY+<>S7Wq6=?XmbYUkaE?}+**P|9qh|1!Kd1I{Z5kan zd`Hn~l{;?`KJqSFCTwb^E!D9kHOdQ{mPsp*WO+}BF<4niA(fPv!oXOXIbsudJeh7_ zyHA`}Qc5~|3765jv05+x70qK@ZR{xTS_|f_8h8=&(4Jk%?kBY$8uBE(3s$E3#S!O1 zF>Vd9#ylg(XO6^r}rq#_lMJhV1_P-Cn^ zgP9*wKCV+x$vuPpWYx*~W>7=t#7^);D@b(%Z|4m(Zb=*kW#cDZ+4?2t`SvXun*hIW zM22@z7p`gdFY8EaTTD&6ZQE&WkiT_FaH$Dtp;NA{C#Iz($vQdmlVLo3Xq};YLthr} zhw-qZ>DpRYaUhI-o2mUpah0F|I+J>7G6{*vP3Ga~`1ntr>BV#Hrv&a{s_*3kt#HLWI$Bb=|8HJALccP=tCq*{}Xj*p+un@gLi zv$GS&VMWbvTq`)qWP62=#@+RHv=n)D{D4Hl7vkQRuTF;-?%FRFZgMc1kqs7E#+hlH z&C-sunV0?Bqa!^I)>bxAlo2MW#j@b?m7Y#U#^QrHeFzyuqlUWMj;jg9I`iWNywLOZ z_jhf$1^D@{-nqfb{{3h0@&I zTq5UUl%sax$#_17@#MzU$ay?Bl*M47+%KY<_5k{uLc#+JC1{qv*i^P`1FpaKkaw4#WYOny*b+c z^VzW`41*yk!ak3os!U``ho@wI?aiEQP-N_x30vRm5LT(0;U zo9&-QM<@2hDLpN1$)iT^JHLr8#V`wzXe5IVO>65}`BeJ?ZLF6s1zK2+YizRAT`=LU z_#n(@usI#9P_W>Cde=T%2{{L34^7L4qw9}NRz=$=sw{Y$I zVF*QD^4z?pk>jhHM^ElR0^0=P+6Qti0hG&hV?RcOG)e{P^L+ zbH@=h60d|hf^STO>sTJtuJ06BU(I3S=-by{i#O|y{f8{-K9n 0: + retries -= 1 + try: + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + self.sock.settimeout(5) + + if self.aprs_filter: + port = self.settings.APRS_SERVER_PORT_CLIENT_DEFINED_FILTERS + else: + port = self.settings.APRS_SERVER_PORT_FULL_FEED + + self.sock.connect((self.settings.APRS_SERVER_HOST, port)) + self._sock_peer_ip = self.sock.getpeername()[0] + + login = create_aprs_login(self.aprs_user, -1, self.settings.APRS_APP_NAME, self.settings.APRS_APP_VER, self.aprs_filter) + self.sock.send(login.encode()) + self.sock_file = self.sock.makefile('rb') + + self._kill = False + self.logger.info("Connect to OGN ({}/{}:{}) as {} with filter: {}". + format(self.settings.APRS_SERVER_HOST, self._sock_peer_ip, port, self.aprs_user, + "'" + self.aprs_filter + "'" if self.aprs_filter else 'none (full-feed)')) + break + except (socket.error, ConnectionError) as e: + self.logger.error('Connect error: {}'.format(e)) + if retries > 0: + self.logger.info('Waiting {}s before next connection try ({} attempts left).'.format(wait_period, retries)) + sleep(wait_period) + else: + self._kill = True + self.logger.critical('Could not connect to OGN.') + + def disconnect(self): + self.logger.info('Disconnect from {}'.format(self._sock_peer_ip)) + try: + # close everything + self.sock.shutdown(0) + self.sock.close() + except OSError: + self.logger.error('Socket close error') + + self._kill = True + + def run(self, callback, timed_callback=lambda client: None, autoreconnect=False, ignore_decoding_error=True, + **kwargs): + while not self._kill: + try: + keepalive_time = time() + while not self._kill: + if time() - keepalive_time > self.settings.APRS_KEEPALIVE_TIME: + self.logger.info('Send keepalive to {}'.format(self._sock_peer_ip)) + self.sock.send('#keepalive\n'.encode()) + timed_callback(self) + keepalive_time = time() + + # Read packet string from socket + packet_b = self.sock_file.readline().strip() + packet_str = packet_b.decode(errors="replace") if ignore_decoding_error else packet_b.decode() + + # A zero length line should not be return if keepalives are being sent + # A zero length line will only be returned after ~30m if keepalives are not sent + if len(packet_str) == 0: + self.logger.warning('Read returns zero length string. Failure. Orderly closeout from {}'. + format(self._sock_peer_ip)) + break + + callback(packet_str, **kwargs) + except socket.error: + self.logger.error('socket.error') + except OSError: + self.logger.error('OSError') + except UnicodeDecodeError: + self.logger.error('UnicodeDecodeError') + self.logger.debug(packet_b) + + if autoreconnect and not self._kill: + self.connect(retries=100) + else: + return + + +class TelnetClient: + def __init__(self, settings=settings): + self.logger = logging.getLogger(__name__) + self.logger.info("Connect to local telnet server") + self.settings = settings + + def connect(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.settings.TELNET_SERVER_HOST, self.settings.TELNET_SERVER_PORT)) + + def run(self, callback, autoreconnect=False): + while True: + try: + self.sock_file = self.sock.makefile(mode='rw', encoding='iso-8859-1') + while True: + packet_str = self.sock_file.readline().strip() + callback(packet_str) + + except ConnectionRefusedError: + self.logger.error('Telnet server not running', exc_info=True) + + if autoreconnect: + sleep(1) + self.connect() + else: + return + + def disconnect(self): + self.logger.info('Disconnect') + self.sock.shutdown(0) + self.sock.close() diff --git a/tools/aprs_decode/main.py b/tools/aprs_decode/main.py new file mode 100644 index 0000000..87597c2 --- /dev/null +++ b/tools/aprs_decode/main.py @@ -0,0 +1,28 @@ + + +from ogn.client import AprsClient +from ogn.parser import parse, ParseError +import re + + +pattern_table = re.compile(r'[N][ ]{1}') + +def process_beacon(raw_message): + try: + beacon = parse(raw_message) + messages = re.findall(pattern_table, beacon['raw_message']) + if messages: + print(messages) + print(beacon['raw_message']) + + except ParseError as e: + print('Error, {}'.format(e.message)) + +client = AprsClient(aprs_user='N0CALL') +client.connect() + +try: + client.run(callback=process_beacon, autoreconnect=True) +except KeyboardInterrupt: + print('\nStop ogn gateway') + client.disconnect() diff --git a/tools/aprs_decode/settings.py b/tools/aprs_decode/settings.py new file mode 100644 index 0000000..7b1747a --- /dev/null +++ b/tools/aprs_decode/settings.py @@ -0,0 +1,13 @@ +APRS_SERVER_HOST = 'aprs.glidernet.org' +APRS_SERVER_PORT_FULL_FEED = 10152 +APRS_SERVER_PORT_CLIENT_DEFINED_FILTERS = 14580 + +APRS_APP_NAME = 'python-ogn-client' + +PACKAGE_VERSION = '1.2.1' +APRS_APP_VER = PACKAGE_VERSION[:3] + +APRS_KEEPALIVE_TIME = 240 + +TELNET_SERVER_HOST = 'localhost' +TELNET_SERVER_PORT = 50001 diff --git a/tools/iv.bin b/tools/iv.bin new file mode 100644 index 0000000..cf4a739 --- /dev/null +++ b/tools/iv.bin @@ -0,0 +1 @@ +yP=}o \ No newline at end of file diff --git a/tools/key.bin b/tools/key.bin new file mode 100644 index 0000000..daae022 --- /dev/null +++ b/tools/key.bin @@ -0,0 +1 @@ + ct_u]3 \ No newline at end of file diff --git a/tools/ogn/__pycache__/AircraftPos.cpython-39.pyc b/tools/ogn/__pycache__/AircraftPos.cpython-39.pyc deleted file mode 100644 index 0b4034ad0495c31dd7771d6c6f03656b731c1cb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 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 diff --git a/tools/ogn/__pycache__/__init__.cpython-39.pyc b/tools/ogn/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 01281e4000b1ed1ad8fe4f7b85f994c444d5e9df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmYe~<>g`kf~zmH6G8N25P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hnenx(7s(w*^ zYHp&wV^K