From 2776384b2c6bc79e1f1c83b131f8ad1bb0be7307 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Mar 2024 20:12:09 +0000 Subject: [PATCH 001/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 73754531e..d9ce1e603 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x71, 0x6C, 0xEB, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x18, 0x71, 0xEB, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x71, 0x6C, 0xEB, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x18, 0x71, 0xEB, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 27065b060717f6cc648480a5b3c742f9cefc873f Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 11 Mar 2024 08:49:42 -0600 Subject: [PATCH 002/112] Set PPS to 200ms --- Firmware/RTK_Everywhere/UM980.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index cf3a69308..5e76185a0 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -124,7 +124,7 @@ bool um980ConfigureOnce() response &= um980SetBaudRateCOM3(settings.dataPortBaud); // COM3 is connected to ESP UART2 // Enable PPS signal with a width of 200ms, and a period of 1 second - //response &= um980->enablePPS(200000, 1000); // widthMicroseconds, periodMilliseconds + response &= um980->enablePPS(200000, 1000); // widthMicroseconds, periodMilliseconds response &= um980SetMinElevation(settings.minElev); // UM980 default is 5 degrees. Our default is 10. From 1fed04b542004c13a6194563056328e9acbea14f Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 11 Mar 2024 08:51:58 -0600 Subject: [PATCH 003/112] Don't exit PointPerfect menu if WiFi fails --- Firmware/RTK_Everywhere/menuPP.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 2171fc96e..d4be0db67 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1400,7 +1400,6 @@ void menuPointPerfect() else { systemPrintln("Error: No WiFi available to get keys"); - break; } } From 692c220f4ca0e90f7b2e3d9249073f42d9a3d056 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 11 Mar 2024 09:56:50 -0600 Subject: [PATCH 004/112] Remove old patch --- .github/workflows/compile-rtk-everywhere.yml | 6 - Firmware/RTK_Everywhere/Patch/Server.h | 32 - Firmware/RTK_Everywhere/Patch/WiFiGeneric.cpp | 1484 ----------------- 3 files changed, 1522 deletions(-) delete mode 100644 Firmware/RTK_Everywhere/Patch/Server.h delete mode 100644 Firmware/RTK_Everywhere/Patch/WiFiGeneric.cpp diff --git a/.github/workflows/compile-rtk-everywhere.yml b/.github/workflows/compile-rtk-everywhere.yml index b8cfe94b9..8ecc05328 100644 --- a/.github/workflows/compile-rtk-everywhere.yml +++ b/.github/workflows/compile-rtk-everywhere.yml @@ -100,12 +100,6 @@ jobs: https://github.com/me-no-dev/ESPAsyncWebServer.git https://github.com/me-no-dev/AsyncTCP.git - #Incorporate ESP-Now patch into core: https://github.com/espressif/arduino-esp32/pull/7044/files - #- name: Patch ESP32 Core - # run: | - # cd Firmware/RTK_Everywhere/Patch/ - # cp WiFiGeneric.cpp /home/runner/.arduino15/packages/esp32/hardware/esp32/2.0.2/libraries/WiFi/src/WiFiGeneric.cpp - - name: Setup Python uses: actions/setup-python@v4 with: diff --git a/Firmware/RTK_Everywhere/Patch/Server.h b/Firmware/RTK_Everywhere/Patch/Server.h deleted file mode 100644 index fc482ecc3..000000000 --- a/Firmware/RTK_Everywhere/Patch/Server.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - Server.h - Base class that provides Server - Copyright (c) 2011 Adrian McEwen. All right reserved. - - 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 server_h -#define server_h - -#include "Print.h" - -class Server: public Print -{ -public: - //virtual void begin(uint16_t port=0) =0; - void begin() {}; -}; - -#endif diff --git a/Firmware/RTK_Everywhere/Patch/WiFiGeneric.cpp b/Firmware/RTK_Everywhere/Patch/WiFiGeneric.cpp deleted file mode 100644 index 9104eab68..000000000 --- a/Firmware/RTK_Everywhere/Patch/WiFiGeneric.cpp +++ /dev/null @@ -1,1484 +0,0 @@ -/* - ESP8266WiFiGeneric.cpp - WiFi library for esp8266 - - Copyright (c) 2014 Ivan Grokhotkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. - - 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 - - Reworked on 28 Dec 2015 by Markus Sattler - - */ - -#include "WiFi.h" -#include "WiFiGeneric.h" - -extern "C" { -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include "lwip/ip_addr.h" -#include "lwip/opt.h" -#include "lwip/err.h" -#include "lwip/dns.h" -#include "dhcpserver/dhcpserver_options.h" - -} //extern "C" - -#include "esp32-hal.h" -#include -#include "sdkconfig.h" - -#define _byte_swap32(num) (((num>>24)&0xff) | ((num<<8)&0xff0000) | ((num>>8)&0xff00) | ((num<<24)&0xff000000)) -ESP_EVENT_DEFINE_BASE(ARDUINO_EVENTS); -/* - * Private (exposable) methods - * */ -static esp_netif_t* esp_netifs[ESP_IF_MAX] = {nullptr, nullptr, nullptr}; -esp_interface_t get_esp_netif_interface(esp_netif_t* esp_netif){ - for(int i=0; i(local_ip); - info.gw.addr = static_cast(gateway); - info.netmask.addr = static_cast(subnet); - - log_v("Configuring %s static IP: " IPSTR ", MASK: " IPSTR ", GW: " IPSTR, - interface == ESP_IF_WIFI_STA ? "Station" : - interface == ESP_IF_WIFI_AP ? "SoftAP" : "Ethernet", - IP2STR(&info.ip), IP2STR(&info.netmask), IP2STR(&info.gw)); - - esp_err_t err = ESP_OK; - if(interface != ESP_IF_WIFI_AP){ - err = esp_netif_dhcpc_get_status(esp_netif, &status); - if(err){ - log_e("DHCPC Get Status Failed! 0x%04x", err); - return err; - } - err = esp_netif_dhcpc_stop(esp_netif); - if(err && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED){ - log_e("DHCPC Stop Failed! 0x%04x", err); - return err; - } - err = esp_netif_set_ip_info(esp_netif, &info); - if(err){ - log_e("Netif Set IP Failed! 0x%04x", err); - return err; - } - if(info.ip.addr == 0){ - err = esp_netif_dhcpc_start(esp_netif); - if(err){ - log_e("DHCPC Start Failed! 0x%04x", err); - return err; - } - } - } else { - err = esp_netif_dhcps_get_status(esp_netif, &status); - if(err){ - log_e("DHCPS Get Status Failed! 0x%04x", err); - return err; - } - err = esp_netif_dhcps_stop(esp_netif); - if(err && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED){ - log_e("DHCPS Stop Failed! 0x%04x", err); - return err; - } - err = esp_netif_set_ip_info(esp_netif, &info); - if(err){ - log_e("Netif Set IP Failed! 0x%04x", err); - return err; - } - - dhcps_lease_t lease; - lease.enable = true; - uint8_t CIDR = WiFiGenericClass::calculateSubnetCIDR(subnet); - log_v("SoftAP: %s | Gateway: %s | DHCP Start: %s | Netmask: %s", local_ip.toString().c_str(), gateway.toString().c_str(), dhcp_lease_start.toString().c_str(), subnet.toString().c_str()); - // netmask must have room for at least 12 IP addresses (AP + GW + 10 DHCP Leasing addresses) - // netmask also must be limited to the last 8 bits of IPv4, otherwise this function won't work - // IDF NETIF checks netmask for the 3rd byte: https://github.com/espressif/esp-idf/blob/master/components/esp_netif/lwip/esp_netif_lwip.c#L1857-L1862 - if (CIDR > 28 || CIDR < 24) { - log_e("Bad netmask. It must be from /24 to /28 (255.255.255. 0<->240)"); - return ESP_FAIL; // ESP_FAIL if initializing failed - } - // The code below is ready for any netmask, not limited to 255.255.255.0 - uint32_t netmask = _byte_swap32(info.netmask.addr); - uint32_t ap_ipaddr = _byte_swap32(info.ip.addr); - uint32_t dhcp_ipaddr = _byte_swap32(static_cast(dhcp_lease_start)); - dhcp_ipaddr = dhcp_ipaddr == 0 ? ap_ipaddr + 1 : dhcp_ipaddr; - uint32_t leaseStartMax = ~netmask - 10; - // there will be 10 addresses for DHCP to lease - lease.start_ip.addr = dhcp_ipaddr; - lease.end_ip.addr = lease.start_ip.addr + 10; - // Check if local_ip is in the same subnet as the dhcp leasing range initial address - if ((ap_ipaddr & netmask) != (dhcp_ipaddr & netmask)) { - log_e("The AP IP address (%s) and the DHCP start address (%s) must be in the same subnet", - local_ip.toString().c_str(), IPAddress(_byte_swap32(dhcp_ipaddr)).toString().c_str()); - return ESP_FAIL; // ESP_FAIL if initializing failed - } - // prevents DHCP lease range to overflow subnet range - if ((dhcp_ipaddr & ~netmask) >= leaseStartMax) { - // make first DHCP lease addr stay in the begining of the netmask range - lease.start_ip.addr = (dhcp_ipaddr & netmask) + 1; - lease.end_ip.addr = lease.start_ip.addr + 10; - log_w("DHCP Lease out of range - Changing DHCP leasing start to %s", IPAddress(_byte_swap32(lease.start_ip.addr)).toString().c_str()); - } - // Check if local_ip is within DHCP range - if (ap_ipaddr >= lease.start_ip.addr && ap_ipaddr <= lease.end_ip.addr) { - log_e("The AP IP address (%s) can't be within the DHCP range (%s -- %s)", - local_ip.toString().c_str(), IPAddress(_byte_swap32(lease.start_ip.addr)).toString().c_str(), IPAddress(_byte_swap32(lease.end_ip.addr)).toString().c_str()); - return ESP_FAIL; // ESP_FAIL if initializing failed - } - // Check if gateway is within DHCP range - uint32_t gw_ipaddr = _byte_swap32(info.gw.addr); - bool gw_in_same_subnet = (gw_ipaddr & netmask) == (ap_ipaddr & netmask); - if (gw_in_same_subnet && gw_ipaddr >= lease.start_ip.addr && gw_ipaddr <= lease.end_ip.addr) { - log_e("The GatewayP address (%s) can't be within the DHCP range (%s -- %s)", - gateway.toString().c_str(), IPAddress(_byte_swap32(lease.start_ip.addr)).toString().c_str(), IPAddress(_byte_swap32(lease.end_ip.addr)).toString().c_str()); - return ESP_FAIL; // ESP_FAIL if initializing failed - } - // all done, just revert back byte order of DHCP lease range - lease.start_ip.addr = _byte_swap32(lease.start_ip.addr); - lease.end_ip.addr = _byte_swap32(lease.end_ip.addr); - log_v("DHCP Server Range: %s to %s", IPAddress(lease.start_ip.addr).toString().c_str(), IPAddress(lease.end_ip.addr).toString().c_str()); - err = tcpip_adapter_dhcps_option( - (tcpip_adapter_dhcp_option_mode_t)TCPIP_ADAPTER_OP_SET, - (tcpip_adapter_dhcp_option_id_t)ESP_NETIF_SUBNET_MASK, - (void*)&info.netmask.addr, sizeof(info.netmask.addr) - ); - if(err){ - log_e("DHCPS Set Netmask Failed! 0x%04x", err); - return err; - } - err = tcpip_adapter_dhcps_option( - (tcpip_adapter_dhcp_option_mode_t)TCPIP_ADAPTER_OP_SET, - (tcpip_adapter_dhcp_option_id_t)REQUESTED_IP_ADDRESS, - (void*)&lease, sizeof(dhcps_lease_t) - ); - if(err){ - log_e("DHCPS Set Lease Failed! 0x%04x", err); - return err; - } - err = esp_netif_dhcps_start(esp_netif); - if(err){ - log_e("DHCPS Start Failed! 0x%04x", err); - return err; - } - } - return err; -} - -esp_err_t set_esp_interface_dns(esp_interface_t interface, IPAddress main_dns=IPAddress(), IPAddress backup_dns=IPAddress(), IPAddress fallback_dns=IPAddress()){ - esp_netif_t *esp_netif = esp_netifs[interface]; - esp_netif_dns_info_t dns; - dns.ip.type = ESP_IPADDR_TYPE_V4; - dns.ip.u_addr.ip4.addr = static_cast(main_dns); - if(dns.ip.u_addr.ip4.addr && esp_netif_set_dns_info(esp_netif, ESP_NETIF_DNS_MAIN, &dns) != ESP_OK){ - log_e("Set Main DNS Failed!"); - return ESP_FAIL; - } - if(interface != ESP_IF_WIFI_AP){ - dns.ip.u_addr.ip4.addr = static_cast(backup_dns); - if(dns.ip.u_addr.ip4.addr && esp_netif_set_dns_info(esp_netif, ESP_NETIF_DNS_BACKUP, &dns) != ESP_OK){ - log_e("Set Backup DNS Failed!"); - return ESP_FAIL; - } - dns.ip.u_addr.ip4.addr = static_cast(fallback_dns); - if(dns.ip.u_addr.ip4.addr && esp_netif_set_dns_info(esp_netif, ESP_NETIF_DNS_FALLBACK, &dns) != ESP_OK){ - log_e("Set Fallback DNS Failed!"); - return ESP_FAIL; - } - } - return ESP_OK; -} - -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE -static const char * auth_mode_str(int authmode) -{ - switch (authmode) { - case WIFI_AUTH_OPEN: - return ("OPEN"); - break; - case WIFI_AUTH_WEP: - return ("WEP"); - break; - case WIFI_AUTH_WPA_PSK: - return ("WPA_PSK"); - break; - case WIFI_AUTH_WPA2_PSK: - return ("WPA2_PSK"); - break; - case WIFI_AUTH_WPA_WPA2_PSK: - return ("WPA_WPA2_PSK"); - break; - case WIFI_AUTH_WPA2_ENTERPRISE: - return ("WPA2_ENTERPRISE"); - break; - case WIFI_AUTH_WPA3_PSK: - return ("WPA3_PSK"); - break; - case WIFI_AUTH_WPA2_WPA3_PSK: - return ("WPA2_WPA3_PSK"); - break; - case WIFI_AUTH_WAPI_PSK: - return ("WPAPI_PSK"); - break; - default: - break; - } - return ("UNKNOWN"); -} -#endif - -static char default_hostname[32] = {0,}; -static const char * get_esp_netif_hostname(){ - if(default_hostname[0] == 0){ - uint8_t eth_mac[6]; - esp_wifi_get_mac((wifi_interface_t)WIFI_IF_STA, eth_mac); - snprintf(default_hostname, 32, "%s%02X%02X%02X", CONFIG_IDF_TARGET "-", eth_mac[3], eth_mac[4], eth_mac[5]); - } - return (const char *)default_hostname; -} -static void set_esp_netif_hostname(const char * name){ - if(name){ - snprintf(default_hostname, 32, "%s", name); - } -} - -static xQueueHandle _arduino_event_queue; -static TaskHandle_t _arduino_event_task_handle = nullptr; -static EventGroupHandle_t _arduino_event_group = nullptr; - -static void _arduino_event_task(void * arg){ - arduino_event_t *data = nullptr; - for (;;) { - if(xQueueReceive(_arduino_event_queue, &data, portMAX_DELAY) == pdTRUE){ - WiFiGenericClass::_eventCallback(data); - free(data); - data = nullptr; - } - } - vTaskDelete(nullptr); - _arduino_event_task_handle = nullptr; -} - -esp_err_t postArduinoEvent(arduino_event_t *data) -{ - if(data == nullptr){ - return ESP_FAIL; - } - arduino_event_t * event = (arduino_event_t*)malloc(sizeof(arduino_event_t)); - if(event == nullptr){ - log_e("Arduino Event Malloc Failed!"); - return ESP_FAIL; - } - memcpy(event, data, sizeof(arduino_event_t)); - if (xQueueSend(_arduino_event_queue, &event, portMAX_DELAY) != pdPASS) { - log_e("Arduino Event Send Failed!"); - return ESP_FAIL; - } - return ESP_OK; -} - -static void _arduino_event_cb(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { - arduino_event_t arduino_event; - arduino_event.event_id = ARDUINO_EVENT_MAX; - - /* - * STA - * */ - if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { - log_v("STA Started"); - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_START; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_STOP) { - log_v("STA Stopped"); - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_STOP; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_AUTHMODE_CHANGE) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_sta_authmode_change_t * event = (wifi_event_sta_authmode_change_t*)event_data; - log_v("STA Auth Mode Changed: From: %s, To: %s", auth_mode_str(event->old_mode), auth_mode_str(event->new_mode)); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE; - memcpy(&arduino_event.event_info.wifi_sta_authmode_change, event_data, sizeof(wifi_event_sta_authmode_change_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_sta_connected_t * event = (wifi_event_sta_connected_t*)event_data; - log_v("STA Connected: SSID: %s, BSSID: " MACSTR ", Channel: %u, Auth: %s", event->ssid, MAC2STR(event->bssid), event->channel, auth_mode_str(event->authmode)); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_CONNECTED; - memcpy(&arduino_event.event_info.wifi_sta_connected, event_data, sizeof(wifi_event_sta_connected_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_sta_disconnected_t * event = (wifi_event_sta_disconnected_t*)event_data; - log_v("STA Disconnected: SSID: %s, BSSID: " MACSTR ", Reason: %u", event->ssid, MAC2STR(event->bssid), event->reason); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_DISCONNECTED; - memcpy(&arduino_event.event_info.wifi_sta_disconnected, event_data, sizeof(wifi_event_sta_disconnected_t)); - } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; - log_v("STA Got %sIP:" IPSTR, event->ip_changed?"New ":"Same ", IP2STR(&event->ip_info.ip)); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_GOT_IP; - memcpy(&arduino_event.event_info.got_ip, event_data, sizeof(ip_event_got_ip_t)); - } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_LOST_IP) { - log_v("STA IP Lost"); - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_LOST_IP; - - /* - * SCAN - * */ - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_SCAN_DONE) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_sta_scan_done_t * event = (wifi_event_sta_scan_done_t*)event_data; - log_v("SCAN Done: ID: %u, Status: %u, Results: %u", event->scan_id, event->status, event->number); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_SCAN_DONE; - memcpy(&arduino_event.event_info.wifi_scan_done, event_data, sizeof(wifi_event_sta_scan_done_t)); - - /* - * AP - * */ - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_START) { - log_v("AP Started"); - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_START; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STOP) { - log_v("AP Stopped"); - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STOP; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_PROBEREQRECVED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_ap_probe_req_rx_t * event = (wifi_event_ap_probe_req_rx_t*)event_data; - log_v("AP Probe Request: RSSI: %d, MAC: " MACSTR, event->rssi, MAC2STR(event->mac)); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED; - memcpy(&arduino_event.event_info.wifi_ap_probereqrecved, event_data, sizeof(wifi_event_ap_probe_req_rx_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STACONNECTED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data; - log_v("AP Station Connected: MAC: " MACSTR ", AID: %d", MAC2STR(event->mac), event->aid); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STACONNECTED; - memcpy(&arduino_event.event_info.wifi_ap_staconnected, event_data, sizeof(wifi_event_ap_staconnected_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data; - log_v("AP Station Disconnected: MAC: " MACSTR ", AID: %d", MAC2STR(event->mac), event->aid); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STADISCONNECTED; - memcpy(&arduino_event.event_info.wifi_ap_stadisconnected, event_data, sizeof(wifi_event_ap_stadisconnected_t)); - } else if (event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - ip_event_ap_staipassigned_t * event = (ip_event_ap_staipassigned_t*)event_data; - log_v("AP Station IP Assigned:" IPSTR, IP2STR(&event->ip)); - #endif - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED; - memcpy(&arduino_event.event_info.wifi_ap_staipassigned, event_data, sizeof(ip_event_ap_staipassigned_t)); - - /* - * ETH - * */ - } else if (event_base == ETH_EVENT && event_id == ETHERNET_EVENT_CONNECTED) { - log_v("Ethernet Link Up"); - arduino_event.event_id = ARDUINO_EVENT_ETH_CONNECTED; - memcpy(&arduino_event.event_info.eth_connected, event_data, sizeof(esp_eth_handle_t)); - } else if (event_base == ETH_EVENT && event_id == ETHERNET_EVENT_DISCONNECTED) { - log_v("Ethernet Link Down"); - arduino_event.event_id = ARDUINO_EVENT_ETH_DISCONNECTED; - } else if (event_base == ETH_EVENT && event_id == ETHERNET_EVENT_START) { - log_v("Ethernet Started"); - arduino_event.event_id = ARDUINO_EVENT_ETH_START; - } else if (event_base == ETH_EVENT && event_id == ETHERNET_EVENT_STOP) { - log_v("Ethernet Stopped"); - arduino_event.event_id = ARDUINO_EVENT_ETH_STOP; - } else if (event_base == IP_EVENT && event_id == IP_EVENT_ETH_GOT_IP) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; - log_v("Ethernet got %sip:" IPSTR, event->ip_changed?"new":"", IP2STR(&event->ip_info.ip)); - #endif - arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP; - memcpy(&arduino_event.event_info.got_ip, event_data, sizeof(ip_event_got_ip_t)); - - /* - * IPv6 - * */ - } else if (event_base == IP_EVENT && event_id == IP_EVENT_GOT_IP6) { - ip_event_got_ip6_t * event = (ip_event_got_ip6_t*)event_data; - esp_interface_t iface = get_esp_netif_interface(event->esp_netif); - log_v("IF[%d] Got IPv6: IP Index: %d, Zone: %d, " IPV6STR, iface, event->ip_index, event->ip6_info.ip.zone, IPV62STR(event->ip6_info.ip)); - memcpy(&arduino_event.event_info.got_ip6, event_data, sizeof(ip_event_got_ip6_t)); - if(iface == ESP_IF_WIFI_STA){ - arduino_event.event_id = ARDUINO_EVENT_WIFI_STA_GOT_IP6; - } else if(iface == ESP_IF_WIFI_AP){ - arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_GOT_IP6; - } else if(iface == ESP_IF_ETH){ - arduino_event.event_id = ARDUINO_EVENT_ETH_GOT_IP6; - } - - /* - * WPS - * */ - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_SUCCESS) { - arduino_event.event_id = ARDUINO_EVENT_WPS_ER_SUCCESS; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_FAILED) { - arduino_event.event_id = ARDUINO_EVENT_WPS_ER_FAILED; - memcpy(&arduino_event.event_info.wps_fail_reason, event_data, sizeof(wifi_event_sta_wps_fail_reason_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_TIMEOUT) { - arduino_event.event_id = ARDUINO_EVENT_WPS_ER_TIMEOUT; - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_PIN) { - arduino_event.event_id = ARDUINO_EVENT_WPS_ER_PIN; - memcpy(&arduino_event.event_info.wps_er_pin, event_data, sizeof(wifi_event_sta_wps_er_pin_t)); - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP) { - arduino_event.event_id = ARDUINO_EVENT_WPS_ER_PBC_OVERLAP; - - /* - * FTM - * */ - } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_FTM_REPORT) { - arduino_event.event_id = ARDUINO_EVENT_WIFI_FTM_REPORT; - memcpy(&arduino_event.event_info.wifi_ftm_report, event_data, sizeof(wifi_event_ftm_report_t)); - - - /* - * SMART CONFIG - * */ - } else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE) { - log_v("SC Scan Done"); - arduino_event.event_id = ARDUINO_EVENT_SC_SCAN_DONE; - } else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL) { - log_v("SC Found Channel"); - arduino_event.event_id = ARDUINO_EVENT_SC_FOUND_CHANNEL; - } else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR - smartconfig_event_got_ssid_pswd_t *event = (smartconfig_event_got_ssid_pswd_t *)event_data; - log_v("SC: SSID: %s, Password: %s", (const char *)event->ssid, (const char *)event->password); - #endif - arduino_event.event_id = ARDUINO_EVENT_SC_GOT_SSID_PSWD; - memcpy(&arduino_event.event_info.sc_got_ssid_pswd, event_data, sizeof(smartconfig_event_got_ssid_pswd_t)); - - } else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE) { - log_v("SC Send Ack Done"); - arduino_event.event_id = ARDUINO_EVENT_SC_SEND_ACK_DONE; - - /* - * Provisioning - * */ - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_INIT) { - log_v("Provisioning Initialized!"); - arduino_event.event_id = ARDUINO_EVENT_PROV_INIT; - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_DEINIT) { - log_v("Provisioning Uninitialized!"); - arduino_event.event_id = ARDUINO_EVENT_PROV_DEINIT; - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_START) { - log_v("Provisioning Start!"); - arduino_event.event_id = ARDUINO_EVENT_PROV_START; - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_END) { - log_v("Provisioning End!"); - wifi_prov_mgr_deinit(); - arduino_event.event_id = ARDUINO_EVENT_PROV_END; - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_CRED_RECV) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE - wifi_sta_config_t *event = (wifi_sta_config_t *)event_data; - log_v("Provisioned Credentials: SSID: %s, Password: %s", (const char *) event->ssid, (const char *) event->password); - #endif - arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_RECV; - memcpy(&arduino_event.event_info.prov_cred_recv, event_data, sizeof(wifi_sta_config_t)); - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_CRED_FAIL) { - #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR - wifi_prov_sta_fail_reason_t *reason = (wifi_prov_sta_fail_reason_t *)event_data; - log_e("Provisioning Failed: Reason : %s", (*reason == WIFI_PROV_STA_AUTH_ERROR)?"Authentication Failed":"AP Not Found"); - #endif - arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_FAIL; - memcpy(&arduino_event.event_info.prov_fail_reason, event_data, sizeof(wifi_prov_sta_fail_reason_t)); - } else if (event_base == WIFI_PROV_EVENT && event_id == WIFI_PROV_CRED_SUCCESS) { - log_v("Provisioning Success!"); - arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_SUCCESS; - } - - if(arduino_event.event_id < ARDUINO_EVENT_MAX){ - postArduinoEvent(&arduino_event); - } -} - -static bool _start_network_event_task(){ - if(!_arduino_event_group){ - _arduino_event_group = xEventGroupCreate(); - if(!_arduino_event_group){ - log_e("Network Event Group Create Failed!"); - return false; - } - xEventGroupSetBits(_arduino_event_group, WIFI_DNS_IDLE_BIT); - } - if(!_arduino_event_queue){ - _arduino_event_queue = xQueueCreate(32, sizeof(arduino_event_t*)); - if(!_arduino_event_queue){ - log_e("Network Event Queue Create Failed!"); - return false; - } - } - - esp_err_t err = esp_event_loop_create_default(); - if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) { - log_e("esp_event_loop_create_default failed!"); - return err; - } - - if(!_arduino_event_task_handle){ - xTaskCreateUniversal(_arduino_event_task, "arduino_events", 4096, nullptr, ESP_TASKD_EVENT_PRIO - 1, &_arduino_event_task_handle, ARDUINO_EVENT_RUNNING_CORE); - if(!_arduino_event_task_handle){ - log_e("Network Event Task Start Failed!"); - return false; - } - } - - if(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, nullptr, nullptr)){ - log_e("event_handler_instance_register for WIFI_EVENT Failed!"); - return false; - } - - if(esp_event_handler_instance_register(IP_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, nullptr, nullptr)){ - log_e("event_handler_instance_register for IP_EVENT Failed!"); - return false; - } - - if(esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, nullptr, nullptr)){ - log_e("event_handler_instance_register for SC_EVENT Failed!"); - return false; - } - - if(esp_event_handler_instance_register(ETH_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, nullptr, nullptr)){ - log_e("event_handler_instance_register for ETH_EVENT Failed!"); - return false; - } - - if(esp_event_handler_instance_register(WIFI_PROV_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, nullptr, nullptr)){ - log_e("event_handler_instance_register for WIFI_PROV_EVENT Failed!"); - return false; - } - - return true; -} - -bool tcpipInit(){ - static bool initialized = false; - if(!initialized){ - initialized = true; -#if CONFIG_IDF_TARGET_ESP32 - uint8_t mac[8]; - if(esp_efuse_mac_get_default(mac) == ESP_OK){ - esp_base_mac_addr_set(mac); - } -#endif - initialized = esp_netif_init() == ESP_OK; - if(initialized){ - initialized = _start_network_event_task(); - } else { - log_e("esp_netif_init failed!"); - } - } - return initialized; -} - -/* - * WiFi INIT - * */ - -static bool lowLevelInitDone = false; -bool WiFiGenericClass::_wifiUseStaticBuffers = false; - -bool WiFiGenericClass::useStaticBuffers(){ - return _wifiUseStaticBuffers; -} - -void WiFiGenericClass::useStaticBuffers(bool bufferMode){ - if (lowLevelInitDone) { - log_w("WiFi already started. Call WiFi.mode(WIFI_MODE_NULL) before setting Static Buffer Mode."); - } - _wifiUseStaticBuffers = bufferMode; -} - -// Temporary fix to ensure that CDC+JTAG stay on on ESP32-C3 -#if CONFIG_IDF_TARGET_ESP32C3 -extern "C" void phy_bbpll_en_usb(bool en); -#endif - -bool wifiLowLevelInit(bool persistent){ - if(!lowLevelInitDone){ - lowLevelInitDone = true; - if(!tcpipInit()){ - lowLevelInitDone = false; - return lowLevelInitDone; - } - if(esp_netifs[ESP_IF_WIFI_AP] == nullptr){ - esp_netifs[ESP_IF_WIFI_AP] = esp_netif_create_default_wifi_ap(); - } - if(esp_netifs[ESP_IF_WIFI_STA] == nullptr){ - esp_netifs[ESP_IF_WIFI_STA] = esp_netif_create_default_wifi_sta(); - } - - wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); - - if(!WiFiGenericClass::useStaticBuffers()) { - cfg.static_tx_buf_num = 0; - cfg.dynamic_tx_buf_num = 32; - cfg.tx_buf_type = 1; - cfg.cache_tx_buf_num = 4; // can't be zero! - cfg.static_rx_buf_num = 4; - cfg.dynamic_rx_buf_num = 32; - } - - esp_err_t err = esp_wifi_init(&cfg); - if(err){ - log_e("esp_wifi_init %d", err); - lowLevelInitDone = false; - return lowLevelInitDone; - } -// Temporary fix to ensure that CDC+JTAG stay on on ESP32-C3 -#if CONFIG_IDF_TARGET_ESP32C3 - phy_bbpll_en_usb(true); -#endif - if(!persistent){ - lowLevelInitDone = esp_wifi_set_storage(WIFI_STORAGE_RAM) == ESP_OK; - } - if(lowLevelInitDone){ - arduino_event_t arduino_event; - arduino_event.event_id = ARDUINO_EVENT_WIFI_READY; - postArduinoEvent(&arduino_event); - } - } - return lowLevelInitDone; -} - -static bool wifiLowLevelDeinit(){ - if(lowLevelInitDone){ - lowLevelInitDone = !(esp_wifi_deinit() == ESP_OK); - } - return !lowLevelInitDone; -} - -static bool _esp_wifi_started = false; - -static bool espWiFiStart(){ - if(_esp_wifi_started){ - return true; - } - _esp_wifi_started = true; - esp_err_t err = esp_wifi_start(); - if (err != ESP_OK) { - _esp_wifi_started = false; - log_e("esp_wifi_start %d", err); - return _esp_wifi_started; - } - return _esp_wifi_started; -} - -static bool espWiFiStop(){ - esp_err_t err; - if(!_esp_wifi_started){ - return true; - } - _esp_wifi_started = false; - err = esp_wifi_stop(); - if(err){ - log_e("Could not stop WiFi! %d", err); - _esp_wifi_started = true; - return false; - } - return wifiLowLevelDeinit(); -} - -// ----------------------------------------------------------------------------------------------------------------------- -// ------------------------------------------------- Generic WiFi function ----------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -typedef struct WiFiEventCbList { - static wifi_event_id_t current_id; - wifi_event_id_t id; - WiFiEventCb cb; - WiFiEventFuncCb fcb; - WiFiEventSysCb scb; - arduino_event_id_t event; - - WiFiEventCbList() : id(current_id++), cb(nullptr), fcb(nullptr), scb(nullptr), event(ARDUINO_EVENT_WIFI_READY) {} -} WiFiEventCbList_t; -wifi_event_id_t WiFiEventCbList::current_id = 1; - - -// arduino dont like std::vectors move static here -static std::vector cbEventList; - -bool WiFiGenericClass::_persistent = true; -bool WiFiGenericClass::_long_range = false; -wifi_mode_t WiFiGenericClass::_forceSleepLastMode = WIFI_MODE_NULL; -#if CONFIG_IDF_TARGET_ESP32S2 -wifi_ps_type_t WiFiGenericClass::_sleepEnabled = WIFI_PS_NONE; -#else -wifi_ps_type_t WiFiGenericClass::_sleepEnabled = WIFI_PS_MIN_MODEM; -#endif - -WiFiGenericClass::WiFiGenericClass() -{ -} - -const char * WiFiGenericClass::getHostname() -{ - return get_esp_netif_hostname(); -} - -bool WiFiGenericClass::setHostname(const char * hostname) -{ - set_esp_netif_hostname(hostname); - return true; -} - -int WiFiGenericClass::setStatusBits(int bits){ - if(!_arduino_event_group){ - return 0; - } - return xEventGroupSetBits(_arduino_event_group, bits); -} - -int WiFiGenericClass::clearStatusBits(int bits){ - if(!_arduino_event_group){ - return 0; - } - return xEventGroupClearBits(_arduino_event_group, bits); -} - -int WiFiGenericClass::getStatusBits(){ - if(!_arduino_event_group){ - return 0; - } - return xEventGroupGetBits(_arduino_event_group); -} - -int WiFiGenericClass::waitStatusBits(int bits, uint32_t timeout_ms){ - if(!_arduino_event_group){ - return 0; - } - return xEventGroupWaitBits( - _arduino_event_group, // The event group being tested. - bits, // The bits within the event group to wait for. - pdFALSE, // BIT_0 and BIT_4 should be cleared before returning. - pdTRUE, // Don't wait for both bits, either bit will do. - timeout_ms / portTICK_PERIOD_MS ) & bits; // Wait a maximum of 100ms for either bit to be set. -} - -/** - * set callback function - * @param cbEvent WiFiEventCb - * @param event optional filter (WIFI_EVENT_MAX is all events) - */ -wifi_event_id_t WiFiGenericClass::onEvent(WiFiEventCb cbEvent, arduino_event_id_t event) -{ - if(!cbEvent) { - return 0; - } - WiFiEventCbList_t newEventHandler; - newEventHandler.cb = cbEvent; - newEventHandler.fcb = nullptr; - newEventHandler.scb = nullptr; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; -} - -wifi_event_id_t WiFiGenericClass::onEvent(WiFiEventFuncCb cbEvent, arduino_event_id_t event) -{ - if(!cbEvent) { - return 0; - } - WiFiEventCbList_t newEventHandler; - newEventHandler.cb = nullptr; - newEventHandler.fcb = cbEvent; - newEventHandler.scb = nullptr; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; -} - -wifi_event_id_t WiFiGenericClass::onEvent(WiFiEventSysCb cbEvent, arduino_event_id_t event) -{ - if(!cbEvent) { - return 0; - } - WiFiEventCbList_t newEventHandler; - newEventHandler.cb = nullptr; - newEventHandler.fcb = nullptr; - newEventHandler.scb = cbEvent; - newEventHandler.event = event; - cbEventList.push_back(newEventHandler); - return newEventHandler.id; -} - -/** - * removes a callback form event handler - * @param cbEvent WiFiEventCb - * @param event optional filter (WIFI_EVENT_MAX is all events) - */ -void WiFiGenericClass::removeEvent(WiFiEventCb cbEvent, arduino_event_id_t event) -{ - if(!cbEvent) { - return; - } - - for(uint32_t i = 0; i < cbEventList.size(); i++) { - WiFiEventCbList_t entry = cbEventList[i]; - if(entry.cb == cbEvent && entry.event == event) { - cbEventList.erase(cbEventList.begin() + i); - } - } -} - -void WiFiGenericClass::removeEvent(WiFiEventSysCb cbEvent, arduino_event_id_t event) -{ - if(!cbEvent) { - return; - } - - for(uint32_t i = 0; i < cbEventList.size(); i++) { - WiFiEventCbList_t entry = cbEventList[i]; - if(entry.scb == cbEvent && entry.event == event) { - cbEventList.erase(cbEventList.begin() + i); - } - } -} - -void WiFiGenericClass::removeEvent(wifi_event_id_t id) -{ - for(uint32_t i = 0; i < cbEventList.size(); i++) { - WiFiEventCbList_t entry = cbEventList[i]; - if(entry.id == id) { - cbEventList.erase(cbEventList.begin() + i); - } - } -} - -/** - * callback for WiFi events - * @param arg - */ -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG -const char * arduino_event_names[] = { - "WIFI_READY", - "SCAN_DONE", - "STA_START", "STA_STOP", "STA_CONNECTED", "STA_DISCONNECTED", "STA_AUTHMODE_CHANGE", "STA_GOT_IP", "STA_GOT_IP6", "STA_LOST_IP", - "AP_START", "AP_STOP", "AP_STACONNECTED", "AP_STADISCONNECTED", "AP_STAIPASSIGNED", "AP_PROBEREQRECVED", "AP_GOT_IP6", - "FTM_REPORT", - "ETH_START", "ETH_STOP", "ETH_CONNECTED", "ETH_DISCONNECTED", "ETH_GOT_IP", "ETH_GOT_IP6", - "WPS_ER_SUCCESS", "WPS_ER_FAILED", "WPS_ER_TIMEOUT", "WPS_ER_PIN", "WPS_ER_PBC_OVERLAP", - "SC_SCAN_DONE", "SC_FOUND_CHANNEL", "SC_GOT_SSID_PSWD", "SC_SEND_ACK_DONE", - "PROV_INIT", "PROV_DEINIT", "PROV_START", "PROV_END", "PROV_CRED_RECV", "PROV_CRED_FAIL", "PROV_CRED_SUCCESS" -}; -#endif -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_WARN -const char * system_event_reasons[] = { "UNSPECIFIED", "AUTH_EXPIRE", "AUTH_LEAVE", "ASSOC_EXPIRE", "ASSOC_TOOMANY", "NOT_AUTHED", "NOT_ASSOCED", "ASSOC_LEAVE", "ASSOC_NOT_AUTHED", "DISASSOC_PWRCAP_BAD", "DISASSOC_SUPCHAN_BAD", "UNSPECIFIED", "IE_INVALID", "MIC_FAILURE", "4WAY_HANDSHAKE_TIMEOUT", "GROUP_KEY_UPDATE_TIMEOUT", "IE_IN_4WAY_DIFFERS", "GROUP_CIPHER_INVALID", "PAIRWISE_CIPHER_INVALID", "AKMP_INVALID", "UNSUPP_RSN_IE_VERSION", "INVALID_RSN_IE_CAP", "802_1X_AUTH_FAILED", "CIPHER_SUITE_REJECTED", "BEACON_TIMEOUT", "NO_AP_FOUND", "AUTH_FAIL", "ASSOC_FAIL", "HANDSHAKE_TIMEOUT", "CONNECTION_FAIL" }; -#define reason2str(r) ((r>176)?system_event_reasons[r-176]:system_event_reasons[r-1]) -#endif -esp_err_t WiFiGenericClass::_eventCallback(arduino_event_t *event) -{ - static bool first_connect = true; - - if(event->event_id < ARDUINO_EVENT_MAX) { - log_d("Arduino Event: %d - %s", event->event_id, arduino_event_names[event->event_id]); - } - if(event->event_id == ARDUINO_EVENT_WIFI_SCAN_DONE) { - WiFiScanClass::_scanDone(); - - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_START) { - WiFiSTAClass::_setStatus(WL_DISCONNECTED); - setStatusBits(STA_STARTED_BIT); - if(esp_wifi_set_ps(_sleepEnabled) != ESP_OK){ - log_e("esp_wifi_set_ps failed"); - } - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_STOP) { - WiFiSTAClass::_setStatus(WL_NO_SHIELD); - clearStatusBits(STA_STARTED_BIT | STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_CONNECTED) { - WiFiSTAClass::_setStatus(WL_IDLE_STATUS); - setStatusBits(STA_CONNECTED_BIT); - - //esp_netif_create_ip6_linklocal(esp_netifs[ESP_IF_WIFI_STA]); - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) { - uint8_t reason = event->event_info.wifi_sta_disconnected.reason; - log_w("Reason: %u - %s", reason, reason2str(reason)); - if(reason == WIFI_REASON_NO_AP_FOUND) { - WiFiSTAClass::_setStatus(WL_NO_SSID_AVAIL); - } else if((reason == WIFI_REASON_AUTH_FAIL) && !first_connect){ - WiFiSTAClass::_setStatus(WL_CONNECT_FAILED); - } else if(reason == WIFI_REASON_BEACON_TIMEOUT || reason == WIFI_REASON_HANDSHAKE_TIMEOUT) { - WiFiSTAClass::_setStatus(WL_CONNECTION_LOST); - } else if(reason == WIFI_REASON_AUTH_EXPIRE) { - - } else { - WiFiSTAClass::_setStatus(WL_DISCONNECTED); - } - clearStatusBits(STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT); - if(first_connect && ((reason == WIFI_REASON_AUTH_EXPIRE) || - (reason >= WIFI_REASON_BEACON_TIMEOUT))) - { - log_d("WiFi Reconnect Running"); - WiFi.disconnect(); - WiFi.begin(); - first_connect = false; - } - else if(WiFi.getAutoReconnect()){ - if((reason == WIFI_REASON_AUTH_EXPIRE) || - (reason >= WIFI_REASON_BEACON_TIMEOUT && reason != WIFI_REASON_AUTH_FAIL)) - { - log_d("WiFi AutoReconnect Running"); - WiFi.disconnect(); - WiFi.begin(); - } - } - else if (reason == WIFI_REASON_ASSOC_FAIL){ - WiFiSTAClass::_setStatus(WL_CONNECT_FAILED); - } - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_GOT_IP) { -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG - uint8_t * ip = (uint8_t *)&(event->event_info.got_ip.ip_info.ip.addr); - uint8_t * mask = (uint8_t *)&(event->event_info.got_ip.ip_info.netmask.addr); - uint8_t * gw = (uint8_t *)&(event->event_info.got_ip.ip_info.gw.addr); - log_d("STA IP: %u.%u.%u.%u, MASK: %u.%u.%u.%u, GW: %u.%u.%u.%u", - ip[0], ip[1], ip[2], ip[3], - mask[0], mask[1], mask[2], mask[3], - gw[0], gw[1], gw[2], gw[3]); -#endif - WiFiSTAClass::_setStatus(WL_CONNECTED); - setStatusBits(STA_HAS_IP_BIT | STA_CONNECTED_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_LOST_IP) { - WiFiSTAClass::_setStatus(WL_IDLE_STATUS); - clearStatusBits(STA_HAS_IP_BIT); - - } else if(event->event_id == ARDUINO_EVENT_WIFI_AP_START) { - setStatusBits(AP_STARTED_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_AP_STOP) { - clearStatusBits(AP_STARTED_BIT | AP_HAS_CLIENT_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_AP_STACONNECTED) { - setStatusBits(AP_HAS_CLIENT_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_AP_STADISCONNECTED) { - wifi_sta_list_t clients; - if(esp_wifi_ap_get_sta_list(&clients) != ESP_OK || !clients.num){ - clearStatusBits(AP_HAS_CLIENT_BIT); - } - - } else if(event->event_id == ARDUINO_EVENT_ETH_START) { - setStatusBits(ETH_STARTED_BIT); - } else if(event->event_id == ARDUINO_EVENT_ETH_STOP) { - clearStatusBits(ETH_STARTED_BIT | ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_ETH_CONNECTED) { - setStatusBits(ETH_CONNECTED_BIT); - } else if(event->event_id == ARDUINO_EVENT_ETH_DISCONNECTED) { - clearStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_ETH_GOT_IP) { -#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG - uint8_t * ip = (uint8_t *)&(event->event_info.got_ip.ip_info.ip.addr); - uint8_t * mask = (uint8_t *)&(event->event_info.got_ip.ip_info.netmask.addr); - uint8_t * gw = (uint8_t *)&(event->event_info.got_ip.ip_info.gw.addr); - log_d("ETH IP: %u.%u.%u.%u, MASK: %u.%u.%u.%u, GW: %u.%u.%u.%u", - ip[0], ip[1], ip[2], ip[3], - mask[0], mask[1], mask[2], mask[3], - gw[0], gw[1], gw[2], gw[3]); -#endif - setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT); - - } else if(event->event_id == ARDUINO_EVENT_WIFI_STA_GOT_IP6) { - setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_WIFI_AP_GOT_IP6) { - setStatusBits(AP_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_ETH_GOT_IP6) { - setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP6_BIT); - } else if(event->event_id == ARDUINO_EVENT_SC_GOT_SSID_PSWD) { - WiFi.begin( - (const char *)event->event_info.sc_got_ssid_pswd.ssid, - (const char *)event->event_info.sc_got_ssid_pswd.password, - 0, - ((event->event_info.sc_got_ssid_pswd.bssid_set == true)?event->event_info.sc_got_ssid_pswd.bssid:nullptr) - ); - } else if(event->event_id == ARDUINO_EVENT_SC_SEND_ACK_DONE) { - esp_smartconfig_stop(); - WiFiSTAClass::_smartConfigDone = true; - } - - for(uint32_t i = 0; i < cbEventList.size(); i++) { - WiFiEventCbList_t entry = cbEventList[i]; - if(entry.cb || entry.fcb || entry.scb) { - if(entry.event == (arduino_event_id_t) event->event_id || entry.event == ARDUINO_EVENT_MAX) { - if(entry.cb) { - entry.cb((arduino_event_id_t) event->event_id); - } else if(entry.fcb) { - entry.fcb((arduino_event_id_t) event->event_id, (arduino_event_info_t) event->event_info); - } else { - entry.scb(event); - } - } - } - } - return ESP_OK; -} - -/** - * Return the current channel associated with the network - * @return channel (1-13) - */ -int32_t WiFiGenericClass::channel(void) -{ - uint8_t primaryChan = 0; - wifi_second_chan_t secondChan = WIFI_SECOND_CHAN_NONE; - if(!lowLevelInitDone){ - return primaryChan; - } - esp_wifi_get_channel(&primaryChan, &secondChan); - return primaryChan; -} - - -/** - * store WiFi config in SDK flash area - * @param persistent - */ -void WiFiGenericClass::persistent(bool persistent) -{ - _persistent = persistent; -} - - -/** - * enable WiFi long range mode - * @param enable - */ -void WiFiGenericClass::enableLongRange(bool enable) -{ - _long_range = enable; -} - - -/** - * set new mode - * @param m WiFiMode_t - */ -bool WiFiGenericClass::mode(wifi_mode_t m) -{ - wifi_mode_t cm = getMode(); - if(cm == m) { - return true; - } - if(!cm && m){ - if(!wifiLowLevelInit(_persistent)){ - return false; - } - } else if(cm && !m){ - return espWiFiStop(); - } - - esp_err_t err; - if(m & WIFI_MODE_STA){ - err = set_esp_interface_hostname(ESP_IF_WIFI_STA, get_esp_netif_hostname()); - if(err){ - log_e("Could not set hostname! %d", err); - return false; - } - } - err = esp_wifi_set_mode(m); - if(err){ - log_e("Could not set mode! %d", err); - return false; - } - if(_long_range){ - if(m & WIFI_MODE_STA){ - err = esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR); - if(err != ESP_OK){ - log_e("Could not enable long range on STA! %d", err); - return false; - } - } - if(m & WIFI_MODE_AP){ - err = esp_wifi_set_protocol(WIFI_IF_AP, WIFI_PROTOCOL_LR); - if(err != ESP_OK){ - log_e("Could not enable long range on AP! %d", err); - return false; - } - } - } - if(!espWiFiStart()){ - return false; - } - - #ifdef BOARD_HAS_DUAL_ANTENNA - if(!setDualAntennaConfig(ANT1, ANT2, WIFI_RX_ANT_AUTO, WIFI_TX_ANT_AUTO)){ - log_e("Dual Antenna Config failed!"); - return false; - } - #endif - - return true; -} - -/** - * get WiFi mode - * @return WiFiMode - */ -wifi_mode_t WiFiGenericClass::getMode() -{ - if(!lowLevelInitDone || !_esp_wifi_started){ - return WIFI_MODE_NULL; - } - wifi_mode_t mode; - if(esp_wifi_get_mode(&mode) != ESP_OK){ - log_w("WiFi not started"); - return WIFI_MODE_NULL; - } - return mode; -} - -/** - * control STA mode - * @param enable bool - * @return ok - */ -bool WiFiGenericClass::enableSTA(bool enable) -{ - - wifi_mode_t currentMode = getMode(); - bool isEnabled = ((currentMode & WIFI_MODE_STA) != 0); - - if(isEnabled != enable) { - if(enable) { - return mode((wifi_mode_t)(currentMode | WIFI_MODE_STA)); - } - return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_STA))); - } - return true; -} - -/** - * control AP mode - * @param enable bool - * @return ok - */ -bool WiFiGenericClass::enableAP(bool enable) -{ - - wifi_mode_t currentMode = getMode(); - bool isEnabled = ((currentMode & WIFI_MODE_AP) != 0); - - if(isEnabled != enable) { - if(enable) { - return mode((wifi_mode_t)(currentMode | WIFI_MODE_AP)); - } - return mode((wifi_mode_t)(currentMode & (~WIFI_MODE_AP))); - } - return true; -} - -/** - * control modem sleep when only in STA mode - * @param enable bool - * @return ok - */ -bool WiFiGenericClass::setSleep(bool enabled){ - return setSleep(enabled?WIFI_PS_MIN_MODEM:WIFI_PS_NONE); -} - -/** - * control modem sleep when only in STA mode - * @param mode wifi_ps_type_t - * @return ok - */ -bool WiFiGenericClass::setSleep(wifi_ps_type_t sleepType) -{ - if(sleepType != _sleepEnabled){ - _sleepEnabled = sleepType; - if((getMode() & WIFI_MODE_STA) != 0){ - if(esp_wifi_set_ps(_sleepEnabled) != ESP_OK){ - log_e("esp_wifi_set_ps failed!"); - return false; - } - } - return true; - } - return false; -} - -/** - * get modem sleep enabled - * @return true if modem sleep is enabled - */ -wifi_ps_type_t WiFiGenericClass::getSleep() -{ - return _sleepEnabled; -} - -/** - * control wifi tx power - * @param power enum maximum wifi tx power - * @return ok - */ -bool WiFiGenericClass::setTxPower(wifi_power_t power){ - if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){ - log_w("Neither AP or STA has been started"); - return false; - } - return esp_wifi_set_max_tx_power(power) == ESP_OK; -} - -wifi_power_t WiFiGenericClass::getTxPower(){ - int8_t power; - if((getStatusBits() & (STA_STARTED_BIT | AP_STARTED_BIT)) == 0){ - log_w("Neither AP or STA has been started"); - return WIFI_POWER_19_5dBm; - } - if(esp_wifi_get_max_tx_power(&power)){ - return WIFI_POWER_19_5dBm; - } - return (wifi_power_t)power; -} - -/** - * Initiate FTM Session. - * @param frm_count Number of FTM frames requested in terms of 4 or 8 bursts (allowed values - 0(No pref), 16, 24, 32, 64) - * @param burst_period Requested time period between consecutive FTM bursts in 100's of milliseconds (allowed values - 0(No pref), 2 - 255) - * @param channel Primary channel of the FTM Responder - * @param mac MAC address of the FTM Responder - * @return true on success - */ -bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uint8_t channel, const uint8_t * mac) { - wifi_ftm_initiator_cfg_t ftmi_cfg = { - .resp_mac = {0,0,0,0,0,0}, - .channel = channel, - .frm_count = frm_count, - .burst_period = burst_period, - }; - if(mac != nullptr){ - memcpy(ftmi_cfg.resp_mac, mac, 6); - } - // Request FTM session with the Responder - if (ESP_OK != esp_wifi_ftm_initiate_session(&ftmi_cfg)) { - log_e("Failed to initiate FTM session"); - return false; - } - return true; -} - -/** - * Configure Dual antenna. - * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) - * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) - * @param rx_mode Set the RX antenna mode. See wifi_rx_ant_t for the options. - * @param tx_mode Set the TX antenna mode. See wifi_tx_ant_t for the options. - * @return true on success - */ -bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, wifi_rx_ant_t rx_mode, wifi_tx_ant_t tx_mode) { - - wifi_ant_gpio_config_t wifi_ant_io; - - if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { - log_e("Failed to get antenna configuration"); - return false; - } - - wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; - wifi_ant_io.gpio_cfg[0].gpio_select = 1; - wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; - wifi_ant_io.gpio_cfg[1].gpio_select = 1; - - if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { - log_e("Failed to set antenna GPIO configuration"); - return false; - } - - // Set antenna default configuration - wifi_ant_config_t ant_config = { - .rx_ant_mode = WIFI_ANT_MODE_AUTO, - .rx_ant_default = WIFI_ANT_MAX, // Ignored in AUTO mode - .tx_ant_mode = WIFI_ANT_MODE_AUTO, - .enabled_ant0 = 1, - .enabled_ant1 = 2, - }; - - switch (rx_mode) - { - case WIFI_RX_ANT0: - ant_config.rx_ant_mode = WIFI_ANT_MODE_ANT0; - break; - case WIFI_RX_ANT1: - ant_config.rx_ant_mode = WIFI_ANT_MODE_ANT1; - break; - case WIFI_RX_ANT_AUTO: - log_i("TX Antenna will be automatically selected"); - ant_config.rx_ant_default = WIFI_ANT_ANT0; - ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; - // Force TX for AUTO if RX is AUTO - ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; - goto set_ant; - break; - default: - log_e("Invalid default antenna! Falling back to AUTO"); - ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; - break; - } - - switch (tx_mode) - { - case WIFI_TX_ANT0: - ant_config.tx_ant_mode = WIFI_ANT_MODE_ANT0; - break; - case WIFI_TX_ANT1: - ant_config.tx_ant_mode = WIFI_ANT_MODE_ANT1; - break; - case WIFI_TX_ANT_AUTO: - log_i("RX Antenna will be automatically selected"); - ant_config.rx_ant_default = WIFI_ANT_ANT0; - ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; - // Force RX for AUTO if RX is AUTO - ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; - break; - default: - log_e("Invalid default antenna! Falling back to AUTO"); - ant_config.rx_ant_default = WIFI_ANT_ANT0; - ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; - break; - } - -set_ant: - if (ESP_OK != esp_wifi_set_ant(&ant_config)) { - log_e("Failed to set antenna configuration"); - return false; - } - - return true; -} - -// ----------------------------------------------------------------------------------------------------------------------- -// ------------------------------------------------ Generic Network function --------------------------------------------- -// ----------------------------------------------------------------------------------------------------------------------- - -/** - * DNS callback - * @param name - * @param ipaddr - * @param callback_arg - */ -static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg) -{ - if(ipaddr) { - (*reinterpret_cast(callback_arg)) = ipaddr->u_addr.ip4.addr; - } - xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT); -} - -/** - * Resolve the given hostname to an IP address. - * @param aHostname Name to be resolved - * @param aResult IPAddress structure to store the returned IP address - * @return 1 if aIPAddrString was successfully converted to an IP address, - * else error code - */ -int WiFiGenericClass::hostByName(const char* aHostname, IPAddress& aResult) -{ - ip_addr_t addr; - aResult = static_cast(0); - waitStatusBits(WIFI_DNS_IDLE_BIT, 16000); - clearStatusBits(WIFI_DNS_IDLE_BIT | WIFI_DNS_DONE_BIT); - err_t err = dns_gethostbyname(aHostname, &addr, &wifi_dns_found_callback, &aResult); - if(err == ERR_OK && addr.u_addr.ip4.addr) { - aResult = addr.u_addr.ip4.addr; - } else if(err == ERR_INPROGRESS) { - waitStatusBits(WIFI_DNS_DONE_BIT, 15000); //real internal timeout in lwip library is 14[s] - clearStatusBits(WIFI_DNS_DONE_BIT); - } - setStatusBits(WIFI_DNS_IDLE_BIT); - if((uint32_t)aResult == 0){ - log_e("DNS Failed for %s", aHostname); - } - return (uint32_t)aResult != 0; -} - -IPAddress WiFiGenericClass::calculateNetworkID(IPAddress ip, IPAddress subnet) { - IPAddress networkID; - - for (size_t i = 0; i < 4; i++) - networkID[i] = subnet[i] & ip[i]; - - return networkID; -} - -IPAddress WiFiGenericClass::calculateBroadcast(IPAddress ip, IPAddress subnet) { - IPAddress broadcastIp; - - for (int i = 0; i < 4; i++) - broadcastIp[i] = ~subnet[i] | ip[i]; - - return broadcastIp; -} - -uint8_t WiFiGenericClass::calculateSubnetCIDR(IPAddress subnetMask) { - uint8_t CIDR = 0; - - for (uint8_t i = 0; i < 4; i++) { - if (subnetMask[i] == 0x80) // 128 - CIDR += 1; - else if (subnetMask[i] == 0xC0) // 192 - CIDR += 2; - else if (subnetMask[i] == 0xE0) // 224 - CIDR += 3; - else if (subnetMask[i] == 0xF0) // 242 - CIDR += 4; - else if (subnetMask[i] == 0xF8) // 248 - CIDR += 5; - else if (subnetMask[i] == 0xFC) // 252 - CIDR += 6; - else if (subnetMask[i] == 0xFE) // 254 - CIDR += 7; - else if (subnetMask[i] == 0xFF) // 255 - CIDR += 8; - } - - return CIDR; -} From d240f13ecf6392f2ec05bbcb99755466f96bcb45 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Mon, 11 Mar 2024 13:27:24 -0600 Subject: [PATCH 005/112] Move tilt to state machine --- Firmware/RTK_Everywhere/Developer.ino | 1 + Firmware/RTK_Everywhere/Tasks.ino | 17 +- Firmware/RTK_Everywhere/Tilt.ino | 403 +++++++++++++++----------- Firmware/RTK_Everywhere/menuMain.ino | 3 +- Firmware/RTK_Everywhere/settings.h | 2 - 5 files changed, 249 insertions(+), 177 deletions(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index 438a75c27..2af81da84 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -170,6 +170,7 @@ void tiltApplyCompensation(char *nmeaSentence, int arraySize) {} void tiltUpdate() {} void tiltStop() {} void tiltSensorFactoryReset() {} +bool tiltIsCorrecting() {return(false);} #endif // COMPILE_IM19_IMU diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index c71864822..9297e130e 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -461,15 +461,12 @@ void processUart1Message(SEMP_PARSE_STATE *parse, uint16_t type) um980UnicoreHandler(parse->buffer, parse->length); } - if (present.imu_im19 == true) + if (tiltIsCorrecting() == true) { - if (settings.enableTiltCompensation == true && online.tilt == true) + if (type == RTK_NMEA_PARSER_INDEX) { - if (type == RTK_NMEA_PARSER_INDEX) - { - parse->buffer[parse->length++] = '\0'; // Null terminate string - tiltApplyCompensation((char *)parse->buffer, parse->length); - } + parse->buffer[parse->length++] = '\0'; // Null terminate string + tiltApplyCompensation((char *)parse->buffer, parse->length); } } @@ -1158,7 +1155,7 @@ void tickerGnssLedUpdate() } // // Solid during tilt corrected RTK fix - // if (online.tilt == true) + // if (tiltIsCorrecting() == true) // { // ledcWrite(ledGnssChannel, 255); // } @@ -1276,10 +1273,8 @@ void buttonCheckTask(void *e) // Platform has no display and tile, ie RTK Torch // The user button only exits tilt mode - if (userBtn->wasReleased() && (online.tilt == true)) + if (userBtn->wasReleased() && (tiltIsCorrecting() == true)) { - beepDurationMs(1000); - tiltStop(); } } diff --git a/Firmware/RTK_Everywhere/Tilt.ino b/Firmware/RTK_Everywhere/Tilt.ino index 309f3f65e..7c67cec33 100644 --- a/Firmware/RTK_Everywhere/Tilt.ino +++ b/Firmware/RTK_Everywhere/Tilt.ino @@ -65,172 +65,248 @@ void menuTilt() clearBuffer(); // Empty buffer of any newline chars } +typedef enum +{ + TILT_DISABLED = 0, + TILT_OFFLINE, + TILT_STARTED, + TILT_INITIALIZED, + TILT_CORRECTING, + +} TiltState; +TiltState tiltState = TILT_DISABLED; + +// Tilt compensation sensor state machine void tiltUpdate() { - if (present.imu_im19 == true) + if (present.imu_im19 == false) + return; + + if (settings.enableTiltCompensation == false && tiltState != TILT_DISABLED) + { + tiltStop(); // If the user has disabled the device, shut it down + tiltState = TILT_DISABLED; + } + + switch (tiltState) { - if (settings.enableTiltCompensation == true && online.imu == true) + default: + systemPrintf("Unknown tiltState: %d\r\n", tiltState); + break; + + case TILT_DISABLED: + if (settings.enableTiltCompensation == true && tiltFailedBegin == false) + tiltState = TILT_OFFLINE; + break; + + case TILT_OFFLINE: + // Try multiple times to configure IM19 + for (int x = 0; x < 3; x++) { - tiltSensor->update(); // Check for the most recent incoming binary data + beginTilt(); // Start IMU + if (tiltState == TILT_STARTED) + break; + log_d("Tilt sensor failed to configure. Trying again."); + } + + if (tiltState != TILT_STARTED) // If we failed to begin, disable future attempts + tiltFailedBegin = true; + break; + + case TILT_STARTED: + // Waiting for user to shake unit (RTK Fix required for isInitialized) + tiltSensor->update(); // Check for the most recent incoming binary data + + // Check IMU state at 1Hz + if (millis() - lastTiltCheck > 1000) + { + lastTiltCheck = millis(); - // Check IMU state at 1Hz - if (millis() - lastTiltCheck > 1000) + if (settings.tiltPoleLength < 0.5) + systemPrintf("Warning: Short pole length detected: %0.2f\r\n", settings.tiltPoleLength); + + if (settings.enableImuDebug == true) + printTiltDebug(); + + // Check to see if tilt sensor has been shaken + if (tiltSensor->isInitialized()) { - lastTiltCheck = millis(); - - // Error check - if (settings.tiltPoleLength < 0.5) - { - systemPrintf("Warning: Short pole length detected: %0.2f\r\n", settings.tiltPoleLength); - } - - // Check to see if tilt compensation is active - if (tiltSensor->isCorrecting()) - { - // Trigger beeper only once - if (online.tilt == false) - { - beepDurationMs(2000); // Audibly indicate the start of tilt - - lastTiltBeepMs = millis(); - - online.tilt = true; - } - } - else - { - if (online.tilt == true) - { - // Beep to indicating tilt went offline - beepDurationMs(1000); - - online.tilt = false; - } - } - - if (settings.enableImuDebug == true) - { - uint32_t naviStatus = tiltSensor->getNaviStatus(); - systemPrintf("NAVI timestamp: %0.0f lat: %0.4f lon: %0.4f alt: %0.2f\r\n", - tiltSensor->getNaviTimestamp(), tiltSensor->getNaviLatitude(), - tiltSensor->getNaviLongitude(), tiltSensor->getNaviAltitude()); - - systemPrintf("Tilt Status: 0x%04X - ", naviStatus); - - // 0 = No fix, 1 = 3D, 4 = RTK Fix - if (tiltSensor->getGnssSolutionState() == 4) - systemPrint("RTK Fix"); - else if (tiltSensor->getGnssSolutionState() == 1) - systemPrint("3D Fix"); - else if (tiltSensor->getGnssSolutionState() == 0) - systemPrint("No Fix"); - - if (tiltSensor->isCorrecting()) - systemPrint(" Compensating"); - - systemPrintln(); - - // if (naviStatus & (1 << 0)) - // systemPrintln("Status: Filter uninitialized"); // Finit 0x1 - if (naviStatus & (1 << 1)) - systemPrintln("Status: Filter convergence complete"); // Ready 0x2 - if (naviStatus & (1 << 2)) - systemPrintln("Status: In filter convergence"); // Inaccurate 0x4 - if (naviStatus & (1 << 3)) - systemPrintln("Status: Excessive tilt angle"); // TiltReject 0x8 - - if (naviStatus & (1 << 4)) - systemPrintln("Status: GNSS Positioning data difference"); // GnssReject 0x10 - if (naviStatus & (1 << 5)) - systemPrintln("Status: Filter Reset"); // FReset 0x20 - if (naviStatus & (1 << 6)) - systemPrintln("Status: Tilt estimation Phase 1"); // FixRlsStage1 0x40 - if (naviStatus & (1 << 7)) - systemPrintln("Status: Tilt estimation Phase 2"); // FixRlsStage2 0x80 - - if (naviStatus & (1 << 8)) - systemPrintln("Status: Tilt estimation Phase 3"); // FixRlsStage3 0x100 - if (naviStatus & (1 << 9)) - systemPrintln("Status: Tilt estimation Phase 4"); // FixRlsStage4 0x200 - if (naviStatus & (1 << 10)) - systemPrintln("Status: Tilt estimation Complete"); // FixRlsOK 0x400 - - if (naviStatus & (1 << 13)) - systemPrintln("Status: Initialize shaking direction 1"); // Direction1 0x2000 - if (naviStatus & (1 << 14)) - systemPrintln("Status: Initialize shaking direction 2"); // Direction2 0x4000 - - if (naviStatus & (1 << 16)) - systemPrintln("Status: Filter determines GNSS data is invalid"); // GnssLost 0x10000 - if (naviStatus & (1 << 17)) - systemPrintln("Status: Initialization complete"); // FInitOk 0x20000 - // if (naviStatus & (1 << 18)) - // systemPrintln("Status: PPS signal received"); // PPSReady 0x40000 - // if (naviStatus & (1 << 19)) - // systemPrintln("Status: Module time synchronization successful"); // SyncReady 0x80000 - // if (naviStatus & (1 << 20)) //0x100000 - // systemPrintln("Status: GNSS Connected"); //Module parses to RTK data "); // GnssConnect - // 0x100000 - if (naviStatus > 0x1FFFFF) - { - // Clear all lower/known bits - uint32_t bitsToShow = 0 ^ 0x1FFFFF; - systemPrintf("Status: Unknown status bits set: 0x%04X\r\n", naviStatus & bitsToShow); - } - - /*Datasheet initialization steps: - Step one: Rotate the receiver in hand, or shake it. - - Step two: If the heading angle becomes 0-180 degrees (or 0-(-180) degrees) it - means step two has been entered. Wait for RTK to output the fixed solution. - - Step three: Some rocking is required to make accuracy meet the requirements. Rock rod back and - forth for 5-6 seconds. Maintain the same speed when shaking. 1-2m/s is enough. Rotate the rod 90 - degrees and continue to rock until the init is complete. The status word becomes ready. - */ - } // End Debug IMU - } // End Check IMU state at 1Hz - - // If tilt is active, play short beep every 10 seconds - if ((online.tilt == true) && (millis() - lastTiltBeepMs > 10000)) + beepDurationMs(1000); // Audibly indicate the init of tilt + + lastTiltBeepMs = millis(); + + tiltState = TILT_INITIALIZED; + } + + // Check to see if tilt compensation is active + if (tiltSensor->isCorrecting()) { + beepDurationMs(2000); // Audibly indicate the start of tilt + lastTiltBeepMs = millis(); - beepDurationMs(250); + + tiltState = TILT_CORRECTING; } + } - else if (settings.enableTiltCompensation == false && online.imu == true) + break; + + case TILT_INITIALIZED: + // Waiting for user to rock unit back and forth + tiltSensor->update(); // Check for the most recent incoming binary data + + // Check IMU state at 1Hz + if (millis() - lastTiltCheck > 1000) { - tiltStop(); // If the user has disabled the device, shut it down + lastTiltCheck = millis(); + + if (settings.tiltPoleLength < 0.5) + systemPrintf("Warning: Short pole length detected: %0.2f\r\n", settings.tiltPoleLength); + + if (settings.enableImuDebug == true) + printTiltDebug(); + + // Check to see if tilt compensation is active + if (tiltSensor->isCorrecting()) + { + beepDurationMs(2000); // Audibly indicate the start of tilt + + lastTiltBeepMs = millis(); + + tiltState = TILT_CORRECTING; + } } - else if (settings.enableTiltCompensation == true && online.imu == false && tiltFailedBegin == false) + break; + + case TILT_CORRECTING: + // Check to see if we've stopped correcting + tiltSensor->update(); // Check for the most recent incoming binary data + + // Check IMU state at 1Hz + if (millis() - lastTiltCheck > 1000) { - // Try multiple times to configure IM19 - for (int x = 0; x < 3; x++) + lastTiltCheck = millis(); + + if (settings.enableImuDebug == true) + printTiltDebug(); + + // Check to see if tilt compensation is active + if (tiltSensor->isCorrecting() == false) { - beginTilt(); // Start IMU - if (online.imu == true) - break; - log_d("Tilt sensor failed to configure. Trying again."); + tiltState = TILT_STARTED; + + // Beep to indicating tilt went offline + beepDurationMs(1000); } + } - if (online.imu == false) // If we failed to begin, disable future attempts - tiltFailedBegin = true; + // If tilt compensation is active, play a short beep every 10 seconds + if (millis() - lastTiltBeepMs > 10000) + { + lastTiltBeepMs = millis(); + beepDurationMs(250); } + + break; } } -// Start communication with the IM19 IMU -void beginTilt() -{ - if (present.imu_im19 == false) - return; +/*Datasheet initialization steps: + Step one: Rotate the receiver in hand, or shake it. - if (settings.enableTiltCompensation == false) - return; + Step two: If the heading angle becomes 0-180 degrees (or 0-(-180) degrees) it + means step two has been entered. Wait for RTK to output the fixed solution. - if (online.imu == true) // Don't restart if already online - return; + Step three: Some rocking is required to make accuracy meet the requirements. Rock rod back and + forth for 5-6 seconds. Maintain the same speed when shaking. 1-2m/s is enough. Rotate the rod 90 + degrees and continue to rock until the init is complete. The status word becomes ready. +*/ +void printTiltDebug() +{ + uint32_t naviStatus = tiltSensor->getNaviStatus(); + // systemPrintf("NAVI timestamp: %0.0f lat: %0.4f lon: %0.4f alt: %0.2f\r\n", tiltSensor->getNaviTimestamp(), + // tiltSensor->getNaviLatitude(), tiltSensor->getNaviLongitude(), tiltSensor->getNaviAltitude()); + + systemPrint("Tilt "); + + if (tiltState == TILT_STARTED) + systemPrint("STARTED"); + else if (tiltState == TILT_INITIALIZED) + systemPrint("INITIALIZED"); + else if (tiltState == TILT_CORRECTING) + systemPrint("CORRECTING"); + + systemPrintf(" Status: 0x%04X - ", naviStatus); + + // 0 = No fix, 1 = 3D, 4 = RTK Fix + int solutionState = tiltSensor->getGnssSolutionState(); + if (solutionState == 4) + systemPrint("RTK Fix"); + else if (solutionState == 3) + systemPrint("RTK Float"); + else if (solutionState == 2) + systemPrint("DGPS Fix"); + else if (solutionState == 1) + systemPrint("3D Fix"); + else if (solutionState == 0) + systemPrint("No Fix"); + else + systemPrintf("solutionState %d", tiltSensor->getGnssSolutionState()); + + systemPrintln(); + + // if (naviStatus & (1 << 0)) + // systemPrintln("Status: Filter uninitialized"); // Finit 0x1 + if (naviStatus & (1 << 1)) + systemPrintln("Status: Filter convergence complete"); // Ready 0x2 + if (naviStatus & (1 << 2)) + systemPrintln("Status: In filter convergence"); // Inaccurate 0x4 + if (naviStatus & (1 << 3)) + systemPrintln("Status: Excessive tilt angle"); // TiltReject 0x8 + + if (naviStatus & (1 << 4)) + systemPrintln("Status: GNSS Positioning data difference"); // GnssReject 0x10 + if (naviStatus & (1 << 5)) + systemPrintln("Status: Filter Reset"); // FReset 0x20 + if (naviStatus & (1 << 6)) + systemPrintln("Status: Tilt estimation Phase 1"); // FixRlsStage1 0x40 + if (naviStatus & (1 << 7)) + systemPrintln("Status: Tilt estimation Phase 2"); // FixRlsStage2 0x80 + + if (naviStatus & (1 << 8)) + systemPrintln("Status: Tilt estimation Phase 3"); // FixRlsStage3 0x100 + if (naviStatus & (1 << 9)) + systemPrintln("Status: Tilt estimation Phase 4"); // FixRlsStage4 0x200 + if (naviStatus & (1 << 10)) + systemPrintln("Status: Tilt estimation Complete"); // FixRlsOK 0x400 + + if (naviStatus & (1 << 13)) + systemPrintln("Status: Initialize shaking direction 1"); // Direction1 0x2000 + if (naviStatus & (1 << 14)) + systemPrintln("Status: Initialize shaking direction 2"); // Direction2 0x4000 + + if (naviStatus & (1 << 16)) + systemPrintln("Status: Filter determines GNSS data is invalid"); // GnssLost 0x10000 + if (naviStatus & (1 << 17)) + systemPrintln("Status: Initialization complete"); // FInitOk 0x20000 + // if (naviStatus & (1 << 18)) + // systemPrintln("Status: PPS signal received"); // PPSReady 0x40000 + // if (naviStatus & (1 << 19)) + // systemPrintln("Status: Module time synchronization successful"); // SyncReady 0x80000 + // if (naviStatus & (1 << 20)) //0x100000 + // systemPrintln("Status: GNSS Connected"); //Module parses to RTK data "); // GnssConnect + // 0x100000 + if (naviStatus > 0x1FFFFF) + { + // Clear all lower/known bits + uint32_t bitsToShow = 0 ^ 0x1FFFFF; + systemPrintf("Status: Unknown status bits set: 0x%04X\r\n", naviStatus & bitsToShow); + } +} +// Start communication with the IM19 IMU +void beginTilt() +{ tiltSensor = new IM19(); SerialForTilt = new HardwareSerial(1); // Use UART1 on the ESP32 to receive IMU corrections @@ -246,18 +322,11 @@ void beginTilt() if (tiltSensor->begin(*SerialForTilt) == false) // Give the serial port over to the library { log_d("Tilt sensor failed to respond."); + tiltStop(); // Free memory return; } systemPrintln("Tilt sensor online."); - // tiltSensor->factoryReset(); - - // while (tiltSensor->isConnected() == false) - // { - // systemPrintln("waiting for sensor to reset"); - // delay(1000); - // } - bool result = true; // The filter has a set of default parameters, which can be loaded when setting an error. @@ -315,9 +384,12 @@ void beginTilt() if (tiltSensor->saveConfiguration() == true) { log_d("IM19 configuration saved"); - online.imu = true; + tiltState = TILT_STARTED; + return; // Success } } + + tiltStop(); // Free memory } void tiltStop() @@ -329,12 +401,25 @@ void tiltStop() delete SerialForTilt; SerialForTilt = nullptr; - online.imu = false; - - if (online.tilt == true) + if (tiltState == TILT_CORRECTING) beepDurationMs(1000); // Indicate we are going offline - online.tilt = false; + tiltState = TILT_OFFLINE; +} + +bool tiltIsCorrecting() +{ + if (tiltState == TILT_CORRECTING) + return (true); + + return (false); +} + +// Restore the tilt sensor to factory settings +void tiltSensorFactoryReset() +{ + if(tiltState >= TILT_STARTED) + tiltSensor->factoryReset(); } // Given a NMEA sentence, modify the sentence to use the latest tilt-compensated lat/lon/alt @@ -780,10 +865,4 @@ void tiltApplyCompensationGGA(char *nmeaSentence, int arraySize) systemPrintf("Compensated GNGGA: %s\r\n", nmeaSentence); } -// Restore the tilt sensor to factory settings -void tiltSensorFactoryReset() -{ - tiltSensor->factoryReset(); -} - #endif // COMPILE_IM19_IMU diff --git a/Firmware/RTK_Everywhere/menuMain.ino b/Firmware/RTK_Everywhere/menuMain.ino index 74e0b266c..c2487dd6d 100644 --- a/Firmware/RTK_Everywhere/menuMain.ino +++ b/Firmware/RTK_Everywhere/menuMain.ino @@ -402,8 +402,7 @@ void factoryReset(bool alreadyHasSemaphore) } } - if (online.imu == true) - tiltSensorFactoryReset(); + tiltSensorFactoryReset(); systemPrintln("Formatting internal file system..."); LittleFS.format(); diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index c62082aff..6e43b7c52 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1281,8 +1281,6 @@ struct struct_online bool pvtUdpServer = false; ethernetStatus_e ethernetStatus = ETH_NOT_STARTED; bool ethernetNTPServer = false; // EthernetUDP - bool imu = false; // Online when the imu/tilt sensor is configured - bool tilt = false; // Online when the tilt sensor is actively compensating position bool otaFirmwareUpdate = false; bool bluetooth = false; bool mqttClient = false; From 6991e6d5d513225ad196ec85a5fb0d79336c411c Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 12 Mar 2024 14:40:24 -0600 Subject: [PATCH 006/112] Add missing developer functions --- Firmware/RTK_Everywhere/Developer.ino | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index 2af81da84..7a229cf1c 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -211,7 +211,6 @@ bool um980IsValidTime() {return false;} void um980PrintInfo() {} int um980PushRawData(uint8_t *dataToSend, int dataLength) {return 0;} bool um980SaveConfiguration() {} -void tiltSensorFactoryReset() {} void um980SetBaudRateCOM3(uint32_t baudRate) {} bool um980SetConstellations() {return false;} void um980SetMinCNO(uint8_t cnoValue) {} @@ -225,6 +224,16 @@ void um980Boot() {} void um980Reset() {} uint8_t um980GetLeapSeconds() {return (0);} bool um980IsBlocking() {return(false);} +uint8_t um980GetActiveMessageCount() {return(0);} +void um980MenuMessages(){} +void um980BaseRtcmDefault(){} +void um980BaseRtcmLowDataRate(){} +char * um980GetRtcmDefaultString() {return ("Not compiled");} +char * um980GetRtcmLowDataRateString() {return ("Not compiled");} +float um980GetSurveyInStartingAccuracy() {return(0.0);} +void um980MenuConstellations(){} +double um980GetRateS() {return(0.0);} +void um980MenuMessagesSubtype(float *localMessageRate, const char *messageType){} #endif // COMPILE_UM980 From 8e2a4146170d9e91d6e58053905be53fc5286cca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Mar 2024 20:41:57 +0000 Subject: [PATCH 007/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index d9ce1e603..085ab99e4 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x18, 0x71, 0xEB, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x14, 0xBE, 0xF0, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x18, 0x71, 0xEB, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x14, 0xBE, 0xF0, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 8055c7e8d6b2c0ea60e7531d332ca15635d191c4 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Tue, 12 Mar 2024 15:11:18 -0600 Subject: [PATCH 008/112] Workflow: Enable PSRAM --- .github/workflows/compile-rtk-everywhere.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-rtk-everywhere.yml b/.github/workflows/compile-rtk-everywhere.yml index 8ecc05328..86be16dee 100644 --- a/.github/workflows/compile-rtk-everywhere.yml +++ b/.github/workflows/compile-rtk-everywhere.yml @@ -133,7 +133,7 @@ jobs: cp Firmware/RTKEverywhere.csv /home/runner/.arduino15/packages/esp32/hardware/esp32/2.0.11/tools/partitions/RTKEverywhere.csv - name: Compile Sketch - run: arduino-cli compile --fqbn "esp32:esp32:esp32":DebugLevel=${{ env.DEBUG_LEVEL }} ./Firmware/RTK_Everywhere/RTK_Everywhere.ino + run: arduino-cli compile --fqbn "esp32:esp32:esp32":DebugLevel=${{ env.DEBUG_LEVEL }},PSRAM=enabled ./Firmware/RTK_Everywhere/RTK_Everywhere.ino --build-property build.partitions=RTKEverywhere --build-property upload.maximum_size=3145728 --build-property "compiler.cpp.extra_flags=\"-DPOINTPERFECT_LBAND_PAID_TOKEN=$POINTPERFECT_LBAND_PAID_TOKEN\" \"-DPOINTPERFECT_LBAND_FREE_TOKEN=$POINTPERFECT_LBAND_FREE_TOKEN\" \"-DPOINTPERFECT_IP_PAID_TOKEN=$POINTPERFECT_IP_PAID_TOKEN\" \"-DPOINTPERFECT_IP_FREE_TOKEN=$POINTPERFECT_IP_FREE_TOKEN\" \"-DFIRMWARE_VERSION_MAJOR=$FIRMWARE_VERSION_MAJOR\" \"-DFIRMWARE_VERSION_MINOR=$FIRMWARE_VERSION_MINOR\" \"-DENABLE_DEVELOPER=${{ env.ENABLE_DEVELOPER }}\"" From 09de31579f0feda1a1fcdbb7264c2fab4b115efc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 12 Mar 2024 21:13:36 +0000 Subject: [PATCH 009/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 085ab99e4..2fbb59a92 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x14, 0xBE, 0xF0, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x7F, 0xC5, 0xF0, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x14, 0xBE, 0xF0, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x7F, 0xC5, 0xF0, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 36109428f29172ac88ac611f85b40507fa76e58f Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 15 Mar 2024 12:12:28 +0000 Subject: [PATCH 010/112] Make display agnostic of I2C bus --- Firmware/RTK_Everywhere/Begin.ino | 29 ++++++++++++++++++---- Firmware/RTK_Everywhere/Display.ino | 9 ++++--- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 4 +-- Firmware/RTK_Everywhere/Tasks.ino | 2 +- Firmware/RTK_Everywhere/menuSystem.ino | 2 +- Firmware/RTK_Everywhere/settings.h | 7 ++++-- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 59b4f4618..2cd242166 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -208,7 +208,9 @@ void beginBoard() present.antennaShortOpen = true; present.timePulseInterrupt = true; present.i2c0BusSpeed_400 = true; // Run bus at higher speed - present.display_128x64_i2c1 = true; + present.i2c1 = true; + present.display_i2c1 = true; + present.display_128x64 = true; present.i2c1BusSpeed_400 = true; // Run display bus at higher speed // Pin Allocations: @@ -279,7 +281,8 @@ void beginBoard() present.psram_2mb = true; present.gnss_zedf9p = true; present.microSd = true; - present.display_64x48_i2c0 = true; + present.display_i2c0 = true; + present.display_64x48 = true; present.button_powerLow = true; // Button is pressed when low present.battery_max17048 = true; present.portDataMux = true; @@ -944,10 +947,26 @@ void beginI2C() { TaskHandle_t taskHandle; - if (present.display_128x64_i2c1 == true) + if (present.i2c1 == true) { - // Display is on I2C bus 1 i2c_1 = new TwoWire(1); + } + + if ((present.display_i2c0 == true) && (present.display_i2c1 == true)) + reportFatalError("Displays on both i2c_0 and i2c_1"); + + if (present.display_i2c0 == true) + { + // Display is on standard Wire bus + i2cDisplay = i2c_0; + } + + if (present.display_i2c1 == true) + { + if (present.i2c1 == false) + reportFatalError("No i2c1 for display_i2c1"); + + // Display is on I2C bus 1 i2cDisplay = i2c_1; // Display splash screen for at least 1 second @@ -994,7 +1013,7 @@ void pinI2CTask(void *pvParameters) online.i2c = true; // Initialize I2C bus 1 - if (i2c_1) + if (present.i2c1) { int bus1speed = 100; if (present.i2c1BusSpeed_400 == true) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index d12c86812..7a35425b3 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -100,16 +100,19 @@ bool ssidDisplayFirstHalf = false; void beginDisplay(TwoWire *i2cBus) { - if (present.display_64x48_i2c0 == false && present.display_128x64_i2c1 == false) + if (present.display_64x48 == false && present.display_128x64 == false) return; + if (i2cBus == nullptr) + reportFatalError("Illegal display i2cBus"); + uint8_t i2cAddress; uint16_t x; uint16_t y; // Setup the appropriate display - if (present.display_64x48_i2c0 == true) + if (present.display_64x48 == true) { i2cAddress = kOLEDMicroDefaultAddress; oled = new QwiicCustomOLED; @@ -129,7 +132,7 @@ void beginDisplay(TwoWire *i2cBus) oled->setVcomDeselect(kOLEDMicroVCOM); } - if (present.display_128x64_i2c1 == true) + if (present.display_128x64 == true) { i2cAddress = kOLEDMicroDefaultAddress; diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 91bebdb64..2b8ee4b83 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -142,8 +142,8 @@ int pin_beeper = PIN_UNDEFINED; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #include //Built-in TwoWire *i2c_0 = &Wire; -TwoWire *i2c_1; -TwoWire *i2cDisplay; +TwoWire *i2c_1 = nullptr; +TwoWire *i2cDisplay = nullptr; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // LittleFS for storing settings for different user profiles diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 9297e130e..54e62ccaa 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1268,7 +1268,7 @@ void buttonCheckTask(void *e) userBtn->read(); - if (present.imu_im19 && present.display_64x48_i2c0 == false && present.display_128x64_i2c1 == false) + if (present.imu_im19 && present.display_64x48 == false && present.display_128x64 == false) { // Platform has no display and tile, ie RTK Torch diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index d110ed735..f8f823521 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -27,7 +27,7 @@ void menuSystem() else systemPrintln("Offline"); - if (present.display_128x64_i2c1 || present.display_64x48_i2c0) + if (present.display_128x64 || present.display_64x48) { systemPrint("Display: "); if (online.display == true) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 6e43b7c52..c0eec6b09 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1237,8 +1237,11 @@ struct struct_present bool i2c0BusSpeed_400 = false; bool i2c1BusSpeed_400 = false; - bool display_64x48_i2c0 = false; - bool display_128x64_i2c1 = false; + bool i2c1 = false; + bool display_i2c0 = false; + bool display_i2c1 = false; + bool display_64x48 = false; + bool display_128x64 = false; bool battery_max17048 = false; bool battery_bq40z50 = false; From c16bf5ade3360a0fa6053e66288a1e9930a3582d Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 15 Mar 2024 12:45:58 +0000 Subject: [PATCH 011/112] Change pin_dac26 to pin_muxDAC, pin_adc39 to pin_muxADC --- Firmware/RTK_Everywhere/Display.ino | 12 ++++++------ Firmware/RTK_Everywhere/RTK_Everywhere.ino | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 7a35425b3..c4fe2a856 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -2350,14 +2350,14 @@ void paintSystemTest() // Set mux to channel 3 and toggle pin and verify with loop back jumper wire inserted by test technician setMuxport(MUX_ADC_DAC); // Set mux to DAC so we can toggle back/forth - pinMode(pin_dac26, OUTPUT); - pinMode(pin_adc39, INPUT_PULLUP); + pinMode(pin_muxDAC, OUTPUT); + pinMode(pin_muxADC, INPUT_PULLUP); - digitalWrite(pin_dac26, HIGH); - if (digitalRead(pin_adc39) == HIGH) + digitalWrite(pin_muxDAC, HIGH); + if (digitalRead(pin_muxADC) == HIGH) { - digitalWrite(pin_dac26, LOW); - if (digitalRead(pin_adc39) == LOW) + digitalWrite(pin_muxDAC, LOW); + if (digitalRead(pin_muxADC) == LOW) oled->print("OK"); else oled->print("FAIL"); diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 2b8ee4b83..ff151cf16 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -96,8 +96,8 @@ int pin_powerSenseAndControl = PIN_UNDEFINED; // Power button and power down I/O int pin_modeButton = PIN_UNDEFINED; // Mode button on EVK int pin_powerButton = PIN_UNDEFINED; // Power and general purpose button on Torch int pin_powerFastOff = PIN_UNDEFINED; // Output on Facet -int pin_dac26 = PIN_UNDEFINED; -int pin_adc39 = PIN_UNDEFINED; +int pin_muxDAC = PIN_UNDEFINED; +int pin_muxADC = PIN_UNDEFINED; int pin_peripheralPowerControl = PIN_UNDEFINED; // EVK int pin_radio_rx = PIN_UNDEFINED; From 4a0155f539bb6227e9fbc9873ab51999780f630c Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 15 Mar 2024 15:10:44 +0000 Subject: [PATCH 012/112] Starting to add Facet mosaic support --- Firmware/RTK_Everywhere/Begin.ino | 56 +++++++++++++++++++++- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 5 +- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 2cd242166..ab7a8460e 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -73,6 +73,10 @@ void identifyBoard() else if (idWithAdc(idValue, 10, 100)) productVariant = RTK_EVK; + // Facet mosaic: 1/4.7 --> 2674mV < 2721mV < 2766mV + else if (idWithAdc(idValue, 1, 4.7)) + productVariant = RTK_FACET_MOSAIC; + // ID resistors do not exist for the following: // Torch else @@ -80,6 +84,8 @@ void identifyBoard() log_d("Out of band or nonexistent resistor IDs"); // Check if a bq40Z50 battery manager is on the I2C bus + if (i2c_0 == nullptr) + i2c_0 = new TwoWire(0); int pin_SDA = 15; int pin_SCL = 4; @@ -276,9 +282,10 @@ void beginBoard() pinMode(pin_peripheralPowerControl, OUTPUT); peripheralsOn(); // Turn on power to OLED, SD, ZED, NEO, USB Hub, } + else if (productVariant == RTK_FACET_V2) { - present.psram_2mb = true; + present.psram_4mb = true; present.gnss_zedf9p = true; present.microSd = true; present.display_i2c0 = true; @@ -297,6 +304,47 @@ void beginBoard() pinMode(pin_powerFastOff, OUTPUT); digitalWrite(pin_powerFastOff, HIGH); // Stay on } + + else if (productVariant == RTK_FACET_MOSAIC) + { + present.psram_4mb = true; + present.gnss_mosaic = true; + present.display_i2c0 = true; + present.display_64x48 = true; + present.i2c0BusSpeed_400 = true; + present.peripheralPowerControl = true; + present.button_powerLow = true; // Button is pressed when low + present.battery_max17048 = true; + present.portDataMux = true; + present.fastPowerOff = true; + + pin_batteryStatusLED = 34; + pin_muxA = 18; + pin_muxB = 19; + pin_powerSenseAndControl = 32; + pin_powerFastOff = 33; + pin_muxDAC = 26; + pin_muxADC = 39; + pin_peripheralPowerControl = 27; + pin_I2C0_SDA = 21; + pin_I2C0_SCL = 22; + pin_GnssUart_RX = 13; + pin_GnssUart_TX = 14; + pin_GnssLBandUart_RX = 4; + pin_GnssLBandUart_TX = 25; + + pinMode(pin_muxA, OUTPUT); + pinMode(pin_muxB, OUTPUT); + + //pinMode(pin_powerFastOff, OUTPUT); + //digitalWrite(pin_powerFastOff, HIGH); // Stay on + pinMode(pin_powerFastOff, INPUT); + + // Turn on power to the mosaic and OLED + DMW_if systemPrintf("pin_peripheralPowerControl: %d\r\n", pin_peripheralPowerControl); + pinMode(pin_peripheralPowerControl, OUTPUT); + peripheralsOn(); // Turn on power to OLED, SD, ZED, NEO, USB Hub, + } } void beginVersion() @@ -947,9 +995,13 @@ void beginI2C() { TaskHandle_t taskHandle; + if (i2c_0 == nullptr) // i2c_0 could have been instantiated by identifyBoard + i2c_0 = new TwoWire(0); + if (present.i2c1 == true) { - i2c_1 = new TwoWire(1); + if (i2c_1 == nullptr) + i2c_1 = new TwoWire(1); } if ((present.display_i2c0 == true) && (present.display_i2c1 == true)) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index ff151cf16..b16e4ba8e 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -129,6 +129,9 @@ int pin_I2C1_SCL = PIN_UNDEFINED; int pin_GnssUart_RX = PIN_UNDEFINED; int pin_GnssUart_TX = PIN_UNDEFINED; +int pin_GnssLBandUart_RX = PIN_UNDEFINED; +int pin_GnssLBandUart_TX = PIN_UNDEFINED; + int pin_IMU_RX = PIN_UNDEFINED; int pin_IMU_TX = PIN_UNDEFINED; int pin_GNSS_DR_Reset = PIN_UNDEFINED; @@ -141,7 +144,7 @@ int pin_beeper = PIN_UNDEFINED; // I2C for GNSS, battery gauge, display //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #include //Built-in -TwoWire *i2c_0 = &Wire; +TwoWire *i2c_0 = nullptr; TwoWire *i2c_1 = nullptr; TwoWire *i2cDisplay = nullptr; //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- From a847fc865a21bf2dae492cee2313f8077a419301 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 20 Mar 2024 13:45:08 +0000 Subject: [PATCH 013/112] Update non-release-build.yml --- .github/workflows/non-release-build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/non-release-build.yml b/.github/workflows/non-release-build.yml index e66dfff5e..b000a4f30 100644 --- a/.github/workflows/non-release-build.yml +++ b/.github/workflows/non-release-build.yml @@ -154,8 +154,6 @@ jobs: cd Firmware/RTK_Everywhere/build/esp32.esp32.esp32/ mkdir ${{ env.ARTIFACT }} mv RTK_Everywhere.ino.bin ${{ env.ARTIFACT }} - mv RTK_Everywhere.ino.bootloader.bin ${{ env.ARTIFACT }} - mv RTK_Everywhere.ino.partitions.bin ${{ env.ARTIFACT }} - name: Upload artifact directory to action - avoid double-zip uses: actions/upload-artifact@v3 From af7e1c030b0bbdda836613ba295d44d5dd0c71bd Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 14:12:01 -0600 Subject: [PATCH 014/112] Rename zedSurveyInStartingAccuracy --- Firmware/RTK_Everywhere/GNSS.ino | 2 +- Firmware/RTK_Everywhere/NVM.ino | 6 +++--- Firmware/RTK_Everywhere/ZED.ino | 2 +- Firmware/RTK_Everywhere/menuBase.ino | 2 +- Firmware/RTK_Everywhere/menuCommands.ino | 10 +++++----- Firmware/RTK_Everywhere/settings.h | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Firmware/RTK_Everywhere/GNSS.ino b/Firmware/RTK_Everywhere/GNSS.ino index 2fdeaf40a..b013e9be7 100644 --- a/Firmware/RTK_Everywhere/GNSS.ino +++ b/Firmware/RTK_Everywhere/GNSS.ino @@ -1262,4 +1262,4 @@ void gnssMenuConstellations() { um980MenuConstellations(); } -} \ No newline at end of file +} diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index 3b42d5361..069fb8184 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -192,7 +192,7 @@ void recordSystemSettingsToFile(File *settingsFile) settingsFile->printf("%s=%0.4f\r\n", "fixedAltitude", settings.fixedAltitude); settingsFile->printf("%s=%d\r\n", "dataPortBaud", settings.dataPortBaud); settingsFile->printf("%s=%d\r\n", "radioPortBaud", settings.radioPortBaud); - settingsFile->printf("%s=%0.1f\r\n", "surveyInStartingAccuracy", settings.surveyInStartingAccuracy); + settingsFile->printf("%s=%0.1f\r\n", "zedSurveyInStartingAccuracy", settings.zedSurveyInStartingAccuracy); settingsFile->printf("%s=%d\r\n", "measurementRate", settings.measurementRate); settingsFile->printf("%s=%d\r\n", "navigationRate", settings.navigationRate); settingsFile->printf("%s=%d\r\n", "debugGnss", settings.debugGnss); @@ -895,8 +895,8 @@ bool parseLine(char *str, Settings *settings) settings->updateGNSSSettings = true; } } - else if (strcmp(settingName, "surveyInStartingAccuracy") == 0) - settings->surveyInStartingAccuracy = d; + else if (strcmp(settingName, "zedSurveyInStartingAccuracy") == 0) + settings->zedSurveyInStartingAccuracy = d; else if (strcmp(settingName, "measurementRate") == 0) { if (settings->measurementRate != d) diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index d12b3d736..2c2f3e935 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -1664,7 +1664,7 @@ char *zedGetRtcmLowDataRateString() float zedGetSurveyInStartingAccuracy() { - return (settings.surveyInStartingAccuracy); + return (settings.zedSurveyInStartingAccuracy); } // Controls the constellations that are used to generate a fix and logged diff --git a/Firmware/RTK_Everywhere/menuBase.ino b/Firmware/RTK_Everywhere/menuBase.ino index 53fc29f75..53aa3d958 100644 --- a/Firmware/RTK_Everywhere/menuBase.ino +++ b/Firmware/RTK_Everywhere/menuBase.ino @@ -258,7 +258,7 @@ void menuBase() if (present.gnss_zedf9p == true) { getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, - (double)maxSurveyInStartingAccuracy, &settings.surveyInStartingAccuracy); + (double)maxSurveyInStartingAccuracy, &settings.zedSurveyInStartingAccuracy); } else if (present.gnss_um980 == true) getNewSetting("Enter the positional accuracy required before Survey-In begins", 0.1, diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 1f4025f44..9fdb88309 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -137,8 +137,8 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr settings.dataPortBaud = settingValue; else if (strcmp(settingName, "radioPortBaud") == 0) settings.radioPortBaud = settingValue; - else if (strcmp(settingName, "surveyInStartingAccuracy") == 0) - settings.surveyInStartingAccuracy = settingValue; + else if (strcmp(settingName, "zedSurveyInStartingAccuracy") == 0) + settings.zedSurveyInStartingAccuracy = settingValue; else if (strcmp(settingName, "measurementRateHz") == 0) { settings.measurementRate = (int)(1000.0 / settingValue); @@ -1018,7 +1018,7 @@ void createSettingsString(char *newSettings) stringRecord(newSettings, "dataPortBaud", settings.dataPortBaud); stringRecord(newSettings, "radioPortBaud", settings.radioPortBaud); - stringRecord(newSettings, "surveyInStartingAccuracy", settings.surveyInStartingAccuracy, 1); + stringRecord(newSettings, "zedSurveyInStartingAccuracy", settings.zedSurveyInStartingAccuracy, 1); stringRecord(newSettings, "measurementRateHz", 1000.0 / settings.measurementRate, 2); // 2 = decimals to print stringRecord(newSettings, "debugGnss", settings.debugGnss); stringRecord(newSettings, "enableHeapReport", settings.enableHeapReport); @@ -1647,8 +1647,8 @@ void getSettingValue(const char *settingName, char *settingValueStr) writeToString(settingValueStr, settings.dataPortBaud); else if (strcmp(settingName, "radioPortBaud") == 0) writeToString(settingValueStr, settings.radioPortBaud); - else if (strcmp(settingName, "surveyInStartingAccuracy") == 0) - writeToString(settingValueStr, settings.surveyInStartingAccuracy); + else if (strcmp(settingName, "zedSurveyInStartingAccuracy") == 0) + writeToString(settingValueStr, settings.zedSurveyInStartingAccuracy); else if (strcmp(settingName, "measurementRate") == 0) writeToString(settingValueStr, settings.measurementRate); else if (strcmp(settingName, "navigationRate") == 0) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index c0eec6b09..5f686c294 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -937,7 +937,7 @@ typedef struct uint32_t dataPortBaud = (115200 * 2); // Default to 230400bps. This limits GNSS fixes at 4Hz but allows SD buffer to be reduced to 6k. uint32_t radioPortBaud = 57600; // Default to 57600bps to support connection to SiK1000 type telemetry radios - float surveyInStartingAccuracy = 1.0; // Wait for 1m horizontal positional accuracy before starting survey in + float zedSurveyInStartingAccuracy = 1.0; // Wait for this horizontal positional accuracy in meters before starting survey in uint16_t measurementRate = 250; // Elapsed ms between GNSS measurements. 25ms to 65535ms. Default 4Hz. uint16_t navigationRate = 1; // Ratio between number of measurements and navigation solutions. Default 1 for 4Hz (with measurementRate). @@ -1196,7 +1196,7 @@ typedef struct bool enablePsram = true; // Control the use on onboard PSRAM. Used for testing behavior when PSRAM is not available. bool printTaskStartStop = false; uint16_t psramMallocLevel = 40; // By default, push as much as possible to PSRAM. Needed to do secure WiFi (MQTT) + BT + PPL - float um980SurveyInStartingAccuracy = 2.0; // Wait for 2m horizontal positional accuracy before starting survey in + float um980SurveyInStartingAccuracy = 2.0; // Wait for this horizontal positional accuracy in meters before starting survey in bool enableBeeper = true; // Some platforms have an audible notification uint16_t um980MeasurementRateMs = 500; // Elapsed ms between GNSS measurements. 50ms to 65535ms. Default 2Hz. bool enableImuCompensationDebug = false; From 751c39a0acff9b47ee8a179809597979308e50bf Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 14:12:24 -0600 Subject: [PATCH 015/112] Correctly check starting accuracy --- Firmware/RTK_Everywhere/States.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 441d1cc5c..6430523d6 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -271,12 +271,12 @@ void stateUpdate() char accuracy[20]; char temp[20]; const char *units = getHpaUnits(hpa, temp, sizeof(temp), 2); - const char *accUnits = getHpaUnits(settings.surveyInStartingAccuracy, accuracy, sizeof(accuracy), 2); + const char *accUnits = getHpaUnits(gnssGetSurveyInStartingAccuracy(), accuracy, sizeof(accuracy), 2); systemPrintf("Waiting for Horz Accuracy < %s (%s): %s%s%s%s, SIV: %d\r\n", accuracy, accUnits, temp, (accUnits != units) ? " (" : "", (accUnits != units) ? units : "", (accUnits != units) ? ")" : "", siv); - if (hpa > 0.0 && hpa < settings.surveyInStartingAccuracy) + if (hpa > 0.0 && hpa < gnssGetSurveyInStartingAccuracy()) { displaySurveyStart(0); // Show 'Survey' From baeb08b580edb92b8d8b047cddd1e55e022ac45b Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 14:17:27 -0600 Subject: [PATCH 016/112] Add prelim command list --- Firmware/RTK_Everywhere/menuCommands.ino | 94 ++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 9fdb88309..e729da26e 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -65,6 +65,13 @@ void menuCommands() ESP.restart(); return; } + else if (strcmp(tokens[0], "LIST") == 0) + { + systemPrintln("OK"); + printAvailableSettings(); + return; + } + else { systemPrintln("ERROR"); @@ -2247,3 +2254,90 @@ void getSettingValue(const char *settingName, char *settingValueStr) } // End last strcpy catch } + +// List available settings and their type in CSV +// See issue: https://github.com/sparkfun/SparkFun_RTK_Everywhere_Firmware/issues/190 +void printAvailableSettings() +{ + systemPrint("printDebugMessages,bool,"); + systemPrint("enableSD,bool,"); + systemPrint("enableDisplay,bool,"); + systemPrint("maxLogTime_minutes,int,"); + systemPrint("maxLogLength_minutes,int,"); + systemPrint("observationSeconds,int,"); + systemPrint("observationPositionAccuracy,float,"); + systemPrint("fixedBase,bool,"); + systemPrint("fixedBaseCoordinateType,bool,"); + systemPrint("fixedEcefX,double,"); + systemPrint("fixedEcefY,double,"); + systemPrint("fixedEcefZ,double,"); + systemPrint("fixedLat,double,"); + systemPrint("fixedLong,double,"); + systemPrint("fixedAltitude,double,"); + systemPrint("dataPortBaud,uint32_t,"); + systemPrint("radioPortBaud,uint32_t,"); + systemPrint("surveyInStartingAccuracy,float,"); + systemPrint("measurementRate,uint16_t,"); + systemPrint("navigationRate,uint16_t,"); + systemPrint("debugGnss,bool,"); + systemPrint("enableHeapReport,bool,"); + systemPrint("enableTaskReports,bool,"); + systemPrint("dataPortChannel,muxConnectionType_e,"); + systemPrint("spiFrequency,uint16_t,"); + systemPrint("enableLogging,bool,"); + systemPrint("enableARPLogging,bool,"); + systemPrint("ARPLoggingInterval_s,uint16_t,"); + systemPrint("sppRxQueueSize,uint16_t,"); + systemPrint("sppTxQueueSize,uint16_t,"); + systemPrint("dynamicModel,uint8_t,"); + systemPrint("lastState,SystemState,"); + systemPrint("enableResetDisplay,bool,"); + systemPrint("resetCount,uint8_t,"); + systemPrint("enableExternalPulse,bool,"); + systemPrint("externalPulseTimeBetweenPulse_us,uint64_t,"); + systemPrint("externalPulseLength_us,uint64_t,"); + systemPrint("externalPulsePolarity,pulseEdgeType_e,"); + systemPrint("enableExternalHardwareEventLogging,bool,"); + systemPrint("enableUART2UBXIn,bool,"); + + systemPrint("ubxMessageRates,uint8_t,"); + systemPrintf("ubxConstellations,ubxConstellation[%d],", sizeof(settings.ubxConstellations) / sizeof(ubxConstellation)); + + systemPrintf("profileName,char[%d],", sizeof(settings.profileName) / sizeof(char)); + + systemPrint("serialTimeoutGNSS,int16_t,"); + + // Point Perfect + systemPrintf("pointPerfectDeviceProfileToken,char[%d],", sizeof(settings.pointPerfectDeviceProfileToken) / sizeof(char)); + systemPrint("pointPerfectCorrectionsSource,PointPerfect_Corrections_Source,"); + systemPrint("autoKeyRenewal,bool,"); + systemPrintf("pointPerfectClientID,char[%d],", sizeof(settings.pointPerfectClientID) / sizeof(char)); + systemPrintf("pointPerfectBrokerHost,char[%d],", sizeof(settings.pointPerfectBrokerHost) / sizeof(char)); + systemPrintf("pointPerfectLBandTopic,char[%d],", sizeof(settings.pointPerfectLBandTopic) / sizeof(char)); + systemPrintf("pointPerfectCurrentKey,char[%d],", sizeof(settings.pointPerfectCurrentKey) / sizeof(char)); + systemPrint("pointPerfectCurrentKeyDuration,uint64_t,"); + systemPrint("pointPerfectCurrentKeyStart,uint64_t,"); + + systemPrintf("pointPerfectNextKey,char[%d],", sizeof(settings.pointPerfectNextKey) / sizeof(char)); + systemPrint("pointPerfectNextKeyDuration,uint64_t,"); + systemPrint("pointPerfectNextKeyStart,uint64_t,"); + + systemPrint("lastKeyAttempt,uint64_t,"); + systemPrint("updateGNSSSettings,bool,"); + systemPrint("LBandFreq,uint32_t,"); + + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + systemPrint(",,"); + + + systemPrint(",,"); + systemPrintln(); +} From 995aff739562a82944109a54f1e9a209b0ce5e2d Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 16:08:21 -0600 Subject: [PATCH 017/112] Add inBaseMode() --- Firmware/RTK_Everywhere/Bluetooth.ino | 2 +- Firmware/RTK_Everywhere/Ethernet.ino | 3 +-- Firmware/RTK_Everywhere/NtripServer.ino | 3 +-- Firmware/RTK_Everywhere/States.ino | 7 +++++++ Firmware/RTK_Everywhere/Tasks.ino | 2 +- Firmware/RTK_Everywhere/WiFi.ino | 3 +-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/Bluetooth.ino b/Firmware/RTK_Everywhere/Bluetooth.ino index 05c3b772d..ceb67e0ce 100644 --- a/Firmware/RTK_Everywhere/Bluetooth.ino +++ b/Firmware/RTK_Everywhere/Bluetooth.ino @@ -224,7 +224,7 @@ void bluetoothStart() char stateName[11] = {0}; if (systemState >= STATE_ROVER_NOT_STARTED && systemState <= STATE_ROVER_RTK_FIX) strncpy(stateName, "Rover-", sizeof(stateName) - 1); - else if (systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING) + else if (inBaseMode() == true) strncpy(stateName, "Base-", sizeof(stateName) - 1); else { diff --git a/Firmware/RTK_Everywhere/Ethernet.ino b/Firmware/RTK_Everywhere/Ethernet.ino index a753341dd..e13847c6e 100644 --- a/Firmware/RTK_Everywhere/Ethernet.ino +++ b/Firmware/RTK_Everywhere/Ethernet.ino @@ -242,8 +242,7 @@ bool ethernetIsNeeded() return true; // Does Base mode NTRIP Server need Ethernet? - if (settings.enableNtripServer == true && - (systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING)) + if (settings.enableNtripServer == true && inBaseMode() == true) return true; // Does Rover mode NTRIP Client need Ethernet? diff --git a/Firmware/RTK_Everywhere/NtripServer.ino b/Firmware/RTK_Everywhere/NtripServer.ino index d266778af..ae245263f 100644 --- a/Firmware/RTK_Everywhere/NtripServer.ino +++ b/Firmware/RTK_Everywhere/NtripServer.ino @@ -337,8 +337,7 @@ void ntripServerPrintStatus() byte minutes; byte seconds; - if (settings.enableNtripServer == true && - (systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING)) + if (settings.enableNtripServer == true && inBaseMode()) { systemPrint("NTRIP Server "); ntripServerPrintStateSummary(); diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 6430523d6..20e69f85a 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -1175,3 +1175,10 @@ const char *stateToRtkMode(SystemState state) // Unknown mode return "Unknown Mode"; } + +bool inBaseMode() +{ + if(systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING) + return (true); + return (false); +} diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 54e62ccaa..605da72dd 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -844,7 +844,7 @@ void handleGnssDataTask(void *e) if (bytesToSend > 0) { // If we are in base mode, assume part of the outgoing data is RTCM - if (systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING) + if (inBaseMode() == true) bluetoothOutgoingRTCM = true; // Account for the sent or dropped data diff --git a/Firmware/RTK_Everywhere/WiFi.ino b/Firmware/RTK_Everywhere/WiFi.ino index f68b5b80d..e4ba52272 100644 --- a/Firmware/RTK_Everywhere/WiFi.ino +++ b/Firmware/RTK_Everywhere/WiFi.ino @@ -567,8 +567,7 @@ bool wifiIsNeeded() if (systemState <= STATE_ROVER_RTK_FIX && settings.enableNtripClient == true) return true; - if (systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING && - settings.enableNtripServer == true) + if (inBaseMode() == true && settings.enableNtripServer == true) return true; // If the user has enabled NTRIP Client for an Assisted Survey-In, and Survey-In is running, keep WiFi on. From 07ceca98dffce991540b303e19c6f5fa18ea077e Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 16:14:30 -0600 Subject: [PATCH 018/112] Remove unused wifiInConfigMode() --- Firmware/RTK_Everywhere/Developer.ino | 1 - Firmware/RTK_Everywhere/WiFi.ino | 9 --------- 2 files changed, 10 deletions(-) diff --git a/Firmware/RTK_Everywhere/Developer.ino b/Firmware/RTK_Everywhere/Developer.ino index 7a229cf1c..2e2478ca1 100644 --- a/Firmware/RTK_Everywhere/Developer.ino +++ b/Firmware/RTK_Everywhere/Developer.ino @@ -146,7 +146,6 @@ bool wifiConnect(unsigned long timeout) {return false;} IPAddress wifiGetGatewayIpAddress() {return IPAddress((uint32_t)0);} IPAddress wifiGetIpAddress() {return IPAddress((uint32_t)0);} int wifiGetRssi() {return -999;} -bool wifiInConfigMode() {return false;} bool wifiIsConnected() {return false;} bool wifiIsNeeded() {return false;} int wifiNetworkCount() {return 0;} diff --git a/Firmware/RTK_Everywhere/WiFi.ino b/Firmware/RTK_Everywhere/WiFi.ino index e4ba52272..a7c6ff57b 100644 --- a/Firmware/RTK_Everywhere/WiFi.ino +++ b/Firmware/RTK_Everywhere/WiFi.ino @@ -656,15 +656,6 @@ void wifiPrintNetworkInfo() systemPrintln(); } -// Returns true if unit is in config mode -// Used to disallow services (NTRIP, TCP, etc) from updating -bool wifiInConfigMode() -{ - if (systemState >= STATE_WIFI_CONFIG_NOT_STARTED && systemState <= STATE_WIFI_CONFIG) - return true; - return false; -} - IPAddress wifiGetGatewayIpAddress() { return WiFi.gatewayIP(); From da359fa540b8c576a454541e7b59de58bb23cada Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 16:15:36 -0600 Subject: [PATCH 019/112] Add inRoverMode() --- Firmware/RTK_Everywhere/Bluetooth.ino | 2 +- Firmware/RTK_Everywhere/Ethernet.ino | 3 +-- Firmware/RTK_Everywhere/NtripClient.ino | 3 +-- Firmware/RTK_Everywhere/States.ino | 7 +++++++ Firmware/RTK_Everywhere/menuMain.ino | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Firmware/RTK_Everywhere/Bluetooth.ino b/Firmware/RTK_Everywhere/Bluetooth.ino index ceb67e0ce..410c111b9 100644 --- a/Firmware/RTK_Everywhere/Bluetooth.ino +++ b/Firmware/RTK_Everywhere/Bluetooth.ino @@ -222,7 +222,7 @@ void bluetoothStart() { bluetoothState = BT_OFF; char stateName[11] = {0}; - if (systemState >= STATE_ROVER_NOT_STARTED && systemState <= STATE_ROVER_RTK_FIX) + if (inRoverMode() == true) strncpy(stateName, "Rover-", sizeof(stateName) - 1); else if (inBaseMode() == true) strncpy(stateName, "Base-", sizeof(stateName) - 1); diff --git a/Firmware/RTK_Everywhere/Ethernet.ino b/Firmware/RTK_Everywhere/Ethernet.ino index e13847c6e..0b35b249e 100644 --- a/Firmware/RTK_Everywhere/Ethernet.ino +++ b/Firmware/RTK_Everywhere/Ethernet.ino @@ -246,8 +246,7 @@ bool ethernetIsNeeded() return true; // Does Rover mode NTRIP Client need Ethernet? - if (settings.enableNtripClient == true && - (systemState >= STATE_ROVER_NOT_STARTED && systemState <= STATE_ROVER_RTK_FIX)) + if (settings.enableNtripClient == true && inRoverMode() == true) return true; // Does PVT client or server need Ethernet? diff --git a/Firmware/RTK_Everywhere/NtripClient.ino b/Firmware/RTK_Everywhere/NtripClient.ino index 07b77022b..c6ef1d7ac 100644 --- a/Firmware/RTK_Everywhere/NtripClient.ino +++ b/Firmware/RTK_Everywhere/NtripClient.ino @@ -380,8 +380,7 @@ void ntripClientPrintStatus() byte seconds; // Display NTRIP Client status and uptime - if (settings.enableNtripClient && - ((systemState >= STATE_ROVER_NOT_STARTED) && (systemState <= STATE_ROVER_RTK_FIX))) + if (settings.enableNtripClient && inRoverMode() == true) { systemPrint("NTRIP Client "); ntripClientPrintStateSummary(); diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 20e69f85a..0e2716eb5 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -1176,6 +1176,13 @@ const char *stateToRtkMode(SystemState state) return "Unknown Mode"; } +bool inRoverMode() +{ + if(systemState >= STATE_ROVER_NOT_STARTED && systemState <= STATE_ROVER_RTK_FIX) + return (true); + return (false); +} + bool inBaseMode() { if(systemState >= STATE_BASE_NOT_STARTED && systemState <= STATE_BASE_FIXED_TRANSMITTING) diff --git a/Firmware/RTK_Everywhere/menuMain.ino b/Firmware/RTK_Everywhere/menuMain.ino index c2487dd6d..24cb521fe 100644 --- a/Firmware/RTK_Everywhere/menuMain.ino +++ b/Firmware/RTK_Everywhere/menuMain.ino @@ -180,7 +180,7 @@ void menuMain() } // Reboot as base only if currently operating as a base station - if (restartBase && (systemState >= STATE_BASE_NOT_STARTED) && (systemState <= STATE_BASE_FIXED_TRANSMITTING)) + if (restartBase && inBaseMode() == true) { restartBase = false; requestChangeState(STATE_BASE_NOT_STARTED); // Restart base upon exit for latest changes to take effect From 49d52184eb9c1446c4b8fd893fb3d5a59643a8f3 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 16:15:49 -0600 Subject: [PATCH 020/112] Add inNtpMode() --- Firmware/RTK_Everywhere/Ethernet.ino | 2 +- Firmware/RTK_Everywhere/States.ino | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Ethernet.ino b/Firmware/RTK_Everywhere/Ethernet.ino index 0b35b249e..905d6a10c 100644 --- a/Firmware/RTK_Everywhere/Ethernet.ino +++ b/Firmware/RTK_Everywhere/Ethernet.ino @@ -238,7 +238,7 @@ IPAddress ethernetGetIpAddress() bool ethernetIsNeeded() { // Does NTP need Ethernet? - if (systemState >= STATE_NTPSERVER_NOT_STARTED && systemState <= STATE_NTPSERVER_SYNC) + if (inNtpMode() == true) return true; // Does Base mode NTRIP Server need Ethernet? diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 0e2716eb5..430a9a39f 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -1189,3 +1189,13 @@ bool inBaseMode() return (true); return (false); } + +bool inNtpMode() +{ + if(systemState >= STATE_NTPSERVER_NOT_STARTED && systemState <= STATE_NTPSERVER_SYNC) + return (true); + return (false); +} + + + From 922a83e394504a488e286d356eec7d42c23051d8 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Wed, 20 Mar 2024 16:21:41 -0600 Subject: [PATCH 021/112] Correctly print HPA based on mode. --- Firmware/RTK_Everywhere/System.ino | 34 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino index 4f0557465..4bc4e9d22 100644 --- a/Firmware/RTK_Everywhere/System.ino +++ b/Firmware/RTK_Everywhere/System.ino @@ -66,12 +66,11 @@ void updateBattery() checkBatteryLevels(); - if(present.battery_bq40z50 == true) + if (present.battery_bq40z50 == true) { - //Turn on green battery LED if battery is above 50% - if(batteryLevelPercent > 50) + // Turn on green battery LED if battery is above 50% + if (batteryLevelPercent > 50) batteryStatusLedOn(); - } } } @@ -100,7 +99,7 @@ void checkBatteryLevels() batteryChargingPercentPerHour = (float)bq40z50Battery->getAverageCurrentMa() / bq40z50Battery->getFullChargeCapacityMah() * 100.0; } -#endif // COMPILE_BQ40Z50 +#endif // COMPILE_BQ40Z50 // Display the battery data if (settings.enablePrintBatteryMessages) @@ -323,13 +322,15 @@ void printReports() if (online.gnss == true) { - float hpa = gnssGetHorizontalAccuracy(); - - if (hpa > 0) + // If we are in rover mode, display HPA and SIV + if (inRoverMode() == true) { - char temp[20]; - const char *units = getHpaUnits(hpa, temp, sizeof(temp), 3); // Returns string of the HPA units - systemPrintf("Rover Accuracy (%s): %s, SIV: %d GNSS State: ", units, temp, gnssGetSatellitesInView()); + float hpa = gnssGetHorizontalAccuracy(); + + char modifiedHpa[20]; + const char *hpaUnits = getHpaUnits(hpa, modifiedHpa, sizeof(modifiedHpa), 3); // Returns string of the HPA units + + systemPrintf("Rover Accuracy (%s): %s, SIV: %d GNSS State: ", hpaUnits, modifiedHpa, gnssGetSatellitesInView()); if (gnssIsRTKFix() == true) systemPrint("RTK Fix"); @@ -344,14 +345,11 @@ void printReports() systemPrintln(); } - else + + // If we are in base mode, display SIV only + else if (inBaseMode() == true) { - systemPrint("Rover Accuracy: "); - systemPrint(hpa); - systemPrint(" "); - systemPrint("No lock. SIV: "); - systemPrint(gnssGetSatellitesInView()); - systemPrintln(); + systemPrintf("Base Mode - SIV: %d\r\n", gnssGetSatellitesInView()); } } } From b2d8188542d469da5acd28f7400e0b31fde72ffd Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 10:05:30 -0600 Subject: [PATCH 022/112] Pass I2C bus to battery begin --- Firmware/RTK_Everywhere/Begin.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index ab7a8460e..2c2c9d1dc 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -844,7 +844,7 @@ void beginFuelGauge() return; } - if (bq40z50Battery->begin() == false) + if (bq40z50Battery->begin(*i2c_0) == false) { systemPrintln("BQ40Z50 not detected"); delete bq40z50Battery; From 3b195f920d092d391775689de9682976cccef401 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 10:06:34 -0600 Subject: [PATCH 023/112] Remove compile guards --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 129b5d8e1..b16e4ba8e 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -21,16 +21,16 @@ // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development -// #define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support -// #define COMPILE_WIFI // Comment out to remove WiFi functionality -// #define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update +#define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support +#define COMPILE_WIFI // Comment out to remove WiFi functionality +#define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update #ifdef COMPILE_WIFI #define COMPILE_AP // Requires WiFi. Comment out to remove Access Point functionality #define COMPILE_ESPNOW // Requires WiFi. Comment out to remove ESP-Now functionality. #endif // COMPILE_WIFI -// #define COMPILE_BT // Comment out to remove Bluetooth functionality +#define COMPILE_BT // Comment out to remove Bluetooth functionality #define COMPILE_L_BAND // Comment out to remove L-Band functionality #define COMPILE_UM980 // Comment out to remove UM980 functionality #define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality From 841eeaf58f24faf829840309f063dbbb7b4fb385 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 Mar 2024 16:08:40 +0000 Subject: [PATCH 024/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 2fbb59a92..196d876fe 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x7F, 0xC5, 0xF0, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x88, 0x5B, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x7F, 0xC5, 0xF0, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x88, 0x5B, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From dc7a4f456f6a44dd97b30be1ec5fec5ab73e4322 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 10:12:16 -0600 Subject: [PATCH 025/112] Change Bluetooth to dual by default --- Firmware/RTK_Everywhere/settings.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 5f686c294..c3121a485 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1025,8 +1025,7 @@ typedef struct uint8_t espnowPeers[5][6] = {0}; // Max of 5 peers. Contains the MAC addresses (6 bytes) of paired units uint8_t espnowPeerCount = 0; bool enableRtcmMessageChecking = false; - // BluetoothRadioType_e bluetoothRadioType = BLUETOOTH_RADIO_SPP_AND_BLE; - BluetoothRadioType_e bluetoothRadioType = BLUETOOTH_RADIO_SPP; + BluetoothRadioType_e bluetoothRadioType = BLUETOOTH_RADIO_SPP_AND_BLE; bool runLogTest = false; // When set to true, device will create a series of test logs bool espnowBroadcast = true; // When true, overrides peers and sends all data via broadcast int16_t antennaHeight = 0; // in mm From 9eb5a18445f9bd1742e008fe13fbe88070ad6f53 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 10:36:04 -0600 Subject: [PATCH 026/112] Add list of all settings Issue #190 --- Firmware/RTK_Everywhere/menuCommands.ino | 179 +++++++++++++++++++++-- 1 file changed, 166 insertions(+), 13 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index e729da26e..9db6e5092 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2326,18 +2326,171 @@ void printAvailableSettings() systemPrint("updateGNSSSettings,bool,"); systemPrint("LBandFreq,uint32_t,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - systemPrint(",,"); - - - systemPrint(",,"); + systemPrint("debugPpCertificate,bool,"); + + // Time Zone - Default to UTC + systemPrint("timeZoneHours,int8_t,"); + systemPrint("timeZoneMinutes,int8_t,"); + systemPrint("timeZoneSeconds,int8_t,"); + + // Debug settings + systemPrint("enablePrintState,bool,"); + systemPrint("enablePrintPosition,bool,"); + systemPrint("enablePrintIdleTime,bool,"); + systemPrint("enablePrintBatteryMessages,bool,"); + systemPrint("enablePrintRoverAccuracy,bool,"); + systemPrint("enablePrintBadMessages,bool,"); + systemPrint("enablePrintLogFileMessages,bool,"); + systemPrint("enablePrintLogFileStatus,bool,"); + systemPrint("enablePrintRingBufferOffsets,bool,"); + systemPrint("enablePrintStates,bool,"); + systemPrint("enablePrintDuplicateStates,bool,"); + systemPrint("enablePrintRtcSync,bool,"); + systemPrint("radioType,RadioType_e,"); + systemPrint("espnowPeers,uint8_t[5][6],"); + systemPrint("espnowPeerCount,uint8_t,"); + systemPrint("enableRtcmMessageChecking,bool,"); + systemPrint("bluetoothRadioType,BluetoothRadioType_e,"); + systemPrint("runLogTest,bool,"); + systemPrint("espnowBroadcast,bool,"); + systemPrint("antennaHeight,int16_t,"); + systemPrint("antennaReferencePoint,float,"); + systemPrint("echoUserInput,bool,"); + systemPrint("uartReceiveBufferSize,int,"); + systemPrint("gnssHandlerBufferSize,int,"); + + systemPrint("enablePrintBufferOverrun,bool,"); + systemPrint("enablePrintSDBuffers,bool,"); + systemPrint("periodicDisplay,PeriodicDisplay_t,"); + systemPrint("periodicDisplayInterval,uint32_t,"); + + systemPrint("rebootSeconds,uint32_t,"); + systemPrint("forceResetOnSDFail,bool,"); + + systemPrint("minElev,uint8_t,"); + systemPrintf("ubxMessageRatesBase,uint8_t[%d],", MAX_UBX_MSG_RTCM); + + systemPrint("coordinateInputType,CoordinateInputType,"); + systemPrint("lbandFixTimeout_seconds,uint16_t,"); + systemPrint("minCNO_F9P,int16_t,"); + systemPrint("serialGNSSRxFullThreshold,uint16_t,"); + systemPrint("btReadTaskPriority,uint8_t,"); + systemPrint("gnssReadTaskPriority,uint8_t,"); + systemPrint("handleGnssDataTaskPriority,uint8_t,"); + systemPrint("btReadTaskCore,uint8_t,"); + systemPrint("gnssReadTaskCore,uint8_t,"); + systemPrint("handleGnssDataTaskCore,uint8_t,"); + systemPrint("gnssUartInterruptsCore,uint8_t,"); + systemPrint("bluetoothInterruptsCore,uint8_t,"); + systemPrint("i2cInterruptsCore,uint8_t,"); + systemPrint("shutdownNoChargeTimeout_s,uint32_t,"); + systemPrint("disableSetupButton,bool,"); + systemPrint("useI2cForLbandCorrections,bool,"); + systemPrint("useI2cForLbandCorrectionsConfigured,bool,"); + + // Ethernet + systemPrint("enablePrintEthernetDiag,bool,"); + systemPrint("ethernetDHCP,bool,"); + systemPrint("ethernetIP,IPAddress,"); + systemPrint("ethernetDNS,IPAddress,"); + systemPrint("ethernetGateway,IPAddress,"); + systemPrint("ethernetSubnet,IPAddress,"); + systemPrint("httpPort,uint16_t,"); + + // WiFi + systemPrint("debugWifiState,bool,"); + systemPrint("wifiConfigOverAP,bool,"); + systemPrintf("wifiNetworks,WiFiNetwork[%d],", MAX_WIFI_NETWORKS); + + // Network layer + systemPrint("defaultNetworkType,uint8_t,"); + systemPrint("debugNetworkLayer,bool,"); + systemPrint("enableNetworkFailover,bool,"); + systemPrint("printNetworkStatus,bool,"); + + // Multicast DNS Server + systemPrint("mdnsEnable,bool,"); + + // MQTT Client (PointPerfect) + systemPrint("debugMqttClientData,bool,"); + systemPrint("debugMqttClientState,bool,"); + systemPrint("useEuropeCorrections,bool,"); + + // NTP + systemPrint("debugNtp,bool,"); + systemPrint("ethernetNtpPort,uint16_t,"); + systemPrint("enableNTPFile,bool,"); + systemPrint("ntpPollExponent,uint8_t,"); + systemPrint("ntpPrecision,int8_t,"); + systemPrint("ntpRootDelay,uint32_t,"); + systemPrint("ntpRootDispersion,uint32_t,"); + systemPrintf("ntpReferenceId,char[%d],", sizeof(settings.ntpReferenceId) / sizeof(char)); + + + // NTRIP Client + systemPrint("debugNtripClientRtcm,bool,"); + systemPrint("debugNtripClientState,bool,"); + systemPrint("enableNtripClient,bool,"); + systemPrintf("ntripClient_CasterHost,char[%d],", sizeof(settings.ntripClient_CasterHost) / sizeof(char)); + systemPrint("ntripClient_CasterPort,uint16_t,"); + systemPrintf("ntripClient_CasterUser,char[%d],", sizeof(settings.ntripClient_CasterUser) / sizeof(char)); + systemPrintf("ntripClient_MountPoint,char[%d],", sizeof(settings.ntripClient_MountPoint) / sizeof(char)); + systemPrintf("ntripClient_MountPointPW,char[%d],", sizeof(settings.ntripClient_MountPointPW) / sizeof(char)); + systemPrint("ntripClient_TransmitGGA,bool,"); + + // NTRIP Server + systemPrint("debugNtripServerRtcm,bool,"); + systemPrint("debugNtripServerState,bool,"); + systemPrint("enableNtripServer,bool,"); + systemPrint("ntripServer_StartAtSurveyIn,bool,"); + systemPrintf("ntripServer_CasterHost,char[%d],", sizeof(settings.ntripServer_CasterHost) / sizeof(char)); + systemPrint("ntripServer_CasterPort,uint16_t,"); + systemPrintf("ntripServer_CasterUser,char[%d],", sizeof(settings.ntripServer_CasterUser) / sizeof(char)); + systemPrintf("ntripServer_CasterUserPW,char[%d],", sizeof(settings.ntripServer_CasterUserPW) / sizeof(char)); + systemPrintf("ntripServer_MountPoint,char[%d],", sizeof(settings.ntripServer_MountPoint) / sizeof(char)); + systemPrintf("ntripServer_MountPointPW,char[%d],", sizeof(settings.ntripServer_MountPointPW) / sizeof(char)); + + // TCP Server + systemPrint("debugPvtServer,bool,"); + systemPrint("enablePvtServer,bool,"); + systemPrint("pvtUdpServerPort,uint16_t,"); + + + systemPrintf("um980MessageRatesNMEA,char[%d],", sizeof(settings.um980MessageRatesNMEA) / sizeof(float)); + systemPrintf("um980MessageRatesRTCMRover,char[%d],", sizeof(settings.um980MessageRatesRTCMRover) / sizeof(float)); + systemPrintf("um980MessageRatesRTCMBase,char[%d],", sizeof(settings.um980MessageRatesRTCMBase) / sizeof(float)); + systemPrintf("um980Constellations,char[%d],", sizeof(settings.um980Constellations) / sizeof(uint8_t)); + systemPrint("minCNO_um980,int16_t,"); + systemPrint("enableTiltCompensation,bool,"); + systemPrint("tiltPoleLength,float,"); + systemPrint("rtcmTimeoutBeforeUsingLBand_s,uint8_t,"); + systemPrint("enableImuDebug,bool,"); + + // Automatic Firmware Update + systemPrint("debugFirmwareUpdate,bool,"); + systemPrint("enableAutoFirmwareUpdate,bool,"); + systemPrint("autoFirmwareCheckMinutes,uint32_t,"); + + systemPrint("debugCorrections,bool,"); + systemPrint("enableCaptivePortal,bool,"); + + // Boot times + systemPrint("printBootTimes,bool,"); + + // Partition table + systemPrint("printPartitionTable,bool,"); + + // Measurement scale + systemPrint("measurementScale,uint8_t,"); + + systemPrint("debugWiFiConfig,bool,"); + systemPrint("enablePsram,bool,"); + systemPrint("printTaskStartStop,bool,"); + systemPrint("psramMallocLevel,uint16_t,"); + systemPrint("um980SurveyInStartingAccuracy,float,"); + systemPrint("enableBeeper,bool,"); + systemPrint("um980MeasurementRateMs,uint16_t,"); + systemPrint("enableImuCompensationDebug,bool,"); + systemPrintln(); } From d31099f6fb168baf39bee78b5bdf5144c1f61789 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 Mar 2024 16:40:34 +0000 Subject: [PATCH 027/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 196d876fe..811fbfa26 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x88, 0x5B, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x63, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x88, 0x5B, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x63, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 977df0e3a92440bec68c267c8d812a0ad2086891 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 11:04:21 -0600 Subject: [PATCH 028/112] Adjust tilt online print message --- Firmware/RTK_Everywhere/Tilt.ino | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Firmware/RTK_Everywhere/Tilt.ino b/Firmware/RTK_Everywhere/Tilt.ino index 7c67cec33..a0deefd3c 100644 --- a/Firmware/RTK_Everywhere/Tilt.ino +++ b/Firmware/RTK_Everywhere/Tilt.ino @@ -147,7 +147,6 @@ void tiltUpdate() tiltState = TILT_CORRECTING; } - } break; @@ -250,7 +249,7 @@ void printTiltDebug() systemPrint("3D Fix"); else if (solutionState == 0) systemPrint("No Fix"); - else + else systemPrintf("solutionState %d", tiltSensor->getGnssSolutionState()); systemPrintln(); @@ -325,7 +324,6 @@ void beginTilt() tiltStop(); // Free memory return; } - systemPrintln("Tilt sensor online."); bool result = true; @@ -383,7 +381,7 @@ void beginTilt() { if (tiltSensor->saveConfiguration() == true) { - log_d("IM19 configuration saved"); + systemPrintln("Tilt sensor configuration complete"); tiltState = TILT_STARTED; return; // Success } @@ -418,7 +416,7 @@ bool tiltIsCorrecting() // Restore the tilt sensor to factory settings void tiltSensorFactoryReset() { - if(tiltState >= TILT_STARTED) + if (tiltState >= TILT_STARTED) tiltSensor->factoryReset(); } From 20c0cd8b0be73c4862028c96d394ede84669fb2b Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 11:25:18 -0600 Subject: [PATCH 029/112] Add the bleeps and the bloops --- Firmware/RTK_Everywhere/Begin.ino | 8 ++++++-- Firmware/RTK_Everywhere/System.ino | 14 +++++++++----- Firmware/RTK_Everywhere/Tasks.ino | 9 ++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 2c2c9d1dc..72bc38f92 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -182,6 +182,10 @@ void beginBoard() batteryStatusLedOn(); pinMode(pin_beeper, OUTPUT); + + // Announce power on start + beepOn(); + delay(250); beepOff(); pinMode(pin_powerButton, INPUT); @@ -336,8 +340,8 @@ void beginBoard() pinMode(pin_muxA, OUTPUT); pinMode(pin_muxB, OUTPUT); - //pinMode(pin_powerFastOff, OUTPUT); - //digitalWrite(pin_powerFastOff, HIGH); // Stay on + // pinMode(pin_powerFastOff, OUTPUT); + // digitalWrite(pin_powerFastOff, HIGH); // Stay on pinMode(pin_powerFastOff, INPUT); // Turn on power to the mosaic and OLED diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino index 4bc4e9d22..0a3911beb 100644 --- a/Firmware/RTK_Everywhere/System.ino +++ b/Firmware/RTK_Everywhere/System.ino @@ -45,13 +45,15 @@ void beepDurationMs(uint16_t lengthMs) void beepOn() { - if (pin_beeper != PIN_UNDEFINED && (settings.enableBeeper == true)) + // Disallow beeper when doing local compilation (developer mode), or if setting is turned off + if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true) && (ENABLE_DEVELOPER == false)) digitalWrite(pin_beeper, HIGH); } void beepOff() { - if (pin_beeper != PIN_UNDEFINED && (settings.enableBeeper == true)) + // Disallow beeper when doing local compilation (developer mode), or if setting is turned off + if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true) && (ENABLE_DEVELOPER == false)) digitalWrite(pin_beeper, LOW); } @@ -328,9 +330,11 @@ void printReports() float hpa = gnssGetHorizontalAccuracy(); char modifiedHpa[20]; - const char *hpaUnits = getHpaUnits(hpa, modifiedHpa, sizeof(modifiedHpa), 3); // Returns string of the HPA units - - systemPrintf("Rover Accuracy (%s): %s, SIV: %d GNSS State: ", hpaUnits, modifiedHpa, gnssGetSatellitesInView()); + const char *hpaUnits = + getHpaUnits(hpa, modifiedHpa, sizeof(modifiedHpa), 3); // Returns string of the HPA units + + systemPrintf("Rover Accuracy (%s): %s, SIV: %d GNSS State: ", hpaUnits, modifiedHpa, + gnssGetSatellitesInView()); if (gnssIsRTKFix() == true) systemPrint("RTK Fix"); diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 605da72dd..99217bb9a 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1270,13 +1270,20 @@ void buttonCheckTask(void *e) if (present.imu_im19 && present.display_64x48 == false && present.display_128x64 == false) { - // Platform has no display and tile, ie RTK Torch + // Platform has no display and tilt corrections, ie RTK Torch // The user button only exits tilt mode if (userBtn->wasReleased() && (tiltIsCorrecting() == true)) { tiltStop(); } + + // The RTK Torch uses a shutdown IC configured to turn off ~3s + // Beep shortly before the shutdown IC takes over + else if (userBtn->pressedFor(2500)) + { + beepDurationMs(500); // Announce powering down + } } else // RTK EVK, RTK Facet v2, RTK Facet mosaic { From 26d3a05e6e2c4f53e62057efb3bee45c6e66cc41 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 11:25:28 -0600 Subject: [PATCH 030/112] Remove old tilt comments --- Firmware/RTK_Everywhere/Tilt.ino | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/Firmware/RTK_Everywhere/Tilt.ino b/Firmware/RTK_Everywhere/Tilt.ino index a0deefd3c..b8c6b0e8d 100644 --- a/Firmware/RTK_Everywhere/Tilt.ino +++ b/Firmware/RTK_Everywhere/Tilt.ino @@ -328,19 +328,17 @@ void beginTilt() bool result = true; // The filter has a set of default parameters, which can be loaded when setting an error. - result &= tiltSensor->sendCommand("LOAD_DEFAULT"); // v2 hardware + result &= tiltSensor->sendCommand("LOAD_DEFAULT"); // Use serial port 2 as the serial port for communication with GNSS - // result &= tiltSensor->sendCommand("GNSS_PORT=PHYSICAL_UART3"); //v1 hardware - result &= tiltSensor->sendCommand("GNSS_PORT=PHYSICAL_UART2"); // v2 hardware + result &= tiltSensor->sendCommand("GNSS_PORT=PHYSICAL_UART2"); // Use serial port 1 as the main output with combined navigation data output result &= tiltSensor->sendCommand("NAVI_OUTPUT=UART1,ON"); // Set the distance of the IMU from the center line - x:6.78mm y:10.73mm z:19.25mm if (present.imu_im19 == true) - // result &= tiltSensor->sendCommand("LEVER_ARM=-0.00678,-0.01073,-0.01925"); //v1 hardware - result &= tiltSensor->sendCommand("LEVER_ARM=-0.00678,-0.01073,-0.0314"); // v2 hardware from stock firmware + result &= tiltSensor->sendCommand("LEVER_ARM=-0.00678,-0.01073,-0.0314"); // From stock firmware // Set the overall length of the GNSS setup in meters: rod length 1800mm + internal length 96.45mm + antenna // POC 19.25mm = 1915.7mm @@ -354,28 +352,20 @@ void beginTilt() result &= tiltSensor->sendCommand("GNSS_CARD=UNICORE"); // Configure as tilt measurement mode - // result &= tiltSensor->sendCommand("WORK_MODE=152"); - result &= tiltSensor->sendCommand("WORK_MODE=408"); // From v2 stock firmware + result &= tiltSensor->sendCommand("WORK_MODE=408"); // From stock firmware // AT+HIGH_RATE=[ENABLE | DISABLE] - try to slow down NAVI result &= tiltSensor->sendCommand("HIGH_RATE=DISABLE"); // Turn off MEMS output. - // result &= tiltSensor->sendCommand("MEMS_OUTPUT=UART1,ON"); //v2 stock firmware enables MEMS + // result &= tiltSensor->sendCommand("MEMS_OUTPUT=UART1,ON"); //Stock firmware enables MEMS result &= tiltSensor->sendCommand("MEMS_OUTPUT=UART1,OFF"); // Unknown new command for v2 - result &= tiltSensor->sendCommand("CORRECT_HOLDER=ENABLE"); // v2 stock firmware + result &= tiltSensor->sendCommand("CORRECT_HOLDER=ENABLE"); // From tock firmware // Trigger IMU on PPS from UM980 - result &= tiltSensor->sendCommand("SET_PPS_EDGE=RISING"); // v1 hardware - // result &= tiltSensor->sendCommand("SET_PPS_EDGE=FALLING"); //v2 hardware - - // Complete installation angle estimation in tilt measurement applications - // result &= tiltSensor->sendCommand("AUTO_FIX=ENABLE"); //v1 hardware - - // AT+MAG_AUTO_SAVE=ENABLE - // result &= tiltSensor->sendCommand("MAG_AUTO_SAVE=ENABLE"); + result &= tiltSensor->sendCommand("SET_PPS_EDGE=RISING"); if (result == true) { From 9c8238ad3e5b2de4d8a21a046917de49d295e775 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 Mar 2024 17:27:21 +0000 Subject: [PATCH 031/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 811fbfa26..0fa42f46c 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x63, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0xF8, 0x6D, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x63, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0xF8, 0x6D, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 60eb30904b65f40600116f94c41797493d6ebdcd Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 21 Mar 2024 18:09:22 +0000 Subject: [PATCH 032/112] Allow icon positions to be changed for each display --- Firmware/RTK_Everywhere/Begin.ino | 6 +- Firmware/RTK_Everywhere/Display.ino | 333 +++++++++------------ Firmware/RTK_Everywhere/RTK_Everywhere.ino | 13 +- Firmware/RTK_Everywhere/Tasks.ino | 2 +- Firmware/RTK_Everywhere/UM980.h | 5 + Firmware/RTK_Everywhere/icons.h | 178 +++++++++++ Firmware/RTK_Everywhere/menuSystem.ino | 2 +- Firmware/RTK_Everywhere/settings.h | 21 +- 8 files changed, 357 insertions(+), 203 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index ab7a8460e..5d1f76549 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -216,7 +216,7 @@ void beginBoard() present.i2c0BusSpeed_400 = true; // Run bus at higher speed present.i2c1 = true; present.display_i2c1 = true; - present.display_128x64 = true; + present.display_type = DISPLAY_128x64; present.i2c1BusSpeed_400 = true; // Run display bus at higher speed // Pin Allocations: @@ -289,7 +289,7 @@ void beginBoard() present.gnss_zedf9p = true; present.microSd = true; present.display_i2c0 = true; - present.display_64x48 = true; + present.display_type = DISPLAY_64x48; present.button_powerLow = true; // Button is pressed when low present.battery_max17048 = true; present.portDataMux = true; @@ -310,7 +310,7 @@ void beginBoard() present.psram_4mb = true; present.gnss_mosaic = true; present.display_i2c0 = true; - present.display_64x48 = true; + present.display_type = DISPLAY_64x48; present.i2c0BusSpeed_400 = true; present.peripheralPowerControl = true; present.button_powerLow = true; // Button is pressed when low diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index c4fe2a856..6029d126f 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -78,7 +78,7 @@ // Locals //---------------------------------------- -static QwiicCustomOLED *oled; +static QwiicCustomOLED *oled = nullptr; static uint32_t blinking_icons; static uint32_t icons; static uint32_t iconsRadio; @@ -94,13 +94,17 @@ bool ssidDisplayFirstHalf = false; // Icons #include "icons.h" +std::vector iconPropertyList; // List of icons to be displayed + +void paintLogging(std::vector *iconList, bool pulse = true, bool NTP = false); // Header + //---------------------------------------- // Routines //---------------------------------------- void beginDisplay(TwoWire *i2cBus) { - if (present.display_64x48 == false && present.display_128x64 == false) + if (present.display_type == DISPLAY_MAX_NONE) return; if (i2cBus == nullptr) @@ -112,10 +116,11 @@ void beginDisplay(TwoWire *i2cBus) // Setup the appropriate display - if (present.display_64x48 == true) + if (present.display_type == DISPLAY_64x48) { i2cAddress = kOLEDMicroDefaultAddress; - oled = new QwiicCustomOLED; + if (oled == nullptr) + oled = new QwiicCustomOLED; if (!oled) { systemPrintln("ERROR: Failed to allocate oled data structure!\r\n"); @@ -132,12 +137,11 @@ void beginDisplay(TwoWire *i2cBus) oled->setVcomDeselect(kOLEDMicroVCOM); } - if (present.display_128x64 == true) + if (present.display_type == DISPLAY_128x64) { i2cAddress = kOLEDMicroDefaultAddress; - - oled = new QwiicCustomOLED; - + if (oled == nullptr) + oled = new QwiicCustomOLED; if (!oled) { systemPrintln("ERROR: Failed to allocate oled data structure!\r\n"); @@ -182,46 +186,55 @@ void beginDisplay(TwoWire *i2cBus) } // Avoid code repetition -void displayBatteryVsEthernet() +void displayBatteryVsEthernet(std::vector *iconList) { if (online.battery) // Product has a battery - icons |= ICON_BATTERY; // Top right + paintBatteryLevel(iconList); else // if (present.ethernet_ws5500 == true) { if (online.ethernetStatus == ETH_NOT_STARTED) - blinking_icons &= ~ICON_ETHERNET; // If Ethernet has not stated because not needed, don't display the icon + ; // If Ethernet has not stated because not needed, don't display the icon else if (online.ethernetStatus == ETH_CONNECTED) - blinking_icons |= ICON_ETHERNET; // Don't blink if link is up + iconList->push_back(EthernetIconProperties.iconDisplay[present.display_type]); else - blinking_icons ^= ICON_ETHERNET; - icons |= (blinking_icons & ICON_ETHERNET); // Top Right + iconList->push_back(EthernetIconProperties.iconDisplay[present.display_type]); // TODO: make this blink } } -void displaySivVsOpenShort() + +void displaySivVsOpenShort(std::vector *iconList) { if (present.antennaShortOpen == false) - icons |= paintSIV(); + { + displayCoords textCoords = paintSIVIcon(iconList, nullptr, false); + paintSIVText(textCoords); + } else { + displayCoords textCoords; + if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - blinking_icons ^= ICON_ANTENNA_SHORT; - icons |= (blinking_icons & ICON_ANTENNA_SHORT); + textCoords = paintSIVIcon(iconList, &ShortIconProperties, true); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - blinking_icons ^= ICON_ANTENNA_OPEN; - icons |= (blinking_icons & ICON_ANTENNA_OPEN); + textCoords = paintSIVIcon(iconList, &OpenIconProperties, true); } else { - blinking_icons &= ~ICON_ANTENNA_SHORT; - blinking_icons &= ~ICON_ANTENNA_OPEN; - icons |= paintSIV(); + textCoords = paintSIVIcon(iconList, nullptr, false); } + + paintSIVText(textCoords); } } +void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon) +{ + // TODO: add the horizontal accuracy text depending on the icon position + iconList->push_back(icon->iconDisplay[present.display_type]); +} + // Given the system state, display the appropriate information void displayUpdate() { @@ -238,8 +251,11 @@ void displayUpdate() oled->erase(); + iconPropertyList.clear(); + icons = 0; iconsRadio = 0; + switch (systemState) { @@ -298,27 +314,26 @@ void displayUpdate() */ case (STATE_ROVER_NOT_STARTED): - icons = ICON_CROSS_HAIR // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties); + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_NO_FIX): icons = ICON_CROSS_HAIR // Center left | ICON_HORIZONTAL_ACCURACY // Center right | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displaySivVsOpenShort(&iconPropertyList); // Bottom left + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_FIX): icons = ICON_CROSS_HAIR // Center left | ICON_HORIZONTAL_ACCURACY // Center right | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displaySivVsOpenShort(&iconPropertyList); // Bottom left + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_RTK_FLOAT): @@ -326,16 +341,16 @@ void displayUpdate() icons = (blinking_icons & ICON_CROSS_HAIR_DUAL) // Center left | ICON_HORIZONTAL_ACCURACY // Center right | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displaySivVsOpenShort(&iconPropertyList); // Bottom left + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_RTK_FIX): icons = ICON_CROSS_HAIR_DUAL // Center left | ICON_HORIZONTAL_ACCURACY // Center right | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displaySivVsOpenShort(&iconPropertyList); // Bottom left + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; @@ -351,30 +366,30 @@ void displayUpdate() icons = (blinking_icons & ICON_CROSS_HAIR) // Center left | ICON_HORIZONTAL_ACCURACY // Center right | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(); // Bottom left - displayBatteryVsEthernet(); // Top right + displaySivVsOpenShort(&iconPropertyList); // Bottom left + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; case (STATE_BASE_TEMP_SURVEY_STARTED): icons = ICON_LOGGING; // Bottom right - displayBatteryVsEthernet(); // Top right + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left paintBaseTempSurveyStarted(); break; case (STATE_BASE_TEMP_TRANSMITTING): icons = ICON_LOGGING; // Bottom right - displayBatteryVsEthernet(); // Top right + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left paintRTCM(); break; case (STATE_BASE_FIXED_NOT_STARTED): icons = 0; // Top right - displayBatteryVsEthernet(); // Top right + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left break; case (STATE_BASE_FIXED_TRANSMITTING): icons = ICON_LOGGING; // Bottom right - displayBatteryVsEthernet(); // Top right + displayBatteryVsEthernet(&iconPropertyList); // Top right iconsRadio = setRadioIcons(); // Top left paintRTCM(); break; @@ -384,7 +399,7 @@ void displayUpdate() blinking_icons ^= ICON_CLOCK; icons = (blinking_icons & ICON_CLOCK) // Center left | ICON_CLOCK_ACCURACY; // Center right - displaySivVsOpenShort(); // Bottom left + displaySivVsOpenShort(&iconPropertyList); // Bottom left if (online.ethernetStatus == ETH_CONNECTED) blinking_icons |= ICON_ETHERNET; // Don't blink if link is up else @@ -397,7 +412,7 @@ void displayUpdate() icons = ICON_CLOCK // Center left | ICON_CLOCK_ACCURACY // Center right | ICON_LOGGING_NTP; // Bottom right - displaySivVsOpenShort(); // Bottom left + displaySivVsOpenShort(&iconPropertyList); // Bottom left if (online.ethernetStatus == ETH_CONNECTED) blinking_icons |= ICON_ETHERNET; // Don't blink if link is up else @@ -587,12 +602,6 @@ void displayUpdate() if (iconsRadio & ICON_IP_ADDRESS) paintIPAddress(); - // Top right corner - if (icons & ICON_BATTERY) - paintBatteryLevel(); - else if (icons & ICON_ETHERNET) - displayBitmap(45, 0, Ethernet_Icon_Width, Ethernet_Icon_Height, Ethernet_Icon); - // Center left if (icons & ICON_CROSS_HAIR) displayBitmap(0, 18, CrossHair_Width, CrossHair_Height, CrossHair); @@ -618,10 +627,8 @@ void displayUpdate() displayBitmap(2, 35, Antenna_Open_Width, Antenna_Open_Height, Antenna_Open); // Bottom right corner - if (icons & ICON_LOGGING) - paintLogging(); - else if (icons & ICON_LOGGING_NTP) - paintLoggingNTP(true); // NTP, no pulse + if (icons & ICON_LOGGING_NTP) + paintLogging(&iconPropertyList, false, true); // no pulse, NTP oled->display(); // Push internal buffer to display } @@ -714,19 +721,15 @@ void displayError(const char *errorMessage) */ // Print the classic battery icon with levels -void paintBatteryLevel() +void paintBatteryLevel(std::vector *iconList) { if (online.display == true) { // Current battery charge level - if (batteryLevelPercent < 25) - displayBitmap(45, 0, Battery_0_Width, Battery_0_Height, Battery_0); - else if (batteryLevelPercent < 50) - displayBitmap(45, 0, Battery_1_Width, Battery_1_Height, Battery_1); - else if (batteryLevelPercent < 75) - displayBitmap(45, 0, Battery_2_Width, Battery_2_Height, Battery_2); - else // batt level > 75 - displayBitmap(45, 0, Battery_3_Width, Battery_3_Height, Battery_3); + int batteryFraction = batteryLevelPercent / 25; + if (batteryFraction >= BATTERY_CHARGE_STATES) + batteryFraction = BATTERY_CHARGE_STATES - 1; + iconList->push_back(BatteryProperties.iconDisplay[batteryFraction][present.display_type]); } } @@ -1498,13 +1501,47 @@ void paintDynamicModel() // Select satellite icon and draw sats in view // Blink icon if no fix -uint32_t paintSIV() +displayCoords paintSIVIcon(std::vector *iconList, const iconProperties *icon, bool blink) { - uint32_t blinking; - uint32_t icons; + if (icon == nullptr) // Not short or open, so decide which icon to use + { + if (online.gnss) + { + // Determine which icon to display + if (lbandCorrectionsReceived) + icon = &LBandIconProperties; + else + icon = &SIVIconProperties; + // Determine if there is a fix + if (gnssIsFixed() == false) + { + blink = false; + } + else + { + // Blink satellite dish icon if we don't have a fix + blink = true; + } + } // End gnss online + else + { + icon = &SIVIconProperties; + } + } + + displayCoords textCoords; + textCoords.x = icon->iconDisplay[present.display_type].xPos + icon->iconDisplay[present.display_type].width + 2; + textCoords.y = icon->iconDisplay[present.display_type].yPos + 1; + + iconList->push_back(icon->iconDisplay[present.display_type]); // TODO: make this blink + + return textCoords; +} +void paintSIVText(displayCoords textCoords) +{ oled->setFont(QW_FONT_8X16); // Set font to type 1: 8x16 - oled->setCursor(16, 36); // x, y + oled->setCursor(textCoords.x, textCoords.y); // x, y oled->print(":"); if (online.gnss) @@ -1515,35 +1552,11 @@ uint32_t paintSIV() oled->print(gnssGetSatellitesInView()); paintResets(); - - // Determine which icon to display - icons = 0; - if (lbandCorrectionsReceived) - blinking = ICON_SIV_ANTENNA_LBAND; - else - blinking = ICON_SIV_ANTENNA; - - // Determine if there is a fix - if (gnssIsFixed() == false) - { - // Fix, turn on icon - icons = blinking; - } - else - { - // Blink satellite dish icon if we don't have a fix - blinking_icons ^= blinking; - if (blinking_icons & blinking) - icons = blinking; - } } // End gnss online else { oled->print("X"); - - icons = ICON_SIV_ANTENNA; } - return icons; } /* @@ -1567,115 +1580,39 @@ uint32_t paintSIV() // Draw log icon // Turn off icon if log file fails to get bigger -void paintLogging() +void paintLogging(std::vector *iconList, bool pulse, bool NTP) { // Animate icon to show system running + static uint8_t loggingIconDisplayed = LOGGING_ICON_STATES - 1; loggingIconDisplayed++; // Goto next icon - loggingIconDisplayed %= 4; // Wrap + loggingIconDisplayed %= LOGGING_ICON_STATES; // Wrap + #ifdef COMPILE_ETHERNET if ((online.logging == true) && (logIncreasing || ntpLogIncreasing)) #else // COMPILE_ETHERNET if ((online.logging == true) && (logIncreasing)) #endif // COMPILE_ETHERNET { - if (loggingType == LOGGING_STANDARD) + if (NTP) + { + iconList->push_back(LoggingNTPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + } + else if (loggingType == LOGGING_STANDARD) { - if (loggingIconDisplayed == 0) - displayBitmap(64 - Logging_0_Width, 48 - Logging_0_Height, Logging_0_Width, Logging_0_Height, - Logging_0); - else if (loggingIconDisplayed == 1) - displayBitmap(64 - Logging_1_Width, 48 - Logging_1_Height, Logging_1_Width, Logging_1_Height, - Logging_1); - else if (loggingIconDisplayed == 2) - displayBitmap(64 - Logging_2_Width, 48 - Logging_2_Height, Logging_2_Width, Logging_2_Height, - Logging_2); - else if (loggingIconDisplayed == 3) - displayBitmap(64 - Logging_3_Width, 48 - Logging_3_Height, Logging_3_Width, Logging_3_Height, - Logging_3); + iconList->push_back(LoggingIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); } else if (loggingType == LOGGING_PPP) { - if (loggingIconDisplayed == 0) - displayBitmap(64 - Logging_0_Width, 48 - Logging_0_Height, Logging_0_Width, Logging_0_Height, - Logging_0); - else if (loggingIconDisplayed == 1) - displayBitmap(64 - Logging_1_Width, 48 - Logging_1_Height, Logging_1_Width, Logging_1_Height, - Logging_PPP_1); - else if (loggingIconDisplayed == 2) - displayBitmap(64 - Logging_2_Width, 48 - Logging_2_Height, Logging_2_Width, Logging_2_Height, - Logging_PPP_2); - else if (loggingIconDisplayed == 3) - displayBitmap(64 - Logging_3_Width, 48 - Logging_3_Height, Logging_3_Width, Logging_3_Height, - Logging_PPP_3); + iconList->push_back(LoggingPPPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); } else if (loggingType == LOGGING_CUSTOM) { - if (loggingIconDisplayed == 0) - displayBitmap(64 - Logging_0_Width, 48 - Logging_0_Height, Logging_0_Width, Logging_0_Height, - Logging_0); - else if (loggingIconDisplayed == 1) - displayBitmap(64 - Logging_1_Width, 48 - Logging_1_Height, Logging_1_Width, Logging_1_Height, - Logging_Custom_1); - else if (loggingIconDisplayed == 2) - displayBitmap(64 - Logging_2_Width, 48 - Logging_2_Height, Logging_2_Width, Logging_2_Height, - Logging_Custom_2); - else if (loggingIconDisplayed == 3) - displayBitmap(64 - Logging_3_Width, 48 - Logging_3_Height, Logging_3_Width, Logging_3_Height, - Logging_Custom_3); + iconList->push_back(LoggingCustomIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); } } - else + else if (pulse) { - const int pulseX = 64 - 4; - const int pulseY = oled->getHeight(); - int height; - - // Paint pulse to show system activity - height = loggingIconDisplayed << 2; - if (height) - { - oled->line(pulseX, pulseY, pulseX, pulseY - height); - oled->line(pulseX - 1, pulseY, pulseX - 1, pulseY - height); - } - } -} - -void paintLoggingNTP(bool noPulse) -{ - // Animate icon to show system running - loggingIconDisplayed++; // Goto next icon - loggingIconDisplayed %= 4; // Wrap -#ifdef COMPILE_ETHERNET // Some redundancy here. paintLoggingNTP should only be called if Ethernet is present - if ((online.logging == true) && (logIncreasing || ntpLogIncreasing)) -#else // COMPILE_ETHERNET - if ((online.logging == true) && (logIncreasing)) -#endif // COMPILE_ETHERNET - { - if (loggingIconDisplayed == 0) - displayBitmap(64 - Logging_0_Width, 48 - Logging_0_Height, Logging_0_Width, Logging_0_Height, Logging_0); - else if (loggingIconDisplayed == 1) - displayBitmap(64 - Logging_1_Width, 48 - Logging_1_Height, Logging_1_Width, Logging_1_Height, - Logging_NTP_1); - else if (loggingIconDisplayed == 2) - displayBitmap(64 - Logging_2_Width, 48 - Logging_2_Height, Logging_2_Width, Logging_2_Height, - Logging_NTP_2); - else if (loggingIconDisplayed == 3) - displayBitmap(64 - Logging_3_Width, 48 - Logging_3_Height, Logging_3_Width, Logging_3_Height, - Logging_NTP_3); - } - else if (!noPulse) - { - const int pulseX = 64 - 4; - const int pulseY = oled->getHeight(); - int height; - - // Paint pulse to show system activity - height = loggingIconDisplayed << 2; - if (height) - { - oled->line(pulseX, pulseY, pulseX, pulseY - height); - oled->line(pulseX - 1, pulseY, pulseX - 1, pulseY - height); - } + iconList->push_back(PulseIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); } } @@ -2186,8 +2123,8 @@ void displaySDFail(uint16_t displayTime) void drawFrame() { // Init and draw box at edge to see screen alignment - int xMax = 63; - int yMax = 47; + int xMax = oled->getWidth() - 1; + int yMax = oled->getHeight() - 1; oled->line(0, 0, xMax, 0); // Top oled->line(0, 0, 0, yMax); // Left oled->line(0, yMax, xMax, yMax); // Bottom @@ -2685,13 +2622,31 @@ void paintResets() { if (settings.enableResetDisplay == true) { - oled->setFont(QW_FONT_5X7); // Small font - oled->setCursor(16 + (8 * 3) + 7, 38); // x, y + if (present.display_type == DISPLAY_64x48) + { + oled->setFont(QW_FONT_5X7); // Small font + oled->setCursor(16 + (8 * 3) + 7, 38); // x, y - if (settings.enablePrintBufferOverrun == false) - oled->print(settings.resetCount); - else - oled->print(settings.resetCount + bufferOverruns); + if (settings.enablePrintBufferOverrun == false) + oled->print(settings.resetCount); + else + oled->print(settings.resetCount + bufferOverruns); + } + else // if (present.display_type == DISPLAY_128x64) + { + oled->setFont(QW_FONT_5X7); // Small font + oled->setCursor(0, oled->getHeight() - 10); // x, y + + const int bufSize = 20; + char buf[bufSize] = {0}; + + if (settings.enablePrintBufferOverrun == false) + snprintf(buf, bufSize, "R: %d", settings.resetCount); + else + snprintf(buf, bufSize, "R: %d O: %d", settings.resetCount, bufferOverruns); + + oled->print(buf); + } } } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 129b5d8e1..1d82c22d8 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -31,11 +31,11 @@ #endif // COMPILE_WIFI // #define COMPILE_BT // Comment out to remove Bluetooth functionality -#define COMPILE_L_BAND // Comment out to remove L-Band functionality -#define COMPILE_UM980 // Comment out to remove UM980 functionality -#define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality -#define COMPILE_POINTPERFECT_LIBRARY // Comment out to remove PPL support -#define COMPILE_BQ40Z50 // Comment out to remove BQ40Z50 functionality +//#define COMPILE_L_BAND // Comment out to remove L-Band functionality +//#define COMPILE_UM980 // Comment out to remove UM980 functionality +//#define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality +//#define COMPILE_POINTPERFECT_LIBRARY // Comment out to remove PPL support +//#define COMPILE_BQ40Z50 // Comment out to remove BQ40Z50 functionality #if defined(COMPILE_WIFI) || defined(COMPILE_ETHERNET) #define COMPILE_NETWORK true @@ -143,6 +143,8 @@ int pin_beeper = PIN_UNDEFINED; // I2C for GNSS, battery gauge, display //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +#include //Needed for icons etc. +#include "icons.h" #include //Built-in TwoWire *i2c_0 = nullptr; TwoWire *i2c_1 = nullptr; @@ -672,7 +674,6 @@ uint32_t lastPrintPosition; // For periodic display of the position uint32_t lastBaseIconUpdate; bool baseIconDisplayed; // Toggles as lastBaseIconUpdate goes above 1000ms -uint8_t loggingIconDisplayed; // Increases every 500ms while logging uint8_t espnowIconDisplayed; // Increases every 500ms while transmitting uint64_t lastLogSize; diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 605da72dd..1f799a891 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1268,7 +1268,7 @@ void buttonCheckTask(void *e) userBtn->read(); - if (present.imu_im19 && present.display_64x48 == false && present.display_128x64 == false) + if (present.imu_im19 && (present.display_type < DISPLAY_MAX_NONE)) { // Platform has no display and tile, ie RTK Torch diff --git a/Firmware/RTK_Everywhere/UM980.h b/Firmware/RTK_Everywhere/UM980.h index 9286c1aea..e3386e34c 100644 --- a/Firmware/RTK_Everywhere/UM980.h +++ b/Firmware/RTK_Everywhere/UM980.h @@ -1,3 +1,6 @@ +#ifndef _RTK_EVERYWHERE_UM980_H +#define _RTK_EVERYWHERE_UM980_H + /* Unicore defaults: RTCM1006 10 @@ -86,3 +89,5 @@ enum um980_Models{ UM980_DYN_MODEL_UAV, UM980_DYN_MODEL_AUTOMOTIVE, }; + +#endif \ No newline at end of file diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 7f127e310..8181691af 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1,3 +1,6 @@ +#ifndef _RTK_EVERYWHERE_ICONS_H +#define _RTK_EVERYWHERE_ICONS_H + // Create a bitmap then use http://en.radzio.dxp.pl/bitmap_converter/ to generate output // Make sure the bitmap is n*8 pixels tall (pad white pixels to lower area as needed) // Otherwise the bitmap bitmap_converter will compress some of the bytes together @@ -889,6 +892,98 @@ const uint8_t Logging_NTP_2[] = {0xFF, 0x01, 0xF1, 0x21, 0xC1, 0x01, 0x03, 0x06, const uint8_t Logging_NTP_1[] = {0xFF, 0x01, 0xF1, 0x01, 0x01, 0x01, 0x03, 0x06, 0xFC, 0x0F, 0x08, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F}; +/* + Pulse_0 [9, 12] + + 123456789 + .---------. + 0x01| * | + 0x02| * | + 0x04| * | + 0x08| * | + 0x10| * | + 0x20| * | + 0x40| * | + 0x80| * | + 0x01| * | + 0x02| * | + 0x04| * | + 0x08| * | + '---------' +*/ + +const uint8_t Pulse_0[] = {0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00}; + +/* + Pulse_1 [9, 12] + + 123456789 + .---------. + 0x01| ** | + 0x02| * | + 0x04| ** | + 0x08| **| + 0x10| ** | + 0x20| * | + 0x40| * | + 0x80| * | + 0x01| * | + 0x02| * | + 0x04| * | + 0x08| * | + '---------' +*/ + +const uint8_t Pulse_1[] = {0x00, 0x00, 0x01, 0x01, 0xE2, 0x14, 0x14, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00}; + +/* + Pulse_2 [9, 12] + + 123456789 + .---------. + 0x01| * | + 0x02| * | + 0x04| * | + 0x08| ** | + 0x10|** | + 0x20| ** | + 0x40| * | + 0x80| ** | + 0x01| **| + 0x02| ** | + 0x04| * | + 0x08| * | + '---------' +*/ + +const uint8_t Pulse_2[] = {0x10, 0x10, 0x28, 0x28, 0x47, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x01, 0x01}; + +/* + Pulse_3 [9, 12] + + 123456789 + .---------. + 0x01| * | + 0x02| * | + 0x04| * | + 0x08| * | + 0x10| * | + 0x20| * | + 0x40| * | + 0x80| ** | + 0x01|** | + 0x02| ** | + 0x04| * | + 0x08| ** | + '---------' +*/ + +const uint8_t Pulse_3[] = {0x00, 0x00, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00}; + /* DynamicModel_1_Portable [15, 12] @@ -1448,3 +1543,86 @@ const uint8_t Micros_Icon[] = {0x3F, 0x04, 0x08, 0x88, 0x84, 0x8F, 0x80, 0x00, const uint8_t Nanos_Icon[] = {0x1F, 0x01, 0x01, 0x81, 0x9E, 0x80, 0x80, 0x00, 0x00, 0x00, 0x09, 0x0A, 0x0A, 0x0A, 0x04, 0x00}; + +// Display.ino uses a vector (list) of iconProperty to define which icons are displayed where + +typedef struct { + uint8_t x; + uint8_t y; +} displayCoords; + +typedef struct { + const void *bitmap; + uint8_t width; + uint8_t height; + uint8_t xPos; + uint8_t yPos; +} iconProperty; + +typedef struct { + iconProperty iconDisplay[DISPLAY_MAX_NONE]; +} iconProperties; + +const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }, { &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }}}; +const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }, { &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }}}; +const iconProperties SIVIconProperties = {{{ &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }, { &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }}}; +const iconProperties LBandIconProperties = {{{ &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }, { &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }}}; +const iconProperties ShortIconProperties = {{{ &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, 2, 35 }, { &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, 2, 35 }}}; +const iconProperties OpenIconProperties = {{{ &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, 2, 35 }, { &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, 2, 35 }}}; + +#define LOGGING_ICON_STATES 4 +typedef struct { + iconProperty iconDisplay[LOGGING_ICON_STATES][DISPLAY_MAX_NONE]; +} iconLoggingProperties; + +const iconLoggingProperties LoggingIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, + { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, + {{ &Logging_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, + { &Logging_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, + {{ &Logging_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, + { &Logging_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, + {{ &Logging_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, + { &Logging_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; +const iconLoggingProperties LoggingPPPIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, + { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, + {{ &Logging_PPP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, + { &Logging_PPP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, + {{ &Logging_PPP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, + { &Logging_PPP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, + {{ &Logging_PPP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, + { &Logging_PPP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; +const iconLoggingProperties LoggingCustomIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, + { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, + {{ &Logging_Custom_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, + { &Logging_Custom_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, + {{ &Logging_Custom_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, + { &Logging_Custom_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, + {{ &Logging_Custom_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, + { &Logging_Custom_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; +const iconLoggingProperties LoggingNTPIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, + { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, + {{ &Logging_NTP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, + { &Logging_NTP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, + {{ &Logging_NTP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, + { &Logging_NTP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, + {{ &Logging_NTP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, + { &Logging_NTP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; +const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, + { &Pulse_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, + {{ &Pulse_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, + { &Pulse_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, + {{ &Pulse_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, + { &Pulse_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, + {{ &Pulse_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, + { &Pulse_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; + +#define BATTERY_CHARGE_STATES 4 +typedef struct { + iconProperty iconDisplay[BATTERY_CHARGE_STATES][DISPLAY_MAX_NONE]; +} iconBatteryProperties; + +const iconBatteryProperties BatteryProperties = {{{{ &Battery_0, Battery_0_Width, Battery_0_Height, 45, 0 }, { &Battery_0, Battery_0_Width, Battery_0_Height, 45, 0 }}, + {{ &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }, { &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }}, + {{ &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }, { &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }}, + {{ &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }, { &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }}}}; +#endif \ No newline at end of file diff --git a/Firmware/RTK_Everywhere/menuSystem.ino b/Firmware/RTK_Everywhere/menuSystem.ino index f8f823521..6e2b28d1e 100644 --- a/Firmware/RTK_Everywhere/menuSystem.ino +++ b/Firmware/RTK_Everywhere/menuSystem.ino @@ -27,7 +27,7 @@ void menuSystem() else systemPrintln("Offline"); - if (present.display_128x64 || present.display_64x48) + if (present.display_type < DISPLAY_MAX_NONE) { systemPrint("Display: "); if (online.display == true) diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index 5f686c294..6fb4eb2db 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -1,3 +1,6 @@ +#ifndef _RTK_EVERYWHERE_SETTINGS_H +#define _RTK_EVERYWHERE_SETTINGS_H + #include "UM980.h" //Structs of UM980 messages, needed for settings.h @@ -137,6 +140,17 @@ const SystemState platformPreviousStateTable[] = }; const int platformPreviousStateTableEntries = sizeof (platformPreviousStateTable) / sizeof(platformPreviousStateTable[0]); +typedef enum +{ + DISPLAY_64x48, + DISPLAY_128x64, + // <-- Insert any future displays here + DISPLAY_MAX_NONE // This represents the maximum numbers of display and also "no display" +} DisplayType; + +const uint8_t DisplayWidth[DISPLAY_MAX_NONE] = { 64, 128 }; // We could get these from the oled, but this is const +const uint8_t DisplayHeight[DISPLAY_MAX_NONE] = { 48, 64 }; + // Different GNSS modules require different libraries and configuration typedef enum { @@ -954,7 +968,7 @@ typedef struct uint8_t dynamicModel = DYN_MODEL_PORTABLE; SystemState lastState = STATE_NOT_SET; // Start unit in last known state bool enableResetDisplay = false; - uint8_t resetCount = 0; + int resetCount = 0; bool enableExternalPulse = true; // Send pulse once lock is achieved uint64_t externalPulseTimeBetweenPulse_us = 1000000; // us between pulses, max of 60s = 60 * 1000 * 1000 uint64_t externalPulseLength_us = 100000; // us length of pulse, max of 60s = 60 * 1000 * 1000 @@ -1240,8 +1254,7 @@ struct struct_present bool i2c1 = false; bool display_i2c0 = false; bool display_i2c1 = false; - bool display_64x48 = false; - bool display_128x64 = false; + DisplayType display_type = DISPLAY_MAX_NONE; bool battery_max17048 = false; bool battery_bq40z50 = false; @@ -1326,3 +1339,5 @@ rqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- )====="; #endif // COMPILE_WIFI + +#endif \ No newline at end of file From 59cce55d4b5d29b0d616efc7c47f928c714ee473 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 14:06:05 -0600 Subject: [PATCH 033/112] Move cancel only on/off beeps in developer mode. --- Firmware/RTK_Everywhere/Begin.ino | 9 ++++++--- Firmware/RTK_Everywhere/System.ino | 8 ++++---- Firmware/RTK_Everywhere/Tasks.ino | 4 +++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 72bc38f92..437ccb4da 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -183,9 +183,12 @@ void beginBoard() pinMode(pin_beeper, OUTPUT); - // Announce power on start - beepOn(); - delay(250); + // Beep at power on if we are not locally compiled or a release candidate + if (ENABLE_DEVELOPER == false) + { + beepOn(); + delay(250); + } beepOff(); pinMode(pin_powerButton, INPUT); diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino index 0a3911beb..8645c7563 100644 --- a/Firmware/RTK_Everywhere/System.ino +++ b/Firmware/RTK_Everywhere/System.ino @@ -45,15 +45,15 @@ void beepDurationMs(uint16_t lengthMs) void beepOn() { - // Disallow beeper when doing local compilation (developer mode), or if setting is turned off - if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true) && (ENABLE_DEVELOPER == false)) + // Disallow beeper if setting is turned off + if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true)) digitalWrite(pin_beeper, HIGH); } void beepOff() { - // Disallow beeper when doing local compilation (developer mode), or if setting is turned off - if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true) && (ENABLE_DEVELOPER == false)) + // Disallow beeper if setting is turned off + if ((pin_beeper != PIN_UNDEFINED) && (settings.enableBeeper == true)) digitalWrite(pin_beeper, LOW); } diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 99217bb9a..cbef336f6 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1282,7 +1282,9 @@ void buttonCheckTask(void *e) // Beep shortly before the shutdown IC takes over else if (userBtn->pressedFor(2500)) { - beepDurationMs(500); // Announce powering down + // Beep if we are not locally compiled or a release candidate + if (ENABLE_DEVELOPER == false) + beepDurationMs(500); // Announce powering down } } else // RTK EVK, RTK Facet v2, RTK Facet mosaic From 2a1237f895be25aebc34ffe4f756bd1c179f33bc Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Thu, 21 Mar 2024 16:25:14 -0600 Subject: [PATCH 034/112] Increase setting buffer. Avoid bulk print of large array. --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 +- Firmware/RTK_Everywhere/menuCommands.ino | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index b16e4ba8e..031de4524 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -538,7 +538,7 @@ AsyncWebSocket *websocket; // Because the incoming string is longer than max len, there are multiple callbacks so we // use a global to combine the incoming -#define AP_CONFIG_SETTING_SIZE 5000 +#define AP_CONFIG_SETTING_SIZE 11000 char *settingsCSV; // Push large array onto heap char *incomingSettings; int incomingSettingsSpot; diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 9db6e5092..29728f101 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1521,7 +1521,12 @@ void createSettingsString(char *newSettings) strcat(newSettings, "\0"); systemPrintf("newSettings len: %d\r\n", strlen(newSettings)); - systemPrintf("newSettings: %s\r\n", newSettings); + + // systemPrintf("newSettings: %s\r\n", newSettings); // newSettings is >10k. Sending to systemPrint causes stack overflow + for (int x = 0; x < strlen(newSettings); x++) // Print manually + systemWrite(newSettings[x]); + + systemPrintln(); } // Add record with int @@ -2175,8 +2180,6 @@ void getSettingValue(const char *settingName, char *settingValueStr) } } - - // Scan for UM980 NMEA message rates if (knownSetting == false) { From 555f0f3de14ddb6c95693088a90a01657325881d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 21 Mar 2024 22:31:18 +0000 Subject: [PATCH 035/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 0fa42f46c..64b0a8460 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xF8, 0x6D, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x35, 0xB5, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0xF8, 0x6D, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x35, 0xB5, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From dd450c087c8ca23b79020a5b03a32cbd3d8610d5 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 08:19:35 +0000 Subject: [PATCH 036/112] Add initial blink support --- Firmware/RTK_Everywhere/Display.ino | 173 +++++++++++++++------------- Firmware/RTK_Everywhere/icons.h | 9 +- 2 files changed, 101 insertions(+), 81 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 6029d126f..b4603dde8 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -94,9 +94,9 @@ bool ssidDisplayFirstHalf = false; // Icons #include "icons.h" -std::vector iconPropertyList; // List of icons to be displayed +std::vector iconPropertyList; // List of icons to be displayed -void paintLogging(std::vector *iconList, bool pulse = true, bool NTP = false); // Header +void paintLogging(std::vector *iconList, bool pulse = true, bool NTP = false); // Header //---------------------------------------- // Routines @@ -185,56 +185,6 @@ void beginDisplay(TwoWire *i2cBus) } } -// Avoid code repetition -void displayBatteryVsEthernet(std::vector *iconList) -{ - if (online.battery) // Product has a battery - paintBatteryLevel(iconList); - else // if (present.ethernet_ws5500 == true) - { - if (online.ethernetStatus == ETH_NOT_STARTED) - ; // If Ethernet has not stated because not needed, don't display the icon - else if (online.ethernetStatus == ETH_CONNECTED) - iconList->push_back(EthernetIconProperties.iconDisplay[present.display_type]); - else - iconList->push_back(EthernetIconProperties.iconDisplay[present.display_type]); // TODO: make this blink - } -} - -void displaySivVsOpenShort(std::vector *iconList) -{ - if (present.antennaShortOpen == false) - { - displayCoords textCoords = paintSIVIcon(iconList, nullptr, false); - paintSIVText(textCoords); - } - else - { - displayCoords textCoords; - - if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) - { - textCoords = paintSIVIcon(iconList, &ShortIconProperties, true); - } - else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) - { - textCoords = paintSIVIcon(iconList, &OpenIconProperties, true); - } - else - { - textCoords = paintSIVIcon(iconList, nullptr, false); - } - - paintSIVText(textCoords); - } -} - -void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon) -{ - // TODO: add the horizontal accuracy text depending on the icon position - iconList->push_back(icon->iconDisplay[present.display_type]); -} - // Given the system state, display the appropriate information void displayUpdate() { @@ -314,26 +264,24 @@ void displayUpdate() */ case (STATE_ROVER_NOT_STARTED): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties); + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, false); // Single crosshair, no blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_NO_FIX): - icons = ICON_CROSS_HAIR // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left - displayBatteryVsEthernet(&iconPropertyList); // Top right + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, true); // Single crosshair, blink + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_FIX): - icons = ICON_CROSS_HAIR // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left - displayBatteryVsEthernet(&iconPropertyList); // Top right + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, false); // Single crosshair, no blink + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); iconsRadio = setRadioIcons(); // Top left break; case (STATE_ROVER_RTK_FLOAT): @@ -721,7 +669,7 @@ void displayError(const char *errorMessage) */ // Print the classic battery icon with levels -void paintBatteryLevel(std::vector *iconList) +void paintBatteryLevel(std::vector *iconList) { if (online.display == true) { @@ -729,7 +677,11 @@ void paintBatteryLevel(std::vector *iconList) int batteryFraction = batteryLevelPercent / 25; if (batteryFraction >= BATTERY_CHARGE_STATES) batteryFraction = BATTERY_CHARGE_STATES - 1; - iconList->push_back(BatteryProperties.iconDisplay[batteryFraction][present.display_type]); + + iconPropertyBlinking prop; + prop.icon = BatteryProperties.iconDisplay[batteryFraction][present.display_type]; + prop.blinking = false; + iconList->push_back(prop); } } @@ -1480,6 +1432,64 @@ void paintDynamicModel() } } +void displayBatteryVsEthernet(std::vector *iconList) +{ + if (online.battery) // Product has a battery + paintBatteryLevel(iconList); + else // if (present.ethernet_ws5500 == true) + { + if (online.ethernetStatus == ETH_NOT_STARTED) + return; // If Ethernet has not stated because not needed, don't display the icon + + iconPropertyBlinking prop; + prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; + + if (online.ethernetStatus == ETH_CONNECTED) + prop.blinking = false; + else + prop.blinking = false; + + iconList->push_back(prop); + } +} + +void displaySivVsOpenShort(std::vector *iconList) +{ + if (present.antennaShortOpen == false) + { + displayCoords textCoords = paintSIVIcon(iconList, nullptr, false); + paintSIVText(textCoords); + } + else + { + displayCoords textCoords; + + if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) + { + textCoords = paintSIVIcon(iconList, &ShortIconProperties, true); + } + else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) + { + textCoords = paintSIVIcon(iconList, &OpenIconProperties, true); + } + else + { + textCoords = paintSIVIcon(iconList, nullptr, false); + } + + paintSIVText(textCoords); + } +} + +void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon, bool blinking) +{ + // TODO: add the horizontal accuracy text depending on the icon position + iconPropertyBlinking prop; + prop.icon = icon->iconDisplay[present.display_type]; + prop.blinking = blinking; + iconList->push_back(prop); +} + /* 111111111122222222223333333333444444444455555555556666 0123456789012345678901234567890123456789012345678901234567890123 @@ -1501,7 +1511,7 @@ void paintDynamicModel() // Select satellite icon and draw sats in view // Blink icon if no fix -displayCoords paintSIVIcon(std::vector *iconList, const iconProperties *icon, bool blink) +displayCoords paintSIVIcon(std::vector *iconList, const iconProperties *icon, bool blinking) { if (icon == nullptr) // Not short or open, so decide which icon to use { @@ -1516,12 +1526,8 @@ displayCoords paintSIVIcon(std::vector *iconList, const iconProper // Determine if there is a fix if (gnssIsFixed() == false) { - blink = false; - } - else - { - // Blink satellite dish icon if we don't have a fix - blink = true; + // override blinking - blink satellite dish icon if we don't have a fix + blinking = true; } } // End gnss online else @@ -1534,7 +1540,10 @@ displayCoords paintSIVIcon(std::vector *iconList, const iconProper textCoords.x = icon->iconDisplay[present.display_type].xPos + icon->iconDisplay[present.display_type].width + 2; textCoords.y = icon->iconDisplay[present.display_type].yPos + 1; - iconList->push_back(icon->iconDisplay[present.display_type]); // TODO: make this blink + iconPropertyBlinking prop; + prop.icon = icon->iconDisplay[present.display_type]; + prop.blinking = blinking; + iconList->push_back(prop); return textCoords; } @@ -1580,13 +1589,16 @@ void paintSIVText(displayCoords textCoords) // Draw log icon // Turn off icon if log file fails to get bigger -void paintLogging(std::vector *iconList, bool pulse, bool NTP) +void paintLogging(std::vector *iconList, bool pulse, bool NTP) { // Animate icon to show system running static uint8_t loggingIconDisplayed = LOGGING_ICON_STATES - 1; loggingIconDisplayed++; // Goto next icon loggingIconDisplayed %= LOGGING_ICON_STATES; // Wrap + iconPropertyBlinking prop; + prop.blinking = false; + #ifdef COMPILE_ETHERNET if ((online.logging == true) && (logIncreasing || ntpLogIncreasing)) #else // COMPILE_ETHERNET @@ -1595,24 +1607,27 @@ void paintLogging(std::vector *iconList, bool pulse, bool NTP) { if (NTP) { - iconList->push_back(LoggingNTPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + prop.icon = LoggingNTPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]; } else if (loggingType == LOGGING_STANDARD) { - iconList->push_back(LoggingIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + prop.icon = LoggingIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]; } else if (loggingType == LOGGING_PPP) { - iconList->push_back(LoggingPPPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + prop.icon = LoggingPPPIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]; } else if (loggingType == LOGGING_CUSTOM) { - iconList->push_back(LoggingCustomIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + prop.icon = LoggingCustomIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]; } + + iconList->push_back(prop); } else if (pulse) { - iconList->push_back(PulseIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]); + prop.icon = PulseIconProperties.iconDisplay[loggingIconDisplayed][present.display_type]; + iconList->push_back(prop); } } diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 8181691af..66ffd89f9 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1560,7 +1560,12 @@ typedef struct { } iconProperty; typedef struct { - iconProperty iconDisplay[DISPLAY_MAX_NONE]; + iconProperty icon; + bool blinking; +} iconPropertyBlinking; + +typedef struct { + const iconProperty iconDisplay[DISPLAY_MAX_NONE]; } iconProperties; const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }, { &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }}}; @@ -1572,7 +1577,7 @@ const iconProperties OpenIconProperties = {{{ &Antenna_Open, Antenna_Open_Width, #define LOGGING_ICON_STATES 4 typedef struct { - iconProperty iconDisplay[LOGGING_ICON_STATES][DISPLAY_MAX_NONE]; + const iconProperty iconDisplay[LOGGING_ICON_STATES][DISPLAY_MAX_NONE]; } iconLoggingProperties; const iconLoggingProperties LoggingIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, From d878fc5182dc9afbf708019ea807807cb7ab9ffa Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 09:10:53 +0000 Subject: [PATCH 037/112] Update paintHorizontalAccuracy --- Firmware/RTK_Everywhere/Display.ino | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index b4603dde8..e61be10d1 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -559,9 +559,7 @@ void displayUpdate() paintClock(); // Center right - if (icons & ICON_HORIZONTAL_ACCURACY) - paintHorizontalAccuracy(); - else if (icons & ICON_CLOCK_ACCURACY) + if (icons & ICON_CLOCK_ACCURACY) paintClockAccuracy(); // Bottom left corner @@ -680,7 +678,7 @@ void paintBatteryLevel(std::vector *iconList) iconPropertyBlinking prop; prop.icon = BatteryProperties.iconDisplay[batteryFraction][present.display_type]; - prop.blinking = false; + prop.blinking = batteryFraction == 0; iconList->push_back(prop); } } @@ -1270,10 +1268,10 @@ uint32_t blinkBaseIcon(uint32_t iconType) */ // Display horizontal accuracy -void paintHorizontalAccuracy() +void paintHorizontalAccuracy(displayCoords textCoords) { oled->setFont(QW_FONT_8X16); // Set font to type 1: 8x16 - oled->setCursor(16, 20); // x, y + oled->setCursor(textCoords.x, textCoords.y); // x, y oled->print(":"); float hpa = gnssGetHorizontalAccuracy(); @@ -1483,11 +1481,16 @@ void displaySivVsOpenShort(std::vector *iconList) void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon, bool blinking) { - // TODO: add the horizontal accuracy text depending on the icon position iconPropertyBlinking prop; prop.icon = icon->iconDisplay[present.display_type]; prop.blinking = blinking; iconList->push_back(prop); + + displayCoords textCoords; + textCoords.x = prop.icon.xPos + 16; + textCoords.y = prop.icon.yPos + 2; + + paintHorizontalAccuracy(textCoords); } /* From 4514642b25b19ce407263387e2d429b692a3a2d0 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 09:33:53 +0000 Subject: [PATCH 038/112] Change pulse to circle of doom --- Firmware/RTK_Everywhere/icons.h | 112 ++++++++++++++++---------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 66ffd89f9..46b79509d 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -897,92 +897,92 @@ const uint8_t Logging_NTP_1[] = {0xFF, 0x01, 0xF1, 0x01, 0x01, 0x01, 0x03, 0x06, 123456789 .---------. - 0x01| * | - 0x02| * | - 0x04| * | - 0x08| * | - 0x10| * | - 0x20| * | - 0x40| * | - 0x80| * | - 0x01| * | - 0x02| * | - 0x04| * | - 0x08| * | + 0x01| | + 0x02| | + 0x04| ***** | + 0x08| * | + 0x10|* | + 0x20| | + 0x40| | + 0x80| | + 0x01| | + 0x02| | + 0x04| | + 0x08| | '---------' */ -const uint8_t Pulse_0[] = {0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00}; +const uint8_t Pulse_0[] = {0x10, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /* Pulse_1 [9, 12] 123456789 .---------. - 0x01| ** | - 0x02| * | - 0x04| ** | - 0x08| **| - 0x10| ** | - 0x20| * | - 0x40| * | - 0x80| * | - 0x01| * | - 0x02| * | - 0x04| * | - 0x08| * | + 0x01| | + 0x02| | + 0x04| * | + 0x08| * | + 0x10| *| + 0x20| *| + 0x40| *| + 0x80| *| + 0x01| | + 0x02| | + 0x04| | + 0x08| | '---------' */ -const uint8_t Pulse_1[] = {0x00, 0x00, 0x01, 0x01, 0xE2, 0x14, 0x14, 0x08, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00}; +const uint8_t Pulse_1[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /* Pulse_2 [9, 12] 123456789 .---------. - 0x01| * | - 0x02| * | - 0x04| * | - 0x08| ** | - 0x10|** | - 0x20| ** | - 0x40| * | - 0x80| ** | - 0x01| **| - 0x02| ** | - 0x04| * | - 0x08| * | + 0x01| | + 0x02| | + 0x04| | + 0x08| | + 0x10| | + 0x20| | + 0x40| | + 0x80| *| + 0x01| * | + 0x02| ***** | + 0x04| | + 0x08| | '---------' */ -const uint8_t Pulse_2[] = {0x10, 0x10, 0x28, 0x28, 0x47, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0A, 0x02, 0x02, 0x01, 0x01}; +const uint8_t Pulse_2[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00}; /* Pulse_3 [9, 12] 123456789 .---------. - 0x01| * | - 0x02| * | - 0x04| * | - 0x08| * | - 0x10| * | - 0x20| * | - 0x40| * | - 0x80| ** | - 0x01|** | - 0x02| ** | - 0x04| * | - 0x08| ** | + 0x01| | + 0x02| | + 0x04| | + 0x08| | + 0x10|* | + 0x20|* | + 0x40|* | + 0x80|* | + 0x01| * | + 0x02| * | + 0x04| | + 0x08| | '---------' */ -const uint8_t Pulse_3[] = {0x00, 0x00, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x08, 0x00, 0x00}; +const uint8_t Pulse_3[] = {0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /* DynamicModel_1_Portable [15, 12] From aed3ae135571b5857503164cc6f8f3426bbe0b25 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 10:20:32 +0000 Subject: [PATCH 039/112] Update paintClock --- Firmware/RTK_Everywhere/Display.ino | 101 +++++++++++++--------------- Firmware/RTK_Everywhere/icons.h | 18 +++-- 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index e61be10d1..7cb0d4846 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -344,29 +344,38 @@ void displayUpdate() case (STATE_NTPSERVER_NOT_STARTED): case (STATE_NTPSERVER_NO_SYNC): - blinking_icons ^= ICON_CLOCK; - icons = (blinking_icons & ICON_CLOCK) // Center left - | ICON_CLOCK_ACCURACY; // Center right - displaySivVsOpenShort(&iconPropertyList); // Bottom left + { + paintClock(&iconPropertyList, true); // Blink + displaySivVsOpenShort(&iconPropertyList); + + iconPropertyBlinking prop; + prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; if (online.ethernetStatus == ETH_CONNECTED) - blinking_icons |= ICON_ETHERNET; // Don't blink if link is up + prop.blinking = false; else - blinking_icons ^= ICON_ETHERNET; - icons |= (blinking_icons & ICON_ETHERNET); // Top Right + prop.blinking = true; + iconPropertyList.push_back(prop); + iconsRadio = ICON_IP_ADDRESS; // Top left + } break; case (STATE_NTPSERVER_SYNC): - icons = ICON_CLOCK // Center left - | ICON_CLOCK_ACCURACY // Center right - | ICON_LOGGING_NTP; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left + { + paintClock(&iconPropertyList, false); // No blink + displaySivVsOpenShort(&iconPropertyList); + paintLogging(&iconPropertyList, false, true); // No pulse, NTP + + iconPropertyBlinking prop; + prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; if (online.ethernetStatus == ETH_CONNECTED) - blinking_icons |= ICON_ETHERNET; // Don't blink if link is up + prop.blinking = false; else - blinking_icons ^= ICON_ETHERNET; - icons |= (blinking_icons & ICON_ETHERNET); // Top Right + prop.blinking = true; + iconPropertyList.push_back(prop); + iconsRadio = ICON_IP_ADDRESS; // Top left + } break; case (STATE_CONFIG_VIA_ETH_NOT_STARTED): @@ -555,26 +564,6 @@ void displayUpdate() displayBitmap(0, 18, CrossHair_Width, CrossHair_Height, CrossHair); else if (icons & ICON_CROSS_HAIR_DUAL) displayBitmap(0, 18, CrossHairDual_Width, CrossHairDual_Height, CrossHairDual); - else if (icons & ICON_CLOCK) - paintClock(); - - // Center right - if (icons & ICON_CLOCK_ACCURACY) - paintClockAccuracy(); - - // Bottom left corner - if (icons & ICON_SIV_ANTENNA) - displayBitmap(2, 35, SIV_Antenna_Width, SIV_Antenna_Height, SIV_Antenna); - else if (icons & ICON_SIV_ANTENNA_LBAND) - displayBitmap(2, 35, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, SIV_Antenna_LBand); - else if (icons & ICON_ANTENNA_SHORT) - displayBitmap(2, 35, Antenna_Short_Width, Antenna_Short_Height, Antenna_Short); - else if (icons & ICON_ANTENNA_OPEN) - displayBitmap(2, 35, Antenna_Open_Width, Antenna_Open_Height, Antenna_Open); - - // Bottom right corner - if (icons & ICON_LOGGING_NTP) - paintLogging(&iconPropertyList, false, true); // no pulse, NTP oled->display(); // Push internal buffer to display } @@ -1300,28 +1289,30 @@ void paintHorizontalAccuracy(displayCoords textCoords) } // Display clock with moving hands -void paintClock() +void paintClock(std::vector *iconList, bool blinking) { // Animate icon to show system running - static uint8_t clockIconDisplayed = 3; + static uint8_t clockIconDisplayed = CLOCK_ICON_STATES - 1; clockIconDisplayed++; // Goto next icon - clockIconDisplayed %= 4; // Wrap - - if (clockIconDisplayed == 0) - displayBitmap(0, 18, Clock_Icon_Width, Clock_Icon_Height, Clock_Icon_1); - else if (clockIconDisplayed == 1) - displayBitmap(0, 18, Clock_Icon_Width, Clock_Icon_Height, Clock_Icon_2); - else if (clockIconDisplayed == 2) - displayBitmap(0, 18, Clock_Icon_Width, Clock_Icon_Height, Clock_Icon_3); - else - displayBitmap(0, 18, Clock_Icon_Width, Clock_Icon_Height, Clock_Icon_4); + clockIconDisplayed %= CLOCK_ICON_STATES; // Wrap + + iconPropertyBlinking prop; + prop.icon = ClockIconProperties.iconDisplay[clockIconDisplayed][present.display_type]; + prop.blinking = blinking; + iconList->push_back(prop); + + displayCoords textCoords; + textCoords.x = prop.icon.xPos + prop.icon.width + 1; + textCoords.y = prop.icon.yPos + 2; + + paintClockAccuracy(textCoords); } // Display clock accuracy -void paintClockAccuracy() +void paintClockAccuracy(displayCoords textCoords) { oled->setFont(QW_FONT_8X16); // Set font to type 1: 8x16 - oled->setCursor(16, 20); // x, y + oled->setCursor(textCoords.x, textCoords.y); // x, y oled->print(":"); uint32_t timeAccuracy = gnssGetTimeAccuracy(); @@ -1333,36 +1324,36 @@ void paintClockAccuracy() else if (timeAccuracy < 10) // 9 or less : show as 9ns { oled->print(timeAccuracy); - displayBitmap(36, 20, Millis_Icon_Width, Millis_Icon_Height, Nanos_Icon); + displayBitmap(textCoords.x + 20, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Nanos_Icon); } else if (timeAccuracy < 100) // 99 or less : show as 99ns { oled->print(timeAccuracy); - displayBitmap(44, 20, Millis_Icon_Width, Millis_Icon_Height, Nanos_Icon); + displayBitmap(textCoords.x + 28, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Nanos_Icon); } else if (timeAccuracy < 10000) // 9999 or less : show as 9.9μs { oled->print(timeAccuracy / 1000); oled->print("."); oled->print((timeAccuracy / 100) % 10); - displayBitmap(52, 20, Millis_Icon_Width, Millis_Icon_Height, Micros_Icon); + displayBitmap(textCoords.x + 36, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Micros_Icon); } else if (timeAccuracy < 100000) // 99999 or less : show as 99μs { oled->print(timeAccuracy / 1000); - displayBitmap(44, 20, Millis_Icon_Width, Millis_Icon_Height, Micros_Icon); + displayBitmap(textCoords.x + 28, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Micros_Icon); } else if (timeAccuracy < 10000000) // 9999999 or less : show as 9.9ms { oled->print(timeAccuracy / 1000000); oled->print("."); oled->print((timeAccuracy / 100000) % 10); - displayBitmap(52, 20, Millis_Icon_Width, Millis_Icon_Height, Millis_Icon); + displayBitmap(textCoords.x + 36, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Millis_Icon); } else // if (timeAccuracy >= 100000) { oled->print(">10"); - displayBitmap(52, 20, Millis_Icon_Width, Millis_Icon_Height, Millis_Icon); + displayBitmap(textCoords.x + 36, textCoords.y, Millis_Icon_Width, Millis_Icon_Height, Millis_Icon); } } @@ -1445,7 +1436,7 @@ void displayBatteryVsEthernet(std::vector *iconList) if (online.ethernetStatus == ETH_CONNECTED) prop.blinking = false; else - prop.blinking = false; + prop.blinking = true; iconList->push_back(prop); } diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 46b79509d..d19117907 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -143,7 +143,7 @@ const uint8_t WiFi_Symbol_0[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x80, const int Clock_Icon_Height = 15; const int Clock_Icon_Width = 15; -const uint8_t Clock_Icon_1[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0xFB, 0x01, 0x01, +const uint8_t Clock_Icon_0[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0xFB, 0x01, 0x01, 0x06, 0x02, 0x14, 0x98, 0xE0, 0x03, 0x0C, 0x14, 0x20, 0x30, 0x40, 0x40, 0x60, 0x41, 0x41, 0x32, 0x20, 0x14, 0x0C, 0x03}; @@ -171,7 +171,7 @@ const uint8_t Clock_Icon_1[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0xFB, '---------------' */ -const uint8_t Clock_Icon_2[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, 0x81, 0x81, +const uint8_t Clock_Icon_1[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, 0x81, 0x81, 0x86, 0x82, 0x14, 0x98, 0xE0, 0x03, 0x0C, 0x14, 0x20, 0x30, 0x40, 0x40, 0x60, 0x41, 0x41, 0x32, 0x20, 0x14, 0x0C, 0x03}; @@ -199,7 +199,7 @@ const uint8_t Clock_Icon_2[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, '---------------' */ -const uint8_t Clock_Icon_3[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, 0x01, 0x01, +const uint8_t Clock_Icon_2[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, 0x01, 0x01, 0x06, 0x02, 0x14, 0x98, 0xE0, 0x03, 0x0C, 0x14, 0x20, 0x30, 0x40, 0x40, 0x6F, 0x43, 0x44, 0x30, 0x20, 0x14, 0x0C, 0x03}; @@ -227,7 +227,7 @@ const uint8_t Clock_Icon_3[] = {0xE0, 0x98, 0x14, 0x02, 0x06, 0x01, 0x01, 0x83, '---------------' */ -const uint8_t Clock_Icon_4[] = {0xE0, 0x98, 0x14, 0x82, 0x86, 0x81, 0x81, 0x83, 0x01, 0x01, +const uint8_t Clock_Icon_3[] = {0xE0, 0x98, 0x14, 0x82, 0x86, 0x81, 0x81, 0x83, 0x01, 0x01, 0x06, 0x02, 0x14, 0x98, 0xE0, 0x03, 0x0C, 0x14, 0x20, 0x30, 0x40, 0x40, 0x60, 0x43, 0x44, 0x30, 0x20, 0x14, 0x0C, 0x03}; @@ -1569,6 +1569,7 @@ typedef struct { } iconProperties; const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }, { &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }}}; +const iconProperties CrossHairDualProperties = {{{ &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, 0, 18 }, { &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, 0, 18 }}}; const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }, { &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }}}; const iconProperties SIVIconProperties = {{{ &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }, { &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }}}; const iconProperties LBandIconProperties = {{{ &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }, { &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }}}; @@ -1630,4 +1631,13 @@ const iconBatteryProperties BatteryProperties = {{{{ &Battery_0, Battery_0_Width {{ &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }, { &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }}, {{ &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }, { &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }}, {{ &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }, { &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }}}}; +#define CLOCK_ICON_STATES 4 +typedef struct { + iconProperty iconDisplay[CLOCK_ICON_STATES][DISPLAY_MAX_NONE]; +} iconClockProperties; + +const iconClockProperties ClockIconProperties = {{{{ &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, + {{ &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, + {{ &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, + {{ &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}}}; #endif \ No newline at end of file From cc3a0f0ac8e093fe8ab28d3d0322c8f30d68d4e1 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 10:47:57 +0000 Subject: [PATCH 040/112] Add the icon iterator --- Firmware/RTK_Everywhere/Display.ino | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 7cb0d4846..7da626207 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -559,11 +559,22 @@ void displayUpdate() if (iconsRadio & ICON_IP_ADDRESS) paintIPAddress(); - // Center left - if (icons & ICON_CROSS_HAIR) - displayBitmap(0, 18, CrossHair_Width, CrossHair_Height, CrossHair); - else if (icons & ICON_CROSS_HAIR_DUAL) - displayBitmap(0, 18, CrossHairDual_Width, CrossHairDual_Height, CrossHairDual); + + // Now add the icons + static bool blinkState = false; + blinkState = !blinkState; + for (auto it = iconPropertyList.begin(); it != iconPropertyList.end(); it = std::next(it)) + { + iconPropertyBlinking theIcon = *it; + if (theIcon.blinking && !blinkState) + { + // Don't add the icon + } + else + { + displayBitmap(theIcon.icon.xPos, theIcon.icon.yPos, theIcon.icon.width, theIcon.icon.height, (const uint8_t *)theIcon.icon.bitmap); + } + } oled->display(); // Push internal buffer to display } From d3a8dd56fdf0e9cc12d7eb231dbca4bae3dcf8f2 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 12:26:48 +0000 Subject: [PATCH 041/112] Make icon positions relative for paintBaseTempSurveyStarted --- Firmware/RTK_Everywhere/Display.ino | 96 +++++++-------- Firmware/RTK_Everywhere/icons.h | 179 ++++++++++++++++------------ 2 files changed, 146 insertions(+), 129 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 7da626207..98b7aa73a 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -268,38 +268,35 @@ void displayUpdate() paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_NO_FIX): displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, true); // Single crosshair, blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_FIX): displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, false); // Single crosshair, no blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_RTK_FLOAT): - blinking_icons ^= ICON_CROSS_HAIR_DUAL; - icons = (blinking_icons & ICON_CROSS_HAIR_DUAL) // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left - displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, true); // Dual crosshair, blink + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); + setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_RTK_FIX): - icons = ICON_CROSS_HAIR_DUAL // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left - displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, false); // Dual crosshair, no blink + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); + setRadioIcons(&iconPropertyList); break; case (STATE_BASE_NOT_STARTED): @@ -310,35 +307,32 @@ void displayUpdate() // Screen is displayed while we are waiting for horz accuracy to drop to appropriate level // Blink crosshair icon until we have we have horz accuracy < user defined level case (STATE_BASE_TEMP_SETTLE): - blinking_icons ^= ICON_CROSS_HAIR; - icons = (blinking_icons & ICON_CROSS_HAIR) // Center left - | ICON_HORIZONTAL_ACCURACY // Center right - | ICON_LOGGING; // Bottom right - displaySivVsOpenShort(&iconPropertyList); // Bottom left - displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, true); // Single crosshair, blink + paintLogging(&iconPropertyList); + displaySivVsOpenShort(&iconPropertyList); + displayBatteryVsEthernet(&iconPropertyList); + setRadioIcons(&iconPropertyList); break; case (STATE_BASE_TEMP_SURVEY_STARTED): - icons = ICON_LOGGING; // Bottom right + paintLogging(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left - paintBaseTempSurveyStarted(); + setRadioIcons(&iconPropertyList); + paintBaseTempSurveyStarted(&iconPropertyList); break; case (STATE_BASE_TEMP_TRANSMITTING): - icons = ICON_LOGGING; // Bottom right + paintLogging(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); paintRTCM(); break; case (STATE_BASE_FIXED_NOT_STARTED): - icons = 0; // Top right displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); break; case (STATE_BASE_FIXED_TRANSMITTING): - icons = ICON_LOGGING; // Bottom right + paintLogging(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); // Top right - iconsRadio = setRadioIcons(); // Top left + setRadioIcons(&iconPropertyList); paintRTCM(); break; @@ -739,12 +733,9 @@ void paintBatteryLevel(std::vector *iconList) // Set bits to turn on various icons in the Radio area // ie: Bluetooth, WiFi, ESP Now, Mode indicators, as well as sub states of each (MAC, Blinking, Arrows, etc), depending // on connection state This function has all the logic to determine how a shared icon spot should act. ie: if we need an -// up arrow, blink the ESP Now icon, etc. This function merely sets the bits to what should be displayed. The main -// updateDisplay() function pushes bits to screen. -uint32_t setRadioIcons() +// up arrow, blink the ESP Now icon, etc. +void setRadioIcons(std::vector *iconList) { - uint32_t icons = 0; - if (online.display == true) { // There are three spots for icons in the Wireless area, left/center/right @@ -793,8 +784,6 @@ uint32_t setRadioIcons() // No Rover/Base icons } } - - return icons; } // Bluetooth is in left position @@ -1637,51 +1626,50 @@ void paintLogging(std::vector *iconList, bool pulse, bool } // Survey in is running. Show 3D Mean and elapsed time. -void paintBaseTempSurveyStarted() +void paintBaseTempSurveyStarted(std::vector *iconList) { + uint8_t xPos = CrossHairProperties.iconDisplay[present.display_type].xPos; + uint8_t yPos = CrossHairProperties.iconDisplay[present.display_type].yPos; + oled->setFont(QW_FONT_5X7); - oled->setCursor(0, 23); // x, y + oled->setCursor(xPos, yPos + 5); // x, y oled->print("Mean:"); - oled->setCursor(29, 20); // x, y + oled->setCursor(xPos + 29, yPos + 2); // x, y oled->setFont(QW_FONT_8X16); if (gnssGetSurveyInMeanAccuracy() < 10.0) // Error check oled->print(gnssGetSurveyInMeanAccuracy(), 2); else oled->print(">10"); + xPos = SIVIconProperties.iconDisplay[present.display_type].xPos; + yPos = SIVIconProperties.iconDisplay[present.display_type].yPos; + if (present.antennaShortOpen == false) { - oled->setCursor(0, 39); // x, y + oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("Time:"); } else { - static uint32_t blinkers = 0; if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - blinkers ^= ICON_ANTENNA_SHORT; - if (blinkers & ICON_ANTENNA_SHORT) - displayBitmap(2, 35, Antenna_Short_Width, Antenna_Short_Height, Antenna_Short); + paintSIVIcon(iconList, &ShortIconProperties, true); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - blinkers ^= ICON_ANTENNA_OPEN; - if (blinkers & ICON_ANTENNA_OPEN) - displayBitmap(2, 35, Antenna_Open_Width, Antenna_Open_Height, Antenna_Open); + paintSIVIcon(iconList, &OpenIconProperties, true); } else { - blinkers &= ~ICON_ANTENNA_SHORT; - blinkers &= ~ICON_ANTENNA_OPEN; - oled->setCursor(0, 39); // x, y + oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("Time:"); } } - oled->setCursor(30, 36); // x, y + oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])) + 30, yPos + 1); // x, y oled->setFont(QW_FONT_8X16); if (gnssGetSurveyInObservationTime() < 1000) // Error check oled->print(gnssGetSurveyInObservationTime()); diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index d19117907..2444fff5f 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -471,8 +471,8 @@ const uint8_t BaseFixed[] = {0x00, 0xFF, 0x01, 0x0F, 0x01, 0x8F, 0x88, 0x88, 0x8 '-------------------' */ -const int Battery_3_Height = 12; -const int Battery_3_Width = 19; +const int Battery_Height = 12; +const int Battery_Width = 19; const uint8_t Battery_3[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x0F, 0x08, 0xF8, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x0F, 0x01, 0x01}; @@ -498,8 +498,6 @@ const uint8_t Battery_3[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0xFD, 0xF '-------------------' */ -const int Battery_2_Height = 12; -const int Battery_2_Width = 19; const uint8_t Battery_2[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x08, 0xF8, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x01, 0x01}; @@ -525,8 +523,6 @@ const uint8_t Battery_2[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0xFD, 0xF '-------------------' */ -const int Battery_1_Height = 12; -const int Battery_1_Width = 19; const uint8_t Battery_1[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x08, 0xF8, 0x0F, 0x08, 0x0B, 0x0B, 0x0B, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x01, 0x01}; @@ -552,8 +548,6 @@ const uint8_t Battery_1[] = {0xFF, 0x01, 0xFD, 0xFD, 0xFD, 0x01, 0x01, 0x01, 0x0 '-------------------' */ -const int Battery_0_Height = 12; -const int Battery_0_Width = 19; const uint8_t Battery_0[] = {0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0F, 0x08, 0xF8, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F, 0x01, 0x01}; @@ -605,8 +599,8 @@ const uint8_t Ethernet_Icon[] = {0x00, 0x20, 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, 0x2E, '---------' */ -const int Logging_3_Height = 12; -const int Logging_3_Width = 9; +const int Logging_Height = 12; +const int Logging_Width = 9; const uint8_t Logging_3[] = {0xFF, 0x01, 0x51, 0x51, 0x51, 0x51, 0x53, 0x06, 0xFC, 0x0F, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0F}; @@ -630,8 +624,6 @@ const uint8_t Logging_3[] = {0xFF, 0x01, 0x51, 0x51, 0x51, 0x51, 0x53, 0x06, 0xF '---------' */ -const int Logging_2_Height = 12; -const int Logging_2_Width = 9; const uint8_t Logging_2[] = {0xFF, 0x01, 0x41, 0x41, 0x41, 0x41, 0x43, 0x06, 0xFC, 0x0F, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0F}; @@ -655,8 +647,6 @@ const uint8_t Logging_2[] = {0xFF, 0x01, 0x41, 0x41, 0x41, 0x41, 0x43, 0x06, 0xF '---------' */ -const int Logging_1_Height = 12; -const int Logging_1_Width = 9; const uint8_t Logging_1[] = {0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x06, 0xFC, 0x0F, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0F}; @@ -680,8 +670,6 @@ const uint8_t Logging_1[] = {0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x06, 0xF '---------' */ -const int Logging_0_Height = 12; -const int Logging_0_Width = 9; const uint8_t Logging_0[] = {0xFF, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x06, 0xFC, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0F}; @@ -1568,76 +1556,117 @@ typedef struct { const iconProperty iconDisplay[DISPLAY_MAX_NONE]; } iconProperties; -const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }, { &CrossHair, CrossHair_Width, CrossHair_Height, 0, 18 }}}; -const iconProperties CrossHairDualProperties = {{{ &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, 0, 18 }, { &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, 0, 18 }}}; -const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }, { &Ethernet_Icon, Ethernet_Icon_Width, Ethernet_Icon_Height, 45, 0 }}}; -const iconProperties SIVIconProperties = {{{ &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }, { &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, 2, 35 }}}; -const iconProperties LBandIconProperties = {{{ &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }, { &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, 2, 35 }}}; -const iconProperties ShortIconProperties = {{{ &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, 2, 35 }, { &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, 2, 35 }}}; -const iconProperties OpenIconProperties = {{{ &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, 2, 35 }, { &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, 2, 35 }}}; +const uint8_t AccuracyIconXPos64x48 = 0; +const uint8_t AccuracyIconYPos64x48 = 18; +const uint8_t AccuracyIconXPos128x64 = 0; +const uint8_t AccuracyIconYPos128x64 = 18; + +const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &CrossHair, CrossHair_Width, CrossHair_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}}; +const iconProperties CrossHairDualProperties = {{{ &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &CrossHairDual, CrossHairDual_Width, CrossHairDual_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}}; + +#define CLOCK_ICON_STATES 4 +typedef struct { + iconProperty iconDisplay[CLOCK_ICON_STATES][DISPLAY_MAX_NONE]; +} iconClockProperties; + +const iconClockProperties ClockIconProperties = {{{{ &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}, + {{ &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}, + {{ &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}, + {{ &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, + { &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}}}; + +const uint8_t SIVIconXPos64x48 = 2; // This aligns the SIV icon neatly under the accuracy icon. But it causes challenges elsewhere +const uint8_t SIVIconYPos64x48 = 35; +const uint8_t SIVIconXPos128x64 = 2; +const uint8_t SIVIconYPos128x64 = 35; + +const int SIVTextStartXPosOffset[DISPLAY_MAX_NONE] = { -2, -2 }; // This is a bodge to allow the paintBaseTempSurveyStarted text to be printed in the correct place + +const iconProperties SIVIconProperties = {{{ &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, SIVIconXPos64x48, SIVIconYPos64x48 }, + { &SIV_Antenna, SIV_Antenna_Width, SIV_Antenna_Height, SIVIconXPos128x64, SIVIconYPos128x64 }}}; +const iconProperties LBandIconProperties = {{{ &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, SIVIconXPos64x48, SIVIconYPos64x48 }, + { &SIV_Antenna_LBand, SIV_Antenna_LBand_Width, SIV_Antenna_LBand_Height, SIVIconXPos128x64, SIVIconYPos128x64 }}}; +const iconProperties ShortIconProperties = {{{ &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, SIVIconXPos64x48, SIVIconYPos64x48 }, + { &Antenna_Short, Antenna_Short_Width, Antenna_Short_Height, SIVIconXPos128x64, SIVIconYPos128x64 }}}; +const iconProperties OpenIconProperties = {{{ &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, SIVIconXPos64x48, SIVIconYPos64x48 }, + { &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, SIVIconXPos128x64, SIVIconYPos128x64 }}}; + +const uint8_t LoggingIconXPos64x48 = DisplayWidth[0] - Logging_Width; // Put the logging icon in the bottom right corner +const uint8_t LoggingIconYPos64x48 = DisplayHeight[0] - Logging_Height; +const uint8_t LoggingIconXPos128x64 = DisplayWidth[1] - Logging_Width; +const uint8_t LoggingIconYPos128x64 = DisplayHeight[1] - Logging_Height; #define LOGGING_ICON_STATES 4 typedef struct { const iconProperty iconDisplay[LOGGING_ICON_STATES][DISPLAY_MAX_NONE]; } iconLoggingProperties; -const iconLoggingProperties LoggingIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, - { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, - {{ &Logging_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, - { &Logging_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, - {{ &Logging_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, - { &Logging_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, - {{ &Logging_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, - { &Logging_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; -const iconLoggingProperties LoggingPPPIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, - { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, - {{ &Logging_PPP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, - { &Logging_PPP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, - {{ &Logging_PPP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, - { &Logging_PPP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, - {{ &Logging_PPP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, - { &Logging_PPP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; -const iconLoggingProperties LoggingCustomIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, - { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, - {{ &Logging_Custom_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, - { &Logging_Custom_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, - {{ &Logging_Custom_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, - { &Logging_Custom_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, - {{ &Logging_Custom_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, - { &Logging_Custom_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; -const iconLoggingProperties LoggingNTPIconProperties = {{{{ &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, - { &Logging_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, - {{ &Logging_NTP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, - { &Logging_NTP_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, - {{ &Logging_NTP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, - { &Logging_NTP_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, - {{ &Logging_NTP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, - { &Logging_NTP_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; -const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_0_Width, Logging_0_Height, DisplayWidth[0] - Logging_0_Width, DisplayHeight[0] - Logging_0_Height }, - { &Pulse_0, Logging_0_Width, Logging_0_Height, DisplayWidth[1] - Logging_0_Width, DisplayHeight[1] - Logging_0_Height }}, - {{ &Pulse_1, Logging_1_Width, Logging_1_Height, DisplayWidth[0] - Logging_1_Width, DisplayHeight[0] - Logging_1_Height }, - { &Pulse_1, Logging_1_Width, Logging_1_Height, DisplayWidth[1] - Logging_1_Width, DisplayHeight[1] - Logging_1_Height }}, - {{ &Pulse_2, Logging_2_Width, Logging_2_Height, DisplayWidth[0] - Logging_2_Width, DisplayHeight[0] - Logging_2_Height }, - { &Pulse_2, Logging_2_Width, Logging_2_Height, DisplayWidth[1] - Logging_2_Width, DisplayHeight[1] - Logging_2_Height }}, - {{ &Pulse_3, Logging_3_Width, Logging_3_Height, DisplayWidth[0] - Logging_3_Width, DisplayHeight[0] - Logging_3_Height }, - { &Pulse_3, Logging_3_Width, Logging_3_Height, DisplayWidth[1] - Logging_3_Width, DisplayHeight[1] - Logging_3_Height }}}}; +const iconLoggingProperties LoggingIconProperties = {{{{ &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_1, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_1, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_2, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_2, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; +const iconLoggingProperties LoggingPPPIconProperties = {{{{ &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_PPP_1, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_PPP_1, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_PPP_2, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_PPP_2, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_PPP_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_PPP_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; +const iconLoggingProperties LoggingCustomIconProperties = {{{{ &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_Custom_1, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_Custom_1, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_Custom_2, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_Custom_2, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_Custom_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_Custom_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; +const iconLoggingProperties LoggingNTPIconProperties = {{{{ &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_0, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_NTP_1, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_NTP_1, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_NTP_2, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_NTP_2, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Logging_NTP_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Logging_NTP_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; +const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Pulse_0, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Pulse_1, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Pulse_1, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Pulse_2, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Pulse_2, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}, + {{ &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, + { &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; + +const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - Battery_Width; // Put the logging icon in the top right corner +const uint8_t BatteryIconYPos64x48 = 0; +const uint8_t BatteryIconXPos128x64 = DisplayWidth[1] - Battery_Width; +const uint8_t BatteryIconYPos128x64 = 0; + +const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, + { &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }}}; #define BATTERY_CHARGE_STATES 4 typedef struct { iconProperty iconDisplay[BATTERY_CHARGE_STATES][DISPLAY_MAX_NONE]; } iconBatteryProperties; -const iconBatteryProperties BatteryProperties = {{{{ &Battery_0, Battery_0_Width, Battery_0_Height, 45, 0 }, { &Battery_0, Battery_0_Width, Battery_0_Height, 45, 0 }}, - {{ &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }, { &Battery_1, Battery_1_Width, Battery_1_Height, 45, 0 }}, - {{ &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }, { &Battery_2, Battery_2_Width, Battery_2_Height, 45, 0 }}, - {{ &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }, { &Battery_3, Battery_3_Width, Battery_3_Height, 45, 0 }}}}; -#define CLOCK_ICON_STATES 4 -typedef struct { - iconProperty iconDisplay[CLOCK_ICON_STATES][DISPLAY_MAX_NONE]; -} iconClockProperties; +const iconBatteryProperties BatteryProperties = {{{{ &Battery_0, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, + { &Battery_0, Battery_Width, Battery_Height, BatteryIconXPos128x64, BatteryIconYPos128x64 }}, + {{ &Battery_1, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, + { &Battery_1, Battery_Width, Battery_Height, BatteryIconXPos128x64, BatteryIconYPos128x64 }}, + {{ &Battery_2, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, + { &Battery_2, Battery_Width, Battery_Height, BatteryIconXPos128x64, BatteryIconYPos128x64 }}, + {{ &Battery_3, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, + { &Battery_3, Battery_Width, Battery_Height, BatteryIconXPos128x64, BatteryIconYPos128x64 }}}}; -const iconClockProperties ClockIconProperties = {{{{ &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_0, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, - {{ &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_1, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, - {{ &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_2, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}, - {{ &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }, { &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, 0, 18 }}}}; #endif \ No newline at end of file From 92e108f33511cab2a3be0f9daa94ed90c78b5aaf Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 12:48:20 +0000 Subject: [PATCH 042/112] Update paintRTCM --- Firmware/RTK_Everywhere/Display.ino | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 98b7aa73a..3fd5a605d 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -323,7 +323,7 @@ void displayUpdate() paintLogging(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); // Top right setRadioIcons(&iconPropertyList); - paintRTCM(); + paintRTCM(&iconPropertyList); break; case (STATE_BASE_FIXED_NOT_STARTED): displayBatteryVsEthernet(&iconPropertyList); // Top right @@ -333,7 +333,7 @@ void displayUpdate() paintLogging(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); // Top right setRadioIcons(&iconPropertyList); - paintRTCM(); + paintRTCM(&iconPropertyList); break; case (STATE_NTPSERVER_NOT_STARTED): @@ -1647,7 +1647,7 @@ void paintBaseTempSurveyStarted(std::vector *iconList) if (present.antennaShortOpen == false) { - oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])), yPos + 4); // x, y + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("Time:"); } @@ -1663,13 +1663,13 @@ void paintBaseTempSurveyStarted(std::vector *iconList) } else { - oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])), yPos + 4); // x, y + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("Time:"); } } - oled->setCursor((uint8_t((int)xPos + SIVTextStartXPosOffset[present.display_type])) + 30, yPos + 1); // x, y + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]) + 30, yPos + 1); // x, y oled->setFont(QW_FONT_8X16); if (gnssGetSurveyInObservationTime() < 1000) // Error check oled->print(gnssGetSurveyInObservationTime()); @@ -1690,49 +1690,48 @@ void printTextwithKerning(const char *newText, uint8_t xPos, uint8_t yPos, uint8 } // Show transmission of RTCM correction data packets to NTRIP caster -void paintRTCM() +void paintRTCM(std::vector *iconList) { - int yPos = 17; + uint8_t xPos = CrossHairProperties.iconDisplay[present.display_type].xPos; + uint8_t yPos = CrossHairProperties.iconDisplay[present.display_type].yPos; + + // Note: the "yPos - 1" is potentially brittle. TODO: find a better solution for this if (ntripServerIsCasting()) - printTextCenter("Casting", yPos, QW_FONT_8X16, 1, false); // text, y, font type, kerning, inverted + printTextCenter("Casting", yPos - 1, QW_FONT_8X16, 1, false); // text, y, font type, kerning, inverted else - printTextCenter("Xmitting", yPos, QW_FONT_8X16, 1, false); // text, y, font type, kerning, inverted + printTextCenter("Xmitting", yPos - 1, QW_FONT_8X16, 1, false); // text, y, font type, kerning, inverted + + xPos = SIVIconProperties.iconDisplay[present.display_type].xPos; + yPos = SIVIconProperties.iconDisplay[present.display_type].yPos; if (present.antennaShortOpen == false) { - oled->setCursor(0, 39); // x, y + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("RTCM:"); } else { - static uint32_t blinkers = 0; if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - blinkers ^= ICON_ANTENNA_SHORT; - if (blinkers & ICON_ANTENNA_SHORT) - displayBitmap(2, 35, Antenna_Short_Width, Antenna_Short_Height, Antenna_Short); + paintSIVIcon(iconList, &ShortIconProperties, true); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - blinkers ^= ICON_ANTENNA_OPEN; - if (blinkers & ICON_ANTENNA_OPEN) - displayBitmap(2, 35, Antenna_Open_Width, Antenna_Open_Height, Antenna_Open); + paintSIVIcon(iconList, &OpenIconProperties, true); } else { - blinkers &= ~ICON_ANTENNA_SHORT; - blinkers &= ~ICON_ANTENNA_OPEN; - oled->setCursor(0, 39); // x, y + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]), yPos + 4); // x, y oled->setFont(QW_FONT_5X7); oled->print("RTCM:"); } } if (rtcmPacketsSent < 100) - oled->setCursor(30, 36); // x, y - Give space for two digits + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]) + 30, yPos + 1); // x, y - Give space for two digits else - oled->setCursor(28, 36); // x, y - Push towards colon to make room for log icon + oled->setCursor((uint8_t)((int)xPos + SIVTextStartXPosOffset[present.display_type]) + 28, yPos + 1); // x, y - Push towards colon to make room for log icon oled->setFont(QW_FONT_8X16); // Set font to type 1: 8x16 oled->print(rtcmPacketsSent); // rtcmPacketsSent is controlled in processRTCM() From 163fcf2e2d6deb12c123dea7791242da9213002e Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 22 Mar 2024 11:34:33 -0600 Subject: [PATCH 043/112] Fix compiler warnings --- Firmware/RTK_Everywhere/Bluetooth.ino | 5 +++ Firmware/RTK_Everywhere/GNSS.ino | 4 +-- Firmware/RTK_Everywhere/NTP.ino | 2 +- Firmware/RTK_Everywhere/Network.ino | 2 +- .../RTK_Everywhere/PointPerfectLibrary.ino | 10 +++--- Firmware/RTK_Everywhere/PvtServer.ino | 3 +- Firmware/RTK_Everywhere/PvtUdpServer.ino | 7 +--- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 +- Firmware/RTK_Everywhere/Tasks.ino | 12 +++---- Firmware/RTK_Everywhere/Tilt.ino | 36 +++++++++---------- Firmware/RTK_Everywhere/UM980.ino | 4 +-- Firmware/RTK_Everywhere/ZED.ino | 4 +-- Firmware/RTK_Everywhere/menuCommands.ino | 14 ++++---- Firmware/RTK_Everywhere/menuFirmware.ino | 8 ++--- Firmware/RTK_Everywhere/menuPP.ino | 2 ++ Firmware/RTK_Everywhere/support.ino | 8 ++--- 16 files changed, 62 insertions(+), 61 deletions(-) diff --git a/Firmware/RTK_Everywhere/Bluetooth.ino b/Firmware/RTK_Everywhere/Bluetooth.ino index 410c111b9..ad4c3ac5d 100644 --- a/Firmware/RTK_Everywhere/Bluetooth.ino +++ b/Firmware/RTK_Everywhere/Bluetooth.ino @@ -93,9 +93,14 @@ int bluetoothRead(uint8_t *buffer, int length) return (bytesRead); bytesRead = bluetoothSerialSpp->readBytes(buffer, length); + + return (bytesRead); } else return bluetoothSerial->readBytes(buffer, length); + + return 0; + #else // COMPILE_BT return 0; #endif // COMPILE_BT diff --git a/Firmware/RTK_Everywhere/GNSS.ino b/Firmware/RTK_Everywhere/GNSS.ino index b013e9be7..98a0b6f43 100644 --- a/Firmware/RTK_Everywhere/GNSS.ino +++ b/Firmware/RTK_Everywhere/GNSS.ino @@ -1223,7 +1223,7 @@ char *gnssGetRtcmDefaultString() { return (um980GetRtcmDefaultString()); } - return ("Error"); + return ((char *)"Error"); } char *gnssGetRtcmLowDataRateString() @@ -1236,7 +1236,7 @@ char *gnssGetRtcmLowDataRateString() { return (um980GetRtcmLowDataRateString()); } - return ("Error"); + return ((char *)"Error"); } float gnssGetSurveyInStartingAccuracy() diff --git a/Firmware/RTK_Everywhere/NTP.ino b/Firmware/RTK_Everywhere/NTP.ino index 1cc95865d..79b4cb34f 100644 --- a/Firmware/RTK_Everywhere/NTP.ino +++ b/Firmware/RTK_Everywhere/NTP.ino @@ -603,7 +603,7 @@ bool ntpProcessOneRequest(bool process, const timeval *recTv, const timeval *syn // Now transmit the response to the client. ntpServer->beginPacket(remoteIP, remotePort); ntpServer->write(packet.packet, NTPpacket::NTPpacketSize); - int result = ntpServer->endPacket(); + //int result = ntpServer->endPacket(); processed = true; // Add our server transmit time to the diagnostics diff --git a/Firmware/RTK_Everywhere/Network.ino b/Firmware/RTK_Everywhere/Network.ino index a0a5dc58f..c607befdd 100644 --- a/Firmware/RTK_Everywhere/Network.ino +++ b/Firmware/RTK_Everywhere/Network.ino @@ -650,7 +650,7 @@ void networkRetry(NETWORK_DATA *network, uint8_t previousNetworkType) { uint8_t networkType; int seconds; - uint8_t users; + //uint8_t users; // Determine the delay multiplier network->connectionAttempt += 1; diff --git a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino index 5b6674083..b8b6ffb41 100644 --- a/Firmware/RTK_Everywhere/PointPerfectLibrary.ino +++ b/Firmware/RTK_Everywhere/PointPerfectLibrary.ino @@ -158,9 +158,9 @@ void beginPPL() // Starts task for feeding NMEA+RTCM to PPL if (online.updatePplTaskRunning == false) xTaskCreate(updatePplTask, - "UpdatePpl", // Just for humans + "UpdatePpl", // Just for humans updatePplTaskStackSize, // Stack Size - nullptr, // Task input parameter + nullptr, // Task input parameter updatePplTaskPriority, &taskHandle); // Task handle } @@ -170,14 +170,14 @@ void beginPPL() reportHeapNow(false); } - // Start the PPL if needed -// Because the key for the PPL expires every ~28 days, we use updatePPL to first apply keys, and +// Because the key for the PPL expires every ~28 days, we use updatePPL to first apply keys, and // restart the PPL when new keys need to be applied void updatePPL() { if (online.ppl == false && - (settings.pointPerfectCorrectionsSource == POINTPERFECT_CORRECTIONS_IP) || (settings.pointPerfectCorrectionsSource == POINTPERFECT_CORRECTIONS_LBAND_IP)) + ((settings.pointPerfectCorrectionsSource == POINTPERFECT_CORRECTIONS_IP) || (settings.pointPerfectCorrectionsSource == POINTPERFECT_CORRECTIONS_LBAND_IP)) + ) { // Start PPL only after GNSS is outputting appropriate NMEA+RTCM, we have a key, and the MQTT broker is // connected. Don't restart the PPL if we've already tried diff --git a/Firmware/RTK_Everywhere/PvtServer.ino b/Firmware/RTK_Everywhere/PvtServer.ino index e15fab440..7b08b9685 100644 --- a/Firmware/RTK_Everywhere/PvtServer.ino +++ b/Firmware/RTK_Everywhere/PvtServer.ino @@ -84,9 +84,8 @@ static volatile RING_BUFFER_OFFSET pvtServerClientTails[PVT_SERVER_MAX_CLIENTS]; // Send data to the PVT clients int32_t pvtServerClientSendData(int index, uint8_t *data, uint16_t length) { - length = pvtServerClient[index]->write(data, length); - if (length >= 0) + if (length > 0) { // Update the data sent flag when data successfully sent if (length > 0) diff --git a/Firmware/RTK_Everywhere/PvtUdpServer.ino b/Firmware/RTK_Everywhere/PvtUdpServer.ino index ebee46f4a..4146e7943 100644 --- a/Firmware/RTK_Everywhere/PvtUdpServer.ino +++ b/Firmware/RTK_Everywhere/PvtUdpServer.ino @@ -176,7 +176,7 @@ int32_t pvtUdpServerSendData(uint16_t dataHead) // Remove previous messages from the ring buffer void discardPvtUdpServerBytes(RING_BUFFER_OFFSET previousTail, RING_BUFFER_OFFSET newTail) { - int index; + //int index; uint16_t tail; tail = pvtUdpServerTail; @@ -244,8 +244,6 @@ bool pvtUdpServerStart() // Stop the PVT UDP server void pvtUdpServerStop() { - int index; - // Notify the rest of the system that the PVT server is shutting down if (online.pvtUdpServer) { @@ -279,9 +277,6 @@ void pvtUdpServerStop() // Update the PVT server state void pvtUdpServerUpdate() { - bool connected; - bool dataSent; - int index; IPAddress ipAddress; // Shutdown the PVT UDP server when the mode or setting changes diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 031de4524..e6269f2c0 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -623,7 +623,7 @@ TaskHandle_t updatePplTaskHandle; // Store handles so that we can delete const uint8_t updatePplTaskPriority = 0; // 3 being the highest, and 0 being the lowest const int updatePplTaskStackSize = 3000; -#endif COMPILE_POINTPERFECT_LIBRARY +#endif // COMPILE_POINTPERFECT_LIBRARY bool pplNewRtcmNmea; bool pplNewSpartn; diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index cbef336f6..27afef4b7 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -115,12 +115,12 @@ void btReadTask(void *e) { int rxBytes; - unsigned long btLastByteReceived; // Track when the last BT transmission was received. + unsigned long btLastByteReceived = 0; // Track when the last BT transmission was received. const long btMinEscapeTime = 2000; // Bluetooth serial traffic must stop this amount before an escape char is recognized - uint8_t btEscapeCharsReceived; // Used to enter remote command mode + uint8_t btEscapeCharsReceived = 0; // Used to enter remote command mode - uint8_t btAppCommandCharsReceived; // Used to enter app command mode + uint8_t btAppCommandCharsReceived = 0; // Used to enter app command mode // Start notification online.btReadTaskRunning = true; @@ -1133,9 +1133,9 @@ void tickerBluetoothLedUpdate() void tickerGnssLedUpdate() { static uint8_t ledCallCounter = 0; // Used to calculate a 50% or 10% on rate for blinking - static int gnssFadeLevel = 0; // Used to fade LED when needed - static int gnssPwmFadeAmount = - 255 / gnssTaskUpdatesHz; // Fade in/out with 20 steps, as limited by the ticker rate of 20Hz + // static int gnssFadeLevel = 0; // Used to fade LED when needed + // static int gnssPwmFadeAmount = 255 / gnssTaskUpdatesHz; // Fade in/out with 20 steps, as limited by the ticker + // rate of 20Hz ledCallCounter++; ledCallCounter %= gnssTaskUpdatesHz; // Wrap to X calls per 1 second diff --git a/Firmware/RTK_Everywhere/Tilt.ino b/Firmware/RTK_Everywhere/Tilt.ino index b8c6b0e8d..afdb0cb90 100644 --- a/Firmware/RTK_Everywhere/Tilt.ino +++ b/Firmware/RTK_Everywhere/Tilt.ino @@ -520,7 +520,7 @@ void tiltApplyCompensationGNS(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Latitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lat and beginning of lon strncat(newSentence, nmeaSentence + latitudeStop, longitudeStart - latitudeStop); @@ -530,7 +530,7 @@ void tiltApplyCompensationGNS(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Longitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lon and beginning of alt strncat(newSentence, nmeaSentence + longitudeStop, altitudeStart - longitudeStop); @@ -539,7 +539,7 @@ void tiltApplyCompensationGNS(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "%0.3f", tiltSensor->getNaviAltitude()); // Add tilt-compensated Altitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add remainder of the sentence up to checksum strncat(newSentence, nmeaSentence + altitudeStop, checksumStart - altitudeStop); @@ -553,10 +553,10 @@ void tiltApplyCompensationGNS(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "*%02X\r\n", CRC); // Add CRC - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Overwrite the original NMEA - strncpy(nmeaSentence, newSentence, sizeof(newSentence)); + strncpy(nmeaSentence, newSentence, arraySize); } // Modify a GLL sentence with tilt compensation @@ -619,7 +619,7 @@ void tiltApplyCompensationGLL(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Latitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lat and beginning of lon strncat(newSentence, nmeaSentence + latitudeStop, longitudeStart - latitudeStop); @@ -629,7 +629,7 @@ void tiltApplyCompensationGLL(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Longitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add remainder of the sentence up to checksum strncat(newSentence, nmeaSentence + longitudeStop, checksumStart - longitudeStop); @@ -643,10 +643,10 @@ void tiltApplyCompensationGLL(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "*%02X\r\n", CRC); // Add CRC - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Overwrite the original NMEA - strncpy(nmeaSentence, newSentence, sizeof(newSentence)); + strncpy(nmeaSentence, newSentence, arraySize); } // Modify a RMC sentence with tilt compensation @@ -709,7 +709,7 @@ void tiltApplyCompensationRMC(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Latitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lat and beginning of lon strncat(newSentence, nmeaSentence + latitudeStop, longitudeStart - latitudeStop); @@ -719,7 +719,7 @@ void tiltApplyCompensationRMC(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Longitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add remainder of the sentence up to checksum strncat(newSentence, nmeaSentence + longitudeStop, checksumStart - longitudeStop); @@ -733,10 +733,10 @@ void tiltApplyCompensationRMC(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "*%02X\r\n", CRC); // Add CRC - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Overwrite the original NMEA - strncpy(nmeaSentence, newSentence, sizeof(newSentence)); + strncpy(nmeaSentence, newSentence, arraySize); } // Modify a GGA sentence with tilt compensation @@ -811,7 +811,7 @@ void tiltApplyCompensationGGA(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Latitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lat and beginning of lon strncat(newSentence, nmeaSentence + latitudeStop, longitudeStart - latitudeStop); @@ -821,7 +821,7 @@ void tiltApplyCompensationGGA(char *nmeaSentence, int arraySize) sizeof(coordinateStringDDMM)); // Add tilt-compensated Longitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add interstitial between end of lon and beginning of alt strncat(newSentence, nmeaSentence + longitudeStop, altitudeStart - longitudeStop); @@ -830,7 +830,7 @@ void tiltApplyCompensationGGA(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "%0.3f", tiltSensor->getNaviAltitude()); // Add tilt-compensated Altitude - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Add remainder of the sentence up to checksum strncat(newSentence, nmeaSentence + altitudeStop, checksumStart - altitudeStop); @@ -844,10 +844,10 @@ void tiltApplyCompensationGGA(char *nmeaSentence, int arraySize) snprintf(coordinateStringDDMM, sizeof(coordinateStringDDMM), "*%02X\r\n", CRC); // Add CRC - strncat(newSentence, coordinateStringDDMM, sizeof(coordinateStringDDMM)); + strncat(newSentence, coordinateStringDDMM, sizeof(newSentence) - 1); // Overwrite the original NMEA - strncpy(nmeaSentence, newSentence, sizeof(newSentence)); + strncpy(nmeaSentence, newSentence, arraySize); if (settings.enableImuCompensationDebug == true) systemPrintf("Compensated GNGGA: %s\r\n", nmeaSentence); diff --git a/Firmware/RTK_Everywhere/UM980.ino b/Firmware/RTK_Everywhere/UM980.ino index 5e76185a0..cd315c010 100644 --- a/Firmware/RTK_Everywhere/UM980.ino +++ b/Firmware/RTK_Everywhere/UM980.ino @@ -983,11 +983,11 @@ bool um980InRoverMode() char *um980GetRtcmDefaultString() { - return ("1005/1074/1084/1094/1124 1Hz & 1033 0.1Hz"); + return ((char *)"1005/1074/1084/1094/1124 1Hz & 1033 0.1Hz"); } char *um980GetRtcmLowDataRateString() { - return ("1074/1084/1094/1124 1Hz & 1005/1033 0.1Hz"); + return ((char *)"1074/1084/1094/1124 1Hz & 1005/1033 0.1Hz"); } // Set RTCM for base mode to defaults (1005/1074/1084/1094/1124 1Hz & 1033 0.1Hz) diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index 2c2f3e935..9bb432da4 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -1655,11 +1655,11 @@ void zedBaseRtcmLowDataRate() char *zedGetRtcmDefaultString() { - return ("1005/1074/1084/1094/1124 1Hz & 1230 0.1Hz"); + return ((char *)"1005/1074/1084/1094/1124 1Hz & 1230 0.1Hz"); } char *zedGetRtcmLowDataRateString() { - return ("1074/1084/1094/1124 1Hz & 1005/1230 0.1Hz"); + return ((char *)"1074/1084/1094/1124 1Hz & 1005/1230 0.1Hz"); } float zedGetSurveyInStartingAccuracy() diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 29728f101..383836c35 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1,4 +1,4 @@ -const uint8_t bufferLen = 1024; +const uint16_t bufferLen = 1024; char cmdBuffer[bufferLen]; char valueBuffer[bufferLen]; const int MAX_TOKENS = 10; @@ -608,7 +608,7 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Sending reset confirmation"); - sendStringToWebsocket("confirmReset,1,"); + sendStringToWebsocket((char *)"confirmReset,1,"); delay(500); // Allow for delivery if (configureViaEthernet) @@ -705,7 +705,7 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Checking for new OTA Pull firmware"); - sendStringToWebsocket("checkingNewFirmware,1,"); // Tell the config page we received their request + sendStringToWebsocket((char *)"checkingNewFirmware,1,"); // Tell the config page we received their request char reportedVersion[20]; char newVersionCSV[100]; @@ -744,13 +744,13 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr if (settings.debugWiFiConfig == true) systemPrintln("Getting new OTA Pull firmware"); - sendStringToWebsocket("gettingNewFirmware,1,"); + sendStringToWebsocket((char *)"gettingNewFirmware,1,"); apConfigFirmwareUpdateInProcess = true; otaUpdate(); // We get here if WiFi failed to connect - sendStringToWebsocket("gettingNewFirmware,ERROR,"); + sendStringToWebsocket((char *)"gettingNewFirmware,ERROR,"); } // Unused variables - read to avoid errors @@ -1600,12 +1600,12 @@ void writeToString(char *settingValueStr, int value) } void writeToString(char *settingValueStr, uint64_t value) { - sprintf(settingValueStr, "%lu", value); + sprintf(settingValueStr, "%" PRIu64, value); } void writeToString(char *settingValueStr, uint32_t value) { - sprintf(settingValueStr, "%lu", value); + sprintf(settingValueStr, "%" PRIu32, value); } void writeToString(char *settingValueStr, double value) { diff --git a/Firmware/RTK_Everywhere/menuFirmware.ino b/Firmware/RTK_Everywhere/menuFirmware.ino index 53f2fe2e6..fcb36299a 100644 --- a/Firmware/RTK_Everywhere/menuFirmware.ino +++ b/Firmware/RTK_Everywhere/menuFirmware.ino @@ -820,10 +820,10 @@ void otaSetState(OtaState newState) { char string1[40]; char string2[40]; - const char *arrow; - const char *asterisk; - const char *initialState; - const char *endingState; + const char *arrow = nullptr; + const char *asterisk = nullptr; + const char *initialState = nullptr; + const char *endingState = nullptr; // Display the state transition if (settings.debugFirmwareUpdate) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index d4be0db67..52472faa1 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -21,7 +21,9 @@ static const uint8_t ppLbandFreeToken[16] = {POINTPERFECT_LBAND_FREE_TOKEN}; // static const uint8_t ppIpPaidToken[16] = {POINTPERFECT_IP_PAID_TOKEN}; // Token in HEX form static const uint8_t ppIpFreeToken[16] = {POINTPERFECT_IP_FREE_TOKEN}; // Token in HEX form +#ifdef COMPILE_WIFI static const char *pointPerfectAPI = "https://api.thingstream.io/ztp/pointperfect/credentials"; +#endif // COMPILE_WIFI //---------------------------------------- // Forward declarations - compiled out diff --git a/Firmware/RTK_Everywhere/support.ino b/Firmware/RTK_Everywhere/support.ino index cedbdb5a9..8c7ae2f9f 100644 --- a/Firmware/RTK_Everywhere/support.ino +++ b/Firmware/RTK_Everywhere/support.ino @@ -243,12 +243,12 @@ void clearBuffer() // Used for raw mixed entry (SSID, pws, etc) // Used by other menu input methods that use sscanf // Returns INPUT_RESPONSE_VALID, INPUT_RESPONSE_TIMEOUT, INPUT_RESPONSE_OVERFLOW, or INPUT_RESPONSE_EMPTY -InputResponse getUserInputString(char *userString, uint8_t stringSize) +InputResponse getUserInputString(char *userString, uint16_t stringSize) { return getUserInputString(userString, stringSize, true); // Allow local echo if setting enabled } -InputResponse getUserInputString(char *userString, uint8_t stringSize, bool localEcho) +InputResponse getUserInputString(char *userString, uint16_t stringSize, bool localEcho) { clearBuffer(); @@ -1019,7 +1019,7 @@ void printPartitionTable(void) const esp_partition_t *p = esp_partition_get(pi); systemPrintf("| %02x | %02x | 0x%06X | 0x%06X | %-16s |\r\n", p->type, p->subtype, p->address, p->size, p->label); - } while (pi = (esp_partition_next(pi))); + } while ((pi = (esp_partition_next(pi)))); } } @@ -1033,7 +1033,7 @@ bool findSpiffsPartition(void) const esp_partition_t *p = esp_partition_get(pi); if (strcmp(p->label, "spiffs") == 0) return true; - } while (pi = (esp_partition_next(pi))); + } while ((pi = (esp_partition_next(pi)))); } return false; } From 29ad755dd56e9558981765658b3d1ec2e02d9cf2 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Fri, 22 Mar 2024 18:29:48 +0000 Subject: [PATCH 044/112] Add icon duty - WIP (won't compile) --- Firmware/RTK_Everywhere/Display.ino | 325 ++++++++++++++-------------- Firmware/RTK_Everywhere/icons.h | 10 +- 2 files changed, 168 insertions(+), 167 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 3fd5a605d..663c71fb7 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -79,9 +79,6 @@ //---------------------------------------- static QwiicCustomOLED *oled = nullptr; -static uint32_t blinking_icons; -static uint32_t icons; -static uint32_t iconsRadio; unsigned long ssidDisplayTimer = 0; bool ssidDisplayFirstHalf = false; @@ -158,8 +155,6 @@ void beginDisplay(TwoWire *i2cBus) oled->setContrast(0xCF); // Set Contrast Control for BANK0 (81h) } - blinking_icons = 0; - // Display may still be powering up // Try multiple times to communicate then display logo int maxTries = 3; @@ -203,9 +198,6 @@ void displayUpdate() iconPropertyList.clear(); - icons = 0; - iconsRadio = 0; - switch (systemState) { @@ -264,35 +256,35 @@ void displayUpdate() */ case (STATE_ROVER_NOT_STARTED): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, false); // Single crosshair, no blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, 0b11111111); // Single crosshair, no blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_NO_FIX): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, true); // Single crosshair, blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, 0b01010101); // Single crosshair, blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_FIX): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, false); // Single crosshair, no blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, 0b11111111); // Single crosshair, no blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_RTK_FLOAT): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, true); // Dual crosshair, blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, 0b01010101); // Dual crosshair, blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); setRadioIcons(&iconPropertyList); break; case (STATE_ROVER_RTK_FIX): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, false); // Dual crosshair, no blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairDualProperties, 0b11111111); // Dual crosshair, no blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); @@ -307,7 +299,7 @@ void displayUpdate() // Screen is displayed while we are waiting for horz accuracy to drop to appropriate level // Blink crosshair icon until we have we have horz accuracy < user defined level case (STATE_BASE_TEMP_SETTLE): - displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, true); // Single crosshair, blink + displayHorizontalAccuracy(&iconPropertyList, &CrossHairProperties, 0b01010101); // Single crosshair, blink paintLogging(&iconPropertyList); displaySivVsOpenShort(&iconPropertyList); displayBatteryVsEthernet(&iconPropertyList); @@ -339,36 +331,36 @@ void displayUpdate() case (STATE_NTPSERVER_NOT_STARTED): case (STATE_NTPSERVER_NO_SYNC): { - paintClock(&iconPropertyList, true); // Blink - displaySivVsOpenShort(&iconPropertyList); + paintClock(&iconPropertyList, true); // Blink + displaySivVsOpenShort(&iconPropertyList); - iconPropertyBlinking prop; - prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; - if (online.ethernetStatus == ETH_CONNECTED) - prop.blinking = false; - else - prop.blinking = true; - iconPropertyList.push_back(prop); + iconPropertyBlinking prop; + prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; + if (online.ethernetStatus == ETH_CONNECTED) + prop.duty = 0b11111111; + else + prop.duty = 0b01010101; + iconPropertyList.push_back(prop); - iconsRadio = ICON_IP_ADDRESS; // Top left + paintIPAddress(); // Top left } break; case (STATE_NTPSERVER_SYNC): { - paintClock(&iconPropertyList, false); // No blink - displaySivVsOpenShort(&iconPropertyList); - paintLogging(&iconPropertyList, false, true); // No pulse, NTP - - iconPropertyBlinking prop; - prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; - if (online.ethernetStatus == ETH_CONNECTED) - prop.blinking = false; - else - prop.blinking = true; - iconPropertyList.push_back(prop); + paintClock(&iconPropertyList, false); // No blink + displaySivVsOpenShort(&iconPropertyList); + paintLogging(&iconPropertyList, false, true); // No pulse, NTP + + iconPropertyBlinking prop; + prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; + if (online.ethernetStatus == ETH_CONNECTED) + prop.duty = 0b11111111; + else + prop.duty = 0b01010101; + iconPropertyList.push_back(prop); - iconsRadio = ICON_IP_ADDRESS; // Top left + paintIPAddress(); // Top left } break; @@ -392,8 +384,8 @@ void displayUpdate() displayWiFiConfigNotStarted(); // Display 'WiFi Config' break; case (STATE_WIFI_CONFIG): - iconsRadio = setWiFiIcon(); // Blink WiFi in center - displayWiFiConfig(); // Display SSID and IP + setWiFiIcon(&iconPropertyList); // Blink WiFi in center + displayWiFiConfig(); // Display SSID and IP break; case (STATE_TEST): paintSystemTest(); @@ -409,11 +401,11 @@ void displayUpdate() // Do nothing. Quick, fall through state. break; case (STATE_KEYS_WIFI_STARTED): - iconsRadio = setWiFiIcon(); // Blink WiFi in center + setWiFiIcon(&iconPropertyList); // Blink WiFi in center paintGettingKeys(); break; case (STATE_KEYS_WIFI_CONNECTED): - iconsRadio = setWiFiIcon(); // Blink WiFi in center + setWiFiIcon(&iconPropertyList); // Blink WiFi in center paintGettingKeys(); break; case (STATE_KEYS_WIFI_TIMEOUT): @@ -432,11 +424,11 @@ void displayUpdate() // Do nothing. Quick, fall through state. break; case (STATE_KEYS_PROVISION_WIFI_STARTED): - iconsRadio = setWiFiIcon(); // Blink WiFi in center + setWiFiIcon(&iconPropertyList); // Blink WiFi in center paintGettingKeys(); break; case (STATE_KEYS_PROVISION_WIFI_CONNECTED): - iconsRadio = setWiFiIcon(); // Blink WiFi in center + setWiFiIcon(&iconPropertyList); // Blink WiFi in center paintGettingKeys(); break; @@ -549,25 +541,17 @@ void displayUpdate() ; } - // Left + center spot - if (iconsRadio & ICON_IP_ADDRESS) - paintIPAddress(); - - // Now add the icons - static bool blinkState = false; - blinkState = !blinkState; + static uint8_t blinkState = 0b10000000; + blinkState <<= 1; + if (blinkState == 0) + blinkState = 0b00000001; for (auto it = iconPropertyList.begin(); it != iconPropertyList.end(); it = std::next(it)) { iconPropertyBlinking theIcon = *it; - if (theIcon.blinking && !blinkState) - { - // Don't add the icon - } - else - { + + if ((theIcon.duty & blinkState) > 0) displayBitmap(theIcon.icon.xPos, theIcon.icon.yPos, theIcon.icon.width, theIcon.icon.height, (const uint8_t *)theIcon.icon.bitmap); - } } oled->display(); // Push internal buffer to display @@ -672,7 +656,7 @@ void paintBatteryLevel(std::vector *iconList) iconPropertyBlinking prop; prop.icon = BatteryProperties.iconDisplay[batteryFraction][present.display_type]; - prop.blinking = batteryFraction == 0; + prop.duty = (batteryFraction == 0) ? 0b01010101 : 0b11111111; iconList->push_back(prop); } } @@ -738,106 +722,109 @@ void setRadioIcons(std::vector *iconList) { if (online.display == true) { - // There are three spots for icons in the Wireless area, left/center/right - // There are three radios that could be active: Bluetooth (always indicated), WiFi (if enabled), ESP-Now (if - // enabled) Because of lack of space we will indicate the Base/Rover if only two radios or less are active - - // Count the number of radios in use - uint8_t numberOfRadios = 1; // Bluetooth always indicated. TODO don't count if BT radio type is OFF. - if (wifiState > WIFI_OFF) - numberOfRadios++; - if (espnowState > ESPNOW_OFF) - numberOfRadios++; - - // Bluetooth only - if (numberOfRadios == 1) + if (present.display_type == DISPLAY_64x48) { - icons |= setBluetoothIcon_OneRadio(); + // There are three spots for icons in the Wireless area, left/center/right + // There are three radios that could be active: Bluetooth (always indicated), WiFi (if enabled), ESP-Now (if + // enabled) Because of lack of space we will indicate the Base/Rover if only two radios or less are active - icons |= setModeIcon(); // Turn on Rover/Base type icons - } + // Count the number of radios in use + uint8_t numberOfRadios = 1; // Bluetooth always indicated. TODO don't count if BT radio type is OFF. + if (wifiState > WIFI_OFF) + numberOfRadios++; + if (espnowState > ESPNOW_OFF) + numberOfRadios++; - else if (numberOfRadios == 2) - { - icons |= setBluetoothIcon_TwoRadios(); + // Bluetooth only + if (numberOfRadios == 1) + { + setBluetoothIcon_OneRadio(iconList); + setModeIcon(iconList); // Turn on Rover/Base type icons + } - // Do we have WiFi or ESP - if (wifiState > WIFI_OFF) - icons |= setWiFiIcon_TwoRadios(); - else if (espnowState > ESPNOW_OFF) - icons |= setESPNowIcon_TwoRadios(); + else if (numberOfRadios == 2) + { + setBluetoothIcon_TwoRadios(iconList); - icons |= setModeIcon(); // Turn on Rover/Base type icons - } + // Do we have WiFi or ESP + if (wifiState > WIFI_OFF) + setWiFiIcon_TwoRadios(iconList); + else if (espnowState > ESPNOW_OFF) + setESPNowIcon_TwoRadios(iconList); - else if (numberOfRadios == 3) - { - // Bluetooth is center - icons |= setBluetoothIcon_TwoRadios(); + setModeIcon(iconList); // Turn on Rover/Base type icons + } - // ESP Now is left - icons |= setESPNowIcon_TwoRadios(); + else if (numberOfRadios == 3) + { + // Bluetooth is center + setBluetoothIcon_TwoRadios(iconList); - // WiFi is right - icons |= setWiFiIcon_ThreeRadios(); + // ESP Now is left + setESPNowIcon_TwoRadios(iconList); - // No Rover/Base icons + // WiFi is right + setWiFiIcon_ThreeRadios(iconList); + + // No Rover/Base icons + } + } + else if (present.display_type == DISPLAY_128x64) + { + // We have acres of space to play with } } } // Bluetooth is in left position // Set Bluetooth icons (MAC, Connected, arrows) in left position -uint32_t setBluetoothIcon_OneRadio() +// This is 64x48-specific +void setBluetoothIcon_OneRadio(std::vector *iconList) { - uint32_t icons = 0; - if (bluetoothGetState() != BT_CONNECTED) - icons |= ICON_MAC_ADDRESS; + paintMACAddress4digit(0,3); else if (bluetoothGetState() == BT_CONNECTED) { - // Limit how often we update this spot - if (millis() - firstRadioSpotTimer > 2000) + if (bluetoothIncomingRTCM == true || bluetoothOutgoingRTCM == true) // Share the spot? { - firstRadioSpotTimer = millis(); - - if (bluetoothIncomingRTCM == true || bluetoothOutgoingRTCM == true) - firstRadioSpotBlink ^= 1; // Share the spot - else - firstRadioSpotBlink = false; - } + iconPropertyBlinking prop; + prop.icon = BTSymbolLeft64x48; + prop.duty = 0b00001111; + iconList->push_back(prop); - if (firstRadioSpotBlink == false) - icons |= ICON_BT_SYMBOL_LEFT; - else - { // Share the spot. Determine if we need to indicate Up, or Down if (bluetoothIncomingRTCM == true) { - icons |= ICON_DOWN_ARROW_LEFT; + prop.icon = DownloadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); bluetoothIncomingRTCM = false; // Reset, set during UART RX task. } else if (bluetoothOutgoingRTCM == true) { - icons |= ICON_UP_ARROW_LEFT; + prop.icon = UploadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); bluetoothOutgoingRTCM = false; // Reset, set during UART BT send bytes task. } - else - icons |= ICON_BT_SYMBOL_LEFT; + } + else + { + iconPropertyBlinking prop; + prop.icon = BTSymbolLeft64x48; + prop.duty = 0b11111111; + iconList->push_back(prop); } } - - return icons; } // Bluetooth is in center position // Set Bluetooth icons (MAC, Connected, arrows) in left position -uint32_t setBluetoothIcon_TwoRadios() +// This is 64x48-specific +void setBluetoothIcon_TwoRadios(std::vector *iconList) { - uint32_t icons = 0; - if (bluetoothGetState() != BT_CONNECTED) - icons |= ICON_MAC_ADDRESS_2DIGIT; + paintMACAddress2digit(14,3); else if (bluetoothGetState() == BT_CONNECTED) { // Limit how often we update this spot @@ -870,8 +857,6 @@ uint32_t setBluetoothIcon_TwoRadios() icons |= ICON_BT_SYMBOL_CENTER; } } - - return icons; } // Bluetooth is in center position @@ -1134,33 +1119,24 @@ uint32_t setWiFiIcon_ThreeRadios() // Bluetooth and ESP Now icons off. WiFi in middle. // Blink while no clients are connected -uint32_t setWiFiIcon() +void setWiFiIcon(std::vector *iconList) { - uint32_t icons = 0; - if (online.display == true) { + iconPropertyBlinking icon; + icon.icon.bitmap = &WiFi_Symbol_3; + icon.icon.width = WiFi_Symbol_Width; + icon.icon.height = WiFi_Symbol_Height; + icon.icon.xPos = (oled->getWidth() / 2) - (icon.icon.width / 2); + icon.icon.yPos = 0; + if (wifiState == WIFI_CONNECTED) - { - icons |= ICON_WIFI_SYMBOL_3_RIGHT; - } + icon.duty = 0b11111111; else - { - // Limit how often we update this spot - if (millis() - thirdRadioSpotTimer > 1000) - { - thirdRadioSpotTimer = millis(); - thirdRadioSpotBlink ^= 1; // Blink this icon - } + icon.duty = 0b01010101; - if (thirdRadioSpotBlink == false) - icons |= ICON_BLANK_RIGHT; - else - icons |= ICON_WIFI_SYMBOL_3_RIGHT; - } + iconList->push_back(icon); } - - return (icons); } // Based on system state, turn on the various Rover, Base, Fixed Base icons @@ -1298,7 +1274,7 @@ void paintClock(std::vector *iconList, bool blinking) iconPropertyBlinking prop; prop.icon = ClockIconProperties.iconDisplay[clockIconDisplayed][present.display_type]; - prop.blinking = blinking; + prop.duty = 0b01010101; iconList->push_back(prop); displayCoords textCoords; @@ -1434,9 +1410,9 @@ void displayBatteryVsEthernet(std::vector *iconList) prop.icon = EthernetIconProperties.iconDisplay[present.display_type]; if (online.ethernetStatus == ETH_CONNECTED) - prop.blinking = false; + prop.duty = 0b11111111; else - prop.blinking = true; + prop.duty = 0b01010101; iconList->push_back(prop); } @@ -1446,7 +1422,7 @@ void displaySivVsOpenShort(std::vector *iconList) { if (present.antennaShortOpen == false) { - displayCoords textCoords = paintSIVIcon(iconList, nullptr, false); + displayCoords textCoords = paintSIVIcon(iconList, nullptr, 0b11111111); paintSIVText(textCoords); } else @@ -1455,26 +1431,26 @@ void displaySivVsOpenShort(std::vector *iconList) if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - textCoords = paintSIVIcon(iconList, &ShortIconProperties, true); + textCoords = paintSIVIcon(iconList, &ShortIconProperties, 0b01010101); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - textCoords = paintSIVIcon(iconList, &OpenIconProperties, true); + textCoords = paintSIVIcon(iconList, &OpenIconProperties, 0b01010101); } else { - textCoords = paintSIVIcon(iconList, nullptr, false); + textCoords = paintSIVIcon(iconList, nullptr, 0b11111111); } paintSIVText(textCoords); } } -void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon, bool blinking) +void displayHorizontalAccuracy(std::vector *iconList, const iconProperties *icon, uint8_t duty) { iconPropertyBlinking prop; prop.icon = icon->iconDisplay[present.display_type]; - prop.blinking = blinking; + prop.duty = duty; iconList->push_back(prop); displayCoords textCoords; @@ -1505,7 +1481,7 @@ void displayHorizontalAccuracy(std::vector *iconList, cons // Select satellite icon and draw sats in view // Blink icon if no fix -displayCoords paintSIVIcon(std::vector *iconList, const iconProperties *icon, bool blinking) +displayCoords paintSIVIcon(std::vector *iconList, const iconProperties *icon, uint8_t duty) { if (icon == nullptr) // Not short or open, so decide which icon to use { @@ -1520,8 +1496,8 @@ displayCoords paintSIVIcon(std::vector *iconList, const ic // Determine if there is a fix if (gnssIsFixed() == false) { - // override blinking - blink satellite dish icon if we don't have a fix - blinking = true; + // override duty - blink satellite dish icon if we don't have a fix + duty = 0b01010101; } } // End gnss online else @@ -1536,7 +1512,7 @@ displayCoords paintSIVIcon(std::vector *iconList, const ic iconPropertyBlinking prop; prop.icon = icon->iconDisplay[present.display_type]; - prop.blinking = blinking; + prop.duty = duty; iconList->push_back(prop); return textCoords; @@ -1591,7 +1567,7 @@ void paintLogging(std::vector *iconList, bool pulse, bool loggingIconDisplayed %= LOGGING_ICON_STATES; // Wrap iconPropertyBlinking prop; - prop.blinking = false; + prop.duty = 0b11111111; #ifdef COMPILE_ETHERNET if ((online.logging == true) && (logIncreasing || ntpLogIncreasing)) @@ -1655,11 +1631,11 @@ void paintBaseTempSurveyStarted(std::vector *iconList) { if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - paintSIVIcon(iconList, &ShortIconProperties, true); + paintSIVIcon(iconList, &ShortIconProperties, 0b01010101); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - paintSIVIcon(iconList, &OpenIconProperties, true); + paintSIVIcon(iconList, &OpenIconProperties, 0b01010101); } else { @@ -1714,11 +1690,11 @@ void paintRTCM(std::vector *iconList) { if (aStatus == SFE_UBLOX_ANTENNA_STATUS_SHORT) { - paintSIVIcon(iconList, &ShortIconProperties, true); + paintSIVIcon(iconList, &ShortIconProperties, 0b01010101); } else if (aStatus == SFE_UBLOX_ANTENNA_STATUS_OPEN) { - paintSIVIcon(iconList, &OpenIconProperties, true); + paintSIVIcon(iconList, &OpenIconProperties, 0b01010101); } else { @@ -1785,6 +1761,29 @@ void paintIPAddress() ipAddressPosition = 0; } +void paintMACAddress4digit(uint8_t xPos, uint8_t yPos) +{ + char macAddress[5]; + const uint8_t *rtkMacAddress = getMacAddress(); + + // Print four characters of MAC + snprintf(macAddress, sizeof(macAddress), "%02X%02X", rtkMacAddress[4], rtkMacAddress[5]); + oled->setFont(QW_FONT_5X7); // Set font to smallest + oled->setCursor(xPos, yPos); + oled->print(macAddress); +} +void paintMACAddress2digit(uint8_t xPos, uint8_t yPos) +{ + char macAddress[5]; + const uint8_t *rtkMacAddress = getMacAddress(); + + // Print only last two digits of MAC + snprintf(macAddress, sizeof(macAddress), "%02X", rtkMacAddress[5]); + oled->setFont(QW_FONT_5X7); // Set font to smallest + oled->setCursor(xPos, yPos); + oled->print(macAddress); +} + void displayBaseStart(uint16_t displayTime) { if (online.display == true) @@ -1977,11 +1976,7 @@ void displayWiFiConfig() if (millis() - ssidDisplayTimer > 2000) { ssidDisplayTimer = millis(); - - if (ssidDisplayFirstHalf == false) - ssidDisplayFirstHalf = true; - else - ssidDisplayFirstHalf = false; + ssidDisplayFirstHalf = !ssidDisplayFirstHalf; } // Convert current SSID to string @@ -2020,7 +2015,7 @@ void displayWiFiConfig() mySSIDFront[displayMaxCharacters] = '\0'; mySSIDBack[displayMaxCharacters] = '\0'; - if (ssidDisplayFirstHalf == true) + if (ssidDisplayFirstHalf) printTextCenter(mySSIDFront, yPos, QW_FONT_5X7, 1, false); else printTextCenter(mySSIDBack, yPos, QW_FONT_5X7, 1, false); diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 2444fff5f..553fe4914 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1532,7 +1532,8 @@ const uint8_t Micros_Icon[] = {0x3F, 0x04, 0x08, 0x88, 0x84, 0x8F, 0x80, 0x00, const uint8_t Nanos_Icon[] = {0x1F, 0x01, 0x01, 0x81, 0x9E, 0x80, 0x80, 0x00, 0x00, 0x00, 0x09, 0x0A, 0x0A, 0x0A, 0x04, 0x00}; -// Display.ino uses a vector (list) of iconProperty to define which icons are displayed where + +// Display.ino uses a vector (list) of iconPropertyBlinking to define which icons are displayed where. typedef struct { uint8_t x; @@ -1549,13 +1550,18 @@ typedef struct { typedef struct { iconProperty icon; - bool blinking; + uint8_t duty; } iconPropertyBlinking; typedef struct { const iconProperty iconDisplay[DISPLAY_MAX_NONE]; } iconProperties; +// 64x48-specific +const iconProperties BTSymbolLeft64x48 = {{ &BT_Symbol, BT_Symbol_Width, BT_Symbol_Height, 1, 0 }}; +const iconProperties DownloadArrowLeft64x48 = {{ &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 1, 0 }}; +const iconProperties UploadArrowLeft64x48 = {{ &UploadArrow, UploadArrow_Width, UploadArrow_Height, 1, 0 }}; + const uint8_t AccuracyIconXPos64x48 = 0; const uint8_t AccuracyIconYPos64x48 = 18; const uint8_t AccuracyIconXPos128x64 = 0; From 15afb259c6a6c37139d6a54fc93896ec69625239 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 22 Mar 2024 16:45:29 -0600 Subject: [PATCH 045/112] Add double tap entry to WiFi config --- Firmware/RTK_Everywhere/States.ino | 7 ++++ Firmware/RTK_Everywhere/Tasks.ino | 54 +++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 430a9a39f..539d8828a 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -1190,6 +1190,13 @@ bool inBaseMode() return (false); } +bool inWiFiConfigMode() +{ + if(systemState >= STATE_WIFI_CONFIG_NOT_STARTED && systemState <= STATE_WIFI_CONFIG) + return (true); + return (false); +} + bool inNtpMode() { if(systemState >= STATE_NTPSERVER_NOT_STARTED && systemState <= STATE_NTPSERVER_SYNC) diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 27afef4b7..3c1b9d954 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -117,7 +117,7 @@ void btReadTask(void *e) unsigned long btLastByteReceived = 0; // Track when the last BT transmission was received. const long btMinEscapeTime = - 2000; // Bluetooth serial traffic must stop this amount before an escape char is recognized + 2000; // Bluetooth serial traffic must stop this amount before an escape char is recognized uint8_t btEscapeCharsReceived = 0; // Used to enter remote command mode uint8_t btAppCommandCharsReceived = 0; // Used to enter app command mode @@ -1250,6 +1250,7 @@ void tickerBeepUpdate() void buttonCheckTask(void *e) { uint8_t index; + unsigned long doubleTapReleaseTime = 0; // Start notification online.buttonCheckTaskRunning = true; @@ -1278,6 +1279,57 @@ void buttonCheckTask(void *e) tiltStop(); } + else if (userBtn->wasReleased()) + { + // Check for double tap + if (millis() - doubleTapReleaseTime >= 1000) // Consider this the first tap + doubleTapReleaseTime = millis(); + else if (millis() - doubleTapReleaseTime < 1000) + { + // If we are in Rover/Base mode, enter WiFi Config Mode + if (inRoverMode() || inBaseMode()) + { + // Beep if we are not locally compiled or a release candidate + if (ENABLE_DEVELOPER == false) + { + beepOn(); + delay(300); + beepOff(); + delay(100); + beepOn(); + delay(300); + beepOff(); + } + + forceSystemStateUpdate = true; // Immediately go to this new state + changeState(STATE_WIFI_CONFIG_NOT_STARTED); + } + + // If we are in WiFi Config Mode, exit to Rover + else if (inWiFiConfigMode()) + { + // Beep if we are not locally compiled or a release candidate + if (ENABLE_DEVELOPER == false) + { + beepOn(); + delay(300); + beepOff(); + delay(100); + beepOn(); + delay(300); + beepOff(); + } + + forceSystemStateUpdate = true; // Immediately go to this new state + changeState(STATE_ROVER_NOT_STARTED); + } + } + else // This is just a random tap. Do nothing but reset our release time + { + doubleTapReleaseTime = 0; + } + } + // The RTK Torch uses a shutdown IC configured to turn off ~3s // Beep shortly before the shutdown IC takes over else if (userBtn->pressedFor(2500)) From 3ed6af85c0cf132e6e4b15c0ab1eb8d933ef9b13 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 22 Mar 2024 16:49:21 -0600 Subject: [PATCH 046/112] Update comment --- Firmware/RTK_Everywhere/States.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/States.ino b/Firmware/RTK_Everywhere/States.ino index 539d8828a..33c8951ac 100644 --- a/Firmware/RTK_Everywhere/States.ino +++ b/Firmware/RTK_Everywhere/States.ino @@ -431,8 +431,8 @@ void stateUpdate() bluetoothStop(); espnowStop(); - tasksStopGnssUart(); // Delete F9 serial tasks if running - if (!startWebServer()) // Start in AP mode and show config html page + tasksStopGnssUart(); // Delete serial tasks if running + if (!startWebServer()) // Start web server in WiFi mode and show config html page changeState(STATE_ROVER_NOT_STARTED); else { From 533b4c005d134391e4057d5ee455d4dd5f702bf0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 23 Mar 2024 16:40:33 +0000 Subject: [PATCH 047/112] Update form.h via Python --- Firmware/RTK_Everywhere/form.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 64b0a8460..33ce39803 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,7 +26,7 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x35, 0xB5, 0xFC, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x06, 0xFF, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, @@ -774,7 +774,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x35, 0xB5, 0xFC, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x06, 0xFF, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, From 9ce691dbd936a6e3301c9a4e19f9eadf903e0069 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 10:15:34 +0000 Subject: [PATCH 048/112] Finish updating the display functions. TODO: add 128x64 radio icon support --- Firmware/RTK_Everywhere/Display.ino | 583 +++++++++------------ Firmware/RTK_Everywhere/RTK_Everywhere.ino | 11 +- Firmware/RTK_Everywhere/System.ino | 1 + Firmware/RTK_Everywhere/icons.h | 67 ++- 4 files changed, 300 insertions(+), 362 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 663c71fb7..d53d3cec5 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -91,8 +91,6 @@ bool ssidDisplayFirstHalf = false; // Icons #include "icons.h" -std::vector iconPropertyList; // List of icons to be displayed - void paintLogging(std::vector *iconList, bool pulse = true, bool NTP = false); // Header //---------------------------------------- @@ -186,6 +184,7 @@ void displayUpdate() // Update the display if connected if (online.display == true) { + static unsigned long lastDisplayUpdate = 0; if (millis() - lastDisplayUpdate > 500 || forceDisplayUpdate == true) // Update display at 2Hz { lastDisplayUpdate = millis(); @@ -196,6 +195,7 @@ void displayUpdate() oled->erase(); + std::vector iconPropertyList; // List of icons to be displayed iconPropertyList.clear(); switch (systemState) @@ -448,99 +448,6 @@ void displayUpdate() break; } - // Top left corner - Radio icon indicators take three spots (left/center/right) - // Allowed icon combinations: - // Bluetooth + Rover/Base - // WiFi + Bluetooth + Rover/Base - // ESP-Now + Bluetooth + Rover/Base - // ESP-Now + Bluetooth + WiFi - // See setRadioIcons() for the icon selection logic - - // Left spot - if (iconsRadio & ICON_MAC_ADDRESS) - { - char macAddress[5]; - const uint8_t *rtkMacAddress = getMacAddress(); - - // Print four characters of MAC - snprintf(macAddress, sizeof(macAddress), "%02X%02X", rtkMacAddress[4], rtkMacAddress[5]); - oled->setFont(QW_FONT_5X7); // Set font to smallest - oled->setCursor(0, 3); - oled->print(macAddress); - } - else if (iconsRadio & ICON_BT_SYMBOL_LEFT) - displayBitmap(1, 0, BT_Symbol_Width, BT_Symbol_Height, BT_Symbol); - else if (iconsRadio & ICON_WIFI_SYMBOL_0_LEFT) - displayBitmap(0, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_0); - else if (iconsRadio & ICON_WIFI_SYMBOL_1_LEFT) - displayBitmap(0, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_1); - else if (iconsRadio & ICON_WIFI_SYMBOL_2_LEFT) - displayBitmap(0, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_2); - else if (iconsRadio & ICON_WIFI_SYMBOL_3_LEFT) - displayBitmap(0, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_3); - else if (iconsRadio & ICON_ESPNOW_SYMBOL_0_LEFT) - displayBitmap(0, 0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, ESPNOW_Symbol_0); - else if (iconsRadio & ICON_ESPNOW_SYMBOL_1_LEFT) - displayBitmap(0, 0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, ESPNOW_Symbol_1); - else if (iconsRadio & ICON_ESPNOW_SYMBOL_2_LEFT) - displayBitmap(0, 0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, ESPNOW_Symbol_2); - else if (iconsRadio & ICON_ESPNOW_SYMBOL_3_LEFT) - displayBitmap(0, 0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, ESPNOW_Symbol_3); - else if (iconsRadio & ICON_DOWN_ARROW_LEFT) - displayBitmap(1, 0, DownloadArrow_Width, DownloadArrow_Height, DownloadArrow); - else if (iconsRadio & ICON_UP_ARROW_LEFT) - displayBitmap(1, 0, UploadArrow_Width, UploadArrow_Height, UploadArrow); - else if (iconsRadio & ICON_BLANK_LEFT) - { - ; - } - - // Center radio spots - if (iconsRadio & ICON_BT_SYMBOL_CENTER) - { - // Moved to center to give space for ESP NOW icon on far left - displayBitmap(16, 0, BT_Symbol_Width, BT_Symbol_Height, BT_Symbol); - } - else if (iconsRadio & ICON_MAC_ADDRESS_2DIGIT) - { - char macAddress[5]; - const uint8_t *rtkMacAddress = getMacAddress(); - - // Print only last two digits of MAC - snprintf(macAddress, sizeof(macAddress), "%02X", rtkMacAddress[5]); - oled->setFont(QW_FONT_5X7); // Set font to smallest - oled->setCursor(14, 3); - oled->print(macAddress); - } - else if (iconsRadio & ICON_DOWN_ARROW_CENTER) - displayBitmap(16, 0, DownloadArrow_Width, DownloadArrow_Height, DownloadArrow); - else if (iconsRadio & ICON_UP_ARROW_CENTER) - displayBitmap(16, 0, UploadArrow_Width, UploadArrow_Height, UploadArrow); - - // Radio third spot - if (iconsRadio & ICON_WIFI_SYMBOL_0_RIGHT) - displayBitmap(28, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_0); - else if (iconsRadio & ICON_WIFI_SYMBOL_1_RIGHT) - displayBitmap(28, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_1); - else if (iconsRadio & ICON_WIFI_SYMBOL_2_RIGHT) - displayBitmap(28, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_2); - else if (iconsRadio & ICON_WIFI_SYMBOL_3_RIGHT) - displayBitmap(28, 0, WiFi_Symbol_Width, WiFi_Symbol_Height, WiFi_Symbol_3); - else if ((iconsRadio & ICON_DYNAMIC_MODEL) && (online.gnss == true)) - paintDynamicModel(); - else if (iconsRadio & ICON_BASE_TEMPORARY) - displayBitmap(28, 0, BaseTemporary_Width, BaseTemporary_Height, BaseTemporary); - else if (iconsRadio & ICON_BASE_FIXED) - displayBitmap(28, 0, BaseFixed_Width, BaseFixed_Height, BaseFixed); // true - blend with other pixels - else if (iconsRadio & ICON_DOWN_ARROW_RIGHT) - displayBitmap(31, 0, DownloadArrow_Width, DownloadArrow_Height, DownloadArrow); - else if (iconsRadio & ICON_UP_ARROW_RIGHT) - displayBitmap(31, 0, UploadArrow_Width, UploadArrow_Height, UploadArrow); - else if (iconsRadio & ICON_BLANK_RIGHT) - { - ; - } - // Now add the icons static uint8_t blinkState = 0b10000000; blinkState <<= 1; @@ -714,7 +621,7 @@ void paintBatteryLevel(std::vector *iconList) 8| * ** */ -// Set bits to turn on various icons in the Radio area +// Turn on various icons in the Radio area // ie: Bluetooth, WiFi, ESP Now, Mode indicators, as well as sub states of each (MAC, Blinking, Arrows, etc), depending // on connection state This function has all the logic to determine how a shared icon spot should act. ie: if we need an // up arrow, blink the ESP Now icon, etc. @@ -725,8 +632,15 @@ void setRadioIcons(std::vector *iconList) if (present.display_type == DISPLAY_64x48) { // There are three spots for icons in the Wireless area, left/center/right - // There are three radios that could be active: Bluetooth (always indicated), WiFi (if enabled), ESP-Now (if - // enabled) Because of lack of space we will indicate the Base/Rover if only two radios or less are active + // There are three radios that could be active: Bluetooth (always indicated), WiFi (if enabled), ESP-Now (if enabled) + // Because of lack of space we will indicate the Base/Rover if only two radios or less are active + // + // Top left corner - Radio icon indicators take three spots (left/center/right) + // Allowed icon combinations: + // Bluetooth + Rover/Base + // WiFi + Bluetooth + Rover/Base + // ESP-Now + Bluetooth + Rover/Base + // ESP-Now + Bluetooth + WiFi // Count the number of radios in use uint8_t numberOfRadios = 1; // Bluetooth always indicated. TODO don't count if BT radio type is OFF. @@ -783,7 +697,7 @@ void setBluetoothIcon_OneRadio(std::vector *iconList) { if (bluetoothGetState() != BT_CONNECTED) paintMACAddress4digit(0,3); - else if (bluetoothGetState() == BT_CONNECTED) + else // if (bluetoothGetState() == BT_CONNECTED) { if (bluetoothIncomingRTCM == true || bluetoothOutgoingRTCM == true) // Share the spot? { @@ -800,7 +714,7 @@ void setBluetoothIcon_OneRadio(std::vector *iconList) iconList->push_back(prop); bluetoothIncomingRTCM = false; // Reset, set during UART RX task. } - else if (bluetoothOutgoingRTCM == true) + else // if (bluetoothOutgoingRTCM == true) { prop.icon = UploadArrowLeft64x48; prop.duty = 0b11110000; @@ -825,296 +739,261 @@ void setBluetoothIcon_TwoRadios(std::vector *iconList) { if (bluetoothGetState() != BT_CONNECTED) paintMACAddress2digit(14,3); - else if (bluetoothGetState() == BT_CONNECTED) + else // if (bluetoothGetState() == BT_CONNECTED) { - // Limit how often we update this spot - if (millis() - secondRadioSpotTimer > 2000) + if (bluetoothIncomingRTCM == true || bluetoothOutgoingRTCM == true) // Share the spot? { - secondRadioSpotTimer = millis(); - - if (bluetoothIncomingRTCM == true || bluetoothOutgoingRTCM == true) - secondRadioSpotBlink ^= 1; // Share the spot - else - secondRadioSpotBlink = false; - } + iconPropertyBlinking prop; + prop.icon = BTSymbolCenter64x48; + prop.duty = 0b00001111; + iconList->push_back(prop); - if (secondRadioSpotBlink == false) - icons |= ICON_BT_SYMBOL_CENTER; - else - { // Share the spot. Determine if we need to indicate Up, or Down if (bluetoothIncomingRTCM == true) { - icons |= ICON_DOWN_ARROW_CENTER; + prop.icon = DownloadArrowCenter64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); bluetoothIncomingRTCM = false; // Reset, set during UART RX task. } - else if (bluetoothOutgoingRTCM == true) + else // if (bluetoothOutgoingRTCM == true) { - icons |= ICON_UP_ARROW_CENTER; + prop.icon = UploadArrowCenter64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); bluetoothOutgoingRTCM = false; // Reset, set during UART BT send bytes task. } - else - icons |= ICON_BT_SYMBOL_CENTER; + } + else + { + iconPropertyBlinking prop; + prop.icon = BTSymbolCenter64x48; + prop.duty = 0b11111111; + iconList->push_back(prop); } } } // Bluetooth is in center position // Set ESP Now icon (Solid, arrows, blinking) in left position -uint32_t setESPNowIcon_TwoRadios() +void setESPNowIcon_TwoRadios(std::vector *iconList) { - uint32_t icons = 0; - if (espnowState == ESPNOW_PAIRED) { - // Limit how often we update this spot - if (millis() - firstRadioSpotTimer > 2000) + if (espnowIncomingRTCM == true || espnowOutgoingRTCM == true) { - firstRadioSpotTimer = millis(); - - if (espnowIncomingRTCM == true || espnowOutgoingRTCM == true) - firstRadioSpotBlink ^= 1; // Share the spot - else - firstRadioSpotBlink = false; - } + iconPropertyBlinking prop; + prop.duty = 0b00001111; + // Based on RSSI, select icon + if (espnowRSSI >= -40) + prop.icon = ESPNowSymbol3Left64x48; + else if (espnowRSSI >= -60) + prop.icon = ESPNowSymbol2Left64x48; + else if (espnowRSSI >= -80) + prop.icon = ESPNowSymbol1Left64x48; + else // if (espnowRSSI > -255) + prop.icon = ESPNowSymbol0Left64x48; + iconList->push_back(prop); - if (firstRadioSpotBlink == false) - { + // Share the spot. Determine if we need to indicate Up, or Down if (espnowIncomingRTCM == true) { - // Based on RSSI, select icon - if (espnowRSSI >= -40) - icons |= ICON_ESPNOW_SYMBOL_3_LEFT; - else if (espnowRSSI >= -60) - icons |= ICON_ESPNOW_SYMBOL_2_LEFT; - else if (espnowRSSI >= -80) - icons |= ICON_ESPNOW_SYMBOL_1_LEFT; - else if (espnowRSSI > -255) - icons |= ICON_ESPNOW_SYMBOL_0_LEFT; + prop.icon = DownloadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); + espnowIncomingRTCM = false; // Reset, set during ESP Now data received call back } - else // ESP radio is active, but not receiving RTCM + else // if (espnowOutgoingRTCM == true) { - icons |= ICON_ESPNOW_SYMBOL_3_LEFT; // Full symbol + prop.icon = UploadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); + espnowOutgoingRTCM = false; // Reset, set during espnowProcessRTCM() } } else { - // Share the spot. Determine if we need to indicate Up, or Down + iconPropertyBlinking prop; + prop.duty = 0b11111111; + // TODO: check this. Surely we want to indicate the correct signal level with no incoming RTCM? if (espnowIncomingRTCM == true) { - icons |= ICON_DOWN_ARROW_LEFT; - espnowIncomingRTCM = false; // Reset, set during ESP Now data received call back - } - else if (espnowOutgoingRTCM == true) - { - icons |= ICON_UP_ARROW_LEFT; - espnowOutgoingRTCM = false; // Reset, set during espnowProcessRTCM() + // Based on RSSI, select icon + if (espnowRSSI >= -40) + prop.icon = ESPNowSymbol3Left64x48; + else if (espnowRSSI >= -60) + prop.icon = ESPNowSymbol2Left64x48; + else if (espnowRSSI >= -80) + prop.icon = ESPNowSymbol1Left64x48; + else // if (espnowRSSI > -255) + prop.icon = ESPNowSymbol0Left64x48; } - else + else // ESP radio is active, but not receiving RTCM { - icons |= ICON_ESPNOW_SYMBOL_3_LEFT; // Full symbol - - // TODO catch RSSI here + prop.icon = ESPNowSymbol3Left64x48; // Full symbol } + iconList->push_back(prop); } } - else // We are not paired, blink icon { - // Limit how often we update this spot - if (millis() - firstRadioSpotTimer > 2000) - { - firstRadioSpotTimer = millis(); - firstRadioSpotBlink ^= 1; // Share the spot - } - - if (firstRadioSpotBlink == false) - icons |= ICON_ESPNOW_SYMBOL_3_LEFT; // Full symbol - else - icons |= ICON_BLANK_LEFT; + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = ESPNowSymbol3Left64x48; // Full symbol + iconList->push_back(prop); } - - return icons; } // Bluetooth is in center position // Set WiFi icon (Solid, arrows, blinking) in left position -uint32_t setWiFiIcon_TwoRadios() +void setWiFiIcon_TwoRadios(std::vector *iconList) { - uint32_t icons = 0; - if (wifiState == WIFI_CONNECTED) { - // Limit how often we update this spot - if (millis() - firstRadioSpotTimer > 2000) - { - firstRadioSpotTimer = millis(); - - if (netIncomingRTCM || netOutgoingRTCM || mqttClientDataReceived) - firstRadioSpotBlink ^= 1; // Share the spot - else - firstRadioSpotBlink = false; - } - - if (firstRadioSpotBlink == false) + if (netIncomingRTCM || netOutgoingRTCM || mqttClientDataReceived) { #ifdef COMPILE_WIFI int wifiRSSI = WiFi.RSSI(); #else // COMPILE_WIFI int wifiRSSI = -40; // Dummy #endif // COMPILE_WIFI - // Based on RSSI, select icon + iconPropertyBlinking prop; + prop.duty = 0b00001111; + // Based on RSSI, select icon if (wifiRSSI >= -40) - icons |= ICON_WIFI_SYMBOL_3_LEFT; + prop.icon = WiFiSymbol3Left64x48; else if (wifiRSSI >= -60) - icons |= ICON_WIFI_SYMBOL_2_LEFT; + prop.icon = WiFiSymbol2Left64x48; else if (wifiRSSI >= -80) - icons |= ICON_WIFI_SYMBOL_1_LEFT; + prop.icon = WiFiSymbol1Left64x48; else - icons |= ICON_WIFI_SYMBOL_0_LEFT; - } - else - { + prop.icon = WiFiSymbol0Left64x48; + iconList->push_back(prop); + // Share the spot. Determine if we need to indicate Up, or Down if (netIncomingRTCM || mqttClientDataReceived) { - icons |= ICON_DOWN_ARROW_LEFT; + prop.icon = DownloadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); if (netIncomingRTCM) netIncomingRTCM = false; // Reset, set during NTRIP Client if (mqttClientDataReceived) mqttClientDataReceived = false; // Reset, set by MQTT client } - else if (netOutgoingRTCM == true) + else // if (netOutgoingRTCM == true) { - icons |= ICON_UP_ARROW_LEFT; + prop.icon = UploadArrowLeft64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); netOutgoingRTCM = false; // Reset, set during NTRIP Server } - else - { + + } + else + { #ifdef COMPILE_WIFI - int wifiRSSI = WiFi.RSSI(); + int wifiRSSI = WiFi.RSSI(); #else // COMPILE_WIFI - int wifiRSSI = -40; // Dummy + int wifiRSSI = -40; // Dummy #endif // COMPILE_WIFI - // Based on RSSI, select icon - if (wifiRSSI >= -40) - icons |= ICON_WIFI_SYMBOL_3_LEFT; - else if (wifiRSSI >= -60) - icons |= ICON_WIFI_SYMBOL_2_LEFT; - else if (wifiRSSI >= -80) - icons |= ICON_WIFI_SYMBOL_1_LEFT; - else - icons |= ICON_WIFI_SYMBOL_0_LEFT; - } + iconPropertyBlinking prop; + prop.duty = 0b11111111; + // Based on RSSI, select icon + if (wifiRSSI >= -40) + prop.icon = WiFiSymbol3Left64x48; + else if (wifiRSSI >= -60) + prop.icon = WiFiSymbol2Left64x48; + else if (wifiRSSI >= -80) + prop.icon = WiFiSymbol1Left64x48; + else + prop.icon = WiFiSymbol0Left64x48; + iconList->push_back(prop); } } - else // We are not paired, blink icon { - // Limit how often we update this spot - if (millis() - firstRadioSpotTimer > 2000) - { - firstRadioSpotTimer = millis(); - firstRadioSpotBlink ^= 1; // Share the spot - } - - if (firstRadioSpotBlink == false) - icons |= ICON_WIFI_SYMBOL_3_LEFT; // Full symbol - else - icons |= ICON_BLANK_LEFT; + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = WiFiSymbol3Left64x48; // Full symbol + iconList->push_back(prop); } - - return (icons); } // Bluetooth is in center position // Set WiFi icon (Solid, arrows, blinking) in right position -uint32_t setWiFiIcon_ThreeRadios() +void setWiFiIcon_ThreeRadios(std::vector *iconList) { - uint32_t icons = 0; - if (wifiState == WIFI_CONNECTED) { - // Limit how often we update this spot - if (millis() - thirdRadioSpotTimer > 2000) - { - thirdRadioSpotTimer = millis(); - - if (netIncomingRTCM || netOutgoingRTCM || mqttClientDataReceived) - thirdRadioSpotBlink ^= 1; // Share the spot - else - thirdRadioSpotBlink = false; - } - - if (thirdRadioSpotBlink == false) + if (netIncomingRTCM || netOutgoingRTCM || mqttClientDataReceived) { #ifdef COMPILE_WIFI int wifiRSSI = WiFi.RSSI(); #else // COMPILE_WIFI int wifiRSSI = -40; // Dummy #endif // COMPILE_WIFI - // Based on RSSI, select icon + iconPropertyBlinking prop; + prop.duty = 0b00001111; + // Based on RSSI, select icon if (wifiRSSI >= -40) - icons |= ICON_WIFI_SYMBOL_3_RIGHT; + prop.icon = WiFiSymbol3Right64x48; else if (wifiRSSI >= -60) - icons |= ICON_WIFI_SYMBOL_2_RIGHT; + prop.icon = WiFiSymbol2Right64x48; else if (wifiRSSI >= -80) - icons |= ICON_WIFI_SYMBOL_1_RIGHT; + prop.icon = WiFiSymbol1Right64x48; else - icons |= ICON_WIFI_SYMBOL_0_RIGHT; - } - else - { + prop.icon = WiFiSymbol0Right64x48; + iconList->push_back(prop); + // Share the spot. Determine if we need to indicate Up, or Down if (netIncomingRTCM || mqttClientDataReceived) { - icons |= ICON_DOWN_ARROW_RIGHT; + prop.icon = DownloadArrowRight64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); if (netIncomingRTCM) netIncomingRTCM = false; // Reset, set during NTRIP Client if (mqttClientDataReceived) - mqttClientDataReceived = false; // Reset, set by MQTT Client + mqttClientDataReceived = false; // Reset, set by MQTT client } - else if (netOutgoingRTCM == true) + else // if (netOutgoingRTCM == true) { - icons |= ICON_UP_ARROW_RIGHT; + prop.icon = UploadArrowRight64x48; + prop.duty = 0b11110000; + iconList->push_back(prop); netOutgoingRTCM = false; // Reset, set during NTRIP Server } - else - { + + } + else + { #ifdef COMPILE_WIFI - int wifiRSSI = WiFi.RSSI(); + int wifiRSSI = WiFi.RSSI(); #else // COMPILE_WIFI - int wifiRSSI = -40; // Dummy + int wifiRSSI = -40; // Dummy #endif // COMPILE_WIFI - // Based on RSSI, select icon - if (wifiRSSI >= -40) - icons |= ICON_WIFI_SYMBOL_3_RIGHT; - else if (wifiRSSI >= -60) - icons |= ICON_WIFI_SYMBOL_2_RIGHT; - else if (wifiRSSI >= -80) - icons |= ICON_WIFI_SYMBOL_1_RIGHT; - else - icons |= ICON_WIFI_SYMBOL_0_RIGHT; - } + iconPropertyBlinking prop; + prop.duty = 0b11111111; + // Based on RSSI, select icon + if (wifiRSSI >= -40) + prop.icon = WiFiSymbol3Right64x48; + else if (wifiRSSI >= -60) + prop.icon = WiFiSymbol2Right64x48; + else if (wifiRSSI >= -80) + prop.icon = WiFiSymbol1Right64x48; + else + prop.icon = WiFiSymbol0Right64x48; + iconList->push_back(prop); } } - else // We are not paired, blink icon { - // Limit how often we update this spot - if (millis() - thirdRadioSpotTimer > 2000) - { - thirdRadioSpotTimer = millis(); - thirdRadioSpotBlink ^= 1; // Share the spot - } - - if (thirdRadioSpotBlink == false) - icons |= ICON_WIFI_SYMBOL_3_RIGHT; // Full symbol - else - icons |= ICON_BLANK_RIGHT; + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = WiFiSymbol3Right64x48; // Full symbol + iconList->push_back(prop); } - - return (icons); } // Bluetooth and ESP Now icons off. WiFi in middle. @@ -1140,44 +1019,62 @@ void setWiFiIcon(std::vector *iconList) } // Based on system state, turn on the various Rover, Base, Fixed Base icons -uint32_t setModeIcon() +void setModeIcon(std::vector *iconList) { - uint32_t icons = 0; - switch (systemState) { case (STATE_ROVER_NOT_STARTED): break; case (STATE_ROVER_NO_FIX): - icons |= ICON_DYNAMIC_MODEL; + paintDynamicModel(iconList); break; case (STATE_ROVER_FIX): - icons |= ICON_DYNAMIC_MODEL; + paintDynamicModel(iconList); break; case (STATE_ROVER_RTK_FLOAT): - icons |= ICON_DYNAMIC_MODEL; + paintDynamicModel(iconList); break; case (STATE_ROVER_RTK_FIX): - icons |= ICON_DYNAMIC_MODEL; + paintDynamicModel(iconList); break; case (STATE_BASE_NOT_STARTED): // Do nothing. Static display shown during state change. break; case (STATE_BASE_TEMP_SETTLE): - icons |= blinkBaseIcon(ICON_BASE_TEMPORARY); + { + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = BaseTemporaryProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } break; case (STATE_BASE_TEMP_SURVEY_STARTED): - icons |= blinkBaseIcon(ICON_BASE_TEMPORARY); + { + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = BaseTemporaryProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } break; case (STATE_BASE_TEMP_TRANSMITTING): - icons |= ICON_BASE_TEMPORARY; + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + prop.icon = BaseTemporaryProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } break; case (STATE_BASE_FIXED_NOT_STARTED): // Do nothing. Static display shown during state change. break; case (STATE_BASE_FIXED_TRANSMITTING): - icons |= ICON_BASE_FIXED; + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + prop.icon = BaseFixedProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } break; case (STATE_NTPSERVER_NOT_STARTED): @@ -1188,26 +1085,6 @@ uint32_t setModeIcon() default: break; } - return (icons); -} - -uint32_t blinkBaseIcon(uint32_t iconType) -{ - uint32_t icons = 0; - - // Limit how often we update this spot - if (millis() - thirdRadioSpotTimer > 1000) - { - thirdRadioSpotTimer = millis(); - thirdRadioSpotBlink ^= 1; // Share the spot - } - - if (thirdRadioSpotBlink == false) - icons |= iconType; - else - icons |= ICON_BLANK_RIGHT; - - return icons; } /* @@ -1353,47 +1230,55 @@ void paintClockAccuracy(displayCoords textCoords) */ // Draw the rover icon depending on screen -void paintDynamicModel() +void paintDynamicModel(std::vector *iconList) { - // Display icon associated with current Dynamic Model - switch (settings.dynamicModel) + if (online.gnss == true) { - case (DYN_MODEL_PORTABLE): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_1_Portable); - break; - case (DYN_MODEL_STATIONARY): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_2_Stationary); - break; - case (DYN_MODEL_PEDESTRIAN): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_3_Pedestrian); - break; - case (DYN_MODEL_AUTOMOTIVE): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_4_Automotive); - break; - case (DYN_MODEL_SEA): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_5_Sea); - break; - case (DYN_MODEL_AIRBORNE1g): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_6_Airborne1g); - break; - case (DYN_MODEL_AIRBORNE2g): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_7_Airborne2g); - break; - case (DYN_MODEL_AIRBORNE4g): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_8_Airborne4g); - break; - case (DYN_MODEL_WRIST): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_9_Wrist); - break; - case (DYN_MODEL_BIKE): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_10_Bike); - break; - case (DYN_MODEL_MOWER): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_11_Mower); - break; - case (DYN_MODEL_ESCOOTER): - displayBitmap(28, 0, DynamicModel_Width, DynamicModel_Height, DynamicModel_12_EScooter); - break; + iconPropertyBlinking prop; + prop.duty = 0b11111111; + + // Display icon associated with current Dynamic Model + switch (settings.dynamicModel) + { + case (DYN_MODEL_PORTABLE): + prop.icon = DynamicModel_1_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_STATIONARY): + prop.icon = DynamicModel_2_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_PEDESTRIAN): + prop.icon = DynamicModel_3_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_AUTOMOTIVE): + prop.icon = DynamicModel_4_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_SEA): + prop.icon = DynamicModel_5_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_AIRBORNE1g): + prop.icon = DynamicModel_6_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_AIRBORNE2g): + prop.icon = DynamicModel_7_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_AIRBORNE4g): + prop.icon = DynamicModel_8_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_WRIST): + prop.icon = DynamicModel_9_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_BIKE): + prop.icon = DynamicModel_10_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_MOWER): + prop.icon = DynamicModel_11_Properties.iconDisplay[present.display_type]; + break; + case (DYN_MODEL_ESCOOTER): + prop.icon = DynamicModel_12_Properties.iconDisplay[present.display_type]; + break; + } + + iconList->push_back(prop); } } diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 1d82c22d8..503c8d42a 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -654,9 +654,7 @@ bool inMainMenu; // Set true when in the serial config menu bool btPrintEcho; // Set true when in the serial config menu system via Bluetooth. bool btPrintEchoExit; // When true, exit all config menus. -uint32_t lastBattUpdate; -uint32_t lastDisplayUpdate; -bool forceDisplayUpdate; // Goes true when setup is pressed, causes the display to refresh in real-time +bool forceDisplayUpdate = true; // Goes true when setup is pressed, causes the display to refresh in real-time uint32_t lastSystemStateUpdate; bool forceSystemStateUpdate; // Set true to avoid update wait uint32_t lastPrintRoverAccuracy; @@ -714,13 +712,6 @@ unsigned long rtcWaitTime; // At power on, we give the RTC a few seconds to upda TaskHandle_t idleTaskHandle[MAX_CPU_CORES]; uint32_t max_idle_count = MAX_IDLE_TIME_COUNT; -bool firstRadioSpotBlink; // Controls when the shared icon space is toggled -unsigned long firstRadioSpotTimer; -bool secondRadioSpotBlink; // Controls when the shared icon space is toggled -unsigned long secondRadioSpotTimer; -bool thirdRadioSpotBlink; // Controls when the shared icon space is toggled -unsigned long thirdRadioSpotTimer; - bool bluetoothIncomingRTCM; bool bluetoothOutgoingRTCM; bool netIncomingRTCM; diff --git a/Firmware/RTK_Everywhere/System.ino b/Firmware/RTK_Everywhere/System.ino index 4bc4e9d22..a1f5f985b 100644 --- a/Firmware/RTK_Everywhere/System.ino +++ b/Firmware/RTK_Everywhere/System.ino @@ -60,6 +60,7 @@ void updateBattery() { if (online.battery == true) { + static unsigned long lastBattUpdate = 0; if (millis() - lastBattUpdate > 5000) { lastBattUpdate = millis(); diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 553fe4914..240b22a5a 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1558,9 +1558,70 @@ typedef struct { } iconProperties; // 64x48-specific -const iconProperties BTSymbolLeft64x48 = {{ &BT_Symbol, BT_Symbol_Width, BT_Symbol_Height, 1, 0 }}; -const iconProperties DownloadArrowLeft64x48 = {{ &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 1, 0 }}; -const iconProperties UploadArrowLeft64x48 = {{ &UploadArrow, UploadArrow_Width, UploadArrow_Height, 1, 0 }}; +const iconProperty BTSymbolLeft64x48 = { &BT_Symbol, BT_Symbol_Width, BT_Symbol_Height, 1, 0 }; +const iconProperty DownloadArrowLeft64x48 = { &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 1, 0 }; +const iconProperty UploadArrowLeft64x48 = { &UploadArrow, UploadArrow_Width, UploadArrow_Height, 1, 0 }; +const iconProperty ESPNowSymbol3Left64x48 = { &ESPNOW_Symbol_3, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 0, 0 }; +const iconProperty ESPNowSymbol2Left64x48 = { &ESPNOW_Symbol_2, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 0, 0 }; +const iconProperty ESPNowSymbol1Left64x48 = { &ESPNOW_Symbol_1, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 0, 0 }; +const iconProperty ESPNowSymbol0Left64x48 = { &ESPNOW_Symbol_0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 0, 0 }; +const iconProperty WiFiSymbol3Left64x48 = { &WiFi_Symbol_3, WiFi_Symbol_Width, WiFi_Symbol_Height, 0, 0 }; +const iconProperty WiFiSymbol2Left64x48 = { &WiFi_Symbol_2, WiFi_Symbol_Width, WiFi_Symbol_Height, 0, 0 }; +const iconProperty WiFiSymbol1Left64x48 = { &WiFi_Symbol_1, WiFi_Symbol_Width, WiFi_Symbol_Height, 0, 0 }; +const iconProperty WiFiSymbol0Left64x48 = { &WiFi_Symbol_0, WiFi_Symbol_Width, WiFi_Symbol_Height, 0, 0 }; +const iconProperty BTSymbolCenter64x48 = { &BT_Symbol, BT_Symbol_Width, BT_Symbol_Height, 16, 0 }; +const iconProperty DownloadArrowCenter64x48 = { &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 16, 0 }; +const iconProperty UploadArrowCenter64x48 = { &UploadArrow, UploadArrow_Width, UploadArrow_Height, 16, 0 }; +const iconProperty WiFiSymbol3Right64x48 = { &WiFi_Symbol_3, WiFi_Symbol_Width, WiFi_Symbol_Height, 28, 0 }; +const iconProperty WiFiSymbol2Right64x48 = { &WiFi_Symbol_2, WiFi_Symbol_Width, WiFi_Symbol_Height, 28, 0 }; +const iconProperty WiFiSymbol1Right64x48 = { &WiFi_Symbol_1, WiFi_Symbol_Width, WiFi_Symbol_Height, 28, 0 }; +const iconProperty WiFiSymbol0Right64x48 = { &WiFi_Symbol_0, WiFi_Symbol_Width, WiFi_Symbol_Height, 28, 0 }; +const iconProperty DownloadArrowRight64x48 = { &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 31, 0 }; +const iconProperty UploadArrowRight64x48 = { &UploadArrow, UploadArrow_Width, UploadArrow_Height, 31, 0 }; + +// 128x64-specific + +// Shared on 64x48 and 128x64 + +const uint8_t DynamicModelIconXPos64x48 = 28; +const uint8_t DynamicModelIconYPos64x48 = 0; +const uint8_t DynamicModelIconXPos128x64 = 28; +const uint8_t DynamicModelIconYPos128x64 = 0; + +const iconProperties DynamicModel_1_Properties = {{{ &DynamicModel_1_Portable, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_1_Portable, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_2_Properties = {{{ &DynamicModel_2_Stationary, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_2_Stationary, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_3_Properties = {{{ &DynamicModel_3_Pedestrian, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_3_Pedestrian, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_4_Properties = {{{ &DynamicModel_4_Automotive, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_4_Automotive, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_5_Properties = {{{ &DynamicModel_5_Sea, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_5_Sea, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_6_Properties = {{{ &DynamicModel_6_Airborne1g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_6_Airborne1g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_7_Properties = {{{ &DynamicModel_7_Airborne2g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_7_Airborne2g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_8_Properties = {{{ &DynamicModel_8_Airborne4g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_8_Airborne4g, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_9_Properties = {{{ &DynamicModel_9_Wrist, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_9_Wrist, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_10_Properties = {{{ &DynamicModel_10_Bike, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_10_Bike, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_11_Properties = {{{ &DynamicModel_11_Mower, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_11_Mower, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; +const iconProperties DynamicModel_12_Properties = {{{ &DynamicModel_12_EScooter, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, + { &DynamicModel_12_EScooter, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos128x64, DynamicModelIconYPos128x64 }}}; + +const uint8_t BaseIconXPos64x48 = 28; +const uint8_t BaseIconYPos64x48 = 0; +const uint8_t BaseIconXPos128x64 = 28; +const uint8_t BaseIconYPos128x64 = 0; + +const iconProperties BaseTemporaryProperties = {{{ &BaseTemporary, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos64x48, BaseIconYPos64x48 }, + { &BaseTemporary, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos128x64, BaseIconXPos128x64 }}}; +const iconProperties BaseFixedProperties = {{{ &BaseFixed, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos64x48, BaseIconYPos64x48 }, + { &BaseFixed, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos128x64, BaseIconXPos128x64 }}}; const uint8_t AccuracyIconXPos64x48 = 0; const uint8_t AccuracyIconYPos64x48 = 18; From 9142c0b8b868b0a62f532576b54d5cf4102786ad Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 10:33:33 +0000 Subject: [PATCH 049/112] Better pulse icon --- Firmware/RTK_Everywhere/icons.h | 56 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 240b22a5a..0238cd539 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -887,12 +887,12 @@ const uint8_t Logging_NTP_1[] = {0xFF, 0x01, 0xF1, 0x01, 0x01, 0x01, 0x03, 0x06, .---------. 0x01| | 0x02| | - 0x04| ***** | - 0x08| * | - 0x10|* | - 0x20| | - 0x40| | - 0x80| | + 0x04| **** | + 0x08| * * | + 0x10| * *| + 0x20| *| + 0x40| *| + 0x80| *| 0x01| | 0x02| | 0x04| | @@ -900,7 +900,7 @@ const uint8_t Logging_NTP_1[] = {0xFF, 0x01, 0xF1, 0x01, 0x01, 0x01, 0x03, 0x06, '---------' */ -const uint8_t Pulse_0[] = {0x10, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, +const uint8_t Pulse_0[] = {0x00, 0x10, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /* @@ -916,15 +916,15 @@ const uint8_t Pulse_0[] = {0x10, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x20| *| 0x40| *| 0x80| *| - 0x01| | - 0x02| | + 0x01| * | + 0x02| **** | 0x04| | 0x08| | '---------' */ const uint8_t Pulse_1[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00}; /* Pulse_2 [9, 12] @@ -935,19 +935,19 @@ const uint8_t Pulse_1[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0xF0, 0x02| | 0x04| | 0x08| | - 0x10| | - 0x20| | - 0x40| | - 0x80| *| - 0x01| * | - 0x02| ***** | + 0x10| * | + 0x20| * | + 0x40| * | + 0x80| * *| + 0x01| * * | + 0x02| **** | 0x04| | 0x08| | '---------' */ -const uint8_t Pulse_2[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00}; +const uint8_t Pulse_2[] = {0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00}; /* Pulse_3 [9, 12] @@ -956,21 +956,21 @@ const uint8_t Pulse_2[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, .---------. 0x01| | 0x02| | - 0x04| | - 0x08| | - 0x10|* | - 0x20|* | - 0x40|* | - 0x80|* | - 0x01| * | - 0x02| * | + 0x04| **** | + 0x08| * | + 0x10| * | + 0x20| * | + 0x40| * | + 0x80| * | + 0x01| * | + 0x02| * | 0x04| | 0x08| | '---------' */ -const uint8_t Pulse_3[] = {0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +const uint8_t Pulse_3[] = {0x00, 0xF0, 0x08, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}; /* DynamicModel_1_Portable [15, 12] From 6c6b7cb760dd41a65f7b12c9009c40cd8d7f8222 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 11:42:53 +0000 Subject: [PATCH 050/112] Fix theGNSS I2C bus --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 2 +- Firmware/RTK_Everywhere/ZED.ino | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 503c8d42a..684c4bca7 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -359,7 +359,7 @@ class SFE_UBLOX_GNSS_SUPER_DERIVED : public SFE_UBLOX_GNSS_SUPER } }; -SFE_UBLOX_GNSS_SUPER_DERIVED *theGNSS; // Don't instantiate until we know what gnssPlatform we're on +SFE_UBLOX_GNSS_SUPER_DERIVED *theGNSS = nullptr; // Don't instantiate until we know what gnssPlatform we're on #ifdef COMPILE_L_BAND static SFE_UBLOX_GNSS_SUPER i2cLBand; // NEO-D9S diff --git a/Firmware/RTK_Everywhere/ZED.ino b/Firmware/RTK_Everywhere/ZED.ino index 2c2f3e935..e5a785823 100644 --- a/Firmware/RTK_Everywhere/ZED.ino +++ b/Firmware/RTK_Everywhere/ZED.ino @@ -121,7 +121,8 @@ void storeRTCM1006data(RTCM_1006_data_t *rtcmData1006) void zedBegin() { // Instantiate the library - theGNSS = new SFE_UBLOX_GNSS_SUPER_DERIVED(); + if (theGNSS == nullptr) + theGNSS = new SFE_UBLOX_GNSS_SUPER_DERIVED(); // Skip if going into configure-via-ethernet mode if (configureViaEthernet) @@ -130,13 +131,13 @@ void zedBegin() return; } - if (theGNSS->begin() == false) + if (theGNSS->begin(*i2c_0) == false) { log_d("GNSS Failed to begin. Trying again."); // Try again with power on delay delay(1000); // Wait for ZED-F9P to power up before it can respond to ACK - if (theGNSS->begin() == false) + if (theGNSS->begin(*i2c_0) == false) { log_d("GNSS offline"); displayGNSSFail(1000); From 38711259abc44c4c8d20e2280caecc4be6318046 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 11:43:16 +0000 Subject: [PATCH 051/112] Update comments --- Firmware/RTK_Everywhere/Display.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index d53d3cec5..99a5e0299 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -776,6 +776,7 @@ void setBluetoothIcon_TwoRadios(std::vector *iconList) // Bluetooth is in center position // Set ESP Now icon (Solid, arrows, blinking) in left position +// This is 64x48-specific void setESPNowIcon_TwoRadios(std::vector *iconList) { if (espnowState == ESPNOW_PAIRED) @@ -846,6 +847,7 @@ void setESPNowIcon_TwoRadios(std::vector *iconList) // Bluetooth is in center position // Set WiFi icon (Solid, arrows, blinking) in left position +// This is 64x48-specific void setWiFiIcon_TwoRadios(std::vector *iconList) { if (wifiState == WIFI_CONNECTED) @@ -922,6 +924,7 @@ void setWiFiIcon_TwoRadios(std::vector *iconList) // Bluetooth is in center position // Set WiFi icon (Solid, arrows, blinking) in right position +// This is 64x48-specific void setWiFiIcon_ThreeRadios(std::vector *iconList) { if (wifiState == WIFI_CONNECTED) @@ -998,6 +1001,7 @@ void setWiFiIcon_ThreeRadios(std::vector *iconList) // Bluetooth and ESP Now icons off. WiFi in middle. // Blink while no clients are connected +// This is used on both 64x48 and 128x64 displays void setWiFiIcon(std::vector *iconList) { if (online.display == true) From cc7884a3db87c736db068f359190437332d29975 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 11:43:54 +0000 Subject: [PATCH 052/112] Fix i2cLBand I2C bus --- Firmware/RTK_Everywhere/menuPP.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index d4be0db67..95bd4c309 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1179,7 +1179,7 @@ void beginLBand() if (present.lband_neo == false) return; - if (i2cLBand.begin(Wire, 0x43) == + if (i2cLBand.begin(i2c_0, 0x43) == false) // Connect to the u-blox NEO-D9S using Wire port. The D9S default I2C address is 0x43 (not 0x42) { if (settings.debugCorrections == true) From c58dcfaa2e8da2bcc3d446766c44c8e82853b136 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 11:44:26 +0000 Subject: [PATCH 053/112] Move Accuracy and SIV on 128x64 --- Firmware/RTK_Everywhere/icons.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 0238cd539..8b525ef5f 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1623,10 +1623,11 @@ const iconProperties BaseTemporaryProperties = {{{ &BaseTemporary, BaseTemporary const iconProperties BaseFixedProperties = {{{ &BaseFixed, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos64x48, BaseIconYPos64x48 }, { &BaseFixed, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos128x64, BaseIconXPos128x64 }}}; + const uint8_t AccuracyIconXPos64x48 = 0; const uint8_t AccuracyIconYPos64x48 = 18; -const uint8_t AccuracyIconXPos128x64 = 0; -const uint8_t AccuracyIconYPos128x64 = 18; +const uint8_t AccuracyIconXPos128x64 = 0; +const uint8_t AccuracyIconYPos128x64 = 26; // Just because we can, move accuracy down by 8 pixels on 128x64 const iconProperties CrossHairProperties = {{{ &CrossHair, CrossHair_Width, CrossHair_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, { &CrossHair, CrossHair_Width, CrossHair_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}}; @@ -1647,10 +1648,11 @@ const iconClockProperties ClockIconProperties = {{{{ &Clock_Icon_0, Clock_Icon_W {{ &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos64x48, AccuracyIconYPos64x48 }, { &Clock_Icon_3, Clock_Icon_Width, Clock_Icon_Height, AccuracyIconXPos128x64, AccuracyIconYPos128x64 }}}}; -const uint8_t SIVIconXPos64x48 = 2; // This aligns the SIV icon neatly under the accuracy icon. But it causes challenges elsewhere + +const uint8_t SIVIconXPos64x48 = 2; // This aligns the SIV icon neatly under the accuracy icon. But it causes challenges elsewhere. See SIVTextStartXPosOffset const uint8_t SIVIconYPos64x48 = 35; -const uint8_t SIVIconXPos128x64 = 2; -const uint8_t SIVIconYPos128x64 = 35; +const uint8_t SIVIconXPos128x64 = 66; // Just because we can, move SIV to the right on 128x64 +const uint8_t SIVIconYPos128x64 = 26; const int SIVTextStartXPosOffset[DISPLAY_MAX_NONE] = { -2, -2 }; // This is a bodge to allow the paintBaseTempSurveyStarted text to be printed in the correct place @@ -1663,6 +1665,7 @@ const iconProperties ShortIconProperties = {{{ &Antenna_Short, Antenna_Short_Wid const iconProperties OpenIconProperties = {{{ &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, SIVIconXPos64x48, SIVIconYPos64x48 }, { &Antenna_Open, Antenna_Open_Width, Antenna_Open_Height, SIVIconXPos128x64, SIVIconYPos128x64 }}}; + const uint8_t LoggingIconXPos64x48 = DisplayWidth[0] - Logging_Width; // Put the logging icon in the bottom right corner const uint8_t LoggingIconYPos64x48 = DisplayHeight[0] - Logging_Height; const uint8_t LoggingIconXPos128x64 = DisplayWidth[1] - Logging_Width; From b3c10e0f7c02e93f7af89dfed74a62cf43f7b383 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 11:50:44 +0000 Subject: [PATCH 054/112] Move SIV more to the right on 128x64 --- Firmware/RTK_Everywhere/icons.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 8b525ef5f..e7815b4c5 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1651,7 +1651,7 @@ const iconClockProperties ClockIconProperties = {{{{ &Clock_Icon_0, Clock_Icon_W const uint8_t SIVIconXPos64x48 = 2; // This aligns the SIV icon neatly under the accuracy icon. But it causes challenges elsewhere. See SIVTextStartXPosOffset const uint8_t SIVIconYPos64x48 = 35; -const uint8_t SIVIconXPos128x64 = 66; // Just because we can, move SIV to the right on 128x64 +const uint8_t SIVIconXPos128x64 = 74; // Just because we can, move SIV to the right on 128x64 const uint8_t SIVIconYPos128x64 = 26; const int SIVTextStartXPosOffset[DISPLAY_MAX_NONE] = { -2, -2 }; // This is a bodge to allow the paintBaseTempSurveyStarted text to be printed in the correct place From 04e361a1a18676249018cdb2b0d100f7df7d014a Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 13:34:16 +0000 Subject: [PATCH 055/112] Add 128x64 radio icons --- Firmware/RTK_Everywhere/Display.ino | 164 +++++++++++++++++++++++++++- Firmware/RTK_Everywhere/icons.h | 15 ++- 2 files changed, 176 insertions(+), 3 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 99a5e0299..7333a39b4 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -569,6 +569,9 @@ void paintBatteryLevel(std::vector *iconList) } /* + + On 64x48: + 111111111122222222223333333333444444444455555555556666 0123456789012345678901234567890123456789012345678901234567890123 .---------------------------------------------------------------- @@ -619,6 +622,15 @@ void paintBatteryLevel(std::vector *iconList) 6| * ****** 7| *** **** 8| * ** + + + On 128x64: + + 111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999AAAAAAAAAABBBBBBBBBBCCCCCCCC + 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567 + .-------------------------------------------------------------------------------------------------------------------------------- + |-----4 digit MAC-----| |--BT-| |---WiFi----| |--ESP-| |-Down-| |--Up--| |-Dynamic/Base| |--Battery / ETH--| + */ // Turn on various icons in the Radio area @@ -685,7 +697,157 @@ void setRadioIcons(std::vector *iconList) } else if (present.display_type == DISPLAY_128x64) { - // We have acres of space to play with + paintMACAddress4digit(0,3); // Columns 0 to 22 + + // Bluetooth always indicated : Columns 25 to 31 . TODO don't count if BT radio type is OFF. + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + prop.icon = BTSymbol128x64; + iconList->push_back(prop); + } + + if (wifiState > WIFI_OFF) // WiFi : Columns 34 - 46 + { +#ifdef COMPILE_WIFI + int wifiRSSI = WiFi.RSSI(); +#else // COMPILE_WIFI + int wifiRSSI = -40; // Dummy +#endif // COMPILE_WIFI + iconPropertyBlinking prop; + prop.duty = 0b11111111; + // Based on RSSI, select icon + if (wifiRSSI >= -40) + prop.icon = WiFiSymbol3128x64; + else if (wifiRSSI >= -60) + prop.icon = WiFiSymbol2128x64; + else if (wifiRSSI >= -80) + prop.icon = WiFiSymbol1128x64; + else + prop.icon = WiFiSymbol0128x64; + iconList->push_back(prop); + } + + if (espnowState == ESPNOW_PAIRED) // ESPNOW : Columns 49 - 56 + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + // Based on RSSI, select icon + if (espnowRSSI >= -40) + prop.icon = ESPNowSymbol3128x64; + else if (espnowRSSI >= -60) + prop.icon = ESPNowSymbol2128x64; + else if (espnowRSSI >= -80) + prop.icon = ESPNowSymbol1128x64; + else // if (espnowRSSI > -255) + prop.icon = ESPNowSymbol0128x64; + iconList->push_back(prop); + } + + if (bluetoothGetState() == BT_CONNECTED) + { + if (bluetoothIncomingRTCM == true) // Download : Columns 59 - 66 + { + iconPropertyBlinking prop; + prop.icon = DownloadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + bluetoothIncomingRTCM = false; + } + if (bluetoothOutgoingRTCM == true) // Upload : Columns 69 - 76 + { + iconPropertyBlinking prop; + prop.icon = UploadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + bluetoothOutgoingRTCM = false; + } + } + + if (espnowState == ESPNOW_PAIRED) + { + if (espnowIncomingRTCM == true) // Download : Columns 59 - 66 + { + iconPropertyBlinking prop; + prop.icon = DownloadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + espnowIncomingRTCM = false; + } + if (espnowOutgoingRTCM == true) // Upload : Columns 69 - 76 + { + iconPropertyBlinking prop; + prop.icon = UploadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + espnowOutgoingRTCM = false; + } + } + + if (wifiState == WIFI_CONNECTED) + { + if (netIncomingRTCM == true) // Download : Columns 59 - 66 + { + iconPropertyBlinking prop; + prop.icon = DownloadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + netIncomingRTCM = false; + } + if (mqttClientDataReceived == true) // Download : Columns 59 - 66 + { + iconPropertyBlinking prop; + prop.icon = DownloadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + mqttClientDataReceived = false; + } + if (netOutgoingRTCM == true) // Upload : Columns 69 - 76 + { + iconPropertyBlinking prop; + prop.icon = UploadArrow128x64; + prop.duty = 0b11111111; + iconList->push_back(prop); + netOutgoingRTCM = false; + } + } + + switch (systemState) // Dynamic Model / Base : Columns 79 - 93 + { + case (STATE_ROVER_NO_FIX): + case (STATE_ROVER_FIX): + case (STATE_ROVER_RTK_FLOAT): + case (STATE_ROVER_RTK_FIX): + paintDynamicModel(iconList); + break; + case (STATE_BASE_TEMP_SETTLE): + case (STATE_BASE_TEMP_SURVEY_STARTED): + { + iconPropertyBlinking prop; + prop.duty = 0b00001111; + prop.icon = BaseTemporaryProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } + break; + case (STATE_BASE_TEMP_TRANSMITTING): + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + prop.icon = BaseTemporaryProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } + break; + case (STATE_BASE_FIXED_TRANSMITTING): + { + iconPropertyBlinking prop; + prop.duty = 0b11111111; + prop.icon = BaseFixedProperties.iconDisplay[present.display_type]; + iconList->push_back(prop); + } + break; + default: + break; + } } } } diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index e7815b4c5..ab9d52a3e 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1580,12 +1580,23 @@ const iconProperty DownloadArrowRight64x48 = { &DownloadArrow, DownloadArrow_Wid const iconProperty UploadArrowRight64x48 = { &UploadArrow, UploadArrow_Width, UploadArrow_Height, 31, 0 }; // 128x64-specific +const iconProperty BTSymbol128x64 = { &BT_Symbol, BT_Symbol_Width, BT_Symbol_Height, 25, 0 }; +const iconProperty WiFiSymbol3128x64 = { &WiFi_Symbol_3, WiFi_Symbol_Width, WiFi_Symbol_Height, 34, 2 }; +const iconProperty WiFiSymbol2128x64 = { &WiFi_Symbol_2, WiFi_Symbol_Width, WiFi_Symbol_Height, 34, 2 }; +const iconProperty WiFiSymbol1128x64 = { &WiFi_Symbol_1, WiFi_Symbol_Width, WiFi_Symbol_Height, 34, 2 }; +const iconProperty WiFiSymbol0128x64 = { &WiFi_Symbol_0, WiFi_Symbol_Width, WiFi_Symbol_Height, 34, 2 }; +const iconProperty ESPNowSymbol3128x64 = { &ESPNOW_Symbol_3, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 49, 0 }; +const iconProperty ESPNowSymbol2128x64 = { &ESPNOW_Symbol_2, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 49, 0 }; +const iconProperty ESPNowSymbol1128x64 = { &ESPNOW_Symbol_1, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 49, 0 }; +const iconProperty ESPNowSymbol0128x64 = { &ESPNOW_Symbol_0, ESPNOW_Symbol_Width, ESPNOW_Symbol_Height, 49, 0 }; +const iconProperty DownloadArrow128x64 = { &DownloadArrow, DownloadArrow_Width, DownloadArrow_Height, 59, 2 }; +const iconProperty UploadArrow128x64 = { &UploadArrow, UploadArrow_Width, UploadArrow_Height, 69, 2 }; // Shared on 64x48 and 128x64 const uint8_t DynamicModelIconXPos64x48 = 28; const uint8_t DynamicModelIconYPos64x48 = 0; -const uint8_t DynamicModelIconXPos128x64 = 28; +const uint8_t DynamicModelIconXPos128x64 = 79; const uint8_t DynamicModelIconYPos128x64 = 0; const iconProperties DynamicModel_1_Properties = {{{ &DynamicModel_1_Portable, DynamicModel_Width, DynamicModel_Height, DynamicModelIconXPos64x48, DynamicModelIconYPos64x48 }, @@ -1615,7 +1626,7 @@ const iconProperties DynamicModel_12_Properties = {{{ &DynamicModel_12_EScooter, const uint8_t BaseIconXPos64x48 = 28; const uint8_t BaseIconYPos64x48 = 0; -const uint8_t BaseIconXPos128x64 = 28; +const uint8_t BaseIconXPos128x64 = 79; const uint8_t BaseIconYPos128x64 = 0; const iconProperties BaseTemporaryProperties = {{{ &BaseTemporary, BaseTemporary_Width, BaseTemporary_Height, BaseIconXPos64x48, BaseIconYPos64x48 }, From cf02db159c0317e33c668db5758dc4bcfa067059 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 13:49:35 +0000 Subject: [PATCH 056/112] Fix i2cLBand I2C bus --- Firmware/RTK_Everywhere/menuPP.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/menuPP.ino b/Firmware/RTK_Everywhere/menuPP.ino index 95bd4c309..d6ec23059 100644 --- a/Firmware/RTK_Everywhere/menuPP.ino +++ b/Firmware/RTK_Everywhere/menuPP.ino @@ -1179,7 +1179,7 @@ void beginLBand() if (present.lband_neo == false) return; - if (i2cLBand.begin(i2c_0, 0x43) == + if (i2cLBand.begin(*i2c_0, 0x43) == false) // Connect to the u-blox NEO-D9S using Wire port. The D9S default I2C address is 0x43 (not 0x42) { if (settings.debugCorrections == true) From 6495de4aaeb68d481c330e0d9050e2a420f57330 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 13:50:10 +0000 Subject: [PATCH 057/112] Compile everything --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 684c4bca7..90e169a5f 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -21,21 +21,21 @@ // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development -// #define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support -// #define COMPILE_WIFI // Comment out to remove WiFi functionality -// #define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update +#define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support +#define COMPILE_WIFI // Comment out to remove WiFi functionality +#define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update #ifdef COMPILE_WIFI #define COMPILE_AP // Requires WiFi. Comment out to remove Access Point functionality #define COMPILE_ESPNOW // Requires WiFi. Comment out to remove ESP-Now functionality. #endif // COMPILE_WIFI -// #define COMPILE_BT // Comment out to remove Bluetooth functionality -//#define COMPILE_L_BAND // Comment out to remove L-Band functionality -//#define COMPILE_UM980 // Comment out to remove UM980 functionality -//#define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality -//#define COMPILE_POINTPERFECT_LIBRARY // Comment out to remove PPL support -//#define COMPILE_BQ40Z50 // Comment out to remove BQ40Z50 functionality +#define COMPILE_BT // Comment out to remove Bluetooth functionality +#define COMPILE_L_BAND // Comment out to remove L-Band functionality +#define COMPILE_UM980 // Comment out to remove UM980 functionality +#define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality +#define COMPILE_POINTPERFECT_LIBRARY // Comment out to remove PPL support +#define COMPILE_BQ40Z50 // Comment out to remove BQ40Z50 functionality #if defined(COMPILE_WIFI) || defined(COMPILE_ETHERNET) #define COMPILE_NETWORK true From 5e1f3a5a7fd8f6aafc432e5a80c132c6c0fb674e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 13:59:09 +0000 Subject: [PATCH 058/112] Fix 128x64 battery icon position --- Firmware/RTK_Everywhere/icons.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index ab9d52a3e..fd5aa49a3 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1728,13 +1728,13 @@ const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_Width, {{ &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, { &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; -const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - Battery_Width; // Put the logging icon in the top right corner +const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - Battery_Width; // Put the battery / Ethernet icon in the top right corner const uint8_t BatteryIconYPos64x48 = 0; const uint8_t BatteryIconXPos128x64 = DisplayWidth[1] - Battery_Width; const uint8_t BatteryIconYPos128x64 = 0; const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, - { &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }}}; + { &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos128x64, BatteryIconYPos128x64 }}}; #define BATTERY_CHARGE_STATES 4 typedef struct { From a2db360c8f0426d5a35302f5fc5e912937f17b40 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 14:04:51 +0000 Subject: [PATCH 059/112] Update RTK_Everywhere.ino --- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Firmware/RTK_Everywhere/RTK_Everywhere.ino b/Firmware/RTK_Everywhere/RTK_Everywhere.ino index 90e169a5f..0fe9d416f 100644 --- a/Firmware/RTK_Everywhere/RTK_Everywhere.ino +++ b/Firmware/RTK_Everywhere/RTK_Everywhere.ino @@ -21,16 +21,16 @@ // To reduce compile times, various parts of the firmware can be disabled/removed if they are not // needed during development -#define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support -#define COMPILE_WIFI // Comment out to remove WiFi functionality -#define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update +// #define COMPILE_ETHERNET // Comment out to remove Ethernet (W5500) support +// #define COMPILE_WIFI // Comment out to remove WiFi functionality +// #define COMPILE_OTA_AUTO // Comment out to disable automatic over-the-air firmware update #ifdef COMPILE_WIFI #define COMPILE_AP // Requires WiFi. Comment out to remove Access Point functionality #define COMPILE_ESPNOW // Requires WiFi. Comment out to remove ESP-Now functionality. #endif // COMPILE_WIFI -#define COMPILE_BT // Comment out to remove Bluetooth functionality +// #define COMPILE_BT // Comment out to remove Bluetooth functionality #define COMPILE_L_BAND // Comment out to remove L-Band functionality #define COMPILE_UM980 // Comment out to remove UM980 functionality #define COMPILE_IM19_IMU // Comment out to remove IM19_IMU functionality @@ -670,10 +670,6 @@ uint32_t lastRTCSync; // Time in millis when the RTC was last sync'd bool rtcSyncd; // Set to true when the RTC has been sync'd via TP pulse uint32_t lastPrintPosition; // For periodic display of the position -uint32_t lastBaseIconUpdate; -bool baseIconDisplayed; // Toggles as lastBaseIconUpdate goes above 1000ms -uint8_t espnowIconDisplayed; // Increases every 500ms while transmitting - uint64_t lastLogSize; bool logIncreasing; // Goes true when log file is greater than lastLogSize or logPosition changes bool reuseLastLog; // Goes true if we have a reset due to software (rather than POR) From 8172a26debcb0b4e2d93a13949abea015beda2e7 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 17:55:58 +0000 Subject: [PATCH 060/112] Trap negative battery level --- Firmware/RTK_Everywhere/Display.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index 7333a39b4..bd8f8e588 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -560,6 +560,8 @@ void paintBatteryLevel(std::vector *iconList) int batteryFraction = batteryLevelPercent / 25; if (batteryFraction >= BATTERY_CHARGE_STATES) batteryFraction = BATTERY_CHARGE_STATES - 1; + if (batteryFraction < 0) + batteryFraction = 0; iconPropertyBlinking prop; prop.icon = BatteryProperties.iconDisplay[batteryFraction][present.display_type]; From 7576db7d8f16059ee4aa7fc5b50e22697a427919 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 19:01:14 +0000 Subject: [PATCH 061/112] Nudge battery icon to prevent column 0 corruption --- Firmware/RTK_Everywhere/icons.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index fd5aa49a3..85d498964 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1728,9 +1728,11 @@ const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_Width, {{ &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos64x48, LoggingIconYPos64x48 }, { &Pulse_3, Logging_Width, Logging_Height, LoggingIconXPos128x64, LoggingIconYPos128x64 }}}}; -const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - Battery_Width; // Put the battery / Ethernet icon in the top right corner +// Put the battery / Ethernet icon in the top right corner +// Note: the "Width + 1" shouldn't be necessary, but I see corruption on column 0 without it... +const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - (Battery_Width + 1); const uint8_t BatteryIconYPos64x48 = 0; -const uint8_t BatteryIconXPos128x64 = DisplayWidth[1] - Battery_Width; +const uint8_t BatteryIconXPos128x64 = DisplayWidth[1] - (Battery_Width + 1); const uint8_t BatteryIconYPos128x64 = 0; const iconProperties EthernetIconProperties = {{{ &Ethernet_Icon, Battery_Width, Battery_Height, BatteryIconXPos64x48, BatteryIconYPos64x48 }, From 1c1917c966b64cba343a19935110825b7047818e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Mon, 25 Mar 2024 19:01:53 +0000 Subject: [PATCH 062/112] Use overload of oled->bitmap --- Firmware/RTK_Everywhere/Display.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index bd8f8e588..d81a7372b 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -2705,10 +2705,10 @@ void paintResets() } } -// Wrapper to avoid needing to pass width/height data twice +// Wrapper void displayBitmap(uint8_t x, uint8_t y, uint8_t imageWidth, uint8_t imageHeight, const uint8_t *imageData) { - oled->bitmap(x, y, x + imageWidth, y + imageHeight, (uint8_t *)imageData, imageWidth, imageHeight); + oled->bitmap(x, y, (uint8_t *)imageData, imageWidth, imageHeight); } void displayKeysUpdated() From 963458dad319772260e0136aab358caedafc0def Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 08:19:44 +0000 Subject: [PATCH 063/112] Fix display_type for Torch --- Firmware/RTK_Everywhere/Tasks.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/Tasks.ino b/Firmware/RTK_Everywhere/Tasks.ino index 1f799a891..3cf066fe4 100644 --- a/Firmware/RTK_Everywhere/Tasks.ino +++ b/Firmware/RTK_Everywhere/Tasks.ino @@ -1268,7 +1268,7 @@ void buttonCheckTask(void *e) userBtn->read(); - if (present.imu_im19 && (present.display_type < DISPLAY_MAX_NONE)) + if (present.imu_im19 && (present.display_type == DISPLAY_MAX_NONE)) { // Platform has no display and tile, ie RTK Torch From 45b882126d34bd281e31772f4cc2501e83bfd4ac Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 09:00:20 +0000 Subject: [PATCH 064/112] Fix I2C port for fuel gauges --- Firmware/RTK_Everywhere/Begin.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index 5d1f76549..a52607b2b 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -801,7 +801,7 @@ void beginFuelGauge() if (present.battery_max17048 == true) { // Set up the MAX17048 LiPo fuel gauge - if (lipo.begin() == false) + if (lipo.begin(*i2c_0) == false) { systemPrintln("Fuel gauge not detected"); return; @@ -844,7 +844,7 @@ void beginFuelGauge() return; } - if (bq40z50Battery->begin() == false) + if (bq40z50Battery->begin(*i2c_0) == false) { systemPrintln("BQ40Z50 not detected"); delete bq40z50Battery; From 7ccf1034f1c5c91fedfb22fcf053a6f87e0a54f8 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 09:21:36 +0000 Subject: [PATCH 065/112] Add beginSystemState for Facet mosaic --- Firmware/RTK_Everywhere/Begin.ino | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Firmware/RTK_Everywhere/Begin.ino b/Firmware/RTK_Everywhere/Begin.ino index a52607b2b..8e8005184 100644 --- a/Firmware/RTK_Everywhere/Begin.ino +++ b/Firmware/RTK_Everywhere/Begin.ino @@ -953,6 +953,15 @@ void beginSystemState() // Return to either NTP, Base or Rover Not Started. The last state previous to power down. systemState = settings.lastState; } + else if (productVariant == RTK_FACET_MOSAIC) + { + // Return to either NTP, Base or Rover Not Started. The last state previous to power down. + systemState = settings.lastState; + + firstRoverStart = true; // Allow user to enter test screen during first rover start + if (systemState == STATE_BASE_NOT_STARTED) + firstRoverStart = false; + } else if (productVariant == RTK_TORCH) { // Do not allow user to enter test screen during first rover start because there is no screen From 912761aac22d438d99a7d7e93ac708a05b1003ad Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 10:24:38 +0000 Subject: [PATCH 066/112] Temporary fix for column 0 on 128x64 --- Firmware/RTK_Everywhere/icons.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/icons.h b/Firmware/RTK_Everywhere/icons.h index 85d498964..22499d71d 100644 --- a/Firmware/RTK_Everywhere/icons.h +++ b/Firmware/RTK_Everywhere/icons.h @@ -1730,7 +1730,8 @@ const iconLoggingProperties PulseIconProperties = {{{{ &Pulse_0, Logging_Width, // Put the battery / Ethernet icon in the top right corner // Note: the "Width + 1" shouldn't be necessary, but I see corruption on column 0 without it... -const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - (Battery_Width + 1); +// https://github.com/sparkfun/SparkFun_Qwiic_OLED_Arduino_Library/issues/21 +const uint8_t BatteryIconXPos64x48 = DisplayWidth[0] - Battery_Width; const uint8_t BatteryIconYPos64x48 = 0; const uint8_t BatteryIconXPos128x64 = DisplayWidth[1] - (Battery_Width + 1); const uint8_t BatteryIconYPos128x64 = 0; From dabc4b57ee5c46fc43e98c7e7f238f1a724682be Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 13:14:38 +0000 Subject: [PATCH 067/112] Starting to add corrections priorities --- Firmware/RTK_Everywhere/NVM.ino | 28 ++++++++++++++++ Firmware/RTK_Everywhere/menuCommands.ino | 2 ++ Firmware/RTK_Everywhere/menuMessages.ino | 9 +++++ Firmware/RTK_Everywhere/settings.h | 42 +++++++++++++++++++++++- 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Firmware/RTK_Everywhere/NVM.ino b/Firmware/RTK_Everywhere/NVM.ino index 069fb8184..0bf2c5a60 100644 --- a/Firmware/RTK_Everywhere/NVM.ino +++ b/Firmware/RTK_Everywhere/NVM.ino @@ -496,6 +496,15 @@ void recordSystemSettingsToFile(File *settingsFile) settingsFile->printf("%s=%d\r\n", "um980MeasurementRateMs", settings.um980MeasurementRateMs); settingsFile->printf("%s=%d\r\n", "enableImuCompensationDebug", settings.enableImuCompensationDebug); + // Record corrections priorities + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "correctionsPriority.%s=%0d", correctionsSourceNames[x], + settings.correctionsSourcesPriority[x]); + settingsFile->println(tempString); + } + // Add new settings above <---------------------------------------------------> // Below are things not part of settings.h @@ -1597,6 +1606,25 @@ bool parseLine(char *str, Settings *settings) } } + // Scan for corrections priorities + if (knownSetting == false) + { + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "correctionsPriority.%s", + correctionsSourceNames[x]); + + if (strcmp(settingName, tempString) == 0) + { + settings->correctionsSourcesPriority[x] = d; + + knownSetting = true; + break; + } + } + } + // Last catch if (knownSetting == false) { diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 383836c35..2f5245955 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2495,5 +2495,7 @@ void printAvailableSettings() systemPrint("um980MeasurementRateMs,uint16_t,"); systemPrint("enableImuCompensationDebug,bool,"); + systemPrintf("correctionsPriority,int[%d],", sizeof(settings.correctionsSourcesPriority) / sizeof(int)); + systemPrintln(); } diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index 4b0a92707..5076293dc 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -752,6 +752,15 @@ void checkArrayDefaults() settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; } + if (settings.correctionsSourcesPriority[0] == -1) // TODO: this should probably be somewhere else. But not sure where...? + { + defaultsApplied = true; + + for (int s = 0; s < correctionsSource::CORR_NUM; s++) + settings.correctionsSourcesPriority[s] = s; + } + + if (defaultsApplied == true) recordSystemSettings(); } diff --git a/Firmware/RTK_Everywhere/settings.h b/Firmware/RTK_Everywhere/settings.h index afd60bfc8..0ffcb479f 100644 --- a/Firmware/RTK_Everywhere/settings.h +++ b/Firmware/RTK_Everywhere/settings.h @@ -2,7 +2,7 @@ #define _RTK_EVERYWHERE_SETTINGS_H #include "UM980.h" //Structs of UM980 messages, needed for settings.h - +#include // System can enter a variety of states // See statemachine diagram at: @@ -129,6 +129,40 @@ const char * const platformProvisionTable[] = }; const int platformProvisionTableEntries = sizeof (platformProvisionTable) / sizeof(platformProvisionTable[0]); +// Corrections Priority +typedef enum +{ + // Change the order of these to set the default priority. First (0) is highest + CORR_BLUETOOTH = 0, + CORR_WIFI_IP, + CORR_WIFI_TCP, + CORR_ETHERNET_IP, + CORR_ETHERNET_TCP, + CORR_LBAND, + CORR_CELLULAR, + CORR_RADIO_EXT, + CORR_RADIO_LORA, + CORR_ESPNOW, + // Add new correction sources just above this line + CORR_NUM +} correctionsSource; +const char * const correctionsSourceNames[correctionsSource::CORR_NUM] = +{ + // These must match correctionsSources above + "Bluetooth", + "WiFi_IP_(PointPerfect/MQTT)", + "WiFi_TCP_(NTRIP)", + "Ethernet_IP_(PointPerfect/MQTT)", + "Ethernet_TCP_(NTRIP_Client)", + "L-Band", + "Cellular", + "External_Radio", + "LoRa_Radio", + "ESP-Now", + // Add new correction sources just above this line +}; + + const SystemState platformPreviousStateTable[] = { STATE_ROVER_NOT_STARTED, // EVK @@ -1214,6 +1248,8 @@ typedef struct uint16_t um980MeasurementRateMs = 500; // Elapsed ms between GNSS measurements. 50ms to 65535ms. Default 2Hz. bool enableImuCompensationDebug = false; + int correctionsSourcesPriority[correctionsSource::CORR_NUM] = { -1 }; // -1 indicates array is uninitialized + // Add new settings above <------------------------------------------------------------> } Settings; @@ -1313,6 +1349,10 @@ struct struct_online bool ppl = false; } online; +// Corrections priority +std::vector registeredCorrectionsSources; // vector (linked list) of registered corrections sources for this device +void registerCorrectionsSource(correctionsSource newSource) { registeredCorrectionsSources.push_back(newSource); } + #ifdef COMPILE_WIFI // AWS certificate for PointPerfect API static const char *AWS_PUBLIC_CERT = R"=====( From 2dc8ed71e9ae601fbcb93e15df9532252d7d80e6 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 13:34:15 +0000 Subject: [PATCH 068/112] Update menuCommands.ino for settings.correctionsSourcesPriority --- Firmware/RTK_Everywhere/menuCommands.ino | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 2f5245955..6ea0374d9 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -567,6 +567,8 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr else if (strcmp(settingName, "enableImuCompensationDebug") == 0) settings.enableImuCompensationDebug = settingValue; + // correctionsPriority not handled here + // Add new settings above <---------------------------------------------------> else if (strstr(settingName, "stationECEF") != nullptr) @@ -946,6 +948,24 @@ void updateSettingWithValue(const char *settingName, const char *settingValueStr } } + // Scan for corrections priorities + if (knownSetting == false) + { + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "correctionsPriority.%s", + correctionsSourceNames[x]); + + if (strcmp(settingName, tempString) == 0) + { + settings.correctionsSourcesPriority[x] = settingValue; + knownSetting = true; + break; + } + } + } + // Last catch if (knownSetting == false) { @@ -1329,6 +1349,14 @@ void createSettingsString(char *newSettings) stringRecord(newSettings, "um980MeasurementRateMs", settings.um980MeasurementRateMs); stringRecord(newSettings, "enableImuCompensationDebug", settings.enableImuCompensationDebug); + // Add corrections priorities + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tagText, sizeof(tagText), "correctionsPriority.%s", correctionsSourceNames[x]); + stringRecord(newSettings, tagText, settings.correctionsSourcesPriority[x]); + } + // stringRecord(newSettings, "", settings.); // Add new settings above <------------------------------------------------------------> @@ -2051,6 +2079,8 @@ void getSettingValue(const char *settingName, char *settingValueStr) else if (strcmp(settingName, "enableImuCompensationDebug") == 0) writeToString(settingValueStr, settings.enableImuCompensationDebug); + // correctionsPriority handled below + // Add new settings above <------------------------------------------------------------> // Check global setting @@ -2250,6 +2280,24 @@ void getSettingValue(const char *settingName, char *settingValueStr) } } + // Scan for corrections priorities + if (knownSetting == false) + { + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + char tempString[80]; // correctionsPriority.Ethernet_IP_(PointPerfect/MQTT)=99 + snprintf(tempString, sizeof(tempString), "correctionsPriority.%s", + correctionsSourceNames[x]); + + if (strcmp(settingName, tempString) == 0) + { + writeToString(settingValueStr, settings.correctionsSourcesPriority[x]); + knownSetting = true; + break; + } + } + } + if (knownSetting == false) { systemPrintf("getSettingValue() Unknown setting: %s\r\n", settingName); From 5eb3b20def8111e0f322d400ade90344e3171f9e Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 26 Mar 2024 18:22:55 +0000 Subject: [PATCH 069/112] Add menuCorrectionsPriorities --- Firmware/RTK_Everywhere/menuCommands.ino | 3 + .../menuCorrectionsPriorities.ino | 104 ++++++++++++++++++ Firmware/RTK_Everywhere/menuMain.ino | 4 + Firmware/RTK_Everywhere/support.ino | 3 + 4 files changed, 114 insertions(+) create mode 100644 Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index 6ea0374d9..d7ab1297f 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1356,6 +1356,9 @@ void createSettingsString(char *newSettings) snprintf(tagText, sizeof(tagText), "correctionsPriority.%s", correctionsSourceNames[x]); stringRecord(newSettings, tagText, settings.correctionsSourcesPriority[x]); } + // Pass the number of correction sources, so we can check the priorities are contiguous from 0 to CORR_NUM, + // with no duplications / missing entries. + stringRecord(newSettings, "correctionsPriorityLen", correctionsSource::CORR_NUM); // stringRecord(newSettings, "", settings.); diff --git a/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino new file mode 100644 index 000000000..624d7ea26 --- /dev/null +++ b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino @@ -0,0 +1,104 @@ +// Set the baud rates for the radio and data ports +void menuCorrectionsPriorities() +{ + while (1) + { + systemPrintln(); + systemPrintln("Menu: Corrections Priorities"); + + systemPrintln(); + systemPrintln("These are the correction sources in order of decreasing priority"); + systemPrintln("Enter the lower case letter to decrease the correction priority"); + systemPrintln("Enter the upper case letter to increase the correction priority"); + systemPrintln(); + + char lower = 'a'; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + for (int y = 0; y < correctionsSource::CORR_NUM; y++) + { + if (settings.correctionsSourcesPriority[y] == x) + { + if (x < (correctionsSource::CORR_NUM - 1)) + systemPrintf("%c",lower); + else + systemPrint(" "); // Can't decrease the lowest + if (x > 0) + systemPrintf("%c",lower + 'A' - 'a'); + else + systemPrint(" "); // Can't increase the highest + systemPrint(") "); + systemPrintln(correctionsSourceNames[y]); + break; + } + } + lower += 1; + } + + systemPrintln(); + systemPrintln("x) Exit"); + + byte incoming = getUserInputCharacterNumber(); + + if ((incoming >= 'a') && (incoming < ('a' + correctionsSource::CORR_NUM - 1))) + { + // Decrease priority - swap the selected correction source with the next lowest + int makeMeLower; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + if (settings.correctionsSourcesPriority[x] == (int)(incoming - 'a')) + { + makeMeLower = x; + break; + } + } + int makeMeHigher; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + if (settings.correctionsSourcesPriority[x] == (int)(1 + incoming - 'a')) + { + makeMeHigher = x; + break; + } + } + settings.correctionsSourcesPriority[makeMeLower] += 1; + settings.correctionsSourcesPriority[makeMeHigher] -= 1; + } + else if ((incoming > 'A') && (incoming <= ('A' + correctionsSource::CORR_NUM - 1))) + { + // Increase priority - swap the selected correction source with the next highest + int makeMeHigher; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + if (settings.correctionsSourcesPriority[x] == (int)(incoming - 'A')) + { + makeMeHigher = x; + break; + } + } + int makeMeLower; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + if (settings.correctionsSourcesPriority[x] == (int)(incoming - ('A' + 1))) + { + makeMeLower = x; + break; + } + } + settings.correctionsSourcesPriority[makeMeLower] += 1; + settings.correctionsSourcesPriority[makeMeHigher] -= 1; + } + + else if (incoming == 'x') + break; + else if (incoming == INPUT_RESPONSE_GETCHARACTERNUMBER_EMPTY) + break; + else if (incoming == INPUT_RESPONSE_GETCHARACTERNUMBER_TIMEOUT) + break; + else + printUnknown(incoming); + } + + clearBuffer(); // Empty buffer of any newline chars +} + diff --git a/Firmware/RTK_Everywhere/menuMain.ino b/Firmware/RTK_Everywhere/menuMain.ino index 24cb521fe..99026af82 100644 --- a/Firmware/RTK_Everywhere/menuMain.ino +++ b/Firmware/RTK_Everywhere/menuMain.ino @@ -99,6 +99,8 @@ void menuMain() systemPrintln("f) Firmware upgrade"); + systemPrintln("i) Configure corrections priorities"); + #ifdef COMPILE_ETHERNET if (present.ethernet_ws5500 == true) systemPrintln("n) Configure NTP"); @@ -146,6 +148,8 @@ void menuMain() menuEthernet(); else if (incoming == 'f') menuFirmware(); + else if (incoming == 'i') + menuCorrectionsPriorities(); else if (incoming == 'n' && (present.ethernet_ws5500 == true)) menuNTP(); else if (incoming == 'p') diff --git a/Firmware/RTK_Everywhere/support.ino b/Firmware/RTK_Everywhere/support.ino index 8c7ae2f9f..55c3ddd6a 100644 --- a/Firmware/RTK_Everywhere/support.ino +++ b/Firmware/RTK_Everywhere/support.ino @@ -798,6 +798,9 @@ void verifyTables() pvtClientValidateTables(); pvtServerValidateTables(); tasksValidateTables(); + + if (correctionsSource::CORR_NUM >= (int)('x' - 'a')) + reportFatalError("Too many correction sources"); } // Display a prompt, then check the response against bounds. From d4e4172bfdb0aac248a95082fec4fa7e4edcea15 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 27 Mar 2024 07:52:29 +0000 Subject: [PATCH 070/112] Make correction priority menu easier to use --- .../menuCorrectionsPriorities.ino | 125 +++++++++++------- Firmware/RTK_Everywhere/menuMessages.ino | 9 -- 2 files changed, 78 insertions(+), 56 deletions(-) diff --git a/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino index 624d7ea26..0b3d07d43 100644 --- a/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino +++ b/Firmware/RTK_Everywhere/menuCorrectionsPriorities.ino @@ -1,6 +1,18 @@ -// Set the baud rates for the radio and data ports +// Set the priority of all correction sources +// Note: this sets the priority of all possible sources, not just the ones available / in use void menuCorrectionsPriorities() { + if (!validateCorrectionPriorities()) + { + systemPrintln(); + systemPrintln("Menu: Corrections Priorities"); + + systemPrintln(); + systemPrintln("Corrections priorities are invalid. Restoring the defaults"); + + initializeCorrectionPriorities(); + } + while (1) { systemPrintln(); @@ -12,27 +24,20 @@ void menuCorrectionsPriorities() systemPrintln("Enter the upper case letter to increase the correction priority"); systemPrintln(); - char lower = 'a'; + // Priority 0 is the highest for (int x = 0; x < correctionsSource::CORR_NUM; x++) { for (int y = 0; y < correctionsSource::CORR_NUM; y++) { if (settings.correctionsSourcesPriority[y] == x) { - if (x < (correctionsSource::CORR_NUM - 1)) - systemPrintf("%c",lower); - else - systemPrint(" "); // Can't decrease the lowest - if (x > 0) - systemPrintf("%c",lower + 'A' - 'a'); - else - systemPrint(" "); // Can't increase the highest - systemPrint(") "); - systemPrintln(correctionsSourceNames[y]); + char lower = 'a' + y; + char upper = 'A' + y; + systemPrintf("%c%c) %s",lower, upper, correctionsSourceNames[y]); + systemPrintln(); break; } } - lower += 1; } systemPrintln(); @@ -40,53 +45,43 @@ void menuCorrectionsPriorities() byte incoming = getUserInputCharacterNumber(); - if ((incoming >= 'a') && (incoming < ('a' + correctionsSource::CORR_NUM - 1))) + if ((incoming >= 'a') && (incoming < ('a' + correctionsSource::CORR_NUM))) { // Decrease priority - swap the selected correction source with the next lowest - int makeMeLower; - for (int x = 0; x < correctionsSource::CORR_NUM; x++) - { - if (settings.correctionsSourcesPriority[x] == (int)(incoming - 'a')) - { - makeMeLower = x; - break; - } - } - int makeMeHigher; - for (int x = 0; x < correctionsSource::CORR_NUM; x++) + // But only if not already the lowest priority + if (settings.correctionsSourcesPriority[(int)(incoming - 'a')] < (correctionsSource::CORR_NUM - 1)) { - if (settings.correctionsSourcesPriority[x] == (int)(1 + incoming - 'a')) + int makeMeHigher; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) { - makeMeHigher = x; - break; + if (settings.correctionsSourcesPriority[x] == settings.correctionsSourcesPriority[(int)(incoming - 'a')] + 1) + { + makeMeHigher = x; + break; + } } + settings.correctionsSourcesPriority[(int)(incoming - 'a')] += 1; // Decrease + settings.correctionsSourcesPriority[makeMeHigher] -= 1; // Increase } - settings.correctionsSourcesPriority[makeMeLower] += 1; - settings.correctionsSourcesPriority[makeMeHigher] -= 1; } - else if ((incoming > 'A') && (incoming <= ('A' + correctionsSource::CORR_NUM - 1))) + else if ((incoming >= 'A') && (incoming < ('A' + correctionsSource::CORR_NUM))) { // Increase priority - swap the selected correction source with the next highest - int makeMeHigher; - for (int x = 0; x < correctionsSource::CORR_NUM; x++) + // But only if not already priority 0 (highest) + if (settings.correctionsSourcesPriority[(int)(incoming - 'A')] > 0) { - if (settings.correctionsSourcesPriority[x] == (int)(incoming - 'A')) + int makeMeLower; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) { - makeMeHigher = x; - break; + if (settings.correctionsSourcesPriority[x] == settings.correctionsSourcesPriority[(int)(incoming - 'A')] - 1) + { + makeMeLower = x; + break; + } } + settings.correctionsSourcesPriority[(int)(incoming - 'A')] -= 1; // Increase + settings.correctionsSourcesPriority[makeMeLower] += 1; // Decrease } - int makeMeLower; - for (int x = 0; x < correctionsSource::CORR_NUM; x++) - { - if (settings.correctionsSourcesPriority[x] == (int)(incoming - ('A' + 1))) - { - makeMeLower = x; - break; - } - } - settings.correctionsSourcesPriority[makeMeLower] += 1; - settings.correctionsSourcesPriority[makeMeHigher] -= 1; } else if (incoming == 'x') @@ -102,3 +97,39 @@ void menuCorrectionsPriorities() clearBuffer(); // Empty buffer of any newline chars } +bool validateCorrectionPriorities() +{ + // Check priorities have been initialized + // TODO: this should probably be somewhere else. But not sure where...? + if (settings.correctionsSourcesPriority[0] == -1) + return false; + + // Validate correction priorities by checking each appears only once + int foundSources[correctionsSource::CORR_NUM]; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + foundSources[x] = 0; + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + { + for (int y = 0; y < correctionsSource::CORR_NUM; y++) + { + if (settings.correctionsSourcesPriority[y] == x) + { + foundSources[y]++; + break; + } + } + } + for (int x = 0; x < correctionsSource::CORR_NUM; x++) + if (foundSources[x] != 1) + return false; + return true; +} + +void initializeCorrectionPriorities() +{ + for (int s = 0; s < correctionsSource::CORR_NUM; s++) + settings.correctionsSourcesPriority[s] = s; +} + + + diff --git a/Firmware/RTK_Everywhere/menuMessages.ino b/Firmware/RTK_Everywhere/menuMessages.ino index 5076293dc..4b0a92707 100644 --- a/Firmware/RTK_Everywhere/menuMessages.ino +++ b/Firmware/RTK_Everywhere/menuMessages.ino @@ -752,15 +752,6 @@ void checkArrayDefaults() settings.um980MessageRatesRTCMBase[x] = umMessagesRTCM[x].msgDefaultRate; } - if (settings.correctionsSourcesPriority[0] == -1) // TODO: this should probably be somewhere else. But not sure where...? - { - defaultsApplied = true; - - for (int s = 0; s < correctionsSource::CORR_NUM; s++) - settings.correctionsSourcesPriority[s] = s; - } - - if (defaultsApplied == true) recordSystemSettings(); } From d4e64bbe19e96a04ae9461bfa5fee4aec558d2d8 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 27 Mar 2024 08:40:23 +0000 Subject: [PATCH 071/112] Update menuCommands.ino --- Firmware/RTK_Everywhere/menuCommands.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index d7ab1297f..cf6ab57e9 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -2546,6 +2546,7 @@ void printAvailableSettings() systemPrint("um980MeasurementRateMs,uint16_t,"); systemPrint("enableImuCompensationDebug,bool,"); + // TODO: Would correctionsPriority.Bluetooth,int, correctionsPriority.ESP-Now,int, etc. be more useful? systemPrintf("correctionsPriority,int[%d],", sizeof(settings.correctionsSourcesPriority) / sizeof(int)); systemPrintln(); From b0360177e9b70aad33d1c2566e0449e9e08606a1 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 27 Mar 2024 10:03:35 +0000 Subject: [PATCH 072/112] Starting to add WiFi Config support for corrections priorities --- Firmware/RTK_Everywhere/AP-Config/index.html | 42 +++++++++++++++++++ Firmware/RTK_Everywhere/AP-Config/src/main.js | 18 ++++++++ Firmware/RTK_Everywhere/Form.ino | 26 ++++++++++++ 3 files changed, 86 insertions(+) diff --git a/Firmware/RTK_Everywhere/AP-Config/index.html b/Firmware/RTK_Everywhere/AP-Config/index.html index 8c737ad1a..4b4bc67e7 100644 --- a/Firmware/RTK_Everywhere/AP-Config/index.html +++ b/Firmware/RTK_Everywhere/AP-Config/index.html @@ -1346,6 +1346,48 @@ + +
+ +
+ +
+
style="margin-top:5px;"> + +
+ + + + +
+ +
+
+ +
+ +
+ +
+ Corrections Source: +
+ +
+
+
+
+
+
+
-
-
style="margin-top:5px;"> +
+
-
- +
+ Corrections Source:
+
+

+
-
-
- -
- -
- -
- Corrections Source: -
+
+
-
-
-
+
+
+
diff --git a/Firmware/RTK_Everywhere/AP-Config/src/main.js b/Firmware/RTK_Everywhere/AP-Config/src/main.js index e30401725..2edfc2cbd 100644 --- a/Firmware/RTK_Everywhere/AP-Config/src/main.js +++ b/Firmware/RTK_Everywhere/AP-Config/src/main.js @@ -33,10 +33,10 @@ var numberOfFilesSelected = 0; var selectedFiles = ""; var showingFileList = false; var obtainedMessageList = false; -var obtainedCorrectionsList = false; var obtainedMessageListBase = false; var showingMessageRTCMList = false; var fileTableText = ""; +var correctionText = ""; var messageText = ""; var lastMessageType = ""; var lastMessageTypeBase = ""; @@ -93,7 +93,7 @@ function parseIncoming(msg) { document.title = "RTK " + platformPrefix + " Setup"; fullPageUpdate = true; - if (platformPrefix == "Facet L-Band") { + if (platformPrefix == "Facet v2") { show("baseConfig"); hide("sensorConfig"); show("ppConfig"); @@ -102,6 +102,24 @@ function parseIncoming(msg) { //hide("allowWiFiOverEthernetClient"); //For future expansion //hide("allowWiFiOverEthernetServer"); //For future expansion } + else if (platformPrefix == "Facet mosaic") { + show("baseConfig"); + hide("sensorConfig"); + show("ppConfig"); + hide("ethernetConfig"); + hide("ntpConfig"); + //hide("allowWiFiOverEthernetClient"); //For future expansion + //hide("allowWiFiOverEthernetServer"); //For future expansion + } + else if (platformPrefix == "EVK") { + show("baseConfig"); + hide("sensorConfig"); + show("ppConfig"); + show("ethernetConfig"); + show("ntpConfig"); + //hide("allowWiFiOverEthernetClient"); //For future expansion + //hide("allowWiFiOverEthernetServer"); //For future expansion + } } else if (id.includes("zedFirmwareVersionInt")) { //Must come above zedFirmwareVersion test @@ -231,10 +249,22 @@ function parseIncoming(msg) { messageText += "
"; messageText += ""; messageText += "
"; + messageText += " id='" + messageName + "' value='" + messageRate + "'>"; messageText += "

"; messageText += "
"; } + else if (id.includes("correctionsPriority")) { + var correctionName = id; + var correctionPriority = val; + var correctionData = correctionName.split('.'); + var correctionNameLabel = correctionData[1]; + + correctionText += "
"; + correctionText += ""; + correctionText += "
"; + correctionText += "
"; + } else if (id.includes("checkingNewFirmware")) { checkingNewFirmware(); } @@ -318,8 +348,8 @@ function parseIncoming(msg) { tcpBoxesEthernet(); dhcpEthernet(); updateLatLong(); + updateCorrectionsPriority(); } - } function hide(id) { @@ -427,6 +457,7 @@ function validateFields() { collapseSection("collapseSystemConfig", "systemCaret"); collapseSection("collapseEthernetConfig", "ethernetCaret"); collapseSection("collapseNTPConfig", "ntpCaret"); + collapseSection("collapseCorrectionsPriorityConfig", "correctionsCaret"); errorCount = 0; @@ -464,6 +495,9 @@ function validateFields() { checkMessageValue(messageName); } + //Check all corrections priorities + checkCorrectionsPriorities(); + //Base Config if (ge("baseTypeSurveyIn").checked) { checkElementValue("observationSeconds", 60, 600, "Must be between 60 to 600", "collapseBaseConfig"); @@ -645,6 +679,7 @@ function changeProfile() { collapseSection("collapseSystemConfig", "systemCaret"); collapseSection("collapseEthernetConfig", "ethernetCaret"); collapseSection("collapseNTPConfig", "ntpCaret"); + collapseSection("collapseCorrectionsPriorityConfig", "correctionsCaret"); } } @@ -751,6 +786,10 @@ function updateLatLong() { checkLatLong(); //Updates the detected format } +function updateCorrectionsPriority() { + ge("correctionsPriorityList").innerHTML = correctionText; +} + function checkElementValue(id, min, max, errorText, collapseID) { value = ge(id).value; if (value < min || value > max || value == "") { @@ -811,6 +850,36 @@ function checkCheckboxMutex(id1, id2, errorText, collapseID) { } } +function checkCorrectionsPriorities() { + var correctionsSources = document.querySelectorAll('input[id^=correctionsPriority]'); //match all ids starting with correctionsPriority + if (correctionsSources.length > 0) { + var correctionSeen[correctionsSources.length]; + for (let x = 0; x < correctionsSources.length; x++) { + correctionSeen[x] = 0; + } + for (let x = 0; x < correctionsSources.length; x++) { + for (let y = 0; y < correctionsSources.length; y++) { + if (correctionSources[y] == x) { + correctionSeen[y] = correctionSeen[y] + 1; + } + } + } + var sourcesValid = 1; + for (let x = 0; x < correctionsSources.length; x++) { + if (correctionSeen[x] != 1) { + sourcesValid = 0; + } + } + if (sourcesValid == 0) { + ge("collapseCorrectionsPriorityConfig" + 'Error').innerHTML = 'Error: priorities must be contiguous, starting at 0'; + ge("collapseCorrectionsPriorityConfig").classList.add('show'); + errorCount++; + } + else + clearError("collapseCorrectionsPriorityConfig"); + } +} + function clearElement(id, value) { ge(id).value = value; clearError(id); @@ -825,8 +894,15 @@ function zeroElement(id) { ge(id).value = 0; } -function zeroMessages() { +function resetToCorrectionsPriorityDefaults() { + var correctionsSources = document.querySelectorAll('input[id^=correctionsPriority]'); //match all ids starting with correctionsPriority + for (let x = 0; x < correctionsSources.length; x++) { + var correctionName = correctionsSources[x].id; + ge(correctionName).value = x; + } +} +function zeroMessages() { var ubxMessages = document.querySelectorAll('input[id^=UBX_]'); //match all ids starting with UBX_ for (let x = 0; x < ubxMessages.length; x++) { var messageName = ubxMessages[x].id; @@ -1369,23 +1445,6 @@ function getFileList() { } } -function getCorrectionsPriorities() { - if (obtainedCorrectionsList == false) { - obtainedCorrectionsList = true; - - ge("messageList").innerHTML = ""; - messageText = ""; - - xmlhttp = new XMLHttpRequest(); - xmlhttp.open("GET", "/listCorrections", false); - xmlhttp.send(); - - parseIncoming(xmlhttp.responseText); //Process CSV data into HTML - - ge("correctionsPriorityList").innerHTML += messageText; - } -} - function getMessageList() { if (obtainedMessageList == false) { obtainedMessageList = true; diff --git a/Firmware/RTK_Everywhere/Display.ino b/Firmware/RTK_Everywhere/Display.ino index d81a7372b..479f22712 100644 --- a/Firmware/RTK_Everywhere/Display.ino +++ b/Firmware/RTK_Everywhere/Display.ino @@ -2017,8 +2017,8 @@ void displayWiFiConfig() int yPos = WiFi_Symbol_Height + 2; int fontHeight = 8; - const int displayMaxCharacters = - 10; // Characters before pixels start getting cut off. 11 characters can cut off a few pixels. + // Characters before pixels start getting cut off. 11 characters can cut off a few pixels. + const int displayMaxCharacters = (present.display_type == DISPLAY_64x48) ? 10 : 21; printTextCenter("SSID:", yPos, QW_FONT_5X7, 1, false); // text, y, font type, kerning, inverted diff --git a/Firmware/RTK_Everywhere/Form.ino b/Firmware/RTK_Everywhere/Form.ino index 37e7bc250..70a7fd718 100644 --- a/Firmware/RTK_Everywhere/Form.ino +++ b/Firmware/RTK_Everywhere/Form.ino @@ -308,14 +308,16 @@ bool startWebServer(bool startWiFi = true, int httpPort = 80) request->send(200, "text/plain", files); }); + /* // Handler for corrections priorities list webserver->on("/listCorrections", HTTP_GET, [](AsyncWebServerRequest *request) { String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url(); systemPrintln(logmessage); - String messages; - createCorrectionsList(messages); - request->send(200, "text/plain", messages); + String corrections; + createCorrectionsList(corrections); + request->send(200, "text/plain", corrections); }); + */ // Handler for supported messages list webserver->on("/listMessages", HTTP_GET, [](AsyncWebServerRequest *request) { @@ -799,6 +801,7 @@ void getFileList(String &returnText) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } +/* // When called, responds with the corrections sources and their priorities // Source name and priority are formatted in CSV, formatted to html by JS void createCorrectionsList(String &returnText) @@ -807,13 +810,15 @@ void createCorrectionsList(String &returnText) for (int s = 0; s < correctionsSource::CORR_NUM; s++) { - returnText += String(correctionsSourceNames[s]) + "," + + returnText += String("correctionsPriority.") + + String(correctionsSourceNames[s]) + "," + String(settings.correctionsSourcesPriority[s]) + ","; } if (settings.debugWiFiConfig == true) systemPrintf("returnText (%d bytes): %s\r\n", returnText.length(), returnText.c_str()); } +*/ // When called, responds with the messages supported on this platform // Message name and current rate are formatted in CSV, formatted to html by JS diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 33ce39803..77668e870 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,747 +26,781 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x06, 0xFF, 0x65, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, - 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0x92, 0xE8, 0xFF, - 0x3C, 0x05, 0x46, 0xDB, 0xA7, 0x25, 0x4D, 0x64, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, 0x1E, 0xDF, - 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x3D, 0x39, 0x5E, 0x5A, 0x84, 0x65, 0x4E, - 0x24, 0x52, 0x87, 0xA4, 0x7C, 0xE9, 0xDE, 0xBC, 0xD3, 0x3E, 0xC3, 0x3E, 0xD9, 0xA9, 0xC2, 0x85, - 0x04, 0x40, 0xF0, 0x22, 0x59, 0x4E, 0x67, 0xFA, 0x8C, 0xBF, 0x99, 0xB4, 0x4D, 0x00, 0x55, 0x85, - 0x42, 0xA1, 0x50, 0x28, 0x14, 0x0A, 0x37, 0x6E, 0x44, 0x46, 0x6E, 0x42, 0x6F, 0xDD, 0x7B, 0xB2, - 0x4D, 0xFE, 0xF3, 0x36, 0x7E, 0xB9, 0xBA, 0xFA, 0xC3, 0xEF, 0xB7, 0x7E, 0xE0, 0x85, 0xB7, 0xDD, - 0x71, 0x38, 0x74, 0x13, 0x3F, 0x0C, 0xBA, 0xD7, 0x61, 0x9C, 0x04, 0xEE, 0x84, 0x7E, 0x5D, 0xBD, - 0x8D, 0xFF, 0x73, 0xEB, 0xC9, 0x0D, 0x34, 0xBA, 0xA5, 0x97, 0x71, 0x38, 0xFC, 0x42, 0x93, 0xAD, - 0x27, 0x4F, 0x44, 0x75, 0xD7, 0xF3, 0x0E, 0x6F, 0x68, 0x90, 0xBC, 0xF3, 0xE3, 0x84, 0x06, 0x34, - 0x6A, 0x35, 0xC7, 0xA1, 0xEB, 0x35, 0x3B, 0x24, 0x0C, 0xDE, 0xC1, 0x2F, 0x6D, 0xA8, 0x79, 0x35, - 0x0B, 0x86, 0x08, 0x51, 0x7C, 0x6A, 0x51, 0xAC, 0xDF, 0x26, 0xBF, 0x3F, 0x21, 0xF0, 0xE3, 0x07, - 0x7E, 0xF2, 0x33, 0xBD, 0x1C, 0x30, 0xB0, 0x2D, 0xA8, 0xFE, 0x55, 0x69, 0x60, 0x14, 0x8A, 0x26, - 0x29, 0x15, 0x40, 0x7C, 0x40, 0x6F, 0x49, 0x56, 0x43, 0x74, 0x0A, 0xA0, 0x68, 0xF5, 0xBA, 0x61, - 0x30, 0xA1, 0x71, 0xEC, 0x8E, 0x28, 0xB4, 0x48, 0x81, 0xB7, 0x26, 0xF1, 0x48, 0x82, 0xC4, 0x9F, - 0xA9, 0x1B, 0xC5, 0xF4, 0x28, 0x18, 0x86, 0x13, 0x3F, 0x18, 0x61, 0x61, 0xD7, 0x73, 0x13, 0x57, - 0xC0, 0xFA, 0xAA, 0x13, 0x36, 0xA2, 0x2D, 0x2A, 0xDB, 0x46, 0x34, 0x99, 0x45, 0x01, 0xF1, 0xC2, - 0xE1, 0x6C, 0x02, 0x1D, 0xEB, 0x8E, 0x68, 0x72, 0x38, 0xA6, 0xF8, 0xEB, 0xDE, 0xFD, 0x11, 0xF4, - 0x96, 0xF7, 0x09, 0xD9, 0x77, 0xE5, 0xDF, 0x51, 0xEF, 0x9D, 0x8B, 0x74, 0x3B, 0x5B, 0xCA, 0x97, - 0x30, 0x18, 0x65, 0x9F, 0xA6, 0x63, 0x37, 0xB9, 0x0A, 0xA3, 0xC9, 0x69, 0x44, 0xA1, 0x14, 0xBE, - 0x37, 0x1A, 0xBC, 0x60, 0x44, 0x43, 0x8F, 0x26, 0xFE, 0x90, 0x03, 0x58, 0x77, 0xBA, 0x4E, 0xCF, - 0x28, 0x00, 0xC2, 0xB6, 0xC9, 0x4A, 0xCF, 0xD9, 0xE8, 0xF6, 0x5E, 0xE8, 0x45, 0xBB, 0x63, 0x6C, - 0xD3, 0xDB, 0x70, 0x9C, 0xAE, 0x68, 0x44, 0x87, 0xF4, 0xEA, 0x17, 0x56, 0xBD, 0xFF, 0xDC, 0xE9, - 0x3B, 0x9B, 0xDD, 0x8D, 0xCD, 0xE7, 0x59, 0xC9, 0x47, 0x2C, 0x59, 0x7F, 0xD6, 0xDB, 0x7C, 0xEE, - 0xAC, 0x77, 0xD7, 0x9D, 0xB5, 0xAC, 0xE4, 0x13, 0xC3, 0xFD, 0x7C, 0x73, 0x73, 0x73, 0xA3, 0xBB, - 0xFE, 0x7C, 0x9D, 0x17, 0x8C, 0xDD, 0x38, 0x79, 0xED, 0x8F, 0xE9, 0x09, 0x88, 0x8B, 0x42, 0xF1, - 0x15, 0x7E, 0x9A, 0x4D, 0x2E, 0x69, 0x94, 0x75, 0x2F, 0x60, 0x7F, 0xBF, 0xBF, 0xC2, 0xEA, 0xF1, - 0x80, 0x8E, 0xE9, 0x30, 0xA1, 0x5E, 0x56, 0x1C, 0x8B, 0x2F, 0xAC, 0x58, 0x01, 0x15, 0x5F, 0x87, - 0x20, 0x70, 0x23, 0xFC, 0x8C, 0x92, 0x86, 0xE3, 0xE8, 0x8E, 0x63, 0xCA, 0x0B, 0xC3, 0xCB, 0xC4, - 0xF5, 0x03, 0xEA, 0x1D, 0xF3, 0x41, 0xAE, 0x55, 0x61, 0xCF, 0x8D, 0xA9, 0x5E, 0x49, 0xA0, 0x10, - 0x75, 0xCE, 0xCE, 0xF7, 0x8F, 0xF3, 0x80, 0xB0, 0x47, 0xE7, 0xEE, 0x25, 0xFC, 0x43, 0xEF, 0x12, - 0x85, 0x3C, 0x21, 0x5E, 0xC6, 0x57, 0x64, 0x8B, 0x00, 0x77, 0x7E, 0x3F, 0xA5, 0xC5, 0x25, 0x82, - 0x18, 0x2C, 0x65, 0xC5, 0x11, 0x1D, 0x86, 0x91, 0x17, 0x1F, 0xEE, 0x1F, 0xBE, 0x86, 0xCF, 0xBF, - 0x7E, 0xDE, 0x52, 0xBF, 0xBE, 0x11, 0x63, 0xAA, 0x94, 0x5C, 0xCD, 0xC6, 0xE3, 0x53, 0x80, 0xF5, - 0x61, 0x0A, 0x22, 0xAB, 0x74, 0x4B, 0x34, 0x8B, 0x69, 0x72, 0xEE, 0x4F, 0x68, 0x38, 0x4B, 0x24, - 0x93, 0x03, 0xEF, 0x00, 0x64, 0x5B, 0xFB, 0x38, 0xBC, 0xA6, 0xC3, 0x2F, 0x27, 0xF4, 0xF6, 0xB5, - 0x1F, 0x4D, 0x6E, 0xDD, 0x88, 0x6A, 0x85, 0x20, 0xD3, 0xB6, 0xA2, 0x27, 0xC3, 0x30, 0x00, 0x16, - 0xED, 0x87, 0x40, 0x97, 0x1F, 0x00, 0x6A, 0xEC, 0x0C, 0x0E, 0x1B, 0x9F, 0x19, 0xFB, 0xEF, 0xDF, - 0x9F, 0x1D, 0x1C, 0x9D, 0xEC, 0x9E, 0x1F, 0x5E, 0x1C, 0x9D, 0x9C, 0x7E, 0x38, 0xBF, 0x38, 0xFF, - 0x78, 0x7A, 0x78, 0x71, 0x70, 0xF0, 0x92, 0x38, 0x1D, 0xB2, 0xBA, 0x7A, 0x40, 0xAF, 0xDC, 0x19, - 0x08, 0xE6, 0xC1, 0x41, 0xD7, 0x93, 0x3F, 0xA5, 0xED, 0x8E, 0x8F, 0x5F, 0x92, 0x1E, 0x6B, 0x09, - 0xBF, 0x76, 0x27, 0xF8, 0x53, 0x5A, 0xFF, 0x02, 0x1B, 0xF4, 0x79, 0x03, 0x52, 0xB7, 0xC5, 0xC5, - 0xC1, 0xEE, 0xE0, 0xED, 0x4B, 0xB2, 0xC6, 0x9B, 0xAD, 0xD4, 0x6E, 0x36, 0xF8, 0x78, 0xBC, 0xF7, - 0xFE, 0xDD, 0x4B, 0xB2, 0xCE, 0x1B, 0xFE, 0xCF, 0x7F, 0xCB, 0x96, 0x93, 0x49, 0xB3, 0xA2, 0x57, - 0x83, 0xC1, 0x4B, 0xB2, 0x91, 0x92, 0x49, 0x06, 0x83, 0x6E, 0xCC, 0x7E, 0xAA, 0x71, 0x42, 0xC3, - 0xCD, 0xC5, 0x1A, 0x8A, 0x6E, 0x3E, 0x4B, 0xBB, 0xB9, 0x32, 0x57, 0x6B, 0xD9, 0xDB, 0xE7, 0x59, - 0x6F, 0x9B, 0x29, 0x80, 0x46, 0x65, 0x7F, 0x2F, 0x4E, 0xDE, 0x5F, 0x1C, 0x1C, 0xEE, 0x1F, 0x1D, - 0xEF, 0x02, 0x8C, 0x17, 0x72, 0x48, 0x07, 0x03, 0xB2, 0x42, 0x4E, 0x42, 0xE2, 0xD1, 0xA1, 0x3F, - 0x71, 0xC7, 0x75, 0xE8, 0x50, 0xE1, 0xF4, 0x1C, 0x95, 0x15, 0x73, 0x83, 0x42, 0x86, 0xE8, 0xF0, - 0x7A, 0x2A, 0x73, 0xEA, 0xC2, 0x3B, 0x3A, 0xF9, 0x69, 0xF7, 0xDD, 0xD1, 0xC1, 0xC5, 0x87, 0x93, - 0xBF, 0x9D, 0xBC, 0xFF, 0xF9, 0x04, 0xC0, 0xF4, 0x3B, 0x72, 0x01, 0x80, 0xE9, 0x72, 0x43, 0x23, - 0x50, 0x6F, 0xD9, 0x8C, 0x41, 0xD5, 0xD7, 0x15, 0xCA, 0x6F, 0x98, 0x7E, 0x3D, 0x0A, 0xA6, 0xB3, - 0x44, 0xE8, 0x0C, 0x63, 0x76, 0x75, 0x8B, 0xBA, 0xA1, 0xAE, 0xB4, 0xB9, 0xB5, 0x4C, 0x2E, 0x56, - 0xAB, 0xAB, 0x38, 0x65, 0xC3, 0x31, 0x85, 0x75, 0x7E, 0xD4, 0x6A, 0xF8, 0xA2, 0x8A, 0x54, 0x60, - 0x2F, 0x49, 0x83, 0x3C, 0x25, 0x58, 0x1F, 0xA0, 0x61, 0x7D, 0x24, 0x0B, 0x97, 0x41, 0xA0, 0x03, - 0x57, 0xC4, 0x78, 0x3A, 0xF6, 0x93, 0x56, 0xB3, 0xD3, 0x14, 0xCB, 0x22, 0x2C, 0x54, 0xA4, 0x35, - 0x86, 0x95, 0xF8, 0x8E, 0xA9, 0x70, 0xF8, 0xCF, 0x2B, 0x56, 0xBD, 0x3B, 0xA6, 0xC1, 0x28, 0xB9, - 0x06, 0x9E, 0xF5, 0xF0, 0xE3, 0xD3, 0x6D, 0xD2, 0x57, 0x97, 0x5A, 0x84, 0xEA, 0xA3, 0xD6, 0xC7, - 0xBA, 0xBF, 0xDE, 0x7D, 0xDE, 0xD2, 0x4A, 0x6E, 0xDC, 0x71, 0x5A, 0x04, 0xD4, 0xF4, 0x94, 0x62, - 0x93, 0x7C, 0x8F, 0x13, 0x0C, 0xB0, 0x9E, 0x92, 0x46, 0x07, 0x5B, 0xF2, 0x0F, 0xF0, 0x8B, 0xEC, - 0x01, 0x6F, 0x36, 0x98, 0xC2, 0xC0, 0x01, 0x5C, 0xE8, 0xEE, 0xC4, 0x0D, 0xBC, 0x38, 0x2D, 0xF2, - 0xAF, 0x48, 0xCB, 0xF7, 0xBA, 0xC0, 0x88, 0xF1, 0xCC, 0xA3, 0x71, 0xAB, 0x11, 0x7B, 0xC7, 0xE1, - 0x2C, 0x80, 0x31, 0x6A, 0xB4, 0x55, 0x92, 0x39, 0x98, 0x73, 0x5C, 0xE9, 0xC3, 0x60, 0x35, 0xBC, - 0xBA, 0x22, 0x83, 0x03, 0x02, 0xBA, 0xD0, 0xD5, 0x6A, 0x20, 0x34, 0x46, 0x3E, 0x28, 0x73, 0xA6, - 0x83, 0x1B, 0x26, 0x0C, 0xFC, 0xB9, 0xF6, 0x3D, 0xDA, 0x6A, 0xE0, 0x5A, 0x72, 0xEC, 0x06, 0xC0, - 0xF5, 0xA8, 0xD1, 0xDE, 0xD2, 0x2A, 0x7D, 0xD5, 0xFE, 0xA2, 0x00, 0x47, 0x83, 0x9C, 0x44, 0x33, - 0x3B, 0x60, 0x5C, 0xC2, 0x6A, 0x02, 0xCE, 0x7E, 0x4B, 0xC1, 0xE3, 0x88, 0x00, 0x74, 0xDD, 0x00, - 0xC9, 0xE1, 0xC9, 0xD9, 0x27, 0x40, 0x95, 0x8E, 0x24, 0xB5, 0x84, 0x12, 0x3F, 0x19, 0xB3, 0x75, - 0xED, 0xEC, 0xFC, 0x6F, 0x6C, 0x58, 0x8C, 0xB6, 0x30, 0x66, 0x64, 0x00, 0xD6, 0xD3, 0xB4, 0xA1, - 0x03, 0xC8, 0x2D, 0x67, 0xD8, 0x61, 0x65, 0x38, 0x25, 0xA7, 0x4D, 0x52, 0x00, 0xD3, 0x6B, 0x77, - 0x08, 0xD2, 0xF8, 0x6E, 0x65, 0x0F, 0x06, 0xB9, 0x84, 0x45, 0x97, 0xB0, 0xE0, 0xEE, 0x87, 0xC1, - 0x95, 0x3F, 0x32, 0x39, 0x94, 0x8D, 0x0F, 0xAC, 0x92, 0x71, 0x18, 0x15, 0xD7, 0xE2, 0x90, 0xA6, - 0xD3, 0x2A, 0x38, 0x34, 0xB9, 0xA6, 0x51, 0x40, 0x93, 0xAA, 0x7A, 0x41, 0x52, 0x02, 0x6A, 0x75, - 0x95, 0x57, 0x72, 0xC7, 0xE3, 0xF0, 0xF6, 0x67, 0xFF, 0xB5, 0xFF, 0x1E, 0x14, 0xC9, 0xA1, 0x84, - 0x3C, 0xF6, 0x81, 0xDD, 0xD0, 0x0C, 0xAA, 0xBD, 0x0E, 0xD1, 0x1C, 0x00, 0x8B, 0x94, 0x12, 0x7A, - 0x37, 0x75, 0x83, 0x18, 0xD4, 0xC1, 0x7C, 0xD0, 0x06, 0x34, 0xBA, 0x61, 0x92, 0x53, 0x07, 0x5A, - 0x85, 0x40, 0x29, 0xF3, 0xEA, 0x37, 0x34, 0xEA, 0xB8, 0xFD, 0xF0, 0x13, 0x8D, 0x10, 0xD0, 0x11, - 0xD2, 0x9C, 0x9F, 0x63, 0xC7, 0x33, 0x30, 0x29, 0x60, 0x9E, 0x52, 0xE2, 0x5E, 0x86, 0x37, 0x94, - 0xE4, 0x1B, 0x92, 0x84, 0xC6, 0x89, 0xD9, 0x2A, 0xF4, 0xFC, 0xAB, 0x7B, 0x30, 0x6D, 0x92, 0x04, - 0xF4, 0x59, 0x4C, 0xBC, 0x19, 0x25, 0x49, 0x08, 0x06, 0x1B, 0x6F, 0x49, 0xC6, 0xFE, 0xC4, 0x4F, - 0xD8, 0xC6, 0x26, 0xB6, 0xCE, 0xD8, 0x1D, 0x30, 0x8F, 0xFB, 0x3D, 0xAB, 0xC4, 0x30, 0x93, 0x14, - 0xA4, 0x10, 0x8C, 0xFE, 0x86, 0x77, 0x0F, 0x5B, 0x22, 0x7F, 0x08, 0xD8, 0xE8, 0xD8, 0x36, 0x4E, - 0xA8, 0x0B, 0x61, 0x4F, 0xF2, 0x7E, 0xCA, 0xD4, 0x30, 0xDF, 0x9F, 0xF0, 0x3F, 0x5A, 0xCD, 0xE3, - 0xF0, 0x96, 0x46, 0xB0, 0x33, 0x6A, 0xF6, 0x7A, 0x4D, 0x9B, 0x3C, 0x31, 0x3C, 0xB8, 0xA1, 0x6A, - 0xA5, 0x10, 0x3A, 0x64, 0x16, 0x78, 0x20, 0xDC, 0x60, 0xBB, 0x5A, 0x5A, 0x14, 0x21, 0x3A, 0x5C, - 0x19, 0xC0, 0x52, 0x92, 0x08, 0x64, 0xFD, 0x87, 0x23, 0xB3, 0x8D, 0x32, 0xE8, 0xD4, 0x24, 0x62, - 0xAC, 0x1E, 0xE1, 0xBE, 0xCF, 0x45, 0x33, 0xFE, 0xF2, 0x9E, 0xE0, 0x54, 0x9F, 0xC1, 0xB6, 0xAD, - 0x42, 0x1A, 0x62, 0xEF, 0x75, 0x44, 0xE9, 0x60, 0x0A, 0xD3, 0xB5, 0xD1, 0xD6, 0x70, 0xFD, 0xD7, - 0x7F, 0x11, 0xA3, 0xE6, 0xC0, 0xFF, 0xAD, 0xAA, 0xD2, 0xB5, 0x1B, 0x79, 0x38, 0xCC, 0x47, 0x07, - 0x15, 0x15, 0xF3, 0xC2, 0x54, 0xD1, 0xC0, 0x73, 0xEF, 0xE3, 0x33, 0x3A, 0x81, 0xED, 0x03, 0xF4, - 0xB5, 0xA2, 0xEE, 0x34, 0x0A, 0x51, 0xF7, 0x3A, 0xB8, 0x0D, 0xAA, 0x57, 0xB5, 0x57, 0xBF, 0x6A, - 0xBF, 0x7E, 0xD5, 0xB5, 0xFA, 0x55, 0xD7, 0xEB, 0x57, 0xDD, 0xA8, 0x5F, 0x75, 0xB3, 0x7E, 0xD5, - 0x67, 0x35, 0xAA, 0x46, 0xAE, 0xE7, 0x87, 0xC7, 0xBB, 0xFB, 0x55, 0x43, 0x45, 0x6F, 0xFC, 0x21, - 0xDD, 0x3B, 0xAF, 0x14, 0x02, 0xB0, 0x1D, 0xE4, 0x6E, 0xB5, 0xA2, 0xE6, 0xA5, 0x9B, 0xC0, 0x34, - 0xBA, 0x3F, 0xA5, 0xD1, 0x90, 0x69, 0xD8, 0xB4, 0xB2, 0xA9, 0x28, 0x40, 0x37, 0xF8, 0x5E, 0x1B, - 0x5A, 0xC2, 0x54, 0x78, 0x7B, 0x7E, 0xFC, 0xCE, 0x5C, 0x17, 0xAB, 0xB4, 0x63, 0x94, 0x7C, 0xC9, - 0xC9, 0xA5, 0x05, 0x87, 0xB5, 0x5E, 0x31, 0xD6, 0xE2, 0x56, 0x1F, 0xA6, 0x23, 0xE0, 0x2A, 0x6D, - 0x3C, 0x80, 0xE4, 0x21, 0x2E, 0x56, 0xD1, 0xE4, 0x0C, 0xB7, 0x97, 0x79, 0x62, 0xD9, 0xAE, 0x73, - 0x3F, 0x9C, 0x4C, 0x41, 0x23, 0xD2, 0x56, 0x7B, 0x6E, 0xB0, 0xB8, 0x3F, 0x3D, 0xA3, 0x43, 0xEA, - 0x4F, 0x2D, 0xC0, 0xF3, 0x75, 0x74, 0x0C, 0x15, 0x28, 0x84, 0xE8, 0x71, 0xD7, 0x84, 0x05, 0xFA, - 0x2C, 0x8A, 0x60, 0xB4, 0x4F, 0xD5, 0x5A, 0x36, 0xCE, 0xFE, 0x80, 0xF6, 0x33, 0xD8, 0xE9, 0xBF, - 0xA2, 0x97, 0x6C, 0x5B, 0x00, 0x3D, 0x43, 0x59, 0xFD, 0xFC, 0x2B, 0x54, 0x9E, 0xD1, 0x6D, 0xB4, - 0x79, 0xAC, 0xD0, 0xC0, 0xF2, 0xF9, 0x0C, 0xBC, 0x87, 0x36, 0xD3, 0x56, 0x93, 0xED, 0xBC, 0x29, - 0xFA, 0xCC, 0xD0, 0xCE, 0x99, 0x83, 0x55, 0x72, 0x71, 0xFB, 0x30, 0x45, 0x9F, 0x9B, 0x64, 0x76, - 0xBE, 0x43, 0xF6, 0x7A, 0xAD, 0x85, 0x31, 0x0D, 0x60, 0x21, 0x9D, 0xC5, 0x55, 0x78, 0x78, 0xAD, - 0x16, 0x37, 0xC5, 0xEB, 0x22, 0x52, 0x9C, 0x5C, 0xB6, 0x09, 0xA0, 0x7A, 0xC0, 0x6C, 0x92, 0xFE, - 0xA0, 0x39, 0xA8, 0xF8, 0xD1, 0x4A, 0x70, 0xB3, 0xD5, 0xF6, 0xD1, 0x70, 0xEF, 0x8E, 0x4B, 0xFA, - 0xCD, 0xBD, 0x78, 0x4B, 0xC7, 0xCD, 0x5C, 0x81, 0x79, 0xAC, 0xD2, 0x43, 0xF8, 0x28, 0xF8, 0x3E, - 0xDA, 0xF1, 0x7D, 0x7C, 0x2C, 0x7C, 0x9F, 0xEC, 0xF8, 0x3E, 0x3D, 0x0A, 0xBE, 0x78, 0x1A, 0x84, - 0xB7, 0xA7, 0x94, 0xC2, 0xE6, 0x61, 0x66, 0xB3, 0x71, 0x53, 0x9B, 0x93, 0x38, 0xED, 0x9C, 0x65, - 0x86, 0xFA, 0x7A, 0x0A, 0x6D, 0x61, 0xBD, 0x8B, 0x0D, 0xF5, 0xDC, 0x68, 0xD4, 0x27, 0x42, 0x80, - 0xB0, 0xAF, 0x22, 0x56, 0xF8, 0x4F, 0x59, 0x37, 0x51, 0x35, 0xBD, 0xBA, 0x8C, 0x76, 0xE6, 0x40, - 0x15, 0x73, 0xBB, 0x1A, 0xBD, 0x95, 0xB6, 0x75, 0x20, 0x75, 0x65, 0x76, 0xA7, 0xB3, 0xF8, 0x7A, - 0x4E, 0x7D, 0x20, 0x60, 0x4B, 0x9F, 0x67, 0x21, 0x7C, 0x59, 0x61, 0x11, 0x1C, 0x57, 0x13, 0x6E, - 0x09, 0x98, 0xA0, 0x0D, 0xAF, 0xF6, 0x5C, 0x32, 0x70, 0x35, 0xE1, 0x56, 0x6B, 0x5E, 0x45, 0xAA, - 0x0E, 0x64, 0x60, 0x79, 0xE3, 0x55, 0x12, 0x11, 0x77, 0xEC, 0x8F, 0x82, 0xED, 0xE6, 0x98, 0x5E, - 0x25, 0xCD, 0x1D, 0x73, 0x33, 0x6C, 0x69, 0xE1, 0xED, 0xE0, 0xCA, 0xA2, 0xD1, 0x87, 0xC3, 0xB6, - 0x8A, 0x05, 0x75, 0x5B, 0xCB, 0xB1, 0xAE, 0xDD, 0xE8, 0x15, 0x5B, 0xEC, 0x48, 0x72, 0x3F, 0xA5, - 0xDB, 0x7C, 0xCD, 0xBA, 0x0C, 0xEF, 0x9A, 0x60, 0x2F, 0x6D, 0x37, 0x6D, 0xD4, 0x34, 0x09, 0x5B, - 0x16, 0x9B, 0x08, 0xEC, 0xE8, 0xA0, 0x49, 0x86, 0x50, 0x21, 0x86, 0x3F, 0x61, 0xBF, 0xBE, 0xC2, - 0x5A, 0xAF, 0x70, 0x78, 0x8A, 0xB7, 0x62, 0x1F, 0x3F, 0x37, 0x77, 0x6A, 0x92, 0xB4, 0x9A, 0xCC, - 0x25, 0xA5, 0x30, 0xCA, 0xD0, 0x34, 0x3F, 0x22, 0xE8, 0x0C, 0x47, 0xBA, 0xE7, 0x59, 0x0E, 0x3F, - 0xEC, 0xFD, 0x72, 0x91, 0x87, 0xA4, 0x1C, 0x04, 0x08, 0x91, 0xF1, 0xBD, 0xAD, 0xA2, 0x1A, 0x67, - 0xDC, 0xB3, 0x91, 0x53, 0x3E, 0x06, 0x90, 0x77, 0xEE, 0x25, 0x1D, 0xCB, 0xA3, 0x81, 0x82, 0x7A, - 0x07, 0xC2, 0x3F, 0x97, 0xB5, 0x92, 0x7E, 0xBA, 0x0B, 0x73, 0xEB, 0x87, 0x3D, 0x51, 0x5A, 0x49, - 0x37, 0x1D, 0x6C, 0x7E, 0xD7, 0x6C, 0x5B, 0x5F, 0xF5, 0x68, 0x83, 0x3B, 0x23, 0x95, 0xC6, 0xBF, - 0xF6, 0x3E, 0xA3, 0x8B, 0x00, 0x79, 0x81, 0x87, 0x25, 0x17, 0x3D, 0xE7, 0xD9, 0x3A, 0xD4, 0xC0, - 0xDF, 0x73, 0x80, 0x10, 0xAF, 0x79, 0x1A, 0xF2, 0x97, 0x6D, 0x15, 0xB6, 0x0D, 0xBD, 0x9C, 0x84, - 0xC7, 0x36, 0x12, 0xF0, 0xAF, 0x2D, 0x6B, 0x13, 0xF5, 0x30, 0x86, 0x49, 0xCA, 0x75, 0x64, 0x8A, - 0x93, 0x61, 0x26, 0x1A, 0x2D, 0x55, 0xC6, 0xEB, 0x1D, 0x46, 0xC1, 0xBE, 0x60, 0x2E, 0x52, 0xE5, - 0x73, 0x9F, 0xF1, 0x21, 0xE5, 0x81, 0xB5, 0xF3, 0x16, 0xA6, 0x6F, 0x6F, 0x93, 0xF5, 0xA2, 0x5E, - 0x2F, 0x4A, 0x88, 0xF5, 0xF3, 0x5A, 0x46, 0xDF, 0xBA, 0xF3, 0xAC, 0x7F, 0xD1, 0xAB, 0xC3, 0x0A, - 0x68, 0x40, 0x27, 0xE8, 0x7E, 0x61, 0x67, 0x53, 0xD0, 0x85, 0x98, 0xD2, 0x60, 0x0E, 0x86, 0xA5, - 0x9F, 0xA4, 0x2C, 0x22, 0x9C, 0x66, 0xBB, 0xFB, 0x8F, 0xD0, 0x0F, 0x5A, 0xCD, 0x66, 0x3B, 0x27, - 0x3A, 0x58, 0xFE, 0xA4, 0x84, 0xA8, 0xDC, 0xA8, 0x7A, 0xFE, 0x8D, 0xA6, 0x54, 0x46, 0x51, 0x38, - 0x9B, 0x92, 0x28, 0xBC, 0xE5, 0x3A, 0x69, 0x12, 0x8F, 0x14, 0x46, 0xA4, 0x5A, 0xC9, 0x94, 0x84, - 0x1C, 0xD8, 0x31, 0xEB, 0x07, 0x40, 0xE4, 0x6A, 0xCD, 0x6C, 0x2F, 0x51, 0x0E, 0xC3, 0xF1, 0x4A, - 0x3C, 0x59, 0x59, 0x27, 0xF8, 0xCB, 0x26, 0xFB, 0x97, 0x51, 0xC1, 0x9A, 0x37, 0x77, 0x8C, 0xA6, - 0x9C, 0x39, 0xD0, 0xFE, 0xE5, 0xAB, 0x55, 0x56, 0xA3, 0x92, 0x0C, 0xA5, 0x77, 0x1A, 0xAA, 0xF5, - 0xA6, 0xAE, 0x88, 0xF9, 0x79, 0xAA, 0xA1, 0x5E, 0xC3, 0x20, 0x89, 0xC2, 0x71, 0xB3, 0x02, 0x87, - 0xD4, 0xDC, 0xB9, 0x2E, 0xF2, 0xCD, 0x8B, 0x5A, 0xC6, 0xB4, 0x55, 0x2D, 0xF6, 0x4D, 0x49, 0x01, - 0xD8, 0xC3, 0x28, 0x0A, 0x33, 0x3A, 0xFD, 0x60, 0xEC, 0x07, 0x94, 0x7F, 0x03, 0x85, 0x3F, 0xAD, - 0x84, 0xBB, 0x0A, 0x0C, 0xD9, 0xE1, 0xFF, 0xCE, 0xA1, 0xF4, 0xD9, 0x42, 0xE3, 0x07, 0x23, 0xE5, - 0xF0, 0xD2, 0xB2, 0xDF, 0xCB, 0x57, 0x9A, 0x67, 0x31, 0x08, 0xB2, 0x66, 0x85, 0x5B, 0xF7, 0x7C, - 0x9D, 0xB9, 0xF7, 0x45, 0xCC, 0xAF, 0x59, 0xDA, 0x8F, 0x7C, 0x9D, 0x79, 0xBA, 0x11, 0x26, 0xAE, - 0x6C, 0x56, 0xB4, 0xBF, 0xCB, 0x55, 0x99, 0xB3, 0x13, 0xC2, 0x9B, 0x72, 0x04, 0xF2, 0x99, 0xF9, - 0x5F, 0x6C, 0xF6, 0xA9, 0xB5, 0x62, 0x37, 0x8E, 0x86, 0xF3, 0xFB, 0x28, 0x72, 0x27, 0x6A, 0x36, - 0x6F, 0x82, 0xED, 0xD8, 0x6D, 0x3E, 0x73, 0x4F, 0x44, 0x76, 0xD8, 0x0C, 0xBE, 0x34, 0xE6, 0x63, - 0x01, 0x88, 0x21, 0xFA, 0x1C, 0xED, 0x20, 0x79, 0xD0, 0x88, 0x01, 0x53, 0xF1, 0xCE, 0x32, 0x63, - 0x8A, 0x80, 0x89, 0x46, 0x63, 0xB2, 0x4A, 0x98, 0x0B, 0x8D, 0x5C, 0xCE, 0x92, 0x44, 0x75, 0x80, - 0xD7, 0x3B, 0x59, 0x4A, 0xA2, 0x7B, 0xCB, 0x32, 0x25, 0x76, 0x49, 0xC2, 0x79, 0x91, 0x1E, 0xD2, - 0x68, 0x1A, 0x9C, 0x0C, 0xDD, 0x64, 0x78, 0x4D, 0x5A, 0x14, 0xE7, 0xB9, 0x6D, 0xAD, 0xD3, 0x4E, - 0xF3, 0x8E, 0xE2, 0x78, 0x46, 0xC9, 0xAD, 0x0F, 0x6B, 0xE3, 0xD1, 0x81, 0x3C, 0xD8, 0x6B, 0xD7, - 0x3F, 0x6E, 0x28, 0x3F, 0x78, 0xAB, 0xD9, 0x0B, 0x11, 0x39, 0xF1, 0xED, 0xBA, 0xA1, 0x0C, 0xD9, - 0xEE, 0x78, 0x0C, 0xFB, 0x99, 0xD1, 0x6C, 0x8C, 0xC7, 0xA3, 0x4C, 0xC7, 0xF3, 0xE1, 0x73, 0x03, - 0x8F, 0xEB, 0x64, 0x63, 0xE4, 0xE6, 0xE8, 0x20, 0x6B, 0x6E, 0xB3, 0x37, 0x1F, 0x7F, 0x8C, 0xBE, - 0xDA, 0x0E, 0x9E, 0x07, 0xF2, 0x9C, 0x06, 0x3D, 0x45, 0x78, 0xD6, 0x2A, 0xCC, 0x5B, 0xB6, 0x3B, - 0xE5, 0xAE, 0xB2, 0xFD, 0x6B, 0x37, 0x18, 0x51, 0x61, 0xFB, 0x19, 0x3B, 0xE1, 0x66, 0x73, 0x2B, - 0xAD, 0xCE, 0x3C, 0x8D, 0xC2, 0xBD, 0x76, 0x0C, 0x8B, 0x7E, 0xBE, 0xA6, 0x20, 0xE0, 0x20, 0x0C, - 0x9A, 0x09, 0x99, 0xF1, 0x43, 0x45, 0x10, 0x18, 0x17, 0xD8, 0x7D, 0x4B, 0x71, 0x07, 0x49, 0xFD, - 0x1B, 0x18, 0xFC, 0x5B, 0x37, 0x56, 0x74, 0x01, 0x8C, 0xC0, 0x55, 0xF8, 0x44, 0xDA, 0x6F, 0xFA, - 0x91, 0xA4, 0xCA, 0xA6, 0xC2, 0xD8, 0x9B, 0x6C, 0x5C, 0x5F, 0x87, 0xD1, 0x90, 0xC2, 0x90, 0xB1, - 0xA0, 0x30, 0x41, 0x40, 0x36, 0x94, 0xD8, 0x87, 0x09, 0x75, 0xE3, 0x59, 0xC4, 0xCA, 0x71, 0xA9, - 0x7D, 0xFB, 0x1B, 0xF4, 0xC2, 0xF3, 0xE3, 0x29, 0x0E, 0x0D, 0x0B, 0xAF, 0xC3, 0x53, 0x1A, 0xB2, - 0x3F, 0x8B, 0x93, 0x70, 0xC2, 0xFF, 0x86, 0x1D, 0x18, 0xB2, 0xA7, 0xD9, 0x56, 0xF4, 0x2F, 0x57, - 0x9D, 0x31, 0x33, 0x8D, 0x07, 0xB3, 0xE8, 0x86, 0xDE, 0x1F, 0x05, 0x0F, 0x06, 0xF4, 0x1A, 0xB5, - 0xCD, 0xC2, 0x50, 0x98, 0xAE, 0xDA, 0x63, 0xA7, 0xAD, 0x6A, 0x14, 0x03, 0xF7, 0x15, 0x2C, 0x17, - 0xE6, 0x1B, 0x1A, 0x2E, 0x0C, 0x92, 0x06, 0xB8, 0xB7, 0x7C, 0x17, 0x8E, 0x46, 0xEC, 0x94, 0xE7, - 0x41, 0x50, 0x4E, 0x92, 0xC8, 0x9F, 0xCA, 0x23, 0xD9, 0x87, 0x43, 0x92, 0xC7, 0xB1, 0x0B, 0x42, - 0xC2, 0x30, 0x8A, 0xD3, 0x30, 0x4A, 0x70, 0x36, 0x05, 0x78, 0x66, 0xF9, 0x20, 0x8A, 0x0E, 0xEF, - 0x60, 0x5D, 0x0E, 0xDC, 0xF1, 0xE9, 0x8C, 0xA9, 0xD8, 0x05, 0x61, 0x4D, 0x61, 0x0F, 0x90, 0x9C, - 0xD2, 0xE8, 0x8A, 0x0E, 0x93, 0xFD, 0x30, 0x82, 0x09, 0xC8, 0xCE, 0x65, 0x07, 0xE1, 0x2C, 0x1A, - 0x2E, 0x0E, 0x95, 0x2D, 0x71, 0x7C, 0x85, 0x5F, 0x10, 0x82, 0x1B, 0x24, 0x34, 0x08, 0xDC, 0x33, - 0x7A, 0x45, 0x23, 0x1A, 0x0C, 0xE9, 0x29, 0xD2, 0xB9, 0x38, 0xB4, 0x59, 0x12, 0x1E, 0x1D, 0x7F, - 0x98, 0xA0, 0x0F, 0x70, 0x17, 0x1D, 0x3C, 0x93, 0x87, 0x4B, 0xC4, 0xEE, 0xD9, 0xE9, 0x22, 0x42, - 0x9A, 0x42, 0xE2, 0xBA, 0x07, 0x67, 0x1F, 0xC6, 0x36, 0xAA, 0xE6, 0x21, 0x2F, 0x91, 0x6E, 0x34, - 0xB3, 0x34, 0x19, 0x4E, 0xF7, 0x70, 0x29, 0xD2, 0x5A, 0x78, 0xF9, 0x6F, 0xB2, 0x9E, 0x8C, 0x25, - 0x50, 0xCB, 0xBC, 0xEB, 0xE1, 0xD4, 0xF6, 0x9D, 0x63, 0x06, 0x13, 0x09, 0x4D, 0x1A, 0x59, 0x00, - 0xEB, 0xA2, 0x1A, 0x6F, 0xCB, 0xC2, 0x15, 0x60, 0xA1, 0x11, 0x7A, 0x57, 0x2C, 0x6A, 0x71, 0x72, - 0x0F, 0xEB, 0x09, 0xB2, 0x61, 0xCC, 0x22, 0x99, 0x1B, 0x41, 0x18, 0xD0, 0x86, 0x1E, 0xA9, 0xCB, - 0xA2, 0x34, 0xAA, 0x5B, 0x5E, 0x8E, 0xC3, 0xE1, 0x17, 0xDE, 0x14, 0x4C, 0xA7, 0x88, 0xA2, 0x2A, - 0xDF, 0x1F, 0xFC, 0x44, 0x42, 0xBE, 0x4C, 0x88, 0xB0, 0x02, 0x16, 0x94, 0xA4, 0xC0, 0x16, 0x71, - 0x94, 0x69, 0x64, 0x32, 0x0F, 0xAE, 0x64, 0x55, 0xB1, 0xB1, 0xE2, 0xB6, 0x59, 0x5D, 0x3D, 0xCA, - 0x16, 0xF4, 0xB4, 0xEE, 0x70, 0x1C, 0x8B, 0x50, 0x61, 0x0C, 0x9A, 0x4C, 0xE3, 0x66, 0xFE, 0xEF, - 0x0C, 0x8C, 0x5F, 0x1E, 0x1B, 0x1B, 0x46, 0x60, 0x14, 0xB4, 0x1A, 0x5D, 0x75, 0x5F, 0xD7, 0x21, - 0xFC, 0x4F, 0x2F, 0x0A, 0xA7, 0x5E, 0x78, 0x1B, 0x34, 0x4A, 0x82, 0xB1, 0x14, 0x0C, 0xC2, 0xEF, - 0x00, 0xDF, 0x9F, 0x3E, 0x55, 0x17, 0x30, 0x85, 0x60, 0xD8, 0x69, 0x29, 0x0D, 0x7E, 0xBD, 0xFB, - 0xDC, 0x15, 0x91, 0x55, 0xEC, 0x20, 0x4B, 0x2F, 0xE1, 0x16, 0x05, 0x2B, 0x4C, 0x87, 0x2C, 0x67, - 0x79, 0x76, 0x2C, 0x86, 0x67, 0xEA, 0x59, 0xC0, 0x05, 0x9B, 0x4C, 0xB8, 0xEB, 0x8F, 0xFD, 0xC1, - 0xCB, 0xE7, 0x65, 0x4A, 0xE6, 0x4B, 0x7C, 0x19, 0x84, 0x49, 0xAB, 0x6B, 0x3A, 0x14, 0xDB, 0x92, - 0x5F, 0x8C, 0x94, 0xD4, 0xD2, 0xF8, 0xB6, 0xDC, 0x92, 0x06, 0x66, 0x9E, 0x5F, 0x36, 0x3A, 0x54, - 0xA7, 0x79, 0x2D, 0x3A, 0x34, 0x1F, 0x3C, 0x20, 0xC1, 0xD8, 0xAA, 0x66, 0xA7, 0x09, 0xFF, 0x2A, - 0xA0, 0x80, 0x8E, 0xF9, 0xF0, 0xA7, 0x4E, 0xF5, 0xB9, 0x68, 0x48, 0x7D, 0xF5, 0x36, 0x3A, 0x64, - 0xA1, 0x9D, 0x16, 0xC3, 0x44, 0x0C, 0x60, 0x71, 0x1F, 0x71, 0x23, 0x33, 0x43, 0x95, 0x0B, 0xEE, - 0xC7, 0x59, 0xD8, 0xD2, 0xCA, 0x9F, 0x48, 0xBF, 0xAE, 0x12, 0xE4, 0x0C, 0x9D, 0xCB, 0xC2, 0xA0, - 0x5B, 0xB2, 0xB0, 0x43, 0xFA, 0x8E, 0xE3, 0xB4, 0xF3, 0x2A, 0x83, 0x79, 0x26, 0x40, 0x55, 0x74, - 0x08, 0xB3, 0x8B, 0xD1, 0x0F, 0xA1, 0xA9, 0x10, 0xEC, 0x17, 0xF7, 0x5E, 0x18, 0xE6, 0x26, 0x9E, - 0x9D, 0xB0, 0x82, 0x97, 0x04, 0xBB, 0x9D, 0xB6, 0xD6, 0x51, 0x0C, 0xC7, 0xD4, 0x8D, 0x24, 0x8E, - 0x7A, 0x80, 0x9B, 0x79, 0x22, 0x07, 0xB3, 0xE1, 0x10, 0xCC, 0x63, 0x46, 0xA6, 0x12, 0xE3, 0x99, - 0xC2, 0x11, 0xE5, 0x36, 0x12, 0x45, 0x11, 0x27, 0x12, 0xDA, 0x22, 0x70, 0x9D, 0xBA, 0x0C, 0x78, - 0x5D, 0xB8, 0x16, 0x0A, 0xC1, 0x1E, 0x97, 0xD4, 0x09, 0x4E, 0x4A, 0x03, 0x39, 0xBD, 0xFF, 0x71, - 0x25, 0xB6, 0x1E, 0xB8, 0x75, 0x63, 0xE7, 0xDF, 0x8A, 0x80, 0xE5, 0xB7, 0x34, 0x72, 0xBF, 0x86, - 0x5E, 0x24, 0x5C, 0xA4, 0xBA, 0x11, 0xD3, 0x25, 0x2D, 0xE1, 0x50, 0x4A, 0x29, 0xDB, 0x2A, 0x6F, - 0x85, 0x71, 0x4F, 0x9A, 0x0F, 0xCA, 0xEA, 0xC5, 0xE0, 0x3B, 0xA3, 0xDF, 0xB5, 0x7D, 0x8C, 0xB1, - 0xF1, 0x9A, 0x9B, 0xC2, 0x1C, 0xBA, 0x2A, 0xFA, 0x2C, 0x5D, 0x2A, 0xA7, 0xD0, 0x72, 0x7C, 0xC9, - 0x86, 0xDC, 0x36, 0xD2, 0x62, 0x8C, 0x32, 0x69, 0x57, 0xC4, 0x48, 0x1D, 0xBF, 0x86, 0x10, 0x69, - 0x11, 0x1D, 0x9C, 0x46, 0x2A, 0x98, 0x42, 0xA3, 0x8C, 0xB7, 0xB1, 0xE2, 0x5A, 0x24, 0x85, 0x5D, - 0x29, 0x41, 0xB8, 0xEC, 0x98, 0x94, 0xDF, 0x01, 0x51, 0xE0, 0xA1, 0xC6, 0x14, 0xBB, 0xBF, 0x9F, - 0x70, 0xAD, 0x51, 0x24, 0x91, 0x95, 0x09, 0xF5, 0x2A, 0xCB, 0x3A, 0x78, 0xA9, 0xA0, 0xBF, 0xB1, - 0x01, 0xC4, 0xB2, 0x08, 0xC2, 0x4B, 0x0A, 0xFF, 0x4B, 0x6E, 0x29, 0x0D, 0x88, 0xC3, 0x76, 0xD0, - 0x50, 0xD6, 0x80, 0xC2, 0x61, 0x38, 0x1E, 0xBB, 0xD3, 0x98, 0xBE, 0x39, 0x19, 0x0C, 0x78, 0xBC, - 0x25, 0xDB, 0x34, 0x1A, 0xF3, 0x53, 0x54, 0x1A, 0x70, 0xD3, 0x14, 0xF4, 0xC5, 0x90, 0x47, 0xC8, - 0x0D, 0xDD, 0x88, 0xAA, 0x9A, 0x40, 0x14, 0xD8, 0xC6, 0x1B, 0xF9, 0x27, 0x47, 0x0D, 0x6A, 0xF2, - 0x96, 0x36, 0xB9, 0x00, 0xAD, 0xB7, 0xC2, 0x4A, 0x57, 0x70, 0x35, 0x9F, 0xB3, 0xC9, 0x6C, 0x5A, - 0xD6, 0x80, 0xCB, 0x51, 0x1E, 0x81, 0xDA, 0x57, 0x58, 0xC8, 0x7D, 0xB4, 0xC0, 0x5E, 0xFB, 0x74, - 0xEC, 0xC5, 0xAD, 0x2C, 0x52, 0x7C, 0x5F, 0x30, 0x41, 0x58, 0x40, 0xC3, 0x2C, 0x78, 0xD2, 0x64, - 0x4F, 0xCA, 0x54, 0xB1, 0x0D, 0x17, 0x71, 0xAC, 0xC0, 0x6D, 0xB9, 0x97, 0x47, 0xEC, 0xD2, 0x4E, - 0x29, 0x6C, 0x9D, 0x0D, 0x09, 0x36, 0x1D, 0x05, 0x71, 0x3C, 0x6F, 0x3B, 0x1C, 0x4A, 0xD1, 0x14, - 0x7E, 0xAD, 0xD7, 0x7A, 0x2F, 0x8B, 0x05, 0x86, 0xA6, 0x2C, 0x32, 0xB8, 0x56, 0xBB, 0x81, 0x1A, - 0x1F, 0x0C, 0x2D, 0x45, 0xBC, 0x70, 0xAD, 0xB6, 0xA7, 0xA7, 0x0A, 0x8B, 0xD4, 0xDD, 0x50, 0xBD, - 0xD6, 0xB0, 0x9F, 0x8B, 0x55, 0x00, 0xF8, 0x67, 0xAD, 0x96, 0x2C, 0x3A, 0x29, 0x6B, 0xC9, 0x2C, - 0xA2, 0x9A, 0xBD, 0xBD, 0x8F, 0x13, 0x3A, 0x51, 0x7A, 0xCB, 0xFF, 0xAE, 0xD5, 0xF6, 0x50, 0x8F, - 0x80, 0x86, 0xD6, 0x69, 0x4C, 0x74, 0xAD, 0xF6, 0x27, 0xE7, 0x0A, 0xBB, 0x30, 0x4C, 0x5A, 0xB6, - 0xE2, 0x1A, 0xD9, 0x54, 0x21, 0x5C, 0x7A, 0x85, 0x28, 0x12, 0xDE, 0x32, 0xA7, 0x36, 0x78, 0xF0, - 0x6A, 0x16, 0x0B, 0x86, 0x2E, 0xE6, 0x0E, 0xDE, 0x2E, 0x5A, 0x7F, 0xA1, 0x68, 0x90, 0x1E, 0xC6, - 0x10, 0xAF, 0xBF, 0x80, 0x96, 0x6E, 0xE4, 0x0E, 0x61, 0xEF, 0x1B, 0xAB, 0x2A, 0x44, 0x97, 0xF6, - 0x76, 0x8A, 0x1A, 0xE5, 0xB1, 0x08, 0x2F, 0x57, 0x57, 0x16, 0x87, 0x4F, 0x07, 0xEF, 0x81, 0x38, - 0x4E, 0xAF, 0xDF, 0x61, 0x17, 0x59, 0xF2, 0x4A, 0x8C, 0x97, 0x32, 0x55, 0xD6, 0x73, 0x58, 0x03, - 0xDB, 0xC4, 0x91, 0xBC, 0x44, 0x94, 0xFB, 0x78, 0x3B, 0x8B, 0x42, 0x15, 0x36, 0x73, 0x5B, 0x92, - 0x40, 0x1B, 0x39, 0x7E, 0x00, 0x1F, 0x6E, 0x1A, 0x4C, 0x89, 0xBE, 0x70, 0x0A, 0x75, 0xE8, 0x0B, - 0xA7, 0x06, 0xDA, 0x1C, 0xE8, 0xFD, 0x93, 0xF7, 0x0F, 0x82, 0x9C, 0x1A, 0x0A, 0x45, 0x4E, 0x16, - 0x61, 0x5D, 0xAB, 0xA6, 0x83, 0x6D, 0xAC, 0x83, 0xAC, 0xD1, 0xC5, 0xBE, 0x0B, 0xAC, 0x89, 0xDE, - 0x86, 0x71, 0x22, 0x86, 0x7D, 0x23, 0x37, 0xEC, 0x1B, 0x05, 0xC3, 0x9E, 0xEF, 0x76, 0x41, 0xD7, - 0xF3, 0xF8, 0x70, 0xE6, 0x72, 0x7C, 0x2F, 0xF0, 0xC7, 0x44, 0xC9, 0x3E, 0xCE, 0x87, 0xCA, 0xD6, - 0x37, 0x76, 0x81, 0x85, 0x3B, 0x2F, 0x18, 0xAE, 0x35, 0xC7, 0x44, 0xB4, 0xE6, 0x2C, 0xDC, 0x37, - 0xDE, 0x91, 0x0F, 0x31, 0x8D, 0x6C, 0x1D, 0xC4, 0xEF, 0x4C, 0xB3, 0x24, 0x5F, 0xFA, 0xA3, 0xB0, - 0x3B, 0x0C, 0x27, 0xF8, 0x17, 0x7E, 0x25, 0x13, 0x24, 0x60, 0x06, 0xCB, 0x09, 0xCC, 0x7D, 0x1F, - 0x56, 0xFE, 0x89, 0xEB, 0x8F, 0x09, 0x2C, 0x50, 0x11, 0xAC, 0xF1, 0x8F, 0x41, 0xC2, 0xED, 0xED, - 0x6D, 0x77, 0xA9, 0x64, 0x58, 0x0D, 0x40, 0x6E, 0xC9, 0x73, 0xBA, 0x4A, 0x24, 0x4C, 0x65, 0x88, - 0xDA, 0xAB, 0x8A, 0xD6, 0x42, 0x5E, 0xFA, 0x3D, 0xA7, 0x57, 0xAB, 0x95, 0x36, 0xF2, 0x8D, 0xCB, - 0xB1, 0x17, 0x5D, 0x0C, 0xA6, 0x6E, 0xF4, 0xE5, 0xF5, 0x2C, 0xE8, 0x35, 0xE6, 0x84, 0x70, 0xFA, - 0xF3, 0x3C, 0x94, 0x4A, 0xAE, 0xE3, 0xD5, 0x8C, 0xFF, 0x8D, 0xFF, 0xCC, 0xDB, 0x55, 0x04, 0x00, - 0x28, 0x01, 0x44, 0xC3, 0x70, 0x7D, 0xA9, 0x75, 0xCF, 0x23, 0x37, 0x88, 0x27, 0x7E, 0xF2, 0xE6, - 0xCD, 0x6E, 0xC3, 0x7E, 0xF8, 0x64, 0xB8, 0x21, 0xD0, 0x76, 0xF9, 0xB0, 0xF7, 0x8B, 0x3C, 0x50, - 0x36, 0x1C, 0x30, 0xB3, 0xCB, 0x3B, 0x61, 0x62, 0x96, 0xFB, 0x1A, 0x9A, 0x3C, 0xD0, 0xD7, 0xF7, - 0xFE, 0xCF, 0x36, 0x06, 0x2D, 0x7C, 0xE6, 0xF1, 0x0B, 0x13, 0x66, 0x7D, 0x23, 0x06, 0xDF, 0x8B, - 0x09, 0x6C, 0x7F, 0x23, 0xE6, 0x24, 0x62, 0xA7, 0x23, 0x58, 0xAD, 0x70, 0x7F, 0xAD, 0xA0, 0x2D, - 0xDA, 0x5B, 0xE7, 0x83, 0x89, 0x94, 0x46, 0xDC, 0xD7, 0x60, 0x4C, 0x0E, 0xCD, 0x56, 0x56, 0x9A, - 0xB6, 0x0D, 0xBE, 0xB0, 0x80, 0x0E, 0x65, 0x75, 0x92, 0x8A, 0xD5, 0x72, 0x72, 0x50, 0xA1, 0x57, - 0x85, 0x9A, 0x0B, 0x2F, 0x61, 0xE8, 0x6E, 0xD8, 0x22, 0x03, 0x4B, 0x77, 0x18, 0x78, 0x38, 0x8F, - 0x36, 0x1D, 0xFC, 0xBF, 0x4D, 0xDF, 0x6F, 0x3A, 0xA8, 0x81, 0xA0, 0x4C, 0x9D, 0x6D, 0x7B, 0xD6, - 0x0B, 0x59, 0xE5, 0xC8, 0x4E, 0xC3, 0xD8, 0xC7, 0xFF, 0xEE, 0x0E, 0x87, 0x33, 0x50, 0x65, 0xF7, - 0x5C, 0xD9, 0x6D, 0x74, 0x7B, 0x16, 0xA4, 0xBD, 0x2E, 0xC3, 0xBA, 0xD1, 0x2D, 0xC1, 0x5A, 0x20, - 0xAA, 0xEC, 0xB8, 0xE1, 0x90, 0xC5, 0xC8, 0x76, 0xB4, 0xEB, 0xF2, 0x85, 0xC2, 0x9D, 0xB6, 0xF8, - 0x88, 0x2D, 0x94, 0x6B, 0xF4, 0xD5, 0x2D, 0x3E, 0x41, 0x0B, 0xE5, 0x7A, 0x7D, 0x79, 0x83, 0x77, - 0x6E, 0x82, 0xAE, 0x05, 0xD6, 0xA4, 0xEB, 0xBC, 0x70, 0xFA, 0x2F, 0xD6, 0x9F, 0xBD, 0xA8, 0x68, - 0x12, 0x06, 0x23, 0xD1, 0x86, 0x27, 0x0A, 0x78, 0xBE, 0xE1, 0x6C, 0x3C, 0xDB, 0xEC, 0x95, 0xB7, - 0xDA, 0x1D, 0x27, 0x7E, 0x32, 0xF3, 0x98, 0x85, 0xB4, 0xB1, 0x09, 0xB8, 0x9E, 0x17, 0xA3, 0x11, - 0x4E, 0xF4, 0xB7, 0xD4, 0x1F, 0x5D, 0x23, 0x1A, 0xA7, 0xAA, 0xA6, 0xE1, 0x6E, 0xCF, 0x5A, 0xD4, - 0xD0, 0xB7, 0x05, 0xA2, 0x57, 0x88, 0xB2, 0x5C, 0x7A, 0x40, 0x3A, 0x54, 0x31, 0x90, 0x13, 0xA3, - 0xFC, 0x0C, 0xCB, 0x32, 0x47, 0x16, 0x1C, 0xAE, 0xC5, 0x87, 0x6C, 0xA1, 0x61, 0x9B, 0x6F, 0xE8, - 0xE6, 0x1B, 0xBE, 0x7C, 0x7C, 0x8D, 0x3E, 0x8B, 0xF5, 0x39, 0xF5, 0xCC, 0x61, 0x3F, 0x1D, 0x92, - 0xFE, 0x92, 0xCE, 0x5F, 0x59, 0x86, 0x93, 0x57, 0xFC, 0x5A, 0xAD, 0x36, 0xAA, 0x90, 0x7E, 0xFC, - 0x23, 0x90, 0x7E, 0x7A, 0x0C, 0xA4, 0x5F, 0xCB, 0x02, 0x02, 0xE6, 0x57, 0x63, 0x8B, 0xA9, 0xB2, - 0xB9, 0xD4, 0x59, 0x9E, 0x5F, 0xD9, 0xC9, 0x0F, 0x2C, 0x4E, 0x3F, 0xD1, 0x08, 0xAF, 0x71, 0xC2, - 0xB7, 0x55, 0x16, 0xE1, 0x92, 0x85, 0xBA, 0xD5, 0x62, 0xB4, 0x22, 0xF1, 0x2B, 0xBD, 0x9E, 0xB3, - 0xB6, 0xDE, 0x21, 0xCF, 0x9F, 0x6B, 0x3B, 0x3A, 0xFE, 0x19, 0x99, 0x8C, 0x05, 0x35, 0x16, 0x83, - 0x02, 0x74, 0xE6, 0x5C, 0x59, 0xC1, 0xE4, 0x2A, 0x4E, 0x87, 0x88, 0xFF, 0x28, 0xF8, 0x36, 0xC4, - 0xA0, 0xB2, 0x5F, 0x16, 0x96, 0xA3, 0xA2, 0xD9, 0xB6, 0xD2, 0x77, 0x60, 0x62, 0x33, 0x3F, 0x76, - 0x57, 0xC3, 0xCB, 0x3E, 0x20, 0x5E, 0xF6, 0x4B, 0x5D, 0x51, 0xFA, 0x5A, 0xB8, 0xD9, 0x4A, 0xCF, - 0xA1, 0x53, 0xA3, 0x2B, 0xEF, 0xAF, 0x2D, 0xDC, 0x98, 0xF0, 0xC6, 0xB9, 0x4D, 0xD7, 0x1C, 0x1B, - 0x93, 0xDA, 0x06, 0x42, 0x1E, 0xDF, 0xBC, 0x9B, 0xAE, 0x6A, 0x54, 0xB6, 0xBE, 0x3D, 0x60, 0xD3, - 0xF5, 0x50, 0x84, 0xCC, 0x6C, 0x7E, 0x28, 0xCA, 0xBA, 0xBB, 0x1B, 0xDB, 0x50, 0xD6, 0xDF, 0xDD, - 0xD8, 0x06, 0xA6, 0x7A, 0x77, 0xA3, 0xB5, 0x92, 0x3B, 0x8D, 0xC6, 0x9C, 0x6D, 0xF2, 0x9B, 0x8B, - 0xE2, 0x56, 0x96, 0x7D, 0x94, 0x77, 0x1B, 0x24, 0xB7, 0x41, 0x7F, 0xDE, 0xF6, 0x1C, 0xEB, 0xCF, - 0x67, 0x1B, 0xB7, 0x67, 0xE1, 0xFA, 0xDB, 0x8C, 0xD9, 0xA9, 0x9B, 0x4A, 0xF1, 0xFE, 0x99, 0x56, - 0xF9, 0x3C, 0xF9, 0x0D, 0xE4, 0x8C, 0xAD, 0x8A, 0xAD, 0x28, 0x99, 0xBD, 0x7C, 0xDB, 0xC1, 0xE3, - 0xC4, 0x4C, 0x50, 0x07, 0xEC, 0x6E, 0xAD, 0x70, 0x78, 0x9D, 0x87, 0x5F, 0x28, 0x6E, 0x0F, 0x58, - 0xE5, 0x2D, 0xDB, 0xD5, 0xA6, 0x19, 0x4D, 0xAF, 0x16, 0xD8, 0xEE, 0x38, 0x59, 0x1D, 0x71, 0xE5, - 0xD8, 0x40, 0xBA, 0x37, 0xF9, 0xFF, 0x53, 0x09, 0x5F, 0xDB, 0x2C, 0xF2, 0xCB, 0x9D, 0x3E, 0x68, - 0xA5, 0xAC, 0xA4, 0xA4, 0xD1, 0xC8, 0x9F, 0xDF, 0xB0, 0x70, 0x8F, 0xBF, 0xD1, 0xFB, 0x33, 0x1A, - 0xD0, 0x5B, 0x77, 0xDC, 0x28, 0x8E, 0x8C, 0xFC, 0xAA, 0x6F, 0xC7, 0x30, 0xFD, 0x42, 0x95, 0x93, - 0xF2, 0xD6, 0xBF, 0xF2, 0x4F, 0x60, 0x27, 0x13, 0x46, 0x5F, 0x9C, 0xC1, 0xE0, 0xE8, 0x80, 0x7B, - 0xD3, 0x36, 0xD4, 0xE9, 0xCE, 0xB7, 0x37, 0x45, 0xD3, 0x1D, 0x91, 0x14, 0x7B, 0xEA, 0x6C, 0x68, - 0x4E, 0xDD, 0x38, 0x86, 0x5F, 0xBC, 0xC7, 0x47, 0xD5, 0xFB, 0x36, 0x3D, 0xEA, 0x7D, 0xBB, 0x1E, - 0xF5, 0xBF, 0x4D, 0x8F, 0xFA, 0xDF, 0xAE, 0x47, 0x6B, 0xDF, 0xA6, 0x47, 0x6B, 0x4B, 0xEC, 0x91, - 0x6E, 0xC2, 0x9C, 0xDE, 0x24, 0xA6, 0xB7, 0x18, 0x2F, 0xFB, 0x6B, 0x15, 0x4C, 0x0B, 0xA7, 0xCA, - 0xB2, 0x99, 0xCA, 0x26, 0x99, 0x81, 0xB1, 0xB9, 0xB1, 0xB1, 0x96, 0x73, 0x24, 0xB3, 0x8F, 0xE5, - 0xC4, 0x7E, 0xB5, 0x93, 0xFC, 0xC1, 0x9B, 0x2E, 0x40, 0x54, 0xDA, 0x6A, 0x59, 0x74, 0xF1, 0xC3, - 0x04, 0x71, 0xE3, 0xEF, 0x78, 0x96, 0xD0, 0xBB, 0x3C, 0x5B, 0xF1, 0x50, 0xC7, 0x60, 0x24, 0x7C, - 0x3A, 0xDF, 0x3F, 0x25, 0xBC, 0x02, 0x73, 0xF2, 0xF3, 0x02, 0x32, 0x74, 0x03, 0x12, 0x84, 0x8C, - 0x10, 0xDE, 0xC6, 0x23, 0x6E, 0x82, 0xFE, 0x58, 0x12, 0xA3, 0xAB, 0x2B, 0xF1, 0xD9, 0x59, 0x4C, - 0x01, 0x59, 0x42, 0x6D, 0xF2, 0xF3, 0x28, 0x9B, 0x1F, 0xCB, 0x8C, 0xE5, 0xAC, 0xE7, 0xC4, 0x9A, - 0xB8, 0x77, 0xD0, 0x04, 0xE3, 0x43, 0x2E, 0x26, 0x7E, 0x00, 0x7D, 0x8C, 0x39, 0xE7, 0x60, 0xC7, - 0xDD, 0xEB, 0x3B, 0x39, 0xC3, 0xAA, 0xD7, 0x81, 0xEF, 0x9D, 0xBE, 0x6E, 0xD0, 0x6B, 0x67, 0x64, - 0xE5, 0x56, 0x2A, 0x47, 0xF7, 0x8E, 0xAD, 0x91, 0xCB, 0x45, 0x58, 0xC3, 0x8E, 0xB3, 0xF6, 0x75, - 0xD3, 0x21, 0x7F, 0x25, 0xFD, 0x62, 0x8F, 0x53, 0x01, 0xC5, 0x7A, 0x33, 0xEB, 0xF6, 0x41, 0x0B, - 0x5A, 0xAC, 0x37, 0x1A, 0x59, 0x93, 0x23, 0xD8, 0xF7, 0x44, 0x60, 0x51, 0x08, 0x39, 0xCE, 0x33, - 0x66, 0x73, 0x29, 0x2C, 0xB1, 0x23, 0x74, 0x4C, 0xDF, 0xA9, 0x3C, 0xC9, 0x2C, 0x33, 0xD1, 0xD2, - 0x2D, 0x1A, 0x19, 0xF0, 0x80, 0x28, 0xCD, 0x4E, 0x5B, 0x5D, 0x4D, 0x99, 0x23, 0x60, 0x1D, 0xBC, - 0xDD, 0x3F, 0xD5, 0x0D, 0x33, 0x2D, 0x40, 0xC6, 0xE4, 0xD0, 0xD1, 0xE9, 0x2E, 0x3F, 0xAC, 0xC8, - 0x20, 0x1C, 0x9D, 0x36, 0x14, 0xAE, 0x04, 0x41, 0xD0, 0x55, 0xFE, 0xAF, 0x32, 0xE7, 0xB0, 0x30, - 0x15, 0x55, 0x05, 0x86, 0x83, 0x93, 0xC1, 0x63, 0xA3, 0x78, 0xC3, 0x73, 0xB7, 0x3E, 0x36, 0x9A, - 0xC1, 0xEC, 0x12, 0xFE, 0x5D, 0x2A, 0x16, 0x21, 0xB3, 0x12, 0xC3, 0xDB, 0x24, 0x99, 0x0A, 0xCD, - 0xEB, 0xE4, 0x35, 0xAF, 0x63, 0xD5, 0xBC, 0x0B, 0x21, 0x3A, 0x59, 0x26, 0x1E, 0x7D, 0xCA, 0x9E, - 0x0F, 0xC5, 0x81, 0x8B, 0x6C, 0x50, 0xE2, 0xE8, 0xB4, 0x2C, 0x42, 0x92, 0x42, 0x00, 0x33, 0xEF, - 0x1A, 0x74, 0x58, 0x9A, 0x2D, 0xCD, 0x86, 0x0C, 0xF3, 0x14, 0xBF, 0x0E, 0x23, 0x58, 0x6A, 0xD2, - 0xA5, 0x68, 0x3E, 0xDB, 0xA1, 0x18, 0xA5, 0x9A, 0xED, 0x4A, 0xFD, 0xDD, 0x50, 0x25, 0xAB, 0xAB, - 0x79, 0x85, 0xA2, 0xCF, 0xCD, 0xDE, 0x8B, 0x7E, 0xB7, 0xB7, 0xF9, 0xBC, 0xEB, 0x74, 0x7B, 0xFD, - 0x35, 0x15, 0x43, 0x59, 0x53, 0x31, 0xE9, 0x64, 0xDB, 0xF5, 0x6E, 0x0F, 0x54, 0x5D, 0xCD, 0xB6, - 0xCA, 0x6C, 0x52, 0x70, 0xD7, 0x6D, 0x9D, 0x4D, 0x92, 0xFE, 0xC6, 0x46, 0x57, 0xFE, 0xBF, 0x36, - 0x72, 0x65, 0x06, 0x3C, 0x77, 0x6A, 0xB6, 0xC9, 0x84, 0x19, 0x38, 0xA4, 0xB5, 0x31, 0xF6, 0x4B, - 0x27, 0xE7, 0xA7, 0x8B, 0x6B, 0x5F, 0xAB, 0xBF, 0x08, 0x10, 0x8F, 0xC7, 0x87, 0x77, 0xD3, 0x30, - 0xE0, 0xD2, 0xB3, 0x06, 0x34, 0x3C, 0x53, 0xF7, 0x99, 0x6C, 0xFD, 0x7D, 0xA6, 0x8A, 0x4C, 0x16, - 0x91, 0x52, 0xE5, 0x8C, 0x9A, 0x02, 0x6D, 0x43, 0x9F, 0xDD, 0x0A, 0xED, 0x90, 0x15, 0xF4, 0xD0, - 0x68, 0x5E, 0xBA, 0x35, 0x26, 0x9A, 0xCE, 0x82, 0xB0, 0xCF, 0xC2, 0x10, 0x76, 0xA8, 0x63, 0x36, - 0xCE, 0xE8, 0x7B, 0x74, 0x72, 0x5E, 0x65, 0xEE, 0x79, 0x74, 0x3A, 0xF8, 0xD5, 0x70, 0x3F, 0xCE, - 0x8B, 0xC7, 0x8F, 0xA7, 0xE2, 0x7A, 0xEB, 0x63, 0x20, 0xCB, 0x3C, 0x5C, 0xD3, 0x74, 0x08, 0x8F, - 0x3C, 0x11, 0x9B, 0x91, 0x0B, 0xCD, 0x60, 0x33, 0x39, 0x2E, 0x45, 0xF0, 0x35, 0xF3, 0xB0, 0x44, - 0x49, 0xB1, 0x9D, 0x68, 0xDE, 0x68, 0xA9, 0x67, 0x9F, 0x50, 0xB5, 0x15, 0x1A, 0x52, 0x7B, 0xFC, - 0x9C, 0x91, 0xFD, 0x7D, 0x31, 0x8B, 0x53, 0x6B, 0xC5, 0x64, 0x91, 0x30, 0x59, 0x6C, 0x2C, 0x52, - 0xA3, 0xBA, 0x2A, 0x16, 0x00, 0x15, 0xBB, 0xB0, 0xC8, 0x96, 0x86, 0xF3, 0x6B, 0x9A, 0xAC, 0xD6, - 0x9E, 0x06, 0xCB, 0x08, 0xD2, 0xC4, 0x3B, 0x26, 0xA2, 0x8A, 0x72, 0x0D, 0x42, 0x8F, 0x28, 0x54, - 0x22, 0x78, 0xD4, 0x60, 0xAD, 0x6D, 0xA2, 0xE5, 0x5B, 0xCC, 0xC2, 0xAE, 0x9B, 0xB1, 0x7B, 0x43, - 0xF7, 0x92, 0xA0, 0x09, 0x94, 0x9E, 0x82, 0xB6, 0x00, 0x65, 0xCB, 0x94, 0x06, 0x0B, 0x3F, 0x55, - 0x20, 0x60, 0xFE, 0x50, 0xF6, 0x67, 0xCE, 0x29, 0x27, 0x83, 0x97, 0x53, 0x48, 0x4A, 0x85, 0x47, - 0x4D, 0xDB, 0xA5, 0x98, 0x9A, 0x46, 0x77, 0x77, 0x96, 0xD6, 0xDB, 0xF8, 0xBB, 0xEC, 0xEE, 0xEF, - 0xFA, 0x15, 0xAF, 0x1A, 0x77, 0x38, 0xF1, 0x31, 0x00, 0x98, 0xF3, 0x5D, 0x22, 0x7A, 0x7D, 0xEB, - 0xFA, 0x49, 0xB7, 0xDB, 0x6D, 0xAA, 0x27, 0xF1, 0x76, 0x19, 0xB4, 0x07, 0x6A, 0xC8, 0x28, 0x8D, - 0x7C, 0x47, 0x5F, 0x4A, 0xE2, 0x53, 0x9F, 0xE5, 0x13, 0x35, 0xFD, 0x0B, 0xBF, 0xC3, 0x63, 0x6E, - 0x7C, 0xF4, 0xC1, 0x51, 0x8A, 0xD5, 0xD0, 0x7B, 0x75, 0xF0, 0x06, 0xEE, 0x0D, 0x76, 0xA7, 0xDB, - 0xD5, 0xCE, 0x8F, 0x8C, 0x8B, 0x0A, 0x8D, 0xEC, 0xB2, 0x6A, 0xA7, 0x8C, 0xF1, 0x1D, 0x0D, 0x08, - 0xB2, 0xB4, 0x20, 0xEA, 0xD0, 0x8C, 0xF6, 0x55, 0xC3, 0x8E, 0x1F, 0x12, 0x6D, 0xFB, 0xF0, 0x88, - 0xDB, 0x87, 0x44, 0xDD, 0x3E, 0x34, 0xF2, 0xF6, 0xE1, 0xD1, 0xB7, 0x0F, 0x8B, 0xC0, 0x7D, 0x68, - 0x2C, 0xED, 0x32, 0xE2, 0x69, 0x17, 0x8B, 0xA9, 0x4D, 0xD7, 0x80, 0xEC, 0x92, 0x00, 0x88, 0x38, - 0xAF, 0xFB, 0x4F, 0xA0, 0xE1, 0xBF, 0x2F, 0x05, 0x6C, 0xD5, 0x8F, 0x8F, 0xA5, 0x72, 0x2C, 0xF7, - 0x26, 0xAD, 0x61, 0xC0, 0xCA, 0xCD, 0x1B, 0xD4, 0x2B, 0xB3, 0xCB, 0x3B, 0xBD, 0xC6, 0x9B, 0xD3, - 0x81, 0xC5, 0x1F, 0x91, 0xD2, 0xF2, 0xE3, 0x8F, 0xC4, 0xDE, 0x0C, 0x64, 0x62, 0xCC, 0xEE, 0x60, - 0xCF, 0xDD, 0x74, 0x8F, 0xFA, 0x07, 0xE1, 0x6C, 0x21, 0xA4, 0xEF, 0xDE, 0x9F, 0xEC, 0x0E, 0x0A, - 0xE9, 0x6D, 0x1B, 0xCB, 0x92, 0x2D, 0xB8, 0xB3, 0x4A, 0x81, 0x2A, 0x82, 0x92, 0x43, 0xAF, 0x8A, - 0xCC, 0x75, 0x18, 0xC2, 0x7F, 0x60, 0x13, 0xC1, 0xAE, 0xB1, 0xA5, 0x75, 0x54, 0x59, 0xC9, 0x84, - 0xE9, 0xE9, 0x53, 0x53, 0x40, 0x6C, 0xA2, 0x90, 0xEF, 0x6F, 0xEE, 0xA2, 0x0A, 0xF6, 0x7A, 0xCF, - 0x4F, 0x8E, 0xDD, 0x69, 0x76, 0x11, 0x66, 0xE2, 0x07, 0xF0, 0x8F, 0x7B, 0xD7, 0x21, 0x97, 0xAC, - 0x44, 0xB9, 0xC4, 0xD6, 0x49, 0x35, 0xC2, 0xD1, 0x81, 0x32, 0x99, 0xE5, 0x99, 0x5F, 0x9A, 0x2A, - 0x82, 0x53, 0x37, 0x71, 0xE3, 0x2F, 0xBC, 0x80, 0x03, 0xD2, 0x0A, 0x51, 0x7E, 0xF8, 0x59, 0x1F, - 0x79, 0x85, 0x28, 0xDB, 0xE8, 0x50, 0x17, 0x1F, 0x76, 0x10, 0x3D, 0xFF, 0xD0, 0x62, 0x40, 0x7E, - 0x24, 0xAD, 0x1E, 0x79, 0xF5, 0x8A, 0xE3, 0x6A, 0xB7, 0x71, 0x94, 0x9C, 0xB6, 0x31, 0x3A, 0x25, - 0x97, 0xDF, 0xEC, 0x37, 0xEA, 0x94, 0xB6, 0x4A, 0xAF, 0xAA, 0xC6, 0xB3, 0x6C, 0x10, 0x72, 0xFE, - 0x41, 0x79, 0x45, 0x4F, 0xD1, 0x8B, 0x32, 0xB2, 0x14, 0xFA, 0x6F, 0x09, 0x53, 0x89, 0xF1, 0x51, - 0x00, 0xF6, 0x4C, 0xC4, 0x14, 0x54, 0x32, 0xEE, 0x30, 0x8C, 0xC1, 0x4A, 0xC3, 0x5D, 0x94, 0x3B, - 0xC3, 0xEC, 0x2D, 0x04, 0x3D, 0x48, 0x6C, 0x2B, 0xBB, 0x24, 0x9C, 0x76, 0x0D, 0x2B, 0x59, 0xD6, - 0xCF, 0x2C, 0x15, 0x86, 0x47, 0x13, 0xFE, 0x7A, 0x0E, 0xEC, 0x89, 0x05, 0x9C, 0x2C, 0xF5, 0x47, - 0x7A, 0x17, 0xF9, 0x46, 0xA6, 0x17, 0xC1, 0x28, 0x36, 0x9E, 0x9A, 0xC6, 0xF7, 0xC0, 0x06, 0xF1, - 0xAF, 0xEE, 0xD3, 0x04, 0x38, 0x2D, 0x55, 0x18, 0xDA, 0xE9, 0x78, 0xEB, 0xCD, 0xEA, 0xBE, 0x4D, - 0x61, 0x3C, 0x89, 0x61, 0x86, 0xB9, 0xA6, 0x23, 0x8A, 0x44, 0x2A, 0x2F, 0x63, 0x5C, 0xB1, 0x5E, - 0x90, 0x59, 0xF0, 0x25, 0xC0, 0x5B, 0xCE, 0x5B, 0xDF, 0x9B, 0xAC, 0x20, 0x43, 0x6C, 0x2F, 0x7A, - 0xBC, 0x22, 0x2B, 0xBD, 0xE7, 0x0E, 0x0A, 0xBF, 0xAD, 0x14, 0x96, 0xA1, 0xE7, 0x4E, 0x29, 0x0B, - 0xB2, 0xD0, 0xA1, 0xE7, 0x7C, 0x47, 0xFD, 0xDC, 0xF9, 0xEE, 0x3A, 0x5F, 0x38, 0x4D, 0xB8, 0xA8, - 0x28, 0xF2, 0x2C, 0xA3, 0x17, 0xB7, 0x2C, 0xB2, 0xC7, 0x73, 0x18, 0xCD, 0x2F, 0x7C, 0xAC, 0xDD, - 0xBF, 0xA4, 0xEF, 0x5F, 0xD2, 0x67, 0x97, 0xBE, 0x9C, 0xAC, 0xFC, 0x65, 0x5B, 0x53, 0x78, 0xA5, - 0xFD, 0xE7, 0xBA, 0x33, 0xE6, 0xF7, 0x44, 0x58, 0x84, 0xFF, 0x77, 0xD2, 0xFD, 0x52, 0x25, 0xAF, - 0xD2, 0x31, 0x8D, 0x60, 0x4B, 0x83, 0x2B, 0x4F, 0x36, 0xA1, 0x16, 0x9B, 0x29, 0x85, 0x6C, 0x5F, - 0x94, 0x0C, 0x6D, 0x10, 0x44, 0xB2, 0x0D, 0x5C, 0xC8, 0x3C, 0x82, 0x8F, 0x7A, 0x5C, 0x53, 0x5B, - 0x2A, 0xB6, 0x8E, 0x9C, 0x89, 0x58, 0x0E, 0x56, 0xD0, 0xEA, 0x18, 0x47, 0x34, 0xC1, 0xD1, 0xE2, - 0x77, 0x39, 0xD2, 0xE5, 0xD5, 0x48, 0x24, 0x92, 0x5D, 0xD2, 0xD5, 0x57, 0xD6, 0x6C, 0x45, 0x14, - 0x13, 0x84, 0xA1, 0x6A, 0xC9, 0x3A, 0x1D, 0x1B, 0x11, 0xD9, 0x15, 0x5B, 0x43, 0xAB, 0x95, 0x02, - 0x83, 0x4A, 0x65, 0xD0, 0xF2, 0xD1, 0xAF, 0x3C, 0x87, 0x54, 0xCC, 0xBA, 0x2A, 0xF9, 0x2B, 0xBA, - 0x9F, 0xB7, 0xFA, 0x72, 0xF7, 0x9F, 0x33, 0xB3, 0x6F, 0x41, 0x73, 0x2F, 0x0D, 0xDE, 0xE2, 0x06, - 0x1D, 0xEA, 0x10, 0xC5, 0x9C, 0xCB, 0xFE, 0x44, 0x3F, 0x7B, 0xE3, 0x8F, 0x31, 0xDE, 0xB8, 0xD6, - 0xCB, 0x0C, 0xA2, 0xED, 0xC2, 0x0B, 0xDD, 0x0B, 0xDB, 0xFB, 0x0B, 0x29, 0x9E, 0xA2, 0xD1, 0x11, - 0x6E, 0xED, 0xE5, 0x0E, 0x8F, 0x8C, 0xAD, 0xD3, 0x47, 0x29, 0x8B, 0xB8, 0x63, 0xB6, 0xF7, 0xEF, - 0xFF, 0x2C, 0x3A, 0xBB, 0x88, 0x75, 0xD9, 0xE1, 0xAD, 0x96, 0x86, 0x63, 0x3E, 0x9E, 0x29, 0xEF, - 0x97, 0x71, 0x26, 0x89, 0x6C, 0xB4, 0xDD, 0xA6, 0x12, 0x26, 0xD4, 0x52, 0x9F, 0x2C, 0xFB, 0x0B, - 0xA6, 0xE5, 0x7D, 0xA2, 0x3C, 0x08, 0xC2, 0x8B, 0x7F, 0x75, 0x3E, 0x4B, 0xB9, 0xC7, 0x6F, 0x7E, - 0x7C, 0xE2, 0x9E, 0xB4, 0xB8, 0xBB, 0x4E, 0x96, 0xB7, 0xDB, 0xBC, 0x4C, 0x56, 0x7F, 0x05, 0x5B, - 0x1C, 0xED, 0xC3, 0x0E, 0xE6, 0x20, 0x68, 0xDB, 0x80, 0xF7, 0x2A, 0x80, 0xF7, 0x74, 0xE0, 0x3D, - 0x13, 0x78, 0xAF, 0x0C, 0x78, 0xBF, 0x02, 0x78, 0x5F, 0x07, 0xDE, 0x37, 0x81, 0xF7, 0xCB, 0x80, - 0xAF, 0x55, 0x00, 0x5F, 0xD3, 0x81, 0xAF, 0x99, 0xC0, 0xD7, 0x52, 0xE0, 0x7F, 0x02, 0x91, 0x55, - 0x2E, 0xA6, 0xA2, 0xCC, 0x5E, 0xBA, 0x1E, 0xFE, 0x8E, 0x97, 0xF0, 0x2A, 0x04, 0x58, 0xFA, 0x62, - 0x0A, 0xEE, 0x8F, 0x0A, 0x91, 0xEE, 0x26, 0xE1, 0x3B, 0x7C, 0x43, 0x0A, 0x4A, 0xF0, 0xB0, 0x05, - 0xF9, 0xAE, 0x06, 0x5E, 0x97, 0x47, 0x86, 0x21, 0x41, 0x3D, 0x7E, 0x2E, 0x6E, 0x27, 0x65, 0xF1, - 0xDE, 0xEB, 0xA1, 0x61, 0xBE, 0x07, 0x68, 0x7C, 0xAF, 0x5F, 0xA3, 0xCB, 0xDC, 0xD0, 0xEF, 0x29, - 0xA7, 0x6E, 0x3F, 0xFE, 0x48, 0xF8, 0xC7, 0x7E, 0xF6, 0x31, 0x27, 0x18, 0xBD, 0xC5, 0x25, 0x03, - 0x00, 0x7F, 0xB7, 0x4E, 0x86, 0x9E, 0xDD, 0x1F, 0x88, 0xBC, 0xB0, 0xB9, 0x65, 0xB5, 0x73, 0x74, - 0x1C, 0x5D, 0xBE, 0x5D, 0xD2, 0xD3, 0xAE, 0x28, 0x79, 0x3F, 0xA5, 0x4A, 0x2C, 0x1B, 0x4E, 0xFE, - 0x56, 0x6C, 0xF8, 0xDA, 0xC5, 0xF3, 0x94, 0x7B, 0xF1, 0x40, 0x6B, 0xAC, 0xDB, 0x52, 0x7A, 0x59, - 0x3E, 0xE3, 0x66, 0x43, 0x16, 0x91, 0xDD, 0x29, 0x28, 0x5B, 0xEA, 0x69, 0x07, 0x3C, 0xEC, 0x3E, - 0x2C, 0x7F, 0xA9, 0x89, 0x63, 0x43, 0xE7, 0xA5, 0x35, 0xA5, 0x93, 0x81, 0x89, 0xBD, 0x33, 0xD4, - 0xE9, 0x75, 0x4C, 0x0F, 0xD8, 0x6F, 0x34, 0x0A, 0x33, 0x2E, 0x14, 0x74, 0xDF, 0xC9, 0xB7, 0x91, - 0x77, 0x69, 0x59, 0xE7, 0xFE, 0x6C, 0x17, 0x82, 0x55, 0xA6, 0xD8, 0xAE, 0x02, 0x7F, 0xCD, 0x0D, - 0xF9, 0xC9, 0x84, 0xBA, 0xB9, 0xF1, 0xD6, 0xF9, 0x94, 0xD9, 0xC0, 0xD8, 0x97, 0x93, 0xE3, 0xC3, - 0xDD, 0x0B, 0x7E, 0x0D, 0x5B, 0x72, 0xB9, 0x67, 0xAB, 0x31, 0xA8, 0xAE, 0x71, 0x5E, 0x59, 0xE3, - 0x27, 0xA5, 0xC6, 0xBA, 0xA5, 0xC6, 0xD9, 0xF1, 0xBE, 0x0E, 0x23, 0xDF, 0x41, 0x11, 0xDE, 0xF7, - 0x27, 0xEA, 0xA3, 0x5A, 0xE3, 0xEC, 0x97, 0xE3, 0x8B, 0xB3, 0xDD, 0x9F, 0x7F, 0x29, 0xAF, 0x31, - 0x78, 0x7D, 0xB6, 0xF7, 0x8B, 0xC9, 0xA8, 0x1C, 0xA7, 0x30, 0x25, 0xBF, 0x75, 0xEA, 0x2B, 0xF9, - 0xFA, 0x9D, 0x0D, 0xDC, 0xB7, 0x95, 0x60, 0x53, 0xD3, 0xFA, 0x57, 0x57, 0x7B, 0x66, 0x54, 0x73, - 0xAC, 0xD5, 0x9E, 0xD7, 0x83, 0xF6, 0xDC, 0x02, 0xCD, 0x56, 0xEF, 0x45, 0x3D, 0x70, 0x2F, 0x6A, - 0x11, 0xD7, 0xEB, 0xD7, 0x82, 0xD6, 0xEB, 0xD7, 0x82, 0xD6, 0x5F, 0x73, 0x4C, 0x68, 0xD6, 0x4E, - 0xB0, 0xF7, 0x1C, 0x9C, 0x1A, 0x10, 0xF9, 0xC3, 0x0F, 0xF9, 0x8A, 0x96, 0xE1, 0x07, 0x13, 0x03, - 0x6F, 0x17, 0xDD, 0xFA, 0x5E, 0x72, 0x8D, 0x6D, 0xEB, 0x8B, 0x80, 0x53, 0x4F, 0x06, 0xFA, 0x4B, - 0x95, 0x81, 0xFE, 0x72, 0x65, 0xA0, 0xBF, 0x54, 0x19, 0xE8, 0xFF, 0xB3, 0xC9, 0xC0, 0x2C, 0x66, - 0xF7, 0xDA, 0x33, 0x7F, 0x51, 0x9C, 0x77, 0xA4, 0xF0, 0x4B, 0xC4, 0x19, 0x08, 0xF6, 0x50, 0xD8, - 0x56, 0xBE, 0xCE, 0x47, 0xA3, 0xCE, 0x47, 0x4B, 0x9D, 0x4F, 0x46, 0x9D, 0x4F, 0x9A, 0xEA, 0x06, - 0x6A, 0x64, 0xC2, 0xC8, 0x52, 0x8A, 0xF2, 0xAE, 0x1D, 0xE5, 0xA9, 0xB8, 0x6A, 0xD7, 0x8D, 0xF2, - 0xB6, 0x9B, 0x51, 0xF9, 0xED, 0xEE, 0xE1, 0xC5, 0xEE, 0xE9, 0xBE, 0xA5, 0xEE, 0xEE, 0x38, 0x11, - 0x83, 0xA1, 0x07, 0xD8, 0x4C, 0xDC, 0xE8, 0x8B, 0x16, 0x5D, 0xD3, 0xAB, 0x08, 0xA1, 0xA9, 0x68, - 0xDE, 0xB7, 0x35, 0xE7, 0x01, 0xE2, 0x02, 0xBF, 0xEB, 0xFD, 0x63, 0x16, 0x27, 0x40, 0x69, 0xCB, - 0xCC, 0x63, 0x89, 0xF6, 0xC7, 0x09, 0xBD, 0x85, 0x95, 0x2F, 0x65, 0x59, 0x2E, 0x1A, 0x25, 0xAB, - 0x63, 0xB1, 0xAD, 0xE8, 0x9D, 0x9F, 0x18, 0x27, 0xFF, 0xFC, 0xE1, 0x60, 0x7C, 0x0F, 0xF5, 0x94, - 0x85, 0xF4, 0x6C, 0x3D, 0xC9, 0xDE, 0x42, 0x66, 0x0A, 0xE4, 0x28, 0x38, 0x8D, 0x42, 0x3C, 0xA8, - 0x4E, 0x03, 0x58, 0x4C, 0x9C, 0x08, 0x75, 0x37, 0xF0, 0x54, 0x83, 0x2E, 0x7D, 0x31, 0xD2, 0x9A, - 0xAD, 0x33, 0x23, 0xC3, 0x9A, 0xAF, 0xD3, 0x78, 0x6A, 0x52, 0xE6, 0x08, 0x44, 0x33, 0x57, 0x42, - 0x50, 0x61, 0x0B, 0x74, 0xF6, 0x8E, 0xF0, 0xAF, 0xF9, 0x8E, 0x18, 0x9D, 0xCC, 0xDE, 0x5A, 0x94, - 0x29, 0x83, 0xC1, 0xE8, 0xC3, 0x14, 0xF2, 0xD7, 0x94, 0x3B, 0x32, 0x0F, 0x07, 0xA7, 0x6B, 0x7D, - 0x72, 0xCD, 0x32, 0xCA, 0xB3, 0xB7, 0x2A, 0xA1, 0x30, 0xE2, 0x4F, 0x55, 0x62, 0x4E, 0x61, 0xE6, - 0x92, 0x08, 0xF1, 0x2E, 0x4C, 0xCA, 0x1C, 0x72, 0x15, 0x85, 0x13, 0xB2, 0x7B, 0xCA, 0x1B, 0x8C, - 0xC8, 0x14, 0xA8, 0x52, 0x13, 0x12, 0xE6, 0x5F, 0xBC, 0x4C, 0x13, 0xF5, 0x1D, 0x00, 0x25, 0xD1, - 0xC4, 0x0F, 0xC0, 0xC2, 0xBE, 0xF6, 0xC1, 0x00, 0x55, 0x13, 0x14, 0x73, 0xBF, 0x69, 0x18, 0xF9, - 0x60, 0xFC, 0xB8, 0x63, 0x9E, 0xC0, 0x58, 0x6E, 0xBF, 0xCC, 0x14, 0xA9, 0x7F, 0xD9, 0x26, 0xC1, - 0x6C, 0x3C, 0x6E, 0x9B, 0x1B, 0x14, 0x33, 0x6B, 0xAA, 0xCE, 0xC8, 0xB2, 0xF8, 0x04, 0x7C, 0xD1, - 0x60, 0x00, 0x7F, 0x7A, 0x7F, 0x29, 0xBF, 0x8B, 0xA1, 0xE6, 0x7D, 0xFD, 0xC0, 0x4F, 0x5C, 0x08, - 0xFC, 0x1F, 0xF8, 0x03, 0xCC, 0xB2, 0xBD, 0x08, 0x6A, 0xDB, 0x10, 0xE9, 0xCF, 0x4F, 0xFE, 0x0C, - 0x9B, 0x0D, 0xED, 0x90, 0x95, 0x65, 0x83, 0xE3, 0x37, 0x5B, 0xE3, 0xD9, 0xE5, 0xC4, 0x4F, 0xE4, - 0x5B, 0x26, 0xF8, 0xC4, 0x08, 0x4C, 0x32, 0x96, 0x81, 0xF8, 0x57, 0xE7, 0x73, 0xE6, 0x38, 0x42, - 0xCF, 0xAB, 0x70, 0x1E, 0x61, 0x76, 0x6D, 0xF4, 0x74, 0xAB, 0x71, 0x1B, 0xB2, 0xB8, 0xEB, 0x4E, - 0xA7, 0x7C, 0x32, 0xE5, 0xC1, 0x76, 0x18, 0xDA, 0x76, 0x06, 0xD3, 0xFD, 0x87, 0x7B, 0x27, 0xE0, - 0xFD, 0x72, 0xFC, 0x0E, 0x23, 0xA5, 0xCF, 0x28, 0xEC, 0x2E, 0xB2, 0x74, 0xDB, 0x58, 0xA1, 0x1B, - 0x02, 0xC0, 0x56, 0xE3, 0xF4, 0x3D, 0x98, 0x8D, 0xC0, 0xC5, 0xD5, 0x19, 0xEB, 0x51, 0x43, 0xAD, - 0xC1, 0xA6, 0x92, 0xA4, 0x40, 0x7D, 0x3D, 0x41, 0xE7, 0x82, 0x65, 0x7B, 0x86, 0xB9, 0x40, 0x79, - 0xA1, 0x8F, 0xFE, 0xE9, 0xA9, 0x16, 0x7C, 0x67, 0x64, 0xCF, 0x2E, 0x7C, 0xD1, 0x53, 0xD3, 0xC0, - 0xE5, 0x08, 0xD9, 0x93, 0x13, 0xC5, 0x40, 0x73, 0x13, 0x57, 0x3E, 0x62, 0x6F, 0x7F, 0xDB, 0xB4, - 0x68, 0xF2, 0x6A, 0x08, 0xC2, 0x68, 0x44, 0x93, 0x53, 0xD7, 0x8F, 0xA8, 0xC7, 0x94, 0xA9, 0xBE, - 0x64, 0x5C, 0x26, 0xC1, 0x6B, 0x56, 0x83, 0x97, 0x59, 0x58, 0xC4, 0x1E, 0xE2, 0x60, 0x85, 0x0C, - 0x56, 0x98, 0x24, 0x34, 0xE8, 0x2A, 0xE7, 0xEC, 0x45, 0xEF, 0x33, 0x9E, 0xF0, 0xFC, 0xE3, 0xD6, - 0xCD, 0x2C, 0xC3, 0x78, 0x18, 0x4F, 0x4F, 0xF8, 0xD3, 0x90, 0xB1, 0x45, 0xDD, 0x02, 0x61, 0x67, - 0xCA, 0x63, 0x16, 0x1A, 0xD1, 0xE5, 0xAF, 0x5C, 0x34, 0x58, 0x3B, 0xB6, 0xD9, 0x14, 0x81, 0x8F, - 0x45, 0x9B, 0x6A, 0x15, 0x4E, 0x46, 0x42, 0xBA, 0xD1, 0x75, 0x3D, 0x8F, 0xA5, 0x8F, 0x47, 0xCF, - 0x06, 0x3E, 0xEB, 0xDD, 0x6A, 0x1C, 0xBC, 0x3F, 0x06, 0xDD, 0x9B, 0xE0, 0x37, 0xFE, 0x54, 0x47, - 0x87, 0xB4, 0x28, 0x56, 0x69, 0x93, 0xED, 0x1D, 0x75, 0xEB, 0x2C, 0x18, 0x56, 0x63, 0xD7, 0x9C, - 0x0F, 0xD0, 0x6C, 0xAA, 0x29, 0xCC, 0xD9, 0x19, 0x31, 0x9A, 0x26, 0xCC, 0x5D, 0x0E, 0xBF, 0x70, - 0xC8, 0xE9, 0xC6, 0xD8, 0x47, 0xC7, 0xB7, 0x7B, 0x07, 0xBF, 0xE8, 0x3B, 0x64, 0x5E, 0xED, 0x57, - 0xFF, 0x73, 0x37, 0x0C, 0x86, 0x63, 0x7F, 0x88, 0xA1, 0x2B, 0x29, 0x6F, 0x5B, 0xF9, 0x7B, 0x2B, - 0x5A, 0xE8, 0x72, 0xC1, 0xFD, 0xEC, 0xA2, 0xC7, 0x39, 0xF2, 0x7C, 0xE2, 0xF0, 0x70, 0xC2, 0x5B, - 0x51, 0x5A, 0x00, 0x0D, 0xE8, 0x50, 0x35, 0xEE, 0xBA, 0x0E, 0x59, 0x2D, 0xC4, 0xA7, 0xF8, 0x6F, - 0xBE, 0xAA, 0xB3, 0xDD, 0x0A, 0x72, 0x19, 0xC4, 0x65, 0x58, 0xCB, 0x68, 0x53, 0xBA, 0x60, 0x21, - 0xCE, 0x92, 0x51, 0x6C, 0x6E, 0xD2, 0xE6, 0xCB, 0x4E, 0x96, 0xE9, 0x8F, 0x58, 0xD4, 0xB3, 0xDF, - 0x23, 0xE2, 0xFA, 0x83, 0x99, 0x78, 0x85, 0x99, 0x50, 0x6C, 0x3D, 0x91, 0x8F, 0xA1, 0x3C, 0xB8, - 0x1B, 0x12, 0x50, 0x69, 0x1F, 0x0A, 0xE8, 0xCB, 0x3A, 0x50, 0xDC, 0x49, 0x4B, 0x1F, 0xCA, 0xD3, - 0x58, 0x2D, 0xDC, 0xA3, 0x85, 0xB2, 0x63, 0xF1, 0xFE, 0xA1, 0xC1, 0x5F, 0xD6, 0xBD, 0x51, 0x6A, - 0xFB, 0x2F, 0xDE, 0x3D, 0xFE, 0x2A, 0xCC, 0xB2, 0x7B, 0xF7, 0x46, 0x8D, 0x73, 0x34, 0x3B, 0xC7, - 0x89, 0x2F, 0xEE, 0x1C, 0xEF, 0x7C, 0xBE, 0x73, 0xB9, 0x44, 0x1A, 0x45, 0xF9, 0x3F, 0x1A, 0x6D, - 0xFB, 0x43, 0x4F, 0x85, 0x0F, 0x98, 0xC8, 0x79, 0xBC, 0xD9, 0xEB, 0xAE, 0x6F, 0x15, 0x3C, 0xD6, - 0xA4, 0x05, 0x96, 0x58, 0x30, 0x9F, 0x87, 0xD1, 0xF0, 0x7A, 0x61, 0xCC, 0x3D, 0xA7, 0xDF, 0x75, - 0x2A, 0x51, 0x2F, 0x06, 0xDB, 0x29, 0x86, 0x6C, 0x91, 0x13, 0x5B, 0x4A, 0xA3, 0x85, 0xC5, 0xA3, - 0x24, 0x3F, 0x92, 0x5D, 0xE4, 0x95, 0x24, 0x31, 0x73, 0xE6, 0x28, 0xE1, 0x52, 0x55, 0xA3, 0x7D, - 0x51, 0x6F, 0xD3, 0xFC, 0x07, 0xCB, 0xE8, 0x6D, 0x59, 0xEA, 0x5D, 0xA3, 0xB7, 0xBC, 0xEA, 0xE2, - 0xBD, 0x2D, 0x6F, 0x6F, 0xE9, 0xAD, 0x71, 0x7A, 0xF1, 0xF0, 0x1E, 0xE7, 0x01, 0x16, 0xF4, 0xDA, - 0x72, 0x3E, 0xC2, 0xDF, 0xE9, 0xE1, 0x49, 0x0E, 0x72, 0xAF, 0xCB, 0x95, 0xB2, 0xA0, 0x12, 0x98, - 0x35, 0xAD, 0x8C, 0xCA, 0x8E, 0xFC, 0xDB, 0x4F, 0x0B, 0x33, 0x22, 0x0F, 0x2A, 0x0D, 0x05, 0x71, - 0xEC, 0x63, 0x2F, 0x5B, 0xEC, 0xB9, 0x33, 0xEF, 0xC0, 0x78, 0xA9, 0xC6, 0xD0, 0x94, 0xEA, 0x75, - 0xB6, 0x4A, 0x39, 0xA9, 0x41, 0x51, 0xCF, 0xAE, 0x91, 0xEB, 0x50, 0x24, 0x16, 0xA6, 0xB9, 0x28, - 0x5A, 0x14, 0xD7, 0x1C, 0xBD, 0xD7, 0x86, 0xB5, 0x2A, 0xC5, 0xD3, 0xC2, 0x83, 0x5C, 0x33, 0x77, - 0x94, 0x7D, 0xBC, 0xA7, 0x53, 0xF9, 0xA6, 0xDF, 0x42, 0x0C, 0xAB, 0x6E, 0x6E, 0x99, 0xE9, 0xE6, - 0xE5, 0xCD, 0x07, 0xCE, 0xF3, 0x1A, 0x77, 0x41, 0x4B, 0x65, 0xE4, 0x80, 0x26, 0xAE, 0x3F, 0x8E, - 0xE7, 0xEC, 0xF9, 0x3C, 0x80, 0x34, 0x1E, 0xA8, 0x0F, 0x9E, 0x2D, 0xDC, 0x73, 0x15, 0x48, 0xF1, - 0x94, 0x16, 0x6E, 0x31, 0xAC, 0x5B, 0xDD, 0xC9, 0x52, 0xD0, 0x3D, 0x3B, 0x37, 0xCB, 0x41, 0xDB, - 0x94, 0xBC, 0xB2, 0x83, 0x5F, 0x82, 0x86, 0xD7, 0xA1, 0x95, 0xA8, 0x77, 0xC3, 0x79, 0xF0, 0x30, - 0xF5, 0x5E, 0x0A, 0xAC, 0x52, 0xBD, 0x9B, 0x89, 0x6E, 0x1E, 0xC8, 0x83, 0xD2, 0x1C, 0x2D, 0x8A, - 0xDC, 0xAB, 0x95, 0x17, 0x94, 0xF8, 0x5A, 0x20, 0x2C, 0x7D, 0xD5, 0x32, 0xC9, 0x3C, 0xB0, 0xBB, - 0x55, 0x59, 0x69, 0xCC, 0x1E, 0x67, 0xF5, 0x1F, 0xD2, 0xE9, 0x1A, 0x50, 0xF2, 0xBB, 0x9A, 0x34, - 0xAB, 0xE9, 0x02, 0x9D, 0xD6, 0x4E, 0x07, 0x72, 0xE0, 0xF5, 0x2C, 0xA6, 0x8F, 0x05, 0x3E, 0x67, - 0xB9, 0x2F, 0x19, 0x8D, 0x71, 0x54, 0xB3, 0x24, 0xE8, 0x5F, 0xDB, 0x8A, 0x6B, 0x0E, 0x61, 0xC2, - 0x8E, 0x36, 0x6D, 0x66, 0x7D, 0x74, 0x24, 0xF0, 0x87, 0x5F, 0xD0, 0xB7, 0xC5, 0xDE, 0x6D, 0x93, - 0xBB, 0x13, 0xFE, 0x66, 0xCF, 0x9E, 0xEB, 0xED, 0x63, 0xCA, 0x82, 0x56, 0xBE, 0x8E, 0xED, 0x59, - 0x8E, 0x34, 0x1B, 0x82, 0x52, 0x7B, 0xEE, 0xE7, 0x49, 0xF2, 0x39, 0x3E, 0xBF, 0x69, 0x26, 0xE6, - 0x6F, 0x9A, 0x81, 0xF9, 0x9B, 0x65, 0x5E, 0x2E, 0xB8, 0xE7, 0xEA, 0xE8, 0x39, 0x9E, 0xF8, 0x0D, - 0x31, 0x1C, 0x39, 0xE2, 0x8E, 0x5C, 0x3F, 0x88, 0x45, 0xF8, 0x3A, 0x48, 0xA4, 0x16, 0xD0, 0xE3, - 0x07, 0x1E, 0xBD, 0xCB, 0x8E, 0x6B, 0x53, 0x17, 0xE8, 0x96, 0x28, 0xB1, 0x3F, 0x05, 0xF8, 0xF4, - 0x29, 0x2B, 0xCD, 0xE7, 0xEE, 0x8C, 0xC8, 0xD4, 0x8D, 0xD8, 0xB3, 0x89, 0xEA, 0xB3, 0x7F, 0xAC, - 0xF2, 0x67, 0x19, 0xF9, 0x4A, 0xCC, 0xC7, 0xC7, 0xD2, 0xD8, 0x43, 0x55, 0xD6, 0x94, 0x15, 0x9B, - 0x81, 0xC4, 0xF0, 0x56, 0xCB, 0xF6, 0x3C, 0x8F, 0x06, 0xCF, 0x36, 0xF2, 0xD3, 0xE0, 0x29, 0x69, - 0xB2, 0xB8, 0xBA, 0x4C, 0xDA, 0x8A, 0x0A, 0x3E, 0x16, 0x15, 0x7C, 0xB2, 0xA5, 0x1B, 0xC5, 0x9F, - 0xCB, 0x88, 0xBA, 0x5F, 0xB6, 0x2A, 0x9F, 0x09, 0xE7, 0xB7, 0x42, 0x18, 0xBB, 0xB7, 0x2D, 0x5C, - 0xD5, 0x93, 0x94, 0xAA, 0xE5, 0xD3, 0x59, 0x7C, 0xDD, 0x7A, 0xD4, 0x3E, 0xE9, 0x19, 0x4B, 0xF2, - 0x6F, 0xB4, 0xAA, 0x67, 0x04, 0x1E, 0xC5, 0x73, 0x90, 0x54, 0x17, 0xA5, 0xDE, 0x77, 0xF6, 0xF8, - 0x39, 0xD3, 0x86, 0x22, 0xEF, 0x8D, 0x72, 0x60, 0xAE, 0x8E, 0xA8, 0x16, 0x4A, 0x4E, 0x76, 0x8C, - 0x40, 0xFE, 0x22, 0x11, 0x82, 0xBA, 0x76, 0x01, 0xC2, 0x06, 0xC8, 0x1B, 0x11, 0x92, 0x26, 0x65, - 0xC5, 0xC8, 0xA2, 0x2F, 0x4E, 0xF0, 0x5A, 0x8D, 0x03, 0x46, 0x3D, 0x19, 0x87, 0x43, 0x46, 0x23, - 0xBB, 0x61, 0x9D, 0x36, 0x7F, 0x4A, 0x1A, 0xFF, 0xDE, 0x68, 0x17, 0x65, 0xA6, 0x55, 0x87, 0x04, - 0x29, 0x19, 0x52, 0xEC, 0x01, 0xE8, 0x44, 0x8B, 0xEB, 0xBE, 0x9A, 0x8D, 0x78, 0xA8, 0xA4, 0x29, - 0xF4, 0x3F, 0x90, 0x87, 0x85, 0x81, 0x15, 0x9C, 0x9B, 0xBD, 0xCF, 0x05, 0x55, 0x3F, 0xE6, 0xAA, - 0xF6, 0x8B, 0xAA, 0x7E, 0xCA, 0x55, 0x5D, 0x33, 0xAA, 0xDA, 0x67, 0xBF, 0x32, 0xA0, 0xB6, 0xEB, - 0xC9, 0x2A, 0xD5, 0x15, 0x35, 0x3E, 0x56, 0xD6, 0xF8, 0x54, 0x54, 0x43, 0x27, 0x4D, 0xBB, 0x89, - 0x9B, 0x5E, 0x1E, 0x52, 0x18, 0x4D, 0xDC, 0x28, 0x72, 0xEF, 0x3B, 0xF2, 0xA1, 0x77, 0xCC, 0x3B, - 0x39, 0x09, 0x83, 0x30, 0x9E, 0xBA, 0x43, 0x4A, 0xD8, 0x79, 0x19, 0x53, 0xC3, 0xC6, 0xB5, 0xA1, - 0x4C, 0x50, 0x94, 0x43, 0xB7, 0x42, 0x31, 0x10, 0x77, 0x05, 0xB2, 0xA5, 0x1F, 0x85, 0x21, 0xAF, - 0x54, 0x72, 0x2B, 0x03, 0x37, 0x05, 0x8B, 0xC0, 0x66, 0xDD, 0x57, 0xBB, 0x8C, 0xC1, 0x2A, 0xE6, - 0x31, 0xA3, 0x72, 0xAB, 0x08, 0xE3, 0x4C, 0xC3, 0x88, 0x7A, 0x8D, 0xB2, 0x8C, 0x03, 0xCC, 0x8E, - 0x7D, 0x30, 0x5A, 0x51, 0xFA, 0x92, 0xFC, 0xB2, 0xFA, 0x71, 0xF5, 0x53, 0x43, 0xBF, 0x95, 0x63, - 0xE9, 0xFD, 0x2B, 0xB2, 0xD1, 0xCE, 0xED, 0x79, 0x0A, 0x79, 0x1A, 0xFB, 0xBF, 0x51, 0x62, 0x53, - 0xCD, 0xF6, 0xE7, 0x6A, 0xB3, 0xA5, 0x73, 0xDE, 0xB5, 0x12, 0x27, 0x68, 0x38, 0x65, 0x63, 0xAF, - 0x1C, 0x56, 0x0E, 0xD9, 0xA3, 0xCF, 0x32, 0x68, 0xB6, 0xC9, 0x2B, 0xA8, 0xD3, 0x94, 0x7F, 0xE9, - 0x26, 0xFC, 0x9E, 0x60, 0x7E, 0xE5, 0xCB, 0xD5, 0x94, 0x73, 0x88, 0x15, 0xEB, 0xB3, 0xAD, 0x90, - 0x09, 0x18, 0x4C, 0xCE, 0x9B, 0xEB, 0x8B, 0xC2, 0x0F, 0xAD, 0xC6, 0xBF, 0xD9, 0x1B, 0x09, 0x6C, - 0xD0, 0x96, 0xBA, 0xC3, 0xEB, 0x96, 0xDD, 0xC2, 0x55, 0x75, 0xD2, 0x0F, 0xAD, 0xE4, 0xDA, 0x8F, - 0xDB, 0xAC, 0x23, 0xAD, 0x76, 0xA9, 0x56, 0x0F, 0x74, 0xAD, 0xDE, 0x8D, 0x67, 0x97, 0x31, 0xB7, - 0x4C, 0xD9, 0x4B, 0x07, 0x5A, 0x96, 0x21, 0x05, 0x68, 0xDA, 0x14, 0x16, 0x3C, 0x1E, 0x4F, 0x2F, - 0x35, 0x59, 0xBA, 0x04, 0x4A, 0x7D, 0x65, 0x7C, 0x58, 0xFB, 0xCC, 0x41, 0x64, 0x66, 0xF8, 0x57, - 0xDD, 0x08, 0x97, 0xE1, 0x60, 0xF5, 0x0C, 0xF1, 0xF4, 0x01, 0xE3, 0x0A, 0x63, 0x5C, 0xAF, 0x57, - 0xC7, 0x20, 0x4F, 0x1F, 0x39, 0x5E, 0x92, 0x51, 0x6E, 0x3C, 0x7F, 0xFE, 0xF8, 0xEF, 0x5B, 0x7C, - 0xCB, 0x67, 0x2D, 0xBE, 0xE5, 0x73, 0x16, 0x7F, 0x90, 0x7D, 0x9E, 0x7B, 0x2A, 0xBB, 0xBE, 0x8D, - 0x9E, 0x3E, 0x89, 0x3D, 0xA7, 0x9D, 0x9E, 0x8A, 0xE0, 0x7C, 0xB6, 0xBA, 0x81, 0x4E, 0xB1, 0xD7, - 0x8D, 0xD9, 0xA2, 0x59, 0xAB, 0x22, 0xC2, 0xD2, 0x5A, 0x24, 0x02, 0x2A, 0x6D, 0x65, 0x52, 0x5E, - 0x8D, 0x32, 0x4D, 0xCA, 0xEC, 0x65, 0xBA, 0x64, 0x3C, 0x82, 0xED, 0x6F, 0x8C, 0x98, 0xD5, 0xFE, - 0x4F, 0xEB, 0x68, 0x7B, 0x80, 0xEF, 0x9E, 0x4F, 0xB6, 0xFD, 0x84, 0x24, 0xBA, 0x78, 0x4F, 0x91, - 0x53, 0xAD, 0x55, 0x26, 0xB1, 0x29, 0x80, 0x73, 0x9B, 0xC5, 0xA9, 0x28, 0x7E, 0x3F, 0xDB, 0x8B, - 0x74, 0x6C, 0xEB, 0x6F, 0x31, 0xCA, 0x38, 0xAB, 0x78, 0x96, 0xD4, 0xCD, 0xDA, 0xB5, 0x4B, 0x8F, - 0x69, 0x72, 0x1D, 0x7A, 0xF5, 0x72, 0xD9, 0x65, 0x41, 0xC1, 0xF9, 0x44, 0x76, 0x0A, 0xC8, 0x8C, - 0xFF, 0x0A, 0x7C, 0xC3, 0xE3, 0x6E, 0x71, 0x97, 0x15, 0xFB, 0xAF, 0x6D, 0x0E, 0xC8, 0x42, 0x07, - 0x35, 0xE0, 0x84, 0x6F, 0xE2, 0xEA, 0x67, 0x51, 0x00, 0x75, 0x9B, 0xAC, 0x90, 0x96, 0x52, 0xC7, - 0xF4, 0x3F, 0x8A, 0x4A, 0xAB, 0x2C, 0xBB, 0x28, 0x8C, 0x58, 0xBE, 0xAA, 0x3D, 0x0A, 0x40, 0x36, - 0x69, 0x97, 0x13, 0x2F, 0xCD, 0x00, 0xA0, 0xB5, 0x9B, 0x84, 0x2C, 0x06, 0xA7, 0xB5, 0x56, 0x95, - 0xCA, 0xB0, 0x98, 0x5D, 0x3A, 0x03, 0x2A, 0xB8, 0x65, 0xF0, 0xD6, 0xCE, 0x2E, 0x93, 0xD6, 0x36, - 0xF0, 0xE0, 0x5B, 0xF3, 0x2B, 0x1F, 0xF3, 0x6E, 0x67, 0x97, 0xB9, 0x9D, 0xFE, 0x1E, 0xF5, 0x47, - 0xF9, 0x7A, 0x69, 0xD9, 0xDD, 0x96, 0x5C, 0x29, 0x28, 0xD9, 0x8D, 0x5B, 0xEE, 0x14, 0xD8, 0x37, - 0xE4, 0xD6, 0xF1, 0x4B, 0x6B, 0xAF, 0xDB, 0x6B, 0x17, 0x06, 0xBE, 0xF0, 0x56, 0x1B, 0x9F, 0x8D, - 0x44, 0x91, 0x45, 0x52, 0x9F, 0x6D, 0xFC, 0x0B, 0x92, 0x83, 0xD6, 0xBB, 0xBB, 0x20, 0x2F, 0x1F, - 0xD4, 0x84, 0xD1, 0x2F, 0xB9, 0xFF, 0x60, 0xF7, 0xC0, 0x97, 0x3A, 0x01, 0xB2, 0x51, 0x2C, 0x71, - 0x27, 0xA4, 0x83, 0x57, 0x56, 0x27, 0x1D, 0xB3, 0x92, 0x4A, 0x19, 0x17, 0xED, 0x95, 0x8C, 0xF1, - 0x2C, 0xAD, 0x64, 0x0E, 0x63, 0xA9, 0x23, 0x43, 0x76, 0x73, 0x31, 0x67, 0x86, 0xBE, 0x24, 0x95, - 0x3A, 0x34, 0x94, 0x59, 0x51, 0xE6, 0xD4, 0x30, 0xAC, 0xA5, 0xDA, 0x8E, 0x0D, 0xDB, 0x70, 0x99, - 0x43, 0xF9, 0x88, 0x0E, 0x8E, 0x05, 0xD1, 0xA7, 0x8E, 0x0E, 0x99, 0xE0, 0x6D, 0x15, 0x04, 0xC1, - 0xEE, 0xEF, 0x30, 0x19, 0x53, 0xD3, 0xE7, 0xA1, 0xB0, 0x5D, 0xF7, 0x7B, 0x98, 0x1B, 0x89, 0x39, - 0x7D, 0x1F, 0x75, 0xF6, 0x21, 0xCB, 0xF4, 0x7F, 0x18, 0xBB, 0x89, 0x87, 0xF9, 0x40, 0x14, 0xA6, - 0xCC, 0xE7, 0x07, 0x49, 0x67, 0xCB, 0x1F, 0xEA, 0x0B, 0xD1, 0xC4, 0x83, 0xD5, 0x4B, 0x53, 0xB2, - 0x6C, 0x93, 0x67, 0xA6, 0xC1, 0xB9, 0x34, 0x8F, 0x49, 0x6E, 0x53, 0xA4, 0x57, 0x58, 0x37, 0x5B, - 0x6C, 0x98, 0x1F, 0x36, 0xAB, 0x40, 0x3C, 0xD3, 0xBC, 0x32, 0x95, 0xE7, 0xDD, 0x8F, 0xE2, 0x0B, - 0x52, 0x64, 0xE0, 0x6B, 0xEE, 0xFE, 0x97, 0xE6, 0xD4, 0x51, 0xAE, 0xA7, 0x70, 0xEB, 0x03, 0xFE, - 0x55, 0x46, 0xB6, 0xFB, 0x0F, 0x50, 0xBF, 0xAD, 0x66, 0x33, 0xBD, 0x93, 0x63, 0x54, 0xE9, 0x54, - 0x57, 0xF9, 0xFB, 0xDF, 0x73, 0x75, 0x22, 0x9A, 0xCC, 0xA2, 0x80, 0x59, 0x2E, 0x06, 0x75, 0x23, - 0x9A, 0xE0, 0x4D, 0x20, 0x4D, 0x15, 0xB3, 0xCB, 0x57, 0xA0, 0xB2, 0x40, 0x7A, 0x64, 0x99, 0xF5, - 0xDD, 0x97, 0x5C, 0x1D, 0x61, 0x72, 0x2A, 0x9E, 0x8C, 0xA3, 0x2B, 0xE6, 0xB9, 0x48, 0xDC, 0x4B, - 0x72, 0xEB, 0xC6, 0x04, 0x97, 0x51, 0x82, 0xB7, 0x87, 0xA8, 0xD7, 0x21, 0x7C, 0x4A, 0x13, 0x96, - 0x84, 0x8B, 0x5F, 0x2F, 0x8B, 0x87, 0x11, 0xA6, 0x28, 0x30, 0xCC, 0x85, 0x31, 0x3D, 0x76, 0x03, - 0x77, 0x44, 0xA3, 0x73, 0xAC, 0x99, 0xBB, 0x2F, 0xC4, 0xDA, 0xEF, 0xBC, 0x4A, 0x22, 0xE2, 0x8E, - 0xFD, 0x51, 0xB0, 0xDD, 0x1C, 0xD3, 0xAB, 0xA4, 0x09, 0x1F, 0xAE, 0x77, 0x70, 0x63, 0xF5, 0x6A, - 0x15, 0x7E, 0xC1, 0x3F, 0x06, 0xA0, 0xC8, 0xC4, 0x1F, 0xDE, 0xCE, 0xAB, 0x2C, 0x25, 0xE6, 0x36, - 0x5F, 0xF8, 0x2F, 0xC3, 0xBB, 0x26, 0xF1, 0xBD, 0xED, 0x26, 0x22, 0xE4, 0xFB, 0x9C, 0xDD, 0xF1, - 0xB8, 0x49, 0x58, 0x26, 0x0D, 0xF8, 0x1A, 0x46, 0x93, 0x15, 0x56, 0x71, 0x85, 0x37, 0x55, 0xE8, - 0x62, 0xEE, 0x9A, 0x26, 0x2C, 0x8F, 0xFB, 0x78, 0xAD, 0x83, 0x43, 0x90, 0x24, 0x87, 0xA3, 0x11, - 0xDE, 0xDF, 0x00, 0x7A, 0x56, 0x11, 0xED, 0x6A, 0x12, 0xA5, 0xFF, 0x30, 0xBA, 0x15, 0xB5, 0xCD, - 0xDE, 0xF0, 0x63, 0xCF, 0x9B, 0x88, 0x5C, 0x6F, 0x0D, 0x85, 0x95, 0x77, 0x93, 0xF1, 0x75, 0x92, - 0x4C, 0x4B, 0xEF, 0x66, 0x29, 0xF5, 0xC4, 0x15, 0xAD, 0x37, 0x87, 0xFC, 0x86, 0x16, 0xAE, 0xC2, - 0xEC, 0x02, 0x59, 0x23, 0x6F, 0x20, 0xC9, 0x16, 0xEC, 0x02, 0x8E, 0xAA, 0x27, 0x40, 0xCE, 0x63, - 0x7A, 0x14, 0x0C, 0xC3, 0x09, 0xAA, 0x11, 0x59, 0x2D, 0xA2, 0xF1, 0x34, 0x0C, 0x62, 0x46, 0x24, - 0xCB, 0x2A, 0x21, 0xAE, 0x21, 0x92, 0xFD, 0xC1, 0x4F, 0xFC, 0xE2, 0x20, 0x98, 0x0F, 0x21, 0x5B, - 0xFC, 0x9F, 0xD4, 0x1F, 0xC8, 0xA7, 0xDB, 0x7A, 0xF7, 0x2B, 0x16, 0x53, 0x5D, 0xEA, 0x94, 0xBD, - 0xCB, 0x57, 0x53, 0xB8, 0x45, 0xEE, 0x84, 0x9C, 0x7C, 0x87, 0x97, 0x89, 0xEB, 0x83, 0x18, 0x2A, - 0xE5, 0x56, 0x19, 0xB7, 0xD6, 0x33, 0xE5, 0x9C, 0x5F, 0x3D, 0x49, 0x2B, 0x98, 0x22, 0xAA, 0x8C, - 0xB1, 0xA8, 0xF5, 0x38, 0x23, 0x2C, 0xF3, 0x44, 0xFC, 0x81, 0x83, 0x5C, 0xC4, 0x05, 0x18, 0x5F, - 0xA5, 0xEB, 0xD5, 0x63, 0xB5, 0xC7, 0x73, 0x08, 0x95, 0x8E, 0x17, 0xD6, 0xA9, 0x3B, 0x66, 0xBC, - 0x6E, 0xC5, 0xB8, 0x89, 0xBB, 0xE7, 0x7F, 0xE8, 0xD8, 0x31, 0x1A, 0xBE, 0x8B, 0xF1, 0xCB, 0x71, - 0xA3, 0x7A, 0x0C, 0x95, 0x29, 0x7E, 0x10, 0xDE, 0x06, 0xB8, 0xED, 0xCE, 0xEE, 0x4D, 0x32, 0x95, - 0x4A, 0x3D, 0x9C, 0xB7, 0xF5, 0xAF, 0xE1, 0x21, 0xC4, 0xA3, 0x03, 0xC5, 0xB1, 0xC4, 0xD1, 0x06, - 0xCC, 0x91, 0xF0, 0xFE, 0x8A, 0x01, 0x1B, 0x08, 0xC8, 0x8B, 0x03, 0xD5, 0xAC, 0x59, 0xF3, 0x39, - 0x11, 0x99, 0x13, 0xFD, 0x35, 0xBF, 0x88, 0x87, 0x8F, 0xFB, 0xE1, 0xAD, 0x74, 0xBC, 0x27, 0x0A, - 0xBA, 0x00, 0x4B, 0xF4, 0x6B, 0xED, 0x69, 0x55, 0x45, 0x7A, 0x55, 0x98, 0xDB, 0x76, 0xEA, 0xDB, - 0x62, 0x91, 0xCE, 0x7C, 0x66, 0xB3, 0x68, 0x9C, 0x84, 0x43, 0x4C, 0xD7, 0x03, 0xD2, 0xB6, 0x8A, - 0x20, 0xFE, 0x9D, 0x91, 0x8F, 0x6E, 0x43, 0x8D, 0x9B, 0xBF, 0x66, 0xE0, 0x31, 0xCF, 0x0E, 0xBA, - 0x12, 0x7F, 0x74, 0x19, 0x35, 0xDB, 0x9E, 0x18, 0x06, 0x21, 0xC6, 0xEA, 0x4D, 0xE6, 0x14, 0xBC, - 0xE0, 0x29, 0x28, 0x55, 0xA8, 0xDD, 0x95, 0xDE, 0xC9, 0xEE, 0x75, 0x44, 0xAF, 0x30, 0x8D, 0x8F, - 0xAC, 0x26, 0x84, 0x2E, 0xC3, 0x85, 0xA9, 0xA3, 0x0A, 0x46, 0x5F, 0x2E, 0x7B, 0x8A, 0xAB, 0x45, - 0x2E, 0xB2, 0xF3, 0x0F, 0x7E, 0xD1, 0xED, 0x4B, 0xDC, 0x1F, 0x64, 0x50, 0xB5, 0xFB, 0x97, 0x41, - 0xEE, 0xF6, 0x65, 0x56, 0x11, 0x6F, 0x60, 0x66, 0x8F, 0xDF, 0xCA, 0x95, 0x29, 0x5D, 0xF1, 0xB3, - 0x70, 0xCB, 0x2A, 0x09, 0xA7, 0xFA, 0xBD, 0xE0, 0x65, 0xC9, 0xF7, 0x93, 0x22, 0xBF, 0x71, 0x6E, - 0xDC, 0xA5, 0xFD, 0x8E, 0x99, 0xFF, 0xD9, 0xEA, 0x2E, 0x1C, 0xC8, 0x39, 0x85, 0xA8, 0x4A, 0x96, - 0xB9, 0x59, 0x53, 0xD2, 0x3C, 0xD9, 0x80, 0x5B, 0x13, 0x3D, 0xD5, 0x97, 0xCC, 0xBB, 0x9C, 0x40, - 0xB2, 0xBE, 0x34, 0xB6, 0x6A, 0xAB, 0xCE, 0x52, 0xDD, 0x99, 0x12, 0x52, 0xAD, 0x31, 0xB5, 0x47, - 0x97, 0xCE, 0xE8, 0x15, 0xA8, 0xC8, 0x6B, 0x7E, 0xE9, 0x3E, 0x3D, 0x56, 0x2B, 0xB5, 0x2C, 0x34, - 0x43, 0xD9, 0xC8, 0x4A, 0xC2, 0x2E, 0x81, 0xBF, 0xF6, 0x0D, 0x89, 0x57, 0x6E, 0xF4, 0xE3, 0xAF, - 0xBD, 0xA5, 0x5C, 0xE2, 0xE7, 0x90, 0x16, 0xBC, 0xB7, 0xCF, 0x09, 0xB5, 0x44, 0xA0, 0x4E, 0xA3, - 0x70, 0x84, 0xB9, 0x2C, 0x01, 0xB0, 0xFC, 0xF5, 0xAD, 0x1B, 0x78, 0x63, 0x1A, 0xE9, 0x8C, 0x65, - 0x50, 0xF2, 0xCD, 0x99, 0x86, 0xC1, 0x2C, 0x7A, 0xFC, 0x1A, 0xFC, 0x3C, 0x4D, 0xF9, 0xF3, 0x19, - 0x22, 0x19, 0xDF, 0x3C, 0x0D, 0xDD, 0x4B, 0xFE, 0x1E, 0x1B, 0xFB, 0x6F, 0x71, 0x43, 0x23, 0x55, - 0x41, 0x69, 0x92, 0x02, 0x25, 0xB5, 0x8B, 0xC1, 0x05, 0x79, 0xA5, 0x3C, 0x1B, 0xDC, 0x29, 0x8D, - 0x86, 0x94, 0x9D, 0xEA, 0xF3, 0xB2, 0xEE, 0x98, 0x5D, 0x3F, 0x27, 0xAB, 0x84, 0xFF, 0x99, 0x84, - 0x09, 0x6E, 0xF4, 0xFE, 0x8A, 0x7E, 0x6C, 0xE5, 0x66, 0xBE, 0x00, 0xBB, 0xE7, 0x46, 0x8A, 0xE7, - 0xF3, 0xD8, 0x4D, 0xAE, 0xBB, 0x51, 0x38, 0x03, 0x6A, 0x04, 0x58, 0x25, 0xD1, 0xD7, 0x4C, 0xC9, - 0x6D, 0x60, 0x18, 0x27, 0x96, 0x76, 0x38, 0xD5, 0xFE, 0x97, 0x10, 0x48, 0xEA, 0x65, 0xC9, 0xEB, - 0xD8, 0x9E, 0x5F, 0x90, 0xBC, 0x83, 0xF7, 0x1D, 0x1D, 0xF3, 0xD8, 0xA5, 0x04, 0x4F, 0x43, 0x49, - 0x90, 0xD7, 0x21, 0xB7, 0x91, 0xCF, 0x6E, 0xF2, 0x33, 0xF1, 0x06, 0x23, 0x82, 0xC9, 0x34, 0x7B, - 0x22, 0xA6, 0x61, 0xC9, 0xDF, 0x66, 0xC8, 0x84, 0xCE, 0xC8, 0x2A, 0xBC, 0x3C, 0xBB, 0x02, 0x49, - 0xD3, 0x2B, 0x54, 0x31, 0xD2, 0xD9, 0x5A, 0xDE, 0x04, 0x67, 0xDF, 0x52, 0x25, 0x8E, 0xC9, 0x11, - 0xB8, 0xEF, 0x69, 0xEF, 0xFE, 0xC8, 0x9B, 0x97, 0x6A, 0x85, 0x1F, 0xAA, 0x9C, 0x2F, 0xC4, 0x8C, - 0xD7, 0x2E, 0x10, 0xE9, 0xE9, 0x40, 0xD5, 0x39, 0xB0, 0x10, 0xD0, 0x5D, 0x04, 0x20, 0xA0, 0x66, - 0x60, 0x93, 0xE1, 0x74, 0x0F, 0x57, 0xCC, 0xDC, 0x9B, 0x2C, 0x85, 0x6F, 0x52, 0xE7, 0x1E, 0xAD, - 0x2E, 0xBB, 0x88, 0xC9, 0xBD, 0xA2, 0x80, 0xC4, 0x7E, 0xB5, 0xCA, 0xBA, 0xF9, 0xE3, 0x8E, 0xDC, - 0xC2, 0x36, 0xA9, 0x78, 0x68, 0x6F, 0x5F, 0x2B, 0x09, 0xAF, 0x5E, 0xAC, 0x3F, 0xB3, 0x2D, 0xEB, - 0x33, 0xAF, 0xAA, 0xA7, 0x15, 0x6F, 0x5D, 0xF3, 0xBE, 0xCC, 0xBC, 0xF9, 0xFB, 0x52, 0xD8, 0x46, - 0xE9, 0x8B, 0xFE, 0x64, 0xB6, 0x7A, 0x6D, 0xB9, 0x27, 0xB3, 0x9A, 0x7D, 0xB5, 0x8E, 0x9C, 0x7C, - 0x8A, 0xA9, 0xA0, 0x5F, 0x35, 0xDF, 0x51, 0x2D, 0x18, 0xA8, 0xAC, 0xD1, 0xFC, 0x03, 0x66, 0xB6, - 0xE5, 0xB3, 0x56, 0x7D, 0x77, 0x58, 0x3E, 0xCE, 0x5A, 0x3D, 0x78, 0xDE, 0xF5, 0x70, 0x5A, 0xDC, - 0x51, 0xEB, 0x33, 0xC6, 0xF9, 0xB3, 0x01, 0x76, 0x9E, 0x72, 0x74, 0xBA, 0x40, 0x0F, 0x95, 0x64, - 0x08, 0xD5, 0xED, 0x55, 0xBA, 0x03, 0xFE, 0xAA, 0x3C, 0x0B, 0x02, 0xD2, 0x4D, 0x65, 0x23, 0x5E, - 0x0C, 0xBF, 0x29, 0xCF, 0xD0, 0xD7, 0x4E, 0xFD, 0xA9, 0xB4, 0xF9, 0xDC, 0xC4, 0xDC, 0xB5, 0x69, - 0xD9, 0x0F, 0xDB, 0x83, 0x81, 0x69, 0x59, 0x1B, 0xC6, 0xA0, 0x8A, 0xB0, 0xC8, 0x16, 0x44, 0x26, - 0xAB, 0xF5, 0xD0, 0xDC, 0x33, 0x92, 0x7D, 0x3B, 0xFA, 0x71, 0xC3, 0x50, 0xCF, 0x39, 0xAB, 0x39, - 0x27, 0x59, 0x99, 0x2D, 0x81, 0xEF, 0x09, 0xBD, 0x95, 0x59, 0x8B, 0xB4, 0xF1, 0x35, 0x18, 0x68, - 0x1E, 0xFA, 0xE0, 0xC0, 0x1C, 0xC7, 0x23, 0xF1, 0x38, 0x92, 0xCC, 0xD8, 0xB3, 0x2F, 0x20, 0x42, - 0x09, 0xA6, 0x80, 0xC2, 0xD7, 0xDB, 0xD9, 0x02, 0x41, 0xFC, 0x98, 0xD0, 0xC9, 0x34, 0xB9, 0x57, - 0x45, 0xD2, 0x62, 0x38, 0x8B, 0x8B, 0x71, 0xFB, 0x06, 0x61, 0x45, 0x47, 0xEF, 0x82, 0x88, 0x42, - 0xFC, 0x20, 0x28, 0x01, 0x5E, 0x64, 0xC5, 0x47, 0x03, 0x42, 0x82, 0xD4, 0x34, 0x8C, 0x04, 0x6A, - 0x38, 0xFA, 0x22, 0x7B, 0x0E, 0xEE, 0xDE, 0x15, 0xCF, 0x03, 0xEC, 0x44, 0xC1, 0x82, 0x91, 0x6F, - 0xF4, 0xB1, 0xC6, 0x04, 0xC7, 0x95, 0x9D, 0xC3, 0x9D, 0xFE, 0x1C, 0x67, 0x02, 0x35, 0x8E, 0xC5, - 0xEA, 0xB5, 0x98, 0xEC, 0x94, 0x88, 0x89, 0x02, 0xBA, 0x48, 0x4A, 0x14, 0xE2, 0x9F, 0x6E, 0xAB, - 0x0D, 0xB2, 0xDD, 0x01, 0x7F, 0x6B, 0x50, 0x2F, 0x91, 0xF1, 0x44, 0x50, 0x58, 0xF2, 0x7A, 0xFB, - 0xD9, 0xBE, 0x32, 0x02, 0xCA, 0x23, 0x5B, 0xEC, 0x08, 0xB7, 0x80, 0x84, 0x5C, 0xD3, 0x0E, 0xD6, - 0x96, 0x68, 0xB4, 0xE4, 0xD2, 0x55, 0x0D, 0xD9, 0x48, 0x75, 0xE4, 0x80, 0x18, 0xB5, 0x4D, 0xE1, - 0xC5, 0x84, 0x46, 0x32, 0x78, 0x53, 0x4D, 0x29, 0x26, 0x45, 0x83, 0xF9, 0x0E, 0xA0, 0xFD, 0x4B, - 0xB1, 0xD5, 0x93, 0xC0, 0xDA, 0xD6, 0x5C, 0x49, 0x5A, 0x79, 0x16, 0xC8, 0xA8, 0xE0, 0xB3, 0x66, - 0xAB, 0xCB, 0x11, 0x65, 0xCB, 0x59, 0xC7, 0x2A, 0x01, 0x70, 0xDB, 0xCC, 0xD3, 0x72, 0xAE, 0x15, - 0xA0, 0x6C, 0xE7, 0xDD, 0x0D, 0x8D, 0x7D, 0x6C, 0xC7, 0xE4, 0x5C, 0x90, 0x85, 0xE2, 0x54, 0xD0, - 0x3E, 0x0D, 0x95, 0xAC, 0x9C, 0x3E, 0x82, 0xD0, 0x34, 0x6B, 0x17, 0xB9, 0x11, 0xAF, 0x00, 0x1B, - 0x3D, 0x0A, 0x32, 0x1C, 0x3F, 0xF1, 0x1A, 0xAD, 0x2B, 0xFD, 0x6F, 0xAD, 0x7F, 0x85, 0x38, 0x95, - 0xBC, 0xFC, 0x46, 0x7B, 0x96, 0x86, 0xE4, 0xF0, 0xEC, 0xEC, 0xFD, 0x59, 0x63, 0x31, 0x2D, 0x04, - 0xEC, 0xE0, 0xAB, 0x3C, 0x09, 0xC2, 0x84, 0xB8, 0x37, 0x60, 0xE8, 0x71, 0x3F, 0xF9, 0x96, 0xB1, - 0x56, 0x79, 0xFE, 0xCD, 0x1B, 0x9A, 0x68, 0xCA, 0x47, 0x37, 0x19, 0x2A, 0xF5, 0x93, 0x11, 0xED, - 0xA3, 0xAB, 0x39, 0xED, 0xA6, 0xB4, 0xAD, 0x93, 0xFB, 0x1F, 0xCE, 0xCE, 0x0E, 0x4F, 0xCE, 0x6D, - 0xDD, 0x2C, 0xEC, 0xA1, 0xA4, 0x03, 0xD5, 0xEC, 0x6C, 0x8A, 0xBA, 0x0E, 0x23, 0x01, 0xBE, 0x79, - 0xDF, 0x54, 0x15, 0x6E, 0xE2, 0x31, 0x2D, 0x63, 0x16, 0xD2, 0x00, 0x84, 0xDE, 0x34, 0x58, 0x1C, - 0xA4, 0xC6, 0x87, 0xAD, 0x52, 0x40, 0x76, 0x6A, 0xF4, 0x6C, 0x74, 0x08, 0xFD, 0xB4, 0x68, 0x17, - 0x63, 0x97, 0x43, 0xBD, 0x91, 0x22, 0x8D, 0x22, 0xA5, 0x85, 0x8D, 0x75, 0x86, 0x8B, 0xDD, 0x9C, - 0xD0, 0xDF, 0x70, 0x2D, 0xFD, 0xE3, 0xC7, 0xD7, 0xBA, 0x40, 0xD7, 0x9A, 0xEE, 0x39, 0xE9, 0xCE, - 0x0F, 0x05, 0xF4, 0xFF, 0x8D, 0xC8, 0x71, 0x87, 0x5E, 0x98, 0x2B, 0xA5, 0x7B, 0xFF, 0x5A, 0xC6, - 0xF5, 0x65, 0xDC, 0xB2, 0x54, 0xEA, 0xA2, 0xF9, 0xD8, 0x0B, 0xA5, 0x8E, 0xCD, 0xBA, 0x4C, 0x1A, - 0x04, 0xD9, 0x16, 0xC9, 0x11, 0x87, 0xAB, 0x4E, 0x29, 0xE5, 0x70, 0x5F, 0x06, 0x0A, 0xA2, 0xC2, - 0xEC, 0x35, 0x0A, 0x93, 0x96, 0x5A, 0x49, 0xB1, 0x3F, 0x16, 0x2B, 0xA1, 0xE5, 0xD7, 0x98, 0x47, - 0x9A, 0x5A, 0x55, 0x3A, 0x9D, 0x69, 0x03, 0xC9, 0x06, 0x5D, 0xEA, 0x8D, 0x67, 0xB8, 0x55, 0xB6, - 0x85, 0x89, 0x2B, 0xB1, 0x8B, 0x8C, 0x9D, 0xC2, 0x31, 0x25, 0x1D, 0x26, 0x56, 0x43, 0xA3, 0x88, - 0x4F, 0xF5, 0xA7, 0xA7, 0x81, 0x85, 0x7B, 0xCA, 0xCC, 0xCC, 0x9D, 0x75, 0x75, 0xB4, 0x01, 0x4C, - 0xF1, 0xDA, 0x9B, 0x68, 0xB6, 0x73, 0xDE, 0x36, 0x23, 0x21, 0xB0, 0x16, 0x68, 0xF7, 0xC6, 0xBF, - 0xA1, 0x01, 0x71, 0x31, 0xB5, 0x74, 0xD4, 0xC4, 0xD0, 0xB2, 0x88, 0x65, 0x41, 0x4D, 0xA2, 0x7B, - 0x5C, 0x89, 0xE4, 0x53, 0x84, 0x3C, 0xA6, 0xE2, 0x7E, 0xCA, 0x23, 0xEE, 0xC4, 0xFE, 0x49, 0x7F, - 0xA0, 0x8C, 0xF8, 0x01, 0x39, 0x38, 0xE8, 0x7A, 0xF2, 0x47, 0xBE, 0xD3, 0x95, 0x0E, 0x43, 0xFE, - 0x59, 0x43, 0xC4, 0x79, 0x18, 0x00, 0x2A, 0x7D, 0x2F, 0x9A, 0x7B, 0x1F, 0x8C, 0x2C, 0xF8, 0xB4, - 0xA1, 0xFA, 0xE4, 0x51, 0x7C, 0xAD, 0x5C, 0x8A, 0x4A, 0xD5, 0x23, 0x86, 0x0D, 0x5A, 0xBE, 0xE3, - 0x73, 0xA5, 0x13, 0x77, 0x6C, 0x29, 0xE1, 0xAA, 0xEA, 0xFD, 0xD5, 0x3B, 0xCA, 0xD2, 0xC5, 0x9A, - 0xC7, 0x76, 0xB6, 0x27, 0x06, 0x79, 0x42, 0x36, 0xBC, 0x64, 0xC3, 0x1E, 0x51, 0xBE, 0xBD, 0x76, - 0xD9, 0x72, 0x35, 0x62, 0x8C, 0x07, 0x1E, 0xCF, 0xE2, 0x54, 0x2B, 0x0F, 0xDD, 0x80, 0x50, 0x64, - 0x08, 0x53, 0x99, 0x7E, 0xC0, 0x9E, 0x95, 0x66, 0x17, 0xA7, 0x62, 0x51, 0x65, 0x97, 0x3F, 0x35, - 0x2D, 0x6A, 0x61, 0x3E, 0xE5, 0x30, 0x18, 0xDF, 0x8B, 0x03, 0xBE, 0xB8, 0x43, 0x56, 0x3A, 0x18, - 0x33, 0xD4, 0x61, 0xC3, 0xD4, 0xD5, 0x0F, 0xB1, 0xD4, 0xE7, 0x35, 0x24, 0xE3, 0x4D, 0xD5, 0xAB, - 0xDF, 0x10, 0x89, 0x3D, 0x7F, 0xE4, 0x27, 0xD9, 0x30, 0x81, 0x76, 0x6D, 0x9B, 0x61, 0x5B, 0x58, - 0x51, 0x67, 0x17, 0x5B, 0xC8, 0xAD, 0x7C, 0x7A, 0xFA, 0xB4, 0x2C, 0x45, 0x8E, 0x8A, 0x06, 0xA1, - 0x34, 0x57, 0x9A, 0xED, 0x6C, 0xE0, 0x60, 0x0B, 0x8F, 0xDD, 0x1F, 0x8F, 0xC9, 0x28, 0x0C, 0xBD, - 0x1A, 0xAD, 0x09, 0xB4, 0xCE, 0xC6, 0x77, 0xEE, 0xE6, 0x5D, 0x44, 0xAE, 0xF4, 0xAB, 0x0C, 0x80, - 0xF4, 0x27, 0x2C, 0xF8, 0xAA, 0x20, 0x3B, 0xE0, 0x65, 0x1B, 0x15, 0x10, 0x1F, 0x0C, 0x24, 0x88, - 0xB5, 0xA1, 0x67, 0x77, 0xE6, 0xF4, 0xD3, 0x24, 0x30, 0xDB, 0x51, 0x78, 0xA6, 0x61, 0x1C, 0xFB, - 0x18, 0xCB, 0xC4, 0xA5, 0x81, 0x3D, 0xB7, 0x2B, 0x6B, 0xA4, 0x53, 0x31, 0xFB, 0x70, 0x7C, 0xDC, - 0x9D, 0xF0, 0x9F, 0xEC, 0x1B, 0xB1, 0x7D, 0x5C, 0xB1, 0x7D, 0x3C, 0x3E, 0x1E, 0x0C, 0xBA, 0x31, - 0xFB, 0xD1, 0x9A, 0x13, 0xCB, 0x67, 0x00, 0xB0, 0x92, 0x7D, 0x7E, 0x62, 0x95, 0x13, 0xF6, 0xFC, - 0xF8, 0xC3, 0x39, 0xF7, 0x1F, 0x18, 0xE0, 0x15, 0x84, 0x5D, 0xB2, 0x0E, 0xB3, 0xEC, 0x85, 0xB3, - 0xB6, 0xB6, 0xFE, 0xCC, 0xC1, 0xE9, 0xC5, 0xF8, 0xD7, 0xCD, 0xA2, 0xCB, 0xB2, 0x99, 0xBE, 0x43, - 0xFA, 0xCB, 0x40, 0xFC, 0x1E, 0xE7, 0x9D, 0xC3, 0xAE, 0x3B, 0xC2, 0x0C, 0xEB, 0xE3, 0x2B, 0x37, - 0xE1, 0x2D, 0x3E, 0xEE, 0xB3, 0xEE, 0x10, 0x67, 0x83, 0xF4, 0x37, 0xBA, 0x7D, 0x67, 0xFD, 0x85, - 0x85, 0x94, 0x4C, 0x17, 0xED, 0x90, 0xB5, 0x25, 0x53, 0xD2, 0x67, 0xC4, 0xAC, 0x65, 0xC4, 0xAC, - 0xF4, 0x9C, 0x8D, 0x95, 0x5E, 0x6F, 0xC5, 0xD9, 0xE8, 0xF6, 0x36, 0xFB, 0x36, 0x72, 0xEC, 0x1A, - 0x6D, 0x07, 0x03, 0x34, 0x97, 0x44, 0xDA, 0x33, 0xA4, 0xE9, 0x8A, 0xDE, 0xD2, 0x88, 0xD3, 0xD3, - 0xEB, 0x21, 0x35, 0xCF, 0x9F, 0xBF, 0x78, 0xD1, 0x27, 0xAD, 0x03, 0x2E, 0x59, 0x58, 0x85, 0xFF, - 0xD6, 0x4E, 0x69, 0xCC, 0xCC, 0xD8, 0x80, 0x8E, 0xDC, 0x04, 0xF4, 0xE5, 0xC0, 0x1F, 0x05, 0xBA, - 0xD5, 0xA0, 0xCF, 0x5D, 0x27, 0x53, 0x1C, 0x99, 0x96, 0x4A, 0x8B, 0xB9, 0xBD, 0x85, 0x41, 0x91, - 0xBB, 0x8A, 0x52, 0xEB, 0x20, 0xEB, 0x9A, 0xFC, 0xBD, 0xA2, 0x33, 0x16, 0x39, 0x09, 0xCA, 0x8B, - 0xB1, 0x82, 0xAB, 0x8F, 0x2C, 0x4E, 0x5A, 0x27, 0x42, 0xBF, 0xEC, 0x92, 0x0E, 0xEA, 0xCA, 0x0A, - 0x7B, 0xB8, 0x12, 0xB4, 0x42, 0x36, 0xCE, 0x2E, 0x7F, 0xC1, 0xD2, 0x0F, 0x78, 0x62, 0x33, 0x56, - 0x42, 0xB9, 0xE6, 0xEE, 0xB0, 0xAD, 0x37, 0xBB, 0x6B, 0x29, 0x90, 0x4A, 0x34, 0x24, 0x06, 0x3C, - 0xA6, 0x1B, 0x4A, 0x5D, 0xB0, 0x40, 0xCF, 0xA2, 0x8B, 0x55, 0x59, 0xDA, 0xC4, 0x97, 0x82, 0x21, - 0x85, 0xE2, 0x67, 0x78, 0x5C, 0x52, 0x58, 0xBA, 0x09, 0xCA, 0x7D, 0x75, 0x35, 0x3F, 0xD3, 0xD5, - 0xBC, 0xF4, 0x8B, 0xAF, 0xCD, 0x1C, 0xAE, 0x72, 0xBC, 0xCE, 0xEF, 0x93, 0x26, 0xE8, 0x73, 0xE7, - 0xA1, 0xD7, 0xEC, 0x74, 0x11, 0xD8, 0x1A, 0x0C, 0xE5, 0x15, 0x9F, 0xCC, 0x40, 0x60, 0xC3, 0x03, - 0xC6, 0x26, 0x11, 0xF2, 0xA2, 0x41, 0x11, 0x7A, 0x45, 0x07, 0xA1, 0x80, 0xE6, 0x77, 0x7B, 0x1C, - 0x15, 0x46, 0xB6, 0xD0, 0x65, 0xD5, 0x56, 0xB6, 0x53, 0x15, 0xC5, 0x8F, 0x51, 0xB5, 0xFB, 0x40, - 0xEC, 0xBD, 0x29, 0x3F, 0x98, 0x25, 0x2C, 0xD8, 0xA2, 0x04, 0x51, 0x8A, 0xE6, 0xF8, 0x58, 0x0D, - 0x4C, 0x7D, 0xED, 0xC3, 0x92, 0x0C, 0xCB, 0x8A, 0xB6, 0xC4, 0x66, 0x0B, 0x31, 0x0B, 0x08, 0x7F, - 0x7F, 0xC5, 0x5E, 0x62, 0xC4, 0xC1, 0x58, 0xE9, 0x99, 0x7E, 0xEC, 0x87, 0xB2, 0xFE, 0xE2, 0xE4, - 0xFD, 0xC5, 0xC1, 0xE1, 0xFE, 0xD1, 0xF1, 0xEE, 0x3B, 0x63, 0x14, 0x62, 0x0A, 0x0B, 0x8F, 0x87, - 0xDD, 0x4A, 0xE9, 0x31, 0xD8, 0xAD, 0x8A, 0x03, 0xDF, 0x4C, 0xF1, 0x16, 0x56, 0x96, 0x65, 0x13, - 0x49, 0x65, 0xB4, 0xDA, 0x44, 0xF2, 0xF1, 0xAF, 0x29, 0xBF, 0x44, 0x03, 0x60, 0x99, 0xF2, 0x06, - 0x82, 0xC5, 0x94, 0x92, 0xC8, 0x9E, 0x66, 0x40, 0x56, 0xC9, 0x26, 0xA8, 0x7E, 0x76, 0x33, 0x4C, - 0xE2, 0x58, 0x25, 0x6B, 0x9B, 0x78, 0x2D, 0x3A, 0xF7, 0x50, 0x6A, 0x0E, 0x64, 0xDB, 0x8A, 0xE7, - 0xAF, 0xC8, 0x7F, 0xEB, 0x96, 0xE8, 0x81, 0x13, 0x70, 0xA3, 0x74, 0x02, 0xAE, 0xA7, 0x13, 0x50, - 0x5B, 0x7E, 0x97, 0x37, 0xFF, 0x6A, 0xCE, 0xBE, 0x6C, 0xDA, 0x69, 0x62, 0x50, 0x30, 0xE7, 0x4C, - 0xF9, 0x9F, 0x77, 0x96, 0x15, 0xCE, 0x31, 0xBB, 0x30, 0x6A, 0xAC, 0x61, 0x51, 0x92, 0xA2, 0x81, - 0x05, 0xB0, 0x5D, 0x12, 0xE7, 0x95, 0x2C, 0x5D, 0x88, 0xD4, 0x65, 0xA0, 0x86, 0xF4, 0xE8, 0xE2, - 0xA3, 0xC9, 0x4A, 0x8F, 0x8F, 0xF6, 0xCA, 0x23, 0x0D, 0xF7, 0xC5, 0xF1, 0xF1, 0xC5, 0xC1, 0xEE, - 0xE0, 0xAD, 0x31, 0xE8, 0x22, 0xF6, 0x27, 0xD3, 0x3C, 0x22, 0x88, 0x7F, 0xC5, 0xBC, 0xE4, 0x91, - 0x8D, 0xB0, 0xF1, 0xAC, 0x6B, 0x36, 0x1C, 0x05, 0x03, 0x67, 0xBC, 0xD4, 0x9A, 0xE9, 0xC3, 0xDC, - 0xD8, 0x7D, 0xD3, 0xA1, 0x28, 0x1E, 0x89, 0x7E, 0x3A, 0x12, 0xD2, 0x6C, 0x5D, 0xFA, 0x48, 0x80, - 0xFE, 0xFD, 0xCE, 0x06, 0xE3, 0xBB, 0x59, 0x9C, 0x14, 0xF6, 0xD4, 0x59, 0xA3, 0x8C, 0xA7, 0x7A, - 0x65, 0x87, 0xF2, 0x8B, 0xD4, 0x23, 0xAC, 0x20, 0x0F, 0x91, 0x38, 0x63, 0xE9, 0xE0, 0x22, 0x97, - 0xF9, 0x4B, 0x96, 0x2A, 0x71, 0x5B, 0x15, 0x4C, 0xC8, 0x54, 0xEB, 0x23, 0x75, 0x4F, 0xE8, 0x36, - 0xF2, 0x78, 0xBA, 0xAD, 0xE6, 0x4C, 0x22, 0xFF, 0x7F, 0xA9, 0x35, 0x7D, 0x14, 0xFA, 0xE9, 0x28, - 0x90, 0xC7, 0x31, 0xE9, 0xF9, 0xD4, 0xFD, 0x8E, 0x86, 0xE2, 0x7B, 0x53, 0x6A, 0x7F, 0x2E, 0x7D, - 0x26, 0x3C, 0x3C, 0xDA, 0x11, 0x89, 0xA5, 0x11, 0x3F, 0x25, 0xB1, 0x14, 0xA4, 0x59, 0x13, 0x5E, - 0xB4, 0x8D, 0x7B, 0x82, 0x16, 0x66, 0xCB, 0xA7, 0xE4, 0xA4, 0x87, 0x5A, 0x71, 0x35, 0xA3, 0x77, - 0x33, 0xBB, 0x4F, 0xD7, 0x21, 0xE1, 0x2C, 0xC1, 0x3F, 0x5C, 0xE1, 0xBE, 0x86, 0x46, 0x83, 0x50, - 0x77, 0x46, 0xA3, 0x67, 0xF5, 0x12, 0x78, 0x31, 0xA1, 0xA4, 0x69, 0x4C, 0x88, 0x66, 0x87, 0xD0, - 0x64, 0xA8, 0x3D, 0x2D, 0x87, 0x74, 0x33, 0x3A, 0x14, 0xBA, 0x3A, 0x36, 0x81, 0xB0, 0x3B, 0xAE, - 0x85, 0x37, 0x4F, 0x39, 0x71, 0xE3, 0xBB, 0x0F, 0x8B, 0x3C, 0xD5, 0x17, 0xA8, 0xB6, 0x75, 0xD2, - 0x66, 0xF2, 0x93, 0x7D, 0x6B, 0x2B, 0x6C, 0x36, 0x8F, 0x2D, 0x55, 0x32, 0xEC, 0x87, 0x3E, 0x0F, - 0x24, 0xF3, 0x42, 0xD9, 0x27, 0xC0, 0x5E, 0xE7, 0x81, 0xD0, 0x96, 0x0A, 0x4C, 0x1A, 0xC4, 0x4B, - 0x06, 0x39, 0xF8, 0x78, 0xBC, 0xF7, 0xFE, 0x1D, 0x03, 0x6A, 0x5E, 0x5B, 0x18, 0x87, 0xC1, 0x88, - 0xE5, 0x4B, 0x38, 0xA0, 0xA3, 0x88, 0x9A, 0x8E, 0x83, 0xDC, 0x48, 0x18, 0x43, 0x0B, 0x1B, 0x1A, - 0x13, 0x80, 0xB5, 0x1E, 0x4C, 0xD1, 0x4D, 0xC7, 0xDC, 0xE9, 0xA6, 0xA5, 0xAF, 0x48, 0xA1, 0x5E, - 0x93, 0x93, 0xDB, 0x2E, 0x57, 0xC3, 0xFC, 0xB4, 0x7D, 0xD6, 0xCE, 0x65, 0x1A, 0x7A, 0xE0, 0xF0, - 0x16, 0x91, 0x96, 0x4E, 0xA1, 0x1C, 0x0B, 0x9F, 0xC2, 0xAC, 0x62, 0xDA, 0x45, 0x56, 0xDD, 0xCA, - 0x7B, 0xF3, 0x97, 0x24, 0x28, 0x0B, 0x11, 0xB7, 0xF2, 0x2D, 0xA8, 0xE3, 0x32, 0xB7, 0x10, 0x7D, - 0xFF, 0xF3, 0xDF, 0x3A, 0x81, 0xF8, 0xAD, 0xD9, 0xD0, 0xC9, 0x5C, 0x04, 0x2E, 0xB1, 0xF5, 0x7B, - 0xE9, 0xBA, 0xE5, 0x42, 0x71, 0xFD, 0x2D, 0x43, 0xBD, 0x2C, 0x15, 0x9C, 0xB2, 0x91, 0x59, 0x3E, - 0x54, 0x45, 0xCD, 0x2C, 0xAF, 0xF3, 0x8A, 0x7D, 0xB2, 0x7C, 0x8A, 0x1F, 0x13, 0xB6, 0xB1, 0x59, - 0xFC, 0x53, 0x68, 0x5F, 0x8D, 0xE6, 0x63, 0x9B, 0xAB, 0x79, 0x1E, 0x9A, 0x05, 0x80, 0x32, 0x9A, - 0x6B, 0xEB, 0xFD, 0xCD, 0xA5, 0xEB, 0xFD, 0xC1, 0x60, 0x61, 0xCD, 0x9F, 0x63, 0xD1, 0x37, 0x5A, - 0x11, 0x84, 0xD4, 0x2D, 0xBE, 0x28, 0xD8, 0x08, 0x5F, 0xF9, 0x46, 0x94, 0x3F, 0x78, 0xC1, 0xB0, - 0x11, 0xDF, 0xCC, 0xAF, 0x24, 0x7F, 0x6F, 0x34, 0x1E, 0xAB, 0x0F, 0xED, 0x85, 0x57, 0x25, 0x1B, - 0xED, 0xE4, 0xB1, 0x19, 0x6F, 0xA8, 0xD7, 0xA5, 0x8B, 0xBB, 0x72, 0x17, 0xCF, 0xAA, 0x16, 0x96, - 0x2C, 0x40, 0x0F, 0xEC, 0x49, 0xF9, 0x38, 0x7C, 0xE3, 0xBE, 0x18, 0x8B, 0xC7, 0x23, 0xCC, 0xE8, - 0xB2, 0x0E, 0xE5, 0x2E, 0xA1, 0xE8, 0xF8, 0x8C, 0x98, 0x3F, 0x19, 0x84, 0x33, 0x84, 0xD5, 0x4D, - 0xB6, 0x59, 0xFD, 0xBB, 0xB7, 0xDA, 0x4D, 0xF0, 0xAE, 0xED, 0xB0, 0xBD, 0x45, 0xF4, 0x5C, 0x00, - 0xF2, 0x7C, 0x1B, 0x76, 0xC2, 0x1D, 0x9E, 0x65, 0x0A, 0x36, 0xAE, 0xD7, 0x91, 0x1A, 0x24, 0xC8, - 0x53, 0x64, 0xED, 0xE0, 0x66, 0x59, 0x5E, 0x9B, 0x59, 0x51, 0x82, 0x31, 0xE0, 0xB3, 0xB6, 0x37, - 0xC7, 0x6A, 0x5A, 0x72, 0x27, 0x91, 0x40, 0xEB, 0x29, 0xC2, 0xC5, 0x68, 0x48, 0xAD, 0x9C, 0x03, - 0x7F, 0xCA, 0x72, 0x84, 0xAA, 0xDB, 0xF7, 0x40, 0xDB, 0xB0, 0x0B, 0xD0, 0x2E, 0x99, 0x42, 0x23, - 0x9E, 0x8F, 0x47, 0x6C, 0xDD, 0x95, 0x0B, 0xB1, 0xA2, 0x24, 0x8B, 0x17, 0x2B, 0xD9, 0x80, 0xC7, - 0xB7, 0x7E, 0x32, 0xBC, 0x26, 0x65, 0x55, 0xD8, 0x31, 0x3D, 0x7F, 0x38, 0xF0, 0xA5, 0x91, 0xEA, - 0x94, 0x8F, 0x84, 0x7C, 0x69, 0xDD, 0x7C, 0x97, 0xCE, 0x48, 0xAA, 0x3B, 0xC4, 0x9B, 0xA9, 0xAD, - 0xDA, 0xDB, 0xF6, 0x02, 0x5C, 0xAA, 0x77, 0x62, 0xA9, 0x08, 0x61, 0x4F, 0x55, 0x88, 0x32, 0x73, - 0x55, 0x2E, 0x15, 0xE5, 0x45, 0x19, 0x4E, 0xF2, 0x78, 0x48, 0xF9, 0x7A, 0x5C, 0x88, 0x79, 0xE5, - 0x91, 0x30, 0x33, 0xEB, 0xA5, 0x84, 0xC7, 0xA9, 0x67, 0x69, 0xE9, 0xFD, 0x2D, 0xC3, 0xAB, 0xF9, - 0xB4, 0x96, 0xDE, 0x5F, 0x55, 0x5D, 0x96, 0x76, 0xFD, 0x11, 0xFA, 0x5C, 0x0B, 0x37, 0xEF, 0xFE, - 0x63, 0x60, 0x37, 0x57, 0x8B, 0x32, 0x79, 0x5B, 0x29, 0x25, 0xE1, 0xEB, 0x93, 0x22, 0x75, 0xF3, - 0xF5, 0xFF, 0x01, 0x15, 0x94, 0xC8, 0xB6, 0x83, 0x08, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x12, 0x60, 0x04, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0xB2, 0xE0, 0xFF, + 0xF9, 0xBE, 0x79, 0x07, 0x8C, 0x76, 0xB6, 0x25, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, + 0x59, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x99, 0xAC, 0x0F, 0x2D, 0xC2, + 0x32, 0x27, 0x12, 0xA9, 0x25, 0x29, 0x5F, 0x66, 0x8E, 0xDF, 0xE9, 0x3C, 0xC3, 0x79, 0xB2, 0xAD, + 0x02, 0x40, 0x12, 0x37, 0x52, 0xD4, 0xC5, 0xEE, 0x9C, 0xDE, 0xF1, 0x37, 0x93, 0xB6, 0x09, 0xA0, + 0xAA, 0x50, 0x28, 0x14, 0x80, 0x42, 0x55, 0xE1, 0xD6, 0x8D, 0xC8, 0xC0, 0x4D, 0xE8, 0x9D, 0xFB, + 0x40, 0x76, 0xC8, 0xBF, 0xDF, 0xC5, 0xAF, 0xD7, 0xD6, 0xFE, 0xFC, 0xCF, 0x3B, 0x3F, 0xF0, 0xC2, + 0xBB, 0xF6, 0x30, 0xEC, 0xBB, 0x89, 0x1F, 0x06, 0xED, 0x9B, 0x30, 0x4E, 0x02, 0x77, 0x44, 0x1F, + 0xD7, 0xEE, 0xE2, 0x7F, 0xDF, 0xFE, 0xE3, 0x1F, 0x6E, 0xA1, 0xD5, 0x1D, 0xBD, 0x8A, 0xC3, 0xFE, + 0x77, 0x9A, 0xC0, 0xDF, 0x7F, 0xFC, 0x83, 0x68, 0xE1, 0x7A, 0xDE, 0xD1, 0x2D, 0x0D, 0x92, 0x0F, + 0x7E, 0x9C, 0xD0, 0x80, 0x46, 0x8D, 0xFA, 0x30, 0x74, 0xBD, 0x7A, 0x8B, 0x84, 0xC1, 0x07, 0xF8, + 0xA5, 0xC9, 0xEA, 0x5E, 0x4F, 0x82, 0x3E, 0x82, 0x15, 0x1F, 0x1B, 0x14, 0x5B, 0x34, 0xC9, 0x3F, + 0xFF, 0xF8, 0x07, 0x02, 0x3F, 0x7E, 0xE0, 0x27, 0xBF, 0xD0, 0xAB, 0x1E, 0x83, 0xDD, 0xC0, 0x16, + 0x8F, 0x4A, 0x23, 0xAD, 0x3C, 0x6D, 0x96, 0x91, 0x03, 0xDD, 0x08, 0xE8, 0x1D, 0xC9, 0xAB, 0x88, + 0xEE, 0x21, 0x24, 0xA5, 0x62, 0x3B, 0x0C, 0x46, 0x34, 0x8E, 0xDD, 0x01, 0x85, 0x26, 0x19, 0xF8, + 0xC6, 0x28, 0x1E, 0x64, 0x40, 0xF1, 0x67, 0xEC, 0x46, 0x31, 0x3D, 0x0E, 0xFA, 0xE1, 0xC8, 0x0F, + 0x06, 0x58, 0xDA, 0xF6, 0xDC, 0xC4, 0x4D, 0xA1, 0x3D, 0x1A, 0xF4, 0x0D, 0x68, 0x83, 0x66, 0x00, + 0x22, 0x9A, 0x4C, 0xA2, 0x80, 0x78, 0x61, 0x7F, 0x32, 0x82, 0x4E, 0xB6, 0x07, 0x34, 0x39, 0x1A, + 0x52, 0xFC, 0x75, 0xFF, 0xE1, 0x18, 0x7A, 0x9E, 0x75, 0x0F, 0x39, 0x7A, 0xED, 0xDF, 0x53, 0xEF, + 0x83, 0x8B, 0x3D, 0x70, 0xB6, 0xE5, 0x4F, 0x61, 0x30, 0x90, 0xBE, 0x8D, 0x87, 0x6E, 0x72, 0x1D, + 0x46, 0xA3, 0xB3, 0x88, 0x42, 0x31, 0x14, 0xD4, 0x6A, 0xA2, 0x64, 0x40, 0x43, 0x8F, 0x26, 0x7E, + 0x9F, 0xC3, 0xD8, 0x70, 0xDA, 0x4E, 0x47, 0x2F, 0x01, 0x02, 0x77, 0xC8, 0x6A, 0xC7, 0xD9, 0x6C, + 0x77, 0x5E, 0x69, 0x65, 0x7B, 0x43, 0x6C, 0xD5, 0xD9, 0x74, 0x9C, 0x76, 0xDA, 0x8C, 0xF6, 0xE9, + 0xF5, 0xAF, 0xAC, 0x41, 0xF7, 0xA5, 0xD3, 0x75, 0xB6, 0xDA, 0x9B, 0x5B, 0x2F, 0xA5, 0xA2, 0xCF, + 0x58, 0xB4, 0xF1, 0xA2, 0xB3, 0xF5, 0xD2, 0xD9, 0x68, 0x6F, 0x38, 0xEB, 0x52, 0xD1, 0x17, 0x46, + 0xC0, 0xCB, 0xAD, 0xAD, 0xAD, 0xCD, 0xF6, 0xC6, 0xCB, 0x0D, 0x51, 0x32, 0x74, 0xE3, 0xE4, 0xAD, + 0x3F, 0xA4, 0xA7, 0x20, 0x4B, 0x32, 0xE1, 0xD7, 0xF8, 0x6D, 0x32, 0xBA, 0xA2, 0x91, 0xD4, 0xCF, + 0x80, 0x7D, 0xF8, 0x78, 0x8D, 0x0D, 0xE2, 0x1E, 0x1D, 0xD2, 0x7E, 0x42, 0x3D, 0xA9, 0x3C, 0x16, + 0x9F, 0x58, 0xB9, 0x0C, 0x2D, 0xBE, 0x09, 0x41, 0x1C, 0x07, 0xF8, 0x1D, 0xE5, 0x10, 0x47, 0xD7, + 0x1D, 0xC6, 0x54, 0x94, 0x86, 0x57, 0x89, 0xEB, 0x07, 0xD4, 0x3B, 0xE1, 0x63, 0x5F, 0xAD, 0xC6, + 0xBE, 0x1B, 0x53, 0xAD, 0x96, 0xC0, 0x22, 0x2A, 0x9D, 0x5F, 0x1C, 0x9C, 0x58, 0x40, 0x61, 0xC7, + 0x2E, 0xDC, 0x2B, 0xF8, 0x87, 0xDE, 0x27, 0x32, 0x8D, 0xFD, 0x30, 0x8A, 0x28, 0x13, 0x18, 0xBD, + 0x44, 0xC8, 0xA4, 0xFE, 0x19, 0x59, 0x27, 0x70, 0x5D, 0x3C, 0x8C, 0x69, 0x49, 0x91, 0xA0, 0x95, + 0x15, 0xF3, 0x0A, 0x80, 0x29, 0x8C, 0xBC, 0xF8, 0xE8, 0xE0, 0xE8, 0x2D, 0x14, 0x7C, 0xFD, 0xB6, + 0xAD, 0x7C, 0x7E, 0x27, 0xC6, 0x5F, 0x2E, 0xBA, 0x9E, 0x0C, 0x87, 0x67, 0x00, 0xEF, 0xD3, 0x18, + 0x84, 0x5D, 0xEE, 0x79, 0xDA, 0x32, 0xA6, 0xC9, 0x85, 0x3F, 0xA2, 0xE1, 0x24, 0xC9, 0x46, 0x23, + 0xF0, 0x0E, 0x61, 0x62, 0xA8, 0x5F, 0xFB, 0x37, 0xB4, 0xFF, 0xFD, 0x94, 0xDE, 0xBD, 0xF5, 0xA3, + 0xD1, 0x9D, 0x1B, 0x51, 0xB5, 0x14, 0x66, 0x83, 0xB5, 0xEC, 0x8F, 0x7F, 0xE8, 0x87, 0x01, 0xF0, + 0xF2, 0x20, 0x04, 0xFA, 0xFC, 0x00, 0x28, 0xC0, 0x7E, 0xE1, 0x18, 0x8B, 0x69, 0x75, 0xF0, 0xF1, + 0xE3, 0xF9, 0xE1, 0xF1, 0xE9, 0xDE, 0xC5, 0xD1, 0xE5, 0xF1, 0xE9, 0xD9, 0xA7, 0x8B, 0xCB, 0x8B, + 0xCF, 0x67, 0x47, 0x97, 0x87, 0x87, 0xAF, 0x89, 0xD3, 0x22, 0x6B, 0x6B, 0x87, 0xF4, 0xDA, 0x9D, + 0x80, 0x34, 0x1F, 0x1E, 0xB6, 0xBD, 0xF4, 0xA7, 0xBC, 0xE1, 0xC9, 0xC9, 0x6B, 0xD2, 0x61, 0x4D, + 0xE1, 0xD7, 0xF6, 0x08, 0x7F, 0xCA, 0x1B, 0x5C, 0x62, 0x8B, 0x2E, 0x6F, 0x41, 0x2A, 0x37, 0xB9, + 0x3C, 0xDC, 0xEB, 0xBD, 0x7F, 0x4D, 0xD6, 0x79, 0xBB, 0xD5, 0xEA, 0xED, 0x7A, 0x9F, 0x4F, 0xF6, + 0x3F, 0x7E, 0x78, 0x4D, 0x36, 0x78, 0xCB, 0xFF, 0xFA, 0xCF, 0xB4, 0xE9, 0x68, 0x54, 0x9F, 0xD6, + 0xB3, 0x5E, 0xEF, 0x35, 0xD9, 0xCC, 0x28, 0x25, 0xBD, 0x5E, 0x3B, 0x66, 0x3F, 0x15, 0xB0, 0x42, + 0xCB, 0xAD, 0x39, 0x5B, 0x8A, 0xAE, 0xBE, 0xC8, 0xBA, 0xBA, 0x3A, 0x5B, 0xF3, 0xB4, 0xC7, 0x2F, + 0xF3, 0x1E, 0xD7, 0x33, 0x08, 0xB5, 0xE9, 0x7D, 0xBE, 0x3C, 0xFD, 0x78, 0x79, 0x78, 0x74, 0x70, + 0x7C, 0xB2, 0x07, 0x40, 0x5E, 0xA5, 0x43, 0xDB, 0xEB, 0x91, 0x55, 0x72, 0x1A, 0x12, 0x8F, 0xF6, + 0xFD, 0x91, 0x3B, 0xAC, 0x44, 0x89, 0x0C, 0xA8, 0xE3, 0xC8, 0xEC, 0x98, 0x1D, 0x16, 0x32, 0x45, + 0x05, 0xD8, 0x91, 0x19, 0x54, 0x19, 0xE0, 0xF1, 0xE9, 0xCF, 0x7B, 0x1F, 0x8E, 0x0F, 0x2F, 0x3F, + 0x9D, 0xFE, 0xF5, 0xF4, 0xE3, 0x2F, 0xA7, 0x00, 0xA7, 0xDB, 0x92, 0x56, 0x12, 0x98, 0x3E, 0xB7, + 0x34, 0x02, 0xDD, 0x98, 0xCF, 0x20, 0x54, 0x9C, 0x6D, 0x27, 0xD3, 0x3E, 0xE9, 0xE7, 0xE3, 0x60, + 0x3C, 0x49, 0x84, 0x42, 0xD1, 0xA6, 0x5B, 0xBB, 0xA8, 0x2F, 0xEA, 0x22, 0x6E, 0xAC, 0x8F, 0xD9, + 0xE2, 0xB7, 0xB6, 0x86, 0xD3, 0x38, 0x1C, 0x52, 0xD8, 0x48, 0x0C, 0x1A, 0x35, 0x5F, 0xD4, 0x49, + 0x35, 0xDC, 0x6B, 0x52, 0x23, 0x2B, 0x04, 0x1B, 0x30, 0x80, 0xD8, 0x02, 0x69, 0xC3, 0xD5, 0x15, + 0x88, 0xC1, 0x85, 0x36, 0x1E, 0x0F, 0xFD, 0xA4, 0x51, 0x6F, 0xD5, 0xD3, 0xD5, 0x16, 0x96, 0x3D, + 0xD2, 0x18, 0xC2, 0x1A, 0x7F, 0xCF, 0xD6, 0x01, 0xF8, 0xCF, 0x1B, 0x56, 0xBF, 0x3D, 0xA4, 0xC1, + 0x20, 0xB9, 0x01, 0xF6, 0x75, 0xF0, 0xE3, 0xCA, 0x0E, 0xE9, 0x2A, 0x6B, 0x38, 0xC2, 0xF5, 0x71, + 0xED, 0xC0, 0xCA, 0x5F, 0xEF, 0xBF, 0x6D, 0xAB, 0x45, 0xB7, 0xEE, 0x30, 0x2B, 0x03, 0x92, 0x3A, + 0x72, 0xB9, 0xDE, 0x09, 0x8F, 0x93, 0x0D, 0xD0, 0x56, 0x48, 0xAD, 0x85, 0x4D, 0xF9, 0x07, 0xF8, + 0x25, 0xEF, 0x07, 0x6F, 0xD8, 0x1B, 0xC3, 0x40, 0x02, 0x68, 0xE8, 0xF6, 0xC8, 0x0D, 0xBC, 0x38, + 0x2F, 0xF3, 0xAF, 0x49, 0xC3, 0xF7, 0xDA, 0xC0, 0x91, 0xE1, 0xC4, 0xA3, 0x71, 0xA3, 0x16, 0x7B, + 0x27, 0xE1, 0x24, 0x80, 0x01, 0xAB, 0x35, 0x15, 0xC2, 0x39, 0xA0, 0x0B, 0xDC, 0x43, 0x84, 0xC1, + 0x5A, 0x78, 0x7D, 0x4D, 0x7A, 0x87, 0x04, 0x74, 0xA5, 0xAB, 0x56, 0x41, 0x78, 0xAC, 0x13, 0xA0, + 0xF6, 0x99, 0xA6, 0xAE, 0x19, 0x50, 0xF0, 0xE7, 0xC6, 0xF7, 0x68, 0xA3, 0x86, 0x6B, 0xD2, 0x89, + 0x1B, 0xC0, 0x08, 0x44, 0xB5, 0xE6, 0xB6, 0x5A, 0xEB, 0x51, 0xFD, 0x93, 0x02, 0x28, 0x05, 0x78, + 0x12, 0x4D, 0x0A, 0x60, 0xE3, 0x72, 0x58, 0x19, 0xB6, 0xF4, 0x6B, 0x86, 0x02, 0xC7, 0x07, 0x30, + 0xA8, 0xBB, 0x1B, 0x13, 0x97, 0xB1, 0xFB, 0x01, 0xD2, 0x34, 0x44, 0xD9, 0x6E, 0x2B, 0xF1, 0x93, + 0x21, 0x5B, 0x0A, 0xCF, 0x2F, 0xFE, 0xCA, 0x06, 0x49, 0x6B, 0x0C, 0x23, 0x48, 0x7A, 0xB0, 0x43, + 0x1B, 0xD7, 0x34, 0x08, 0xC6, 0xF2, 0x87, 0xFD, 0x56, 0x46, 0x37, 0xE5, 0xBA, 0x4E, 0x0E, 0x20, + 0x7B, 0xEB, 0xF6, 0x41, 0x42, 0x6F, 0xBB, 0x65, 0x7C, 0xBA, 0x82, 0x35, 0xFA, 0x20, 0x0C, 0xAE, + 0xFD, 0x81, 0xC1, 0xA6, 0x7C, 0xA0, 0x60, 0x49, 0x8D, 0xC3, 0xA8, 0xA4, 0x1A, 0x87, 0x35, 0x1E, + 0x4F, 0x85, 0x44, 0x93, 0x1B, 0x1A, 0x05, 0x34, 0x99, 0x5A, 0x31, 0x48, 0xCA, 0x80, 0xAD, 0xAD, + 0xF1, 0x5A, 0xEE, 0x70, 0x18, 0xDE, 0xFD, 0xE2, 0xBF, 0xF5, 0x3F, 0x82, 0x96, 0x39, 0x4A, 0x61, + 0x0F, 0x7D, 0xE0, 0x39, 0xB4, 0x83, 0x6A, 0x6F, 0x43, 0xDC, 0x42, 0xC0, 0xD6, 0x97, 0x12, 0x7A, + 0x3F, 0x76, 0x83, 0x18, 0x14, 0xC5, 0x8C, 0xE0, 0x7A, 0x34, 0xBA, 0x65, 0x42, 0x54, 0x09, 0x5C, + 0x91, 0xDC, 0x16, 0x0E, 0xCF, 0x28, 0x8C, 0x5D, 0xBF, 0xFF, 0xAF, 0x21, 0xFA, 0x21, 0x87, 0xE8, + 0xE8, 0xE7, 0xBF, 0xFE, 0x10, 0x23, 0xC3, 0xAB, 0x54, 0x18, 0x19, 0x5E, 0xF1, 0x77, 0x30, 0x32, + 0x76, 0xC5, 0x2C, 0x2D, 0x54, 0xFF, 0xC0, 0xF3, 0x16, 0xDF, 0xAF, 0xFF, 0x4C, 0x23, 0x84, 0x75, + 0x8C, 0x74, 0x5B, 0x16, 0xAD, 0x93, 0x09, 0xEC, 0xE0, 0x61, 0xE9, 0xA3, 0xC4, 0xBD, 0x0A, 0x6F, + 0x29, 0x31, 0x5B, 0x92, 0x84, 0xC6, 0x89, 0xD1, 0x2C, 0xF4, 0xFC, 0xEB, 0x07, 0x38, 0x4E, 0x24, + 0x09, 0xEC, 0x15, 0x62, 0xE2, 0x4D, 0x28, 0x49, 0x42, 0x38, 0x48, 0xF1, 0xA6, 0x64, 0xE8, 0x8F, + 0xFC, 0x84, 0x59, 0x25, 0x62, 0xFB, 0x1A, 0xB8, 0x0B, 0x67, 0xD8, 0x6E, 0xC7, 0x2E, 0x3E, 0xEC, + 0xC4, 0x08, 0xEA, 0x1C, 0xCE, 0xE8, 0x35, 0xEF, 0x21, 0x70, 0x47, 0x7E, 0x1F, 0xF0, 0xD1, 0xA1, + 0x75, 0xC0, 0x70, 0x9F, 0x11, 0xD0, 0xBB, 0x8F, 0x63, 0xB6, 0xCD, 0xE1, 0x56, 0x05, 0xFE, 0x47, + 0xA3, 0x7E, 0x12, 0xDE, 0xD1, 0xA8, 0xDE, 0x22, 0xF5, 0x4E, 0xA7, 0x6E, 0x15, 0x08, 0x86, 0x09, + 0xCD, 0x21, 0x8D, 0x0C, 0x44, 0x8B, 0x4C, 0x02, 0x0F, 0x64, 0x1C, 0x4E, 0x96, 0xB6, 0x26, 0x45, + 0xA8, 0x8E, 0x56, 0x7B, 0xB0, 0x5D, 0x4B, 0x04, 0xBA, 0xEE, 0x32, 0xD0, 0xD9, 0x07, 0x1C, 0x36, + 0x2C, 0x49, 0xC4, 0x78, 0x3E, 0x40, 0xD3, 0x8D, 0x8B, 0xA7, 0xED, 0xAB, 0x07, 0x82, 0x6B, 0xE7, + 0x24, 0xF0, 0x93, 0x69, 0x92, 0x11, 0x7B, 0x6F, 0x23, 0x4A, 0x7B, 0x63, 0x50, 0xAF, 0xB5, 0xA6, + 0x8A, 0xEF, 0x3F, 0xFE, 0x83, 0x68, 0x55, 0x7B, 0xFE, 0x3F, 0xA6, 0xD6, 0xBA, 0x71, 0x23, 0x0F, + 0x87, 0xFC, 0xF8, 0x70, 0x5A, 0x4D, 0x53, 0xB4, 0xA6, 0xB5, 0xF0, 0xDC, 0x87, 0xF8, 0x9C, 0x8E, + 0xE0, 0x98, 0x0F, 0x1D, 0x9E, 0x56, 0x79, 0x1C, 0x85, 0xB8, 0xAF, 0x71, 0xD0, 0x6A, 0x51, 0xB1, + 0x6E, 0x67, 0x86, 0xBA, 0xDD, 0x19, 0xEA, 0xAE, 0xCF, 0x50, 0x77, 0x63, 0x86, 0xBA, 0x9B, 0x33, + 0xD4, 0xDD, 0x9A, 0xA1, 0xEE, 0x8B, 0x2A, 0x75, 0x23, 0xD7, 0xF3, 0xC3, 0x93, 0xBD, 0x83, 0xA9, + 0x83, 0x46, 0x6F, 0xFD, 0x3E, 0xDD, 0xBF, 0x98, 0x2E, 0x10, 0xB0, 0x55, 0x4F, 0xCD, 0x4C, 0xD3, + 0xAA, 0x5E, 0xB9, 0x09, 0xCC, 0xAD, 0x87, 0x33, 0x1A, 0xF5, 0x99, 0x06, 0xCE, 0x6B, 0x1B, 0x2A, + 0x04, 0xB4, 0x86, 0xEF, 0x35, 0xA1, 0x2D, 0xCC, 0x8E, 0xF7, 0x17, 0x27, 0x1F, 0x8C, 0xCD, 0xE7, + 0x54, 0xED, 0x19, 0x25, 0xDF, 0x0D, 0x41, 0xB5, 0xA1, 0xB1, 0x56, 0x2C, 0x41, 0x5C, 0xDC, 0xEC, + 0xD3, 0x78, 0x00, 0xEC, 0xA5, 0xB5, 0x85, 0xC8, 0xEE, 0xE3, 0xAA, 0x16, 0x8D, 0xCE, 0xD1, 0xEA, + 0x63, 0x21, 0x98, 0x59, 0x83, 0x0E, 0xC2, 0xD1, 0x18, 0x34, 0x26, 0x6D, 0x34, 0xE7, 0x80, 0x8C, + 0x86, 0xA3, 0x73, 0xDA, 0xA7, 0xFE, 0xD8, 0x06, 0xDF, 0xAC, 0xA4, 0x23, 0x99, 0x86, 0x46, 0x48, + 0x23, 0x37, 0x31, 0xDA, 0x30, 0x4C, 0xA2, 0x08, 0x46, 0xFF, 0x4C, 0xAE, 0x66, 0x65, 0xF2, 0x9F, + 0xF1, 0x18, 0x0B, 0x27, 0xE6, 0xAF, 0x68, 0x0D, 0xDF, 0x11, 0x60, 0xCF, 0x51, 0x7E, 0xBF, 0x7D, + 0x85, 0xDA, 0x13, 0xBA, 0x83, 0xC7, 0x0C, 0x2B, 0x38, 0x38, 0x6C, 0x7C, 0x83, 0x61, 0x80, 0x36, + 0xE3, 0x46, 0x9D, 0xD9, 0xC5, 0x28, 0x1A, 0xC6, 0xF1, 0x64, 0x31, 0x13, 0xCB, 0xD2, 0x95, 0xF0, + 0xD3, 0x18, 0x4D, 0xEB, 0x29, 0xDB, 0x2D, 0x9D, 0xB2, 0x57, 0x6C, 0x2C, 0x80, 0xAC, 0x07, 0x0B, + 0xEF, 0x24, 0x9E, 0x8A, 0x8A, 0x57, 0x6B, 0x88, 0x13, 0x71, 0x65, 0x5C, 0x92, 0xF5, 0xDA, 0x3A, + 0x2B, 0x64, 0xDB, 0xB6, 0x55, 0xFC, 0x17, 0x9C, 0x9C, 0x92, 0x8D, 0xBC, 0x0C, 0x3F, 0x5B, 0xA0, + 0x9F, 0x12, 0xFF, 0xDE, 0xB0, 0xAC, 0xFF, 0xDC, 0x4A, 0xFF, 0x14, 0xF8, 0x99, 0xB1, 0xDF, 0x82, + 0x39, 0xBD, 0x04, 0x78, 0x2A, 0x9C, 0x9F, 0x0B, 0x70, 0x7E, 0x7E, 0x42, 0x9C, 0x5F, 0x0A, 0x70, + 0x7E, 0x79, 0x2A, 0x9C, 0xF1, 0x38, 0x08, 0xEF, 0xCE, 0x28, 0x85, 0x13, 0xC9, 0xC4, 0xBA, 0x61, + 0xCE, 0xB6, 0xAF, 0xC4, 0x69, 0x9A, 0x1B, 0x3C, 0x54, 0xEE, 0x63, 0x68, 0x0D, 0xAB, 0x64, 0xAC, + 0xE9, 0xF2, 0x5A, 0x6D, 0x16, 0x42, 0x04, 0x90, 0x82, 0x65, 0xC7, 0x8A, 0x62, 0x85, 0xF5, 0x16, + 0xF5, 0xD7, 0x9B, 0xAB, 0x68, 0x77, 0x26, 0x6C, 0x31, 0xDF, 0xA9, 0xE3, 0xC5, 0x83, 0x75, 0xDD, + 0xC8, 0xAE, 0x25, 0xDA, 0xE3, 0x49, 0x7C, 0x33, 0xB3, 0xC6, 0x10, 0xE0, 0xD3, 0x0B, 0x8C, 0x62, + 0x14, 0x69, 0x8D, 0xF9, 0xD0, 0x5C, 0x8F, 0xF8, 0x46, 0xC2, 0x80, 0xAE, 0x5D, 0x67, 0xCD, 0x28, + 0x13, 0xD7, 0x23, 0xBE, 0x0B, 0xB6, 0x68, 0x53, 0xF9, 0xD2, 0x08, 0xD8, 0x5F, 0x7B, 0x93, 0x44, + 0xC4, 0x1D, 0xFA, 0x83, 0x60, 0xA7, 0x3E, 0xA4, 0xD7, 0x49, 0x7D, 0xD7, 0x30, 0x58, 0x59, 0x9A, + 0x78, 0xBB, 0xB8, 0x16, 0x29, 0x34, 0xE2, 0x18, 0xAE, 0x61, 0x41, 0xE5, 0xE6, 0xE9, 0xC8, 0x57, + 0x6F, 0xF5, 0x86, 0x2D, 0x90, 0x24, 0x79, 0x18, 0xD3, 0x1D, 0xBE, 0xCE, 0x5D, 0x85, 0xF7, 0x75, + 0xD8, 0x74, 0xED, 0xD4, 0x6D, 0xF4, 0xD4, 0x09, 0x5B, 0x4A, 0xEB, 0x08, 0xEC, 0xF8, 0xB0, 0x4E, + 0xFA, 0x50, 0x21, 0x86, 0x3F, 0xC3, 0x68, 0xB4, 0xCA, 0x5A, 0xAF, 0x72, 0x78, 0x92, 0x65, 0xF1, + 0x00, 0x3F, 0xD7, 0x77, 0xAB, 0xD2, 0xB4, 0x96, 0xCC, 0x28, 0xB5, 0x30, 0xDE, 0xD0, 0xD8, 0x32, + 0x30, 0x78, 0xC7, 0x85, 0xB4, 0xCF, 0xB6, 0x86, 0x7E, 0xDA, 0xFF, 0xF5, 0xD2, 0x02, 0x4C, 0xBA, + 0xEB, 0x13, 0xF2, 0xE3, 0x7B, 0xDB, 0x85, 0x55, 0xCE, 0xB9, 0x1D, 0xD2, 0xD4, 0x4D, 0x1A, 0x98, + 0x0F, 0xEE, 0x15, 0x1D, 0xE6, 0xB7, 0x7F, 0x05, 0x35, 0x0F, 0x85, 0x8D, 0x3D, 0x6F, 0x97, 0xDA, + 0xDA, 0x2F, 0x8D, 0xF3, 0x25, 0xF6, 0x47, 0x6A, 0x96, 0x9A, 0xDA, 0xE1, 0x98, 0xBD, 0x6E, 0x3D, + 0x64, 0xCB, 0x77, 0x98, 0xFC, 0x5E, 0x41, 0x6A, 0xFD, 0xB5, 0xF3, 0x0D, 0x6D, 0x12, 0xC8, 0x12, + 0xBC, 0x31, 0xBD, 0xEC, 0x38, 0x2F, 0x36, 0xA0, 0x06, 0xFE, 0x6E, 0x42, 0x42, 0xCC, 0xFA, 0xB5, + 0xE7, 0x9F, 0x76, 0x64, 0xE0, 0x56, 0x02, 0xD2, 0x99, 0x79, 0x62, 0x23, 0x02, 0xFF, 0xDA, 0xB6, + 0xB7, 0x91, 0x2F, 0x5E, 0x99, 0xE0, 0xDC, 0x44, 0x86, 0x78, 0x19, 0xFB, 0x4D, 0xAD, 0xB1, 0x3C, + 0x04, 0x6A, 0xB7, 0x51, 0xD6, 0x2F, 0xD9, 0x85, 0x87, 0xF4, 0xB9, 0xCB, 0xB8, 0x91, 0x71, 0xC2, + 0xCE, 0x02, 0x0B, 0xF3, 0x77, 0x76, 0xC8, 0x46, 0x61, 0xDF, 0xE7, 0x25, 0xC5, 0xFA, 0x79, 0x3D, + 0xA7, 0x70, 0xC3, 0x79, 0xD1, 0xBD, 0xEC, 0x54, 0xE4, 0x07, 0xB4, 0xA1, 0x23, 0x34, 0xFB, 0xB0, + 0xDB, 0x68, 0xE8, 0x46, 0x4C, 0x69, 0x30, 0x0B, 0xDB, 0xB2, 0x4F, 0xA9, 0x64, 0x22, 0xA0, 0x7A, + 0xB3, 0xFD, 0xF7, 0xD0, 0x0F, 0x1A, 0xF5, 0x7A, 0xD3, 0x10, 0x23, 0x2C, 0x37, 0xCC, 0x1C, 0xEA, + 0x07, 0x63, 0x84, 0x3D, 0xFF, 0x56, 0x51, 0x38, 0x83, 0x28, 0x9C, 0x8C, 0x49, 0x14, 0xDE, 0xE5, + 0xFA, 0x4A, 0x9E, 0xA2, 0xA8, 0xAE, 0x0C, 0x91, 0x30, 0x80, 0x0E, 0x59, 0x47, 0x00, 0x9E, 0x1D, + 0x40, 0x8A, 0xB0, 0x1F, 0x0E, 0x57, 0xE3, 0xD1, 0xEA, 0x06, 0xC1, 0x5F, 0xB6, 0xD8, 0xBF, 0x8C, + 0x06, 0xD6, 0xBC, 0xBE, 0xAB, 0x35, 0xE5, 0xDC, 0x81, 0xF6, 0xAF, 0xDF, 0xAC, 0xB1, 0x1A, 0xD3, + 0xE9, 0x90, 0x3A, 0xA7, 0xE0, 0xDA, 0xA8, 0xAB, 0x3A, 0x9A, 0xFB, 0x59, 0x68, 0x9A, 0x37, 0x0C, + 0x92, 0x28, 0x1C, 0xD6, 0xA7, 0x21, 0x29, 0x64, 0x13, 0xE1, 0xA7, 0x21, 0xB9, 0x8C, 0xA9, 0xB0, + 0x6A, 0x2C, 0x1C, 0x17, 0xC1, 0x3D, 0x8A, 0xA2, 0x30, 0x27, 0xD5, 0x0F, 0x86, 0x7E, 0x40, 0xF9, + 0x37, 0x58, 0x0E, 0xC6, 0xD3, 0x01, 0xAF, 0x01, 0x53, 0x76, 0xF9, 0xBF, 0xB5, 0xD9, 0xCE, 0xA9, + 0xA9, 0xBB, 0x46, 0x7C, 0x16, 0xF9, 0x61, 0xE4, 0x27, 0x0F, 0x05, 0x2A, 0x3D, 0xAF, 0x59, 0xA6, + 0xD5, 0xF3, 0x5A, 0x29, 0xB8, 0x42, 0xE5, 0x9E, 0x57, 0x15, 0x5A, 0x5B, 0xC5, 0x90, 0x4E, 0x8F, + 0xB6, 0xA1, 0xB8, 0x4D, 0x6A, 0xD2, 0x29, 0xA6, 0x82, 0xFC, 0xCA, 0xEE, 0x3B, 0xF5, 0x23, 0xB7, + 0xE2, 0x9E, 0x52, 0x65, 0xB2, 0x40, 0x13, 0x76, 0xF6, 0x55, 0xFB, 0x6F, 0x1D, 0x6F, 0x1B, 0x74, + 0x6D, 0xD6, 0x58, 0xC0, 0xCC, 0x30, 0x71, 0x6C, 0xDD, 0xC6, 0xB9, 0x43, 0x8A, 0x26, 0xCF, 0x94, + 0xFE, 0x2E, 0x6D, 0xFE, 0x58, 0xF0, 0x64, 0xA2, 0x6E, 0xEB, 0xB2, 0x34, 0x8B, 0x2C, 0x22, 0x53, + 0x99, 0xB9, 0x73, 0x8B, 0x3D, 0xEE, 0xB4, 0xFC, 0x60, 0x20, 0x79, 0xE9, 0xD8, 0xAC, 0x27, 0x66, + 0xAD, 0xD9, 0x76, 0x48, 0x41, 0xDE, 0xB0, 0xD8, 0x2C, 0x66, 0x56, 0x9A, 0xC3, 0xC2, 0xC0, 0x2E, + 0x15, 0xCA, 0x7B, 0x63, 0x56, 0x9A, 0xAD, 0x33, 0x61, 0xE2, 0xA6, 0x0D, 0x0B, 0xED, 0x25, 0x46, + 0x9D, 0x99, 0xBB, 0x22, 0xCC, 0x96, 0xC7, 0x20, 0x68, 0xB9, 0xA5, 0xD3, 0x7A, 0xA6, 0xB3, 0xD6, + 0x6C, 0xC7, 0x51, 0x7F, 0x1E, 0x3B, 0xA0, 0xE1, 0x36, 0x62, 0x35, 0xD7, 0xD9, 0x9C, 0x4B, 0x66, + 0x3D, 0x1C, 0x09, 0x5F, 0x48, 0xEB, 0xF1, 0x28, 0x73, 0x93, 0x9C, 0x0B, 0x68, 0x88, 0x16, 0xFF, + 0x02, 0xA8, 0xDC, 0xD3, 0xD2, 0x00, 0x2B, 0x5F, 0x92, 0xB0, 0xD3, 0x07, 0x81, 0x33, 0x0D, 0x8D, + 0xC9, 0x1A, 0x61, 0xB6, 0x6B, 0x72, 0x35, 0x49, 0x12, 0xE5, 0x42, 0xAA, 0xA2, 0xE3, 0x44, 0x12, + 0x3D, 0xD8, 0x76, 0x71, 0xC2, 0xDE, 0x20, 0x8C, 0x84, 0xB9, 0xFB, 0x81, 0xB2, 0xB9, 0x21, 0x7D, + 0x37, 0xE9, 0xDF, 0x90, 0x06, 0xC5, 0xE5, 0xCF, 0xBA, 0x19, 0x54, 0x1C, 0x57, 0x8E, 0xE3, 0x78, + 0x42, 0xC9, 0x9D, 0x0F, 0xBB, 0xC7, 0xE3, 0xC3, 0xD4, 0x87, 0xA5, 0x39, 0xD3, 0x45, 0xE0, 0x14, + 0x0F, 0x93, 0xAA, 0x9D, 0x49, 0x5D, 0x09, 0x9F, 0xB7, 0x37, 0xF2, 0x10, 0xEE, 0x0D, 0x87, 0x24, + 0xA2, 0x83, 0xC9, 0x10, 0xDD, 0x82, 0x98, 0x26, 0xE7, 0xC3, 0xE9, 0x06, 0x1E, 0xD7, 0xB8, 0xFA, + 0x48, 0xCE, 0xD4, 0x53, 0x06, 0xC1, 0xBA, 0x9C, 0x3F, 0xCF, 0x98, 0x3D, 0x5A, 0xBD, 0xAF, 0x7A, + 0xE9, 0x85, 0x2A, 0x5A, 0x68, 0xD1, 0xCF, 0x28, 0x5B, 0xF3, 0x99, 0xE1, 0x87, 0x9B, 0xAA, 0x0F, + 0x6E, 0xDC, 0x60, 0x40, 0xC5, 0xC1, 0x49, 0xB3, 0x33, 0xD5, 0xEB, 0xDB, 0x79, 0x7D, 0x66, 0xF2, + 0x17, 0xF6, 0xED, 0x93, 0x78, 0x60, 0xAB, 0x9A, 0x52, 0x71, 0x18, 0x06, 0xF5, 0x84, 0x4C, 0xB8, + 0x27, 0x0D, 0x88, 0x91, 0x0B, 0xCC, 0xBF, 0xA3, 0x68, 0x99, 0xA1, 0xFE, 0x2D, 0x08, 0xC4, 0x9D, + 0x1B, 0x4B, 0x2A, 0x03, 0xC6, 0xE3, 0x3A, 0x14, 0x8E, 0xE0, 0x20, 0x72, 0xAA, 0x23, 0x8E, 0xC2, + 0xB1, 0x12, 0x17, 0xD5, 0x7C, 0xA4, 0xDF, 0x86, 0x51, 0x9F, 0xC2, 0x18, 0x32, 0x97, 0x6B, 0x41, + 0x84, 0x34, 0xB8, 0xD8, 0x95, 0x11, 0x75, 0xE3, 0x49, 0xC4, 0x2A, 0xE0, 0x0E, 0xF5, 0xFD, 0x3F, + 0xA0, 0x33, 0x9E, 0x1F, 0x8F, 0x71, 0xA4, 0x98, 0x2F, 0x3B, 0x5E, 0xA9, 0x92, 0x83, 0x49, 0x9C, + 0x84, 0x23, 0xFE, 0x77, 0xBD, 0xCF, 0xD8, 0x54, 0x6F, 0xCA, 0x1A, 0x9B, 0xAB, 0xDA, 0x98, 0x1D, + 0x30, 0x7B, 0x93, 0xE8, 0x96, 0x3E, 0x1C, 0x07, 0x8B, 0x43, 0x7A, 0x8B, 0x5A, 0x69, 0x7E, 0x30, + 0x4C, 0xA9, 0xED, 0x33, 0x77, 0x09, 0xD9, 0xB5, 0x8F, 0xDB, 0xE3, 0x96, 0x0C, 0xF4, 0x1D, 0x0D, + 0xE7, 0x87, 0x49, 0x03, 0xB4, 0xD9, 0x7C, 0x08, 0x07, 0x03, 0x76, 0x1F, 0xBB, 0x18, 0x98, 0xD3, + 0x24, 0xF2, 0xC7, 0xA9, 0x47, 0xC5, 0x12, 0x40, 0xA5, 0xDE, 0x14, 0xF3, 0x82, 0x42, 0xC7, 0xC2, + 0xB3, 0x30, 0x4A, 0x70, 0x76, 0x05, 0xE8, 0x6C, 0xB0, 0x18, 0x4D, 0x47, 0xF7, 0xB0, 0x9E, 0x07, + 0xEE, 0xF0, 0x6C, 0xC2, 0xD4, 0xF0, 0xBC, 0xC0, 0xC6, 0x70, 0x90, 0x4E, 0xCE, 0x68, 0x74, 0x0D, + 0x9B, 0xC5, 0x83, 0xFC, 0x78, 0xD3, 0x0B, 0x27, 0x51, 0x7F, 0x01, 0xB0, 0x6C, 0x41, 0xE4, 0x3B, + 0x83, 0x79, 0x41, 0xB8, 0x41, 0x42, 0x83, 0xC0, 0x3D, 0xA7, 0xD7, 0x34, 0xA2, 0x41, 0x9F, 0x9E, + 0x21, 0xA5, 0x0B, 0x80, 0x9B, 0x24, 0xE1, 0xF1, 0xC9, 0xA7, 0x11, 0x1A, 0xDE, 0xF7, 0xD0, 0x88, + 0x3A, 0x5A, 0x82, 0x60, 0xEC, 0x9D, 0x9F, 0xCD, 0x25, 0xAD, 0x39, 0x2C, 0xAE, 0x8C, 0x70, 0x2A, + 0x62, 0xDC, 0x80, 0xB2, 0xC7, 0xE4, 0x45, 0xA9, 0xD1, 0xDA, 0x28, 0x4E, 0xFA, 0xE3, 0x7D, 0x5C, + 0xAF, 0xD4, 0x36, 0x9E, 0xE5, 0x63, 0x5A, 0x33, 0xF5, 0x0B, 0x52, 0x0A, 0xBD, 0x9B, 0xFE, 0xD8, + 0x5A, 0xC0, 0xD1, 0xC3, 0x0E, 0x0B, 0xB7, 0x43, 0x96, 0x92, 0x03, 0xF3, 0x30, 0x9C, 0xD5, 0x7A, + 0xD4, 0xC3, 0x61, 0x98, 0x97, 0x12, 0xAC, 0x5A, 0xA9, 0xEA, 0x16, 0x8B, 0x64, 0x9C, 0x3C, 0xC0, + 0xCA, 0x84, 0x8C, 0x1B, 0xB2, 0xC8, 0xA3, 0x5A, 0x10, 0x06, 0xB4, 0x66, 0x04, 0xD3, 0x30, 0xC7, + 0xAA, 0x0A, 0xAD, 0xAF, 0x86, 0x61, 0xFF, 0x7B, 0xD6, 0x1C, 0x36, 0x69, 0x11, 0xC5, 0x45, 0xE1, + 0xA0, 0xF7, 0x33, 0x09, 0xF9, 0x92, 0x23, 0x1C, 0x8A, 0x98, 0x97, 0xAF, 0x8C, 0x40, 0x84, 0x2D, + 0xE4, 0x81, 0x44, 0x3C, 0x98, 0x81, 0x55, 0xC6, 0xE6, 0x8A, 0x29, 0x75, 0x6D, 0xED, 0x38, 0xDF, + 0x2E, 0xE4, 0xD5, 0xFB, 0xC3, 0x58, 0x44, 0xF5, 0x60, 0x8C, 0x42, 0xE6, 0x7E, 0xFA, 0x7F, 0x27, + 0xB0, 0xEF, 0xE6, 0x81, 0x2B, 0x61, 0x04, 0x7B, 0x8E, 0x46, 0xAD, 0x2D, 0x1F, 0x0E, 0x5B, 0x84, + 0xFF, 0xE9, 0x45, 0xE1, 0xD8, 0x0B, 0xEF, 0x82, 0x5A, 0x99, 0x97, 0xB3, 0x84, 0x42, 0x18, 0x01, + 0xE1, 0xFB, 0xCA, 0x8A, 0xB2, 0x22, 0x4A, 0x54, 0xC3, 0xA9, 0x4F, 0x6A, 0xF1, 0xF5, 0xFE, 0x5B, + 0x5B, 0x38, 0x2C, 0xB3, 0x93, 0xA4, 0x5A, 0xC2, 0xF7, 0x2B, 0xAC, 0x30, 0x1F, 0xC4, 0xB4, 0xBF, + 0xD2, 0x6E, 0xB7, 0x65, 0xDB, 0xEC, 0x66, 0x76, 0x3E, 0xDC, 0x09, 0x90, 0x11, 0x37, 0xD0, 0xB3, + 0x3F, 0x44, 0x85, 0x59, 0x79, 0x93, 0x9B, 0xFC, 0x5F, 0x07, 0x61, 0xD2, 0x68, 0xEB, 0x76, 0xFF, + 0x66, 0xCA, 0x36, 0x46, 0x8C, 0xB4, 0x8D, 0x79, 0x66, 0xAE, 0xA5, 0xFB, 0x59, 0x2B, 0xDF, 0x6C, + 0xB4, 0xC8, 0xB7, 0x5D, 0xD5, 0x68, 0x51, 0xAE, 0xCF, 0x00, 0x11, 0x3A, 0x2C, 0xD7, 0x5B, 0x75, + 0xF8, 0x57, 0x82, 0x05, 0xB4, 0xCC, 0x4C, 0x43, 0x76, 0x1D, 0x36, 0x1B, 0x1D, 0xD9, 0x3D, 0x9B, + 0x8D, 0x96, 0xB4, 0xB0, 0x90, 0x1E, 0x6D, 0x37, 0x1A, 0xC0, 0xCE, 0x61, 0xC0, 0xF7, 0xB4, 0x39, + 0x36, 0x33, 0x46, 0x0F, 0xE7, 0x67, 0x43, 0xAD, 0xC0, 0xAB, 0x68, 0xF1, 0x46, 0xD0, 0xC7, 0x3C, + 0x24, 0xA9, 0x91, 0x16, 0xB6, 0x48, 0xD7, 0x71, 0x9C, 0xA6, 0x55, 0xAD, 0x30, 0xB3, 0x21, 0x68, + 0x93, 0x16, 0x61, 0xBB, 0x71, 0x34, 0x96, 0xA8, 0x6A, 0x06, 0x7B, 0xC8, 0x6D, 0x8B, 0xDA, 0xEE, + 0x16, 0xAF, 0x41, 0x59, 0xC1, 0x6B, 0x82, 0x0C, 0xC8, 0x9A, 0x1B, 0x68, 0xFA, 0x43, 0xEA, 0x46, + 0x29, 0x9E, 0x8A, 0xC0, 0xEB, 0x56, 0x62, 0x7B, 0x93, 0x7E, 0x1F, 0x76, 0xE5, 0x8C, 0x5C, 0x39, + 0xC4, 0x22, 0x83, 0x25, 0x2A, 0xD8, 0x48, 0x15, 0x45, 0x9C, 0x58, 0x68, 0xCC, 0x11, 0xA8, 0x44, + 0xE6, 0xF0, 0x2B, 0x83, 0xB6, 0x13, 0x0A, 0x87, 0x81, 0x94, 0x48, 0xC1, 0xD8, 0x74, 0x67, 0x9E, + 0x07, 0x78, 0x5E, 0x8B, 0x03, 0x10, 0x1E, 0x26, 0x99, 0xFB, 0x8B, 0x2C, 0x7A, 0x96, 0xB3, 0x55, + 0x7A, 0x82, 0x44, 0xFB, 0x1A, 0x2E, 0x86, 0xED, 0x88, 0xA9, 0x9C, 0x86, 0xB0, 0xFF, 0x66, 0xF4, + 0x6D, 0x4F, 0x69, 0x86, 0xEE, 0x91, 0x8A, 0xCD, 0xB8, 0xC0, 0xE2, 0xC2, 0x0F, 0x69, 0xFF, 0xD4, + 0xCE, 0x53, 0xFA, 0x41, 0x70, 0x76, 0x42, 0x4D, 0xA4, 0xD3, 0xC8, 0xB4, 0x75, 0x6D, 0x2A, 0xA1, + 0x16, 0x6F, 0x05, 0x26, 0x07, 0xF6, 0xE1, 0x17, 0x83, 0x96, 0xCF, 0x06, 0x59, 0xBC, 0xE4, 0x11, + 0xAD, 0x09, 0x91, 0x17, 0x41, 0x3B, 0xB9, 0xE7, 0x92, 0x21, 0x4C, 0x92, 0x0C, 0xE8, 0x0B, 0xB7, + 0x5D, 0x82, 0x58, 0xD0, 0x28, 0x42, 0x67, 0xCE, 0x11, 0x22, 0xC4, 0x53, 0x86, 0x8A, 0xBA, 0x56, + 0x9C, 0x4A, 0x7F, 0xC6, 0xD5, 0x4A, 0x96, 0x53, 0x56, 0x28, 0x34, 0x73, 0x5A, 0xD8, 0xC2, 0x38, + 0xC0, 0xEE, 0xE6, 0x26, 0x50, 0xCD, 0xDC, 0x90, 0xAF, 0x28, 0xFC, 0x2F, 0xB9, 0xA3, 0x34, 0x20, + 0x0E, 0x3B, 0xE5, 0x43, 0x59, 0x0D, 0x0A, 0xFB, 0xE1, 0x70, 0xE8, 0x8E, 0x63, 0xFA, 0xEE, 0xB4, + 0xD7, 0xE3, 0xAE, 0xDB, 0xEC, 0x30, 0x6B, 0x4E, 0x64, 0x51, 0xAF, 0xC7, 0xB7, 0x3D, 0xA0, 0x5F, + 0xFA, 0xDC, 0xC5, 0xB6, 0xEF, 0x46, 0x54, 0x51, 0x1B, 0xA2, 0xC4, 0x26, 0x04, 0xC8, 0xCC, 0x6C, + 0x24, 0xA1, 0x2A, 0x6F, 0x6B, 0x93, 0x16, 0x50, 0x95, 0xAB, 0xAC, 0x74, 0x15, 0xF7, 0x05, 0xB3, + 0xB6, 0x99, 0x8C, 0x4B, 0x5B, 0x70, 0xF1, 0xB2, 0xA0, 0x50, 0xBB, 0x0C, 0xBB, 0x02, 0x1F, 0x37, + 0x7B, 0x6F, 0x7D, 0x3A, 0xF4, 0xE2, 0x86, 0x14, 0xD4, 0x75, 0x20, 0x98, 0x21, 0xB6, 0x55, 0x7D, + 0xC9, 0x17, 0x5B, 0xE7, 0x53, 0xC6, 0x60, 0x61, 0x2A, 0x10, 0xEE, 0xF1, 0xC0, 0xF9, 0xD4, 0xE0, + 0x80, 0x24, 0x64, 0x1B, 0x9F, 0xC2, 0xE6, 0xF9, 0xF8, 0x60, 0xDB, 0x41, 0x10, 0xC7, 0x33, 0x37, + 0xC4, 0x81, 0x15, 0x6D, 0xE1, 0xD7, 0x8A, 0xCD, 0xF7, 0xF3, 0x48, 0x03, 0x68, 0xCB, 0xE2, 0x0E, + 0xAA, 0x35, 0xEC, 0xC9, 0xD1, 0x07, 0xD0, 0x54, 0x44, 0x23, 0x54, 0x6B, 0x7C, 0x76, 0x26, 0xF1, + 0x49, 0x3E, 0xA5, 0x55, 0x6C, 0x0E, 0x47, 0xCD, 0x58, 0x86, 0x80, 0x7F, 0x56, 0x6B, 0xCA, 0x3C, + 0x19, 0xF3, 0xA6, 0x6C, 0x8B, 0x55, 0xB5, 0xC7, 0x0F, 0x71, 0x42, 0x47, 0x52, 0x8F, 0xF9, 0xDF, + 0xD5, 0x1A, 0x1F, 0xA9, 0x21, 0x16, 0xD0, 0x3C, 0x0B, 0xBA, 0xA8, 0x06, 0xE0, 0xF4, 0x42, 0xE2, + 0x19, 0xC6, 0x61, 0x54, 0x6B, 0x66, 0x39, 0xC9, 0xE4, 0x60, 0xA4, 0x3B, 0xBF, 0x1C, 0x9C, 0x58, + 0x0B, 0x4C, 0x65, 0xC5, 0xE7, 0x86, 0x90, 0x73, 0xC2, 0xA1, 0x98, 0x0A, 0x8A, 0x7B, 0xD8, 0xE7, + 0x0E, 0xA9, 0x68, 0x8C, 0x6F, 0x61, 0xE4, 0xF1, 0xC6, 0x2B, 0x49, 0x57, 0x75, 0x30, 0xE2, 0x61, + 0xE3, 0x15, 0xB4, 0x74, 0x23, 0xB7, 0x0F, 0xA7, 0xFD, 0x58, 0x56, 0x56, 0xEA, 0x5C, 0x6A, 0x4A, + 0xD8, 0x51, 0xDA, 0x0B, 0x51, 0x73, 0xDD, 0x68, 0x31, 0x77, 0xB5, 0x30, 0x30, 0xD4, 0x71, 0x3A, + 0xDD, 0x16, 0x0B, 0x6F, 0x35, 0x35, 0x26, 0x2F, 0x65, 0x7A, 0xB3, 0xE3, 0xB0, 0x06, 0xB6, 0x89, + 0x99, 0x31, 0x1B, 0x71, 0x1E, 0x60, 0xFC, 0x36, 0x85, 0x3A, 0x8C, 0x7D, 0x8D, 0x9C, 0x48, 0x1B, + 0x45, 0x7E, 0x00, 0x1F, 0x6E, 0x6B, 0x4C, 0x69, 0xBF, 0x72, 0x0A, 0x75, 0xF6, 0x2B, 0xA7, 0x0A, + 0x66, 0x03, 0xF6, 0xC1, 0xE9, 0xC7, 0xC5, 0x40, 0xE7, 0xBB, 0x96, 0x22, 0x13, 0x93, 0x38, 0x0B, + 0x28, 0xFB, 0x18, 0xDB, 0xA8, 0x07, 0x79, 0xAB, 0xCB, 0x03, 0x17, 0x18, 0x14, 0xBD, 0x0F, 0xE3, + 0x44, 0x08, 0xC0, 0xA6, 0x21, 0x00, 0x9B, 0x05, 0x02, 0x60, 0xE9, 0x7A, 0x41, 0xF7, 0x4D, 0x84, + 0xA8, 0x1C, 0x38, 0xC2, 0x57, 0xF8, 0xA3, 0xE3, 0x64, 0x1F, 0x67, 0xC4, 0x65, 0xEB, 0x1D, 0x8B, + 0x66, 0xE5, 0x76, 0x1B, 0x86, 0x6C, 0xDD, 0xD1, 0x31, 0xAD, 0x3B, 0xF3, 0xF7, 0x8E, 0x77, 0xE5, + 0x53, 0x4C, 0x23, 0x5B, 0x17, 0xF1, 0x3B, 0xD3, 0x5E, 0xC9, 0xF7, 0xEE, 0x20, 0x6C, 0xF7, 0xC3, + 0x11, 0xFE, 0x85, 0x5F, 0xC9, 0x08, 0x29, 0x98, 0xC0, 0xD2, 0x05, 0xDA, 0xC5, 0x87, 0x3D, 0xC7, + 0xC8, 0xF5, 0x87, 0x04, 0x16, 0xC4, 0x08, 0xF6, 0x16, 0x4F, 0x42, 0xC3, 0xDD, 0xDD, 0x5D, 0x7B, + 0xB9, 0x74, 0x14, 0xEC, 0x46, 0xF9, 0x51, 0x83, 0x93, 0x56, 0x22, 0x68, 0x32, 0x53, 0x94, 0x9E, + 0x4D, 0x69, 0x2E, 0xC4, 0xA6, 0xDB, 0x71, 0x3A, 0xD5, 0x9A, 0x29, 0x02, 0x50, 0xBB, 0x1A, 0x7A, + 0xD1, 0x65, 0x6F, 0xEC, 0x46, 0xDF, 0xDF, 0x4E, 0x82, 0x4E, 0x6D, 0x56, 0x10, 0x67, 0xBF, 0xCC, + 0x44, 0x6C, 0xCA, 0x7C, 0x0C, 0x2F, 0xFB, 0x5F, 0xF8, 0xCF, 0xCC, 0xDD, 0x45, 0x08, 0x80, 0x14, + 0x60, 0xD4, 0x74, 0xF3, 0x9F, 0x5C, 0xF9, 0x22, 0x72, 0x83, 0x78, 0xE4, 0x27, 0xEF, 0xDE, 0xED, + 0xD5, 0x0A, 0xAE, 0xEB, 0x0C, 0x53, 0x0A, 0x6E, 0x9A, 0x3E, 0xED, 0xFF, 0x9A, 0xBA, 0xA6, 0xE8, + 0xA6, 0xA4, 0xC9, 0xD5, 0xBD, 0xD8, 0xE8, 0x96, 0x9B, 0x4B, 0xEA, 0x3C, 0x0C, 0xC1, 0xF7, 0xFE, + 0xCF, 0x0E, 0x7A, 0x41, 0x7D, 0xE3, 0x0E, 0x51, 0x23, 0x76, 0x20, 0x40, 0x14, 0xBE, 0x17, 0x13, + 0x38, 0xB6, 0x47, 0xCC, 0xE6, 0xC5, 0x6E, 0x90, 0xB0, 0x5A, 0xB1, 0x65, 0x40, 0xC2, 0x5B, 0x68, + 0x15, 0x30, 0x3D, 0x16, 0xA5, 0x56, 0xDC, 0x5A, 0xA2, 0x4F, 0x16, 0x65, 0xD3, 0x2E, 0xB5, 0x6D, + 0x96, 0xB1, 0x47, 0x5A, 0x78, 0xC9, 0x98, 0x2F, 0xCB, 0x7E, 0x66, 0x4E, 0xE2, 0xAB, 0x8B, 0xBE, + 0x6C, 0xFB, 0x54, 0x5E, 0x64, 0xD6, 0xD6, 0x98, 0xD7, 0x99, 0xBC, 0x12, 0xA6, 0xEA, 0xDB, 0x72, + 0x45, 0x33, 0x4D, 0x7B, 0x0B, 0x5D, 0x1A, 0x5E, 0x81, 0x50, 0xDC, 0xB2, 0x05, 0x0D, 0xF6, 0x11, + 0x61, 0xE0, 0xE1, 0x4C, 0xDD, 0x72, 0xF0, 0xFF, 0xB6, 0x85, 0x65, 0xCB, 0x41, 0x2D, 0x07, 0x65, + 0xF2, 0x7C, 0xDE, 0xB7, 0x47, 0xAE, 0x96, 0x63, 0x3B, 0x0B, 0x63, 0x1F, 0xFF, 0xBB, 0xD7, 0xEF, + 0x4F, 0x40, 0x5F, 0x3E, 0x70, 0x8D, 0xBA, 0xD9, 0xEE, 0x58, 0xB0, 0x76, 0xDA, 0x0C, 0xED, 0x66, + 0xBB, 0x0C, 0x6D, 0xD1, 0x3C, 0x60, 0x17, 0x3B, 0x47, 0x2C, 0x0A, 0xA0, 0xA5, 0xA4, 0xFC, 0x29, + 0x9E, 0x3A, 0x59, 0x93, 0xCF, 0xD8, 0x44, 0x4A, 0x05, 0x54, 0xA1, 0xC9, 0x17, 0x68, 0x22, 0xA5, + 0x08, 0x9A, 0xD2, 0xE2, 0x83, 0x9B, 0xA0, 0x8D, 0x85, 0xB5, 0x69, 0x3B, 0xAF, 0x9C, 0xEE, 0xAB, + 0x8D, 0x17, 0xAF, 0xA6, 0xB5, 0x09, 0x83, 0x81, 0x68, 0xC4, 0x53, 0x1E, 0xBD, 0xDC, 0x74, 0x36, + 0x5F, 0x6C, 0x75, 0xA6, 0x34, 0xDB, 0x1B, 0x26, 0x7E, 0x32, 0xF1, 0xD8, 0xCE, 0x6C, 0x73, 0x0B, + 0xB0, 0xBD, 0x2C, 0x41, 0x24, 0x2E, 0x2B, 0xDE, 0x53, 0x7F, 0x70, 0x83, 0x88, 0x9C, 0xA9, 0x55, + 0xB5, 0x7B, 0x0D, 0xA9, 0x49, 0x25, 0xDD, 0x5E, 0x20, 0x87, 0xC5, 0x68, 0xCB, 0x45, 0x09, 0x44, + 0x45, 0x95, 0x89, 0x74, 0xA6, 0x94, 0xDF, 0x1D, 0xDA, 0x26, 0xCD, 0xBC, 0x23, 0xB7, 0xC0, 0xE8, + 0xCD, 0x37, 0x82, 0x33, 0x8E, 0xE2, 0x8C, 0x23, 0x69, 0x71, 0x8E, 0x52, 0xE7, 0xB6, 0x3A, 0xCF, + 0x5E, 0x38, 0xEC, 0xA7, 0x45, 0xB2, 0x5F, 0xB2, 0x59, 0x9D, 0x96, 0xE1, 0x94, 0x16, 0xBF, 0x56, + 0xD0, 0x26, 0xD3, 0xB0, 0x7E, 0xFE, 0x4D, 0xB0, 0x7E, 0x79, 0x12, 0xAC, 0x8F, 0xE5, 0x8E, 0x1A, + 0x73, 0xE8, 0xB7, 0x39, 0x75, 0xDC, 0x6C, 0x7A, 0xCE, 0xC2, 0xB6, 0xFC, 0xBA, 0x0D, 0x96, 0xAF, + 0x9F, 0x69, 0x84, 0x41, 0xF0, 0xF0, 0x6D, 0x8D, 0xB9, 0x24, 0xE5, 0xEE, 0x86, 0xD5, 0x18, 0x2E, + 0xC9, 0xFF, 0x6A, 0xA7, 0xE3, 0xAC, 0x6F, 0xB4, 0xC8, 0xCB, 0x97, 0xCA, 0x11, 0x93, 0x7F, 0x46, + 0x66, 0x63, 0x41, 0xA5, 0xC5, 0xA2, 0x00, 0xA1, 0x3E, 0x75, 0x56, 0x31, 0x83, 0x9C, 0xD3, 0x22, + 0xE2, 0x3F, 0x12, 0xC6, 0x4D, 0x31, 0xBC, 0xEC, 0x97, 0xF9, 0x45, 0xAA, 0x68, 0xF2, 0xAD, 0x76, + 0x1D, 0x98, 0xE9, 0xCC, 0xE4, 0xDF, 0x56, 0x10, 0xB3, 0x0F, 0x88, 0x98, 0xFD, 0x52, 0x5D, 0xAA, + 0x1E, 0x4B, 0xCE, 0x7E, 0x99, 0x4F, 0x40, 0xB6, 0xEB, 0xB3, 0xD8, 0xB2, 0x0B, 0x4F, 0x49, 0xBC, + 0xB5, 0x71, 0x06, 0x9C, 0xE1, 0x94, 0x54, 0x7D, 0x27, 0x61, 0x22, 0x9C, 0xF5, 0x0C, 0x58, 0x01, + 0x97, 0xAD, 0x77, 0x0B, 0x9C, 0x01, 0x17, 0xC6, 0xC8, 0x36, 0xEF, 0x0B, 0xE3, 0xAC, 0x7E, 0xD6, + 0xB2, 0x0D, 0xE8, 0x0C, 0x67, 0x2D, 0xDB, 0xF0, 0x54, 0x38, 0x6B, 0x29, 0xCD, 0xD2, 0x53, 0x4F, + 0x6D, 0xD6, 0x46, 0x96, 0x83, 0x4E, 0x71, 0x33, 0xCB, 0xB9, 0xCE, 0xBB, 0x0B, 0x92, 0xBB, 0xA0, + 0x3B, 0x33, 0x00, 0x8E, 0xF7, 0x97, 0xF3, 0xCD, 0xBB, 0xF3, 0x70, 0xE3, 0x7D, 0x4D, 0x39, 0x12, + 0x64, 0xF6, 0x34, 0xC9, 0xFC, 0x69, 0xEC, 0xE7, 0x0B, 0x93, 0xFB, 0x7C, 0x58, 0xDD, 0x77, 0x03, + 0x4F, 0xF5, 0x50, 0x4C, 0xE7, 0xF0, 0x34, 0xB7, 0x97, 0xB2, 0xF9, 0xCC, 0x0F, 0x41, 0xDC, 0xBB, + 0x4F, 0x87, 0x75, 0xC8, 0x92, 0x13, 0x08, 0xDB, 0xDC, 0x45, 0xF8, 0x9D, 0xE2, 0xD1, 0x82, 0x55, + 0xDE, 0xB6, 0x06, 0x7A, 0x4E, 0x68, 0x16, 0x49, 0x65, 0x8D, 0xF8, 0xB4, 0x5A, 0x0D, 0xCB, 0xF1, + 0x81, 0xB8, 0x6F, 0xF1, 0xFF, 0x67, 0x22, 0xBF, 0xBE, 0x55, 0x64, 0x44, 0x3C, 0x5B, 0x74, 0x35, + 0x9D, 0x4A, 0x4C, 0xAD, 0x66, 0xB9, 0xEA, 0x62, 0xDE, 0x38, 0x7F, 0xA5, 0x0F, 0xE7, 0x34, 0xA0, + 0x77, 0xEE, 0xB0, 0x56, 0xE2, 0xE5, 0xFA, 0x68, 0x1C, 0x11, 0x31, 0xCD, 0xCD, 0x54, 0xD3, 0xEA, + 0x9D, 0x7F, 0xED, 0x9F, 0xC2, 0x71, 0x28, 0x8C, 0xBE, 0x3B, 0xBD, 0xDE, 0xF1, 0x21, 0x37, 0xFE, + 0x6D, 0xCA, 0x8A, 0x80, 0x9F, 0x91, 0x8A, 0x14, 0x01, 0x62, 0x29, 0xB1, 0x2C, 0xDA, 0xF0, 0x9C, + 0xB9, 0x71, 0x0C, 0xBF, 0x78, 0xCF, 0x80, 0xAB, 0xF3, 0x4C, 0x7D, 0xEA, 0x3C, 0x63, 0x9F, 0xBA, + 0xCF, 0xD4, 0xA7, 0xEE, 0x33, 0xF6, 0x69, 0xFD, 0x99, 0xFA, 0xB4, 0xBE, 0xCC, 0x3E, 0xA9, 0x1B, + 0x9D, 0xB3, 0xDB, 0x44, 0x37, 0x71, 0x63, 0xFA, 0x14, 0xA5, 0x82, 0xBE, 0x0F, 0x9A, 0xBA, 0xFF, + 0x19, 0xA7, 0x6D, 0xF2, 0x5D, 0xC8, 0xD6, 0xE6, 0xE6, 0xBA, 0x61, 0xFD, 0x66, 0x1F, 0xA7, 0x90, + 0xFB, 0x58, 0x40, 0xF5, 0x27, 0x6F, 0x3C, 0x0F, 0x5D, 0x59, 0xB3, 0xE5, 0x91, 0xC6, 0xCD, 0x55, + 0x22, 0x08, 0xFA, 0x64, 0x92, 0xD0, 0x7B, 0x93, 0xB9, 0x78, 0xDB, 0xA5, 0xB1, 0x13, 0x3E, 0x5D, + 0x1C, 0x9C, 0x11, 0x5E, 0x81, 0xDD, 0x50, 0xF0, 0x02, 0xD2, 0x77, 0x03, 0x12, 0x84, 0x8C, 0x14, + 0xDE, 0xC6, 0x23, 0x6E, 0x82, 0x56, 0x64, 0x12, 0xA3, 0x45, 0x2E, 0xF1, 0xD9, 0x7D, 0x52, 0x11, + 0x61, 0xA9, 0x1E, 0xE5, 0x77, 0x75, 0x56, 0xFB, 0x98, 0xEE, 0x88, 0x5B, 0xD1, 0x38, 0x36, 0x72, + 0xEF, 0xA1, 0x0D, 0xBA, 0xDF, 0x5C, 0x8E, 0xFC, 0x00, 0xFA, 0x19, 0x73, 0xFE, 0xC1, 0xB9, 0xBD, + 0xD3, 0x75, 0x8C, 0x4D, 0x58, 0xA7, 0x05, 0xDF, 0x5B, 0x5D, 0xF5, 0x14, 0xA0, 0xDC, 0x20, 0x4E, + 0xD9, 0xD4, 0x72, 0x7C, 0x1F, 0xD8, 0x02, 0xBA, 0x64, 0x8C, 0x95, 0x36, 0x7D, 0xD6, 0xFE, 0x6E, + 0x39, 0xE4, 0x2F, 0xA4, 0x5B, 0x62, 0xC8, 0x2A, 0xA0, 0x5A, 0x6B, 0x57, 0x70, 0xEC, 0x50, 0x3C, + 0x4E, 0x2B, 0x0E, 0x4B, 0xDE, 0xE6, 0x18, 0x0E, 0x4D, 0x11, 0x6C, 0x3B, 0x84, 0x58, 0x9B, 0x0C, + 0xDA, 0x5A, 0x16, 0x6B, 0xEC, 0x38, 0x1D, 0x8B, 0xC5, 0x37, 0xBD, 0xF5, 0x2D, 0xDD, 0xD1, 0x65, + 0xC7, 0x3C, 0xD2, 0xE3, 0x5E, 0x68, 0xEA, 0xB6, 0x6E, 0x6D, 0x2D, 0xE3, 0x92, 0x80, 0x76, 0xF8, + 0xFE, 0xE0, 0x4C, 0xDD, 0xC7, 0xA9, 0xEE, 0x47, 0x3A, 0xAB, 0x8E, 0xCF, 0xF6, 0xF8, 0xC5, 0x4B, + 0x0E, 0xE2, 0xF8, 0xAC, 0x26, 0xB1, 0x27, 0x08, 0x82, 0xB6, 0xF4, 0x7F, 0x99, 0x4B, 0x47, 0xC5, + 0xA9, 0x01, 0xA7, 0xA0, 0x38, 0x3C, 0xED, 0x3D, 0x39, 0x8E, 0x77, 0x3C, 0xF1, 0xFD, 0x93, 0xE3, + 0xE9, 0x4D, 0xAE, 0xE0, 0xDF, 0xE5, 0xA2, 0x11, 0x02, 0x9C, 0xA2, 0x78, 0x9F, 0x24, 0x63, 0xA1, + 0x95, 0x1D, 0x53, 0x2B, 0x3B, 0x56, 0xAD, 0x3C, 0x1F, 0xA6, 0xD3, 0xA5, 0x22, 0x52, 0xA7, 0xF0, + 0x45, 0x5F, 0xDC, 0x1C, 0xA5, 0x2D, 0xCA, 0x0C, 0xA9, 0x96, 0x35, 0x2A, 0xA5, 0x11, 0xE0, 0xCC, + 0xBA, 0x44, 0x1D, 0x95, 0x27, 0xB1, 0xB4, 0x61, 0xC3, 0x47, 0x1F, 0xDE, 0x86, 0x11, 0x2C, 0x44, + 0xD9, 0x42, 0x35, 0xDB, 0x06, 0xA3, 0x04, 0xA7, 0x92, 0x76, 0x50, 0xF9, 0x43, 0x57, 0x2E, 0x6B, + 0x6B, 0xA6, 0x8A, 0x51, 0xE7, 0x69, 0xE7, 0x55, 0xB7, 0xDD, 0xD9, 0x7A, 0xD9, 0x76, 0xDA, 0x9D, + 0xEE, 0xBA, 0x82, 0xA5, 0xAC, 0xAD, 0x98, 0x80, 0x69, 0xE3, 0x8D, 0x76, 0x07, 0x14, 0x60, 0xD5, + 0xC6, 0xD2, 0xCC, 0x92, 0xB0, 0x57, 0x6E, 0x9E, 0x4F, 0x98, 0xEE, 0xE6, 0x66, 0x3B, 0xFD, 0x7F, + 0x75, 0xF4, 0xD2, 0x6C, 0x78, 0xE9, 0x54, 0x6D, 0x94, 0x0B, 0x36, 0xB0, 0x49, 0x6D, 0x64, 0x9E, + 0xB4, 0x4E, 0x2F, 0xCE, 0x16, 0xD1, 0xCA, 0x56, 0x33, 0x14, 0xA0, 0x1F, 0x0E, 0x8F, 0xEE, 0xC7, + 0x61, 0xC0, 0x85, 0x69, 0x1D, 0x28, 0x79, 0x21, 0x9F, 0x55, 0xD9, 0x3A, 0xFD, 0x42, 0x96, 0xA0, + 0xDC, 0xAD, 0x67, 0xAA, 0x91, 0x6B, 0x0C, 0xD4, 0xF5, 0x7D, 0x16, 0x3B, 0xDC, 0x22, 0xAB, 0x68, + 0xF7, 0x51, 0x6C, 0x80, 0xEB, 0x4C, 0x54, 0x9D, 0x79, 0x81, 0x9F, 0x87, 0x21, 0x1C, 0x72, 0x87, + 0x6C, 0xC8, 0xD1, 0xB6, 0xE9, 0x18, 0xF6, 0x6B, 0x6E, 0xD9, 0x74, 0x5A, 0xF8, 0x55, 0x33, 0x6F, + 0xCE, 0x8C, 0xC8, 0x8F, 0xC7, 0x22, 0x0C, 0xFA, 0x49, 0xB0, 0xE5, 0xA6, 0xB3, 0x71, 0x36, 0x8E, + 0xC7, 0x9E, 0x70, 0x43, 0x31, 0xBC, 0x50, 0xD8, 0xE4, 0x8E, 0xCB, 0x31, 0x3C, 0xCA, 0x16, 0x9B, + 0x28, 0x29, 0xD9, 0x59, 0xEA, 0xC1, 0x4B, 0x15, 0x37, 0x32, 0x54, 0x6E, 0x86, 0xDB, 0xAE, 0x7D, + 0x7E, 0xE1, 0xC9, 0xFE, 0xBE, 0x9C, 0xC4, 0xD9, 0xB6, 0x46, 0x67, 0x94, 0xD8, 0xDB, 0xD8, 0x18, + 0x25, 0xFB, 0xC9, 0x4D, 0x5B, 0x1C, 0x64, 0xF4, 0x62, 0xFF, 0xB6, 0x3C, 0xA4, 0x8F, 0x72, 0xE6, + 0x7E, 0x7B, 0x26, 0x42, 0xC3, 0x21, 0x16, 0x23, 0x8A, 0x44, 0x25, 0x39, 0x74, 0x45, 0xF5, 0xD9, + 0x54, 0x9C, 0x97, 0x64, 0x9F, 0xB5, 0x1D, 0xA2, 0x26, 0xC8, 0xCD, 0xFD, 0xE1, 0xEB, 0xB1, 0x7B, + 0x4B, 0xF7, 0x93, 0xA0, 0x0E, 0x34, 0x9F, 0x81, 0x1E, 0x01, 0x65, 0xCC, 0xD4, 0x09, 0x73, 0xFB, + 0x95, 0x40, 0x60, 0xEA, 0x74, 0xF6, 0xA7, 0x69, 0xF6, 0x4B, 0x7D, 0xC9, 0x33, 0x50, 0x72, 0x8D, + 0xA7, 0x4D, 0xA0, 0x28, 0x6F, 0x50, 0xB5, 0x3E, 0xEF, 0x2E, 0xAF, 0xCB, 0xF1, 0x0F, 0xDB, 0xE7, + 0x7F, 0x6A, 0x21, 0x7E, 0x15, 0xA2, 0x7A, 0xF1, 0x05, 0x26, 0xD0, 0x06, 0x6D, 0x22, 0xBA, 0x7E, + 0xE7, 0xFA, 0x49, 0xBB, 0xDD, 0xAE, 0xAB, 0x7E, 0x02, 0x76, 0xA9, 0xB4, 0xBB, 0xA7, 0xA4, 0xBE, + 0x29, 0x66, 0x6F, 0x5F, 0xA7, 0x3D, 0xC8, 0x2D, 0xA3, 0x72, 0xCC, 0x49, 0x1A, 0x89, 0x65, 0x9C, + 0x9F, 0xD4, 0x61, 0x92, 0xCB, 0xE5, 0xD8, 0x08, 0x79, 0x1C, 0x7B, 0xEE, 0x2D, 0x76, 0xAA, 0xDD, + 0xD6, 0xEE, 0xB0, 0xB4, 0xC0, 0x92, 0x5A, 0x1E, 0xC5, 0xDC, 0x2A, 0x1B, 0x83, 0x96, 0x06, 0x06, + 0x99, 0x5B, 0xE0, 0x8E, 0xA9, 0x7B, 0x5A, 0x2B, 0x5E, 0xDF, 0x0B, 0x39, 0x39, 0x2F, 0xC1, 0xD1, + 0x79, 0x21, 0x67, 0xE7, 0x85, 0x1D, 0x9E, 0x97, 0xE0, 0xF4, 0xBC, 0xA0, 0xE3, 0xF3, 0xC2, 0x1E, + 0xCC, 0x4B, 0xF1, 0x62, 0x5E, 0xC0, 0x93, 0x79, 0xC9, 0xDE, 0xCC, 0xD6, 0x88, 0x4D, 0x9C, 0x46, + 0xBC, 0xDD, 0x7F, 0x9B, 0x95, 0xE5, 0xC7, 0xD3, 0xFB, 0x05, 0x5A, 0xF9, 0x09, 0x95, 0x5C, 0xB6, + 0x0F, 0x7B, 0x34, 0x63, 0x67, 0x74, 0x77, 0x6C, 0x39, 0x14, 0x0B, 0x75, 0xD9, 0xE4, 0xEA, 0x5E, + 0xAD, 0xF2, 0xEE, 0xAC, 0x67, 0xB1, 0xA1, 0xE4, 0x24, 0xFD, 0xF4, 0x13, 0xB1, 0xB7, 0x03, 0x39, + 0x19, 0xB2, 0x44, 0x00, 0xB3, 0xB7, 0xDD, 0xA7, 0xFE, 0x61, 0x38, 0x99, 0x0F, 0xED, 0x87, 0x8F, + 0xA7, 0x7B, 0xBD, 0x62, 0x92, 0x9B, 0xFA, 0xCA, 0x68, 0x73, 0xB0, 0x9D, 0xAA, 0xB9, 0x25, 0xD1, + 0x31, 0x28, 0x90, 0x85, 0xE8, 0x26, 0x0C, 0xE1, 0x3F, 0x70, 0xCC, 0x61, 0x31, 0x8F, 0x59, 0x1D, + 0x45, 0x7A, 0x72, 0xF9, 0x5A, 0x59, 0x31, 0x45, 0xC6, 0x2A, 0x1B, 0x66, 0xB7, 0x6D, 0x91, 0x4A, + 0xD8, 0xFF, 0x7D, 0x3F, 0x39, 0x71, 0xC7, 0x79, 0x30, 0xD4, 0xC8, 0x0F, 0xE0, 0x1F, 0xF7, 0xBE, + 0x45, 0xAE, 0x58, 0x89, 0x14, 0xF2, 0xD8, 0xCA, 0xD4, 0xC9, 0xF1, 0xA1, 0x3C, 0xDB, 0xD3, 0x3B, + 0xCE, 0x2C, 0xA1, 0x89, 0x20, 0x72, 0xE4, 0xC6, 0xDF, 0x79, 0x09, 0x07, 0xA5, 0x96, 0xA2, 0x3C, + 0xF1, 0xCB, 0x4D, 0xF2, 0x06, 0xB1, 0x36, 0xF1, 0xBE, 0x40, 0x7C, 0xD8, 0x45, 0x0A, 0xF8, 0x87, + 0x06, 0x83, 0xF2, 0x13, 0x69, 0x74, 0xC8, 0x9B, 0x37, 0x1C, 0x5B, 0xB3, 0x89, 0x43, 0xE6, 0x34, + 0xF5, 0x91, 0x2A, 0x89, 0x94, 0x2C, 0x08, 0xC1, 0x94, 0x1A, 0x4B, 0x5D, 0x9B, 0x3A, 0xB8, 0xE5, + 0x03, 0x62, 0x9A, 0x3B, 0xD3, 0xA8, 0x4E, 0x4D, 0x8B, 0xA6, 0x7E, 0xAC, 0xC0, 0x09, 0x8B, 0xF7, + 0x4E, 0x8C, 0x6F, 0x37, 0xB1, 0xF7, 0xBD, 0xC6, 0xB0, 0x30, 0xE0, 0x79, 0x48, 0x1F, 0xBA, 0xCC, + 0x0D, 0x48, 0x0E, 0x47, 0x67, 0x4F, 0x57, 0xA9, 0xCE, 0x74, 0xDB, 0x52, 0xF4, 0x79, 0xD6, 0x4B, + 0xAC, 0x65, 0x59, 0xCD, 0xA5, 0xBC, 0x2D, 0x1E, 0x4D, 0xF8, 0x9B, 0x89, 0x70, 0x9C, 0x17, 0x90, + 0xF2, 0x84, 0x35, 0x52, 0xA0, 0xFB, 0x6D, 0x9A, 0x19, 0x07, 0x5D, 0xFE, 0x78, 0xAE, 0x25, 0xDF, + 0x83, 0x9D, 0x91, 0x7F, 0xFD, 0x90, 0x25, 0x75, 0x6A, 0xC8, 0xE2, 0xD1, 0xCC, 0x05, 0x40, 0x6D, + 0x57, 0xF5, 0x59, 0x31, 0xED, 0x45, 0x33, 0xC3, 0xF1, 0x38, 0x1B, 0x62, 0x24, 0x54, 0x7A, 0xD6, + 0xEC, 0x9A, 0xF5, 0x84, 0x4C, 0x82, 0xEF, 0x01, 0xC6, 0xD0, 0x6F, 0xFF, 0x90, 0xD2, 0x83, 0x6C, + 0xB1, 0xBD, 0xC9, 0xF6, 0x86, 0xAC, 0x76, 0x5E, 0x3A, 0x38, 0x27, 0x6C, 0xA5, 0xB0, 0x74, 0xBD, + 0x74, 0xCA, 0x19, 0x91, 0x3B, 0x57, 0xBD, 0xE4, 0x26, 0x81, 0x97, 0xCE, 0x8F, 0xC9, 0x82, 0x92, + 0xE9, 0x23, 0x24, 0x47, 0x92, 0xF1, 0xD4, 0xF1, 0x73, 0xDB, 0x26, 0x8C, 0x3C, 0x45, 0xD7, 0x1C, + 0xD2, 0xC8, 0x1A, 0xFE, 0x4B, 0x1C, 0xFF, 0x25, 0x8E, 0x95, 0xC4, 0xD1, 0x10, 0x9D, 0x3F, 0xED, + 0x28, 0x1A, 0xB1, 0x9C, 0x11, 0x5C, 0xBF, 0xC6, 0x3C, 0xD0, 0x87, 0x45, 0x65, 0xFC, 0x40, 0x7C, + 0x28, 0x5D, 0x0C, 0x64, 0x52, 0xC6, 0x11, 0x9C, 0xC3, 0x70, 0x95, 0xCA, 0x67, 0xD9, 0x7C, 0xB3, + 0xA7, 0x6C, 0x00, 0xE6, 0xA5, 0x44, 0x19, 0x8C, 0x3C, 0xF3, 0x0B, 0xAE, 0x7B, 0x1E, 0xC1, 0xC7, + 0xA5, 0x6E, 0xA8, 0x2D, 0x15, 0x61, 0x2B, 0x9D, 0xA2, 0x58, 0x0E, 0xFB, 0xA8, 0xB5, 0x21, 0x0E, + 0x6E, 0x82, 0xE3, 0x26, 0x42, 0x71, 0xB2, 0x05, 0x59, 0xCB, 0x83, 0x23, 0x45, 0x79, 0xAB, 0x6B, + 0x71, 0xBE, 0x82, 0x8A, 0x69, 0xC3, 0x90, 0x35, 0xD2, 0x3A, 0x2D, 0x1B, 0x19, 0x52, 0x84, 0xB6, + 0xA6, 0xF4, 0x4A, 0xA1, 0x41, 0xA5, 0x52, 0x70, 0xA6, 0x2B, 0x31, 0x4F, 0x8F, 0x16, 0xB3, 0xEE, + 0xA6, 0x6C, 0x16, 0x2C, 0xD0, 0xF7, 0x8E, 0x25, 0xD9, 0x7D, 0xE4, 0xBE, 0x5B, 0x72, 0xE1, 0xA2, + 0xFC, 0x69, 0x23, 0xA6, 0xA6, 0x21, 0xB5, 0xEF, 0x53, 0x8D, 0xA8, 0xFD, 0x7C, 0xA3, 0x3A, 0xF7, + 0x06, 0x35, 0x73, 0xAF, 0xE3, 0x3B, 0x50, 0x54, 0x66, 0xD2, 0xFE, 0x33, 0xFF, 0x13, 0x6F, 0x31, + 0x6A, 0xBF, 0xD9, 0x6E, 0x93, 0x6B, 0xE0, 0x7C, 0xDF, 0xB6, 0x53, 0x98, 0x8B, 0x60, 0xFE, 0xE3, + 0xCA, 0xDC, 0x1A, 0xB0, 0x78, 0xA4, 0xC4, 0xCD, 0xC1, 0xB2, 0x87, 0x2A, 0xF5, 0x84, 0x54, 0x47, + 0x2C, 0xF7, 0x8F, 0x64, 0x07, 0x87, 0x7F, 0xFE, 0x37, 0x5B, 0x47, 0x8A, 0xB9, 0x98, 0x5F, 0xA1, + 0x2B, 0xD9, 0x67, 0x66, 0x65, 0x9F, 0xF4, 0x58, 0x2E, 0xE7, 0x97, 0x91, 0x09, 0x9A, 0x1D, 0xC7, + 0xE4, 0xF7, 0x71, 0xFF, 0x84, 0x79, 0xE3, 0x73, 0x9A, 0xD9, 0x59, 0x8C, 0x3D, 0x7B, 0xEB, 0x7C, + 0x4B, 0x27, 0x04, 0x7E, 0xF3, 0xE3, 0x53, 0xF7, 0xB4, 0xC1, 0xCD, 0x9F, 0x69, 0x79, 0xB3, 0xC9, + 0xCB, 0xD2, 0xEA, 0x6F, 0xE0, 0xB0, 0xA6, 0x7C, 0xD8, 0xC5, 0xA4, 0x1A, 0x4D, 0x2B, 0xF4, 0xCE, + 0x14, 0xE8, 0x1D, 0x15, 0x7A, 0x47, 0x87, 0xDE, 0x29, 0x85, 0xDE, 0x9D, 0x02, 0xBD, 0xAB, 0x42, + 0xEF, 0xEA, 0xD0, 0xBB, 0xA5, 0xD0, 0xD7, 0xA7, 0x40, 0x5F, 0x57, 0xA1, 0xAF, 0xEB, 0xD0, 0xD7, + 0x33, 0xE8, 0xBF, 0x27, 0x11, 0x96, 0xA2, 0x9F, 0x51, 0x86, 0xAF, 0x5C, 0x0F, 0x7F, 0xC7, 0xC8, + 0xCE, 0x69, 0x02, 0x9D, 0x9A, 0x9C, 0x0A, 0x42, 0x94, 0x85, 0x88, 0xB7, 0x93, 0xF0, 0x03, 0x3E, + 0xB1, 0x08, 0x25, 0x78, 0xBF, 0x85, 0x23, 0x20, 0x7B, 0xD3, 0x4F, 0x71, 0xE6, 0x43, 0x92, 0x3A, + 0xDC, 0x55, 0xC1, 0x4E, 0xCC, 0xA2, 0x5C, 0x50, 0x3D, 0xFA, 0x7C, 0x0F, 0x90, 0xF9, 0x5E, 0xB7, + 0x4A, 0xD7, 0xF9, 0x31, 0xA5, 0x23, 0x5D, 0x7C, 0xFE, 0xF4, 0x13, 0xE1, 0x1F, 0xBB, 0xF9, 0x47, + 0x53, 0x54, 0x3A, 0x0B, 0xC8, 0x0A, 0x80, 0xFE, 0xB1, 0x8D, 0x28, 0x9D, 0x02, 0x6B, 0x28, 0xF2, + 0xA4, 0xC8, 0x4A, 0x5D, 0x16, 0x08, 0x2C, 0xDB, 0x4E, 0xFA, 0xBA, 0x8F, 0x7F, 0xE5, 0xB8, 0x6A, + 0xCB, 0x3E, 0xA7, 0x42, 0x98, 0xB5, 0xA5, 0x55, 0x3E, 0xFA, 0x26, 0x31, 0x72, 0x10, 0x80, 0x7E, + 0xA2, 0xC8, 0x6B, 0xF7, 0x28, 0x0D, 0xBE, 0x16, 0x36, 0x96, 0x9F, 0x2B, 0xB7, 0x66, 0xC1, 0x2B, + 0x6A, 0x68, 0x86, 0x78, 0xAB, 0x09, 0xE4, 0x19, 0xDA, 0xFB, 0x6F, 0xE2, 0xFE, 0xD9, 0xE2, 0xBB, + 0xB3, 0x04, 0x6C, 0x19, 0x88, 0x07, 0x0E, 0xE2, 0xA1, 0x1C, 0xC4, 0x83, 0x05, 0x84, 0xC9, 0x5D, + 0xD1, 0xEA, 0xEB, 0x03, 0x53, 0xDE, 0xF7, 0x85, 0x4F, 0xA5, 0x68, 0x5D, 0xC5, 0xEA, 0x96, 0x6F, + 0x2B, 0xA4, 0x63, 0x7F, 0x06, 0x66, 0x7A, 0xEE, 0x6C, 0x96, 0x4C, 0x92, 0x13, 0xF3, 0x33, 0x5E, + 0xA1, 0x00, 0xFC, 0xCE, 0x72, 0x47, 0x4B, 0xEB, 0xB8, 0x18, 0xB1, 0x3F, 0xE9, 0xF7, 0x30, 0x99, + 0x0D, 0x5B, 0x25, 0xC6, 0xA9, 0xF4, 0x32, 0x2C, 0xE2, 0x50, 0x1B, 0xEE, 0x68, 0xE2, 0xAA, 0xDB, + 0xD5, 0x8B, 0xAF, 0xA2, 0xA6, 0x69, 0xA2, 0x3C, 0xE0, 0x9F, 0x1F, 0x9E, 0xAF, 0x98, 0x15, 0x3D, + 0xF1, 0x07, 0x93, 0x70, 0x12, 0xB7, 0xF2, 0xC9, 0x06, 0x27, 0x38, 0xA7, 0xBE, 0x3D, 0x0F, 0x05, + 0xD3, 0xD5, 0x58, 0xC9, 0xB9, 0x59, 0x0B, 0x91, 0xB1, 0x05, 0xC8, 0x70, 0x63, 0x7D, 0x05, 0x3A, + 0x0A, 0x55, 0x9B, 0xEC, 0xBF, 0x85, 0x6B, 0x19, 0xB7, 0x69, 0x69, 0xA9, 0xD4, 0xA4, 0x34, 0xE3, + 0xD9, 0x96, 0x70, 0xCA, 0xDA, 0xC5, 0xB2, 0x76, 0x5F, 0x84, 0x6F, 0x5D, 0xD4, 0x76, 0x0F, 0x87, + 0xF4, 0xDA, 0x9D, 0x0C, 0x93, 0x58, 0x3B, 0xD9, 0xAA, 0x85, 0x66, 0x72, 0xEF, 0x5A, 0x5A, 0x44, + 0xF6, 0xC6, 0xB0, 0xE1, 0xA4, 0x9E, 0xE2, 0x3A, 0xC0, 0x44, 0x9A, 0x3F, 0xD4, 0xCA, 0xD1, 0xE1, + 0xF5, 0x94, 0x3D, 0xAB, 0xA3, 0x86, 0x8A, 0xBD, 0x2E, 0xDA, 0xEA, 0xB4, 0x2C, 0x97, 0x1A, 0xFF, + 0xA0, 0x51, 0x98, 0xF3, 0xA3, 0x88, 0x11, 0x4E, 0x51, 0x7F, 0x2D, 0x43, 0x60, 0xF6, 0xFD, 0x87, + 0x5A, 0x2B, 0x16, 0xD4, 0x0B, 0xD6, 0x77, 0x68, 0xCC, 0xF6, 0x46, 0xCA, 0x0E, 0xB6, 0xDA, 0xCB, + 0xCD, 0x72, 0xE6, 0xDE, 0x17, 0x09, 0x2B, 0x8E, 0x4D, 0x9A, 0x03, 0x44, 0xE5, 0xE6, 0xEF, 0x27, + 0x95, 0x89, 0x2C, 0x7F, 0xF6, 0x24, 0x26, 0x8F, 0xA6, 0xD4, 0x9D, 0x8E, 0xA8, 0x6B, 0x8A, 0x99, + 0xCA, 0x2E, 0xC9, 0x08, 0x84, 0x7D, 0x3A, 0x3D, 0x39, 0xDA, 0xBB, 0xE4, 0xC9, 0x64, 0x52, 0xBE, + 0x77, 0xAC, 0x55, 0x7A, 0x15, 0xAA, 0x5C, 0x4C, 0xAF, 0xF2, 0xB3, 0x54, 0x65, 0xC3, 0x56, 0xE5, + 0xFC, 0xE4, 0x40, 0x83, 0x62, 0xE9, 0xA8, 0xF0, 0xF6, 0xFF, 0xFD, 0xF5, 0x55, 0xAE, 0x72, 0xFE, + 0xEB, 0xC9, 0xE5, 0xF9, 0xDE, 0x2F, 0xBF, 0x4E, 0xA9, 0xD2, 0x7B, 0x7B, 0xBE, 0xFF, 0xAB, 0xC9, + 0x32, 0x93, 0x69, 0xF8, 0x6C, 0x99, 0x5D, 0x01, 0x4B, 0x8F, 0x9A, 0x39, 0x9B, 0x68, 0xCD, 0x2C, + 0x43, 0x29, 0x3F, 0x7E, 0x56, 0xA1, 0xDE, 0x0B, 0xAD, 0x9E, 0x63, 0xAF, 0xF7, 0xB2, 0x22, 0xBC, + 0x97, 0x36, 0x78, 0xD6, 0x9A, 0xAF, 0x2A, 0x42, 0x7C, 0x55, 0x8D, 0xC2, 0x4E, 0xB7, 0x1A, 0xBC, + 0x4E, 0xB7, 0x1A, 0xBC, 0xEE, 0xBA, 0xA3, 0xC3, 0x2B, 0xE8, 0x0A, 0x7B, 0x04, 0xCF, 0xA9, 0x02, + 0x94, 0x3F, 0x97, 0x67, 0xA9, 0x69, 0x95, 0x07, 0x38, 0xED, 0x62, 0xCC, 0xF2, 0x9D, 0xEF, 0x25, + 0x37, 0xD8, 0x7C, 0x06, 0x99, 0x70, 0x2A, 0x0A, 0x45, 0x77, 0xC9, 0x42, 0xD1, 0x5D, 0xBA, 0x50, + 0x74, 0x97, 0x2C, 0x14, 0xDD, 0xFF, 0xAE, 0x42, 0x31, 0x89, 0x59, 0x9E, 0x9D, 0xFC, 0xB2, 0x25, + 0xB6, 0x5C, 0x3F, 0xF0, 0x4C, 0x26, 0x39, 0x18, 0xF6, 0x4E, 0xF3, 0xB6, 0xA5, 0xD2, 0x67, 0xAD, + 0xD2, 0x67, 0x5B, 0xA5, 0x2F, 0x5A, 0xA5, 0x2F, 0x9A, 0xB2, 0x07, 0x92, 0xD2, 0x14, 0xDF, 0xE5, + 0x64, 0x99, 0xB7, 0x22, 0xD2, 0xD3, 0xDD, 0x15, 0x6E, 0x3D, 0xA4, 0x87, 0xB6, 0xF5, 0xDA, 0xEF, + 0xF7, 0x8E, 0x2E, 0xF7, 0xCE, 0x0E, 0x2C, 0x95, 0xF7, 0x86, 0x49, 0x36, 0x34, 0xAA, 0xBB, 0xED, + 0xC8, 0x8D, 0xBE, 0x2B, 0xBE, 0xB6, 0x9D, 0x69, 0x0E, 0xB5, 0x53, 0xDA, 0x77, 0x6D, 0xED, 0x79, + 0x88, 0x59, 0x46, 0x82, 0xEB, 0xFD, 0x1D, 0xCE, 0x2E, 0x40, 0x6E, 0xC3, 0x92, 0x7B, 0x1C, 0xB7, + 0x32, 0xA7, 0xF4, 0x0E, 0x96, 0xCD, 0x9C, 0x7B, 0x86, 0x5F, 0x6A, 0x5E, 0xC9, 0xBE, 0x25, 0xA6, + 0xF7, 0x7E, 0xA2, 0x3B, 0xE9, 0xB1, 0xA7, 0x16, 0x6A, 0x23, 0xD7, 0x0F, 0xCE, 0x98, 0xA3, 0xEF, + 0x76, 0x9E, 0xC4, 0x59, 0xBC, 0xD8, 0x73, 0x1C, 0x9C, 0x45, 0x21, 0xFA, 0x91, 0x49, 0xFE, 0xAC, + 0x3A, 0x6A, 0x84, 0xBC, 0x17, 0x78, 0xCA, 0x76, 0x9C, 0x3F, 0xA5, 0x9C, 0x27, 0x58, 0x57, 0xB3, + 0xAD, 0xE7, 0xB4, 0x14, 0xE5, 0x5B, 0x67, 0x6D, 0xF3, 0x17, 0xE8, 0xB3, 0xD4, 0xCD, 0x78, 0x5C, + 0x49, 0xA1, 0xC8, 0xF0, 0x53, 0x9C, 0x05, 0x3D, 0xE2, 0x9F, 0x2D, 0x3D, 0xD2, 0xBA, 0x9B, 0x62, + 0xAC, 0x49, 0xF7, 0x83, 0x07, 0xB0, 0xA5, 0xC4, 0x57, 0x87, 0x6E, 0x28, 0xBF, 0x22, 0x3C, 0xEA, + 0x9D, 0xAD, 0x77, 0xC9, 0x0D, 0x7B, 0x84, 0x28, 0xC0, 0x77, 0xEC, 0xA1, 0x90, 0xBD, 0x4D, 0x34, + 0x4E, 0xF0, 0xE9, 0x08, 0x66, 0x60, 0x0F, 0x31, 0xF4, 0x36, 0xE3, 0x13, 0xB9, 0x8E, 0xC2, 0x11, + 0xD9, 0x3B, 0xE3, 0x0D, 0x06, 0x64, 0x0C, 0xA4, 0x29, 0xB9, 0xA2, 0x19, 0x18, 0xF4, 0xF2, 0x3B, + 0xE7, 0x70, 0xE4, 0xE4, 0xC9, 0x87, 0x40, 0x4E, 0x34, 0xF2, 0x03, 0x38, 0x2D, 0xDD, 0xF8, 0xB0, + 0xC1, 0x95, 0x1F, 0xA2, 0xE0, 0x77, 0x92, 0x70, 0x0C, 0x80, 0xED, 0x94, 0x3B, 0x14, 0x2F, 0x55, + 0x64, 0xE7, 0x6F, 0x2D, 0xDF, 0x3D, 0x9C, 0xF0, 0x83, 0xC9, 0x70, 0xD8, 0x34, 0x8C, 0x6A, 0x7A, + 0x0E, 0x7C, 0x8D, 0xA5, 0x65, 0x0E, 0x85, 0xF8, 0x2E, 0x56, 0x0F, 0xFE, 0xF4, 0xFE, 0x34, 0x35, + 0xE4, 0x53, 0x4E, 0xE6, 0xFF, 0x89, 0x3B, 0x3B, 0x10, 0xF8, 0x3F, 0xF0, 0x09, 0x98, 0x66, 0xB2, + 0xA0, 0xF8, 0xB0, 0x7B, 0x2D, 0xDE, 0xC1, 0xFB, 0x34, 0xC6, 0x87, 0xA9, 0x7E, 0x81, 0x23, 0xA4, + 0x7A, 0x8A, 0x60, 0xE9, 0x74, 0x79, 0xBA, 0x8D, 0x78, 0x72, 0x35, 0xF2, 0x93, 0xF4, 0xE1, 0x3C, + 0x7C, 0xCC, 0x0E, 0x66, 0x22, 0x7B, 0x6A, 0xE2, 0xAB, 0xF3, 0x4D, 0xBA, 0x14, 0xC1, 0xDB, 0x4D, + 0x71, 0x31, 0x82, 0x6F, 0xB1, 0xE0, 0xA5, 0xB2, 0xE2, 0x73, 0x99, 0x96, 0xB7, 0xDD, 0xF1, 0x98, + 0xCF, 0x36, 0x13, 0x70, 0x8B, 0x21, 0x6E, 0x4A, 0x50, 0xDD, 0xBF, 0xBB, 0xF7, 0x02, 0xE2, 0xAF, + 0x27, 0x1F, 0x30, 0x04, 0xEB, 0x9C, 0xC2, 0x59, 0x46, 0x7A, 0x9B, 0x05, 0x6B, 0xB4, 0x43, 0x00, + 0xD9, 0xA8, 0x9D, 0x7D, 0x84, 0x3D, 0x29, 0x70, 0x74, 0x6D, 0xC2, 0xBA, 0x55, 0x53, 0xAA, 0xB0, + 0x79, 0x96, 0x12, 0xA1, 0xBE, 0xC3, 0xA5, 0x72, 0xC3, 0x72, 0xF8, 0xC6, 0x44, 0xEE, 0xBC, 0xD0, + 0xC7, 0xAB, 0xE0, 0xB1, 0xE2, 0xB4, 0x6F, 0xBE, 0x9F, 0xA2, 0xC2, 0x93, 0xDE, 0x1A, 0x54, 0xD5, + 0x76, 0x39, 0x52, 0xFE, 0x90, 0x59, 0x19, 0x60, 0x73, 0x6A, 0xF3, 0x59, 0x68, 0xAF, 0x55, 0x2B, + 0x99, 0xDE, 0x1A, 0x96, 0x30, 0x1A, 0xD0, 0xE4, 0xCC, 0xF5, 0x23, 0xEA, 0x31, 0x25, 0xAC, 0x2D, + 0x38, 0x57, 0x49, 0xF0, 0x96, 0x55, 0xE1, 0x85, 0x16, 0x7E, 0xB1, 0xA7, 0xDE, 0x58, 0x21, 0x03, + 0x16, 0x26, 0x09, 0x0D, 0xDA, 0xB2, 0x47, 0x9C, 0xF5, 0xC9, 0x7B, 0x68, 0x78, 0x2A, 0xDE, 0xA3, + 0xB1, 0x1A, 0x2E, 0x18, 0xCE, 0xA3, 0x78, 0x7C, 0x1A, 0xDE, 0x9D, 0x41, 0xFB, 0xD8, 0xAE, 0xA3, + 0x81, 0xBA, 0x73, 0xE9, 0x9D, 0x34, 0x95, 0xF4, 0xF2, 0x17, 0xD4, 0x6A, 0xAC, 0x21, 0x3B, 0xF1, + 0x8A, 0x08, 0x8A, 0x42, 0x2B, 0x8A, 0x0C, 0x48, 0xA1, 0x23, 0x3B, 0x71, 0xBB, 0x9E, 0xC7, 0x5E, + 0x22, 0x42, 0x8B, 0x17, 0x0D, 0x30, 0x61, 0xED, 0xE1, 0xC7, 0x13, 0x50, 0xD8, 0x09, 0x7E, 0xE3, + 0xAF, 0xC1, 0xB5, 0x48, 0x83, 0x62, 0x95, 0x26, 0xD9, 0xD9, 0x45, 0x2A, 0x73, 0xB1, 0x17, 0xCC, + 0xAB, 0x70, 0x80, 0x37, 0xE3, 0x3D, 0xEA, 0xCA, 0x8B, 0x36, 0xCC, 0x8D, 0x0B, 0xB7, 0x3B, 0xEC, + 0xDE, 0x18, 0x7E, 0xE1, 0xA0, 0xB3, 0x33, 0xBA, 0x8F, 0xF7, 0xBF, 0xEE, 0x3D, 0xFC, 0xA2, 0x1D, + 0xD6, 0x79, 0xBD, 0xAF, 0xFE, 0xB7, 0x76, 0x18, 0xF4, 0x87, 0x7E, 0x1F, 0x1D, 0x50, 0x33, 0x26, + 0x37, 0x2C, 0x91, 0xB3, 0x4A, 0x70, 0x54, 0x49, 0x46, 0x99, 0xA2, 0xE7, 0xDF, 0x4C, 0x86, 0x71, + 0x98, 0xA8, 0x15, 0xEC, 0x78, 0x2D, 0x90, 0x7A, 0xB4, 0x2F, 0x6F, 0x1D, 0xDB, 0x0E, 0x59, 0x2B, + 0x44, 0x28, 0xDB, 0xF0, 0x1E, 0x55, 0x8D, 0x60, 0x85, 0xBA, 0x14, 0x02, 0x73, 0xCC, 0x65, 0xF4, + 0x49, 0xDD, 0xB0, 0x13, 0x68, 0xC9, 0xA8, 0x3A, 0x3B, 0x79, 0x33, 0xA6, 0x67, 0xCD, 0x35, 0x4C, + 0x2C, 0x2A, 0x16, 0xC4, 0x35, 0x73, 0x0D, 0xC3, 0x36, 0x8F, 0x25, 0x79, 0xDE, 0xEC, 0x1D, 0x4A, + 0xDF, 0xDE, 0x5B, 0xBC, 0x37, 0x29, 0xA4, 0xF2, 0xAE, 0x14, 0x51, 0x99, 0xF7, 0xA3, 0xA4, 0xB3, + 0xF6, 0xAE, 0x94, 0xE7, 0xF0, 0x9C, 0xBF, 0x63, 0xF3, 0xE5, 0x06, 0xE5, 0xDD, 0xC4, 0xC3, 0x45, + 0x69, 0x2F, 0x07, 0xD9, 0x31, 0x63, 0xB1, 0x5E, 0xF2, 0x07, 0x09, 0x97, 0xDE, 0xC9, 0x77, 0x72, + 0x78, 0x83, 0xD1, 0x47, 0xDE, 0x85, 0x92, 0x3E, 0x72, 0x26, 0x58, 0xFA, 0x68, 0x5E, 0xEB, 0x14, + 0xE5, 0x37, 0xAB, 0x35, 0x0B, 0x5E, 0x1F, 0x2D, 0x7C, 0x39, 0x2F, 0x9D, 0xE5, 0x5B, 0x9D, 0xF6, + 0x46, 0xF1, 0x8D, 0x8F, 0xE2, 0x1F, 0x6A, 0x41, 0x7E, 0x11, 0x46, 0xFD, 0x9B, 0xF9, 0x91, 0x77, + 0x9C, 0x6E, 0xDB, 0xA9, 0x80, 0x7D, 0x4E, 0xF0, 0x4E, 0x7B, 0xFA, 0x65, 0x96, 0x26, 0x38, 0xB6, + 0x7C, 0x8E, 0xF3, 0xCB, 0x4B, 0x49, 0x76, 0xC8, 0x82, 0xA9, 0x20, 0xE5, 0xC5, 0x9B, 0x3D, 0x1B, + 0x1B, 0x97, 0xB4, 0x4A, 0x20, 0x8A, 0xBB, 0x9D, 0xE5, 0x77, 0x5A, 0x4A, 0xB7, 0x4B, 0x1F, 0x44, + 0xD0, 0xBA, 0xCD, 0xEB, 0x2E, 0xD4, 0xED, 0x69, 0x20, 0xAC, 0xDD, 0xD6, 0x2E, 0xBF, 0x96, 0xD0, + 0x75, 0x13, 0x62, 0x51, 0xF7, 0x2D, 0xF7, 0x6B, 0xFC, 0xF5, 0x48, 0x9E, 0xC9, 0xC9, 0x7C, 0x1A, + 0x79, 0x0A, 0x2F, 0xA6, 0xC2, 0x2B, 0xC8, 0xA8, 0xA7, 0xF2, 0xC5, 0x7C, 0x9E, 0x74, 0x7E, 0x8E, + 0x98, 0xB0, 0x32, 0x6F, 0x4B, 0xA7, 0x40, 0x1A, 0xD2, 0x26, 0xFB, 0xEE, 0xC4, 0x3B, 0xD4, 0x9F, + 0x42, 0xD4, 0xD4, 0xAA, 0x1C, 0x86, 0x5F, 0x41, 0x74, 0x2A, 0x50, 0xD5, 0x29, 0xD0, 0xE0, 0x95, + 0xA8, 0x12, 0x0B, 0xDA, 0x8C, 0x54, 0xCD, 0x8F, 0x6F, 0x26, 0x2E, 0x68, 0xA3, 0x3C, 0x2D, 0xEF, + 0xE5, 0xFC, 0x63, 0x5E, 0x31, 0xA3, 0x66, 0xC1, 0xF0, 0x8F, 0xC7, 0xE9, 0xCB, 0xD4, 0xF3, 0xB2, + 0xAE, 0x0A, 0x04, 0xAB, 0x2A, 0xD0, 0x73, 0x51, 0x2C, 0xAA, 0x08, 0xAA, 0xE4, 0xB6, 0x28, 0x15, + 0x9B, 0x43, 0x9A, 0xB8, 0xFE, 0x30, 0x9E, 0x9D, 0x05, 0xB3, 0xC1, 0xD2, 0x98, 0x21, 0xBF, 0xD8, + 0x3B, 0x3F, 0x0B, 0x64, 0x28, 0x25, 0x73, 0x5E, 0x98, 0xEE, 0xB0, 0x72, 0x95, 0xDE, 0x96, 0x42, + 0xEF, 0x14, 0x70, 0x76, 0x1A, 0x74, 0xFB, 0xBA, 0x20, 0xD9, 0x11, 0x96, 0xB1, 0x28, 0xA8, 0xE0, + 0xCA, 0x56, 0x04, 0xCD, 0x88, 0xB1, 0xF0, 0x8A, 0x50, 0x0A, 0xAF, 0xD2, 0x8A, 0xA0, 0x27, 0x01, + 0x5C, 0x94, 0x19, 0xE5, 0x79, 0xEB, 0xA4, 0x29, 0x21, 0xD7, 0x9E, 0x7F, 0x32, 0x54, 0x84, 0x62, + 0xED, 0xB4, 0x92, 0x65, 0x6F, 0xD1, 0x7E, 0x4F, 0x4D, 0xD9, 0xA7, 0x77, 0x3D, 0x6F, 0xB0, 0x60, + 0xEF, 0x2B, 0x01, 0xB2, 0x1D, 0xA3, 0xB2, 0xCC, 0xF1, 0xF3, 0xF4, 0x5E, 0xBD, 0xF6, 0xB0, 0xA0, + 0x50, 0x73, 0xC5, 0x3F, 0x25, 0x0A, 0xE3, 0x98, 0xF0, 0x04, 0xA8, 0xB4, 0x3B, 0xA9, 0x25, 0x62, + 0x78, 0x6C, 0x2A, 0x86, 0x44, 0x84, 0x0C, 0x47, 0xEB, 0xBC, 0x71, 0xC1, 0xFB, 0x73, 0x81, 0xDF, + 0xFF, 0x8E, 0x56, 0x38, 0xF6, 0xC6, 0x70, 0x7A, 0x2E, 0xE2, 0x2F, 0x44, 0xEE, 0xBB, 0xDE, 0x01, + 0xE6, 0x71, 0x6A, 0x98, 0x75, 0xEC, 0x8F, 0xB3, 0x65, 0x49, 0xA2, 0xA4, 0xFA, 0x33, 0x3F, 0x55, + 0x67, 0xC9, 0xA9, 0xFE, 0xBC, 0xEF, 0x61, 0x3C, 0xEF, 0x3B, 0x18, 0xCF, 0xF7, 0xFE, 0x45, 0x51, + 0xF2, 0x0D, 0x47, 0x4B, 0x8E, 0xC9, 0x83, 0xD1, 0x71, 0xFC, 0x88, 0x3B, 0x70, 0xFD, 0x20, 0x16, + 0x71, 0x6F, 0x20, 0xA2, 0xAA, 0x33, 0x94, 0x1F, 0x78, 0xF4, 0x5E, 0x73, 0x08, 0x65, 0x56, 0xDB, + 0x6D, 0x51, 0x64, 0x7F, 0xC0, 0x7A, 0x65, 0x85, 0x95, 0x5A, 0xB2, 0xA4, 0x47, 0x64, 0xEC, 0x46, + 0xEC, 0xCD, 0x6F, 0xF9, 0xB1, 0x6A, 0x56, 0xFB, 0x5B, 0x1A, 0xA9, 0x42, 0x0C, 0xAF, 0xCB, 0x2C, + 0x3A, 0x40, 0x96, 0x3A, 0x69, 0xC9, 0x67, 0x30, 0x31, 0x1A, 0xC5, 0x66, 0x25, 0x30, 0x11, 0xE1, + 0x7D, 0x8D, 0x39, 0x27, 0x56, 0x48, 0x9D, 0x39, 0xBC, 0xE7, 0x72, 0x57, 0x54, 0xF0, 0xB9, 0xA8, + 0xE0, 0x8B, 0x35, 0xB5, 0x3B, 0xFE, 0x5C, 0x45, 0xD4, 0xFD, 0x5E, 0xD9, 0xAB, 0x56, 0xB0, 0x7D, + 0xC7, 0xC2, 0x5C, 0x2D, 0x27, 0xBC, 0x5C, 0x61, 0x3C, 0x89, 0x6F, 0x1A, 0x4F, 0xDA, 0x31, 0x23, + 0xB1, 0x1B, 0x8F, 0x0D, 0x44, 0x5C, 0xA8, 0xDE, 0x2C, 0xD7, 0xDA, 0x1E, 0xC5, 0xAB, 0x9D, 0x5C, + 0x4D, 0xE5, 0x37, 0x08, 0x00, 0x50, 0x5C, 0xE0, 0x89, 0x5C, 0x81, 0x92, 0xFF, 0x80, 0x3C, 0xBE, + 0x6A, 0x54, 0x18, 0xD9, 0xD5, 0xE3, 0xF3, 0x8A, 0x64, 0x0A, 0x2A, 0x17, 0x48, 0x14, 0xB6, 0x40, + 0x36, 0x09, 0x17, 0xBF, 0x54, 0x78, 0x8C, 0xE7, 0x8E, 0xC4, 0x7D, 0x65, 0xA3, 0x76, 0xC8, 0x3A, + 0x41, 0x86, 0x61, 0x9F, 0x11, 0xCA, 0x32, 0xC1, 0x64, 0x00, 0x56, 0x48, 0xED, 0xDF, 0x6A, 0xCD, + 0xC2, 0x87, 0x01, 0xE4, 0x01, 0x42, 0x6A, 0xFA, 0x14, 0xBB, 0x01, 0x1A, 0xD3, 0x7E, 0x03, 0x51, + 0x89, 0xA9, 0x78, 0x6B, 0xA6, 0x6A, 0xFE, 0xDF, 0x96, 0xA1, 0x85, 0xBE, 0x27, 0x9C, 0xB5, 0x9D, + 0x6F, 0x45, 0x75, 0x3F, 0x1B, 0x75, 0xBB, 0x85, 0x75, 0xBF, 0x18, 0x75, 0xD7, 0xF5, 0xBA, 0x76, + 0xF5, 0x20, 0x0F, 0xB0, 0xCD, 0x25, 0x5B, 0xA6, 0x7C, 0x5A, 0x95, 0xCF, 0xD3, 0xAB, 0x7C, 0x29, + 0xAC, 0xA2, 0x92, 0x67, 0x64, 0x08, 0xC9, 0x42, 0x94, 0x25, 0xA6, 0x13, 0x37, 0x8A, 0xDC, 0x87, + 0x96, 0x10, 0x09, 0x96, 0xF2, 0x7B, 0x14, 0x06, 0x61, 0x3C, 0x76, 0xFB, 0x94, 0xB0, 0x4B, 0x41, + 0xAE, 0xB3, 0xB5, 0x60, 0xDD, 0x5C, 0x76, 0xE4, 0xBB, 0xC5, 0x42, 0xB1, 0x10, 0xC1, 0x26, 0xF2, + 0x9E, 0x01, 0xA5, 0xC3, 0x54, 0x3E, 0xE6, 0x5A, 0xC2, 0x77, 0x97, 0x45, 0x90, 0x25, 0x46, 0xC8, + 0x9D, 0x47, 0xD7, 0x1E, 0xFD, 0x5A, 0x55, 0x0A, 0x5F, 0x46, 0xBF, 0xDE, 0x30, 0xA2, 0x5E, 0x6D, + 0x4A, 0xD2, 0x24, 0xB6, 0x43, 0x5E, 0x1C, 0xB5, 0x28, 0x7D, 0x4D, 0x7E, 0x5D, 0xFB, 0xBC, 0xF6, + 0xA5, 0xA6, 0x85, 0xE3, 0x5A, 0x98, 0xF0, 0x86, 0x6C, 0x36, 0xCD, 0xF3, 0x55, 0x21, 0x77, 0x63, + 0xFF, 0x1F, 0x94, 0xD8, 0x54, 0xB9, 0xAE, 0x4C, 0x33, 0xAF, 0xE5, 0x7C, 0xD5, 0x9D, 0x79, 0x95, + 0xC5, 0xC9, 0x1B, 0x8E, 0x99, 0x28, 0x48, 0x77, 0xB3, 0x7D, 0x58, 0x7D, 0x40, 0x2A, 0x84, 0xAF, + 0x72, 0x9D, 0x57, 0x50, 0xA6, 0x30, 0xFF, 0xD4, 0x4E, 0x78, 0xA2, 0x02, 0x73, 0xC9, 0x34, 0xAB, + 0xA6, 0xB3, 0x8B, 0x95, 0x6B, 0x13, 0xB1, 0x90, 0x17, 0x18, 0x58, 0xC1, 0xDB, 0x1B, 0x4B, 0xC9, + 0x9F, 0x1B, 0xB5, 0xFF, 0x61, 0x6F, 0x27, 0x30, 0x42, 0x73, 0xEA, 0xF6, 0x6F, 0x1A, 0x05, 0xBB, + 0x66, 0x59, 0x6D, 0xFD, 0xB9, 0x91, 0xDC, 0xF8, 0x71, 0x93, 0x75, 0xA7, 0xD1, 0x2C, 0x5F, 0x05, + 0x02, 0x75, 0x15, 0x68, 0xC7, 0x93, 0xAB, 0x98, 0x6F, 0x72, 0xD9, 0x6B, 0x55, 0x6A, 0xC6, 0x46, + 0x09, 0x6C, 0xD6, 0x16, 0x16, 0x4B, 0x1E, 0x29, 0x97, 0x6A, 0xBB, 0x6C, 0xF9, 0x4C, 0x55, 0x9A, + 0xF6, 0x61, 0xFD, 0x1B, 0x07, 0x21, 0x6F, 0xEE, 0x1F, 0xF5, 0x9D, 0x7D, 0xEA, 0x55, 0x57, 0x79, + 0x77, 0x9F, 0x36, 0x98, 0xB6, 0xC3, 0x57, 0xEB, 0x55, 0xDB, 0xE5, 0xA7, 0x6D, 0x96, 0xB6, 0xD3, + 0xCF, 0x73, 0x11, 0x94, 0x6F, 0x91, 0x97, 0xF8, 0x62, 0xD9, 0xB3, 0xBE, 0x53, 0xF6, 0xAC, 0xEF, + 0x93, 0xFD, 0x86, 0xBB, 0xFE, 0x4C, 0x98, 0xE6, 0xD8, 0xF9, 0xA7, 0x6D, 0x67, 0xDE, 0xFD, 0x67, + 0xD2, 0x38, 0xE3, 0x09, 0x40, 0x43, 0x28, 0x9D, 0x02, 0xB4, 0xB9, 0xA3, 0x6C, 0x7F, 0x85, 0xE3, + 0xAA, 0xB5, 0x48, 0xB8, 0xA9, 0xDA, 0xCA, 0x52, 0xC9, 0xD5, 0xCA, 0x14, 0x71, 0xB3, 0x97, 0xA9, + 0x12, 0xF2, 0x44, 0x27, 0x0A, 0x6D, 0xE0, 0xEC, 0xA7, 0x8A, 0xAC, 0x92, 0x72, 0xB2, 0xF8, 0xE1, + 0x99, 0x55, 0x70, 0x4A, 0x49, 0xE9, 0x2E, 0x3D, 0xA9, 0x98, 0x6A, 0x77, 0xDA, 0xD6, 0x5A, 0x97, + 0xC6, 0x39, 0xB6, 0xD7, 0x99, 0x60, 0xFE, 0x58, 0x67, 0x96, 0x6C, 0xA0, 0x67, 0x3A, 0xB7, 0x4C, + 0x61, 0xB3, 0x64, 0xDC, 0x52, 0xCF, 0x83, 0x37, 0x2E, 0x3D, 0xA1, 0xC9, 0x4D, 0xE8, 0x55, 0xCB, + 0x20, 0x9C, 0x3B, 0x60, 0x5B, 0xD2, 0x07, 0x4B, 0x30, 0xA5, 0xE1, 0x90, 0x30, 0xE8, 0xB7, 0x04, + 0x16, 0xBB, 0x5D, 0x89, 0xB5, 0xDD, 0x66, 0x16, 0x2D, 0x36, 0xA6, 0x03, 0x5A, 0xF8, 0x28, 0x92, + 0x43, 0x14, 0x39, 0xAD, 0x37, 0xC9, 0x2A, 0x69, 0x48, 0x75, 0x74, 0x93, 0xA8, 0xA8, 0xB4, 0xC6, + 0xB2, 0xBE, 0xC3, 0xF8, 0x99, 0x55, 0xED, 0x1E, 0x10, 0x69, 0x93, 0xE6, 0x14, 0xF2, 0xD3, 0x4D, + 0x03, 0x10, 0xDB, 0x4E, 0x42, 0xE6, 0x99, 0xD4, 0x58, 0xAF, 0x90, 0x4B, 0xBA, 0x98, 0x69, 0x1A, + 0x17, 0xA6, 0xF0, 0x4C, 0x67, 0xB1, 0x9D, 0x69, 0x3A, 0xC1, 0x4D, 0xE0, 0xC4, 0xB3, 0x73, 0xCD, + 0x0C, 0x37, 0x28, 0x62, 0x9A, 0x79, 0x6A, 0xFF, 0x51, 0xD5, 0x4B, 0xF9, 0xF2, 0x6A, 0x3B, 0x41, + 0x97, 0x04, 0x76, 0x94, 0x9D, 0xFA, 0x2D, 0x91, 0x1D, 0x05, 0x07, 0x7F, 0xEB, 0x58, 0x66, 0xD5, + 0x37, 0x0A, 0xAA, 0x17, 0xFA, 0x01, 0xF1, 0x66, 0x9B, 0xDF, 0x8C, 0x84, 0xDD, 0x45, 0x33, 0x41, + 0xB2, 0x31, 0x14, 0xE5, 0x6C, 0xAF, 0x16, 0x44, 0x92, 0x05, 0x81, 0x54, 0x04, 0xD2, 0x2D, 0x8B, + 0x44, 0x29, 0xBA, 0x25, 0x28, 0xB7, 0x38, 0xE4, 0x43, 0x5A, 0x66, 0xBD, 0xC8, 0x46, 0xB2, 0xB4, + 0x52, 0x36, 0x80, 0x65, 0xB5, 0x72, 0x7E, 0x16, 0xD4, 0xD2, 0x46, 0xB7, 0xBC, 0x96, 0x3E, 0xA8, + 0x53, 0x4D, 0x27, 0x69, 0x7F, 0xE7, 0x34, 0x9F, 0xA8, 0x4B, 0x58, 0xB9, 0x09, 0x45, 0x9A, 0x2D, + 0xE5, 0x66, 0x14, 0x6D, 0xC7, 0x55, 0xDD, 0x94, 0x62, 0x1D, 0x3C, 0x7D, 0x64, 0x9F, 0xD6, 0xA4, + 0x32, 0x2F, 0x09, 0x99, 0x69, 0x25, 0x4D, 0x7A, 0xBB, 0x06, 0x82, 0x51, 0x60, 0x61, 0xD1, 0xF9, + 0x53, 0xD5, 0xCA, 0x22, 0x0D, 0x80, 0x6A, 0x69, 0xD1, 0xCF, 0x26, 0xB3, 0x5B, 0x5B, 0x2A, 0x9D, + 0x6E, 0x96, 0x6A, 0x71, 0xD1, 0x8E, 0x28, 0x8B, 0x5A, 0x5D, 0x24, 0xDE, 0xCC, 0x6C, 0x79, 0xC9, + 0xE6, 0xD0, 0x6F, 0x6D, 0x7D, 0x51, 0xA5, 0x85, 0xD5, 0xCC, 0xD2, 0xE3, 0xEC, 0x90, 0x17, 0xC6, + 0xEE, 0x75, 0x69, 0x56, 0x1A, 0xF3, 0xCC, 0xA5, 0xD6, 0xD8, 0xD0, 0x9B, 0x6C, 0xEA, 0x1F, 0xB6, + 0xA6, 0xC2, 0x78, 0xA1, 0xDA, 0x82, 0x2A, 0xDC, 0xE7, 0x3F, 0x8D, 0x11, 0x4A, 0x11, 0x88, 0x47, + 0x5B, 0xA8, 0x9E, 0x62, 0x4C, 0x92, 0x63, 0x85, 0xF8, 0xEE, 0x05, 0xFE, 0x95, 0x46, 0xBA, 0xFD, + 0x77, 0xD0, 0xD4, 0x8D, 0x7A, 0x3D, 0x8F, 0x94, 0xD2, 0xEA, 0xB4, 0x2A, 0xD4, 0xF9, 0xDB, 0xDF, + 0xCC, 0x4A, 0x11, 0x4D, 0x26, 0x51, 0xC0, 0xF6, 0x3E, 0x26, 0x91, 0x03, 0x9A, 0x60, 0x94, 0x96, + 0xAA, 0xB6, 0x59, 0x94, 0x1C, 0xE8, 0x35, 0x90, 0xA9, 0xB4, 0xD0, 0xFE, 0xFA, 0x9F, 0x51, 0x29, + 0xDD, 0xC2, 0xCA, 0x36, 0x94, 0xE3, 0x6B, 0x66, 0x33, 0x49, 0xDC, 0x2B, 0x72, 0xE7, 0xC6, 0x04, + 0x97, 0x60, 0x82, 0xB1, 0x5D, 0xD4, 0x6B, 0x11, 0x3E, 0xE7, 0x09, 0x4B, 0x48, 0xCA, 0xA3, 0x01, + 0xE3, 0x7E, 0x84, 0xF9, 0x2A, 0xF4, 0x0D, 0xC7, 0x90, 0x9E, 0xB8, 0x81, 0x3B, 0xA0, 0xD1, 0x05, + 0x56, 0x35, 0x62, 0xB9, 0x18, 0x80, 0xDD, 0x37, 0x49, 0x44, 0xDC, 0xA1, 0x3F, 0x08, 0x76, 0xEA, + 0x43, 0x7A, 0x9D, 0xD4, 0xE1, 0xC3, 0xCD, 0x2E, 0x9E, 0xDE, 0xDE, 0xAC, 0xC1, 0x2F, 0xF8, 0x47, + 0x0F, 0xD4, 0x9D, 0xF8, 0xC3, 0xDB, 0x7D, 0x93, 0xA7, 0x13, 0xDF, 0xE1, 0xFB, 0x86, 0xAB, 0xF0, + 0xBE, 0x4E, 0x7C, 0x6F, 0xA7, 0x8E, 0x08, 0xF9, 0x19, 0x6A, 0x6F, 0x38, 0xAC, 0x13, 0x96, 0xE6, + 0x06, 0xBE, 0x86, 0xD1, 0x68, 0x95, 0x55, 0x5C, 0xE5, 0x4D, 0x25, 0xBA, 0x98, 0xA5, 0xA8, 0x0E, + 0x0B, 0xEA, 0x01, 0xC6, 0xD5, 0x70, 0x08, 0x29, 0xC9, 0xE1, 0x60, 0x80, 0xF1, 0x33, 0x40, 0xCF, + 0x1A, 0xA2, 0x5D, 0x4B, 0xA2, 0xEC, 0x1F, 0x46, 0xB7, 0xAC, 0xDE, 0xD9, 0xBB, 0xCF, 0xEC, 0x89, + 0x3B, 0x91, 0x00, 0xB7, 0xA6, 0xB0, 0xF3, 0x7E, 0x34, 0xBC, 0x49, 0x92, 0x71, 0x79, 0xF8, 0x9C, + 0x54, 0x51, 0x44, 0xD1, 0xBD, 0x3B, 0xE2, 0x41, 0x74, 0xB8, 0x76, 0xB3, 0x38, 0xBF, 0x9A, 0x65, + 0x93, 0x95, 0x36, 0x61, 0xD1, 0x50, 0xAA, 0x1A, 0x81, 0x09, 0x10, 0xD3, 0xE3, 0xA0, 0x1F, 0x8E, + 0x50, 0xCF, 0xA4, 0x15, 0x23, 0x1A, 0x8F, 0xC3, 0x20, 0x66, 0xA4, 0xB2, 0x54, 0x23, 0x22, 0x82, + 0x94, 0x1C, 0xF4, 0x7E, 0xE6, 0xF1, 0x9E, 0xB0, 0xF7, 0x08, 0xD9, 0xAE, 0xC1, 0xDC, 0x42, 0x96, + 0x8C, 0xE8, 0xCA, 0x8E, 0xCA, 0x86, 0xE9, 0x2B, 0xB0, 0x2A, 0x84, 0xF2, 0xC9, 0xE8, 0xD1, 0x22, + 0xF1, 0x22, 0x95, 0x86, 0x29, 0xF4, 0xE1, 0x55, 0xE2, 0xFA, 0x20, 0x98, 0x52, 0x05, 0xBB, 0xE0, + 0x5B, 0x2B, 0x9A, 0xC2, 0xCF, 0xA3, 0x80, 0xB2, 0x2A, 0xBA, 0xD8, 0xCA, 0xE3, 0x2E, 0xAA, 0x3D, + 0xD9, 0xA8, 0xA7, 0xE9, 0x43, 0x7E, 0xEB, 0x81, 0x2F, 0x62, 0x07, 0x8C, 0xB9, 0xC4, 0x82, 0x6A, + 0x83, 0xB7, 0xCF, 0x73, 0x1A, 0x96, 0x0F, 0x20, 0x56, 0xAA, 0x3C, 0x88, 0xBC, 0xF2, 0xD4, 0x81, + 0x14, 0x69, 0x07, 0x7E, 0xF3, 0xC1, 0x64, 0x74, 0xFC, 0x38, 0x03, 0x6A, 0xB0, 0xA5, 0xDA, 0xA0, + 0x4A, 0xBA, 0xE0, 0x30, 0xBC, 0x0B, 0xF0, 0xD0, 0x2F, 0x85, 0xBF, 0x32, 0x2D, 0x4C, 0x3D, 0x9C, + 0xDE, 0xD5, 0x83, 0x27, 0x11, 0xE4, 0xF1, 0xA1, 0x64, 0xE7, 0x12, 0xB8, 0x03, 0x66, 0xCD, 0xF8, + 0x78, 0xCD, 0xA0, 0xF5, 0x04, 0xE8, 0xF9, 0xA1, 0xAA, 0xFB, 0x64, 0xE3, 0x9D, 0xB9, 0xF4, 0x9D, + 0x9A, 0xB7, 0x3C, 0x7C, 0x12, 0xDF, 0x8B, 0xC6, 0x6C, 0x04, 0x18, 0xF2, 0x0B, 0xFA, 0x02, 0x4B, + 0x8C, 0x94, 0x06, 0x59, 0x6D, 0x59, 0xAA, 0x65, 0xC0, 0x3B, 0xF6, 0x3E, 0x34, 0xC5, 0x32, 0x2F, + 0x59, 0xF2, 0x26, 0xD1, 0x30, 0x09, 0xFB, 0x98, 0xF7, 0x09, 0x44, 0x70, 0x0D, 0x61, 0xFC, 0x1B, + 0xEB, 0x05, 0x9A, 0x35, 0x15, 0xAE, 0x7E, 0xCD, 0xE1, 0x63, 0xBA, 0x26, 0x34, 0x75, 0xFE, 0xE4, + 0x32, 0x7A, 0x76, 0x3C, 0x31, 0x1E, 0xA9, 0x70, 0xCB, 0xD1, 0xEA, 0x19, 0xFC, 0x94, 0xB9, 0xA0, + 0x85, 0xA1, 0x7E, 0x3B, 0xB5, 0x9F, 0xB6, 0x6F, 0x22, 0x7A, 0x8D, 0xF9, 0xA0, 0xD2, 0x7A, 0x99, + 0x1C, 0xE6, 0xF8, 0x58, 0x46, 0xB8, 0x42, 0x69, 0x48, 0x17, 0x4E, 0x25, 0xB3, 0x98, 0x58, 0xA7, + 0x67, 0x17, 0x86, 0xC2, 0x18, 0x5A, 0x3C, 0x85, 0xE4, 0x60, 0x95, 0x28, 0xDA, 0xC0, 0x8C, 0xA1, + 0xCD, 0x6B, 0x62, 0x1C, 0x6D, 0xF6, 0x4A, 0x4E, 0xB6, 0xAA, 0x65, 0xDB, 0x86, 0xDC, 0x53, 0xB5, + 0x8A, 0xE0, 0x53, 0x2D, 0xEA, 0x7B, 0x69, 0x62, 0x2F, 0xE7, 0xCC, 0x54, 0x0D, 0xDD, 0x86, 0x20, + 0xA4, 0x67, 0x04, 0x7C, 0xA7, 0x89, 0xED, 0x12, 0x84, 0xC5, 0xDB, 0x54, 0x9D, 0x8A, 0xB0, 0x99, + 0xE7, 0x43, 0x29, 0x87, 0x98, 0x0D, 0x81, 0x3D, 0x8B, 0x58, 0x75, 0x79, 0xBD, 0x37, 0xC4, 0x94, + 0x75, 0xA8, 0xB6, 0x3D, 0x83, 0x92, 0x2D, 0x57, 0xB3, 0x19, 0x2D, 0x55, 0x94, 0xAB, 0xF6, 0x6E, + 0xE7, 0x39, 0xBD, 0x06, 0x75, 0x7A, 0xC3, 0xF3, 0x2D, 0xE4, 0x37, 0x85, 0xE5, 0xDB, 0x14, 0x65, + 0x1F, 0x6E, 0x66, 0xB1, 0x61, 0x51, 0xFF, 0x6F, 0x7D, 0x7D, 0x32, 0x48, 0x29, 0x1D, 0xF0, 0xD7, + 0xCE, 0x92, 0xB2, 0x38, 0x70, 0x58, 0x73, 0x27, 0x6E, 0xE0, 0xD4, 0x5A, 0xBC, 0x78, 0xC7, 0x51, + 0x38, 0xC0, 0x6C, 0xDD, 0x00, 0x3A, 0xFD, 0xF5, 0xBD, 0x1B, 0x78, 0x43, 0x1A, 0x69, 0x6C, 0x66, + 0x60, 0xCC, 0xF6, 0x4C, 0x13, 0x61, 0x42, 0x60, 0x9E, 0xFD, 0x60, 0xA6, 0xB6, 0xFC, 0x21, 0x34, + 0x91, 0x58, 0x78, 0xA6, 0x96, 0xEE, 0x15, 0x7F, 0xEC, 0x97, 0xFD, 0xB7, 0xA4, 0xA5, 0x96, 0xAF, + 0x62, 0x4A, 0xA6, 0x0A, 0x39, 0x23, 0x90, 0xC6, 0x8C, 0x34, 0x81, 0x80, 0x34, 0xD0, 0x63, 0x1A, + 0xF5, 0x29, 0xF3, 0x62, 0xE0, 0x85, 0xED, 0x21, 0xCB, 0x36, 0x40, 0xD6, 0x08, 0xFF, 0x33, 0x09, + 0x13, 0x3C, 0x5E, 0xFE, 0x05, 0x4D, 0xF0, 0x72, 0x4A, 0x06, 0x01, 0x78, 0xDF, 0x8D, 0x24, 0x33, + 0xED, 0x89, 0x9B, 0xDC, 0xB4, 0xA3, 0x70, 0x02, 0x14, 0x09, 0xB8, 0x72, 0x4A, 0xB9, 0x89, 0x94, + 0xE0, 0x42, 0xDB, 0xE3, 0x58, 0x1A, 0xE2, 0x2C, 0xFC, 0x9F, 0x42, 0x3E, 0xA9, 0x27, 0xA5, 0xA8, + 0x64, 0x86, 0x07, 0x41, 0xF5, 0x2E, 0x86, 0xAC, 0x3A, 0xC6, 0xED, 0x51, 0x09, 0xA6, 0x9A, 0x94, + 0x08, 0xB3, 0x45, 0xEE, 0x30, 0x8D, 0x69, 0x30, 0xE0, 0xE2, 0x0E, 0xDB, 0x10, 0x26, 0xE3, 0xEC, + 0x4D, 0xC1, 0x9A, 0x3D, 0x71, 0xA0, 0x26, 0x21, 0x1A, 0x43, 0xA7, 0xE1, 0xE6, 0x39, 0x36, 0x48, + 0x96, 0x64, 0x63, 0x2A, 0x43, 0x73, 0xE3, 0xE5, 0x92, 0x66, 0x3F, 0xFF, 0x9A, 0xE9, 0x7C, 0x4C, + 0x91, 0xC1, 0xCD, 0x62, 0xFB, 0x0F, 0xC7, 0xDE, 0xCC, 0xC4, 0xCB, 0x9C, 0x91, 0xC5, 0x7F, 0x3E, + 0xB6, 0xBC, 0x75, 0x81, 0x52, 0x4F, 0x87, 0x2B, 0x4F, 0x8E, 0xF9, 0xE0, 0xEE, 0x21, 0x84, 0x0C, + 0xB0, 0x04, 0x3A, 0xE9, 0x8F, 0xF7, 0x71, 0xB9, 0x35, 0x1F, 0xDB, 0xE3, 0x11, 0x1A, 0x67, 0xB7, + 0x89, 0x1E, 0x25, 0x8C, 0x49, 0xE3, 0x95, 0x0A, 0xA5, 0xF1, 0xB4, 0xDC, 0x84, 0x0B, 0x68, 0x0A, + 0xA2, 0xDF, 0x0A, 0xCE, 0x9D, 0xDC, 0xF8, 0x5C, 0xDC, 0x2C, 0x93, 0x99, 0x94, 0x3E, 0xF6, 0x68, + 0xB8, 0x94, 0x53, 0xED, 0xD5, 0xC6, 0x8B, 0xA2, 0x9D, 0xC1, 0xC4, 0x9B, 0xDA, 0xE7, 0x4F, 0x5E, + 0x79, 0x70, 0x34, 0xEF, 0xD5, 0xC4, 0x9B, 0xAB, 0x57, 0xC5, 0xCD, 0xA4, 0x5E, 0x65, 0x14, 0x68, + 0x1D, 0xEB, 0x38, 0x9D, 0x2C, 0x95, 0xDE, 0x63, 0xD1, 0x68, 0xA6, 0x4F, 0x7C, 0x16, 0xF5, 0xF0, + 0xA2, 0x2F, 0xA2, 0x92, 0xD3, 0x8A, 0xB3, 0x0D, 0x5E, 0xDE, 0x6A, 0xAE, 0x41, 0x34, 0x9A, 0xF3, + 0xC9, 0xCD, 0xC8, 0x13, 0x45, 0x40, 0xE0, 0x0C, 0x03, 0xEA, 0xDD, 0xF4, 0xC7, 0x25, 0x5D, 0x16, + 0x25, 0x87, 0xEF, 0x0F, 0xCE, 0x0A, 0xFA, 0x29, 0xE5, 0xDF, 0x38, 0x3E, 0x9B, 0xAF, 0xAF, 0x52, + 0x72, 0x8C, 0x2A, 0x20, 0xD4, 0x0E, 0x40, 0xE1, 0x5D, 0x18, 0x7D, 0x67, 0x9E, 0x52, 0x7A, 0xAE, + 0x5F, 0xDD, 0xBF, 0x0E, 0xBF, 0xDE, 0xF9, 0xD7, 0xFE, 0x29, 0x6F, 0x53, 0x39, 0x69, 0xAD, 0xD4, + 0xE6, 0x5B, 0x1D, 0xD3, 0xF9, 0x67, 0x65, 0x7F, 0xDE, 0xE9, 0xF5, 0x8C, 0x2D, 0xBC, 0xB6, 0xD3, + 0x94, 0x31, 0x16, 0x6E, 0x34, 0x91, 0xE3, 0x72, 0x45, 0xDC, 0x4B, 0x6A, 0x6F, 0xA4, 0x38, 0x4D, + 0x3D, 0x8B, 0xBB, 0x96, 0x85, 0x5F, 0x35, 0xAB, 0xB2, 0xE2, 0x82, 0xD7, 0x0D, 0x4E, 0xE9, 0x5D, + 0x9A, 0x0B, 0x4B, 0x1D, 0x74, 0x8D, 0x9B, 0xC6, 0xC5, 0x16, 0x0E, 0xD5, 0x49, 0x3C, 0x10, 0x6F, + 0x64, 0xA6, 0xC9, 0x9F, 0x0E, 0x04, 0x4C, 0x28, 0xC1, 0x24, 0x63, 0xBF, 0xF8, 0x6F, 0x7D, 0xB6, + 0xC4, 0x10, 0x3F, 0x26, 0x74, 0x34, 0x4E, 0x1E, 0x14, 0x71, 0xB5, 0xEF, 0xD1, 0x45, 0x5C, 0xE3, + 0x81, 0x46, 0x5E, 0xA1, 0x23, 0x82, 0xA0, 0xA4, 0x90, 0x08, 0x90, 0x9F, 0x00, 0xE3, 0x94, 0xF1, + 0xE9, 0xA7, 0x90, 0x20, 0x49, 0x35, 0x23, 0x89, 0x1F, 0xCB, 0xDD, 0xCE, 0xE5, 0x0D, 0xED, 0x09, + 0x8A, 0x45, 0x04, 0xCE, 0xC4, 0xB0, 0x35, 0x4A, 0xDF, 0x8B, 0x66, 0x00, 0x08, 0x8E, 0x35, 0xBB, + 0x79, 0x3C, 0xFB, 0x25, 0x96, 0xE4, 0x6C, 0x18, 0x8B, 0x55, 0x70, 0x3E, 0x81, 0x2A, 0x93, 0x1D, + 0x09, 0x76, 0xA1, 0xE8, 0x48, 0x3D, 0x58, 0xD9, 0x91, 0x5B, 0xE4, 0xE7, 0x11, 0xFE, 0xF4, 0xB5, + 0x5A, 0x92, 0xFA, 0x60, 0x41, 0xA1, 0x3E, 0x16, 0xAA, 0xC6, 0x3B, 0x3F, 0x90, 0x06, 0x43, 0x7A, + 0x7D, 0x95, 0xDD, 0x63, 0x17, 0x91, 0x61, 0xB4, 0x6D, 0x61, 0xF5, 0x0C, 0x95, 0x9A, 0x59, 0x7D, + 0x5A, 0x53, 0x36, 0x6C, 0xAD, 0x7C, 0x6C, 0xB4, 0xFA, 0xBA, 0x48, 0x63, 0x8E, 0xAC, 0xDC, 0x17, + 0x56, 0xCE, 0x63, 0x97, 0xCA, 0x0A, 0xB3, 0x67, 0x00, 0x84, 0xD7, 0xE2, 0xAC, 0x99, 0x82, 0x6B, + 0xDA, 0x33, 0x70, 0xA9, 0x15, 0x24, 0xB7, 0x50, 0x09, 0xA9, 0x35, 0x6F, 0xA2, 0x41, 0x59, 0x41, + 0xF6, 0x44, 0x56, 0x0F, 0x30, 0x58, 0xE7, 0xA5, 0x92, 0xF3, 0xAF, 0x00, 0x6D, 0xD3, 0x62, 0x07, + 0xA9, 0x1D, 0x60, 0x43, 0x36, 0x01, 0x04, 0x6D, 0x28, 0x61, 0x05, 0x00, 0x24, 0xEF, 0xD3, 0xA9, + 0x33, 0x4B, 0x10, 0x9B, 0x65, 0x88, 0x23, 0xB0, 0xD4, 0xC6, 0xE9, 0xF3, 0xB7, 0xBA, 0x76, 0xCE, + 0x10, 0xFD, 0xCC, 0x2B, 0x35, 0xAE, 0xD5, 0xBF, 0xD5, 0x6E, 0x16, 0xE2, 0x95, 0x1F, 0x3C, 0xD2, + 0x20, 0xB0, 0xCC, 0x35, 0x47, 0xE7, 0xE7, 0x1F, 0xCF, 0x6B, 0x73, 0xEA, 0x2A, 0x60, 0x0B, 0xDF, + 0x30, 0x90, 0x20, 0x4C, 0x88, 0x7B, 0x0B, 0x3B, 0x49, 0x6E, 0xFB, 0xDF, 0xD6, 0xD7, 0x39, 0xCF, + 0xBF, 0x7D, 0x47, 0x13, 0x45, 0x3F, 0x69, 0xFB, 0x8F, 0xA9, 0x3A, 0x4C, 0x77, 0x8F, 0xD2, 0xD5, + 0xA1, 0x12, 0x19, 0x6F, 0xEB, 0xEA, 0xC1, 0xA7, 0xF3, 0xF3, 0xA3, 0xD3, 0x0B, 0x6B, 0x67, 0x0B, + 0xFB, 0x99, 0xD2, 0x82, 0x2A, 0x79, 0x32, 0x46, 0x95, 0x88, 0xDE, 0x11, 0xBF, 0x4D, 0x0F, 0x15, + 0x85, 0xAF, 0x23, 0xD3, 0xF7, 0xE0, 0xCC, 0xDB, 0x03, 0xC8, 0xBD, 0xAD, 0x31, 0x0F, 0x53, 0x85, + 0x1D, 0xDB, 0xE5, 0x90, 0x0A, 0x48, 0x52, 0x13, 0x22, 0x22, 0xFC, 0xB3, 0xC2, 0xD3, 0x93, 0x5D, + 0x30, 0xD5, 0x56, 0xB2, 0x78, 0x8A, 0x84, 0x27, 0x56, 0x1E, 0x1A, 0x37, 0x06, 0xC6, 0x6C, 0x7F, + 0xDE, 0x75, 0xF8, 0x07, 0x19, 0x6F, 0xFB, 0xF2, 0x5E, 0x4D, 0x1B, 0x18, 0x52, 0x6F, 0x8E, 0x0C, + 0xF0, 0xE1, 0x9D, 0xC8, 0xB3, 0x88, 0xF6, 0xA1, 0x6B, 0xB9, 0x97, 0xFF, 0xDA, 0x05, 0xD8, 0x77, + 0x01, 0x96, 0x35, 0x56, 0x15, 0xD7, 0x67, 0x59, 0x61, 0x55, 0x94, 0xD6, 0xF5, 0x55, 0xA3, 0xAA, + 0x60, 0x75, 0x1D, 0x70, 0xE0, 0xF2, 0x74, 0x93, 0x9D, 0x1E, 0x52, 0xFF, 0x4B, 0xD4, 0xAD, 0x9D, + 0x5A, 0x71, 0xBA, 0x5D, 0x2B, 0x3D, 0xCD, 0x02, 0xC5, 0x9D, 0x02, 0xB4, 0xAC, 0x4B, 0x4F, 0x36, + 0xEF, 0xA6, 0xAD, 0x01, 0x4C, 0x5B, 0xA4, 0xDC, 0x50, 0x67, 0x83, 0x9A, 0x1F, 0xDB, 0x38, 0x64, + 0x85, 0x89, 0x9B, 0x92, 0x20, 0x32, 0xCC, 0x0A, 0x13, 0x5A, 0x6A, 0xCE, 0xB1, 0x6F, 0x56, 0x0A, + 0x39, 0x36, 0xC3, 0xEC, 0xD5, 0x10, 0x71, 0xBB, 0x9E, 0x91, 0x67, 0xB6, 0xAA, 0x4E, 0xD7, 0xA0, + 0x29, 0xD7, 0x10, 0x3A, 0xA6, 0x1D, 0xD3, 0x3A, 0xA8, 0x65, 0xB9, 0x36, 0x9C, 0x17, 0xDF, 0xF9, + 0xB7, 0x34, 0x20, 0x2E, 0xA6, 0x52, 0x8F, 0xEA, 0xE8, 0xA8, 0x17, 0xB1, 0x1C, 0xBE, 0x49, 0xF4, + 0x80, 0x4B, 0x58, 0xFA, 0xA2, 0x35, 0x77, 0x3B, 0x79, 0x18, 0x73, 0x2F, 0x46, 0x71, 0x5E, 0x53, + 0x1F, 0xB3, 0x25, 0x7E, 0x40, 0x0E, 0x0F, 0xDB, 0x5E, 0xFA, 0x93, 0xBD, 0xE7, 0x9A, 0x0D, 0x89, + 0xF9, 0x3C, 0x36, 0x22, 0x3D, 0x0A, 0x00, 0x97, 0x76, 0x0A, 0x36, 0x9E, 0x92, 0x25, 0x73, 0x3E, + 0x91, 0xAD, 0xBC, 0x4A, 0x19, 0xDF, 0xC8, 0xF1, 0x6B, 0x99, 0x1E, 0x45, 0x77, 0x4C, 0x5B, 0x81, + 0x47, 0xFB, 0xFE, 0xC8, 0x1D, 0xDA, 0x8A, 0xB8, 0x46, 0xFB, 0x78, 0xFD, 0x81, 0xB2, 0x94, 0xC7, + 0xC6, 0x4D, 0xA5, 0xED, 0xA5, 0x6A, 0x9E, 0x0C, 0x10, 0x03, 0xA1, 0x50, 0xDE, 0xC8, 0xDD, 0x8D, + 0xCB, 0x16, 0xB9, 0x01, 0xE3, 0x3F, 0xB0, 0x7A, 0x12, 0x4B, 0x1A, 0xBC, 0xEF, 0x06, 0x84, 0x22, + 0x63, 0x98, 0x72, 0xF5, 0x83, 0x5B, 0xF6, 0xC2, 0x15, 0x46, 0xB9, 0xC5, 0x69, 0x9D, 0x3D, 0xC2, + 0x3F, 0xF2, 0x6A, 0x98, 0x2B, 0x3C, 0x0C, 0x86, 0x0F, 0xE2, 0x4A, 0x33, 0x6E, 0x91, 0xD5, 0x16, + 0x7A, 0x5C, 0xB5, 0xD8, 0x80, 0xB5, 0xB5, 0xDB, 0x3A, 0xF9, 0x61, 0x9A, 0x74, 0x08, 0x0C, 0x35, + 0xAD, 0x85, 0xF0, 0xC4, 0x9E, 0x3F, 0xF0, 0x93, 0x7C, 0xC8, 0x40, 0x15, 0x37, 0xAD, 0x0F, 0x7F, + 0xA9, 0x7C, 0x63, 0xDB, 0x00, 0x2B, 0xBF, 0x56, 0x56, 0xCA, 0x53, 0x2C, 0xC9, 0x98, 0x10, 0x4E, + 0x7D, 0xB5, 0xDE, 0xCC, 0x47, 0x71, 0x65, 0x05, 0x79, 0x89, 0x99, 0x94, 0x07, 0x61, 0xE8, 0x55, + 0x69, 0x4E, 0xA0, 0x79, 0x3E, 0xD8, 0xB3, 0xB7, 0x6F, 0x23, 0x7A, 0xA9, 0x6F, 0xA5, 0x10, 0x52, + 0x93, 0xC6, 0x9C, 0x4F, 0x53, 0xB3, 0xFB, 0x6D, 0x76, 0x10, 0xC2, 0x77, 0xC6, 0x30, 0x5A, 0x4E, + 0x11, 0x02, 0x16, 0xEA, 0x68, 0xDC, 0x96, 0xC1, 0x89, 0x00, 0x65, 0x69, 0x1C, 0xC6, 0xB1, 0x8F, + 0x4E, 0x60, 0x5C, 0x32, 0x70, 0xD6, 0x66, 0x42, 0x93, 0xCF, 0x50, 0xE9, 0xCB, 0xC9, 0x49, 0x7B, + 0xC4, 0x7F, 0xA4, 0x8F, 0xC4, 0xFA, 0x75, 0xD5, 0xFA, 0xF5, 0xE4, 0xA4, 0xD7, 0x6B, 0xC7, 0xEC, + 0x47, 0x85, 0x40, 0x6C, 0xDF, 0x01, 0xC6, 0xAA, 0xF4, 0x3D, 0xD7, 0x66, 0x8A, 0xE0, 0xEC, 0x62, + 0x8C, 0xCC, 0xE2, 0x5C, 0xFC, 0xDF, 0xE8, 0x22, 0x17, 0x84, 0x6D, 0xB2, 0x01, 0xB3, 0xEF, 0x95, + 0xB3, 0xBE, 0xBE, 0xF1, 0xC2, 0xC1, 0x69, 0xC7, 0x78, 0xD9, 0x96, 0x7C, 0xF4, 0x72, 0x2D, 0xB0, + 0x4B, 0xBA, 0xCB, 0xC0, 0xFC, 0x11, 0x67, 0xA3, 0xC3, 0x42, 0x56, 0x61, 0xDA, 0x75, 0xF1, 0xD5, + 0xA8, 0xF0, 0x0E, 0x1F, 0x26, 0xDB, 0x70, 0x88, 0xB3, 0x49, 0xBA, 0x9B, 0xED, 0xAE, 0xB3, 0xF1, + 0xCA, 0x46, 0x4B, 0xAE, 0xA9, 0x76, 0xC9, 0xFA, 0x92, 0x49, 0xE9, 0x32, 0x6A, 0xD6, 0x73, 0x6A, + 0x56, 0x3B, 0xCE, 0xE6, 0x6A, 0xA7, 0xB3, 0xEA, 0x6C, 0xB6, 0x3B, 0x5B, 0x5D, 0x2B, 0x3D, 0x76, + 0x6D, 0xB7, 0x8B, 0xCE, 0xAF, 0x4B, 0xA2, 0xED, 0x05, 0x12, 0x75, 0x4D, 0xEF, 0x68, 0xC4, 0x09, + 0xEA, 0x74, 0x90, 0x9C, 0x97, 0x2F, 0x5F, 0xBD, 0xEA, 0x92, 0xC6, 0x21, 0x17, 0x30, 0xAC, 0xC2, + 0x7F, 0x6B, 0x66, 0x44, 0xCA, 0xFB, 0xE1, 0x80, 0x0E, 0xDC, 0x04, 0x94, 0x69, 0xCF, 0x1F, 0x04, + 0xDA, 0x4E, 0x43, 0x9D, 0xCE, 0x4E, 0xAE, 0x4D, 0x24, 0xED, 0x95, 0x95, 0xF3, 0xED, 0x1A, 0x3A, + 0x9A, 0xEE, 0x49, 0xDA, 0xAE, 0x85, 0xFC, 0xAB, 0xF3, 0x57, 0xC0, 0xCE, 0x99, 0x37, 0x2A, 0x28, + 0x35, 0xC6, 0x0E, 0xAE, 0x53, 0x24, 0xC7, 0x74, 0x95, 0x0E, 0x2D, 0x10, 0x29, 0x1B, 0xDB, 0xD5, + 0x55, 0xF6, 0x10, 0x3A, 0xA8, 0x8A, 0x7C, 0xB8, 0x5D, 0xFE, 0x22, 0xBA, 0x1F, 0xF0, 0xC4, 0x79, + 0xAC, 0x84, 0x72, 0xBD, 0xDE, 0x62, 0xE7, 0x7C, 0x16, 0x30, 0x2B, 0xD0, 0xA6, 0x78, 0x48, 0x0C, + 0x88, 0x2C, 0xD6, 0x30, 0x79, 0x5D, 0x03, 0x25, 0x8C, 0x36, 0x60, 0x69, 0x09, 0x14, 0x5F, 0x0A, + 0xC6, 0x16, 0x8A, 0x5F, 0xE0, 0xC5, 0x4F, 0x61, 0xE9, 0x16, 0xA8, 0xFE, 0xB5, 0x35, 0xCB, 0xCC, + 0x57, 0x9E, 0x63, 0x98, 0x7F, 0x19, 0xE7, 0x90, 0x15, 0xDF, 0x02, 0x1E, 0x1A, 0x9C, 0xE0, 0x45, + 0x01, 0xF7, 0x76, 0x67, 0x57, 0xA8, 0xC0, 0xDE, 0xA0, 0x9F, 0x06, 0x61, 0xE5, 0xDB, 0x09, 0x36, + 0x4E, 0xB0, 0x59, 0x25, 0x42, 0x78, 0x54, 0x30, 0x42, 0xD1, 0xA8, 0x30, 0x24, 0xD8, 0x3C, 0xFC, + 0xCA, 0x91, 0x81, 0x48, 0x8B, 0x61, 0x5E, 0x6F, 0x75, 0x27, 0x53, 0x5A, 0xFC, 0xBE, 0x58, 0x8D, + 0xD9, 0x62, 0xEF, 0xB9, 0xF9, 0xC1, 0x24, 0x61, 0x6E, 0x27, 0x25, 0xA8, 0x32, 0x44, 0x27, 0x27, + 0xAA, 0xBF, 0xEF, 0x5B, 0x1F, 0x16, 0x6F, 0x58, 0x78, 0xD4, 0xA5, 0x38, 0x5F, 0xB2, 0x99, 0x1F, + 0xFE, 0xC7, 0x6B, 0xF6, 0xBC, 0x36, 0x0E, 0xCB, 0x6A, 0xC7, 0x30, 0xB8, 0x2F, 0x3A, 0x06, 0x97, + 0xA7, 0x1F, 0x2F, 0x0F, 0x8F, 0x0E, 0x8E, 0x4F, 0xF6, 0x3E, 0x18, 0xC3, 0x11, 0x53, 0x58, 0x9D, + 0x3C, 0xEC, 0x5C, 0x46, 0x92, 0xC6, 0x77, 0x45, 0x36, 0xF8, 0x19, 0x8D, 0x37, 0xB1, 0xB2, 0x2E, + 0x9F, 0x5B, 0x0A, 0xC7, 0xE5, 0x36, 0x29, 0x3F, 0xFF, 0x92, 0xF1, 0x4D, 0xB4, 0x40, 0xD6, 0x49, + 0x0F, 0x81, 0x58, 0xB6, 0x5F, 0x29, 0xBA, 0x95, 0x1C, 0xCA, 0x1A, 0xD9, 0x82, 0x65, 0x81, 0xC5, + 0xF1, 0xA5, 0x48, 0xD6, 0xC8, 0xFA, 0x16, 0x46, 0xBC, 0x37, 0xB7, 0x8D, 0xD0, 0x56, 0x1D, 0x66, + 0xD3, 0x8A, 0xE8, 0x2F, 0x38, 0x0C, 0x05, 0x47, 0xAC, 0x05, 0xE7, 0xE4, 0x66, 0xE9, 0x9C, 0xDC, + 0xC8, 0xE6, 0xA4, 0xBA, 0x44, 0x2F, 0x71, 0x4A, 0x56, 0x9E, 0x90, 0xF9, 0x4C, 0x54, 0x04, 0xA2, + 0x68, 0x1A, 0xEA, 0x13, 0x62, 0xE6, 0x89, 0x57, 0x3C, 0xED, 0xEC, 0x92, 0xA9, 0x72, 0x88, 0xF9, + 0x99, 0x8A, 0x16, 0x16, 0xD0, 0x05, 0x62, 0x39, 0xAB, 0x94, 0x69, 0x02, 0x25, 0xAF, 0x13, 0x95, + 0x24, 0x49, 0x93, 0x25, 0x45, 0x70, 0x3A, 0x7C, 0xE8, 0x57, 0x9F, 0x6C, 0xEC, 0x2F, 0x4F, 0x4E, + 0x2E, 0x0F, 0xF7, 0x7A, 0xEF, 0x0D, 0x09, 0x10, 0xDE, 0x50, 0xB9, 0x4E, 0x12, 0xE1, 0x13, 0xAB, + 0x46, 0xC0, 0x4D, 0x3E, 0xDC, 0xF2, 0x53, 0xF5, 0xCE, 0x37, 0x49, 0x44, 0x8A, 0x06, 0x51, 0x6E, + 0xD0, 0xF9, 0x26, 0xA9, 0x4B, 0x73, 0x1C, 0x9F, 0x7B, 0x54, 0x8A, 0xC7, 0xA4, 0x9B, 0x8D, 0x49, + 0xBA, 0xDD, 0x7D, 0x82, 0x31, 0x01, 0x05, 0xFD, 0x03, 0x0E, 0xCB, 0x0F, 0xB5, 0x8A, 0x49, 0x6C, + 0xAA, 0xB6, 0x98, 0xC9, 0xDD, 0xEA, 0xE6, 0xDD, 0xB2, 0xAC, 0x66, 0x4F, 0xB1, 0xD0, 0x2C, 0x26, + 0x81, 0xDA, 0x0A, 0xC3, 0x45, 0x30, 0x37, 0xCA, 0x2C, 0x59, 0x02, 0xB7, 0xA7, 0xB1, 0x22, 0xD7, + 0xBE, 0x4F, 0xD7, 0x49, 0xA1, 0xFB, 0xC8, 0x53, 0xEA, 0xBE, 0xCA, 0xF3, 0x8B, 0xFC, 0xFF, 0xA8, + 0xF6, 0xD4, 0xF1, 0xE8, 0x66, 0xE3, 0x41, 0x9E, 0xEA, 0x70, 0xC0, 0xA7, 0xF4, 0x0F, 0x36, 0x28, + 0x3F, 0xA2, 0xD2, 0xFB, 0x3D, 0xEA, 0xBB, 0xD4, 0x94, 0xA4, 0x5C, 0xE2, 0x58, 0xDA, 0xF1, 0x7B, + 0x1C, 0x4B, 0x41, 0x96, 0x2D, 0xE3, 0x55, 0x53, 0x0F, 0xEC, 0xB4, 0x30, 0x5D, 0x7A, 0xA6, 0x31, + 0xB5, 0x95, 0x4B, 0x46, 0x6F, 0xB4, 0xAE, 0xE6, 0xB1, 0x8F, 0x2D, 0x12, 0x4E, 0x12, 0xFC, 0xC3, + 0x15, 0x86, 0x74, 0x6C, 0xD5, 0x0B, 0x55, 0xBB, 0x38, 0xDA, 0x76, 0xAF, 0x80, 0x29, 0x23, 0x4A, + 0xEA, 0xDA, 0x34, 0xA9, 0xB7, 0x08, 0x4D, 0xFA, 0xEA, 0xBB, 0x8D, 0x48, 0x3D, 0x23, 0x46, 0x22, + 0xAE, 0x65, 0x93, 0x8E, 0x02, 0x1B, 0xBA, 0xB0, 0x23, 0x2A, 0x77, 0x84, 0xFC, 0x40, 0x63, 0x91, + 0xAF, 0xEA, 0x02, 0xD6, 0xB4, 0xCF, 0xE6, 0x5C, 0x9C, 0xF2, 0x6F, 0x4D, 0x89, 0xE1, 0xC6, 0x9D, + 0xAB, 0x4C, 0x48, 0xD1, 0xCD, 0xD4, 0x82, 0xA4, 0x5E, 0xCA, 0x07, 0x0F, 0x38, 0x41, 0x2D, 0x08, + 0x6E, 0xB9, 0xD0, 0xD2, 0x8D, 0xF5, 0xB2, 0x61, 0xF6, 0x3E, 0x9F, 0xEC, 0x7F, 0xFC, 0xC0, 0xA1, + 0x1A, 0xF1, 0x21, 0xC3, 0x30, 0x18, 0xB0, 0x0C, 0x19, 0x87, 0x74, 0x10, 0x51, 0xDD, 0x3C, 0x61, + 0x0E, 0x88, 0x36, 0xC6, 0x70, 0x46, 0xD2, 0x21, 0xD8, 0x2B, 0xC2, 0xCC, 0xDD, 0x72, 0x8C, 0x83, + 0x74, 0x56, 0xFC, 0x86, 0x14, 0x2B, 0xBD, 0x6C, 0xD6, 0x17, 0x48, 0x59, 0xDF, 0x9C, 0xCE, 0x2F, + 0x9A, 0x96, 0x84, 0x54, 0x0B, 0x0E, 0x75, 0x21, 0x7D, 0xD9, 0xB4, 0x32, 0x78, 0xB9, 0x02, 0x33, + 0x8D, 0x29, 0x9E, 0xB4, 0xEA, 0xB6, 0xE5, 0x76, 0x61, 0x49, 0x52, 0x33, 0x1F, 0x79, 0xAB, 0xCF, + 0x42, 0x1F, 0x97, 0xC0, 0xF9, 0x28, 0xFC, 0xAF, 0xFF, 0x54, 0x49, 0xC4, 0x6F, 0xF5, 0x9A, 0x46, + 0xE8, 0x5C, 0x90, 0x89, 0xB5, 0xEF, 0xCB, 0xD7, 0x38, 0x97, 0xB2, 0xD1, 0x71, 0x19, 0x4A, 0x67, + 0xB9, 0xF0, 0xA4, 0x43, 0xD1, 0x13, 0x80, 0x95, 0x95, 0xCF, 0xF2, 0xFA, 0x2F, 0xED, 0x66, 0x9E, + 0x80, 0xE6, 0x27, 0x05, 0xAE, 0x1D, 0x3E, 0x7F, 0x57, 0x6A, 0x59, 0xA1, 0xFC, 0xC4, 0x66, 0xEF, + 0x9E, 0x89, 0x72, 0x01, 0xA1, 0x9C, 0xF2, 0xEA, 0x8B, 0xC2, 0xD6, 0x13, 0x2C, 0x0A, 0xBD, 0xDE, + 0xFC, 0xCB, 0x82, 0xC1, 0xA9, 0xE7, 0x5A, 0x2E, 0x84, 0x14, 0x2E, 0xB0, 0x62, 0xD8, 0x48, 0x5F, + 0x7D, 0x2E, 0xDA, 0x17, 0x5F, 0x4D, 0x6C, 0xE4, 0xD7, 0xCD, 0x65, 0xE6, 0x6F, 0xB5, 0xDA, 0x93, + 0xF5, 0xA2, 0x39, 0xFF, 0x92, 0x65, 0xA3, 0x9E, 0x3C, 0x39, 0xF3, 0x35, 0xB5, 0xBB, 0x7C, 0xB1, + 0x97, 0xE2, 0x20, 0xED, 0x5A, 0x62, 0xC9, 0x62, 0xB4, 0x68, 0x5F, 0xCA, 0xC7, 0xE2, 0xB9, 0x7B, + 0xA3, 0x2D, 0x2B, 0x4F, 0x31, 0xB7, 0x4B, 0xBB, 0x64, 0x89, 0xE0, 0x51, 0x51, 0x9A, 0x9E, 0x8D, + 0xA9, 0x1F, 0x51, 0x1F, 0x56, 0xBF, 0xB4, 0xD9, 0xDA, 0xDF, 0xBC, 0xB5, 0x76, 0x82, 0xC1, 0xCF, + 0xFD, 0xE6, 0x36, 0xD1, 0xD3, 0x38, 0xA4, 0x77, 0xF1, 0x70, 0xA2, 0x6E, 0xF1, 0xCC, 0x63, 0x70, + 0xFC, 0xBD, 0x89, 0x14, 0x67, 0x48, 0x9E, 0x3A, 0x6D, 0x17, 0x4F, 0xDD, 0x69, 0xF4, 0xD1, 0xAA, + 0xE4, 0x40, 0x02, 0x9F, 0xD5, 0x83, 0x3E, 0xD6, 0x53, 0x92, 0x7D, 0x89, 0xCC, 0x6A, 0x2B, 0x08, + 0x19, 0xBD, 0x3F, 0x95, 0x72, 0x0E, 0x7D, 0x85, 0x67, 0x9F, 0x55, 0x6D, 0x01, 0x81, 0x72, 0xFA, + 0x17, 0xD0, 0x5D, 0x32, 0x86, 0x76, 0x3C, 0x13, 0x53, 0x6A, 0x07, 0x90, 0x22, 0x94, 0x45, 0x51, + 0xEE, 0x06, 0x57, 0x76, 0x98, 0x8F, 0xEF, 0xFC, 0xA4, 0x7F, 0x43, 0x4A, 0xEB, 0x30, 0xC7, 0x02, + 0xFE, 0xD6, 0xE6, 0x6B, 0x3D, 0x97, 0x2E, 0x1F, 0x97, 0xDA, 0xA7, 0xE0, 0x7B, 0x60, 0x7B, 0xBD, + 0x51, 0xCF, 0xE3, 0xDC, 0xC7, 0x50, 0xE1, 0x46, 0x65, 0x23, 0x40, 0x11, 0x3A, 0xD9, 0xE0, 0xB1, + 0x64, 0x9C, 0x70, 0x26, 0x2B, 0xC6, 0x9A, 0x9B, 0x46, 0x97, 0x8C, 0xF5, 0xB2, 0x14, 0x2D, 0x79, + 0x4A, 0xBC, 0x7C, 0xD9, 0x2E, 0x46, 0xBE, 0xFA, 0x64, 0xC8, 0xD9, 0x4E, 0xA7, 0x8C, 0xD9, 0x99, + 0xE1, 0xEA, 0x09, 0x7A, 0x5D, 0x8A, 0x5A, 0xB1, 0x9A, 0x3D, 0x41, 0xAF, 0x65, 0xA5, 0x5A, 0xCE, + 0x80, 0x27, 0xE9, 0x79, 0x35, 0xF4, 0x9C, 0x09, 0x4F, 0x43, 0x80, 0xBE, 0xB2, 0x94, 0x8A, 0xDF, + 0xEA, 0x14, 0x2A, 0x1E, 0xD5, 0x45, 0x42, 0x51, 0x46, 0x8F, 0xFF, 0x0F, 0x5B, 0x42, 0xD4, 0x3C, + 0xED, 0x1D, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -774,847 +808,860 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x01, 0x06, 0xFF, 0x65, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, - 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0xC8, - 0x92, 0xE0, 0xBB, 0xBF, 0xA2, 0x86, 0xB3, 0xB3, 0x96, 0xE6, 0x88, 0x14, 0x49, 0x5D, 0x2C, 0xEB, - 0xD8, 0x8C, 0x90, 0x44, 0xC9, 0x56, 0x1C, 0x59, 0xE6, 0x8A, 0xF2, 0xE9, 0x6E, 0x6F, 0xEC, 0x76, - 0x80, 0x40, 0x91, 0xC4, 0x31, 0x08, 0xA0, 0x81, 0x82, 0x2E, 0x3D, 0x31, 0x13, 0xE7, 0x33, 0x66, - 0x3F, 0x64, 0x7E, 0x60, 0x3E, 0xE5, 0x7C, 0xC9, 0x66, 0x66, 0x15, 0x40, 0x00, 0xBC, 0xE0, 0x22, - 0x92, 0x22, 0xD5, 0x72, 0x47, 0x4B, 0x22, 0x88, 0xBA, 0x65, 0x65, 0x66, 0x65, 0x66, 0xE5, 0xE5, - 0xC3, 0x3F, 0xB5, 0xBF, 0x9E, 0xDD, 0xFE, 0xD2, 0x39, 0x67, 0x43, 0x31, 0xB2, 0x5A, 0x6F, 0x3E, - 0xE0, 0x2F, 0x66, 0x69, 0xF6, 0xE0, 0x63, 0x85, 0xDB, 0x95, 0xD6, 0x1B, 0x78, 0xC2, 0x35, 0xA3, - 0xF5, 0x86, 0xC1, 0xBF, 0x0F, 0x23, 0x2E, 0x34, 0xA6, 0x0F, 0x35, 0xCF, 0xE7, 0xE2, 0x63, 0x25, - 0x10, 0xFD, 0xEA, 0x51, 0x85, 0xED, 0xC6, 0xBF, 0x1C, 0x0A, 0xE1, 0x56, 0xF9, 0x6F, 0x81, 0x79, - 0xF7, 0xB1, 0xF2, 0x73, 0xF5, 0xDB, 0x49, 0xF5, 0xCC, 0x19, 0xB9, 0x9A, 0x30, 0x7B, 0x16, 0xAF, - 0x30, 0xDD, 0xB1, 0x05, 0xB7, 0xA1, 0xE5, 0xE5, 0xF9, 0x47, 0x6E, 0x0C, 0xF8, 0x8E, 0x3E, 0xF4, - 0x9C, 0x11, 0xFF, 0xD8, 0x18, 0x77, 0x22, 0x4C, 0x61, 0xF1, 0x56, 0xD7, 0xD5, 0xBC, 0x1F, 0x17, - 0x81, 0xCD, 0x6E, 0x6E, 0xFF, 0xC2, 0xBA, 0x5C, 0x04, 0xEE, 0x87, 0x5D, 0xF9, 0x4D, 0x6C, 0x28, - 0x5B, 0x83, 0xA6, 0x95, 0x3B, 0x93, 0xDF, 0xBB, 0x8E, 0x27, 0x2A, 0xF4, 0x0D, 0xFE, 0x8B, 0x46, - 0xB9, 0x37, 0x0D, 0x31, 0xFC, 0x68, 0xF0, 0x3B, 0x53, 0xE7, 0x55, 0xFA, 0xB0, 0xC3, 0x4C, 0xDB, - 0x14, 0xA6, 0x66, 0x55, 0x7D, 0x5D, 0xB3, 0x60, 0xE0, 0x1D, 0x36, 0xD2, 0x1E, 0xCC, 0x51, 0x30, - 0x1A, 0x3F, 0x08, 0x7C, 0xEE, 0xD1, 0x27, 0x0D, 0xE6, 0xFC, 0xB1, 0xBE, 0xC3, 0xFC, 0xA1, 0x67, - 0xDA, 0x3F, 0xAA, 0xC2, 0xA9, 0xF6, 0x4D, 0xF1, 0xF1, 0x91, 0xFB, 0xE3, 0xD9, 0x5A, 0xF0, 0x05, - 0xF3, 0xB8, 0xF5, 0xB1, 0xE2, 0x8B, 0x47, 0x8B, 0xFB, 0x43, 0xCE, 0x45, 0x85, 0x0D, 0x3D, 0xDE, - 0x87, 0x27, 0x9E, 0xBE, 0xDB, 0x73, 0x1C, 0xE1, 0x0B, 0x4F, 0x73, 0x6B, 0x23, 0xD3, 0xAE, 0xE9, - 0xBE, 0x5F, 0xC9, 0xD9, 0x90, 0x9E, 0xC6, 0x1B, 0xF8, 0xBA, 0x67, 0xBA, 0x82, 0xC1, 0x77, 0xF2, - 0x85, 0xBF, 0xFD, 0x16, 0x70, 0xEF, 0xB1, 0xBA, 0x57, 0x3B, 0xAC, 0xD5, 0xA9, 0xF3, 0xBF, 0xC1, - 0xAB, 0x1F, 0x76, 0xE5, 0x6B, 0x33, 0xDA, 0x24, 0x67, 0x53, 0xA8, 0x41, 0x2F, 0xB0, 0x0D, 0x98, - 0xD0, 0x64, 0xBB, 0x78, 0xC3, 0x56, 0xB4, 0x05, 0xFF, 0x63, 0xCB, 0x70, 0xF4, 0x60, 0x04, 0xBB, - 0xB0, 0x5D, 0x73, 0xEC, 0xAD, 0xB7, 0xBA, 0x65, 0xEA, 0x3F, 0xDE, 0xEE, 0xB0, 0xB7, 0x35, 0xE1, - 0x0C, 0x06, 0x16, 0xAF, 0xF6, 0x84, 0x0D, 0x1F, 0xFB, 0x81, 0xAD, 0x0B, 0xD3, 0xB1, 0xD9, 0x16, - 0xDF, 0x66, 0xFF, 0x16, 0xB5, 0x96, 0x3D, 0xC0, 0xF2, 0x03, 0xCF, 0x83, 0x2E, 0x6E, 0x35, 0x6F, - 0xC0, 0x45, 0x4D, 0x1F, 0x9A, 0x96, 0x01, 0x9F, 0xFF, 0x77, 0xFD, 0xFF, 0x6C, 0xAB, 0x6E, 0xCE, - 0x2C, 0xCD, 0xF7, 0xB7, 0xDE, 0x9A, 0xB0, 0xE3, 0x55, 0x5D, 0xF3, 0xB8, 0xA8, 0x1A, 0xCE, 0xBD, - 0xCD, 0x62, 0x9F, 0x03, 0xF7, 0xED, 0xF6, 0x9F, 0xA3, 0x8E, 0xFF, 0x7D, 0x5B, 0x4E, 0x37, 0x3D, - 0x7B, 0x04, 0xF6, 0x78, 0xF2, 0x35, 0x5F, 0x00, 0xC2, 0xEA, 0xD5, 0x81, 0xE7, 0x04, 0x6E, 0x6A, - 0x5A, 0x43, 0x6E, 0x0E, 0x86, 0xE2, 0x98, 0xD5, 0xFF, 0x9C, 0x78, 0xEC, 0xDC, 0x71, 0xAF, 0x6F, - 0x39, 0xF7, 0xC7, 0x6C, 0x68, 0x1A, 0x06, 0xB7, 0x93, 0xDF, 0x02, 0x04, 0x6D, 0xDF, 0xC4, 0x85, - 0x1E, 0xAB, 0x0E, 0x58, 0xBD, 0xB6, 0xEF, 0x33, 0xAE, 0xF9, 0x3C, 0xF9, 0x66, 0xCF, 0xF1, 0x0C, - 0xC0, 0xBE, 0x9E, 0x23, 0x84, 0x33, 0x3A, 0x66, 0xBE, 0x63, 0x99, 0x06, 0x6B, 0xB8, 0x0F, 0xEC, - 0x9F, 0xF5, 0x3A, 0xFE, 0x17, 0x5B, 0xCA, 0x9B, 0xF1, 0x7C, 0x2D, 0xD3, 0x17, 0xEB, 0x3D, 0x5B, - 0xFC, 0xE7, 0x6A, 0x86, 0x61, 0xDA, 0x83, 0xAA, 0x27, 0xE7, 0x74, 0x50, 0x77, 0x1F, 0xA6, 0x2F, - 0x47, 0x76, 0x0B, 0x44, 0xE1, 0x33, 0x61, 0xEC, 0x4C, 0x7F, 0x3E, 0x4C, 0xAD, 0x54, 0x7E, 0x77, - 0xCC, 0x6C, 0xC7, 0x4E, 0x4D, 0x72, 0x04, 0xD8, 0x63, 0xDA, 0x55, 0x8B, 0xF7, 0x11, 0x10, 0x33, - 0xC6, 0xEC, 0x05, 0xB0, 0x04, 0xFB, 0xB8, 0x0F, 0x48, 0xEB, 0xA7, 0x7A, 0x76, 0x02, 0x01, 0xC4, - 0xCA, 0x13, 0x40, 0x8C, 0xCF, 0xD6, 0xB4, 0xF1, 0xEB, 0x73, 0xCF, 0x73, 0xBC, 0x54, 0x4B, 0xC3, - 0xF4, 0x5D, 0x4B, 0x7B, 0x3C, 0x66, 0xF2, 0x95, 0xE4, 0xB4, 0x74, 0xC7, 0x72, 0x60, 0xBE, 0x1E, - 0x37, 0x92, 0xCF, 0xFB, 0xC0, 0xBC, 0xAA, 0xBE, 0xF9, 0x3B, 0x0C, 0xE8, 0x8F, 0x34, 0xCB, 0xE2, - 0xDE, 0xBC, 0x61, 0xBB, 0x81, 0xAE, 0x23, 0x3C, 0x8A, 0x0F, 0x3C, 0xF0, 0x78, 0x7A, 0xE3, 0xE7, - 0x0D, 0x1D, 0x7D, 0x7F, 0xAF, 0x50, 0xAA, 0xE7, 0x58, 0xC6, 0xAC, 0xED, 0x7B, 0xA8, 0x52, 0xFB, - 0xD4, 0xAC, 0x66, 0x6F, 0x04, 0xFE, 0x23, 0xF6, 0x7C, 0xCC, 0xF6, 0xEA, 0xFF, 0x32, 0xBB, 0x57, - 0xD9, 0x43, 0xB3, 0x3E, 0xAF, 0xE3, 0xE6, 0x1C, 0xB4, 0x0A, 0x7B, 0xD8, 0x9F, 0xDB, 0xC3, 0xFE, - 0xEC, 0x1E, 0x34, 0x21, 0x80, 0xE9, 0xA6, 0x1A, 0xBB, 0x4E, 0x48, 0x2D, 0x5A, 0x0F, 0x48, 0x20, - 0x10, 0x29, 0x80, 0xFF, 0x5E, 0x35, 0x6D, 0x83, 0x3F, 0x1C, 0xB3, 0x46, 0xBD, 0x9E, 0x22, 0x09, - 0x45, 0x0A, 0x8D, 0x09, 0x68, 0xC0, 0xA1, 0x54, 0x55, 0x10, 0x39, 0xAC, 0x4F, 0xF9, 0x96, 0xA6, - 0x2B, 0x1C, 0x17, 0xC8, 0x28, 0x39, 0x59, 0xC5, 0xDE, 0x24, 0x43, 0xFB, 0xB0, 0x2B, 0x8F, 0xEE, - 0x37, 0x1F, 0x7A, 0x8E, 0xF1, 0xA8, 0x78, 0xBC, 0x61, 0xDE, 0x31, 0x1D, 0xF9, 0xE6, 0xC7, 0x0A, - 0x1E, 0x94, 0x1A, 0x20, 0x88, 0x57, 0x61, 0xA6, 0xF1, 0xB1, 0xA2, 0x96, 0x77, 0x09, 0x8F, 0x2B, - 0x63, 0x6E, 0x48, 0x0D, 0x34, 0xCB, 0x1C, 0xD8, 0x1F, 0x2B, 0x34, 0xDF, 0x4A, 0xD8, 0x5C, 0xBD, - 0x1F, 0x7B, 0x97, 0xDE, 0x37, 0x47, 0x83, 0x74, 0x77, 0x17, 0xA6, 0xC5, 0xAF, 0xE1, 0xB4, 0xAE, - 0x8C, 0x8F, 0x96, 0x53, 0xF9, 0x6D, 0xF3, 0xD7, 0xB3, 0x21, 0xAD, 0x66, 0x50, 0x73, 0xED, 0x41, - 0x05, 0x06, 0x82, 0x73, 0x5B, 0x7D, 0xC7, 0x2C, 0x7E, 0xC7, 0xAD, 0x4A, 0x0B, 0x18, 0xB4, 0xAB, - 0xD9, 0xF1, 0x3E, 0x3B, 0xDC, 0xD3, 0xE1, 0x60, 0xA8, 0x24, 0x06, 0x26, 0xE4, 0x96, 0x33, 0x23, - 0xF4, 0x83, 0xC1, 0x10, 0x0C, 0x1F, 0x2B, 0x21, 0x39, 0x28, 0x6A, 0xA8, 0xB4, 0xFE, 0x74, 0xF8, - 0x0E, 0x60, 0x04, 0x7D, 0xC6, 0x56, 0xB9, 0x0B, 0xCB, 0x54, 0x10, 0x92, 0x7F, 0xCE, 0x83, 0x56, - 0xAA, 0x63, 0x62, 0x3A, 0xF1, 0x5D, 0x21, 0x24, 0x1C, 0xEF, 0xA1, 0xDC, 0x42, 0x09, 0x64, 0x8F, - 0x83, 0xE8, 0x74, 0x69, 0x77, 0x3C, 0x07, 0x09, 0x37, 0x0E, 0xE7, 0x5E, 0xEB, 0x06, 0xBF, 0x13, - 0x00, 0x8B, 0x0F, 0xBB, 0xBD, 0xD6, 0x87, 0x9E, 0x47, 0xFF, 0xA3, 0x04, 0x24, 0x45, 0x18, 0x66, - 0xFA, 0xC0, 0x2F, 0xF0, 0x4C, 0x46, 0x70, 0xB1, 0x8E, 0x85, 0x1C, 0x99, 0xDD, 0x6B, 0xA6, 0xA8, - 0xD5, 0x6A, 0xAB, 0x9A, 0x3A, 0x8A, 0x73, 0x16, 0x17, 0x7C, 0xCA, 0xCC, 0x59, 0x1B, 0x3A, 0x9B, - 0x31, 0xF5, 0xA1, 0xE6, 0x03, 0x6F, 0xBE, 0x67, 0xD4, 0xC7, 0x2A, 0x26, 0xDB, 0x37, 0xBD, 0xD1, - 0x3D, 0x88, 0x00, 0xDF, 0x5C, 0xCB, 0xD1, 0x8C, 0xE9, 0xB3, 0x4E, 0xCF, 0xF7, 0x42, 0xB5, 0x61, - 0x81, 0x6B, 0x68, 0x82, 0x03, 0xAB, 0x94, 0xAD, 0x6A, 0x2C, 0xB9, 0x09, 0x72, 0x21, 0xE1, 0x46, - 0xE4, 0x5C, 0x4C, 0xEB, 0xCD, 0x54, 0x92, 0x42, 0x3C, 0xC6, 0xA5, 0x46, 0xEF, 0x83, 0x68, 0x3A, - 0xAA, 0x36, 0x9A, 0x20, 0x63, 0x21, 0x21, 0x45, 0xF4, 0xE2, 0x89, 0x1F, 0x55, 0x1F, 0x05, 0xE1, - 0x18, 0x9D, 0x24, 0xA4, 0xE4, 0x9F, 0xCC, 0x0B, 0x53, 0x8A, 0xCA, 0x28, 0x9E, 0xC5, 0x66, 0x93, - 0x1B, 0xCC, 0x31, 0xC0, 0x36, 0x66, 0x03, 0x76, 0x04, 0x8D, 0x3A, 0xDA, 0x80, 0xE7, 0x5C, 0x90, - 0xE7, 0xDC, 0x4F, 0xEC, 0x63, 0xCF, 0x72, 0xF4, 0x1F, 0x7F, 0x8E, 0x77, 0x90, 0xD1, 0x89, 0x3C, - 0x4E, 0x90, 0x3D, 0xA7, 0x98, 0x0D, 0xFE, 0xC3, 0xC5, 0x87, 0x3B, 0x77, 0x1C, 0xE3, 0x15, 0x00, - 0xB1, 0xF0, 0xF1, 0x5F, 0xB9, 0xE7, 0x03, 0x87, 0x9E, 0xCD, 0x11, 0xEE, 0xEA, 0xB5, 0xBA, 0x62, - 0x09, 0x88, 0x08, 0x13, 0x63, 0x8C, 0x7B, 0xFD, 0x9D, 0x1B, 0xB9, 0x7B, 0xFD, 0x7E, 0xDE, 0xAE, - 0x5E, 0xBC, 0xEF, 0xC4, 0x66, 0x17, 0x1B, 0x87, 0x65, 0x0C, 0x24, 0xD1, 0xED, 0xF4, 0xF6, 0xB2, - 0x3D, 0x7B, 0x80, 0xB6, 0x44, 0xC9, 0x53, 0x2B, 0xE0, 0x02, 0xB0, 0x71, 0xC8, 0x2E, 0xDB, 0x70, - 0xB4, 0xC2, 0xBF, 0x9C, 0x63, 0xE8, 0x0E, 0x88, 0x4D, 0xA6, 0x0D, 0xB8, 0xEE, 0x5F, 0x5D, 0x7D, - 0x9E, 0x3D, 0xCE, 0xD5, 0xD5, 0xF0, 0x78, 0xA2, 0x9B, 0x64, 0x57, 0x03, 0xEE, 0x18, 0x1C, 0xA4, - 0xE6, 0x2B, 0x4D, 0xCC, 0xEE, 0x67, 0x1F, 0x96, 0xFF, 0xBE, 0xDE, 0x7C, 0xBF, 0xFF, 0xEE, 0xBD, - 0x9A, 0xE1, 0x4E, 0xDE, 0x6E, 0xE7, 0xC1, 0xB9, 0xDA, 0xA8, 0x1F, 0xD4, 0x1A, 0x47, 0x07, 0xF5, - 0x83, 0x77, 0x87, 0x8D, 0x82, 0x1D, 0x9F, 0x58, 0x73, 0xE6, 0xDB, 0x38, 0x38, 0x84, 0x19, 0x1F, - 0x85, 0x93, 0x65, 0x5B, 0x27, 0x9D, 0xB3, 0xED, 0x49, 0x78, 0xE6, 0x42, 0x9C, 0x18, 0xAC, 0xCF, - 0xCF, 0xCE, 0x2F, 0x66, 0x0F, 0x8A, 0xDF, 0x66, 0x41, 0x9B, 0xEB, 0xBC, 0xFF, 0xF3, 0x3C, 0x80, - 0x34, 0x8F, 0xEA, 0xCD, 0xFA, 0x61, 0xED, 0xE0, 0xF0, 0x28, 0x27, 0x3C, 0xB0, 0xC7, 0x5F, 0xE6, - 0xF4, 0xB8, 0xFF, 0xAE, 0x71, 0x78, 0x54, 0xDF, 0xAF, 0xED, 0xD7, 0xF7, 0x0A, 0xF4, 0xF8, 0x7D, - 0x1E, 0x2E, 0x1C, 0x1D, 0x1E, 0x1E, 0x1E, 0xD4, 0xF6, 0x8F, 0xF6, 0xD3, 0x87, 0x71, 0x16, 0x60, - 0xE3, 0x2C, 0x6D, 0xEA, 0xE7, 0xA1, 0x17, 0x72, 0x8E, 0x91, 0xA8, 0xD6, 0xD3, 0xC2, 0xCC, 0x24, - 0xBB, 0xA3, 0x73, 0x64, 0x82, 0x1F, 0xFD, 0x53, 0xB5, 0xCA, 0xAA, 0xE1, 0x3F, 0x06, 0x27, 0x76, - 0x1F, 0xC4, 0x18, 0x76, 0xE6, 0xD8, 0x7D, 0x73, 0x10, 0xFB, 0xA2, 0x5A, 0x6D, 0x4D, 0xF2, 0x31, - 0x35, 0xBC, 0x01, 0x6A, 0x19, 0xE8, 0x44, 0x03, 0xCD, 0xAD, 0x36, 0xA7, 0xB0, 0xAE, 0x0F, 0x52, - 0xEF, 0x88, 0x04, 0x2A, 0x61, 0x33, 0xF8, 0xBF, 0xEA, 0x7A, 0x26, 0x4C, 0xEE, 0x91, 0x8D, 0x75, - 0x65, 0xC9, 0x7A, 0x5D, 0x39, 0x05, 0x39, 0x83, 0x0A, 0x13, 0x8F, 0x2E, 0x2C, 0x43, 0x76, 0x51, - 0x61, 0x70, 0x62, 0x69, 0x55, 0xD9, 0x82, 0x8E, 0x11, 0x4B, 0x73, 0x7D, 0x5E, 0x99, 0xBA, 0x47, - 0xF2, 0x55, 0xD2, 0xAA, 0x3F, 0x56, 0xFE, 0x39, 0x7C, 0xB7, 0x93, 0xEC, 0x5D, 0xF3, 0x4C, 0xAD, - 0xCA, 0x1F, 0x60, 0x03, 0x0C, 0x8E, 0xE7, 0xA9, 0x66, 0x41, 0x77, 0xF2, 0x29, 0x1E, 0x1D, 0x9E, - 0x63, 0xF9, 0xE3, 0x71, 0x92, 0x6D, 0x5B, 0x53, 0x47, 0x4D, 0x02, 0x30, 0xF0, 0x34, 0xD2, 0xFC, - 0x3F, 0x98, 0x89, 0xA5, 0xA1, 0xD2, 0x3E, 0x3E, 0x0C, 0x49, 0x85, 0x47, 0x6D, 0x9E, 0xF5, 0x4C, - 0x96, 0xD2, 0xF2, 0xF1, 0x94, 0x33, 0xA7, 0xE1, 0x8C, 0x04, 0xC8, 0x54, 0x8C, 0x99, 0xB5, 0x4D, - 0xE1, 0x32, 0xD8, 0xA8, 0x07, 0xFB, 0xA4, 0xC8, 0x35, 0xDF, 0xCA, 0x12, 0xDD, 0x68, 0x9E, 0xC1, - 0xF0, 0x47, 0x15, 0xE5, 0xED, 0x34, 0x3E, 0x4D, 0x6B, 0xD1, 0x77, 0xBC, 0x91, 0xD2, 0xDC, 0x01, - 0x53, 0x9B, 0x33, 0x20, 0x17, 0x83, 0xDE, 0xF1, 0xCC, 0x17, 0x24, 0xE1, 0xA9, 0x7E, 0x85, 0x50, - 0x08, 0xD1, 0xF3, 0xAB, 0x40, 0x76, 0x3A, 0x1F, 0x91, 0x41, 0x4C, 0xCA, 0xEF, 0x33, 0xBB, 0x20, - 0xED, 0x1F, 0xAD, 0x6C, 0x20, 0x5A, 0x70, 0x8B, 0xEB, 0x82, 0x69, 0x4C, 0x6D, 0x0C, 0x03, 0x34, - 0x00, 0xAD, 0x9B, 0xDB, 0x0C, 0xFA, 0x87, 0x23, 0x9A, 0x29, 0x49, 0x15, 0x54, 0x71, 0x07, 0x9E, - 0x6B, 0x22, 0x7C, 0xB1, 0xC6, 0x4E, 0x84, 0x94, 0xF2, 0x76, 0xE2, 0x52, 0xD3, 0xBD, 0x09, 0x07, - 0x78, 0x00, 0x10, 0xF6, 0xA9, 0x63, 0x6E, 0x8C, 0xDF, 0x0F, 0xF1, 0x42, 0x1F, 0x6A, 0xF6, 0x80, - 0xFB, 0x0C, 0x05, 0x30, 0x5F, 0xBB, 0x83, 0x57, 0xEE, 0x69, 0x3C, 0x50, 0x67, 0xFB, 0x7D, 0x8E, - 0x86, 0xA0, 0x68, 0x32, 0x20, 0x83, 0x45, 0xFD, 0x80, 0xDA, 0x4D, 0xEF, 0xBD, 0xED, 0x42, 0x9B, - 0x24, 0x72, 0xBD, 0xC5, 0x17, 0x5D, 0x98, 0x8C, 0xCF, 0x8D, 0xDA, 0x1C, 0xD8, 0x4E, 0x80, 0x8F, - 0x50, 0xCD, 0xB4, 0xFB, 0x4E, 0x55, 0x37, 0x3D, 0x1D, 0x06, 0x14, 0xFC, 0x41, 0x44, 0x64, 0x39, - 0xF2, 0x71, 0xA7, 0x66, 0x31, 0xAD, 0x14, 0xF3, 0x9A, 0x8E, 0x02, 0x29, 0x86, 0x95, 0x03, 0x3D, - 0x50, 0x8E, 0x6A, 0x65, 0x6C, 0xFE, 0x74, 0x56, 0x9B, 0xD0, 0x6E, 0x43, 0x4E, 0x37, 0x17, 0x14, - 0xA6, 0xED, 0x06, 0x42, 0xB1, 0x17, 0x4F, 0x33, 0x4C, 0xA7, 0xA2, 0x6C, 0xAD, 0x0A, 0xFE, 0x37, - 0xF2, 0xD9, 0x9D, 0x06, 0x72, 0xC7, 0xC7, 0x4A, 0x3D, 0xAB, 0x3B, 0x4B, 0xEB, 0x71, 0x2B, 0x4E, - 0xE5, 0x75, 0xD2, 0x05, 0x5B, 0x6A, 0xE3, 0xE1, 0xC4, 0xA6, 0x37, 0x9E, 0x04, 0xCA, 0x17, 0x01, - 0xC9, 0x46, 0x61, 0x48, 0x36, 0x24, 0x24, 0x1B, 0xCD, 0xBD, 0xFD, 0x83, 0xC3, 0x77, 0x47, 0xEF, - 0xEB, 0xE3, 0xBF, 0x5E, 0xA1, 0xAA, 0xA0, 0xDA, 0x2C, 0x0C, 0xD5, 0xA6, 0x84, 0xEA, 0x2B, 0x04, - 0x15, 0x04, 0xF7, 0x0A, 0x43, 0x70, 0xEF, 0x15, 0x82, 0x09, 0x08, 0xEE, 0x17, 0x86, 0xE0, 0xFE, - 0x2B, 0x04, 0x13, 0x10, 0x3C, 0x28, 0x0C, 0xC1, 0x83, 0x57, 0x08, 0x26, 0x20, 0x78, 0x58, 0x18, - 0x82, 0x87, 0xAF, 0x10, 0x4C, 0x40, 0xF0, 0x5D, 0x61, 0x08, 0xBE, 0x5B, 0x1C, 0x04, 0x17, 0x08, - 0x42, 0x39, 0x4D, 0x78, 0x3F, 0x9A, 0xA7, 0x34, 0xCE, 0x87, 0x6A, 0x68, 0xFC, 0xAA, 0x45, 0x19, - 0x24, 0xF7, 0xE8, 0x8F, 0x7D, 0xFA, 0x49, 0x03, 0x51, 0x1F, 0x91, 0x0C, 0x37, 0x17, 0x2C, 0xD8, - 0xF9, 0x71, 0x36, 0x08, 0x92, 0xFA, 0x18, 0x0E, 0x7A, 0x44, 0xC3, 0xBD, 0x2B, 0xB2, 0x89, 0x28, - 0xA8, 0x57, 0x12, 0x10, 0x51, 0xCA, 0x6A, 0x42, 0x83, 0x96, 0xBB, 0x32, 0xBF, 0x57, 0x37, 0xDD, - 0x80, 0xAE, 0xF8, 0xA2, 0xBE, 0x63, 0xD7, 0x7E, 0xB8, 0xBF, 0xEE, 0xBC, 0xBD, 0x9D, 0x49, 0x01, - 0x93, 0x03, 0x9D, 0x91, 0x12, 0xF4, 0x05, 0x54, 0x16, 0x34, 0xB1, 0x26, 0x07, 0x53, 0x97, 0x7D, - 0x73, 0x86, 0x5B, 0x3C, 0xAA, 0x4C, 0xDA, 0x4B, 0xD4, 0x6D, 0xEF, 0x41, 0x0E, 0xEA, 0x52, 0xD6, - 0x8D, 0xA4, 0x9D, 0x82, 0xAE, 0x71, 0x84, 0x4D, 0x37, 0x06, 0x0A, 0x7B, 0x2A, 0xB3, 0x0C, 0x20, - 0x53, 0x31, 0x71, 0xBE, 0xFE, 0x4A, 0x57, 0xB6, 0xF6, 0x19, 0xFA, 0x1B, 0x4C, 0x8C, 0xB3, 0xB5, - 0x5D, 0x51, 0x37, 0x15, 0xEA, 0xC1, 0x74, 0x63, 0xC1, 0x92, 0x34, 0xEB, 0x98, 0x76, 0x2D, 0x27, - 0x91, 0x56, 0x85, 0x51, 0x95, 0xEE, 0x6B, 0xBA, 0x70, 0x60, 0xE5, 0x06, 0xEF, 0x6B, 0x81, 0x25, - 0xFC, 0x2C, 0xB5, 0x75, 0x29, 0xAA, 0x6B, 0x16, 0x47, 0xCA, 0x8F, 0xD5, 0x5E, 0x0C, 0xFA, 0x5F, - 0xFC, 0xC1, 0xC2, 0x10, 0x7A, 0x9A, 0x3D, 0x67, 0xCA, 0xAB, 0x29, 0x13, 0xDE, 0xA7, 0xEB, 0x6E, - 0x77, 0x95, 0xF6, 0xBB, 0x91, 0x00, 0xBE, 0x19, 0x37, 0xE2, 0x2D, 0xD8, 0x62, 0x87, 0xEB, 0x29, - 0x65, 0xAE, 0x8B, 0x35, 0x9C, 0x0E, 0xF7, 0x18, 0xA4, 0x52, 0x86, 0xBA, 0x81, 0xED, 0xFB, 0xCF, - 0x6C, 0xA5, 0x4B, 0x1A, 0xE8, 0xE6, 0xAE, 0x65, 0xB6, 0x75, 0x8E, 0xB9, 0xA2, 0xDA, 0x98, 0x6B, - 0xA2, 0xA3, 0xCB, 0x2E, 0xAE, 0xF9, 0x81, 0x47, 0x34, 0x7E, 0xA3, 0x09, 0x7E, 0x89, 0x27, 0xCD, - 0x1C, 0x8A, 0xFC, 0x32, 0x7E, 0x9D, 0xE1, 0xFB, 0xC7, 0xB9, 0x4E, 0xBB, 0xF9, 0x2C, 0x78, 0xC6, - 0xD9, 0xD8, 0x24, 0x7E, 0xD8, 0x68, 0x22, 0x49, 0xEF, 0xB1, 0x31, 0x43, 0xCF, 0xC3, 0x2F, 0x62, - 0xE7, 0x7F, 0x6A, 0x81, 0x9F, 0x7F, 0x4F, 0xDC, 0x44, 0xC6, 0x4F, 0xFA, 0x4B, 0x3B, 0xB3, 0x63, - 0xFC, 0xF7, 0xF9, 0xF7, 0xE3, 0x5C, 0xEF, 0x2D, 0x90, 0xA9, 0xA6, 0x98, 0xEB, 0xED, 0x90, 0x33, - 0x3B, 0x18, 0xF5, 0xB8, 0xC7, 0x9C, 0x3E, 0x23, 0x8F, 0x0C, 0xC0, 0x5F, 0x1F, 0x0D, 0x85, 0x96, - 0xA3, 0x4B, 0x64, 0xFE, 0xC7, 0xDF, 0xFF, 0xB3, 0x6F, 0x3E, 0x70, 0xFF, 0x1F, 0x7F, 0xFF, 0x7F, - 0xCC, 0x85, 0x17, 0x7D, 0x0E, 0x68, 0x6B, 0xD4, 0xD8, 0x89, 0xFD, 0x28, 0x86, 0xA6, 0x3D, 0x60, - 0x5A, 0xCF, 0xB9, 0xE3, 0x6C, 0xFF, 0xF3, 0xEF, 0x20, 0x53, 0x3E, 0x02, 0xD6, 0xA0, 0xE9, 0x72, - 0x7C, 0xCD, 0x06, 0x2F, 0x0F, 0xB8, 0x4F, 0x3D, 0x01, 0xBD, 0xED, 0x52, 0xCF, 0x03, 0x74, 0x62, - 0x40, 0xD7, 0x1B, 0xDD, 0xE3, 0xB0, 0x34, 0xDD, 0xE4, 0x7E, 0x8D, 0x5D, 0x3B, 0x80, 0x04, 0x0C, - 0x67, 0x14, 0x03, 0x34, 0xF3, 0xF0, 0x72, 0xD9, 0xF4, 0xC9, 0x0F, 0xCB, 0x23, 0x0F, 0x2C, 0x64, - 0xFD, 0x0D, 0x18, 0x8C, 0x2C, 0x99, 0xA6, 0xCD, 0x4E, 0xF1, 0x66, 0x7F, 0xE4, 0x18, 0xBC, 0xC6, - 0xDA, 0xF2, 0x24, 0x38, 0xC6, 0xC9, 0xD4, 0xD8, 0x95, 0x39, 0x32, 0xD1, 0x7D, 0xA6, 0x56, 0xAF, - 0xD7, 0x1B, 0xCD, 0x26, 0xB5, 0xAB, 0xC3, 0x17, 0x39, 0xB6, 0x7D, 0xA9, 0xC7, 0x45, 0xDE, 0x63, - 0x63, 0xFC, 0x5E, 0x86, 0x38, 0x98, 0xE3, 0x8C, 0x99, 0x41, 0x19, 0x52, 0x48, 0x3D, 0x28, 0x43, - 0x18, 0x71, 0x49, 0x52, 0xA2, 0xD0, 0x54, 0x59, 0x32, 0x76, 0x4D, 0x30, 0x49, 0x3F, 0x39, 0x86, - 0x71, 0xA7, 0x37, 0x2D, 0x2B, 0x60, 0x66, 0x49, 0x7E, 0xB1, 0x71, 0x13, 0xF7, 0xE9, 0x04, 0x20, - 0xBC, 0x20, 0xC3, 0xF5, 0xD4, 0x61, 0x10, 0x3E, 0x6A, 0x39, 0xDE, 0x87, 0x5D, 0xF8, 0x45, 0xE3, - 0xAD, 0x07, 0x4B, 0xEA, 0x72, 0xBD, 0xD2, 0xEA, 0x12, 0x7D, 0xFA, 0xAC, 0xC7, 0xC5, 0x3D, 0x07, - 0x12, 0x89, 0xBD, 0xE3, 0xAF, 0x19, 0xBF, 0x99, 0x33, 0xD3, 0x1A, 0x70, 0x02, 0x20, 0x7B, 0x89, - 0x65, 0x26, 0x7A, 0x31, 0x02, 0x1B, 0xB0, 0x81, 0x09, 0x00, 0xB1, 0x43, 0x53, 0x31, 0x8D, 0x4D, - 0xE0, 0xBD, 0x0B, 0xBC, 0x0A, 0xFC, 0xA7, 0x1F, 0x58, 0x92, 0x3F, 0x08, 0xED, 0x07, 0xB1, 0xA8, - 0xC4, 0xCB, 0xFC, 0x0E, 0x3D, 0xA6, 0xFA, 0xFC, 0x3E, 0x9A, 0x81, 0xA6, 0x7B, 0x8E, 0x0F, 0xBF, - 0x80, 0x37, 0xC1, 0xDB, 0xF0, 0xE2, 0x1D, 0x7F, 0x64, 0x5B, 0xCD, 0xFD, 0x3F, 0xB1, 0xA1, 0x13, - 0x78, 0xFE, 0xF6, 0x22, 0xB8, 0x53, 0xC4, 0x8E, 0x1A, 0xF8, 0xCE, 0x51, 0xE3, 0xFD, 0x61, 0x38, - 0x3C, 0x70, 0x24, 0x02, 0x79, 0x6E, 0x68, 0xC6, 0xDC, 0xB7, 0x5E, 0x99, 0xD2, 0x42, 0x99, 0x12, - 0x51, 0x50, 0x49, 0xAE, 0x04, 0x6D, 0x17, 0xC0, 0x96, 0x4A, 0x7C, 0x9D, 0xA9, 0xCA, 0x92, 0x8F, - 0xCC, 0xA3, 0xAD, 0x8D, 0x4C, 0xFD, 0x0B, 0xA0, 0xA2, 0xD5, 0xF6, 0x1C, 0x57, 0x4A, 0x9C, 0xB9, - 0x0C, 0x1F, 0xF1, 0xA6, 0x95, 0x56, 0x5B, 0x7E, 0x62, 0xF4, 0x31, 0x87, 0xAD, 0x42, 0xAA, 0x6E, - 0xCA, 0x56, 0x94, 0xE8, 0x6A, 0x62, 0x5E, 0xC9, 0xCD, 0x32, 0xD4, 0x2C, 0xE5, 0x6E, 0x65, 0x00, - 0xCF, 0x71, 0x49, 0xC4, 0x18, 0xDF, 0xB3, 0x75, 0x1C, 0x4F, 0x60, 0x54, 0xC2, 0x87, 0x5D, 0xF9, - 0x55, 0xA1, 0xF6, 0x30, 0x5C, 0x57, 0x90, 0xF8, 0x03, 0x54, 0x54, 0xAA, 0x87, 0x3D, 0x98, 0x01, - 0x37, 0x40, 0xF0, 0x01, 0xAD, 0xC2, 0x2E, 0xD5, 0xC3, 0x7E, 0xA5, 0x75, 0x12, 0x08, 0x67, 0xE4, - 0x08, 0xF3, 0xAE, 0xDC, 0x2A, 0x0E, 0xF0, 0x30, 0xD0, 0x4A, 0x35, 0x3D, 0x84, 0xC1, 0x4D, 0xAF, - 0xE7, 0x78, 0x36, 0x67, 0x8D, 0x41, 0xA9, 0x2E, 0xDE, 0xC5, 0xBA, 0x68, 0x96, 0xEB, 0xE2, 0x28, - 0xD6, 0xC5, 0x7E, 0xB9, 0x2E, 0xDE, 0x57, 0x5A, 0x3F, 0x79, 0xA6, 0x2F, 0x4A, 0x35, 0x6E, 0x00, - 0x1E, 0x9D, 0x9A, 0x3F, 0x72, 0x40, 0x1F, 0xD8, 0x26, 0xA1, 0x79, 0x6B, 0x45, 0x3E, 0x07, 0x27, - 0xC6, 0xDF, 0x02, 0x5F, 0x84, 0xC7, 0xA2, 0xE0, 0x9E, 0xAD, 0x59, 0x4C, 0xB3, 0x06, 0x8E, 0x67, - 0x8A, 0xE1, 0x08, 0x0F, 0x98, 0x91, 0x26, 0xF4, 0x21, 0x7D, 0x0F, 0x9A, 0xAE, 0xB4, 0x9D, 0x68, - 0xAE, 0x6B, 0x99, 0x4A, 0xAA, 0xE7, 0xF6, 0x9D, 0xE9, 0x39, 0x36, 0x8E, 0xAB, 0x8E, 0x5A, 0xE5, - 0xA5, 0xC0, 0xCC, 0x91, 0xEB, 0xC1, 0x79, 0x26, 0xFB, 0xF6, 0xB8, 0xCE, 0x01, 0xFD, 0xBC, 0xB7, - 0xBE, 0x1C, 0xC6, 0x05, 0x65, 0x55, 0x76, 0x00, 0x87, 0x70, 0xFC, 0xBC, 0x56, 0x4E, 0x0F, 0x01, - 0x3A, 0x11, 0x38, 0x77, 0xA6, 0x81, 0xCE, 0x09, 0x70, 0xEE, 0x79, 0x70, 0x2A, 0xEB, 0x7A, 0x40, - 0xE7, 0x64, 0xE8, 0xFC, 0x8D, 0x61, 0x02, 0xC0, 0xA6, 0x6B, 0xE8, 0x81, 0x49, 0x23, 0xC6, 0x07, - 0xC2, 0xA9, 0x03, 0x9C, 0x02, 0xDB, 0x0F, 0x4C, 0xA2, 0x5F, 0x06, 0xF0, 0x11, 0xC8, 0x0F, 0xE8, - 0x14, 0x25, 0x8E, 0x44, 0x0D, 0x06, 0xF0, 0xB6, 0x3D, 0x6B, 0x49, 0x78, 0x26, 0x5B, 0xB0, 0x71, - 0x16, 0x3A, 0x06, 0xA1, 0x8B, 0x05, 0x68, 0x05, 0x78, 0x1A, 0xE3, 0x01, 0x0F, 0xE7, 0x3C, 0xCC, - 0x3D, 0x1A, 0x0F, 0x54, 0x1A, 0xEC, 0x1D, 0xB4, 0x10, 0x29, 0x40, 0x44, 0xB3, 0x94, 0xF3, 0xD6, - 0x1F, 0x63, 0x6A, 0x45, 0xC8, 0x53, 0xD6, 0xC9, 0x3F, 0x42, 0xDA, 0x56, 0xBC, 0x67, 0xB0, 0x87, - 0x8F, 0x4C, 0xFB, 0xDC, 0xE2, 0x77, 0x95, 0xA9, 0xC7, 0xF7, 0xE1, 0x84, 0xF9, 0xFB, 0x0B, 0xC0, - 0xBF, 0xFB, 0x57, 0x86, 0x4D, 0x68, 0xBF, 0x8E, 0x57, 0x6C, 0x48, 0x84, 0xF1, 0x31, 0x78, 0x8D, - 0xF1, 0x70, 0x02, 0x88, 0x10, 0x06, 0xC7, 0xE0, 0x0E, 0x9F, 0xB0, 0x4A, 0x93, 0xA6, 0x1C, 0x1F, - 0x70, 0xD5, 0xB2, 0x4C, 0x41, 0x36, 0xC6, 0x1E, 0x47, 0x71, 0xD2, 0x90, 0xB8, 0x03, 0x6A, 0xF0, - 0x1A, 0xDB, 0x18, 0x8B, 0xDF, 0x19, 0xA8, 0x9D, 0x2A, 0x72, 0x67, 0x30, 0x47, 0xA8, 0x52, 0xF2, - 0x94, 0x42, 0x8A, 0x5C, 0x37, 0x06, 0xEA, 0xE5, 0x25, 0xDC, 0x16, 0x2C, 0x1B, 0xF1, 0xCF, 0xAE, - 0xBF, 0x16, 0xC1, 0xFB, 0xB3, 0xDD, 0xEB, 0xFA, 0x73, 0xE1, 0xFB, 0x18, 0x9F, 0xD1, 0x19, 0x4D, - 0xB3, 0x64, 0xA8, 0xC8, 0x54, 0xE4, 0x1E, 0x73, 0xBA, 0x43, 0xE3, 0x14, 0x94, 0x18, 0xA4, 0x8A, - 0xD0, 0x31, 0x1B, 0x79, 0x63, 0xB3, 0x9E, 0x7A, 0x7C, 0xF3, 0x4A, 0x0F, 0xD9, 0xF4, 0x80, 0xB8, - 0x92, 0x97, 0x1C, 0xE0, 0xDD, 0xE7, 0xA0, 0x06, 0x69, 0x24, 0xB6, 0x7D, 0xC4, 0x14, 0xE2, 0x8D, - 0x67, 0x43, 0xAE, 0xFF, 0x38, 0x75, 0x1E, 0xB8, 0x9F, 0x93, 0x26, 0x12, 0xAD, 0xA1, 0xD1, 0x59, - 0xE2, 0x73, 0x1E, 0x35, 0x61, 0x91, 0xE2, 0xD1, 0x6D, 0x5C, 0xA2, 0x00, 0x59, 0x40, 0xD7, 0x5C, - 0x92, 0x25, 0xE0, 0xE0, 0x87, 0x89, 0xAA, 0x58, 0x59, 0x10, 0x0E, 0xE4, 0x3B, 0x28, 0x83, 0x48, - 0xDA, 0x80, 0x83, 0xC0, 0x73, 0x40, 0xD2, 0x00, 0x1A, 0x30, 0x5D, 0x8B, 0x8F, 0x69, 0x27, 0x32, - 0x11, 0x44, 0x5F, 0x25, 0x17, 0x0C, 0xC2, 0x8C, 0x33, 0xE2, 0x71, 0x71, 0xC4, 0x67, 0x86, 0xA9, - 0x0B, 0x94, 0x7B, 0x50, 0x5A, 0xB1, 0x39, 0xD0, 0x19, 0xBA, 0x7F, 0x06, 0x1E, 0x8A, 0x4E, 0x30, - 0x0D, 0xEE, 0x61, 0x48, 0x49, 0xB2, 0x1B, 0x9A, 0x0F, 0x49, 0x9A, 0x48, 0x8A, 0x52, 0xA2, 0x94, - 0xE6, 0x0B, 0x29, 0xED, 0x24, 0x5F, 0x26, 0x3F, 0x51, 0x69, 0x6E, 0x4D, 0x4B, 0x50, 0xB0, 0x18, - 0x14, 0xBD, 0xC4, 0xD0, 0xF1, 0x79, 0xB4, 0x34, 0x90, 0xDD, 0xA0, 0x93, 0x50, 0xE2, 0x1A, 0xC9, - 0xA5, 0xF6, 0x38, 0x7E, 0x26, 0x36, 0x60, 0x04, 0x1E, 0xFE, 0x1D, 0x09, 0x40, 0xBA, 0x66, 0xE9, - 0x41, 0xB4, 0xBE, 0x88, 0x35, 0x7C, 0xEA, 0x74, 0x77, 0x58, 0xF7, 0xF4, 0x04, 0x7E, 0x7E, 0xBA, - 0xFA, 0x7A, 0x7D, 0xD2, 0x85, 0x3F, 0x4E, 0xB9, 0xD9, 0x76, 0x82, 0x1D, 0x62, 0x12, 0x9F, 0x34, - 0xCB, 0xB4, 0xB8, 0xB3, 0x8E, 0x4E, 0xA4, 0xB9, 0x4E, 0x03, 0x1D, 0x51, 0x3F, 0x71, 0x9D, 0x9A, - 0x4D, 0x02, 0x13, 0xED, 0x15, 0xF3, 0x97, 0xB4, 0x11, 0xF4, 0x1E, 0x92, 0xE4, 0x00, 0x20, 0xAC, - 0xB4, 0xE0, 0xC7, 0xEE, 0xFF, 0xFA, 0xDE, 0xED, 0x66, 0x93, 0x86, 0x64, 0x38, 0x93, 0x63, 0xD0, - 0xF3, 0xF0, 0xA6, 0x8C, 0x1E, 0xC1, 0xAC, 0x23, 0x0F, 0x0C, 0xC9, 0x7F, 0xA6, 0x8F, 0xBD, 0x09, - 0x40, 0x42, 0x14, 0x03, 0x05, 0x16, 0x7E, 0xAE, 0x18, 0x42, 0x72, 0xE0, 0x8D, 0xC0, 0x23, 0x49, - 0x6A, 0x80, 0x4B, 0xF2, 0x8F, 0x55, 0xA3, 0x52, 0x38, 0xFC, 0x26, 0xC0, 0x4A, 0xB2, 0x28, 0xD0, - 0xE7, 0xE9, 0xF7, 0x8A, 0x21, 0x15, 0x0E, 0xBE, 0x11, 0x48, 0x25, 0x99, 0x3A, 0x20, 0x95, 0xFC, - 0x63, 0xD5, 0x48, 0x15, 0x0E, 0x5F, 0x18, 0x56, 0xEE, 0xF4, 0x0E, 0xB3, 0xE4, 0xA9, 0x22, 0x80, - 0x47, 0x2F, 0x85, 0xA7, 0x02, 0x9C, 0xDB, 0x28, 0x8A, 0x5C, 0x0B, 0xCF, 0x74, 0xCF, 0x2C, 0x13, - 0x43, 0xB3, 0x5B, 0xE7, 0xF4, 0x88, 0x5D, 0xDF, 0xDE, 0x5C, 0x76, 0x98, 0x7C, 0xB8, 0x5C, 0xA8, - 0x4F, 0x99, 0xC3, 0x8A, 0x24, 0xB3, 0x6F, 0x24, 0xAD, 0x80, 0x48, 0x26, 0x17, 0xAB, 0xD3, 0xE8, - 0x28, 0xB2, 0xA0, 0xA5, 0x17, 0xC3, 0x8F, 0x41, 0xC8, 0x01, 0xE9, 0x4C, 0xA6, 0x3A, 0xC1, 0x91, - 0xA4, 0x98, 0xA2, 0x81, 0x34, 0xE2, 0x93, 0xE8, 0xE2, 0x73, 0x0F, 0xA3, 0x64, 0x6A, 0xEC, 0x17, - 0x27, 0xF0, 0xC2, 0x90, 0x99, 0x51, 0xE0, 0x0B, 0x54, 0x67, 0xEE, 0x4D, 0xBC, 0x92, 0x96, 0xF1, - 0xBD, 0x1E, 0x7A, 0x87, 0x31, 0x4D, 0x30, 0xBC, 0xBF, 0x13, 0xE6, 0x88, 0xC7, 0x85, 0x98, 0xB6, - 0xE9, 0x23, 0x04, 0x36, 0x2C, 0xD4, 0x05, 0xB7, 0xCE, 0x1E, 0x6F, 0x5A, 0xE8, 0xCF, 0x32, 0x35, - 0x32, 0x2B, 0x9F, 0xE6, 0x93, 0x5B, 0xFF, 0x4D, 0xCB, 0xFB, 0xB1, 0x69, 0xFC, 0x7A, 0x06, 0x5B, - 0xC3, 0xBD, 0xCF, 0x8E, 0x9F, 0x43, 0x39, 0xCD, 0xF4, 0x9B, 0x3C, 0x98, 0x50, 0xA0, 0x65, 0xF7, - 0x99, 0x3D, 0xE3, 0xF8, 0xC7, 0xF9, 0xAE, 0xA5, 0x66, 0xB9, 0x4F, 0x1E, 0x16, 0xBD, 0x63, 0xCA, - 0x70, 0xA1, 0x9C, 0x01, 0xA4, 0xDC, 0x17, 0x4C, 0xD3, 0xDB, 0x2F, 0xFF, 0x92, 0x69, 0xD5, 0xA8, - 0xD3, 0x49, 0xE4, 0xA4, 0x5A, 0x3D, 0xEA, 0xE0, 0xF8, 0xAB, 0x46, 0x9D, 0x4C, 0xCB, 0xC1, 0x0C, - 0x30, 0x3D, 0x01, 0x79, 0xB0, 0xFD, 0xCB, 0x43, 0x1E, 0x38, 0x51, 0xBC, 0xE7, 0x44, 0x1E, 0x1C, - 0x7F, 0xED, 0xF9, 0x0E, 0x01, 0xE9, 0x09, 0xA8, 0x83, 0xED, 0x5F, 0x26, 0xEA, 0x74, 0x7E, 0x7A, - 0x6E, 0xE4, 0x61, 0x9D, 0x9F, 0x36, 0x02, 0x7F, 0x00, 0x52, 0x4F, 0xC4, 0xA0, 0xCE, 0x4F, 0x2F, - 0x09, 0x87, 0xBE, 0x38, 0x81, 0x2D, 0x3A, 0x8E, 0x69, 0x8B, 0x4A, 0x19, 0x0C, 0xA1, 0xE6, 0x39, - 0x8E, 0x26, 0xE8, 0x7F, 0x8D, 0xD1, 0x23, 0x06, 0x84, 0x52, 0xC8, 0x31, 0x6E, 0xFF, 0x32, 0x51, - 0xE3, 0x89, 0xEC, 0x65, 0xE6, 0xA5, 0x52, 0x7E, 0xE4, 0xC9, 0x7E, 0xAB, 0x3C, 0xFB, 0x79, 0x27, - 0x71, 0x7B, 0x25, 0xF8, 0x55, 0x96, 0xFD, 0xC4, 0x7B, 0x58, 0x27, 0x1C, 0x8B, 0x2C, 0x0A, 0x8D, - 0xBC, 0xF6, 0x9C, 0xDC, 0x26, 0x86, 0xF8, 0xF2, 0x6F, 0x31, 0x45, 0xE5, 0xC8, 0x14, 0x9F, 0x3E, - 0x9D, 0x54, 0x5A, 0xE1, 0x07, 0x06, 0x9F, 0x50, 0xE9, 0x96, 0xAC, 0x39, 0xDF, 0xEE, 0x3F, 0xC5, - 0xDE, 0x30, 0x6B, 0x42, 0x99, 0xFB, 0x19, 0xD8, 0xD4, 0x23, 0x37, 0x56, 0x1D, 0x76, 0x44, 0xD7, - 0x39, 0x3A, 0x81, 0x07, 0x33, 0xC9, 0xFD, 0x16, 0x98, 0xE8, 0xCA, 0x02, 0x7F, 0x0D, 0x02, 0x4B, - 0xF3, 0xC6, 0x97, 0x24, 0x2A, 0xFD, 0x19, 0x19, 0x29, 0xE8, 0x16, 0x06, 0x5D, 0x41, 0xD9, 0x16, - 0xC2, 0x77, 0x24, 0x23, 0xD3, 0xB6, 0x99, 0xAF, 0xD2, 0x7E, 0xE0, 0xF7, 0xB2, 0x4B, 0xF8, 0x65, - 0x33, 0x0D, 0xBD, 0xBB, 0x30, 0x7B, 0xAA, 0x66, 0x59, 0x8F, 0x2A, 0xC2, 0x49, 0x5D, 0x16, 0x69, - 0x1E, 0xF7, 0x05, 0xD3, 0xEE, 0x34, 0x93, 0x32, 0xEB, 0xA6, 0x6D, 0x22, 0x53, 0x0C, 0x19, 0x6B, - 0x1E, 0xFB, 0x34, 0xFB, 0x7B, 0x0C, 0x3B, 0xBA, 0x70, 0x3C, 0xD6, 0x0F, 0x44, 0xE0, 0x91, 0xB3, - 0x12, 0xA6, 0x54, 0x75, 0xEC, 0xF9, 0x84, 0x84, 0x48, 0x05, 0x60, 0x73, 0xEE, 0xD1, 0xD4, 0xF3, - 0x15, 0x40, 0x7E, 0x0E, 0x80, 0xF3, 0x6C, 0x2E, 0x32, 0xCD, 0x59, 0x0B, 0xA4, 0xC5, 0x32, 0xF4, - 0x08, 0x62, 0x10, 0x4E, 0xF9, 0xDA, 0x11, 0xE1, 0x8C, 0x2B, 0x2D, 0xB4, 0x89, 0x91, 0xC9, 0x0A, - 0x2F, 0xD6, 0xE3, 0x46, 0x40, 0x56, 0x65, 0xB6, 0x23, 0x58, 0xF8, 0x66, 0x2E, 0x3A, 0x5D, 0x24, - 0xAD, 0x4E, 0x9B, 0x6C, 0x31, 0x34, 0x7B, 0xBA, 0xF7, 0xB8, 0xA2, 0xC7, 0xAF, 0x32, 0x73, 0x9F, - 0xEB, 0x39, 0x46, 0xA0, 0x0B, 0x9F, 0xDD, 0x0F, 0x4D, 0x7D, 0xC8, 0x86, 0x98, 0xC7, 0x26, 0x9C, - 0x1B, 0x5E, 0x8F, 0xDA, 0x48, 0x25, 0x77, 0xA6, 0x78, 0xDC, 0x61, 0x8F, 0x4E, 0x40, 0x64, 0x16, - 0x84, 0xD0, 0x35, 0xD1, 0x2A, 0xAC, 0x19, 0x78, 0x09, 0x1C, 0x35, 0x99, 0x80, 0x78, 0xEF, 0x91, - 0x91, 0x71, 0x54, 0xDE, 0x92, 0xA2, 0x6B, 0x77, 0x74, 0x1F, 0x5B, 0x9C, 0xE2, 0x96, 0x46, 0x75, - 0x79, 0x3D, 0xB5, 0x73, 0x9D, 0x59, 0x13, 0x51, 0x7D, 0x85, 0xEC, 0x91, 0x8A, 0xCB, 0xA1, 0x03, - 0xF4, 0xA9, 0x0C, 0xD6, 0x9B, 0xE7, 0xA7, 0x26, 0x63, 0x00, 0xA3, 0xA0, 0xD3, 0x01, 0x17, 0x2A, - 0x7E, 0xF7, 0xCA, 0xF4, 0xC5, 0xD6, 0xF6, 0x44, 0x74, 0xEB, 0xC8, 0xA0, 0x5F, 0x2A, 0xB1, 0xF0, - 0xCC, 0x68, 0xC1, 0xF9, 0x96, 0xE7, 0x1C, 0x91, 0x84, 0x99, 0x51, 0x83, 0x18, 0x91, 0x39, 0x77, - 0x94, 0x92, 0x41, 0x85, 0xD8, 0xEF, 0xFC, 0x3D, 0x54, 0x00, 0xA2, 0x20, 0x39, 0x3F, 0x1E, 0x5A, - 0x08, 0x4D, 0x9F, 0x1E, 0x5D, 0x38, 0xDE, 0xEB, 0xAC, 0xF0, 0xDE, 0xC5, 0xDE, 0x03, 0x5C, 0x7F, - 0x39, 0x3F, 0x21, 0x77, 0x81, 0x9B, 0x93, 0x9F, 0x7E, 0xA6, 0x3C, 0x56, 0x78, 0xF2, 0x89, 0x7B, - 0x87, 0x8D, 0x1C, 0x1F, 0x49, 0x79, 0x34, 0x72, 0x6C, 0xF2, 0xD0, 0xC0, 0x84, 0xF5, 0xE8, 0x3C, - 0x01, 0xBB, 0xE8, 0x4B, 0xAF, 0x53, 0x09, 0x8F, 0x5E, 0x20, 0x92, 0x7E, 0x0F, 0x7E, 0xE0, 0xE2, - 0xBB, 0xBE, 0x74, 0x3B, 0x85, 0x13, 0xD7, 0x66, 0xEF, 0xEA, 0xB1, 0x8C, 0x58, 0xAA, 0xA1, 0x5F, - 0x63, 0xE7, 0x1A, 0xF0, 0x8E, 0xB0, 0x1F, 0x19, 0xC3, 0x21, 0x19, 0xA6, 0xDA, 0x28, 0xC5, 0x5D, - 0xC2, 0x06, 0x34, 0x3D, 0x43, 0x91, 0x3D, 0xDB, 0xAA, 0x6F, 0xD3, 0xC4, 0x87, 0xCE, 0x3D, 0x4C, - 0x47, 0x60, 0xC8, 0x07, 0x45, 0x85, 0xC8, 0xDE, 0x28, 0xEF, 0xAC, 0x9A, 0xF2, 0x56, 0x83, 0x7D, - 0x04, 0x5C, 0x1F, 0x7F, 0x19, 0x7D, 0x83, 0x71, 0x74, 0x0D, 0x74, 0xB9, 0xDA, 0x61, 0x07, 0xEA, - 0x1D, 0xF9, 0x9D, 0x8A, 0x4D, 0x39, 0x60, 0x14, 0x72, 0xB7, 0x1D, 0x63, 0x3B, 0x04, 0x30, 0x10, - 0x2B, 0x76, 0xD8, 0xA7, 0x2E, 0xFD, 0xB8, 0xC5, 0x1F, 0x7F, 0x95, 0x3E, 0x17, 0x37, 0x5F, 0xCE, - 0x54, 0xBC, 0x9B, 0x7F, 0xCC, 0xEA, 0x28, 0xD9, 0x35, 0xEB, 0x1B, 0x99, 0xC5, 0x2B, 0x2B, 0x6E, - 0x75, 0x3E, 0xB9, 0xCC, 0x49, 0x30, 0x37, 0x25, 0x93, 0xE1, 0xC1, 0x94, 0x44, 0x86, 0x53, 0x7B, - 0x2C, 0x1B, 0xD4, 0x1F, 0x67, 0x79, 0x93, 0x81, 0xFD, 0xF6, 0x88, 0x6B, 0x6A, 0x77, 0xFD, 0x59, - 0x51, 0xFD, 0xF9, 0x8E, 0xC8, 0x88, 0x9D, 0x52, 0x08, 0xF9, 0xAD, 0x73, 0x1D, 0xEB, 0x79, 0x1C, - 0xC7, 0x0F, 0x48, 0xD1, 0xA5, 0xC0, 0x26, 0x38, 0xDA, 0x72, 0x75, 0x1B, 0x76, 0xC1, 0xB6, 0x10, - 0xF7, 0x1E, 0x0E, 0xB6, 0x73, 0xA6, 0x00, 0xC8, 0x19, 0xF4, 0xB3, 0x1C, 0xA8, 0xAA, 0xE0, 0xD2, - 0xE5, 0x00, 0xF6, 0x2A, 0xD9, 0x79, 0x02, 0xB6, 0xEA, 0xBB, 0x52, 0x90, 0x65, 0x7F, 0x62, 0x37, - 0x3F, 0x7F, 0x79, 0x68, 0x16, 0x83, 0x70, 0x0E, 0xCC, 0x8D, 0x1D, 0xD0, 0x78, 0xC0, 0x56, 0x96, - 0x1C, 0x81, 0x94, 0xE3, 0xF1, 0xD4, 0xB9, 0xA7, 0x72, 0x0F, 0x50, 0xCC, 0xDC, 0x73, 0xE6, 0x1E, - 0x90, 0xE9, 0xD3, 0xFD, 0x65, 0x65, 0x0F, 0x3D, 0x8D, 0x75, 0x5D, 0x48, 0x6C, 0x88, 0x35, 0x9C, - 0xB1, 0x0F, 0x08, 0xC8, 0x29, 0x99, 0xC0, 0x2B, 0xB3, 0x85, 0xBC, 0x18, 0xB0, 0x53, 0xE9, 0x0B, - 0x08, 0x02, 0xEB, 0x94, 0xBE, 0x60, 0xEE, 0xF2, 0x4B, 0x26, 0x17, 0xC5, 0xFE, 0x65, 0xBC, 0xE7, - 0xA5, 0x2D, 0x33, 0x18, 0x65, 0xBA, 0x5C, 0x24, 0x52, 0x20, 0x85, 0x80, 0xBA, 0x85, 0x87, 0x5D, - 0xD5, 0x4F, 0x98, 0x18, 0x29, 0x7C, 0x9E, 0x34, 0x75, 0xA9, 0x86, 0x99, 0x76, 0x8D, 0xB8, 0x6D, - 0x71, 0x62, 0x84, 0x96, 0xFC, 0xAB, 0x7A, 0x69, 0xAF, 0xD8, 0xB3, 0xF6, 0x52, 0xC6, 0xDE, 0xBA, - 0x20, 0x75, 0x99, 0x80, 0x38, 0x51, 0x96, 0x00, 0x10, 0xCC, 0x34, 0x86, 0xD3, 0x64, 0xBE, 0x0A, - 0x10, 0xA2, 0xE4, 0xEF, 0x82, 0xFD, 0xB0, 0xA9, 0xCC, 0x8C, 0xA0, 0xE4, 0x00, 0x3D, 0xCE, 0x9C, - 0x1E, 0xA5, 0x52, 0x37, 0x50, 0xD3, 0xFA, 0xC7, 0xDF, 0xFF, 0xD3, 0x0F, 0x8F, 0x24, 0x4C, 0x2F, - 0x80, 0x3D, 0x87, 0x3D, 0xD6, 0x28, 0xD8, 0x96, 0x7A, 0x84, 0x9E, 0x50, 0x1C, 0x22, 0x47, 0x75, - 0x14, 0x95, 0x68, 0xE2, 0x32, 0xE0, 0x48, 0xFB, 0x81, 0xE2, 0x99, 0x0B, 0x6A, 0xE1, 0x03, 0xD0, - 0xB2, 0xC0, 0x80, 0x9F, 0xC3, 0x7A, 0x14, 0xD6, 0x7B, 0x0F, 0x12, 0xD5, 0x50, 0x46, 0xFB, 0x68, - 0x46, 0x98, 0x81, 0x55, 0x4E, 0x00, 0x67, 0x8B, 0x36, 0x96, 0x3E, 0xCC, 0x2C, 0x5A, 0x04, 0x8E, - 0x06, 0xFA, 0xA1, 0x9D, 0x0E, 0x2F, 0x0E, 0xA3, 0x91, 0x47, 0x5C, 0x0C, 0x1D, 0x83, 0x81, 0xF4, - 0x68, 0x72, 0x8C, 0x90, 0xFA, 0x8F, 0xBD, 0xBA, 0x3E, 0x9A, 0x12, 0xE0, 0x84, 0xA2, 0x29, 0xAA, - 0x9E, 0x77, 0xC0, 0x5D, 0x6A, 0xEC, 0xD2, 0xD6, 0x61, 0x7C, 0x3F, 0x8C, 0x74, 0x0A, 0xFD, 0xF2, - 0xBF, 0xF6, 0xD0, 0x95, 0x45, 0x0E, 0x7C, 0x6B, 0x8E, 0x78, 0x98, 0x1E, 0xE1, 0x46, 0x1A, 0x9B, - 0x0C, 0xCC, 0x90, 0x61, 0x33, 0x4C, 0x5B, 0x1E, 0x73, 0xF7, 0x35, 0x65, 0x5F, 0x3C, 0x8A, 0x4E, - 0xA2, 0xB1, 0x48, 0x52, 0xC6, 0xC0, 0x29, 0x98, 0x82, 0x89, 0x01, 0x5D, 0xA7, 0x1C, 0x6B, 0x3F, - 0x8C, 0x5F, 0x32, 0xFD, 0x70, 0xD2, 0x06, 0xF9, 0xC8, 0x50, 0x9C, 0x73, 0x15, 0x5E, 0x19, 0x45, - 0xD9, 0x18, 0x54, 0xEC, 0x13, 0x25, 0x8E, 0xC5, 0x4C, 0x33, 0x54, 0x37, 0x61, 0x1C, 0x0F, 0x50, - 0x97, 0x11, 0x5E, 0x07, 0xB5, 0xFA, 0x68, 0x2C, 0x69, 0x1E, 0x92, 0xA8, 0xF9, 0xBE, 0x5E, 0xF7, - 0x77, 0x58, 0xA3, 0x46, 0x1F, 0xE8, 0x85, 0x8D, 0x73, 0xAA, 0x09, 0x39, 0xC0, 0x73, 0x7A, 0xD4, - 0x38, 0x63, 0x7C, 0x50, 0x21, 0xFC, 0x73, 0xAF, 0x95, 0x1A, 0xCD, 0x69, 0x91, 0x26, 0x88, 0x59, - 0xD9, 0x39, 0x9F, 0x62, 0x98, 0x87, 0x8E, 0x51, 0x6C, 0xCB, 0xDF, 0x2E, 0x7D, 0x05, 0x90, 0x88, - 0xD6, 0xCE, 0x11, 0xA9, 0x5B, 0xDC, 0x11, 0x62, 0x0A, 0x60, 0x72, 0x5F, 0x04, 0x4C, 0xB6, 0xDD, - 0xF4, 0x6B, 0xA6, 0xD8, 0x8A, 0x3A, 0x8A, 0xDF, 0x9C, 0x28, 0x32, 0x7F, 0xD2, 0x4D, 0xD3, 0x14, - 0x7C, 0x0A, 0x39, 0x51, 0x66, 0xB7, 0xC4, 0xA9, 0xF6, 0xDA, 0xAC, 0x2B, 0x80, 0x47, 0xE0, 0xD9, - 0x1B, 0x71, 0xAD, 0xCC, 0xA6, 0x5B, 0xA3, 0xA7, 0xA0, 0x1E, 0x21, 0x9D, 0xC2, 0xBF, 0x5E, 0x75, - 0x6F, 0x99, 0xA8, 0x37, 0x01, 0xEC, 0x32, 0x38, 0x98, 0xEE, 0x64, 0x8D, 0xF3, 0x05, 0xD0, 0x89, - 0xFB, 0x54, 0x89, 0xE8, 0x02, 0x3B, 0x99, 0x14, 0x87, 0xA2, 0x1C, 0xCE, 0x53, 0x04, 0xA3, 0x62, - 0x02, 0x91, 0x1C, 0xA0, 0x45, 0xBF, 0x12, 0xC7, 0x8A, 0x2C, 0x6B, 0xD4, 0x62, 0x5B, 0x67, 0x43, - 0x07, 0x83, 0x60, 0xB0, 0x52, 0x04, 0x73, 0xB2, 0x1D, 0x32, 0x3E, 0xA9, 0x5A, 0x17, 0xDB, 0x61, - 0x41, 0x85, 0x67, 0x11, 0xAF, 0xE2, 0x62, 0x95, 0x88, 0x89, 0x41, 0x91, 0x30, 0x85, 0xD2, 0x05, - 0x08, 0x53, 0x54, 0xFA, 0x45, 0x0A, 0x46, 0xDC, 0x44, 0x9B, 0x76, 0xB8, 0xCE, 0x68, 0x1D, 0x2C, - 0x56, 0x4B, 0x03, 0x45, 0x11, 0x69, 0xD4, 0xC6, 0x50, 0xEA, 0xA4, 0xF1, 0x4C, 0x4A, 0x17, 0xA3, - 0x11, 0x37, 0x4C, 0x29, 0x46, 0xF5, 0xF8, 0xC0, 0x0C, 0x43, 0xB5, 0xC9, 0xF1, 0xF6, 0xE6, 0xF6, - 0xEC, 0xCB, 0xE4, 0x45, 0xD4, 0x89, 0x12, 0xCD, 0x22, 0xD9, 0xC7, 0xF4, 0xA5, 0x60, 0x15, 0xC9, - 0x79, 0x24, 0x6F, 0x74, 0x3A, 0x1D, 0xB6, 0xE5, 0xCA, 0x2A, 0x4C, 0x3E, 0x07, 0x29, 0x30, 0xF0, - 0x98, 0x08, 0x84, 0x03, 0x7A, 0x8E, 0xB5, 0x4D, 0x79, 0xE9, 0xF1, 0xAD, 0x94, 0xFC, 0xC1, 0xB4, - 0x81, 0x86, 0x46, 0x7B, 0xBA, 0x77, 0x23, 0x23, 0x9E, 0x1E, 0x89, 0x97, 0x31, 0xD9, 0x24, 0x2C, - 0xED, 0xF3, 0xD6, 0x1F, 0xC3, 0x0D, 0x33, 0xAF, 0x38, 0x81, 0x65, 0x70, 0x6F, 0x07, 0x94, 0x1B, - 0xCB, 0x01, 0xDC, 0x72, 0x36, 0x4F, 0x2C, 0x21, 0xD0, 0x2E, 0x40, 0x26, 0xC9, 0x70, 0x5B, 0x9F, - 0x47, 0xC9, 0x34, 0x05, 0xA9, 0x78, 0x85, 0x78, 0x84, 0x74, 0x27, 0xCB, 0xB2, 0xA8, 0xFC, 0xAF, - 0x6A, 0xEB, 0x13, 0xB4, 0x5D, 0xCF, 0x7D, 0x18, 0x8D, 0x69, 0xBF, 0xC4, 0x3D, 0x38, 0x31, 0x83, - 0x79, 0x73, 0xA4, 0x12, 0x31, 0x6C, 0xFC, 0x85, 0x1F, 0x12, 0xF4, 0xCC, 0x98, 0xF9, 0xDC, 0x27, - 0x79, 0x58, 0xB8, 0x25, 0x63, 0x83, 0x8A, 0xDD, 0x44, 0xE6, 0x15, 0x09, 0xD2, 0x8D, 0x13, 0x15, - 0xFB, 0x12, 0xDE, 0x3F, 0x47, 0x13, 0xE7, 0x7A, 0xBE, 0x7B, 0xAB, 0x99, 0x26, 0xB6, 0xC0, 0x27, - 0xD0, 0xC6, 0x60, 0x9A, 0x2B, 0x29, 0x69, 0xFE, 0x64, 0x51, 0x91, 0xD9, 0x6D, 0x72, 0x24, 0x34, - 0xB9, 0x5D, 0x61, 0x94, 0x00, 0x6D, 0xEB, 0x05, 0xDE, 0xBA, 0x7F, 0x3F, 0x6F, 0xE7, 0x33, 0x9B, - 0x2D, 0xE9, 0x82, 0x32, 0xC6, 0xBD, 0x3B, 0x81, 0x4A, 0xC9, 0xA1, 0x22, 0x4C, 0xE5, 0x2C, 0x63, - 0x1C, 0x18, 0x93, 0x68, 0x38, 0xF4, 0x86, 0xE4, 0x9A, 0x3F, 0xEF, 0xFE, 0xB2, 0xFB, 0x1D, 0xA1, - 0xC4, 0xFD, 0x0D, 0x4C, 0x4B, 0x97, 0x6D, 0xE7, 0xCD, 0x93, 0x69, 0x6D, 0x51, 0x14, 0x90, 0xC8, - 0xAC, 0xB6, 0x97, 0x17, 0xCB, 0xD3, 0x6C, 0xE4, 0x5C, 0x56, 0x8B, 0x9A, 0x45, 0x55, 0x71, 0x32, - 0xFA, 0xF9, 0x38, 0xFF, 0x85, 0x7C, 0x36, 0xAC, 0xE6, 0xAA, 0x57, 0x47, 0x79, 0x97, 0x53, 0x48, - 0xBA, 0x8D, 0x2D, 0x38, 0x67, 0xF7, 0x6E, 0xAA, 0xDD, 0x53, 0xE4, 0xD7, 0x97, 0x8D, 0x43, 0xBF, - 0xE4, 0xC3, 0xA1, 0x5F, 0x5E, 0x0C, 0x0E, 0xFD, 0x52, 0x12, 0x87, 0x7E, 0x79, 0xC5, 0xA1, 0x59, - 0x38, 0xF4, 0x3D, 0x1F, 0x0E, 0x7D, 0x7F, 0x31, 0x38, 0xF4, 0xBD, 0x24, 0x0E, 0x7D, 0x7F, 0xC5, - 0xA1, 0xB4, 0x33, 0x32, 0xC8, 0x4F, 0x28, 0x9D, 0x4B, 0x39, 0x3D, 0x0F, 0x16, 0xE5, 0xAB, 0x3C, - 0xF0, 0xAC, 0x88, 0x94, 0xE5, 0x36, 0x1C, 0x5F, 0x73, 0x21, 0x44, 0x8A, 0xB7, 0x7C, 0x11, 0xA8, - 0x24, 0x77, 0xF1, 0x2C, 0x74, 0xA2, 0xF9, 0x86, 0xD7, 0x1A, 0x31, 0x29, 0xFA, 0xD9, 0xB3, 0xC0, - 0x52, 0x7A, 0x36, 0x34, 0x12, 0xF4, 0x13, 0xD2, 0xB1, 0xB2, 0x6A, 0x50, 0x36, 0x12, 0x90, 0x93, - 0x7F, 0x0B, 0x60, 0x5F, 0x60, 0xFA, 0xBA, 0xE3, 0x3E, 0xEE, 0xBA, 0xE8, 0x38, 0xAB, 0x0C, 0x20, - 0x13, 0x12, 0xF5, 0x66, 0xCB, 0xD1, 0xF9, 0x33, 0xA9, 0x2E, 0x97, 0xFB, 0x14, 0x51, 0x9F, 0xD2, - 0x64, 0x73, 0x4B, 0xB4, 0x39, 0xAB, 0x80, 0xE9, 0xB5, 0x7A, 0xF3, 0x58, 0xEE, 0xD4, 0xDC, 0x92, - 0xBB, 0xD3, 0xC7, 0x8C, 0x27, 0x11, 0x55, 0xA9, 0x39, 0xCF, 0xD2, 0x55, 0x62, 0x71, 0x4E, 0xB3, - 0xBE, 0xF3, 0xCD, 0xDF, 0x29, 0x23, 0x66, 0x6E, 0xDC, 0x88, 0xDC, 0x53, 0xC2, 0xC2, 0xCE, 0x7B, - 0x07, 0xF5, 0x7C, 0xCE, 0x29, 0xD1, 0xA4, 0x53, 0xC9, 0x24, 0x51, 0x73, 0x95, 0xE6, 0xA9, 0x13, - 0x16, 0xAF, 0x3A, 0xCB, 0xE2, 0x05, 0x63, 0x59, 0xA2, 0xD6, 0x6B, 0x9E, 0x9C, 0x95, 0x73, 0x86, - 0x6C, 0x8E, 0x87, 0x3C, 0x5D, 0xD1, 0x90, 0x7B, 0x34, 0xE4, 0xD9, 0x8A, 0x46, 0xC3, 0x1C, 0xA9, - 0x78, 0x70, 0xDD, 0x0E, 0x35, 0x71, 0xE9, 0xDF, 0x3A, 0xCE, 0x95, 0x63, 0x0F, 0x6E, 0x9D, 0x53, - 0xDE, 0x96, 0x18, 0x08, 0x7C, 0x64, 0xE6, 0x44, 0x0A, 0x65, 0x5B, 0x2E, 0x3D, 0xE9, 0xEC, 0xC4, - 0xA0, 0xEB, 0x2A, 0x83, 0x4C, 0x5C, 0x12, 0x2D, 0xD0, 0x84, 0xA4, 0x19, 0x46, 0x52, 0x32, 0x59, - 0xAC, 0xDD, 0x48, 0x75, 0x8F, 0xC6, 0xA2, 0x13, 0xC3, 0x28, 0x68, 0x1D, 0x9A, 0xE3, 0x5A, 0xA6, - 0x2D, 0x75, 0xD6, 0x61, 0xFF, 0xA1, 0x8D, 0x6B, 0x51, 0xF3, 0x36, 0x00, 0x01, 0x05, 0x5F, 0xE6, - 0xCC, 0xC7, 0x23, 0xE0, 0xDC, 0xDB, 0xF4, 0x69, 0x5D, 0x6C, 0x72, 0x80, 0x00, 0x20, 0x4B, 0xEC, - 0xC8, 0x92, 0x16, 0x9A, 0x41, 0x91, 0x3A, 0x3B, 0x64, 0x82, 0x8B, 0x6A, 0x0A, 0x79, 0x5C, 0x87, - 0xD3, 0x22, 0x26, 0x49, 0xD0, 0xDB, 0x72, 0x51, 0xCC, 0x14, 0x2F, 0xD8, 0x32, 0xB7, 0x88, 0x9B, - 0xEC, 0xC5, 0x5F, 0x2E, 0x7C, 0xE2, 0xCE, 0xDC, 0xBB, 0x85, 0xC6, 0xF3, 0xDF, 0x2D, 0x7C, 0xA2, - 0xAC, 0x5B, 0xEA, 0x8E, 0x6D, 0xB1, 0x57, 0x0A, 0x03, 0xD5, 0x6B, 0xC9, 0x7B, 0x9F, 0x0D, 0xBE, - 0x55, 0xF8, 0x14, 0xAD, 0x7C, 0x7C, 0xB3, 0x90, 0x9B, 0xF2, 0xF2, 0x70, 0xB6, 0xC4, 0xCD, 0xC2, - 0x94, 0xD1, 0xA2, 0xDB, 0x85, 0xAB, 0xAB, 0x61, 0xEE, 0x81, 0xD7, 0xFE, 0x12, 0x02, 0x16, 0x93, - 0xBE, 0x77, 0xC0, 0x47, 0xAF, 0xB7, 0x0E, 0x4F, 0x53, 0xAF, 0x63, 0xFC, 0xE1, 0x4A, 0x13, 0xA4, - 0xFF, 0xBC, 0x29, 0x82, 0xA8, 0x53, 0x48, 0x6B, 0x56, 0xE5, 0x48, 0xE8, 0xDF, 0x14, 0x81, 0x51, - 0xC4, 0x3E, 0x53, 0x36, 0xBB, 0x6D, 0x19, 0xC3, 0x4B, 0x02, 0x06, 0xC5, 0x2D, 0x78, 0xAA, 0xE5, - 0xCB, 0x31, 0xBC, 0xC4, 0x31, 0x03, 0xF5, 0x91, 0xA5, 0xA2, 0x06, 0x0C, 0xB0, 0xFE, 0xB8, 0x11, - 0x42, 0xA1, 0x04, 0x72, 0xA8, 0xA6, 0x2F, 0xC6, 0xC2, 0x2B, 0x25, 0x72, 0x41, 0x92, 0xE7, 0x05, - 0x16, 0x1E, 0x10, 0x53, 0xED, 0xB3, 0xC5, 0x6C, 0xBE, 0xB3, 0xC2, 0x8F, 0x41, 0x16, 0x97, 0x23, - 0x31, 0x39, 0x54, 0x7E, 0x24, 0x49, 0x5A, 0x7A, 0x92, 0x13, 0x9E, 0x6F, 0xEB, 0xD9, 0xD4, 0xFB, - 0xE3, 0xC2, 0x8D, 0xA7, 0x12, 0xFC, 0x89, 0x25, 0x59, 0x75, 0x25, 0x9B, 0x98, 0x27, 0xB3, 0x7A, - 0x7C, 0x3E, 0x39, 0xCF, 0x7D, 0x1A, 0x7F, 0xD1, 0xBC, 0x1F, 0xBB, 0x30, 0x1A, 0x3A, 0x50, 0x96, - 0x3B, 0xC2, 0x17, 0x23, 0x75, 0xC4, 0x24, 0x8F, 0xCF, 0x1C, 0x9B, 0xB2, 0x13, 0xAA, 0x07, 0x78, - 0x6E, 0x59, 0xA6, 0xEB, 0x3B, 0xA6, 0x11, 0x95, 0xEB, 0x82, 0x09, 0x87, 0x55, 0xBD, 0x94, 0x80, - 0x12, 0x49, 0x5E, 0xA8, 0x6F, 0x69, 0x0A, 0x72, 0xF1, 0xF7, 0xF1, 0xF9, 0xC8, 0xB1, 0x03, 0xAA, - 0xE9, 0xA1, 0xFC, 0xF2, 0x71, 0x8B, 0x6C, 0xA3, 0x88, 0xE0, 0xB2, 0x74, 0xE1, 0xA5, 0x88, 0x00, - 0x93, 0xDB, 0xE4, 0x9B, 0xC9, 0xAE, 0xF7, 0x8B, 0xC8, 0x6E, 0xC5, 0x2F, 0xE4, 0x22, 0x4C, 0xCE, - 0xBB, 0xA6, 0x7C, 0x37, 0x42, 0x39, 0x5F, 0x73, 0x27, 0x27, 0xB2, 0xF4, 0x9A, 0x7F, 0x4F, 0xE2, - 0x24, 0x79, 0x6B, 0xAD, 0xEF, 0x17, 0xB0, 0x22, 0xCF, 0xAE, 0xB9, 0x8E, 0xC4, 0x91, 0x2C, 0xB8, - 0xDE, 0xA8, 0xC4, 0xED, 0x5F, 0x58, 0x1D, 0x08, 0xB8, 0x09, 0x2A, 0x34, 0x45, 0xF8, 0x18, 0x45, - 0x5B, 0x69, 0x96, 0x0E, 0x4D, 0x91, 0xBF, 0x60, 0x1A, 0x33, 0x99, 0x03, 0x9E, 0x33, 0x78, 0x44, - 0x3C, 0xA7, 0xC4, 0x09, 0xB2, 0x0C, 0x2D, 0xE7, 0xB2, 0x2F, 0xF3, 0x34, 0x70, 0x63, 0x27, 0x9A, - 0x9A, 0xCC, 0xF4, 0xAF, 0x26, 0x4C, 0x01, 0x46, 0xFF, 0xEA, 0x07, 0x3D, 0xE1, 0x69, 0x94, 0x45, - 0xFF, 0x5F, 0x65, 0x31, 0x24, 0xE5, 0x31, 0x7B, 0x02, 0xBF, 0x6D, 0x5B, 0x63, 0x8A, 0x67, 0x61, - 0x6C, 0xCB, 0xC9, 0x4D, 0x67, 0x9C, 0xC7, 0x25, 0xE2, 0x46, 0x51, 0xCC, 0x36, 0x74, 0x87, 0x5F, - 0x50, 0x8D, 0x98, 0xD0, 0x6D, 0x76, 0xCC, 0xCF, 0x86, 0xD0, 0xC3, 0xA3, 0xAC, 0xFA, 0x27, 0x03, - 0x87, 0x54, 0xD9, 0x41, 0x9C, 0x16, 0xF9, 0xB6, 0x6A, 0xEA, 0xEE, 0xCA, 0x75, 0x80, 0xDF, 0x0C, - 0x13, 0xA3, 0xEE, 0x50, 0x10, 0x4F, 0x60, 0xCB, 0x17, 0xA8, 0x49, 0x54, 0xA4, 0x26, 0x5E, 0x79, - 0x30, 0x5A, 0x27, 0x6D, 0x39, 0x05, 0xF5, 0x58, 0xF7, 0xDA, 0xA3, 0xAF, 0x0C, 0x58, 0xAA, 0xC2, - 0xC0, 0x10, 0xC3, 0xF9, 0x66, 0x5C, 0xFC, 0x31, 0x2A, 0x5F, 0xB4, 0x81, 0x4A, 0xDF, 0x93, 0x53, - 0x5D, 0x6C, 0x3E, 0x81, 0x37, 0x67, 0x10, 0x38, 0xCB, 0x95, 0x21, 0x69, 0x3A, 0xA1, 0x5B, 0xD0, - 0xC5, 0x49, 0xE7, 0x2C, 0x4D, 0xE7, 0xF0, 0x68, 0x4D, 0xC9, 0x1C, 0x66, 0x36, 0x85, 0xCA, 0x35, - 0xC3, 0xC8, 0x4B, 0xE0, 0x8A, 0x42, 0xF2, 0x92, 0xF7, 0x2B, 0xF1, 0x15, 0x21, 0xBE, 0x15, 0x69, - 0xD6, 0x9A, 0xDC, 0x5A, 0xB9, 0xB3, 0x39, 0x04, 0xED, 0xC9, 0xDC, 0x8B, 0x0A, 0x39, 0xF2, 0x55, - 0xE9, 0xA6, 0x61, 0xB6, 0x46, 0x79, 0xE5, 0xEC, 0xE5, 0x11, 0x43, 0xDB, 0xF4, 0x05, 0xD5, 0xA9, - 0x8B, 0x4E, 0x29, 0x8A, 0x0B, 0x51, 0xF2, 0xB2, 0x82, 0x4A, 0x88, 0x86, 0x52, 0x7C, 0x4E, 0x88, - 0xCC, 0xD1, 0x61, 0x15, 0xF8, 0x01, 0xE5, 0x1C, 0xA3, 0x94, 0x2B, 0x8E, 0xA0, 0x9A, 0x50, 0xF6, - 0x40, 0x86, 0xCA, 0xCA, 0xE8, 0x5E, 0xD3, 0x1F, 0xC9, 0x93, 0x0A, 0xE9, 0x46, 0xB3, 0x1F, 0x19, - 0xE0, 0x1A, 0xA7, 0xBC, 0x5C, 0x7E, 0x8D, 0x9D, 0x8C, 0x30, 0xA5, 0x1E, 0x91, 0x80, 0xA1, 0x10, - 0x1F, 0xA9, 0xA3, 0xC7, 0xFB, 0x98, 0x78, 0x05, 0xE6, 0xE8, 0x51, 0xC0, 0x88, 0x34, 0x35, 0xE2, - 0x14, 0x37, 0xD7, 0x27, 0xA3, 0xBC, 0x31, 0xE5, 0x60, 0x29, 0xAE, 0x72, 0x49, 0xD4, 0x2F, 0x64, - 0x4E, 0x49, 0x34, 0x7D, 0x69, 0xC6, 0x36, 0xB5, 0xB8, 0x9B, 0x30, 0x4C, 0x68, 0x56, 0x5A, 0x56, - 0xC5, 0x1A, 0x9E, 0xC6, 0x11, 0xA2, 0x51, 0x64, 0x82, 0xCD, 0x75, 0x60, 0x0D, 0x78, 0xB4, 0x29, - 0xAD, 0xDA, 0x28, 0xC2, 0x25, 0xC2, 0x8F, 0xEE, 0x10, 0xDF, 0xD1, 0xE9, 0xF0, 0x9C, 0xE4, 0x13, - 0x40, 0x70, 0xB6, 0x18, 0x47, 0xC6, 0xFB, 0xA6, 0x31, 0xD1, 0x9F, 0xAA, 0xBD, 0x1D, 0x3B, 0x98, - 0x55, 0x39, 0xA9, 0xF0, 0x05, 0xF8, 0xC6, 0xEC, 0x79, 0x4A, 0xA6, 0x2D, 0xCE, 0x41, 0xD4, 0xB1, - 0x8A, 0x67, 0xB8, 0x7F, 0xCC, 0x2E, 0x00, 0x5C, 0x82, 0x5D, 0x55, 0x4F, 0x71, 0xD8, 0xAD, 0xC3, - 0xF7, 0xB0, 0x03, 0xEC, 0xD6, 0xF1, 0xF4, 0xE1, 0x56, 0xA3, 0xDE, 0x84, 0x0F, 0x2F, 0xD2, 0x07, - 0xEC, 0xF9, 0xD8, 0x4D, 0x8A, 0xAC, 0xCA, 0xB0, 0x9D, 0x64, 0x17, 0x2F, 0xD2, 0xD6, 0x0F, 0x18, - 0xFC, 0x2B, 0x0A, 0xD3, 0x65, 0x04, 0x12, 0x25, 0xDB, 0x6E, 0x3D, 0x3F, 0x27, 0x99, 0x6F, 0xC4, - 0x0B, 0xA5, 0xEA, 0x0E, 0xF1, 0x8B, 0xB3, 0x14, 0xBF, 0x20, 0xE6, 0x10, 0x8C, 0xD2, 0xBC, 0x41, - 0x6A, 0xBB, 0x3B, 0x09, 0x26, 0x23, 0xF3, 0x96, 0x91, 0x90, 0x22, 0xBF, 0x26, 0x59, 0x1B, 0x5D, - 0x3F, 0x3D, 0xC6, 0x0D, 0x59, 0xFA, 0x77, 0x87, 0xF9, 0x43, 0xD4, 0x88, 0x31, 0x49, 0x23, 0x12, - 0x25, 0xDA, 0x9E, 0x29, 0x28, 0x16, 0xA4, 0xEB, 0xDA, 0x2B, 0x89, 0x2F, 0xD0, 0xD6, 0x17, 0xA1, - 0x6E, 0x98, 0xE5, 0xAE, 0xF8, 0x45, 0x8D, 0xEA, 0x62, 0x65, 0x94, 0x4D, 0xCE, 0x16, 0xAB, 0xA1, - 0xEE, 0xD0, 0xCF, 0x35, 0xF4, 0x18, 0xA8, 0x94, 0xB9, 0xA8, 0x23, 0xFF, 0xFA, 0x67, 0xA6, 0xED, - 0x4F, 0xA0, 0xD4, 0xCA, 0x00, 0x70, 0xCA, 0x13, 0xC3, 0x34, 0x16, 0x2E, 0x2D, 0x3C, 0x7A, 0xA5, - 0x26, 0x8D, 0x11, 0xE6, 0x4A, 0x40, 0x88, 0x12, 0x31, 0x92, 0x53, 0x76, 0xDC, 0xF1, 0x1A, 0x1D, - 0xB8, 0xFF, 0x80, 0x54, 0x78, 0xB8, 0xC4, 0xC8, 0x85, 0x08, 0xC1, 0x4A, 0x45, 0x2F, 0x84, 0xAD, - 0x5F, 0x23, 0x18, 0x96, 0x4E, 0x48, 0x8B, 0x8F, 0x60, 0xB8, 0xD2, 0xC4, 0x2E, 0xDE, 0x75, 0xE3, - 0x95, 0xDE, 0x6B, 0x20, 0xC3, 0x33, 0x05, 0x32, 0x84, 0x14, 0x94, 0x33, 0x98, 0x21, 0xF7, 0xF6, - 0xC4, 0x37, 0x77, 0xE1, 0xB1, 0x0F, 0xE3, 0x53, 0x69, 0x7A, 0xFC, 0xC3, 0xF8, 0xFB, 0x35, 0x8B, - 0x81, 0xD8, 0xAF, 0xD7, 0xEA, 0xEF, 0xEB, 0xCD, 0xF7, 0xFB, 0xEF, 0xDE, 0xB3, 0x6A, 0xA3, 0x7E, - 0x50, 0x6B, 0x1C, 0x1D, 0xD4, 0x0F, 0xDE, 0x1D, 0x36, 0x58, 0xE3, 0xE0, 0x10, 0xBE, 0x3B, 0x7A, - 0xBF, 0xD8, 0x00, 0x88, 0x15, 0x8C, 0x17, 0x46, 0x3F, 0xAC, 0x60, 0xA8, 0x1C, 0xA1, 0x0F, 0x33, - 0x67, 0x51, 0xE8, 0xE6, 0xBC, 0xDC, 0x8C, 0x5F, 0xE3, 0x1E, 0x66, 0xC4, 0x3D, 0x4C, 0x0A, 0x91, - 0x0B, 0x8F, 0x7D, 0x08, 0x87, 0x58, 0x42, 0xFC, 0xC3, 0xB2, 0x67, 0x1F, 0x1F, 0x63, 0x39, 0x71, - 0x10, 0xCB, 0x5E, 0x41, 0x72, 0x94, 0x8D, 0x8F, 0x87, 0x88, 0x1F, 0x5D, 0x7F, 0x98, 0xB0, 0x88, - 0xA5, 0x24, 0x55, 0x5B, 0x7A, 0x35, 0xE1, 0x2E, 0xF7, 0xEE, 0xB0, 0xCA, 0x5F, 0xA2, 0x9A, 0xB0, - 0x7C, 0xB8, 0xB2, 0x6A, 0xC2, 0xE1, 0x1C, 0x9E, 0xA7, 0x9A, 0xB0, 0x4F, 0xA3, 0xA3, 0xE0, 0x1D, - 0xB8, 0x84, 0xDC, 0xA1, 0xF5, 0xFB, 0xAD, 0x3F, 0x51, 0x56, 0x98, 0xD2, 0xA5, 0x4E, 0x14, 0x15, - 0xFE, 0x4A, 0x49, 0xD4, 0x64, 0x55, 0x61, 0x29, 0xCD, 0x0B, 0x74, 0xE9, 0xD0, 0x74, 0x4C, 0x49, - 0xA6, 0x14, 0xE2, 0x64, 0x3F, 0x81, 0xCC, 0x54, 0x66, 0x27, 0x0A, 0x1A, 0xBF, 0x9C, 0x4A, 0xC3, - 0x72, 0x43, 0x9F, 0xBD, 0xD2, 0xB0, 0x9C, 0xC6, 0x6B, 0xA5, 0xE1, 0xB9, 0x25, 0xD3, 0x26, 0x81, - 0x54, 0xAC, 0x60, 0xDA, 0x44, 0xFB, 0x17, 0x51, 0x92, 0x2F, 0xB1, 0xAA, 0xD7, 0x4A, 0xC3, 0xB9, - 0x90, 0xA7, 0x44, 0xA5, 0xE1, 0x89, 0xF6, 0x2F, 0x0F, 0x79, 0x5E, 0x2B, 0x0D, 0xE7, 0x40, 0x9D, - 0x12, 0x95, 0x86, 0x27, 0xDA, 0xBF, 0x4C, 0xD4, 0x79, 0xAD, 0x34, 0x9C, 0x17, 0x7F, 0x0A, 0x97, - 0xFA, 0x9C, 0xD2, 0xC3, 0x4B, 0xC2, 0xA1, 0x3F, 0x76, 0xA5, 0xE1, 0x49, 0x20, 0x94, 0x42, 0x8E, - 0x17, 0x56, 0x69, 0x78, 0x62, 0x55, 0xAF, 0x95, 0x86, 0x17, 0x85, 0x5F, 0x65, 0xD9, 0xCF, 0xBA, - 0x54, 0x1A, 0x9E, 0x55, 0x52, 0x95, 0x95, 0xAC, 0xA9, 0x9A, 0xA9, 0xD4, 0xCF, 0xB7, 0x71, 0x2C, - 0xB1, 0xA6, 0x6A, 0xCE, 0x6A, 0xAA, 0x72, 0x01, 0xCF, 0x57, 0x4D, 0x55, 0x8E, 0xFF, 0x47, 0xAA, - 0xA6, 0xAA, 0x20, 0xFE, 0x5A, 0x4D, 0x35, 0xBF, 0xCD, 0xA5, 0x74, 0xD9, 0x54, 0xCC, 0x4E, 0xB2, - 0xE6, 0xA5, 0x53, 0x71, 0x8A, 0xCB, 0x2A, 0x9F, 0x4A, 0x7D, 0xCF, 0xDF, 0x38, 0x2A, 0x5D, 0x10, - 0xD5, 0x4F, 0xDD, 0xC0, 0x6A, 0xA9, 0xB4, 0x00, 0x74, 0xB0, 0x53, 0xB5, 0xD3, 0x63, 0x01, 0x2B, - 0xE4, 0xDC, 0xAB, 0xA1, 0x2F, 0x8F, 0x21, 0x69, 0x0A, 0x29, 0xB2, 0xF1, 0xF9, 0x77, 0x22, 0xC6, - 0xA8, 0x82, 0x69, 0xA3, 0x5E, 0x3F, 0xD8, 0x81, 0x9F, 0xEF, 0xF6, 0xF1, 0xE7, 0x11, 0xFD, 0x7C, - 0x8F, 0x3F, 0x1B, 0xCD, 0x7D, 0xE9, 0x8A, 0x57, 0xAF, 0x85, 0x8D, 0x1A, 0xCD, 0xBD, 0xBA, 0xF2, - 0xE9, 0x53, 0xEE, 0x0C, 0x70, 0x26, 0x50, 0x4C, 0x0D, 0x7E, 0x4B, 0x51, 0x4A, 0x7E, 0x58, 0x45, - 0xEA, 0x1E, 0xC6, 0xB7, 0x0D, 0xBA, 0x1C, 0xC6, 0xCB, 0x01, 0xA1, 0x99, 0x96, 0xE3, 0xA9, 0x58, - 0x98, 0xB0, 0xD6, 0xBC, 0x66, 0x3F, 0xEE, 0xC2, 0xB9, 0x22, 0x77, 0x61, 0x5C, 0x84, 0x35, 0x5D, - 0xAE, 0x34, 0x16, 0x6B, 0x13, 0x2B, 0xBD, 0xA5, 0xCA, 0xB3, 0x02, 0xE7, 0x00, 0x7E, 0xE2, 0x99, - 0x86, 0x81, 0xF5, 0x56, 0x1D, 0x5A, 0x20, 0x05, 0xDB, 0x61, 0xA1, 0x07, 0x84, 0x00, 0x56, 0xB4, - 0x78, 0xA9, 0x15, 0x4F, 0x33, 0x30, 0x7C, 0x63, 0xAA, 0x9E, 0xCE, 0x28, 0xC5, 0x39, 0x51, 0x66, - 0x13, 0x11, 0x65, 0x5A, 0x8D, 0xCD, 0x42, 0xB5, 0x35, 0xD7, 0xBD, 0x58, 0x69, 0x5E, 0x60, 0x5C, - 0x39, 0xF7, 0xA7, 0x21, 0x89, 0x21, 0x60, 0x22, 0x80, 0xE4, 0x3B, 0xEF, 0xB1, 0x30, 0xE9, 0x3D, - 0x8B, 0x7A, 0x00, 0xAA, 0xB3, 0x7F, 0x14, 0xAB, 0x32, 0x9A, 0x09, 0x9B, 0x54, 0x91, 0xD1, 0x1C, - 0xFC, 0xF8, 0xE9, 0xD7, 0x6C, 0x39, 0x1E, 0x4F, 0x1B, 0x24, 0x55, 0x68, 0x94, 0x64, 0x75, 0xD6, - 0xE1, 0x5E, 0x1F, 0x1D, 0x6C, 0x9E, 0xBB, 0xE2, 0xA8, 0xEB, 0x2E, 0xA9, 0xDE, 0x68, 0xA7, 0x53, - 0xAA, 0xDA, 0x68, 0xD4, 0xEC, 0xCD, 0x1C, 0xDF, 0xA0, 0x64, 0x95, 0xD1, 0x37, 0x33, 0x75, 0xC3, - 0x24, 0x90, 0x53, 0x95, 0x46, 0xDD, 0xD8, 0x1B, 0x6B, 0x55, 0x71, 0x34, 0x02, 0xC1, 0xA2, 0xEA, - 0x8D, 0xCE, 0xA6, 0x8B, 0x36, 0xDD, 0x39, 0xB2, 0xCB, 0xF6, 0x71, 0xA8, 0x5A, 0x0E, 0xA1, 0xC3, - 0x7B, 0x58, 0xEC, 0x65, 0x7B, 0x8E, 0x2F, 0xDA, 0xEE, 0x09, 0xAA, 0x93, 0x73, 0x9D, 0xC9, 0xDA, - 0x18, 0xA5, 0x0A, 0x9A, 0xA9, 0x69, 0xB1, 0x1F, 0x1C, 0xFE, 0x84, 0xFD, 0x37, 0x3D, 0x1E, 0x0D, - 0x63, 0xC0, 0xD7, 0x37, 0x7C, 0xA4, 0x99, 0x36, 0x48, 0xE9, 0x73, 0x46, 0x72, 0xD8, 0x5F, 0xA0, - 0xF5, 0x4C, 0xE5, 0xF5, 0x99, 0xEE, 0xBF, 0x13, 0xA8, 0x13, 0x5D, 0xCD, 0xFA, 0x5D, 0x27, 0xF0, - 0x74, 0x1E, 0xDD, 0x85, 0x27, 0x50, 0x50, 0x86, 0x0D, 0xCD, 0x65, 0x50, 0xB1, 0x9E, 0x96, 0x7B, - 0x75, 0x9E, 0x31, 0xFD, 0x15, 0x5E, 0xA3, 0xAB, 0x60, 0xAA, 0x04, 0xA4, 0xC6, 0x77, 0xDD, 0xBE, - 0x94, 0xB6, 0xB4, 0x3B, 0x10, 0xF0, 0x28, 0x8A, 0x79, 0xAC, 0xC1, 0x49, 0x10, 0x1B, 0x1B, 0x77, - 0xBD, 0xED, 0x82, 0x5A, 0x4E, 0x95, 0xCD, 0xFC, 0xB9, 0x25, 0x95, 0xCB, 0xE3, 0x6F, 0x6E, 0x1C, - 0xD6, 0x02, 0xE1, 0x00, 0x6D, 0xDD, 0x70, 0x9B, 0xDF, 0x6B, 0x18, 0x8B, 0x08, 0x9F, 0x91, 0xD8, - 0x98, 0x7A, 0x92, 0xD3, 0xB3, 0xF6, 0x29, 0x78, 0x98, 0x9E, 0x42, 0xFE, 0xBD, 0x7C, 0x9A, 0x4D, - 0x42, 0x21, 0xE0, 0x4F, 0x88, 0x5C, 0xC4, 0x9C, 0x0C, 0xCF, 0x71, 0x41, 0xE5, 0x40, 0xCD, 0xA2, - 0x79, 0xC4, 0x90, 0x37, 0xA1, 0x0C, 0x43, 0x2C, 0xEB, 0x11, 0x14, 0x15, 0x98, 0x26, 0x06, 0x01, - 0xE9, 0x14, 0x96, 0xA8, 0x81, 0x1E, 0x34, 0x72, 0x29, 0x54, 0x41, 0x19, 0x2B, 0xF0, 0xCF, 0xB7, - 0x9F, 0x9D, 0x11, 0x7F, 0x4B, 0x46, 0x8A, 0x1D, 0x90, 0xA6, 0xB0, 0x52, 0x30, 0xF6, 0xB3, 0x83, - 0xDF, 0x79, 0xB8, 0x3E, 0x1A, 0xA8, 0x30, 0x02, 0x2F, 0xCD, 0xFA, 0x90, 0x8D, 0xE8, 0x2B, 0x30, - 0x29, 0xC7, 0xF9, 0x90, 0x3C, 0x89, 0x3A, 0x9E, 0xD3, 0x37, 0x2D, 0x7E, 0xEB, 0xFC, 0xE0, 0xF6, - 0x02, 0xEE, 0xAD, 0x26, 0x03, 0x62, 0xD4, 0x81, 0xA7, 0xC6, 0x61, 0x34, 0xD0, 0xF1, 0x33, 0xD9, - 0xC3, 0x2E, 0xFB, 0x68, 0xE0, 0xF2, 0x40, 0x85, 0x1D, 0x68, 0xB6, 0xF9, 0xBB, 0x14, 0x4E, 0x86, - 0x9A, 0x8F, 0x2E, 0x42, 0x8E, 0xE7, 0x3A, 0xA4, 0x84, 0x82, 0x46, 0x6C, 0x0F, 0xBA, 0xC2, 0xE3, - 0xDA, 0x88, 0x4D, 0xB0, 0x4A, 0x4D, 0xD7, 0xD1, 0xFA, 0xBB, 0x23, 0xCD, 0x5C, 0x26, 0xF1, 0x4B, - 0x8F, 0x93, 0xD9, 0x0C, 0xA9, 0x92, 0x7A, 0xD7, 0x03, 0x1F, 0xD0, 0x57, 0x79, 0x17, 0xA1, 0xF1, - 0x8D, 0x16, 0x2E, 0x70, 0xE1, 0x71, 0x74, 0x04, 0x94, 0x7E, 0x64, 0x55, 0x26, 0x7D, 0x9B, 0x78, - 0x54, 0xDE, 0x50, 0x42, 0x68, 0x33, 0xEC, 0x64, 0x4F, 0xB9, 0x43, 0x7A, 0xB7, 0x60, 0x1B, 0x7F, - 0x06, 0x6A, 0xE7, 0xB6, 0xF4, 0xCF, 0xEF, 0xE7, 0x59, 0x2B, 0xB9, 0x2E, 0x4A, 0x1B, 0xF2, 0x84, - 0xFF, 0xAC, 0x5A, 0xD0, 0xA2, 0xF5, 0x1E, 0x5C, 0x50, 0x39, 0xD5, 0x27, 0xD6, 0x72, 0x96, 0x52, - 0x33, 0x06, 0xD6, 0x84, 0x36, 0x83, 0x8D, 0xD7, 0x4A, 0x8D, 0x99, 0xBB, 0x9C, 0x72, 0x9A, 0x0C, - 0x0D, 0x40, 0xC6, 0x40, 0xEC, 0xFD, 0x6C, 0xA8, 0xC1, 0x01, 0x6C, 0xB5, 0xE1, 0xF4, 0xA6, 0x25, - 0x45, 0xC9, 0xC1, 0x33, 0x1C, 0x04, 0x63, 0x47, 0x50, 0xD4, 0xD7, 0xA9, 0x16, 0xC0, 0x61, 0x4C, - 0xC9, 0x8F, 0x08, 0xCC, 0x0C, 0x1F, 0x90, 0xF9, 0xF6, 0x98, 0xE5, 0x28, 0xC7, 0x1B, 0x8F, 0x96, - 0x49, 0xF6, 0x99, 0x9C, 0xB2, 0x7C, 0x14, 0x67, 0x1B, 0x46, 0x38, 0xFB, 0x0C, 0x72, 0x4D, 0x05, - 0x62, 0x1C, 0xD5, 0xEB, 0x95, 0x16, 0xFE, 0xCC, 0x17, 0x21, 0x91, 0x6A, 0xFE, 0xFE, 0x10, 0x9B, - 0xE3, 0xCF, 0x52, 0xCD, 0x1B, 0xEF, 0x9B, 0xD8, 0x9E, 0x7E, 0x95, 0xEA, 0x60, 0xEF, 0x68, 0x1F, - 0x3B, 0xA0, 0x5F, 0xA5, 0x3A, 0x38, 0x78, 0x47, 0x2B, 0xA0, 0x5F, 0xE5, 0x96, 0xD0, 0x38, 0x90, - 0x6B, 0xA0, 0xDF, 0xA5, 0xBA, 0x68, 0xEE, 0xD5, 0x69, 0x15, 0xF2, 0x77, 0xA9, 0x2E, 0xF6, 0x0F, - 0xEB, 0x72, 0x23, 0xE9, 0x77, 0xB9, 0xAD, 0x6C, 0x36, 0xE4, 0x66, 0xD2, 0xEF, 0xEC, 0x2E, 0xB2, - 0x63, 0x64, 0x16, 0xAB, 0xE6, 0xDD, 0xD2, 0x75, 0x01, 0xD0, 0x12, 0x89, 0x33, 0x68, 0xCC, 0x47, - 0xF9, 0xE2, 0xE6, 0xA4, 0x7D, 0xF9, 0x95, 0x21, 0xD3, 0x0A, 0xCD, 0xFD, 0x3A, 0x10, 0xF3, 0x40, - 0x1A, 0xF1, 0x41, 0xD8, 0xD6, 0x31, 0x77, 0x1D, 0xC6, 0xE5, 0xA3, 0x13, 0xF5, 0xD0, 0x41, 0xD1, - 0xC5, 0xE9, 0xCB, 0x6B, 0x80, 0x98, 0xD4, 0x42, 0xDB, 0xDF, 0x73, 0xFD, 0x75, 0x52, 0x03, 0xE5, - 0x11, 0xE4, 0x3D, 0x41, 0x47, 0x44, 0x70, 0x2F, 0x88, 0xBD, 0xA5, 0xBA, 0xAA, 0xB4, 0xBE, 0x04, - 0x0F, 0x4C, 0x7D, 0x28, 0xCC, 0xD7, 0xD2, 0x9D, 0x4D, 0x9B, 0xEC, 0x22, 0x78, 0x1B, 0x20, 0xF3, - 0xF5, 0x97, 0xF3, 0x93, 0x72, 0x64, 0x5D, 0x69, 0x75, 0x3A, 0xDD, 0xDD, 0xF3, 0x3B, 0xBC, 0xC5, - 0xB9, 0x05, 0x2C, 0x1D, 0x60, 0x1C, 0x42, 0x19, 0xE2, 0x96, 0xCB, 0x1B, 0x05, 0x0F, 0x6A, 0x65, - 0x00, 0xF2, 0xCB, 0xE6, 0x59, 0x39, 0x6E, 0x07, 0xDA, 0x75, 0xFB, 0x6C, 0xB7, 0x7D, 0x72, 0xB6, - 0x9E, 0xE4, 0xD9, 0x3E, 0xB9, 0x3D, 0x49, 0xD2, 0xA2, 0x92, 0x30, 0xD4, 0xED, 0x9B, 0x61, 0xF6, - 0x29, 0x8F, 0x0A, 0x28, 0x1C, 0xAE, 0x6B, 0x99, 0x32, 0xB4, 0x11, 0x94, 0x59, 0xDC, 0x25, 0x99, - 0xB1, 0x47, 0xBD, 0x08, 0xF4, 0x6A, 0x6A, 0x16, 0xBB, 0xFD, 0x79, 0xF7, 0xE6, 0x67, 0xA4, 0xD7, - 0x58, 0x65, 0xF4, 0x28, 0x91, 0x46, 0x8D, 0xE1, 0x06, 0xA9, 0xAD, 0x49, 0xB4, 0x76, 0x03, 0x90, - 0x8E, 0x98, 0xCB, 0xB1, 0x1F, 0x98, 0x81, 0xA1, 0xEA, 0xC0, 0x93, 0xDA, 0x73, 0x60, 0xFB, 0xA8, - 0xED, 0x04, 0xC4, 0x44, 0x44, 0xD8, 0x18, 0xE5, 0x71, 0x2C, 0x30, 0xDF, 0x3C, 0x8B, 0x3A, 0x42, - 0xF5, 0xC9, 0xA6, 0x8C, 0x02, 0x38, 0x18, 0x4C, 0xA6, 0xDB, 0x3E, 0xD9, 0xED, 0x9E, 0x5D, 0xC9, - 0xB8, 0x09, 0x5D, 0xEE, 0x65, 0x8D, 0x81, 0xEE, 0xCF, 0xAD, 0xDD, 0xB6, 0xE9, 0xB1, 0x5B, 0x53, - 0xFF, 0x91, 0x98, 0x06, 0xA9, 0xFB, 0x8E, 0xC0, 0xAC, 0x05, 0x98, 0x80, 0xC8, 0xEB, 0x6B, 0x3A, - 0xA8, 0x60, 0x35, 0xA6, 0xB6, 0x30, 0xF1, 0xAE, 0x52, 0xAE, 0xFA, 0xA6, 0x37, 0x42, 0xA3, 0x69, - 0x0A, 0x3E, 0x11, 0x9F, 0x42, 0x40, 0x6D, 0x9C, 0xA9, 0x2A, 0xA4, 0x6C, 0x14, 0x59, 0x16, 0xC1, - 0x83, 0xA4, 0x84, 0xD5, 0xC6, 0x6D, 0x78, 0xA2, 0x80, 0x95, 0xE8, 0x71, 0x62, 0xAE, 0xAF, 0xE2, - 0xD5, 0xAB, 0x78, 0xF5, 0xC7, 0x11, 0xAF, 0x2E, 0x6D, 0xC9, 0x86, 0xD1, 0x15, 0x61, 0x47, 0xF9, - 0x66, 0xA4, 0x85, 0xAD, 0x49, 0xFE, 0x3E, 0x53, 0xD6, 0x8A, 0x31, 0xB0, 0x18, 0xFF, 0x92, 0xF0, - 0x5B, 0x33, 0x41, 0x2B, 0x17, 0x13, 0xC3, 0x0C, 0x92, 0x1E, 0x1C, 0x03, 0x1D, 0x3C, 0x5B, 0x16, - 0x15, 0x50, 0xB6, 0x58, 0x43, 0xBC, 0x0C, 0x64, 0x3C, 0x8F, 0x4F, 0x34, 0xBA, 0x42, 0x0A, 0x9F, - 0x32, 0x7A, 0xBC, 0x7C, 0x8B, 0xFC, 0xD4, 0xB9, 0xAC, 0xD8, 0x2C, 0xFF, 0x89, 0xDB, 0x9C, 0xD0, - 0x57, 0x93, 0xAB, 0xC6, 0xAB, 0x72, 0xD6, 0x55, 0x12, 0x01, 0x1C, 0xCF, 0xF0, 0xDE, 0x48, 0x79, - 0x20, 0x8D, 0x02, 0xC0, 0xDD, 0x3E, 0xF9, 0xDF, 0xEF, 0x48, 0xE7, 0x20, 0xD8, 0x6F, 0x74, 0xE1, - 0x51, 0xB2, 0x82, 0xFE, 0x58, 0x63, 0x37, 0xFC, 0xB7, 0xC0, 0xF4, 0xB8, 0x3F, 0x4E, 0xB2, 0x9B, - 0xF6, 0x06, 0x54, 0xA6, 0x78, 0xD9, 0x41, 0xA3, 0x5E, 0xDF, 0xA9, 0xD7, 0xEB, 0x81, 0xAF, 0xC4, - 0x11, 0x95, 0xA3, 0x14, 0x65, 0x90, 0xF7, 0xD1, 0x57, 0x72, 0x06, 0x5C, 0xDC, 0x73, 0x6E, 0xCB, - 0xF7, 0x72, 0x25, 0x4E, 0x59, 0x5F, 0x4B, 0xFE, 0x0C, 0x52, 0x69, 0x73, 0xF4, 0xAD, 0xF2, 0x9F, - 0xA1, 0x1C, 0x58, 0x4C, 0x7E, 0x48, 0xCC, 0xEB, 0x16, 0x20, 0x7F, 0x2A, 0x01, 0x4F, 0x9F, 0x7F, - 0x0D, 0xFC, 0x92, 0x55, 0x6E, 0xB2, 0xEF, 0x0A, 0x6E, 0x27, 0x77, 0x99, 0x6D, 0xFD, 0xF7, 0x7F, - 0xF9, 0x39, 0xB2, 0xE5, 0x3D, 0x25, 0xE3, 0x53, 0x7E, 0x83, 0xF4, 0x84, 0x51, 0x3A, 0x33, 0xE8, - 0x2E, 0x13, 0x96, 0x85, 0x72, 0x40, 0x65, 0xF5, 0xF6, 0xD2, 0x12, 0x2E, 0x26, 0xD6, 0x7B, 0x45, - 0x8C, 0x61, 0x99, 0xF8, 0xD7, 0x89, 0x33, 0x20, 0x89, 0x78, 0x1B, 0x81, 0x57, 0x63, 0xC8, 0x94, - 0xC7, 0xA6, 0xA8, 0x8F, 0x75, 0xC2, 0x21, 0xB2, 0xB3, 0xE3, 0xEC, 0xCE, 0x8D, 0x01, 0x2F, 0xAA, - 0x12, 0x65, 0x22, 0x54, 0xC7, 0xB1, 0x34, 0xCF, 0x14, 0x8F, 0x4B, 0xC6, 0xA7, 0x70, 0x98, 0xE3, - 0x02, 0x4C, 0x2A, 0xA1, 0x7D, 0x4D, 0x9F, 0xF4, 0xE4, 0x16, 0x8E, 0xBF, 0x2A, 0xA1, 0x8F, 0xCD, - 0x36, 0x0D, 0xDD, 0x98, 0x94, 0xFB, 0x00, 0xB7, 0xA0, 0x60, 0x72, 0xA0, 0x09, 0x4B, 0xD1, 0x85, - 0x66, 0x59, 0xC5, 0xFB, 0x2A, 0x90, 0x64, 0x68, 0x29, 0xD7, 0xC6, 0x68, 0xB1, 0x91, 0xB2, 0x89, - 0x6F, 0x0E, 0x50, 0x36, 0xBC, 0x37, 0x2D, 0x0B, 0xA5, 0xFA, 0x21, 0x74, 0xA5, 0x3C, 0x66, 0x74, - 0x32, 0x5F, 0x6C, 0x79, 0x12, 0x56, 0x1C, 0xD6, 0xB7, 0x2D, 0x73, 0xAF, 0xDC, 0x27, 0x5F, 0xE8, - 0x2B, 0x08, 0xD0, 0x1B, 0x31, 0x91, 0x28, 0x06, 0xE4, 0x17, 0x13, 0x23, 0xF1, 0x66, 0x3D, 0x04, - 0xFC, 0xCF, 0xCA, 0xC1, 0x8E, 0x4C, 0x94, 0x57, 0xCE, 0x60, 0x80, 0x0E, 0x70, 0x69, 0x79, 0x3F, - 0x13, 0x2A, 0xD2, 0xC0, 0xA9, 0x9A, 0x2F, 0x55, 0x2F, 0xC8, 0x9C, 0xCA, 0xA4, 0xDE, 0x30, 0x7D, - 0x89, 0x2B, 0x56, 0x23, 0x60, 0x5C, 0x16, 0xF2, 0xA3, 0x48, 0x7A, 0xE3, 0x38, 0x23, 0x7F, 0x5B, - 0x8A, 0xFA, 0x7B, 0xF5, 0xC8, 0xA8, 0xA8, 0x3F, 0xB2, 0x9B, 0x2F, 0xDD, 0x1A, 0xBA, 0x3F, 0xF4, - 0x03, 0x4B, 0x29, 0xCE, 0xE8, 0xA5, 0xC5, 0x2C, 0xF3, 0x07, 0x68, 0x13, 0x01, 0x5E, 0x0B, 0x0A, - 0xCF, 0x04, 0xB5, 0x19, 0x13, 0x8D, 0x93, 0xFE, 0xD0, 0xE5, 0xD2, 0x55, 0x02, 0x05, 0x1F, 0x4A, - 0x29, 0xEC, 0xAB, 0x0C, 0x2D, 0x2A, 0x11, 0xF1, 0xF7, 0xF3, 0x76, 0xF5, 0xE2, 0x7D, 0x87, 0x5D, - 0xDA, 0x82, 0x0F, 0xD4, 0x65, 0xED, 0x17, 0xCD, 0x0E, 0x34, 0xD9, 0xFF, 0x08, 0x33, 0x9F, 0x26, - 0xEC, 0xA2, 0xD9, 0x9A, 0x4A, 0x81, 0xB8, 0xA5, 0xE7, 0xD4, 0x35, 0xD6, 0xC8, 0x53, 0x53, 0x22, - 0xE6, 0xB7, 0x93, 0x9B, 0xDB, 0xE6, 0xB7, 0xD3, 0x9F, 0x2F, 0xED, 0x88, 0xD2, 0xE0, 0x13, 0xEC, - 0x0C, 0x52, 0xC4, 0x57, 0x7B, 0xEE, 0x9A, 0x69, 0x33, 0xA8, 0x83, 0x55, 0xE4, 0x33, 0x8A, 0xCF, - 0x74, 0x45, 0x16, 0xA4, 0x18, 0x40, 0xE4, 0xFC, 0x01, 0x4F, 0xC7, 0x8B, 0x66, 0x55, 0xC6, 0x6B, - 0x83, 0xDA, 0x44, 0x06, 0x22, 0xCA, 0xF3, 0x0F, 0xB3, 0x88, 0x48, 0xEC, 0xFA, 0xFC, 0x6B, 0xB5, - 0xFD, 0xFE, 0x2C, 0x86, 0xAD, 0x17, 0x5A, 0x41, 0xF3, 0xC1, 0x8A, 0x2C, 0x46, 0x8B, 0x71, 0x5C, - 0xA1, 0x78, 0xC4, 0x17, 0xE4, 0xB7, 0x82, 0xEB, 0x29, 0xE5, 0xB6, 0x12, 0x6B, 0x38, 0x1D, 0xEC, - 0x31, 0x48, 0xA5, 0x9C, 0x56, 0xEE, 0xCD, 0xBE, 0xB9, 0x56, 0x3E, 0x2B, 0x73, 0xD7, 0x52, 0xD2, - 0x65, 0x65, 0x52, 0xF3, 0x84, 0xAD, 0x9C, 0xA7, 0x29, 0x5C, 0x83, 0x16, 0xED, 0x78, 0x3F, 0xFC, - 0xE3, 0x95, 0x31, 0x00, 0x20, 0x61, 0xA6, 0x7B, 0xDC, 0x80, 0x86, 0x26, 0xEC, 0x35, 0x9D, 0x4F, - 0x30, 0x4F, 0xE1, 0xB0, 0x7D, 0xB9, 0x7B, 0xB6, 0x9A, 0x52, 0x8D, 0x9D, 0x80, 0xAC, 0x19, 0x7E, - 0x8A, 0x24, 0x4F, 0x38, 0x19, 0xF1, 0xEA, 0xCD, 0x56, 0xB9, 0xCF, 0xB8, 0x2F, 0xC2, 0x77, 0xC6, - 0xCE, 0xDB, 0xD1, 0xCB, 0x78, 0x79, 0xB6, 0x91, 0x41, 0x73, 0xB9, 0x6D, 0x07, 0x71, 0x15, 0x0F, - 0x51, 0x5C, 0x6D, 0x68, 0xBD, 0xDB, 0xC5, 0xA8, 0x8A, 0x98, 0x56, 0xBE, 0x37, 0xA1, 0xA3, 0xE1, - 0x2B, 0xAC, 0x91, 0xAD, 0xE7, 0x97, 0xD6, 0xEF, 0x8B, 0x38, 0x31, 0x4E, 0xCE, 0x5D, 0x9D, 0x58, - 0x82, 0x67, 0xA6, 0xF9, 0x52, 0x4A, 0x7D, 0xBA, 0x8B, 0xB2, 0xEA, 0xFC, 0xA2, 0x24, 0x8B, 0xA7, - 0x6C, 0x5F, 0x07, 0xBA, 0x81, 0x3F, 0x8C, 0x8C, 0x2D, 0xEC, 0xFC, 0x34, 0x17, 0x30, 0xEB, 0xB8, - 0xB9, 0xD1, 0xCA, 0x0A, 0xEF, 0x69, 0xD8, 0x72, 0x83, 0xF7, 0xB5, 0x91, 0x97, 0x2C, 0x9B, 0xEB, - 0xB7, 0x73, 0x72, 0xEE, 0x45, 0x77, 0xAD, 0xB1, 0xE1, 0x94, 0xD8, 0x58, 0x0C, 0x25, 0xAE, 0xE3, - 0x7E, 0x96, 0xA6, 0xC4, 0xC6, 0x0B, 0xA0, 0xC4, 0x66, 0x5E, 0x4A, 0xDC, 0x5B, 0xBF, 0x9D, 0x6B, - 0x96, 0xA2, 0xC4, 0xE6, 0x86, 0x53, 0x62, 0x73, 0x31, 0x94, 0xB8, 0x8E, 0xFB, 0x59, 0x9A, 0x12, - 0x9B, 0x2F, 0x80, 0x12, 0xF7, 0xF2, 0x52, 0xE2, 0xFE, 0xFA, 0xED, 0xDC, 0x5E, 0x29, 0x4A, 0xDC, - 0xDB, 0x70, 0x4A, 0xDC, 0x5B, 0x0C, 0x25, 0xAE, 0xE3, 0x7E, 0x96, 0xA6, 0xC4, 0xBD, 0x75, 0xA1, - 0xC4, 0x45, 0xDB, 0x33, 0x3B, 0x77, 0xE2, 0x8C, 0x52, 0x7E, 0x57, 0x5A, 0xB7, 0x67, 0x1D, 0x26, - 0xFF, 0x5E, 0x85, 0x79, 0x72, 0x3C, 0xF0, 0xDC, 0xAD, 0x88, 0xD2, 0x89, 0x08, 0xDD, 0x3D, 0xC5, - 0xB2, 0x42, 0x5B, 0xDB, 0x2B, 0x33, 0x67, 0xC6, 0x8B, 0x77, 0xAB, 0xA0, 0x47, 0xB2, 0x3C, 0xC4, - 0x82, 0x75, 0xC9, 0xA4, 0x81, 0xD6, 0x0A, 0x37, 0xF0, 0x87, 0xD2, 0x7D, 0xCE, 0xA1, 0x14, 0xEE, - 0x58, 0xB5, 0xD8, 0xBC, 0xE3, 0x36, 0x43, 0xA8, 0xA2, 0xC3, 0x5C, 0x6D, 0x03, 0xCC, 0x97, 0xE5, - 0x39, 0x89, 0x3B, 0x6D, 0x67, 0xCB, 0xD0, 0xCA, 0x73, 0x13, 0x43, 0x98, 0x2B, 0x10, 0xB7, 0x6D, - 0x75, 0xB5, 0x07, 0xC6, 0x03, 0x6F, 0x1C, 0x31, 0x50, 0xC6, 0x45, 0x66, 0xDA, 0x3D, 0x2C, 0xD1, - 0x4D, 0xD8, 0x1E, 0x26, 0xDE, 0xC3, 0xAC, 0x0B, 0x49, 0xD2, 0x90, 0x17, 0xC6, 0xAA, 0xC6, 0x00, - 0x95, 0xDB, 0x95, 0xAF, 0xAE, 0xA7, 0x15, 0x6F, 0x69, 0xD4, 0x21, 0xB7, 0x7A, 0x29, 0xD4, 0x81, - 0xE3, 0x00, 0x72, 0x94, 0xCF, 0x0C, 0x51, 0x2A, 0xF8, 0x3E, 0x5C, 0x12, 0xA5, 0x5D, 0x2F, 0xE5, - 0x4F, 0x82, 0x69, 0xE5, 0x17, 0xE8, 0x04, 0x11, 0x39, 0x38, 0x28, 0xE6, 0x4B, 0x25, 0x35, 0xFC, - 0x78, 0xD6, 0x0F, 0xAC, 0x2A, 0xF5, 0x1A, 0x8B, 0x5E, 0x54, 0x96, 0x4A, 0xEE, 0x74, 0xFE, 0xD0, - 0xF3, 0x78, 0xB3, 0x67, 0x8D, 0x34, 0x7F, 0xB6, 0x73, 0xE5, 0x9B, 0x11, 0xD5, 0x96, 0xF9, 0xD6, - 0x5E, 0xF1, 0xD1, 0x32, 0x1E, 0x3B, 0xDF, 0xE9, 0x12, 0x18, 0x6B, 0x73, 0xBA, 0xF4, 0x3C, 0x47, - 0x33, 0xB0, 0xCA, 0x8D, 0x3C, 0x40, 0x7C, 0xAC, 0xBD, 0x6C, 0x63, 0x69, 0x1B, 0x92, 0xB2, 0xBE, - 0x75, 0xDA, 0x7F, 0xA4, 0x73, 0x23, 0xDA, 0xC7, 0xA5, 0x1D, 0x1D, 0x81, 0xB1, 0xFA, 0xA3, 0x23, - 0x5A, 0xD5, 0xDA, 0x9D, 0x1E, 0x48, 0xA8, 0xD3, 0x4F, 0x8F, 0x46, 0xBD, 0xD1, 0xA8, 0xBF, 0x1E, - 0x1F, 0x25, 0x8E, 0x8F, 0xE4, 0x6E, 0x17, 0x39, 0x41, 0x12, 0x2D, 0xD7, 0xF4, 0x10, 0x89, 0x3C, - 0x11, 0x88, 0x78, 0x6E, 0x01, 0x26, 0x93, 0xBE, 0xBD, 0xB9, 0x4E, 0x95, 0xC8, 0x26, 0x33, 0xEE, - 0xA9, 0xD2, 0x0A, 0x1D, 0x1F, 0x38, 0xFB, 0xE2, 0x18, 0xC5, 0x63, 0x1D, 0x53, 0xDD, 0xA5, 0x26, - 0x8B, 0x09, 0xD3, 0x4F, 0x3A, 0x8B, 0x88, 0x78, 0x6C, 0x54, 0x5A, 0x27, 0x9D, 0x52, 0x11, 0x72, - 0x40, 0x52, 0xA8, 0x50, 0xAF, 0x65, 0x68, 0xDC, 0x49, 0x27, 0x16, 0x18, 0x37, 0xFD, 0x88, 0x52, - 0x01, 0xC3, 0xB2, 0xD6, 0x9A, 0xAC, 0x50, 0x8E, 0x89, 0xBE, 0xB8, 0x81, 0xC9, 0xCA, 0xAB, 0x12, - 0xCC, 0x35, 0x06, 0x7D, 0x91, 0xD5, 0x60, 0x7A, 0x6F, 0x31, 0xDB, 0x02, 0x86, 0x3C, 0x5B, 0x63, - 0x0B, 0x43, 0x2C, 0x98, 0x9A, 0x9C, 0x20, 0x1C, 0x5B, 0x36, 0x8E, 0xCA, 0xA5, 0x5E, 0x76, 0x30, - 0x58, 0xD9, 0x83, 0xC1, 0x37, 0xC2, 0x27, 0xA2, 0x9C, 0xAF, 0x94, 0x4C, 0xAB, 0xF2, 0x82, 0x9C, - 0xA5, 0x68, 0x41, 0xA5, 0xBC, 0xA5, 0xE2, 0x2D, 0xA7, 0x83, 0x3E, 0x0E, 0xAC, 0x94, 0xBF, 0x14, - 0xE5, 0xBF, 0x58, 0x2B, 0x87, 0xA9, 0xF9, 0xCB, 0x79, 0x6A, 0x92, 0x9F, 0xE9, 0xBC, 0xB8, 0x60, - 0x76, 0x1F, 0xC9, 0x86, 0x69, 0xA2, 0xE5, 0x52, 0xF9, 0x8C, 0x19, 0x6F, 0xEC, 0xE3, 0x42, 0xD2, - 0x5C, 0x7C, 0xED, 0xF7, 0xCB, 0x66, 0xB9, 0x38, 0xEF, 0x76, 0xAA, 0xD7, 0xCE, 0xFD, 0x7A, 0x26, - 0x94, 0xA0, 0xBC, 0x09, 0xE8, 0x14, 0x0A, 0xB3, 0xDC, 0x6B, 0x26, 0xEA, 0xD3, 0x53, 0x7A, 0x3B, - 0x62, 0xB3, 0x40, 0x80, 0x55, 0xFA, 0x83, 0x2A, 0xBC, 0x46, 0x8F, 0x46, 0x20, 0xAB, 0x99, 0x92, - 0x0F, 0x13, 0xB8, 0xC9, 0x19, 0x8D, 0xB2, 0xB8, 0xAB, 0xDC, 0xEE, 0xBE, 0x4F, 0x4E, 0xD1, 0x9F, - 0x9D, 0x7B, 0x7E, 0x87, 0x71, 0x9F, 0xA7, 0x00, 0x12, 0xE1, 0x38, 0x62, 0xC8, 0xBA, 0x9D, 0x0E, - 0x8E, 0x85, 0xF5, 0x36, 0xA2, 0xE1, 0x84, 0xAC, 0x32, 0x0B, 0xBB, 0x49, 0x51, 0x9B, 0x7F, 0xA6, - 0x5A, 0x12, 0xE3, 0x26, 0xA7, 0x57, 0xE7, 0xF1, 0xB0, 0x07, 0x1A, 0x10, 0x76, 0x65, 0xE3, 0xE2, - 0x9C, 0x09, 0x54, 0x65, 0xC3, 0x35, 0xA7, 0xAB, 0xD2, 0x59, 0xE5, 0x0D, 0x08, 0x56, 0x5F, 0x4E, - 0xCE, 0xA2, 0x9C, 0xBE, 0x34, 0x07, 0x78, 0x30, 0x3B, 0x9D, 0xEF, 0xC9, 0xC9, 0xF1, 0xE9, 0xE9, - 0xF1, 0xD9, 0xD9, 0x71, 0xBB, 0x7D, 0x7C, 0x7E, 0x7E, 0x7C, 0x71, 0x51, 0xF6, 0xF6, 0xA5, 0xF4, - 0xAC, 0x3B, 0x9A, 0x89, 0x59, 0x4D, 0x68, 0xF2, 0xFE, 0x71, 0x89, 0xDA, 0x32, 0x05, 0xA4, 0x5F, - 0xCE, 0x3D, 0x80, 0x86, 0x3F, 0x2F, 0xBB, 0xB1, 0xCD, 0xD7, 0xB7, 0xF6, 0xD3, 0x72, 0x32, 0xD0, - 0x23, 0x64, 0xE0, 0x44, 0xC6, 0x7D, 0x90, 0x9B, 0x90, 0xAB, 0x24, 0x76, 0xA4, 0x4C, 0xE6, 0x8B, - 0x94, 0x8A, 0x8C, 0x22, 0x6E, 0x34, 0x0C, 0xD6, 0x2A, 0x31, 0x54, 0xF8, 0x04, 0x70, 0x39, 0x2F, - 0x80, 0x33, 0x01, 0x27, 0xA1, 0x50, 0x21, 0x7F, 0xA1, 0xEC, 0x25, 0x05, 0x75, 0xC5, 0xB2, 0xC9, - 0xDE, 0x3B, 0x61, 0x2D, 0xE0, 0x1D, 0xC6, 0x1F, 0x4C, 0x81, 0x52, 0xAC, 0x92, 0x9D, 0xA4, 0xF8, - 0x49, 0xF6, 0x79, 0x14, 0x19, 0x99, 0xCF, 0x05, 0x6C, 0xA6, 0x02, 0xB4, 0xCC, 0xB6, 0xFD, 0x16, - 0x57, 0xF5, 0x16, 0xED, 0xF4, 0x3E, 0xC7, 0x14, 0x9F, 0xDF, 0x6C, 0x53, 0x28, 0x4F, 0x5D, 0xFF, - 0x5E, 0x73, 0x91, 0x62, 0x43, 0x89, 0x93, 0xFB, 0x4A, 0x46, 0x05, 0x18, 0xC3, 0xF0, 0xA3, 0x51, - 0x60, 0x53, 0xEE, 0x07, 0x2C, 0x2D, 0x8C, 0x1E, 0xBC, 0x0F, 0x02, 0xD8, 0xF2, 0x3D, 0xF7, 0x00, - 0x9E, 0xB5, 0x3F, 0x6C, 0x18, 0x58, 0xE9, 0x0A, 0x54, 0x7B, 0x8B, 0x2A, 0x3A, 0x25, 0x4D, 0x49, - 0x17, 0x0E, 0xCA, 0xA0, 0x8A, 0x66, 0xC2, 0x28, 0x16, 0xF9, 0x10, 0x9D, 0xB2, 0x73, 0xED, 0x4E, - 0x88, 0xEB, 0xAB, 0xA8, 0x41, 0x35, 0x65, 0xD6, 0xB9, 0xE6, 0x18, 0xD8, 0xD4, 0x21, 0x37, 0x9E, - 0x91, 0x14, 0x81, 0xB8, 0x28, 0xBE, 0x0E, 0xB4, 0x42, 0x13, 0x9D, 0xE2, 0x41, 0x92, 0xA1, 0x0A, - 0xF4, 0x2A, 0xBA, 0xCB, 0x95, 0x87, 0x88, 0x2A, 0x4A, 0x43, 0xF5, 0xB9, 0x15, 0x0C, 0xD8, 0x28, - 0x00, 0x95, 0xB2, 0x6F, 0x7A, 0xBE, 0x90, 0x79, 0x56, 0x68, 0x25, 0xF0, 0x67, 0x1F, 0xA3, 0xBD, - 0xC8, 0x39, 0x5E, 0xD2, 0x2A, 0x90, 0x27, 0x51, 0x70, 0xF6, 0x25, 0xDA, 0x26, 0x50, 0xD6, 0xD3, - 0x8E, 0xCB, 0x79, 0xE7, 0x44, 0x02, 0x7F, 0x66, 0x95, 0x2F, 0x29, 0x76, 0x26, 0xF4, 0xA9, 0x4B, - 0x29, 0x08, 0x4C, 0x9E, 0x0D, 0xAD, 0x31, 0x49, 0x15, 0x3F, 0x1A, 0xDC, 0x69, 0xD3, 0xFE, 0xE2, - 0x0F, 0x52, 0x36, 0xAF, 0x6E, 0x40, 0xD6, 0x86, 0x67, 0x28, 0xFC, 0xB8, 0x2E, 0x1C, 0xCD, 0x77, - 0x6D, 0xE7, 0xFE, 0x34, 0xB4, 0xC1, 0x54, 0x5A, 0xD1, 0x9F, 0xEC, 0xAB, 0xAC, 0xB8, 0xC4, 0x57, - 0xC4, 0xA4, 0x52, 0x13, 0x79, 0x7E, 0xEE, 0x43, 0x49, 0xE9, 0x51, 0x3C, 0xD9, 0x09, 0x8B, 0x4F, - 0xC1, 0x29, 0x8D, 0xA2, 0xA4, 0x3C, 0xAB, 0x7D, 0x6E, 0x1B, 0x3E, 0x5E, 0xDF, 0xCB, 0x28, 0xBC, - 0x3B, 0x53, 0x8B, 0x99, 0xB2, 0x84, 0x43, 0xDF, 0x90, 0xD2, 0xE5, 0x63, 0x91, 0x2A, 0x0F, 0xD3, - 0x3C, 0x01, 0xDB, 0x81, 0xD3, 0x5C, 0x96, 0xD9, 0x93, 0x4A, 0x63, 0x78, 0x6B, 0xF3, 0x92, 0x2B, - 0xE2, 0xBD, 0x59, 0x7E, 0x04, 0x60, 0xF7, 0xD1, 0x17, 0x7C, 0xF4, 0x92, 0xCC, 0x5A, 0x72, 0x45, - 0xA5, 0xEC, 0x5A, 0x89, 0xA6, 0xD3, 0x37, 0x27, 0x01, 0xAF, 0x94, 0x65, 0xCB, 0x97, 0xCD, 0xD7, - 0xC9, 0xB4, 0x95, 0xB1, 0xA2, 0x27, 0xD8, 0xB6, 0x02, 0xD7, 0x02, 0x92, 0xBD, 0xE6, 0xF7, 0x17, - 0x2A, 0x6F, 0x64, 0xDB, 0xBC, 0x2B, 0x68, 0xDE, 0x9A, 0xCF, 0x5F, 0x27, 0x06, 0xA8, 0xB4, 0x14, - 0xF0, 0xC3, 0x07, 0x39, 0xDC, 0x3C, 0x89, 0xC4, 0x49, 0xAF, 0x17, 0x3F, 0xC2, 0x66, 0x7F, 0x05, - 0x3E, 0x04, 0xBB, 0xF6, 0xCD, 0x1D, 0x80, 0xF0, 0xC3, 0x67, 0x6B, 0xB6, 0x77, 0xF5, 0x5A, 0xFD, - 0x29, 0x36, 0x8D, 0x0C, 0xAD, 0x5F, 0xB3, 0xCC, 0x81, 0x0D, 0x60, 0xC7, 0x8B, 0xE5, 0xCC, 0x12, - 0xB1, 0xF3, 0xC4, 0x8B, 0x33, 0x04, 0x5D, 0x1C, 0x4E, 0x79, 0x94, 0xD1, 0x6C, 0x7E, 0x1E, 0xC9, - 0x1A, 0x7A, 0xAA, 0x7F, 0xBC, 0x9C, 0xA7, 0x31, 0x65, 0xD5, 0x52, 0x7E, 0x1F, 0x6D, 0xC8, 0x18, - 0x71, 0x57, 0x9C, 0x27, 0x41, 0x4E, 0x27, 0xAA, 0xF7, 0x00, 0x67, 0x08, 0xE8, 0x8D, 0xCC, 0xEC, - 0x33, 0x2C, 0x5A, 0x12, 0x25, 0x36, 0x05, 0x79, 0x75, 0x1C, 0xC9, 0xA9, 0xD2, 0x23, 0xF8, 0x4A, - 0x4D, 0x5D, 0xDB, 0xD4, 0x67, 0x31, 0x99, 0x2C, 0x5C, 0x48, 0xB8, 0xE1, 0x28, 0x94, 0x49, 0xF1, - 0x2B, 0x53, 0x16, 0x5A, 0xA8, 0x16, 0x77, 0x73, 0x36, 0x26, 0xC9, 0x13, 0x72, 0xC2, 0x3B, 0xE5, - 0x70, 0x8E, 0x8F, 0xB1, 0x60, 0x75, 0xAA, 0x59, 0x7C, 0x2A, 0xCF, 0x24, 0xEC, 0xD0, 0xDA, 0x23, - 0x1C, 0xC3, 0x43, 0x45, 0x33, 0x6D, 0xA9, 0x51, 0x01, 0xF6, 0x61, 0x18, 0x71, 0x9F, 0x6B, 0x58, - 0x4E, 0xDA, 0x47, 0xBD, 0x89, 0x8D, 0xB4, 0x47, 0xA6, 0x8C, 0xBB, 0xBE, 0x90, 0x05, 0xA1, 0xAE, - 0xE1, 0xA3, 0xC7, 0xD1, 0x76, 0xC1, 0xF1, 0x94, 0x22, 0xD4, 0xEC, 0x9B, 0xDC, 0x32, 0x18, 0x3A, - 0x80, 0xBF, 0x20, 0xAB, 0xC5, 0x6C, 0xF6, 0xE6, 0x65, 0x29, 0x00, 0x49, 0x6E, 0x29, 0xF3, 0xE5, - 0x9A, 0x77, 0x9F, 0xB8, 0x48, 0x30, 0xBE, 0xFC, 0xA5, 0xF5, 0x72, 0x71, 0xD6, 0x74, 0xF7, 0x8B, - 0xE5, 0xAB, 0x83, 0x44, 0xEF, 0xC8, 0x55, 0xBF, 0xB9, 0x06, 0xA5, 0x86, 0x76, 0xD8, 0xDD, 0x5E, - 0xAD, 0xB1, 0x5F, 0x6B, 0x1C, 0xE4, 0xE5, 0xA8, 0x12, 0x2E, 0xAD, 0x0F, 0xAE, 0xE7, 0x0C, 0xC8, - 0xA8, 0x16, 0xE7, 0x17, 0xB2, 0xDB, 0x8E, 0xFA, 0xEA, 0x54, 0xF3, 0x22, 0x52, 0x6A, 0x34, 0x2B, - 0x80, 0x90, 0x0F, 0xF0, 0x47, 0xBD, 0x9E, 0x0F, 0xE9, 0x15, 0x84, 0xA9, 0x24, 0xE6, 0xF1, 0x5E, - 0xBD, 0x4E, 0x66, 0x54, 0xE0, 0x41, 0xAA, 0xF3, 0xDC, 0xFA, 0xE5, 0xF4, 0xB9, 0xCD, 0x51, 0x33, - 0xF7, 0xDE, 0xFD, 0x4B, 0x0E, 0x4D, 0x53, 0xC1, 0x61, 0x29, 0x2E, 0x16, 0x79, 0x0F, 0xEC, 0x24, - 0x27, 0x4D, 0xEB, 0xF9, 0x05, 0xC2, 0x4B, 0xB0, 0x44, 0x4E, 0x45, 0x5D, 0xE2, 0xF5, 0x80, 0x98, - 0xE9, 0x23, 0x09, 0x9A, 0x41, 0x6F, 0x64, 0x8A, 0x10, 0x73, 0x2E, 0xE8, 0xB9, 0x63, 0xCB, 0x84, - 0xB8, 0x71, 0xD0, 0xA2, 0x00, 0xF5, 0x93, 0x66, 0x0A, 0xB4, 0x0D, 0xEC, 0xCE, 0x1F, 0x58, 0xBE, - 0xCC, 0x4E, 0x2F, 0xAF, 0xDF, 0x94, 0xF6, 0xE8, 0x59, 0x70, 0x69, 0x3D, 0x45, 0x0C, 0xC0, 0x47, - 0x03, 0xDB, 0x14, 0x6F, 0xFD, 0x31, 0x93, 0xED, 0x3D, 0x32, 0x29, 0x1D, 0x92, 0x95, 0x17, 0x04, - 0x6B, 0x1B, 0xC9, 0x90, 0x6A, 0x42, 0x51, 0x4A, 0x17, 0xB2, 0x66, 0x85, 0x0E, 0xDE, 0xCC, 0x1D, - 0x02, 0x1B, 0xC0, 0xEB, 0xB9, 0xCE, 0xD9, 0x73, 0xB9, 0x27, 0xCC, 0xAD, 0x32, 0x39, 0x41, 0x11, - 0xB8, 0xB2, 0x32, 0x06, 0x97, 0x79, 0xC8, 0x3D, 0x93, 0xC3, 0x46, 0x02, 0x3D, 0x8C, 0x25, 0xBA, - 0x02, 0x40, 0xFE, 0x94, 0xCB, 0xEA, 0xA8, 0x93, 0x48, 0x58, 0xBF, 0x84, 0xBD, 0xC3, 0x7C, 0xFA, - 0xF4, 0xB4, 0xF0, 0xDD, 0xF5, 0xB8, 0xBF, 0xE4, 0x1C, 0x17, 0x74, 0x77, 0x7D, 0xE3, 0xDC, 0x95, - 0x2C, 0xAD, 0xD0, 0xA8, 0xB4, 0xB0, 0x5C, 0x6F, 0xC9, 0xB2, 0x0C, 0xAD, 0xEB, 0xDB, 0xCE, 0xFA, - 0xDD, 0x7A, 0x77, 0x02, 0x75, 0xD1, 0x2C, 0x77, 0xCE, 0xB4, 0xB1, 0xEE, 0x9F, 0x43, 0xF7, 0xD3, - 0x94, 0xA9, 0x18, 0xA5, 0xFD, 0x5B, 0xE9, 0x8C, 0x14, 0xDD, 0xAD, 0x74, 0xE8, 0x6E, 0xE5, 0xAB, - 0x8D, 0x5F, 0x52, 0x71, 0xE5, 0xCD, 0xCD, 0x8A, 0xB2, 0x68, 0xDF, 0xEB, 0x28, 0x69, 0x1C, 0x66, - 0x71, 0x03, 0x50, 0x76, 0xDB, 0xEC, 0x0C, 0xD4, 0xEB, 0x55, 0xB8, 0x5E, 0x67, 0xE7, 0xAB, 0x5B, - 0xB8, 0x13, 0xB5, 0xC6, 0x46, 0xA6, 0xEE, 0x39, 0xB0, 0x48, 0x32, 0x24, 0x90, 0x62, 0x25, 0x88, - 0x01, 0xEF, 0x90, 0x41, 0x2F, 0x2C, 0x5F, 0x1F, 0xA5, 0xD0, 0xB1, 0x60, 0x8E, 0x09, 0xF3, 0xDD, - 0xA6, 0x96, 0x43, 0x4D, 0x80, 0x3C, 0xCB, 0x7D, 0x61, 0xB9, 0x4E, 0xCD, 0x20, 0xCB, 0xC1, 0x3C, - 0x30, 0x99, 0xDF, 0xAF, 0x23, 0xD3, 0x0E, 0x04, 0xF7, 0xA7, 0xB8, 0x35, 0xEF, 0xA7, 0xDC, 0x9A, - 0xDF, 0x4D, 0xB8, 0x35, 0x7F, 0xD1, 0x1E, 0x30, 0x2D, 0x63, 0xA6, 0x2C, 0x47, 0xC9, 0xA5, 0xB7, - 0x60, 0xA4, 0xED, 0xE7, 0x2A, 0x3F, 0xF9, 0x15, 0xAB, 0x94, 0x22, 0xCF, 0x82, 0x95, 0x23, 0x46, - 0xC9, 0xAC, 0xE6, 0xA8, 0xE8, 0xEB, 0x43, 0x93, 0xDF, 0x21, 0xF2, 0x59, 0x72, 0x63, 0x94, 0x93, - 0x23, 0xD7, 0xD0, 0x9D, 0xFA, 0x56, 0x95, 0x9A, 0x0C, 0xC6, 0xA9, 0x12, 0x2D, 0x13, 0x44, 0x2A, - 0x7C, 0xCF, 0x72, 0xE0, 0x07, 0x48, 0x78, 0x23, 0x69, 0xBC, 0xB6, 0x71, 0x4E, 0x3B, 0xA8, 0xAB, - 0x09, 0x53, 0x67, 0x7E, 0xE0, 0xDD, 0x71, 0x59, 0x59, 0x55, 0x83, 0xCE, 0x3C, 0xD4, 0xF5, 0xC2, - 0xEC, 0xC6, 0x98, 0x32, 0x11, 0x46, 0x8F, 0x3B, 0x6B, 0xEF, 0x03, 0xAC, 0xD5, 0x46, 0xD4, 0xD8, - 0x15, 0x8E, 0x00, 0x0F, 0xB1, 0x71, 0xF3, 0xE8, 0x68, 0xFC, 0xCD, 0xCB, 0x71, 0xE7, 0xCE, 0x99, - 0x6F, 0x99, 0x34, 0x26, 0x7F, 0x04, 0x6C, 0x41, 0x15, 0x28, 0x9A, 0x44, 0xDB, 0x5C, 0x06, 0x91, - 0xC9, 0x76, 0x4F, 0x0C, 0x92, 0x5E, 0x05, 0x75, 0xAA, 0xAC, 0xD0, 0xAB, 0xA0, 0xCF, 0x2B, 0x95, - 0x76, 0x9B, 0x28, 0x74, 0xA9, 0x04, 0x08, 0xB4, 0x94, 0xA4, 0x82, 0x24, 0x0D, 0x6A, 0x64, 0x88, - 0x43, 0xFA, 0x0C, 0xB9, 0xBF, 0xEE, 0x71, 0x0D, 0xA3, 0x2F, 0xA7, 0x91, 0x22, 0x7D, 0x87, 0xA4, - 0x28, 0xDD, 0xE8, 0x2C, 0x3A, 0x2B, 0x54, 0xE0, 0x8D, 0x26, 0xE9, 0x53, 0xD2, 0xE1, 0x0B, 0x27, - 0xB5, 0x25, 0xD2, 0x5A, 0x0A, 0x09, 0x0B, 0x50, 0x5B, 0xB2, 0xE5, 0x52, 0xE9, 0x8D, 0x24, 0x7E, - 0x67, 0x20, 0xF5, 0x5B, 0x35, 0x44, 0x4E, 0x9F, 0xAF, 0xF2, 0xE9, 0xCC, 0xD3, 0x03, 0xC6, 0xA8, - 0x3D, 0x61, 0xE7, 0x21, 0xA9, 0x8E, 0x54, 0x4E, 0xD4, 0x54, 0x8E, 0x25, 0xCA, 0xE4, 0x42, 0x2E, - 0xFC, 0x17, 0x5B, 0xDA, 0x35, 0x34, 0x9F, 0x7D, 0x09, 0xD1, 0xBD, 0x38, 0xFF, 0x15, 0x46, 0xAA, - 0x05, 0xBD, 0x87, 0xFC, 0x38, 0x96, 0x87, 0x55, 0xBF, 0x3C, 0x8F, 0x3C, 0x38, 0xA2, 0x3D, 0xB4, - 0xA8, 0x01, 0xB8, 0x16, 0x64, 0xAA, 0x4B, 0x98, 0xEB, 0x62, 0xDD, 0xA3, 0xAD, 0xAE, 0x8B, 0x1F, - 0xE9, 0xF6, 0x03, 0x1E, 0x3C, 0xB7, 0xE7, 0xDD, 0x99, 0xE5, 0xA0, 0x23, 0x1C, 0xD9, 0x3D, 0x02, - 0x8F, 0xAA, 0xDC, 0x21, 0xB3, 0xA5, 0xCB, 0x76, 0x9C, 0xA7, 0xAF, 0x38, 0xB0, 0x63, 0xF3, 0xDA, - 0x1F, 0x3A, 0x17, 0x7A, 0x23, 0x45, 0xC4, 0x8B, 0x4A, 0x8C, 0x7E, 0x72, 0xD3, 0x49, 0xA7, 0x41, - 0x87, 0x47, 0x2B, 0xC9, 0x6D, 0x1E, 0xD3, 0x41, 0x62, 0xB3, 0xC8, 0xEB, 0x04, 0xB2, 0xF8, 0xBB, - 0xB8, 0x78, 0x40, 0x2D, 0x22, 0xE4, 0x09, 0x06, 0xCE, 0xDA, 0x1A, 0xBB, 0xE1, 0x54, 0x7F, 0x11, - 0x0B, 0xD7, 0x3B, 0x3E, 0x15, 0x36, 0x94, 0xC6, 0x3A, 0x72, 0x8B, 0x6F, 0xD4, 0xEB, 0x07, 0xBB, - 0xF0, 0xE3, 0x30, 0x12, 0x10, 0x34, 0xC3, 0x90, 0xC5, 0xBD, 0xB0, 0x0F, 0x40, 0xE6, 0x17, 0x50, - 0x9B, 0x28, 0xB5, 0x47, 0x6B, 0x51, 0x98, 0x68, 0x3C, 0x1D, 0x4C, 0xF1, 0xEE, 0x01, 0x52, 0x95, - 0x92, 0x48, 0xA1, 0x9B, 0x5C, 0x5C, 0x45, 0x8D, 0xC5, 0xC2, 0xC1, 0xD8, 0x56, 0x9E, 0x4A, 0x44, - 0x4B, 0x60, 0x9C, 0x49, 0x84, 0x45, 0x5A, 0x0D, 0xF5, 0x44, 0x90, 0x45, 0xF3, 0xE2, 0x6F, 0xD2, - 0x94, 0x81, 0x36, 0x31, 0x53, 0xAD, 0xCB, 0x97, 0x09, 0xF4, 0xA1, 0xAF, 0x91, 0x66, 0x3F, 0xAA, - 0x5A, 0xA0, 0xB9, 0xC5, 0xCF, 0xA5, 0xF2, 0xDF, 0xBC, 0x3C, 0x38, 0xB7, 0x28, 0xF1, 0x14, 0x69, - 0x74, 0x0A, 0xFA, 0xE5, 0xBE, 0x42, 0x9A, 0x6C, 0xBB, 0xC6, 0xB1, 0xB9, 0xBD, 0x30, 0x5A, 0xE7, - 0x66, 0x6E, 0x4C, 0x18, 0x2B, 0x10, 0xA4, 0x3B, 0xD9, 0x65, 0xA5, 0x35, 0x0E, 0x0A, 0xEA, 0x78, - 0x8E, 0x70, 0x80, 0x4C, 0x0B, 0x9B, 0xDC, 0xA7, 0x74, 0x3B, 0x63, 0x05, 0x0B, 0x32, 0xC2, 0x77, - 0x3B, 0x9D, 0xD2, 0x26, 0xF8, 0xAB, 0xF3, 0xB2, 0x16, 0xF8, 0x5C, 0x61, 0x6B, 0xAB, 0xB6, 0xC0, - 0x9F, 0x45, 0xF1, 0x0B, 0x18, 0xFA, 0x85, 0xDC, 0xE8, 0x0C, 0x7B, 0x36, 0xF5, 0x78, 0x80, 0x98, - 0xAC, 0x4F, 0x4C, 0xE5, 0x67, 0x61, 0x93, 0x49, 0x05, 0xD9, 0x02, 0x18, 0x6E, 0xC7, 0xA3, 0xC8, - 0xAE, 0x9C, 0xFB, 0xEA, 0xB9, 0xCD, 0xBD, 0xC1, 0x23, 0xDB, 0x02, 0x20, 0x6D, 0x53, 0x78, 0x9A, - 0x08, 0x3C, 0x3B, 0xF6, 0x8E, 0xD3, 0xEF, 0xC7, 0x14, 0x68, 0x8C, 0x3B, 0xD3, 0x7C, 0x90, 0x12, - 0x35, 0xCF, 0x7A, 0x24, 0x8B, 0xED, 0xA7, 0xCB, 0x6E, 0xA2, 0x16, 0x30, 0x45, 0x9D, 0xC1, 0x6B, - 0xAF, 0x16, 0xFE, 0x28, 0x30, 0x40, 0xD3, 0x85, 0xE3, 0x3D, 0x2A, 0x18, 0xC6, 0x22, 0x1A, 0xE4, - 0xF3, 0x10, 0xB8, 0xFE, 0x2A, 0x4C, 0xFE, 0xE9, 0xB9, 0xE4, 0x11, 0x00, 0x17, 0x8B, 0xBC, 0xE9, - 0x55, 0xCB, 0xE3, 0x91, 0x7B, 0x78, 0x75, 0x84, 0x87, 0x20, 0x56, 0x67, 0xC5, 0x60, 0x1F, 0x4A, - 0xF2, 0x41, 0xBA, 0x89, 0x87, 0x17, 0x46, 0x74, 0xC8, 0x46, 0xC1, 0x96, 0x58, 0x31, 0xC6, 0xA4, - 0x3C, 0x76, 0x0E, 0xA8, 0x2E, 0x8E, 0xFE, 0x23, 0x6A, 0x51, 0x83, 0x93, 0xF8, 0x51, 0x59, 0x82, - 0x6C, 0xBC, 0x4C, 0xC1, 0x9B, 0xE0, 0x91, 0x66, 0x92, 0xBF, 0x0D, 0x59, 0x92, 0xA6, 0xC6, 0x3C, - 0x8C, 0xC7, 0x58, 0x62, 0x7C, 0xC3, 0xDA, 0x26, 0x7B, 0xC9, 0xF2, 0x95, 0x9F, 0xAD, 0x4D, 0xF7, - 0xD3, 0xF8, 0x54, 0x26, 0x6E, 0x21, 0x52, 0x9E, 0x69, 0x17, 0x6E, 0x9D, 0x14, 0x92, 0x26, 0x62, - 0x16, 0x6E, 0xE4, 0x46, 0x39, 0x21, 0xF5, 0xCC, 0xED, 0x78, 0x4C, 0x59, 0x59, 0x8A, 0x77, 0x78, - 0xBB, 0x9E, 0x1C, 0xF9, 0x09, 0xD7, 0xEB, 0x6F, 0xB2, 0x99, 0x06, 0xD5, 0xC6, 0x50, 0x85, 0xC3, - 0x79, 0x2F, 0x18, 0x7C, 0x27, 0x3F, 0xA4, 0x36, 0xFE, 0xC9, 0xF0, 0xEF, 0xF9, 0x8E, 0xAB, 0x0B, - 0xD0, 0x5E, 0x8B, 0x38, 0xF3, 0x21, 0xD8, 0xDB, 0xD2, 0xEC, 0x04, 0x73, 0x94, 0x7F, 0xC8, 0xAB, - 0x5C, 0x76, 0xE6, 0x04, 0x48, 0x97, 0xAB, 0x60, 0x5F, 0x89, 0x69, 0xAC, 0x9E, 0x77, 0x9D, 0x30, - 0x12, 0x4A, 0x99, 0x14, 0x5D, 0xA7, 0x2B, 0xA1, 0xCA, 0x36, 0x07, 0xBC, 0xCA, 0x08, 0x23, 0x0C, - 0xC9, 0xC9, 0x4F, 0x36, 0x01, 0x79, 0xDF, 0x06, 0xBA, 0xA7, 0x58, 0xC3, 0x2A, 0xFC, 0x21, 0xF9, - 0x8E, 0xFE, 0x08, 0x0C, 0xC0, 0xA7, 0x9A, 0x5C, 0xD2, 0xAF, 0x8F, 0xF0, 0x01, 0x65, 0xD6, 0xE2, - 0x71, 0x0B, 0x9B, 0x5B, 0x66, 0xE8, 0x1C, 0xE0, 0xE4, 0xD9, 0x84, 0x50, 0xCF, 0x17, 0x66, 0x40, - 0xB8, 0xA6, 0x26, 0x12, 0x46, 0x07, 0x2C, 0x38, 0xF4, 0xE0, 0x3C, 0xD5, 0x7D, 0xA1, 0xE0, 0x83, - 0x54, 0xE3, 0x37, 0x73, 0xBC, 0xEF, 0x72, 0xF8, 0x37, 0xA6, 0x40, 0x9E, 0x8A, 0x54, 0x88, 0xE0, - 0xB0, 0x4E, 0xB1, 0x0A, 0x29, 0x00, 0x2C, 0xA5, 0x76, 0xD1, 0x02, 0x25, 0x40, 0x35, 0xDB, 0xF6, - 0xE7, 0xB3, 0x0E, 0x08, 0x7E, 0x21, 0xB8, 0x03, 0xB4, 0xC3, 0xE2, 0xB3, 0x25, 0x33, 0xCD, 0xF8, - 0xE8, 0xF9, 0x8E, 0x60, 0x63, 0xA8, 0xBB, 0xE1, 0x34, 0xF1, 0xE0, 0x5D, 0x31, 0x87, 0x8D, 0x9B, - 0x05, 0x23, 0x68, 0x11, 0x9F, 0x45, 0xB5, 0x02, 0xD7, 0x51, 0x0B, 0x19, 0xA1, 0xCA, 0x7A, 0xC6, - 0xD0, 0xAD, 0xFA, 0x41, 0xA6, 0x17, 0x3A, 0x91, 0xC1, 0xDE, 0x3B, 0xAC, 0x7D, 0xDD, 0xDD, 0x61, - 0x9F, 0x40, 0x3F, 0xBA, 0x07, 0x4E, 0x8C, 0x32, 0x64, 0x37, 0xE8, 0x61, 0x4F, 0x5F, 0x34, 0xFF, - 0xC7, 0x06, 0xFB, 0x92, 0x64, 0xBB, 0xE7, 0x11, 0x28, 0x2E, 0x3B, 0xC9, 0x24, 0x79, 0x21, 0x20, - 0x97, 0x9D, 0x2C, 0x2F, 0x44, 0xB7, 0xCB, 0x4E, 0x22, 0x33, 0xFB, 0xC1, 0x84, 0x1D, 0xF0, 0x22, - 0xB5, 0x61, 0xCF, 0xE5, 0x17, 0x02, 0xD8, 0x86, 0x28, 0x45, 0x6E, 0x48, 0xEA, 0x74, 0x9D, 0x86, - 0x76, 0x64, 0xA1, 0x4B, 0x23, 0xD9, 0x4B, 0xCE, 0xAE, 0x77, 0xB0, 0xE0, 0xBC, 0x7A, 0x31, 0xC4, - 0xC8, 0x6D, 0xB7, 0x1B, 0xB7, 0x79, 0x1E, 0x7B, 0xDD, 0xC2, 0xA9, 0x02, 0x78, 0x52, 0x06, 0x59, - 0xC0, 0x1B, 0x9B, 0x40, 0x09, 0xB8, 0x90, 0x57, 0xE4, 0x2F, 0x8C, 0xFC, 0xF9, 0xC0, 0x96, 0xC2, - 0x7E, 0x68, 0xF4, 0x42, 0xD0, 0x5F, 0x9D, 0xC6, 0x19, 0x24, 0xA0, 0xDE, 0xDA, 0x04, 0x32, 0x08, - 0x17, 0xF4, 0x4A, 0x0A, 0x85, 0x49, 0x21, 0x3F, 0xE8, 0x52, 0xE4, 0xA0, 0x1A, 0xBE, 0x10, 0x92, - 0x90, 0x42, 0x69, 0x06, 0x45, 0xC4, 0x24, 0xD7, 0x4D, 0xA0, 0x0A, 0x5F, 0x4E, 0x77, 0x04, 0xD3, - 0x7D, 0xA5, 0x8C, 0xE2, 0x94, 0xA1, 0x50, 0xA2, 0x30, 0x61, 0xC8, 0x76, 0x6B, 0x78, 0xB3, 0x39, - 0x5F, 0x65, 0x79, 0x4A, 0x45, 0xA8, 0x70, 0xE9, 0x9F, 0x85, 0x70, 0x13, 0xA9, 0xB9, 0xA7, 0xD3, - 0x51, 0x84, 0xAF, 0x9F, 0x6F, 0x6F, 0x3B, 0x2C, 0x3B, 0x25, 0x77, 0xF1, 0x74, 0xDC, 0x93, 0x23, - 0x44, 0xAA, 0x26, 0x92, 0xCE, 0x51, 0x7D, 0x7D, 0x7D, 0x53, 0x8A, 0xD7, 0xC1, 0x3A, 0xA8, 0x2C, - 0xC6, 0xC9, 0x3B, 0x89, 0xFE, 0xD1, 0x5E, 0xE6, 0x72, 0x35, 0x4D, 0xB7, 0x5A, 0x5E, 0xED, 0xAB, - 0xA5, 0x22, 0xF0, 0x75, 0x31, 0xFC, 0xBD, 0x5E, 0x36, 0xFA, 0x5E, 0x4F, 0xC3, 0xDE, 0x46, 0x73, - 0xEF, 0x15, 0x7D, 0xB3, 0xD0, 0xF7, 0xBA, 0x0C, 0xF6, 0x5E, 0x2F, 0x1B, 0x79, 0x9F, 0xCA, 0x98, - 0x17, 0x7D, 0x1F, 0x7E, 0xAB, 0xBB, 0xAA, 0xFE, 0x56, 0x64, 0x97, 0x5A, 0x6D, 0x69, 0xB7, 0xC9, - 0x09, 0x14, 0xAB, 0x6A, 0x15, 0xB3, 0x8F, 0xAE, 0x51, 0xA9, 0xB7, 0x88, 0x7E, 0x37, 0xB6, 0xDC, - 0x5B, 0xC1, 0xB2, 0x51, 0xAB, 0x36, 0x6B, 0x02, 0xDA, 0xBC, 0x16, 0x90, 0xDA, 0x5C, 0x09, 0x3C, - 0x37, 0x17, 0x0F, 0xF7, 0xB9, 0xB0, 0x10, 0xAE, 0x1A, 0x2E, 0x5F, 0x0A, 0x5F, 0x2E, 0xBE, 0x0F, - 0x1D, 0x5F, 0x5C, 0x38, 0x1E, 0xA0, 0x96, 0x2A, 0x80, 0x59, 0x06, 0xE1, 0x3F, 0x3B, 0xE8, 0x3D, - 0xE3, 0x78, 0xD9, 0xD1, 0xA1, 0x11, 0xEB, 0x7F, 0x2E, 0xF5, 0x16, 0xD3, 0xB8, 0xA3, 0x53, 0x23, - 0x3A, 0xBF, 0xA9, 0x74, 0xC1, 0xD2, 0x2F, 0x97, 0x33, 0x04, 0x05, 0xBB, 0x1F, 0x9A, 0xFA, 0x90, - 0x3E, 0x52, 0xF5, 0x40, 0x59, 0x1C, 0x90, 0x72, 0x12, 0x86, 0x0E, 0x00, 0xC8, 0x6D, 0xC9, 0x03, - 0xA0, 0xF6, 0x4A, 0x71, 0xF9, 0x75, 0xDE, 0x49, 0x3C, 0x53, 0x67, 0xB5, 0xE0, 0x7E, 0x01, 0xEA, - 0x4B, 0x77, 0xF3, 0xAC, 0x4A, 0xF0, 0x62, 0x3C, 0x21, 0x50, 0x02, 0x7F, 0x6E, 0x27, 0x08, 0x5B, - 0xB8, 0x4B, 0xF2, 0x7F, 0x80, 0xD5, 0x95, 0x72, 0x7D, 0x18, 0xB7, 0x7B, 0xA2, 0xD7, 0xC3, 0x18, - 0xBC, 0x29, 0x87, 0x07, 0x5C, 0xF3, 0x3A, 0xF9, 0x3A, 0x8C, 0x57, 0xBC, 0x14, 0x37, 0x87, 0xA2, - 0x0A, 0xAB, 0x8D, 0x9A, 0x8A, 0x65, 0x9D, 0x3F, 0xB8, 0x00, 0x5B, 0x3B, 0x4B, 0x61, 0xC5, 0x57, - 0x59, 0xF8, 0xEE, 0xF1, 0x8A, 0xC3, 0x8B, 0x64, 0xBC, 0xB0, 0x74, 0xC1, 0x52, 0x21, 0x6F, 0x23, - 0xED, 0xC1, 0x1C, 0x05, 0xA3, 0x28, 0xF8, 0x02, 0x18, 0xB7, 0xB8, 0xE7, 0x20, 0x12, 0xFB, 0xD2, - 0xA7, 0x0F, 0xC4, 0xE3, 0x28, 0xFD, 0x44, 0x8D, 0x9D, 0xD7, 0x06, 0x35, 0x55, 0xFC, 0x48, 0xEA, - 0xC0, 0xC4, 0x9B, 0xF0, 0x5C, 0x38, 0x44, 0x5F, 0x53, 0x7F, 0xEC, 0x8F, 0x8A, 0x5D, 0x61, 0x00, - 0xF1, 0xFF, 0x3D, 0x64, 0x1F, 0xD9, 0xE1, 0xBE, 0xFF, 0xAA, 0x26, 0xCF, 0x62, 0xF8, 0x69, 0xFC, - 0xC9, 0xA5, 0x26, 0xA7, 0x1A, 0x6D, 0x98, 0x8D, 0x07, 0x67, 0xEF, 0x71, 0xDD, 0xC4, 0x54, 0xA2, - 0x59, 0xF4, 0x12, 0xBE, 0xB7, 0x06, 0xB4, 0xE2, 0x86, 0x73, 0x09, 0x05, 0x21, 0x95, 0xEC, 0x47, - 0xB7, 0x1C, 0xFD, 0xC7, 0x3C, 0xE2, 0xA8, 0x82, 0x64, 0x18, 0x91, 0xC7, 0xB8, 0x17, 0xA2, 0x0F, - 0xFC, 0xEE, 0x23, 0xFB, 0x8F, 0x46, 0xF0, 0x4A, 0x22, 0x73, 0x49, 0x24, 0xC2, 0x97, 0xDC, 0xF4, - 0x11, 0xB6, 0xD8, 0x3C, 0xE2, 0xB8, 0x71, 0x1C, 0xD1, 0xE6, 0x56, 0xE6, 0xBD, 0x30, 0xBE, 0xC7, - 0xE8, 0xC5, 0x35, 0xA0, 0x0E, 0xE1, 0x50, 0xC8, 0x00, 0x16, 0x14, 0xAF, 0x0A, 0xCF, 0x74, 0xB1, - 0x62, 0x82, 0xF6, 0x18, 0x3A, 0x00, 0x7B, 0x51, 0x04, 0x20, 0x51, 0x0B, 0x26, 0x27, 0x0F, 0xFC, - 0x98, 0x62, 0xFE, 0x7A, 0x0D, 0x30, 0x0F, 0xFB, 0xC7, 0x08, 0x91, 0x17, 0xFB, 0xA3, 0x16, 0x1B, - 0x8A, 0xFD, 0x20, 0xAF, 0xCA, 0x54, 0xD3, 0xB9, 0x48, 0x20, 0x7A, 0x7B, 0x8D, 0x24, 0x2A, 0x8E, - 0x40, 0x06, 0xBC, 0xB7, 0x40, 0x98, 0xBE, 0xE3, 0x79, 0xE9, 0xA0, 0x51, 0xAF, 0xBF, 0x92, 0x42, - 0x26, 0x29, 0x8C, 0xB1, 0xA3, 0x10, 0x3D, 0x44, 0xCD, 0x36, 0x90, 0x28, 0x42, 0xBC, 0xB9, 0x34, - 0xB2, 0x28, 0x22, 0xC2, 0xB0, 0xCB, 0xF6, 0xB3, 0x90, 0x83, 0x8E, 0x39, 0x0E, 0x29, 0x84, 0xCC, - 0xEC, 0x9B, 0x8A, 0x28, 0x52, 0x68, 0x1F, 0x43, 0xF8, 0x4F, 0x9D, 0xEE, 0x38, 0xE7, 0x10, 0x9A, - 0xCC, 0x86, 0x9A, 0xA7, 0xE9, 0xA0, 0x41, 0xFC, 0x71, 0xE5, 0xA1, 0x0C, 0x0B, 0x51, 0x0A, 0x1B, - 0x72, 0x53, 0xC0, 0xB8, 0xCD, 0x0A, 0x6F, 0xD5, 0xCA, 0x99, 0x7A, 0x30, 0xB7, 0x0F, 0xFB, 0xA2, - 0xD9, 0xA0, 0x75, 0x7A, 0x8B, 0x35, 0xF6, 0x38, 0xB6, 0x1E, 0x65, 0x90, 0xC6, 0x51, 0xAE, 0x4C, - 0x9F, 0x3C, 0xFA, 0xA5, 0x9B, 0xB8, 0xC5, 0xD5, 0xA0, 0x95, 0x72, 0x15, 0x38, 0xE6, 0xD8, 0x7B, - 0xD2, 0xA6, 0xA1, 0x19, 0x66, 0xA0, 0x8B, 0xF8, 0x1C, 0xA6, 0x1A, 0x82, 0xA6, 0x8E, 0x31, 0xC3, - 0x38, 0x94, 0xE8, 0x2D, 0xBF, 0x29, 0x28, 0x01, 0x7E, 0x65, 0x05, 0x8A, 0x01, 0x67, 0xAD, 0xAC, - 0x41, 0xF1, 0x25, 0x2E, 0xCC, 0x1E, 0x94, 0x37, 0x5D, 0x75, 0xB7, 0xCD, 0xBA, 0xE6, 0xEF, 0x3C, - 0xAA, 0x80, 0xE9, 0x1B, 0xF8, 0x71, 0x76, 0x46, 0xAA, 0x3A, 0xFB, 0x72, 0x8A, 0x14, 0xC6, 0x76, - 0xD9, 0x85, 0xC7, 0xE3, 0xED, 0xF0, 0x63, 0xD7, 0x05, 0xB6, 0x3B, 0x9F, 0xD7, 0x66, 0x75, 0x5C, - 0xFC, 0x22, 0x91, 0xF2, 0xE8, 0xA7, 0x77, 0xF8, 0x16, 0x1F, 0xCE, 0x3B, 0x9C, 0x84, 0xA7, 0x60, - 0xF4, 0xD6, 0xE2, 0x7D, 0xF1, 0x36, 0x83, 0x07, 0x89, 0x61, 0x0B, 0x33, 0x75, 0x7D, 0xD8, 0x85, - 0x3F, 0x32, 0xDF, 0x44, 0x08, 0xE6, 0x79, 0xD3, 0x68, 0x25, 0x98, 0xE6, 0xF8, 0x6E, 0x3B, 0x5C, - 0x4B, 0x97, 0xD2, 0x0F, 0x9C, 0x58, 0x56, 0x65, 0xE6, 0xBD, 0x78, 0xC1, 0xC2, 0x61, 0x31, 0x00, - 0x11, 0x39, 0xE3, 0x55, 0x37, 0x4C, 0x75, 0x5E, 0x1C, 0xD0, 0xAE, 0xF0, 0x16, 0x07, 0x46, 0x83, - 0x52, 0x9A, 0x9D, 0x3F, 0x50, 0x64, 0xF5, 0xAF, 0xE1, 0xBD, 0xEF, 0xAF, 0xF5, 0x9A, 0x78, 0x10, - 0xF3, 0xE7, 0x11, 0xB6, 0x3F, 0x20, 0x3C, 0xC9, 0xF3, 0xE6, 0x0C, 0xE0, 0xCA, 0x3C, 0x17, 0x08, - 0x89, 0xCB, 0xB6, 0x04, 0xF5, 0xEC, 0x29, 0xE5, 0x03, 0xEF, 0x8C, 0xBD, 0x61, 0x71, 0x86, 0x93, - 0xA7, 0x6A, 0xD9, 0xB3, 0xED, 0x43, 0xB3, 0xD9, 0xA8, 0xEF, 0x35, 0x7E, 0xAD, 0x37, 0xEB, 0x8D, - 0xFA, 0xA1, 0x4C, 0x36, 0x97, 0x07, 0xC0, 0xD0, 0x8C, 0xFD, 0x65, 0x99, 0x9B, 0x31, 0x31, 0xAF, - 0x3F, 0xDC, 0x7E, 0x34, 0xEB, 0xEF, 0xF3, 0xEF, 0xC7, 0x7E, 0xFD, 0x68, 0x55, 0xFB, 0xA1, 0xE6, - 0xB5, 0x11, 0xFB, 0x01, 0xDF, 0xE0, 0x61, 0xD0, 0x9A, 0x73, 0x7A, 0xE4, 0xDA, 0x48, 0x79, 0x96, - 0xE6, 0xD8, 0xCA, 0xF9, 0xD7, 0x72, 0x95, 0xB1, 0x04, 0x17, 0x03, 0x40, 0x1B, 0x8B, 0x73, 0x12, - 0x3B, 0x96, 0x7F, 0xE5, 0xCB, 0x29, 0x98, 0x73, 0xAF, 0x17, 0xF9, 0x56, 0x99, 0xB5, 0x81, 0x18, - 0x85, 0x55, 0x0D, 0x68, 0x75, 0xEA, 0xEF, 0x45, 0xAC, 0x2F, 0xC7, 0x96, 0xCF, 0xF6, 0x91, 0xCB, - 0x76, 0x76, 0xCB, 0x5F, 0xBB, 0x63, 0x66, 0xDD, 0x0E, 0xFC, 0xBB, 0x31, 0x3E, 0xCF, 0x1B, 0xF1, - 0x42, 0x1D, 0xB2, 0x86, 0x05, 0x0A, 0x7F, 0x19, 0x05, 0x3A, 0x64, 0x49, 0x88, 0x37, 0x85, 0x15, - 0xB9, 0xE9, 0x65, 0x61, 0xDC, 0x29, 0x85, 0x60, 0xEA, 0xB1, 0x3A, 0x30, 0x99, 0x35, 0x5E, 0xE6, - 0x97, 0x59, 0x51, 0xE2, 0xA0, 0x5C, 0x1C, 0x16, 0x6B, 0x08, 0xFC, 0x59, 0x55, 0xAA, 0x4A, 0x66, - 0x13, 0xB0, 0x8D, 0x94, 0x3E, 0x95, 0x7C, 0x7B, 0xE8, 0xCD, 0x96, 0xBF, 0xA7, 0xDB, 0x2B, 0xA6, - 0x55, 0x18, 0x4A, 0xE9, 0xBE, 0x98, 0x2D, 0xC9, 0x07, 0x85, 0x00, 0xFE, 0x6E, 0x90, 0xB9, 0xA2, - 0xD1, 0x0C, 0x1F, 0xD5, 0xE7, 0x25, 0xEC, 0x9B, 0x93, 0xAE, 0x54, 0xBB, 0xE3, 0xA7, 0xC2, 0x9E, - 0xD0, 0xD2, 0x64, 0xAE, 0xB8, 0x24, 0x29, 0xE1, 0xBB, 0xF2, 0xBE, 0x98, 0x52, 0x8F, 0xC2, 0xA7, - 0x99, 0xB8, 0x92, 0xBA, 0xFE, 0x9E, 0x30, 0x2E, 0x60, 0x57, 0x68, 0x48, 0x68, 0x44, 0x86, 0x84, - 0xF9, 0x84, 0x18, 0x4A, 0xF7, 0x72, 0xB6, 0x65, 0xB4, 0xEE, 0x64, 0x0F, 0x61, 0x9E, 0x95, 0x22, - 0xD9, 0x57, 0x66, 0xB9, 0x60, 0xE4, 0xD8, 0x36, 0xB9, 0x55, 0x85, 0x37, 0x07, 0x4B, 0x96, 0x4F, - 0xDB, 0x1C, 0x27, 0x10, 0x38, 0xDD, 0xA9, 0x9B, 0x84, 0x6D, 0xC6, 0x9B, 0x74, 0x8E, 0x45, 0xCF, - 0x41, 0xE9, 0x9D, 0xB9, 0x51, 0x94, 0xF1, 0x64, 0x72, 0x7F, 0x3C, 0x3E, 0x72, 0xEE, 0x94, 0xDD, - 0x27, 0x1A, 0xA5, 0xC4, 0x86, 0xA9, 0x15, 0x4C, 0xDB, 0xB0, 0x1C, 0xA9, 0x6E, 0xDC, 0xD6, 0xFF, - 0xB4, 0x7B, 0xBE, 0xFB, 0xE7, 0xBC, 0xDB, 0x91, 0x7A, 0x94, 0xFE, 0xE8, 0xEB, 0x9E, 0xE9, 0x0A, - 0xE6, 0x7B, 0x3A, 0xE0, 0x81, 0xA7, 0xEF, 0x62, 0xDA, 0xA6, 0xDA, 0xDF, 0x68, 0x06, 0xF2, 0x2B, - 0xF9, 0x6E, 0xAC, 0xD9, 0x87, 0xF8, 0x73, 0x12, 0x21, 0x1C, 0x9B, 0xAA, 0xC3, 0x3A, 0x98, 0x12, - 0xDC, 0x67, 0x1F, 0x99, 0xE1, 0xE8, 0x01, 0xDA, 0xF7, 0x6A, 0xBF, 0x05, 0xDC, 0x7B, 0x94, 0x8A, - 0x92, 0xE3, 0x81, 0xAA, 0xB4, 0xF5, 0xB6, 0x26, 0xC4, 0xDB, 0xED, 0xA8, 0x65, 0xD8, 0xA6, 0x06, - 0xE2, 0xC7, 0xB9, 0xA6, 0x0F, 0xB7, 0x04, 0xFB, 0xD8, 0x62, 0xFF, 0x96, 0x98, 0x3F, 0x26, 0xC7, - 0xED, 0x39, 0x8E, 0xF0, 0x85, 0xA7, 0xB9, 0xB5, 0x5B, 0xD9, 0x62, 0x4B, 0x8C, 0x3B, 0xF9, 0xF7, - 0x6D, 0x35, 0xC3, 0x70, 0x5E, 0xB0, 0x09, 0xA0, 0x81, 0x03, 0xEF, 0xF9, 0xB0, 0x3B, 0x14, 0x23, - 0xAB, 0xF5, 0xFF, 0x01, 0x31, 0xC1, 0xD0, 0x4B, 0xE3, 0xB6, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x10, 0x60, 0x04, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0x4A, + 0x92, 0xE0, 0xFB, 0x46, 0xEC, 0x3F, 0xD4, 0x70, 0x76, 0xD6, 0xD2, 0xB4, 0x48, 0x91, 0xD4, 0xC5, + 0xB2, 0xDA, 0x66, 0x84, 0x24, 0x4A, 0xB6, 0xA2, 0x65, 0x99, 0x2B, 0xCA, 0x7D, 0xCE, 0xF1, 0xC6, + 0xEE, 0x09, 0x10, 0x28, 0x92, 0x68, 0x83, 0x00, 0x0E, 0x50, 0xD0, 0xC5, 0x13, 0x33, 0xD1, 0x9F, + 0x31, 0xFB, 0x21, 0xFB, 0x03, 0xFB, 0x29, 0xFD, 0x25, 0x9B, 0x99, 0x55, 0x00, 0x01, 0xF0, 0x82, + 0x8B, 0x48, 0x8A, 0x94, 0x75, 0x3A, 0x5A, 0x26, 0x09, 0xD4, 0x2D, 0x2B, 0x33, 0x2B, 0x33, 0x2B, + 0x2F, 0xEF, 0xFF, 0xA9, 0xFD, 0xE5, 0xEC, 0xF6, 0xB7, 0xCE, 0x39, 0x1B, 0x8A, 0x91, 0xD5, 0xFA, + 0xAF, 0xFF, 0xE5, 0x3D, 0xFE, 0xCB, 0x2C, 0xCD, 0x1E, 0x7C, 0xA8, 0x70, 0xBB, 0x02, 0xBF, 0xE0, + 0x6F, 0x5C, 0x33, 0xE0, 0x13, 0x83, 0xFF, 0xDE, 0x8F, 0xB8, 0xD0, 0x98, 0x3E, 0xD4, 0x3C, 0x9F, + 0x8B, 0x0F, 0x95, 0x40, 0xF4, 0xAB, 0x47, 0x15, 0xB6, 0x9B, 0x78, 0x3A, 0x14, 0xC2, 0xAD, 0xF2, + 0x3F, 0x02, 0xF3, 0xEE, 0x43, 0xE5, 0xD7, 0xEA, 0xD7, 0x93, 0xEA, 0x99, 0x33, 0x72, 0x35, 0x61, + 0xF6, 0x2C, 0x5E, 0x61, 0xBA, 0x63, 0x0B, 0x6E, 0x43, 0xD3, 0xCB, 0xF3, 0x0F, 0xDC, 0x18, 0xF0, + 0x1D, 0x7D, 0xE8, 0x39, 0x23, 0xFE, 0xA1, 0x11, 0xEB, 0x45, 0x98, 0xC2, 0xE2, 0xAD, 0xAE, 0xAB, + 0x79, 0xDF, 0x2F, 0x02, 0x9B, 0xDD, 0xDC, 0xFE, 0x85, 0x75, 0xB9, 0x08, 0xDC, 0xF7, 0xBB, 0xF2, + 0x49, 0x7C, 0x30, 0x5B, 0x83, 0xC6, 0x95, 0x3B, 0x93, 0xDF, 0xBB, 0x8E, 0x27, 0x2A, 0xF2, 0x11, + 0xFE, 0x17, 0x0D, 0x74, 0x6F, 0x1A, 0x62, 0xF8, 0xC1, 0xE0, 0x77, 0xA6, 0xCE, 0xAB, 0xF4, 0x65, + 0x87, 0x99, 0xB6, 0x29, 0x4C, 0xCD, 0xAA, 0xFA, 0xBA, 0x66, 0xC1, 0xD8, 0x3B, 0x6C, 0xA4, 0x3D, + 0x98, 0xA3, 0x60, 0x34, 0xFE, 0x21, 0xF0, 0xB9, 0x47, 0xDF, 0x34, 0x98, 0xF6, 0x87, 0xFA, 0x0E, + 0xF3, 0x87, 0x9E, 0x69, 0x7F, 0xAF, 0x0A, 0xA7, 0xDA, 0x37, 0xC5, 0x87, 0x47, 0xEE, 0xC7, 0x26, + 0x6C, 0xC1, 0x13, 0xE6, 0x71, 0xEB, 0x43, 0xC5, 0x17, 0x8F, 0x16, 0xF7, 0x87, 0x9C, 0x8B, 0x0A, + 0x1B, 0x7A, 0xBC, 0x0F, 0xBF, 0x78, 0xFA, 0x6E, 0xCF, 0x71, 0x84, 0x2F, 0x3C, 0xCD, 0xAD, 0x8D, + 0x4C, 0xBB, 0xA6, 0xFB, 0x7E, 0x25, 0x6F, 0x4B, 0xFA, 0x35, 0xD1, 0xC2, 0xD7, 0x3D, 0xD3, 0x15, + 0x0C, 0x1E, 0xCA, 0x37, 0xFE, 0xF6, 0x47, 0xC0, 0xBD, 0xC7, 0xEA, 0x5E, 0xED, 0xB0, 0x56, 0xA7, + 0xEE, 0xFF, 0x06, 0xEF, 0xBE, 0xDF, 0x95, 0xAF, 0xCD, 0x6A, 0x94, 0x9C, 0x50, 0xB1, 0x16, 0xBD, + 0xC0, 0x36, 0x60, 0x4E, 0x53, 0x1A, 0x26, 0x9A, 0xB6, 0xC6, 0x5B, 0xF1, 0xDF, 0xB6, 0x0C, 0x47, + 0x0F, 0x46, 0xB0, 0x1B, 0xDB, 0x35, 0xC7, 0xDE, 0x7A, 0xA3, 0x5B, 0xA6, 0xFE, 0xFD, 0xCD, 0x0E, + 0x7B, 0x53, 0x13, 0xCE, 0x60, 0x60, 0xF1, 0x6A, 0x4F, 0xD8, 0xF0, 0xB5, 0x1F, 0xD8, 0xBA, 0x30, + 0x1D, 0x9B, 0x6D, 0xF1, 0x6D, 0xF6, 0x6F, 0xE3, 0xE6, 0xB2, 0x0B, 0x80, 0x42, 0xE0, 0x79, 0xD0, + 0xC7, 0xAD, 0xE6, 0x0D, 0xB8, 0xA8, 0xE9, 0x43, 0xD3, 0x32, 0xE0, 0xFB, 0xFF, 0xAC, 0xFF, 0xAF, + 0x6D, 0xD5, 0xCF, 0x99, 0xA5, 0xF9, 0xFE, 0xD6, 0x1B, 0x13, 0xB6, 0xBE, 0xAA, 0x6B, 0x1E, 0x17, + 0x55, 0xC3, 0xB9, 0xB7, 0x59, 0xEC, 0x7B, 0xE0, 0xBE, 0xD9, 0xFE, 0xF3, 0xB8, 0xE7, 0x7F, 0xDF, + 0x56, 0x53, 0x9E, 0x5C, 0x03, 0xC2, 0x3D, 0xB6, 0x84, 0x9A, 0x2F, 0x00, 0x83, 0xF5, 0xEA, 0xC0, + 0x73, 0x02, 0x37, 0x3D, 0xB9, 0x21, 0x37, 0x07, 0x43, 0x71, 0xCC, 0xEA, 0x7F, 0x4E, 0xFE, 0xEE, + 0xDC, 0x71, 0xAF, 0x6F, 0x39, 0xF7, 0xC7, 0x6C, 0x68, 0x1A, 0x06, 0xB7, 0x53, 0x8F, 0x01, 0x9A, + 0xB6, 0x6F, 0xE2, 0x8A, 0x8F, 0x55, 0x17, 0xAC, 0x5E, 0xDB, 0xF7, 0x19, 0xD7, 0x7C, 0x9E, 0x7A, + 0xB5, 0xE7, 0x78, 0x06, 0xE0, 0x63, 0xCF, 0x11, 0xC2, 0x19, 0x1D, 0x33, 0xDF, 0xB1, 0x4C, 0x83, + 0x35, 0xDC, 0x07, 0xF6, 0xCF, 0x7A, 0x1D, 0xFF, 0x17, 0x5F, 0x53, 0xB8, 0x06, 0x9A, 0xB6, 0x65, + 0xFA, 0x62, 0x03, 0x26, 0x8D, 0xFF, 0xB9, 0x9A, 0x61, 0x98, 0xF6, 0xA0, 0xEA, 0xC9, 0x79, 0x1D, + 0xD4, 0xDD, 0x87, 0x99, 0xCB, 0x92, 0x5D, 0x03, 0xBD, 0xF8, 0x4C, 0x18, 0x3B, 0x33, 0x1E, 0x0C, + 0xD3, 0x4B, 0x96, 0x0F, 0x8F, 0x99, 0xED, 0xD8, 0xE9, 0xB9, 0x8E, 0x00, 0xA9, 0x4C, 0xBB, 0x6A, + 0xF1, 0x3E, 0x82, 0x64, 0xF6, 0xC8, 0xBD, 0x00, 0x16, 0x63, 0x1F, 0xF7, 0x01, 0x9F, 0xFD, 0x74, + 0xF7, 0x4E, 0x20, 0x80, 0x9C, 0x79, 0x12, 0xA4, 0xC9, 0x79, 0x9B, 0x36, 0xBE, 0x71, 0xEE, 0x79, + 0x8E, 0x97, 0x6E, 0x6D, 0x98, 0xBE, 0x6B, 0x69, 0x8F, 0xC7, 0x4C, 0xBE, 0x93, 0x9A, 0x9F, 0xEE, + 0x58, 0x0E, 0xCC, 0xDC, 0xE3, 0x46, 0xEA, 0x41, 0x1F, 0xD8, 0x5C, 0xD5, 0x37, 0x7F, 0xC0, 0xB0, + 0xFE, 0x48, 0xB3, 0x2C, 0xEE, 0x65, 0x0C, 0xDE, 0x0D, 0x74, 0x1D, 0xC1, 0x53, 0x66, 0xF8, 0x81, + 0xC7, 0x27, 0x10, 0x62, 0xEE, 0x04, 0xA2, 0x17, 0xEE, 0x15, 0xB6, 0xF5, 0x1C, 0xCB, 0x98, 0xB3, + 0xAB, 0x0F, 0x55, 0xEA, 0x23, 0x3D, 0xB9, 0x39, 0xBB, 0x83, 0xFF, 0x11, 0x53, 0x3F, 0x66, 0x7B, + 0xF5, 0x7F, 0x99, 0xDB, 0xB5, 0xEC, 0xA5, 0x59, 0x9F, 0xDB, 0x7B, 0x73, 0x3E, 0xDA, 0x85, 0xBD, + 0xEC, 0xCF, 0xEF, 0x65, 0x7F, 0x6E, 0x2F, 0x9A, 0x10, 0xC0, 0xB2, 0xD3, 0x1D, 0xB8, 0x4E, 0x48, + 0x57, 0x5A, 0x0F, 0x68, 0x25, 0x10, 0xE9, 0x4D, 0xF8, 0x51, 0x35, 0x6D, 0x83, 0x3F, 0x1C, 0xB3, + 0x46, 0xBD, 0x9E, 0x26, 0x1E, 0x45, 0x34, 0x8D, 0x49, 0xE0, 0xC0, 0xC9, 0x56, 0x55, 0x00, 0x3A, + 0xAC, 0x4F, 0x7B, 0x4C, 0xD3, 0x16, 0x8E, 0x0B, 0x24, 0x97, 0x9E, 0xB4, 0xE2, 0x8D, 0x8A, 0x17, + 0xBE, 0xDF, 0x55, 0x82, 0x00, 0x7C, 0xEC, 0x39, 0xC6, 0x63, 0x78, 0x54, 0x18, 0xE6, 0x1D, 0xD3, + 0x91, 0xF5, 0x7E, 0xA8, 0xE0, 0xA1, 0xAB, 0x01, 0xFA, 0x78, 0x15, 0x66, 0x1A, 0x1F, 0x2A, 0x6A, + 0xA5, 0x97, 0xF0, 0x73, 0x25, 0xC6, 0x4C, 0xA9, 0x85, 0x66, 0x99, 0x03, 0xFB, 0x43, 0x85, 0x26, + 0x5E, 0x09, 0xDB, 0xAB, 0x06, 0xF1, 0x97, 0xA9, 0x81, 0x39, 0x1A, 0xA4, 0x3B, 0xBC, 0x30, 0x2D, + 0x7E, 0x0D, 0x87, 0x7F, 0x65, 0x7C, 0x46, 0x9D, 0xCA, 0xA7, 0xCD, 0xDF, 0xCF, 0x86, 0xB4, 0xAA, + 0x41, 0xCD, 0xB5, 0x07, 0x15, 0x18, 0x09, 0xA4, 0x00, 0xF5, 0x8C, 0x59, 0xFC, 0x8E, 0x5B, 0x95, + 0x16, 0x70, 0x78, 0x57, 0xB3, 0xE3, 0x7D, 0x76, 0xB8, 0xA7, 0xC3, 0xE9, 0x52, 0x49, 0x8E, 0x4C, + 0xC8, 0x2F, 0xE7, 0x46, 0x98, 0x09, 0xA3, 0x21, 0x34, 0x3E, 0x54, 0x42, 0x7A, 0x51, 0xE4, 0x52, + 0x69, 0xFD, 0xE9, 0xF0, 0x2D, 0x80, 0x0A, 0x3A, 0x8D, 0x2F, 0x74, 0x17, 0x56, 0x1A, 0x82, 0x49, + 0x7D, 0x9E, 0x0B, 0xB4, 0x54, 0xE7, 0xC4, 0xA8, 0xE2, 0x5B, 0x44, 0xD8, 0x39, 0xDE, 0x51, 0xB9, + 0xA1, 0x12, 0xD6, 0x1E, 0x07, 0x89, 0xEC, 0xD2, 0xEE, 0x78, 0x0E, 0x92, 0x77, 0x02, 0xDC, 0xBD, + 0xD6, 0x0D, 0x3E, 0x14, 0x00, 0x91, 0xF7, 0xBB, 0xBD, 0xD6, 0xFB, 0x9E, 0x47, 0xFF, 0x47, 0xB9, + 0x4A, 0x8A, 0x45, 0xCC, 0xF4, 0x81, 0xB5, 0xE0, 0x11, 0x8F, 0x40, 0x63, 0x1D, 0x0B, 0xB9, 0x39, + 0xBB, 0xD7, 0x4C, 0x51, 0xAB, 0xD5, 0x56, 0x38, 0x7D, 0x14, 0x14, 0x2D, 0x2E, 0xF8, 0xB4, 0xD9, + 0xB3, 0x36, 0xF4, 0x36, 0x63, 0xFA, 0x43, 0xCD, 0x07, 0xA6, 0x7E, 0xCF, 0xA8, 0x93, 0x15, 0x4D, + 0xB8, 0x6F, 0x7A, 0xA3, 0x7B, 0x10, 0x2A, 0xBE, 0xBA, 0x96, 0xA3, 0x19, 0x33, 0x66, 0x9E, 0x9E, + 0xF3, 0x85, 0x6A, 0xC4, 0x02, 0xD7, 0xD0, 0x04, 0x07, 0xBE, 0x2A, 0x9B, 0xD5, 0x58, 0x72, 0x33, + 0xE4, 0x62, 0xC2, 0x0D, 0xC9, 0xBF, 0xA0, 0x56, 0x9C, 0xD1, 0xC4, 0xC9, 0x0C, 0x51, 0x1B, 0x17, + 0x1C, 0xB5, 0x00, 0xD9, 0x77, 0x54, 0x6D, 0x34, 0x41, 0x7E, 0x43, 0xDA, 0x8A, 0x48, 0xC8, 0x13, + 0xDF, 0xAB, 0x3E, 0xCA, 0xDA, 0x31, 0xD2, 0x49, 0x08, 0xE2, 0xBF, 0x98, 0x17, 0xA6, 0x94, 0xC6, + 0x51, 0xF4, 0x4B, 0xCC, 0xA8, 0x00, 0xC0, 0x63, 0x20, 0x6E, 0xCC, 0x06, 0xF1, 0x08, 0x1A, 0x75, + 0xB4, 0x01, 0xCF, 0xBD, 0x2C, 0xCF, 0xB9, 0x9F, 0xD8, 0xD3, 0x9E, 0xE5, 0xE8, 0xDF, 0xFF, 0x9C, + 0xEC, 0x22, 0xA3, 0x1B, 0x79, 0x06, 0x21, 0x27, 0x4F, 0x33, 0x22, 0xFC, 0x0F, 0xA1, 0x10, 0xEE, + 0xE3, 0x71, 0x8C, 0x8F, 0x00, 0xE8, 0xC2, 0x9F, 0xFF, 0xCA, 0x3D, 0x1F, 0x38, 0xF9, 0x6C, 0x66, + 0x71, 0x57, 0xAF, 0xD5, 0x15, 0xB7, 0x40, 0xB4, 0x98, 0x1C, 0x64, 0xDC, 0xED, 0x0F, 0x6E, 0xE4, + 0xEE, 0xF6, 0xDB, 0x79, 0xBB, 0x7A, 0xF1, 0xAE, 0x13, 0x9B, 0x5E, 0x6C, 0x20, 0x96, 0x35, 0x92, + 0x44, 0xBF, 0xD3, 0xDB, 0xCB, 0xF6, 0xEC, 0x11, 0xDA, 0x12, 0x45, 0x4F, 0xAD, 0x80, 0x0B, 0xC0, + 0xCE, 0x21, 0xBB, 0x6C, 0xC3, 0x89, 0x0C, 0xFF, 0xE5, 0x1D, 0x44, 0x77, 0x40, 0x08, 0x33, 0x6D, + 0x40, 0x7E, 0xFF, 0xEA, 0xEA, 0xD3, 0xEC, 0x81, 0xAE, 0xAE, 0x86, 0xC7, 0x93, 0xFD, 0x24, 0xFB, + 0x1A, 0x70, 0xC7, 0xE0, 0x20, 0x95, 0x5F, 0x69, 0x62, 0x76, 0x47, 0xFB, 0x00, 0x81, 0x77, 0xF5, + 0xE6, 0xBB, 0xFD, 0xB7, 0xEF, 0xD4, 0x1C, 0x77, 0x72, 0xF7, 0x3B, 0x0F, 0xD6, 0xD5, 0x46, 0xFD, + 0xA0, 0xD6, 0x38, 0x3A, 0xA8, 0x1F, 0xBC, 0x3D, 0x6C, 0x14, 0xED, 0xF9, 0xC4, 0x9A, 0x33, 0xE3, + 0xC6, 0xC1, 0x21, 0xCC, 0xF9, 0x28, 0x9C, 0x2E, 0xDB, 0x3A, 0xE9, 0x9C, 0x6D, 0x4F, 0x81, 0x69, + 0x3E, 0xFC, 0x89, 0x01, 0xFC, 0xFC, 0xEC, 0xFC, 0x62, 0xF6, 0xB0, 0xF8, 0x34, 0x13, 0xE4, 0x5C, + 0xE7, 0xFD, 0x5F, 0xE7, 0x01, 0xA5, 0x79, 0x54, 0x6F, 0xD6, 0x0F, 0x6B, 0x07, 0x87, 0x47, 0x79, + 0x61, 0x82, 0x5D, 0xFE, 0x36, 0xA7, 0xCB, 0xFD, 0xB7, 0x8D, 0xC3, 0xA3, 0xFA, 0x7E, 0x6D, 0xBF, + 0xBE, 0x57, 0xA4, 0xCB, 0x6F, 0xF3, 0x50, 0xE2, 0xE8, 0xF0, 0xF0, 0xF0, 0xA0, 0xB6, 0x7F, 0xB4, + 0x3F, 0x71, 0x64, 0x67, 0x42, 0x37, 0xC9, 0xE6, 0x66, 0xFC, 0x32, 0xF4, 0x42, 0x5E, 0x32, 0x12, + 0xD5, 0xFA, 0x84, 0xEC, 0x33, 0xC9, 0x05, 0xE9, 0xA0, 0x99, 0xC2, 0xA4, 0xFE, 0xA9, 0x5A, 0x65, + 0xD5, 0xF0, 0x3F, 0x06, 0x87, 0x7B, 0x1F, 0xC4, 0x1E, 0x76, 0xE6, 0xD8, 0x7D, 0x73, 0x10, 0x7B, + 0x50, 0xAD, 0xB6, 0xA6, 0x70, 0x37, 0x35, 0x05, 0x03, 0x14, 0x40, 0xD0, 0xBC, 0x06, 0x9A, 0x5B, + 0x6D, 0x4E, 0x63, 0x68, 0xEF, 0xA5, 0x52, 0x13, 0xC9, 0x60, 0xC2, 0x66, 0xF0, 0xFF, 0xAA, 0xEB, + 0x99, 0x30, 0xC1, 0x47, 0x36, 0xD6, 0xD1, 0x25, 0x57, 0x76, 0xE5, 0x24, 0xE4, 0x1C, 0x2A, 0x4C, + 0x3C, 0xBA, 0xB0, 0x14, 0xD9, 0x45, 0x85, 0xC1, 0xA9, 0xA6, 0x55, 0x65, 0x0B, 0x3A, 0x65, 0x2C, + 0xCD, 0xF5, 0x79, 0x65, 0xFA, 0x7E, 0xC9, 0x77, 0x49, 0x9B, 0xFF, 0x50, 0xF9, 0xE7, 0xF0, 0xE5, + 0x4E, 0xB2, 0x7B, 0xCD, 0x33, 0xB5, 0x2A, 0x7F, 0x80, 0xBD, 0x30, 0x38, 0x9E, 0xBA, 0x9A, 0x05, + 0xFD, 0xC9, 0x5F, 0xF1, 0x58, 0xF1, 0x1C, 0xCB, 0x1F, 0x0F, 0x94, 0x6C, 0xDB, 0x9A, 0x3E, 0x6C, + 0x12, 0x88, 0x81, 0xA7, 0x91, 0xCD, 0xE1, 0xBD, 0x99, 0x58, 0x1C, 0x5A, 0x0B, 0xC6, 0xA7, 0x25, + 0xD9, 0x0E, 0xD0, 0x8C, 0xC0, 0x7A, 0x26, 0x4B, 0x99, 0x17, 0xF0, 0x18, 0x34, 0xA7, 0x22, 0x90, + 0x84, 0xC9, 0x0C, 0xF4, 0x99, 0xB5, 0x59, 0xE1, 0x52, 0xD8, 0xA8, 0x07, 0xBB, 0xA5, 0x28, 0x38, + 0xE7, 0xEA, 0x12, 0xFD, 0x68, 0x9E, 0xC1, 0xF0, 0x4F, 0x15, 0x45, 0xF5, 0x49, 0xCC, 0x9A, 0xD6, + 0xA6, 0xEF, 0x78, 0x23, 0x65, 0x2C, 0x00, 0xB4, 0x6D, 0xCE, 0x02, 0x60, 0x0C, 0x88, 0xC7, 0xB3, + 0xDF, 0x90, 0xD4, 0xA8, 0x7A, 0x16, 0x42, 0xA1, 0x46, 0xCF, 0xAF, 0x02, 0x2D, 0xEA, 0x7C, 0x44, + 0xA6, 0x39, 0x29, 0xFC, 0xCF, 0xEE, 0x83, 0x0C, 0x0E, 0x68, 0xF2, 0x03, 0x21, 0x84, 0x5B, 0x5C, + 0x17, 0x4C, 0x63, 0x6A, 0x87, 0x18, 0x20, 0x04, 0xA8, 0xF8, 0xDC, 0x66, 0x30, 0x00, 0x1C, 0xE2, + 0x4C, 0x09, 0xB8, 0xA0, 0xF7, 0x3B, 0xF0, 0xBB, 0x26, 0xC2, 0x17, 0x6B, 0xEC, 0x44, 0x48, 0xC1, + 0x70, 0x27, 0x2E, 0x64, 0xDD, 0x9B, 0x70, 0xC4, 0x07, 0x00, 0x67, 0x9F, 0x3A, 0xE6, 0xC6, 0xF8, + 0xFD, 0x10, 0x41, 0xF4, 0xA1, 0x66, 0x0F, 0xB8, 0xCF, 0x50, 0x5E, 0xF3, 0xB5, 0x3B, 0x78, 0xE5, + 0x9E, 0xC6, 0x03, 0x5D, 0xB9, 0xDF, 0xE7, 0x68, 0x8A, 0x8A, 0x26, 0x03, 0x22, 0x5B, 0xD4, 0x0F, + 0xA8, 0xF6, 0xF4, 0xDE, 0x9B, 0x2E, 0xB4, 0x49, 0x62, 0xD9, 0x1B, 0x7C, 0xD1, 0x85, 0xC9, 0xF8, + 0xDC, 0xA8, 0xCD, 0x03, 0xEF, 0x04, 0x00, 0x09, 0xE9, 0x4C, 0xBB, 0xEF, 0x54, 0x75, 0xD3, 0xD3, + 0x61, 0x44, 0xC1, 0x1F, 0x44, 0x44, 0xA2, 0x23, 0x1F, 0x77, 0x6B, 0x26, 0x2F, 0x4B, 0xF1, 0xB4, + 0x19, 0x88, 0x30, 0xC1, 0xC5, 0x72, 0xA0, 0x09, 0x0A, 0x5C, 0xAD, 0x2C, 0x1C, 0x98, 0xCE, 0x86, + 0x13, 0x0A, 0x73, 0xC4, 0xFE, 0xE6, 0x02, 0xC4, 0xB4, 0xDD, 0x40, 0x28, 0x86, 0xE3, 0x69, 0x86, + 0xE9, 0x54, 0x94, 0xF9, 0x57, 0x6D, 0xC3, 0x8D, 0xFC, 0xED, 0x4E, 0x03, 0xE9, 0xE4, 0x43, 0xA5, + 0x9E, 0xD9, 0x9F, 0xA5, 0xF5, 0xB8, 0x15, 0x27, 0xFB, 0x3A, 0x29, 0x94, 0x2D, 0x85, 0x00, 0x70, + 0xAA, 0xD3, 0x1B, 0x4F, 0x85, 0xE8, 0x0B, 0x81, 0x67, 0xA3, 0x38, 0x3C, 0x1B, 0x12, 0x9E, 0x8D, + 0xE6, 0xDE, 0xFE, 0xC1, 0xE1, 0xDB, 0xA3, 0x77, 0xF5, 0xF1, 0xA7, 0x57, 0xD8, 0xC6, 0x61, 0xDB, + 0x2C, 0x0E, 0xDB, 0xA6, 0x84, 0xED, 0x2B, 0x1C, 0xE3, 0x70, 0xDC, 0x2B, 0x0E, 0xC7, 0xBD, 0x57, + 0x38, 0x4E, 0xC2, 0x71, 0xBF, 0x38, 0x1C, 0xF7, 0x5F, 0xE1, 0x38, 0x09, 0xC7, 0x83, 0xE2, 0x70, + 0x3C, 0x78, 0x85, 0xE3, 0x24, 0x1C, 0x0F, 0x8B, 0xC3, 0xF1, 0xF0, 0x15, 0x8E, 0x93, 0x70, 0x7C, + 0x5B, 0x1C, 0x8E, 0x6F, 0x17, 0x0A, 0xC7, 0x85, 0x42, 0x52, 0xCE, 0x15, 0x1A, 0x44, 0x93, 0x95, + 0x17, 0x02, 0xA1, 0x22, 0x1B, 0xBF, 0xF3, 0x51, 0x16, 0xCF, 0x3D, 0xFA, 0xB0, 0x4F, 0x7F, 0x69, + 0x24, 0xEA, 0x23, 0x12, 0xF9, 0xE6, 0x03, 0x07, 0x7B, 0x3F, 0xCE, 0x01, 0x88, 0xA4, 0x3A, 0x87, + 0xC3, 0x1E, 0xD1, 0x80, 0x6F, 0x0B, 0xED, 0x26, 0x4A, 0xF8, 0x95, 0x04, 0x54, 0x94, 0xC2, 0x9B, + 0x50, 0xC3, 0xE5, 0xEE, 0x64, 0x74, 0xEB, 0xA6, 0x5B, 0xD0, 0x0D, 0x64, 0xD4, 0x79, 0xEC, 0x56, + 0x12, 0x37, 0xDA, 0x9D, 0xBB, 0xC9, 0xB3, 0xE9, 0x61, 0x72, 0xA8, 0x33, 0xD2, 0xA0, 0x3E, 0x83, + 0xBE, 0x83, 0x56, 0xDC, 0xE4, 0x70, 0xEA, 0x1E, 0x72, 0xDE, 0x80, 0x4B, 0x41, 0x9A, 0x49, 0xFB, + 0x8B, 0xBA, 0xA0, 0x3E, 0xC8, 0x43, 0x6E, 0xCA, 0x54, 0x92, 0x34, 0x7A, 0xD0, 0x2D, 0x92, 0xB0, + 0xE9, 0x9A, 0x42, 0x21, 0x52, 0x65, 0x96, 0x35, 0x65, 0x2A, 0x52, 0x66, 0xA8, 0xC0, 0x74, 0xB9, + 0x6C, 0x9F, 0xA1, 0xD7, 0xC4, 0xC4, 0x40, 0x5B, 0xDB, 0x15, 0x75, 0x3F, 0xA2, 0x7E, 0x98, 0x61, + 0x77, 0x58, 0x96, 0x7A, 0x1E, 0x53, 0xD1, 0xE5, 0x34, 0xD2, 0xFA, 0x34, 0xEA, 0xE3, 0x7D, 0x4D, + 0x17, 0x0E, 0x2C, 0xDE, 0xE0, 0x7D, 0x2D, 0xB0, 0x84, 0x9F, 0xA9, 0xFB, 0x2E, 0x47, 0xFF, 0xCD, + 0xE4, 0x52, 0x05, 0x30, 0xDC, 0x8B, 0xED, 0xC1, 0x67, 0x7F, 0xB0, 0x48, 0xE4, 0x9E, 0x6A, 0x22, + 0x9A, 0xFA, 0x76, 0xCA, 0x3C, 0xF8, 0xF1, 0xBA, 0xDB, 0x5D, 0xAD, 0x6D, 0x70, 0x24, 0x80, 0xA3, + 0xC6, 0x0D, 0x84, 0x8B, 0xB6, 0x06, 0xE2, 0x92, 0x4A, 0x99, 0x02, 0x63, 0x0D, 0x67, 0x6C, 0x40, + 0x0C, 0x5A, 0x29, 0x23, 0xE0, 0xC0, 0xF6, 0xFD, 0xE7, 0xB7, 0x00, 0x26, 0x8D, 0x7F, 0xF3, 0xD7, + 0x33, 0xDB, 0xF2, 0xC7, 0x5C, 0x51, 0x6D, 0x64, 0x98, 0xFF, 0xE8, 0xAE, 0x8D, 0x6B, 0x7E, 0xE0, + 0x11, 0xE1, 0xDF, 0x68, 0x82, 0x5F, 0xE2, 0x41, 0x34, 0x8F, 0x4A, 0x3F, 0x8F, 0xDF, 0x67, 0xD8, + 0xE0, 0x38, 0xDF, 0x79, 0x98, 0xC1, 0x9D, 0x67, 0x1C, 0x9F, 0x4D, 0xE2, 0x94, 0x8D, 0x26, 0x12, + 0xFA, 0x1E, 0x1B, 0x33, 0xFB, 0x5C, 0x6C, 0x24, 0x26, 0x25, 0xA4, 0x16, 0xF9, 0xE9, 0x47, 0xE2, + 0x42, 0x34, 0x2E, 0x0F, 0x5C, 0xDA, 0xD9, 0x3D, 0xE3, 0x7F, 0x9F, 0x7E, 0x1C, 0xE7, 0x7B, 0x71, + 0x91, 0xFC, 0x36, 0xC5, 0x77, 0x6F, 0x87, 0x9C, 0xD9, 0xC1, 0xA8, 0xC7, 0x3D, 0xE6, 0xF4, 0x19, + 0xB9, 0x8E, 0x00, 0x32, 0xFB, 0x68, 0x88, 0xB4, 0x1C, 0x5D, 0x62, 0xF6, 0x3F, 0xFE, 0xFE, 0x9F, + 0x7D, 0xF3, 0x81, 0xFB, 0xFF, 0xF8, 0xFB, 0xFF, 0x61, 0x2E, 0xBC, 0xE8, 0x73, 0xC0, 0x61, 0xA3, + 0xC6, 0x4E, 0xEC, 0x47, 0x31, 0x34, 0xED, 0x01, 0xD3, 0x7A, 0xCE, 0x1D, 0x67, 0xFB, 0x9F, 0x7E, + 0x80, 0x0C, 0xFA, 0x08, 0xE8, 0x83, 0xA6, 0xD1, 0xF1, 0x2D, 0x1F, 0xBC, 0x3C, 0xE0, 0x3E, 0xF5, + 0x04, 0xD4, 0xB7, 0x4B, 0x3D, 0x0F, 0xD0, 0xC3, 0x02, 0xFD, 0x86, 0x74, 0x8F, 0xC3, 0xDA, 0x74, + 0x93, 0xFB, 0x35, 0x76, 0xED, 0x00, 0x2A, 0x30, 0x9C, 0x51, 0x0C, 0xD6, 0xCC, 0xC3, 0xBB, 0x6E, + 0xD3, 0x27, 0xDF, 0x32, 0x8F, 0xBC, 0xCA, 0xF0, 0x54, 0x68, 0xC0, 0x60, 0x64, 0x29, 0x35, 0x6D, + 0x76, 0x8A, 0x0E, 0x07, 0x23, 0xC7, 0xE0, 0x35, 0xD6, 0x96, 0x87, 0xC4, 0x31, 0x4E, 0xA6, 0xC6, + 0xAE, 0xCC, 0x91, 0x89, 0x4E, 0x3F, 0xB5, 0x7A, 0xBD, 0xDE, 0x68, 0x36, 0xA9, 0x5D, 0x1D, 0x1E, + 0xE4, 0xD9, 0xFA, 0xE5, 0x9E, 0x24, 0xB9, 0x4F, 0x94, 0xF1, 0x8B, 0x59, 0x92, 0x63, 0x9E, 0xF3, + 0x67, 0x06, 0x89, 0x48, 0x91, 0xF6, 0xA0, 0x14, 0x85, 0xC4, 0xA5, 0x4E, 0x89, 0x48, 0x53, 0xE5, + 0xCE, 0xD8, 0x95, 0xC4, 0x24, 0x21, 0xE5, 0x19, 0xC7, 0x9D, 0xDE, 0xB6, 0xB4, 0x30, 0x9A, 0x2D, + 0x23, 0xC6, 0x86, 0x4E, 0xDC, 0xED, 0x13, 0x94, 0xF0, 0x6A, 0x0E, 0xD7, 0x54, 0x87, 0x71, 0xF8, + 0xA8, 0xE5, 0x78, 0xEF, 0x77, 0xE1, 0x1F, 0x39, 0xE4, 0xBA, 0xB0, 0xA8, 0x2E, 0xD7, 0x2B, 0xAD, + 0x2E, 0x11, 0xAB, 0xCF, 0x7A, 0x5C, 0xDC, 0x73, 0xA0, 0x97, 0xD8, 0x3B, 0xFE, 0xDA, 0xB1, 0x9F, + 0x39, 0x73, 0xAD, 0x01, 0x63, 0x00, 0x2E, 0x20, 0xD1, 0xCD, 0x44, 0x0F, 0x4D, 0xE0, 0x0A, 0x36, + 0xF0, 0x04, 0xA0, 0x7D, 0x68, 0x2A, 0xA6, 0x71, 0x0D, 0xBC, 0xE6, 0x81, 0x57, 0x81, 0x1D, 0xF5, + 0x03, 0x4B, 0xB2, 0x0B, 0xA1, 0x7D, 0x27, 0x8E, 0x95, 0x78, 0x99, 0xDF, 0xA1, 0x77, 0x57, 0x9F, + 0xDF, 0x47, 0x33, 0xD0, 0x74, 0xCF, 0xF1, 0xE1, 0x1F, 0x60, 0x55, 0xF0, 0x36, 0xBC, 0x78, 0xC7, + 0x1F, 0xD9, 0x56, 0x73, 0xFF, 0x4F, 0x6C, 0xE8, 0x04, 0x9E, 0xBF, 0xBD, 0x08, 0x66, 0x15, 0x71, + 0xA7, 0x06, 0xBE, 0x73, 0xD4, 0x78, 0x77, 0x18, 0x0E, 0x0F, 0x0C, 0x8A, 0x60, 0x9E, 0x1F, 0x9C, + 0x31, 0x57, 0xB3, 0x57, 0x1E, 0xB5, 0x78, 0x1E, 0x45, 0x94, 0x54, 0x96, 0x49, 0x41, 0xE3, 0x85, + 0x70, 0xA9, 0x32, 0xCF, 0x73, 0x68, 0xC1, 0xE4, 0xBD, 0xF3, 0x68, 0x6B, 0x23, 0x53, 0xFF, 0x0C, + 0x68, 0x69, 0xB5, 0x3D, 0xC7, 0x95, 0x92, 0x69, 0x3E, 0xEB, 0x49, 0xBC, 0x6D, 0xA5, 0xD5, 0x96, + 0xDF, 0x18, 0x7D, 0xCD, 0x63, 0xEF, 0x90, 0x2A, 0x9F, 0xB2, 0x3B, 0x25, 0xFA, 0x9A, 0x98, 0x59, + 0x72, 0xD3, 0x0C, 0x35, 0x4F, 0xB9, 0x6B, 0x59, 0x30, 0x74, 0x5C, 0x12, 0x40, 0xC6, 0xD7, 0x7B, + 0x1D, 0xC7, 0x13, 0x18, 0x9E, 0xF1, 0x7E, 0x57, 0x3E, 0x2A, 0xD6, 0x01, 0x0C, 0xD8, 0x15, 0x24, + 0x1D, 0x01, 0x51, 0x95, 0xEB, 0x62, 0x0F, 0xE6, 0xC0, 0x0D, 0x10, 0x8C, 0x40, 0x07, 0xB1, 0xCB, + 0x75, 0xB1, 0x5F, 0x69, 0x9D, 0x04, 0xC2, 0x19, 0x39, 0xC2, 0xBC, 0x2B, 0xB9, 0x90, 0x03, 0x3C, + 0x21, 0xB4, 0x72, 0x6D, 0x0F, 0x61, 0x78, 0xD3, 0xEB, 0x39, 0x9E, 0xCD, 0x59, 0x63, 0x50, 0xAE, + 0x8F, 0xB7, 0xB1, 0x3E, 0x9A, 0x25, 0xFB, 0x38, 0x8A, 0xF5, 0xB1, 0x5F, 0xB2, 0x8F, 0x77, 0x95, + 0xD6, 0x2F, 0x9E, 0xE9, 0x8B, 0x72, 0xAD, 0x1B, 0x80, 0x50, 0xA7, 0xE6, 0xF7, 0x3C, 0x7B, 0x00, + 0xDC, 0x94, 0x30, 0xBE, 0xB5, 0x32, 0xEF, 0x87, 0x13, 0xE3, 0x6F, 0x81, 0x2F, 0xC2, 0x13, 0x53, + 0x70, 0xCF, 0xD6, 0x2C, 0xA6, 0x59, 0x03, 0xC7, 0x33, 0xC5, 0x70, 0x84, 0x67, 0xCF, 0x48, 0x13, + 0xFA, 0x90, 0x9E, 0x83, 0x86, 0x2C, 0x0D, 0x30, 0x9A, 0xEB, 0x5A, 0xA6, 0x92, 0xFF, 0xB9, 0x7D, + 0x67, 0x7A, 0x8E, 0x8D, 0x03, 0xAB, 0x53, 0x58, 0xF9, 0x4B, 0x30, 0x73, 0xE4, 0x7A, 0x70, 0xD4, + 0xC9, 0xBE, 0x3D, 0xAE, 0x73, 0xC0, 0x43, 0xEF, 0x8D, 0x2F, 0x87, 0x71, 0x41, 0xC7, 0x95, 0x1D, + 0xC0, 0xF9, 0x1C, 0x3F, 0xCA, 0x95, 0xFB, 0x45, 0x80, 0xEE, 0x0C, 0xCE, 0x9D, 0x69, 0xA0, 0x9B, + 0x04, 0x1C, 0x89, 0x1E, 0x1C, 0xD8, 0xBA, 0x1E, 0xD0, 0x11, 0x1A, 0xFA, 0xB3, 0x63, 0x5C, 0x04, + 0xF0, 0xEE, 0x1A, 0x7A, 0x8D, 0xD2, 0x88, 0xF1, 0x81, 0x70, 0xEA, 0x00, 0xA8, 0xC0, 0xF6, 0x03, + 0x93, 0x68, 0x99, 0x01, 0x80, 0x04, 0x32, 0x07, 0x3A, 0x60, 0x89, 0x3F, 0x51, 0x83, 0x01, 0xBC, + 0x6D, 0xCF, 0x5A, 0x12, 0x1E, 0xD7, 0x16, 0xEC, 0x9D, 0x85, 0xDE, 0x4A, 0xE8, 0xEC, 0x01, 0xFA, + 0x03, 0x1E, 0xD4, 0x78, 0xF6, 0x83, 0x08, 0x00, 0x73, 0x8F, 0xC6, 0x03, 0xE5, 0x07, 0x7B, 0x07, + 0x7D, 0x45, 0xCA, 0x16, 0xD1, 0x2C, 0xE5, 0xBC, 0xF5, 0xC7, 0x98, 0x02, 0x12, 0xF2, 0x97, 0x35, + 0xF3, 0xD4, 0x90, 0x76, 0x19, 0xEF, 0x99, 0x2C, 0xED, 0x23, 0xD3, 0x3E, 0xB7, 0xF8, 0x5D, 0x65, + 0xEA, 0xD9, 0x7E, 0x38, 0x61, 0x58, 0xFF, 0x0C, 0xDB, 0xD0, 0xFD, 0x2B, 0xC3, 0x26, 0xB4, 0x6D, + 0xC7, 0x2B, 0x37, 0x4B, 0xC2, 0x0C, 0x30, 0xB4, 0x8F, 0xF1, 0x70, 0x0A, 0x88, 0x19, 0x06, 0xC7, + 0x58, 0x16, 0x9F, 0xD0, 0x4B, 0x93, 0xA6, 0x20, 0x1F, 0x90, 0xD6, 0xB2, 0x4C, 0x41, 0x16, 0xCB, + 0x1E, 0x47, 0x91, 0xD3, 0x90, 0x48, 0x04, 0x9A, 0xF3, 0x7A, 0x5B, 0x2C, 0x4B, 0xDC, 0x48, 0xA8, + 0xFD, 0x2A, 0x74, 0x23, 0x31, 0x47, 0xEE, 0x52, 0x22, 0x97, 0xC2, 0x8D, 0x7C, 0xF7, 0x11, 0xEA, + 0xED, 0xA5, 0xDC, 0x45, 0xAC, 0x80, 0x0A, 0xCE, 0xAE, 0xBF, 0x14, 0x21, 0x82, 0xB3, 0xDD, 0xEB, + 0xFA, 0xF3, 0x21, 0xFF, 0x18, 0xB9, 0xD1, 0x59, 0x4E, 0xB3, 0x64, 0x1C, 0xCC, 0x54, 0x4C, 0x1F, + 0xF3, 0xBF, 0x43, 0xE3, 0x14, 0xB4, 0x1E, 0x24, 0x91, 0xD0, 0xB1, 0x1C, 0x39, 0x66, 0xB3, 0x9E, + 0xFA, 0xF9, 0xE6, 0x95, 0x38, 0x72, 0x12, 0x07, 0xA2, 0x4C, 0x6E, 0xDA, 0x80, 0x97, 0x9F, 0x8B, + 0x34, 0xA4, 0xE1, 0xD9, 0xF6, 0x11, 0x67, 0x88, 0x65, 0x9E, 0x0D, 0xB9, 0xFE, 0xFD, 0xD4, 0x79, + 0xE0, 0x7E, 0x5E, 0x02, 0x49, 0x34, 0x87, 0x56, 0x67, 0x89, 0xEF, 0xB9, 0xB4, 0x8A, 0x85, 0x4A, + 0x50, 0xB7, 0x71, 0xA1, 0x03, 0xC4, 0x05, 0x5D, 0x73, 0x49, 0xDC, 0x00, 0xD9, 0x00, 0xA6, 0xAA, + 0x42, 0x8B, 0x41, 0x7E, 0x90, 0xEF, 0xA0, 0x98, 0x22, 0x09, 0x05, 0x8E, 0x08, 0xCF, 0x01, 0x61, + 0x04, 0x08, 0xC2, 0x74, 0x2D, 0x3E, 0x26, 0xA4, 0xC8, 0xC0, 0x10, 0x3D, 0x4A, 0x2E, 0x19, 0xE4, + 0x1D, 0x67, 0xC4, 0xE3, 0x12, 0x8B, 0xCF, 0x0C, 0x53, 0x17, 0x28, 0x1A, 0xA1, 0x40, 0x63, 0x73, + 0x20, 0x3A, 0xF4, 0x55, 0x0D, 0x3C, 0x94, 0xAE, 0x60, 0x1A, 0xDC, 0xC3, 0x28, 0x99, 0x64, 0x37, + 0x34, 0x1F, 0x92, 0x47, 0x91, 0x2E, 0xA5, 0xD8, 0x29, 0x8D, 0x1F, 0x52, 0x20, 0x4A, 0xBE, 0x4C, + 0x4E, 0xAD, 0xD2, 0x76, 0x9B, 0x16, 0xB2, 0x60, 0x31, 0x28, 0x9D, 0x89, 0xA1, 0xE3, 0xF3, 0x68, + 0x69, 0x20, 0xDE, 0x41, 0x27, 0xA1, 0x50, 0x36, 0x92, 0x4B, 0xED, 0x71, 0xFC, 0x4E, 0x3C, 0xC1, + 0x08, 0x3C, 0xFC, 0x1C, 0xC9, 0x48, 0xBA, 0x66, 0xE9, 0x41, 0xB4, 0xBE, 0x88, 0x4F, 0x7C, 0xEC, + 0x74, 0x77, 0x58, 0xF7, 0xF4, 0x04, 0xFE, 0x7E, 0xBC, 0xFA, 0x72, 0x7D, 0xD2, 0x85, 0x0F, 0xA7, + 0xDC, 0x6C, 0x3B, 0xC1, 0x0E, 0x71, 0x8C, 0x8F, 0x9A, 0x65, 0x5A, 0xDC, 0x59, 0x57, 0x8F, 0xD7, + 0x5C, 0x27, 0x84, 0x8E, 0x14, 0x90, 0xB8, 0xBD, 0xCD, 0x41, 0x09, 0x13, 0x1D, 0xA8, 0x03, 0x41, + 0x92, 0x48, 0xD0, 0x7B, 0x48, 0x52, 0x05, 0xC0, 0xB1, 0xD2, 0x82, 0x3F, 0xBB, 0xFF, 0xE3, 0x5B, + 0xB7, 0x9B, 0x83, 0x42, 0x24, 0xFB, 0x99, 0x1C, 0x84, 0x7E, 0x0F, 0xEF, 0xE2, 0xE8, 0x27, 0x98, + 0x77, 0xE4, 0x03, 0x22, 0xB9, 0xD1, 0xF4, 0xC1, 0x37, 0x04, 0x50, 0x88, 0x6B, 0xA0, 0xF4, 0xC2, + 0xDF, 0x55, 0x43, 0x49, 0x8E, 0xBC, 0x29, 0xF8, 0x24, 0xE9, 0x0E, 0x70, 0x4A, 0x7E, 0x58, 0x39, + 0x4A, 0x85, 0xE3, 0x6F, 0x08, 0xBC, 0x24, 0xCF, 0xAA, 0xB4, 0xE4, 0xBF, 0xAB, 0x86, 0x56, 0x38, + 0xFA, 0xA6, 0x20, 0x97, 0xE4, 0xF4, 0x80, 0x5C, 0xF2, 0xC3, 0xCA, 0x91, 0x2B, 0x1C, 0xBF, 0x04, + 0xBC, 0xDC, 0xE9, 0x5D, 0x66, 0x8A, 0x5B, 0x85, 0xC0, 0x8F, 0xBE, 0x11, 0x4F, 0x06, 0x3B, 0xB7, + 0x51, 0x4A, 0xB9, 0x16, 0x9E, 0xE9, 0x9E, 0x59, 0x26, 0xC6, 0xA7, 0xB7, 0xCE, 0xE9, 0x27, 0x76, + 0x7D, 0x7B, 0x73, 0xD9, 0x61, 0xF2, 0xC7, 0x25, 0xC3, 0x7E, 0xCA, 0x24, 0x56, 0x26, 0xB7, 0x7D, + 0x25, 0x59, 0x06, 0x04, 0x36, 0xB9, 0x5E, 0x9D, 0xC6, 0x47, 0x81, 0x06, 0xED, 0xC6, 0x18, 0x79, + 0x0D, 0x22, 0x10, 0xC8, 0x6E, 0x32, 0x71, 0x0C, 0x0E, 0x25, 0x85, 0x18, 0x0D, 0x64, 0x15, 0x9F, + 0x04, 0x1B, 0x9F, 0x7B, 0x18, 0xF0, 0x53, 0x63, 0xBF, 0x39, 0x81, 0x17, 0x46, 0xFF, 0x8C, 0x02, + 0x5F, 0xA0, 0xE6, 0x73, 0x6F, 0xE2, 0xED, 0xB7, 0x0C, 0x6A, 0xF6, 0xD0, 0x57, 0x8D, 0x69, 0x82, + 0xE1, 0x05, 0xA1, 0x30, 0x47, 0x3C, 0x2E, 0xE2, 0xB4, 0x4D, 0x1F, 0x61, 0xB0, 0x89, 0x51, 0x3B, + 0xB8, 0x83, 0xF6, 0x78, 0xEF, 0x42, 0x6F, 0x9A, 0xA9, 0xF1, 0x66, 0x39, 0xD5, 0xA4, 0xFC, 0x3A, + 0x73, 0x5A, 0x2D, 0x88, 0x4D, 0xE4, 0xF7, 0x33, 0xD8, 0x21, 0xEE, 0x7D, 0x72, 0xFC, 0x3C, 0xFA, + 0x6C, 0xA6, 0x4F, 0xE7, 0xC1, 0x84, 0xD6, 0x2D, 0xFB, 0xCF, 0xEE, 0x1A, 0x67, 0x70, 0x9C, 0xF3, + 0xE2, 0x6B, 0x96, 0x6B, 0xE7, 0x61, 0xE1, 0x4B, 0xAC, 0x0C, 0xF7, 0xCE, 0x19, 0x80, 0xCA, 0x7F, + 0x83, 0x35, 0xBD, 0x83, 0x95, 0xDC, 0x62, 0xAD, 0x1E, 0x89, 0x3A, 0xC9, 0xDC, 0x5F, 0xCF, 0x80, + 0x44, 0x38, 0x83, 0xD5, 0x23, 0x51, 0xA6, 0xD1, 0x61, 0x06, 0xA8, 0x9E, 0x82, 0x46, 0xD8, 0xC1, + 0x0B, 0x45, 0x23, 0x38, 0x6C, 0xBC, 0xE7, 0x45, 0x23, 0x9C, 0xC1, 0x06, 0xF0, 0x22, 0x02, 0xD4, + 0x53, 0x90, 0x08, 0x3B, 0x78, 0xC1, 0x48, 0xD4, 0xF9, 0xE5, 0xF9, 0xD1, 0x88, 0x75, 0x7E, 0xD9, + 0x10, 0x4C, 0x02, 0x68, 0x3D, 0x15, 0x97, 0x3A, 0xBF, 0xBC, 0x38, 0x6C, 0xFA, 0xEC, 0x04, 0xB6, + 0xE8, 0x38, 0xA6, 0x2D, 0x2A, 0x65, 0x50, 0x85, 0x9A, 0xE7, 0x39, 0xB7, 0x60, 0x80, 0xB5, 0xC6, + 0x93, 0x18, 0x1C, 0xCA, 0x61, 0xC9, 0xB8, 0x83, 0x17, 0x8C, 0x23, 0x4F, 0xE5, 0x38, 0x33, 0xAF, + 0xAE, 0x0A, 0xA0, 0x51, 0x8E, 0xD7, 0x9E, 0xC0, 0x92, 0xDE, 0x4A, 0x44, 0x5F, 0x0D, 0xAA, 0x95, + 0x66, 0x49, 0xF1, 0x2E, 0xD6, 0x0D, 0xDD, 0x22, 0xBB, 0x44, 0x23, 0xB7, 0x6D, 0x28, 0xB7, 0xA1, + 0x22, 0x0E, 0x83, 0x5B, 0xCC, 0x11, 0x3A, 0x32, 0xC5, 0xC7, 0x8F, 0x27, 0x95, 0x56, 0xF8, 0x85, + 0xC1, 0x37, 0xD4, 0xDB, 0x25, 0xCF, 0xCE, 0x89, 0x05, 0x4F, 0xB1, 0x5A, 0xCC, 0x9A, 0x51, 0xF6, + 0xB6, 0x06, 0x36, 0x75, 0xC9, 0x8D, 0xD5, 0xC7, 0x50, 0xD1, 0x9D, 0x91, 0x4E, 0x20, 0xC2, 0x94, + 0x7C, 0x7F, 0x04, 0x26, 0xBA, 0xD4, 0xC0, 0xA7, 0x41, 0x60, 0x69, 0xDE, 0xF8, 0x26, 0x46, 0xE5, + 0x8F, 0x23, 0x5B, 0x07, 0x5D, 0xF5, 0xA0, 0xB7, 0x2A, 0xDB, 0x42, 0x18, 0x8F, 0x64, 0xB8, 0xDD, + 0x36, 0xF3, 0x55, 0x22, 0x14, 0x7C, 0x2E, 0xBB, 0x84, 0x7F, 0x6C, 0xA6, 0xA1, 0xBB, 0x19, 0x26, + 0xB3, 0xD5, 0x2C, 0xEB, 0x51, 0x85, 0x6B, 0xA9, 0x1B, 0x29, 0xCD, 0xE3, 0xBE, 0x60, 0xDA, 0x9D, + 0x66, 0x52, 0xDA, 0xE3, 0xB4, 0x69, 0x65, 0x8A, 0x3D, 0x64, 0x03, 0x02, 0xB9, 0xE6, 0xBC, 0x81, + 0xE1, 0x53, 0x17, 0x8E, 0xC7, 0xFA, 0x81, 0x08, 0x3C, 0xF2, 0x9C, 0xC2, 0xE4, 0xB6, 0x8E, 0x9D, + 0x41, 0x53, 0x88, 0x5D, 0x00, 0x3C, 0xE7, 0x1E, 0xED, 0x46, 0x5F, 0x00, 0xF0, 0xE7, 0x00, 0x3E, + 0xCF, 0xE6, 0x22, 0xDB, 0x3A, 0xB6, 0x48, 0xBA, 0x2C, 0x43, 0x9B, 0x20, 0x2B, 0xE1, 0xA4, 0xAF, + 0x1D, 0x11, 0xCE, 0xB9, 0xD2, 0x42, 0x13, 0x1B, 0x59, 0xC0, 0xF0, 0x4A, 0x3F, 0x6E, 0x56, 0x64, + 0x55, 0x66, 0x3B, 0x82, 0x85, 0x6F, 0xE6, 0xA3, 0xD9, 0x45, 0xD2, 0xED, 0xB4, 0xD9, 0x16, 0xC4, + 0xB7, 0x05, 0xF8, 0xBA, 0x2B, 0xD2, 0xFC, 0x22, 0x13, 0x20, 0xBA, 0x9E, 0x63, 0x04, 0xBA, 0xF0, + 0xD9, 0xFD, 0xD0, 0xD4, 0x87, 0x6C, 0x88, 0x49, 0x7E, 0xC2, 0xD9, 0xE1, 0x75, 0xAC, 0x8D, 0x04, + 0x73, 0x67, 0x8A, 0xC7, 0x1D, 0xF6, 0xE8, 0x04, 0x44, 0x71, 0x41, 0x08, 0x60, 0x13, 0xAD, 0xCD, + 0x9A, 0x81, 0x97, 0xCE, 0x51, 0x93, 0x09, 0xA0, 0xF7, 0x1E, 0x19, 0x19, 0x5C, 0xE5, 0xAD, 0x2C, + 0x3A, 0xA2, 0x47, 0xF7, 0xBF, 0x25, 0x88, 0x6F, 0x79, 0x04, 0x98, 0xDB, 0xAF, 0x3C, 0xDF, 0x49, + 0x36, 0x19, 0xA7, 0x58, 0xD0, 0xC6, 0xA9, 0xF8, 0x1E, 0xBA, 0x6B, 0x9F, 0xCA, 0xF8, 0xC3, 0xB9, + 0xFE, 0x73, 0x32, 0xAE, 0x31, 0x0A, 0xAB, 0x1D, 0x70, 0xA1, 0xE2, 0x94, 0xAF, 0x4C, 0x5F, 0x6C, + 0x6D, 0x4F, 0x04, 0xF0, 0x8E, 0x0C, 0xFA, 0x47, 0x25, 0x79, 0x9E, 0x19, 0x01, 0x99, 0x61, 0xD4, + 0xCE, 0x11, 0x1E, 0x99, 0x19, 0x09, 0x89, 0xE1, 0xA6, 0xF3, 0x87, 0x29, 0x19, 0x29, 0x89, 0x1D, + 0x67, 0xEC, 0xA5, 0x82, 0x11, 0x85, 0xFC, 0xF9, 0xF1, 0x78, 0x49, 0x68, 0xBB, 0x80, 0x90, 0xC9, + 0xF1, 0x96, 0x67, 0x06, 0x31, 0x2F, 0xF8, 0x9E, 0xE1, 0xFA, 0xF3, 0xF9, 0x09, 0x39, 0x2B, 0xDC, + 0x9C, 0xFC, 0xF2, 0x2B, 0xA5, 0xFC, 0xC2, 0x23, 0x51, 0xDC, 0x3B, 0x6C, 0xE4, 0xF8, 0x48, 0xD8, + 0xA3, 0x91, 0x63, 0x93, 0x7F, 0x08, 0xD6, 0x19, 0x40, 0xD7, 0x0D, 0xD8, 0x4A, 0x5F, 0xBA, 0xC5, + 0x4A, 0x90, 0xF4, 0x02, 0x91, 0xF4, 0xBA, 0xF0, 0x03, 0x17, 0xDF, 0xF5, 0xA5, 0x5F, 0x2C, 0x1C, + 0xC5, 0x36, 0x7B, 0x5B, 0x8F, 0x25, 0x0F, 0x53, 0x0D, 0xFD, 0x1A, 0x3B, 0xD7, 0x80, 0x93, 0x84, + 0xFD, 0xC8, 0xF8, 0x13, 0xC9, 0x40, 0xD5, 0x66, 0x29, 0x5E, 0x13, 0x36, 0xA0, 0xE9, 0x19, 0x8A, + 0x09, 0xB0, 0xAD, 0xFA, 0x36, 0x4D, 0x7C, 0xE8, 0xDC, 0xC3, 0x74, 0x04, 0x86, 0xAB, 0x50, 0x44, + 0x8B, 0xEC, 0x8D, 0x32, 0xFB, 0xAA, 0x29, 0x6F, 0x35, 0xD8, 0x07, 0xC0, 0xF8, 0xF1, 0xC3, 0xE8, + 0x09, 0x86, 0x04, 0x36, 0xD0, 0xFB, 0x6B, 0x87, 0x1D, 0xA8, 0x77, 0xE4, 0x33, 0x15, 0x57, 0x73, + 0xC0, 0x28, 0x7A, 0x70, 0x3B, 0xC6, 0x84, 0x08, 0x60, 0x20, 0x6F, 0xEC, 0xB0, 0x8F, 0x5D, 0xFA, + 0x73, 0x8B, 0x7F, 0xFE, 0x2A, 0x3D, 0x3E, 0x6E, 0x3E, 0x9F, 0xA9, 0xD0, 0x3D, 0xFF, 0x98, 0xD5, + 0x51, 0xEC, 0x6B, 0xD6, 0x37, 0x37, 0xE1, 0x59, 0x56, 0x44, 0x6E, 0x06, 0xDD, 0xCC, 0x49, 0xCB, + 0x37, 0x25, 0x13, 0xE4, 0xC1, 0xD4, 0x44, 0x90, 0x53, 0xFB, 0x2C, 0x9D, 0xC6, 0x20, 0xCE, 0x01, + 0x27, 0x53, 0x19, 0xD8, 0x23, 0xAE, 0xA9, 0x6D, 0xF6, 0x67, 0xE5, 0x31, 0xC8, 0x79, 0x74, 0x46, + 0xEC, 0x95, 0xC2, 0xE5, 0x6F, 0x9D, 0xEB, 0x58, 0xD7, 0xE3, 0xCC, 0x05, 0x80, 0x1E, 0x5D, 0x0A, + 0xCF, 0x82, 0x23, 0x2F, 0x5F, 0xBF, 0x61, 0x1F, 0x6C, 0x0B, 0xD1, 0xF0, 0xE1, 0x60, 0x3B, 0x6F, + 0xD6, 0x83, 0xBC, 0x81, 0x4B, 0x4B, 0x02, 0xAD, 0x8A, 0x9A, 0x5D, 0x12, 0x74, 0xAF, 0x92, 0xBD, + 0x27, 0x00, 0xAC, 0x9E, 0x95, 0x03, 0x2F, 0xFB, 0x13, 0xBB, 0xF9, 0xF5, 0xF3, 0x43, 0xB3, 0x28, + 0x98, 0x73, 0x61, 0x71, 0xEC, 0xEC, 0xC6, 0xA3, 0xB7, 0xB2, 0x82, 0x50, 0xAA, 0x3C, 0xBF, 0xCF, + 0x5A, 0x43, 0x2A, 0xE7, 0x02, 0xC5, 0x02, 0x3E, 0x6F, 0xCE, 0x05, 0x99, 0xC4, 0xDE, 0x5F, 0x5A, + 0x46, 0xD6, 0xD3, 0x58, 0xDF, 0x85, 0x24, 0x8B, 0x58, 0xC3, 0x59, 0x1B, 0x82, 0xC0, 0x9C, 0x92, + 0x84, 0xBD, 0x32, 0x47, 0x1C, 0x8C, 0x41, 0x3C, 0x95, 0xB7, 0x81, 0x80, 0xB0, 0x66, 0x79, 0x1B, + 0xE6, 0xC3, 0xA0, 0x74, 0xC6, 0x56, 0x1C, 0x42, 0x86, 0xB4, 0x5E, 0xDA, 0x32, 0xC5, 0x53, 0xB6, + 0xF3, 0x47, 0x22, 0x49, 0x54, 0x08, 0xAF, 0x5B, 0xF8, 0xB1, 0xAB, 0x3A, 0x0A, 0x53, 0x47, 0x85, + 0xBF, 0x27, 0xAD, 0x66, 0xAA, 0x61, 0xB6, 0x69, 0x24, 0x6E, 0xAC, 0x9C, 0x18, 0xA2, 0x25, 0x3F, + 0x55, 0x2F, 0xED, 0x95, 0xBB, 0x00, 0x5F, 0xCA, 0x10, 0x63, 0x17, 0x04, 0x34, 0x13, 0x50, 0x28, + 0xCA, 0x8D, 0x00, 0x32, 0x9C, 0xC6, 0x70, 0xA2, 0xCC, 0x57, 0xC1, 0x4E, 0x94, 0x81, 0x5F, 0xB0, + 0xEF, 0x36, 0x95, 0x0F, 0x12, 0x94, 0x12, 0xA1, 0xC7, 0x99, 0xD3, 0xA3, 0x34, 0xF6, 0x06, 0xAA, + 0x68, 0xFF, 0xF8, 0xFB, 0x7F, 0xFA, 0xE1, 0x99, 0x85, 0x49, 0x15, 0xB0, 0xE7, 0xB0, 0xC7, 0x1A, + 0xC5, 0x14, 0x53, 0x8F, 0xD0, 0x13, 0x4A, 0x4E, 0xE4, 0x5E, 0x8F, 0x52, 0x15, 0xCD, 0x5C, 0x06, + 0x4F, 0x69, 0xDF, 0x51, 0x92, 0x73, 0x41, 0x9F, 0x7C, 0x00, 0xC2, 0x16, 0x18, 0xBC, 0x74, 0x58, + 0x8F, 0xA2, 0x97, 0xEF, 0x41, 0xF8, 0x1A, 0xCA, 0xC8, 0x25, 0xCD, 0x08, 0xF3, 0xDA, 0xCA, 0x09, + 0xE0, 0x6C, 0xD1, 0x4E, 0xD3, 0x87, 0x99, 0x45, 0x8B, 0xC0, 0xD1, 0x40, 0xB1, 0xB4, 0xD3, 0x51, + 0xD4, 0x61, 0xD0, 0xF5, 0x88, 0x8B, 0xA1, 0x63, 0x30, 0x10, 0x34, 0x4D, 0x8E, 0xD1, 0x5E, 0xFF, + 0xB1, 0x57, 0xD7, 0x47, 0x53, 0x82, 0xB5, 0x50, 0x8A, 0x45, 0x9D, 0xF5, 0x0E, 0x58, 0x4D, 0x8D, + 0x5D, 0xDA, 0x3A, 0x8C, 0xEF, 0x87, 0x51, 0x5B, 0x61, 0x34, 0xC1, 0x97, 0x1E, 0x7A, 0xD5, 0xC8, + 0x81, 0x6F, 0xCD, 0x11, 0x0F, 0x93, 0x42, 0xDC, 0x48, 0x83, 0x95, 0x81, 0xD9, 0x41, 0x6C, 0x86, + 0xB9, 0xE2, 0x63, 0x7E, 0xC9, 0xA6, 0xEC, 0x8B, 0x47, 0x91, 0x56, 0x34, 0x16, 0x09, 0xD5, 0x18, + 0x04, 0x06, 0x53, 0x30, 0x31, 0x38, 0xED, 0x94, 0x63, 0x39, 0x8E, 0xF1, 0x4B, 0xA6, 0x1F, 0x4E, + 0xDA, 0x20, 0x77, 0x1D, 0x0A, 0xE7, 0xAE, 0xC2, 0x2B, 0xA3, 0x28, 0x07, 0x85, 0x8A, 0xE3, 0xA2, + 0x74, 0xBC, 0x98, 0x76, 0x87, 0x8A, 0x58, 0x8C, 0xA3, 0x18, 0xEA, 0x32, 0x5A, 0xED, 0xA0, 0x56, + 0x1F, 0x8D, 0x85, 0xD2, 0x43, 0x92, 0x4A, 0xDF, 0xD5, 0xEB, 0xFE, 0x0E, 0x6B, 0xD4, 0xE8, 0x0B, + 0xBD, 0xB0, 0x99, 0xFE, 0x3D, 0x21, 0x2B, 0x78, 0x5E, 0xE7, 0x1E, 0x67, 0x8C, 0x16, 0x2A, 0x65, + 0xC1, 0xDC, 0x9B, 0xAB, 0x46, 0x73, 0x5A, 0xA0, 0x0C, 0x22, 0x58, 0x8E, 0x74, 0x58, 0x31, 0x0C, + 0x44, 0x5F, 0x2D, 0xB6, 0xE5, 0x6F, 0x97, 0xBF, 0x5A, 0x48, 0x04, 0xA6, 0xE7, 0x89, 0x45, 0x2E, + 0xEE, 0x88, 0x31, 0x05, 0x36, 0xF9, 0x2F, 0x18, 0x26, 0x1B, 0xBF, 0x88, 0x9B, 0xAC, 0xD8, 0xB2, + 0x3A, 0x8A, 0xFF, 0x9C, 0x28, 0xB2, 0x7F, 0xDA, 0x65, 0xD6, 0x14, 0xCC, 0x0A, 0x59, 0x53, 0x76, + 0xBF, 0xC4, 0xBB, 0xF6, 0xDA, 0xAC, 0x2B, 0x80, 0x6B, 0xE0, 0x99, 0x1C, 0xF1, 0xB1, 0xEC, 0xB6, + 0x5B, 0xA3, 0x27, 0x61, 0x21, 0xE1, 0x9F, 0x42, 0xC5, 0x5E, 0x75, 0x6F, 0xA9, 0x58, 0x38, 0x01, + 0xF1, 0x52, 0xE8, 0x98, 0xEE, 0x65, 0xDD, 0xB3, 0x24, 0xD0, 0x61, 0xFC, 0x64, 0x81, 0xE9, 0x02, + 0x7B, 0x99, 0x94, 0x96, 0xA2, 0x44, 0xD9, 0x53, 0xE4, 0xA6, 0x82, 0xF2, 0x92, 0x1C, 0xA1, 0x45, + 0xFF, 0x24, 0x8E, 0x1C, 0x59, 0x85, 0xAA, 0xC5, 0xB6, 0xCE, 0x86, 0x0E, 0x86, 0xF2, 0x60, 0xD5, + 0x0E, 0xE6, 0xE4, 0x70, 0x09, 0xF9, 0xA8, 0x4A, 0x8F, 0x6C, 0x87, 0x95, 0x2D, 0x9E, 0x49, 0xFC, + 0x8A, 0x8B, 0x5D, 0x22, 0x26, 0x26, 0x45, 0xC2, 0x16, 0x4A, 0x1F, 0x20, 0x6C, 0x51, 0x49, 0x1E, + 0x29, 0x38, 0x71, 0x13, 0x8D, 0xE5, 0xE1, 0x52, 0xA3, 0x95, 0xB0, 0x58, 0x69, 0x13, 0x14, 0x55, + 0xA4, 0xB5, 0x1C, 0xC3, 0xC6, 0x93, 0x76, 0x38, 0x29, 0x7D, 0x8C, 0x46, 0xDC, 0x30, 0xA5, 0x98, + 0xD5, 0xE3, 0x03, 0x33, 0x0C, 0x4B, 0x27, 0x1F, 0xE1, 0x9B, 0xDB, 0xB3, 0xCF, 0x93, 0x97, 0x5D, + 0x27, 0x4A, 0x74, 0x8B, 0x64, 0x23, 0xD3, 0x97, 0x82, 0x57, 0x24, 0x07, 0x92, 0x3C, 0xD2, 0xE9, + 0x74, 0xD8, 0x96, 0x2B, 0x4B, 0x66, 0xF9, 0x1C, 0xA4, 0xC4, 0xC0, 0x63, 0x22, 0x10, 0x0E, 0xE8, + 0x44, 0xD6, 0x36, 0x55, 0x03, 0xC0, 0xB7, 0x52, 0xF2, 0x09, 0xD3, 0x06, 0x1A, 0xDE, 0x06, 0xD0, + 0xDD, 0x1E, 0xD9, 0x03, 0xF5, 0x48, 0xFC, 0x8C, 0xC9, 0x2E, 0x61, 0xE9, 0xA5, 0x37, 0xFE, 0x18, + 0x6E, 0x98, 0x80, 0xC6, 0x09, 0x2C, 0x83, 0x7B, 0x3B, 0xA0, 0x06, 0x59, 0x0E, 0xE0, 0x97, 0xB3, + 0xA1, 0x62, 0x0B, 0xC1, 0x77, 0x11, 0x32, 0x4B, 0x96, 0xAF, 0xFD, 0x3C, 0xA2, 0xA6, 0x49, 0x48, + 0x35, 0x2D, 0x44, 0x27, 0xA4, 0x40, 0x59, 0x2C, 0x47, 0xE5, 0xD2, 0x55, 0x18, 0x90, 0x20, 0xF3, + 0x7A, 0xFE, 0x33, 0x6A, 0xCC, 0x07, 0xCA, 0x5C, 0xBC, 0x13, 0x63, 0x98, 0x37, 0x4B, 0x2A, 0xDD, + 0xC3, 0xC6, 0x0F, 0xFC, 0x90, 0xB6, 0x67, 0x67, 0x09, 0x28, 0x70, 0xCC, 0x87, 0x05, 0x75, 0xB2, + 0xF6, 0xA9, 0xE0, 0xA5, 0x67, 0x6E, 0x89, 0x21, 0xDD, 0x3A, 0x51, 0x84, 0x31, 0xE1, 0x86, 0x74, + 0x34, 0x71, 0xEA, 0xE7, 0xBC, 0x1F, 0x9B, 0x69, 0xAF, 0x0B, 0x7C, 0x82, 0x70, 0x0C, 0xB4, 0xB9, + 0x12, 0xBB, 0x16, 0x48, 0xA2, 0x15, 0xD9, 0xF0, 0x26, 0x87, 0x42, 0xFB, 0xDD, 0x15, 0x46, 0x38, + 0xD0, 0xF6, 0x5E, 0xE0, 0x55, 0xFF, 0xB7, 0xF3, 0x76, 0x4E, 0x13, 0xDC, 0xB2, 0x2E, 0x43, 0x63, + 0x0C, 0xBD, 0x13, 0xA8, 0x8C, 0x24, 0x2A, 0x7A, 0x56, 0xCE, 0x33, 0xC6, 0x94, 0x31, 0x87, 0x88, + 0x43, 0x6F, 0x48, 0x46, 0xFA, 0xEB, 0xEE, 0x6F, 0xBB, 0xDF, 0x10, 0x50, 0xDC, 0xDF, 0xCC, 0xFC, + 0x7D, 0x39, 0x8C, 0xC7, 0xF9, 0xD2, 0xD1, 0x2D, 0x8C, 0x18, 0x12, 0xD9, 0xE7, 0xF6, 0x72, 0x23, + 0x7C, 0x9A, 0xB1, 0x9C, 0xCB, 0xB2, 0x5E, 0xB3, 0x28, 0x2C, 0x4E, 0x52, 0xBF, 0x1E, 0x17, 0xF0, + 0x03, 0xC8, 0x01, 0xB1, 0xB9, 0x2A, 0xD9, 0x51, 0xEE, 0x15, 0x15, 0x12, 0x83, 0x63, 0x6B, 0xCE, + 0xDB, 0xBF, 0x9B, 0x6A, 0xF8, 0x24, 0x41, 0xF7, 0x27, 0xC0, 0xA6, 0xDF, 0xF2, 0x61, 0xD3, 0x6F, + 0x2F, 0x09, 0x9B, 0x7E, 0x2B, 0x8B, 0x4D, 0xBF, 0xBD, 0x62, 0xD3, 0x7C, 0x6C, 0xFA, 0x96, 0x0F, + 0x9B, 0xBE, 0xBD, 0x24, 0x6C, 0xFA, 0x56, 0x16, 0x9B, 0xBE, 0xBD, 0x62, 0xD3, 0x74, 0xC7, 0x69, + 0x90, 0xB3, 0x50, 0x9E, 0x97, 0x92, 0x7D, 0x1E, 0x7C, 0xCA, 0x59, 0xF0, 0xE1, 0x99, 0x51, 0x2A, + 0xCB, 0xC1, 0x39, 0xBE, 0xEC, 0x62, 0x28, 0x15, 0x6F, 0xFA, 0x72, 0x90, 0x4A, 0x6E, 0xE7, 0x59, + 0xE8, 0xD1, 0xF3, 0x15, 0x2F, 0x4E, 0x62, 0x62, 0xF7, 0x1A, 0x24, 0xD4, 0xA5, 0x74, 0x76, 0x68, + 0x68, 0xE8, 0x27, 0xC4, 0x69, 0x65, 0x19, 0xA1, 0xD4, 0x2C, 0x20, 0x58, 0xFF, 0x11, 0xC0, 0xF6, + 0xC0, 0x02, 0x74, 0xC7, 0x7D, 0xDC, 0x75, 0xD1, 0xC1, 0x57, 0x19, 0x51, 0x26, 0x44, 0xF0, 0x8D, + 0x17, 0xBC, 0x8B, 0x24, 0xA5, 0x5D, 0x36, 0x43, 0x2A, 0xA4, 0x78, 0xA5, 0xA9, 0xE8, 0x96, 0x68, + 0x75, 0x56, 0x61, 0xDA, 0x6B, 0xF5, 0xE6, 0xB1, 0xDC, 0xB1, 0xF9, 0x35, 0x95, 0xA7, 0x0F, 0x1A, + 0x4F, 0xC5, 0xAA, 0xD2, 0x9B, 0x9E, 0xA5, 0x2B, 0x00, 0xE3, 0xA4, 0x66, 0x3D, 0xF3, 0xCD, 0x1F, + 0x94, 0x52, 0x34, 0x3F, 0x92, 0x44, 0xAE, 0x32, 0x61, 0x09, 0xEF, 0xBD, 0x83, 0x7A, 0x4E, 0x47, + 0x99, 0x68, 0xDA, 0xA9, 0x54, 0x9C, 0xA8, 0xF7, 0x4A, 0x6B, 0xD7, 0x09, 0x8B, 0x97, 0x14, 0x66, + 0xF1, 0x62, 0xC0, 0x2C, 0x51, 0xC6, 0x37, 0x57, 0xCA, 0xCF, 0x39, 0x63, 0x36, 0xC7, 0x63, 0x9E, + 0xAE, 0x6A, 0xCC, 0x3D, 0x1A, 0xF3, 0x6C, 0x55, 0xC3, 0x61, 0xAA, 0x59, 0x3C, 0xD1, 0x6E, 0x87, + 0x9A, 0xB8, 0xF4, 0x6F, 0x1D, 0xE7, 0xCA, 0xB1, 0x07, 0xB7, 0xCE, 0x29, 0x6F, 0x4B, 0x3C, 0x04, + 0xAE, 0x32, 0x73, 0x26, 0xC5, 0xD2, 0x58, 0x97, 0x9F, 0x76, 0x8E, 0xD4, 0xAA, 0xEB, 0x2C, 0xA4, + 0x4C, 0x5C, 0x46, 0x2D, 0xD2, 0x18, 0xA5, 0x19, 0x46, 0x52, 0x74, 0x59, 0xB0, 0x05, 0x4A, 0xF5, + 0x8F, 0x66, 0xA7, 0x13, 0xC3, 0x28, 0x6A, 0x67, 0x9A, 0xE3, 0xF3, 0xA6, 0x2D, 0x77, 0xDE, 0xE1, + 0x00, 0xA1, 0xBD, 0x6C, 0x61, 0x33, 0x37, 0x00, 0x15, 0x05, 0x5F, 0xEA, 0xDC, 0xC7, 0x43, 0xE0, + 0xEC, 0xDB, 0xF4, 0x6D, 0x7D, 0x2C, 0x7C, 0x80, 0x06, 0x20, 0x68, 0xEC, 0xC8, 0x4A, 0x22, 0x9A, + 0x41, 0xE1, 0x46, 0x3B, 0x64, 0xD0, 0x8B, 0xAA, 0x3C, 0x79, 0x5C, 0x87, 0x13, 0x24, 0x26, 0x66, + 0xD0, 0xDB, 0x72, 0x59, 0xCC, 0x14, 0x2F, 0xDD, 0xCE, 0xB7, 0x98, 0x2B, 0xF4, 0x25, 0x5C, 0x5F, + 0x7C, 0xE4, 0xCE, 0xDC, 0xDB, 0x8B, 0xC6, 0x3A, 0xDC, 0x5E, 0x7C, 0xA4, 0xE4, 0x64, 0xEA, 0x3A, + 0x6F, 0xE1, 0x97, 0x16, 0x03, 0xD5, 0x71, 0xD9, 0x0B, 0xA6, 0x8D, 0xBE, 0xB6, 0xF8, 0x18, 0x2D, + 0x7E, 0x7C, 0x75, 0x91, 0x9F, 0x12, 0xF3, 0x70, 0xBB, 0xC4, 0xD5, 0xC5, 0x94, 0xE1, 0xA2, 0xEB, + 0x8B, 0xAB, 0xAB, 0x61, 0xFE, 0x91, 0x37, 0xE0, 0x9A, 0x03, 0xD6, 0x93, 0xBE, 0xD9, 0xC0, 0x9F, + 0x5E, 0xEF, 0x35, 0x16, 0xA2, 0x98, 0xC7, 0x18, 0xC6, 0x95, 0x26, 0x48, 0x5F, 0xCA, 0xB7, 0xDE, + 0x39, 0x74, 0x36, 0xAB, 0xEA, 0x27, 0x0C, 0x60, 0x8A, 0xC0, 0x28, 0x64, 0xE3, 0x29, 0x9D, 0x2D, + 0xB8, 0x8C, 0xED, 0x26, 0x01, 0x86, 0x12, 0xE6, 0x40, 0xD5, 0xF4, 0x85, 0xD9, 0x6E, 0xE2, 0x28, + 0x82, 0x2A, 0xCC, 0x72, 0x71, 0x04, 0x46, 0xD8, 0x04, 0x24, 0x09, 0x01, 0x51, 0x06, 0x4B, 0x54, + 0xDB, 0x97, 0x65, 0x37, 0x96, 0x12, 0xBC, 0x20, 0x31, 0xF5, 0x02, 0x4B, 0x3E, 0x88, 0xA9, 0x46, + 0xDF, 0x82, 0x96, 0xE4, 0x59, 0x91, 0xD6, 0x20, 0xBB, 0xCB, 0xA1, 0x98, 0x1C, 0xAB, 0x00, 0xB6, + 0x24, 0xAD, 0x45, 0xC9, 0x29, 0xCF, 0xB7, 0x17, 0x6D, 0xF4, 0xD5, 0x75, 0xF1, 0xD6, 0x53, 0x39, + 0xC0, 0x89, 0x25, 0x79, 0x78, 0x25, 0x9B, 0xB8, 0x27, 0xB3, 0x9B, 0x7C, 0x3A, 0x39, 0xCF, 0x7F, + 0x5C, 0x7F, 0xD6, 0xBC, 0xEF, 0xBB, 0x30, 0x1C, 0x3A, 0x79, 0x96, 0x3C, 0xE4, 0x17, 0x24, 0x99, + 0xC4, 0xA4, 0x93, 0x4F, 0x1C, 0xDB, 0xB2, 0x13, 0x2A, 0xDF, 0x78, 0x6E, 0x59, 0xA6, 0xEB, 0x3B, + 0xA6, 0x11, 0x95, 0x53, 0x83, 0x29, 0x87, 0x55, 0xD7, 0x94, 0x10, 0x13, 0x09, 0x68, 0xA8, 0xA7, + 0x69, 0x0A, 0x78, 0xF1, 0xF7, 0xF1, 0xF7, 0x91, 0x63, 0x07, 0x54, 0x58, 0x45, 0x05, 0x14, 0xE0, + 0x36, 0xD9, 0x46, 0x21, 0xE1, 0x66, 0xF9, 0x02, 0x4E, 0x21, 0x21, 0x27, 0xBF, 0x1D, 0x39, 0x93, + 0x89, 0xEF, 0x17, 0x92, 0xF1, 0x8A, 0x5F, 0xFE, 0x45, 0x18, 0x9D, 0x7B, 0x59, 0x39, 0xAF, 0x9D, + 0xF2, 0xBE, 0xE7, 0x4E, 0xCE, 0x65, 0x15, 0x35, 0x1A, 0x9F, 0xC6, 0x59, 0x08, 0xD5, 0xA6, 0x33, + 0x4A, 0xA6, 0xC2, 0x38, 0x2D, 0xDE, 0x17, 0xC7, 0xFB, 0x45, 0x8C, 0xD3, 0xD3, 0x94, 0x6E, 0xA9, + 0x54, 0x23, 0xA5, 0x48, 0x3F, 0xE2, 0x98, 0xDB, 0x6F, 0xCC, 0x94, 0x86, 0xF5, 0x9A, 0x80, 0xBB, + 0xA0, 0x12, 0x54, 0x88, 0xB1, 0x51, 0xEC, 0x98, 0x66, 0xE9, 0xD0, 0x16, 0xF9, 0x0D, 0xA6, 0x7C, + 0x93, 0x39, 0xF7, 0x39, 0x83, 0x9F, 0x88, 0x07, 0x95, 0x39, 0x59, 0x96, 0xA2, 0x19, 0x5D, 0xF6, + 0x65, 0xA6, 0x0A, 0x6E, 0xEC, 0x44, 0x93, 0x93, 0xB5, 0x15, 0xD4, 0x94, 0x29, 0x52, 0xEA, 0x5F, + 0xFD, 0xA0, 0x27, 0x3C, 0x8D, 0xEA, 0x16, 0xFC, 0xAB, 0xAC, 0x50, 0xA5, 0x5C, 0x7B, 0x4F, 0xE0, + 0x5F, 0xDB, 0xD6, 0x98, 0xE2, 0x61, 0x18, 0xA4, 0x73, 0x72, 0xD3, 0x19, 0x27, 0xB5, 0x89, 0xB8, + 0x53, 0x14, 0xA7, 0x0E, 0xDD, 0xE1, 0x03, 0xAA, 0xD7, 0x13, 0xFA, 0xF7, 0x8E, 0xF9, 0xDB, 0x10, + 0x7A, 0x78, 0x94, 0x55, 0x1A, 0x65, 0x04, 0x94, 0x2A, 0x13, 0x89, 0xD3, 0x22, 0x27, 0x5C, 0x4D, + 0x5D, 0x90, 0xB9, 0x0E, 0xB0, 0x9F, 0x61, 0x62, 0xD4, 0x1D, 0x8A, 0x46, 0x0A, 0x6C, 0xF9, 0x02, + 0x35, 0x89, 0x0A, 0x06, 0xC5, 0x2B, 0x45, 0x46, 0xEB, 0xA4, 0x5D, 0xA7, 0xE8, 0x24, 0xEB, 0x5E, + 0x7B, 0xF4, 0x95, 0x21, 0x4C, 0xD5, 0x74, 0x18, 0x62, 0x84, 0xE2, 0x8C, 0xFB, 0x45, 0x46, 0x35, + 0xA5, 0x36, 0x53, 0x51, 0x5C, 0x40, 0xB6, 0x8F, 0x97, 0x40, 0xEA, 0xCD, 0x19, 0xA4, 0xCE, 0xF2, + 0xE5, 0x8D, 0x9A, 0x4E, 0xF2, 0x16, 0xF4, 0x71, 0xD2, 0x39, 0x4B, 0x53, 0x3C, 0xFC, 0xB4, 0xB6, + 0x04, 0x0F, 0x73, 0x9B, 0x42, 0xEF, 0x9A, 0x61, 0xE4, 0x25, 0x75, 0x45, 0x2B, 0x79, 0x09, 0xFD, + 0x95, 0x0C, 0x0B, 0x93, 0xE1, 0xEA, 0xF4, 0x71, 0x4D, 0x6E, 0xB1, 0xDC, 0xE1, 0x1C, 0xD2, 0xF8, + 0x64, 0xCA, 0x4A, 0x85, 0x24, 0x39, 0x2B, 0xAF, 0xD3, 0x38, 0x5B, 0xA3, 0xDC, 0xC2, 0xF8, 0x12, + 0xE9, 0xA2, 0x6D, 0xFA, 0x82, 0x2A, 0x0A, 0x46, 0x47, 0x17, 0x45, 0xB5, 0x28, 0xA1, 0x5A, 0x01, + 0x26, 0xC4, 0x48, 0x29, 0x63, 0x27, 0xE4, 0xEA, 0xE8, 0x04, 0x0B, 0xFC, 0x80, 0xB2, 0xB2, 0x51, + 0xEE, 0x19, 0x47, 0x50, 0x9D, 0x2E, 0x7B, 0x20, 0x03, 0x81, 0x65, 0xEC, 0xB2, 0xE9, 0x8F, 0xE4, + 0xF1, 0x85, 0x24, 0xA4, 0xD9, 0x8F, 0x0C, 0xB0, 0x8E, 0x53, 0xD2, 0x32, 0xBF, 0xC6, 0x4E, 0x46, + 0x98, 0x7D, 0x90, 0xA8, 0xC1, 0x50, 0x34, 0x80, 0x84, 0xD2, 0xE3, 0x7D, 0xCC, 0x40, 0x03, 0x73, + 0xF4, 0x28, 0xDC, 0x45, 0xDA, 0x2C, 0x71, 0x8A, 0x9B, 0xED, 0x0D, 0xF2, 0x04, 0x43, 0xCC, 0xC1, + 0x72, 0x9C, 0xF7, 0x92, 0x34, 0x50, 0xCC, 0x14, 0x93, 0x68, 0xFB, 0x22, 0x2D, 0x76, 0x6A, 0x85, + 0x37, 0x61, 0xC0, 0xD3, 0xAC, 0xE4, 0xB6, 0x8A, 0x53, 0x3C, 0x91, 0x41, 0x44, 0xC3, 0xC8, 0xE4, + 0xA4, 0xEB, 0xC1, 0x29, 0xF0, 0xD0, 0x53, 0x9A, 0xB8, 0x51, 0x84, 0x69, 0x84, 0x5F, 0xDD, 0x21, + 0xBE, 0xA3, 0xD3, 0xB1, 0x3A, 0xC9, 0x36, 0x80, 0xFC, 0x6C, 0x31, 0x4E, 0x03, 0xE0, 0x9B, 0xC6, + 0x44, 0x7F, 0xAA, 0x9E, 0x7A, 0xEC, 0xC8, 0x56, 0x45, 0xBE, 0xC2, 0x17, 0xE0, 0x89, 0xD9, 0xF3, + 0x94, 0xDC, 0x5B, 0x9C, 0xA1, 0xA8, 0x03, 0x17, 0x4F, 0x77, 0xFF, 0x98, 0x5D, 0x00, 0xBC, 0x04, + 0xBB, 0xAA, 0x9E, 0xE2, 0xB0, 0x5B, 0x87, 0xEF, 0x60, 0x0F, 0xD8, 0xAD, 0xE3, 0xE9, 0xC3, 0xAD, + 0x46, 0xBD, 0x09, 0x5F, 0x5E, 0xAC, 0x33, 0xDA, 0x33, 0x32, 0x9F, 0x14, 0x79, 0x95, 0x62, 0x42, + 0xC9, 0x3E, 0x5E, 0xEE, 0xF5, 0x01, 0x20, 0xF3, 0xEF, 0x28, 0x73, 0x97, 0x91, 0x56, 0x94, 0x00, + 0xBC, 0xB5, 0x0E, 0x6C, 0x65, 0xBE, 0x15, 0x30, 0x14, 0xBE, 0x3B, 0xC4, 0x3C, 0xCE, 0x52, 0xCC, + 0x83, 0x38, 0x45, 0x30, 0x4A, 0x33, 0x0A, 0xA9, 0x1E, 0xEF, 0x24, 0x38, 0x8E, 0x4C, 0xEE, 0x46, + 0x02, 0x8C, 0x7C, 0x4C, 0x22, 0x39, 0x3A, 0xA4, 0x7A, 0x8C, 0x1B, 0xB2, 0x80, 0xF3, 0x0E, 0xF3, + 0x87, 0xA8, 0x42, 0x63, 0x5E, 0x4B, 0x24, 0x50, 0xB4, 0x62, 0x53, 0xB8, 0x2F, 0x08, 0xE1, 0xB5, + 0x57, 0x7A, 0x5F, 0xB4, 0xB1, 0x30, 0xC2, 0xE0, 0x30, 0x1F, 0x60, 0x89, 0xFB, 0x1F, 0xD5, 0xC7, + 0x0A, 0xC9, 0x5C, 0xFA, 0x78, 0xAC, 0x8A, 0xD4, 0x43, 0x07, 0xDC, 0xD0, 0x49, 0xA1, 0x52, 0xE6, + 0x1E, 0x90, 0x62, 0x01, 0x9E, 0x9D, 0xD0, 0x3F, 0x82, 0x22, 0x2C, 0xE3, 0xDC, 0x29, 0x5D, 0x0E, + 0xD3, 0x58, 0xB8, 0xB8, 0xF0, 0x50, 0x96, 0xDA, 0x37, 0x06, 0xD2, 0x2B, 0xD1, 0x21, 0x4A, 0x5D, + 0x49, 0x7E, 0xE3, 0x71, 0xDF, 0x70, 0xF4, 0x31, 0xFF, 0x49, 0x49, 0xF2, 0x70, 0x99, 0x91, 0x16, + 0x11, 0x9E, 0x95, 0x8B, 0xB6, 0x08, 0x9B, 0xBF, 0x46, 0x5C, 0xAC, 0x8A, 0xAA, 0x16, 0x1F, 0x71, + 0x71, 0xA5, 0x89, 0x5D, 0xBC, 0x56, 0xC7, 0xFB, 0xC2, 0xD7, 0xC0, 0x8B, 0xC5, 0x5C, 0x1C, 0x97, + 0x0E, 0xBC, 0x08, 0x09, 0x2A, 0x67, 0xF0, 0x45, 0xFE, 0x6D, 0x8A, 0xEF, 0xF2, 0xE2, 0x83, 0x35, + 0xC6, 0xC7, 0xD5, 0xF4, 0x80, 0x8D, 0xF1, 0xF3, 0xB5, 0x0B, 0xDA, 0xD8, 0xAF, 0xD7, 0xEA, 0xEF, + 0xEA, 0xCD, 0x77, 0xFB, 0x6F, 0xDF, 0xB1, 0x6A, 0xA3, 0x7E, 0x50, 0x6B, 0x1C, 0x1D, 0xD4, 0x0F, + 0xDE, 0x1E, 0x36, 0x58, 0xE3, 0xE0, 0x10, 0x9E, 0x1D, 0xBD, 0x5B, 0x70, 0xC4, 0xC6, 0x2A, 0x06, + 0x0C, 0xC3, 0x35, 0x56, 0x31, 0x56, 0x8E, 0x58, 0x8D, 0x99, 0xD3, 0x28, 0x76, 0x47, 0x5F, 0x72, + 0xCE, 0xAF, 0x81, 0x1A, 0x73, 0x03, 0x35, 0x26, 0x45, 0xCD, 0xC5, 0x07, 0x6B, 0x84, 0x63, 0x2C, + 0x23, 0x60, 0x63, 0xE9, 0xF3, 0x8F, 0x0F, 0xB2, 0xA4, 0xC0, 0x8D, 0xA5, 0xAF, 0x21, 0x39, 0xCC, + 0x0B, 0x08, 0xE0, 0x88, 0x9F, 0x67, 0x3F, 0x57, 0x1C, 0xC7, 0xD2, 0x92, 0xCE, 0x2D, 0xBF, 0x2E, + 0x74, 0x97, 0x7B, 0x77, 0x58, 0x8D, 0x31, 0x51, 0x17, 0x5A, 0xFE, 0xB8, 0xBA, 0xBA, 0xD0, 0xE1, + 0x24, 0x9E, 0xAB, 0x2E, 0xB4, 0x4F, 0xE3, 0xA3, 0x8C, 0x1E, 0xB8, 0x84, 0xE9, 0xA1, 0x3D, 0xFD, + 0x8D, 0x3F, 0x51, 0x20, 0x9A, 0xB2, 0xCD, 0x4E, 0x94, 0x87, 0xFE, 0x42, 0x39, 0xE6, 0x64, 0x7D, + 0x68, 0x29, 0xF8, 0x0B, 0x74, 0x24, 0xD1, 0x74, 0xCC, 0xD8, 0xA6, 0x14, 0xE9, 0x64, 0x3F, 0x81, + 0x4C, 0xE4, 0x66, 0x27, 0x4A, 0x53, 0xBF, 0xB0, 0x9A, 0xD1, 0x72, 0x5F, 0xD7, 0xA0, 0x66, 0xB4, + 0x9C, 0xC8, 0x6B, 0xCD, 0xE8, 0xCC, 0x52, 0x76, 0x93, 0x80, 0x2A, 0x58, 0xC8, 0x6E, 0xA2, 0x83, + 0x97, 0x53, 0x35, 0x31, 0xB1, 0xB4, 0xD7, 0x9A, 0xD1, 0xB9, 0xD1, 0xA8, 0x4C, 0xCD, 0xE8, 0x89, + 0x0E, 0x5E, 0x28, 0x1A, 0xBD, 0xD6, 0x8C, 0xCE, 0x89, 0x44, 0x65, 0x6A, 0x46, 0x4F, 0x74, 0xF0, + 0x82, 0x91, 0xE8, 0xB5, 0x66, 0x74, 0x11, 0x4C, 0x2A, 0x5E, 0xA0, 0x75, 0x4A, 0x17, 0x2F, 0x0E, + 0x9B, 0x7E, 0xFA, 0x9A, 0xD1, 0x93, 0x70, 0x28, 0x87, 0x25, 0x2F, 0xB1, 0x66, 0xF4, 0xC4, 0xD2, + 0x5E, 0x6B, 0x46, 0x2F, 0x14, 0xD5, 0x4A, 0xB3, 0xA4, 0x75, 0xAA, 0x19, 0x3D, 0xAB, 0x24, 0x2E, + 0x2B, 0x5B, 0x13, 0x37, 0xDB, 0x32, 0x30, 0xDF, 0x56, 0xB2, 0xCC, 0x9A, 0xB8, 0x39, 0xAB, 0xE1, + 0xCA, 0x25, 0x3C, 0x63, 0x35, 0x5C, 0x39, 0x81, 0x9F, 0xAB, 0x1A, 0xAE, 0x02, 0xFA, 0x6B, 0x35, + 0xDC, 0xC2, 0xD6, 0x9B, 0xF2, 0x65, 0x6F, 0x31, 0x43, 0xCB, 0xBA, 0x97, 0xBE, 0xC5, 0x39, 0x2E, + 0xAD, 0xFC, 0x2D, 0x75, 0x9E, 0xB1, 0x81, 0x54, 0x2C, 0x22, 0xAA, 0x7F, 0xBB, 0x99, 0xD5, 0x6E, + 0x69, 0x0D, 0xE8, 0xFB, 0xE7, 0x01, 0x77, 0x1F, 0x99, 0x22, 0x16, 0x72, 0x43, 0x4E, 0xC8, 0x1A, + 0x7A, 0x16, 0x19, 0x92, 0xC2, 0x90, 0x3E, 0x1B, 0x9F, 0x7E, 0x10, 0x69, 0x46, 0x15, 0x68, 0x1B, + 0xF5, 0xFA, 0xC1, 0x0E, 0xFC, 0x7D, 0xBB, 0x8F, 0x7F, 0x8F, 0xE8, 0xEF, 0x3B, 0xFC, 0xDB, 0x68, + 0xEE, 0x4B, 0x2F, 0xC1, 0x7A, 0x2D, 0x6C, 0xD4, 0x68, 0xEE, 0xD5, 0x95, 0xBB, 0xA1, 0xF2, 0xA7, + 0x80, 0x63, 0x82, 0xA2, 0x82, 0xF0, 0x29, 0x85, 0x5A, 0xF9, 0x61, 0x69, 0xAF, 0x7B, 0x18, 0xDF, + 0x36, 0xE8, 0x4A, 0x1A, 0xEF, 0x1F, 0x84, 0x66, 0x5A, 0x8E, 0xA7, 0xA2, 0x79, 0xD4, 0x5C, 0x31, + 0xEA, 0x61, 0x17, 0x8E, 0x1A, 0xB9, 0x11, 0xE3, 0x22, 0xBA, 0xE9, 0x72, 0xB3, 0xB1, 0x68, 0xA1, + 0x58, 0x3D, 0x34, 0x55, 0x5E, 0x17, 0xF8, 0x08, 0x70, 0x17, 0xCF, 0x34, 0x0C, 0xAC, 0x97, 0xEB, + 0xD0, 0x02, 0x29, 0x70, 0x10, 0xAB, 0x6B, 0x20, 0x04, 0xB0, 0x8C, 0xC8, 0x8B, 0xAE, 0x58, 0x9B, + 0x85, 0xEA, 0x9B, 0x54, 0xB5, 0x76, 0x46, 0x15, 0xD5, 0x89, 0x02, 0xA9, 0x88, 0x31, 0xD3, 0xAA, + 0xA3, 0x16, 0xAB, 0x8A, 0xBA, 0x01, 0xB5, 0x66, 0xF3, 0x02, 0xE4, 0xCA, 0xB9, 0x3F, 0x0D, 0xE9, + 0x0D, 0x81, 0x13, 0x01, 0x25, 0xA7, 0x2C, 0x80, 0x75, 0x65, 0xEF, 0x59, 0xD4, 0x05, 0xD0, 0xA0, + 0xFD, 0xBD, 0x70, 0x8D, 0xD8, 0x4C, 0x00, 0xA5, 0x2A, 0xC4, 0xE6, 0x61, 0xD2, 0x8B, 0xB9, 0xD7, + 0xCB, 0xF3, 0xFB, 0xF4, 0x91, 0x52, 0x55, 0x62, 0x49, 0xB8, 0x67, 0x1D, 0xEE, 0xF5, 0xD1, 0xE1, + 0xE7, 0xF9, 0xCB, 0xC5, 0xBA, 0xEE, 0xB2, 0x8A, 0xC5, 0x76, 0x3A, 0xA5, 0x4A, 0xC5, 0x46, 0xCD, + 0xA6, 0x8F, 0x35, 0xB5, 0x44, 0xEC, 0xF4, 0x57, 0xA5, 0x1E, 0x95, 0x80, 0x74, 0xAA, 0x4C, 0xAC, + 0x1B, 0x7B, 0x63, 0xDD, 0xCA, 0xC5, 0x46, 0x70, 0x58, 0x60, 0xB1, 0xD8, 0x39, 0xA4, 0xD2, 0xA6, + 0xEB, 0x4E, 0x76, 0xD9, 0x3E, 0x0E, 0xF5, 0xD2, 0x21, 0xF4, 0x79, 0x0F, 0x6B, 0xBE, 0x6C, 0xCF, + 0xF1, 0x94, 0xDB, 0x3D, 0x41, 0x5D, 0x74, 0xBE, 0xA7, 0x5B, 0x1B, 0xA3, 0x71, 0x41, 0xAF, 0x35, + 0x2D, 0xF6, 0x9D, 0xC3, 0x47, 0xC0, 0x04, 0xD3, 0xE3, 0xD1, 0x38, 0x06, 0x3C, 0xBE, 0xE1, 0x23, + 0xCD, 0xB4, 0x41, 0xB2, 0x9F, 0x33, 0x94, 0xC3, 0xFE, 0x02, 0xAD, 0x67, 0xAB, 0xBE, 0xCF, 0x77, + 0x05, 0x9F, 0x40, 0xA3, 0xE8, 0x6A, 0xD8, 0xEF, 0x3A, 0x81, 0xA7, 0xF3, 0xE8, 0x3A, 0x3E, 0x81, + 0x8E, 0x32, 0x10, 0x6A, 0x3E, 0xE7, 0x8A, 0x75, 0xB5, 0xE4, 0xEB, 0xFB, 0x8C, 0x05, 0xAC, 0xF4, + 0x2A, 0x5F, 0x85, 0x88, 0x25, 0xA0, 0x35, 0xBE, 0x6F, 0xF7, 0xA5, 0x6C, 0xA6, 0xDD, 0x81, 0x38, + 0x48, 0x51, 0xDB, 0x63, 0xED, 0x4F, 0x82, 0xD9, 0xD8, 0xCC, 0x2B, 0x76, 0x17, 0x34, 0x7B, 0xAA, + 0x40, 0xE7, 0xCF, 0x2F, 0x93, 0xFD, 0x04, 0x54, 0xCE, 0x8D, 0xCE, 0x5A, 0x20, 0x1C, 0x20, 0xB5, + 0x1B, 0x6E, 0xF3, 0x7B, 0x0D, 0x63, 0x2D, 0xE1, 0x3B, 0xD2, 0x1E, 0x53, 0xBF, 0xE4, 0x75, 0x06, + 0x7E, 0x0A, 0x46, 0xA6, 0xE7, 0x50, 0x60, 0x4F, 0x9F, 0x68, 0xD9, 0x50, 0xA8, 0xF8, 0x0B, 0xA2, + 0x19, 0xB1, 0x2B, 0xC3, 0x73, 0x5C, 0x50, 0x55, 0x50, 0x23, 0x69, 0x1E, 0x31, 0xE4, 0x56, 0x28, + 0xED, 0x10, 0x13, 0x7B, 0x04, 0x05, 0x07, 0x26, 0x8A, 0x71, 0x4D, 0x3A, 0x85, 0x5D, 0x6A, 0xA0, + 0x3F, 0x8D, 0x5C, 0x0A, 0xB8, 0x50, 0x26, 0x0F, 0xFC, 0xF8, 0xE6, 0x93, 0x33, 0xE2, 0x6F, 0xC8, + 0xD4, 0xB1, 0x03, 0x82, 0x17, 0x96, 0x7D, 0xC6, 0x7E, 0x76, 0xF0, 0x99, 0x87, 0x2B, 0xA4, 0x81, + 0x8A, 0xA3, 0xF2, 0xF2, 0x6C, 0x18, 0x39, 0x70, 0x7E, 0x35, 0xE6, 0xEA, 0x38, 0x67, 0x92, 0x47, + 0x54, 0xC7, 0x73, 0xFA, 0xA6, 0xC5, 0x6F, 0x9D, 0xEF, 0xDC, 0x5E, 0xC4, 0x35, 0xD9, 0x64, 0x7C, + 0x8F, 0x3A, 0x0A, 0xD5, 0x40, 0x8C, 0x46, 0x3A, 0x7E, 0x36, 0xF3, 0xDA, 0x65, 0x1F, 0xED, 0x65, + 0x1E, 0xE8, 0xC0, 0x03, 0xCD, 0x36, 0x7F, 0x48, 0xF9, 0x65, 0xA8, 0xF9, 0xE8, 0xB9, 0xE4, 0x78, + 0xAE, 0x43, 0x5A, 0x2C, 0xA8, 0xD4, 0xF6, 0xA0, 0x2B, 0x3C, 0xAE, 0x8D, 0xD8, 0x04, 0xF7, 0xD4, + 0x74, 0x1D, 0xCD, 0xCA, 0x3B, 0xD2, 0x6A, 0x66, 0x12, 0x0B, 0xF5, 0x38, 0x59, 0xE1, 0x90, 0x40, + 0xA9, 0x77, 0x3D, 0xF0, 0x01, 0x8F, 0x95, 0xD3, 0x13, 0xDA, 0xF2, 0x68, 0xE9, 0x02, 0x97, 0x1E, + 0xC7, 0x4B, 0xC0, 0xED, 0x47, 0x56, 0x65, 0xD2, 0xE5, 0x8A, 0x47, 0x45, 0x29, 0x25, 0x8C, 0x36, + 0xC6, 0xEC, 0xF6, 0xA4, 0xDB, 0xAA, 0xB7, 0x8B, 0xBE, 0x42, 0xC8, 0x40, 0xF1, 0xFC, 0x17, 0x09, + 0xF3, 0x3B, 0x7A, 0xF6, 0x7A, 0xBC, 0x0B, 0x54, 0xA1, 0x3C, 0xE1, 0x3F, 0xB3, 0xEA, 0xB4, 0x70, + 0x65, 0x09, 0xD7, 0x54, 0x4E, 0x5F, 0x8A, 0xB5, 0x9C, 0xA9, 0x08, 0x8D, 0x01, 0x36, 0xA1, 0x01, + 0x61, 0xEB, 0x75, 0x53, 0x7D, 0xE6, 0x2F, 0xA9, 0xAC, 0xF6, 0x43, 0x63, 0x90, 0x91, 0x11, 0x07, + 0x38, 0x1B, 0x6A, 0x70, 0x40, 0x5B, 0x6D, 0x38, 0xDD, 0x69, 0x61, 0x51, 0x06, 0xF6, 0x2C, 0x4F, + 0xC6, 0xD8, 0xE9, 0x14, 0x75, 0x76, 0xAA, 0x05, 0x70, 0x5A, 0x53, 0x6A, 0x28, 0x82, 0x36, 0xC3, + 0x1F, 0xC8, 0x34, 0x7C, 0xCC, 0xF2, 0x94, 0x57, 0x8E, 0x87, 0xFF, 0x24, 0x3B, 0x4D, 0x4E, 0x5A, + 0xFE, 0x14, 0x67, 0x25, 0x46, 0x38, 0xFF, 0x2C, 0x0A, 0x4E, 0x45, 0x95, 0x1C, 0xD5, 0xEB, 0x95, + 0x16, 0xFE, 0xCD, 0x19, 0xED, 0x91, 0x6A, 0xFF, 0xEE, 0x10, 0xDB, 0xE3, 0xDF, 0x72, 0xED, 0x1B, + 0xEF, 0x9A, 0xD8, 0x01, 0xFD, 0x53, 0xAE, 0x87, 0xBD, 0xA3, 0x7D, 0xEC, 0x81, 0xFE, 0x29, 0xD7, + 0xC3, 0xC1, 0x5B, 0x5A, 0x04, 0xFD, 0x53, 0x72, 0x15, 0x8D, 0x03, 0xB9, 0x0C, 0xFA, 0xB7, 0x5C, + 0x1F, 0xCD, 0xBD, 0x3A, 0x2D, 0x44, 0xFE, 0x5B, 0xAE, 0x8F, 0xFD, 0xC3, 0xBA, 0xDC, 0x4F, 0xFA, + 0xB7, 0xE4, 0x8E, 0x36, 0x1B, 0x72, 0x4F, 0xE9, 0xDF, 0x1C, 0x7D, 0xE4, 0x88, 0xFB, 0x59, 0xB0, + 0x7A, 0x78, 0x4B, 0x97, 0x12, 0x40, 0x58, 0x24, 0xF3, 0xE0, 0x95, 0x01, 0x0A, 0x21, 0x37, 0x27, + 0xED, 0xCB, 0x2F, 0x0C, 0x19, 0x59, 0x78, 0xA9, 0xA0, 0x03, 0x69, 0x0F, 0xE4, 0x55, 0x01, 0x88, + 0xE6, 0x3A, 0x66, 0xFB, 0xC3, 0xC4, 0x04, 0xE8, 0x00, 0x3E, 0x74, 0x50, 0xBE, 0x71, 0xFA, 0xF2, + 0xB2, 0x21, 0x26, 0xDA, 0x10, 0x16, 0xF4, 0x5C, 0x7F, 0xCD, 0xD4, 0x47, 0x79, 0x36, 0x79, 0x4F, + 0x53, 0x2E, 0x11, 0xEA, 0x8B, 0x62, 0x79, 0xA9, 0xBE, 0x2A, 0xAD, 0xCF, 0xC1, 0x03, 0x53, 0x5F, + 0x8A, 0xF3, 0xBA, 0x74, 0x6F, 0xD3, 0xA6, 0xBB, 0x10, 0x7E, 0x07, 0x88, 0x7D, 0xFD, 0xF9, 0xFC, + 0xA4, 0x24, 0x99, 0x57, 0x5A, 0x9D, 0x4E, 0x77, 0xF7, 0xFC, 0x0E, 0x6F, 0x8D, 0x6E, 0x01, 0x61, + 0x07, 0x18, 0x50, 0x51, 0x8A, 0xD8, 0xE5, 0x0A, 0x47, 0xC1, 0x83, 0x5A, 0x1C, 0xC0, 0xFD, 0xB2, + 0x79, 0x56, 0x92, 0x03, 0x82, 0x6A, 0xDE, 0x3E, 0xDB, 0x6D, 0x9F, 0x9C, 0xAD, 0x2D, 0xB5, 0xB6, + 0x4F, 0x6E, 0x4F, 0x92, 0xA4, 0xA9, 0x84, 0x10, 0x75, 0xE5, 0x67, 0x98, 0x7D, 0x4A, 0x2F, 0x03, + 0x4A, 0x8A, 0xEB, 0x5A, 0xA6, 0x8C, 0xE1, 0x04, 0x4D, 0x18, 0xF7, 0x4A, 0xA6, 0x33, 0x52, 0x2F, + 0x02, 0xF9, 0x9A, 0x9A, 0xC5, 0x6E, 0x7F, 0xDD, 0xBD, 0xF9, 0x15, 0xC9, 0xD7, 0x52, 0xF1, 0x9E, + 0xF1, 0xC4, 0x22, 0x35, 0x86, 0xBB, 0xA4, 0xF6, 0x27, 0xD1, 0xDA, 0x0D, 0x40, 0x82, 0x62, 0x2E, + 0xC7, 0x7E, 0x60, 0x06, 0x06, 0x73, 0x02, 0x81, 0xF2, 0x39, 0xAA, 0x4A, 0x07, 0xB6, 0x8F, 0x1A, + 0x52, 0x40, 0x3C, 0x45, 0x84, 0x8D, 0x51, 0x7C, 0x87, 0x79, 0xC0, 0xDE, 0x44, 0x1D, 0xA1, 0xCA, + 0x65, 0x53, 0x52, 0x05, 0x1C, 0x0C, 0x26, 0xD3, 0x6D, 0x9F, 0xEC, 0x76, 0xCF, 0xAE, 0x64, 0x08, + 0x88, 0x2E, 0xF7, 0xB3, 0xC6, 0x7E, 0x19, 0x72, 0x6E, 0xED, 0xB6, 0x4D, 0x8F, 0xDD, 0x9A, 0xFA, + 0xF7, 0xC4, 0x34, 0xC8, 0x56, 0xE0, 0x08, 0x4C, 0xDC, 0x80, 0xD9, 0x99, 0xBC, 0xBE, 0xA6, 0x83, + 0xDA, 0x56, 0x63, 0x6A, 0x17, 0x13, 0xEF, 0x2A, 0x85, 0xAC, 0x6F, 0x7A, 0x23, 0x34, 0xC2, 0xA6, + 0xE0, 0x13, 0xB1, 0x2D, 0x04, 0xD4, 0x66, 0x5A, 0xBC, 0x42, 0x2A, 0x47, 0x91, 0x66, 0x21, 0x1C, + 0x49, 0xCA, 0x60, 0x6D, 0xDC, 0x8C, 0xA7, 0x8A, 0x60, 0x89, 0x2E, 0x27, 0x66, 0xFB, 0x2A, 0x80, + 0xBD, 0x0A, 0x60, 0x3F, 0xA7, 0x00, 0x76, 0x69, 0x4B, 0xCE, 0x8C, 0x2E, 0x11, 0x3B, 0xCA, 0x47, + 0x24, 0x2D, 0x8E, 0x4D, 0xB2, 0xFC, 0x99, 0xD2, 0x58, 0x8C, 0xA7, 0xC5, 0x58, 0x9A, 0x84, 0xE1, + 0xFA, 0x89, 0x62, 0x39, 0xF9, 0x1A, 0x66, 0xE1, 0xF4, 0xE0, 0x78, 0xE8, 0xE0, 0x99, 0xB3, 0xB0, + 0x70, 0xB9, 0x05, 0x9B, 0xF8, 0x65, 0xBC, 0xE6, 0x79, 0x7C, 0xAA, 0xD1, 0x3D, 0x55, 0xF8, 0x2B, + 0xA3, 0x9F, 0x57, 0x60, 0xEB, 0x9F, 0x3A, 0x99, 0x95, 0x1B, 0xFC, 0x3F, 0x72, 0x9B, 0x13, 0x22, + 0x6B, 0x72, 0xE1, 0x78, 0x47, 0xCF, 0xBA, 0x4A, 0x5C, 0x80, 0xB3, 0x1B, 0xDE, 0x1B, 0x29, 0x9F, + 0xA8, 0x51, 0x00, 0x58, 0xDC, 0xA7, 0xE8, 0x81, 0x1D, 0xE9, 0xAE, 0x04, 0x9B, 0x8E, 0x4E, 0x45, + 0x4A, 0x90, 0xD0, 0x1F, 0x6B, 0xEC, 0x86, 0xFF, 0x11, 0x98, 0x1E, 0xF7, 0xC7, 0x89, 0x8B, 0xD3, + 0xDE, 0x8A, 0xCA, 0xC8, 0x2F, 0x3B, 0x68, 0xD4, 0xEB, 0x3B, 0xF5, 0x7A, 0x3D, 0xF0, 0x95, 0xAC, + 0xA2, 0x92, 0xBD, 0xA2, 0x80, 0xF2, 0x2E, 0x7A, 0x24, 0x67, 0xC0, 0xC5, 0x3D, 0xE7, 0xB6, 0x7C, + 0x2F, 0x5F, 0x2E, 0x99, 0xF5, 0xBE, 0x23, 0x98, 0x41, 0x34, 0x6D, 0x8E, 0x2E, 0x5F, 0xFE, 0xB3, + 0x14, 0x6B, 0x8B, 0x49, 0x17, 0x89, 0x99, 0xDD, 0xC2, 0x06, 0x9C, 0x4A, 0xF8, 0xD3, 0xF7, 0xDF, + 0x03, 0xBF, 0x6C, 0xB9, 0xA1, 0xEC, 0x6B, 0x88, 0xDB, 0xC9, 0xDD, 0x66, 0x5B, 0xFF, 0xEF, 0xFF, + 0xFA, 0x79, 0x92, 0x0C, 0x3E, 0x29, 0x2F, 0x56, 0x01, 0x3B, 0xF7, 0x84, 0xAD, 0x3B, 0x33, 0xA4, + 0x30, 0x13, 0x9E, 0xC5, 0x32, 0x65, 0x65, 0x75, 0xF7, 0x22, 0x13, 0x56, 0x26, 0x16, 0x7D, 0x45, + 0x9C, 0x62, 0xA9, 0x98, 0xD8, 0x89, 0xB3, 0x24, 0x89, 0x82, 0x1B, 0x82, 0x60, 0x63, 0xE0, 0x3C, + 0x01, 0xAD, 0xA2, 0x4E, 0xD6, 0x0D, 0x99, 0xC8, 0x80, 0x8F, 0x33, 0x3C, 0x37, 0x06, 0xBC, 0xB0, + 0x0E, 0x95, 0x89, 0x59, 0x1D, 0xC7, 0xD2, 0x3C, 0x53, 0x3C, 0x2E, 0x1B, 0xB1, 0xC2, 0x71, 0x8E, + 0x8B, 0xB0, 0xAD, 0x84, 0xBE, 0x36, 0x7D, 0xDA, 0x93, 0x3B, 0x39, 0x7E, 0x54, 0x46, 0x83, 0x9B, + 0x6D, 0x5A, 0xBA, 0x31, 0x29, 0x01, 0x04, 0x6E, 0x43, 0xD1, 0xE4, 0x49, 0x13, 0x96, 0xA6, 0x0B, + 0xCD, 0xB2, 0x4A, 0x74, 0x56, 0x24, 0x0B, 0xD3, 0x72, 0x2E, 0xAA, 0xD1, 0xDE, 0x23, 0x85, 0x17, + 0xDF, 0x1C, 0xA0, 0xFC, 0x78, 0x6F, 0x5A, 0x16, 0x2A, 0x00, 0x43, 0xE8, 0x4B, 0xB9, 0xED, 0xE8, + 0x64, 0xFC, 0xD8, 0xF2, 0x24, 0xBC, 0x38, 0x2C, 0x71, 0x5B, 0x66, 0xA4, 0xB9, 0x4F, 0xBE, 0xD0, + 0x57, 0x40, 0xA0, 0x37, 0x62, 0x32, 0x53, 0x0C, 0xD0, 0x2F, 0x2A, 0xC8, 0xA3, 0x90, 0x23, 0xC5, + 0x52, 0x75, 0x81, 0x4F, 0xCA, 0xEB, 0x8F, 0x8C, 0x9D, 0x57, 0xCE, 0x60, 0x80, 0x4E, 0x79, 0x69, + 0xD5, 0x20, 0x1B, 0x36, 0xD2, 0x56, 0xAA, 0xDA, 0x2F, 0x57, 0x87, 0xC8, 0x9E, 0xCC, 0xA4, 0x92, + 0x31, 0x7D, 0x95, 0x2B, 0xD7, 0x39, 0x60, 0x64, 0x16, 0x32, 0xA8, 0x48, 0xC4, 0xE3, 0x38, 0x27, + 0x7F, 0x5B, 0xEA, 0x05, 0x7B, 0xF5, 0xC8, 0x3C, 0xA9, 0x3F, 0xB2, 0x9B, 0xCF, 0xDD, 0x1A, 0x3A, + 0x5F, 0xF4, 0x03, 0x4B, 0xE9, 0xDB, 0xE8, 0x31, 0xC6, 0x2C, 0xF3, 0x3B, 0xA8, 0x1E, 0x01, 0x5E, + 0x3E, 0x0A, 0xCF, 0x04, 0x6D, 0x1B, 0xF3, 0xB9, 0x93, 0xB2, 0xD1, 0xE5, 0xD2, 0x51, 0x03, 0x25, + 0x23, 0x4A, 0xD6, 0xEC, 0xAB, 0xB4, 0x35, 0x2A, 0xC5, 0xF3, 0xB7, 0xF3, 0x76, 0xF5, 0xE2, 0x5D, + 0x87, 0x5D, 0xDA, 0x82, 0x0F, 0xD4, 0xCD, 0xF0, 0x67, 0xCD, 0x0E, 0x34, 0xD9, 0xFF, 0x08, 0xD3, + 0xC8, 0x26, 0x2C, 0xAC, 0xD9, 0x6A, 0x4D, 0x91, 0x20, 0xAC, 0x67, 0x56, 0x4C, 0xD6, 0xCB, 0x8B, + 0x54, 0x62, 0xE8, 0xD7, 0x93, 0x9B, 0xDB, 0xE6, 0xD7, 0xD3, 0x5F, 0x2F, 0xED, 0x88, 0xEA, 0xE0, + 0x1B, 0x6C, 0x10, 0xD2, 0xC6, 0x17, 0x7B, 0xFE, 0xCA, 0x69, 0x53, 0xA8, 0x87, 0x95, 0xE4, 0x7B, + 0x8A, 0xCF, 0x75, 0x65, 0x36, 0xA8, 0x18, 0x50, 0xE4, 0x0A, 0x00, 0x65, 0xC7, 0xEB, 0x66, 0x55, + 0xC6, 0x6B, 0x83, 0xDA, 0x44, 0x86, 0x26, 0xAA, 0xAC, 0x00, 0xD3, 0x88, 0xA8, 0xED, 0xFA, 0xFC, + 0x4B, 0xB5, 0xFD, 0xEE, 0x2C, 0x86, 0xB8, 0x17, 0x5A, 0x51, 0xC3, 0xC3, 0xEA, 0x6C, 0x4E, 0x0B, + 0xF3, 0x9D, 0xA1, 0x70, 0xCB, 0x97, 0xE5, 0x3A, 0x83, 0x4B, 0x2A, 0xE5, 0x39, 0x13, 0x6B, 0x38, + 0x03, 0xFC, 0x31, 0x68, 0xA5, 0xFC, 0x66, 0xEE, 0xCD, 0xBE, 0xB9, 0x6E, 0x6E, 0x33, 0xF3, 0xD7, + 0x53, 0xDA, 0x6B, 0x66, 0x52, 0x65, 0x85, 0x2D, 0x9D, 0xAB, 0x59, 0x5C, 0x83, 0x0E, 0xEE, 0x78, + 0xDF, 0xFD, 0xE3, 0x15, 0x32, 0x05, 0x20, 0x6B, 0xA6, 0x7B, 0xDC, 0x80, 0x96, 0x26, 0xEC, 0x3A, + 0x1D, 0x5F, 0x30, 0x55, 0xE1, 0xB0, 0x7D, 0xB9, 0x8D, 0xB6, 0x9A, 0x54, 0x8D, 0x9D, 0x80, 0x58, + 0x1A, 0x7E, 0x8B, 0x84, 0x54, 0x38, 0x38, 0xF1, 0x8E, 0xCF, 0x56, 0xF9, 0xE2, 0xB8, 0x2F, 0xC2, + 0x77, 0xC6, 0xCE, 0xE6, 0xD1, 0xCB, 0x78, 0x4B, 0xB7, 0xB9, 0x21, 0x81, 0xF9, 0x8D, 0x0F, 0x71, + 0xD5, 0x10, 0x31, 0x5E, 0x6D, 0x6C, 0xBD, 0xDB, 0xC5, 0xA0, 0x90, 0x98, 0x52, 0xBF, 0x37, 0xA1, + 0xDA, 0xE1, 0x2B, 0xAC, 0x91, 0xC3, 0x4E, 0x50, 0xDE, 0x3E, 0x50, 0xC4, 0xC9, 0x72, 0x72, 0xF6, + 0xEA, 0x3C, 0x13, 0x3C, 0x3B, 0x2F, 0x9A, 0x32, 0x0A, 0xA4, 0xFB, 0x28, 0x6D, 0x0E, 0x58, 0xA0, + 0xFC, 0xF1, 0xA4, 0x6D, 0xEC, 0x40, 0x3F, 0xF0, 0xC1, 0xC8, 0xD8, 0xCA, 0xCE, 0x2F, 0xF3, 0xC1, + 0xB3, 0x9E, 0xBB, 0x1C, 0x2D, 0xAE, 0xF8, 0xE6, 0x86, 0x4D, 0x37, 0x7D, 0x83, 0x1B, 0x79, 0xE9, + 0xB4, 0xB9, 0x8E, 0x3B, 0x28, 0x67, 0x5F, 0x78, 0xF7, 0x1A, 0x2F, 0x81, 0x34, 0x1B, 0x0B, 0x22, + 0xCD, 0xF5, 0xDC, 0xD8, 0xF2, 0xA4, 0xD9, 0x78, 0x29, 0xA4, 0xD9, 0xCC, 0x4B, 0x9A, 0x7B, 0xEB, + 0xB8, 0x83, 0xCD, 0x72, 0xA4, 0xD9, 0x7C, 0x09, 0xA4, 0xD9, 0x5C, 0x10, 0x69, 0xAE, 0xE7, 0xC6, + 0x96, 0x27, 0xCD, 0xE6, 0x4B, 0x21, 0xCD, 0xBD, 0xBC, 0xA4, 0xB9, 0xBF, 0x8E, 0x3B, 0xB8, 0x57, + 0x8E, 0x34, 0xF7, 0x5E, 0x02, 0x69, 0xEE, 0x2D, 0x88, 0x34, 0xD7, 0x73, 0x63, 0xCB, 0x93, 0xE6, + 0xDE, 0x3A, 0x91, 0xE6, 0xC2, 0x2D, 0xA6, 0x9D, 0x3B, 0x71, 0x46, 0x09, 0xD7, 0x2B, 0xAD, 0xDB, + 0xB3, 0x0E, 0x93, 0x9F, 0x57, 0x62, 0xFF, 0x1C, 0x8F, 0x3C, 0x7F, 0x47, 0xA2, 0x5C, 0x2B, 0x42, + 0x77, 0x4F, 0xB1, 0x02, 0xD4, 0xD6, 0xF6, 0x0A, 0x0D, 0xA6, 0xF1, 0x52, 0xED, 0x2A, 0xBE, 0x93, + 0xEC, 0x18, 0xB1, 0x00, 0x65, 0x32, 0x90, 0xA0, 0xED, 0xC3, 0x0D, 0xFC, 0xA1, 0x74, 0xF1, 0x73, + 0x28, 0x89, 0x3E, 0x16, 0xA6, 0x36, 0xEF, 0xB8, 0xCD, 0x10, 0xB2, 0xE8, 0xD4, 0x57, 0xDB, 0x10, + 0x03, 0xE9, 0x13, 0x78, 0x8B, 0x3B, 0x6D, 0x87, 0x4B, 0x51, 0xCE, 0x1A, 0x50, 0x46, 0x98, 0x73, + 0x11, 0xF7, 0x6F, 0x85, 0x95, 0x20, 0xC6, 0x23, 0x6F, 0x22, 0x65, 0x50, 0xF6, 0x4A, 0x66, 0xDA, + 0x3D, 0x2C, 0xC9, 0x4E, 0xA8, 0x1F, 0xE6, 0x2F, 0xC4, 0x04, 0x14, 0x49, 0x3A, 0x91, 0xD7, 0xD6, + 0xAA, 0xE4, 0x03, 0xD5, 0x53, 0x96, 0xAF, 0xAE, 0xAF, 0x81, 0x70, 0x79, 0xA4, 0x22, 0xB7, 0x7C, + 0x59, 0xA4, 0x82, 0x43, 0x01, 0x9A, 0x3C, 0x21, 0x4F, 0x46, 0xB9, 0x0C, 0x04, 0xE1, 0xBA, 0x28, + 0xF5, 0x7D, 0x29, 0x2F, 0x17, 0x4C, 0xEE, 0xBF, 0x48, 0xB7, 0x8C, 0xC8, 0xE3, 0x42, 0x31, 0x65, + 0x2A, 0x76, 0xE2, 0xC7, 0x73, 0xA1, 0x60, 0x2D, 0xB0, 0xD7, 0x70, 0xFC, 0x52, 0x22, 0x57, 0x72, + 0xBF, 0x0B, 0x44, 0xDF, 0xC7, 0xDB, 0x3D, 0x7B, 0xB0, 0xFD, 0x33, 0x1E, 0x39, 0x5F, 0x8D, 0xA8, + 0x06, 0xD0, 0xD7, 0xF6, 0xAA, 0x4F, 0x9D, 0xF1, 0xE0, 0x39, 0x0F, 0x9E, 0xC0, 0x58, 0xA3, 0x83, + 0xA7, 0xE7, 0x39, 0x9A, 0x81, 0xF5, 0x88, 0xE4, 0xD9, 0xE2, 0x63, 0xA9, 0x6D, 0x1B, 0x8B, 0x10, + 0x91, 0x34, 0xF6, 0xB5, 0xD3, 0xFE, 0xE9, 0x8E, 0x94, 0x68, 0x3F, 0x97, 0x79, 0xAA, 0x04, 0xC6, + 0x73, 0x9C, 0x2A, 0xD1, 0xD2, 0xD6, 0xEF, 0x60, 0x41, 0xBA, 0x9D, 0x7E, 0xB0, 0x34, 0xEA, 0x8D, + 0x46, 0xFD, 0xF5, 0x64, 0x29, 0x7B, 0xB2, 0x24, 0xF7, 0xBC, 0xD0, 0xE1, 0x92, 0x68, 0xBA, 0xCE, + 0xE7, 0x4B, 0xE4, 0x1E, 0x41, 0xA4, 0x74, 0x0B, 0x90, 0x99, 0x74, 0x4D, 0xCE, 0x77, 0xE0, 0x44, + 0xF6, 0x9D, 0x71, 0x57, 0x95, 0x56, 0xE8, 0x8E, 0xC1, 0xD9, 0x67, 0xC7, 0x28, 0x11, 0xDB, 0x99, + 0xEA, 0x2F, 0x35, 0x5D, 0xCC, 0x57, 0x7F, 0xD2, 0x59, 0x48, 0x84, 0x67, 0xA3, 0xD2, 0x3A, 0xE9, + 0x94, 0x0B, 0x05, 0x04, 0x0A, 0x43, 0x95, 0x7C, 0x5D, 0x63, 0x00, 0x4F, 0x3A, 0xB1, 0x08, 0xC0, + 0xE9, 0xE7, 0x97, 0x0A, 0x96, 0x96, 0x25, 0xF3, 0x64, 0x81, 0x7A, 0xCC, 0x90, 0xC6, 0x0D, 0xCC, + 0x15, 0x5F, 0x95, 0xB0, 0xAE, 0x31, 0xE8, 0x8B, 0x4C, 0x0F, 0xD3, 0x7B, 0x8B, 0x19, 0x28, 0x30, + 0xDC, 0xDB, 0x1A, 0x9B, 0x29, 0x62, 0x81, 0xE4, 0xE4, 0x97, 0xE1, 0xD8, 0xB2, 0x71, 0x54, 0x11, + 0xF7, 0xB2, 0x83, 0x81, 0xDA, 0x1E, 0x0C, 0xBE, 0x39, 0x6E, 0x1A, 0xA5, 0x7D, 0xBA, 0x64, 0xDA, + 0x99, 0x97, 0xE5, 0xD4, 0x45, 0x6B, 0x2A, 0xE5, 0xD5, 0x15, 0x6F, 0x39, 0x63, 0x0F, 0xE2, 0x00, + 0x4B, 0xF9, 0x75, 0x51, 0x5A, 0x90, 0x75, 0x73, 0xEC, 0xCA, 0x58, 0xD2, 0xD3, 0xF3, 0x21, 0x4D, + 0x67, 0xD2, 0x45, 0x13, 0x21, 0x49, 0xFE, 0x4C, 0x93, 0x2D, 0x99, 0xF5, 0x68, 0xCC, 0x91, 0x63, + 0x5F, 0x17, 0x93, 0xFD, 0xE3, 0x4B, 0xBF, 0x5F, 0x3A, 0xF9, 0xC7, 0x79, 0xB7, 0x53, 0xBD, 0x76, + 0xEE, 0xD7, 0x36, 0xCB, 0x06, 0x25, 0x93, 0x40, 0xA7, 0x56, 0x98, 0xE8, 0x5E, 0x33, 0x8C, 0xBB, + 0x8E, 0x92, 0x56, 0x48, 0xFE, 0x0B, 0xF4, 0x58, 0xA5, 0x0F, 0x54, 0xCE, 0x37, 0xFA, 0x69, 0x04, + 0x62, 0x9D, 0x29, 0x19, 0x34, 0xC1, 0x9C, 0x1C, 0xE7, 0x28, 0x9F, 0xBE, 0xCA, 0xB2, 0xEF, 0xFB, + 0xE4, 0xDF, 0xFD, 0xC9, 0xB9, 0xE7, 0x77, 0x18, 0xEF, 0x7A, 0x0A, 0x50, 0x11, 0x8E, 0x23, 0x86, + 0xAC, 0xDB, 0xE9, 0xE0, 0x58, 0x58, 0x0A, 0x25, 0x1A, 0x4E, 0xC8, 0x92, 0xC2, 0xB0, 0xA5, 0x14, + 0xAD, 0xFA, 0x67, 0xAA, 0xF1, 0x31, 0x6E, 0x72, 0x7A, 0x75, 0x1E, 0x8F, 0xE6, 0xA0, 0x01, 0x61, + 0x67, 0x36, 0x33, 0xD2, 0x9B, 0xE0, 0x55, 0x3A, 0x4C, 0x75, 0xBA, 0x2E, 0x9E, 0x59, 0x72, 0x82, + 0x40, 0xF6, 0xF9, 0xE4, 0x2C, 0x4A, 0x9F, 0x4C, 0xB3, 0x80, 0x1F, 0x66, 0x67, 0x4E, 0x3E, 0x39, + 0x39, 0x3E, 0x3D, 0x3D, 0x3E, 0x3B, 0x3B, 0x6E, 0xB7, 0x8F, 0xCF, 0xCF, 0x8F, 0x2F, 0x2E, 0xCA, + 0xDF, 0xF5, 0x94, 0x9F, 0x78, 0x47, 0x33, 0x31, 0xE9, 0x0B, 0xCD, 0xDF, 0x3F, 0x2E, 0x53, 0x02, + 0xA8, 0x88, 0xB8, 0xCC, 0xB9, 0x07, 0x20, 0xF1, 0xE7, 0x65, 0x93, 0xB6, 0xF9, 0x9A, 0x17, 0xED, + 0x5A, 0x52, 0x41, 0x00, 0x84, 0x0F, 0x1C, 0xD9, 0xB8, 0x1F, 0x72, 0x33, 0x72, 0x15, 0x45, 0x8F, + 0x54, 0xD1, 0x9C, 0x31, 0x61, 0x91, 0x7D, 0xC5, 0x8D, 0xC6, 0xC1, 0x72, 0x32, 0x86, 0x0A, 0x0E, + 0x01, 0xCE, 0xE7, 0x05, 0x70, 0x58, 0xE0, 0x2C, 0x14, 0x4E, 0x14, 0x28, 0x95, 0xBE, 0xAC, 0x00, + 0xB6, 0x58, 0xD2, 0xDE, 0x7B, 0x27, 0x2C, 0x00, 0xBD, 0xC3, 0xF8, 0x83, 0x29, 0x50, 0xE6, 0x55, + 0x12, 0x96, 0x14, 0x56, 0xE9, 0x16, 0x00, 0x05, 0x4C, 0xE6, 0x73, 0x01, 0x3B, 0xAA, 0x60, 0x2D, + 0xD3, 0x9C, 0xBF, 0xC1, 0x75, 0xBD, 0xC1, 0xDB, 0x00, 0x9F, 0x63, 0x02, 0xD5, 0xAF, 0xB6, 0x29, + 0x94, 0xAB, 0xB1, 0x7F, 0xAF, 0xB9, 0x48, 0xBF, 0xA1, 0x7C, 0xCA, 0x7D, 0x25, 0xD1, 0x02, 0x98, + 0x61, 0xF8, 0xD1, 0x28, 0xB0, 0x29, 0x25, 0x06, 0xD6, 0x93, 0x46, 0x17, 0xE4, 0x07, 0x01, 0xBC, + 0xFA, 0x9E, 0x7B, 0x00, 0xD1, 0xDA, 0x4F, 0x1E, 0xF2, 0x56, 0xBE, 0x72, 0xD8, 0xDE, 0xC2, 0x8A, + 0x85, 0x49, 0xC3, 0xD4, 0x85, 0x83, 0xE2, 0xAA, 0x22, 0x9F, 0x30, 0x4C, 0x47, 0xFE, 0x88, 0xDE, + 0xE5, 0xF9, 0x76, 0x29, 0x44, 0xFB, 0x95, 0x14, 0x0F, 0x9B, 0x32, 0xEF, 0x7C, 0xB3, 0x0C, 0x6C, + 0xEA, 0x91, 0x1B, 0xCF, 0x4A, 0x97, 0x40, 0x69, 0x14, 0x50, 0x08, 0x0A, 0xA5, 0x89, 0x2E, 0xFE, + 0x20, 0xEB, 0x18, 0x20, 0x68, 0x85, 0xA1, 0x6C, 0xAE, 0x3C, 0x5C, 0x54, 0x01, 0x21, 0xAA, 0xD0, + 0xAE, 0xC0, 0xC0, 0x46, 0x01, 0x68, 0xA3, 0x7D, 0xD3, 0xF3, 0x85, 0xCC, 0x45, 0x43, 0x6B, 0x81, + 0x8F, 0x7D, 0x0C, 0x6D, 0x23, 0x57, 0x7F, 0x49, 0xB8, 0x40, 0xAB, 0x44, 0xCE, 0x39, 0xEE, 0xED, + 0x36, 0x84, 0xCC, 0x9E, 0x78, 0x92, 0xCE, 0x3B, 0x3C, 0x12, 0x78, 0x34, 0xAB, 0xC4, 0x4C, 0xC1, + 0x83, 0xA2, 0x4F, 0x7D, 0x4A, 0x31, 0x61, 0xF2, 0xC0, 0x68, 0x8D, 0xA9, 0xAB, 0xC4, 0x79, 0xE1, + 0x4E, 0x9B, 0xF8, 0x67, 0x7F, 0x90, 0xB2, 0xA0, 0x75, 0x03, 0xB2, 0x57, 0x3C, 0x53, 0x39, 0xCF, + 0xF5, 0xE1, 0x71, 0xBE, 0x6B, 0x3B, 0xF7, 0xA7, 0xA1, 0x2D, 0xA7, 0xD2, 0x8A, 0x3E, 0xB2, 0x2F, + 0xB2, 0x54, 0x16, 0x5F, 0x15, 0xD7, 0x4A, 0xCD, 0x64, 0x1D, 0xB8, 0x11, 0x15, 0x06, 0x40, 0xE9, + 0x65, 0x27, 0x2C, 0x1C, 0x06, 0x47, 0x38, 0x0A, 0x9C, 0xF2, 0x20, 0xF7, 0xB9, 0x6D, 0xF8, 0xE8, + 0x41, 0x20, 0xE3, 0x0E, 0xEF, 0x4C, 0x2D, 0x66, 0x15, 0x13, 0x0E, 0x3D, 0x21, 0x35, 0xCD, 0xC7, + 0x02, 0x63, 0x1E, 0xA6, 0xC6, 0x02, 0x36, 0x04, 0x47, 0xBD, 0x2C, 0x98, 0x28, 0x35, 0xCD, 0xF0, + 0x76, 0xE8, 0xA5, 0xD7, 0x36, 0x9C, 0xA9, 0x62, 0x2D, 0x3A, 0xEC, 0x31, 0x56, 0xD4, 0x84, 0x75, + 0x3C, 0xD3, 0xC1, 0x24, 0x10, 0x2F, 0xCC, 0x62, 0x16, 0x5B, 0x62, 0xB8, 0xC2, 0x52, 0xF6, 0xB3, + 0xD9, 0xFD, 0xCC, 0xD8, 0xCE, 0x38, 0x6C, 0xA7, 0xDA, 0xD4, 0x62, 0xD5, 0x5B, 0x96, 0x6F, 0x59, + 0x2B, 0x6A, 0x5B, 0x2B, 0xB4, 0xDC, 0x15, 0xC6, 0x50, 0xC6, 0xA1, 0x2A, 0xEB, 0xF0, 0xAC, 0x2E, + 0x9A, 0xF2, 0xC4, 0xC7, 0x0C, 0x1E, 0x68, 0x38, 0x0A, 0x49, 0x05, 0x0B, 0x9E, 0x68, 0xFA, 0x30, + 0x51, 0x88, 0xC7, 0xA7, 0x59, 0xD5, 0x42, 0x7A, 0x32, 0x81, 0x0D, 0x92, 0xB0, 0x25, 0x8D, 0xF3, + 0x02, 0xD0, 0xC0, 0x09, 0x40, 0x7B, 0xF2, 0x01, 0x53, 0x43, 0x75, 0xE6, 0x07, 0xF7, 0x9C, 0x1A, + 0x65, 0x0B, 0xC6, 0xCA, 0x91, 0x98, 0xD6, 0xD4, 0x07, 0xAE, 0x67, 0x48, 0x27, 0xAA, 0x37, 0x5D, + 0xE4, 0x80, 0x09, 0x0C, 0x7A, 0x53, 0x44, 0x2C, 0x7B, 0x29, 0x77, 0xDF, 0x99, 0x98, 0xB9, 0xCC, + 0xAB, 0x70, 0x7D, 0x72, 0x50, 0x2C, 0xB4, 0x57, 0x29, 0xDF, 0x6B, 0x29, 0x13, 0xC6, 0x6C, 0xE9, + 0x73, 0xCA, 0x04, 0xC3, 0x6A, 0x8C, 0x25, 0x25, 0xD1, 0x74, 0x25, 0xC4, 0xB3, 0xD9, 0x23, 0xC4, + 0x2B, 0x45, 0xE6, 0x2D, 0x02, 0xB9, 0x84, 0x0B, 0x9F, 0xEE, 0xA3, 0x2F, 0xF8, 0xE8, 0x85, 0x9D, + 0x5F, 0x72, 0x51, 0xA5, 0x8E, 0xAC, 0x44, 0xD3, 0x19, 0xDB, 0x90, 0x80, 0x59, 0xEA, 0x80, 0xF2, + 0x65, 0xFB, 0x35, 0xBB, 0xF5, 0xC9, 0x5A, 0xD5, 0x93, 0xAE, 0x7D, 0x02, 0xD7, 0x02, 0xA1, 0xF4, + 0x9A, 0xDF, 0x5F, 0xA8, 0x04, 0xD3, 0x6D, 0xF3, 0xAE, 0xE8, 0xCD, 0xCF, 0x7C, 0x2D, 0x62, 0x62, + 0x84, 0x4A, 0x4B, 0xED, 0x41, 0xF8, 0x43, 0x9E, 0x28, 0x0B, 0xE2, 0xE9, 0x64, 0xE6, 0x16, 0xDF, + 0xC3, 0x76, 0x7F, 0x05, 0x59, 0x1B, 0x76, 0xEF, 0xAB, 0x3B, 0x00, 0x85, 0x9F, 0xCF, 0xB6, 0xF1, + 0xDE, 0xD5, 0x6B, 0xF5, 0x27, 0xDA, 0xF9, 0xB3, 0xCC, 0xE0, 0x9A, 0x05, 0x07, 0x25, 0x80, 0x1F, + 0x1D, 0xB5, 0xB2, 0x2B, 0xDB, 0xCF, 0x53, 0xA9, 0xCF, 0x10, 0x80, 0x71, 0x68, 0xE5, 0xB1, 0xCA, + 0xE6, 0xD0, 0x5C, 0x22, 0xEE, 0xA6, 0xA7, 0x06, 0x40, 0x5E, 0x46, 0x83, 0xCA, 0x4A, 0xEB, 0xFC, + 0x3E, 0xDA, 0x97, 0x18, 0x16, 0xAF, 0x3C, 0x23, 0x92, 0x9C, 0x51, 0x54, 0x57, 0x0A, 0xD8, 0xAC, + 0xCF, 0x39, 0x33, 0xFB, 0x0C, 0xAB, 0xA4, 0x45, 0xC9, 0xD0, 0x41, 0x2A, 0x18, 0x27, 0x65, 0x50, + 0x89, 0x90, 0x7C, 0x65, 0xB0, 0x5D, 0xE7, 0x8C, 0xA8, 0xB1, 0x53, 0x3E, 0x5C, 0x4B, 0xB8, 0xEF, + 0x68, 0x8D, 0x50, 0xC7, 0x77, 0xB6, 0x05, 0x60, 0xB1, 0xD6, 0xCC, 0x9B, 0xB3, 0x31, 0x89, 0x9E, + 0x90, 0xEB, 0xFB, 0x29, 0x07, 0xD5, 0x75, 0x8C, 0x0E, 0x2B, 0xB4, 0x50, 0xC6, 0xE7, 0xF2, 0x6C, + 0x2A, 0x3E, 0x2D, 0x3F, 0x42, 0x36, 0x3C, 0x6F, 0x34, 0xD3, 0x96, 0x76, 0x45, 0x40, 0x43, 0x4C, + 0x0D, 0xD2, 0xE7, 0x9A, 0x08, 0x30, 0x0D, 0x16, 0x50, 0x0A, 0x1B, 0x69, 0x8F, 0x4C, 0x5D, 0x82, + 0x82, 0xB0, 0x4B, 0x45, 0x29, 0xAF, 0xE1, 0x2B, 0x08, 0x11, 0xCE, 0x08, 0xE6, 0x60, 0xA8, 0x8C, + 0xFE, 0x7D, 0x93, 0x5B, 0x20, 0xEA, 0x3A, 0xDE, 0xF7, 0x97, 0x66, 0xC8, 0x9F, 0xCD, 0xF0, 0xBC, + 0x6C, 0x13, 0x58, 0x92, 0x85, 0xCA, 0x64, 0xFB, 0xE6, 0xDD, 0x47, 0x2E, 0x12, 0xCC, 0xB0, 0x40, + 0xD9, 0xDF, 0x5C, 0xEC, 0x36, 0xDD, 0xFF, 0x82, 0x99, 0xED, 0x20, 0xD1, 0x3D, 0xB2, 0xDA, 0xAF, + 0xAE, 0x41, 0x05, 0x26, 0x1C, 0x76, 0xB7, 0x57, 0x6B, 0xEC, 0xD7, 0x1A, 0x07, 0xF9, 0xD9, 0xAC, + 0x84, 0x4D, 0xEB, 0xBD, 0xEB, 0x39, 0x03, 0xBA, 0x72, 0x8A, 0x33, 0x10, 0xD9, 0x71, 0x47, 0x3D, + 0x3A, 0xD5, 0xBC, 0x88, 0xAE, 0x1A, 0xCD, 0x0A, 0xE0, 0xE6, 0x03, 0x7C, 0xA8, 0xD7, 0x73, 0x12, + 0x80, 0x02, 0x33, 0x95, 0xF0, 0x3E, 0xDE, 0xAB, 0xD7, 0x49, 0x4C, 0x07, 0xAE, 0xA4, 0x7A, 0xCF, + 0x6F, 0x6B, 0x9D, 0x3E, 0xBB, 0x39, 0x26, 0xD7, 0xBD, 0xB7, 0xFF, 0x92, 0xC7, 0xEA, 0xAA, 0x40, + 0xB1, 0x34, 0xE7, 0xC5, 0xDC, 0x07, 0x7A, 0x92, 0xBF, 0xA6, 0x35, 0x8E, 0x22, 0x21, 0xA0, 0x58, + 0xA1, 0xAF, 0xA2, 0xBC, 0x60, 0x7A, 0x40, 0xDF, 0xF4, 0x95, 0xC4, 0xD2, 0xA0, 0x37, 0x32, 0x45, + 0x88, 0x44, 0x17, 0xF4, 0xBB, 0x63, 0xCB, 0x74, 0xFA, 0x71, 0x08, 0xA3, 0x9C, 0xF5, 0x8B, 0x66, + 0x0A, 0xB4, 0x97, 0xEF, 0x66, 0x8C, 0x2C, 0xDF, 0x66, 0xA7, 0x97, 0xD7, 0xF3, 0x40, 0x98, 0x4F, + 0x2C, 0x5B, 0x5C, 0xD9, 0x5F, 0x45, 0x1B, 0xC0, 0x5F, 0x03, 0xDB, 0x14, 0x6F, 0xFC, 0x31, 0xF3, + 0xED, 0x3D, 0x32, 0x29, 0x48, 0x92, 0x05, 0x01, 0x44, 0x71, 0x1B, 0xC9, 0x92, 0x8A, 0x53, 0x52, + 0x4A, 0x37, 0xBA, 0xEB, 0x09, 0x23, 0xAE, 0x98, 0x3B, 0x04, 0xBE, 0x80, 0xEE, 0x2D, 0x9D, 0xB3, + 0xE7, 0x33, 0x17, 0xCC, 0x2F, 0x86, 0x3D, 0x41, 0x1F, 0xB8, 0xB8, 0x52, 0x57, 0x11, 0x73, 0x31, + 0x7D, 0x0E, 0xE7, 0x8D, 0x74, 0x00, 0x18, 0x4F, 0x74, 0x05, 0x40, 0xFE, 0x49, 0xAE, 0x5F, 0x51, + 0x2F, 0x91, 0x7C, 0x7F, 0x09, 0x7B, 0x88, 0xC5, 0x7A, 0xE8, 0xD7, 0xE2, 0x9E, 0x60, 0xE3, 0x0E, + 0x93, 0xB3, 0x5C, 0x94, 0x27, 0xD8, 0x8D, 0x73, 0x57, 0xB6, 0x7C, 0x53, 0xA3, 0xD2, 0x3A, 0xD5, + 0x7C, 0x5E, 0xB6, 0xF6, 0x53, 0xEB, 0xFA, 0xB6, 0xB3, 0x96, 0x4E, 0x64, 0x9D, 0x40, 0xF9, 0x6D, + 0xC9, 0x0D, 0x34, 0x6D, 0x2C, 0x4C, 0xEC, 0x90, 0xBB, 0x17, 0x15, 0x3C, 0x40, 0x05, 0xE1, 0x56, + 0x3A, 0xFD, 0x46, 0x5E, 0x09, 0x1D, 0xF2, 0x4A, 0xF8, 0x62, 0xE3, 0x43, 0xB2, 0x89, 0x6C, 0x78, + 0x42, 0xB4, 0x85, 0x87, 0x42, 0x45, 0x69, 0x65, 0x31, 0xCB, 0x2B, 0x00, 0xB4, 0xDB, 0x66, 0x67, + 0xA0, 0xA1, 0xAF, 0x24, 0x12, 0x2A, 0x47, 0x4A, 0xDB, 0xC5, 0x87, 0x34, 0x69, 0x6C, 0x64, 0xEA, + 0x9E, 0x03, 0xEB, 0x24, 0x73, 0x04, 0x69, 0x64, 0x82, 0x18, 0xF3, 0x0E, 0x5D, 0x7B, 0x8D, 0x80, + 0xA1, 0x69, 0x68, 0xF8, 0x0D, 0xD3, 0xE8, 0x59, 0x30, 0xCB, 0xC4, 0x25, 0xD7, 0x46, 0x97, 0x70, + 0x4F, 0x40, 0x3E, 0xD3, 0x2D, 0x70, 0xD9, 0x01, 0x46, 0x20, 0xF8, 0xC1, 0x54, 0x30, 0xEF, 0xEF, + 0xEF, 0x23, 0xD3, 0x0E, 0x04, 0xF7, 0xA7, 0x84, 0x18, 0xED, 0xA7, 0x42, 0x8C, 0xDE, 0x4E, 0x84, + 0x18, 0x7D, 0xD6, 0x1E, 0x30, 0x8B, 0x73, 0xB6, 0xDC, 0x47, 0xD5, 0x2A, 0xB6, 0x60, 0xA8, 0xED, + 0xE7, 0x2B, 0x95, 0xFD, 0x05, 0x4B, 0xAB, 0x23, 0x1F, 0x83, 0xC5, 0x23, 0x72, 0xC9, 0x82, 0x29, + 0x68, 0x2C, 0xD0, 0x87, 0x26, 0xBF, 0x43, 0x3C, 0xB4, 0xE4, 0xF6, 0xA8, 0x00, 0x03, 0xAE, 0x61, + 0x70, 0xD3, 0xAD, 0x2A, 0x8B, 0x1D, 0x8C, 0x13, 0x2B, 0x5B, 0x26, 0x48, 0x5E, 0xF8, 0x9E, 0xE5, + 0xC0, 0x1F, 0x10, 0x05, 0x47, 0xF2, 0xB6, 0xD7, 0xC6, 0x49, 0xD1, 0x9D, 0x86, 0x30, 0x75, 0xE6, + 0x07, 0xDE, 0x1D, 0x97, 0xE5, 0xE0, 0x35, 0xE8, 0xCC, 0x43, 0x35, 0x31, 0x2C, 0x93, 0x80, 0x09, + 0x96, 0x61, 0xF4, 0x78, 0xE8, 0xD4, 0x3E, 0x80, 0x5B, 0xED, 0x45, 0x8D, 0x5D, 0xE1, 0x08, 0xF0, + 0x23, 0x36, 0x6E, 0x1E, 0x1D, 0x8D, 0x9F, 0xBC, 0xAC, 0xE0, 0xAA, 0x9C, 0xA5, 0x1B, 0x48, 0xD1, + 0xF2, 0x47, 0xC0, 0x25, 0x54, 0x81, 0xC4, 0x49, 0xEC, 0xCD, 0x67, 0x56, 0x99, 0x6C, 0xF8, 0xE4, + 0x9C, 0x27, 0xAB, 0xA1, 0x54, 0x55, 0x64, 0x62, 0x25, 0xB4, 0x7A, 0xA5, 0x2A, 0x79, 0x10, 0xB5, + 0x2E, 0x97, 0x16, 0x81, 0xAC, 0x92, 0x04, 0x91, 0x24, 0x47, 0x8D, 0xEC, 0x7A, 0x48, 0xAA, 0xE1, + 0x99, 0xA0, 0x7B, 0x5C, 0xC3, 0xE4, 0x09, 0xD3, 0xA8, 0x92, 0x9E, 0x21, 0x55, 0x4A, 0xA7, 0x75, + 0x8B, 0x4E, 0x10, 0x15, 0x1C, 0xAB, 0x49, 0x52, 0x95, 0x24, 0xF9, 0x13, 0x50, 0xDD, 0x32, 0xE9, + 0x2E, 0x85, 0x8B, 0x45, 0x28, 0x2F, 0xD9, 0x74, 0xD9, 0xB4, 0x47, 0xFA, 0x81, 0x33, 0x90, 0xAA, + 0xB1, 0x1A, 0x25, 0xAF, 0x6B, 0xF5, 0x13, 0xAA, 0xA4, 0xA4, 0x87, 0x8C, 0xD1, 0x7E, 0xC2, 0x60, + 0x44, 0x92, 0x1F, 0xE9, 0xAA, 0xA8, 0xD9, 0x1C, 0x4B, 0xE4, 0xC9, 0x87, 0x67, 0xF8, 0x5F, 0x6C, + 0x75, 0xD7, 0xD0, 0x7E, 0xF6, 0x45, 0x47, 0xF7, 0xE2, 0xFC, 0x77, 0x18, 0xAA, 0x16, 0xF4, 0x1E, + 0x0A, 0xA0, 0x5B, 0x2E, 0xFE, 0xFD, 0x42, 0x1D, 0xE0, 0xC9, 0x29, 0xE1, 0x9A, 0xDF, 0x03, 0xD4, + 0x16, 0x65, 0xFB, 0x4B, 0xD8, 0xFF, 0x62, 0xFD, 0xA3, 0xF1, 0xAF, 0x8B, 0x5F, 0xE9, 0x8E, 0x05, + 0x7E, 0x78, 0x7E, 0x47, 0xF7, 0x33, 0xCB, 0x41, 0xBF, 0x73, 0xB2, 0x9D, 0x04, 0x1E, 0x95, 0xDF, + 0x45, 0x16, 0x4C, 0xEE, 0x6B, 0x38, 0x53, 0x5F, 0xF1, 0x65, 0xC7, 0xE6, 0xB5, 0xD7, 0x32, 0x2B, + 0xD5, 0x46, 0x8A, 0xAA, 0x17, 0x56, 0x73, 0xE5, 0xE4, 0xA6, 0x93, 0xAE, 0xB0, 0x02, 0x3F, 0xAD, + 0xA6, 0x6A, 0x4A, 0x4C, 0x65, 0x89, 0x4D, 0x23, 0xB7, 0x83, 0xE5, 0x12, 0xAE, 0xFE, 0xE2, 0x49, + 0x31, 0x10, 0x35, 0x4F, 0x30, 0xF9, 0x85, 0xAD, 0xB1, 0x1B, 0x4E, 0x25, 0xA2, 0x75, 0x2C, 0x14, + 0xE5, 0x53, 0xED, 0x65, 0x69, 0xFA, 0xA3, 0x20, 0xB5, 0x46, 0xBD, 0x7E, 0xB0, 0x0B, 0x7F, 0x0E, + 0x23, 0x01, 0x42, 0x33, 0x0C, 0x59, 0x6C, 0x14, 0xFB, 0x00, 0xB4, 0x7E, 0x29, 0x15, 0x12, 0x53, + 0x5B, 0xB5, 0x26, 0xE5, 0x11, 0xC7, 0x13, 0xC2, 0x12, 0x32, 0x1E, 0x60, 0x57, 0x29, 0xD1, 0x15, + 0xBA, 0xC9, 0xC7, 0x66, 0xD4, 0x60, 0x2C, 0x1C, 0x8D, 0x6D, 0xE5, 0xAA, 0x87, 0xB8, 0x0C, 0x66, + 0x9A, 0x44, 0x5D, 0x24, 0xDC, 0x50, 0xB9, 0x04, 0xA9, 0x35, 0x2F, 0x26, 0x27, 0x4D, 0x21, 0x68, + 0x5C, 0x33, 0xD5, 0xCA, 0x7C, 0x59, 0xA3, 0x07, 0xFA, 0x1A, 0x69, 0xF6, 0xA3, 0x2A, 0x5C, 0x9E, + 0x5F, 0x50, 0x5D, 0x2E, 0x4F, 0xCE, 0xCD, 0x97, 0xF3, 0x8B, 0x1A, 0x4F, 0x11, 0x5B, 0xA7, 0x60, + 0x61, 0xFE, 0xAB, 0xAA, 0xC9, 0xC6, 0xEB, 0x9E, 0x5D, 0xA3, 0x17, 0xC6, 0xD3, 0xDE, 0xCC, 0x0D, + 0xDE, 0x66, 0x45, 0xD2, 0x6C, 0x4C, 0xF6, 0x59, 0x69, 0x8D, 0xE3, 0x76, 0x3B, 0x9E, 0x23, 0x1C, + 0x20, 0xDA, 0xE2, 0xD6, 0xFC, 0x29, 0xFD, 0xCE, 0x58, 0xC3, 0xA2, 0xEC, 0xFB, 0xDD, 0x4E, 0xA7, + 0xBC, 0x75, 0xFF, 0xEA, 0xBC, 0xB4, 0x71, 0x3F, 0x5F, 0x84, 0xF9, 0xEA, 0x8D, 0xFB, 0x67, 0x51, + 0x50, 0x21, 0x06, 0x69, 0x23, 0x7F, 0x3A, 0xC3, 0xAE, 0x4D, 0x3D, 0x1E, 0xCA, 0xCD, 0x3D, 0xBC, + 0xB1, 0xC1, 0xD4, 0x32, 0xB8, 0xD7, 0xA4, 0xB3, 0x6C, 0x01, 0x20, 0xB7, 0xE3, 0xF1, 0xDE, 0x57, + 0xCE, 0x7D, 0xF5, 0xDC, 0xE6, 0xDE, 0xE0, 0x91, 0x6D, 0x01, 0xA0, 0xB6, 0x29, 0x90, 0x5C, 0x04, + 0x9E, 0x1D, 0x7B, 0xC7, 0xE9, 0xF7, 0x63, 0xCA, 0x37, 0x46, 0x88, 0x6B, 0x3E, 0xC8, 0x92, 0x9A, + 0x67, 0x3D, 0x92, 0x0D, 0xF8, 0xE3, 0x65, 0x37, 0x5E, 0xF6, 0x9B, 0xD4, 0x7B, 0x7C, 0xED, 0xF5, + 0xF2, 0x20, 0x15, 0x61, 0xA8, 0xE9, 0xC2, 0xF1, 0xC6, 0xAE, 0xAD, 0x51, 0x90, 0xA1, 0xFC, 0x3D, + 0xE6, 0x7C, 0xBA, 0x82, 0xDB, 0x84, 0xF4, 0x64, 0x72, 0x49, 0x89, 0x0B, 0xC6, 0xE2, 0xF4, 0xC2, + 0xE5, 0xC9, 0xC9, 0x3D, 0xBC, 0x9E, 0xC2, 0xF3, 0x11, 0x4B, 0xCA, 0x63, 0x28, 0x2E, 0x65, 0xF1, + 0x22, 0x55, 0xC6, 0x93, 0x8E, 0xBA, 0xF1, 0xFC, 0x08, 0x58, 0xAF, 0xCE, 0xA4, 0xC4, 0xB6, 0x0E, + 0x68, 0x3A, 0x8E, 0xFE, 0x3D, 0x6A, 0x51, 0x83, 0x43, 0xFA, 0x51, 0x99, 0x93, 0x6C, 0xBC, 0xAA, + 0xC1, 0xCB, 0xE7, 0x91, 0x66, 0x92, 0xEB, 0x0F, 0x99, 0xA3, 0xA6, 0x06, 0x21, 0x8E, 0xC7, 0x58, + 0x66, 0xC0, 0xE1, 0x3A, 0x7B, 0xB6, 0x67, 0x46, 0xAD, 0xCD, 0x56, 0xC2, 0xFB, 0x69, 0xB4, 0x5A, + 0x88, 0xFB, 0x76, 0x0A, 0x59, 0x13, 0x41, 0x84, 0x91, 0xEF, 0xB6, 0x7A, 0x69, 0x7E, 0xCF, 0x39, + 0x1D, 0xBC, 0xE3, 0xB7, 0xFA, 0xC9, 0xB1, 0x9F, 0x74, 0xAD, 0x3F, 0xE3, 0x69, 0x82, 0x85, 0x50, + 0x10, 0x89, 0x64, 0x1B, 0x06, 0xEF, 0x05, 0x83, 0x6F, 0xE4, 0x16, 0xD5, 0xC6, 0x8F, 0x0C, 0x3F, + 0x67, 0x78, 0xD8, 0x2E, 0x42, 0xE5, 0x2D, 0xE2, 0x67, 0x88, 0xD0, 0x6F, 0x4B, 0xE3, 0x15, 0xCC, + 0x52, 0x7E, 0x90, 0x77, 0xC7, 0xEC, 0xCC, 0x09, 0x90, 0x48, 0x57, 0xC2, 0xCE, 0x12, 0xF3, 0x78, + 0x0E, 0x5E, 0x76, 0xC2, 0x48, 0x76, 0x65, 0x52, 0xC2, 0x9D, 0xAE, 0xB9, 0x2A, 0x23, 0x1F, 0xF0, + 0x2E, 0x23, 0xCC, 0x07, 0x40, 0xFE, 0x87, 0xB2, 0x09, 0xA8, 0x06, 0x36, 0xB0, 0x01, 0xCA, 0x0C, + 0x50, 0x85, 0x0F, 0x92, 0x0F, 0xE9, 0x8F, 0xC0, 0x0F, 0x7C, 0xAA, 0x10, 0x2A, 0x5D, 0x0E, 0x09, + 0x29, 0x50, 0xB2, 0x2D, 0x11, 0x48, 0xB8, 0xE9, 0x95, 0x0E, 0xCF, 0x01, 0x5C, 0x9E, 0x4D, 0xA8, + 0xF5, 0x9C, 0x61, 0x12, 0x84, 0x76, 0x6A, 0x2A, 0x61, 0x70, 0xC3, 0xA2, 0x43, 0x27, 0xCE, 0x53, + 0xFD, 0x17, 0x0A, 0x9E, 0x48, 0x35, 0x9E, 0x3E, 0x6E, 0x01, 0xF7, 0xCB, 0x14, 0xDC, 0x53, 0xA1, + 0x16, 0x11, 0x28, 0xD6, 0x2C, 0xD8, 0x22, 0x05, 0x85, 0x65, 0xC5, 0xFE, 0x2D, 0x52, 0x4E, 0x54, + 0x33, 0x6E, 0x7F, 0x3A, 0xEB, 0x80, 0x78, 0x18, 0x42, 0x3D, 0x40, 0xCB, 0x2E, 0xFE, 0xB6, 0x6C, + 0x56, 0x1A, 0x1F, 0x3E, 0xE7, 0x09, 0x6D, 0x0C, 0x75, 0x37, 0x9C, 0x28, 0x9E, 0xCB, 0x2B, 0x67, + 0xBC, 0x71, 0x13, 0x63, 0x04, 0x31, 0x62, 0xBF, 0xA8, 0x86, 0xE0, 0x52, 0x6A, 0x21, 0x7F, 0x54, + 0xA9, 0x4F, 0x19, 0x3A, 0x82, 0x3F, 0xC8, 0x8C, 0x82, 0x27, 0x32, 0x63, 0xCB, 0x0E, 0x6B, 0x5F, + 0x77, 0x77, 0xD8, 0x47, 0xD0, 0xA7, 0xEE, 0x81, 0x41, 0xA3, 0xA8, 0xD9, 0x0D, 0x7A, 0xD8, 0xD3, + 0x67, 0xCD, 0xFF, 0xBE, 0xE9, 0xDE, 0x2C, 0x79, 0x1C, 0x07, 0x09, 0x22, 0x97, 0x9D, 0x64, 0xCE, + 0xDC, 0x10, 0x9E, 0xCB, 0xCF, 0x9D, 0x1B, 0xA2, 0xDE, 0x65, 0x27, 0x51, 0xE7, 0xE5, 0x60, 0xC2, + 0xAA, 0x78, 0x91, 0xDA, 0xB9, 0xE7, 0xF3, 0x4C, 0x01, 0xC4, 0x43, 0xEC, 0x22, 0x9F, 0x28, 0x75, + 0xFE, 0x4E, 0xC3, 0x40, 0x32, 0xF7, 0xA5, 0xF1, 0xED, 0xA5, 0x67, 0xDB, 0x3D, 0x58, 0x74, 0x9E, + 0xDD, 0x18, 0x7E, 0xE4, 0xB7, 0x02, 0x8E, 0x1B, 0x3D, 0x9B, 0xF5, 0x6F, 0xF1, 0x14, 0x02, 0x8C, + 0x2A, 0x83, 0x44, 0xE0, 0x8D, 0xCD, 0xA0, 0x0A, 0x5C, 0xCA, 0x2B, 0x21, 0x94, 0x23, 0x84, 0x9C, + 0xB0, 0x4B, 0x51, 0x02, 0xB4, 0x7A, 0x41, 0xA4, 0xA0, 0x8E, 0xEB, 0x0C, 0x72, 0x50, 0x6F, 0x6D, + 0x06, 0x49, 0x84, 0x4B, 0x7A, 0x25, 0x8B, 0x72, 0x64, 0x51, 0x00, 0x7E, 0x29, 0xD2, 0x50, 0x2D, + 0x5F, 0x10, 0x79, 0x48, 0x09, 0x36, 0x83, 0x3A, 0x62, 0x62, 0xEE, 0x66, 0x50, 0x88, 0x2F, 0x27, + 0x3C, 0x82, 0x09, 0xBF, 0x52, 0x49, 0x49, 0x2A, 0x51, 0x98, 0x51, 0x9C, 0x48, 0x64, 0xC3, 0x75, + 0xBD, 0x4B, 0xCD, 0xD2, 0x73, 0x9E, 0x54, 0x93, 0x32, 0x04, 0xC1, 0x27, 0x21, 0xDC, 0x44, 0x75, + 0x8F, 0xE9, 0x74, 0x15, 0x61, 0xEF, 0xA7, 0xDB, 0xDB, 0x0E, 0xCB, 0x51, 0xD5, 0xA3, 0x78, 0x45, + 0x8F, 0xC9, 0x21, 0x22, 0x45, 0x15, 0x29, 0xE9, 0xA8, 0xBE, 0xD6, 0x5E, 0x32, 0x25, 0x8A, 0x71, + 0x1E, 0x54, 0x16, 0xE4, 0x9A, 0x9E, 0xA4, 0x86, 0x68, 0x47, 0xF3, 0x39, 0xC5, 0xA6, 0x9B, 0x2D, + 0xB5, 0x00, 0xE7, 0x72, 0x71, 0xF9, 0xBA, 0x18, 0x2A, 0x5F, 0x2F, 0x1D, 0x93, 0xAF, 0xA7, 0x21, + 0x72, 0xA3, 0xB9, 0xF7, 0x8A, 0xC9, 0xB9, 0x30, 0xF9, 0xBA, 0x14, 0x22, 0x5F, 0xAF, 0x00, 0x8F, + 0x17, 0xC0, 0xB1, 0x17, 0x7E, 0x1F, 0x7F, 0xAB, 0xBB, 0xAA, 0x10, 0x68, 0x64, 0xE6, 0x5A, 0x71, + 0xB1, 0xD9, 0xC9, 0x19, 0x14, 0x2C, 0xAD, 0x19, 0xB3, 0xBC, 0xAE, 0x55, 0xF1, 0xD9, 0x88, 0xA0, + 0x37, 0xBA, 0x00, 0x6D, 0xD1, 0xC2, 0x95, 0xAB, 0x37, 0x97, 0x02, 0x02, 0xBD, 0x96, 0xB0, 0xDC, + 0x74, 0xA1, 0x3D, 0x37, 0x7B, 0x0F, 0x77, 0xBB, 0xB8, 0xDC, 0xAE, 0x5A, 0xAE, 0x44, 0x70, 0x5F, + 0x36, 0xEE, 0x0F, 0x1D, 0x5F, 0x5C, 0x38, 0x1E, 0x60, 0x99, 0x2A, 0xD4, 0x5D, 0x06, 0xF9, 0x3F, + 0x39, 0xE8, 0xD1, 0xE3, 0x78, 0x39, 0x82, 0x60, 0xA3, 0x23, 0xE1, 0xF9, 0xF4, 0x63, 0x2C, 0x08, + 0x83, 0xAE, 0x97, 0xE8, 0x9C, 0xA7, 0x6A, 0x0C, 0x48, 0x4F, 0x62, 0xCE, 0x10, 0x1A, 0xEC, 0x7E, + 0x68, 0xEA, 0x43, 0xFA, 0x4A, 0x85, 0x8D, 0x65, 0xDD, 0x62, 0xCA, 0x55, 0x1C, 0xFA, 0x21, 0x20, + 0x0F, 0x26, 0x47, 0x84, 0xDA, 0x2B, 0xFD, 0x15, 0x54, 0x9A, 0x27, 0xF1, 0x4D, 0x9D, 0xE4, 0x82, + 0xFB, 0x45, 0x68, 0x31, 0xDD, 0xCF, 0xB3, 0x6B, 0xD1, 0x0B, 0x73, 0xCB, 0x40, 0xA9, 0xFD, 0xF9, + 0x3D, 0x32, 0x6C, 0xE1, 0x2E, 0xCB, 0x19, 0x03, 0x16, 0x58, 0xCA, 0x0F, 0x63, 0xDC, 0xEE, 0xC9, + 0x2E, 0x18, 0x63, 0x18, 0xA7, 0xBC, 0x2F, 0x70, 0xD9, 0x6B, 0xE6, 0x78, 0x31, 0x5E, 0xF6, 0x72, + 0xF3, 0x2D, 0x17, 0xD0, 0x78, 0x6D, 0xD4, 0x71, 0x2C, 0xEB, 0xFC, 0xC1, 0x05, 0x18, 0xDB, 0x59, + 0x1A, 0x2F, 0xBE, 0xCA, 0xC2, 0x77, 0x8F, 0x57, 0x1E, 0x35, 0x25, 0xC3, 0xA4, 0xA5, 0x93, 0x98, + 0x8A, 0xE9, 0x1B, 0x69, 0x0F, 0xE6, 0x28, 0x18, 0x45, 0x91, 0x24, 0xC0, 0xD3, 0xC5, 0x3D, 0x07, + 0x19, 0xDA, 0x97, 0xDE, 0x87, 0x20, 0x4F, 0x47, 0xB9, 0x38, 0x6A, 0xEC, 0xBC, 0x36, 0xA8, 0xA9, + 0xD2, 0x8B, 0x52, 0x8B, 0x26, 0x8E, 0x85, 0x47, 0xC6, 0x21, 0x7A, 0xC7, 0xFA, 0x63, 0x0F, 0x5A, + 0xEC, 0x0A, 0xE3, 0xA6, 0xFF, 0xF7, 0x21, 0xFB, 0xC0, 0x0E, 0xF7, 0xFD, 0x57, 0x45, 0x7B, 0xAE, + 0x24, 0x96, 0x46, 0xA3, 0x7C, 0x8A, 0x76, 0xAA, 0xD5, 0x06, 0x1A, 0x8C, 0x70, 0x05, 0x1E, 0xD7, + 0x4D, 0xCC, 0xD1, 0x9A, 0x45, 0x3B, 0xE1, 0x7B, 0x6B, 0x41, 0x37, 0x6E, 0x38, 0x9B, 0x50, 0x5E, + 0x52, 0xE9, 0x90, 0x74, 0xCB, 0xD1, 0xBF, 0xCF, 0x23, 0x94, 0x2A, 0xC8, 0x90, 0x11, 0xA9, 0x8C, + 0x7B, 0x21, 0x5A, 0xC1, 0x67, 0x1F, 0xD8, 0x7F, 0x34, 0x82, 0x57, 0x72, 0xC9, 0x26, 0x97, 0x08, + 0x6D, 0xF2, 0xD3, 0x4A, 0xD8, 0x64, 0x33, 0x09, 0xE5, 0xC6, 0x71, 0x44, 0x9B, 0x5B, 0x99, 0xF7, + 0xD2, 0xF8, 0x1E, 0xA3, 0x17, 0xD7, 0x82, 0x52, 0x84, 0x43, 0xC1, 0x0F, 0x4E, 0x60, 0x1B, 0x55, + 0xE1, 0x99, 0x2E, 0x16, 0x63, 0xD2, 0x1E, 0x43, 0xD7, 0x65, 0x2F, 0x0A, 0x73, 0x24, 0xCA, 0xC1, + 0x3A, 0x27, 0x81, 0x1F, 0xD3, 0xEC, 0x5F, 0xEF, 0x1A, 0x32, 0x29, 0x61, 0x8C, 0x17, 0xB9, 0x29, + 0x21, 0x6A, 0xB2, 0xC1, 0x94, 0x00, 0xB2, 0xAD, 0xCC, 0xED, 0x9D, 0x8B, 0x1C, 0xA2, 0xB7, 0xD7, + 0x4A, 0xEA, 0xE2, 0x08, 0x6A, 0xA0, 0x01, 0x0B, 0x24, 0xEF, 0x3B, 0x9E, 0x97, 0x26, 0x1A, 0xF5, + 0xFA, 0x2B, 0x59, 0xE4, 0x23, 0x8B, 0x31, 0x92, 0x14, 0xA3, 0x8D, 0xA8, 0xDD, 0x86, 0x12, 0x48, + 0x88, 0x41, 0x97, 0x46, 0x16, 0x75, 0x44, 0xB8, 0x76, 0xD9, 0x7E, 0x26, 0xD2, 0xD0, 0x31, 0x53, + 0x24, 0x05, 0xC9, 0x99, 0x7D, 0x53, 0x11, 0x48, 0x8A, 0x04, 0x62, 0xC8, 0xFF, 0xB1, 0xD3, 0x1D, + 0xA7, 0x66, 0x42, 0x03, 0xDC, 0x50, 0xF3, 0x34, 0x1D, 0x34, 0x8E, 0x9F, 0x5C, 0x66, 0xCA, 0x30, + 0x36, 0xA5, 0x90, 0x22, 0x3F, 0x35, 0x8C, 0x1B, 0xAD, 0xF8, 0x1E, 0xAF, 0xB4, 0xD5, 0x08, 0x73, + 0x20, 0xB1, 0xCF, 0x9A, 0x0D, 0x2A, 0xAB, 0xB7, 0x68, 0xBB, 0x91, 0x63, 0xEB, 0x51, 0xD2, 0x6E, + 0x1C, 0x07, 0xEB, 0xDD, 0x60, 0x74, 0x82, 0xF4, 0x74, 0xB7, 0xB8, 0x1A, 0xB6, 0x52, 0xAE, 0x32, + 0xCA, 0x3C, 0xD3, 0x51, 0xDA, 0xCC, 0x34, 0xC3, 0xA2, 0x74, 0x11, 0x9F, 0xC4, 0x54, 0x9B, 0xD2, + 0xF4, 0x41, 0x66, 0x18, 0x9A, 0x12, 0xDD, 0x15, 0xB0, 0x2A, 0x25, 0xF6, 0x40, 0x19, 0x94, 0x62, + 0xF0, 0x59, 0x37, 0xC3, 0x52, 0x7C, 0x99, 0x8B, 0x34, 0x2D, 0xE5, 0xCE, 0x10, 0xDE, 0x6D, 0xB3, + 0xAE, 0xF9, 0x83, 0x47, 0x85, 0xBA, 0x7D, 0x03, 0xBF, 0xCE, 0xCE, 0xE2, 0x55, 0x67, 0x9F, 0x4F, + 0x91, 0xE8, 0xD8, 0x2E, 0xBB, 0xF0, 0x78, 0xBC, 0x1D, 0x7E, 0xED, 0xBA, 0xC0, 0x90, 0x33, 0xB8, + 0x70, 0x56, 0xCF, 0xA5, 0x6E, 0x30, 0xA9, 0xA2, 0x41, 0x7A, 0xB3, 0x6F, 0xF1, 0xC7, 0xB9, 0x87, + 0x97, 0xF0, 0x14, 0xA4, 0xDE, 0x58, 0xBC, 0x2F, 0xDE, 0x64, 0x31, 0x27, 0x31, 0x6C, 0x61, 0x8E, + 0xB3, 0xF7, 0xBB, 0xF0, 0x21, 0xFB, 0x55, 0x04, 0x64, 0xAE, 0x57, 0x8D, 0x56, 0x82, 0xA1, 0x8E, + 0x2F, 0xD8, 0xC3, 0xF5, 0x74, 0x29, 0x19, 0xC3, 0x89, 0x65, 0x55, 0x66, 0x5E, 0xCE, 0x17, 0xAD, + 0x63, 0x1A, 0x83, 0x12, 0x11, 0x38, 0xDE, 0xB7, 0xC3, 0x64, 0xE7, 0x86, 0x39, 0xED, 0x0A, 0x6F, + 0x91, 0xC0, 0x34, 0x28, 0x25, 0xDC, 0xF9, 0x03, 0x05, 0x98, 0xFF, 0x1E, 0x5E, 0x3C, 0xFF, 0x5E, + 0xAF, 0x89, 0x07, 0x91, 0x31, 0x95, 0xB0, 0x83, 0x03, 0xC2, 0x99, 0x5C, 0xAF, 0xCE, 0x00, 0xB1, + 0xCC, 0xFF, 0x81, 0xE0, 0xB8, 0x6C, 0x4B, 0x80, 0xCF, 0x9E, 0x54, 0x4E, 0x20, 0xCF, 0xD8, 0x22, + 0x16, 0x67, 0x43, 0xB9, 0xAA, 0xA8, 0x3E, 0xE7, 0x76, 0x34, 0x9B, 0x8D, 0xFA, 0x5E, 0xE3, 0xF7, + 0x7A, 0xB3, 0xDE, 0xA8, 0x1F, 0xCA, 0x9C, 0x7D, 0xB9, 0xC0, 0x0C, 0xED, 0xD8, 0x5F, 0x96, 0xBA, + 0x27, 0x13, 0x33, 0xFB, 0x39, 0xB7, 0xA5, 0x59, 0x7F, 0x57, 0x60, 0x5B, 0xF6, 0xEB, 0x47, 0x2B, + 0xDB, 0x16, 0x35, 0xB3, 0x8D, 0xD9, 0x16, 0x78, 0x84, 0x07, 0x45, 0x6B, 0xDE, 0xD1, 0x92, 0x6F, + 0x47, 0xE5, 0x71, 0x9B, 0x67, 0x4F, 0xE7, 0x5F, 0x07, 0x56, 0xC6, 0xE2, 0x5E, 0x0C, 0x0C, 0x6D, + 0xAC, 0x25, 0x4E, 0x8C, 0x5A, 0x7E, 0xCA, 0x99, 0xA2, 0x31, 0xEF, 0xA6, 0x2F, 0xF6, 0xB5, 0x32, + 0xEB, 0x03, 0xA1, 0x0B, 0xEB, 0x4C, 0xD0, 0x0A, 0xD5, 0xE7, 0xC5, 0xAC, 0x31, 0xD7, 0xE6, 0xCF, + 0x73, 0xE8, 0xCB, 0xF6, 0xCB, 0x2B, 0x50, 0x5B, 0x65, 0x66, 0x5D, 0x15, 0xFC, 0xDC, 0x18, 0x9F, + 0xFA, 0x8D, 0x78, 0x21, 0x15, 0x59, 0x5F, 0x04, 0xC5, 0xC5, 0xAC, 0x02, 0x2A, 0xB2, 0x58, 0xC7, + 0xAC, 0xD5, 0xCE, 0xCD, 0xB4, 0x31, 0xB5, 0x84, 0x8F, 0x3B, 0xA5, 0x68, 0x4F, 0x3D, 0x56, 0xB3, + 0x27, 0xB3, 0x1C, 0x4F, 0x46, 0x3D, 0x1C, 0x25, 0x40, 0xCA, 0x05, 0x62, 0x0D, 0x8D, 0xC0, 0x9F, + 0x5D, 0x63, 0xAC, 0x7C, 0xA2, 0x05, 0xDB, 0x48, 0xAB, 0x64, 0xA9, 0xF7, 0x87, 0xDE, 0x1C, 0xE9, + 0x7D, 0x86, 0x15, 0x64, 0x5A, 0x6D, 0xA8, 0x94, 0x2E, 0x8D, 0xC9, 0xA6, 0x7C, 0x50, 0x29, 0xE0, + 0x73, 0x83, 0x8C, 0x20, 0x8D, 0x66, 0xF8, 0x53, 0x7D, 0x6E, 0x1A, 0xC4, 0x39, 0x79, 0x61, 0xB5, + 0x3B, 0x7E, 0x2A, 0xEC, 0x09, 0x5D, 0x4F, 0x66, 0xDF, 0x4B, 0xD2, 0x17, 0xBE, 0x2B, 0xAF, 0xAE, + 0x29, 0xC5, 0x2B, 0x7C, 0x9B, 0x57, 0xCD, 0x37, 0x71, 0x1B, 0x3F, 0x61, 0xB1, 0xC0, 0xBE, 0xD0, + 0x3A, 0xD1, 0x88, 0xAC, 0x13, 0x59, 0x55, 0x45, 0xDD, 0xF8, 0x7C, 0xCB, 0x55, 0x84, 0x4D, 0x74, + 0x11, 0x66, 0xA6, 0x29, 0x94, 0xAF, 0x66, 0xA6, 0x77, 0x48, 0x8E, 0xCD, 0x93, 0x1B, 0x56, 0x7C, + 0x8B, 0xF8, 0x83, 0x29, 0xA6, 0x6D, 0x91, 0x13, 0x08, 0x9C, 0xF1, 0xD4, 0xAD, 0xC2, 0x36, 0xE3, + 0xAD, 0x3A, 0x87, 0x6F, 0xE8, 0x6C, 0x3A, 0x7B, 0xBB, 0x28, 0x43, 0xCC, 0xE4, 0x2E, 0x79, 0x7C, + 0xE4, 0xDC, 0x29, 0x93, 0x52, 0x34, 0x4C, 0x99, 0x6D, 0x53, 0x6B, 0x98, 0xB6, 0x6D, 0x79, 0x32, + 0x04, 0xB9, 0xAD, 0xFF, 0x6E, 0xF7, 0x7C, 0xF7, 0xCF, 0xF9, 0x37, 0x25, 0xFD, 0xDB, 0xC4, 0x77, + 0x5F, 0xF7, 0x4C, 0x57, 0x30, 0xDF, 0xD3, 0x01, 0x23, 0x3C, 0x7D, 0x17, 0x53, 0x5F, 0xD5, 0xFE, + 0x46, 0xD3, 0x90, 0x8F, 0xD4, 0xCB, 0xF1, 0x86, 0xEF, 0x13, 0x4F, 0x48, 0xE2, 0x70, 0x6C, 0xAA, + 0x72, 0xEF, 0x60, 0x7A, 0x76, 0x9F, 0x7D, 0x60, 0x86, 0xA3, 0x07, 0x68, 0x45, 0xAC, 0xFD, 0x11, + 0x70, 0xEF, 0x51, 0x2A, 0x5B, 0x8E, 0x07, 0xEA, 0xD6, 0xD6, 0x9B, 0x9A, 0x10, 0x6F, 0xB6, 0xC7, + 0x4D, 0xC3, 0x46, 0x35, 0x10, 0x57, 0xCE, 0x35, 0x7D, 0xB8, 0x25, 0xD8, 0x87, 0x16, 0xFB, 0xB7, + 0xE4, 0x32, 0x30, 0x29, 0x71, 0xCF, 0x71, 0x84, 0x2F, 0x3C, 0xCD, 0xAD, 0xDD, 0xCA, 0x26, 0x5B, + 0x22, 0xD6, 0xCD, 0xBF, 0x6F, 0x87, 0xF3, 0x8C, 0x26, 0x07, 0x5B, 0x02, 0x5A, 0x3D, 0x71, 0xA5, + 0xF7, 0xBB, 0x43, 0x31, 0xB2, 0x5A, 0xFF, 0x1F, 0xFF, 0xF1, 0xC2, 0x61, 0xEC, 0xC4, 0x00 }; ///index_html //Content of bootstrap.bundle.min.jss with gzip compression diff --git a/Firmware/RTK_Everywhere/menuCommands.ino b/Firmware/RTK_Everywhere/menuCommands.ino index cf6ab57e9..7596db574 100644 --- a/Firmware/RTK_Everywhere/menuCommands.ino +++ b/Firmware/RTK_Everywhere/menuCommands.ino @@ -1356,9 +1356,6 @@ void createSettingsString(char *newSettings) snprintf(tagText, sizeof(tagText), "correctionsPriority.%s", correctionsSourceNames[x]); stringRecord(newSettings, tagText, settings.correctionsSourcesPriority[x]); } - // Pass the number of correction sources, so we can check the priorities are contiguous from 0 to CORR_NUM, - // with no duplications / missing entries. - stringRecord(newSettings, "correctionsPriorityLen", correctionsSource::CORR_NUM); // stringRecord(newSettings, "", settings.); From f0cc16475fe7f0196a9981c7957b0bb3b0f53c0d Mon Sep 17 00:00:00 2001 From: PaulZC Date: Wed, 27 Mar 2024 23:40:08 +0000 Subject: [PATCH 074/112] Corrections priority WiFi Config almost working --- Firmware/RTK_Everywhere/AP-Config/src/main.js | 147 +- Firmware/RTK_Everywhere/form.h | 1553 +++++++++-------- 2 files changed, 857 insertions(+), 843 deletions(-) diff --git a/Firmware/RTK_Everywhere/AP-Config/src/main.js b/Firmware/RTK_Everywhere/AP-Config/src/main.js index 2edfc2cbd..0fe567803 100644 --- a/Firmware/RTK_Everywhere/AP-Config/src/main.js +++ b/Firmware/RTK_Everywhere/AP-Config/src/main.js @@ -92,10 +92,11 @@ function parseIncoming(msg) { platformPrefix = val; document.title = "RTK " + platformPrefix + " Setup"; fullPageUpdate = true; + correctionText = ""; if (platformPrefix == "Facet v2") { show("baseConfig"); - hide("sensorConfig"); + //hide("sensorConfig"); show("ppConfig"); hide("ethernetConfig"); hide("ntpConfig"); @@ -104,7 +105,7 @@ function parseIncoming(msg) { } else if (platformPrefix == "Facet mosaic") { show("baseConfig"); - hide("sensorConfig"); + //hide("sensorConfig"); show("ppConfig"); hide("ethernetConfig"); hide("ntpConfig"); @@ -113,7 +114,7 @@ function parseIncoming(msg) { } else if (platformPrefix == "EVK") { show("baseConfig"); - hide("sensorConfig"); + //hide("sensorConfig"); show("ppConfig"); show("ethernetConfig"); show("ntpConfig"); @@ -321,7 +322,7 @@ function parseIncoming(msg) { ge("resetProfileMsg").innerHTML = ''; //Don't update if all we received was coordinate info - if (fullPageUpdate) { + if (fullPageUpdate == true) { fullPageUpdate = false; //Force element updates @@ -341,6 +342,8 @@ function parseIncoming(msg) { ge("autoIMUmountAlignment").dispatchEvent(new CustomEvent('change')); ge("enableARPLogging").dispatchEvent(new CustomEvent('change')); + ge("correctionsPriorityList").innerHTML = correctionText; + updateECEFList(); updateGeodeticList(); tcpBoxes(); @@ -348,7 +351,6 @@ function parseIncoming(msg) { tcpBoxesEthernet(); dhcpEthernet(); updateLatLong(); - updateCorrectionsPriority(); } } @@ -450,7 +452,7 @@ function validateFields() { collapseSection("collapseGNSSConfig", "gnssCaret"); collapseSection("collapseGNSSConfigMsg", "gnssMsgCaret"); collapseSection("collapseBaseConfig", "baseCaret"); - collapseSection("collapseSensorConfig", "sensorCaret"); + //collapseSection("collapseSensorConfig", "sensorCaret"); collapseSection("collapsePPConfig", "pointPerfectCaret"); collapseSection("collapsePortsConfig", "portsCaret"); collapseSection("collapseRadioConfig", "radioCaret"); @@ -471,7 +473,7 @@ function validateFields() { checkElementValue("minElev", 0, 90, "Must be between 0 and 90", "collapseGNSSConfig"); checkElementValue("minCNO", 0, 90, "Must be between 0 and 90", "collapseGNSSConfig"); - if (ge("enableNtripClient").checked) { + if (ge("enableNtripClient").checked == true) { checkElementString("ntripClient_CasterHost", 1, 45, "Must be 1 to 45 characters", "collapseGNSSConfig"); checkElementValue("ntripClient_CasterPort", 1, 99999, "Must be 1 to 99999", "collapseGNSSConfig"); checkElementString("ntripClient_MountPoint", 1, 30, "Must be 1 to 30 characters", "collapseGNSSConfig"); @@ -499,7 +501,7 @@ function validateFields() { checkCorrectionsPriorities(); //Base Config - if (ge("baseTypeSurveyIn").checked) { + if (ge("baseTypeSurveyIn").checked == true) { checkElementValue("observationSeconds", 60, 600, "Must be between 60 to 600", "collapseBaseConfig"); checkElementValue("observationPositionAccuracy", 1, 5.1, "Must be between 1.0 to 5.0", "collapseBaseConfig"); @@ -516,7 +518,7 @@ function validateFields() { clearElement("observationSeconds", 60); clearElement("observationPositionAccuracy", 5.0); - if (ge("fixedBaseCoordinateTypeECEF").checked) { + if (ge("fixedBaseCoordinateTypeECEF").checked == true) { clearElement("fixedLatText", 40.09029479); clearElement("fixedLongText", -105.18505761); clearElement("fixedAltitude", 1560.089); @@ -578,16 +580,16 @@ function validateFields() { checkElementString("wifiNetwork2Password", 0, 50, "Must be 0 to 50 characters", "collapseWiFiConfig"); checkElementString("wifiNetwork3SSID", 0, 50, "Must be 0 to 50 characters", "collapseWiFiConfig"); checkElementString("wifiNetwork3Password", 0, 50, "Must be 0 to 50 characters", "collapseWiFiConfig"); - if (ge("enablePvtClient").checked || ge("enablePvtServer").checked) { + if ((ge("enablePvtClient").checked == true) || (ge("enablePvtServer").checked == true)) { checkElementString("pvtServerPort", 1, 65535, "Must be 1 to 65535", "collapseWiFiConfig"); } - if (ge("enablePvtUdpServer").checked) { + if (ge("enablePvtUdpServer").checked == true) { checkElementString("pvtUdpServerPort", 1, 65535, "Must be 1 to 65535", "collapseWiFiConfig"); } checkCheckboxMutex("enablePvtClient", "enablePvtServer", "TCP Client and Server can not be enabled at the same time", "collapseWiFiConfig"); //System Config - if (ge("enableLogging").checked) { + if (ge("enableLogging").checked == true) { checkElementValue("maxLogTime_minutes", 1, 1051200, "Must be 1 to 1,051,200", "collapseSystemConfig"); checkElementValue("maxLogLength_minutes", 1, 1051200, "Must be 1 to 1,051,200", "collapseSystemConfig"); } @@ -596,7 +598,7 @@ function validateFields() { clearElement("maxLogLength_minutes", 60 * 24); } - if (ge("enableARPLogging").checked) { + if (ge("enableARPLogging").checked == true) { checkElementValue("ARPLoggingInterval", 1, 600, "Must be 1 to 600", "collapseSystemConfig"); } else { @@ -604,7 +606,7 @@ function validateFields() { } //Ethernet - if (platformPrefix == "Reference Station") { + if (platformPrefix == "EVK") { //if (ge("ethernetDHCP").checked == false) { checkElementIPAddress("ethernetIP", "Must be nnn.nnn.nnn.nnn", "collapseEthernetConfig"); checkElementIPAddress("ethernetDNS", "Must be nnn.nnn.nnn.nnn", "collapseEthernetConfig"); @@ -612,7 +614,7 @@ function validateFields() { checkElementIPAddress("ethernetSubnet", "Must be nnn.nnn.nnn.nnn", "collapseEthernetConfig"); checkElementValue("ethernetHttpPort", 0, 65535, "Must be 0 to 65535", "collapseEthernetConfig"); checkElementValue("ethernetNtpPort", 0, 65535, "Must be 0 to 65535", "collapseEthernetConfig"); - if (ge("enableTcpClientEthernet").checked) { + if (ge("enableTcpClientEthernet").checked == true) { checkElementString("ethernetTcpPort", 1, 65535, "Must be 1 to 65535", "collapseEthernetConfig"); checkElementString("hostForTCPClient", 0, 50, "Must be 0 to 50 characters", "collapseEthernetConfig"); } @@ -628,7 +630,7 @@ function validateFields() { } //NTP - if (platformPrefix == "Reference Station") { + if (platformPrefix == "EVK") { checkElementValue("ntpPollExponent", 3, 17, "Must be 3 to 17", "collapseNTPConfig"); checkElementValue("ntpPrecision", -30, 0, "Must be -30 to 0", "collapseNTPConfig"); checkElementValue("ntpRootDelay", 0, 10000000, "Must be 0 to 10,000,000", "collapseNTPConfig"); @@ -637,7 +639,7 @@ function validateFields() { } //Port Config - if (ge("enableExternalPulse").checked) { + if (ge("enableExternalPulse").checked == true) { checkElementValue("externalPulseTimeBetweenPulse_us", 1, 60000000, "Must be 1 to 60,000,000", "collapsePortsConfig"); checkElementValue("externalPulseLength_us", 1, 60000000, "Must be 1 to 60,000,000", "collapsePortsConfig"); } @@ -673,7 +675,7 @@ function changeProfile() { collapseSection("collapseGNSSConfig", "gnssCaret"); collapseSection("collapseGNSSConfigMsg", "gnssMsgCaret"); collapseSection("collapseBaseConfig", "baseCaret"); - collapseSection("collapseSensorConfig", "sensorCaret"); + //collapseSection("collapseSensorConfig", "sensorCaret"); collapseSection("collapsePPConfig", "pointPerfectCaret"); collapseSection("collapsePortsConfig", "portsCaret"); collapseSection("collapseSystemConfig", "systemCaret"); @@ -703,11 +705,10 @@ function saveConfig() { } function checkConstellations() { - if (ge("ubxConstellationsGPS").checked == false - && ge("ubxConstellationsGalileo").checked == false - && ge("ubxConstellationsBeiDou").checked == false - && ge("ubxConstellationsGLONASS").checked == false - ) { + if ((ge("ubxConstellationsGPS").checked == false) + && (ge("ubxConstellationsGalileo").checked == false) + && (ge("ubxConstellationsBeiDou").checked == false) + && (ge("ubxConstellationsGLONASS").checked == false)) { ge("collapseGNSSConfig").classList.add('show'); showError('ubxConstellations', "Please choose one constellation"); errorCount++; @@ -742,7 +743,7 @@ function checkLatLong() { ge(collapseID).classList.add('show'); errorCount++; } - else if (convertedCoordinate < -180 || convertedCoordinate > 180) { + else if ((convertedCoordinate < -180) || (convertedCoordinate > 180)) { var errorText = "Must be -180 to 180"; ge(id + 'Error').innerHTML = 'Error: ' + errorText; ge(collapseID).classList.add('show'); @@ -759,7 +760,7 @@ function checkLatLong() { ge(collapseID).classList.add('show'); errorCount++; } - else if (convertedCoordinate < -180 || convertedCoordinate > 180) { + else if ((convertedCoordinate < -180) || (convertedCoordinate > 180)) { var errorText = "Must be -180 to 180"; ge(id + 'Error').innerHTML = 'Error: ' + errorText; ge(collapseID).classList.add('show'); @@ -786,16 +787,14 @@ function updateLatLong() { checkLatLong(); //Updates the detected format } -function updateCorrectionsPriority() { - ge("correctionsPriorityList").innerHTML = correctionText; -} - function checkElementValue(id, min, max, errorText, collapseID) { value = ge(id).value; - if (value < min || value > max || value == "") { + if ((value < min) || (value > max) || (value == "")) { ge(id + 'Error').innerHTML = 'Error: ' + errorText; ge(collapseID).classList.add('show'); - if (collapseID == "collapseGNSSConfigMsg") ge("collapseGNSSConfig").classList.add('show'); + if (collapseID == "collapseGNSSConfigMsg") { + ge("collapseGNSSConfig").classList.add('show'); + } errorCount++; } else @@ -804,7 +803,7 @@ function checkElementValue(id, min, max, errorText, collapseID) { function checkElementString(id, min, max, errorText, collapseID) { value = ge(id).value; - if (value.length < min || value.length > max) { + if ((value.length < min) || (value.length > max)) { ge(id + 'Error').innerHTML = 'Error: ' + errorText; ge(collapseID).classList.add('show'); errorCount++; @@ -838,7 +837,7 @@ function checkElementCasterUser(id, badUserName, errorText, collapseID) { } function checkCheckboxMutex(id1, id2, errorText, collapseID) { - if ((ge(id1).checked) && (ge(id2).checked)) { + if ((ge(id1).checked == true) && (ge(id2).checked == true)) { ge(id1 + 'Error').innerHTML = 'Error: ' + errorText; ge(id2 + 'Error').innerHTML = 'Error: ' + errorText; ge(collapseID).classList.add('show'); @@ -853,13 +852,14 @@ function checkCheckboxMutex(id1, id2, errorText, collapseID) { function checkCorrectionsPriorities() { var correctionsSources = document.querySelectorAll('input[id^=correctionsPriority]'); //match all ids starting with correctionsPriority if (correctionsSources.length > 0) { - var correctionSeen[correctionsSources.length]; + var correctionSeen = []; for (let x = 0; x < correctionsSources.length; x++) { - correctionSeen[x] = 0; + correctionSeen.push(0); } for (let x = 0; x < correctionsSources.length; x++) { for (let y = 0; y < correctionsSources.length; y++) { - if (correctionSources[y] == x) { + var correctionName = correctionsSources[y].id; + if (ge(correctionName).value == x) { correctionSeen[y] = correctionSeen[y] + 1; } } @@ -871,7 +871,7 @@ function checkCorrectionsPriorities() { } } if (sourcesValid == 0) { - ge("collapseCorrectionsPriorityConfig" + 'Error').innerHTML = 'Error: priorities must be contiguous, starting at 0'; + ge("collapseCorrectionsPriorityConfigError").innerHTML = "Error: priorities must be contiguous, starting at 0"; ge("collapseCorrectionsPriorityConfig").classList.add('show'); errorCount++; } @@ -1058,28 +1058,28 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("baseTypeSurveyIn").addEventListener("change", function () { - if (ge("baseTypeSurveyIn").checked) { + if (ge("baseTypeSurveyIn").checked == true) { show("surveyInConfig"); hide("fixedConfig"); } }); ge("baseTypeFixed").addEventListener("change", function () { - if (ge("baseTypeFixed").checked) { + if (ge("baseTypeFixed").checked == true) { show("fixedConfig"); hide("surveyInConfig"); } }); ge("fixedBaseCoordinateTypeECEF").addEventListener("change", function () { - if (ge("fixedBaseCoordinateTypeECEF").checked) { + if (ge("fixedBaseCoordinateTypeECEF").checked == true) { show("ecefConfig"); hide("geodeticConfig"); } }); ge("fixedBaseCoordinateTypeGeo").addEventListener("change", function () { - if (ge("fixedBaseCoordinateTypeGeo").checked) { + if (ge("fixedBaseCoordinateTypeGeo").checked == true) { hide("ecefConfig"); show("geodeticConfig"); @@ -1096,7 +1096,7 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("enableNtripServer").addEventListener("change", function () { - if (ge("enableNtripServer").checked) { + if (ge("enableNtripServer").checked == true) { show("ntripServerConfig"); } else { @@ -1105,7 +1105,7 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("enableNtripClient").addEventListener("change", function () { - if (ge("enableNtripClient").checked) { + if (ge("enableNtripClient").checked == true) { show("ntripClientConfig"); } else { @@ -1114,7 +1114,7 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("enableFactoryDefaults").addEventListener("change", function () { - if (ge("enableFactoryDefaults").checked) { + if (ge("enableFactoryDefaults").checked == true) { ge("factoryDefaults").disabled = false; } else { @@ -1147,7 +1147,7 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("enableExternalPulse").addEventListener("change", function () { - if (ge("enableExternalPulse").checked) { + if (ge("enableExternalPulse").checked == true) { show("externalPulseConfigDetails"); } else { @@ -1183,7 +1183,7 @@ document.addEventListener("DOMContentLoaded", (event) => { }); ge("enableARPLogging").addEventListener("change", function () { - if (ge("enableARPLogging").checked) { + if (ge("enableARPLogging").checked == true) { show("enableARPLoggingDetails"); } else { @@ -1560,7 +1560,7 @@ function abortHandler(event) { } function tcpBoxes() { - if (ge("enablePvtServer").checked || ge("enablePvtClient").checked) { + if ((ge("enablePvtServer").checked == true) || (ge("enablePvtClient").checked == true)) { show("tcpSettingsConfig"); } else { @@ -1570,7 +1570,7 @@ function tcpBoxes() { } function udpBoxes() { - if (ge("enablePvtUdpServer").checked) { + if (ge("enablePvtUdpServer").checked == true) { show("udpSettingsConfig"); } else { @@ -1580,7 +1580,7 @@ function udpBoxes() { } function tcpBoxesEthernet() { - if (ge("enableTcpClientEthernet").checked) { + if (ge("enableTcpClientEthernet").checked == true) { show("tcpSettingsConfigEthernet"); } else { @@ -1590,7 +1590,7 @@ function tcpBoxesEthernet() { } function dhcpEthernet() { - if (ge("ethernetDHCP").checked) { + if (ge("ethernetDHCP").checked == true) { hide("fixedIPSettingsConfigEthernet"); } else { @@ -1732,7 +1732,7 @@ function identifyInputType(userEntry) { //A valid entry has only numbers, -, ' ', and . for (var x = 0; x < userEntry.length; x++) { - if (isdigit(userEntry[x])) { + if (isdigit(userEntry[x]) == true) { if (decimalCount == 0) lengthOfLeadingNumber++ } else if (userEntry[x] == '-') dashCount++; //All good @@ -1762,7 +1762,7 @@ function identifyInputType(userEntry) { dashCount--; //Use dashCount as the internal dashes only, not the leading negative sign } - if (spaceCount == 0 && dashCount == 0 && (lengthOfLeadingNumber == 7 || lengthOfLeadingNumber == 6)) //DDMMSS.ssssss + if ((spaceCount == 0) && (dashCount == 0) && ((lengthOfLeadingNumber == 7) || (lengthOfLeadingNumber == 6))) //DDMMSS.ssssss { coordinateInputType = CoordinateTypes.COORDINATE_INPUT_TYPE_DDMMSS; @@ -1779,7 +1779,9 @@ function identifyInputType(userEntry) { seconds -= (decimal * 10000); //Remove DDD seconds -= (minutes * 100); //Remove MM convertedCoordinate = decimal + (minutes / 60.0) + (seconds / 3600.0); - if (convertedCoordinate) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (spaceCount == 0 && dashCount == 0 && (lengthOfLeadingNumber == 5 || lengthOfLeadingNumber == 4)) //DDMM.mmmmmmm { @@ -1791,7 +1793,9 @@ function identifyInputType(userEntry) { var minutes = userEntry; //Get DDDMM.mmmmmmm minutes -= (decimal * 100); //Remove DDD convertedCoordinate = decimal + (minutes / 60.0); - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (dashCount == 1) //DD-MM.mmmmmmm @@ -1802,7 +1806,9 @@ function identifyInputType(userEntry) { var decimal = Number(data[0]); //Get DD var minutes = Number(data[1]); //Get MM.mmmmmmm convertedCoordinate = decimal + (minutes / 60.0); - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (dashCount == 2) //DD-MM-SS.ssss { @@ -1818,13 +1824,17 @@ function identifyInputType(userEntry) { var seconds = Number(data[2]); //Get SS.ssssss convertedCoordinate = decimal + (minutes / 60.0) + (seconds / 3600.0); - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (spaceCount == 0) //DD.ddddddddd { coordinateInputType = CoordinateTypes.COORDINATE_INPUT_TYPE_DD; convertedCoordinate = userEntry; - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (spaceCount == 1) //DD MM.mmmmmmm { @@ -1834,7 +1844,9 @@ function identifyInputType(userEntry) { var decimal = Number(data[0]); //Get DD var minutes = Number(data[1]); //Get MM.mmmmmmm convertedCoordinate = decimal + (minutes / 60.0); - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } else if (spaceCount == 2) //DD MM SS.ssssss { @@ -1850,7 +1862,9 @@ function identifyInputType(userEntry) { var seconds = Number(data[2]); //Get SS.ssssss convertedCoordinate = decimal + (minutes / 60.0) + (seconds / 3600.0); - if (negativeSign) convertedCoordinate *= -1; + if (negativeSign == true) { + convertedCoordinate *= -1; + } } //console.log("convertedCoordinate: " + convertedCoordinate.toFixed(9)); @@ -1888,14 +1902,13 @@ function convertInput(coordinate, coordinateInputType) { else coordinateString = longitudeDegrees + " " + coordinate; } - else if (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DDMMSS - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_DASH - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_SYMBOL - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DDMMSS_NO_DECIMAL - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_NO_DECIMAL - || coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_DASH_NO_DECIMAL - ) { + else if ((coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DDMMSS) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_DASH) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_SYMBOL) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DDMMSS_NO_DECIMAL) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_NO_DECIMAL) + || (coordinateInputType == CoordinateTypes.COORDINATE_INPUT_TYPE_DD_MM_SS_DASH_NO_DECIMAL)) { var longitudeDegrees = Math.trunc(coordinate); coordinate -= longitudeDegrees; coordinate *= 60; diff --git a/Firmware/RTK_Everywhere/form.h b/Firmware/RTK_Everywhere/form.h index 77668e870..11e50c393 100644 --- a/Firmware/RTK_Everywhere/form.h +++ b/Firmware/RTK_Everywhere/form.h @@ -26,781 +26,782 @@ // python main_js_zipper.py static const uint8_t main_js[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x12, 0x60, 0x04, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, - 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0x38, 0xB2, 0xE0, 0xFF, - 0xF9, 0xBE, 0x79, 0x07, 0x8C, 0x76, 0xB6, 0x25, 0x8D, 0x65, 0x99, 0x92, 0x2F, 0xB9, 0x38, 0xF6, - 0x59, 0xDF, 0x92, 0x78, 0x27, 0x76, 0xFC, 0x59, 0x4E, 0x77, 0x27, 0x99, 0xAC, 0x0F, 0x2D, 0xC2, - 0x32, 0x27, 0x12, 0xA9, 0x25, 0x29, 0x5F, 0x66, 0x8E, 0xDF, 0xE9, 0x3C, 0xC3, 0x79, 0xB2, 0xAD, - 0x02, 0x40, 0x12, 0x37, 0x52, 0xD4, 0xC5, 0xEE, 0x9C, 0xDE, 0xF1, 0x37, 0x93, 0xB6, 0x09, 0xA0, - 0xAA, 0x50, 0x28, 0x14, 0x80, 0x42, 0x55, 0xE1, 0xD6, 0x8D, 0xC8, 0xC0, 0x4D, 0xE8, 0x9D, 0xFB, - 0x40, 0x76, 0xC8, 0xBF, 0xDF, 0xC5, 0xAF, 0xD7, 0xD6, 0xFE, 0xFC, 0xCF, 0x3B, 0x3F, 0xF0, 0xC2, - 0xBB, 0xF6, 0x30, 0xEC, 0xBB, 0x89, 0x1F, 0x06, 0xED, 0x9B, 0x30, 0x4E, 0x02, 0x77, 0x44, 0x1F, - 0xD7, 0xEE, 0xE2, 0x7F, 0xDF, 0xFE, 0xE3, 0x1F, 0x6E, 0xA1, 0xD5, 0x1D, 0xBD, 0x8A, 0xC3, 0xFE, - 0x77, 0x9A, 0xC0, 0xDF, 0x7F, 0xFC, 0x83, 0x68, 0xE1, 0x7A, 0xDE, 0xD1, 0x2D, 0x0D, 0x92, 0x0F, - 0x7E, 0x9C, 0xD0, 0x80, 0x46, 0x8D, 0xFA, 0x30, 0x74, 0xBD, 0x7A, 0x8B, 0x84, 0xC1, 0x07, 0xF8, - 0xA5, 0xC9, 0xEA, 0x5E, 0x4F, 0x82, 0x3E, 0x82, 0x15, 0x1F, 0x1B, 0x14, 0x5B, 0x34, 0xC9, 0x3F, - 0xFF, 0xF8, 0x07, 0x02, 0x3F, 0x7E, 0xE0, 0x27, 0xBF, 0xD0, 0xAB, 0x1E, 0x83, 0xDD, 0xC0, 0x16, - 0x8F, 0x4A, 0x23, 0xAD, 0x3C, 0x6D, 0x96, 0x91, 0x03, 0xDD, 0x08, 0xE8, 0x1D, 0xC9, 0xAB, 0x88, - 0xEE, 0x21, 0x24, 0xA5, 0x62, 0x3B, 0x0C, 0x46, 0x34, 0x8E, 0xDD, 0x01, 0x85, 0x26, 0x19, 0xF8, - 0xC6, 0x28, 0x1E, 0x64, 0x40, 0xF1, 0x67, 0xEC, 0x46, 0x31, 0x3D, 0x0E, 0xFA, 0xE1, 0xC8, 0x0F, - 0x06, 0x58, 0xDA, 0xF6, 0xDC, 0xC4, 0x4D, 0xA1, 0x3D, 0x1A, 0xF4, 0x0D, 0x68, 0x83, 0x66, 0x00, - 0x22, 0x9A, 0x4C, 0xA2, 0x80, 0x78, 0x61, 0x7F, 0x32, 0x82, 0x4E, 0xB6, 0x07, 0x34, 0x39, 0x1A, - 0x52, 0xFC, 0x75, 0xFF, 0xE1, 0x18, 0x7A, 0x9E, 0x75, 0x0F, 0x39, 0x7A, 0xED, 0xDF, 0x53, 0xEF, - 0x83, 0x8B, 0x3D, 0x70, 0xB6, 0xE5, 0x4F, 0x61, 0x30, 0x90, 0xBE, 0x8D, 0x87, 0x6E, 0x72, 0x1D, - 0x46, 0xA3, 0xB3, 0x88, 0x42, 0x31, 0x14, 0xD4, 0x6A, 0xA2, 0x64, 0x40, 0x43, 0x8F, 0x26, 0x7E, - 0x9F, 0xC3, 0xD8, 0x70, 0xDA, 0x4E, 0x47, 0x2F, 0x01, 0x02, 0x77, 0xC8, 0x6A, 0xC7, 0xD9, 0x6C, - 0x77, 0x5E, 0x69, 0x65, 0x7B, 0x43, 0x6C, 0xD5, 0xD9, 0x74, 0x9C, 0x76, 0xDA, 0x8C, 0xF6, 0xE9, - 0xF5, 0xAF, 0xAC, 0x41, 0xF7, 0xA5, 0xD3, 0x75, 0xB6, 0xDA, 0x9B, 0x5B, 0x2F, 0xA5, 0xA2, 0xCF, - 0x58, 0xB4, 0xF1, 0xA2, 0xB3, 0xF5, 0xD2, 0xD9, 0x68, 0x6F, 0x38, 0xEB, 0x52, 0xD1, 0x17, 0x46, - 0xC0, 0xCB, 0xAD, 0xAD, 0xAD, 0xCD, 0xF6, 0xC6, 0xCB, 0x0D, 0x51, 0x32, 0x74, 0xE3, 0xE4, 0xAD, - 0x3F, 0xA4, 0xA7, 0x20, 0x4B, 0x32, 0xE1, 0xD7, 0xF8, 0x6D, 0x32, 0xBA, 0xA2, 0x91, 0xD4, 0xCF, - 0x80, 0x7D, 0xF8, 0x78, 0x8D, 0x0D, 0xE2, 0x1E, 0x1D, 0xD2, 0x7E, 0x42, 0x3D, 0xA9, 0x3C, 0x16, - 0x9F, 0x58, 0xB9, 0x0C, 0x2D, 0xBE, 0x09, 0x41, 0x1C, 0x07, 0xF8, 0x1D, 0xE5, 0x10, 0x47, 0xD7, - 0x1D, 0xC6, 0x54, 0x94, 0x86, 0x57, 0x89, 0xEB, 0x07, 0xD4, 0x3B, 0xE1, 0x63, 0x5F, 0xAD, 0xC6, - 0xBE, 0x1B, 0x53, 0xAD, 0x96, 0xC0, 0x22, 0x2A, 0x9D, 0x5F, 0x1C, 0x9C, 0x58, 0x40, 0x61, 0xC7, - 0x2E, 0xDC, 0x2B, 0xF8, 0x87, 0xDE, 0x27, 0x32, 0x8D, 0xFD, 0x30, 0x8A, 0x28, 0x13, 0x18, 0xBD, - 0x44, 0xC8, 0xA4, 0xFE, 0x19, 0x59, 0x27, 0x70, 0x5D, 0x3C, 0x8C, 0x69, 0x49, 0x91, 0xA0, 0x95, - 0x15, 0xF3, 0x0A, 0x80, 0x29, 0x8C, 0xBC, 0xF8, 0xE8, 0xE0, 0xE8, 0x2D, 0x14, 0x7C, 0xFD, 0xB6, - 0xAD, 0x7C, 0x7E, 0x27, 0xC6, 0x5F, 0x2E, 0xBA, 0x9E, 0x0C, 0x87, 0x67, 0x00, 0xEF, 0xD3, 0x18, - 0x84, 0x5D, 0xEE, 0x79, 0xDA, 0x32, 0xA6, 0xC9, 0x85, 0x3F, 0xA2, 0xE1, 0x24, 0xC9, 0x46, 0x23, - 0xF0, 0x0E, 0x61, 0x62, 0xA8, 0x5F, 0xFB, 0x37, 0xB4, 0xFF, 0xFD, 0x94, 0xDE, 0xBD, 0xF5, 0xA3, - 0xD1, 0x9D, 0x1B, 0x51, 0xB5, 0x14, 0x66, 0x83, 0xB5, 0xEC, 0x8F, 0x7F, 0xE8, 0x87, 0x01, 0xF0, - 0xF2, 0x20, 0x04, 0xFA, 0xFC, 0x00, 0x28, 0xC0, 0x7E, 0xE1, 0x18, 0x8B, 0x69, 0x75, 0xF0, 0xF1, - 0xE3, 0xF9, 0xE1, 0xF1, 0xE9, 0xDE, 0xC5, 0xD1, 0xE5, 0xF1, 0xE9, 0xD9, 0xA7, 0x8B, 0xCB, 0x8B, - 0xCF, 0x67, 0x47, 0x97, 0x87, 0x87, 0xAF, 0x89, 0xD3, 0x22, 0x6B, 0x6B, 0x87, 0xF4, 0xDA, 0x9D, - 0x80, 0x34, 0x1F, 0x1E, 0xB6, 0xBD, 0xF4, 0xA7, 0xBC, 0xE1, 0xC9, 0xC9, 0x6B, 0xD2, 0x61, 0x4D, - 0xE1, 0xD7, 0xF6, 0x08, 0x7F, 0xCA, 0x1B, 0x5C, 0x62, 0x8B, 0x2E, 0x6F, 0x41, 0x2A, 0x37, 0xB9, - 0x3C, 0xDC, 0xEB, 0xBD, 0x7F, 0x4D, 0xD6, 0x79, 0xBB, 0xD5, 0xEA, 0xED, 0x7A, 0x9F, 0x4F, 0xF6, - 0x3F, 0x7E, 0x78, 0x4D, 0x36, 0x78, 0xCB, 0xFF, 0xFA, 0xCF, 0xB4, 0xE9, 0x68, 0x54, 0x9F, 0xD6, - 0xB3, 0x5E, 0xEF, 0x35, 0xD9, 0xCC, 0x28, 0x25, 0xBD, 0x5E, 0x3B, 0x66, 0x3F, 0x15, 0xB0, 0x42, - 0xCB, 0xAD, 0x39, 0x5B, 0x8A, 0xAE, 0xBE, 0xC8, 0xBA, 0xBA, 0x3A, 0x5B, 0xF3, 0xB4, 0xC7, 0x2F, - 0xF3, 0x1E, 0xD7, 0x33, 0x08, 0xB5, 0xE9, 0x7D, 0xBE, 0x3C, 0xFD, 0x78, 0x79, 0x78, 0x74, 0x70, - 0x7C, 0xB2, 0x07, 0x40, 0x5E, 0xA5, 0x43, 0xDB, 0xEB, 0x91, 0x55, 0x72, 0x1A, 0x12, 0x8F, 0xF6, - 0xFD, 0x91, 0x3B, 0xAC, 0x44, 0x89, 0x0C, 0xA8, 0xE3, 0xC8, 0xEC, 0x98, 0x1D, 0x16, 0x32, 0x45, - 0x05, 0xD8, 0x91, 0x19, 0x54, 0x19, 0xE0, 0xF1, 0xE9, 0xCF, 0x7B, 0x1F, 0x8E, 0x0F, 0x2F, 0x3F, - 0x9D, 0xFE, 0xF5, 0xF4, 0xE3, 0x2F, 0xA7, 0x00, 0xA7, 0xDB, 0x92, 0x56, 0x12, 0x98, 0x3E, 0xB7, - 0x34, 0x02, 0xDD, 0x98, 0xCF, 0x20, 0x54, 0x9C, 0x6D, 0x27, 0xD3, 0x3E, 0xE9, 0xE7, 0xE3, 0x60, - 0x3C, 0x49, 0x84, 0x42, 0xD1, 0xA6, 0x5B, 0xBB, 0xA8, 0x2F, 0xEA, 0x22, 0x6E, 0xAC, 0x8F, 0xD9, - 0xE2, 0xB7, 0xB6, 0x86, 0xD3, 0x38, 0x1C, 0x52, 0xD8, 0x48, 0x0C, 0x1A, 0x35, 0x5F, 0xD4, 0x49, - 0x35, 0xDC, 0x6B, 0x52, 0x23, 0x2B, 0x04, 0x1B, 0x30, 0x80, 0xD8, 0x02, 0x69, 0xC3, 0xD5, 0x15, - 0x88, 0xC1, 0x85, 0x36, 0x1E, 0x0F, 0xFD, 0xA4, 0x51, 0x6F, 0xD5, 0xD3, 0xD5, 0x16, 0x96, 0x3D, - 0xD2, 0x18, 0xC2, 0x1A, 0x7F, 0xCF, 0xD6, 0x01, 0xF8, 0xCF, 0x1B, 0x56, 0xBF, 0x3D, 0xA4, 0xC1, - 0x20, 0xB9, 0x01, 0xF6, 0x75, 0xF0, 0xE3, 0xCA, 0x0E, 0xE9, 0x2A, 0x6B, 0x38, 0xC2, 0xF5, 0x71, - 0xED, 0xC0, 0xCA, 0x5F, 0xEF, 0xBF, 0x6D, 0xAB, 0x45, 0xB7, 0xEE, 0x30, 0x2B, 0x03, 0x92, 0x3A, - 0x72, 0xB9, 0xDE, 0x09, 0x8F, 0x93, 0x0D, 0xD0, 0x56, 0x48, 0xAD, 0x85, 0x4D, 0xF9, 0x07, 0xF8, - 0x25, 0xEF, 0x07, 0x6F, 0xD8, 0x1B, 0xC3, 0x40, 0x02, 0x68, 0xE8, 0xF6, 0xC8, 0x0D, 0xBC, 0x38, - 0x2F, 0xF3, 0xAF, 0x49, 0xC3, 0xF7, 0xDA, 0xC0, 0x91, 0xE1, 0xC4, 0xA3, 0x71, 0xA3, 0x16, 0x7B, - 0x27, 0xE1, 0x24, 0x80, 0x01, 0xAB, 0x35, 0x15, 0xC2, 0x39, 0xA0, 0x0B, 0xDC, 0x43, 0x84, 0xC1, - 0x5A, 0x78, 0x7D, 0x4D, 0x7A, 0x87, 0x04, 0x74, 0xA5, 0xAB, 0x56, 0x41, 0x78, 0xAC, 0x13, 0xA0, - 0xF6, 0x99, 0xA6, 0xAE, 0x19, 0x50, 0xF0, 0xE7, 0xC6, 0xF7, 0x68, 0xA3, 0x86, 0x6B, 0xD2, 0x89, - 0x1B, 0xC0, 0x08, 0x44, 0xB5, 0xE6, 0xB6, 0x5A, 0xEB, 0x51, 0xFD, 0x93, 0x02, 0x28, 0x05, 0x78, - 0x12, 0x4D, 0x0A, 0x60, 0xE3, 0x72, 0x58, 0x19, 0xB6, 0xF4, 0x6B, 0x86, 0x02, 0xC7, 0x07, 0x30, - 0xA8, 0xBB, 0x1B, 0x13, 0x97, 0xB1, 0xFB, 0x01, 0xD2, 0x34, 0x44, 0xD9, 0x6E, 0x2B, 0xF1, 0x93, - 0x21, 0x5B, 0x0A, 0xCF, 0x2F, 0xFE, 0xCA, 0x06, 0x49, 0x6B, 0x0C, 0x23, 0x48, 0x7A, 0xB0, 0x43, - 0x1B, 0xD7, 0x34, 0x08, 0xC6, 0xF2, 0x87, 0xFD, 0x56, 0x46, 0x37, 0xE5, 0xBA, 0x4E, 0x0E, 0x20, - 0x7B, 0xEB, 0xF6, 0x41, 0x42, 0x6F, 0xBB, 0x65, 0x7C, 0xBA, 0x82, 0x35, 0xFA, 0x20, 0x0C, 0xAE, - 0xFD, 0x81, 0xC1, 0xA6, 0x7C, 0xA0, 0x60, 0x49, 0x8D, 0xC3, 0xA8, 0xA4, 0x1A, 0x87, 0x35, 0x1E, - 0x4F, 0x85, 0x44, 0x93, 0x1B, 0x1A, 0x05, 0x34, 0x99, 0x5A, 0x31, 0x48, 0xCA, 0x80, 0xAD, 0xAD, - 0xF1, 0x5A, 0xEE, 0x70, 0x18, 0xDE, 0xFD, 0xE2, 0xBF, 0xF5, 0x3F, 0x82, 0x96, 0x39, 0x4A, 0x61, - 0x0F, 0x7D, 0xE0, 0x39, 0xB4, 0x83, 0x6A, 0x6F, 0x43, 0xDC, 0x42, 0xC0, 0xD6, 0x97, 0x12, 0x7A, - 0x3F, 0x76, 0x83, 0x18, 0x14, 0xC5, 0x8C, 0xE0, 0x7A, 0x34, 0xBA, 0x65, 0x42, 0x54, 0x09, 0x5C, - 0x91, 0xDC, 0x16, 0x0E, 0xCF, 0x28, 0x8C, 0x5D, 0xBF, 0xFF, 0xAF, 0x21, 0xFA, 0x21, 0x87, 0xE8, - 0xE8, 0xE7, 0xBF, 0xFE, 0x10, 0x23, 0xC3, 0xAB, 0x54, 0x18, 0x19, 0x5E, 0xF1, 0x77, 0x30, 0x32, - 0x76, 0xC5, 0x2C, 0x2D, 0x54, 0xFF, 0xC0, 0xF3, 0x16, 0xDF, 0xAF, 0xFF, 0x4C, 0x23, 0x84, 0x75, - 0x8C, 0x74, 0x5B, 0x16, 0xAD, 0x93, 0x09, 0xEC, 0xE0, 0x61, 0xE9, 0xA3, 0xC4, 0xBD, 0x0A, 0x6F, - 0x29, 0x31, 0x5B, 0x92, 0x84, 0xC6, 0x89, 0xD1, 0x2C, 0xF4, 0xFC, 0xEB, 0x07, 0x38, 0x4E, 0x24, - 0x09, 0xEC, 0x15, 0x62, 0xE2, 0x4D, 0x28, 0x49, 0x42, 0x38, 0x48, 0xF1, 0xA6, 0x64, 0xE8, 0x8F, - 0xFC, 0x84, 0x59, 0x25, 0x62, 0xFB, 0x1A, 0xB8, 0x0B, 0x67, 0xD8, 0x6E, 0xC7, 0x2E, 0x3E, 0xEC, - 0xC4, 0x08, 0xEA, 0x1C, 0xCE, 0xE8, 0x35, 0xEF, 0x21, 0x70, 0x47, 0x7E, 0x1F, 0xF0, 0xD1, 0xA1, - 0x75, 0xC0, 0x70, 0x9F, 0x11, 0xD0, 0xBB, 0x8F, 0x63, 0xB6, 0xCD, 0xE1, 0x56, 0x05, 0xFE, 0x47, - 0xA3, 0x7E, 0x12, 0xDE, 0xD1, 0xA8, 0xDE, 0x22, 0xF5, 0x4E, 0xA7, 0x6E, 0x15, 0x08, 0x86, 0x09, - 0xCD, 0x21, 0x8D, 0x0C, 0x44, 0x8B, 0x4C, 0x02, 0x0F, 0x64, 0x1C, 0x4E, 0x96, 0xB6, 0x26, 0x45, - 0xA8, 0x8E, 0x56, 0x7B, 0xB0, 0x5D, 0x4B, 0x04, 0xBA, 0xEE, 0x32, 0xD0, 0xD9, 0x07, 0x1C, 0x36, - 0x2C, 0x49, 0xC4, 0x78, 0x3E, 0x40, 0xD3, 0x8D, 0x8B, 0xA7, 0xED, 0xAB, 0x07, 0x82, 0x6B, 0xE7, - 0x24, 0xF0, 0x93, 0x69, 0x92, 0x11, 0x7B, 0x6F, 0x23, 0x4A, 0x7B, 0x63, 0x50, 0xAF, 0xB5, 0xA6, - 0x8A, 0xEF, 0x3F, 0xFE, 0x83, 0x68, 0x55, 0x7B, 0xFE, 0x3F, 0xA6, 0xD6, 0xBA, 0x71, 0x23, 0x0F, - 0x87, 0xFC, 0xF8, 0x70, 0x5A, 0x4D, 0x53, 0xB4, 0xA6, 0xB5, 0xF0, 0xDC, 0x87, 0xF8, 0x9C, 0x8E, - 0xE0, 0x98, 0x0F, 0x1D, 0x9E, 0x56, 0x79, 0x1C, 0x85, 0xB8, 0xAF, 0x71, 0xD0, 0x6A, 0x51, 0xB1, - 0x6E, 0x67, 0x86, 0xBA, 0xDD, 0x19, 0xEA, 0xAE, 0xCF, 0x50, 0x77, 0x63, 0x86, 0xBA, 0x9B, 0x33, - 0xD4, 0xDD, 0x9A, 0xA1, 0xEE, 0x8B, 0x2A, 0x75, 0x23, 0xD7, 0xF3, 0xC3, 0x93, 0xBD, 0x83, 0xA9, - 0x83, 0x46, 0x6F, 0xFD, 0x3E, 0xDD, 0xBF, 0x98, 0x2E, 0x10, 0xB0, 0x55, 0x4F, 0xCD, 0x4C, 0xD3, - 0xAA, 0x5E, 0xB9, 0x09, 0xCC, 0xAD, 0x87, 0x33, 0x1A, 0xF5, 0x99, 0x06, 0xCE, 0x6B, 0x1B, 0x2A, - 0x04, 0xB4, 0x86, 0xEF, 0x35, 0xA1, 0x2D, 0xCC, 0x8E, 0xF7, 0x17, 0x27, 0x1F, 0x8C, 0xCD, 0xE7, - 0x54, 0xED, 0x19, 0x25, 0xDF, 0x0D, 0x41, 0xB5, 0xA1, 0xB1, 0x56, 0x2C, 0x41, 0x5C, 0xDC, 0xEC, - 0xD3, 0x78, 0x00, 0xEC, 0xA5, 0xB5, 0x85, 0xC8, 0xEE, 0xE3, 0xAA, 0x16, 0x8D, 0xCE, 0xD1, 0xEA, - 0x63, 0x21, 0x98, 0x59, 0x83, 0x0E, 0xC2, 0xD1, 0x18, 0x34, 0x26, 0x6D, 0x34, 0xE7, 0x80, 0x8C, - 0x86, 0xA3, 0x73, 0xDA, 0xA7, 0xFE, 0xD8, 0x06, 0xDF, 0xAC, 0xA4, 0x23, 0x99, 0x86, 0x46, 0x48, - 0x23, 0x37, 0x31, 0xDA, 0x30, 0x4C, 0xA2, 0x08, 0x46, 0xFF, 0x4C, 0xAE, 0x66, 0x65, 0xF2, 0x9F, - 0xF1, 0x18, 0x0B, 0x27, 0xE6, 0xAF, 0x68, 0x0D, 0xDF, 0x11, 0x60, 0xCF, 0x51, 0x7E, 0xBF, 0x7D, - 0x85, 0xDA, 0x13, 0xBA, 0x83, 0xC7, 0x0C, 0x2B, 0x38, 0x38, 0x6C, 0x7C, 0x83, 0x61, 0x80, 0x36, - 0xE3, 0x46, 0x9D, 0xD9, 0xC5, 0x28, 0x1A, 0xC6, 0xF1, 0x64, 0x31, 0x13, 0xCB, 0xD2, 0x95, 0xF0, - 0xD3, 0x18, 0x4D, 0xEB, 0x29, 0xDB, 0x2D, 0x9D, 0xB2, 0x57, 0x6C, 0x2C, 0x80, 0xAC, 0x07, 0x0B, - 0xEF, 0x24, 0x9E, 0x8A, 0x8A, 0x57, 0x6B, 0x88, 0x13, 0x71, 0x65, 0x5C, 0x92, 0xF5, 0xDA, 0x3A, - 0x2B, 0x64, 0xDB, 0xB6, 0x55, 0xFC, 0x17, 0x9C, 0x9C, 0x92, 0x8D, 0xBC, 0x0C, 0x3F, 0x5B, 0xA0, - 0x9F, 0x12, 0xFF, 0xDE, 0xB0, 0xAC, 0xFF, 0xDC, 0x4A, 0xFF, 0x14, 0xF8, 0x99, 0xB1, 0xDF, 0x82, - 0x39, 0xBD, 0x04, 0x78, 0x2A, 0x9C, 0x9F, 0x0B, 0x70, 0x7E, 0x7E, 0x42, 0x9C, 0x5F, 0x0A, 0x70, - 0x7E, 0x79, 0x2A, 0x9C, 0xF1, 0x38, 0x08, 0xEF, 0xCE, 0x28, 0x85, 0x13, 0xC9, 0xC4, 0xBA, 0x61, - 0xCE, 0xB6, 0xAF, 0xC4, 0x69, 0x9A, 0x1B, 0x3C, 0x54, 0xEE, 0x63, 0x68, 0x0D, 0xAB, 0x64, 0xAC, - 0xE9, 0xF2, 0x5A, 0x6D, 0x16, 0x42, 0x04, 0x90, 0x82, 0x65, 0xC7, 0x8A, 0x62, 0x85, 0xF5, 0x16, - 0xF5, 0xD7, 0x9B, 0xAB, 0x68, 0x77, 0x26, 0x6C, 0x31, 0xDF, 0xA9, 0xE3, 0xC5, 0x83, 0x75, 0xDD, - 0xC8, 0xAE, 0x25, 0xDA, 0xE3, 0x49, 0x7C, 0x33, 0xB3, 0xC6, 0x10, 0xE0, 0xD3, 0x0B, 0x8C, 0x62, - 0x14, 0x69, 0x8D, 0xF9, 0xD0, 0x5C, 0x8F, 0xF8, 0x46, 0xC2, 0x80, 0xAE, 0x5D, 0x67, 0xCD, 0x28, - 0x13, 0xD7, 0x23, 0xBE, 0x0B, 0xB6, 0x68, 0x53, 0xF9, 0xD2, 0x08, 0xD8, 0x5F, 0x7B, 0x93, 0x44, - 0xC4, 0x1D, 0xFA, 0x83, 0x60, 0xA7, 0x3E, 0xA4, 0xD7, 0x49, 0x7D, 0xD7, 0x30, 0x58, 0x59, 0x9A, - 0x78, 0xBB, 0xB8, 0x16, 0x29, 0x34, 0xE2, 0x18, 0xAE, 0x61, 0x41, 0xE5, 0xE6, 0xE9, 0xC8, 0x57, - 0x6F, 0xF5, 0x86, 0x2D, 0x90, 0x24, 0x79, 0x18, 0xD3, 0x1D, 0xBE, 0xCE, 0x5D, 0x85, 0xF7, 0x75, - 0xD8, 0x74, 0xED, 0xD4, 0x6D, 0xF4, 0xD4, 0x09, 0x5B, 0x4A, 0xEB, 0x08, 0xEC, 0xF8, 0xB0, 0x4E, - 0xFA, 0x50, 0x21, 0x86, 0x3F, 0xC3, 0x68, 0xB4, 0xCA, 0x5A, 0xAF, 0x72, 0x78, 0x92, 0x65, 0xF1, - 0x00, 0x3F, 0xD7, 0x77, 0xAB, 0xD2, 0xB4, 0x96, 0xCC, 0x28, 0xB5, 0x30, 0xDE, 0xD0, 0xD8, 0x32, - 0x30, 0x78, 0xC7, 0x85, 0xB4, 0xCF, 0xB6, 0x86, 0x7E, 0xDA, 0xFF, 0xF5, 0xD2, 0x02, 0x4C, 0xBA, - 0xEB, 0x13, 0xF2, 0xE3, 0x7B, 0xDB, 0x85, 0x55, 0xCE, 0xB9, 0x1D, 0xD2, 0xD4, 0x4D, 0x1A, 0x98, - 0x0F, 0xEE, 0x15, 0x1D, 0xE6, 0xB7, 0x7F, 0x05, 0x35, 0x0F, 0x85, 0x8D, 0x3D, 0x6F, 0x97, 0xDA, - 0xDA, 0x2F, 0x8D, 0xF3, 0x25, 0xF6, 0x47, 0x6A, 0x96, 0x9A, 0xDA, 0xE1, 0x98, 0xBD, 0x6E, 0x3D, - 0x64, 0xCB, 0x77, 0x98, 0xFC, 0x5E, 0x41, 0x6A, 0xFD, 0xB5, 0xF3, 0x0D, 0x6D, 0x12, 0xC8, 0x12, - 0xBC, 0x31, 0xBD, 0xEC, 0x38, 0x2F, 0x36, 0xA0, 0x06, 0xFE, 0x6E, 0x42, 0x42, 0xCC, 0xFA, 0xB5, - 0xE7, 0x9F, 0x76, 0x64, 0xE0, 0x56, 0x02, 0xD2, 0x99, 0x79, 0x62, 0x23, 0x02, 0xFF, 0xDA, 0xB6, - 0xB7, 0x91, 0x2F, 0x5E, 0x99, 0xE0, 0xDC, 0x44, 0x86, 0x78, 0x19, 0xFB, 0x4D, 0xAD, 0xB1, 0x3C, - 0x04, 0x6A, 0xB7, 0x51, 0xD6, 0x2F, 0xD9, 0x85, 0x87, 0xF4, 0xB9, 0xCB, 0xB8, 0x91, 0x71, 0xC2, - 0xCE, 0x02, 0x0B, 0xF3, 0x77, 0x76, 0xC8, 0x46, 0x61, 0xDF, 0xE7, 0x25, 0xC5, 0xFA, 0x79, 0x3D, - 0xA7, 0x70, 0xC3, 0x79, 0xD1, 0xBD, 0xEC, 0x54, 0xE4, 0x07, 0xB4, 0xA1, 0x23, 0x34, 0xFB, 0xB0, - 0xDB, 0x68, 0xE8, 0x46, 0x4C, 0x69, 0x30, 0x0B, 0xDB, 0xB2, 0x4F, 0xA9, 0x64, 0x22, 0xA0, 0x7A, - 0xB3, 0xFD, 0xF7, 0xD0, 0x0F, 0x1A, 0xF5, 0x7A, 0xD3, 0x10, 0x23, 0x2C, 0x37, 0xCC, 0x1C, 0xEA, - 0x07, 0x63, 0x84, 0x3D, 0xFF, 0x56, 0x51, 0x38, 0x83, 0x28, 0x9C, 0x8C, 0x49, 0x14, 0xDE, 0xE5, - 0xFA, 0x4A, 0x9E, 0xA2, 0xA8, 0xAE, 0x0C, 0x91, 0x30, 0x80, 0x0E, 0x59, 0x47, 0x00, 0x9E, 0x1D, - 0x40, 0x8A, 0xB0, 0x1F, 0x0E, 0x57, 0xE3, 0xD1, 0xEA, 0x06, 0xC1, 0x5F, 0xB6, 0xD8, 0xBF, 0x8C, - 0x06, 0xD6, 0xBC, 0xBE, 0xAB, 0x35, 0xE5, 0xDC, 0x81, 0xF6, 0xAF, 0xDF, 0xAC, 0xB1, 0x1A, 0xD3, - 0xE9, 0x90, 0x3A, 0xA7, 0xE0, 0xDA, 0xA8, 0xAB, 0x3A, 0x9A, 0xFB, 0x59, 0x68, 0x9A, 0x37, 0x0C, - 0x92, 0x28, 0x1C, 0xD6, 0xA7, 0x21, 0x29, 0x64, 0x13, 0xE1, 0xA7, 0x21, 0xB9, 0x8C, 0xA9, 0xB0, - 0x6A, 0x2C, 0x1C, 0x17, 0xC1, 0x3D, 0x8A, 0xA2, 0x30, 0x27, 0xD5, 0x0F, 0x86, 0x7E, 0x40, 0xF9, - 0x37, 0x58, 0x0E, 0xC6, 0xD3, 0x01, 0xAF, 0x01, 0x53, 0x76, 0xF9, 0xBF, 0xB5, 0xD9, 0xCE, 0xA9, - 0xA9, 0xBB, 0x46, 0x7C, 0x16, 0xF9, 0x61, 0xE4, 0x27, 0x0F, 0x05, 0x2A, 0x3D, 0xAF, 0x59, 0xA6, - 0xD5, 0xF3, 0x5A, 0x29, 0xB8, 0x42, 0xE5, 0x9E, 0x57, 0x15, 0x5A, 0x5B, 0xC5, 0x90, 0x4E, 0x8F, - 0xB6, 0xA1, 0xB8, 0x4D, 0x6A, 0xD2, 0x29, 0xA6, 0x82, 0xFC, 0xCA, 0xEE, 0x3B, 0xF5, 0x23, 0xB7, - 0xE2, 0x9E, 0x52, 0x65, 0xB2, 0x40, 0x13, 0x76, 0xF6, 0x55, 0xFB, 0x6F, 0x1D, 0x6F, 0x1B, 0x74, - 0x6D, 0xD6, 0x58, 0xC0, 0xCC, 0x30, 0x71, 0x6C, 0xDD, 0xC6, 0xB9, 0x43, 0x8A, 0x26, 0xCF, 0x94, - 0xFE, 0x2E, 0x6D, 0xFE, 0x58, 0xF0, 0x64, 0xA2, 0x6E, 0xEB, 0xB2, 0x34, 0x8B, 0x2C, 0x22, 0x53, - 0x99, 0xB9, 0x73, 0x8B, 0x3D, 0xEE, 0xB4, 0xFC, 0x60, 0x20, 0x79, 0xE9, 0xD8, 0xAC, 0x27, 0x66, - 0xAD, 0xD9, 0x76, 0x48, 0x41, 0xDE, 0xB0, 0xD8, 0x2C, 0x66, 0x56, 0x9A, 0xC3, 0xC2, 0xC0, 0x2E, - 0x15, 0xCA, 0x7B, 0x63, 0x56, 0x9A, 0xAD, 0x33, 0x61, 0xE2, 0xA6, 0x0D, 0x0B, 0xED, 0x25, 0x46, - 0x9D, 0x99, 0xBB, 0x22, 0xCC, 0x96, 0xC7, 0x20, 0x68, 0xB9, 0xA5, 0xD3, 0x7A, 0xA6, 0xB3, 0xD6, - 0x6C, 0xC7, 0x51, 0x7F, 0x1E, 0x3B, 0xA0, 0xE1, 0x36, 0x62, 0x35, 0xD7, 0xD9, 0x9C, 0x4B, 0x66, - 0x3D, 0x1C, 0x09, 0x5F, 0x48, 0xEB, 0xF1, 0x28, 0x73, 0x93, 0x9C, 0x0B, 0x68, 0x88, 0x16, 0xFF, - 0x02, 0xA8, 0xDC, 0xD3, 0xD2, 0x00, 0x2B, 0x5F, 0x92, 0xB0, 0xD3, 0x07, 0x81, 0x33, 0x0D, 0x8D, - 0xC9, 0x1A, 0x61, 0xB6, 0x6B, 0x72, 0x35, 0x49, 0x12, 0xE5, 0x42, 0xAA, 0xA2, 0xE3, 0x44, 0x12, - 0x3D, 0xD8, 0x76, 0x71, 0xC2, 0xDE, 0x20, 0x8C, 0x84, 0xB9, 0xFB, 0x81, 0xB2, 0xB9, 0x21, 0x7D, - 0x37, 0xE9, 0xDF, 0x90, 0x06, 0xC5, 0xE5, 0xCF, 0xBA, 0x19, 0x54, 0x1C, 0x57, 0x8E, 0xE3, 0x78, - 0x42, 0xC9, 0x9D, 0x0F, 0xBB, 0xC7, 0xE3, 0xC3, 0xD4, 0x87, 0xA5, 0x39, 0xD3, 0x45, 0xE0, 0x14, - 0x0F, 0x93, 0xAA, 0x9D, 0x49, 0x5D, 0x09, 0x9F, 0xB7, 0x37, 0xF2, 0x10, 0xEE, 0x0D, 0x87, 0x24, - 0xA2, 0x83, 0xC9, 0x10, 0xDD, 0x82, 0x98, 0x26, 0xE7, 0xC3, 0xE9, 0x06, 0x1E, 0xD7, 0xB8, 0xFA, - 0x48, 0xCE, 0xD4, 0x53, 0x06, 0xC1, 0xBA, 0x9C, 0x3F, 0xCF, 0x98, 0x3D, 0x5A, 0xBD, 0xAF, 0x7A, - 0xE9, 0x85, 0x2A, 0x5A, 0x68, 0xD1, 0xCF, 0x28, 0x5B, 0xF3, 0x99, 0xE1, 0x87, 0x9B, 0xAA, 0x0F, - 0x6E, 0xDC, 0x60, 0x40, 0xC5, 0xC1, 0x49, 0xB3, 0x33, 0xD5, 0xEB, 0xDB, 0x79, 0x7D, 0x66, 0xF2, - 0x17, 0xF6, 0xED, 0x93, 0x78, 0x60, 0xAB, 0x9A, 0x52, 0x71, 0x18, 0x06, 0xF5, 0x84, 0x4C, 0xB8, - 0x27, 0x0D, 0x88, 0x91, 0x0B, 0xCC, 0xBF, 0xA3, 0x68, 0x99, 0xA1, 0xFE, 0x2D, 0x08, 0xC4, 0x9D, - 0x1B, 0x4B, 0x2A, 0x03, 0xC6, 0xE3, 0x3A, 0x14, 0x8E, 0xE0, 0x20, 0x72, 0xAA, 0x23, 0x8E, 0xC2, - 0xB1, 0x12, 0x17, 0xD5, 0x7C, 0xA4, 0xDF, 0x86, 0x51, 0x9F, 0xC2, 0x18, 0x32, 0x97, 0x6B, 0x41, - 0x84, 0x34, 0xB8, 0xD8, 0x95, 0x11, 0x75, 0xE3, 0x49, 0xC4, 0x2A, 0xE0, 0x0E, 0xF5, 0xFD, 0x3F, - 0xA0, 0x33, 0x9E, 0x1F, 0x8F, 0x71, 0xA4, 0x98, 0x2F, 0x3B, 0x5E, 0xA9, 0x92, 0x83, 0x49, 0x9C, - 0x84, 0x23, 0xFE, 0x77, 0xBD, 0xCF, 0xD8, 0x54, 0x6F, 0xCA, 0x1A, 0x9B, 0xAB, 0xDA, 0x98, 0x1D, - 0x30, 0x7B, 0x93, 0xE8, 0x96, 0x3E, 0x1C, 0x07, 0x8B, 0x43, 0x7A, 0x8B, 0x5A, 0x69, 0x7E, 0x30, - 0x4C, 0xA9, 0xED, 0x33, 0x77, 0x09, 0xD9, 0xB5, 0x8F, 0xDB, 0xE3, 0x96, 0x0C, 0xF4, 0x1D, 0x0D, - 0xE7, 0x87, 0x49, 0x03, 0xB4, 0xD9, 0x7C, 0x08, 0x07, 0x03, 0x76, 0x1F, 0xBB, 0x18, 0x98, 0xD3, - 0x24, 0xF2, 0xC7, 0xA9, 0x47, 0xC5, 0x12, 0x40, 0xA5, 0xDE, 0x14, 0xF3, 0x82, 0x42, 0xC7, 0xC2, - 0xB3, 0x30, 0x4A, 0x70, 0x76, 0x05, 0xE8, 0x6C, 0xB0, 0x18, 0x4D, 0x47, 0xF7, 0xB0, 0x9E, 0x07, - 0xEE, 0xF0, 0x6C, 0xC2, 0xD4, 0xF0, 0xBC, 0xC0, 0xC6, 0x70, 0x90, 0x4E, 0xCE, 0x68, 0x74, 0x0D, - 0x9B, 0xC5, 0x83, 0xFC, 0x78, 0xD3, 0x0B, 0x27, 0x51, 0x7F, 0x01, 0xB0, 0x6C, 0x41, 0xE4, 0x3B, - 0x83, 0x79, 0x41, 0xB8, 0x41, 0x42, 0x83, 0xC0, 0x3D, 0xA7, 0xD7, 0x34, 0xA2, 0x41, 0x9F, 0x9E, - 0x21, 0xA5, 0x0B, 0x80, 0x9B, 0x24, 0xE1, 0xF1, 0xC9, 0xA7, 0x11, 0x1A, 0xDE, 0xF7, 0xD0, 0x88, - 0x3A, 0x5A, 0x82, 0x60, 0xEC, 0x9D, 0x9F, 0xCD, 0x25, 0xAD, 0x39, 0x2C, 0xAE, 0x8C, 0x70, 0x2A, - 0x62, 0xDC, 0x80, 0xB2, 0xC7, 0xE4, 0x45, 0xA9, 0xD1, 0xDA, 0x28, 0x4E, 0xFA, 0xE3, 0x7D, 0x5C, - 0xAF, 0xD4, 0x36, 0x9E, 0xE5, 0x63, 0x5A, 0x33, 0xF5, 0x0B, 0x52, 0x0A, 0xBD, 0x9B, 0xFE, 0xD8, - 0x5A, 0xC0, 0xD1, 0xC3, 0x0E, 0x0B, 0xB7, 0x43, 0x96, 0x92, 0x03, 0xF3, 0x30, 0x9C, 0xD5, 0x7A, - 0xD4, 0xC3, 0x61, 0x98, 0x97, 0x12, 0xAC, 0x5A, 0xA9, 0xEA, 0x16, 0x8B, 0x64, 0x9C, 0x3C, 0xC0, - 0xCA, 0x84, 0x8C, 0x1B, 0xB2, 0xC8, 0xA3, 0x5A, 0x10, 0x06, 0xB4, 0x66, 0x04, 0xD3, 0x30, 0xC7, - 0xAA, 0x0A, 0xAD, 0xAF, 0x86, 0x61, 0xFF, 0x7B, 0xD6, 0x1C, 0x36, 0x69, 0x11, 0xC5, 0x45, 0xE1, - 0xA0, 0xF7, 0x33, 0x09, 0xF9, 0x92, 0x23, 0x1C, 0x8A, 0x98, 0x97, 0xAF, 0x8C, 0x40, 0x84, 0x2D, - 0xE4, 0x81, 0x44, 0x3C, 0x98, 0x81, 0x55, 0xC6, 0xE6, 0x8A, 0x29, 0x75, 0x6D, 0xED, 0x38, 0xDF, - 0x2E, 0xE4, 0xD5, 0xFB, 0xC3, 0x58, 0x44, 0xF5, 0x60, 0x8C, 0x42, 0xE6, 0x7E, 0xFA, 0x7F, 0x27, - 0xB0, 0xEF, 0xE6, 0x81, 0x2B, 0x61, 0x04, 0x7B, 0x8E, 0x46, 0xAD, 0x2D, 0x1F, 0x0E, 0x5B, 0x84, - 0xFF, 0xE9, 0x45, 0xE1, 0xD8, 0x0B, 0xEF, 0x82, 0x5A, 0x99, 0x97, 0xB3, 0x84, 0x42, 0x18, 0x01, - 0xE1, 0xFB, 0xCA, 0x8A, 0xB2, 0x22, 0x4A, 0x54, 0xC3, 0xA9, 0x4F, 0x6A, 0xF1, 0xF5, 0xFE, 0x5B, - 0x5B, 0x38, 0x2C, 0xB3, 0x93, 0xA4, 0x5A, 0xC2, 0xF7, 0x2B, 0xAC, 0x30, 0x1F, 0xC4, 0xB4, 0xBF, - 0xD2, 0x6E, 0xB7, 0x65, 0xDB, 0xEC, 0x66, 0x76, 0x3E, 0xDC, 0x09, 0x90, 0x11, 0x37, 0xD0, 0xB3, - 0x3F, 0x44, 0x85, 0x59, 0x79, 0x93, 0x9B, 0xFC, 0x5F, 0x07, 0x61, 0xD2, 0x68, 0xEB, 0x76, 0xFF, - 0x66, 0xCA, 0x36, 0x46, 0x8C, 0xB4, 0x8D, 0x79, 0x66, 0xAE, 0xA5, 0xFB, 0x59, 0x2B, 0xDF, 0x6C, - 0xB4, 0xC8, 0xB7, 0x5D, 0xD5, 0x68, 0x51, 0xAE, 0xCF, 0x00, 0x11, 0x3A, 0x2C, 0xD7, 0x5B, 0x75, - 0xF8, 0x57, 0x82, 0x05, 0xB4, 0xCC, 0x4C, 0x43, 0x76, 0x1D, 0x36, 0x1B, 0x1D, 0xD9, 0x3D, 0x9B, - 0x8D, 0x96, 0xB4, 0xB0, 0x90, 0x1E, 0x6D, 0x37, 0x1A, 0xC0, 0xCE, 0x61, 0xC0, 0xF7, 0xB4, 0x39, - 0x36, 0x33, 0x46, 0x0F, 0xE7, 0x67, 0x43, 0xAD, 0xC0, 0xAB, 0x68, 0xF1, 0x46, 0xD0, 0xC7, 0x3C, - 0x24, 0xA9, 0x91, 0x16, 0xB6, 0x48, 0xD7, 0x71, 0x9C, 0xA6, 0x55, 0xAD, 0x30, 0xB3, 0x21, 0x68, - 0x93, 0x16, 0x61, 0xBB, 0x71, 0x34, 0x96, 0xA8, 0x6A, 0x06, 0x7B, 0xC8, 0x6D, 0x8B, 0xDA, 0xEE, - 0x16, 0xAF, 0x41, 0x59, 0xC1, 0x6B, 0x82, 0x0C, 0xC8, 0x9A, 0x1B, 0x68, 0xFA, 0x43, 0xEA, 0x46, - 0x29, 0x9E, 0x8A, 0xC0, 0xEB, 0x56, 0x62, 0x7B, 0x93, 0x7E, 0x1F, 0x76, 0xE5, 0x8C, 0x5C, 0x39, - 0xC4, 0x22, 0x83, 0x25, 0x2A, 0xD8, 0x48, 0x15, 0x45, 0x9C, 0x58, 0x68, 0xCC, 0x11, 0xA8, 0x44, - 0xE6, 0xF0, 0x2B, 0x83, 0xB6, 0x13, 0x0A, 0x87, 0x81, 0x94, 0x48, 0xC1, 0xD8, 0x74, 0x67, 0x9E, - 0x07, 0x78, 0x5E, 0x8B, 0x03, 0x10, 0x1E, 0x26, 0x99, 0xFB, 0x8B, 0x2C, 0x7A, 0x96, 0xB3, 0x55, - 0x7A, 0x82, 0x44, 0xFB, 0x1A, 0x2E, 0x86, 0xED, 0x88, 0xA9, 0x9C, 0x86, 0xB0, 0xFF, 0x66, 0xF4, - 0x6D, 0x4F, 0x69, 0x86, 0xEE, 0x91, 0x8A, 0xCD, 0xB8, 0xC0, 0xE2, 0xC2, 0x0F, 0x69, 0xFF, 0xD4, - 0xCE, 0x53, 0xFA, 0x41, 0x70, 0x76, 0x42, 0x4D, 0xA4, 0xD3, 0xC8, 0xB4, 0x75, 0x6D, 0x2A, 0xA1, - 0x16, 0x6F, 0x05, 0x26, 0x07, 0xF6, 0xE1, 0x17, 0x83, 0x96, 0xCF, 0x06, 0x59, 0xBC, 0xE4, 0x11, - 0xAD, 0x09, 0x91, 0x17, 0x41, 0x3B, 0xB9, 0xE7, 0x92, 0x21, 0x4C, 0x92, 0x0C, 0xE8, 0x0B, 0xB7, - 0x5D, 0x82, 0x58, 0xD0, 0x28, 0x42, 0x67, 0xCE, 0x11, 0x22, 0xC4, 0x53, 0x86, 0x8A, 0xBA, 0x56, - 0x9C, 0x4A, 0x7F, 0xC6, 0xD5, 0x4A, 0x96, 0x53, 0x56, 0x28, 0x34, 0x73, 0x5A, 0xD8, 0xC2, 0x38, - 0xC0, 0xEE, 0xE6, 0x26, 0x50, 0xCD, 0xDC, 0x90, 0xAF, 0x28, 0xFC, 0x2F, 0xB9, 0xA3, 0x34, 0x20, - 0x0E, 0x3B, 0xE5, 0x43, 0x59, 0x0D, 0x0A, 0xFB, 0xE1, 0x70, 0xE8, 0x8E, 0x63, 0xFA, 0xEE, 0xB4, - 0xD7, 0xE3, 0xAE, 0xDB, 0xEC, 0x30, 0x6B, 0x4E, 0x64, 0x51, 0xAF, 0xC7, 0xB7, 0x3D, 0xA0, 0x5F, - 0xFA, 0xDC, 0xC5, 0xB6, 0xEF, 0x46, 0x54, 0x51, 0x1B, 0xA2, 0xC4, 0x26, 0x04, 0xC8, 0xCC, 0x6C, - 0x24, 0xA1, 0x2A, 0x6F, 0x6B, 0x93, 0x16, 0x50, 0x95, 0xAB, 0xAC, 0x74, 0x15, 0xF7, 0x05, 0xB3, - 0xB6, 0x99, 0x8C, 0x4B, 0x5B, 0x70, 0xF1, 0xB2, 0xA0, 0x50, 0xBB, 0x0C, 0xBB, 0x02, 0x1F, 0x37, - 0x7B, 0x6F, 0x7D, 0x3A, 0xF4, 0xE2, 0x86, 0x14, 0xD4, 0x75, 0x20, 0x98, 0x21, 0xB6, 0x55, 0x7D, - 0xC9, 0x17, 0x5B, 0xE7, 0x53, 0xC6, 0x60, 0x61, 0x2A, 0x10, 0xEE, 0xF1, 0xC0, 0xF9, 0xD4, 0xE0, - 0x80, 0x24, 0x64, 0x1B, 0x9F, 0xC2, 0xE6, 0xF9, 0xF8, 0x60, 0xDB, 0x41, 0x10, 0xC7, 0x33, 0x37, - 0xC4, 0x81, 0x15, 0x6D, 0xE1, 0xD7, 0x8A, 0xCD, 0xF7, 0xF3, 0x48, 0x03, 0x68, 0xCB, 0xE2, 0x0E, - 0xAA, 0x35, 0xEC, 0xC9, 0xD1, 0x07, 0xD0, 0x54, 0x44, 0x23, 0x54, 0x6B, 0x7C, 0x76, 0x26, 0xF1, - 0x49, 0x3E, 0xA5, 0x55, 0x6C, 0x0E, 0x47, 0xCD, 0x58, 0x86, 0x80, 0x7F, 0x56, 0x6B, 0xCA, 0x3C, - 0x19, 0xF3, 0xA6, 0x6C, 0x8B, 0x55, 0xB5, 0xC7, 0x0F, 0x71, 0x42, 0x47, 0x52, 0x8F, 0xF9, 0xDF, - 0xD5, 0x1A, 0x1F, 0xA9, 0x21, 0x16, 0xD0, 0x3C, 0x0B, 0xBA, 0xA8, 0x06, 0xE0, 0xF4, 0x42, 0xE2, - 0x19, 0xC6, 0x61, 0x54, 0x6B, 0x66, 0x39, 0xC9, 0xE4, 0x60, 0xA4, 0x3B, 0xBF, 0x1C, 0x9C, 0x58, - 0x0B, 0x4C, 0x65, 0xC5, 0xE7, 0x86, 0x90, 0x73, 0xC2, 0xA1, 0x98, 0x0A, 0x8A, 0x7B, 0xD8, 0xE7, - 0x0E, 0xA9, 0x68, 0x8C, 0x6F, 0x61, 0xE4, 0xF1, 0xC6, 0x2B, 0x49, 0x57, 0x75, 0x30, 0xE2, 0x61, - 0xE3, 0x15, 0xB4, 0x74, 0x23, 0xB7, 0x0F, 0xA7, 0xFD, 0x58, 0x56, 0x56, 0xEA, 0x5C, 0x6A, 0x4A, - 0xD8, 0x51, 0xDA, 0x0B, 0x51, 0x73, 0xDD, 0x68, 0x31, 0x77, 0xB5, 0x30, 0x30, 0xD4, 0x71, 0x3A, - 0xDD, 0x16, 0x0B, 0x6F, 0x35, 0x35, 0x26, 0x2F, 0x65, 0x7A, 0xB3, 0xE3, 0xB0, 0x06, 0xB6, 0x89, - 0x99, 0x31, 0x1B, 0x71, 0x1E, 0x60, 0xFC, 0x36, 0x85, 0x3A, 0x8C, 0x7D, 0x8D, 0x9C, 0x48, 0x1B, - 0x45, 0x7E, 0x00, 0x1F, 0x6E, 0x6B, 0x4C, 0x69, 0xBF, 0x72, 0x0A, 0x75, 0xF6, 0x2B, 0xA7, 0x0A, - 0x66, 0x03, 0xF6, 0xC1, 0xE9, 0xC7, 0xC5, 0x40, 0xE7, 0xBB, 0x96, 0x22, 0x13, 0x93, 0x38, 0x0B, - 0x28, 0xFB, 0x18, 0xDB, 0xA8, 0x07, 0x79, 0xAB, 0xCB, 0x03, 0x17, 0x18, 0x14, 0xBD, 0x0F, 0xE3, - 0x44, 0x08, 0xC0, 0xA6, 0x21, 0x00, 0x9B, 0x05, 0x02, 0x60, 0xE9, 0x7A, 0x41, 0xF7, 0x4D, 0x84, - 0xA8, 0x1C, 0x38, 0xC2, 0x57, 0xF8, 0xA3, 0xE3, 0x64, 0x1F, 0x67, 0xC4, 0x65, 0xEB, 0x1D, 0x8B, - 0x66, 0xE5, 0x76, 0x1B, 0x86, 0x6C, 0xDD, 0xD1, 0x31, 0xAD, 0x3B, 0xF3, 0xF7, 0x8E, 0x77, 0xE5, - 0x53, 0x4C, 0x23, 0x5B, 0x17, 0xF1, 0x3B, 0xD3, 0x5E, 0xC9, 0xF7, 0xEE, 0x20, 0x6C, 0xF7, 0xC3, - 0x11, 0xFE, 0x85, 0x5F, 0xC9, 0x08, 0x29, 0x98, 0xC0, 0xD2, 0x05, 0xDA, 0xC5, 0x87, 0x3D, 0xC7, - 0xC8, 0xF5, 0x87, 0x04, 0x16, 0xC4, 0x08, 0xF6, 0x16, 0x4F, 0x42, 0xC3, 0xDD, 0xDD, 0x5D, 0x7B, - 0xB9, 0x74, 0x14, 0xEC, 0x46, 0xF9, 0x51, 0x83, 0x93, 0x56, 0x22, 0x68, 0x32, 0x53, 0x94, 0x9E, - 0x4D, 0x69, 0x2E, 0xC4, 0xA6, 0xDB, 0x71, 0x3A, 0xD5, 0x9A, 0x29, 0x02, 0x50, 0xBB, 0x1A, 0x7A, - 0xD1, 0x65, 0x6F, 0xEC, 0x46, 0xDF, 0xDF, 0x4E, 0x82, 0x4E, 0x6D, 0x56, 0x10, 0x67, 0xBF, 0xCC, - 0x44, 0x6C, 0xCA, 0x7C, 0x0C, 0x2F, 0xFB, 0x5F, 0xF8, 0xCF, 0xCC, 0xDD, 0x45, 0x08, 0x80, 0x14, - 0x60, 0xD4, 0x74, 0xF3, 0x9F, 0x5C, 0xF9, 0x22, 0x72, 0x83, 0x78, 0xE4, 0x27, 0xEF, 0xDE, 0xED, - 0xD5, 0x0A, 0xAE, 0xEB, 0x0C, 0x53, 0x0A, 0x6E, 0x9A, 0x3E, 0xED, 0xFF, 0x9A, 0xBA, 0xA6, 0xE8, - 0xA6, 0xA4, 0xC9, 0xD5, 0xBD, 0xD8, 0xE8, 0x96, 0x9B, 0x4B, 0xEA, 0x3C, 0x0C, 0xC1, 0xF7, 0xFE, - 0xCF, 0x0E, 0x7A, 0x41, 0x7D, 0xE3, 0x0E, 0x51, 0x23, 0x76, 0x20, 0x40, 0x14, 0xBE, 0x17, 0x13, - 0x38, 0xB6, 0x47, 0xCC, 0xE6, 0xC5, 0x6E, 0x90, 0xB0, 0x5A, 0xB1, 0x65, 0x40, 0xC2, 0x5B, 0x68, - 0x15, 0x30, 0x3D, 0x16, 0xA5, 0x56, 0xDC, 0x5A, 0xA2, 0x4F, 0x16, 0x65, 0xD3, 0x2E, 0xB5, 0x6D, - 0x96, 0xB1, 0x47, 0x5A, 0x78, 0xC9, 0x98, 0x2F, 0xCB, 0x7E, 0x66, 0x4E, 0xE2, 0xAB, 0x8B, 0xBE, - 0x6C, 0xFB, 0x54, 0x5E, 0x64, 0xD6, 0xD6, 0x98, 0xD7, 0x99, 0xBC, 0x12, 0xA6, 0xEA, 0xDB, 0x72, - 0x45, 0x33, 0x4D, 0x7B, 0x0B, 0x5D, 0x1A, 0x5E, 0x81, 0x50, 0xDC, 0xB2, 0x05, 0x0D, 0xF6, 0x11, - 0x61, 0xE0, 0xE1, 0x4C, 0xDD, 0x72, 0xF0, 0xFF, 0xB6, 0x85, 0x65, 0xCB, 0x41, 0x2D, 0x07, 0x65, - 0xF2, 0x7C, 0xDE, 0xB7, 0x47, 0xAE, 0x96, 0x63, 0x3B, 0x0B, 0x63, 0x1F, 0xFF, 0xBB, 0xD7, 0xEF, - 0x4F, 0x40, 0x5F, 0x3E, 0x70, 0x8D, 0xBA, 0xD9, 0xEE, 0x58, 0xB0, 0x76, 0xDA, 0x0C, 0xED, 0x66, - 0xBB, 0x0C, 0x6D, 0xD1, 0x3C, 0x60, 0x17, 0x3B, 0x47, 0x2C, 0x0A, 0xA0, 0xA5, 0xA4, 0xFC, 0x29, - 0x9E, 0x3A, 0x59, 0x93, 0xCF, 0xD8, 0x44, 0x4A, 0x05, 0x54, 0xA1, 0xC9, 0x17, 0x68, 0x22, 0xA5, - 0x08, 0x9A, 0xD2, 0xE2, 0x83, 0x9B, 0xA0, 0x8D, 0x85, 0xB5, 0x69, 0x3B, 0xAF, 0x9C, 0xEE, 0xAB, - 0x8D, 0x17, 0xAF, 0xA6, 0xB5, 0x09, 0x83, 0x81, 0x68, 0xC4, 0x53, 0x1E, 0xBD, 0xDC, 0x74, 0x36, - 0x5F, 0x6C, 0x75, 0xA6, 0x34, 0xDB, 0x1B, 0x26, 0x7E, 0x32, 0xF1, 0xD8, 0xCE, 0x6C, 0x73, 0x0B, - 0xB0, 0xBD, 0x2C, 0x41, 0x24, 0x2E, 0x2B, 0xDE, 0x53, 0x7F, 0x70, 0x83, 0x88, 0x9C, 0xA9, 0x55, - 0xB5, 0x7B, 0x0D, 0xA9, 0x49, 0x25, 0xDD, 0x5E, 0x20, 0x87, 0xC5, 0x68, 0xCB, 0x45, 0x09, 0x44, - 0x45, 0x95, 0x89, 0x74, 0xA6, 0x94, 0xDF, 0x1D, 0xDA, 0x26, 0xCD, 0xBC, 0x23, 0xB7, 0xC0, 0xE8, - 0xCD, 0x37, 0x82, 0x33, 0x8E, 0xE2, 0x8C, 0x23, 0x69, 0x71, 0x8E, 0x52, 0xE7, 0xB6, 0x3A, 0xCF, - 0x5E, 0x38, 0xEC, 0xA7, 0x45, 0xB2, 0x5F, 0xB2, 0x59, 0x9D, 0x96, 0xE1, 0x94, 0x16, 0xBF, 0x56, - 0xD0, 0x26, 0xD3, 0xB0, 0x7E, 0xFE, 0x4D, 0xB0, 0x7E, 0x79, 0x12, 0xAC, 0x8F, 0xE5, 0x8E, 0x1A, - 0x73, 0xE8, 0xB7, 0x39, 0x75, 0xDC, 0x6C, 0x7A, 0xCE, 0xC2, 0xB6, 0xFC, 0xBA, 0x0D, 0x96, 0xAF, - 0x9F, 0x69, 0x84, 0x41, 0xF0, 0xF0, 0x6D, 0x8D, 0xB9, 0x24, 0xE5, 0xEE, 0x86, 0xD5, 0x18, 0x2E, - 0xC9, 0xFF, 0x6A, 0xA7, 0xE3, 0xAC, 0x6F, 0xB4, 0xC8, 0xCB, 0x97, 0xCA, 0x11, 0x93, 0x7F, 0x46, - 0x66, 0x63, 0x41, 0xA5, 0xC5, 0xA2, 0x00, 0xA1, 0x3E, 0x75, 0x56, 0x31, 0x83, 0x9C, 0xD3, 0x22, - 0xE2, 0x3F, 0x12, 0xC6, 0x4D, 0x31, 0xBC, 0xEC, 0x97, 0xF9, 0x45, 0xAA, 0x68, 0xF2, 0xAD, 0x76, - 0x1D, 0x98, 0xE9, 0xCC, 0xE4, 0xDF, 0x56, 0x10, 0xB3, 0x0F, 0x88, 0x98, 0xFD, 0x52, 0x5D, 0xAA, - 0x1E, 0x4B, 0xCE, 0x7E, 0x99, 0x4F, 0x40, 0xB6, 0xEB, 0xB3, 0xD8, 0xB2, 0x0B, 0x4F, 0x49, 0xBC, - 0xB5, 0x71, 0x06, 0x9C, 0xE1, 0x94, 0x54, 0x7D, 0x27, 0x61, 0x22, 0x9C, 0xF5, 0x0C, 0x58, 0x01, - 0x97, 0xAD, 0x77, 0x0B, 0x9C, 0x01, 0x17, 0xC6, 0xC8, 0x36, 0xEF, 0x0B, 0xE3, 0xAC, 0x7E, 0xD6, - 0xB2, 0x0D, 0xE8, 0x0C, 0x67, 0x2D, 0xDB, 0xF0, 0x54, 0x38, 0x6B, 0x29, 0xCD, 0xD2, 0x53, 0x4F, - 0x6D, 0xD6, 0x46, 0x96, 0x83, 0x4E, 0x71, 0x33, 0xCB, 0xB9, 0xCE, 0xBB, 0x0B, 0x92, 0xBB, 0xA0, - 0x3B, 0x33, 0x00, 0x8E, 0xF7, 0x97, 0xF3, 0xCD, 0xBB, 0xF3, 0x70, 0xE3, 0x7D, 0x4D, 0x39, 0x12, - 0x64, 0xF6, 0x34, 0xC9, 0xFC, 0x69, 0xEC, 0xE7, 0x0B, 0x93, 0xFB, 0x7C, 0x58, 0xDD, 0x77, 0x03, - 0x4F, 0xF5, 0x50, 0x4C, 0xE7, 0xF0, 0x34, 0xB7, 0x97, 0xB2, 0xF9, 0xCC, 0x0F, 0x41, 0xDC, 0xBB, - 0x4F, 0x87, 0x75, 0xC8, 0x92, 0x13, 0x08, 0xDB, 0xDC, 0x45, 0xF8, 0x9D, 0xE2, 0xD1, 0x82, 0x55, - 0xDE, 0xB6, 0x06, 0x7A, 0x4E, 0x68, 0x16, 0x49, 0x65, 0x8D, 0xF8, 0xB4, 0x5A, 0x0D, 0xCB, 0xF1, - 0x81, 0xB8, 0x6F, 0xF1, 0xFF, 0x67, 0x22, 0xBF, 0xBE, 0x55, 0x64, 0x44, 0x3C, 0x5B, 0x74, 0x35, - 0x9D, 0x4A, 0x4C, 0xAD, 0x66, 0xB9, 0xEA, 0x62, 0xDE, 0x38, 0x7F, 0xA5, 0x0F, 0xE7, 0x34, 0xA0, - 0x77, 0xEE, 0xB0, 0x56, 0xE2, 0xE5, 0xFA, 0x68, 0x1C, 0x11, 0x31, 0xCD, 0xCD, 0x54, 0xD3, 0xEA, - 0x9D, 0x7F, 0xED, 0x9F, 0xC2, 0x71, 0x28, 0x8C, 0xBE, 0x3B, 0xBD, 0xDE, 0xF1, 0x21, 0x37, 0xFE, - 0x6D, 0xCA, 0x8A, 0x80, 0x9F, 0x91, 0x8A, 0x14, 0x01, 0x62, 0x29, 0xB1, 0x2C, 0xDA, 0xF0, 0x9C, - 0xB9, 0x71, 0x0C, 0xBF, 0x78, 0xCF, 0x80, 0xAB, 0xF3, 0x4C, 0x7D, 0xEA, 0x3C, 0x63, 0x9F, 0xBA, - 0xCF, 0xD4, 0xA7, 0xEE, 0x33, 0xF6, 0x69, 0xFD, 0x99, 0xFA, 0xB4, 0xBE, 0xCC, 0x3E, 0xA9, 0x1B, - 0x9D, 0xB3, 0xDB, 0x44, 0x37, 0x71, 0x63, 0xFA, 0x14, 0xA5, 0x82, 0xBE, 0x0F, 0x9A, 0xBA, 0xFF, - 0x19, 0xA7, 0x6D, 0xF2, 0x5D, 0xC8, 0xD6, 0xE6, 0xE6, 0xBA, 0x61, 0xFD, 0x66, 0x1F, 0xA7, 0x90, - 0xFB, 0x58, 0x40, 0xF5, 0x27, 0x6F, 0x3C, 0x0F, 0x5D, 0x59, 0xB3, 0xE5, 0x91, 0xC6, 0xCD, 0x55, - 0x22, 0x08, 0xFA, 0x64, 0x92, 0xD0, 0x7B, 0x93, 0xB9, 0x78, 0xDB, 0xA5, 0xB1, 0x13, 0x3E, 0x5D, - 0x1C, 0x9C, 0x11, 0x5E, 0x81, 0xDD, 0x50, 0xF0, 0x02, 0xD2, 0x77, 0x03, 0x12, 0x84, 0x8C, 0x14, - 0xDE, 0xC6, 0x23, 0x6E, 0x82, 0x56, 0x64, 0x12, 0xA3, 0x45, 0x2E, 0xF1, 0xD9, 0x7D, 0x52, 0x11, - 0x61, 0xA9, 0x1E, 0xE5, 0x77, 0x75, 0x56, 0xFB, 0x98, 0xEE, 0x88, 0x5B, 0xD1, 0x38, 0x36, 0x72, - 0xEF, 0xA1, 0x0D, 0xBA, 0xDF, 0x5C, 0x8E, 0xFC, 0x00, 0xFA, 0x19, 0x73, 0xFE, 0xC1, 0xB9, 0xBD, - 0xD3, 0x75, 0x8C, 0x4D, 0x58, 0xA7, 0x05, 0xDF, 0x5B, 0x5D, 0xF5, 0x14, 0xA0, 0xDC, 0x20, 0x4E, - 0xD9, 0xD4, 0x72, 0x7C, 0x1F, 0xD8, 0x02, 0xBA, 0x64, 0x8C, 0x95, 0x36, 0x7D, 0xD6, 0xFE, 0x6E, - 0x39, 0xE4, 0x2F, 0xA4, 0x5B, 0x62, 0xC8, 0x2A, 0xA0, 0x5A, 0x6B, 0x57, 0x70, 0xEC, 0x50, 0x3C, - 0x4E, 0x2B, 0x0E, 0x4B, 0xDE, 0xE6, 0x18, 0x0E, 0x4D, 0x11, 0x6C, 0x3B, 0x84, 0x58, 0x9B, 0x0C, - 0xDA, 0x5A, 0x16, 0x6B, 0xEC, 0x38, 0x1D, 0x8B, 0xC5, 0x37, 0xBD, 0xF5, 0x2D, 0xDD, 0xD1, 0x65, - 0xC7, 0x3C, 0xD2, 0xE3, 0x5E, 0x68, 0xEA, 0xB6, 0x6E, 0x6D, 0x2D, 0xE3, 0x92, 0x80, 0x76, 0xF8, - 0xFE, 0xE0, 0x4C, 0xDD, 0xC7, 0xA9, 0xEE, 0x47, 0x3A, 0xAB, 0x8E, 0xCF, 0xF6, 0xF8, 0xC5, 0x4B, - 0x0E, 0xE2, 0xF8, 0xAC, 0x26, 0xB1, 0x27, 0x08, 0x82, 0xB6, 0xF4, 0x7F, 0x99, 0x4B, 0x47, 0xC5, - 0xA9, 0x01, 0xA7, 0xA0, 0x38, 0x3C, 0xED, 0x3D, 0x39, 0x8E, 0x77, 0x3C, 0xF1, 0xFD, 0x93, 0xE3, - 0xE9, 0x4D, 0xAE, 0xE0, 0xDF, 0xE5, 0xA2, 0x11, 0x02, 0x9C, 0xA2, 0x78, 0x9F, 0x24, 0x63, 0xA1, - 0x95, 0x1D, 0x53, 0x2B, 0x3B, 0x56, 0xAD, 0x3C, 0x1F, 0xA6, 0xD3, 0xA5, 0x22, 0x52, 0xA7, 0xF0, - 0x45, 0x5F, 0xDC, 0x1C, 0xA5, 0x2D, 0xCA, 0x0C, 0xA9, 0x96, 0x35, 0x2A, 0xA5, 0x11, 0xE0, 0xCC, - 0xBA, 0x44, 0x1D, 0x95, 0x27, 0xB1, 0xB4, 0x61, 0xC3, 0x47, 0x1F, 0xDE, 0x86, 0x11, 0x2C, 0x44, - 0xD9, 0x42, 0x35, 0xDB, 0x06, 0xA3, 0x04, 0xA7, 0x92, 0x76, 0x50, 0xF9, 0x43, 0x57, 0x2E, 0x6B, - 0x6B, 0xA6, 0x8A, 0x51, 0xE7, 0x69, 0xE7, 0x55, 0xB7, 0xDD, 0xD9, 0x7A, 0xD9, 0x76, 0xDA, 0x9D, - 0xEE, 0xBA, 0x82, 0xA5, 0xAC, 0xAD, 0x98, 0x80, 0x69, 0xE3, 0x8D, 0x76, 0x07, 0x14, 0x60, 0xD5, - 0xC6, 0xD2, 0xCC, 0x92, 0xB0, 0x57, 0x6E, 0x9E, 0x4F, 0x98, 0xEE, 0xE6, 0x66, 0x3B, 0xFD, 0x7F, - 0x75, 0xF4, 0xD2, 0x6C, 0x78, 0xE9, 0x54, 0x6D, 0x94, 0x0B, 0x36, 0xB0, 0x49, 0x6D, 0x64, 0x9E, - 0xB4, 0x4E, 0x2F, 0xCE, 0x16, 0xD1, 0xCA, 0x56, 0x33, 0x14, 0xA0, 0x1F, 0x0E, 0x8F, 0xEE, 0xC7, - 0x61, 0xC0, 0x85, 0x69, 0x1D, 0x28, 0x79, 0x21, 0x9F, 0x55, 0xD9, 0x3A, 0xFD, 0x42, 0x96, 0xA0, - 0xDC, 0xAD, 0x67, 0xAA, 0x91, 0x6B, 0x0C, 0xD4, 0xF5, 0x7D, 0x16, 0x3B, 0xDC, 0x22, 0xAB, 0x68, - 0xF7, 0x51, 0x6C, 0x80, 0xEB, 0x4C, 0x54, 0x9D, 0x79, 0x81, 0x9F, 0x87, 0x21, 0x1C, 0x72, 0x87, - 0x6C, 0xC8, 0xD1, 0xB6, 0xE9, 0x18, 0xF6, 0x6B, 0x6E, 0xD9, 0x74, 0x5A, 0xF8, 0x55, 0x33, 0x6F, - 0xCE, 0x8C, 0xC8, 0x8F, 0xC7, 0x22, 0x0C, 0xFA, 0x49, 0xB0, 0xE5, 0xA6, 0xB3, 0x71, 0x36, 0x8E, - 0xC7, 0x9E, 0x70, 0x43, 0x31, 0xBC, 0x50, 0xD8, 0xE4, 0x8E, 0xCB, 0x31, 0x3C, 0xCA, 0x16, 0x9B, - 0x28, 0x29, 0xD9, 0x59, 0xEA, 0xC1, 0x4B, 0x15, 0x37, 0x32, 0x54, 0x6E, 0x86, 0xDB, 0xAE, 0x7D, - 0x7E, 0xE1, 0xC9, 0xFE, 0xBE, 0x9C, 0xC4, 0xD9, 0xB6, 0x46, 0x67, 0x94, 0xD8, 0xDB, 0xD8, 0x18, - 0x25, 0xFB, 0xC9, 0x4D, 0x5B, 0x1C, 0x64, 0xF4, 0x62, 0xFF, 0xB6, 0x3C, 0xA4, 0x8F, 0x72, 0xE6, - 0x7E, 0x7B, 0x26, 0x42, 0xC3, 0x21, 0x16, 0x23, 0x8A, 0x44, 0x25, 0x39, 0x74, 0x45, 0xF5, 0xD9, - 0x54, 0x9C, 0x97, 0x64, 0x9F, 0xB5, 0x1D, 0xA2, 0x26, 0xC8, 0xCD, 0xFD, 0xE1, 0xEB, 0xB1, 0x7B, - 0x4B, 0xF7, 0x93, 0xA0, 0x0E, 0x34, 0x9F, 0x81, 0x1E, 0x01, 0x65, 0xCC, 0xD4, 0x09, 0x73, 0xFB, - 0x95, 0x40, 0x60, 0xEA, 0x74, 0xF6, 0xA7, 0x69, 0xF6, 0x4B, 0x7D, 0xC9, 0x33, 0x50, 0x72, 0x8D, - 0xA7, 0x4D, 0xA0, 0x28, 0x6F, 0x50, 0xB5, 0x3E, 0xEF, 0x2E, 0xAF, 0xCB, 0xF1, 0x0F, 0xDB, 0xE7, - 0x7F, 0x6A, 0x21, 0x7E, 0x15, 0xA2, 0x7A, 0xF1, 0x05, 0x26, 0xD0, 0x06, 0x6D, 0x22, 0xBA, 0x7E, - 0xE7, 0xFA, 0x49, 0xBB, 0xDD, 0xAE, 0xAB, 0x7E, 0x02, 0x76, 0xA9, 0xB4, 0xBB, 0xA7, 0xA4, 0xBE, - 0x29, 0x66, 0x6F, 0x5F, 0xA7, 0x3D, 0xC8, 0x2D, 0xA3, 0x72, 0xCC, 0x49, 0x1A, 0x89, 0x65, 0x9C, - 0x9F, 0xD4, 0x61, 0x92, 0xCB, 0xE5, 0xD8, 0x08, 0x79, 0x1C, 0x7B, 0xEE, 0x2D, 0x76, 0xAA, 0xDD, - 0xD6, 0xEE, 0xB0, 0xB4, 0xC0, 0x92, 0x5A, 0x1E, 0xC5, 0xDC, 0x2A, 0x1B, 0x83, 0x96, 0x06, 0x06, - 0x99, 0x5B, 0xE0, 0x8E, 0xA9, 0x7B, 0x5A, 0x2B, 0x5E, 0xDF, 0x0B, 0x39, 0x39, 0x2F, 0xC1, 0xD1, - 0x79, 0x21, 0x67, 0xE7, 0x85, 0x1D, 0x9E, 0x97, 0xE0, 0xF4, 0xBC, 0xA0, 0xE3, 0xF3, 0xC2, 0x1E, - 0xCC, 0x4B, 0xF1, 0x62, 0x5E, 0xC0, 0x93, 0x79, 0xC9, 0xDE, 0xCC, 0xD6, 0x88, 0x4D, 0x9C, 0x46, - 0xBC, 0xDD, 0x7F, 0x9B, 0x95, 0xE5, 0xC7, 0xD3, 0xFB, 0x05, 0x5A, 0xF9, 0x09, 0x95, 0x5C, 0xB6, - 0x0F, 0x7B, 0x34, 0x63, 0x67, 0x74, 0x77, 0x6C, 0x39, 0x14, 0x0B, 0x75, 0xD9, 0xE4, 0xEA, 0x5E, - 0xAD, 0xF2, 0xEE, 0xAC, 0x67, 0xB1, 0xA1, 0xE4, 0x24, 0xFD, 0xF4, 0x13, 0xB1, 0xB7, 0x03, 0x39, - 0x19, 0xB2, 0x44, 0x00, 0xB3, 0xB7, 0xDD, 0xA7, 0xFE, 0x61, 0x38, 0x99, 0x0F, 0xED, 0x87, 0x8F, - 0xA7, 0x7B, 0xBD, 0x62, 0x92, 0x9B, 0xFA, 0xCA, 0x68, 0x73, 0xB0, 0x9D, 0xAA, 0xB9, 0x25, 0xD1, - 0x31, 0x28, 0x90, 0x85, 0xE8, 0x26, 0x0C, 0xE1, 0x3F, 0x70, 0xCC, 0x61, 0x31, 0x8F, 0x59, 0x1D, - 0x45, 0x7A, 0x72, 0xF9, 0x5A, 0x59, 0x31, 0x45, 0xC6, 0x2A, 0x1B, 0x66, 0xB7, 0x6D, 0x91, 0x4A, - 0xD8, 0xFF, 0x7D, 0x3F, 0x39, 0x71, 0xC7, 0x79, 0x30, 0xD4, 0xC8, 0x0F, 0xE0, 0x1F, 0xF7, 0xBE, - 0x45, 0xAE, 0x58, 0x89, 0x14, 0xF2, 0xD8, 0xCA, 0xD4, 0xC9, 0xF1, 0xA1, 0x3C, 0xDB, 0xD3, 0x3B, - 0xCE, 0x2C, 0xA1, 0x89, 0x20, 0x72, 0xE4, 0xC6, 0xDF, 0x79, 0x09, 0x07, 0xA5, 0x96, 0xA2, 0x3C, - 0xF1, 0xCB, 0x4D, 0xF2, 0x06, 0xB1, 0x36, 0xF1, 0xBE, 0x40, 0x7C, 0xD8, 0x45, 0x0A, 0xF8, 0x87, - 0x06, 0x83, 0xF2, 0x13, 0x69, 0x74, 0xC8, 0x9B, 0x37, 0x1C, 0x5B, 0xB3, 0x89, 0x43, 0xE6, 0x34, - 0xF5, 0x91, 0x2A, 0x89, 0x94, 0x2C, 0x08, 0xC1, 0x94, 0x1A, 0x4B, 0x5D, 0x9B, 0x3A, 0xB8, 0xE5, - 0x03, 0x62, 0x9A, 0x3B, 0xD3, 0xA8, 0x4E, 0x4D, 0x8B, 0xA6, 0x7E, 0xAC, 0xC0, 0x09, 0x8B, 0xF7, - 0x4E, 0x8C, 0x6F, 0x37, 0xB1, 0xF7, 0xBD, 0xC6, 0xB0, 0x30, 0xE0, 0x79, 0x48, 0x1F, 0xBA, 0xCC, - 0x0D, 0x48, 0x0E, 0x47, 0x67, 0x4F, 0x57, 0xA9, 0xCE, 0x74, 0xDB, 0x52, 0xF4, 0x79, 0xD6, 0x4B, - 0xAC, 0x65, 0x59, 0xCD, 0xA5, 0xBC, 0x2D, 0x1E, 0x4D, 0xF8, 0x9B, 0x89, 0x70, 0x9C, 0x17, 0x90, - 0xF2, 0x84, 0x35, 0x52, 0xA0, 0xFB, 0x6D, 0x9A, 0x19, 0x07, 0x5D, 0xFE, 0x78, 0xAE, 0x25, 0xDF, - 0x83, 0x9D, 0x91, 0x7F, 0xFD, 0x90, 0x25, 0x75, 0x6A, 0xC8, 0xE2, 0xD1, 0xCC, 0x05, 0x40, 0x6D, - 0x57, 0xF5, 0x59, 0x31, 0xED, 0x45, 0x33, 0xC3, 0xF1, 0x38, 0x1B, 0x62, 0x24, 0x54, 0x7A, 0xD6, - 0xEC, 0x9A, 0xF5, 0x84, 0x4C, 0x82, 0xEF, 0x01, 0xC6, 0xD0, 0x6F, 0xFF, 0x90, 0xD2, 0x83, 0x6C, - 0xB1, 0xBD, 0xC9, 0xF6, 0x86, 0xAC, 0x76, 0x5E, 0x3A, 0x38, 0x27, 0x6C, 0xA5, 0xB0, 0x74, 0xBD, - 0x74, 0xCA, 0x19, 0x91, 0x3B, 0x57, 0xBD, 0xE4, 0x26, 0x81, 0x97, 0xCE, 0x8F, 0xC9, 0x82, 0x92, - 0xE9, 0x23, 0x24, 0x47, 0x92, 0xF1, 0xD4, 0xF1, 0x73, 0xDB, 0x26, 0x8C, 0x3C, 0x45, 0xD7, 0x1C, - 0xD2, 0xC8, 0x1A, 0xFE, 0x4B, 0x1C, 0xFF, 0x25, 0x8E, 0x95, 0xC4, 0xD1, 0x10, 0x9D, 0x3F, 0xED, - 0x28, 0x1A, 0xB1, 0x9C, 0x11, 0x5C, 0xBF, 0xC6, 0x3C, 0xD0, 0x87, 0x45, 0x65, 0xFC, 0x40, 0x7C, - 0x28, 0x5D, 0x0C, 0x64, 0x52, 0xC6, 0x11, 0x9C, 0xC3, 0x70, 0x95, 0xCA, 0x67, 0xD9, 0x7C, 0xB3, - 0xA7, 0x6C, 0x00, 0xE6, 0xA5, 0x44, 0x19, 0x8C, 0x3C, 0xF3, 0x0B, 0xAE, 0x7B, 0x1E, 0xC1, 0xC7, - 0xA5, 0x6E, 0xA8, 0x2D, 0x15, 0x61, 0x2B, 0x9D, 0xA2, 0x58, 0x0E, 0xFB, 0xA8, 0xB5, 0x21, 0x0E, - 0x6E, 0x82, 0xE3, 0x26, 0x42, 0x71, 0xB2, 0x05, 0x59, 0xCB, 0x83, 0x23, 0x45, 0x79, 0xAB, 0x6B, - 0x71, 0xBE, 0x82, 0x8A, 0x69, 0xC3, 0x90, 0x35, 0xD2, 0x3A, 0x2D, 0x1B, 0x19, 0x52, 0x84, 0xB6, - 0xA6, 0xF4, 0x4A, 0xA1, 0x41, 0xA5, 0x52, 0x70, 0xA6, 0x2B, 0x31, 0x4F, 0x8F, 0x16, 0xB3, 0xEE, - 0xA6, 0x6C, 0x16, 0x2C, 0xD0, 0xF7, 0x8E, 0x25, 0xD9, 0x7D, 0xE4, 0xBE, 0x5B, 0x72, 0xE1, 0xA2, - 0xFC, 0x69, 0x23, 0xA6, 0xA6, 0x21, 0xB5, 0xEF, 0x53, 0x8D, 0xA8, 0xFD, 0x7C, 0xA3, 0x3A, 0xF7, - 0x06, 0x35, 0x73, 0xAF, 0xE3, 0x3B, 0x50, 0x54, 0x66, 0xD2, 0xFE, 0x33, 0xFF, 0x13, 0x6F, 0x31, - 0x6A, 0xBF, 0xD9, 0x6E, 0x93, 0x6B, 0xE0, 0x7C, 0xDF, 0xB6, 0x53, 0x98, 0x8B, 0x60, 0xFE, 0xE3, - 0xCA, 0xDC, 0x1A, 0xB0, 0x78, 0xA4, 0xC4, 0xCD, 0xC1, 0xB2, 0x87, 0x2A, 0xF5, 0x84, 0x54, 0x47, - 0x2C, 0xF7, 0x8F, 0x64, 0x07, 0x87, 0x7F, 0xFE, 0x37, 0x5B, 0x47, 0x8A, 0xB9, 0x98, 0x5F, 0xA1, - 0x2B, 0xD9, 0x67, 0x66, 0x65, 0x9F, 0xF4, 0x58, 0x2E, 0xE7, 0x97, 0x91, 0x09, 0x9A, 0x1D, 0xC7, - 0xE4, 0xF7, 0x71, 0xFF, 0x84, 0x79, 0xE3, 0x73, 0x9A, 0xD9, 0x59, 0x8C, 0x3D, 0x7B, 0xEB, 0x7C, - 0x4B, 0x27, 0x04, 0x7E, 0xF3, 0xE3, 0x53, 0xF7, 0xB4, 0xC1, 0xCD, 0x9F, 0x69, 0x79, 0xB3, 0xC9, - 0xCB, 0xD2, 0xEA, 0x6F, 0xE0, 0xB0, 0xA6, 0x7C, 0xD8, 0xC5, 0xA4, 0x1A, 0x4D, 0x2B, 0xF4, 0xCE, - 0x14, 0xE8, 0x1D, 0x15, 0x7A, 0x47, 0x87, 0xDE, 0x29, 0x85, 0xDE, 0x9D, 0x02, 0xBD, 0xAB, 0x42, - 0xEF, 0xEA, 0xD0, 0xBB, 0xA5, 0xD0, 0xD7, 0xA7, 0x40, 0x5F, 0x57, 0xA1, 0xAF, 0xEB, 0xD0, 0xD7, - 0x33, 0xE8, 0xBF, 0x27, 0x11, 0x96, 0xA2, 0x9F, 0x51, 0x86, 0xAF, 0x5C, 0x0F, 0x7F, 0xC7, 0xC8, - 0xCE, 0x69, 0x02, 0x9D, 0x9A, 0x9C, 0x0A, 0x42, 0x94, 0x85, 0x88, 0xB7, 0x93, 0xF0, 0x03, 0x3E, - 0xB1, 0x08, 0x25, 0x78, 0xBF, 0x85, 0x23, 0x20, 0x7B, 0xD3, 0x4F, 0x71, 0xE6, 0x43, 0x92, 0x3A, - 0xDC, 0x55, 0xC1, 0x4E, 0xCC, 0xA2, 0x5C, 0x50, 0x3D, 0xFA, 0x7C, 0x0F, 0x90, 0xF9, 0x5E, 0xB7, - 0x4A, 0xD7, 0xF9, 0x31, 0xA5, 0x23, 0x5D, 0x7C, 0xFE, 0xF4, 0x13, 0xE1, 0x1F, 0xBB, 0xF9, 0x47, - 0x53, 0x54, 0x3A, 0x0B, 0xC8, 0x0A, 0x80, 0xFE, 0xB1, 0x8D, 0x28, 0x9D, 0x02, 0x6B, 0x28, 0xF2, - 0xA4, 0xC8, 0x4A, 0x5D, 0x16, 0x08, 0x2C, 0xDB, 0x4E, 0xFA, 0xBA, 0x8F, 0x7F, 0xE5, 0xB8, 0x6A, - 0xCB, 0x3E, 0xA7, 0x42, 0x98, 0xB5, 0xA5, 0x55, 0x3E, 0xFA, 0x26, 0x31, 0x72, 0x10, 0x80, 0x7E, - 0xA2, 0xC8, 0x6B, 0xF7, 0x28, 0x0D, 0xBE, 0x16, 0x36, 0x96, 0x9F, 0x2B, 0xB7, 0x66, 0xC1, 0x2B, - 0x6A, 0x68, 0x86, 0x78, 0xAB, 0x09, 0xE4, 0x19, 0xDA, 0xFB, 0x6F, 0xE2, 0xFE, 0xD9, 0xE2, 0xBB, - 0xB3, 0x04, 0x6C, 0x19, 0x88, 0x07, 0x0E, 0xE2, 0xA1, 0x1C, 0xC4, 0x83, 0x05, 0x84, 0xC9, 0x5D, - 0xD1, 0xEA, 0xEB, 0x03, 0x53, 0xDE, 0xF7, 0x85, 0x4F, 0xA5, 0x68, 0x5D, 0xC5, 0xEA, 0x96, 0x6F, - 0x2B, 0xA4, 0x63, 0x7F, 0x06, 0x66, 0x7A, 0xEE, 0x6C, 0x96, 0x4C, 0x92, 0x13, 0xF3, 0x33, 0x5E, - 0xA1, 0x00, 0xFC, 0xCE, 0x72, 0x47, 0x4B, 0xEB, 0xB8, 0x18, 0xB1, 0x3F, 0xE9, 0xF7, 0x30, 0x99, - 0x0D, 0x5B, 0x25, 0xC6, 0xA9, 0xF4, 0x32, 0x2C, 0xE2, 0x50, 0x1B, 0xEE, 0x68, 0xE2, 0xAA, 0xDB, - 0xD5, 0x8B, 0xAF, 0xA2, 0xA6, 0x69, 0xA2, 0x3C, 0xE0, 0x9F, 0x1F, 0x9E, 0xAF, 0x98, 0x15, 0x3D, - 0xF1, 0x07, 0x93, 0x70, 0x12, 0xB7, 0xF2, 0xC9, 0x06, 0x27, 0x38, 0xA7, 0xBE, 0x3D, 0x0F, 0x05, - 0xD3, 0xD5, 0x58, 0xC9, 0xB9, 0x59, 0x0B, 0x91, 0xB1, 0x05, 0xC8, 0x70, 0x63, 0x7D, 0x05, 0x3A, - 0x0A, 0x55, 0x9B, 0xEC, 0xBF, 0x85, 0x6B, 0x19, 0xB7, 0x69, 0x69, 0xA9, 0xD4, 0xA4, 0x34, 0xE3, - 0xD9, 0x96, 0x70, 0xCA, 0xDA, 0xC5, 0xB2, 0x76, 0x5F, 0x84, 0x6F, 0x5D, 0xD4, 0x76, 0x0F, 0x87, - 0xF4, 0xDA, 0x9D, 0x0C, 0x93, 0x58, 0x3B, 0xD9, 0xAA, 0x85, 0x66, 0x72, 0xEF, 0x5A, 0x5A, 0x44, - 0xF6, 0xC6, 0xB0, 0xE1, 0xA4, 0x9E, 0xE2, 0x3A, 0xC0, 0x44, 0x9A, 0x3F, 0xD4, 0xCA, 0xD1, 0xE1, - 0xF5, 0x94, 0x3D, 0xAB, 0xA3, 0x86, 0x8A, 0xBD, 0x2E, 0xDA, 0xEA, 0xB4, 0x2C, 0x97, 0x1A, 0xFF, - 0xA0, 0x51, 0x98, 0xF3, 0xA3, 0x88, 0x11, 0x4E, 0x51, 0x7F, 0x2D, 0x43, 0x60, 0xF6, 0xFD, 0x87, - 0x5A, 0x2B, 0x16, 0xD4, 0x0B, 0xD6, 0x77, 0x68, 0xCC, 0xF6, 0x46, 0xCA, 0x0E, 0xB6, 0xDA, 0xCB, - 0xCD, 0x72, 0xE6, 0xDE, 0x17, 0x09, 0x2B, 0x8E, 0x4D, 0x9A, 0x03, 0x44, 0xE5, 0xE6, 0xEF, 0x27, - 0x95, 0x89, 0x2C, 0x7F, 0xF6, 0x24, 0x26, 0x8F, 0xA6, 0xD4, 0x9D, 0x8E, 0xA8, 0x6B, 0x8A, 0x99, - 0xCA, 0x2E, 0xC9, 0x08, 0x84, 0x7D, 0x3A, 0x3D, 0x39, 0xDA, 0xBB, 0xE4, 0xC9, 0x64, 0x52, 0xBE, - 0x77, 0xAC, 0x55, 0x7A, 0x15, 0xAA, 0x5C, 0x4C, 0xAF, 0xF2, 0xB3, 0x54, 0x65, 0xC3, 0x56, 0xE5, - 0xFC, 0xE4, 0x40, 0x83, 0x62, 0xE9, 0xA8, 0xF0, 0xF6, 0xFF, 0xFD, 0xF5, 0x55, 0xAE, 0x72, 0xFE, - 0xEB, 0xC9, 0xE5, 0xF9, 0xDE, 0x2F, 0xBF, 0x4E, 0xA9, 0xD2, 0x7B, 0x7B, 0xBE, 0xFF, 0xAB, 0xC9, - 0x32, 0x93, 0x69, 0xF8, 0x6C, 0x99, 0x5D, 0x01, 0x4B, 0x8F, 0x9A, 0x39, 0x9B, 0x68, 0xCD, 0x2C, - 0x43, 0x29, 0x3F, 0x7E, 0x56, 0xA1, 0xDE, 0x0B, 0xAD, 0x9E, 0x63, 0xAF, 0xF7, 0xB2, 0x22, 0xBC, - 0x97, 0x36, 0x78, 0xD6, 0x9A, 0xAF, 0x2A, 0x42, 0x7C, 0x55, 0x8D, 0xC2, 0x4E, 0xB7, 0x1A, 0xBC, - 0x4E, 0xB7, 0x1A, 0xBC, 0xEE, 0xBA, 0xA3, 0xC3, 0x2B, 0xE8, 0x0A, 0x7B, 0x04, 0xCF, 0xA9, 0x02, - 0x94, 0x3F, 0x97, 0x67, 0xA9, 0x69, 0x95, 0x07, 0x38, 0xED, 0x62, 0xCC, 0xF2, 0x9D, 0xEF, 0x25, - 0x37, 0xD8, 0x7C, 0x06, 0x99, 0x70, 0x2A, 0x0A, 0x45, 0x77, 0xC9, 0x42, 0xD1, 0x5D, 0xBA, 0x50, - 0x74, 0x97, 0x2C, 0x14, 0xDD, 0xFF, 0xAE, 0x42, 0x31, 0x89, 0x59, 0x9E, 0x9D, 0xFC, 0xB2, 0x25, - 0xB6, 0x5C, 0x3F, 0xF0, 0x4C, 0x26, 0x39, 0x18, 0xF6, 0x4E, 0xF3, 0xB6, 0xA5, 0xD2, 0x67, 0xAD, - 0xD2, 0x67, 0x5B, 0xA5, 0x2F, 0x5A, 0xA5, 0x2F, 0x9A, 0xB2, 0x07, 0x92, 0xD2, 0x14, 0xDF, 0xE5, - 0x64, 0x99, 0xB7, 0x22, 0xD2, 0xD3, 0xDD, 0x15, 0x6E, 0x3D, 0xA4, 0x87, 0xB6, 0xF5, 0xDA, 0xEF, - 0xF7, 0x8E, 0x2E, 0xF7, 0xCE, 0x0E, 0x2C, 0x95, 0xF7, 0x86, 0x49, 0x36, 0x34, 0xAA, 0xBB, 0xED, - 0xC8, 0x8D, 0xBE, 0x2B, 0xBE, 0xB6, 0x9D, 0x69, 0x0E, 0xB5, 0x53, 0xDA, 0x77, 0x6D, 0xED, 0x79, - 0x88, 0x59, 0x46, 0x82, 0xEB, 0xFD, 0x1D, 0xCE, 0x2E, 0x40, 0x6E, 0xC3, 0x92, 0x7B, 0x1C, 0xB7, - 0x32, 0xA7, 0xF4, 0x0E, 0x96, 0xCD, 0x9C, 0x7B, 0x86, 0x5F, 0x6A, 0x5E, 0xC9, 0xBE, 0x25, 0xA6, - 0xF7, 0x7E, 0xA2, 0x3B, 0xE9, 0xB1, 0xA7, 0x16, 0x6A, 0x23, 0xD7, 0x0F, 0xCE, 0x98, 0xA3, 0xEF, - 0x76, 0x9E, 0xC4, 0x59, 0xBC, 0xD8, 0x73, 0x1C, 0x9C, 0x45, 0x21, 0xFA, 0x91, 0x49, 0xFE, 0xAC, - 0x3A, 0x6A, 0x84, 0xBC, 0x17, 0x78, 0xCA, 0x76, 0x9C, 0x3F, 0xA5, 0x9C, 0x27, 0x58, 0x57, 0xB3, - 0xAD, 0xE7, 0xB4, 0x14, 0xE5, 0x5B, 0x67, 0x6D, 0xF3, 0x17, 0xE8, 0xB3, 0xD4, 0xCD, 0x78, 0x5C, - 0x49, 0xA1, 0xC8, 0xF0, 0x53, 0x9C, 0x05, 0x3D, 0xE2, 0x9F, 0x2D, 0x3D, 0xD2, 0xBA, 0x9B, 0x62, - 0xAC, 0x49, 0xF7, 0x83, 0x07, 0xB0, 0xA5, 0xC4, 0x57, 0x87, 0x6E, 0x28, 0xBF, 0x22, 0x3C, 0xEA, - 0x9D, 0xAD, 0x77, 0xC9, 0x0D, 0x7B, 0x84, 0x28, 0xC0, 0x77, 0xEC, 0xA1, 0x90, 0xBD, 0x4D, 0x34, - 0x4E, 0xF0, 0xE9, 0x08, 0x66, 0x60, 0x0F, 0x31, 0xF4, 0x36, 0xE3, 0x13, 0xB9, 0x8E, 0xC2, 0x11, - 0xD9, 0x3B, 0xE3, 0x0D, 0x06, 0x64, 0x0C, 0xA4, 0x29, 0xB9, 0xA2, 0x19, 0x18, 0xF4, 0xF2, 0x3B, - 0xE7, 0x70, 0xE4, 0xE4, 0xC9, 0x87, 0x40, 0x4E, 0x34, 0xF2, 0x03, 0x38, 0x2D, 0xDD, 0xF8, 0xB0, - 0xC1, 0x95, 0x1F, 0xA2, 0xE0, 0x77, 0x92, 0x70, 0x0C, 0x80, 0xED, 0x94, 0x3B, 0x14, 0x2F, 0x55, - 0x64, 0xE7, 0x6F, 0x2D, 0xDF, 0x3D, 0x9C, 0xF0, 0x83, 0xC9, 0x70, 0xD8, 0x34, 0x8C, 0x6A, 0x7A, - 0x0E, 0x7C, 0x8D, 0xA5, 0x65, 0x0E, 0x85, 0xF8, 0x2E, 0x56, 0x0F, 0xFE, 0xF4, 0xFE, 0x34, 0x35, - 0xE4, 0x53, 0x4E, 0xE6, 0xFF, 0x89, 0x3B, 0x3B, 0x10, 0xF8, 0x3F, 0xF0, 0x09, 0x98, 0x66, 0xB2, - 0xA0, 0xF8, 0xB0, 0x7B, 0x2D, 0xDE, 0xC1, 0xFB, 0x34, 0xC6, 0x87, 0xA9, 0x7E, 0x81, 0x23, 0xA4, - 0x7A, 0x8A, 0x60, 0xE9, 0x74, 0x79, 0xBA, 0x8D, 0x78, 0x72, 0x35, 0xF2, 0x93, 0xF4, 0xE1, 0x3C, - 0x7C, 0xCC, 0x0E, 0x66, 0x22, 0x7B, 0x6A, 0xE2, 0xAB, 0xF3, 0x4D, 0xBA, 0x14, 0xC1, 0xDB, 0x4D, - 0x71, 0x31, 0x82, 0x6F, 0xB1, 0xE0, 0xA5, 0xB2, 0xE2, 0x73, 0x99, 0x96, 0xB7, 0xDD, 0xF1, 0x98, - 0xCF, 0x36, 0x13, 0x70, 0x8B, 0x21, 0x6E, 0x4A, 0x50, 0xDD, 0xBF, 0xBB, 0xF7, 0x02, 0xE2, 0xAF, - 0x27, 0x1F, 0x30, 0x04, 0xEB, 0x9C, 0xC2, 0x59, 0x46, 0x7A, 0x9B, 0x05, 0x6B, 0xB4, 0x43, 0x00, - 0xD9, 0xA8, 0x9D, 0x7D, 0x84, 0x3D, 0x29, 0x70, 0x74, 0x6D, 0xC2, 0xBA, 0x55, 0x53, 0xAA, 0xB0, - 0x79, 0x96, 0x12, 0xA1, 0xBE, 0xC3, 0xA5, 0x72, 0xC3, 0x72, 0xF8, 0xC6, 0x44, 0xEE, 0xBC, 0xD0, - 0xC7, 0xAB, 0xE0, 0xB1, 0xE2, 0xB4, 0x6F, 0xBE, 0x9F, 0xA2, 0xC2, 0x93, 0xDE, 0x1A, 0x54, 0xD5, - 0x76, 0x39, 0x52, 0xFE, 0x90, 0x59, 0x19, 0x60, 0x73, 0x6A, 0xF3, 0x59, 0x68, 0xAF, 0x55, 0x2B, - 0x99, 0xDE, 0x1A, 0x96, 0x30, 0x1A, 0xD0, 0xE4, 0xCC, 0xF5, 0x23, 0xEA, 0x31, 0x25, 0xAC, 0x2D, - 0x38, 0x57, 0x49, 0xF0, 0x96, 0x55, 0xE1, 0x85, 0x16, 0x7E, 0xB1, 0xA7, 0xDE, 0x58, 0x21, 0x03, - 0x16, 0x26, 0x09, 0x0D, 0xDA, 0xB2, 0x47, 0x9C, 0xF5, 0xC9, 0x7B, 0x68, 0x78, 0x2A, 0xDE, 0xA3, - 0xB1, 0x1A, 0x2E, 0x18, 0xCE, 0xA3, 0x78, 0x7C, 0x1A, 0xDE, 0x9D, 0x41, 0xFB, 0xD8, 0xAE, 0xA3, - 0x81, 0xBA, 0x73, 0xE9, 0x9D, 0x34, 0x95, 0xF4, 0xF2, 0x17, 0xD4, 0x6A, 0xAC, 0x21, 0x3B, 0xF1, - 0x8A, 0x08, 0x8A, 0x42, 0x2B, 0x8A, 0x0C, 0x48, 0xA1, 0x23, 0x3B, 0x71, 0xBB, 0x9E, 0xC7, 0x5E, - 0x22, 0x42, 0x8B, 0x17, 0x0D, 0x30, 0x61, 0xED, 0xE1, 0xC7, 0x13, 0x50, 0xD8, 0x09, 0x7E, 0xE3, - 0xAF, 0xC1, 0xB5, 0x48, 0x83, 0x62, 0x95, 0x26, 0xD9, 0xD9, 0x45, 0x2A, 0x73, 0xB1, 0x17, 0xCC, - 0xAB, 0x70, 0x80, 0x37, 0xE3, 0x3D, 0xEA, 0xCA, 0x8B, 0x36, 0xCC, 0x8D, 0x0B, 0xB7, 0x3B, 0xEC, - 0xDE, 0x18, 0x7E, 0xE1, 0xA0, 0xB3, 0x33, 0xBA, 0x8F, 0xF7, 0xBF, 0xEE, 0x3D, 0xFC, 0xA2, 0x1D, - 0xD6, 0x79, 0xBD, 0xAF, 0xFE, 0xB7, 0x76, 0x18, 0xF4, 0x87, 0x7E, 0x1F, 0x1D, 0x50, 0x33, 0x26, - 0x37, 0x2C, 0x91, 0xB3, 0x4A, 0x70, 0x54, 0x49, 0x46, 0x99, 0xA2, 0xE7, 0xDF, 0x4C, 0x86, 0x71, - 0x98, 0xA8, 0x15, 0xEC, 0x78, 0x2D, 0x90, 0x7A, 0xB4, 0x2F, 0x6F, 0x1D, 0xDB, 0x0E, 0x59, 0x2B, - 0x44, 0x28, 0xDB, 0xF0, 0x1E, 0x55, 0x8D, 0x60, 0x85, 0xBA, 0x14, 0x02, 0x73, 0xCC, 0x65, 0xF4, - 0x49, 0xDD, 0xB0, 0x13, 0x68, 0xC9, 0xA8, 0x3A, 0x3B, 0x79, 0x33, 0xA6, 0x67, 0xCD, 0x35, 0x4C, - 0x2C, 0x2A, 0x16, 0xC4, 0x35, 0x73, 0x0D, 0xC3, 0x36, 0x8F, 0x25, 0x79, 0xDE, 0xEC, 0x1D, 0x4A, - 0xDF, 0xDE, 0x5B, 0xBC, 0x37, 0x29, 0xA4, 0xF2, 0xAE, 0x14, 0x51, 0x99, 0xF7, 0xA3, 0xA4, 0xB3, - 0xF6, 0xAE, 0x94, 0xE7, 0xF0, 0x9C, 0xBF, 0x63, 0xF3, 0xE5, 0x06, 0xE5, 0xDD, 0xC4, 0xC3, 0x45, - 0x69, 0x2F, 0x07, 0xD9, 0x31, 0x63, 0xB1, 0x5E, 0xF2, 0x07, 0x09, 0x97, 0xDE, 0xC9, 0x77, 0x72, - 0x78, 0x83, 0xD1, 0x47, 0xDE, 0x85, 0x92, 0x3E, 0x72, 0x26, 0x58, 0xFA, 0x68, 0x5E, 0xEB, 0x14, - 0xE5, 0x37, 0xAB, 0x35, 0x0B, 0x5E, 0x1F, 0x2D, 0x7C, 0x39, 0x2F, 0x9D, 0xE5, 0x5B, 0x9D, 0xF6, - 0x46, 0xF1, 0x8D, 0x8F, 0xE2, 0x1F, 0x6A, 0x41, 0x7E, 0x11, 0x46, 0xFD, 0x9B, 0xF9, 0x91, 0x77, - 0x9C, 0x6E, 0xDB, 0xA9, 0x80, 0x7D, 0x4E, 0xF0, 0x4E, 0x7B, 0xFA, 0x65, 0x96, 0x26, 0x38, 0xB6, - 0x7C, 0x8E, 0xF3, 0xCB, 0x4B, 0x49, 0x76, 0xC8, 0x82, 0xA9, 0x20, 0xE5, 0xC5, 0x9B, 0x3D, 0x1B, - 0x1B, 0x97, 0xB4, 0x4A, 0x20, 0x8A, 0xBB, 0x9D, 0xE5, 0x77, 0x5A, 0x4A, 0xB7, 0x4B, 0x1F, 0x44, - 0xD0, 0xBA, 0xCD, 0xEB, 0x2E, 0xD4, 0xED, 0x69, 0x20, 0xAC, 0xDD, 0xD6, 0x2E, 0xBF, 0x96, 0xD0, - 0x75, 0x13, 0x62, 0x51, 0xF7, 0x2D, 0xF7, 0x6B, 0xFC, 0xF5, 0x48, 0x9E, 0xC9, 0xC9, 0x7C, 0x1A, - 0x79, 0x0A, 0x2F, 0xA6, 0xC2, 0x2B, 0xC8, 0xA8, 0xA7, 0xF2, 0xC5, 0x7C, 0x9E, 0x74, 0x7E, 0x8E, - 0x98, 0xB0, 0x32, 0x6F, 0x4B, 0xA7, 0x40, 0x1A, 0xD2, 0x26, 0xFB, 0xEE, 0xC4, 0x3B, 0xD4, 0x9F, - 0x42, 0xD4, 0xD4, 0xAA, 0x1C, 0x86, 0x5F, 0x41, 0x74, 0x2A, 0x50, 0xD5, 0x29, 0xD0, 0xE0, 0x95, - 0xA8, 0x12, 0x0B, 0xDA, 0x8C, 0x54, 0xCD, 0x8F, 0x6F, 0x26, 0x2E, 0x68, 0xA3, 0x3C, 0x2D, 0xEF, - 0xE5, 0xFC, 0x63, 0x5E, 0x31, 0xA3, 0x66, 0xC1, 0xF0, 0x8F, 0xC7, 0xE9, 0xCB, 0xD4, 0xF3, 0xB2, - 0xAE, 0x0A, 0x04, 0xAB, 0x2A, 0xD0, 0x73, 0x51, 0x2C, 0xAA, 0x08, 0xAA, 0xE4, 0xB6, 0x28, 0x15, - 0x9B, 0x43, 0x9A, 0xB8, 0xFE, 0x30, 0x9E, 0x9D, 0x05, 0xB3, 0xC1, 0xD2, 0x98, 0x21, 0xBF, 0xD8, - 0x3B, 0x3F, 0x0B, 0x64, 0x28, 0x25, 0x73, 0x5E, 0x98, 0xEE, 0xB0, 0x72, 0x95, 0xDE, 0x96, 0x42, - 0xEF, 0x14, 0x70, 0x76, 0x1A, 0x74, 0xFB, 0xBA, 0x20, 0xD9, 0x11, 0x96, 0xB1, 0x28, 0xA8, 0xE0, - 0xCA, 0x56, 0x04, 0xCD, 0x88, 0xB1, 0xF0, 0x8A, 0x50, 0x0A, 0xAF, 0xD2, 0x8A, 0xA0, 0x27, 0x01, - 0x5C, 0x94, 0x19, 0xE5, 0x79, 0xEB, 0xA4, 0x29, 0x21, 0xD7, 0x9E, 0x7F, 0x32, 0x54, 0x84, 0x62, - 0xED, 0xB4, 0x92, 0x65, 0x6F, 0xD1, 0x7E, 0x4F, 0x4D, 0xD9, 0xA7, 0x77, 0x3D, 0x6F, 0xB0, 0x60, - 0xEF, 0x2B, 0x01, 0xB2, 0x1D, 0xA3, 0xB2, 0xCC, 0xF1, 0xF3, 0xF4, 0x5E, 0xBD, 0xF6, 0xB0, 0xA0, - 0x50, 0x73, 0xC5, 0x3F, 0x25, 0x0A, 0xE3, 0x98, 0xF0, 0x04, 0xA8, 0xB4, 0x3B, 0xA9, 0x25, 0x62, - 0x78, 0x6C, 0x2A, 0x86, 0x44, 0x84, 0x0C, 0x47, 0xEB, 0xBC, 0x71, 0xC1, 0xFB, 0x73, 0x81, 0xDF, - 0xFF, 0x8E, 0x56, 0x38, 0xF6, 0xC6, 0x70, 0x7A, 0x2E, 0xE2, 0x2F, 0x44, 0xEE, 0xBB, 0xDE, 0x01, - 0xE6, 0x71, 0x6A, 0x98, 0x75, 0xEC, 0x8F, 0xB3, 0x65, 0x49, 0xA2, 0xA4, 0xFA, 0x33, 0x3F, 0x55, - 0x67, 0xC9, 0xA9, 0xFE, 0xBC, 0xEF, 0x61, 0x3C, 0xEF, 0x3B, 0x18, 0xCF, 0xF7, 0xFE, 0x45, 0x51, - 0xF2, 0x0D, 0x47, 0x4B, 0x8E, 0xC9, 0x83, 0xD1, 0x71, 0xFC, 0x88, 0x3B, 0x70, 0xFD, 0x20, 0x16, - 0x71, 0x6F, 0x20, 0xA2, 0xAA, 0x33, 0x94, 0x1F, 0x78, 0xF4, 0x5E, 0x73, 0x08, 0x65, 0x56, 0xDB, - 0x6D, 0x51, 0x64, 0x7F, 0xC0, 0x7A, 0x65, 0x85, 0x95, 0x5A, 0xB2, 0xA4, 0x47, 0x64, 0xEC, 0x46, - 0xEC, 0xCD, 0x6F, 0xF9, 0xB1, 0x6A, 0x56, 0xFB, 0x5B, 0x1A, 0xA9, 0x42, 0x0C, 0xAF, 0xCB, 0x2C, - 0x3A, 0x40, 0x96, 0x3A, 0x69, 0xC9, 0x67, 0x30, 0x31, 0x1A, 0xC5, 0x66, 0x25, 0x30, 0x11, 0xE1, - 0x7D, 0x8D, 0x39, 0x27, 0x56, 0x48, 0x9D, 0x39, 0xBC, 0xE7, 0x72, 0x57, 0x54, 0xF0, 0xB9, 0xA8, - 0xE0, 0x8B, 0x35, 0xB5, 0x3B, 0xFE, 0x5C, 0x45, 0xD4, 0xFD, 0x5E, 0xD9, 0xAB, 0x56, 0xB0, 0x7D, - 0xC7, 0xC2, 0x5C, 0x2D, 0x27, 0xBC, 0x5C, 0x61, 0x3C, 0x89, 0x6F, 0x1A, 0x4F, 0xDA, 0x31, 0x23, - 0xB1, 0x1B, 0x8F, 0x0D, 0x44, 0x5C, 0xA8, 0xDE, 0x2C, 0xD7, 0xDA, 0x1E, 0xC5, 0xAB, 0x9D, 0x5C, - 0x4D, 0xE5, 0x37, 0x08, 0x00, 0x50, 0x5C, 0xE0, 0x89, 0x5C, 0x81, 0x92, 0xFF, 0x80, 0x3C, 0xBE, - 0x6A, 0x54, 0x18, 0xD9, 0xD5, 0xE3, 0xF3, 0x8A, 0x64, 0x0A, 0x2A, 0x17, 0x48, 0x14, 0xB6, 0x40, - 0x36, 0x09, 0x17, 0xBF, 0x54, 0x78, 0x8C, 0xE7, 0x8E, 0xC4, 0x7D, 0x65, 0xA3, 0x76, 0xC8, 0x3A, - 0x41, 0x86, 0x61, 0x9F, 0x11, 0xCA, 0x32, 0xC1, 0x64, 0x00, 0x56, 0x48, 0xED, 0xDF, 0x6A, 0xCD, - 0xC2, 0x87, 0x01, 0xE4, 0x01, 0x42, 0x6A, 0xFA, 0x14, 0xBB, 0x01, 0x1A, 0xD3, 0x7E, 0x03, 0x51, - 0x89, 0xA9, 0x78, 0x6B, 0xA6, 0x6A, 0xFE, 0xDF, 0x96, 0xA1, 0x85, 0xBE, 0x27, 0x9C, 0xB5, 0x9D, - 0x6F, 0x45, 0x75, 0x3F, 0x1B, 0x75, 0xBB, 0x85, 0x75, 0xBF, 0x18, 0x75, 0xD7, 0xF5, 0xBA, 0x76, - 0xF5, 0x20, 0x0F, 0xB0, 0xCD, 0x25, 0x5B, 0xA6, 0x7C, 0x5A, 0x95, 0xCF, 0xD3, 0xAB, 0x7C, 0x29, - 0xAC, 0xA2, 0x92, 0x67, 0x64, 0x08, 0xC9, 0x42, 0x94, 0x25, 0xA6, 0x13, 0x37, 0x8A, 0xDC, 0x87, - 0x96, 0x10, 0x09, 0x96, 0xF2, 0x7B, 0x14, 0x06, 0x61, 0x3C, 0x76, 0xFB, 0x94, 0xB0, 0x4B, 0x41, - 0xAE, 0xB3, 0xB5, 0x60, 0xDD, 0x5C, 0x76, 0xE4, 0xBB, 0xC5, 0x42, 0xB1, 0x10, 0xC1, 0x26, 0xF2, - 0x9E, 0x01, 0xA5, 0xC3, 0x54, 0x3E, 0xE6, 0x5A, 0xC2, 0x77, 0x97, 0x45, 0x90, 0x25, 0x46, 0xC8, - 0x9D, 0x47, 0xD7, 0x1E, 0xFD, 0x5A, 0x55, 0x0A, 0x5F, 0x46, 0xBF, 0xDE, 0x30, 0xA2, 0x5E, 0x6D, - 0x4A, 0xD2, 0x24, 0xB6, 0x43, 0x5E, 0x1C, 0xB5, 0x28, 0x7D, 0x4D, 0x7E, 0x5D, 0xFB, 0xBC, 0xF6, - 0xA5, 0xA6, 0x85, 0xE3, 0x5A, 0x98, 0xF0, 0x86, 0x6C, 0x36, 0xCD, 0xF3, 0x55, 0x21, 0x77, 0x63, - 0xFF, 0x1F, 0x94, 0xD8, 0x54, 0xB9, 0xAE, 0x4C, 0x33, 0xAF, 0xE5, 0x7C, 0xD5, 0x9D, 0x79, 0x95, - 0xC5, 0xC9, 0x1B, 0x8E, 0x99, 0x28, 0x48, 0x77, 0xB3, 0x7D, 0x58, 0x7D, 0x40, 0x2A, 0x84, 0xAF, - 0x72, 0x9D, 0x57, 0x50, 0xA6, 0x30, 0xFF, 0xD4, 0x4E, 0x78, 0xA2, 0x02, 0x73, 0xC9, 0x34, 0xAB, - 0xA6, 0xB3, 0x8B, 0x95, 0x6B, 0x13, 0xB1, 0x90, 0x17, 0x18, 0x58, 0xC1, 0xDB, 0x1B, 0x4B, 0xC9, - 0x9F, 0x1B, 0xB5, 0xFF, 0x61, 0x6F, 0x27, 0x30, 0x42, 0x73, 0xEA, 0xF6, 0x6F, 0x1A, 0x05, 0xBB, - 0x66, 0x59, 0x6D, 0xFD, 0xB9, 0x91, 0xDC, 0xF8, 0x71, 0x93, 0x75, 0xA7, 0xD1, 0x2C, 0x5F, 0x05, - 0x02, 0x75, 0x15, 0x68, 0xC7, 0x93, 0xAB, 0x98, 0x6F, 0x72, 0xD9, 0x6B, 0x55, 0x6A, 0xC6, 0x46, - 0x09, 0x6C, 0xD6, 0x16, 0x16, 0x4B, 0x1E, 0x29, 0x97, 0x6A, 0xBB, 0x6C, 0xF9, 0x4C, 0x55, 0x9A, - 0xF6, 0x61, 0xFD, 0x1B, 0x07, 0x21, 0x6F, 0xEE, 0x1F, 0xF5, 0x9D, 0x7D, 0xEA, 0x55, 0x57, 0x79, - 0x77, 0x9F, 0x36, 0x98, 0xB6, 0xC3, 0x57, 0xEB, 0x55, 0xDB, 0xE5, 0xA7, 0x6D, 0x96, 0xB6, 0xD3, - 0xCF, 0x73, 0x11, 0x94, 0x6F, 0x91, 0x97, 0xF8, 0x62, 0xD9, 0xB3, 0xBE, 0x53, 0xF6, 0xAC, 0xEF, - 0x93, 0xFD, 0x86, 0xBB, 0xFE, 0x4C, 0x98, 0xE6, 0xD8, 0xF9, 0xA7, 0x6D, 0x67, 0xDE, 0xFD, 0x67, - 0xD2, 0x38, 0xE3, 0x09, 0x40, 0x43, 0x28, 0x9D, 0x02, 0xB4, 0xB9, 0xA3, 0x6C, 0x7F, 0x85, 0xE3, - 0xAA, 0xB5, 0x48, 0xB8, 0xA9, 0xDA, 0xCA, 0x52, 0xC9, 0xD5, 0xCA, 0x14, 0x71, 0xB3, 0x97, 0xA9, - 0x12, 0xF2, 0x44, 0x27, 0x0A, 0x6D, 0xE0, 0xEC, 0xA7, 0x8A, 0xAC, 0x92, 0x72, 0xB2, 0xF8, 0xE1, - 0x99, 0x55, 0x70, 0x4A, 0x49, 0xE9, 0x2E, 0x3D, 0xA9, 0x98, 0x6A, 0x77, 0xDA, 0xD6, 0x5A, 0x97, - 0xC6, 0x39, 0xB6, 0xD7, 0x99, 0x60, 0xFE, 0x58, 0x67, 0x96, 0x6C, 0xA0, 0x67, 0x3A, 0xB7, 0x4C, - 0x61, 0xB3, 0x64, 0xDC, 0x52, 0xCF, 0x83, 0x37, 0x2E, 0x3D, 0xA1, 0xC9, 0x4D, 0xE8, 0x55, 0xCB, - 0x20, 0x9C, 0x3B, 0x60, 0x5B, 0xD2, 0x07, 0x4B, 0x30, 0xA5, 0xE1, 0x90, 0x30, 0xE8, 0xB7, 0x04, - 0x16, 0xBB, 0x5D, 0x89, 0xB5, 0xDD, 0x66, 0x16, 0x2D, 0x36, 0xA6, 0x03, 0x5A, 0xF8, 0x28, 0x92, - 0x43, 0x14, 0x39, 0xAD, 0x37, 0xC9, 0x2A, 0x69, 0x48, 0x75, 0x74, 0x93, 0xA8, 0xA8, 0xB4, 0xC6, - 0xB2, 0xBE, 0xC3, 0xF8, 0x99, 0x55, 0xED, 0x1E, 0x10, 0x69, 0x93, 0xE6, 0x14, 0xF2, 0xD3, 0x4D, - 0x03, 0x10, 0xDB, 0x4E, 0x42, 0xE6, 0x99, 0xD4, 0x58, 0xAF, 0x90, 0x4B, 0xBA, 0x98, 0x69, 0x1A, - 0x17, 0xA6, 0xF0, 0x4C, 0x67, 0xB1, 0x9D, 0x69, 0x3A, 0xC1, 0x4D, 0xE0, 0xC4, 0xB3, 0x73, 0xCD, - 0x0C, 0x37, 0x28, 0x62, 0x9A, 0x79, 0x6A, 0xFF, 0x51, 0xD5, 0x4B, 0xF9, 0xF2, 0x6A, 0x3B, 0x41, - 0x97, 0x04, 0x76, 0x94, 0x9D, 0xFA, 0x2D, 0x91, 0x1D, 0x05, 0x07, 0x7F, 0xEB, 0x58, 0x66, 0xD5, - 0x37, 0x0A, 0xAA, 0x17, 0xFA, 0x01, 0xF1, 0x66, 0x9B, 0xDF, 0x8C, 0x84, 0xDD, 0x45, 0x33, 0x41, - 0xB2, 0x31, 0x14, 0xE5, 0x6C, 0xAF, 0x16, 0x44, 0x92, 0x05, 0x81, 0x54, 0x04, 0xD2, 0x2D, 0x8B, - 0x44, 0x29, 0xBA, 0x25, 0x28, 0xB7, 0x38, 0xE4, 0x43, 0x5A, 0x66, 0xBD, 0xC8, 0x46, 0xB2, 0xB4, - 0x52, 0x36, 0x80, 0x65, 0xB5, 0x72, 0x7E, 0x16, 0xD4, 0xD2, 0x46, 0xB7, 0xBC, 0x96, 0x3E, 0xA8, - 0x53, 0x4D, 0x27, 0x69, 0x7F, 0xE7, 0x34, 0x9F, 0xA8, 0x4B, 0x58, 0xB9, 0x09, 0x45, 0x9A, 0x2D, - 0xE5, 0x66, 0x14, 0x6D, 0xC7, 0x55, 0xDD, 0x94, 0x62, 0x1D, 0x3C, 0x7D, 0x64, 0x9F, 0xD6, 0xA4, - 0x32, 0x2F, 0x09, 0x99, 0x69, 0x25, 0x4D, 0x7A, 0xBB, 0x06, 0x82, 0x51, 0x60, 0x61, 0xD1, 0xF9, - 0x53, 0xD5, 0xCA, 0x22, 0x0D, 0x80, 0x6A, 0x69, 0xD1, 0xCF, 0x26, 0xB3, 0x5B, 0x5B, 0x2A, 0x9D, - 0x6E, 0x96, 0x6A, 0x71, 0xD1, 0x8E, 0x28, 0x8B, 0x5A, 0x5D, 0x24, 0xDE, 0xCC, 0x6C, 0x79, 0xC9, - 0xE6, 0xD0, 0x6F, 0x6D, 0x7D, 0x51, 0xA5, 0x85, 0xD5, 0xCC, 0xD2, 0xE3, 0xEC, 0x90, 0x17, 0xC6, - 0xEE, 0x75, 0x69, 0x56, 0x1A, 0xF3, 0xCC, 0xA5, 0xD6, 0xD8, 0xD0, 0x9B, 0x6C, 0xEA, 0x1F, 0xB6, - 0xA6, 0xC2, 0x78, 0xA1, 0xDA, 0x82, 0x2A, 0xDC, 0xE7, 0x3F, 0x8D, 0x11, 0x4A, 0x11, 0x88, 0x47, - 0x5B, 0xA8, 0x9E, 0x62, 0x4C, 0x92, 0x63, 0x85, 0xF8, 0xEE, 0x05, 0xFE, 0x95, 0x46, 0xBA, 0xFD, - 0x77, 0xD0, 0xD4, 0x8D, 0x7A, 0x3D, 0x8F, 0x94, 0xD2, 0xEA, 0xB4, 0x2A, 0xD4, 0xF9, 0xDB, 0xDF, - 0xCC, 0x4A, 0x11, 0x4D, 0x26, 0x51, 0xC0, 0xF6, 0x3E, 0x26, 0x91, 0x03, 0x9A, 0x60, 0x94, 0x96, - 0xAA, 0xB6, 0x59, 0x94, 0x1C, 0xE8, 0x35, 0x90, 0xA9, 0xB4, 0xD0, 0xFE, 0xFA, 0x9F, 0x51, 0x29, - 0xDD, 0xC2, 0xCA, 0x36, 0x94, 0xE3, 0x6B, 0x66, 0x33, 0x49, 0xDC, 0x2B, 0x72, 0xE7, 0xC6, 0x04, - 0x97, 0x60, 0x82, 0xB1, 0x5D, 0xD4, 0x6B, 0x11, 0x3E, 0xE7, 0x09, 0x4B, 0x48, 0xCA, 0xA3, 0x01, - 0xE3, 0x7E, 0x84, 0xF9, 0x2A, 0xF4, 0x0D, 0xC7, 0x90, 0x9E, 0xB8, 0x81, 0x3B, 0xA0, 0xD1, 0x05, - 0x56, 0x35, 0x62, 0xB9, 0x18, 0x80, 0xDD, 0x37, 0x49, 0x44, 0xDC, 0xA1, 0x3F, 0x08, 0x76, 0xEA, - 0x43, 0x7A, 0x9D, 0xD4, 0xE1, 0xC3, 0xCD, 0x2E, 0x9E, 0xDE, 0xDE, 0xAC, 0xC1, 0x2F, 0xF8, 0x47, - 0x0F, 0xD4, 0x9D, 0xF8, 0xC3, 0xDB, 0x7D, 0x93, 0xA7, 0x13, 0xDF, 0xE1, 0xFB, 0x86, 0xAB, 0xF0, - 0xBE, 0x4E, 0x7C, 0x6F, 0xA7, 0x8E, 0x08, 0xF9, 0x19, 0x6A, 0x6F, 0x38, 0xAC, 0x13, 0x96, 0xE6, - 0x06, 0xBE, 0x86, 0xD1, 0x68, 0x95, 0x55, 0x5C, 0xE5, 0x4D, 0x25, 0xBA, 0x98, 0xA5, 0xA8, 0x0E, - 0x0B, 0xEA, 0x01, 0xC6, 0xD5, 0x70, 0x08, 0x29, 0xC9, 0xE1, 0x60, 0x80, 0xF1, 0x33, 0x40, 0xCF, - 0x1A, 0xA2, 0x5D, 0x4B, 0xA2, 0xEC, 0x1F, 0x46, 0xB7, 0xAC, 0xDE, 0xD9, 0xBB, 0xCF, 0xEC, 0x89, - 0x3B, 0x91, 0x00, 0xB7, 0xA6, 0xB0, 0xF3, 0x7E, 0x34, 0xBC, 0x49, 0x92, 0x71, 0x79, 0xF8, 0x9C, - 0x54, 0x51, 0x44, 0xD1, 0xBD, 0x3B, 0xE2, 0x41, 0x74, 0xB8, 0x76, 0xB3, 0x38, 0xBF, 0x9A, 0x65, - 0x93, 0x95, 0x36, 0x61, 0xD1, 0x50, 0xAA, 0x1A, 0x81, 0x09, 0x10, 0xD3, 0xE3, 0xA0, 0x1F, 0x8E, - 0x50, 0xCF, 0xA4, 0x15, 0x23, 0x1A, 0x8F, 0xC3, 0x20, 0x66, 0xA4, 0xB2, 0x54, 0x23, 0x22, 0x82, - 0x94, 0x1C, 0xF4, 0x7E, 0xE6, 0xF1, 0x9E, 0xB0, 0xF7, 0x08, 0xD9, 0xAE, 0xC1, 0xDC, 0x42, 0x96, - 0x8C, 0xE8, 0xCA, 0x8E, 0xCA, 0x86, 0xE9, 0x2B, 0xB0, 0x2A, 0x84, 0xF2, 0xC9, 0xE8, 0xD1, 0x22, - 0xF1, 0x22, 0x95, 0x86, 0x29, 0xF4, 0xE1, 0x55, 0xE2, 0xFA, 0x20, 0x98, 0x52, 0x05, 0xBB, 0xE0, - 0x5B, 0x2B, 0x9A, 0xC2, 0xCF, 0xA3, 0x80, 0xB2, 0x2A, 0xBA, 0xD8, 0xCA, 0xE3, 0x2E, 0xAA, 0x3D, - 0xD9, 0xA8, 0xA7, 0xE9, 0x43, 0x7E, 0xEB, 0x81, 0x2F, 0x62, 0x07, 0x8C, 0xB9, 0xC4, 0x82, 0x6A, - 0x83, 0xB7, 0xCF, 0x73, 0x1A, 0x96, 0x0F, 0x20, 0x56, 0xAA, 0x3C, 0x88, 0xBC, 0xF2, 0xD4, 0x81, - 0x14, 0x69, 0x07, 0x7E, 0xF3, 0xC1, 0x64, 0x74, 0xFC, 0x38, 0x03, 0x6A, 0xB0, 0xA5, 0xDA, 0xA0, - 0x4A, 0xBA, 0xE0, 0x30, 0xBC, 0x0B, 0xF0, 0xD0, 0x2F, 0x85, 0xBF, 0x32, 0x2D, 0x4C, 0x3D, 0x9C, - 0xDE, 0xD5, 0x83, 0x27, 0x11, 0xE4, 0xF1, 0xA1, 0x64, 0xE7, 0x12, 0xB8, 0x03, 0x66, 0xCD, 0xF8, - 0x78, 0xCD, 0xA0, 0xF5, 0x04, 0xE8, 0xF9, 0xA1, 0xAA, 0xFB, 0x64, 0xE3, 0x9D, 0xB9, 0xF4, 0x9D, - 0x9A, 0xB7, 0x3C, 0x7C, 0x12, 0xDF, 0x8B, 0xC6, 0x6C, 0x04, 0x18, 0xF2, 0x0B, 0xFA, 0x02, 0x4B, - 0x8C, 0x94, 0x06, 0x59, 0x6D, 0x59, 0xAA, 0x65, 0xC0, 0x3B, 0xF6, 0x3E, 0x34, 0xC5, 0x32, 0x2F, - 0x59, 0xF2, 0x26, 0xD1, 0x30, 0x09, 0xFB, 0x98, 0xF7, 0x09, 0x44, 0x70, 0x0D, 0x61, 0xFC, 0x1B, - 0xEB, 0x05, 0x9A, 0x35, 0x15, 0xAE, 0x7E, 0xCD, 0xE1, 0x63, 0xBA, 0x26, 0x34, 0x75, 0xFE, 0xE4, - 0x32, 0x7A, 0x76, 0x3C, 0x31, 0x1E, 0xA9, 0x70, 0xCB, 0xD1, 0xEA, 0x19, 0xFC, 0x94, 0xB9, 0xA0, - 0x85, 0xA1, 0x7E, 0x3B, 0xB5, 0x9F, 0xB6, 0x6F, 0x22, 0x7A, 0x8D, 0xF9, 0xA0, 0xD2, 0x7A, 0x99, - 0x1C, 0xE6, 0xF8, 0x58, 0x46, 0xB8, 0x42, 0x69, 0x48, 0x17, 0x4E, 0x25, 0xB3, 0x98, 0x58, 0xA7, - 0x67, 0x17, 0x86, 0xC2, 0x18, 0x5A, 0x3C, 0x85, 0xE4, 0x60, 0x95, 0x28, 0xDA, 0xC0, 0x8C, 0xA1, - 0xCD, 0x6B, 0x62, 0x1C, 0x6D, 0xF6, 0x4A, 0x4E, 0xB6, 0xAA, 0x65, 0xDB, 0x86, 0xDC, 0x53, 0xB5, - 0x8A, 0xE0, 0x53, 0x2D, 0xEA, 0x7B, 0x69, 0x62, 0x2F, 0xE7, 0xCC, 0x54, 0x0D, 0xDD, 0x86, 0x20, - 0xA4, 0x67, 0x04, 0x7C, 0xA7, 0x89, 0xED, 0x12, 0x84, 0xC5, 0xDB, 0x54, 0x9D, 0x8A, 0xB0, 0x99, - 0xE7, 0x43, 0x29, 0x87, 0x98, 0x0D, 0x81, 0x3D, 0x8B, 0x58, 0x75, 0x79, 0xBD, 0x37, 0xC4, 0x94, - 0x75, 0xA8, 0xB6, 0x3D, 0x83, 0x92, 0x2D, 0x57, 0xB3, 0x19, 0x2D, 0x55, 0x94, 0xAB, 0xF6, 0x6E, - 0xE7, 0x39, 0xBD, 0x06, 0x75, 0x7A, 0xC3, 0xF3, 0x2D, 0xE4, 0x37, 0x85, 0xE5, 0xDB, 0x14, 0x65, - 0x1F, 0x6E, 0x66, 0xB1, 0x61, 0x51, 0xFF, 0x6F, 0x7D, 0x7D, 0x32, 0x48, 0x29, 0x1D, 0xF0, 0xD7, - 0xCE, 0x92, 0xB2, 0x38, 0x70, 0x58, 0x73, 0x27, 0x6E, 0xE0, 0xD4, 0x5A, 0xBC, 0x78, 0xC7, 0x51, - 0x38, 0xC0, 0x6C, 0xDD, 0x00, 0x3A, 0xFD, 0xF5, 0xBD, 0x1B, 0x78, 0x43, 0x1A, 0x69, 0x6C, 0x66, - 0x60, 0xCC, 0xF6, 0x4C, 0x13, 0x61, 0x42, 0x60, 0x9E, 0xFD, 0x60, 0xA6, 0xB6, 0xFC, 0x21, 0x34, - 0x91, 0x58, 0x78, 0xA6, 0x96, 0xEE, 0x15, 0x7F, 0xEC, 0x97, 0xFD, 0xB7, 0xA4, 0xA5, 0x96, 0xAF, - 0x62, 0x4A, 0xA6, 0x0A, 0x39, 0x23, 0x90, 0xC6, 0x8C, 0x34, 0x81, 0x80, 0x34, 0xD0, 0x63, 0x1A, - 0xF5, 0x29, 0xF3, 0x62, 0xE0, 0x85, 0xED, 0x21, 0xCB, 0x36, 0x40, 0xD6, 0x08, 0xFF, 0x33, 0x09, - 0x13, 0x3C, 0x5E, 0xFE, 0x05, 0x4D, 0xF0, 0x72, 0x4A, 0x06, 0x01, 0x78, 0xDF, 0x8D, 0x24, 0x33, - 0xED, 0x89, 0x9B, 0xDC, 0xB4, 0xA3, 0x70, 0x02, 0x14, 0x09, 0xB8, 0x72, 0x4A, 0xB9, 0x89, 0x94, - 0xE0, 0x42, 0xDB, 0xE3, 0x58, 0x1A, 0xE2, 0x2C, 0xFC, 0x9F, 0x42, 0x3E, 0xA9, 0x27, 0xA5, 0xA8, - 0x64, 0x86, 0x07, 0x41, 0xF5, 0x2E, 0x86, 0xAC, 0x3A, 0xC6, 0xED, 0x51, 0x09, 0xA6, 0x9A, 0x94, - 0x08, 0xB3, 0x45, 0xEE, 0x30, 0x8D, 0x69, 0x30, 0xE0, 0xE2, 0x0E, 0xDB, 0x10, 0x26, 0xE3, 0xEC, - 0x4D, 0xC1, 0x9A, 0x3D, 0x71, 0xA0, 0x26, 0x21, 0x1A, 0x43, 0xA7, 0xE1, 0xE6, 0x39, 0x36, 0x48, - 0x96, 0x64, 0x63, 0x2A, 0x43, 0x73, 0xE3, 0xE5, 0x92, 0x66, 0x3F, 0xFF, 0x9A, 0xE9, 0x7C, 0x4C, - 0x91, 0xC1, 0xCD, 0x62, 0xFB, 0x0F, 0xC7, 0xDE, 0xCC, 0xC4, 0xCB, 0x9C, 0x91, 0xC5, 0x7F, 0x3E, - 0xB6, 0xBC, 0x75, 0x81, 0x52, 0x4F, 0x87, 0x2B, 0x4F, 0x8E, 0xF9, 0xE0, 0xEE, 0x21, 0x84, 0x0C, - 0xB0, 0x04, 0x3A, 0xE9, 0x8F, 0xF7, 0x71, 0xB9, 0x35, 0x1F, 0xDB, 0xE3, 0x11, 0x1A, 0x67, 0xB7, - 0x89, 0x1E, 0x25, 0x8C, 0x49, 0xE3, 0x95, 0x0A, 0xA5, 0xF1, 0xB4, 0xDC, 0x84, 0x0B, 0x68, 0x0A, - 0xA2, 0xDF, 0x0A, 0xCE, 0x9D, 0xDC, 0xF8, 0x5C, 0xDC, 0x2C, 0x93, 0x99, 0x94, 0x3E, 0xF6, 0x68, - 0xB8, 0x94, 0x53, 0xED, 0xD5, 0xC6, 0x8B, 0xA2, 0x9D, 0xC1, 0xC4, 0x9B, 0xDA, 0xE7, 0x4F, 0x5E, - 0x79, 0x70, 0x34, 0xEF, 0xD5, 0xC4, 0x9B, 0xAB, 0x57, 0xC5, 0xCD, 0xA4, 0x5E, 0x65, 0x14, 0x68, - 0x1D, 0xEB, 0x38, 0x9D, 0x2C, 0x95, 0xDE, 0x63, 0xD1, 0x68, 0xA6, 0x4F, 0x7C, 0x16, 0xF5, 0xF0, - 0xA2, 0x2F, 0xA2, 0x92, 0xD3, 0x8A, 0xB3, 0x0D, 0x5E, 0xDE, 0x6A, 0xAE, 0x41, 0x34, 0x9A, 0xF3, - 0xC9, 0xCD, 0xC8, 0x13, 0x45, 0x40, 0xE0, 0x0C, 0x03, 0xEA, 0xDD, 0xF4, 0xC7, 0x25, 0x5D, 0x16, - 0x25, 0x87, 0xEF, 0x0F, 0xCE, 0x0A, 0xFA, 0x29, 0xE5, 0xDF, 0x38, 0x3E, 0x9B, 0xAF, 0xAF, 0x52, - 0x72, 0x8C, 0x2A, 0x20, 0xD4, 0x0E, 0x40, 0xE1, 0x5D, 0x18, 0x7D, 0x67, 0x9E, 0x52, 0x7A, 0xAE, - 0x5F, 0xDD, 0xBF, 0x0E, 0xBF, 0xDE, 0xF9, 0xD7, 0xFE, 0x29, 0x6F, 0x53, 0x39, 0x69, 0xAD, 0xD4, - 0xE6, 0x5B, 0x1D, 0xD3, 0xF9, 0x67, 0x65, 0x7F, 0xDE, 0xE9, 0xF5, 0x8C, 0x2D, 0xBC, 0xB6, 0xD3, - 0x94, 0x31, 0x16, 0x6E, 0x34, 0x91, 0xE3, 0x72, 0x45, 0xDC, 0x4B, 0x6A, 0x6F, 0xA4, 0x38, 0x4D, - 0x3D, 0x8B, 0xBB, 0x96, 0x85, 0x5F, 0x35, 0xAB, 0xB2, 0xE2, 0x82, 0xD7, 0x0D, 0x4E, 0xE9, 0x5D, - 0x9A, 0x0B, 0x4B, 0x1D, 0x74, 0x8D, 0x9B, 0xC6, 0xC5, 0x16, 0x0E, 0xD5, 0x49, 0x3C, 0x10, 0x6F, - 0x64, 0xA6, 0xC9, 0x9F, 0x0E, 0x04, 0x4C, 0x28, 0xC1, 0x24, 0x63, 0xBF, 0xF8, 0x6F, 0x7D, 0xB6, - 0xC4, 0x10, 0x3F, 0x26, 0x74, 0x34, 0x4E, 0x1E, 0x14, 0x71, 0xB5, 0xEF, 0xD1, 0x45, 0x5C, 0xE3, - 0x81, 0x46, 0x5E, 0xA1, 0x23, 0x82, 0xA0, 0xA4, 0x90, 0x08, 0x90, 0x9F, 0x00, 0xE3, 0x94, 0xF1, - 0xE9, 0xA7, 0x90, 0x20, 0x49, 0x35, 0x23, 0x89, 0x1F, 0xCB, 0xDD, 0xCE, 0xE5, 0x0D, 0xED, 0x09, - 0x8A, 0x45, 0x04, 0xCE, 0xC4, 0xB0, 0x35, 0x4A, 0xDF, 0x8B, 0x66, 0x00, 0x08, 0x8E, 0x35, 0xBB, - 0x79, 0x3C, 0xFB, 0x25, 0x96, 0xE4, 0x6C, 0x18, 0x8B, 0x55, 0x70, 0x3E, 0x81, 0x2A, 0x93, 0x1D, - 0x09, 0x76, 0xA1, 0xE8, 0x48, 0x3D, 0x58, 0xD9, 0x91, 0x5B, 0xE4, 0xE7, 0x11, 0xFE, 0xF4, 0xB5, - 0x5A, 0x92, 0xFA, 0x60, 0x41, 0xA1, 0x3E, 0x16, 0xAA, 0xC6, 0x3B, 0x3F, 0x90, 0x06, 0x43, 0x7A, - 0x7D, 0x95, 0xDD, 0x63, 0x17, 0x91, 0x61, 0xB4, 0x6D, 0x61, 0xF5, 0x0C, 0x95, 0x9A, 0x59, 0x7D, - 0x5A, 0x53, 0x36, 0x6C, 0xAD, 0x7C, 0x6C, 0xB4, 0xFA, 0xBA, 0x48, 0x63, 0x8E, 0xAC, 0xDC, 0x17, - 0x56, 0xCE, 0x63, 0x97, 0xCA, 0x0A, 0xB3, 0x67, 0x00, 0x84, 0xD7, 0xE2, 0xAC, 0x99, 0x82, 0x6B, - 0xDA, 0x33, 0x70, 0xA9, 0x15, 0x24, 0xB7, 0x50, 0x09, 0xA9, 0x35, 0x6F, 0xA2, 0x41, 0x59, 0x41, - 0xF6, 0x44, 0x56, 0x0F, 0x30, 0x58, 0xE7, 0xA5, 0x92, 0xF3, 0xAF, 0x00, 0x6D, 0xD3, 0x62, 0x07, - 0xA9, 0x1D, 0x60, 0x43, 0x36, 0x01, 0x04, 0x6D, 0x28, 0x61, 0x05, 0x00, 0x24, 0xEF, 0xD3, 0xA9, - 0x33, 0x4B, 0x10, 0x9B, 0x65, 0x88, 0x23, 0xB0, 0xD4, 0xC6, 0xE9, 0xF3, 0xB7, 0xBA, 0x76, 0xCE, - 0x10, 0xFD, 0xCC, 0x2B, 0x35, 0xAE, 0xD5, 0xBF, 0xD5, 0x6E, 0x16, 0xE2, 0x95, 0x1F, 0x3C, 0xD2, - 0x20, 0xB0, 0xCC, 0x35, 0x47, 0xE7, 0xE7, 0x1F, 0xCF, 0x6B, 0x73, 0xEA, 0x2A, 0x60, 0x0B, 0xDF, - 0x30, 0x90, 0x20, 0x4C, 0x88, 0x7B, 0x0B, 0x3B, 0x49, 0x6E, 0xFB, 0xDF, 0xD6, 0xD7, 0x39, 0xCF, - 0xBF, 0x7D, 0x47, 0x13, 0x45, 0x3F, 0x69, 0xFB, 0x8F, 0xA9, 0x3A, 0x4C, 0x77, 0x8F, 0xD2, 0xD5, - 0xA1, 0x12, 0x19, 0x6F, 0xEB, 0xEA, 0xC1, 0xA7, 0xF3, 0xF3, 0xA3, 0xD3, 0x0B, 0x6B, 0x67, 0x0B, - 0xFB, 0x99, 0xD2, 0x82, 0x2A, 0x79, 0x32, 0x46, 0x95, 0x88, 0xDE, 0x11, 0xBF, 0x4D, 0x0F, 0x15, - 0x85, 0xAF, 0x23, 0xD3, 0xF7, 0xE0, 0xCC, 0xDB, 0x03, 0xC8, 0xBD, 0xAD, 0x31, 0x0F, 0x53, 0x85, - 0x1D, 0xDB, 0xE5, 0x90, 0x0A, 0x48, 0x52, 0x13, 0x22, 0x22, 0xFC, 0xB3, 0xC2, 0xD3, 0x93, 0x5D, - 0x30, 0xD5, 0x56, 0xB2, 0x78, 0x8A, 0x84, 0x27, 0x56, 0x1E, 0x1A, 0x37, 0x06, 0xC6, 0x6C, 0x7F, - 0xDE, 0x75, 0xF8, 0x07, 0x19, 0x6F, 0xFB, 0xF2, 0x5E, 0x4D, 0x1B, 0x18, 0x52, 0x6F, 0x8E, 0x0C, - 0xF0, 0xE1, 0x9D, 0xC8, 0xB3, 0x88, 0xF6, 0xA1, 0x6B, 0xB9, 0x97, 0xFF, 0xDA, 0x05, 0xD8, 0x77, - 0x01, 0x96, 0x35, 0x56, 0x15, 0xD7, 0x67, 0x59, 0x61, 0x55, 0x94, 0xD6, 0xF5, 0x55, 0xA3, 0xAA, - 0x60, 0x75, 0x1D, 0x70, 0xE0, 0xF2, 0x74, 0x93, 0x9D, 0x1E, 0x52, 0xFF, 0x4B, 0xD4, 0xAD, 0x9D, - 0x5A, 0x71, 0xBA, 0x5D, 0x2B, 0x3D, 0xCD, 0x02, 0xC5, 0x9D, 0x02, 0xB4, 0xAC, 0x4B, 0x4F, 0x36, - 0xEF, 0xA6, 0xAD, 0x01, 0x4C, 0x5B, 0xA4, 0xDC, 0x50, 0x67, 0x83, 0x9A, 0x1F, 0xDB, 0x38, 0x64, - 0x85, 0x89, 0x9B, 0x92, 0x20, 0x32, 0xCC, 0x0A, 0x13, 0x5A, 0x6A, 0xCE, 0xB1, 0x6F, 0x56, 0x0A, - 0x39, 0x36, 0xC3, 0xEC, 0xD5, 0x10, 0x71, 0xBB, 0x9E, 0x91, 0x67, 0xB6, 0xAA, 0x4E, 0xD7, 0xA0, - 0x29, 0xD7, 0x10, 0x3A, 0xA6, 0x1D, 0xD3, 0x3A, 0xA8, 0x65, 0xB9, 0x36, 0x9C, 0x17, 0xDF, 0xF9, - 0xB7, 0x34, 0x20, 0x2E, 0xA6, 0x52, 0x8F, 0xEA, 0xE8, 0xA8, 0x17, 0xB1, 0x1C, 0xBE, 0x49, 0xF4, - 0x80, 0x4B, 0x58, 0xFA, 0xA2, 0x35, 0x77, 0x3B, 0x79, 0x18, 0x73, 0x2F, 0x46, 0x71, 0x5E, 0x53, - 0x1F, 0xB3, 0x25, 0x7E, 0x40, 0x0E, 0x0F, 0xDB, 0x5E, 0xFA, 0x93, 0xBD, 0xE7, 0x9A, 0x0D, 0x89, - 0xF9, 0x3C, 0x36, 0x22, 0x3D, 0x0A, 0x00, 0x97, 0x76, 0x0A, 0x36, 0x9E, 0x92, 0x25, 0x73, 0x3E, - 0x91, 0xAD, 0xBC, 0x4A, 0x19, 0xDF, 0xC8, 0xF1, 0x6B, 0x99, 0x1E, 0x45, 0x77, 0x4C, 0x5B, 0x81, - 0x47, 0xFB, 0xFE, 0xC8, 0x1D, 0xDA, 0x8A, 0xB8, 0x46, 0xFB, 0x78, 0xFD, 0x81, 0xB2, 0x94, 0xC7, - 0xC6, 0x4D, 0xA5, 0xED, 0xA5, 0x6A, 0x9E, 0x0C, 0x10, 0x03, 0xA1, 0x50, 0xDE, 0xC8, 0xDD, 0x8D, - 0xCB, 0x16, 0xB9, 0x01, 0xE3, 0x3F, 0xB0, 0x7A, 0x12, 0x4B, 0x1A, 0xBC, 0xEF, 0x06, 0x84, 0x22, - 0x63, 0x98, 0x72, 0xF5, 0x83, 0x5B, 0xF6, 0xC2, 0x15, 0x46, 0xB9, 0xC5, 0x69, 0x9D, 0x3D, 0xC2, - 0x3F, 0xF2, 0x6A, 0x98, 0x2B, 0x3C, 0x0C, 0x86, 0x0F, 0xE2, 0x4A, 0x33, 0x6E, 0x91, 0xD5, 0x16, - 0x7A, 0x5C, 0xB5, 0xD8, 0x80, 0xB5, 0xB5, 0xDB, 0x3A, 0xF9, 0x61, 0x9A, 0x74, 0x08, 0x0C, 0x35, - 0xAD, 0x85, 0xF0, 0xC4, 0x9E, 0x3F, 0xF0, 0x93, 0x7C, 0xC8, 0x40, 0x15, 0x37, 0xAD, 0x0F, 0x7F, - 0xA9, 0x7C, 0x63, 0xDB, 0x00, 0x2B, 0xBF, 0x56, 0x56, 0xCA, 0x53, 0x2C, 0xC9, 0x98, 0x10, 0x4E, - 0x7D, 0xB5, 0xDE, 0xCC, 0x47, 0x71, 0x65, 0x05, 0x79, 0x89, 0x99, 0x94, 0x07, 0x61, 0xE8, 0x55, - 0x69, 0x4E, 0xA0, 0x79, 0x3E, 0xD8, 0xB3, 0xB7, 0x6F, 0x23, 0x7A, 0xA9, 0x6F, 0xA5, 0x10, 0x52, - 0x93, 0xC6, 0x9C, 0x4F, 0x53, 0xB3, 0xFB, 0x6D, 0x76, 0x10, 0xC2, 0x77, 0xC6, 0x30, 0x5A, 0x4E, - 0x11, 0x02, 0x16, 0xEA, 0x68, 0xDC, 0x96, 0xC1, 0x89, 0x00, 0x65, 0x69, 0x1C, 0xC6, 0xB1, 0x8F, - 0x4E, 0x60, 0x5C, 0x32, 0x70, 0xD6, 0x66, 0x42, 0x93, 0xCF, 0x50, 0xE9, 0xCB, 0xC9, 0x49, 0x7B, - 0xC4, 0x7F, 0xA4, 0x8F, 0xC4, 0xFA, 0x75, 0xD5, 0xFA, 0xF5, 0xE4, 0xA4, 0xD7, 0x6B, 0xC7, 0xEC, - 0x47, 0x85, 0x40, 0x6C, 0xDF, 0x01, 0xC6, 0xAA, 0xF4, 0x3D, 0xD7, 0x66, 0x8A, 0xE0, 0xEC, 0x62, - 0x8C, 0xCC, 0xE2, 0x5C, 0xFC, 0xDF, 0xE8, 0x22, 0x17, 0x84, 0x6D, 0xB2, 0x01, 0xB3, 0xEF, 0x95, - 0xB3, 0xBE, 0xBE, 0xF1, 0xC2, 0xC1, 0x69, 0xC7, 0x78, 0xD9, 0x96, 0x7C, 0xF4, 0x72, 0x2D, 0xB0, - 0x4B, 0xBA, 0xCB, 0xC0, 0xFC, 0x11, 0x67, 0xA3, 0xC3, 0x42, 0x56, 0x61, 0xDA, 0x75, 0xF1, 0xD5, - 0xA8, 0xF0, 0x0E, 0x1F, 0x26, 0xDB, 0x70, 0x88, 0xB3, 0x49, 0xBA, 0x9B, 0xED, 0xAE, 0xB3, 0xF1, - 0xCA, 0x46, 0x4B, 0xAE, 0xA9, 0x76, 0xC9, 0xFA, 0x92, 0x49, 0xE9, 0x32, 0x6A, 0xD6, 0x73, 0x6A, - 0x56, 0x3B, 0xCE, 0xE6, 0x6A, 0xA7, 0xB3, 0xEA, 0x6C, 0xB6, 0x3B, 0x5B, 0x5D, 0x2B, 0x3D, 0x76, - 0x6D, 0xB7, 0x8B, 0xCE, 0xAF, 0x4B, 0xA2, 0xED, 0x05, 0x12, 0x75, 0x4D, 0xEF, 0x68, 0xC4, 0x09, - 0xEA, 0x74, 0x90, 0x9C, 0x97, 0x2F, 0x5F, 0xBD, 0xEA, 0x92, 0xC6, 0x21, 0x17, 0x30, 0xAC, 0xC2, - 0x7F, 0x6B, 0x66, 0x44, 0xCA, 0xFB, 0xE1, 0x80, 0x0E, 0xDC, 0x04, 0x94, 0x69, 0xCF, 0x1F, 0x04, - 0xDA, 0x4E, 0x43, 0x9D, 0xCE, 0x4E, 0xAE, 0x4D, 0x24, 0xED, 0x95, 0x95, 0xF3, 0xED, 0x1A, 0x3A, - 0x9A, 0xEE, 0x49, 0xDA, 0xAE, 0x85, 0xFC, 0xAB, 0xF3, 0x57, 0xC0, 0xCE, 0x99, 0x37, 0x2A, 0x28, - 0x35, 0xC6, 0x0E, 0xAE, 0x53, 0x24, 0xC7, 0x74, 0x95, 0x0E, 0x2D, 0x10, 0x29, 0x1B, 0xDB, 0xD5, - 0x55, 0xF6, 0x10, 0x3A, 0xA8, 0x8A, 0x7C, 0xB8, 0x5D, 0xFE, 0x22, 0xBA, 0x1F, 0xF0, 0xC4, 0x79, - 0xAC, 0x84, 0x72, 0xBD, 0xDE, 0x62, 0xE7, 0x7C, 0x16, 0x30, 0x2B, 0xD0, 0xA6, 0x78, 0x48, 0x0C, - 0x88, 0x2C, 0xD6, 0x30, 0x79, 0x5D, 0x03, 0x25, 0x8C, 0x36, 0x60, 0x69, 0x09, 0x14, 0x5F, 0x0A, - 0xC6, 0x16, 0x8A, 0x5F, 0xE0, 0xC5, 0x4F, 0x61, 0xE9, 0x16, 0xA8, 0xFE, 0xB5, 0x35, 0xCB, 0xCC, - 0x57, 0x9E, 0x63, 0x98, 0x7F, 0x19, 0xE7, 0x90, 0x15, 0xDF, 0x02, 0x1E, 0x1A, 0x9C, 0xE0, 0x45, - 0x01, 0xF7, 0x76, 0x67, 0x57, 0xA8, 0xC0, 0xDE, 0xA0, 0x9F, 0x06, 0x61, 0xE5, 0xDB, 0x09, 0x36, - 0x4E, 0xB0, 0x59, 0x25, 0x42, 0x78, 0x54, 0x30, 0x42, 0xD1, 0xA8, 0x30, 0x24, 0xD8, 0x3C, 0xFC, - 0xCA, 0x91, 0x81, 0x48, 0x8B, 0x61, 0x5E, 0x6F, 0x75, 0x27, 0x53, 0x5A, 0xFC, 0xBE, 0x58, 0x8D, - 0xD9, 0x62, 0xEF, 0xB9, 0xF9, 0xC1, 0x24, 0x61, 0x6E, 0x27, 0x25, 0xA8, 0x32, 0x44, 0x27, 0x27, - 0xAA, 0xBF, 0xEF, 0x5B, 0x1F, 0x16, 0x6F, 0x58, 0x78, 0xD4, 0xA5, 0x38, 0x5F, 0xB2, 0x99, 0x1F, - 0xFE, 0xC7, 0x6B, 0xF6, 0xBC, 0x36, 0x0E, 0xCB, 0x6A, 0xC7, 0x30, 0xB8, 0x2F, 0x3A, 0x06, 0x97, - 0xA7, 0x1F, 0x2F, 0x0F, 0x8F, 0x0E, 0x8E, 0x4F, 0xF6, 0x3E, 0x18, 0xC3, 0x11, 0x53, 0x58, 0x9D, - 0x3C, 0xEC, 0x5C, 0x46, 0x92, 0xC6, 0x77, 0x45, 0x36, 0xF8, 0x19, 0x8D, 0x37, 0xB1, 0xB2, 0x2E, - 0x9F, 0x5B, 0x0A, 0xC7, 0xE5, 0x36, 0x29, 0x3F, 0xFF, 0x92, 0xF1, 0x4D, 0xB4, 0x40, 0xD6, 0x49, - 0x0F, 0x81, 0x58, 0xB6, 0x5F, 0x29, 0xBA, 0x95, 0x1C, 0xCA, 0x1A, 0xD9, 0x82, 0x65, 0x81, 0xC5, - 0xF1, 0xA5, 0x48, 0xD6, 0xC8, 0xFA, 0x16, 0x46, 0xBC, 0x37, 0xB7, 0x8D, 0xD0, 0x56, 0x1D, 0x66, - 0xD3, 0x8A, 0xE8, 0x2F, 0x38, 0x0C, 0x05, 0x47, 0xAC, 0x05, 0xE7, 0xE4, 0x66, 0xE9, 0x9C, 0xDC, - 0xC8, 0xE6, 0xA4, 0xBA, 0x44, 0x2F, 0x71, 0x4A, 0x56, 0x9E, 0x90, 0xF9, 0x4C, 0x54, 0x04, 0xA2, - 0x68, 0x1A, 0xEA, 0x13, 0x62, 0xE6, 0x89, 0x57, 0x3C, 0xED, 0xEC, 0x92, 0xA9, 0x72, 0x88, 0xF9, - 0x99, 0x8A, 0x16, 0x16, 0xD0, 0x05, 0x62, 0x39, 0xAB, 0x94, 0x69, 0x02, 0x25, 0xAF, 0x13, 0x95, - 0x24, 0x49, 0x93, 0x25, 0x45, 0x70, 0x3A, 0x7C, 0xE8, 0x57, 0x9F, 0x6C, 0xEC, 0x2F, 0x4F, 0x4E, - 0x2E, 0x0F, 0xF7, 0x7A, 0xEF, 0x0D, 0x09, 0x10, 0xDE, 0x50, 0xB9, 0x4E, 0x12, 0xE1, 0x13, 0xAB, - 0x46, 0xC0, 0x4D, 0x3E, 0xDC, 0xF2, 0x53, 0xF5, 0xCE, 0x37, 0x49, 0x44, 0x8A, 0x06, 0x51, 0x6E, - 0xD0, 0xF9, 0x26, 0xA9, 0x4B, 0x73, 0x1C, 0x9F, 0x7B, 0x54, 0x8A, 0xC7, 0xA4, 0x9B, 0x8D, 0x49, - 0xBA, 0xDD, 0x7D, 0x82, 0x31, 0x01, 0x05, 0xFD, 0x03, 0x0E, 0xCB, 0x0F, 0xB5, 0x8A, 0x49, 0x6C, - 0xAA, 0xB6, 0x98, 0xC9, 0xDD, 0xEA, 0xE6, 0xDD, 0xB2, 0xAC, 0x66, 0x4F, 0xB1, 0xD0, 0x2C, 0x26, - 0x81, 0xDA, 0x0A, 0xC3, 0x45, 0x30, 0x37, 0xCA, 0x2C, 0x59, 0x02, 0xB7, 0xA7, 0xB1, 0x22, 0xD7, - 0xBE, 0x4F, 0xD7, 0x49, 0xA1, 0xFB, 0xC8, 0x53, 0xEA, 0xBE, 0xCA, 0xF3, 0x8B, 0xFC, 0xFF, 0xA8, - 0xF6, 0xD4, 0xF1, 0xE8, 0x66, 0xE3, 0x41, 0x9E, 0xEA, 0x70, 0xC0, 0xA7, 0xF4, 0x0F, 0x36, 0x28, - 0x3F, 0xA2, 0xD2, 0xFB, 0x3D, 0xEA, 0xBB, 0xD4, 0x94, 0xA4, 0x5C, 0xE2, 0x58, 0xDA, 0xF1, 0x7B, - 0x1C, 0x4B, 0x41, 0x96, 0x2D, 0xE3, 0x55, 0x53, 0x0F, 0xEC, 0xB4, 0x30, 0x5D, 0x7A, 0xA6, 0x31, - 0xB5, 0x95, 0x4B, 0x46, 0x6F, 0xB4, 0xAE, 0xE6, 0xB1, 0x8F, 0x2D, 0x12, 0x4E, 0x12, 0xFC, 0xC3, - 0x15, 0x86, 0x74, 0x6C, 0xD5, 0x0B, 0x55, 0xBB, 0x38, 0xDA, 0x76, 0xAF, 0x80, 0x29, 0x23, 0x4A, - 0xEA, 0xDA, 0x34, 0xA9, 0xB7, 0x08, 0x4D, 0xFA, 0xEA, 0xBB, 0x8D, 0x48, 0x3D, 0x23, 0x46, 0x22, - 0xAE, 0x65, 0x93, 0x8E, 0x02, 0x1B, 0xBA, 0xB0, 0x23, 0x2A, 0x77, 0x84, 0xFC, 0x40, 0x63, 0x91, - 0xAF, 0xEA, 0x02, 0xD6, 0xB4, 0xCF, 0xE6, 0x5C, 0x9C, 0xF2, 0x6F, 0x4D, 0x89, 0xE1, 0xC6, 0x9D, - 0xAB, 0x4C, 0x48, 0xD1, 0xCD, 0xD4, 0x82, 0xA4, 0x5E, 0xCA, 0x07, 0x0F, 0x38, 0x41, 0x2D, 0x08, - 0x6E, 0xB9, 0xD0, 0xD2, 0x8D, 0xF5, 0xB2, 0x61, 0xF6, 0x3E, 0x9F, 0xEC, 0x7F, 0xFC, 0xC0, 0xA1, - 0x1A, 0xF1, 0x21, 0xC3, 0x30, 0x18, 0xB0, 0x0C, 0x19, 0x87, 0x74, 0x10, 0x51, 0xDD, 0x3C, 0x61, - 0x0E, 0x88, 0x36, 0xC6, 0x70, 0x46, 0xD2, 0x21, 0xD8, 0x2B, 0xC2, 0xCC, 0xDD, 0x72, 0x8C, 0x83, - 0x74, 0x56, 0xFC, 0x86, 0x14, 0x2B, 0xBD, 0x6C, 0xD6, 0x17, 0x48, 0x59, 0xDF, 0x9C, 0xCE, 0x2F, - 0x9A, 0x96, 0x84, 0x54, 0x0B, 0x0E, 0x75, 0x21, 0x7D, 0xD9, 0xB4, 0x32, 0x78, 0xB9, 0x02, 0x33, - 0x8D, 0x29, 0x9E, 0xB4, 0xEA, 0xB6, 0xE5, 0x76, 0x61, 0x49, 0x52, 0x33, 0x1F, 0x79, 0xAB, 0xCF, - 0x42, 0x1F, 0x97, 0xC0, 0xF9, 0x28, 0xFC, 0xAF, 0xFF, 0x54, 0x49, 0xC4, 0x6F, 0xF5, 0x9A, 0x46, - 0xE8, 0x5C, 0x90, 0x89, 0xB5, 0xEF, 0xCB, 0xD7, 0x38, 0x97, 0xB2, 0xD1, 0x71, 0x19, 0x4A, 0x67, - 0xB9, 0xF0, 0xA4, 0x43, 0xD1, 0x13, 0x80, 0x95, 0x95, 0xCF, 0xF2, 0xFA, 0x2F, 0xED, 0x66, 0x9E, - 0x80, 0xE6, 0x27, 0x05, 0xAE, 0x1D, 0x3E, 0x7F, 0x57, 0x6A, 0x59, 0xA1, 0xFC, 0xC4, 0x66, 0xEF, - 0x9E, 0x89, 0x72, 0x01, 0xA1, 0x9C, 0xF2, 0xEA, 0x8B, 0xC2, 0xD6, 0x13, 0x2C, 0x0A, 0xBD, 0xDE, - 0xFC, 0xCB, 0x82, 0xC1, 0xA9, 0xE7, 0x5A, 0x2E, 0x84, 0x14, 0x2E, 0xB0, 0x62, 0xD8, 0x48, 0x5F, - 0x7D, 0x2E, 0xDA, 0x17, 0x5F, 0x4D, 0x6C, 0xE4, 0xD7, 0xCD, 0x65, 0xE6, 0x6F, 0xB5, 0xDA, 0x93, - 0xF5, 0xA2, 0x39, 0xFF, 0x92, 0x65, 0xA3, 0x9E, 0x3C, 0x39, 0xF3, 0x35, 0xB5, 0xBB, 0x7C, 0xB1, - 0x97, 0xE2, 0x20, 0xED, 0x5A, 0x62, 0xC9, 0x62, 0xB4, 0x68, 0x5F, 0xCA, 0xC7, 0xE2, 0xB9, 0x7B, - 0xA3, 0x2D, 0x2B, 0x4F, 0x31, 0xB7, 0x4B, 0xBB, 0x64, 0x89, 0xE0, 0x51, 0x51, 0x9A, 0x9E, 0x8D, - 0xA9, 0x1F, 0x51, 0x1F, 0x56, 0xBF, 0xB4, 0xD9, 0xDA, 0xDF, 0xBC, 0xB5, 0x76, 0x82, 0xC1, 0xCF, - 0xFD, 0xE6, 0x36, 0xD1, 0xD3, 0x38, 0xA4, 0x77, 0xF1, 0x70, 0xA2, 0x6E, 0xF1, 0xCC, 0x63, 0x70, - 0xFC, 0xBD, 0x89, 0x14, 0x67, 0x48, 0x9E, 0x3A, 0x6D, 0x17, 0x4F, 0xDD, 0x69, 0xF4, 0xD1, 0xAA, - 0xE4, 0x40, 0x02, 0x9F, 0xD5, 0x83, 0x3E, 0xD6, 0x53, 0x92, 0x7D, 0x89, 0xCC, 0x6A, 0x2B, 0x08, - 0x19, 0xBD, 0x3F, 0x95, 0x72, 0x0E, 0x7D, 0x85, 0x67, 0x9F, 0x55, 0x6D, 0x01, 0x81, 0x72, 0xFA, - 0x17, 0xD0, 0x5D, 0x32, 0x86, 0x76, 0x3C, 0x13, 0x53, 0x6A, 0x07, 0x90, 0x22, 0x94, 0x45, 0x51, - 0xEE, 0x06, 0x57, 0x76, 0x98, 0x8F, 0xEF, 0xFC, 0xA4, 0x7F, 0x43, 0x4A, 0xEB, 0x30, 0xC7, 0x02, - 0xFE, 0xD6, 0xE6, 0x6B, 0x3D, 0x97, 0x2E, 0x1F, 0x97, 0xDA, 0xA7, 0xE0, 0x7B, 0x60, 0x7B, 0xBD, - 0x51, 0xCF, 0xE3, 0xDC, 0xC7, 0x50, 0xE1, 0x46, 0x65, 0x23, 0x40, 0x11, 0x3A, 0xD9, 0xE0, 0xB1, - 0x64, 0x9C, 0x70, 0x26, 0x2B, 0xC6, 0x9A, 0x9B, 0x46, 0x97, 0x8C, 0xF5, 0xB2, 0x14, 0x2D, 0x79, - 0x4A, 0xBC, 0x7C, 0xD9, 0x2E, 0x46, 0xBE, 0xFA, 0x64, 0xC8, 0xD9, 0x4E, 0xA7, 0x8C, 0xD9, 0x99, - 0xE1, 0xEA, 0x09, 0x7A, 0x5D, 0x8A, 0x5A, 0xB1, 0x9A, 0x3D, 0x41, 0xAF, 0x65, 0xA5, 0x5A, 0xCE, - 0x80, 0x27, 0xE9, 0x79, 0x35, 0xF4, 0x9C, 0x09, 0x4F, 0x43, 0x80, 0xBE, 0xB2, 0x94, 0x8A, 0xDF, - 0xEA, 0x14, 0x2A, 0x1E, 0xD5, 0x45, 0x42, 0x51, 0x46, 0x8F, 0xFF, 0x0F, 0x5B, 0x42, 0xD4, 0x3C, - 0xED, 0x1D, 0x00 + 0x1F, 0x8B, 0x08, 0x08, 0x9A, 0xA8, 0x04, 0x66, 0x02, 0xFF, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 0x6A, + 0x73, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xEB, 0x7A, 0xDB, 0xBA, 0xB1, 0xE8, 0xFF, + 0x7E, 0x5F, 0xDF, 0x01, 0xD5, 0xE9, 0xA9, 0xA4, 0x5A, 0x96, 0x29, 0xF9, 0x92, 0x8B, 0x63, 0xEF, + 0xE3, 0x5B, 0x12, 0xEF, 0xC6, 0x8E, 0x3F, 0xCB, 0x59, 0x6B, 0x25, 0x69, 0x8E, 0x37, 0x2D, 0xC2, + 0x32, 0x1B, 0x89, 0xD4, 0x21, 0x29, 0xCB, 0x6E, 0xEB, 0x77, 0xDA, 0xCF, 0xB0, 0x9F, 0x6C, 0xCF, + 0x00, 0x20, 0x89, 0x1B, 0x29, 0x4A, 0x96, 0xBD, 0xB2, 0xD7, 0xA9, 0xBF, 0x36, 0xCB, 0x26, 0x80, + 0x99, 0xC1, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x83, 0x5B, 0x37, 0x22, 0x03, 0x37, 0xA1, 0x53, 0xF7, + 0x9E, 0xEC, 0x90, 0xFF, 0x98, 0xC6, 0xAF, 0xD7, 0xD6, 0xFE, 0xF8, 0x8F, 0xA9, 0x1F, 0x78, 0xE1, + 0xB4, 0x3D, 0x0C, 0xFB, 0x6E, 0xE2, 0x87, 0x41, 0xFB, 0x26, 0x8C, 0x93, 0xC0, 0x1D, 0xD1, 0x87, + 0xB5, 0x69, 0xFC, 0x1F, 0xDB, 0xBF, 0xFF, 0xDD, 0x2D, 0xB4, 0x9A, 0xD2, 0xAB, 0x38, 0xEC, 0x7F, + 0xA7, 0x09, 0xFC, 0xFD, 0xFB, 0xDF, 0x89, 0x16, 0xAE, 0xE7, 0x1D, 0xDD, 0xD2, 0x20, 0xF9, 0xE0, + 0xC7, 0x09, 0x0D, 0x68, 0xD4, 0xA8, 0x0F, 0x43, 0xD7, 0xAB, 0xB7, 0x48, 0x18, 0x7C, 0x80, 0x5F, + 0x9A, 0xAC, 0xEE, 0xF5, 0x24, 0xE8, 0x23, 0x58, 0xF1, 0xB1, 0x41, 0xB1, 0x45, 0x93, 0xFC, 0xE3, + 0xF7, 0xBF, 0x23, 0xF0, 0xE3, 0x07, 0x7E, 0xF2, 0x33, 0xBD, 0xEA, 0x31, 0xD8, 0x0D, 0x6C, 0xF1, + 0xA0, 0x34, 0xD2, 0xCA, 0xD3, 0x66, 0x19, 0x39, 0xD0, 0x8D, 0x80, 0x4E, 0x49, 0x5E, 0x45, 0x74, + 0x0F, 0x21, 0x29, 0x15, 0xDB, 0x61, 0x30, 0xA2, 0x71, 0xEC, 0x0E, 0x28, 0x34, 0xC9, 0xC0, 0x37, + 0x46, 0xF1, 0x20, 0x03, 0x8A, 0x3F, 0x63, 0x37, 0x8A, 0xE9, 0x71, 0xD0, 0x0F, 0x47, 0x7E, 0x30, + 0xC0, 0xD2, 0xB6, 0xE7, 0x26, 0x6E, 0x0A, 0xED, 0xC1, 0xA0, 0x6F, 0x40, 0x1B, 0x34, 0x03, 0x10, + 0xD1, 0x64, 0x12, 0x05, 0xC4, 0x0B, 0xFB, 0x93, 0x11, 0x74, 0xB2, 0x3D, 0xA0, 0xC9, 0xD1, 0x90, + 0xE2, 0xAF, 0xFB, 0xF7, 0xC7, 0xD0, 0xF3, 0xAC, 0x7B, 0xC8, 0xD1, 0x6B, 0xFF, 0x8E, 0x7A, 0x1F, + 0x5C, 0xEC, 0x81, 0xB3, 0x2D, 0x7F, 0x0A, 0x83, 0x81, 0xF4, 0x6D, 0x3C, 0x74, 0x93, 0xEB, 0x30, + 0x1A, 0x9D, 0x45, 0x14, 0x8A, 0xA1, 0xA0, 0x56, 0x13, 0x25, 0x03, 0x1A, 0x7A, 0x34, 0xF1, 0xFB, + 0x1C, 0xC6, 0x86, 0xD3, 0x76, 0x3A, 0x7A, 0x09, 0x10, 0xB8, 0x43, 0x56, 0x3B, 0xCE, 0x66, 0xBB, + 0xF3, 0x4A, 0x2B, 0xDB, 0x1B, 0x62, 0xAB, 0xCE, 0xA6, 0xE3, 0xB4, 0xD3, 0x66, 0xB4, 0x4F, 0xAF, + 0x7F, 0x61, 0x0D, 0xBA, 0x2F, 0x9D, 0xAE, 0xB3, 0xD5, 0xDE, 0xDC, 0x7A, 0x29, 0x15, 0x7D, 0xC6, + 0xA2, 0x8D, 0x17, 0x9D, 0xAD, 0x97, 0xCE, 0x46, 0x7B, 0xC3, 0x59, 0x97, 0x8A, 0xBE, 0x30, 0x02, + 0x5E, 0x6E, 0x6D, 0x6D, 0x6D, 0xB6, 0x37, 0x5E, 0x6E, 0x88, 0x92, 0xA1, 0x1B, 0x27, 0x6F, 0xFD, + 0x21, 0x3D, 0x05, 0x59, 0x92, 0x09, 0xBF, 0xC6, 0x6F, 0x93, 0xD1, 0x15, 0x8D, 0xA4, 0x7E, 0x06, + 0xEC, 0xC3, 0xC7, 0x6B, 0x6C, 0x10, 0xF7, 0xE8, 0x90, 0xF6, 0x13, 0xEA, 0x49, 0xE5, 0xB1, 0xF8, + 0xC4, 0xCA, 0x65, 0x68, 0xF1, 0x4D, 0x08, 0xE2, 0x38, 0xC0, 0xEF, 0x28, 0x87, 0x38, 0xBA, 0xEE, + 0x30, 0xA6, 0xA2, 0x34, 0xBC, 0x4A, 0x5C, 0x3F, 0xA0, 0xDE, 0x09, 0x1F, 0xFB, 0x6A, 0x35, 0xF6, + 0xDD, 0x98, 0x6A, 0xB5, 0x04, 0x16, 0x51, 0xE9, 0xFC, 0xE2, 0xE0, 0xC4, 0x02, 0x0A, 0x3B, 0x76, + 0xE1, 0x5E, 0xC1, 0x3F, 0xF4, 0x2E, 0x91, 0x69, 0xEC, 0x87, 0x51, 0x44, 0x99, 0xC0, 0xE8, 0x25, + 0x42, 0x26, 0xF5, 0xCF, 0xC8, 0x3A, 0x81, 0xEB, 0xE2, 0x7E, 0x4C, 0x4B, 0x8A, 0x04, 0xAD, 0xAC, + 0x98, 0x57, 0x00, 0x4C, 0x61, 0xE4, 0xC5, 0x47, 0x07, 0x47, 0x6F, 0xA1, 0xE0, 0xEB, 0xB7, 0x6D, + 0xE5, 0xF3, 0x3B, 0x31, 0xFE, 0x72, 0xD1, 0xF5, 0x64, 0x38, 0x3C, 0x03, 0x78, 0x9F, 0xC6, 0x20, + 0xEC, 0x72, 0xCF, 0xD3, 0x96, 0x31, 0x4D, 0x2E, 0xFC, 0x11, 0x0D, 0x27, 0x49, 0x36, 0x1A, 0x81, + 0x77, 0x08, 0x13, 0x43, 0xFD, 0xDA, 0xBF, 0xA1, 0xFD, 0xEF, 0xA7, 0x74, 0xFA, 0xD6, 0x8F, 0x46, + 0x53, 0x37, 0xA2, 0x6A, 0x29, 0xCC, 0x06, 0x6B, 0xD9, 0xEF, 0x7F, 0xD7, 0x0F, 0x03, 0xE0, 0xE5, + 0x41, 0x08, 0xF4, 0xF9, 0x01, 0x50, 0x80, 0xFD, 0xC2, 0x31, 0x16, 0xD3, 0xEA, 0xE0, 0xE3, 0xC7, + 0xF3, 0xC3, 0xE3, 0xD3, 0xBD, 0x8B, 0xA3, 0xCB, 0xE3, 0xD3, 0xB3, 0x4F, 0x17, 0x97, 0x17, 0x9F, + 0xCF, 0x8E, 0x2E, 0x0F, 0x0F, 0x5F, 0x13, 0xA7, 0x45, 0xD6, 0xD6, 0x0E, 0xE9, 0xB5, 0x3B, 0x01, + 0x69, 0x3E, 0x3C, 0x6C, 0x7B, 0xE9, 0x4F, 0x79, 0xC3, 0x93, 0x93, 0xD7, 0xA4, 0xC3, 0x9A, 0xC2, + 0xAF, 0xED, 0x11, 0xFE, 0x94, 0x37, 0xB8, 0xC4, 0x16, 0x5D, 0xDE, 0x82, 0x54, 0x6E, 0x72, 0x79, + 0xB8, 0xD7, 0x7B, 0xFF, 0x9A, 0xAC, 0xF3, 0x76, 0xAB, 0xD5, 0xDB, 0xF5, 0x3E, 0x9F, 0xEC, 0x7F, + 0xFC, 0xF0, 0x9A, 0x6C, 0xF0, 0x96, 0xFF, 0xF5, 0x9F, 0x69, 0xD3, 0xD1, 0xA8, 0x3E, 0xAB, 0x67, + 0xBD, 0xDE, 0x6B, 0xB2, 0x99, 0x51, 0x4A, 0x7A, 0xBD, 0x76, 0xCC, 0x7E, 0x2A, 0x60, 0x85, 0x96, + 0x5B, 0x0B, 0xB6, 0x14, 0x5D, 0x7D, 0x91, 0x75, 0x75, 0x75, 0xBE, 0xE6, 0x69, 0x8F, 0x5F, 0xE6, + 0x3D, 0xAE, 0x67, 0x10, 0x6A, 0xB3, 0xFB, 0x7C, 0x79, 0xFA, 0xF1, 0xF2, 0xF0, 0xE8, 0xE0, 0xF8, + 0x64, 0x0F, 0x80, 0xBC, 0x4A, 0x87, 0xB6, 0xD7, 0x23, 0xAB, 0xE4, 0x34, 0x24, 0x1E, 0xED, 0xFB, + 0x23, 0x77, 0x58, 0x89, 0x12, 0x19, 0x50, 0xC7, 0x91, 0xD9, 0x31, 0x3F, 0x2C, 0x64, 0x8A, 0x0A, + 0xB0, 0x23, 0x33, 0xA8, 0x32, 0xC0, 0xE3, 0xD3, 0x9F, 0xF6, 0x3E, 0x1C, 0x1F, 0x5E, 0x7E, 0x3A, + 0xFD, 0xCB, 0xE9, 0xC7, 0x9F, 0x4F, 0x01, 0x4E, 0xB7, 0x25, 0xAD, 0x24, 0x30, 0x7D, 0x6E, 0x69, + 0x04, 0xBA, 0x31, 0x9F, 0x41, 0xA8, 0x38, 0xDB, 0x4E, 0xA6, 0x7D, 0xD2, 0xCF, 0xC7, 0xC1, 0x78, + 0x92, 0x08, 0x85, 0xA2, 0x4D, 0xB7, 0x76, 0x51, 0x5F, 0xD4, 0x45, 0xDC, 0x58, 0x1F, 0xB3, 0xC5, + 0x6F, 0x6D, 0x0D, 0xA7, 0x71, 0x38, 0xA4, 0x60, 0x48, 0x0C, 0x1A, 0x35, 0x5F, 0xD4, 0x49, 0x35, + 0xDC, 0x6B, 0x52, 0x23, 0x2B, 0x04, 0x1B, 0x30, 0x80, 0xD8, 0x02, 0x69, 0xC3, 0xD5, 0x15, 0x88, + 0xC1, 0x85, 0x36, 0x1E, 0x0F, 0xFD, 0xA4, 0x51, 0x6F, 0xD5, 0xD3, 0xD5, 0x16, 0x96, 0x3D, 0xD2, + 0x18, 0xC2, 0x1A, 0x7F, 0xC7, 0xD6, 0x01, 0xF8, 0xCF, 0x1B, 0x56, 0xBF, 0x3D, 0xA4, 0xC1, 0x20, + 0xB9, 0x01, 0xF6, 0x75, 0xF0, 0xE3, 0xCA, 0x0E, 0xE9, 0x2A, 0x6B, 0x38, 0xC2, 0xF5, 0x71, 0xED, + 0xC0, 0xCA, 0x5F, 0xEF, 0xBE, 0x6D, 0xAB, 0x45, 0xB7, 0xEE, 0x30, 0x2B, 0x03, 0x92, 0x3A, 0x72, + 0xB9, 0xDE, 0x09, 0x8F, 0x93, 0x0D, 0xD0, 0x56, 0x48, 0xAD, 0x85, 0x4D, 0xF9, 0x07, 0xF8, 0x25, + 0xEF, 0x07, 0x6F, 0xD8, 0x1B, 0xC3, 0x40, 0x02, 0x68, 0xE8, 0xF6, 0xC8, 0x0D, 0xBC, 0x38, 0x2F, + 0xF3, 0xAF, 0x49, 0xC3, 0xF7, 0xDA, 0xC0, 0x91, 0xE1, 0xC4, 0xA3, 0x71, 0xA3, 0x16, 0x7B, 0x27, + 0xE1, 0x24, 0x80, 0x01, 0xAB, 0x35, 0x15, 0xC2, 0x39, 0xA0, 0x0B, 0xB4, 0x21, 0xC2, 0x60, 0x2D, + 0xBC, 0xBE, 0x26, 0xBD, 0x43, 0x02, 0xBA, 0xD2, 0x55, 0xAB, 0x20, 0x3C, 0xD6, 0x09, 0x50, 0xFB, + 0x4C, 0x53, 0xD7, 0x0C, 0x28, 0xF8, 0x73, 0xE3, 0x7B, 0xB4, 0x51, 0xC3, 0x35, 0xE9, 0xC4, 0x0D, + 0x60, 0x04, 0xA2, 0x5A, 0x73, 0x5B, 0xAD, 0xF5, 0xA0, 0xFE, 0x49, 0x01, 0x94, 0x02, 0x3C, 0x89, + 0x26, 0x05, 0xB0, 0x71, 0x39, 0xAC, 0x0C, 0x5B, 0xFA, 0x35, 0x43, 0x81, 0xE3, 0x03, 0x18, 0x54, + 0xEB, 0xC6, 0xC4, 0x65, 0x58, 0x3F, 0x40, 0x9A, 0x86, 0x28, 0xB3, 0xB6, 0x12, 0x3F, 0x19, 0xB2, + 0xA5, 0xF0, 0xFC, 0xE2, 0x2F, 0x6C, 0x90, 0xB4, 0xC6, 0x30, 0x82, 0xA4, 0x07, 0x16, 0xDA, 0xB8, + 0xA6, 0x41, 0x30, 0x96, 0x3F, 0xEC, 0xB7, 0x56, 0xC7, 0xBE, 0x82, 0x9B, 0xE3, 0xA2, 0x13, 0x0C, + 0x15, 0xDF, 0xBA, 0x7D, 0x90, 0xE1, 0xDB, 0x6E, 0x19, 0x27, 0xAF, 0x60, 0x15, 0x3F, 0x08, 0x83, + 0x6B, 0x7F, 0x60, 0x30, 0x92, 0x0B, 0x05, 0x1F, 0x4C, 0x58, 0x76, 0xE3, 0x30, 0x2A, 0xA9, 0xC8, + 0xA1, 0x8D, 0xC7, 0x25, 0x55, 0x38, 0x24, 0x9A, 0xDC, 0xD0, 0x28, 0xA0, 0xC9, 0xCC, 0x8A, 0x41, + 0x32, 0xAE, 0x40, 0x98, 0x3B, 0x1C, 0x86, 0xD3, 0x9F, 0xFD, 0xB7, 0xFE, 0x47, 0xD0, 0x44, 0x47, + 0x29, 0xEC, 0xA1, 0x0F, 0xE3, 0x02, 0xED, 0xA0, 0xDA, 0xDB, 0x10, 0xCD, 0x0C, 0x30, 0x8F, 0x29, + 0xA1, 0x77, 0x63, 0x37, 0x88, 0x81, 0x93, 0x73, 0x82, 0xEB, 0xD1, 0xE8, 0x96, 0x09, 0x5A, 0x25, + 0x70, 0x45, 0xB2, 0x5D, 0x38, 0x40, 0xA3, 0x30, 0x76, 0xFD, 0xFE, 0xBF, 0x06, 0xE9, 0x07, 0x1D, + 0xA4, 0xA3, 0x9F, 0xFE, 0xF2, 0x83, 0x8C, 0x0D, 0xAF, 0x52, 0x61, 0x6C, 0x78, 0xC5, 0xDF, 0xC0, + 0xD8, 0xD8, 0x15, 0xB8, 0xB4, 0xA0, 0xFD, 0x1D, 0xF7, 0x65, 0xDC, 0xAE, 0xFF, 0x89, 0x46, 0x08, + 0xEB, 0x18, 0xE9, 0xB6, 0x2C, 0x6E, 0x27, 0x13, 0xB0, 0xF4, 0x61, 0x89, 0xA4, 0xC4, 0xBD, 0x0A, + 0x6F, 0x29, 0x31, 0x5B, 0x92, 0x84, 0xC6, 0x89, 0xD1, 0x2C, 0xF4, 0xFC, 0xEB, 0x7B, 0xD8, 0x76, + 0x24, 0x09, 0xD8, 0x14, 0x31, 0xF1, 0x26, 0x94, 0x24, 0x21, 0x6C, 0xB8, 0x78, 0x53, 0x32, 0xF4, + 0x47, 0x7E, 0xC2, 0xBC, 0x17, 0xB1, 0x7D, 0xAD, 0xDC, 0x85, 0xBD, 0x6E, 0xB7, 0x63, 0x17, 0x20, + 0xB6, 0xB3, 0x04, 0x95, 0x0E, 0x7B, 0xF9, 0x9A, 0x77, 0x1F, 0xB8, 0x23, 0xBF, 0x0F, 0xF8, 0xE8, + 0xD0, 0x3A, 0x60, 0x68, 0x8F, 0x04, 0x74, 0xFA, 0x71, 0xCC, 0xCC, 0x21, 0xEE, 0x7D, 0xE0, 0x7F, + 0x34, 0xEA, 0x27, 0xE1, 0x94, 0x46, 0xF5, 0x16, 0xA9, 0x77, 0x3A, 0x75, 0xAB, 0x40, 0x30, 0x4C, + 0xE8, 0x36, 0x69, 0x64, 0x20, 0x5A, 0x64, 0x12, 0x78, 0x20, 0xE5, 0xB0, 0x03, 0xB5, 0x35, 0x29, + 0x42, 0x75, 0xB4, 0xDA, 0x03, 0xB3, 0x2E, 0x11, 0xE8, 0xBA, 0xCB, 0x40, 0x67, 0x1F, 0x70, 0x30, + 0x6C, 0x92, 0x88, 0xF1, 0x7C, 0x80, 0x2E, 0x1E, 0x17, 0x77, 0xE5, 0x57, 0xF7, 0x04, 0xD7, 0xD8, + 0x49, 0xE0, 0x27, 0xB3, 0x24, 0x23, 0xF6, 0xDE, 0x46, 0x94, 0xF6, 0xC6, 0xA0, 0x62, 0x6B, 0x4D, + 0x15, 0xDF, 0x3F, 0xFF, 0x49, 0xB4, 0xAA, 0x3D, 0xFF, 0xEF, 0x33, 0x6B, 0xDD, 0xB8, 0x91, 0x87, + 0x43, 0x7E, 0x7C, 0x38, 0xAB, 0xA6, 0x29, 0x5A, 0xB3, 0x5A, 0x78, 0xEE, 0x7D, 0x7C, 0x4E, 0x47, + 0xAE, 0x1F, 0x40, 0x87, 0x67, 0x55, 0x1E, 0x47, 0x21, 0xDA, 0x3F, 0x0E, 0x7A, 0x37, 0x2A, 0xD6, + 0xED, 0xCC, 0x51, 0xB7, 0x3B, 0x47, 0xDD, 0xF5, 0x39, 0xEA, 0x6E, 0xCC, 0x51, 0x77, 0x73, 0x8E, + 0xBA, 0x5B, 0x73, 0xD4, 0x7D, 0x51, 0xA5, 0x6E, 0xE4, 0x7A, 0x7E, 0x78, 0xB2, 0x77, 0x30, 0x73, + 0xD0, 0xE8, 0xAD, 0xDF, 0xA7, 0xFB, 0x17, 0xB3, 0x05, 0x02, 0x4C, 0xFA, 0xD4, 0x1D, 0x35, 0xAB, + 0xEA, 0x95, 0x9B, 0xC0, 0xDC, 0xBA, 0x3F, 0xA3, 0x51, 0x9F, 0x69, 0xE0, 0xBC, 0xB6, 0xA1, 0x42, + 0x40, 0x6B, 0xF8, 0x5E, 0x13, 0xDA, 0xC2, 0xEC, 0x78, 0x7F, 0x71, 0xF2, 0xC1, 0x30, 0x52, 0x67, + 0x6A, 0xCF, 0x28, 0xF9, 0x6E, 0x08, 0xAA, 0x0D, 0x8D, 0xB5, 0x62, 0x09, 0xE2, 0xE2, 0x66, 0x9F, + 0xC6, 0x03, 0x60, 0x2F, 0xAD, 0x3D, 0x8A, 0xEC, 0x3E, 0xAE, 0x6A, 0xD1, 0xE8, 0x1C, 0xBD, 0x43, + 0x16, 0x82, 0x99, 0xD7, 0xE8, 0x20, 0x1C, 0x8D, 0x41, 0x63, 0xD2, 0x46, 0x73, 0x01, 0xC8, 0xE8, + 0x60, 0x3A, 0xA7, 0x7D, 0xEA, 0x8F, 0x6D, 0xF0, 0xCD, 0x4A, 0x3A, 0x92, 0x59, 0x68, 0x84, 0x34, + 0x72, 0x57, 0xA4, 0x0D, 0xC3, 0x04, 0x6C, 0xFE, 0x20, 0x39, 0x93, 0xAB, 0x59, 0x99, 0xFC, 0x47, + 0xDC, 0xEE, 0xC2, 0xCE, 0xFA, 0x2B, 0x7A, 0xCD, 0x77, 0x04, 0xD8, 0x73, 0x94, 0xDF, 0x6F, 0x5F, + 0xA1, 0xF6, 0x84, 0xEE, 0xE0, 0x76, 0xC4, 0x0A, 0x0E, 0x36, 0x25, 0xDF, 0x60, 0x18, 0xA0, 0xCD, + 0xB8, 0x51, 0x67, 0xFE, 0x33, 0x8A, 0x0E, 0x74, 0xDC, 0x81, 0xCC, 0xC5, 0xB2, 0x74, 0x25, 0xFC, + 0x34, 0x46, 0x17, 0x7C, 0xCA, 0x76, 0x4B, 0xA7, 0xEC, 0x15, 0x1B, 0x8F, 0x40, 0xD6, 0x83, 0x85, + 0x77, 0x12, 0xCF, 0x44, 0xC5, 0xAB, 0x35, 0xC4, 0xCE, 0xB9, 0x32, 0x2E, 0xC9, 0xCB, 0x6D, 0x9D, + 0x15, 0xB2, 0x0F, 0xDC, 0x2A, 0xFE, 0x8F, 0x9C, 0x9C, 0x92, 0x2F, 0xBD, 0x0C, 0x3F, 0x5B, 0xA0, + 0x9F, 0x12, 0xFF, 0xDE, 0xB0, 0xAC, 0xFF, 0xDC, 0x9B, 0xFF, 0x14, 0xF8, 0xD9, 0xA1, 0x80, 0x05, + 0x73, 0x7A, 0x58, 0xF0, 0x54, 0x38, 0x3F, 0x17, 0xE0, 0xFC, 0xFC, 0x84, 0x38, 0xBF, 0x14, 0xE0, + 0xFC, 0xF2, 0x54, 0x38, 0xE3, 0x71, 0x10, 0x4E, 0xCF, 0x28, 0x85, 0x1D, 0xC9, 0xC4, 0x6A, 0x30, + 0x67, 0xE6, 0x2B, 0x71, 0x9A, 0xA6, 0x81, 0x87, 0xCA, 0x7D, 0x0C, 0xAD, 0x61, 0x95, 0x8C, 0x35, + 0x5D, 0x5E, 0xAB, 0xCD, 0x43, 0x88, 0x00, 0x52, 0xB0, 0xEC, 0x58, 0x51, 0xAC, 0xB0, 0xDE, 0xA2, + 0xFE, 0x7A, 0x73, 0x15, 0xED, 0xCE, 0x85, 0x2D, 0xE6, 0x96, 0x3A, 0x1E, 0x50, 0x58, 0xD7, 0x8D, + 0xEC, 0xF8, 0xA2, 0x3D, 0x9E, 0xC4, 0x37, 0x73, 0x6B, 0x0C, 0x01, 0x3E, 0x3D, 0xE8, 0x28, 0x46, + 0x91, 0xD6, 0x58, 0x0C, 0xCD, 0xF5, 0x88, 0x1B, 0x12, 0x06, 0x74, 0xED, 0xD8, 0x6B, 0x4E, 0x99, + 0xB8, 0x1E, 0x71, 0x2B, 0xD8, 0xA2, 0x4D, 0xE5, 0xC3, 0x25, 0x60, 0x7F, 0xED, 0x4D, 0x12, 0x11, + 0x77, 0xE8, 0x0F, 0x82, 0x9D, 0xFA, 0x90, 0x5E, 0x27, 0xF5, 0x5D, 0xC3, 0xB1, 0x65, 0x69, 0xE2, + 0xED, 0xE2, 0x5A, 0xA4, 0xD0, 0x88, 0x63, 0xB8, 0x86, 0x05, 0x95, 0x9B, 0xA7, 0x23, 0x5F, 0xBD, + 0xD5, 0x1B, 0xB6, 0x40, 0x92, 0xE4, 0x7E, 0x4C, 0x77, 0xF8, 0x3A, 0x77, 0x15, 0xDE, 0xD5, 0xC1, + 0xE8, 0xDA, 0xA9, 0xDB, 0xE8, 0xA9, 0x13, 0xB6, 0x94, 0xD6, 0x11, 0xD8, 0xF1, 0x61, 0x9D, 0xF4, + 0xA1, 0x42, 0x0C, 0x7F, 0x86, 0xD1, 0x68, 0x95, 0xB5, 0x5E, 0xE5, 0xF0, 0x24, 0x0F, 0xE4, 0x01, + 0x7E, 0xAE, 0xEF, 0x56, 0xA5, 0x69, 0x2D, 0x99, 0x53, 0x6A, 0x61, 0xBC, 0xA1, 0xB1, 0x65, 0x60, + 0xF0, 0x2C, 0x0C, 0x69, 0x9F, 0x6F, 0x0D, 0xFD, 0xB4, 0xFF, 0xCB, 0xA5, 0x05, 0x98, 0x74, 0x26, + 0x28, 0xE4, 0xC7, 0xF7, 0xB6, 0x0B, 0xAB, 0x9C, 0x73, 0x7F, 0xA5, 0xA9, 0x9B, 0x34, 0x30, 0x1F, + 0xDC, 0x2B, 0x3A, 0xB4, 0x3B, 0x2D, 0xA5, 0x9A, 0x87, 0xC2, 0x17, 0x9F, 0xB7, 0x4B, 0x7D, 0xF2, + 0x97, 0xC6, 0xFE, 0x12, 0xFB, 0x23, 0x35, 0x4B, 0x5D, 0xF2, 0xB0, 0xCD, 0x5E, 0xB7, 0x6E, 0xB2, + 0xE5, 0xB3, 0x4E, 0x7E, 0xFE, 0x20, 0xB5, 0xFE, 0xDA, 0xF9, 0x86, 0x3E, 0x09, 0x64, 0x09, 0x9E, + 0xAC, 0x5E, 0x76, 0x9C, 0x17, 0x1B, 0x50, 0x03, 0x7F, 0x37, 0x21, 0x21, 0x66, 0xFD, 0x78, 0xF4, + 0x0F, 0x3B, 0x32, 0x70, 0x2B, 0x01, 0xE9, 0xCC, 0x3C, 0xB1, 0x11, 0x81, 0x7F, 0x6D, 0xDB, 0xDB, + 0xC8, 0x07, 0xB4, 0x4C, 0x70, 0x6E, 0x22, 0x43, 0xBC, 0x0C, 0x7B, 0x53, 0x6B, 0x2C, 0x0F, 0x81, + 0xDA, 0x6D, 0x94, 0xF5, 0x4B, 0x76, 0x30, 0x22, 0x7D, 0xEE, 0x32, 0x6E, 0x64, 0x9C, 0xB0, 0xB3, + 0xC0, 0xC2, 0xFC, 0x9D, 0x1D, 0xB2, 0x51, 0xD8, 0xF7, 0x45, 0x49, 0xB1, 0x7E, 0x5E, 0xCF, 0x29, + 0xDC, 0x70, 0x5E, 0x74, 0x2F, 0x3B, 0x15, 0xF9, 0x01, 0x6D, 0xE8, 0x08, 0xDD, 0x3E, 0xEC, 0xD4, + 0x1A, 0xBA, 0x11, 0x53, 0x1A, 0xCC, 0xC3, 0xB6, 0xEC, 0x53, 0x2A, 0x99, 0x08, 0xA8, 0xDE, 0x6C, + 0xFF, 0x2D, 0xF4, 0x83, 0x46, 0xBD, 0xDE, 0x34, 0xC4, 0x08, 0xCB, 0x0D, 0x37, 0x87, 0xFA, 0xC1, + 0x18, 0x61, 0xCF, 0xBF, 0x55, 0x14, 0xCE, 0x20, 0x0A, 0x27, 0x63, 0x12, 0x85, 0x53, 0xAE, 0xAF, + 0x46, 0xF1, 0x40, 0xE2, 0x47, 0xA6, 0xB1, 0x0C, 0xA9, 0x30, 0xE0, 0x0E, 0x59, 0x5F, 0x00, 0x24, + 0xD7, 0x79, 0x3A, 0x80, 0x14, 0x67, 0x3F, 0x1C, 0xAE, 0xC6, 0xA3, 0xD5, 0x0D, 0x82, 0xBF, 0x6C, + 0xB1, 0x7F, 0x19, 0x19, 0xAC, 0x79, 0x7D, 0x57, 0x6B, 0xCA, 0x19, 0x04, 0xED, 0x5F, 0xBF, 0x59, + 0x63, 0x35, 0x66, 0xD3, 0x21, 0xF5, 0x4F, 0xC1, 0xB5, 0x51, 0x57, 0xD5, 0x34, 0x0F, 0xC9, 0xD0, + 0x94, 0x6F, 0x18, 0x24, 0x51, 0x38, 0xAC, 0xCF, 0x42, 0x92, 0x69, 0x76, 0xA3, 0x97, 0x7C, 0x43, + 0x24, 0x97, 0x31, 0x2D, 0x56, 0x8D, 0x85, 0xE3, 0x22, 0xB8, 0x47, 0x51, 0x14, 0xE6, 0xA4, 0xFA, + 0xC1, 0xD0, 0x0F, 0x28, 0xFF, 0x06, 0x2B, 0xC2, 0x78, 0x36, 0xE0, 0x35, 0x60, 0xCA, 0x2E, 0xFF, + 0xB7, 0x36, 0xDF, 0x56, 0x35, 0x3D, 0x17, 0x8A, 0xCF, 0x22, 0x3F, 0x8C, 0xFC, 0xE4, 0xBE, 0x40, + 0xAB, 0xE7, 0x35, 0xCB, 0x14, 0x7B, 0x5E, 0x2B, 0x05, 0x57, 0xA8, 0xDF, 0xF3, 0xAA, 0x42, 0x71, + 0xAB, 0x18, 0xD2, 0x19, 0xD2, 0x36, 0x74, 0xB7, 0x49, 0x4D, 0x3A, 0xCB, 0x54, 0x90, 0x5F, 0xD9, + 0xD1, 0x68, 0xE9, 0x39, 0x58, 0x95, 0xF9, 0x02, 0x4D, 0xD8, 0xF6, 0x57, 0xED, 0xBF, 0x75, 0xBC, + 0x6D, 0xD0, 0xB5, 0x59, 0x63, 0x01, 0x33, 0xC7, 0xC4, 0xB1, 0x75, 0x1B, 0xE7, 0x0E, 0x29, 0x9A, + 0x3C, 0x33, 0xFA, 0xBB, 0xB4, 0xF9, 0x63, 0xC1, 0x93, 0x89, 0xBA, 0xAD, 0xCB, 0xD2, 0x2C, 0xB2, + 0x88, 0x4C, 0x65, 0xE6, 0x2E, 0x2C, 0xF6, 0x68, 0x6C, 0xF9, 0xC1, 0x40, 0x0A, 0xE8, 0xB1, 0x39, + 0x50, 0xCC, 0x5A, 0xF3, 0x19, 0x49, 0x41, 0xDE, 0xB0, 0xD8, 0x33, 0x66, 0x56, 0x5A, 0xC0, 0xC9, + 0xC0, 0xCE, 0x15, 0xCA, 0x7B, 0x63, 0x56, 0x9A, 0xAF, 0x33, 0x61, 0xE2, 0xA6, 0x0D, 0x0B, 0x5D, + 0x26, 0x46, 0x9D, 0xB9, 0xBB, 0x22, 0x3C, 0x97, 0xC7, 0x20, 0x68, 0xB9, 0xB3, 0xD3, 0xBA, 0xAD, + 0xB3, 0xD6, 0x6C, 0xC7, 0x51, 0x7F, 0x11, 0x57, 0xA0, 0x11, 0x61, 0x62, 0xF5, 0xD8, 0xD9, 0xE2, + 0x50, 0xE6, 0xDD, 0x1F, 0x89, 0xB0, 0x49, 0xEB, 0x0E, 0x29, 0x8B, 0xA8, 0x5C, 0x08, 0x68, 0x88, + 0x4E, 0xFF, 0x02, 0xA8, 0x3C, 0x28, 0xD3, 0x00, 0x2B, 0x9F, 0x93, 0xB0, 0x0D, 0x08, 0x81, 0x6D, + 0x0D, 0x8D, 0xC9, 0x1A, 0x61, 0xEE, 0x6B, 0x72, 0x35, 0x49, 0x12, 0xE5, 0x4C, 0xAA, 0x62, 0x8C, + 0x45, 0x12, 0xDD, 0xDB, 0x0C, 0x39, 0xE1, 0x72, 0x10, 0x7E, 0x42, 0x7B, 0xA4, 0xC2, 0x03, 0xE9, + 0xBB, 0x49, 0xFF, 0x86, 0x34, 0x28, 0x2E, 0x7F, 0x56, 0x7B, 0x50, 0x89, 0x71, 0x39, 0x8E, 0xE3, + 0x09, 0x25, 0x53, 0x1F, 0x0C, 0xC8, 0xE3, 0xC3, 0x34, 0xDC, 0xA5, 0x39, 0xD7, 0x59, 0xE0, 0x8C, + 0x60, 0x94, 0xAA, 0x9D, 0x49, 0xA3, 0x0E, 0x9F, 0xB7, 0x37, 0xF2, 0x10, 0xEE, 0x0D, 0x87, 0x24, + 0xA2, 0x83, 0xC9, 0x10, 0x23, 0x88, 0x98, 0x26, 0xE7, 0xC3, 0xE9, 0x06, 0x1E, 0xD7, 0xB8, 0xFA, + 0x48, 0xCE, 0xD5, 0x53, 0x06, 0xC1, 0xBA, 0x9C, 0x3F, 0xCF, 0x98, 0x3D, 0x58, 0x03, 0xB5, 0x7A, + 0xE9, 0x99, 0x2A, 0x3A, 0x69, 0x31, 0x24, 0x29, 0x5B, 0xF3, 0x99, 0xEF, 0x87, 0x7B, 0xAB, 0x0F, + 0x6E, 0xDC, 0x60, 0x40, 0xC5, 0xDE, 0x49, 0x73, 0x35, 0xD5, 0xEB, 0xDB, 0x79, 0x7D, 0xE6, 0xF5, + 0x17, 0x2E, 0xEE, 0x13, 0x30, 0x94, 0x2D, 0x55, 0x53, 0x2A, 0x0E, 0xC3, 0xA0, 0x9E, 0x90, 0x09, + 0x0F, 0xBA, 0x01, 0x31, 0x72, 0x81, 0xF9, 0x53, 0x8A, 0xCE, 0x19, 0xEA, 0xDF, 0x82, 0x40, 0x4C, + 0xDD, 0x58, 0x52, 0x19, 0x30, 0x1E, 0xD7, 0xA1, 0x88, 0x19, 0x07, 0x91, 0xD3, 0x63, 0x76, 0xF8, + 0x54, 0x50, 0x38, 0x57, 0x12, 0xD5, 0x9A, 0x8F, 0xF8, 0xDB, 0x30, 0xEA, 0x53, 0x18, 0x4B, 0x16, + 0xA5, 0x2D, 0x88, 0x91, 0x06, 0x19, 0xBB, 0x34, 0xA2, 0x6E, 0x3C, 0x89, 0x58, 0x05, 0xB4, 0x54, + 0xDF, 0xFF, 0x1D, 0x3A, 0xE5, 0xF9, 0xF1, 0x18, 0x47, 0x8C, 0x85, 0xBF, 0xE3, 0xE9, 0x2A, 0x39, + 0x98, 0xC4, 0x49, 0x38, 0xE2, 0x7F, 0xD7, 0xFB, 0x8C, 0x5D, 0xF5, 0xA6, 0xAC, 0xB9, 0xB9, 0xCA, + 0x8D, 0xD9, 0x5E, 0xB3, 0x37, 0x89, 0x6E, 0xE9, 0xFD, 0x71, 0xF0, 0x78, 0x48, 0x6F, 0x51, 0x3B, + 0x2D, 0x0E, 0x86, 0x29, 0xB7, 0x7D, 0x16, 0x3B, 0x21, 0x47, 0x03, 0x72, 0xD7, 0xDC, 0x92, 0x81, + 0xBE, 0xA3, 0xE1, 0xE2, 0x30, 0x69, 0x80, 0xEE, 0x9B, 0x0F, 0xE1, 0x60, 0xC0, 0x8E, 0x66, 0x1F, + 0x07, 0xE6, 0x34, 0x89, 0xFC, 0x71, 0x1A, 0x5C, 0xB1, 0x04, 0x50, 0x69, 0x60, 0xC5, 0xA2, 0xA0, + 0x30, 0x16, 0xF1, 0x2C, 0x8C, 0x12, 0x9C, 0x65, 0x01, 0xC6, 0x1D, 0x3C, 0x8E, 0xA6, 0xA3, 0x3B, + 0x58, 0xD7, 0x03, 0x77, 0x78, 0x36, 0x61, 0xEA, 0x78, 0x51, 0x60, 0x63, 0xD8, 0x53, 0x27, 0x67, + 0x34, 0xBA, 0x06, 0xA3, 0xF1, 0x20, 0xDF, 0xE6, 0xF4, 0xC2, 0x49, 0xD4, 0x7F, 0x04, 0x58, 0xB6, + 0x30, 0x72, 0x0B, 0x61, 0x51, 0x10, 0x6E, 0x90, 0xD0, 0x20, 0x70, 0xCF, 0xE9, 0x35, 0x8D, 0x68, + 0xD0, 0xA7, 0x67, 0x48, 0xE9, 0x23, 0xC0, 0x4D, 0x92, 0xF0, 0xF8, 0xE4, 0xD3, 0x08, 0x7D, 0xF0, + 0x7B, 0xE8, 0x4F, 0x1D, 0x2D, 0x41, 0x30, 0xF6, 0xCE, 0xCF, 0x16, 0x92, 0xD6, 0x1C, 0x16, 0x57, + 0x46, 0x38, 0x15, 0xF1, 0xAA, 0x81, 0x62, 0x6B, 0xF2, 0xA2, 0xD4, 0x7F, 0x6D, 0x14, 0x27, 0xFD, + 0xF1, 0x3E, 0xAE, 0x5B, 0x6A, 0x1B, 0xCF, 0xF2, 0x31, 0xAD, 0x99, 0x86, 0x08, 0x29, 0x85, 0xDE, + 0x4D, 0x7F, 0x6C, 0x2D, 0xE0, 0xE8, 0xC1, 0xD2, 0x42, 0xB3, 0xA8, 0xA1, 0xF7, 0xDF, 0xB2, 0x25, + 0x46, 0x0A, 0xB5, 0xA5, 0x40, 0xDD, 0x8D, 0x6C, 0x67, 0x2B, 0x94, 0x7A, 0xBD, 0x86, 0x45, 0x33, + 0xC1, 0xD2, 0x96, 0xEA, 0x75, 0xB1, 0x92, 0xC6, 0xC9, 0x3D, 0x2C, 0x5F, 0xC8, 0xD5, 0x21, 0xBB, + 0xC9, 0x54, 0x0B, 0xC2, 0x80, 0xD6, 0x8C, 0xCB, 0x39, 0x2C, 0x00, 0xAB, 0x42, 0xEB, 0xAB, 0x61, + 0xD8, 0xFF, 0x9E, 0x35, 0x07, 0x4B, 0x2E, 0xA2, 0xB8, 0x62, 0x1C, 0xF4, 0x7E, 0x22, 0x21, 0x5F, + 0x97, 0x44, 0xE0, 0x11, 0x8B, 0x1A, 0x96, 0x11, 0x88, 0x6B, 0x10, 0xF9, 0xC5, 0x24, 0x7E, 0x39, + 0x82, 0x55, 0xC6, 0xE6, 0x8A, 0xCB, 0x75, 0x6D, 0xED, 0x38, 0xB7, 0x29, 0xF2, 0xEA, 0xFD, 0x61, + 0x2C, 0x6E, 0x09, 0xE1, 0x9D, 0x87, 0x2C, 0x9C, 0xF5, 0xFF, 0x4D, 0xC0, 0x38, 0xE7, 0x17, 0x61, + 0xC2, 0x08, 0x0C, 0x93, 0x46, 0xAD, 0x2D, 0xEF, 0x20, 0x5B, 0x84, 0xFF, 0xE9, 0x45, 0xE1, 0xD8, + 0x0B, 0xA7, 0x41, 0xAD, 0x2C, 0x6A, 0x5A, 0x42, 0x21, 0x9C, 0x85, 0xF0, 0x7D, 0x65, 0x45, 0x59, + 0x2E, 0x25, 0xAA, 0x61, 0x6B, 0x28, 0xB5, 0xF8, 0x7A, 0xF7, 0xAD, 0x2D, 0x02, 0xA0, 0xD9, 0x76, + 0x53, 0x2D, 0xE1, 0x46, 0x0D, 0x2B, 0xCC, 0x07, 0x31, 0xED, 0xAF, 0x64, 0x12, 0xB7, 0x6C, 0x16, + 0x71, 0xE6, 0x0F, 0x44, 0x73, 0x81, 0x8C, 0xB8, 0x23, 0x9F, 0xFD, 0x21, 0x2A, 0xCC, 0xCB, 0x9B, + 0xFC, 0x68, 0xE0, 0x75, 0x10, 0x26, 0x8D, 0xB6, 0x7E, 0x3E, 0xD0, 0x4C, 0xD9, 0xC6, 0x88, 0x91, + 0x6C, 0x9D, 0x67, 0xE6, 0x5A, 0x6A, 0xF4, 0x5A, 0xF9, 0x66, 0xA3, 0x45, 0x3E, 0x15, 0xAB, 0x46, + 0x8B, 0x72, 0xCC, 0x06, 0x88, 0x30, 0x00, 0xBA, 0xDE, 0xAA, 0xC3, 0xBF, 0x12, 0x2C, 0xA0, 0x65, + 0x6E, 0x1A, 0xB2, 0x63, 0xB3, 0xF9, 0xE8, 0xC8, 0xCE, 0xE3, 0x6C, 0xB4, 0xA4, 0x85, 0x85, 0xF4, + 0x68, 0x26, 0x6B, 0x00, 0x66, 0xC5, 0x80, 0x1B, 0xBE, 0x39, 0x36, 0xF3, 0xCE, 0x1F, 0xCE, 0xCF, + 0x86, 0x5A, 0x81, 0x57, 0xD1, 0xEE, 0x2F, 0x41, 0x1F, 0xF3, 0x2B, 0x4E, 0x8D, 0xB4, 0xB0, 0x45, + 0xBA, 0x8E, 0xE3, 0x34, 0xAD, 0x6A, 0x85, 0xF9, 0x16, 0x41, 0x9B, 0xB4, 0x08, 0x33, 0xD9, 0x51, + 0x87, 0xA9, 0x6A, 0x06, 0x7B, 0xC8, 0x1D, 0x90, 0x9A, 0x09, 0x8C, 0xC7, 0xA5, 0xAC, 0xE0, 0x35, + 0x41, 0x06, 0x64, 0xCD, 0x0D, 0x34, 0xFD, 0x21, 0x75, 0xA3, 0x14, 0x4F, 0x45, 0xE0, 0x75, 0x2B, + 0xB1, 0xBD, 0x49, 0xBF, 0x0F, 0xA6, 0x3B, 0x23, 0x57, 0xBE, 0xB2, 0x91, 0xC1, 0x12, 0x15, 0x6C, + 0xA4, 0x8A, 0x22, 0x4E, 0x2C, 0x34, 0xE6, 0x08, 0x54, 0x22, 0x73, 0xF8, 0x95, 0x41, 0xDB, 0x09, + 0x85, 0x1D, 0x43, 0x4A, 0xA4, 0x60, 0x6C, 0x6A, 0xB6, 0xE7, 0x17, 0x46, 0xAF, 0xC5, 0x2E, 0xC9, + 0x6A, 0xF3, 0x5B, 0x36, 0x60, 0xE9, 0x36, 0x13, 0x9D, 0x70, 0xB8, 0x0E, 0xB5, 0x23, 0xA6, 0x72, + 0x1A, 0xC2, 0x49, 0x9C, 0xD1, 0xB7, 0x3D, 0xA3, 0x19, 0x86, 0x51, 0x2A, 0x8E, 0xE5, 0x02, 0xB7, + 0x0C, 0xDF, 0xC9, 0xFD, 0x43, 0xDB, 0x74, 0xE9, 0xBB, 0xC5, 0xF9, 0x09, 0x35, 0x91, 0xCE, 0x22, + 0xD3, 0xD6, 0xB5, 0x99, 0x84, 0x5A, 0xA2, 0x1A, 0x98, 0x1C, 0xD8, 0x87, 0x5F, 0x0C, 0x5A, 0x3E, + 0x1B, 0x64, 0xF1, 0x92, 0x47, 0xB4, 0x26, 0x44, 0x5E, 0x5C, 0x02, 0xCA, 0x23, 0x9C, 0x0C, 0x61, + 0x92, 0x64, 0x40, 0x5F, 0xB8, 0xED, 0x12, 0xC4, 0x2E, 0xA1, 0x22, 0x74, 0x16, 0x44, 0x21, 0xAE, + 0x8C, 0xCA, 0x50, 0x51, 0xD7, 0x8A, 0xAD, 0xEB, 0x4F, 0xB8, 0x5A, 0xC9, 0x72, 0xCA, 0x0A, 0x85, + 0x66, 0x4E, 0x0B, 0x5B, 0x78, 0xAF, 0xB0, 0xBB, 0xB9, 0x09, 0x54, 0xB3, 0x70, 0xE5, 0x2B, 0x0A, + 0xFF, 0x4B, 0xA6, 0x94, 0x06, 0xC4, 0x61, 0xAE, 0x00, 0x28, 0xAB, 0x41, 0x61, 0x3F, 0x1C, 0x0E, + 0xDD, 0x71, 0x4C, 0xDF, 0x9D, 0xF6, 0x7A, 0x3C, 0xC4, 0x9B, 0xED, 0x78, 0xCD, 0x89, 0x2C, 0xEA, + 0xF5, 0xB8, 0xBD, 0x03, 0xFA, 0xA5, 0xCF, 0x43, 0x71, 0xFB, 0x6E, 0x44, 0x15, 0xB5, 0x21, 0x4A, + 0x6C, 0x42, 0x80, 0xCC, 0xCC, 0x46, 0x12, 0xAA, 0xF2, 0xB6, 0x36, 0x69, 0x01, 0x55, 0xB9, 0xCA, + 0x4A, 0x57, 0xD1, 0x2E, 0x98, 0xB7, 0xCD, 0x64, 0x5C, 0xDA, 0x82, 0x8B, 0x97, 0x05, 0x85, 0xDA, + 0x65, 0xB0, 0x0A, 0x7C, 0xB4, 0x11, 0xDF, 0xFA, 0x74, 0xE8, 0xC5, 0x0D, 0xE9, 0x92, 0xD8, 0x81, + 0x60, 0x86, 0x30, 0xAB, 0xFA, 0x52, 0xCC, 0xB6, 0xCE, 0xA7, 0x8C, 0xC1, 0xC2, 0x9F, 0x20, 0xC2, + 0xE8, 0x81, 0xF3, 0xA9, 0x57, 0x02, 0x49, 0xC8, 0x0C, 0x9F, 0xC2, 0xE6, 0xF9, 0xF8, 0x60, 0xDB, + 0x41, 0x10, 0xC7, 0x73, 0x37, 0xC4, 0x81, 0x15, 0x6D, 0xE1, 0xD7, 0x8A, 0xCD, 0xF7, 0xF3, 0x3B, + 0x09, 0xD0, 0x96, 0xDD, 0x50, 0x50, 0x1A, 0xA2, 0x23, 0xA6, 0xA0, 0x69, 0x4F, 0xBE, 0xA7, 0x00, + 0x8D, 0xC5, 0xBD, 0x85, 0x6A, 0x78, 0xCF, 0xCE, 0x24, 0x4E, 0xC9, 0x9B, 0xB8, 0x8A, 0xCD, 0x61, + 0x27, 0x1A, 0xCB, 0x10, 0xF0, 0xCF, 0x6A, 0x4D, 0x59, 0xCC, 0x63, 0xDE, 0x94, 0x19, 0x59, 0x15, + 0x9B, 0xF6, 0xEE, 0xE3, 0x84, 0x8E, 0xA4, 0x1E, 0xF3, 0xBF, 0xAB, 0x35, 0x3E, 0x52, 0x2F, 0x63, + 0x40, 0xF3, 0xEC, 0x7A, 0x46, 0x35, 0x00, 0xA7, 0x17, 0x12, 0xCF, 0xF0, 0xC6, 0x46, 0xB5, 0x66, + 0x07, 0xE6, 0x56, 0x27, 0x07, 0x23, 0xED, 0x83, 0x72, 0x70, 0x62, 0x35, 0x30, 0xD5, 0x15, 0x17, + 0x08, 0x21, 0xE9, 0x84, 0x43, 0x31, 0x55, 0x14, 0x8F, 0xC5, 0xCF, 0x43, 0x57, 0xD1, 0x67, 0xDF, + 0xC2, 0xBB, 0xCC, 0x1B, 0xAF, 0x24, 0x6D, 0xD5, 0xC1, 0xBB, 0x11, 0x1B, 0xAF, 0xA0, 0xA5, 0x1B, + 0xB9, 0xFD, 0x84, 0x46, 0xB1, 0xAC, 0xAE, 0xD4, 0xD9, 0xD4, 0x94, 0xB0, 0xA3, 0xBC, 0x17, 0xA2, + 0xE6, 0xDA, 0xD1, 0xE2, 0x0D, 0x6B, 0xE1, 0x55, 0x53, 0xC7, 0xE9, 0x74, 0x5B, 0xEC, 0xC2, 0xAC, + 0xA9, 0x33, 0x79, 0x29, 0xD3, 0x9C, 0x1D, 0x87, 0x35, 0xB0, 0x4D, 0xCD, 0x8C, 0xD9, 0x88, 0xF3, + 0x00, 0x6F, 0x84, 0x53, 0xA8, 0xC3, 0xD8, 0xD7, 0xC8, 0x89, 0xB4, 0x51, 0xE4, 0x07, 0xF0, 0xE1, + 0xB6, 0xC6, 0xD4, 0xF6, 0x2B, 0xA7, 0x50, 0x6B, 0xBF, 0x72, 0xAA, 0x60, 0x36, 0x60, 0x1F, 0x9C, + 0x7E, 0x7C, 0x1C, 0xE8, 0xDC, 0x6E, 0x29, 0xF2, 0x40, 0x65, 0x2E, 0x70, 0x8B, 0x45, 0x63, 0x1B, + 0xFD, 0x20, 0x6F, 0x7D, 0x79, 0xE0, 0x02, 0xA3, 0xA2, 0xF7, 0x21, 0x6C, 0xB0, 0xB9, 0x20, 0x6C, + 0x1A, 0x82, 0xB0, 0x59, 0x20, 0x08, 0x16, 0x16, 0x14, 0xB0, 0xC1, 0x44, 0x88, 0x4A, 0x82, 0x23, + 0x7C, 0x85, 0x3F, 0x3A, 0x4E, 0xF6, 0x71, 0x4E, 0x5C, 0xB6, 0xDE, 0xB1, 0x7B, 0xB2, 0xDC, 0xBD, + 0xC3, 0x90, 0xAD, 0x3B, 0x3A, 0xA6, 0x75, 0x67, 0xF1, 0xDE, 0xF1, 0xAE, 0x7C, 0x8A, 0x69, 0x64, + 0xEB, 0x22, 0x7E, 0x67, 0x5A, 0x2C, 0xF9, 0xDE, 0x1D, 0x84, 0xED, 0x7E, 0x38, 0xC2, 0xBF, 0xF0, + 0x2B, 0x19, 0x21, 0x05, 0x13, 0x58, 0xC4, 0x40, 0xCB, 0xF8, 0x60, 0x7D, 0x8C, 0x5C, 0x7F, 0x48, + 0x60, 0x69, 0x8C, 0xC0, 0xCA, 0x78, 0x12, 0x1A, 0xA6, 0xD3, 0x69, 0x7B, 0xB9, 0x74, 0x14, 0xD8, + 0xA5, 0x7C, 0xD3, 0xC1, 0x49, 0x2B, 0x11, 0x34, 0x99, 0x29, 0x4A, 0xCF, 0x66, 0x34, 0x17, 0x62, + 0xD3, 0xED, 0x38, 0x9D, 0x6A, 0xCD, 0x14, 0x01, 0xA8, 0x5D, 0x0D, 0xBD, 0xE8, 0xB2, 0x37, 0x76, + 0xA3, 0xEF, 0x6F, 0x27, 0x41, 0xA7, 0x36, 0x2F, 0x88, 0xB3, 0x9F, 0xE7, 0x22, 0x36, 0x65, 0x3E, + 0x5E, 0x48, 0xFB, 0x3F, 0xF8, 0xCF, 0xDC, 0xDD, 0x45, 0x08, 0x80, 0x14, 0x60, 0xD4, 0x74, 0x2F, + 0x99, 0x5C, 0xF9, 0x22, 0x72, 0x83, 0x78, 0xE4, 0x27, 0xEF, 0xDE, 0xED, 0xD5, 0x0A, 0x4E, 0xF7, + 0x0C, 0xA7, 0x0A, 0x9A, 0x4F, 0x9F, 0xF6, 0x7F, 0x49, 0x23, 0x59, 0x74, 0xA7, 0xD2, 0xE4, 0xEA, + 0x4E, 0x98, 0xBC, 0xE5, 0x8E, 0x93, 0x3A, 0xBF, 0xB8, 0xE0, 0x7B, 0xFF, 0x77, 0x07, 0xE3, 0xA6, + 0xBE, 0xF1, 0x10, 0xAA, 0x11, 0xDB, 0x1A, 0x20, 0x0A, 0xDF, 0x8B, 0x09, 0x6C, 0xE0, 0x23, 0xE6, + 0xFD, 0x62, 0x07, 0x4E, 0x58, 0xAD, 0xD8, 0x47, 0x20, 0xE1, 0x2D, 0xF4, 0x0F, 0x98, 0x31, 0x8E, + 0x52, 0x2B, 0xEE, 0x37, 0xD1, 0x27, 0x8B, 0x62, 0xBE, 0x4B, 0x6D, 0x9B, 0x65, 0xEC, 0x91, 0x16, + 0x60, 0x32, 0xE6, 0xCB, 0xB3, 0x9F, 0x39, 0x96, 0xF8, 0x2A, 0xA3, 0x2F, 0xDF, 0x3E, 0x95, 0x17, + 0x9B, 0xB5, 0x35, 0x16, 0xA7, 0x26, 0xAF, 0x88, 0xA9, 0x1A, 0xB7, 0x9C, 0xE4, 0x54, 0xD5, 0xE2, + 0x42, 0xA7, 0x86, 0x57, 0x20, 0x1C, 0xB7, 0x6C, 0x81, 0x03, 0xBB, 0x22, 0x0C, 0x3C, 0x9C, 0xB1, + 0x5B, 0x0E, 0xFE, 0xDF, 0xB6, 0xD0, 0x6C, 0x39, 0xA8, 0xED, 0xA0, 0x4C, 0x9E, 0xD7, 0xFB, 0xF6, + 0x5B, 0xAF, 0xE5, 0xD8, 0xCE, 0xC2, 0xD8, 0xC7, 0xFF, 0xEE, 0xF5, 0xFB, 0x13, 0xD0, 0x9B, 0xF7, + 0x5C, 0xB3, 0x6E, 0xB6, 0x3B, 0x16, 0xAC, 0x9D, 0x36, 0x43, 0xBB, 0xD9, 0x2E, 0x43, 0x5B, 0x34, + 0x1F, 0xD8, 0x39, 0xD0, 0x11, 0xBB, 0x3F, 0xD0, 0x52, 0x92, 0x0A, 0x15, 0x4F, 0xA1, 0xAC, 0xC9, + 0x67, 0x6C, 0x22, 0x25, 0x1B, 0xAA, 0xD0, 0xE4, 0x0B, 0x34, 0x91, 0x92, 0x10, 0xCD, 0x68, 0xF1, + 0xC1, 0x4D, 0xD0, 0xEB, 0xC2, 0xDA, 0xB4, 0x9D, 0x57, 0x4E, 0xF7, 0xD5, 0xC6, 0x8B, 0x57, 0xB3, + 0xDA, 0x84, 0xC1, 0x40, 0x34, 0xE2, 0x49, 0x95, 0x5E, 0x6E, 0x3A, 0x9B, 0x2F, 0xB6, 0x3A, 0x33, + 0x9A, 0xED, 0x0D, 0x13, 0x3F, 0x99, 0x78, 0xCC, 0x52, 0xDB, 0xDC, 0x02, 0x6C, 0x2F, 0x4B, 0x10, + 0x89, 0xB3, 0x8D, 0xF7, 0xD4, 0x1F, 0xDC, 0x20, 0x22, 0x67, 0x66, 0x55, 0xED, 0x18, 0x44, 0x6A, + 0x52, 0x49, 0xC7, 0x17, 0xC8, 0x61, 0x31, 0xDA, 0x72, 0x51, 0x02, 0x51, 0x51, 0x65, 0x22, 0x9D, + 0x31, 0xE5, 0x47, 0x8D, 0x65, 0x93, 0x67, 0xD1, 0x11, 0x7C, 0xC4, 0x28, 0x2E, 0x36, 0x92, 0x73, + 0x8E, 0xE6, 0x9C, 0x23, 0x6A, 0x89, 0xAD, 0x52, 0xE7, 0xB8, 0x3A, 0xDF, 0x5E, 0x38, 0xEC, 0xA7, + 0x45, 0xB2, 0x5F, 0xB2, 0xD9, 0x9D, 0x96, 0xE1, 0xD4, 0x16, 0xBF, 0x56, 0xD0, 0x2A, 0xB3, 0xB0, + 0x7E, 0xFE, 0x55, 0xB0, 0x7E, 0x79, 0x12, 0xAC, 0x0F, 0xE5, 0x71, 0x1E, 0x0B, 0xE8, 0xB9, 0x05, + 0x75, 0xDD, 0x7C, 0xFA, 0xCE, 0xC2, 0xB6, 0xFC, 0x94, 0x0E, 0x96, 0xB3, 0x9F, 0x68, 0x84, 0xD7, + 0xE8, 0xE1, 0xDB, 0x1A, 0x8B, 0x68, 0xCA, 0xA3, 0x15, 0xAB, 0x31, 0x5C, 0x92, 0xFF, 0xD5, 0x4E, + 0xC7, 0x59, 0xDF, 0x68, 0x91, 0x97, 0x2F, 0x95, 0xAD, 0x27, 0xFF, 0x8C, 0xCC, 0xC6, 0x82, 0x4A, + 0x8B, 0x46, 0x01, 0x42, 0x7D, 0xEA, 0xAC, 0x62, 0xAE, 0x3A, 0xA7, 0x45, 0xC4, 0x7F, 0x24, 0x8C, + 0x9B, 0x62, 0x78, 0xD9, 0x2F, 0x8B, 0x8B, 0x54, 0xD1, 0xE4, 0x5B, 0xED, 0x3A, 0x30, 0xD3, 0xD9, + 0x61, 0x40, 0x5B, 0x41, 0xCC, 0x3E, 0x20, 0x62, 0xF6, 0x4B, 0x75, 0xA9, 0x7A, 0x28, 0xD9, 0x13, + 0x66, 0xA1, 0x04, 0x0B, 0xED, 0x09, 0x79, 0x6B, 0x63, 0x4F, 0x38, 0xC7, 0xAE, 0xA9, 0xBA, 0x45, + 0x61, 0x22, 0x9C, 0x77, 0x4F, 0x58, 0x01, 0x97, 0xAD, 0x77, 0x8F, 0xD8, 0x13, 0x3E, 0x1A, 0x23, + 0x33, 0xE6, 0x1F, 0x8D, 0xB3, 0xFA, 0xDE, 0xCB, 0x36, 0xA0, 0x73, 0xEC, 0xBD, 0x6C, 0xC3, 0x53, + 0x61, 0xEF, 0xA5, 0x34, 0x4B, 0x77, 0x41, 0xB5, 0x79, 0x1B, 0x59, 0x36, 0x3E, 0xC5, 0xCD, 0x2C, + 0xFB, 0x3C, 0x6F, 0x1A, 0x24, 0xD3, 0xA0, 0x3B, 0x37, 0x00, 0x8E, 0xF7, 0xE7, 0xF3, 0xCD, 0xE9, + 0x79, 0xB8, 0xF1, 0xBE, 0xA6, 0x6C, 0x11, 0x32, 0x3F, 0x9B, 0xE4, 0x16, 0x35, 0xEC, 0xFB, 0xC2, + 0x14, 0x41, 0x1F, 0x56, 0xF7, 0xDD, 0xC0, 0x53, 0x03, 0x1C, 0xD3, 0x39, 0x3C, 0x2B, 0x5A, 0x66, + 0x96, 0x81, 0x93, 0x06, 0x07, 0xEA, 0xB0, 0x0E, 0x59, 0x7A, 0x03, 0xE1, 0xB3, 0xBB, 0x08, 0xBF, + 0x53, 0xDC, 0x6A, 0xB0, 0xCA, 0xDB, 0xD6, 0xAB, 0xA2, 0x13, 0x9A, 0xDD, 0xC5, 0xB2, 0xDE, 0x19, + 0xB5, 0x7A, 0x13, 0xCB, 0xF1, 0x81, 0xB8, 0x6F, 0xF1, 0xFF, 0x67, 0x22, 0xBF, 0xBE, 0x55, 0xE4, + 0x5C, 0x3C, 0x7B, 0xEC, 0x6A, 0x3A, 0x93, 0x98, 0x5A, 0xCD, 0x72, 0x08, 0xC6, 0x82, 0x78, 0xFE, + 0x42, 0xEF, 0xCF, 0x69, 0x40, 0xA7, 0xEE, 0xB0, 0x56, 0x12, 0x24, 0xFB, 0x60, 0x6C, 0x19, 0x31, + 0x51, 0xCE, 0x4C, 0x97, 0xEB, 0xD4, 0xBF, 0xF6, 0x4F, 0x61, 0x5B, 0x14, 0x46, 0xDF, 0x9D, 0x5E, + 0xEF, 0xF8, 0x90, 0x3B, 0x05, 0x37, 0x65, 0x45, 0xC0, 0xF7, 0x4A, 0x45, 0x8A, 0x00, 0xB1, 0x94, + 0x78, 0x1C, 0x6D, 0x78, 0xCE, 0xDC, 0x38, 0x86, 0x5F, 0xBC, 0x67, 0xC0, 0xD5, 0x79, 0xA6, 0x3E, + 0x75, 0x9E, 0xB1, 0x4F, 0xDD, 0x67, 0xEA, 0x53, 0xF7, 0x19, 0xFB, 0xB4, 0xFE, 0x4C, 0x7D, 0x5A, + 0x5F, 0x66, 0x9F, 0x50, 0x37, 0x49, 0x96, 0xCE, 0xD9, 0x6D, 0x62, 0xF8, 0xBE, 0x73, 0xC5, 0xF8, + 0xCF, 0x7F, 0x12, 0xB5, 0x6E, 0xA1, 0x4D, 0x34, 0xD3, 0x28, 0x1A, 0xA7, 0x8D, 0x73, 0xD3, 0x64, + 0x6B, 0x73, 0x73, 0xDD, 0x70, 0x91, 0xB3, 0x8F, 0x33, 0xFA, 0xF0, 0x60, 0xB3, 0xD9, 0x80, 0xBA, + 0x4F, 0xDE, 0xE2, 0x46, 0xDB, 0x58, 0x6A, 0xBE, 0x3C, 0x12, 0xB9, 0x6F, 0x4B, 0xDC, 0xB1, 0x3E, + 0x99, 0x24, 0xF4, 0xCE, 0x64, 0x3C, 0x1E, 0x91, 0x69, 0xFC, 0x85, 0x4F, 0x17, 0x07, 0x67, 0x84, + 0x57, 0x60, 0xC7, 0x1A, 0xBC, 0x80, 0xF4, 0xDD, 0x80, 0x04, 0x21, 0x23, 0x85, 0xB7, 0xF1, 0x88, + 0x9B, 0xA0, 0xCB, 0x99, 0xC4, 0xE8, 0xBE, 0x4B, 0x7C, 0x76, 0x08, 0x55, 0x44, 0x58, 0xAA, 0x64, + 0xF9, 0x01, 0x9F, 0xD5, 0x99, 0xA6, 0x07, 0xF7, 0xCE, 0xE9, 0x49, 0x1B, 0xB9, 0x77, 0xD0, 0x16, + 0xA3, 0x77, 0x2E, 0x47, 0x7E, 0x00, 0xFD, 0x8D, 0x39, 0x1F, 0x61, 0x73, 0xDF, 0xE9, 0x3A, 0x86, + 0xA5, 0xD6, 0x69, 0xC1, 0xF7, 0x56, 0x57, 0xDD, 0x2A, 0x28, 0xC7, 0x8F, 0x33, 0x2C, 0x5F, 0x8E, + 0xEF, 0x03, 0x5B, 0x65, 0x97, 0x8C, 0xB1, 0x92, 0x65, 0x68, 0xED, 0xEF, 0x96, 0x43, 0xFE, 0x4C, + 0xBA, 0x25, 0x5E, 0xAF, 0x02, 0xAA, 0xB5, 0x76, 0x05, 0x7B, 0x13, 0x25, 0x9A, 0x75, 0xCE, 0xE1, + 0xC9, 0xDB, 0x1E, 0xC3, 0x0E, 0x2B, 0x02, 0x1B, 0x45, 0x88, 0xB9, 0xC9, 0xA8, 0xAD, 0x65, 0xB1, + 0xC8, 0x8E, 0xD3, 0xB1, 0xB8, 0x8B, 0xD3, 0xA3, 0xE3, 0x52, 0xF3, 0xCF, 0x48, 0x3E, 0xB8, 0xB6, + 0x96, 0xF1, 0x47, 0xB4, 0x3F, 0x7C, 0x7F, 0x70, 0xA6, 0xF2, 0x46, 0x8D, 0x5B, 0xD2, 0x99, 0x73, + 0x7C, 0xB6, 0xC7, 0xCF, 0x69, 0x72, 0x10, 0xC7, 0x67, 0x35, 0x89, 0x21, 0x41, 0x10, 0xB4, 0xA5, + 0xFF, 0xCB, 0x7C, 0x39, 0x2A, 0xCE, 0x3D, 0x38, 0x03, 0xC5, 0xE1, 0x69, 0xEF, 0xC9, 0x71, 0xBC, + 0xE3, 0x19, 0xF8, 0x9F, 0x1C, 0x4F, 0x6F, 0x72, 0x05, 0xFF, 0x2E, 0x17, 0x8D, 0x10, 0xD9, 0x14, + 0xC5, 0xFB, 0x24, 0x19, 0x0B, 0xBD, 0xEC, 0x98, 0x7A, 0xD9, 0xB1, 0xEA, 0xE5, 0xC5, 0x30, 0x9D, + 0x2E, 0x15, 0x91, 0x3A, 0x79, 0x2F, 0xFA, 0xE2, 0xA0, 0x29, 0x6D, 0x51, 0xC5, 0xDF, 0x6A, 0x59, + 0xAD, 0x52, 0x5A, 0x01, 0xDE, 0xBC, 0x8B, 0xD5, 0x51, 0x79, 0xB6, 0x4C, 0x1B, 0x36, 0x7C, 0x85, + 0xE2, 0x6D, 0x18, 0xC1, 0x92, 0x94, 0x2D, 0x59, 0xF3, 0xD9, 0x21, 0x25, 0x38, 0x95, 0xFC, 0x86, + 0xCA, 0x1F, 0xBA, 0x5A, 0x59, 0x5B, 0x33, 0x95, 0x8B, 0x3A, 0x5F, 0x3B, 0xAF, 0xBA, 0xED, 0xCE, + 0xD6, 0xCB, 0xB6, 0xD3, 0xEE, 0x74, 0xD7, 0x15, 0x2C, 0x65, 0x6D, 0xC5, 0x44, 0x4C, 0x1B, 0x6F, + 0xB4, 0x3B, 0xA0, 0xFA, 0xAA, 0x36, 0x96, 0x66, 0x98, 0x84, 0xBD, 0x72, 0xF3, 0x7C, 0xE2, 0x74, + 0x37, 0x37, 0xDB, 0xE9, 0xFF, 0xAB, 0xA3, 0x97, 0x66, 0xC5, 0x4B, 0xA7, 0x6A, 0xA3, 0x5C, 0xC0, + 0x81, 0x4D, 0x6A, 0x23, 0x73, 0x43, 0x76, 0x7A, 0x71, 0x36, 0x9F, 0x3E, 0xB6, 0xFA, 0xA7, 0x00, + 0xE1, 0x70, 0x78, 0x74, 0x37, 0x0E, 0x03, 0x2E, 0x3E, 0xEB, 0x80, 0xFB, 0x85, 0xBC, 0x89, 0x65, + 0x6B, 0xF3, 0x0B, 0x59, 0x66, 0xF2, 0x38, 0xA0, 0x99, 0xDE, 0xAF, 0x31, 0xD0, 0xD3, 0xF7, 0xD9, + 0x9D, 0xE4, 0x16, 0x59, 0x45, 0x87, 0x90, 0xE2, 0x1C, 0x5C, 0x67, 0xC2, 0xE9, 0x2C, 0x0A, 0xFC, + 0x3C, 0x0C, 0x61, 0xF7, 0x3B, 0x64, 0x83, 0x8C, 0x4E, 0x4F, 0xC7, 0x70, 0x6C, 0x73, 0x97, 0xA7, + 0xD3, 0xC2, 0xAF, 0x9A, 0xDF, 0x73, 0x6E, 0x44, 0x7E, 0x3C, 0x16, 0xD7, 0xAB, 0x9F, 0x04, 0x5B, + 0xEE, 0x53, 0x1B, 0x67, 0xDE, 0xD5, 0x63, 0x4F, 0xC4, 0xAB, 0x18, 0xE1, 0x2A, 0x6C, 0x3A, 0xC7, + 0xE5, 0x18, 0x1E, 0x64, 0x57, 0x4E, 0x94, 0x94, 0x58, 0x95, 0xFA, 0x65, 0xA8, 0x39, 0x8D, 0x17, + 0x2A, 0x37, 0x47, 0x93, 0x6B, 0x9F, 0x9F, 0x8C, 0xB2, 0xBF, 0x2F, 0x27, 0x71, 0x66, 0xCA, 0xE8, + 0x0C, 0x13, 0xF6, 0x8C, 0x8D, 0x61, 0x72, 0x80, 0xDD, 0xAC, 0xE5, 0x41, 0x46, 0x2F, 0x6C, 0xB7, + 0xE5, 0x21, 0x7D, 0x90, 0x1F, 0x11, 0xB0, 0x27, 0x3B, 0x34, 0x62, 0x69, 0xF1, 0xA6, 0x92, 0xA8, + 0x24, 0xDF, 0x7A, 0x51, 0xC3, 0x3D, 0x95, 0xA8, 0x27, 0x39, 0xD8, 0x6D, 0x87, 0xA8, 0x39, 0x78, + 0xF3, 0x50, 0xFA, 0x7A, 0xEC, 0xDE, 0xD2, 0xFD, 0x24, 0xA8, 0x03, 0xCD, 0x67, 0xA0, 0x41, 0x40, + 0x0D, 0x33, 0x45, 0xC2, 0x22, 0x86, 0x25, 0x10, 0x98, 0xC5, 0x9D, 0xFD, 0x69, 0xFA, 0x05, 0xD3, + 0x30, 0xF4, 0x0C, 0x94, 0x5C, 0xE3, 0x69, 0x73, 0x34, 0xCA, 0x46, 0xA9, 0xD6, 0xE7, 0xDD, 0xE5, + 0x75, 0x39, 0xFE, 0x61, 0xFB, 0xFC, 0x0F, 0xED, 0xEA, 0x60, 0x85, 0x5B, 0xC3, 0xF8, 0x18, 0x14, + 0x68, 0x85, 0x36, 0x11, 0x5D, 0x9F, 0xBA, 0x7E, 0xD2, 0x6E, 0xB7, 0xEB, 0x6A, 0x40, 0x81, 0x5D, + 0x2A, 0xED, 0xF1, 0x2C, 0x69, 0x30, 0x8B, 0xD9, 0xDB, 0xD7, 0x69, 0x0F, 0x72, 0xD7, 0xA9, 0x7C, + 0x5D, 0x25, 0xBD, 0xC4, 0x65, 0xEC, 0x9D, 0xD4, 0x61, 0x92, 0xCB, 0xE5, 0x6B, 0x15, 0xF2, 0x38, + 0xF6, 0xDC, 0x5B, 0xEC, 0x54, 0xBB, 0xAD, 0x1D, 0x72, 0x69, 0x77, 0x52, 0x6A, 0xF9, 0x2D, 0xE9, + 0x56, 0xD9, 0x18, 0xB4, 0x34, 0x30, 0xFC, 0x7E, 0x9D, 0x35, 0x8E, 0x53, 0x0F, 0xD2, 0x56, 0x02, + 0xC6, 0x1F, 0x15, 0x1F, 0xBD, 0x84, 0x18, 0xE9, 0x47, 0xC5, 0x49, 0x2F, 0x21, 0x56, 0x7A, 0x09, + 0xF1, 0xD2, 0x8F, 0x8C, 0x99, 0x7E, 0x74, 0xF0, 0xF3, 0x52, 0x02, 0xA0, 0x1F, 0x11, 0x04, 0xBD, + 0xE4, 0x40, 0x68, 0xEB, 0x75, 0x4F, 0x9C, 0x48, 0xBC, 0xDD, 0xFF, 0x98, 0xB5, 0xE5, 0xC7, 0xD3, + 0xFC, 0x05, 0x7A, 0xF9, 0x09, 0xD5, 0x5C, 0x66, 0x91, 0x3D, 0x98, 0x17, 0x6F, 0xF4, 0x48, 0x6E, + 0xF9, 0x1E, 0x17, 0x33, 0xD3, 0x26, 0x57, 0x77, 0x6A, 0x9D, 0x77, 0x67, 0x3D, 0x9B, 0x23, 0x45, + 0x10, 0xF5, 0xA7, 0x3F, 0x91, 0x82, 0x66, 0x20, 0x27, 0x43, 0x96, 0x62, 0x60, 0xEE, 0xA6, 0xFB, + 0xD4, 0x3F, 0x0C, 0x27, 0x0B, 0x21, 0xFD, 0xF0, 0xF1, 0x74, 0xAF, 0x67, 0xA5, 0xB7, 0xA9, 0x2F, + 0x8A, 0xB6, 0x60, 0xDC, 0x99, 0x4A, 0x5B, 0x92, 0x19, 0x03, 0xB9, 0x2C, 0x3D, 0x37, 0x61, 0x08, + 0xFF, 0x81, 0x9D, 0x0E, 0xBB, 0x29, 0x99, 0xD5, 0x51, 0xC4, 0x26, 0x17, 0xAC, 0x95, 0x15, 0x53, + 0x56, 0xAC, 0x42, 0x61, 0xF6, 0xD8, 0x76, 0xBF, 0x09, 0xBB, 0xBE, 0xEF, 0x27, 0x27, 0xEE, 0x38, + 0xBF, 0x42, 0x35, 0xF2, 0x03, 0xF8, 0xC7, 0xBD, 0x6B, 0x91, 0x2B, 0x56, 0x22, 0x5D, 0x94, 0x6C, + 0x65, 0x7A, 0xE4, 0xF8, 0x50, 0x9E, 0xE6, 0xE9, 0xF9, 0x67, 0x96, 0x2B, 0x45, 0x10, 0x39, 0x72, + 0xE3, 0xEF, 0xBC, 0x84, 0x83, 0x52, 0x4B, 0x99, 0x20, 0xF1, 0xD6, 0x6F, 0x10, 0x2B, 0x3F, 0x40, + 0xE0, 0x1F, 0x76, 0x91, 0x02, 0xFE, 0xA1, 0xC1, 0xA0, 0xC0, 0x38, 0x76, 0xC8, 0x9B, 0x37, 0x1C, + 0x1B, 0x0C, 0x11, 0x8C, 0x96, 0x63, 0x8C, 0x54, 0xC9, 0xFD, 0xCA, 0x82, 0x8B, 0x9B, 0x52, 0x63, + 0xA9, 0x6B, 0x33, 0x07, 0xB7, 0x7C, 0x40, 0x4C, 0xEF, 0x66, 0x7A, 0x17, 0x54, 0x53, 0x9F, 0x69, + 0xCC, 0x2B, 0x70, 0xC2, 0x12, 0xD9, 0x13, 0xE3, 0x0B, 0x52, 0xEC, 0x95, 0xB1, 0x31, 0xAC, 0x08, + 0xB8, 0x25, 0xD2, 0x87, 0x2E, 0x0B, 0x11, 0x92, 0x2F, 0xB1, 0xB3, 0x07, 0xB4, 0xD4, 0x40, 0xBB, + 0x6D, 0xE9, 0xCE, 0x7A, 0xD6, 0x4B, 0xAC, 0x65, 0x59, 0xC8, 0xA5, 0x94, 0x30, 0x1E, 0x4D, 0xF8, + 0xCB, 0x8D, 0xB0, 0x87, 0x17, 0x90, 0xF2, 0x5C, 0x38, 0xD2, 0xF5, 0xF8, 0xDB, 0x34, 0xE9, 0x0E, + 0x86, 0x05, 0xF2, 0x34, 0x4E, 0xBE, 0x07, 0x46, 0x91, 0x7F, 0x7D, 0x9F, 0xE5, 0x8B, 0x6A, 0xC8, + 0xE2, 0xD1, 0xCC, 0x05, 0x40, 0x6D, 0x57, 0xF5, 0x71, 0x33, 0xED, 0x5D, 0x35, 0x23, 0x48, 0x39, + 0x1B, 0x62, 0x24, 0x54, 0x7A, 0x5C, 0xED, 0x9A, 0xF5, 0x84, 0x4C, 0x82, 0xEF, 0x01, 0xDE, 0xBC, + 0xDF, 0xFE, 0x21, 0xA5, 0x87, 0xCD, 0x0B, 0xDB, 0xD3, 0x70, 0x6F, 0xC8, 0x6A, 0xE7, 0xA5, 0xC3, + 0x67, 0x85, 0xAD, 0x1C, 0x96, 0xAD, 0x97, 0xDA, 0xA4, 0x30, 0x98, 0x91, 0x07, 0x5F, 0xBD, 0xE4, + 0x9E, 0x81, 0x97, 0xCE, 0x8F, 0xC9, 0x86, 0x92, 0x29, 0x24, 0xA4, 0x47, 0x92, 0xF3, 0x34, 0x30, + 0x74, 0xDB, 0x26, 0x90, 0x3C, 0x03, 0xD8, 0x02, 0x12, 0xC9, 0x1A, 0xFE, 0x4B, 0x24, 0xFF, 0x25, + 0x92, 0x95, 0x45, 0xD2, 0x10, 0x9F, 0x3F, 0xEC, 0x28, 0x9A, 0xB1, 0x9C, 0x11, 0x5C, 0xCF, 0xC6, + 0xFC, 0x72, 0x10, 0xBB, 0xC9, 0xF1, 0x03, 0xF1, 0xA1, 0x74, 0x51, 0x90, 0x49, 0x19, 0x47, 0xB0, + 0x11, 0xC3, 0xD5, 0x2A, 0x9F, 0x69, 0x8B, 0xCD, 0xA0, 0xB2, 0x01, 0x58, 0x94, 0x12, 0x65, 0x30, + 0xF2, 0xBC, 0x31, 0xB8, 0xFE, 0x79, 0x04, 0x9F, 0xB0, 0xBA, 0xA1, 0xB6, 0x6C, 0x87, 0xAD, 0x74, + 0x9A, 0x62, 0x39, 0xD8, 0x53, 0x6B, 0x43, 0x1C, 0xDC, 0x04, 0xC7, 0x4D, 0x5C, 0xDF, 0xC9, 0x16, + 0x66, 0x2D, 0xC5, 0x8E, 0x74, 0x47, 0x5C, 0x5D, 0x93, 0xF3, 0x95, 0x54, 0xCC, 0x1B, 0x86, 0xAC, + 0x91, 0xD6, 0x69, 0xD9, 0xC8, 0x90, 0xEE, 0x77, 0x6B, 0x8A, 0xAF, 0x14, 0x1A, 0x54, 0x2A, 0x05, + 0x67, 0x86, 0x1B, 0xF3, 0xCC, 0x6B, 0x31, 0xEB, 0x6E, 0xCA, 0x66, 0xC1, 0x02, 0xAB, 0x0D, 0x69, + 0xDC, 0xC3, 0xCF, 0x8D, 0xC8, 0x85, 0x8D, 0xC7, 0x8A, 0xE6, 0xA1, 0x80, 0x80, 0x06, 0xC9, 0xAF, + 0x67, 0x0F, 0x22, 0xAD, 0xB2, 0x65, 0xB5, 0x53, 0x98, 0x63, 0xC0, 0x96, 0xCF, 0x73, 0xA1, 0xFD, + 0xC5, 0xC3, 0x12, 0xB4, 0x56, 0xF1, 0x48, 0x0A, 0xC7, 0xFF, 0xD2, 0x87, 0x32, 0x0D, 0x71, 0xD4, + 0x47, 0x34, 0x0F, 0x7D, 0xC4, 0x81, 0xFD, 0x41, 0xED, 0xFA, 0x85, 0x38, 0x99, 0x9F, 0x7F, 0x2B, + 0x39, 0x67, 0xE6, 0x65, 0xA1, 0xF4, 0xE4, 0x2E, 0x67, 0x98, 0x91, 0x24, 0x9A, 0x31, 0x59, 0x7E, + 0x65, 0xF7, 0x0F, 0x98, 0x55, 0x3E, 0xA7, 0x99, 0xED, 0xA5, 0xD8, 0xE3, 0xB9, 0xCE, 0x37, 0x31, + 0x5F, 0xD8, 0x37, 0x3F, 0x3E, 0x75, 0x4F, 0x1B, 0xDC, 0x73, 0x99, 0x96, 0x37, 0x9B, 0xBC, 0x2C, + 0xAD, 0xFE, 0x86, 0x38, 0xEA, 0x87, 0x5D, 0x4C, 0xA5, 0xD1, 0xB4, 0x42, 0xEF, 0xCC, 0x80, 0xDE, + 0x51, 0xA1, 0x77, 0x74, 0xE8, 0x9D, 0x52, 0xE8, 0xDD, 0x19, 0xD0, 0xBB, 0x2A, 0xF4, 0xAE, 0x0E, + 0xBD, 0x5B, 0x0A, 0x7D, 0x7D, 0x06, 0xF4, 0x75, 0x15, 0xFA, 0xBA, 0x0E, 0x7D, 0x3D, 0x83, 0xFE, + 0x5B, 0x12, 0x61, 0xE9, 0xA6, 0x33, 0xCA, 0xF0, 0x95, 0xEB, 0xE1, 0xEF, 0x78, 0x8B, 0x73, 0x96, + 0x40, 0xA7, 0x27, 0x7A, 0x05, 0xD7, 0x91, 0x85, 0x88, 0xB7, 0x93, 0xF0, 0x03, 0x3E, 0xC0, 0x08, + 0x25, 0x78, 0x34, 0x85, 0x23, 0x20, 0x47, 0xCA, 0xCF, 0x88, 0xC5, 0x43, 0x92, 0x3A, 0x3C, 0xBE, + 0xC0, 0x4E, 0xCC, 0x63, 0xB9, 0xA0, 0x06, 0xE4, 0xF9, 0x1E, 0x20, 0xF3, 0xBD, 0x6E, 0x95, 0xAE, + 0xF3, 0x2D, 0x46, 0xC7, 0x72, 0x76, 0x29, 0xFC, 0x52, 0x00, 0x67, 0x46, 0x70, 0x24, 0x87, 0xF0, + 0x08, 0xD9, 0x01, 0x14, 0x3F, 0xB6, 0x53, 0xA4, 0x53, 0xE0, 0xD6, 0x44, 0xDE, 0x14, 0xB9, 0x9B, + 0xCB, 0x2E, 0x01, 0xCB, 0xBE, 0x90, 0xBE, 0x1E, 0xCF, 0x5F, 0xF9, 0x4E, 0xB5, 0x25, 0x17, 0x62, + 0x85, 0x2B, 0xD6, 0x96, 0x56, 0xB9, 0x34, 0x98, 0xC4, 0xC8, 0x01, 0xFF, 0xFA, 0xCE, 0x20, 0xAF, + 0xDD, 0xC3, 0xFB, 0xBC, 0x3B, 0xE4, 0xAB, 0xFC, 0xDC, 0xB9, 0x35, 0xEB, 0x5D, 0x11, 0x7C, 0xF3, + 0x22, 0xB7, 0x9A, 0x55, 0x1E, 0x11, 0xF0, 0xA7, 0x94, 0x9C, 0x02, 0x0B, 0x63, 0x09, 0xE8, 0x32, + 0x10, 0xF7, 0x1C, 0xC4, 0x7D, 0x39, 0x88, 0x7B, 0x0B, 0x88, 0xC2, 0x07, 0x19, 0x4C, 0x38, 0x5F, + 0xEF, 0xB5, 0xCB, 0xE8, 0x5A, 0x80, 0x95, 0x0A, 0x22, 0xB3, 0x9E, 0x77, 0xC8, 0x5D, 0xE1, 0x3B, + 0x2C, 0x2A, 0xBF, 0x00, 0x81, 0x82, 0x38, 0xFD, 0xB6, 0x42, 0x3A, 0xF6, 0x37, 0x66, 0x66, 0x67, + 0xE5, 0x66, 0x19, 0x28, 0x39, 0xF9, 0x3F, 0xE1, 0xD1, 0x09, 0xC0, 0xEF, 0x2C, 0x77, 0xC8, 0x55, + 0x29, 0x64, 0x24, 0xDF, 0x7D, 0x43, 0x3B, 0xA1, 0xE0, 0x7D, 0x5D, 0x95, 0x18, 0xA7, 0xD2, 0xB3, + 0xB3, 0x88, 0x43, 0x6D, 0xB8, 0xA3, 0x49, 0xB7, 0x6E, 0xF6, 0x16, 0x1E, 0x41, 0x1D, 0xF1, 0x13, + 0x1D, 0xF5, 0x79, 0x34, 0xA1, 0xB3, 0xF2, 0xB4, 0x00, 0x7C, 0xBB, 0x7C, 0xC5, 0xFC, 0xE7, 0x89, + 0x3F, 0x98, 0x84, 0x93, 0xB8, 0x95, 0x4F, 0x4B, 0xD8, 0xB3, 0x39, 0xB5, 0xED, 0x05, 0x90, 0x57, + 0x30, 0xC1, 0x4B, 0x76, 0xCA, 0xDA, 0xC5, 0x19, 0xDB, 0xB5, 0x19, 0xEE, 0xA6, 0xAF, 0x40, 0x47, + 0xA1, 0x12, 0x94, 0xC3, 0xB5, 0x70, 0x15, 0xE4, 0x9E, 0x2C, 0x2D, 0xF5, 0x9A, 0x94, 0xBB, 0x3C, + 0x33, 0x26, 0x67, 0xAC, 0x7A, 0x2C, 0x15, 0xF8, 0x45, 0xF8, 0xD6, 0x45, 0xBD, 0x78, 0x7F, 0x48, + 0xAF, 0xDD, 0xC9, 0x30, 0x89, 0xB5, 0xBD, 0xAC, 0x5A, 0x68, 0x66, 0x0C, 0xAF, 0xA5, 0x45, 0x64, + 0x6F, 0x0C, 0xA6, 0x2A, 0xF5, 0x94, 0x78, 0x01, 0x26, 0xCD, 0xFC, 0x01, 0x58, 0x8E, 0x0E, 0x4F, + 0xA4, 0xEC, 0x59, 0x20, 0x35, 0x54, 0xEC, 0xD5, 0xD2, 0x56, 0xA7, 0x65, 0x39, 0xCE, 0xF8, 0x3B, + 0x8D, 0xC2, 0x9C, 0x1F, 0x45, 0x8C, 0x70, 0x8A, 0xFA, 0x6B, 0x19, 0x02, 0xB3, 0xEF, 0x3F, 0xD4, + 0xAA, 0xF2, 0x48, 0x95, 0x50, 0x55, 0x97, 0xEA, 0x89, 0x3D, 0x8A, 0xF5, 0x27, 0xB9, 0x2B, 0x12, + 0x56, 0x1C, 0x9B, 0x34, 0x53, 0x88, 0xCA, 0xCD, 0xDF, 0x4E, 0xC2, 0x13, 0x59, 0xFE, 0xEC, 0xA9, + 0x4E, 0x1E, 0x4C, 0xA9, 0x3B, 0x1D, 0x51, 0xD7, 0x14, 0x33, 0x95, 0x5D, 0x92, 0xDB, 0x07, 0xFB, + 0x74, 0x7A, 0x72, 0xB4, 0x77, 0xC9, 0x53, 0xCE, 0xA4, 0x7C, 0xEF, 0x58, 0xAB, 0xF4, 0x2A, 0x54, + 0xB9, 0x98, 0x5D, 0xE5, 0x27, 0xA9, 0xCA, 0x86, 0xAD, 0xCA, 0xF9, 0xC9, 0x81, 0x06, 0xC5, 0xD2, + 0x51, 0x11, 0xD6, 0xFF, 0xDB, 0xEB, 0xAB, 0x5C, 0xE5, 0xFC, 0x97, 0x93, 0xCB, 0xF3, 0xBD, 0x9F, + 0x7F, 0x99, 0x51, 0xA5, 0xF7, 0xF6, 0x7C, 0xFF, 0x17, 0x93, 0x65, 0x26, 0xD3, 0xF0, 0x39, 0x34, + 0xBB, 0x02, 0x96, 0x1E, 0x4B, 0x73, 0x36, 0xD1, 0x7F, 0x59, 0x86, 0x52, 0x7E, 0x54, 0xAD, 0x42, + 0xBD, 0x17, 0x5A, 0x3D, 0xC7, 0x5E, 0xEF, 0x65, 0x45, 0x78, 0x2F, 0x6D, 0xF0, 0xAC, 0x35, 0x5F, + 0x55, 0x84, 0xF8, 0xAA, 0x1A, 0x85, 0x9D, 0x6E, 0x35, 0x78, 0x9D, 0x6E, 0x35, 0x78, 0xDD, 0x75, + 0x47, 0x87, 0x57, 0xD0, 0x15, 0xF6, 0xB8, 0x9E, 0x53, 0x05, 0x28, 0x7F, 0x86, 0xCF, 0x52, 0xD3, + 0x2A, 0x0F, 0xB0, 0x4F, 0xC6, 0x9B, 0xCC, 0x53, 0xDF, 0x4B, 0x6E, 0xB0, 0xF9, 0x1C, 0x32, 0xE1, + 0x54, 0x14, 0x8A, 0xEE, 0x92, 0x85, 0xA2, 0xBB, 0x74, 0xA1, 0xE8, 0x2E, 0x59, 0x28, 0xBA, 0xFF, + 0x53, 0x85, 0x62, 0x12, 0xB3, 0x2C, 0x3C, 0xF9, 0xF1, 0x4A, 0x6C, 0x39, 0x70, 0xE0, 0xF9, 0x4D, + 0x72, 0x30, 0xEC, 0xFD, 0xE7, 0x6D, 0x4B, 0xA5, 0xCF, 0x5A, 0xA5, 0xCF, 0xB6, 0x4A, 0x5F, 0xB4, + 0x4A, 0x5F, 0x34, 0x65, 0x0F, 0x24, 0xA5, 0x29, 0xC1, 0xCB, 0xC9, 0x32, 0xCF, 0x41, 0xA4, 0x27, + 0xC1, 0x2B, 0x9C, 0x73, 0x48, 0x0F, 0x78, 0xEB, 0xB5, 0xDF, 0xEF, 0x1D, 0x5D, 0xEE, 0x9D, 0x1D, + 0x58, 0x2A, 0xEF, 0x0D, 0x93, 0x6C, 0x68, 0xD4, 0x18, 0xDB, 0x91, 0x1B, 0x7D, 0x57, 0x02, 0x6C, + 0x3B, 0xB3, 0xA2, 0x68, 0x67, 0xB4, 0xEF, 0xDA, 0xDA, 0xF3, 0x00, 0xA3, 0x8C, 0x04, 0xD7, 0xFB, + 0x1B, 0xEC, 0x5D, 0x80, 0xDC, 0x86, 0x25, 0x57, 0x39, 0x9A, 0x32, 0xA7, 0x74, 0x0A, 0xCB, 0x66, + 0xCE, 0x3D, 0x23, 0x18, 0x35, 0xAF, 0x64, 0x37, 0x89, 0xE9, 0x9D, 0x9F, 0xE8, 0x71, 0x79, 0xEC, + 0x69, 0x86, 0xDA, 0xC8, 0xF5, 0x83, 0x33, 0x16, 0xDD, 0xBB, 0x9D, 0x27, 0x7D, 0x16, 0xCF, 0x00, + 0x1D, 0x07, 0x67, 0x51, 0x88, 0xA1, 0x63, 0x52, 0x10, 0xAB, 0x8E, 0x1A, 0x21, 0xEF, 0x05, 0x9E, + 0x62, 0x8E, 0xF3, 0x27, 0x9A, 0xF3, 0x84, 0xEC, 0x6A, 0x76, 0xF6, 0x9C, 0x96, 0xA2, 0xFC, 0xEC, + 0xAC, 0x6D, 0xFE, 0xB2, 0x7D, 0x96, 0xEA, 0x19, 0xB7, 0x2B, 0x29, 0x14, 0x19, 0x7E, 0x8A, 0xB3, + 0xA0, 0x47, 0xFC, 0xB3, 0xA5, 0x47, 0x5A, 0x77, 0x53, 0x8C, 0x35, 0xE9, 0x44, 0xF0, 0x00, 0x4C, + 0x4A, 0x7C, 0xCA, 0xE8, 0x86, 0xF2, 0x43, 0xC1, 0xA3, 0xDE, 0xD9, 0x7A, 0x97, 0xDC, 0xB0, 0x97, + 0x8D, 0xA0, 0x0B, 0xD1, 0x08, 0x0A, 0xD9, 0x83, 0x47, 0xE3, 0x04, 0x9F, 0x9A, 0x60, 0xAE, 0xF9, + 0x10, 0xEF, 0xDC, 0x66, 0x7C, 0x22, 0xD7, 0x51, 0x38, 0x22, 0x7B, 0x67, 0xBC, 0xC1, 0x80, 0x8C, + 0x81, 0x34, 0x25, 0xB7, 0x34, 0x03, 0x83, 0x81, 0x7D, 0xE7, 0x1C, 0x8E, 0x9C, 0x6C, 0xF9, 0x10, + 0xC8, 0x89, 0x46, 0x7E, 0x00, 0xBB, 0xA5, 0x1B, 0x1F, 0x0C, 0x5C, 0xF9, 0xE1, 0x0A, 0x7E, 0x0A, + 0x09, 0xDB, 0x00, 0x30, 0xA7, 0xDC, 0xA1, 0x78, 0xD9, 0x22, 0xDB, 0x7A, 0x6B, 0xF9, 0xF1, 0x61, + 0x73, 0x1F, 0x4C, 0x86, 0xC3, 0xA6, 0xE1, 0x7E, 0xD3, 0x73, 0xE6, 0x6B, 0x2C, 0x2D, 0x8B, 0x21, + 0xC4, 0xC7, 0xB6, 0x7A, 0xF0, 0xA7, 0xF7, 0x87, 0x99, 0x77, 0x3B, 0xE5, 0xE4, 0xFF, 0x9F, 0x78, + 0x88, 0x03, 0x81, 0xFF, 0x03, 0x9F, 0x80, 0x69, 0x26, 0x0B, 0x8A, 0x37, 0xBB, 0xD7, 0xE2, 0x71, + 0xBD, 0x4F, 0x63, 0x7C, 0xED, 0xEA, 0x67, 0xD8, 0x42, 0xAA, 0xBB, 0x08, 0x96, 0x7C, 0x97, 0x27, + 0xE1, 0x88, 0x27, 0x57, 0x23, 0x3F, 0x49, 0x5F, 0xE3, 0xC3, 0x17, 0xF2, 0x60, 0x26, 0xB2, 0xA7, + 0x29, 0xBE, 0x3A, 0xDF, 0xA4, 0xE3, 0x14, 0x3C, 0xCF, 0x14, 0x47, 0x2A, 0xF8, 0xB0, 0x0B, 0x1E, + 0x23, 0x2B, 0x61, 0x96, 0x69, 0x79, 0xDB, 0x1D, 0x8F, 0xF9, 0x6C, 0x33, 0x01, 0xB7, 0x18, 0xE2, + 0xA6, 0x04, 0xD5, 0xFD, 0x9B, 0x7B, 0x27, 0x20, 0xFE, 0x72, 0xF2, 0x01, 0x6F, 0x5C, 0x9D, 0x53, + 0xD8, 0xCB, 0x48, 0x0F, 0xBD, 0x60, 0x8D, 0x76, 0x08, 0x20, 0x1B, 0xB5, 0xB3, 0x8F, 0x60, 0x93, + 0x02, 0x47, 0xD7, 0x26, 0xAC, 0x5B, 0x35, 0xA5, 0x0A, 0x9B, 0x67, 0x29, 0x11, 0xEA, 0xE3, 0x5E, + 0x2A, 0x37, 0x2C, 0x9B, 0x6F, 0x4C, 0xFC, 0xCE, 0x0B, 0x7D, 0x3C, 0xFC, 0x1D, 0x2B, 0x91, 0xFA, + 0xE6, 0x7B, 0x2B, 0x2A, 0x3C, 0xE9, 0x01, 0x43, 0x55, 0x6D, 0x97, 0x23, 0xE5, 0xAF, 0xA3, 0x95, + 0x01, 0x36, 0xA7, 0x36, 0x9F, 0x85, 0xF6, 0x5A, 0xB5, 0x92, 0xE9, 0xAD, 0x61, 0x09, 0xA3, 0x01, + 0x4D, 0xCE, 0x5C, 0x3F, 0xA2, 0x1E, 0x53, 0xC2, 0xDA, 0x82, 0x73, 0x95, 0x04, 0x6F, 0x59, 0x15, + 0x5E, 0x68, 0xE1, 0x17, 0x7B, 0x3F, 0x8E, 0x15, 0x32, 0x60, 0x61, 0x92, 0xD0, 0xA0, 0x2D, 0xC7, + 0xC2, 0x8D, 0x29, 0x8D, 0x4E, 0xF6, 0x0E, 0x62, 0xBD, 0xE1, 0xA9, 0x78, 0xBF, 0xC6, 0xEA, 0xB8, + 0x60, 0x38, 0x8F, 0xE2, 0xF1, 0x69, 0x38, 0x3D, 0x83, 0xF6, 0xB1, 0x5D, 0x47, 0x03, 0x75, 0xE7, + 0xD2, 0xE3, 0x6B, 0x2A, 0xE9, 0xE5, 0xCF, 0xB2, 0xD5, 0x58, 0x43, 0xB6, 0xE3, 0x15, 0xD7, 0x26, + 0x0A, 0xBD, 0x28, 0x32, 0x20, 0x85, 0x8E, 0x6C, 0xC7, 0xED, 0x7A, 0x1E, 0x7B, 0xD6, 0x08, 0x3D, + 0x5E, 0x34, 0xC0, 0xB4, 0xB6, 0x87, 0x1F, 0x4F, 0x40, 0x61, 0x27, 0xF8, 0x8D, 0x3F, 0x31, 0xD7, + 0x22, 0x0D, 0x8A, 0x55, 0x9A, 0x64, 0x67, 0x17, 0xA9, 0xCC, 0xC5, 0x5E, 0x30, 0xAF, 0xC2, 0x06, + 0xDE, 0xBC, 0xE4, 0x51, 0x57, 0x5E, 0xC0, 0x61, 0xC1, 0x5B, 0x68, 0xEE, 0xB0, 0x53, 0x67, 0xF8, + 0x85, 0x83, 0xCE, 0xF6, 0xE8, 0x3E, 0x1E, 0x1E, 0xBB, 0x77, 0xF0, 0x8B, 0xB6, 0x59, 0xE7, 0xF5, + 0xBE, 0xFA, 0xDF, 0xDA, 0x61, 0xD0, 0x1F, 0xFA, 0x7D, 0x0C, 0x3D, 0xCD, 0x98, 0xDC, 0xB0, 0x5C, + 0x94, 0x55, 0x6E, 0x44, 0x95, 0xE4, 0x99, 0x29, 0x7A, 0x4B, 0xCE, 0x64, 0x18, 0x87, 0x89, 0x5A, + 0xC1, 0x8E, 0xD7, 0x02, 0xA9, 0x47, 0xFB, 0xB2, 0xE9, 0xD8, 0x76, 0xC8, 0x5A, 0x21, 0x42, 0xD9, + 0x87, 0xF7, 0xA0, 0x6A, 0x04, 0x2B, 0xD4, 0xA5, 0x10, 0x98, 0x63, 0x2E, 0xA3, 0x4F, 0xEA, 0x86, + 0x9D, 0x40, 0x4B, 0xDE, 0xD5, 0xF9, 0xC9, 0x5B, 0x30, 0x89, 0x6B, 0xAE, 0x69, 0x62, 0xD1, 0xA0, + 0xE0, 0x3A, 0x33, 0xD7, 0x34, 0xCC, 0x88, 0x2C, 0xC9, 0x02, 0x67, 0xEF, 0x58, 0xFA, 0xA0, 0xDF, + 0xE3, 0x7B, 0x95, 0x42, 0xAA, 0xD6, 0xA5, 0x22, 0x6A, 0xF3, 0xFE, 0x94, 0x74, 0xDA, 0xDE, 0xA5, + 0xF2, 0x8C, 0x9F, 0x8B, 0x77, 0xF0, 0x71, 0x99, 0x44, 0x79, 0x77, 0x71, 0xD3, 0x51, 0xDA, 0xDB, + 0x41, 0xB6, 0xFD, 0x78, 0x5C, 0x6F, 0xF9, 0xAB, 0x87, 0x4B, 0xEF, 0xEC, 0x3B, 0xFD, 0xA6, 0x83, + 0xB5, 0xAF, 0xBC, 0x2B, 0x25, 0x7D, 0xE5, 0xCC, 0xB0, 0xF4, 0xD5, 0x3C, 0xF1, 0x29, 0xCA, 0x8A, + 0x56, 0x6B, 0x16, 0x3C, 0x79, 0x5A, 0xF8, 0x4C, 0x5F, 0xAA, 0x05, 0xB6, 0x3A, 0xED, 0x8D, 0xE2, + 0xC3, 0x20, 0x25, 0x6A, 0xD4, 0x82, 0xFC, 0x22, 0x8C, 0xFA, 0x37, 0x8B, 0x23, 0xEF, 0x38, 0xDD, + 0xB6, 0x53, 0x01, 0xFB, 0x82, 0xE0, 0x9D, 0xF6, 0xEC, 0x73, 0x2E, 0x4D, 0x80, 0x6C, 0x59, 0x20, + 0x17, 0x97, 0x9B, 0x79, 0x73, 0x4A, 0xE6, 0xD2, 0x20, 0x65, 0xD5, 0x9B, 0x3F, 0x97, 0x1B, 0x97, + 0xB8, 0x4A, 0x20, 0x8A, 0xBB, 0x9F, 0x25, 0x87, 0x5A, 0x4A, 0xF7, 0x2B, 0x3D, 0xB3, 0xA0, 0x75, + 0x9F, 0xB7, 0x79, 0x54, 0xF7, 0x67, 0x81, 0xB0, 0x76, 0x5F, 0x3B, 0x2C, 0x5B, 0x02, 0x0B, 0x4C, + 0x88, 0xB3, 0xD8, 0x60, 0x39, 0x97, 0xE3, 0x4F, 0x58, 0xF2, 0xD4, 0x4F, 0xE6, 0x3B, 0xCD, 0x33, + 0x78, 0x32, 0x13, 0x5E, 0x41, 0x7E, 0x3E, 0x95, 0x3F, 0xE6, 0x1B, 0xA9, 0x8B, 0x73, 0xC6, 0x84, + 0x95, 0x1D, 0xDC, 0x3B, 0x05, 0x52, 0x91, 0x36, 0xD9, 0x77, 0x27, 0xDE, 0xA1, 0xFE, 0xE4, 0xA2, + 0xA6, 0x6E, 0xE5, 0x3B, 0xFB, 0x15, 0x44, 0xA8, 0x02, 0x55, 0x9D, 0x02, 0xCD, 0x5E, 0x89, 0x2A, + 0xB1, 0xE0, 0xCD, 0x49, 0xD5, 0xE2, 0xF8, 0xE6, 0xE2, 0x82, 0x36, 0xCA, 0xB3, 0xB2, 0x68, 0x2E, + 0x3E, 0xE6, 0x15, 0xF3, 0x73, 0x16, 0x0C, 0xFF, 0x78, 0x9C, 0x3E, 0x93, 0xBD, 0x28, 0xEB, 0xAA, + 0x40, 0xB0, 0xAA, 0x04, 0x3D, 0x81, 0xC5, 0x63, 0x15, 0xC2, 0x3C, 0x09, 0x31, 0x4A, 0xC5, 0xE7, + 0x90, 0x26, 0xAE, 0x3F, 0x8C, 0xE7, 0x67, 0xC5, 0x7C, 0xB0, 0x34, 0xA6, 0xC8, 0xCF, 0x07, 0x2F, + 0xCE, 0x0A, 0x19, 0x4A, 0xC9, 0xDC, 0x17, 0xAE, 0x3F, 0xAC, 0x5C, 0xA5, 0xB7, 0xA5, 0xD0, 0x3B, + 0x05, 0x9C, 0x9D, 0x05, 0xDD, 0xBE, 0x4E, 0x48, 0x7E, 0x88, 0x65, 0x2C, 0x12, 0x2A, 0xB8, 0xA2, + 0xB9, 0x60, 0x71, 0x82, 0x3C, 0x7A, 0x65, 0x28, 0x85, 0x57, 0x69, 0x65, 0xD0, 0xB3, 0x07, 0x3E, + 0x96, 0x19, 0x46, 0xA2, 0xBB, 0xA2, 0x29, 0x21, 0xD7, 0x5E, 0x7C, 0x32, 0x54, 0x84, 0x62, 0xED, + 0xB4, 0x92, 0x96, 0xEF, 0xB1, 0xFD, 0xAE, 0x9C, 0xE3, 0x4F, 0x67, 0x41, 0xDE, 0xF0, 0x91, 0x5C, + 0xA8, 0x04, 0xC8, 0xB6, 0xED, 0xCA, 0xF2, 0xD2, 0x2F, 0xC2, 0x05, 0xF5, 0xF8, 0xC4, 0x82, 0x42, + 0xCD, 0x44, 0xFF, 0x94, 0x28, 0x8C, 0xED, 0xC4, 0x13, 0xA0, 0xD2, 0xCE, 0xB6, 0x96, 0x88, 0xE1, + 0xA1, 0xA9, 0x38, 0x24, 0x11, 0x32, 0x6C, 0xC9, 0xF3, 0xC6, 0x05, 0xAF, 0xDE, 0x05, 0x7E, 0xFF, + 0x3B, 0x7A, 0xF3, 0xD8, 0xDB, 0xC6, 0xE9, 0xFE, 0x89, 0xBF, 0x4C, 0xB9, 0xEF, 0x7A, 0x07, 0x98, + 0x0C, 0xAA, 0x61, 0xD6, 0xB1, 0x3F, 0x09, 0x97, 0x65, 0x9A, 0x92, 0xEA, 0xCF, 0xFD, 0x40, 0x9E, + 0x25, 0x63, 0xFB, 0xF3, 0xBE, 0xB6, 0xF1, 0xBC, 0xAF, 0x6C, 0x3C, 0xDF, 0xEB, 0x1A, 0x45, 0x79, + 0x3B, 0x1C, 0x2D, 0xB7, 0x26, 0xBF, 0xCE, 0x8E, 0xE3, 0x47, 0xDC, 0x81, 0xEB, 0x07, 0xB1, 0xB8, + 0x31, 0x07, 0x22, 0xAA, 0x06, 0x55, 0xF9, 0x81, 0x47, 0xEF, 0xB4, 0x98, 0x52, 0xE6, 0xFD, 0xDD, + 0x16, 0x45, 0xF6, 0x87, 0xB3, 0x57, 0x56, 0x58, 0xA9, 0x25, 0x07, 0x7B, 0x44, 0xC6, 0x6E, 0xC4, + 0xDE, 0x1A, 0x97, 0x1F, 0xC9, 0x66, 0xB5, 0xBF, 0xA5, 0x77, 0x65, 0x88, 0x11, 0xBD, 0x99, 0xDD, + 0x4F, 0x90, 0xA5, 0x4E, 0x5A, 0xFA, 0x19, 0x4C, 0xBC, 0x0F, 0x63, 0xF3, 0x26, 0x98, 0x88, 0xF0, + 0xDC, 0xC7, 0x9C, 0x13, 0x2B, 0xA4, 0xCE, 0x42, 0xEC, 0x73, 0xB9, 0x2B, 0x2A, 0xF8, 0x5C, 0x54, + 0xF0, 0xC5, 0x9A, 0x38, 0x1E, 0x7F, 0xAE, 0x22, 0xEA, 0x7E, 0xAF, 0x1C, 0x98, 0x2B, 0xD8, 0xBE, + 0x63, 0x61, 0xAE, 0x96, 0x71, 0x5E, 0xAE, 0xC0, 0x42, 0xC3, 0x9F, 0xB4, 0x63, 0x46, 0x76, 0x38, + 0x7E, 0x8B, 0x12, 0x71, 0xA1, 0x7A, 0xB3, 0x1C, 0x8F, 0x7B, 0x14, 0x8F, 0x88, 0x72, 0x35, 0x95, + 0x9F, 0x44, 0x00, 0x40, 0x71, 0x10, 0xD8, 0xE3, 0xEF, 0x97, 0x4B, 0x71, 0x08, 0xF2, 0xF8, 0x4A, + 0xD7, 0xA6, 0xB0, 0xC9, 0x2E, 0xBB, 0xF6, 0xA3, 0xC5, 0xFE, 0xD9, 0x64, 0x0A, 0x2A, 0x17, 0x48, + 0x14, 0xB6, 0x40, 0x36, 0x89, 0x50, 0xC1, 0x54, 0x78, 0x8C, 0x47, 0x95, 0xC4, 0xB9, 0x67, 0xA3, + 0x76, 0xC8, 0x3A, 0x41, 0x86, 0x61, 0x9F, 0x11, 0xCA, 0x92, 0xC8, 0x64, 0x00, 0x56, 0x48, 0xED, + 0xDF, 0x6A, 0xCD, 0xC2, 0x75, 0x5C, 0x1E, 0x20, 0xA4, 0xA6, 0x4F, 0xB1, 0x1B, 0xA0, 0x31, 0xED, + 0x27, 0x19, 0x95, 0x98, 0x8A, 0xA7, 0x6F, 0xAA, 0xE6, 0xFF, 0x75, 0x19, 0x5A, 0x18, 0xC3, 0xC2, + 0x59, 0xDB, 0xF9, 0x56, 0x54, 0xF7, 0xB3, 0x51, 0xB7, 0x5B, 0x58, 0xF7, 0x8B, 0x51, 0x77, 0x5D, + 0xAF, 0x6B, 0x57, 0x0F, 0xF2, 0x00, 0xDB, 0x42, 0xBB, 0x65, 0xCA, 0x67, 0x55, 0xF9, 0x3C, 0xBB, + 0xCA, 0x97, 0xC2, 0x2A, 0x2A, 0x79, 0x46, 0x8E, 0x91, 0xEC, 0x72, 0xB3, 0xC4, 0x74, 0xE2, 0x46, + 0x91, 0x7B, 0xDF, 0x12, 0x22, 0xC1, 0x72, 0x86, 0x8F, 0xC2, 0x20, 0x8C, 0xC7, 0x6E, 0x9F, 0x12, + 0x76, 0xB8, 0xC8, 0x75, 0xB6, 0x76, 0xAD, 0x39, 0x97, 0x1D, 0xF9, 0x8C, 0xB2, 0x50, 0x2C, 0xC4, + 0xF5, 0x16, 0xD9, 0x66, 0x40, 0xE9, 0x30, 0x95, 0x8F, 0xB9, 0x96, 0x70, 0xEB, 0xB2, 0x08, 0xB2, + 0xC4, 0x08, 0xB9, 0xF3, 0x18, 0x22, 0xA4, 0x1F, 0xCF, 0x4A, 0x17, 0x9F, 0x31, 0x3E, 0x38, 0x8C, + 0xA8, 0x57, 0x9B, 0x91, 0x6F, 0x89, 0x59, 0xC8, 0x8F, 0x47, 0x2D, 0x4A, 0x5F, 0x93, 0x5F, 0xD6, + 0x3E, 0xAF, 0x7D, 0xA9, 0x69, 0xD7, 0x85, 0x2D, 0x4C, 0x78, 0x43, 0x36, 0x9B, 0xE6, 0x3E, 0xAB, + 0x90, 0xBB, 0xB1, 0xFF, 0x77, 0x4A, 0x6C, 0xAA, 0x5C, 0x57, 0xA6, 0x59, 0xF4, 0x73, 0xBE, 0xEA, + 0xCE, 0xBD, 0xCA, 0xE2, 0xE4, 0x0D, 0xC7, 0x4C, 0x14, 0xA4, 0x33, 0xDE, 0x3E, 0xAC, 0x3E, 0x20, + 0x15, 0x22, 0xE6, 0xB9, 0xCE, 0x2B, 0x28, 0x53, 0x98, 0x7F, 0x6A, 0x27, 0x3C, 0xC5, 0x81, 0xB9, + 0x64, 0x9A, 0x55, 0xD3, 0xD9, 0xC5, 0xCA, 0xB5, 0x89, 0x58, 0xC8, 0x0B, 0xBC, 0xA0, 0xC1, 0xDB, + 0x1B, 0x4B, 0xC9, 0x1F, 0x1B, 0xB5, 0xFF, 0x65, 0x6F, 0x27, 0x30, 0x42, 0x73, 0xEA, 0xF6, 0x6F, + 0x1A, 0x05, 0x56, 0xB3, 0xAC, 0xB6, 0xFE, 0xD8, 0x48, 0x6E, 0xFC, 0xB8, 0xC9, 0xBA, 0xD3, 0x68, + 0x96, 0xAF, 0x02, 0x81, 0xBA, 0x0A, 0xB4, 0xE3, 0xC9, 0x55, 0xCC, 0x8D, 0x5C, 0xF6, 0x16, 0x96, + 0x9A, 0xEE, 0x51, 0x02, 0x9B, 0xB5, 0x85, 0xC5, 0x92, 0xDF, 0xCD, 0x4B, 0xB5, 0x5D, 0xB6, 0x7C, + 0xA6, 0x2A, 0x4D, 0xFB, 0xB0, 0xFE, 0x8D, 0x83, 0x90, 0x8D, 0xFB, 0x07, 0xDD, 0xB2, 0x4F, 0xA3, + 0xF3, 0x2A, 0x5B, 0xF7, 0x69, 0x83, 0x59, 0x16, 0xBE, 0x5A, 0xAF, 0x9A, 0x95, 0x9F, 0xB6, 0x59, + 0x9A, 0xA5, 0x9F, 0x67, 0x31, 0x28, 0x37, 0x91, 0x97, 0xF8, 0x1E, 0xDA, 0xB3, 0xBE, 0x82, 0xF6, + 0xAC, 0xAF, 0x9F, 0xFD, 0x8A, 0x56, 0x7F, 0x26, 0x4C, 0x0B, 0x58, 0xFE, 0x69, 0xDB, 0xB9, 0xAD, + 0xFF, 0x4C, 0x1A, 0xE7, 0xDC, 0x01, 0x68, 0x08, 0xA5, 0x5D, 0x80, 0x36, 0x77, 0x14, 0xF3, 0x57, + 0x04, 0xC0, 0x5A, 0x8B, 0x44, 0xB8, 0xAB, 0xAD, 0x2C, 0x95, 0x5C, 0xAD, 0x4C, 0x11, 0x37, 0x7B, + 0x99, 0x2A, 0x21, 0x4F, 0xB4, 0xA3, 0xD0, 0x06, 0xCE, 0xBE, 0xAB, 0xC8, 0x2A, 0x29, 0x3B, 0x8B, + 0x1F, 0x9E, 0x59, 0x05, 0xBB, 0x94, 0x94, 0xEE, 0xD2, 0x9D, 0x8A, 0xA9, 0x76, 0x67, 0x99, 0xD6, + 0xBA, 0x34, 0x2E, 0x60, 0x5E, 0x67, 0x82, 0xF9, 0x63, 0xED, 0x59, 0xB2, 0x81, 0x9E, 0x6B, 0xDF, + 0x32, 0x83, 0xCD, 0x92, 0x73, 0x4B, 0xDD, 0x0F, 0xDE, 0xB8, 0xF4, 0x84, 0x26, 0x37, 0xA1, 0x57, + 0x2D, 0xFD, 0x70, 0x1E, 0xC8, 0x6D, 0xC9, 0x3D, 0x2C, 0xC1, 0x94, 0x86, 0x43, 0xC2, 0xA0, 0x9F, + 0x16, 0x58, 0xFC, 0x76, 0x25, 0x5E, 0x77, 0x9B, 0x5B, 0xB4, 0xD8, 0xA9, 0x0E, 0x68, 0xE1, 0xA3, + 0x48, 0x4F, 0x51, 0x14, 0xFC, 0xDE, 0x24, 0xAB, 0xA4, 0x21, 0xD5, 0xD1, 0x5D, 0xA2, 0xA2, 0xD2, + 0x1A, 0x4B, 0x1D, 0x0F, 0xE3, 0x67, 0x56, 0xB5, 0x47, 0x4A, 0xA4, 0x4D, 0x9A, 0x33, 0xC8, 0x4F, + 0x8D, 0x06, 0x20, 0xB6, 0x9D, 0x84, 0x2C, 0xB2, 0xA9, 0xB1, 0x5E, 0x21, 0x11, 0x75, 0x31, 0xD3, + 0x34, 0x2E, 0xCC, 0xE0, 0x99, 0xCE, 0x62, 0x3B, 0xD3, 0x74, 0x82, 0x9B, 0xC0, 0x89, 0x67, 0xE7, + 0x9A, 0x79, 0x6D, 0xA1, 0x88, 0x69, 0xE6, 0xAE, 0xFD, 0x47, 0x55, 0x2F, 0xE5, 0xCB, 0xAB, 0x6D, + 0x07, 0x5D, 0x72, 0x41, 0xA4, 0x6C, 0xD7, 0x6F, 0xB9, 0x21, 0x52, 0xB0, 0xF1, 0xB7, 0x8E, 0x65, + 0x56, 0x7D, 0xA3, 0xA0, 0x7A, 0x61, 0xBC, 0x10, 0x6F, 0xB6, 0xF9, 0xCD, 0xC8, 0xF6, 0x5D, 0x34, + 0x13, 0x24, 0x1F, 0x43, 0x51, 0xC2, 0xF7, 0x6A, 0x97, 0x51, 0xB2, 0xCB, 0x24, 0x15, 0x81, 0x74, + 0xCB, 0x6E, 0xB4, 0x14, 0x9D, 0x12, 0x94, 0x7B, 0x1C, 0xF2, 0x21, 0x2D, 0xF3, 0x5E, 0x64, 0x23, + 0x59, 0x5A, 0x29, 0x1B, 0xC0, 0xB2, 0x5A, 0x39, 0x3F, 0x0B, 0x6A, 0x69, 0xA3, 0x5B, 0x5E, 0x4B, + 0x1F, 0xD4, 0x99, 0xAE, 0x93, 0xB4, 0xBF, 0x0B, 0xBA, 0x4F, 0xD4, 0x25, 0xAC, 0xDC, 0x85, 0x22, + 0xCD, 0x96, 0x72, 0x37, 0x8A, 0x66, 0x71, 0x55, 0x77, 0xA5, 0x58, 0x07, 0x4F, 0x1F, 0xD9, 0xA7, + 0x75, 0xA9, 0x2C, 0x4A, 0x42, 0xE6, 0x5A, 0x49, 0xD3, 0xE6, 0xAE, 0x81, 0x60, 0x14, 0x78, 0x58, + 0x74, 0xFE, 0x54, 0xF5, 0xB2, 0x48, 0x03, 0xA0, 0x7A, 0x5A, 0xF4, 0xBD, 0xC9, 0xFC, 0xDE, 0x96, + 0x4A, 0xBB, 0x9B, 0xA5, 0x7A, 0x5C, 0xB4, 0x2D, 0xCA, 0x63, 0xBD, 0x2E, 0x12, 0x6F, 0xE6, 0xF6, + 0xBC, 0x64, 0x73, 0xE8, 0xD7, 0xF6, 0xBE, 0xA8, 0xD2, 0xC2, 0x6A, 0x66, 0x09, 0x79, 0x76, 0xC8, + 0x0B, 0xC3, 0x7A, 0x5D, 0x9A, 0x97, 0xC6, 0xDC, 0x73, 0xA9, 0x35, 0x36, 0xF4, 0x26, 0x9B, 0xFA, + 0x87, 0xAD, 0x99, 0x30, 0x5E, 0xA8, 0xBE, 0xA0, 0x0A, 0xE7, 0xF9, 0x4F, 0xE3, 0x84, 0x52, 0x04, + 0xE2, 0xC1, 0x76, 0xE5, 0x4F, 0x71, 0x26, 0xC9, 0x77, 0x8E, 0xB8, 0xF5, 0x02, 0xFF, 0x4A, 0x23, + 0xDD, 0xFE, 0x1B, 0x68, 0xEA, 0x46, 0xBD, 0x9E, 0xDF, 0xB8, 0xD2, 0xEA, 0xB4, 0x2A, 0xD4, 0xF9, + 0xEB, 0x5F, 0xCD, 0x4A, 0x11, 0x4D, 0x26, 0x51, 0xC0, 0x6C, 0x1F, 0x93, 0xC8, 0x01, 0x4D, 0xF0, + 0xB6, 0x97, 0xAA, 0xB6, 0xD9, 0x6D, 0x3B, 0xD0, 0x6B, 0x20, 0x53, 0x69, 0xA1, 0xFD, 0xF1, 0x40, + 0xA3, 0x52, 0x6A, 0xC2, 0xCA, 0x3E, 0x94, 0xE3, 0x6B, 0xE6, 0x33, 0x49, 0xDC, 0x2B, 0x32, 0x75, + 0x63, 0x82, 0x4B, 0x30, 0xC1, 0x3B, 0x62, 0xD4, 0x6B, 0x11, 0x3E, 0xE7, 0x09, 0x4B, 0x65, 0xCA, + 0x6F, 0x15, 0xC6, 0xFD, 0x08, 0xF3, 0x5E, 0xE8, 0x06, 0xC7, 0x90, 0x9E, 0xB8, 0x81, 0x3B, 0xA0, + 0xD1, 0x05, 0x56, 0x35, 0xEE, 0x84, 0x31, 0x00, 0xBB, 0x6F, 0x92, 0x88, 0xB8, 0x43, 0x7F, 0x10, + 0xEC, 0xD4, 0x87, 0xF4, 0x3A, 0xA9, 0xC3, 0x87, 0x9B, 0x5D, 0xDC, 0xBD, 0xBD, 0x59, 0x83, 0x5F, + 0xF0, 0x8F, 0x1E, 0xA8, 0x3B, 0xF1, 0x87, 0xB7, 0xFB, 0x26, 0x4F, 0x48, 0xBE, 0xC3, 0xED, 0x86, + 0xAB, 0xF0, 0xAE, 0x4E, 0x7C, 0x6F, 0xA7, 0x8E, 0x08, 0xF9, 0x1E, 0x6A, 0x6F, 0x38, 0xAC, 0x13, + 0x96, 0x2E, 0x07, 0xBE, 0x86, 0xD1, 0x68, 0x95, 0x55, 0x5C, 0xE5, 0x4D, 0x25, 0xBA, 0x98, 0xA7, + 0xA8, 0x0E, 0x0B, 0xEA, 0x01, 0xDE, 0xCF, 0xE1, 0x10, 0x52, 0x92, 0xC3, 0xC1, 0x00, 0xEF, 0xE1, + 0x00, 0x3D, 0x6B, 0x88, 0x76, 0x2D, 0x89, 0xB2, 0x7F, 0x18, 0xDD, 0xB2, 0x7A, 0x67, 0xAF, 0x4A, + 0xB3, 0x17, 0xF2, 0x44, 0xEA, 0xDC, 0x9A, 0xC2, 0xCE, 0xBB, 0xD1, 0xF0, 0x26, 0x49, 0xC6, 0xE5, + 0xD7, 0xF0, 0xA4, 0x8A, 0xE2, 0x36, 0xDE, 0xBB, 0x23, 0x7E, 0x19, 0x0F, 0xD7, 0x6E, 0x76, 0x5F, + 0xB0, 0x66, 0x31, 0xB2, 0xD2, 0x26, 0xEC, 0x56, 0x95, 0xAA, 0x46, 0x60, 0x02, 0xC4, 0xF4, 0x38, + 0xE8, 0x87, 0x23, 0xD4, 0x33, 0x69, 0xC5, 0x88, 0xC6, 0xE3, 0x30, 0x88, 0x19, 0xA9, 0x2C, 0x65, + 0x89, 0xB8, 0x89, 0x4A, 0x0E, 0x7A, 0x3F, 0xF1, 0x7B, 0xA3, 0x60, 0x7B, 0x84, 0xCC, 0x6A, 0x30, + 0x4D, 0xC8, 0x92, 0x11, 0x5D, 0xD9, 0x51, 0xD9, 0x30, 0x7B, 0x05, 0x56, 0x85, 0x50, 0xDE, 0x19, + 0x3D, 0x58, 0x24, 0x5E, 0xA4, 0xE4, 0x30, 0x85, 0x3E, 0xBC, 0x4A, 0x5C, 0x1F, 0x04, 0x53, 0xAA, + 0x60, 0x17, 0x7C, 0x6B, 0x45, 0x53, 0xF8, 0xF9, 0x6D, 0xA2, 0xAC, 0x8A, 0x2E, 0xB6, 0xF2, 0xB8, + 0x8B, 0x6A, 0x4F, 0x36, 0xEA, 0x69, 0x1A, 0x92, 0x5F, 0x7B, 0xE0, 0x8B, 0xD8, 0x01, 0x63, 0x2E, + 0xB1, 0xA0, 0xDA, 0xE0, 0xED, 0xF3, 0xAC, 0x8A, 0xE5, 0x03, 0x88, 0x95, 0x2A, 0x0F, 0x22, 0xAF, + 0x3C, 0x73, 0x20, 0x45, 0xFA, 0x82, 0x5F, 0x7D, 0x30, 0x19, 0x1D, 0x3F, 0xCE, 0x80, 0x1A, 0x6C, + 0xA9, 0x36, 0xA8, 0x92, 0x2E, 0x38, 0x0C, 0xA7, 0x01, 0x6E, 0xFA, 0xA5, 0x6B, 0xB4, 0x4C, 0x0B, + 0x53, 0x0F, 0xA7, 0x77, 0xF5, 0x4B, 0x98, 0x08, 0xF2, 0xF8, 0x50, 0xF2, 0x73, 0x09, 0xDC, 0x01, + 0xF3, 0x66, 0x7C, 0xBC, 0x66, 0xD0, 0x7A, 0x02, 0xF4, 0xE2, 0x50, 0x55, 0x3B, 0xD9, 0x78, 0xA4, + 0x2E, 0x7D, 0xE2, 0xE6, 0x2D, 0xBF, 0x86, 0x89, 0x0F, 0x4E, 0x63, 0x56, 0x03, 0xBC, 0x3A, 0x0C, + 0xFA, 0x02, 0x4B, 0x8C, 0xD4, 0x08, 0x59, 0x6D, 0x59, 0xAA, 0x65, 0xC0, 0x3B, 0xF6, 0x3E, 0x34, + 0xC5, 0x32, 0x2F, 0x79, 0xF2, 0x26, 0xD1, 0x30, 0x09, 0xFB, 0x98, 0x3F, 0x0A, 0x44, 0x70, 0x0D, + 0x61, 0xFC, 0x1B, 0xEB, 0x05, 0xBA, 0x35, 0x15, 0xAE, 0x7E, 0xCD, 0xE1, 0x63, 0xDA, 0x27, 0x74, + 0x75, 0xFE, 0xC9, 0x65, 0xF4, 0xEC, 0x78, 0x62, 0x3C, 0x52, 0xE1, 0x96, 0x6F, 0xBD, 0x67, 0xF0, + 0x53, 0xE6, 0x82, 0x16, 0x86, 0xFA, 0xED, 0xD4, 0x7F, 0xDA, 0xBE, 0x89, 0xE8, 0x35, 0xE6, 0x95, + 0x4A, 0xEB, 0x65, 0x72, 0x98, 0xE3, 0x63, 0x99, 0xE5, 0x0A, 0xA5, 0x21, 0x5D, 0x38, 0x95, 0x0C, + 0x65, 0x62, 0x9D, 0x9E, 0x5F, 0x18, 0x0A, 0xEF, 0xE2, 0xE2, 0x2E, 0x24, 0x07, 0xAB, 0xDC, 0xC6, + 0x0D, 0xCC, 0xBB, 0xB8, 0x79, 0x4D, 0xBC, 0x8F, 0x9B, 0xC5, 0xA4, 0x66, 0xAB, 0x5A, 0x66, 0x36, + 0xE4, 0x11, 0xAB, 0x55, 0x04, 0x9F, 0x6A, 0xB7, 0xC7, 0x97, 0x26, 0xF6, 0x72, 0x96, 0x4E, 0xD5, + 0xD1, 0x6D, 0x08, 0x42, 0xBA, 0x47, 0xC0, 0x27, 0x9E, 0x98, 0x95, 0x20, 0x3C, 0xDE, 0xA6, 0xEA, + 0x54, 0x84, 0xCD, 0xDC, 0x1F, 0x4A, 0xB9, 0xC8, 0x6C, 0x08, 0xEC, 0xD9, 0xC8, 0xAA, 0xCB, 0xEB, + 0x9D, 0x21, 0xA6, 0xAC, 0x43, 0xB5, 0xED, 0x39, 0x94, 0x6C, 0xB9, 0x9A, 0xCD, 0x68, 0xA9, 0xA2, + 0x5C, 0xB5, 0xC7, 0x3F, 0xCF, 0xE9, 0x35, 0xA8, 0xD3, 0x1B, 0x9E, 0xB7, 0x21, 0x3F, 0x29, 0x2C, + 0x37, 0x53, 0x14, 0x3B, 0xDC, 0xCC, 0x86, 0xC3, 0xB2, 0x07, 0xBC, 0xF5, 0xF5, 0xC9, 0x20, 0xA5, + 0x86, 0xC0, 0x5F, 0x3B, 0x4B, 0xCA, 0x06, 0xC1, 0x61, 0x2D, 0x9C, 0x00, 0x82, 0x53, 0x6B, 0x89, + 0xE2, 0x1D, 0x47, 0xE1, 0x00, 0xF3, 0x85, 0x03, 0xE8, 0xF4, 0xD7, 0xF7, 0x6E, 0xE0, 0x0D, 0x69, + 0xA4, 0xB1, 0x99, 0x81, 0x31, 0xDB, 0x33, 0x4D, 0x84, 0x29, 0x89, 0x79, 0x16, 0x85, 0xB9, 0xDA, + 0xF2, 0x37, 0xD4, 0x44, 0x6A, 0xE3, 0xB9, 0x5A, 0xBA, 0x57, 0xFC, 0x8D, 0x60, 0xF6, 0xDF, 0x92, + 0x96, 0x5A, 0xDE, 0x8B, 0x19, 0x19, 0x2F, 0xE4, 0xCC, 0x42, 0x1A, 0x33, 0xD2, 0x44, 0x04, 0xD2, + 0x40, 0x8F, 0x69, 0xD4, 0xA7, 0x2C, 0x8A, 0x81, 0x17, 0xB6, 0x87, 0x2C, 0x6B, 0x01, 0x59, 0x23, + 0xFC, 0xCF, 0x24, 0x4C, 0x70, 0x7B, 0xF9, 0x67, 0x74, 0xC1, 0xCB, 0xA9, 0x1D, 0x04, 0xE0, 0x7D, + 0x37, 0x92, 0xDC, 0xB4, 0x27, 0x6E, 0x72, 0xD3, 0x8E, 0xC2, 0x09, 0x50, 0x24, 0xE0, 0xCA, 0xA9, + 0xE9, 0x26, 0x52, 0xA2, 0x0C, 0xCD, 0xC6, 0xB1, 0x34, 0xC4, 0x59, 0xF8, 0xBF, 0x85, 0x7C, 0x52, + 0x4F, 0x4A, 0x75, 0xC9, 0x1C, 0x0F, 0x82, 0xEA, 0x5D, 0xBC, 0xDA, 0xEA, 0x18, 0xA7, 0x47, 0x25, + 0x98, 0x6A, 0x52, 0x42, 0xCD, 0x16, 0x99, 0x62, 0x3A, 0xD4, 0x60, 0xC0, 0xC5, 0x1D, 0xCC, 0x10, + 0x26, 0xE3, 0xEC, 0x39, 0xC2, 0x9A, 0x3D, 0x01, 0xA1, 0x26, 0x21, 0x1A, 0x43, 0x67, 0xE1, 0xE6, + 0xB9, 0x3A, 0x48, 0x96, 0xAC, 0x63, 0x26, 0x43, 0x73, 0xE7, 0xE5, 0x92, 0x66, 0x3F, 0xFF, 0x9A, + 0xE9, 0x7C, 0x4C, 0xB5, 0xC1, 0xDD, 0x62, 0xFB, 0xF7, 0xC7, 0xDE, 0xDC, 0xC4, 0xCB, 0x9C, 0x91, + 0xC5, 0x7F, 0x31, 0xB6, 0xBC, 0x75, 0x81, 0x52, 0x4F, 0x87, 0x2B, 0x4F, 0x8E, 0xC5, 0xE0, 0xEE, + 0x21, 0x84, 0x0C, 0xB0, 0x04, 0x3A, 0xE9, 0x8F, 0xF7, 0x71, 0xB9, 0xB5, 0xBC, 0xD3, 0xC7, 0xAF, + 0x68, 0x9C, 0xDD, 0x26, 0xC5, 0xD7, 0x89, 0x31, 0x81, 0xBD, 0x52, 0xB5, 0xF0, 0xEA, 0x6D, 0xD3, + 0x74, 0xEB, 0x02, 0xEA, 0x82, 0x1B, 0x72, 0x05, 0x7B, 0x51, 0xEE, 0x90, 0x2E, 0x6E, 0x96, 0xC9, + 0x51, 0x4A, 0x32, 0x7B, 0x7F, 0x5C, 0xCA, 0xD7, 0xF6, 0x6A, 0xE3, 0x45, 0x91, 0xB5, 0x30, 0xF1, + 0x6C, 0x7C, 0x50, 0xFA, 0xF6, 0xC9, 0xAB, 0x76, 0xB1, 0x9A, 0xF7, 0x6E, 0xE2, 0x2D, 0xD4, 0xBB, + 0xE2, 0x66, 0x52, 0xEF, 0x32, 0x4A, 0xB4, 0x0E, 0x76, 0x9C, 0x4E, 0x96, 0xAE, 0xEF, 0xA1, 0x68, + 0xA4, 0xD3, 0x97, 0x43, 0x8B, 0x7A, 0x7A, 0xD1, 0x17, 0x37, 0x99, 0xD3, 0x8A, 0x95, 0xBA, 0x6B, + 0x8C, 0x4A, 0xDE, 0x7A, 0xA1, 0x41, 0x35, 0x9A, 0x73, 0x05, 0xC0, 0xC8, 0x14, 0x45, 0x40, 0xE8, + 0x1C, 0x03, 0xEC, 0xDD, 0xF4, 0xC7, 0x25, 0x5D, 0x17, 0x25, 0x87, 0xEF, 0x0F, 0xCE, 0x66, 0xF4, + 0x57, 0xCA, 0xF5, 0x71, 0x7C, 0xB6, 0x58, 0x9F, 0xA5, 0x04, 0x1C, 0x55, 0x40, 0xA8, 0x1D, 0x81, + 0xC2, 0x69, 0x18, 0x7D, 0x67, 0x51, 0x55, 0x7A, 0x7E, 0x61, 0x3D, 0x16, 0x0F, 0xBF, 0x4E, 0xFD, + 0x6B, 0xFF, 0x94, 0xB7, 0xA9, 0x9C, 0x28, 0x57, 0x6A, 0xF3, 0xAD, 0x8E, 0x8F, 0x0E, 0x64, 0x65, + 0x7F, 0xDC, 0xE9, 0xF5, 0x0C, 0x73, 0x5F, 0xB3, 0x4A, 0x65, 0x8C, 0x85, 0x46, 0x29, 0x72, 0x5E, + 0xAE, 0x88, 0x76, 0xA7, 0xF6, 0xA4, 0x8B, 0xD3, 0xD4, 0x33, 0xCF, 0x6B, 0x6F, 0x04, 0xA8, 0x2E, + 0x58, 0x56, 0x5C, 0xF0, 0x16, 0xC3, 0x29, 0x9D, 0xA6, 0xF9, 0xB7, 0xD4, 0xC1, 0xD7, 0xB8, 0x69, + 0x1C, 0x82, 0xE1, 0x50, 0x9D, 0xC4, 0x03, 0xF1, 0x22, 0x67, 0x9A, 0x70, 0xEA, 0x40, 0xC0, 0x84, + 0x12, 0x4C, 0x6C, 0xF6, 0xB3, 0xFF, 0xD6, 0x67, 0xCB, 0x11, 0xF1, 0x63, 0x42, 0x47, 0xE3, 0xE4, + 0x5E, 0x11, 0x5B, 0xBB, 0x3D, 0x2F, 0xEE, 0x42, 0x1E, 0x68, 0xE4, 0x15, 0x06, 0x2D, 0x08, 0x4A, + 0x0A, 0x89, 0x00, 0xF9, 0x09, 0xF0, 0x8E, 0x33, 0x3E, 0x30, 0x15, 0x12, 0x24, 0xA9, 0x66, 0x24, + 0x0E, 0x64, 0xA9, 0xE2, 0xB9, 0xBC, 0xA1, 0xEF, 0x41, 0xF1, 0x9E, 0xC0, 0xFE, 0x19, 0xCC, 0xA8, + 0xF4, 0x61, 0x6A, 0x06, 0x80, 0xE0, 0x58, 0xB3, 0x53, 0xCA, 0xB3, 0x9F, 0x63, 0x49, 0xCE, 0x86, + 0xB1, 0x58, 0x31, 0x17, 0x13, 0xA8, 0x32, 0xD9, 0x91, 0x60, 0x17, 0x8A, 0x8E, 0xD4, 0x83, 0x95, + 0x1D, 0xB9, 0x45, 0xBE, 0x77, 0xE1, 0x6F, 0x6C, 0xAB, 0x25, 0x69, 0xBC, 0x16, 0x14, 0xEA, 0x63, + 0xA1, 0x6A, 0xC0, 0xF3, 0x03, 0x69, 0x30, 0x74, 0x55, 0x50, 0x44, 0x86, 0xD1, 0xB6, 0x85, 0xD5, + 0x33, 0x54, 0x6A, 0x36, 0xF7, 0x59, 0x4D, 0xD9, 0xB0, 0xB5, 0xF2, 0xB1, 0xD1, 0xEA, 0xEB, 0x22, + 0x8D, 0x79, 0xB9, 0xF2, 0xB8, 0x59, 0x39, 0x77, 0x5E, 0x2A, 0x2B, 0xCC, 0xF7, 0x01, 0x10, 0x5E, + 0x8B, 0x7D, 0x69, 0x0A, 0xAE, 0x69, 0xCF, 0xFA, 0xA5, 0x56, 0x90, 0x42, 0x48, 0x25, 0xA4, 0xD6, + 0x5C, 0x8D, 0x06, 0x65, 0x05, 0x19, 0x1B, 0x59, 0x3D, 0xC0, 0x60, 0x9D, 0x97, 0x4A, 0x9E, 0xC1, + 0x02, 0xB4, 0x4D, 0x8B, 0xCF, 0xA4, 0x76, 0x80, 0x0D, 0xD9, 0x04, 0x10, 0xB4, 0xA1, 0x84, 0x15, + 0x00, 0x90, 0x22, 0x55, 0x67, 0xCE, 0x2C, 0x41, 0x6C, 0x96, 0x95, 0x8E, 0xC0, 0xD2, 0x1B, 0xA7, + 0x8F, 0xED, 0xEA, 0xDA, 0x39, 0x43, 0xF4, 0x13, 0xAF, 0xD4, 0xB8, 0x56, 0xFF, 0x56, 0xBB, 0x59, + 0x88, 0x57, 0x7E, 0x9E, 0x49, 0x83, 0xC0, 0xB2, 0xE1, 0x1C, 0x9D, 0x9F, 0x7F, 0x3C, 0xAF, 0x2D, + 0xA8, 0xAB, 0x80, 0x2D, 0xDC, 0x80, 0x20, 0x41, 0x98, 0x10, 0xF7, 0x16, 0xAC, 0x4E, 0x7E, 0x4E, + 0xB0, 0xAD, 0xAF, 0x73, 0x9E, 0x7F, 0xFB, 0x8E, 0x26, 0x8A, 0x7E, 0xD2, 0xEC, 0x91, 0x99, 0x3A, + 0x4C, 0x0F, 0xA5, 0xD2, 0xD5, 0xA1, 0x72, 0x9B, 0xDE, 0xD6, 0xD5, 0x83, 0x4F, 0xE7, 0xE7, 0x47, + 0xA7, 0x17, 0xD6, 0xCE, 0x16, 0xF6, 0x33, 0xA5, 0x05, 0x55, 0xF2, 0x64, 0x8C, 0x2A, 0x11, 0x23, + 0x29, 0x7E, 0x9D, 0x1E, 0x2A, 0x0A, 0x5F, 0x47, 0xA6, 0xDB, 0xEB, 0x2C, 0x32, 0x04, 0xC8, 0xBD, + 0xAD, 0xB1, 0x68, 0x54, 0x85, 0x1D, 0xDB, 0xE5, 0x90, 0x0A, 0x48, 0x52, 0x93, 0x30, 0x22, 0xFC, + 0xB3, 0xC2, 0x9D, 0x96, 0x5D, 0x30, 0xD5, 0x56, 0xB2, 0x78, 0x8A, 0x64, 0x29, 0x56, 0x1E, 0x1A, + 0xA7, 0x0B, 0xC6, 0x6C, 0x7F, 0xDE, 0x75, 0xF8, 0x07, 0x19, 0x6F, 0xFB, 0xF2, 0x5E, 0x4D, 0x1B, + 0x18, 0x52, 0x6F, 0x8E, 0x0C, 0xF0, 0xE1, 0x9D, 0xC8, 0xED, 0x88, 0xBE, 0xA4, 0x6B, 0xB9, 0x97, + 0xFF, 0xB2, 0x02, 0xEC, 0x56, 0x80, 0x65, 0x8D, 0x55, 0xC5, 0xF5, 0x59, 0x56, 0x58, 0x15, 0xA5, + 0x75, 0x7D, 0xD5, 0xA8, 0x2A, 0x58, 0x5D, 0x07, 0x1C, 0xB8, 0x3C, 0xDD, 0xE4, 0x00, 0x89, 0x34, + 0x56, 0x13, 0x75, 0x6B, 0xA7, 0x56, 0x9C, 0xE2, 0xD7, 0x4A, 0x4F, 0xB3, 0x40, 0x71, 0xA7, 0x00, + 0x2D, 0xEB, 0xD2, 0x93, 0xCD, 0xBB, 0x59, 0x6B, 0x00, 0xD3, 0x16, 0x29, 0x37, 0xD4, 0xD9, 0xA0, + 0xE6, 0xE4, 0x36, 0x36, 0x59, 0x61, 0xE2, 0xA6, 0x24, 0x88, 0xAC, 0xB6, 0xC2, 0xDD, 0x96, 0xBA, + 0x7E, 0xEC, 0xC6, 0x4A, 0x21, 0xC7, 0xE6, 0x98, 0xBD, 0x1A, 0x22, 0xEE, 0x03, 0x34, 0x72, 0xDB, + 0x56, 0xD5, 0xE9, 0x1A, 0x34, 0xE5, 0xC8, 0x42, 0xC7, 0xB4, 0x63, 0x7A, 0x12, 0xB5, 0xCC, 0xDA, + 0x46, 0xA0, 0xE3, 0x3B, 0xFF, 0x96, 0x06, 0xC4, 0xC5, 0xF4, 0xED, 0x51, 0x1D, 0x83, 0xFA, 0x22, + 0x96, 0x37, 0x38, 0x89, 0xEE, 0x71, 0x09, 0x4B, 0xDF, 0xCE, 0xE6, 0x21, 0x2A, 0xF7, 0x63, 0x1E, + 0xF1, 0x28, 0xF6, 0x6B, 0xEA, 0x93, 0xB9, 0xC4, 0x0F, 0xC8, 0xE1, 0x61, 0xDB, 0x4B, 0x7F, 0xB2, + 0x57, 0x63, 0xB3, 0x21, 0x31, 0x1F, 0xE2, 0x46, 0xA4, 0x47, 0x01, 0xE0, 0xD2, 0x76, 0xC1, 0xC6, + 0x83, 0xB5, 0x64, 0xC1, 0xC7, 0xB8, 0x95, 0x37, 0x34, 0xE3, 0x1B, 0xF9, 0xAE, 0x5B, 0xA6, 0x47, + 0x31, 0x74, 0xD3, 0x56, 0xE0, 0xD1, 0xBE, 0x3F, 0x72, 0x87, 0xB6, 0x22, 0xAE, 0xD1, 0x3E, 0x5E, + 0x7F, 0xA0, 0x2C, 0xCD, 0xB2, 0x71, 0xAA, 0x69, 0x7B, 0x10, 0x9B, 0x27, 0x18, 0xC4, 0x4B, 0x53, + 0x28, 0x6F, 0x64, 0x7A, 0xE3, 0xB2, 0x45, 0x6E, 0xC0, 0xF8, 0x0F, 0xAC, 0x9E, 0xC4, 0x92, 0x06, + 0xEF, 0xBB, 0x01, 0xA1, 0xC8, 0x18, 0xA6, 0x5C, 0xFD, 0xE0, 0x96, 0x3D, 0xA8, 0x85, 0x37, 0xE2, + 0xE2, 0xB4, 0xCE, 0x1E, 0xE1, 0x1F, 0x79, 0x35, 0xCC, 0x4F, 0x1E, 0x06, 0xC3, 0x7B, 0x71, 0xFC, + 0x19, 0xB7, 0xC8, 0x6A, 0x0B, 0xA3, 0xB3, 0x5A, 0x6C, 0xC0, 0xDA, 0xDA, 0xC9, 0x9E, 0xFC, 0x18, + 0x4E, 0x3A, 0x04, 0x86, 0x9A, 0xD6, 0xAE, 0xFB, 0xC4, 0x9E, 0x3F, 0xF0, 0x93, 0x7C, 0xC8, 0x40, + 0x15, 0x17, 0xDF, 0xF7, 0xC0, 0x16, 0x2A, 0xFF, 0x98, 0x39, 0x60, 0xE5, 0xDB, 0xCA, 0x4A, 0x79, + 0x7A, 0x26, 0x19, 0x23, 0xC2, 0xA9, 0xAF, 0xD6, 0x9B, 0xF9, 0x68, 0xAE, 0xAC, 0x20, 0x4F, 0x31, + 0x8B, 0xF3, 0x20, 0x0C, 0xBD, 0x2A, 0xCD, 0x09, 0x34, 0xCF, 0x07, 0x7D, 0xFE, 0xF6, 0x6D, 0x44, + 0x2F, 0xF5, 0xAD, 0x14, 0x42, 0xEA, 0xDA, 0x58, 0xF0, 0x21, 0x6C, 0x76, 0x26, 0xCE, 0x36, 0x44, + 0xF8, 0xC6, 0x19, 0xDE, 0xB0, 0x53, 0x84, 0x81, 0x5D, 0x8F, 0x34, 0x4E, 0xD8, 0x60, 0x67, 0x80, + 0x32, 0x35, 0x0E, 0xE3, 0xD8, 0xC7, 0xC0, 0x31, 0x2E, 0x21, 0x38, 0x7B, 0x33, 0xE1, 0xC9, 0x67, + 0xAA, 0xF4, 0xE5, 0xE4, 0xA4, 0x3D, 0xE2, 0x3F, 0xD2, 0x47, 0x62, 0xFD, 0xBA, 0x6A, 0xFD, 0x7A, + 0x72, 0xD2, 0xEB, 0xB5, 0x63, 0xF6, 0xA3, 0x42, 0x20, 0xB6, 0xEF, 0x00, 0x63, 0x55, 0xFA, 0x9E, + 0x6B, 0x35, 0x45, 0x70, 0x76, 0xF1, 0x5E, 0xCD, 0xE3, 0xB9, 0xF8, 0xEF, 0x18, 0x56, 0x17, 0x84, + 0x6D, 0xB2, 0x01, 0xB3, 0xF0, 0x95, 0xB3, 0xBE, 0xBE, 0xF1, 0xC2, 0xC1, 0xE9, 0xC7, 0x78, 0xD9, + 0x96, 0xE2, 0xFA, 0x72, 0x6D, 0xB0, 0x4B, 0xBA, 0xCB, 0xC0, 0xFC, 0x11, 0x67, 0xA5, 0xC3, 0xAE, + 0xB9, 0xC2, 0xF4, 0xEB, 0xE2, 0x8B, 0x55, 0xE1, 0x14, 0x1F, 0x45, 0xDB, 0x70, 0x88, 0xB3, 0x49, + 0xBA, 0x9B, 0xED, 0xAE, 0xB3, 0xF1, 0xCA, 0x46, 0x4B, 0xAE, 0xB1, 0x76, 0xC9, 0xFA, 0x92, 0x49, + 0xE9, 0x32, 0x6A, 0xD6, 0x73, 0x6A, 0x56, 0x3B, 0xCE, 0xE6, 0x6A, 0xA7, 0xB3, 0xEA, 0x6C, 0xB6, + 0x3B, 0x5B, 0x5D, 0x2B, 0x3D, 0x76, 0xAD, 0xB7, 0x8B, 0x01, 0xB3, 0x4B, 0xA2, 0xED, 0x05, 0x12, + 0x75, 0x4D, 0xA7, 0x34, 0xE2, 0x04, 0x75, 0x3A, 0x48, 0xCE, 0xCB, 0x97, 0xAF, 0x5E, 0x75, 0x49, + 0xE3, 0x90, 0x0B, 0x18, 0x56, 0xE1, 0xBF, 0x35, 0x33, 0x22, 0x65, 0xBB, 0x38, 0xA0, 0x03, 0x37, + 0x01, 0xA5, 0xDA, 0xF3, 0x07, 0x81, 0x66, 0x71, 0xA8, 0xD3, 0xD9, 0xC9, 0xB5, 0x89, 0xA4, 0xBD, + 0xB2, 0x72, 0x6E, 0xB6, 0x61, 0x70, 0xEA, 0x9E, 0xA4, 0xF5, 0x5A, 0xC8, 0xBF, 0x3A, 0x7F, 0x81, + 0xEC, 0x9C, 0x45, 0xB0, 0x82, 0x52, 0x63, 0xEC, 0xE0, 0x3A, 0x45, 0x0A, 0x66, 0x57, 0xE9, 0xD0, + 0x2E, 0x2F, 0x65, 0x63, 0xBB, 0xBA, 0xCA, 0x9E, 0x5D, 0x07, 0x55, 0x91, 0x0F, 0xB7, 0xCB, 0xDF, + 0x5F, 0xF7, 0x03, 0x9E, 0x74, 0x8F, 0x95, 0x50, 0xAE, 0xDF, 0x5B, 0x6C, 0xBF, 0xCF, 0x2E, 0xD9, + 0x0A, 0xB4, 0x29, 0x1E, 0x12, 0x03, 0x22, 0x8B, 0x57, 0x4C, 0x16, 0x69, 0xAE, 0x85, 0xF1, 0x09, + 0x5A, 0x69, 0x35, 0xCC, 0xBE, 0x15, 0x0C, 0xF0, 0x0E, 0x0B, 0x89, 0xC6, 0x83, 0xA2, 0xC2, 0xF2, + 0x2D, 0x7C, 0xF6, 0x78, 0x6D, 0xCD, 0xA2, 0x01, 0x94, 0x27, 0x21, 0x16, 0x5F, 0xD6, 0x39, 0x64, + 0x25, 0x2E, 0x81, 0x5F, 0x2B, 0x4E, 0xF0, 0x00, 0x81, 0x47, 0xCA, 0xB3, 0xE3, 0x57, 0x60, 0x73, + 0xD0, 0x4F, 0x2F, 0x70, 0xE5, 0xE6, 0x05, 0x1B, 0x2F, 0x30, 0x5E, 0x89, 0x10, 0x22, 0x15, 0x8C, + 0x50, 0x38, 0x2A, 0x0C, 0x09, 0x36, 0xBF, 0xBA, 0xE5, 0xC8, 0x40, 0xA4, 0xC5, 0x31, 0xAF, 0xB7, + 0xBA, 0x93, 0x29, 0x2F, 0x7E, 0xD6, 0xAC, 0xDE, 0xF7, 0x62, 0x6F, 0xCA, 0xF9, 0xC1, 0x24, 0x61, + 0x21, 0x2B, 0x25, 0xA8, 0x32, 0x44, 0x27, 0x27, 0x6A, 0xAC, 0xF0, 0x5B, 0x1F, 0x16, 0x73, 0x58, + 0x80, 0xD4, 0xA5, 0x39, 0x5F, 0xC2, 0x59, 0x0C, 0xFF, 0xC7, 0x6B, 0xF6, 0x38, 0x38, 0x8E, 0xCB, + 0x6A, 0xC7, 0x70, 0xC0, 0x3F, 0x76, 0x0C, 0x2E, 0x4F, 0x3F, 0x5E, 0x1E, 0x1E, 0x1D, 0x1C, 0x9F, + 0xEC, 0x7D, 0x30, 0x86, 0x23, 0xA6, 0xB0, 0x4A, 0x79, 0xD8, 0xB9, 0x8C, 0x24, 0x8D, 0xEF, 0x8A, + 0x6C, 0xF0, 0x3D, 0x1B, 0x6F, 0x62, 0x65, 0x5D, 0x3E, 0xC7, 0x14, 0x8E, 0xCB, 0x6D, 0x52, 0x7E, + 0xFE, 0x39, 0xE3, 0x9B, 0x68, 0x81, 0xAC, 0x93, 0x1E, 0x23, 0xB1, 0x98, 0x63, 0x29, 0xBA, 0x95, + 0x1C, 0xCA, 0x1A, 0xD9, 0x82, 0xE5, 0x81, 0xDD, 0x01, 0x4C, 0x91, 0xAC, 0x91, 0xF5, 0x2D, 0xBC, + 0x2D, 0xDF, 0xD4, 0xEE, 0x98, 0xA8, 0xD3, 0xBB, 0xC0, 0x0C, 0xB2, 0x21, 0xFE, 0x33, 0x0E, 0x4B, + 0xE1, 0x8D, 0xD7, 0xCC, 0xEC, 0xD0, 0x66, 0x2D, 0x4E, 0x50, 0x75, 0xCE, 0xB2, 0x29, 0x5B, 0x38, + 0x23, 0x37, 0x71, 0xC2, 0x16, 0x96, 0x6E, 0x64, 0xD3, 0x55, 0x5D, 0xC5, 0x97, 0x38, 0x5B, 0x2B, + 0xCF, 0xD5, 0x7C, 0x92, 0x2A, 0xB2, 0x52, 0x34, 0x43, 0xF5, 0xB9, 0x32, 0xF7, 0x9C, 0x2C, 0x9E, + 0x91, 0x76, 0xA1, 0x55, 0x39, 0xC4, 0xC2, 0x57, 0x45, 0x0B, 0x0B, 0xE8, 0x02, 0x89, 0x9D, 0x57, + 0x00, 0x9F, 0x5E, 0xD6, 0x34, 0x69, 0x53, 0x44, 0xAB, 0xC3, 0x85, 0x63, 0xF5, 0xC9, 0xA4, 0xE3, + 0xF2, 0xE4, 0xE4, 0xF2, 0x70, 0xAF, 0xF7, 0xDE, 0x90, 0x11, 0x11, 0x86, 0x95, 0x2B, 0x34, 0x71, + 0x6F, 0x63, 0xD5, 0xB8, 0xE9, 0x93, 0x0B, 0x84, 0xD0, 0xF5, 0xD8, 0x14, 0xB3, 0x35, 0xE4, 0x63, + 0x57, 0x34, 0xCC, 0x72, 0x83, 0xCE, 0x37, 0x49, 0xD7, 0x9A, 0x23, 0xFD, 0xE3, 0x8D, 0x5B, 0xF1, + 0xA8, 0x75, 0xB3, 0x51, 0x4B, 0xAD, 0xEA, 0x27, 0x18, 0x35, 0xD0, 0xFF, 0x3F, 0xE0, 0xC0, 0xFD, + 0x50, 0x8B, 0xA4, 0xC4, 0xA6, 0x6A, 0x6B, 0xA5, 0xDC, 0xAD, 0x6E, 0xDE, 0x2D, 0xCB, 0x62, 0xF9, + 0x1B, 0x58, 0xC7, 0xB8, 0x90, 0xE6, 0x5E, 0xA2, 0x25, 0xCB, 0xE8, 0xF6, 0x2C, 0x66, 0xE5, 0x3A, + 0xFE, 0xD7, 0x64, 0x83, 0xD0, 0xB0, 0xE4, 0x29, 0x35, 0x6C, 0xE5, 0x39, 0x4A, 0xFE, 0xA5, 0x5C, + 0x67, 0x8F, 0x58, 0x37, 0x1B, 0x31, 0xF2, 0x54, 0x3B, 0x1C, 0xAE, 0x38, 0x7E, 0xB0, 0x61, 0xFB, + 0x11, 0x55, 0xEB, 0xFF, 0x9F, 0x5A, 0x35, 0xF5, 0x9C, 0x29, 0x67, 0x57, 0x16, 0x10, 0xFC, 0xF8, + 0xCA, 0x52, 0x90, 0x25, 0x14, 0x79, 0xD5, 0xD4, 0xEF, 0xBE, 0x5A, 0x86, 0x45, 0x7A, 0x11, 0x33, + 0x3D, 0x22, 0x90, 0x7C, 0xFD, 0xE8, 0x54, 0xCE, 0xAF, 0x87, 0xB6, 0x48, 0x38, 0x49, 0xF0, 0x0F, + 0x57, 0x9C, 0x1F, 0x60, 0xAB, 0x5E, 0xA8, 0x1E, 0x07, 0xA0, 0x4B, 0xFB, 0x0A, 0xD8, 0x36, 0xA2, + 0xA4, 0xAE, 0x4D, 0xA4, 0x7A, 0x8B, 0xD0, 0xA4, 0xAF, 0x3E, 0x91, 0x89, 0xD4, 0x33, 0x62, 0x24, + 0xE2, 0x5A, 0x36, 0xF9, 0x29, 0x38, 0x3A, 0x10, 0x6E, 0x53, 0xE5, 0x68, 0x94, 0xDF, 0xF2, 0xB0, + 0x48, 0x60, 0x75, 0x11, 0x6C, 0xDA, 0xE7, 0x7B, 0x2E, 0x70, 0xF9, 0xB7, 0xA6, 0xC4, 0x70, 0xE3, + 0xA8, 0x59, 0x26, 0xA4, 0xE8, 0x40, 0xEE, 0x91, 0xA4, 0x5E, 0xCA, 0x9B, 0x28, 0xD8, 0x0D, 0x3E, + 0x12, 0xDC, 0x72, 0xA1, 0xA5, 0x5B, 0x80, 0x65, 0xC3, 0xEC, 0x7D, 0x3E, 0xD9, 0xFF, 0xF8, 0x81, + 0x43, 0x35, 0xAE, 0xD0, 0x0C, 0xC3, 0x60, 0xC0, 0x92, 0x88, 0x1C, 0xD2, 0x41, 0x44, 0x75, 0x2F, + 0x8C, 0x39, 0x20, 0xDA, 0x18, 0xC3, 0x7E, 0x4F, 0x87, 0x60, 0xAF, 0x08, 0x93, 0x78, 0xCB, 0xD9, + 0xD6, 0xD3, 0x68, 0x65, 0xC5, 0x6F, 0x48, 0xB1, 0x5A, 0xCC, 0x14, 0x40, 0x81, 0x94, 0xF5, 0xCD, + 0xE9, 0xFC, 0xA2, 0x69, 0xC9, 0xD9, 0xF5, 0xC8, 0xA1, 0x2E, 0xA4, 0x2F, 0x9B, 0x56, 0x06, 0x2F, + 0x57, 0x60, 0xA6, 0x31, 0xC5, 0x93, 0x56, 0xDD, 0xB6, 0x1C, 0xA6, 0x2C, 0x49, 0x6A, 0x16, 0x23, + 0x6F, 0xF5, 0x59, 0xE8, 0xE3, 0x12, 0xB8, 0x18, 0x85, 0xFF, 0xF5, 0x9F, 0x2A, 0x89, 0xF8, 0xAD, + 0x5E, 0xD3, 0x08, 0x5D, 0x08, 0x32, 0xB1, 0xF6, 0x5D, 0xD7, 0x38, 0x4B, 0xE9, 0x7F, 0xAF, 0xA9, + 0x4C, 0xEA, 0xC7, 0x0B, 0xE3, 0xB2, 0x21, 0x4A, 0x3B, 0xB4, 0x27, 0x01, 0x6C, 0x48, 0xC0, 0x92, + 0xB8, 0x20, 0x19, 0x3E, 0x4F, 0x42, 0xF7, 0x13, 0x83, 0xD7, 0x76, 0xC4, 0xCD, 0xDF, 0x88, 0x7A, + 0x56, 0x28, 0x3F, 0xB1, 0xB9, 0xF7, 0xE7, 0xA2, 0x5C, 0x40, 0x28, 0xA7, 0xBC, 0xFA, 0xE2, 0xB0, + 0xF5, 0x04, 0x8B, 0x83, 0x32, 0x1F, 0xE7, 0x5C, 0x1E, 0x0C, 0x4E, 0x3D, 0xD7, 0xB2, 0x61, 0x4E, + 0xF8, 0x79, 0x57, 0x0E, 0x1B, 0xE9, 0xAB, 0xCF, 0x45, 0xFB, 0xE3, 0x57, 0x15, 0x1B, 0xF9, 0x75, + 0x73, 0xB9, 0xF9, 0x6B, 0xAD, 0xF6, 0x64, 0xBD, 0x68, 0x2E, 0xBE, 0x74, 0xD9, 0xA8, 0x27, 0x4F, + 0xCE, 0xFC, 0x62, 0xAD, 0xBB, 0x24, 0xB1, 0x97, 0xAE, 0x8C, 0xDA, 0xB5, 0xC4, 0x92, 0xC5, 0xE8, + 0xB1, 0x7D, 0x29, 0x1F, 0x8B, 0xE7, 0xEE, 0x8D, 0xBE, 0xA2, 0x3C, 0xC1, 0xDC, 0x2E, 0xED, 0x92, + 0xE5, 0x02, 0x93, 0x8A, 0xD2, 0x0C, 0xEC, 0x4C, 0xC3, 0xA8, 0xFA, 0xB0, 0xFA, 0xA5, 0xCD, 0xD6, + 0xFE, 0xEA, 0xAD, 0xB5, 0x13, 0xBC, 0x27, 0xDE, 0x6F, 0x6E, 0x13, 0x3D, 0xE3, 0x45, 0x1A, 0x82, + 0x00, 0x3B, 0xEB, 0x16, 0x4F, 0xD2, 0x06, 0xDB, 0xE0, 0x9B, 0x48, 0x89, 0x05, 0xE5, 0x59, 0xE6, + 0x76, 0x71, 0xF7, 0x9D, 0x5E, 0xBE, 0x5A, 0x95, 0xE2, 0x66, 0xE0, 0xB3, 0xBA, 0xE1, 0xC7, 0x7A, + 0x4A, 0x5E, 0x34, 0x91, 0x84, 0x6E, 0x05, 0x21, 0x63, 0xF0, 0xAB, 0x52, 0xCE, 0xA1, 0xAF, 0xF0, + 0x44, 0xBD, 0xAA, 0x4F, 0x20, 0x50, 0xBC, 0x00, 0x02, 0xBA, 0x4B, 0xC6, 0xD0, 0x8E, 0x27, 0xAD, + 0x4A, 0xFD, 0x01, 0xD2, 0x65, 0x6E, 0x51, 0x94, 0x47, 0x01, 0x96, 0x6D, 0xEA, 0xE3, 0xA9, 0x9F, + 0xF4, 0x6F, 0x48, 0x69, 0x1D, 0x16, 0x4F, 0xC1, 0x9F, 0x29, 0x7D, 0xAD, 0xA7, 0x1D, 0xE6, 0xE3, + 0x52, 0xFB, 0x14, 0x7C, 0x0F, 0x6C, 0x0F, 0x5F, 0xEA, 0x29, 0xAF, 0xFB, 0x78, 0xAB, 0xBA, 0x51, + 0xD9, 0x19, 0x50, 0x84, 0x4E, 0x76, 0x7C, 0x2C, 0x19, 0x27, 0xEC, 0xCD, 0x8A, 0xB1, 0xE6, 0x6E, + 0xD6, 0x25, 0x63, 0xBD, 0x2C, 0x45, 0x4B, 0x9E, 0x12, 0x2F, 0x5F, 0xB6, 0x8B, 0x91, 0xAF, 0x3E, + 0x19, 0x72, 0x66, 0xE9, 0x94, 0x31, 0x3B, 0x73, 0x60, 0x3D, 0x41, 0xAF, 0x4B, 0x51, 0x2B, 0xDE, + 0xB3, 0x27, 0xE8, 0xB5, 0xAC, 0x54, 0xCB, 0x19, 0xF0, 0x24, 0x3D, 0xAF, 0x86, 0x9E, 0x33, 0xE1, + 0x69, 0x08, 0xD0, 0x57, 0x96, 0x52, 0xF1, 0x5B, 0x9D, 0x41, 0xC5, 0x83, 0xBA, 0x48, 0x28, 0xCA, + 0xE8, 0xE1, 0xBF, 0x01, 0x4A, 0x44, 0xCF, 0x34, 0xE0, 0x1F, 0x00 }; ///main_js //To convert AP-Config\index.html to index_html[], run the Python index_html_zipper.py script in the Tools folder: @@ -808,7 +809,7 @@ static const uint8_t main_js[] PROGMEM = { // python index_html_zipper.py static const uint8_t index_html[] PROGMEM = { - 0x1F, 0x8B, 0x08, 0x08, 0x10, 0x60, 0x04, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, + 0x1F, 0x8B, 0x08, 0x08, 0x97, 0xA8, 0x04, 0x66, 0x02, 0xFF, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x2E, 0x68, 0x74, 0x6D, 0x6C, 0x2E, 0x67, 0x7A, 0x69, 0x70, 0x00, 0xED, 0x7D, 0xDB, 0x72, 0xDB, 0x4A, 0x92, 0xE0, 0xFB, 0x46, 0xEC, 0x3F, 0xD4, 0x70, 0x76, 0xD6, 0xD2, 0xB4, 0x48, 0x91, 0xD4, 0xC5, 0xB2, 0xDA, 0x66, 0x84, 0x24, 0x4A, 0xB6, 0xA2, 0x65, 0x99, 0x2B, 0xCA, 0x7D, 0xCE, 0xF1, 0xC6, From bae552055b7390f93ca54e7b38a23be298da6221 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Thu, 28 Mar 2024 12:41:18 +0000 Subject: [PATCH 075/112] Corrections Priority - working on WiFi Config - found the pesky autoIMUmountAlignment --- Firmware/RTK_Everywhere/AP-Config/index.html | 4 +- Firmware/RTK_Everywhere/AP-Config/src/main.js | 12 +- Firmware/RTK_Everywhere/Begin.ino | 12 + Firmware/RTK_Everywhere/GNSS.ino | 2 +- Firmware/RTK_Everywhere/RTK_Everywhere.ino | 3 + Firmware/RTK_Everywhere/ZED.ino | 3 +- Firmware/RTK_Everywhere/form.h | 3227 +++++++++-------- Firmware/RTK_Everywhere/menuCommands.ino | 2 +- .../menuCorrectionsPriorities.ino | 2 +- Firmware/RTK_Everywhere/menuMessages.ino | 2 +- 10 files changed, 1647 insertions(+), 1622 deletions(-) diff --git a/Firmware/RTK_Everywhere/AP-Config/index.html b/Firmware/RTK_Everywhere/AP-Config/index.html index 2afa9e41a..79a833ee0 100644 --- a/Firmware/RTK_Everywhere/AP-Config/index.html +++ b/Firmware/RTK_Everywhere/AP-Config/index.html @@ -1255,7 +1255,7 @@
- +