From a10e02e9981fc670d94516b2bb939fa6afabee77 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Fri, 20 Sep 2019 00:04:28 +0200 Subject: [PATCH 01/58] segment size printout cosmetics (#6534) * segment size printout cosmetics * improve readability --- tools/sizes.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/sizes.py b/tools/sizes.py index 669712c1d..f633f8a6a 100755 --- a/tools/sizes.py +++ b/tools/sizes.py @@ -23,6 +23,15 @@ import os import subprocess import sys +def get_segment_hints(): + hints = {} + hints['IROM'] = ' - code in flash (default or ICACHE_FLASH_ATTR)' + hints['IRAM'] = ' / 32768 - code in IRAM (ICACHE_RAM_ATTR, ISRs...)' + hints['DATA'] = ') - initialized variables (global, static) in RAM/HEAP' + hints['RODATA'] = ') / 81920 - constants (global, static) in RAM/HEAP' + hints['BSS'] = ') - zeroed variables (global, static) in RAM/HEAP' + return hints + def get_segment_sizes(elf, path): sizes = {} sizes['IROM'] = 0 @@ -53,10 +62,11 @@ def main(): args = parser.parse_args() sizes = get_segment_sizes(args.elf, args.path) + hints = get_segment_hints() sys.stderr.write("Executable segment sizes:" + os.linesep) for k in sizes.keys(): - sys.stderr.write("%-7s: %d%s" % (k, sizes[k], os.linesep)) + sys.stderr.write("%-7s: %-5d %s %s" % (k, sizes[k], hints[k], os.linesep)) return 0 From 3733ece7e8c4ece1aaa99cef98dc9152bb277539 Mon Sep 17 00:00:00 2001 From: Carlos Alberto Nunes Date: Fri, 20 Sep 2019 09:44:48 +0200 Subject: [PATCH 02/58] Allow Filesystem update via ESP8266HTTPUpdateServer (#3732) * Allow SPIFFS update via ESP8266HTTPUpdateServer This adds capability to update the SPIFFS image via the same mechansism as firmware in the ESP8266HTTPUpdateServer. It does not provide any dependency or linkage between firmware and spiffs image updating; they are each taken on their own, each followed by a reboot. (I wrote this before seeing the other PR for similar functionality; I like this a bit better, becaue it uses the available SPIFFS size, and does not hide magic numbers (U_SPIFFS) in the html...) (It also cleans up a stray \n from commit ace0622) * A simple filter * Review https://github.com/esp8266/Arduino/pull/3234#pullrequestreview-37773153 * Including suggestions for mobile first #3961 * SPIFFS rennamed to FS * including comments from @earlephihower * button renaming * missing #include for LittleFS * generic names as suggested by @d-a-v --- .../src/ESP8266HTTPUpdateServer-impl.h | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h index b543073f4..6761177a0 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h @@ -3,6 +3,9 @@ #include #include #include +#include +#include +#include #include "StreamString.h" #include "ESP8266HTTPUpdateServer.h" @@ -10,11 +13,25 @@ namespace esp8266httpupdateserver { using namespace esp8266webserver; static const char serverIndex[] PROGMEM = - R"(
- - -
- )"; + R"( + + + + + + +
+ Firmware:
+ + +
+
+ FileSystem:
+ + +
+ + )"; static const char successResponse[] PROGMEM = "Update Success! Rebooting..."; @@ -75,9 +92,18 @@ void ESP8266HTTPUpdateServerTemplate::setup(ESP8266WebServerTemplate WiFiUDP::stopAll(); if (_serial_output) Serial.printf("Update: %s\n", upload.filename.c_str()); - uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; - if(!Update.begin(maxSketchSpace)){//start with max available size - _setUpdaterError(); + if (upload.name == "filesystem") { + size_t fsSize = ((size_t) &_FS_end - (size_t) &_FS_start); + SPIFFS.end(); + LittleFS.end(); + if (!Update.begin(fsSize, U_FS)){//start with max available size + if (_serial_output) Update.printError(Serial); + } + } else { + uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + if (!Update.begin(maxSketchSpace, U_FLASH)){//start with max available size + _setUpdaterError(); + } } } else if(_authenticated && upload.status == UPLOAD_FILE_WRITE && !_updaterError.length()){ if (_serial_output) Serial.printf("."); From 69f3e81fb9a1ddb1e0bd5fc3266057dd756a29ae Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 20 Sep 2019 08:24:10 -0700 Subject: [PATCH 03/58] Restore EEPROM address to prior released location (#6537) When the FS_END was adjusted to end on a full block (i.e. rounded down) to avoid filesystem issues, but _FS_end was changed. The EEPROM library used _FS_end to implicitly calculate the start of the EEPROM data, so this means after the _FS_end fix, EEPROM data written with prior releases would "disappear." Avoid the issue by explicitly calculating the EEPROM start location in the linker, using the same formula as prior release. Fixes #6531 --- libraries/EEPROM/EEPROM.cpp | 4 ++-- package/package_esp8266com_index.template.json | 2 +- tools/boards.txt.py | 6 ++++++ tools/sdk/ld/eagle.flash.16m14m.ld | 1 + tools/sdk/ld/eagle.flash.16m15m.ld | 1 + tools/sdk/ld/eagle.flash.1m.ld | 1 + tools/sdk/ld/eagle.flash.1m128.ld | 1 + tools/sdk/ld/eagle.flash.1m144.ld | 1 + tools/sdk/ld/eagle.flash.1m160.ld | 1 + tools/sdk/ld/eagle.flash.1m192.ld | 1 + tools/sdk/ld/eagle.flash.1m256.ld | 1 + tools/sdk/ld/eagle.flash.1m512.ld | 1 + tools/sdk/ld/eagle.flash.1m64.ld | 1 + tools/sdk/ld/eagle.flash.2m.ld | 1 + tools/sdk/ld/eagle.flash.2m128.ld | 1 + tools/sdk/ld/eagle.flash.2m1m.ld | 1 + tools/sdk/ld/eagle.flash.2m256.ld | 1 + tools/sdk/ld/eagle.flash.2m512.ld | 1 + tools/sdk/ld/eagle.flash.4m.ld | 1 + tools/sdk/ld/eagle.flash.4m1m.ld | 1 + tools/sdk/ld/eagle.flash.4m2m.ld | 1 + tools/sdk/ld/eagle.flash.4m3m.ld | 1 + tools/sdk/ld/eagle.flash.512k.ld | 1 + tools/sdk/ld/eagle.flash.512k128.ld | 1 + tools/sdk/ld/eagle.flash.512k32.ld | 1 + tools/sdk/ld/eagle.flash.512k64.ld | 1 + tools/sdk/ld/eagle.flash.8m6m.ld | 1 + tools/sdk/ld/eagle.flash.8m7m.ld | 1 + 28 files changed, 34 insertions(+), 3 deletions(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index fa1aa3ee0..3410b35de 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -30,7 +30,7 @@ extern "C" { #include "spi_flash.h" } -extern "C" uint32_t _FS_end; +extern "C" uint32_t _EEPROM_start; EEPROMClass::EEPROMClass(uint32_t sector) : _sector(sector) @@ -41,7 +41,7 @@ EEPROMClass::EEPROMClass(uint32_t sector) } EEPROMClass::EEPROMClass(void) -: _sector((((uint32_t)&_FS_end - 0x40200000) / SPI_FLASH_SEC_SIZE)) +: _sector((((uint32_t)&_EEPROM_start - 0x40200000) / SPI_FLASH_SEC_SIZE)) , _data(0) , _size(0) , _dirty(false) diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index cc4e3f866..709238253 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -359,4 +359,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 3d8c947b2..eea090f42 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -1181,6 +1181,11 @@ def flash_map (flashsize_kb, fs_kb = 0): rfcal_size_kb = 4 sdkwifi_size_kb = 12 fs_end = (flashsize_kb - sdkwifi_size_kb - rfcal_size_kb - eeprom_size_kb) * 1024 + + # For legacy reasons (#6531), the EEPROM sector needs to be at the old + # FS_end calculated without regards to block size + eeprom_start = fs_end + rfcal_addr = (flashsize_kb - sdkwifi_size_kb - rfcal_size_kb) * 1024 if flashsize_kb <= 1024: max_upload_size = (flashsize_kb - (fs_kb + eeprom_size_kb + rfcal_size_kb + sdkwifi_size_kb)) * 1024 - reserved @@ -1264,6 +1269,7 @@ def flash_map (flashsize_kb, fs_kb = 0): print("PROVIDE ( _FS_end = 0x%08X );" % (0x40200000 + fs_end)) print("PROVIDE ( _FS_page = 0x%X );" % page) print("PROVIDE ( _FS_block = 0x%X );" % fs_blocksize) + print("PROVIDE ( _EEPROM_start = 0x%08x );" % (0x40200000 + eeprom_start)) print("") print('INCLUDE "local.eagle.app.v6.common.ld"') diff --git a/tools/sdk/ld/eagle.flash.16m14m.ld b/tools/sdk/ld/eagle.flash.16m14m.ld index ccc5eb828..1895bfacc 100644 --- a/tools/sdk/ld/eagle.flash.16m14m.ld +++ b/tools/sdk/ld/eagle.flash.16m14m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40400000 ); PROVIDE ( _FS_end = 0x411FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x411fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.16m15m.ld b/tools/sdk/ld/eagle.flash.16m15m.ld index dcb650f66..c4dd05664 100644 --- a/tools/sdk/ld/eagle.flash.16m15m.ld +++ b/tools/sdk/ld/eagle.flash.16m15m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40300000 ); PROVIDE ( _FS_end = 0x411FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x411fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m.ld b/tools/sdk/ld/eagle.flash.1m.ld index 57c8ab2da..a21d71e50 100644 --- a/tools/sdk/ld/eagle.flash.1m.ld +++ b/tools/sdk/ld/eagle.flash.1m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402FB000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m128.ld b/tools/sdk/ld/eagle.flash.1m128.ld index 729f61398..63de63d98 100644 --- a/tools/sdk/ld/eagle.flash.1m128.ld +++ b/tools/sdk/ld/eagle.flash.1m128.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402DB000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m144.ld b/tools/sdk/ld/eagle.flash.1m144.ld index e644897c4..f466f9e35 100644 --- a/tools/sdk/ld/eagle.flash.1m144.ld +++ b/tools/sdk/ld/eagle.flash.1m144.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402D7000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m160.ld b/tools/sdk/ld/eagle.flash.1m160.ld index 08b54f51f..8e567fca3 100644 --- a/tools/sdk/ld/eagle.flash.1m160.ld +++ b/tools/sdk/ld/eagle.flash.1m160.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402D3000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m192.ld b/tools/sdk/ld/eagle.flash.1m192.ld index 77ddac33d..cea01a527 100644 --- a/tools/sdk/ld/eagle.flash.1m192.ld +++ b/tools/sdk/ld/eagle.flash.1m192.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402CB000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m256.ld b/tools/sdk/ld/eagle.flash.1m256.ld index b197a2b1c..2c2e9bed8 100644 --- a/tools/sdk/ld/eagle.flash.1m256.ld +++ b/tools/sdk/ld/eagle.flash.1m256.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402BB000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m512.ld b/tools/sdk/ld/eagle.flash.1m512.ld index 811f7a150..9858694e0 100644 --- a/tools/sdk/ld/eagle.flash.1m512.ld +++ b/tools/sdk/ld/eagle.flash.1m512.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x4027B000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m64.ld b/tools/sdk/ld/eagle.flash.1m64.ld index 92447c0f9..18cee2c27 100644 --- a/tools/sdk/ld/eagle.flash.1m64.ld +++ b/tools/sdk/ld/eagle.flash.1m64.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x402EB000 ); PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x402fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m.ld b/tools/sdk/ld/eagle.flash.2m.ld index 00b11a073..72832b443 100644 --- a/tools/sdk/ld/eagle.flash.2m.ld +++ b/tools/sdk/ld/eagle.flash.2m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x403FB000 ); PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); +PROVIDE ( _EEPROM_start = 0x403fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m128.ld b/tools/sdk/ld/eagle.flash.2m128.ld index 1e96769b9..e0b0c14d0 100644 --- a/tools/sdk/ld/eagle.flash.2m128.ld +++ b/tools/sdk/ld/eagle.flash.2m128.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x403E0000 ); PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x403fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m1m.ld b/tools/sdk/ld/eagle.flash.2m1m.ld index 21195281e..566b86678 100644 --- a/tools/sdk/ld/eagle.flash.2m1m.ld +++ b/tools/sdk/ld/eagle.flash.2m1m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40300000 ); PROVIDE ( _FS_end = 0x403FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x403fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m256.ld b/tools/sdk/ld/eagle.flash.2m256.ld index 4b59a1b15..fd3ad317a 100644 --- a/tools/sdk/ld/eagle.flash.2m256.ld +++ b/tools/sdk/ld/eagle.flash.2m256.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x403C0000 ); PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x403fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m512.ld b/tools/sdk/ld/eagle.flash.2m512.ld index a6015dd2d..18ed12114 100644 --- a/tools/sdk/ld/eagle.flash.2m512.ld +++ b/tools/sdk/ld/eagle.flash.2m512.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40380000 ); PROVIDE ( _FS_end = 0x403FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x403fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m.ld b/tools/sdk/ld/eagle.flash.4m.ld index f77c95ae1..9e7f1444d 100644 --- a/tools/sdk/ld/eagle.flash.4m.ld +++ b/tools/sdk/ld/eagle.flash.4m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x405FB000 ); PROVIDE ( _FS_end = 0x405FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); +PROVIDE ( _EEPROM_start = 0x405fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m1m.ld b/tools/sdk/ld/eagle.flash.4m1m.ld index 4d295e306..3f3f5fb0a 100644 --- a/tools/sdk/ld/eagle.flash.4m1m.ld +++ b/tools/sdk/ld/eagle.flash.4m1m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40500000 ); PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x405fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m2m.ld b/tools/sdk/ld/eagle.flash.4m2m.ld index d7034237c..840c3b28a 100644 --- a/tools/sdk/ld/eagle.flash.4m2m.ld +++ b/tools/sdk/ld/eagle.flash.4m2m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40400000 ); PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x405fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m3m.ld b/tools/sdk/ld/eagle.flash.4m3m.ld index 604ed2fa5..e04500b80 100644 --- a/tools/sdk/ld/eagle.flash.4m3m.ld +++ b/tools/sdk/ld/eagle.flash.4m3m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40300000 ); PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x405fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k.ld b/tools/sdk/ld/eagle.flash.512k.ld index 4f421ab8e..c0bbb1ad4 100644 --- a/tools/sdk/ld/eagle.flash.512k.ld +++ b/tools/sdk/ld/eagle.flash.512k.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x4027B000 ); PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); +PROVIDE ( _EEPROM_start = 0x4027b000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k128.ld b/tools/sdk/ld/eagle.flash.512k128.ld index 7a3c573af..cf1c52d9e 100644 --- a/tools/sdk/ld/eagle.flash.512k128.ld +++ b/tools/sdk/ld/eagle.flash.512k128.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x4025B000 ); PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x4027b000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k32.ld b/tools/sdk/ld/eagle.flash.512k32.ld index 1334b8d8e..a046a9ffd 100644 --- a/tools/sdk/ld/eagle.flash.512k32.ld +++ b/tools/sdk/ld/eagle.flash.512k32.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40273000 ); PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x4027b000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k64.ld b/tools/sdk/ld/eagle.flash.512k64.ld index fdea4da8e..ed88b7b49 100644 --- a/tools/sdk/ld/eagle.flash.512k64.ld +++ b/tools/sdk/ld/eagle.flash.512k64.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x4026B000 ); PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); +PROVIDE ( _EEPROM_start = 0x4027b000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.8m6m.ld b/tools/sdk/ld/eagle.flash.8m6m.ld index 2b2671602..05c1fd205 100644 --- a/tools/sdk/ld/eagle.flash.8m6m.ld +++ b/tools/sdk/ld/eagle.flash.8m6m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40400000 ); PROVIDE ( _FS_end = 0x409FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x409fb000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.8m7m.ld b/tools/sdk/ld/eagle.flash.8m7m.ld index 2dae7ac7f..1754a366c 100644 --- a/tools/sdk/ld/eagle.flash.8m7m.ld +++ b/tools/sdk/ld/eagle.flash.8m7m.ld @@ -18,5 +18,6 @@ PROVIDE ( _FS_start = 0x40300000 ); PROVIDE ( _FS_end = 0x409FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); +PROVIDE ( _EEPROM_start = 0x409fb000 ); INCLUDE "local.eagle.app.v6.common.ld" From 308e131dee0271f60459933b1315ec88fc2004a5 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Mon, 23 Sep 2019 17:30:02 +0300 Subject: [PATCH 04/58] Update EEPROM library documentation (#6548) Update EEPROM description with mention of current implementation limitations Move ESP_EEPROM to Other Libraries, update description from upstream README Add https://github.com/xoseperez/eeprom_rotate to Other Libraries as an alternative --- doc/libraries.rst | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/doc/libraries.rst b/doc/libraries.rst index a7c3ab0e6..c902dc196 100644 --- a/doc/libraries.rst +++ b/doc/libraries.rst @@ -29,6 +29,8 @@ EEPROM library uses one sector of flash located just after the SPIFFS. `Three examples `__ included. +Note that the sector needs to be re-flashed every time the changed EEPROM data needs to be saved, thus will wear out the flash memory very quickly even if small amounts of data are written. Consider using one of the EEPROM libraries mentioned down below. + I2C (Wire library) ------------------ @@ -141,14 +143,6 @@ Servo This library exposes the ability to control RC (hobby) servo motors. It will support up to 24 servos on any available output pin. By default the first 12 servos will use Timer0 and currently this will not interfere with any other support. Servo counts above 12 will use Timer1 and features that use it will be affected. While many RC servo motors will accept the 3.3V IO data pin from a ESP8266, most will not be able to run off 3.3v and will require another power source that matches their specifications. Make sure to connect the grounds between the ESP8266 and the servo motor power supply. -Improved EEPROM library for ESP (ESP_EEPROM) --------------------------------------------- - -An improved EEPROM library for ESPxxxx. Uses flash memory as per the standard ESP EEPROM library but reduces reflash - so reducing wear and improving commit() performance. - -As actions on the flash need to stop the interrupts, an EEPROM reflash could noticably affect anything using PWM, etc. - - Other libraries (not included with the IDE) ------------------------------------------- @@ -189,3 +183,5 @@ Libraries that don't rely on low-level access to AVR registers should work well. - `MFRC522 `__ - A library for using the Mifare RC522 RFID-tag reader/writer. - `Ping `__ - lets the ESP8266 ping a remote machine. - `AsyncPing `__ - fully asynchronous Ping library (have full ping statistic and hardware MAC address). +- `ESP_EEPROM `__ - This library writes a new copy of your data when you save (commit) it and keeps track of where in the sector the most recent copy is kept using a bitmap. The flash sector only needs to be erased when there is no more space for copies in the flash sector. +- `EEPROM Rotate `__ - Instead of using a single sector to persist the data from the emulated EEPROM, this library uses a number of sectors to do so: a sector pool. From f3ca09006d1560c37e0560dcbd75f176dd129a81 Mon Sep 17 00:00:00 2001 From: M Hightower <27247790+mhightower83@users.noreply.github.com> Date: Mon, 23 Sep 2019 14:05:27 -0700 Subject: [PATCH 05/58] Update UART selection for Boot ROM ets_putc, when debug port is selected. (#6489) * Add code to select the UART for Boot ROM ets_putc which is used by ::printf, ets_printf_P in core_esp_postmortem.cpp and others. ets_putc is a wrapper for uart_tx_one_char. uart_tx_one_char uses the element buff_uart_no in UartDev (A structure in data area of the Boot ROM) to select UART0 or UART1. uart_buff_switch is used to set that entry. The structure for UartDev can be found in uart.h from the ESP8266_NONOS_SDK. As best I can tell the Boot ROM always defaults to UART0. * Fixes debug UART selection for ets_putc This addresses an issue of UART selection for ROM function ets_putc, which is used by ::printf, ets_printf_P in core_esp_postmortem.cpp and others. Currently ets_putc stays on UART0 after Serial1.setDebugOutput(true) is called. ets_putc() is not affected by calls to ets_install_putc1. Its UART selection is controlled by the ROM function uart_buff_switch. Updated uart_set_debug() to call uart_buff_switch whenever debug is enabled on an UART. For the case of disabling, a call to select UART0 is made, because there is no disable option for this print method. * Removed fp_putc_t typedef, save for a later PR --- cores/esp8266/esp8266_undocumented.h | 21 ++++ cores/esp8266/uart.cpp | 162 ++++++++++++++------------- 2 files changed, 106 insertions(+), 77 deletions(-) diff --git a/cores/esp8266/esp8266_undocumented.h b/cores/esp8266/esp8266_undocumented.h index dc84e2f57..22216d962 100644 --- a/cores/esp8266/esp8266_undocumented.h +++ b/cores/esp8266/esp8266_undocumented.h @@ -11,6 +11,27 @@ extern int rom_i2c_readReg_Mask(int, int, int, int, int); extern int uart_baudrate_detect(int, int); +/* +ROM function, uart_buff_switch(), is used to switch printing between UART0 and +UART1. It updates a structure that only controls a select group of print +functions. ets_putc() and ets_uart_printf() are examples and are not affected by +calls to ets_install_putc1(). + + Use: + 0 for UART0, also clears RX FIFO + 1 for UART1 + */ +extern void uart_buff_switch(uint8_t); + +/* + ROM function, ets_uart_printf(), prints on the UART selected by + uart_buff_switch(). Supported format options are the same as vprintf(). Also + has cooked newline behavior. No flash format/string support; however, ISR safe. + Also, uses a static function in ROM to print characters which is only + controlled by uart_buff_switch(). + */ +extern int ets_uart_printf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); + extern void ets_delay_us(uint32_t us); #ifdef __cplusplus diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index 30b375cba..b464c0653 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -83,7 +83,7 @@ struct uart_rx_buffer_ uint8_t * buffer; }; -struct uart_ +struct uart_ { int uart_nr; int baud_rate; @@ -112,7 +112,7 @@ struct uart_ // called by ISR inline size_t ICACHE_RAM_ATTR -uart_rx_fifo_available(const int uart_nr) +uart_rx_fifo_available(const int uart_nr) { return (USS(uart_nr) >> USRXC) & 0xFF; } @@ -121,12 +121,12 @@ uart_rx_fifo_available(const int uart_nr) /**********************************************************/ /************ UNSAFE FUNCTIONS ****************************/ /**********************************************************/ -inline size_t -uart_rx_buffer_available_unsafe(const struct uart_rx_buffer_ * rx_buffer) +inline size_t +uart_rx_buffer_available_unsafe(const struct uart_rx_buffer_ * rx_buffer) { - if(rx_buffer->wpos < rx_buffer->rpos) + if(rx_buffer->wpos < rx_buffer->rpos) return (rx_buffer->wpos + rx_buffer->size) - rx_buffer->rpos; - + return rx_buffer->wpos - rx_buffer->rpos; } @@ -141,14 +141,14 @@ uart_rx_available_unsafe(uart_t* uart) // Copy all the rx fifo bytes that fit into the rx buffer // called by ISR inline void ICACHE_RAM_ATTR -uart_rx_copy_fifo_to_buffer_unsafe(uart_t* uart) +uart_rx_copy_fifo_to_buffer_unsafe(uart_t* uart) { struct uart_rx_buffer_ *rx_buffer = uart->rx_buffer; while(uart_rx_fifo_available(uart->uart_nr)) { size_t nextPos = (rx_buffer->wpos + 1) % rx_buffer->size; - if(nextPos == rx_buffer->rpos) + if(nextPos == rx_buffer->rpos) { if (!uart->rx_overrun) { @@ -175,17 +175,17 @@ uart_rx_copy_fifo_to_buffer_unsafe(uart_t* uart) } } -inline int +inline int uart_peek_char_unsafe(uart_t* uart) { if (!uart_rx_available_unsafe(uart)) return -1; - + //without the following if statement and body, there is a good chance of a fifo overrun if (uart_rx_buffer_available_unsafe(uart->rx_buffer) == 0) // hw fifo can't be peeked, data need to be copied to sw uart_rx_copy_fifo_to_buffer_unsafe(uart); - + return uart->rx_buffer->buffer[uart->rx_buffer->rpos]; } @@ -204,12 +204,12 @@ uart_read_char_unsafe(uart_t* uart) return -1; } -size_t +size_t uart_rx_available(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) return 0; - + ETS_UART_INTR_DISABLE(); int uartrxbufferavailable = uart_rx_buffer_available_unsafe(uart->rx_buffer); ETS_UART_INTR_ENABLE(); @@ -217,19 +217,19 @@ uart_rx_available(uart_t* uart) return uartrxbufferavailable + uart_rx_fifo_available(uart->uart_nr); } -int +int uart_peek_char(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) return -1; - + ETS_UART_INTR_DISABLE(); //access to rx_buffer can be interrupted by the isr (similar to a critical section), so disable interrupts here int ret = uart_peek_char_unsafe(uart); ETS_UART_INTR_ENABLE(); return ret; } -int +int uart_read_char(uart_t* uart) { uint8_t ret; @@ -322,26 +322,26 @@ static void ICACHE_RAM_ATTR uart_isr_handle_data(void* arg, uint8_t data) USIC(uart->uart_nr) = usis; } -size_t +size_t uart_resize_rx_buffer(uart_t* uart, size_t new_size) { - if(uart == NULL || !uart->rx_enabled) + if(uart == NULL || !uart->rx_enabled) return 0; - if(uart->rx_buffer->size == new_size) + if(uart->rx_buffer->size == new_size) return uart->rx_buffer->size; uint8_t * new_buf = (uint8_t*)malloc(new_size); if(!new_buf) return uart->rx_buffer->size; - + size_t new_wpos = 0; ETS_UART_INTR_DISABLE(); while(uart_rx_available_unsafe(uart) && new_wpos < new_size) new_buf[new_wpos++] = uart_read_char_unsafe(uart); //if uart_rx_available_unsafe() returns non-0, uart_read_char_unsafe() can't return -1 if (new_wpos == new_size) new_wpos = 0; - + uint8_t * old_buf = uart->rx_buffer->buffer; uart->rx_buffer->rpos = 0; uart->rx_buffer->wpos = new_wpos; @@ -359,13 +359,13 @@ uart_get_rx_buffer_size(uart_t* uart) } // The default ISR handler called when GDB is not enabled -void ICACHE_RAM_ATTR +void ICACHE_RAM_ATTR uart_isr(void * arg) { uart_t* uart = (uart_t*)arg; uint32_t usis = USIS(uart->uart_nr); - if(uart == NULL || !uart->rx_enabled) + if(uart == NULL || !uart->rx_enabled) { USIC(uart->uart_nr) = usis; ETS_UART_INTR_DISABLE(); @@ -380,14 +380,14 @@ uart_isr(void * arg) uart->rx_overrun = true; //os_printf_plus(overrun_str); } - + if (usis & ((1 << UIFR) | (1 << UIPE) | (1 << UITO))) uart->rx_error = true; USIC(uart->uart_nr) = usis; } -static void +static void uart_start_isr(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) @@ -422,7 +422,7 @@ uart_start_isr(uart_t* uart) ETS_UART_INTR_ENABLE(); } -static void +static void uart_stop_isr(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) @@ -459,7 +459,7 @@ uart_tx_fifo_full(const int uart_nr) } -static void +static void uart_do_write_char(const int uart_nr, char c) { while(uart_tx_fifo_full(uart_nr)); @@ -467,7 +467,7 @@ uart_do_write_char(const int uart_nr, char c) USF(uart_nr) = c; } -size_t +size_t uart_write_char(uart_t* uart, char c) { if(uart == NULL || !uart->tx_enabled) @@ -481,7 +481,7 @@ uart_write_char(uart_t* uart, char c) return 1; } -size_t +size_t uart_write(uart_t* uart, const char* buf, size_t size) { if(uart == NULL || !uart->tx_enabled) @@ -501,7 +501,7 @@ uart_write(uart_t* uart, const char* buf, size_t size) } -size_t +size_t uart_tx_free(uart_t* uart) { if(uart == NULL || !uart->tx_enabled) @@ -510,7 +510,7 @@ uart_tx_free(uart_t* uart) return UART_TX_FIFO_SIZE - uart_tx_fifo_available(uart->uart_nr); } -void +void uart_wait_tx_empty(uart_t* uart) { if(uart == NULL || !uart->tx_enabled) @@ -521,14 +521,14 @@ uart_wait_tx_empty(uart_t* uart) } -void +void uart_flush(uart_t* uart) { if(uart == NULL) return; uint32_t tmp = 0x00000000; - if(uart->rx_enabled) + if(uart->rx_enabled) { tmp |= (1 << UCRXRST); ETS_UART_INTR_DISABLE(); @@ -546,7 +546,7 @@ uart_flush(uart_t* uart) } } -void +void uart_set_baudrate(uart_t* uart, int baud_rate) { if(uart == NULL) @@ -556,7 +556,7 @@ uart_set_baudrate(uart_t* uart, int baud_rate) USD(uart->uart_nr) = (ESP8266_CLOCK / uart->baud_rate); } -int +int uart_get_baudrate(uart_t* uart) { if(uart == NULL) @@ -565,7 +565,7 @@ uart_get_baudrate(uart_t* uart) return uart->baud_rate; } -uart_t* +uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size) { uart_t* uart = (uart_t*) malloc(sizeof(uart_t)); @@ -576,7 +576,7 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx uart->rx_overrun = false; uart->rx_error = false; - switch(uart->uart_nr) + switch(uart->uart_nr) { case UART0: ETS_UART_INTR_DISABLE(); @@ -586,10 +586,10 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx uart->rx_enabled = (mode != UART_TX_ONLY); uart->tx_enabled = (mode != UART_RX_ONLY); uart->rx_pin = (uart->rx_enabled)?3:255; - if(uart->rx_enabled) + if(uart->rx_enabled) { struct uart_rx_buffer_ * rx_buffer = (struct uart_rx_buffer_ *)malloc(sizeof(struct uart_rx_buffer_)); - if(rx_buffer == NULL) + if(rx_buffer == NULL) { free(uart); return NULL; @@ -598,7 +598,7 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx rx_buffer->rpos = 0; rx_buffer->wpos = 0; rx_buffer->buffer = (uint8_t *)malloc(rx_buffer->size); - if(rx_buffer->buffer == NULL) + if(rx_buffer->buffer == NULL) { free(rx_buffer); free(uart); @@ -607,20 +607,20 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx uart->rx_buffer = rx_buffer; pinMode(uart->rx_pin, SPECIAL); } - if(uart->tx_enabled) + if(uart->tx_enabled) { - if (tx_pin == 2) + if (tx_pin == 2) { uart->tx_pin = 2; pinMode(uart->tx_pin, FUNCTION_4); - } - else + } + else { uart->tx_pin = 1; pinMode(uart->tx_pin, FUNCTION_0); } - } - else + } + else { uart->tx_pin = 255; } @@ -666,7 +666,7 @@ uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx return uart; } -void +void uart_uninit(uart_t* uart) { if(uart == NULL) @@ -675,7 +675,7 @@ uart_uninit(uart_t* uart) uart_stop_isr(uart); if(uart->tx_enabled && (!gdbstub_has_uart_isr_control() || uart->uart_nr != UART0)) { - switch(uart->tx_pin) + switch(uart->tx_pin) { case 1: pinMode(1, INPUT); @@ -693,7 +693,7 @@ uart_uninit(uart_t* uart) free(uart->rx_buffer->buffer); free(uart->rx_buffer); if(!gdbstub_has_uart_isr_control()) { - switch(uart->rx_pin) + switch(uart->rx_pin) { case 3: pinMode(3, INPUT); @@ -707,16 +707,16 @@ uart_uninit(uart_t* uart) free(uart); } -void +void uart_swap(uart_t* uart, int tx_pin) { if(uart == NULL) return; - switch(uart->uart_nr) + switch(uart->uart_nr) { case UART0: - if(((uart->tx_pin == 1 || uart->tx_pin == 2) && uart->tx_enabled) || (uart->rx_pin == 3 && uart->rx_enabled)) + if(((uart->tx_pin == 1 || uart->tx_pin == 2) && uart->tx_enabled) || (uart->rx_pin == 3 && uart->rx_enabled)) { if(uart->tx_enabled) //TX { @@ -728,15 +728,15 @@ uart_swap(uart_t* uart, int tx_pin) pinMode(uart->rx_pin, INPUT); uart->rx_pin = 13; } - if(uart->tx_enabled) + if(uart->tx_enabled) pinMode(uart->tx_pin, FUNCTION_4); //TX if(uart->rx_enabled) pinMode(uart->rx_pin, FUNCTION_4); //RX - + IOSWAP |= (1 << IOSWAPU0); - } - else + } + else { if(uart->tx_enabled) //TX { @@ -751,7 +751,7 @@ uart_swap(uart_t* uart, int tx_pin) if(uart->tx_enabled) pinMode(uart->tx_pin, (tx_pin == 2)?FUNCTION_4:SPECIAL); //TX - if(uart->rx_enabled) + if(uart->rx_enabled) pinMode(3, SPECIAL); //RX IOSWAP &= ~(1 << IOSWAPU0); @@ -765,24 +765,24 @@ uart_swap(uart_t* uart, int tx_pin) } } -void +void uart_set_tx(uart_t* uart, int tx_pin) { if(uart == NULL) return; - switch(uart->uart_nr) + switch(uart->uart_nr) { case UART0: - if(uart->tx_enabled) + if(uart->tx_enabled) { - if (uart->tx_pin == 1 && tx_pin == 2) + if (uart->tx_pin == 1 && tx_pin == 2) { pinMode(uart->tx_pin, INPUT); uart->tx_pin = 2; pinMode(uart->tx_pin, FUNCTION_4); - } - else if (uart->tx_pin == 2 && tx_pin != 2) + } + else if (uart->tx_pin == 2 && tx_pin != 2) { pinMode(uart->tx_pin, INPUT); uart->tx_pin = 1; @@ -799,7 +799,7 @@ uart_set_tx(uart_t* uart, int tx_pin) } } -void +void uart_set_pins(uart_t* uart, int tx, int rx) { if(uart == NULL) @@ -807,13 +807,13 @@ uart_set_pins(uart_t* uart, int tx, int rx) if(uart->uart_nr == UART0) // Only UART0 allows pin changes { - if(uart->tx_enabled && uart->tx_pin != tx) + if(uart->tx_enabled && uart->tx_pin != tx) { - if( rx == 13 && tx == 15) + if( rx == 13 && tx == 15) { uart_swap(uart, 15); - } - else if (rx == 3 && (tx == 1 || tx == 2)) + } + else if (rx == 3 && (tx == 1 || tx == 2)) { if (uart->rx_pin != rx) uart_swap(uart, tx); @@ -827,7 +827,7 @@ uart_set_pins(uart_t* uart, int tx, int rx) } -bool +bool uart_tx_enabled(uart_t* uart) { if(uart == NULL) @@ -836,7 +836,7 @@ uart_tx_enabled(uart_t* uart) return uart->tx_enabled; } -bool +bool uart_rx_enabled(uart_t* uart) { if(uart == NULL) @@ -845,7 +845,7 @@ uart_rx_enabled(uart_t* uart) return uart->rx_enabled; } -bool +bool uart_has_overrun (uart_t* uart) { if (uart == NULL || !uart->rx_overrun) @@ -867,7 +867,7 @@ uart_has_rx_error (uart_t* uart) return true; } -static void +static void uart_ignore_char(char c) { (void) c; @@ -883,34 +883,42 @@ uart_write_char_delay(const int uart_nr, char c) } -static void +static void uart0_write_char(char c) { uart_write_char_delay(0, c); } -static void +static void uart1_write_char(char c) { uart_write_char_delay(1, c); } -void +void uart_set_debug(int uart_nr) { s_uart_debug_nr = uart_nr; void (*func)(char) = NULL; - switch(s_uart_debug_nr) + switch(s_uart_debug_nr) { case UART0: func = &uart0_write_char; + // This selects the UART for ROM ets_putc which is used by + // ::printf, ets_printf_P in core_esp_postmortem.cpp and others. + // Has a side effect of clearing RX FIFO for UART0 + uart_buff_switch(0); break; case UART1: func = &uart1_write_char; + uart_buff_switch(1); break; case UART_NO: default: func = &uart_ignore_char; + // There is no disable option for ets_putc, + // we switch to UART0 for disable case. + uart_buff_switch(0); break; } if(gdbstub_has_putc1_control()) { @@ -925,7 +933,7 @@ uart_set_debug(int uart_nr) } } -int +int uart_get_debug() { return s_uart_debug_nr; From 244dbd7713338a127be3f53ba2fa1c3915c3ba98 Mon Sep 17 00:00:00 2001 From: Mike Nix Date: Tue, 24 Sep 2019 20:32:11 +0700 Subject: [PATCH 06/58] Add 20/26MHz Flash frequencies for slow/cheap flash chips on the Generic ESP board (#6552) A number of non-genuine boards exist mainly from flea-bay sellers that use under-sized and/or low quality flash chips which can not handle a 40MHz FlashFreq properly. This patch adds slower flash frequencies to the menu for generic ESP boards so that these cheap knock-offs can be run in a stable manner, hopefully saving some people a few headaches and keeping these boards out of landfill. --- boards.txt | 12 ++++++++++++ tools/boards.txt.py | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/boards.txt b/boards.txt index ff7f8e663..74509c0b3 100644 --- a/boards.txt +++ b/boards.txt @@ -76,6 +76,10 @@ generic.menu.FlashFreq.40=40MHz generic.menu.FlashFreq.40.build.flash_freq=40 generic.menu.FlashFreq.80=80MHz generic.menu.FlashFreq.80.build.flash_freq=80 +generic.menu.FlashFreq.20=20MHz +generic.menu.FlashFreq.20.build.flash_freq=20 +generic.menu.FlashFreq.26=26MHz +generic.menu.FlashFreq.26.build.flash_freq=26 generic.menu.FlashMode.dout=DOUT (compatible) generic.menu.FlashMode.dout.build.flash_mode=dout generic.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT @@ -4758,6 +4762,10 @@ wifinfo.menu.FlashFreq.40=40MHz wifinfo.menu.FlashFreq.40.build.flash_freq=40 wifinfo.menu.FlashFreq.80=80MHz wifinfo.menu.FlashFreq.80.build.flash_freq=80 +wifinfo.menu.FlashFreq.20=20MHz +wifinfo.menu.FlashFreq.20.build.flash_freq=20 +wifinfo.menu.FlashFreq.26=26MHz +wifinfo.menu.FlashFreq.26.build.flash_freq=26 wifinfo.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB) wifinfo.menu.eesz.1M64.build.flash_size=1M wifinfo.menu.eesz.1M64.build.flash_size_bytes=0x100000 @@ -5778,6 +5786,10 @@ wifi_slot.menu.FlashFreq.40=40MHz wifi_slot.menu.FlashFreq.40.build.flash_freq=40 wifi_slot.menu.FlashFreq.80=80MHz wifi_slot.menu.FlashFreq.80.build.flash_freq=80 +wifi_slot.menu.FlashFreq.20=20MHz +wifi_slot.menu.FlashFreq.20.build.flash_freq=20 +wifi_slot.menu.FlashFreq.26=26MHz +wifi_slot.menu.FlashFreq.26.build.flash_freq=26 wifi_slot.menu.FlashMode.dout=DOUT (compatible) wifi_slot.menu.FlashMode.dout.build.flash_mode=dout wifi_slot.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT diff --git a/tools/boards.txt.py b/tools/boards.txt.py index eea090f42..6851e5b7e 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -905,6 +905,10 @@ macros = { ( '.menu.FlashFreq.40.build.flash_freq', '40' ), ( '.menu.FlashFreq.80', '80MHz' ), ( '.menu.FlashFreq.80.build.flash_freq', '80' ), + ( '.menu.FlashFreq.20', '20MHz' ), + ( '.menu.FlashFreq.20.build.flash_freq', '20' ), + ( '.menu.FlashFreq.26', '26MHz' ), + ( '.menu.FlashFreq.26.build.flash_freq', '26' ), ]), 'flashfreq_40': collections.OrderedDict([ From 2b9fcdb568ce68928a022bf322d9eb8302699666 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Thu, 26 Sep 2019 10:48:04 -0700 Subject: [PATCH 07/58] Add EEPROM debug printouts, error check to example (#6556) * Add EEPROM debug printouts, error check to example Add debug printouts when EEPROM calls fail, even if the API doesn't allow returning a success/failure code. Adds error checking to the example to make it explicit that when you call EEPROM::commit(), you need to look at the result code in your code. Fixes #6551 , or would fix it if there was error checking in the MCVE. * Clarify example error message --- libraries/EEPROM/EEPROM.cpp | 40 ++++++++++++++----- .../examples/eeprom_read/eeprom_read.ino | 2 +- .../examples/eeprom_write/eeprom_write.ino | 7 +++- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index 3410b35de..a46638b6d 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -21,6 +21,7 @@ #include "Arduino.h" #include "EEPROM.h" +#include "debug.h" extern "C" { #include "c_types.h" @@ -49,10 +50,14 @@ EEPROMClass::EEPROMClass(void) } void EEPROMClass::begin(size_t size) { - if (size <= 0) + if (size <= 0) { + DEBUGV("EEPROMClass::begin error, size == 0\n"); return; - if (size > SPI_FLASH_SEC_SIZE) + } + if (size > SPI_FLASH_SEC_SIZE) { + DEBUGV("EEPROMClass::begin error, %d > %d\n", size, SPI_FLASH_SEC_SIZE); size = SPI_FLASH_SEC_SIZE; + } size = (size + 3) & (~3); @@ -67,8 +72,11 @@ void EEPROMClass::begin(size_t size) { _size = size; noInterrupts(); - spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); + auto ret = spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); interrupts(); + if (ret != SPI_FLASH_RESULT_OK) { + DEBUGV("EEPROMClass::begin spi_flash_read failed, %d\n", (int)ret); + } _dirty = false; //make sure dirty is cleared in case begin() is called 2nd+ time } @@ -88,19 +96,27 @@ void EEPROMClass::end() { uint8_t EEPROMClass::read(int const address) { - if (address < 0 || (size_t)address >= _size) + if (address < 0 || (size_t)address >= _size) { + DEBUGV("EEPROMClass::read error, address %d > %d or %d < 0\n", address, _size, address); return 0; - if(!_data) + } + if (!_data) { + DEBUGV("EEPROMClass::read without ::begin\n"); return 0; + } return _data[address]; } void EEPROMClass::write(int const address, uint8_t const value) { - if (address < 0 || (size_t)address >= _size) + if (address < 0 || (size_t)address >= _size) { + DEBUGV("EEPROMClass::write error, address %d > %d or %d < 0\n", address, _size, address); return; - if(!_data) + } + if(!_data) { + DEBUGV("EEPROMClass::read without ::begin\n"); return; + } // Optimise _dirty. Only flagged if data written is different. uint8_t* pData = &_data[address]; @@ -121,14 +137,20 @@ bool EEPROMClass::commit() { return false; noInterrupts(); - if(spi_flash_erase_sector(_sector) == SPI_FLASH_RESULT_OK) { - if(spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size) == SPI_FLASH_RESULT_OK) { + auto flashret = spi_flash_erase_sector(_sector); + if (flashret == SPI_FLASH_RESULT_OK) { + flashret = spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); + if (flashret == SPI_FLASH_RESULT_OK) { _dirty = false; ret = true; } } interrupts(); + if (flashret != SPI_FLASH_RESULT_OK) { + DEBUGV("EEPROMClass::commit failed, %d\n", (int)flashret); + } + return ret; } diff --git a/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino b/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino index c25a3463f..5ffbe8240 100644 --- a/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino +++ b/libraries/EEPROM/examples/eeprom_read/eeprom_read.ino @@ -14,7 +14,7 @@ byte value; void setup() { // initialize serial and wait for port to open: - Serial.begin(9600); + Serial.begin(115200); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } diff --git a/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino b/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino index 7bfccd25a..8b48a186a 100644 --- a/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino +++ b/libraries/EEPROM/examples/eeprom_write/eeprom_write.ino @@ -13,6 +13,7 @@ int addr = 0; void setup() { + Serial.begin(115200); EEPROM.begin(512); } @@ -33,7 +34,11 @@ void loop() { addr = addr + 1; if (addr == 512) { addr = 0; - EEPROM.commit(); + if (EEPROM.commit()) { + Serial.println("EEPROM successfully committed"); + } else { + Serial.println("ERROR! EEPROM commit failed"); + } } delay(100); From 418b00f7c05d8658e265ff3246b508998423a14c Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Thu, 26 Sep 2019 12:28:07 -0700 Subject: [PATCH 08/58] Re-add deprecated _SPIFFS_xxx linker symbols (#6543) In order to give user libs a change to update to the new symbols, re-add the _SPIFFS_XX symbols to the linker file with a comment that they are deprecated. Also add back spiffs_hal_xxx functions, also marked as deprecated. Fixes #6542 --- cores/esp8266/spiffs_api.cpp | 15 +++++++++++++++ cores/esp8266/spiffs_api.h | 20 ++++++++++++++++++++ tools/boards.txt.py | 6 ++++++ tools/sdk/ld/eagle.flash.16m14m.ld | 5 +++++ tools/sdk/ld/eagle.flash.16m15m.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m128.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m144.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m160.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m192.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m256.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m512.ld | 5 +++++ tools/sdk/ld/eagle.flash.1m64.ld | 5 +++++ tools/sdk/ld/eagle.flash.2m.ld | 5 +++++ tools/sdk/ld/eagle.flash.2m128.ld | 5 +++++ tools/sdk/ld/eagle.flash.2m1m.ld | 5 +++++ tools/sdk/ld/eagle.flash.2m256.ld | 5 +++++ tools/sdk/ld/eagle.flash.2m512.ld | 5 +++++ tools/sdk/ld/eagle.flash.4m.ld | 5 +++++ tools/sdk/ld/eagle.flash.4m1m.ld | 5 +++++ tools/sdk/ld/eagle.flash.4m2m.ld | 5 +++++ tools/sdk/ld/eagle.flash.4m3m.ld | 5 +++++ tools/sdk/ld/eagle.flash.512k.ld | 5 +++++ tools/sdk/ld/eagle.flash.512k128.ld | 5 +++++ tools/sdk/ld/eagle.flash.512k32.ld | 5 +++++ tools/sdk/ld/eagle.flash.512k64.ld | 5 +++++ tools/sdk/ld/eagle.flash.8m6m.ld | 5 +++++ tools/sdk/ld/eagle.flash.8m7m.ld | 5 +++++ 28 files changed, 166 insertions(+) diff --git a/cores/esp8266/spiffs_api.cpp b/cores/esp8266/spiffs_api.cpp index 833dd3edb..04fc461d1 100644 --- a/cores/esp8266/spiffs_api.cpp +++ b/cores/esp8266/spiffs_api.cpp @@ -25,6 +25,21 @@ using namespace fs; + +// Deprecated functions, to be deleted in next release +int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src) { + return flash_hal_write(addr, size, src); +} +int32_t spiffs_hal_erase(uint32_t addr, uint32_t size) { + return flash_hal_erase(addr, size); +} +int32_t spiffs_hal_read(uint32_t addr, uint32_t size, uint8_t *dst) { + return flash_hal_read(addr, size, dst); +} + + + + namespace spiffs_impl { FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode accessMode) diff --git a/cores/esp8266/spiffs_api.h b/cores/esp8266/spiffs_api.h index c297d7d23..862813bb4 100644 --- a/cores/esp8266/spiffs_api.h +++ b/cores/esp8266/spiffs_api.h @@ -39,6 +39,26 @@ extern "C" { using namespace fs; +// The following are deprecated symbols and functions, to be removed at the next major release. +// They are provided only for backwards compatibility and to give libs a chance to update. + +extern "C" uint32_t _SPIFFS_start __attribute__((deprecated)); +extern "C" uint32_t _SPIFFS_end __attribute__((deprecated)); +extern "C" uint32_t _SPIFFS_page __attribute__((deprecated)); +extern "C" uint32_t _SPIFFS_block __attribute__((deprecated)); + +#define SPIFFS_PHYS_ADDR ((uint32_t) (&_SPIFFS_start) - 0x40200000) +#define SPIFFS_PHYS_SIZE ((uint32_t) (&_SPIFFS_end) - (uint32_t) (&_SPIFFS_start)) +#define SPIFFS_PHYS_PAGE ((uint32_t) &_SPIFFS_page) +#define SPIFFS_PHYS_BLOCK ((uint32_t) &_SPIFFS_block) + +extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src) __attribute__((deprecated)); +extern int32_t spiffs_hal_erase(uint32_t addr, uint32_t size) __attribute__((deprecated)); +extern int32_t spiffs_hal_read(uint32_t addr, uint32_t size, uint8_t *dst) __attribute__((deprecated)); + + + + namespace spiffs_impl { int getSpiffsMode(OpenMode openMode, AccessMode accessMode); diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 6851e5b7e..79c5af56b 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -1274,6 +1274,12 @@ def flash_map (flashsize_kb, fs_kb = 0): print("PROVIDE ( _FS_page = 0x%X );" % page) print("PROVIDE ( _FS_block = 0x%X );" % fs_blocksize) print("PROVIDE ( _EEPROM_start = 0x%08x );" % (0x40200000 + eeprom_start)) + # Re-add deprecated symbols pointing to the same address as the new standard ones + print("/* The following symbols are DEPRECATED and will be REMOVED in a future release */") + print("PROVIDE ( _SPIFFS_start = 0x%08X );" % (0x40200000 + fs_start)) + print("PROVIDE ( _SPIFFS_end = 0x%08X );" % (0x40200000 + fs_end)) + print("PROVIDE ( _SPIFFS_page = 0x%X );" % page) + print("PROVIDE ( _SPIFFS_block = 0x%X );" % fs_blocksize) print("") print('INCLUDE "local.eagle.app.v6.common.ld"') diff --git a/tools/sdk/ld/eagle.flash.16m14m.ld b/tools/sdk/ld/eagle.flash.16m14m.ld index 1895bfacc..a67ef97d1 100644 --- a/tools/sdk/ld/eagle.flash.16m14m.ld +++ b/tools/sdk/ld/eagle.flash.16m14m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x411FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x411fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40400000 ); +PROVIDE ( _SPIFFS_end = 0x411FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.16m15m.ld b/tools/sdk/ld/eagle.flash.16m15m.ld index c4dd05664..bca117f76 100644 --- a/tools/sdk/ld/eagle.flash.16m15m.ld +++ b/tools/sdk/ld/eagle.flash.16m15m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x411FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x411fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40300000 ); +PROVIDE ( _SPIFFS_end = 0x411FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m.ld b/tools/sdk/ld/eagle.flash.1m.ld index a21d71e50..57c35adbc 100644 --- a/tools/sdk/ld/eagle.flash.1m.ld +++ b/tools/sdk/ld/eagle.flash.1m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402FB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m128.ld b/tools/sdk/ld/eagle.flash.1m128.ld index 63de63d98..f518f08fa 100644 --- a/tools/sdk/ld/eagle.flash.1m128.ld +++ b/tools/sdk/ld/eagle.flash.1m128.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402DB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m144.ld b/tools/sdk/ld/eagle.flash.1m144.ld index f466f9e35..4a4f98651 100644 --- a/tools/sdk/ld/eagle.flash.1m144.ld +++ b/tools/sdk/ld/eagle.flash.1m144.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402D7000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m160.ld b/tools/sdk/ld/eagle.flash.1m160.ld index 8e567fca3..289c0ad0f 100644 --- a/tools/sdk/ld/eagle.flash.1m160.ld +++ b/tools/sdk/ld/eagle.flash.1m160.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402D3000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m192.ld b/tools/sdk/ld/eagle.flash.1m192.ld index cea01a527..2b71f41ac 100644 --- a/tools/sdk/ld/eagle.flash.1m192.ld +++ b/tools/sdk/ld/eagle.flash.1m192.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402CB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m256.ld b/tools/sdk/ld/eagle.flash.1m256.ld index 2c2e9bed8..6a90e9fcb 100644 --- a/tools/sdk/ld/eagle.flash.1m256.ld +++ b/tools/sdk/ld/eagle.flash.1m256.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402BB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m512.ld b/tools/sdk/ld/eagle.flash.1m512.ld index 9858694e0..e3c6db39e 100644 --- a/tools/sdk/ld/eagle.flash.1m512.ld +++ b/tools/sdk/ld/eagle.flash.1m512.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x4027B000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m64.ld b/tools/sdk/ld/eagle.flash.1m64.ld index 18cee2c27..87032bd02 100644 --- a/tools/sdk/ld/eagle.flash.1m64.ld +++ b/tools/sdk/ld/eagle.flash.1m64.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x402FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x402fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x402EB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m.ld b/tools/sdk/ld/eagle.flash.2m.ld index 72832b443..e39377b28 100644 --- a/tools/sdk/ld/eagle.flash.2m.ld +++ b/tools/sdk/ld/eagle.flash.2m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); PROVIDE ( _EEPROM_start = 0x403fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x403FB000 ); +PROVIDE ( _SPIFFS_end = 0x403FB000 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m128.ld b/tools/sdk/ld/eagle.flash.2m128.ld index e0b0c14d0..fd71ce458 100644 --- a/tools/sdk/ld/eagle.flash.2m128.ld +++ b/tools/sdk/ld/eagle.flash.2m128.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x403fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x403E0000 ); +PROVIDE ( _SPIFFS_end = 0x403FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m1m.ld b/tools/sdk/ld/eagle.flash.2m1m.ld index 566b86678..172636740 100644 --- a/tools/sdk/ld/eagle.flash.2m1m.ld +++ b/tools/sdk/ld/eagle.flash.2m1m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x403FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x403fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40300000 ); +PROVIDE ( _SPIFFS_end = 0x403FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m256.ld b/tools/sdk/ld/eagle.flash.2m256.ld index fd3ad317a..6b72dc167 100644 --- a/tools/sdk/ld/eagle.flash.2m256.ld +++ b/tools/sdk/ld/eagle.flash.2m256.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x403FB000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x403fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x403C0000 ); +PROVIDE ( _SPIFFS_end = 0x403FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.2m512.ld b/tools/sdk/ld/eagle.flash.2m512.ld index 18ed12114..eab32089f 100644 --- a/tools/sdk/ld/eagle.flash.2m512.ld +++ b/tools/sdk/ld/eagle.flash.2m512.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x403FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x403fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40380000 ); +PROVIDE ( _SPIFFS_end = 0x403FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m.ld b/tools/sdk/ld/eagle.flash.4m.ld index 9e7f1444d..31c059807 100644 --- a/tools/sdk/ld/eagle.flash.4m.ld +++ b/tools/sdk/ld/eagle.flash.4m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x405FB000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); PROVIDE ( _EEPROM_start = 0x405fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x405FB000 ); +PROVIDE ( _SPIFFS_end = 0x405FB000 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m1m.ld b/tools/sdk/ld/eagle.flash.4m1m.ld index 3f3f5fb0a..cf6bd7aa1 100644 --- a/tools/sdk/ld/eagle.flash.4m1m.ld +++ b/tools/sdk/ld/eagle.flash.4m1m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x405fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40500000 ); +PROVIDE ( _SPIFFS_end = 0x405FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m2m.ld b/tools/sdk/ld/eagle.flash.4m2m.ld index 840c3b28a..9723b9490 100644 --- a/tools/sdk/ld/eagle.flash.4m2m.ld +++ b/tools/sdk/ld/eagle.flash.4m2m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x405fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40400000 ); +PROVIDE ( _SPIFFS_end = 0x405FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.4m3m.ld b/tools/sdk/ld/eagle.flash.4m3m.ld index e04500b80..a85a1da02 100644 --- a/tools/sdk/ld/eagle.flash.4m3m.ld +++ b/tools/sdk/ld/eagle.flash.4m3m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x405FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x405fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40300000 ); +PROVIDE ( _SPIFFS_end = 0x405FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k.ld b/tools/sdk/ld/eagle.flash.512k.ld index c0bbb1ad4..44ecf057d 100644 --- a/tools/sdk/ld/eagle.flash.512k.ld +++ b/tools/sdk/ld/eagle.flash.512k.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x0 ); PROVIDE ( _FS_block = 0x0 ); PROVIDE ( _EEPROM_start = 0x4027b000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x4027B000 ); +PROVIDE ( _SPIFFS_end = 0x4027B000 ); +PROVIDE ( _SPIFFS_page = 0x0 ); +PROVIDE ( _SPIFFS_block = 0x0 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k128.ld b/tools/sdk/ld/eagle.flash.512k128.ld index cf1c52d9e..63c5a4c6e 100644 --- a/tools/sdk/ld/eagle.flash.512k128.ld +++ b/tools/sdk/ld/eagle.flash.512k128.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x4027b000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x4025B000 ); +PROVIDE ( _SPIFFS_end = 0x4027B000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k32.ld b/tools/sdk/ld/eagle.flash.512k32.ld index a046a9ffd..ef031f4cd 100644 --- a/tools/sdk/ld/eagle.flash.512k32.ld +++ b/tools/sdk/ld/eagle.flash.512k32.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x4027b000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40273000 ); +PROVIDE ( _SPIFFS_end = 0x4027B000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.512k64.ld b/tools/sdk/ld/eagle.flash.512k64.ld index ed88b7b49..3cd80b5da 100644 --- a/tools/sdk/ld/eagle.flash.512k64.ld +++ b/tools/sdk/ld/eagle.flash.512k64.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x4027B000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x1000 ); PROVIDE ( _EEPROM_start = 0x4027b000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x4026B000 ); +PROVIDE ( _SPIFFS_end = 0x4027B000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.8m6m.ld b/tools/sdk/ld/eagle.flash.8m6m.ld index 05c1fd205..107745422 100644 --- a/tools/sdk/ld/eagle.flash.8m6m.ld +++ b/tools/sdk/ld/eagle.flash.8m6m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x409FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x409fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40400000 ); +PROVIDE ( _SPIFFS_end = 0x409FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.8m7m.ld b/tools/sdk/ld/eagle.flash.8m7m.ld index 1754a366c..099f801f1 100644 --- a/tools/sdk/ld/eagle.flash.8m7m.ld +++ b/tools/sdk/ld/eagle.flash.8m7m.ld @@ -19,5 +19,10 @@ PROVIDE ( _FS_end = 0x409FA000 ); PROVIDE ( _FS_page = 0x100 ); PROVIDE ( _FS_block = 0x2000 ); PROVIDE ( _EEPROM_start = 0x409fb000 ); +/* The following symbols are DEPRECATED and will be REMOVED in a future release */ +PROVIDE ( _SPIFFS_start = 0x40300000 ); +PROVIDE ( _SPIFFS_end = 0x409FA000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x2000 ); INCLUDE "local.eagle.app.v6.common.ld" From ff1e8e92d120fd5187a77e51716127b7778cbd9f Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 27 Sep 2019 13:49:26 -0700 Subject: [PATCH 09/58] Add info about installing python3 on Mac, Linux (#6558) The Mac requires special handholding to allow SSL connections for get.py, so document those for end users. --- doc/installing.rst | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/doc/installing.rst b/doc/installing.rst index 1c6317d2b..6e4728aec 100644 --- a/doc/installing.rst +++ b/doc/installing.rst @@ -12,6 +12,7 @@ Prerequisites - Arduino 1.6.8, get it from `Arduino website `__. - Internet connection +- Python 3 interpreter (Mac/Linux only, Windows installation supplies its own) Instructions ~~~~~~~~~~~~ @@ -186,9 +187,33 @@ Instructions - Other OS cd esp8266/tools python3 get.py + If you get an error message stating that python3 is not found, you will need to install it (most modern UNIX-like OSes provide Python 3 as + part of the default install). To install you will need to use ``sudo yum install python3``, ``sudo apt install python3``, or ``brew install python3`` + as appropriate. On the Mac you may get an error message like: + + .. code:: bash + + python3 get.py + Platform: x86_64-apple-darwin + Downloading python3-macosx-placeholder.tar.gz + Traceback (most recent call last): + File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1317, in do_open + encode_chunked=req.has_header('Transfer-encoding')) + ... + File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake + self._sslobj.do_handshake() + ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056) + + This is because Homebrew on the Mac does not always install the required SSL certificates by default. Install them manually (adjust the Python 3.7 as needed) with: + + .. code:: bash + + cd "/Applications/Python 3.7/" && sudo "./Install Certificates.command" + + - Restart Arduino -- When later updating your local library, goto the esp8266 directory and do a git pull +- When later updating your local library, goto the esp8266 directory and do a git pull .. code:: bash From 831d6431bcbc72cba80ffa2c48d6ad24c735a4fa Mon Sep 17 00:00:00 2001 From: M Hightower <27247790+mhightower83@users.noreply.github.com> Date: Fri, 27 Sep 2019 14:23:16 -0700 Subject: [PATCH 10/58] Add typedef for putc1, fn_putc1_t. (#6550) * Add typedef for putc1, fn_putc1_t. Replaced relevant usage of `(void *)` with `fn_putc1_t`. Correct usage of `ets_putc()`, returning 0, in libc_replacement.cpp This PR assumes PR https://github.com/esp8266/Arduino/pull/6489#issue-315018841 has merged and removes `uart_buff_switch` from `umm_performance.cpp` Updated method of defining `_rom_putc1` to be more acceptable (I hope) to the new compiler. * Use PROVIDE to expose ROM function entry point, ets_uart_putc1. Added comments to ets_putc() and ets_uart_putc1() to explain their differences. Change prototype of ets_putc() to conform with fp_putc_t. Updated _isr_safe_printf_P to use new definition, ets_uart_putc1. --- cores/esp8266/core_esp8266_postmortem.cpp | 3 +- cores/esp8266/libc_replacements.cpp | 3 +- cores/esp8266/uart.cpp | 6 +-- cores/esp8266/umm_malloc/umm_performance.cpp | 19 +-------- tools/sdk/include/ets_sys.h | 43 ++++++++++++++++++-- tools/sdk/ld/eagle.rom.addr.v6.ld | 2 + 6 files changed, 49 insertions(+), 27 deletions(-) diff --git a/cores/esp8266/core_esp8266_postmortem.cpp b/cores/esp8266/core_esp8266_postmortem.cpp index bbe67f1d4..0b254b9b7 100644 --- a/cores/esp8266/core_esp8266_postmortem.cpp +++ b/cores/esp8266/core_esp8266_postmortem.cpp @@ -108,8 +108,7 @@ void __wrap_system_restart_local() { else rst_info.reason = s_user_reset_reason; - // TODO: ets_install_putc1 definition is wrong in ets_sys.h, need cast - ets_install_putc1((void *)&uart_write_char_d); + ets_install_putc1(&uart_write_char_d); if (s_panic_line) { ets_printf_P(PSTR("\nPanic %S:%d %S"), s_panic_file, s_panic_line, s_panic_func); diff --git a/cores/esp8266/libc_replacements.cpp b/cores/esp8266/libc_replacements.cpp index 1d591abf0..b3beb07dd 100644 --- a/cores/esp8266/libc_replacements.cpp +++ b/cores/esp8266/libc_replacements.cpp @@ -100,7 +100,8 @@ int ICACHE_RAM_ATTR _putc_r(struct _reent* r, int c, FILE* file) __attribute__(( int ICACHE_RAM_ATTR _putc_r(struct _reent* r, int c, FILE* file) { (void) r; if (file->_file == STDOUT_FILENO) { - return ets_putc(c); + ets_putc(c); + return c; } return EOF; } diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index b464c0653..6c71efccb 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -899,8 +899,8 @@ void uart_set_debug(int uart_nr) { s_uart_debug_nr = uart_nr; - void (*func)(char) = NULL; - switch(s_uart_debug_nr) + fp_putc_t func = NULL; + switch(s_uart_debug_nr) { case UART0: func = &uart0_write_char; @@ -929,7 +929,7 @@ uart_set_debug(int uart_nr) } else { system_set_os_print(0); } - ets_install_putc1((void *) func); + ets_install_putc1(func); } } diff --git a/cores/esp8266/umm_malloc/umm_performance.cpp b/cores/esp8266/umm_malloc/umm_performance.cpp index 4b9ec4e6b..b2417b02e 100644 --- a/cores/esp8266/umm_malloc/umm_performance.cpp +++ b/cores/esp8266/umm_malloc/umm_performance.cpp @@ -39,25 +39,8 @@ bool ICACHE_FLASH_ATTR get_umm_get_perf_data(struct _UMM_TIME_STATS *p, size_t s Objective: To be able to print "last gasp" diagnostic messages when interrupts are disabled and w/o availability of heap resources. */ - -// ROM _putc1, ignores CRs and sends CR/LF for LF, newline. -// Always returns character sent. -int constexpr (*_rom_putc1)(int) = (int (*)(int))0x40001dcc; -void uart_buff_switch(uint8_t); - int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2))); int ICACHE_RAM_ATTR _isr_safe_printf_P(const char *fmt, ...) { -#ifdef DEBUG_ESP_PORT -#define VALUE(x) __STRINGIFY(x) - // Preprocessor and compiler together will optimize away the if. - if (strcmp("Serial1", VALUE(DEBUG_ESP_PORT)) == 0) { - uart_buff_switch(1U); - } else { - uart_buff_switch(0U); - } -#else - uart_buff_switch(0U); // Side effect, clears RX FIFO -#endif /* To use ets_strlen() and ets_memcpy() safely with PROGMEM, flash storage, the PROGMEM address must be word (4 bytes) aligned. The destination @@ -71,7 +54,7 @@ int ICACHE_RAM_ATTR _isr_safe_printf_P(const char *fmt, ...) { ets_memcpy(ram_buf, fmt, buf_len); va_list argPtr; va_start(argPtr, fmt); - int result = ets_vprintf(_rom_putc1, ram_buf, argPtr); + int result = ets_vprintf(ets_uart_putc1, ram_buf, argPtr); va_end(argPtr); return result; } diff --git a/tools/sdk/include/ets_sys.h b/tools/sdk/include/ets_sys.h index da1f3897a..e30607eed 100644 --- a/tools/sdk/include/ets_sys.h +++ b/tools/sdk/include/ets_sys.h @@ -33,6 +33,17 @@ extern "C" { #endif +/* + * This "print character function" prototype is modeled after the argument for + * ets_install_putc1() found in "ESP8266_NONOS_SDK/include/osapi.h". This + * deviates away from the familiar C library definition of putchar; however, it + * agrees with the code we are working with. Note, in the ROM some "printf + * character functions" always return 0 (uart_tx_one_char and ets_putc), some + * return last character printed (buildin _putc1), and some return nothing + * (ets_write_char). Using a void return type safely represents them all. + */ +typedef void (*fp_putc_t)(char); + typedef uint32_t ETSSignal; typedef uint32_t ETSParam; @@ -205,15 +216,41 @@ char *ets_strstr(const char *haystack, const char *needle); int ets_sprintf(char *str, const char *format, ...) __attribute__ ((format (printf, 2, 3))); int os_snprintf(char *str, size_t size, const char *format, ...) __attribute__ ((format (printf, 3, 4))); int ets_printf(const char *format, ...) __attribute__ ((format (printf, 1, 2))); -void ets_install_putc1(void* routine); +void ets_install_putc1(fp_putc_t routine); void ets_isr_mask(int intr); void ets_isr_unmask(int intr); void ets_isr_attach(int intr, int_handler_t handler, void *arg); void ets_intr_lock(); void ets_intr_unlock(); int ets_vsnprintf(char * s, size_t n, const char * format, va_list arg) __attribute__ ((format (printf, 3, 0))); -int ets_vprintf(int (*print_function)(int), const char * format, va_list arg) __attribute__ ((format (printf, 2, 0))); -int ets_putc(int); +int ets_vprintf(fp_putc_t print_function, const char * format, va_list arg) __attribute__ ((format (printf, 2, 0))); + +/* + * ets_putc(), a "print character function" in ROM, prints a character to a + * UART. It always returns 0; however, the prototype here is defined with void + * return to make compatible with other usages of fp_putc_t. ets_putc() provides + * a "raw", print as is, interface. '\r' and '\n' are each printed exactly as is + * w/o addition. For a "cooked" interface use ets_uart_putc1(). + * The use of this function requires a prior setup call to uart_buff_switch() to + * select the UART. + */ +void ets_putc(char); + +/* + * ets_uart_putc1(), a "print character function" in ROM, prints a character to + * a UART. It returns the character printed; however, the prototype here is + * defined with void return to make compatible with other usages of fp_putc_t. + * This function provides additional processing to characters '\r' and '\n'. It + * filters out '\r'. When called with '\n', it prints characters '\r' and '\n'. + * This is sometimes refered to as a "cooked" interface. For a "raw", print as + * is, interface use ets_putc(). The use of this function requires a prior setup + * call to uart_buff_switch() to select the UART. + * ets_uart_putc1() is used internally by ets_uart_printf. It is also the + * function that gets installed by ets_uart_install_printf through a call to + * ets_install_putc1. + */ +void ets_uart_putc1(char); + bool ets_task(ETSTask task, uint8 prio, ETSEvent *queue, uint8 qlen); bool ets_post(uint8 prio, ETSSignal sig, ETSParam par); void ets_update_cpu_frequency(uint32_t ticks_per_us); diff --git a/tools/sdk/ld/eagle.rom.addr.v6.ld b/tools/sdk/ld/eagle.rom.addr.v6.ld index 144c72b55..84c5e3acf 100644 --- a/tools/sdk/ld/eagle.rom.addr.v6.ld +++ b/tools/sdk/ld/eagle.rom.addr.v6.ld @@ -119,6 +119,8 @@ PROVIDE ( ets_install_external_printf = 0x40002450 ); PROVIDE ( ets_install_putc1 = 0x4000242c ); PROVIDE ( ets_install_putc2 = 0x4000248c ); PROVIDE ( ets_install_uart_printf = 0x40002438 ); +/* Undocumented function to print character to UART */ +PROVIDE ( ets_uart_putc1 = 0x40001dcc ); /* permanently hide reimplemented ets_intr_*lock(), see #6484 PROVIDE ( ets_intr_lock = 0x40000f74 ); PROVIDE ( ets_intr_unlock = 0x40000f80 ); From 4f2cc1ccfc621317ecdaecde5bdf34bcda016a82 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Sat, 28 Sep 2019 02:10:44 +0200 Subject: [PATCH 11/58] Latest (5.3.1) EspSoftwareSerial tries to give better guidance about matching working versions. (#6561) --- libraries/SoftwareSerial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 776d49b2f..6d9f11595 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 776d49b2f570b93fe88ad7a082519b4fb56be817 +Subproject commit 6d9f1159555f3025078b3510605b5a2721708535 From c7557710988afa8321f00e8dc7c279e7499946e7 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 28 Sep 2019 12:44:03 -0700 Subject: [PATCH 12/58] Minor FS documentation change from #2904 (#6563) * Minor FS documentation change from #2904 Trivial addition to filesystem upload documentation. Supercedes #2904 which cannot merge due to file renames and massive changes to the filesystem.rst file since it was pushed. * Fix periods on the steps, they are complete sentences --- doc/filesystem.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/filesystem.rst b/doc/filesystem.rst index a56ff8fb0..d70655f2f 100644 --- a/doc/filesystem.rst +++ b/doc/filesystem.rst @@ -175,16 +175,18 @@ use esptool.py. - Download the tool: https://github.com/esp8266/arduino-esp8266fs-plugin/releases/download/0.4.0/ESP8266FS-0.4.0.zip - In your Arduino sketchbook directory, create ``tools`` directory if - it doesn't exist yet + it doesn't exist yet. - Unpack the tool into ``tools`` directory (the path will look like ``/Arduino/tools/ESP8266FS/tool/esp8266fs.jar``) If upgrading, overwrite the existing JAR file with the newer version. -- Restart Arduino IDE -- Open a sketch (or create a new one and save it) -- Go to sketch directory (choose Sketch > Show Sketch Folder) +- Restart Arduino IDE. +- Open a sketch (or create a new one and save it). +- Go to sketch directory (choose Sketch > Show Sketch Folder). - Create a directory named ``data`` and any files you want in the file - system there -- Make sure you have selected a board, port, and closed Serial Monitor + system there. +- Make sure you have selected a board, port, and closed Serial Monitor. +- If your board requires you to press a button (or other action) to enter + bootload mode for flashing a sketch, do that now. - Select Tools > ESP8266 Sketch Data Upload. This should start uploading the files into ESP8266 flash file system. When done, IDE status bar will display ``SPIFFS Image Uploaded`` message. From 4489e239bb680303af1af842aeab863b4bda8b4d Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 28 Sep 2019 15:03:28 -0700 Subject: [PATCH 13/58] Add interrupt section to docs (#6560) * Add info about installing python3 on Mac, Linux The Mac requires special handholding to allow SSL connections for get.py, so document those for end users. * Add interrupt section to docs Adds a section on interrupts to the docs and lists the restrictions and warnings about running long tasks. Fixes #6428 * Update per review comments --- doc/reference.rst | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/doc/reference.rst b/doc/reference.rst index 29ae74e37..db789128e 100644 --- a/doc/reference.rst +++ b/doc/reference.rst @@ -1,6 +1,42 @@ Reference ========= +Interrupts +---------- + +Interrupts can be used on the ESP8266, but they must be used with care +and have several limitations: + +* Interrupt callback functions must be in IRAM, because the flash may be + in the middle of other operations when they occur. Do this by adding + the ``ICACHE_RAM_ATTR`` attribute on the function definition. If this + attribute is not present, the sketch will crash when it attempts to + ``attachInterrupt`` with an error message. + +.. code:: cpp + + ICACHE_RAM_ATTR void gpio_change_handler(void *data) {... + +* Interrupts must not call ``delay()`` or ``yield()``, or call any routines + which internally use ``delay()`` or ``yield()`` either. + +* Long-running (>1ms) tasks in interrupts will cause instabilty or crashes. + WiFi and other portions of the core can become unstable if interrupts + are blocked by a long-running interrupt. If you have much to do, you can + set a volatile global flag that your main ``loop()`` can check each pass + or use a scheduled function (which will be called outside of the interrupt + context when it is safe) to do long-running work. + +* Memory operations can be dangerous and should be avoided in interrupts. + Calls to ``new`` or ``malloc`` should be minimized because they may require + a long running time if memory is fragmented. Calls to ``realloc`` and + ``free`` must NEVER be called. Using any routines or objects which call + ``free`` or ``realloc`` themselves is also forbidden for the same reason. + This means that ``String``, ``std::string``, ``std::vector`` and other + classes which use contiguous memory that may be resized must be used with + extreme care (ensuring strings aren't changed, vector elements aren't + added, etc.). + Digital IO ---------- From ffe5476fc42b06ebde5688527200c6690e8e519f Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 29 Sep 2019 05:25:01 +0200 Subject: [PATCH 14/58] time: import IANA timezone definitions, expose SNTP API (#6373) * time: import IANA timezone definitions - `configTime("timezone", "ntp servers...")` added - timezone definitions by country/cities (TZ.h) - script to update timezone definitions - updated example * fix former configTime non-matching signature * +include * example: add scheduled function in callback * crlf fix * +missing license for napt * SNTP: expose configuration helpers * update submodule * update precompiled libraries * optional: change SNTP startup delay * makes SNTP_UPDATE_DELAY a weak function update example fix for lwip1.4 * on the proper use of polledTimeout api... thanks @mcspr :] * improve update script (per review) * update lwIP submodule * update submodule * hide harmless shell message * update the release process by asking first to update TZ.h [ci skip] * minor update in release documentation * update in release documentation * update in release documentation * clarify release documentation * fix release documentation - sorry for the noise :( * fixes per review * example style * useless variable in example * update lwip2 submodule reference, to include espressif missing declaration fixes --- cores/esp8266/Arduino.h | 9 +- cores/esp8266/TZ.h | 475 ++++++++++++++++++ cores/esp8266/time.cpp | 49 +- .../examples/NTP-TZ-DST/NTP-TZ-DST.ino | 301 +++++++---- package/README.md | 15 +- tools/TZupdate.sh | 71 +++ tools/sdk/lib/liblwip2-1460-feat.a | Bin 1588044 -> 1587308 bytes tools/sdk/lib/liblwip2-1460.a | Bin 1416864 -> 1416178 bytes tools/sdk/lib/liblwip2-536-feat.a | Bin 1587968 -> 1587232 bytes tools/sdk/lib/liblwip2-536.a | Bin 1416788 -> 1416102 bytes tools/sdk/lib/liblwip6-1460-feat.a | Bin 1914856 -> 1914088 bytes tools/sdk/lib/liblwip6-536-feat.a | Bin 1914780 -> 1914012 bytes tools/sdk/lwip2/builder | 2 +- tools/sdk/lwip2/include/dhcpserver.h | 260 +++++----- tools/sdk/lwip2/include/lwip-err-t.h | 1 + tools/sdk/lwip2/include/lwip-git-hash.h | 2 +- tools/sdk/lwip2/include/lwip/napt.h | 37 ++ tools/sdk/lwip2/include/lwipopts.h | 28 +- 18 files changed, 980 insertions(+), 270 deletions(-) create mode 100644 cores/esp8266/TZ.h create mode 100755 tools/TZupdate.sh diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 82a183412..516a2f569 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -275,10 +275,13 @@ long secureRandom(long); long secureRandom(long, long); long map(long, long, long, long, long); -extern "C" void configTime(long timezone, int daylightOffset_sec, - const char* server1, const char* server2 = nullptr, const char* server3 = nullptr); +void configTime(int timezone, int daylightOffset_sec, const char* server1, + const char* server2 = nullptr, const char* server3 = nullptr); -#endif +void configTime(const char* tz, const char* server1, + const char* server2 = nullptr, const char* server3 = nullptr); + +#endif // __cplusplus #include "pins_arduino.h" diff --git a/cores/esp8266/TZ.h b/cores/esp8266/TZ.h new file mode 100644 index 000000000..95b609e61 --- /dev/null +++ b/cores/esp8266/TZ.h @@ -0,0 +1,475 @@ + +// autogenerated from https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv +// by script /tools/TZupdate.sh +// Mon Sep 9 20:58:30 UTC 2019 +// +// This database is autogenerated from IANA timezone database +// https://www.iana.org/time-zones +// and can be updated on demand in this repository +// or by yourself using the above script + +#ifndef TZDB_H +#define TZDB_H + +#define TZ_Africa_Abidjan PSTR("GMT0") +#define TZ_Africa_Accra PSTR("GMT0") +#define TZ_Africa_Addis_Ababa PSTR("EAT-3") +#define TZ_Africa_Algiers PSTR("CET-1") +#define TZ_Africa_Asmara PSTR("EAT-3") +#define TZ_Africa_Bamako PSTR("GMT0") +#define TZ_Africa_Bangui PSTR("WAT-1") +#define TZ_Africa_Banjul PSTR("GMT0") +#define TZ_Africa_Bissau PSTR("GMT0") +#define TZ_Africa_Blantyre PSTR("CAT-2") +#define TZ_Africa_Brazzaville PSTR("WAT-1") +#define TZ_Africa_Bujumbura PSTR("CAT-2") +#define TZ_Africa_Cairo PSTR("EET-2") +#define TZ_Africa_Casablanca PSTR("<+01>-1") +#define TZ_Africa_Ceuta PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Africa_Conakry PSTR("GMT0") +#define TZ_Africa_Dakar PSTR("GMT0") +#define TZ_Africa_Dar_es_Salaam PSTR("EAT-3") +#define TZ_Africa_Djibouti PSTR("EAT-3") +#define TZ_Africa_Douala PSTR("WAT-1") +#define TZ_Africa_El_Aaiun PSTR("<+01>-1") +#define TZ_Africa_Freetown PSTR("GMT0") +#define TZ_Africa_Gaborone PSTR("CAT-2") +#define TZ_Africa_Harare PSTR("CAT-2") +#define TZ_Africa_Johannesburg PSTR("SAST-2") +#define TZ_Africa_Juba PSTR("EAT-3") +#define TZ_Africa_Kampala PSTR("EAT-3") +#define TZ_Africa_Khartoum PSTR("CAT-2") +#define TZ_Africa_Kigali PSTR("CAT-2") +#define TZ_Africa_Kinshasa PSTR("WAT-1") +#define TZ_Africa_Lagos PSTR("WAT-1") +#define TZ_Africa_Libreville PSTR("WAT-1") +#define TZ_Africa_Lome PSTR("GMT0") +#define TZ_Africa_Luanda PSTR("WAT-1") +#define TZ_Africa_Lubumbashi PSTR("CAT-2") +#define TZ_Africa_Lusaka PSTR("CAT-2") +#define TZ_Africa_Malabo PSTR("WAT-1") +#define TZ_Africa_Maputo PSTR("CAT-2") +#define TZ_Africa_Maseru PSTR("SAST-2") +#define TZ_Africa_Mbabane PSTR("SAST-2") +#define TZ_Africa_Mogadishu PSTR("EAT-3") +#define TZ_Africa_Monrovia PSTR("GMT0") +#define TZ_Africa_Nairobi PSTR("EAT-3") +#define TZ_Africa_Ndjamena PSTR("WAT-1") +#define TZ_Africa_Niamey PSTR("WAT-1") +#define TZ_Africa_Nouakchott PSTR("GMT0") +#define TZ_Africa_Ouagadougou PSTR("GMT0") +#define TZ_Africa_PortomNovo PSTR("WAT-1") +#define TZ_Africa_Sao_Tome PSTR("GMT0") +#define TZ_Africa_Tripoli PSTR("EET-2") +#define TZ_Africa_Tunis PSTR("CET-1") +#define TZ_Africa_Windhoek PSTR("CAT-2") +#define TZ_America_Adak PSTR("HST10HDT,M3.2.0,M11.1.0") +#define TZ_America_Anchorage PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Anguilla PSTR("AST4") +#define TZ_America_Antigua PSTR("AST4") +#define TZ_America_Araguaina PSTR("<-03>3") +#define TZ_America_Argentina_Buenos_Aires PSTR("<-03>3") +#define TZ_America_Argentina_Catamarca PSTR("<-03>3") +#define TZ_America_Argentina_Cordoba PSTR("<-03>3") +#define TZ_America_Argentina_Jujuy PSTR("<-03>3") +#define TZ_America_Argentina_La_Rioja PSTR("<-03>3") +#define TZ_America_Argentina_Mendoza PSTR("<-03>3") +#define TZ_America_Argentina_Rio_Gallegos PSTR("<-03>3") +#define TZ_America_Argentina_Salta PSTR("<-03>3") +#define TZ_America_Argentina_San_Juan PSTR("<-03>3") +#define TZ_America_Argentina_San_Luis PSTR("<-03>3") +#define TZ_America_Argentina_Tucuman PSTR("<-03>3") +#define TZ_America_Argentina_Ushuaia PSTR("<-03>3") +#define TZ_America_Aruba PSTR("AST4") +#define TZ_America_Asuncion PSTR("<-04>4<-03>,M10.1.0/0,M3.4.0/0") +#define TZ_America_Atikokan PSTR("EST5") +#define TZ_America_Bahia PSTR("<-03>3") +#define TZ_America_Bahia_Banderas PSTR("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Barbados PSTR("AST4") +#define TZ_America_Belem PSTR("<-03>3") +#define TZ_America_Belize PSTR("CST6") +#define TZ_America_BlancmSablon PSTR("AST4") +#define TZ_America_Boa_Vista PSTR("<-04>4") +#define TZ_America_Bogota PSTR("<-05>5") +#define TZ_America_Boise PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Cambridge_Bay PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Campo_Grande PSTR("<-04>4") +#define TZ_America_Cancun PSTR("EST5") +#define TZ_America_Caracas PSTR("<-04>4") +#define TZ_America_Cayenne PSTR("<-03>3") +#define TZ_America_Cayman PSTR("EST5") +#define TZ_America_Chicago PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Chihuahua PSTR("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Costa_Rica PSTR("CST6") +#define TZ_America_Creston PSTR("MST7") +#define TZ_America_Cuiaba PSTR("<-04>4") +#define TZ_America_Curacao PSTR("AST4") +#define TZ_America_Danmarkshavn PSTR("GMT0") +#define TZ_America_Dawson PSTR("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Dawson_Creek PSTR("MST7") +#define TZ_America_Denver PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Detroit PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Dominica PSTR("AST4") +#define TZ_America_Edmonton PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Eirunepe PSTR("<-05>5") +#define TZ_America_El_Salvador PSTR("CST6") +#define TZ_America_Fortaleza PSTR("<-03>3") +#define TZ_America_Fort_Nelson PSTR("MST7") +#define TZ_America_Glace_Bay PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Godthab PSTR("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1") +#define TZ_America_Goose_Bay PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Grand_Turk PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Grenada PSTR("AST4") +#define TZ_America_Guadeloupe PSTR("AST4") +#define TZ_America_Guatemala PSTR("CST6") +#define TZ_America_Guayaquil PSTR("<-05>5") +#define TZ_America_Guyana PSTR("<-04>4") +#define TZ_America_Halifax PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Havana PSTR("CST5CDT,M3.2.0/0,M11.1.0/1") +#define TZ_America_Hermosillo PSTR("MST7") +#define TZ_America_Indiana_Indianapolis PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Knox PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Marengo PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Petersburg PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Tell_City PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vevay PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Vincennes PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Indiana_Winamac PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Inuvik PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Iqaluit PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Jamaica PSTR("EST5") +#define TZ_America_Juneau PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Louisville PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kentucky_Monticello PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Kralendijk PSTR("AST4") +#define TZ_America_La_Paz PSTR("<-04>4") +#define TZ_America_Lima PSTR("<-05>5") +#define TZ_America_Los_Angeles PSTR("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Lower_Princes PSTR("AST4") +#define TZ_America_Maceio PSTR("<-03>3") +#define TZ_America_Managua PSTR("CST6") +#define TZ_America_Manaus PSTR("<-04>4") +#define TZ_America_Marigot PSTR("AST4") +#define TZ_America_Martinique PSTR("AST4") +#define TZ_America_Matamoros PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Mazatlan PSTR("MST7MDT,M4.1.0,M10.5.0") +#define TZ_America_Menominee PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Merida PSTR("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Metlakatla PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Mexico_City PSTR("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Miquelon PSTR("<-03>3<-02>,M3.2.0,M11.1.0") +#define TZ_America_Moncton PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Monterrey PSTR("CST6CDT,M4.1.0,M10.5.0") +#define TZ_America_Montevideo PSTR("<-03>3") +#define TZ_America_Montreal PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Montserrat PSTR("AST4") +#define TZ_America_Nassau PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_New_York PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nipigon PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Nome PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Noronha PSTR("<-02>2") +#define TZ_America_North_Dakota_Beulah PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_Center PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_North_Dakota_New_Salem PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Ojinaga PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_America_Panama PSTR("EST5") +#define TZ_America_Pangnirtung PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Paramaribo PSTR("<-03>3") +#define TZ_America_Phoenix PSTR("MST7") +#define TZ_America_PortmaumPrince PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Port_of_Spain PSTR("AST4") +#define TZ_America_Porto_Velho PSTR("<-04>4") +#define TZ_America_Puerto_Rico PSTR("AST4") +#define TZ_America_Punta_Arenas PSTR("<-03>3") +#define TZ_America_Rainy_River PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rankin_Inlet PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Recife PSTR("<-03>3") +#define TZ_America_Regina PSTR("CST6") +#define TZ_America_Resolute PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Rio_Branco PSTR("<-05>5") +#define TZ_America_Santarem PSTR("<-03>3") +#define TZ_America_Santiago PSTR("<-04>4<-03>,M9.1.6/24,M4.1.6/24") +#define TZ_America_Santo_Domingo PSTR("AST4") +#define TZ_America_Sao_Paulo PSTR("<-03>3") +#define TZ_America_Scoresbysund PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_America_Sitka PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_St_Barthelemy PSTR("AST4") +#define TZ_America_St_Johns PSTR("NST3:30NDT,M3.2.0,M11.1.0") +#define TZ_America_St_Kitts PSTR("AST4") +#define TZ_America_St_Lucia PSTR("AST4") +#define TZ_America_St_Thomas PSTR("AST4") +#define TZ_America_St_Vincent PSTR("AST4") +#define TZ_America_Swift_Current PSTR("CST6") +#define TZ_America_Tegucigalpa PSTR("CST6") +#define TZ_America_Thule PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_America_Thunder_Bay PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tijuana PSTR("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Toronto PSTR("EST5EDT,M3.2.0,M11.1.0") +#define TZ_America_Tortola PSTR("AST4") +#define TZ_America_Vancouver PSTR("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Whitehorse PSTR("PST8PDT,M3.2.0,M11.1.0") +#define TZ_America_Winnipeg PSTR("CST6CDT,M3.2.0,M11.1.0") +#define TZ_America_Yakutat PSTR("AKST9AKDT,M3.2.0,M11.1.0") +#define TZ_America_Yellowknife PSTR("MST7MDT,M3.2.0,M11.1.0") +#define TZ_Antarctica_Casey PSTR("<+08>-8") +#define TZ_Antarctica_Davis PSTR("<+07>-7") +#define TZ_Antarctica_DumontDUrville PSTR("<+10>-10") +#define TZ_Antarctica_Macquarie PSTR("<+11>-11") +#define TZ_Antarctica_Mawson PSTR("<+05>-5") +#define TZ_Antarctica_McMurdo PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Antarctica_Palmer PSTR("<-03>3") +#define TZ_Antarctica_Rothera PSTR("<-03>3") +#define TZ_Antarctica_Syowa PSTR("<+03>-3") +#define TZ_Antarctica_Troll PSTR("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3") +#define TZ_Antarctica_Vostok PSTR("<+06>-6") +#define TZ_Arctic_Longyearbyen PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Asia_Aden PSTR("<+03>-3") +#define TZ_Asia_Almaty PSTR("<+06>-6") +#define TZ_Asia_Amman PSTR("EET-2EEST,M3.5.4/24,M10.5.5/1") +#define TZ_Asia_Anadyr PSTR("<+12>-12") +#define TZ_Asia_Aqtau PSTR("<+05>-5") +#define TZ_Asia_Aqtobe PSTR("<+05>-5") +#define TZ_Asia_Ashgabat PSTR("<+05>-5") +#define TZ_Asia_Atyrau PSTR("<+05>-5") +#define TZ_Asia_Baghdad PSTR("<+03>-3") +#define TZ_Asia_Bahrain PSTR("<+03>-3") +#define TZ_Asia_Baku PSTR("<+04>-4") +#define TZ_Asia_Bangkok PSTR("<+07>-7") +#define TZ_Asia_Barnaul PSTR("<+07>-7") +#define TZ_Asia_Beirut PSTR("EET-2EEST,M3.5.0/0,M10.5.0/0") +#define TZ_Asia_Bishkek PSTR("<+06>-6") +#define TZ_Asia_Brunei PSTR("<+08>-8") +#define TZ_Asia_Chita PSTR("<+09>-9") +#define TZ_Asia_Choibalsan PSTR("<+08>-8") +#define TZ_Asia_Colombo PSTR("<+0530>-5:30") +#define TZ_Asia_Damascus PSTR("EET-2EEST,M3.5.5/0,M10.5.5/0") +#define TZ_Asia_Dhaka PSTR("<+06>-6") +#define TZ_Asia_Dili PSTR("<+09>-9") +#define TZ_Asia_Dubai PSTR("<+04>-4") +#define TZ_Asia_Dushanbe PSTR("<+05>-5") +#define TZ_Asia_Famagusta PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Gaza PSTR("EET-2EEST,M3.5.5/0,M10.5.6/1") +#define TZ_Asia_Hebron PSTR("EET-2EEST,M3.5.5/0,M10.5.6/1") +#define TZ_Asia_Ho_Chi_Minh PSTR("<+07>-7") +#define TZ_Asia_Hong_Kong PSTR("HKT-8") +#define TZ_Asia_Hovd PSTR("<+07>-7") +#define TZ_Asia_Irkutsk PSTR("<+08>-8") +#define TZ_Asia_Jakarta PSTR("WIB-7") +#define TZ_Asia_Jayapura PSTR("WIT-9") +#define TZ_Asia_Jerusalem PSTR("IST-2IDT,M3.4.4/26,M10.5.0") +#define TZ_Asia_Kabul PSTR("<+0430>-4:30") +#define TZ_Asia_Kamchatka PSTR("<+12>-12") +#define TZ_Asia_Karachi PSTR("PKT-5") +#define TZ_Asia_Kathmandu PSTR("<+0545>-5:45") +#define TZ_Asia_Khandyga PSTR("<+09>-9") +#define TZ_Asia_Kolkata PSTR("IST-5:30") +#define TZ_Asia_Krasnoyarsk PSTR("<+07>-7") +#define TZ_Asia_Kuala_Lumpur PSTR("<+08>-8") +#define TZ_Asia_Kuching PSTR("<+08>-8") +#define TZ_Asia_Kuwait PSTR("<+03>-3") +#define TZ_Asia_Macau PSTR("CST-8") +#define TZ_Asia_Magadan PSTR("<+11>-11") +#define TZ_Asia_Makassar PSTR("WITA-8") +#define TZ_Asia_Manila PSTR("PST-8") +#define TZ_Asia_Muscat PSTR("<+04>-4") +#define TZ_Asia_Nicosia PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Asia_Novokuznetsk PSTR("<+07>-7") +#define TZ_Asia_Novosibirsk PSTR("<+07>-7") +#define TZ_Asia_Omsk PSTR("<+06>-6") +#define TZ_Asia_Oral PSTR("<+05>-5") +#define TZ_Asia_Phnom_Penh PSTR("<+07>-7") +#define TZ_Asia_Pontianak PSTR("WIB-7") +#define TZ_Asia_Pyongyang PSTR("KST-9") +#define TZ_Asia_Qatar PSTR("<+03>-3") +#define TZ_Asia_Qyzylorda PSTR("<+05>-5") +#define TZ_Asia_Riyadh PSTR("<+03>-3") +#define TZ_Asia_Sakhalin PSTR("<+11>-11") +#define TZ_Asia_Samarkand PSTR("<+05>-5") +#define TZ_Asia_Seoul PSTR("KST-9") +#define TZ_Asia_Shanghai PSTR("CST-8") +#define TZ_Asia_Singapore PSTR("<+08>-8") +#define TZ_Asia_Srednekolymsk PSTR("<+11>-11") +#define TZ_Asia_Taipei PSTR("CST-8") +#define TZ_Asia_Tashkent PSTR("<+05>-5") +#define TZ_Asia_Tbilisi PSTR("<+04>-4") +#define TZ_Asia_Tehran PSTR("<+0330>-3:30<+0430>,J79/24,J263/24") +#define TZ_Asia_Thimphu PSTR("<+06>-6") +#define TZ_Asia_Tokyo PSTR("JST-9") +#define TZ_Asia_Tomsk PSTR("<+07>-7") +#define TZ_Asia_Ulaanbaatar PSTR("<+08>-8") +#define TZ_Asia_Urumqi PSTR("<+06>-6") +#define TZ_Asia_UstmNera PSTR("<+10>-10") +#define TZ_Asia_Vientiane PSTR("<+07>-7") +#define TZ_Asia_Vladivostok PSTR("<+10>-10") +#define TZ_Asia_Yakutsk PSTR("<+09>-9") +#define TZ_Asia_Yangon PSTR("<+0630>-6:30") +#define TZ_Asia_Yekaterinburg PSTR("<+05>-5") +#define TZ_Asia_Yerevan PSTR("<+04>-4") +#define TZ_Atlantic_Azores PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1") +#define TZ_Atlantic_Bermuda PSTR("AST4ADT,M3.2.0,M11.1.0") +#define TZ_Atlantic_Canary PSTR("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Cape_Verde PSTR("<-01>1") +#define TZ_Atlantic_Faroe PSTR("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Madeira PSTR("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Atlantic_Reykjavik PSTR("GMT0") +#define TZ_Atlantic_South_Georgia PSTR("<-02>2") +#define TZ_Atlantic_Stanley PSTR("<-03>3") +#define TZ_Atlantic_St_Helena PSTR("GMT0") +#define TZ_Australia_Adelaide PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Brisbane PSTR("AEST-10") +#define TZ_Australia_Broken_Hill PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Currie PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Darwin PSTR("ACST-9:30") +#define TZ_Australia_Eucla PSTR("<+0845>-8:45") +#define TZ_Australia_Hobart PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Lindeman PSTR("AEST-10") +#define TZ_Australia_Lord_Howe PSTR("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0") +#define TZ_Australia_Melbourne PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Australia_Perth PSTR("AWST-8") +#define TZ_Australia_Sydney PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3") +#define TZ_Europe_Amsterdam PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Andorra PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Astrakhan PSTR("<+04>-4") +#define TZ_Europe_Athens PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Belgrade PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Berlin PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bratislava PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Brussels PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Bucharest PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Budapest PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Busingen PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Chisinau PSTR("EET-2EEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Copenhagen PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Dublin PSTR("IST-1GMT0,M10.5.0,M3.5.0/1") +#define TZ_Europe_Gibraltar PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Guernsey PSTR("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Helsinki PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Isle_of_Man PSTR("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Istanbul PSTR("<+03>-3") +#define TZ_Europe_Jersey PSTR("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Kaliningrad PSTR("EET-2") +#define TZ_Europe_Kiev PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Kirov PSTR("<+03>-3") +#define TZ_Europe_Lisbon PSTR("WET0WEST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Ljubljana PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_London PSTR("GMT0BST,M3.5.0/1,M10.5.0") +#define TZ_Europe_Luxembourg PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Madrid PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Malta PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Mariehamn PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Minsk PSTR("<+03>-3") +#define TZ_Europe_Monaco PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Moscow PSTR("MSK-3") +#define TZ_Europe_Oslo PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Paris PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Podgorica PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Prague PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Riga PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Rome PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Samara PSTR("<+04>-4") +#define TZ_Europe_San_Marino PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sarajevo PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Saratov PSTR("<+04>-4") +#define TZ_Europe_Simferopol PSTR("MSK-3") +#define TZ_Europe_Skopje PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Sofia PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Stockholm PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Tallinn PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Tirane PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Ulyanovsk PSTR("<+04>-4") +#define TZ_Europe_Uzhgorod PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Vaduz PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vatican PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vienna PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Vilnius PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Volgograd PSTR("<+04>-4") +#define TZ_Europe_Warsaw PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zagreb PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Europe_Zaporozhye PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4") +#define TZ_Europe_Zurich PSTR("CET-1CEST,M3.5.0,M10.5.0/3") +#define TZ_Indian_Antananarivo PSTR("EAT-3") +#define TZ_Indian_Chagos PSTR("<+06>-6") +#define TZ_Indian_Christmas PSTR("<+07>-7") +#define TZ_Indian_Cocos PSTR("<+0630>-6:30") +#define TZ_Indian_Comoro PSTR("EAT-3") +#define TZ_Indian_Kerguelen PSTR("<+05>-5") +#define TZ_Indian_Mahe PSTR("<+04>-4") +#define TZ_Indian_Maldives PSTR("<+05>-5") +#define TZ_Indian_Mauritius PSTR("<+04>-4") +#define TZ_Indian_Mayotte PSTR("EAT-3") +#define TZ_Indian_Reunion PSTR("<+04>-4") +#define TZ_Pacific_Apia PSTR("<+13>-13<+14>,M9.5.0/3,M4.1.0/4") +#define TZ_Pacific_Auckland PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3") +#define TZ_Pacific_Bougainville PSTR("<+11>-11") +#define TZ_Pacific_Chatham PSTR("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45") +#define TZ_Pacific_Chuuk PSTR("<+10>-10") +#define TZ_Pacific_Easter PSTR("<-06>6<-05>,M9.1.6/22,M4.1.6/22") +#define TZ_Pacific_Efate PSTR("<+11>-11") +#define TZ_Pacific_Enderbury PSTR("<+13>-13") +#define TZ_Pacific_Fakaofo PSTR("<+13>-13") +#define TZ_Pacific_Fiji PSTR("<+12>-12<+13>,M11.1.0,M1.2.2/123") +#define TZ_Pacific_Funafuti PSTR("<+12>-12") +#define TZ_Pacific_Galapagos PSTR("<-06>6") +#define TZ_Pacific_Gambier PSTR("<-09>9") +#define TZ_Pacific_Guadalcanal PSTR("<+11>-11") +#define TZ_Pacific_Guam PSTR("ChST-10") +#define TZ_Pacific_Honolulu PSTR("HST10") +#define TZ_Pacific_Kiritimati PSTR("<+14>-14") +#define TZ_Pacific_Kosrae PSTR("<+11>-11") +#define TZ_Pacific_Kwajalein PSTR("<+12>-12") +#define TZ_Pacific_Majuro PSTR("<+12>-12") +#define TZ_Pacific_Marquesas PSTR("<-0930>9:30") +#define TZ_Pacific_Midway PSTR("SST11") +#define TZ_Pacific_Nauru PSTR("<+12>-12") +#define TZ_Pacific_Niue PSTR("<-11>11") +#define TZ_Pacific_Norfolk PSTR("<+11>-11") +#define TZ_Pacific_Noumea PSTR("<+11>-11") +#define TZ_Pacific_Pago_Pago PSTR("SST11") +#define TZ_Pacific_Palau PSTR("<+09>-9") +#define TZ_Pacific_Pitcairn PSTR("<-08>8") +#define TZ_Pacific_Pohnpei PSTR("<+11>-11") +#define TZ_Pacific_Port_Moresby PSTR("<+10>-10") +#define TZ_Pacific_Rarotonga PSTR("<-10>10") +#define TZ_Pacific_Saipan PSTR("ChST-10") +#define TZ_Pacific_Tahiti PSTR("<-10>10") +#define TZ_Pacific_Tarawa PSTR("<+12>-12") +#define TZ_Pacific_Tongatapu PSTR("<+13>-13") +#define TZ_Pacific_Wake PSTR("<+12>-12") +#define TZ_Pacific_Wallis PSTR("<+12>-12") +#define TZ_Etc_GMT PSTR("GMT0") +#define TZ_Etc_GMTm0 PSTR("GMT0") +#define TZ_Etc_GMTm1 PSTR("<+01>-1") +#define TZ_Etc_GMTm2 PSTR("<+02>-2") +#define TZ_Etc_GMTm3 PSTR("<+03>-3") +#define TZ_Etc_GMTm4 PSTR("<+04>-4") +#define TZ_Etc_GMTm5 PSTR("<+05>-5") +#define TZ_Etc_GMTm6 PSTR("<+06>-6") +#define TZ_Etc_GMTm7 PSTR("<+07>-7") +#define TZ_Etc_GMTm8 PSTR("<+08>-8") +#define TZ_Etc_GMTm9 PSTR("<+09>-9") +#define TZ_Etc_GMTm10 PSTR("<+10>-10") +#define TZ_Etc_GMTm11 PSTR("<+11>-11") +#define TZ_Etc_GMTm12 PSTR("<+12>-12") +#define TZ_Etc_GMTm13 PSTR("<+13>-13") +#define TZ_Etc_GMTm14 PSTR("<+14>-14") +#define TZ_Etc_GMT0 PSTR("GMT0") +#define TZ_Etc_GMTp0 PSTR("GMT0") +#define TZ_Etc_GMTp1 PSTR("<-01>1") +#define TZ_Etc_GMTp2 PSTR("<-02>2") +#define TZ_Etc_GMTp3 PSTR("<-03>3") +#define TZ_Etc_GMTp4 PSTR("<-04>4") +#define TZ_Etc_GMTp5 PSTR("<-05>5") +#define TZ_Etc_GMTp6 PSTR("<-06>6") +#define TZ_Etc_GMTp7 PSTR("<-07>7") +#define TZ_Etc_GMTp8 PSTR("<-08>8") +#define TZ_Etc_GMTp9 PSTR("<-09>9") +#define TZ_Etc_GMTp10 PSTR("<-10>10") +#define TZ_Etc_GMTp11 PSTR("<-11>11") +#define TZ_Etc_GMTp12 PSTR("<-12>12") +#define TZ_Etc_UCT PSTR("UTC0") +#define TZ_Etc_UTC PSTR("UTC0") +#define TZ_Etc_Greenwich PSTR("GMT0") +#define TZ_Etc_Universal PSTR("UTC0") +#define TZ_Etc_Zulu PSTR("UTC0") + +#endif // TZDB_H diff --git a/cores/esp8266/time.cpp b/cores/esp8266/time.cpp index 001b0ec33..3a3e3f755 100644 --- a/cores/esp8266/time.cpp +++ b/cores/esp8266/time.cpp @@ -16,6 +16,7 @@ * */ +#include #include #include #include @@ -55,25 +56,12 @@ static void setServer(int id, const char* name_or_ip) { if (name_or_ip) { - //TODO: check whether server is given by name or IP + // per current configuration, + // lwIP can receive an IP address or a fqdn sntp_setservername(id, (char*) name_or_ip); } } - -void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, const char* server2, const char* server3) -{ - sntp_stop(); - - setServer(0, server1); - setServer(1, server2); - setServer(2, server3); - - sntp_set_timezone_in_seconds(timezone_sec); - sntp_set_daylight(daylightOffset_sec); - sntp_init(); -} - int clock_gettime(clockid_t unused, struct timespec *tp) { (void) unused; @@ -108,4 +96,33 @@ int _gettimeofday_r(struct _reent* unused, struct timeval *tp, void *tzp) return 0; } -}; +}; // extern "C" + +void configTime(int timezone_sec, int daylightOffset_sec, const char* server1, const char* server2, const char* server3) +{ + sntp_stop(); + + setServer(0, server1); + setServer(1, server2); + setServer(2, server3); + + sntp_set_timezone_in_seconds(timezone_sec); + sntp_set_daylight(daylightOffset_sec); + sntp_init(); +} + +void configTime(const char* tz, const char* server1, const char* server2, const char* server3) +{ + sntp_stop(); + + setServer(0, server1); + setServer(1, server2); + setServer(2, server3); + + char tzram[strlen_P(tz) + 1]; + memcpy_P(tzram, tz, sizeof(tzram)); + setenv("TZ", tzram, 1/*overwrite*/); + tzset(); + + sntp_init(); +} diff --git a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino index d7c6b52b4..b3c4e2064 100644 --- a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino +++ b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino @@ -1,80 +1,145 @@ /* - NTP-TZ-DST + NTP-TZ-DST (v2) NetWork Time Protocol - Time Zone - Daylight Saving Time - This example shows how to read and set time, - and how to use NTP (set NTP0_OR_LOCAL1 to 0 below) - or an external RTC (set NTP0_OR_LOCAL1 to 1 below) - - TZ and DST below have to be manually set - according to your local settings. + This example shows: + - how to read and set time + - how to set timezone per country/city + - how is local time automatically handled per official timezone definitions + - how to change internal sntp start and update delay + - how to use callbacks when time is updated This example code is in the public domain. */ -#include -#include // time() ctime() -#include // struct timeval -#include // settimeofday_cb() - -//////////////////////////////////////////////////////// #ifndef STASSID #define STASSID "your-ssid" #define STAPSK "your-password" #endif -#define SSID STASSID -#define SSIDPWD STAPSK -#define TZ 1 // (utc+) TZ in hours -#define DST_MN 60 // use 60mn for summer time in some countries +// initial time (possibly given by an external RTC) +#define RTC_UTC_TEST 1510592825 // 1510592825 = Monday 13 November 2017 17:07:05 UTC -#define NTP0_OR_LOCAL1 1 // 0:use NTP 1:fake external RTC -#define RTC_TEST 1510592825 // 1510592825 = Monday 13 November 2017 17:07:05 UTC + +// This database is autogenerated from IANA timezone database +// https://www.iana.org/time-zones +// and can be updated on demand in this repository +#include + +// "TZ_" macros follow DST change across seasons without source code change +// check for your nearest city in TZ.h + +// espressif headquarter TZ +//#define MYTZ TZ_Asia_Shanghai + +// example for "Not Only Whole Hours" timezones: +// Kolkata/Calcutta is shifted by 30mn +//#define MYTZ TZ_Asia_Kolkata + +// example of a timezone with a variable Daylight-Saving-Time: +// demo: watch automatic time adjustment on Summer/Winter change (DST) +#define MYTZ TZ_Europe_London //////////////////////////////////////////////////////// -#define TZ_MN ((TZ)*60) -#define TZ_SEC ((TZ)*3600) -#define DST_SEC ((DST_MN)*60) +#include +#include // settimeofday_cb() +#include +#include -timeval cbtime; // time set in callback -bool cbtime_set = false; +#include // time() ctime() +#include // struct timeval -void time_is_set(void) { - gettimeofday(&cbtime, NULL); - cbtime_set = true; - Serial.println("------------------ settimeofday() was called ------------------"); -} - -void setup() { - Serial.begin(115200); - settimeofday_cb(time_is_set); - -#if NTP0_OR_LOCAL1 - // local - - ESP.eraseConfig(); - time_t rtc = RTC_TEST; - timeval tv = { rtc, 0 }; - timezone tz = { TZ_MN + DST_MN, 0 }; - settimeofday(&tv, &tz); - -#else // ntp - - configTime(TZ_SEC, DST_SEC, "pool.ntp.org"); - WiFi.mode(WIFI_STA); - WiFi.begin(SSID, SSIDPWD); - // don't wait, observe time changing when ntp timestamp is received - -#endif // ntp -} +#if LWIP_VERSION_MAJOR == 1 +#include // sntp_servermode_dhcp() +#else +#include // sntp_servermode_dhcp() +#endif // for testing purpose: extern "C" int clock_gettime(clockid_t unused, struct timespec *tp); +//////////////////////////////////////////////////////// + +static timeval tv; +static timespec tp; +static time_t now; +static uint32_t now_ms, now_us; + +static esp8266::polledTimeout::periodicMs showTimeNow(60000); +static int time_machine_days = 0; // 0 = now +static bool time_machine_running = false; + +// OPTIONAL: change SNTP startup delay +// a weak function is already defined and returns 0 (RFC violation) +// it can be redefined: +//uint32_t sntp_startup_delay_MS_rfc_not_less_than_60000 () +//{ +// //info_sntp_startup_delay_MS_rfc_not_less_than_60000_has_been_called = true; +// return 60000; // 60s (or lwIP's original default: (random() % 5000)) +//} + +// OPTIONAL: change SNTP update delay +// a weak function is already defined and returns 1 hour +// it can be redefined: +//uint32_t sntp_update_delay_MS_rfc_not_less_than_15000 () +//{ +// //info_sntp_update_delay_MS_rfc_not_less_than_15000_has_been_called = true; +// return 15000; // 15s +//} + + +void showTime() { + gettimeofday(&tv, nullptr); + clock_gettime(0, &tp); + now = time(nullptr); + now_ms = millis(); + now_us = micros(); + + Serial.println(); + printTm("localtime:", localtime(&now)); + Serial.println(); + printTm("gmtime: ", gmtime(&now)); + Serial.println(); + + // time from boot + Serial.print("clock: "); + Serial.print((uint32_t)tp.tv_sec); + Serial.print("s / "); + Serial.print((uint32_t)tp.tv_nsec); + Serial.println("ns"); + + // time from boot + Serial.print("millis: "); + Serial.println(now_ms); + Serial.print("micros: "); + Serial.println(now_us); + + // EPOCH+tz+dst + Serial.print("gtod: "); + Serial.print((uint32_t)tv.tv_sec); + Serial.print("s / "); + Serial.print((uint32_t)tv.tv_usec); + Serial.println("us"); + + // EPOCH+tz+dst + Serial.print("time: "); + Serial.println((uint32_t)now); + + // timezone and demo in the future + Serial.printf("timezone: %s\n", MYTZ); + + // human readable + Serial.print("ctime: "); + Serial.print(ctime(&now)); + + Serial.println(); +} + + #define PTM(w) \ - Serial.print(":" #w "="); \ + Serial.print(" " #w "="); \ Serial.print(tm->tm_##w); void printTm(const char* what, const tm* tm) { @@ -84,61 +149,83 @@ void printTm(const char* what, const tm* tm) { PTM(hour); PTM(min); PTM(sec); } -timeval tv; -timespec tp; -time_t now; -uint32_t now_ms, now_us; +void time_is_set_scheduled() { + // everything is allowed in this function + + // time machine demo + if (time_machine_running) { + if (time_machine_days == 0) + Serial.printf("---- settimeofday() has been called - possibly from SNTP\n" + " (starting time machine demo to show libc's automatic DST handling)\n\n"); + now = time(nullptr); + const tm* tm = localtime(&now); + Serial.printf("future=%3ddays: DST=%s - ", + time_machine_days, + tm->tm_isdst ? "true " : "false"); + Serial.print(ctime(&now)); + gettimeofday(&tv, nullptr); + constexpr int days = 30; + time_machine_days += days; + if (time_machine_days > 360) { + tv.tv_sec -= (time_machine_days - days) * 60 * 60 * 24; + time_machine_days = 0; + } else { + tv.tv_sec += days * 60 * 60 * 24; + } + settimeofday(&tv, nullptr); + } else { + showTime(); + } +} + +void time_is_set_callback() { + // As in an ISR, + // it is not allowed to call "heavy" core API + // like yield()/delay()/print()/network/... + // If this is needed, use a scheduled function. + + // This scheduled function is used for the demo, it is normaly unneeded + schedule_function(time_is_set_scheduled); + if (time_machine_days == 0) { + time_machine_running = !time_machine_running; + } +} + +void setup() { + Serial.begin(115200); + Serial.println("\nStarting...\n"); + + // setup RTC time + // it will be used until NTP server will send us real current time + time_t rtc = RTC_UTC_TEST; + timeval tv = { rtc, 0 }; + timezone tz = { 0, 0 }; + settimeofday(&tv, &tz); + + // install callback - called when settimeofday is called (by SNTP or us) + // once enabled (by DHCP), SNTP is updated every hour + settimeofday_cb(time_is_set_callback); + + // NTP servers may be overriden by your DHCP server for a more local one + // (see below) + configTime(MYTZ, "pool.ntp.org"); + + // OPTIONAL: disable obtaining SNTP servers from DHCP + //sntp_servermode_dhcp(0); // 0: disable obtaining SNTP servers from DHCP (enabled by default) + + // start network + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + WiFi.begin(STASSID, STAPSK); + + // don't wait for network, observe time changing + // when NTP timestamp is received + Serial.printf("Time is currently set by a constant:\n"); + showTime(); +} void loop() { - - gettimeofday(&tv, nullptr); - clock_gettime(0, &tp); - now = time(nullptr); - now_ms = millis(); - now_us = micros(); - - // localtime / gmtime every second change - static time_t lastv = 0; - if (lastv != tv.tv_sec) { - lastv = tv.tv_sec; - Serial.println(); - printTm("localtime", localtime(&now)); - Serial.println(); - printTm("gmtime ", gmtime(&now)); - Serial.println(); - Serial.println(); + if (showTimeNow) { + showTime(); } - - // time from boot - Serial.print("clock:"); - Serial.print((uint32_t)tp.tv_sec); - Serial.print("/"); - Serial.print((uint32_t)tp.tv_nsec); - Serial.print("ns"); - - // time from boot - Serial.print(" millis:"); - Serial.print(now_ms); - Serial.print(" micros:"); - Serial.print(now_us); - - // EPOCH+tz+dst - Serial.print(" gtod:"); - Serial.print((uint32_t)tv.tv_sec); - Serial.print("/"); - Serial.print((uint32_t)tv.tv_usec); - Serial.print("us"); - - // EPOCH+tz+dst - Serial.print(" time:"); - Serial.print((uint32_t)now); - - // human readable - Serial.print(" ctime:(UTC+"); - Serial.print((uint32_t)(TZ * 60 + DST_MN)); - Serial.print("mn)"); - Serial.print(ctime(&now)); - - // simple drifting loop - delay(100); } diff --git a/package/README.md b/package/README.md index a67a77d3a..84b905913 100644 --- a/package/README.md +++ b/package/README.md @@ -107,18 +107,23 @@ Here is an overview of the release process. See the section below for detailed i The following points assume work in a direct clone of the repository, and not in a personal fork. -2. Update `version` to the release in platform.txt and commit. E.g. `2.5.0`. Make a PR, wait for Travis CI, and merge. +2. Make a PR with the following, wait for Travis CI, and merge. -3. Tag the latest commit on the master branch. In this project, tags have form `X.Y.Z`, e.g. `2.4.0`, or `X.Y.Z-betaN` for release candiate versions. Notice that there's no `v`at the beginning of the tag. Tags must be annotated, not lightweight tags. To create a tag, use git command (assuming that the master branch is checked out): + * platform.txt: update `version` to the release E.g. `3.0.0`, + + * `cores/esp8266/TZ.h`: import the latest database with the following shell command:\ + `$ cd tools; sh TZupdate.sh`. + +3. Tag the latest commit on the master branch. In this project, tags have form `X.Y.Z`, e.g. `3.0.0`, or `X.Y.Z-betaN` for release candiate versions. Notice that there's no `v`at the beginning of the tag. Tags must be annotated, not lightweight tags. To create a tag, use git command (assuming that the master branch is checked out): ``` - git tag -a -m "Release 2.5.0" 2.5.0 + git tag -a -m "Release 3.0.0" 3.0.0 ``` then push the tag created in step 3 to esp8266/Arduino Github repository: ``` - git push origin 2.5.0 + git push origin 3.0.0 ``` 4. In case something goes wrong, release can be canceled at any time: @@ -141,7 +146,7 @@ The following points assume work in a direct clone of the repository, and not in 11. Create a commit to the master branch, updating: - * The version in platform.txt file. This should correspond to the version of the *next* milestone, plus `-dev` suffix. E.g. `2.5.0-dev`. + * The version in platform.txt file. This should correspond to the version of the *next* milestone, plus `-dev` suffix. E.g. `3.1.0-dev`. * In main README.md: diff --git a/tools/TZupdate.sh b/tools/TZupdate.sh new file mode 100755 index 000000000..4c0d09e80 --- /dev/null +++ b/tools/TZupdate.sh @@ -0,0 +1,71 @@ +#!/bin/sh + +# this shell script refreshes world timezone definitions in +# cores/esp8266/TZ.h +# +# to run it, use: +# /path/to/TZupdate.sh +# tools/TZupdate.sh +# ./TZupdate.sh + +dir=$(cd ${0%/*} 2>/dev/null; pwd) +base=${0##*/} + +csv=https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv + +set -e + +tz_tmpdir=$(mktemp -d) +trap 'rm -r $tz_tmpdir' EXIT + +input=$tz_tmpdir/zones.csv +names=$tz_tmpdir/names.txt +values=$tz_tmpdir/values.txt + +wget -O $input $csv || curl $csv > $input + +sed -e 's/^[^,]*,//g' -e 's,^,PSTR(,g' -e 's,$,),g' < $input > $values +sed -e 's/^\([^,]*\),.*/#define TZ_\1/g' -e 's,["],,g' < $input | tr '/\-+' '_mp' > $names + +( + +cat << EOF + +// autogenerated from $csv +// by script /tools/${base} +// $(date -u) +// +// This database is autogenerated from IANA timezone database +// https://www.iana.org/time-zones +// and can be updated on demand in this repository +// or by yourself using the above script + +#ifndef TZDB_H +#define TZDB_H + +EOF + +paste $names $values + +cat << EOF + +#endif // TZDB_H +EOF + +) > $tz_tmpdir/TZ.h + +backup=$(date +%s) +mv ${dir}/../cores/esp8266/TZ.h ${dir}/../cores/esp8266/TZ.h.$backup +mv $tz_tmpdir/TZ.h ${dir}/../cores/esp8266/TZ.h + +cat << EOF + +Done: + '${dir}/../cores/esp8266/TZ.h' is updated + +Diff: +----8<-------8<------8<--- +$(diff -u ${dir}/../cores/esp8266/TZ.h.$backup ${dir}/../cores/esp8266/TZ.h) +--->8----->8------>8------ + +EOF diff --git a/tools/sdk/lib/liblwip2-1460-feat.a b/tools/sdk/lib/liblwip2-1460-feat.a index 2194496de155ff92d227d53d5534953e278d660e..4dc84bf8bd64eca3e3e0c9094c4ad8aacf5cb642 100644 GIT binary patch delta 252223 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

|1Y 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 QgWxTHu`t-*S&;Yt04y9j^#A|> delta 253751 zcmdSC33wI7y6@f9SxHv1l9iQ#Bn*KB0tpa80s+F9gc%uSP(&pJ2oMb+kN^(I0!0Kx z1(sTaDlt zp{u&8JKr3iwC~4BE1L$3x)c<2?p~OgS&+%Y{hOItSWr;V)yOBsT9!ItSved2y=U-0 z^YDXG%Q||uWqr5n-+HQ5D=g;>I`H4U+K;_vxzC8)7p=c>2LFzuf1{h=Ut{fAvc&qI zoRJa3tpC;-{69E|y5qR@ADz)%s;&R+yl|}*{eL>Iv8?F->^!`{3P$56`n$M)+v)94 zV0pXV{eOD~|8EulKhg{S$1#mLa>)9>Ib#P{R_ur+|M~exoE3}H*QnQD&*15T|H!<$ z+VZ*1xQ~`t|Bf^GcRlgPY`6XmXYhab|~+@Amx1=kNQhgy>=a^K(b=XDeaH z-#Y_G*IMo~aq(vBzkLS9QF36P^^jK@G>iH zv}L88yTD4DdcsPpskYMQe`=*I9&4ptz0XR!q5ps5j6bEEUU+a@rZ=Rv`D0)5ht6;O zQs~q4i?`)8iBa1UGhS2MmNdOit#0EB6*L_ix-KSe+p*@adF_rJL%VZ2gpTEOiZ&yO z;^NSQ-=%rFb}uRjmF4EBecP&X2gL>(Yz!Z=m1R8;VOcL)rw;op2<(FekVJT*_w!;$ zAC0ywk0-LKrrwHBQLn;epBV+4q_b(SyrUtBup=WOvoD3u5vko^VNasCiSf!C`Mn1Q zZ*(rLJxP%Xbnl7Yg-fIdus2lJIeG9>C`EZ5hhy&p_=)m7kKY)32gII6!|3PQNMKea zF#=wBI@AIqJf24M*XxP%!XnBWTHCovP(d}S3!`YCiT%IO-3sh@a1Y|MFz^sOye#k@f?E){8LF2C zMndtD00X`_a1MSi3N(i1{J`yy&kKA9o*TFnzSjq?1J?zX!0nvCBJk|MH0aj`E&E@P zd57N#E!)OVOovXyI@rdR_<#u>U#BsQ&}T4Mftd(c1q05tbbXAAH?9K?l0s zucYo(u(1Mt5P21N5CS`JJ={eEZi1@EvYCgzvWd1e%!&&_l;Ruq8?@p-qkII>im!wN z-UjOv@R@`c0T>Kd5#oa`gf%v&_6n9H+a7uh*+TK1B zoF0ECypOw|acdSokMaliL7o{u8!?Z2=xtAuWo5@Vp+{Sughg)ro1W0buBk(p(*7yN zw^Mu;`RT*3?u@vDcT?Uy{#;g@XOBVN!(TIZrWN-*<-OuHBysPq#&4-*pHQKvySB1- zsL-cf^X-LEp_Fc|>_?+R-Mi(c`%pG+CUJ>DsHVV4-G2LO`3^xs<-KxN(VNX?g=d}ZfxHf9a>wQRnQ(j zsUOuq*tDnxQ4cB*{_;LN%V@$P2s1MN!syVk;`F}nF?6N+;BpzxR1HuYF- z)tF8rA%w}qb*$B~CzE-RibEJ3aH_S7=s{6r==&bUB@9_zg`m+wjAh3)%+FN{I#wei z`RZhNt4w%vq1bvbthzjBg)ZpXqwre>aI=XeU8NaU<6@jx-fUdmL|2o<)tf!r+500y zs#m(bAv)BwSI6L2bo78?>4igm^Q8L+jQc}yUw~R|wc<~=O6JVNCZm-PlgwgM*bf`k z?vK#3?O~2$jz419>Ub+-+RDy`eFT%awzDrB%N7(fGk-xasU`zk+04M!kfna@2_5Zq zJlKw5?l)dBoo6zXwI7KOmU`9LB*IbHgV#(6u<61Bs2(upiNGFc?CN!64AR=vq&G}0 zSx56GM)RPu5jIA1R%$cEbq%mf7NdQh$vk`2)Gjx8 zL)Vl|vsXujzAwwly@r+_+bphdwfZOlfnNtRq`YC?0xwd}j|lbZ+ls+e^zD(3#}$_P z(&c76?r+rD7S=fgox7-W+~^D?u5F5pOnuJ^wddjCo;5iK!#oF2^}7gZWl*y`)R-n3Eo{O3ENt3>%u0n$-4G4 z6V_c=1#3Gubnd4s;!uEVP!omr_7pJRWseHs;Qk@ZyBEk zj2>M+Zp?sFhO*Ivbj9;&jRuYCJ8oe4=(6FKz}Z&qo2aYw5C_jt?Yy_%d4i% zt(`h+evMUMSyx|PQ(0d%t-P+j!kSiHQ8xoL$I@pWwbOz%l^4}pCcbs`vudrni|fkg z*3?(ctel02RL+@GUT@8;sJqaropEvbl#1H=xpOM5>Z+OxVa=#AybcJjWA*&1T0;I5 zO9Df>rdCd?m|G2hDyCOgmQ$sCI%8tZE$j-9q1ckqq9&s{t9mLrV@Bpws)r2Jv(xQV zZ~2t!%8Ht~wV|!kQbK=R6vg-<0_D?cta-DlriQb(uC@~+RBrNP+MLSDso^{tJGyMd zm{B7~kCnKYY^GDxsQS*G5S2NV(>m2v%&SEH%&MqoOfW{DF<+nmhicYr*0gDeqg7Fj z3c~T`$?`d?Y?%HoN2Ly6oa;=9mY35{le`)8S=QxrQ9EzctU2|=jSr`s4;j;MNvej7vZNHs`_7tG&8iko zK8h{u>8Oz-hlPTbjs9N4*xf-j9)S8Xz0RsLndGWU6}90?H-An=Z7m{pGTZ+mE}v70 zQmd=fg(WH{XfcDQme-J+hB`H^4sCCK=(b7e zx_w)f5bTROc(Q_=^c)S^(MLDIaM4p#%&9Gx@|E^kF^649UHQz)nNw;nrq1L!s0~vp z>Rf$>sZw)IdDYE8rORaUoOGh?R@O|fpJAaTn)sVGX&R5Ip##xoOb*nsvp{eNs=T(I zy+F8Po7_H?scgD)|5_E$!u6|9c~iTZOhLPnlu^}GX%pJXq>mjke89+YV@=+(2MZmj zOxCO0s^lRi(Nck|`Bl@Z*msmW5jVb9S6qy0F$*nk4pKR-ytaC7-Kj2+&A@oMe0tNy zb8G6Vrq@(X%`~+voEVcyp~9C_Ok7Wu_2@BUEfZDK!44RM-gdl&{6HNw6_(ut>ySS1 zlWLOg_V;A6Mvom3O8g`xbjf7jXqI=eHFeh9$<>w2czTTtJ*hij|a#YmhgCqjJr9HFUS~#^2p{0 z3Zpz8Wn}Yo!m`GbF}mS#Eg5469=DS@;KlI*nFB=}$H{3{&=`_As!BI#6_6W;+03mt z&Bn2rL)@leewN%U%%77p!W_XtU-K|?HmX{L`2%uRm}@!KX&L5^ya->l3LAc=MRu68 zkaE=~%x92u!@M3jktDfwkBfJZ5eO1x?G$F_JtNGxzDb6VI`0WHeCq=-Q0bp!WHmG6 zXJKZ*AHqzi2jf2KWP)RbnTCLHYjCP?4!D_cM=-~XbXy3{1qW#;f+1fldV`CEOTj&a z2ZKw6&jSw>o&+8yJQ+M%cq(|j@HFs5;TrH%;d+E`T_6VLM6K}U;CaGVg8AHx5xok0 zx$tuEGGQzyS=R|)3%)^^&#!I~UIShyd<*zq!w7XP44cJb9r$74d%-(|H-L8v-w%FH zn9nC)65axSP55E(Tf#fQ?+ZT;{#f`~@X??cUV`CU;rGEOgpYvv@QA7Z2+Z0;{shRm zH~BMgobVUmB;jLVKIWp%&){alzk)lG(Tq7kwz`M`6Md_@Fq`!-vb66}E}lY0TZg|^ zl`xz5Ea6n}Twzw^ONCj%7YnmNUFkvj)1v|yZlZ;B8XL**(F^%QE`CH94+X3zgc-l5 zg&FYcWOOogd&tF{e^XAkp9%-q{~Q$q9si4rCoFW#UXdIRjuvKW`1p--Hm&Al2;t1i z7G}H86=r&RkfBkdxh75Uk!86x(kLk#o`|Dd%~N*9|>;;e<8dbd`$QW@b|)dz`qE;4CW(#Mw+V^ zT$3Ol0Q-d5IufH0by|D}Lz-A{qMRZ86S$S|FW|Pq{{nXuj#7BSE1Ux6Bh92H;W{)- z7c;Pf=-9#}U9@bQ0HkAv6c|)re&IHdBZUtT-+!}njFe~OV;dbEbgjwls z5Y7kR0uC~!WiYH0i!;D?3l9S~keh~U_!BPPPev?R^A8HM=D#bP0zM*~3I2|ZyBGC; z5=MU$wD_EY7Hr4U%N z4!50fp2lF92BX6S2;>c zV9;W*6nvZTGVoo(SA#bSuLM6Nyc+z7@QvUngf)1#@GamMgl_}CA{<-~!y97Q1b$nX zP3|i)@{`$nTo_fs`caq_^Ecs4a0I$d>a#M&2zLM{2(zPWB-{nu)XV-K4!Xh6QY^ZI zbA|hY^M(6^i-ZS)dkC{iYFs!U=g<0uB!fn7e3%3Q|A>1B(4><^zY>W4cMG<(ba8Gc9FjMf9 z@Hp_Z!jr*!g;~*F6`lotQ+P4>9pNj$-;mjP;0PXf86wcuk`R4}tQZ$32=mt2NSMvF zu`utPd1NG)ZacZSSeS162-9ufFk_`12Cil#<%S)f>*5MwI-V}<2hSAdprcNh-Ri}{ zY2ctRd(|t2S$VG!Mwer)ia}#$z${BG7O0QbZNki@yM$S*Hww1{KO~$7engnX_k=Jj z?9hR7;wK;UzJM$s`0sLubz`G;u%yYNh^zJmJ>O;T3H_~o4IW*$^dFoK;`S(Yv z?V(18N80IEg{B>Dr=AO~I^4?kUK4usaGS^;Xp;AaK04e=eW+)5i%ttQI}(WeX9-q< zblEMwl+b`936bqeEo(#QyVsLL)kgwqeCVIeK@ z6w3G@C-Tr8xEF*K&if$Q*`A=A|L#wZC@RV{+Y>hEir@V$+6_Vmnwi?K03NoATBvyO zzD<)IxsoP3`ofU?VTZ0?QRa!hg)&d{Ibp@mAdK`}j^C)c#@=%^ExexZX;Su>Q00fM zbpP*Cb3zY&SnXx6XIuAL=K1yCe8z^y)*=1TFFG(Yt<~T30*~qRGvB8sJ^aZDY^>0; zzfGO50=h6Vp*<=QGF(sU<_)OMdezUVIqEH4@ef>%>fPPEIVw|crRlg{H76}cHPh;N zYI^9lqe;<4g^)xgm9FIWE?OQAq__%by*^vhQ->eZdR&HjFIY)k*Wmp{KscQ4fU+W49@cP|?vmU36tyHXHqS?M_zqBiE&2$)qS$nwy)xXce<2JO{^( z&zfMJV=d?ue_R(NMmE}(@y}?rt?2tDk#`;X*$!$tbAuftE2X9s@0_PMc$KzQ@cZa9?9J71uyJh^#i z9#pV-=S+BDd!Q2;aWP<-nMk^f0<}2S{RX#7}h5 z9}q)lIkG3}66*L$kdmkjW%T#J7q2(5iux}g`rafuwPHCc@FsH!*ki@8NB4TWT}P$c z=%Ba{<6y;(LNvYI`v5(bZy}t=_!Wo!F^}UXF1BbdFIZ}b?Lw&)`?DQd@mqQ@23Z^L z@%1c0Wc?-Z-10{vyr6$5c%eTNQN7H+2a*N;B>Z0L9{|ZE{vYsrv7fEzBL79;`TqTg z%sl@h{Lb}{#*MMw{{n35{2W%!@pH~F+rJXOwU*5%6TacE!8$(ZiR9T^ihF@`~V;?Fr|2NCFX@Z?>~KLRfISbjdw>*VhU53>Dj z@Qd=|%sRgIIoQL|Dn7RIAB1;{BK@43DgQj!?6&-8;ew|?_CmOc-@vD2F&q*F;veU8 zpV(&@=#xY%_6U7^T3c4B<%vCj2*$t2j^7){C7k$|$+59~>JC zPrBpZCHrGnhbsPP5}bsvEI;?fD1T3+#`ed;&j|lI1nKcV2!A5|;~|OizX^`^_lLUI zUw~4I@fScI>*w<~pOp}cU_1%41MtKD36f~}KR2G90k-`&BbW#)fln+v32WO@=}m+H z=RM(0S$0Bn$n$4*+ud+8EWx8@;+o84Cq%0u(6*Afu`VG_vG#hBQ3KEXGc9-+ekWua z>XjF2{gY!E>Q%;Ouw~zN;~?y1 zTytZ!DpC*JxL(~73?ej@snpfbYs|cYf!WifDTnH+P_d~Zl}%ATDn_w+@L&e2wY%Xc z0~?cKl&MLOHOCqw&GbTzvC^BPKvkJi@169%ES&qz`qRUTzQ#w6bw?Q=+ahCIm}pcO zy(~yG84PCN=1^5Ci__}iFty}VCP)9K)QDhb_`#kzSBXbaOQBf@dMKL3jA;~q!(n-iFkB&O4hP3 zWGv4dR))rjgRz|8vSlq|L0JXIAys>boDZqBqfbU*52Nq~!Zhi~hyMsKO_!u9KEW!y z6>e07Vx}e=msi7O3wFwoqW85<&?#cz6i3AO*hqy%2qrH{F~l4yuYH{EOrn#_=Cejn zXqgKuwgIb<50{kYb}H*eqyM$f8fkT^!0lGuZtlYNs!5$;bIN#LrwVQdb8N?VSOnV@ zD5Ih(l%olR`_XcyLR^A$jnY|B=;HFPrCFa7rApFwLc3G_JWFlHwmP*bP3 zM5)x^U2v4M9_CGeccF@$QH56iMu?sWXB2CtRk(~j(8I1w^2H%>OxHfBS%tOmTQwMa z7NS~P2m1`(s32_($)$*AI8z%G?bg!VXfW$^SnwhQrhpFW3DK(MfG!*T_XdMr?Z?N?D zDRLPUOgVE;6EY%P&QTtY)(Us9Q5{g(@EVl{32cg)MmQ!1OiU)jb&H*hN!WY^%w0|Q zk$cc|TU-ms834De^;aT1r`At`tObI+TW|HMWGsf{REy+UN}5E{@?&EejI(kU!Lk=5 zKf1hF2H6P6Vi76vHh&Fdta&tF1}^*p^;6X-_Hd8jRBQVsI7z56N#M#t2CHL@dKC%* zlz9torWZ5T0)kcsD`ePyI_+O(ifc>}^M2gI>}0D^^m-@E8N8vw{yF&f70lrrnPW19 zx4>}qUoO>uaJc$A#{S{z?-)ySMk6q564LpHUw;*&ngvbAa0`T&LD&Id=Bjb_Z2XS3 zSM|?TW9(IfnS7L3{@u`OZ?bHRDx`2B1W}$La1{L*u**WG^f>O3FyKI5Ad9Yob-3Cd zH}}#K#JQU()#FG5>%=>dW4ZQcOjAY=-yg z!_B~^C!aYbY*W11Ch`Vm_38m%61(-{y(zJ4?>A8$e3f;2qEDp<`;;T{@%bi=A-Xt* zh$V6qn@Dx5=V$nh&r-Zyg(W5JA@NOP^W<$RkDCdJyF4rRD zB(r;vO(7BYqX|~2)$bD{TJPaVUGgk; zfMG!&mS@6UCdcda$T)2FDVYL?-cgL?wbU~|Ye1+1AzY%_IYxPICsqM_)xyt|iM`K7 z0ul$YD>MnTdiO+>5<9cgOFRnKR+$%>+GwlYX8|nY111C6_k=U>duT8hQ2|SSfI@0t zMxFhO$wY~N8p2Aul&w6G{gBl+0+D4_vYCgo)8y_-h^(Gmicfe~vAIh&@o8bgKE;L+ zmh`;=5_-U9K@a>^;=?c|8Xx*qH(VaCe72tRPI8kov2!`X+r!t>Hze6kLlc3~f6ACw z^cUL>J~b|lJ0kLzU#?W5Dg<_fisJ$!fC8QQv9GZz)MdX%H_q=Q?jzwlEIW&?7>iuC z2)m1(9Z*fvySkJh?Itmb)EV)yZO_QJN*bH+B6AuKN$%AcIg+nViF!3=^m?7t^5rz9 zPVbXCMnIiDdj00K6rC2GnA#Rmv&v4ofzNc)H|&PN6hS~Y{TePvRI{VhcKv>u>fF#G zT@6-xeq*)7`#nn6wt^8SH;?-M*8a`^ANP$G{;da04cM>xy-HthtB5F6Iu(PutdtdL zqh(tWAL;Wl)H1bBf0m&Js)IVOxvEvq>ESI@S`_a?5wGf_&DB(Ogra8Z4t+rj%z!rP zJ6fn=YLEVgrYm$-ChS)0KA9?4X+1qt%~KESBNR61e`Uhs-MViUH1|=M7L`qp59k}R z5Z1RkvZZtA~WTIx|guRkH(jE9g&bC0t1 z;v$tC&y@&f`6!&W-n}a|IfnVbOdh0PDN<=M>_TW97TP_lQDO@-Q-je$XN75biN3#Q zAgkk9l;8*p>EzTAVYRj$Q?;t8?k^ezd5f2DtiZLq1_$00R=bUe*m0y8}gJ8NYPgBfku%$Jgo z(g~;O^RB>dq94vAjQB4*&HnnonsvA0*u=zb5Yp2Y#!*{qk6zUfnLL!?qBns*?X9mw zg>#4`yoD2q?!5raIYN@v(MpHeIat7arN=p7)_2v!XX(2O;sU{1*qrjY(Bk`C&Ow(q zi#-SENmgfT>uL7f@8yiNldLY*yQkUzL)?dB-py>~a`}(dFx)Jig8{aKIU83Fn3JsT zX4{q9e)wtn6{nfGi;DGvqtzsrPDcDddKmUn z4bam{RZqRKdt4k>^Oww zwOD7!K9Tnm`Dk1jiW-U^91M;6CqouF6R3vinlhEvco-GMnM9u6Bl5SGsWCx`E2Ei$ zp$uJ;|B{9*2yk$1C4~bN98fjf4A zfCt$p7Fd(liPJ9Ly%_P)7EN++^Kw2yl$Y37w$HI~sgq zF*$5uQeg7&ObBpH$4O5qBl|=Sv{WX3aF`sT0uGZyVCE1H)iQi-giA_Nn3LHyXrP@* z<=C(VdnL*#Bl|>7Tc=8KK{zFa5^*b?cRtLN(=FL2a+5=6Lx7_zPU@IFoHY2v!eo)u z33e1zqKxd+36m?#G90D`LWeR__eBno#m6K(hT)_?l#zWR2U>|vYD{)9Z}j4RDuoZD zPNsbV6~l*;OveD(N=elZKI2In#~Oko6=w>@i#(X;WM(TXEIAWblf}}eXh%6^WT&l} zm=D(Z1MqkVUNgcb=fK5a;{_uthZFxYm{ZcjLX#P{6o{g@-n%$h6A%)M5aLDLI0 z5kEM_nMME!g=C*tFny{VKR762z?6}FBF_XnI#+?IL)lgOsTO$C=2j79<4X2T!VivI zoT|d0br&vlMj6>B@;tDbj2|2iR)_XbBv@n<|&mSD7 z%8T5T69iqtRwt`JGb^QOSjdc4Gs4_LglRO{SdxdeaN`=Sb zYKmhv0LL(#)TfN>6M4DFt8q2CK8X2`!=w@pC^V^*u8&!)m^CdvYkHS zxE&{TC?oqs4z!X{!5AUhk(ui$k@!)q^@BrHt9Zz=VdM$Xks)dfMWbNk2~nRjR8NX( zVdM$X(lgW`4@7Hp#gqON{n;6Khy&vW*zz; z#=4ITKVQR@r{m{AasWR#4&h7&Gkr1d(*Oq_>cTlO$$gx+D2`H`6wc#gECrnb{!o}6eJRXT9w)=o6S(qp{N%p^b!%*hp!NNI^pDD~9Y&;pB^3`dcj;E8z=qPwhr4E=Cugb-o z$WhL!Ge68hi^aB3EEw2T!kxe?$q4KQTzNWyts%F70*H?t zqj9(~ZEk5zhh6ed!9mCImoAGFF85XHo7>=#rZDo?&1M1 zKJyd@t@BSAtP5Psuc$bIUG8E&k8tF-y7*xin zpIrRAi}`^g$5U>`aX7)n{O*w>H>*byAvRY>o)dH#I=HyAi@UqH)Wu_5e2$CDU0mtn z3tc>0*rcCr(TUMzF22IW%UyiEi*I!Ctu9{g;`>}|UT2h?*oFtoCj;i*B_|TExcH!p z-*fRtE;jE%il^VYW9RxX8t&F6K*ij$6J!=P-9KIlRop zce!{YIViDy$Yt?}i=S}uZWq7c;#XY!hKt{E@dqyEl9v;?;5RPA&o2JM#U9*c90##3 z=FUGyp5fwFE^g;yzOLrzbMqrO-2N_bSjFSgn^Kov4e6>gA>in}+ zM_eYJty|5;=i?6(FxgZ%=R4&OX++zxW_SuQ@8EO+~AmwYyvkIZ;nA2t}i%f)=@ z!->Q$7at%?MBgLJ4B`W@GlMumd9Lx&`jssD9z5c7W)t2Rgzrozl4&7I8Dw$H7djj+ zbUE$E4cyBu(J-U)a$StdU>ft|_EdY8^-viP&rrT>IW=NYohefEHp z(~)@UqXY9!D1aWHKi^IMTqJXqmZa2Ub5F8OG(czTIT=SnhX);N}fof+5-E}c8#I2MtB?{--{L>BpWvUv0s8ClBX zQe16gKlzkrz4iKx z)U@E4F4=ixNz{cdu65~L>XI*V$**zAZ*}oHm(Kkz`O{%JyFqMyr9mS6r;EL~4>|ID z7mp-MVkeMWgsZ?rurocaa_Q8QC1Dr4<$n{})u1j9zFw;NKF@T4=c&v--U3`O!?{)D@F80lDy>v3hOoR2N$?A$Ang@^OoIeV;c5z!5^DD59PFEKXCZnKv40G`q7oY9oi7p;8 z*=4A9ajlEzyZBNUb3?cj@G8CdAF*jcK9F-nce(gJ7jJd(BQAc@#e5*=_`|nl9Ddow z+<@-LKMFHOv^b9HirZ7thWyKA|EG(iI0=;eigj^gGU^_W3>RnXr>;WM3SFWuF6ORs zXXrH4#iL!!7hoKn^Icrw;yM?bNjEAE4?h2b+i=fwxl75+x<%<)m;4U047KiZ@g^7Z z3&4)fE*JAv9!LHLnS(|gZ`-(2Iff%Hi;oTKvyOPW2F+wyMn8=?MHJ3-akh)|UEImV z-Cf+<#pW}lG6oq#xiI%Df=8H`mb)ybyZAyEb6>VI7U1_>9A4_;tM%~pSTS7Z65Z$G z`(4cM&p2K@>f#q&%v~6cj+uwcP~>fw{D_M`4s&0VCT{q4h8AWXF2jsJUGfM{X+_Qr z;SM*}2bhj*m#DpqJG!`xEF+QuF6LKd9J!gMiw<{xJ7a-qF6I}R9r^4qhifmlhdUNm zxtQ;nIdXnZ+2NaAY^L}!@Zhd;M`xRhA9wLi7r*7sAzA1>xs&mEm# zUHpfOxl`QH;mVf7Oy-y9BbpUFrUtq5kxQj-JK|*K`!f|E;f%6MD=W!oIBB- zFfVlR92d`X@j@40?&8&94wukPE{oe-yxzqdT)f%E-1_cB=ouIDBQlQs6&D|L@geiD zMN-K<^NxdWUHqeqe|0hU)I0iq7dLWoV;7s3cceCOZ@U?ep=7Oop{MR^6$Oc<+US}K zu?zFcPdy1LMdLMsLlAt}(k zKl7x)w7VMHk{HM`x|4>wg6_a^`a3FT>#Uh7EtQ^bpjHd~;Mj~axkbamnJO9k{0cqk zg9G#UezQM5mqXsFis!ffn5dUAJT<(YmU3`cvcb@lM z{2`gK$MGpnhmVrwPV$Xm{p~FEV{irgFBBvX^Yl|@qd2Th@-R(TMoDz% zq2YD+Ep`brj6K4cVBT8j zwhj1o;e7BR;X*KPE!5$9)u+N;*yO(wLoxWca1Zd0!o9%1373Fv6bC&j1AB%0f&Ib* z!TfMNb%ueP2=nHgDLe|y`%#ce<6!7U3zRpDs<$v(NIzkwm~V4XClAaQO30nS z-NP-yn8R7?gpaPE*31;KomSeG?}tg7dI1T z%32D;xs@x-J|kb4eFk6srazfrexD#oc5)0Q2VuZ7L~Ep2u=ANrhA#|whA^|VMwmMF z!kJ)x;(+?OV6Hvz+j<4yRl=+jTDS~+n{a<{@Gdb7gkhubc<@8Q6Ty!NPX(LLnIVAb zV7`aVz^cJ72(u2oB780Q4dIpGcZ9iE{y~_7X0O&~VzC|;Ukh&p|3i2O*hWXiug}KDEsW}A@%svtvuMoc&%i92ZqX=zTCmdf7Nu-(KjAjuA;QdF z^ZhgEv-24v@-E7hL)`{1IyMo^W2kE#NhWEvSmE~jM-r%Fc1HfDhqW)O$ z3E@fLUxir@SZk?s5im-45t#p8i1KA%eyf9wI)TmmVps!ooTn=6?Tmj}n72PsdZWNvmzE$`V@cN(_E{EYh;U(Y)gqMQ1311C8+Ql zbY107jVnY~#bXpsXRtP&oKC4_O~UC6)@G2K=ssKV9g&!?lM3|Q+wF8cJToFYUdFY* zQ6oX0ahV$Ah(;+R>hry)qmKM0DP7OrAJBS2%M1P0071Wpw z3y0Z!B)rasH);CYh4|@xEGb*xw$3il=LA)DX!&#L`o^G2kLS$LP< zI_g{X;%5-XW`xmw^J#8AgqtPe2K~TEH!njEmB2!`Z;r8g_O&Xl`<~OBPaP5N@E9bk ztrO%Yr#Y|JyWw2ds>ne6GPq%#qnj)}J1-)c%lhUxVM5U>>pdR5Aul4X?UIqF{AbtV z_-`Jr!R$Cp(G}MrdI8iTs+8j7u>sBpT^(*tdf!;O=R zIW9MRRmq(rYqh#wrDY60EyyR)D0{&fgKVoiT&tSmZO1dIIqfvfpP`v8n(agH9BhjE zvL1?hhbKAEw%M8C-ktt*!0AMN%W2WTWEpO{^9h_g<+X4=1JR}PjxOi>Pjh}ym#u{J zy{9=pgkhHxw?dcmf1Kw08@-CoId5`@{u`VZz!^j5B+H3BKke+!!#w>FoM*&C>~@|v zCftY7c^AF@5xc3HqzhLuYw}YAZCAiLTYT^4@|}|(x9=C}#c#Z-H}maP+;q z%lU%SoHx@4=$yN3+|D^iJ0zj=7EL=g$~C7sKdQ4W_u`qWygvdXK(3tjqIN{nv-aMKEI|o0acB@{sJt4Vw6R1-;B>seYvU#+qGr{h3wl13^+9r@KBw6fqo#oq4L{tZ?o0B;qp7HgDB*jf^nDw# z^4D6wyiv7j5{+E6`L<~I(|!0JV>P0M?=ilieVbHC%SNb>^3}az$W{5c9w%|(kL%eN z>*`G^AO8vP)=jFPJs?_txJjMo55ik~w*kM(O8Q8jaX)rsJ*t=9uUZVAh4lC)eg^v# zPuw}&#GUvp^xm}+IUU?%CEkXpc1qj?S$5(kQ6Nhq89!Tks+x(aUrs-UfMO;(Z7pD)Aiz5S@4_ zbi9dgBV%F`xjq(~$dBy#tVVak!sDOK1)Ie4p=u>^l&caiLH5{*JHQcEqYM_If9(<~ zO@QBsJX|ZC{D5kNsNpkMbxkV}zJGxEep+_&$8hH#qSivSAURz(JfKR|F8%WZs&Akqd(iKD%4y(=wX$i)-+T;tVSt&XsmA7rrOxi zG5UjT>Jn9~Cu~;*_TU)3Vmm%G@Vwr*U5!l|%#5Ad0hw8haIE~c(G3ZYs0m8#YPjH0 zHD0Na`q>6`$Zqb{x9w2riF2W;=0^OSfZh=4Zn;bE*`fNVA9Unn>S{YNRoYlPu1D z)!HtYWf!evB%6A;j!uMkcR!(8HvNim$v^2J-#C~92R(jh_~;3Bkp~}Kn6OKogUj|^ z2!6eOdzb18lYci%D|F#*wJPgj`hC02LjTqer+f&b?y#@HoMbc-*<(+`C%aWdr21Na zu}5Xu9-oeVK@}G9gI=oT4#X&u`DV2>8JW$D6u}5;w2nEYq4lg6@M(wp^rJ7RJhec7 z@`CD<$$eWX*(>0~LzpzB6Vm(er!{`8Gk(`)FRDh(_&t=^>lL%+L#ol&^i)LG8uGH9 z^P;LpmH6UC)!*(At2^vfr5VZaw$X%RxHB0qt>Jr7`C?zDyAj{(tM{srYDdGnd)1{) zy^rDMXXD?Y{J;C1j|uw5xsmDm*2NJq4R3s|9!mWmeD~t=-__?44R^G`{W*r>0oyTkxw?a+j!A{HBv~eeyC4%E;GAa)b_P);Yh1p%39F|XDZI=n|pJdL6 zaF{)oO~U*Ot58!uO2qLlO3+!3Xu+D#`3;U~WK;?s>&cwB;MhUV1mGBh2BosX{5c}2 zvcr4~T{BlHc=!HZxEuHv;U3^WZG=xH++t1LCYOSJ$O-ZQaH8-T;56ZpU~a3Y4#sI# zE8%m&ZH1?UI||o>y9h4=_Y}UC=`RxlyZAxE8^N5$Fn}FkZW|!)1D_+zcFkP_lpg?B z3cmra5zV)K7yUPAsaxocU1cLa_O#HsBg?bCF*L z<|+_%t^o680P<3Bf$(xLKQv1Db>LpYtH6DQ`J`zuw}(wc_#)wlz-G}1`VWK6q7gXA%4JrKV0Z#-R*k?r!DiJ6ybEkr zjlj=>&8iW257?|4f%k&Vsu7r#)T|nTSxL>R5%_iRE{V{aU@RJ8DFYVo!C+R6z(>Gl z)d>6v*sL0XKLZ~T$KQZI75*0dmGF1q_I5X9_n0b87_U{4i;ra0_rJVZP~FEZi2%`4#o~LRo(@A7vK8aE4fL zf7~eHp5U{DOTp&}_XTtAM349e+6-atr>hYj3Z5f80=$Hb2^uoNy57Y>Zk(V+6fABL zMsLhzCMyZuDUXL;%%y3{5w`heAer4hr>f*e;FpBi?Y}168vK@U4*0_`2hF!eJ{OA) zu=qxpoyl=wK8B7!47mcxgHNFxP7p@7ZgJxT%;TUj^Fw$&wF#nYY4lqs# z|7RUApV)R6CEl#K(}JEh1NRf=J?SiRAlx&aC)^Qovl0b46JS=Nz+J#*B?{adY*wPc zC8&SaCE~aYyhwN;c&YGN;1$B>gI5dB1g{mI1-?^wHh6FlfY)R z3OogDR;!Yc|5Y%U4D439zQut50XEB9;D3V6@)r1CV6(gh_Ml@i z%UfW+Mr)S0!0aW>@)kH9Y?imcO~Gb)3(N@*mbcLV!;lGs>0ZID!0G5+C~pJimJ~93 z#%$rOc(`&S>FP4B(t88 z09Sy`@)me1*eq{>r-9A#7We|NS>6KIfX(t2cn;VsZ-MK(5a0xuKZ0=`a|&F==`9pGDpcY|*ieipoy+ypIv{eOcPc%902{YR{hi3pqVE*q5axs`sU&y=(eFrxGm2C(N9^CY~ z7>^>yKPm__0}cphf>VVVSTo^v;FiL9V7|gee;A2;;ZEQp;jZ8w!o3i_RVs$Quox&j z0z6FkEHFP0PEW^!#|uvY^PM-!&jU{to(#S~n0105|EJCc;7f$7!HWzd|9R_NDi*9b zD}?8Q`Cc3y^VYdW_)_rg!i&In3ttZABS`AA-fR)R1^lQmTgsEd?9QLzQ%^d05QZ0p zS)uj|KMa0dm=)?Xaucde$iEX#1^-K!MX7vY{Y-GQa9eP^a4;VRK2f2kJ-}(g zC>yIC8I>Ro%zrIGP62lnW+m+<%(~K7I1@Zrn3Z&dFvA)vTnL`vWB(7AtQ33#Pc8<} zCS#1nfaeP*fiDwg%B~Pb=2^>yGr`vjGnF?AGq9V5*%56fx8OJt<-g^m0Zopai5n7> z_6oNLzbee}-J8O!)qHc1`W)YVB-|7Hg>Y~1F=4hczEMd1(coXmK^Vru@TXX?pN~bd zsl*DHD10fHuM|?g7@Q%z0^CZNm9DMuI&eqfyTM(AS)WRUcY%Y0#PAFZLxrCQPb6oB zZ%$K%$3cF9@OW^o@cH0*!sXxv!WH1lg_*Er!n}c97v`YFHp+Jv8CWg&7U4PIb;1{c z?-jlTyjl1P@WaB_fOiOA2i_^X8vL9vo8n8tw}D?{|I2{yfPwEmlGlUZ7iK^Iu`t`~ zQQ-|>z7t9PP2dy4yTHE+zX;~{?5Oh+FiQACaGdbR2;WS1R9eVBtLQ2w_e@$AW`Y;?Qb>So8r;5-tT#6YdAD79I%Z z%awG?A=gF1oOCV}9s^z?%on$=7M=!PDU2_p1g)FIFb5WEh52ozJB62nHwbfB_OS4E z;3tJwg7*k(@IK*N!LJM72|grzH~5HQ`Y>WIUP$7 z-Ux0aycOJ3csn>txB=Xr97JG`!O%r4c7jWU*$od7egQmIn4QVF!mofQ3%>#8+qg`? z+u&Kk$H9CXm-2stuMqwj9K2Qxf5M=J73##D!kpu65{?FM5$4mcM};%MPYP#(pB3ix z?Iqy?@N2?dz;A~+Xcfb7L@fBk>oZ|?MBfOrBl=#L9nmksocsMLJO~^a2&Zxg*eA?R ziT{g%sUHdEYr|yD12Y0Be;Q`Nz;}qrSAyFLuK{-yUJvdf%nqcdFkk;H6Mh;zNO&KZ zuNl+N1K=^j2f-7BKMcZ9A%>&i8N$DUYlJg!lGBE$U1jEJ4pF!($F|3BgF<}ipA$%wJSK<4>d{#%tkAS0u8^CeGkAeB0-l?+_ zoG$!4xViA#;B3Pv{|{kkCl*`{D-iw?+*LRx0-cmF*Ms^AHvyj^oDDuxI0t;TZ~^#y zVXgs9748APFeru+7-kFi2hSHC3%*R4uZvzGJQ=)PxE_4H@MYi|h53f)t-@UESucDK zc!O}pCKw(R1J`c03qKCt(eT|```J|d1BFMn*(2@TD|OU%8~;>qsXmL>f~ERiT(Lg; z!*(10RaOsp1X`ub^i7XII#quLBR=!rTE_Ok*j@oIr!GA^QuoF%T7GX%s%`|o(NiW=Kw>|lTFpKoo0V6z~evsq8R`NA$WCtpL?l4%y%q_N}+LG)a^>cgd zk|sOhYjk(^vF3j_di{zE01?Vwsxw}&Tl=|@t5bmcFS7#$QF_!1b~^ToRJ~x=G`<24 z|6~??VhdgLXatOL*_#kKOCxYL+P&-Uq&8IR`IR%z8CE=2}MwioAd=e zvh3_Aoxj&EY0ZU+_~GXu8CE*;BHWk#*x zqxCc{+NzuRWIgRhYTUxqq-~VsakU7q zc2*)BwI9=yZVUB=uiJg$#e=WgKVU!e-EY`!k%0Yg*!QO`M;yZc@Q1@BABQ|;R^P*V zfzW+j;6J{2pqxQWC7e2oB>|4zEmd?}PzG)A! z2Szt^f6H#|^?m|X+w%NB`rlU?Dn77pjQt;M!}#$_`zBlWdd|*k`2HLFK(t-dS?@Vv zX9o&h|IVPOxNA54>j}H3UEHOi+Yj~wErY!8@a0h+p#9v_gC z!@LGr?z~XS7m%D6O8GydxP1V1!fGi@C%M9nz}$fiouGLUs7NgM)P*-NI&K9n6)pe| z6z1ckVZtTgQNn}4Q^-gF+3ZySj{wgS`6%#Q;nCnr%}b|H8Vkc>v6uwDN_YzRTHz{i zNcckV&BC+6cL=jn<&BV$SO(^t-=q28-({@q+mTIh6CVdg%5-G3Lgc(DtsLL zrtojz_k_7T{E=`6@E5|J!N-KTUh%y!C(OTq%}xz|OY~2%my5%S;9G@R#_NUa!S@Nz z13w_V0L+e_0kc>i6TTe$wD2@#fs^kBoBavk`@v>^ z0+=&8vp)g63vBi$fS&=I{R!ab!DfE~n03qSPXNCUjzSAF5&aZ~#x$UP7lXMGoZJuG zT6h4MySphL3@#Kt1B`#oW#k+y^cEfo=D33Te7eVB2${vf8zPxSFwVSm3ImJaT(MyG zRtPierVHNyo+-Q*Tqk@V_+nw^ka>+4em)1jQsl3JuMvJ7yh`{W3rdUOEm+(pd^f>VSif}03W0tYk2Fd2q6!qdTd z!WV+gYqJPo7ML#-FtEkoKEg}E{e`aspCKFqj}m5)nY|5gyB=)zHt>I++y#T#+yDzc zH5` z3Q2Vg<~3Vb*sw6K*@8Xb$HW0H;e89dec>?s7KF{d1u)&3eG6c^{g`gSQTn4>Q!*RQ zZxM0KqY4{_W=HI`)o;2{PQ*x6uPbq}i+k!vb0S7yN)VX~=@vbXmks(JUbgEWawGnM zG2v%zVR~P8X%{iyP9LowY!`u<(|G*{u234@KBB$)!n|3bSG11^VB_#@?IUs`=eEIQ zH1yG7OkpU!Lm#7bYrZpK$;*TEOWiv!B1i4emAKf69rbm25pCj6Ou_?mB&!gq>1bXC zKsbk?5t)si`AxlbO>8T5gYM8FqTR_!%ft>5=@H$#7I5Rg9q8Y1XNQQWBwub4>OEJB zn)>v%k_ftbyCkAb!bU%5Ad#1Nd5Ipb<4Pk2w0ec@BI0ZWYV(_zGM|Z|G>UcDZtU0f zr4b#nX2Eq-E)~Ob7UP7Q`J>tmpk7n`Olib8wOFT@MU<+u^f_e_JsZa)VwUm0sC&=w zsEYpo|D4@(c9Tsu*-ZgL-H;GEBoKOl&^shF=>(7xr1$EA(u>juqzHl{iU=Yu3es#~ zK@sG(&{XWGfT-B;_kPcQR&rneXWkF~*Y{k>p4aqxX6DS9&&>Ed#Kq_3Cu7e9PDmwr z^VKuWoTX4OrLh<5 zVm8r#9R5!555(_yKP6~zko*ZXuDP>V$|>l154T4ri^+SKc#rY{vb>|!qs^U-95J!# zLUU)iAis&2e)c2|{}niK`ne&a<>!|o+kX@}=<;*JIk*2f>_qt|BlXe#i}2Rt{}J(w zF%r8YC6;ge>(KM(#KV^Vw)S)nLUs6g{HfD$S==SVJp)!9OW}2Voujar7_VluaK@kl zEokAanUsz2qx@W@747H5um@+9t5YqUZOl8$-_qI0%QX3aq0m*V_jA>|rL!hvB^S4J z-o%l6vsyV*@Sd=)m9uswPRjXn%?}X7h~&$66{C{#@p$-~Ym;%wBh(Ez3UY$O-`YHb z2u@2rhp7A8nvC6yWX`kuJ8H$O5+chib_$>nL% zLn{^~zd_%6nJk56$-`)^ugP^9E0QPEw*qsI+h}d9NgjbL@eek+ie`QCdB*2nlM6;R zB_HuXG0glBCR>yJOv(uJFDP~-KT7Y$>!duH+{mZiZSAap0}Fp{jYsN$D$~X}+uWcw zws8i$oXz(y;5yFOaz1skjk6gt)YCSSp`SBG%+RiFk)box18toZy{8cgmlccjIieEO z3vHe0=5qB3ER<`DG$p1~KnBIa#xC3)UnBa7B^%T7a#gvVGp9*!1ZjEd@{_%vGgOA3 zA6I<-1K@y>$d8zor)gOx?he@S&qwS`e^Y2U{NvR2b_j30I@!*dmU0IUJ)OAAYpj>Q zp3dCw*5@6ntoF{P-WTEA=jr}AOuXY&UVCR+oOaPmyD%K@sk!Z)<-Ow(Yft|s2+H!_ zQG44vi-qG1C9Q^i3@IyN~?=uIeGaa3s z9F1aCpp&zF+$E&L6Jo27=Pebl@}QS8i+YFV!s}jMOfnjt!(5u!&)ZWi?c{7^2Gtv# zoMkHh20ilzU7FK@<(?sFb>KGg&iskGfki5&voiy;LbWwbJlPa zi&wL|Is0@d&3J!n)`V@;O``z+=B9J#9;@_3*2APUaw8Q*UgZ{A3#ggrov7B~e5=FZ zCc)K|D&O5X)qGJs(%m^4jdD~EL@h_v?%_O|qy5_DpkE`A(^Vfuy)vJ6Fdue6ZB$M` zd74KZoETu=T1`jeXfZ}Z)#!<=>8YmnM7w=kt?dbKd#YnSo%M114L85`J=00w--ADm z_o(LgI4gyR?)j>&Tz7fa}c|# zw^i$2&IjS>&0fxOt#$G3bu!*OD=sSs@%%2838=)nR8tBaP z#v|C6w^%Z*%EhVt0*r@VQL_tRf3n(H;H+WpQ0EJfu^3PlASVv1Hwaj0&hlz3?oAv~45(%?r#r07d>WT*NbY)eoz zc#R^n6U3!AbjJ{Z7gyCqX12JJE;6%ql8oBO>oOTF4zFLx#l!4HBqOp(>0~_Ayk>gv zf*IK=jVrDqTcu?oB@x-A0&)@ z4w}`&{5ZL0n7;%E&CIZZ6OEkLV<|)go|t=OM4vg9Cd_%j%EHW;n!?Nse(a(@%z%i% zQyMrT@5FSr5j#j*@E?IECL$v6#5hF+o@#*yii2!$MBs_-Hl=PESbOkzVNN9Rn*;R+ zgJ%nm1V1P|8N66C@}H}$9u|Yy;I+amnvKE>!P|t_f_Dl(4t_>>CwRZ`F7S)OPlJyN zKMQ_M_yG8=peRC6a7@iuzX;Zoh~PtDE$}3dr51P+zD@gJJdp+uIU%Fc8x}Oks6K{A z7_E4C*E{I5SW~I*4%a`Uq9~wmR2N1YAD#$=C1@E9L?23{sW9tGD`7r$9fZ*fg?GJ! zW!8zo)R*>SL=lF}QdkrSdjAM5F$MRFCAJ$8p(RvSW0B}HHG1xkmT~F1KVd!h2WA5F z+#i_!>$yKL6QJk*z+OIodh!nn2B0VZz)TIl0de2H65tDDPx$HJP7e|OS{VI|@q;j* zh+D#Z^#2y-)2rw8;18eDSQKvpmx9)Sg5^$6>w-%Na{#P&w}XBQaJuL}0In%K4_sGx zA(;CO(4Q6HHo~XCorT{9cNabb4)zhnSty1Ib9!x*@F(C2!k57O)W!g=g0*}R_$%-d z(f=0wknlC|HZodArhcbz9q=<@4jT2K*e?bR!7mCo2Okw~1*UX1J!%7fOSm)mjPN~R zJxvEY{lFJRe=zuS;i2Gfghzva=9{aDcCK%2J98y08SKs z49v}2Y5xScoG`P!f-rNps_@5bWVpjC9efF{C;Sb#vG7f>mO+A@Ti|x0|0}qQ@bBOr z!cGjY`U*#b2MKfXa=5S$JOLbJz{yZd7Xyw~gTfToSRz~vthdR7eZFbvZSugizsL^Dgg`wuM!>u=7(DbJPEu-ILMm6Llo1% zPYbhG+$VfLI3&CX{IW0`nOB52flmoP3Vv638~6j^?ch&@p8$XAX8VsA?SkSfF?b&Q zz3@xmpM+lq|0etj_;2BpU>miH{;)-h5oQDB7rq8AE_@4IO88f{|23$H3%Bjr!W`}J z946|Q0_O^|ZEr2iI?++MJh-cHC2%j{s^9^_)xjf#Sr5jLxfHYk6qCdt2Tbu$2HY0B zK)3^VnQ$I>l`vbq^}++eTZ9LJcL)ywKP5aAyjOT6IQW7nrbBUDn4_SR!pI=wv@koH zbHdBP9}BMoUlLvqzCp(Gj9XY-2+SVxFVRm1JJGYkPWaT!=&(XdTgD3qU@2KR4O~h% z16)CvSz1+?S(+uxJ|#!E8MuWopZj*g?ZBP1C=g=T7m5NJ_yD-HypZrz>ifg`GmEem z|KXqk*DC4@KTc+HaqTL?hsjA{{bLbk_MWAJd4h{O%tZKGaQWX2g37Lum{V4uE;` z6z#B>#tO5TCJI*uYhjy`;Yes$Xn(l%gbfR?raGhi)k11<~J z(l%f=$uEgNY?6-&R|3B-%t!G};TqtJeR|3rI%tRW>4-2oRpW#(9<;C^O*sHA2-2Ya7loFj0n;NbNdsmowImIg zsk}jtz_=L}d`<`ea7Bb?$Uf1hKgEO@q0+**83AEE|4^F>)*xIBif~h5delmo9%+FY z*oT(UMf91n!Q}GcCuM{%y&WUWCt{K?D<;qNN(jOMYvUX-XaZg!+ycBzxGk77=nSAc zc)f5R@D|}h@DAboz)uN}2JaOf3w}X(IyiVt6my|?U3eb&ZQ&*0_k|w@e<-{Od`Wl< z_^R+$@VCN`fv*cc1J*(^NWcLwD;pBiS&MXQDH#|Xg1(lL0ly4ppUxD&0xl-}8n`kU ztqto$O<~-y8DZ+#xWpjqYirTQ^I`BjFub`z?GGt7n#a3Xz^3!4~V3wH{TLD)DYq1q@7Fdg|fV06`Yz5o^ zti@KqjPw7AK-hW;>+CR=~_UEw%zi286{{!1xP` ztpKWkwb%-nSz1y2;nPuFxDL3sFmtzoaC3wo7H5IuHsDrbzzWqtxF;v-@ zJnC~asYPMHd?Id&KI;>AtD_wj>mA|BU<)23R6_n&gTkW~cvl7cgju1A3Fm@K3%3B5 z7w!z^ae54(8<^j3$^F2!ga?3IkrAo|?jX#B<#W*#4VbcfgmE+a3o~Uygqbof&Y*p! zY^*R-Hd&Y{n<>nM%@t;1778~4FBcB76J0HeT<`|rR^Ug4+kzh#X2pD3n3e8XVRoV? z$aox>%9FxO*lA(hjB~^vz@lYW-2nCzNv0}hhX|gbTwwb~#@43R|zzc=hKrI(W!)L4(MjbRZ z2xo&I6=tqHCEN@g+$RcVOGvmQ_+??%@K=O;gSk?MDHslZSGW-Tf$%8sC&J93PlcI7 zUkNjZz7KOyuPweI2FxN0H6sCq8VmLa!`Sc%vm+@c%$zGNoC4+&8M&H@<#Wz-%6?U>PAJLh@ zjKo~wOoVSN6a_ns<-&ErtA+WzZV+ZfHw!lf?gE^8S8Umz*v7Q8~|SuP6yv0XNCj&wFv(u?1CL9%7=EM!O_BuP`og6E?F4PoJLAw zs9{$tt1LgWjvi;-7v)Ibs6L)%b%tbA<>^)zEMc3Do1@w$_2zWw_ERY{pu0>J^0r33 zh?~ROsys7cxLfs}3EdHD7jKI~zsI`oMDs?Vn^`x3G7ha!K$DuTP zDgOhwZBm19a|E7N&piOc9m;$Vy7#Jl-bSfyxH*#csGASMaJ_0a54tDS%6Zls<~7xO zzV=|(d}}IJN2V@-3abTp+p3N)u&O%BCaND6Smn(Rm4BgC(S8+O{AtyAp_PU;T7#&w zV_IY} z28d_5-#2k{xG9KfS$5%=Nf5bmJpoNedzvKNLu+OfW#OF;dmU9#b}Cg-?nAs;HYd~J z(@vP#7N8J*VeLv(bBF43Iw?8$6AY~6j&y2SrL`vRYzYZ}eM5Agf8YP!nGba+iQewCGMzM&Sbvc54h)cDm_ z3G+F%WVN;5(a)ipuCY?Fs&3F4B&fTZy~cVFYmUsdRxTEPG+%3VM?Fw$t@`F#^&VBT zRfTn^E49?*byn?q{F-2n=E(IH;$QVFz#KaSniXf#WE@S*fz>E2XHKGiz=?tG9d&sf zLR+r>SZC!U&`!zru;I`=ztI+&dxi&_E*iWl5Xr8L+WFMfCUyrKk<6B>15d0t%4)M_4 zG#;kKLYN?kc^h>Q|Ji8OMi4QZtkES*xQnTJ3(cF2Y-2Te6`Zv|t=MGMOqd3}s6LHi z@!CC?rdb=*nN8To_$PIpxB8*@&DQLgsOoN1C8O&9;dM7nL#KCHx9oqv$Lzgu*eyVPoL12}6gjJ~K2ibbX&SF*aDQ zo-uIXu*qYF3>=uAUAta=BVupN&}oy#6_ppOo&8@{v+MttVg3Iytp8tz*_oL|0?E!S zB8JvKJv%$IZc(4Iv+5SLoK^3?3~SZ;FJ|v}GW+XNWGZNc` z8P-nWicJ4AqQEPFv0u0bSj*BQu=?PmqR(ECvh<8ZOYkXSc1xd-rN}N9;TvQrzMqRQ zSDXd;v6XK~UMR?=z$Jv4+gdIW`i!++Y6MOP>!n8EI$*uj2+Z-LUTOqx1#T+-v;*gp zrLNp_mxD%MQ6OT*7%~eI7v<_BJVO{&!fc7n6zD4OnG7%Czy-IyBOW|8#rsujaBXmocIqlYR zZKySL?8OhiS203~!i-RgFe6k>m=UTV%n0#tX1ZmBvVsMKT09WUr%tZ~0;hqOik%AJmBM@pQNoqMn}w@_w+rJv$JnKp z9l@j8P&_LJtWXDp>wymmHw7OTZVuKv7Q=0K@LAF4JLE^gqrsPjXMn#DUIPA3cm>mc zLlo;_@T>4<@E^jDf+^X{4{PaQ4j;%&O(|ifCRG^kJVr%fCZL8e+mdWyCZHiX2#-2L zkt+syU=BMNKo4+N;XdGA!sEgE%uCqeTkyT2&y! z%+fD}nWf(eGfQs>XMukeX7>Ii%$CuKet`kE0P9_f!L7hrst?>Atal~`cLAsB9f+YA z3PnY6JPur4_yKTj;RWCZ!W?evor&R=S;ag)>%y8LB>rM%?_j^yc6ZpJvZ}0_S=AxG5LtvA^UyJ^9@DIW> z!MB8w_yNZ6qL>Q<3&T~Wavs0TV8lKxRUTba5drms##YnX?5YT z5}^$@tT9oJ+O^f7->pPvc2+$?lA~UI(a6jSYt+{oNe*l!vT~etS)Yd&n)8Ph%Pu;L!?Sg7%+f~ghHTMY4t(s%oKJ2lw(zYwwr!r6-)XTP=hRq^A zrOx;&k@xn13-)%YESFsoC$9D8?Kd?SH%CsPddg*IV4~v;l=dbx#dXw5oI9uZ+KyPI zy6uScVuRItZWOb#GV9bqPVP&pXtoWlb=wb@jA@RZ$K>80yJA$$@`%7~)vdgpQK}UB zLC4l8JftNvksQ2!pP(Yjo$6I<%G)igZ}p=BRA(J>ltVu$QjPZ^`6AWGiCB?p9H8tp zyGAOf@&7+UjoBDUh)`oS)jiGbi}&5VX?D*Pen*auGe1LVxU5$CwF#zzgxlb+8&U;1_t|VY}~(eW{NV-O7)!6ML9w#BtB&*rUsU zR$Pf#Rjq>E5U+E?E7*Zxt`~XgXMf=ECnA5HS}x7e&*Umf#1D0(FwP}M8hwd0mDun(!+gBrDgT0R2r+aE5;)OUKWd;ee5F9~?lk@+}&F0)}8J(rfy;;jY8K zRJ~ozPDeGmQO!Tdqp@Fgu3=ZI_8ChG z60?Y%kuVer%d=oDLi2ML(C|NnAJg9({yO|;)MGX5bT4<#^sJ!xr6caDI$Og|E0vA} zd)Bb^iH)lOKRj#6KEsm<0kfKRv5awa^T^-OwBlHUJsashDrVHsF@|Ro*~8|cQ%yTJ zPA4KPpNT}MjWz9&n5uJS+MOJ>SM|uW%cq<`1U(_PWO;Fnv*#c=KW?X5k!crCX-MNk z%MkTmaVwbe!*3zXesR;)u}piYIYDJ)p;8s7o>_Lj`I34v%kGJp;J>r%egO+L!hFTS zX;ZTRK9`P%U(lF{@-b2av1(>5I~$$GUf!;RzNlqqI1#(px^}zr!|AraJq#f(!E={( z6>iJ{Hk~#`!B?s73r($SAGXr?>B?+iw#6v3{lj$wnT&JV8$!L`=lZg6YcGHS773qEVF!PI|*+Vy$Wy`pj+=1Evd5iHa zH=;Awn+0G-81wGsFo6A<%eCT)+`$q>Joqf&h2IhA4T{HWzqrO+| zYHm-*&?T*feLuSU$6DBxp?bT8ebT%?w6>+~bC}yhPqemUOh>y|wZDzM+3c+H+uE10 zwN+L-Oq@TUy0x?0LA4nw2jsYqwX;i@!_`Oa>~aZQvSh|srx1@Jc#lkrNeFq`qv11$ zhcY|Z%}if)rssRx!s{DEDbtRI=61xW#*rSU_II+&qt2Y~WG^y5QUg2NtFH9pTS=4cqF7Uy9Abxs|~vs*g+KJ`bQ{feVf-VI7?yUtUe(eXI4D$Kg^{L+Giz&j;*yj*0 zXBM4etW!6$fvS7h4mh$KgnAveC#?yl;z^H8HR>rsbeOzKpM`1 zZp0ufGDFx0?jo~-Dd_tma)Zy4Ije$83nTJn30FBh-IzJ#s}^1j@LWU$2RD=P;P9Hn zM>sXiL)a3O4>Ok@nQ39>KC~ul9IhE`u_}g{do`Gq!px-!X5}zH&Zo3Wn6LQ}zF9S_ z;Lyda7Uoz!^r)Y_+K_98`5|&@(HCaR%XE6nebv%_2sxyz|cWP(vk7-`a{ zFH%3A>2D$i2;bmFmo&gbXmG0sGG~1v8-J)YXzo{!STXu&h(5QBC!sfL4EXCEdFZ34ZyX88-eQ! z^G&{qa8qzg;b!3W!mYr0da4ngwuPdn7<2~r6V3w<7VZijA>0Q%Mz{bxNtih?LwFK+ zj`0291;R|^GU1?tVwEU1gVzi125%8Q2;L!l0{o=#yI?&N7>hT3u$~D7^PzZycEGj4 z?+Dic>sdkQbCw9Rf>;d%1+!643xb(-dRh>i3)a(u;MQP0D+p$8=~+Q=d+=Wp0CR|+ zC+KG{aI|m%I9`}Jlq@`%?T?-=go6iRpr;GL%pyHq2wo4aE)E_8X9+(GZb?S%3!|`Je>MLC`LmuMl4MPPZDO0ogq9QJV$s1SkDl`?G~_}Ap{=) zuM#^fCOtz4{kOqeME^8+hwumBpq?&-r7KYE6@$;f{IbK8eE~i!{54olBSQZd@JZ4C z4SZUdB6a74DN^^ba6I^mupj(on1e0A~wx2knN!`QTjP{@~WaBfuSnCxg2R z&jI%mUIHEqr#;l1F+!iT{R3!eb57Je1{ z1UVUv7K&-NFdx6?z(E@Dk<(L+;9RhtY6Q0izbX#ef!`GF2-ee%u*1emPdkFySm|j; zFds!d?FjA;*3*vQo?t!g2=2@FU(Y*2F$e~F+7Zl0#Xz&m$noiL3G?ZQ6`lsxf{Cy* z7hFR0mxId+^U+Ng-VUxJ{0ul#GoJqgP}CKJgWw!t&h|DJJ_T+odyyu5P#*@|zKWhU1amTsoCD_Zz2v6g0^w%hVZtrI zqlDXlCkVF#PZQ=-bH6a3lzHSJJnaR=5-}(MuMi#qUMD;jyh)h-`eVXV!A}aa$aV`a z0_%g%N`=3V>4VR}?3(q#XW$0lpg#Ewisn%0gU`TBfj;;Q%vgU;Pr*IF-w3l3{U|&P z{JU@=nC}g=&v9jx@E9=XX{pZyB!xMs&ygxA1~Xs~5S|6j5N67%3C{u75}psPFT4ia zM0g{(rSKMTd*L16JmH<-o?5~YG1>)1KQVY3JXrWS@Cf0Tz+;482Tu}y3p_*k9q=6C z3*ZI9--4G3Ujwfa{sHyRSTBm}V0|JQBJ?|Whv;)7t*3;!Ol_~Q7yN=SdrK`s3AgFs zW1?RLtR*N*qveF3A5kBSYNz*u2~tr33eLrlD}#R&t_J>Dm>tF+!Z~0qW(oVOH*QbZ zE&Bp)CPRN%sS||@z{Q1!f~%16e4@$(jm*0WqpolaEaeD$!Oexy)h1uF_kxQh00{Ct2aKWsY2F3fri@{p{68bB_S4Cfewa6v(H-Ucaw|ivd27y-!j|4{!HDi`O zN&Rx+x7|I$!=eAYa3T05;Zbb=kBNe<((A(0!DobF#rRP80Wf#hV*o6stHMjc-wHnj zzAnt3@E75YV1CG=TNaZO&tpOm3YJqe6=0SVr)!tKDvg*jk( zLzo@XJHq|JXEg`WSwQiT7z_qq79IxvLU;uDJKU?0a{WNd<3i|MZw3w zT2d7J3Rp{ug5LydNl|d{T`07uC=?gKeI?*aV13wG`S84+KI{yP1cnbg1G5XBL;K() zus-Yz%re%8oq<`bE5uGM@OE-qcrb#^lQI7Tg&zjbia{dyfN(OHpWA4s1o*fx206wX z!t9XV5oU*URyZ5{k#Jq`Wnp$sUkEp5`~RINn!`XJc80)MiGCLSj^HSaJSY$A1M}NG znUUijndIW&lERE!Ko~u*ks%xaR})4M20wr%1mUFSRaR-LGgxIY6*TvxDEKMa3`=n9SxDo1Aj|>_(G4a z3ul3U5v~p9SAN>519qU?$ZS8Ngqfpp`mi$?FyJIHXb&za%)v-NxH~vQxHq_(a3Q#s z@FXw~d|_a-!A*o0f?End1a2?90`eD3=RbBH!r_$BZN;bUNZAR6qS z0P6$Mz^{U5h@Dg5Il`yGON7sX*MNfz>Hopq9X#Nsr(KyjqFaQ>fmiz>> zXyQemMUyOC2reZ&8JsG7Ke(c1H7X(w^YkU@h$l zz60JY_B|+qz2qvGC58SW;b`y)VT?hIlfs;THn>4I9pGl16HWquEX-&9iZH@6t_ri^ z`jw3Snt}Z#%)p!pVSNS`EzGdug>f@VCb0d7V+NKg1`MpCZ~$CgI2~MDn2~58Tpiq0 zI1}7XnB#*k!fZ)<2)6?F7VgOQe-sr+3R}Gi!fer|38P~)?iXex<_Twjmk8q_GFAv9 zBaL;!jNB$+)OO=BVK#bCl7k4i5fppGfHnVl;dbDcgu8%`33mm*F5CnBws0@-`@(&} z9|{iwYoShrH3WQB^mY6Httf`W;JR=j_;=w^U~c8W92yI>geQTElWT;_zKk%-K24Zq zUs;&rhMK~7nvFVP4(firkr*)Bn+h}AyOL{$1L!48PX`Fo(|d(kxkd^j?#4LbWbhPW z4oqeVmjgeLi1KFu?41^f0n2g&8MUb;_)%dN$K%2s!A}c!2JaKj1BZlJ94`wOfL{@2 z5u6gMU}38;pV23T*_iAWW@GZ4Fzd%bVb+Nw!d<|x3f}{MQ@9`aJ>iky^W2Rm zAqz2v;)3vW@MpsFz+Ve52LB+u9DGZ7CHQyYwP21+>F0W&OL!wVR(KnjUsh-*$Vyj2 z6wiUn3Lgfi3%?4kB>V=r5xEvdM&M?`9MQHBt^n>NjMm-gCXA-S=q-$}xlKCSe|VG) z#ZWO|R^KPw96VmQEqJPMC-7|HJn)0UJ-~~F`-2}AE9s}MeJeBSLHc>nXgPp?5 zz|ROj3=Rpe0lzG)z^@2z2EQS^75p(7sfq<(DZ*b0vw^xst^`ZC8#l#(E!1scwuXNS zrz$h9ShY~^Nv@gYu{7#~b*?Vv*Q$bYLFW9Bnxb5t9VK2?uj3B6^5pfdsaVUtd_63E zs4nt`vpP56c1+F2%~9f%I=ul_KU8HNfo?}NnzsV=GH(}@cO&dnJF5n4gq`*387i~S zsXI_QaB5EHP0)T)ZQcaSTh;fxtyhgV<91Cg=WUU?h?^t*6IEjithQCNw?KE4dWW}z zs?4Lf%~7LyyQN-!6p?MK>THFoyPCh%HPz8FS>4%+u(DgI&fDMtPL0^+s_HO{sW-Q| z$}`Muu8Q_+58%;IDUZ3*%x6^N$Dng`9Y){bLrfoY`Rrez{5pJyDU=Rtw0hw&R|X`J zFT%37V2o+p@}qtsm&bI=9TC)L}>PQ*FUT46=dN{IBI3C&aG4l zOY3iJcU6swDUJ@wJQ0QAn@d&P?Wz*h3SFSX;cljS?{<|k?^ly|yK+kKtA<^v9>Q|| zfFHXGpAlzNj5@X3)uA}&u3b)T+TRA+t!VnOs``wphWV}P^NcGOhgoiX#?`3gG+6bF zZ-(%EG3PAsgsrff6yu6k*Pn3(;3hEI;K0skk( z|BdKOjORk$3Gut}J3jsixENetk~X1tgEa$2H_j=H`IO4x>C&V)%<5&6HBdtOK&T)9U_pPP#b}H+nKjv zEi)loCGK_QI!Z;W9(!H298n&%c&{r9Pr#wQuHF#JPu}O66nz2TdH3D~ME4MoHoU2YXe)qyU>m=IXmjffdB0}-S ze*_K~K7IkmI_nNJ?xbq%chxmFtHS-L*9X<|{jTDUq$u^oepeH(12(XV+6Tumo7D~2 zNI3}h^g0NGSi|`M6}`_w;q0ZVKku4v?os=nccpvzf!DKw?~#s}x7F3>U1?r^3h}Ht z&gjN;QAr0}=@s_U)*}xhxmHX*z1m0@QQq((XR-&S)&GF2nU}fe+0Gu%iaDsBKH#c} z1@xaBK=yv2iof9Mgol0T3kana?S;0&US3RrS_`d`Um&%fL(IHhF|22v!~DL{FUF2i z@4w(`=;h~k%gjhZJ&V7tQbMTuzp6eV*MrE7OCi@Wv$uNmAhPJ7I)Bi0FJxvKz33`q z-c-F`bhV9L0I$rS3Q(Sv?+HEgqHB_Aj#1?gxwe{1)hmaztKSc~dcb<#VOLw9w!WCw zk04YydGfGpiitI@<&LGI6=X}<8qsR)QCFL={%);rqlBsd z!%HHUW*T>`tiK61&2;8SgLi-lZxI__QEQI5=9r~b z@^M!O9P~5jxT}x3PaQt)8Xe1TM{!f1N6pJg4b?f}`qUf659$tx8LO<45M3Jgg&9+O z)Yu_|M%A1=ap;7JHHQzHJY>Y63HR2-|K!3kVErt4%7}S8lZ^9h({4I=*AL3MD$87mygd2eU!W?Qwj+-Obq9s_%fFlxZz%`v1(=bNuq0mC$U=EnH5IC3vCN{&g(+%84m}ApU!o$Gb zgeQO_$4$%v4;1|c;Gx1Rz>(u79zpp3oHwxp964`dCpdE6#6fW6yor*YV6Fvb>5`GI@QurNkK=>RuL-;&c zFEd2|UxW2BQ}DN7z04GR9jup`f^UM`X}8FKzCh)PM-{<+g)_m!gd2dl{GO?A3f6+< z;CA3yqR*G62ZVcp7YX+TKP1fcZ)=1{f*;XqTHz7Dux%BCXKIJw}9Uh-U&W09NYzkK9d50aq-+|V(>ipYvB<12jQdOTf(n` ze;0lmY~U$jr1`PUC43efE6ja;_$1NJf50X5v9M5l1VvdfxC~Ag=2y5X!asmBg>QlD z3I7RhENr5^Xd&zZw-Js4_a>u3L$72E6xOG9=(8$d5Dx-t`2@!I1{{9m<`kh;g;atWUgu8hZ8x$sf5;HSaC-^J6tP#9?28Hrbk!hGanh2I79 zI2hXDBUeJ0jZ9hL@+gjU;cDQT!q_p(s4Lt8+$_vNqYw(cBov-<�baX*#%{@I3Hf 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 diff --git a/tools/sdk/lib/liblwip2-1460.a b/tools/sdk/lib/liblwip2-1460.a index 5acb4f95e67b9eac985fd7ee2a0101157b9d86e6..95c17120374db40463acc1d776dd293a929b125c 100644 GIT binary patch delta 225137 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%0AY{zAVgea6N@95^ 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 GX8#3!QPsTw diff --git a/tools/sdk/lib/liblwip2-536-feat.a b/tools/sdk/lib/liblwip2-536-feat.a index 10cc2a01edba015499a626bdff8fdc725d7a4d43..6de957e3e65b1ee2090305d42ee39012490e72a6 100644 GIT binary patch delta 252245 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

dM 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 delta 254110 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 diff --git a/tools/sdk/lib/liblwip2-536.a b/tools/sdk/lib/liblwip2-536.a index 69e5e881d407c1359c8eb7b9a0f5a8e5ce428a66..04b92dc8400f2d82c94d2ce4c2ad323cf62506f5 100644 GIT binary patch delta 224257 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°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 delta 226024 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�+}6YRgX^SuXCSVV<}QH}>mj(CTWqz3RlLGD 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 GasLFrCsbGf diff --git a/tools/sdk/lib/liblwip6-1460-feat.a b/tools/sdk/lib/liblwip6-1460-feat.a index 51db390d0c4bc70f51446a8f15c36547bc54f694..3256c5f9b57cb1efdb049088c256b5dabc9e4295 100644 GIT binary patch delta 297536 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

6W|+!p9SAk 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

v7I>#{b#OqKgVSN*I_&@77DIhl@F-Qrj+N-F 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

}vgxTu96y}KHTVXct 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 Tp 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 z�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 M(`<28j-f2|4co&hZvX%Q diff --git a/tools/sdk/lib/liblwip6-536-feat.a b/tools/sdk/lib/liblwip6-536-feat.a index d16ec2be8f1ac2feaba7811cb461656df5164395..4c8fea615743443705b3150b524618620b7e167f 100644 GIT binary patch delta 297347 zcmc${2YgkbS#M2 z!FEv4pmG!x6;Tlo6v1AO4H0YyJ(mCPH~U$z4)@&mdhUJS`=8He?e(2!o_VIOSu?Bc z_21U5|FUjPW}rB~Q&E1G!mO^#eA`|1DPE%1Lb_-T=4 zeN$&yKh6AqvZ;HQSONb0Pd58Nl;z&SdQY?djVsTfpr(!;hV`QvQuCbx@S`UvA%bw^IM(7WgM&+PK}; zKW&?rSZR+R`O{nagcVl$)OY{m_IO__{apPzm>`D#W7Z9 zfIt6YYuLW6)v$P()v)xC)$lyN>08qCHl_D;oZ{wnl9RPMtZgs<5iI zx_qmOzFLi|on2R5KCim6qOPjEvTA0V1`CG4!iA)GS+9EDEzQHxYwHbT2e%_!==@A7DQiJ`odOqH` zxvgtE#HVc?*l@doUhLL2S$BJb1#Krqn3-9zPVCVzExf2xai`+oW8bt?E4IGZc0f$v zF3Yl1=Wxq95ouX_;BlPYA7mfO$8VS?GCK@AJF+p9Jf86Bv+Jxd74foy#yl$cFXXR^ zx&wy7?C=+`vv)>-Q#;ejV>YmXF%=d56k>%%MHX=9nH8STFi+$Fk7b2>04otK!gD{O zMMiiY37Ngq$exBLijoM=i};PUmoYafgTZzUta!4ki04Du)2n)K`3BE*IOxFK!t9riQ}ozozmEckwH&n+X@86&B9M) zyO#KcPGTQ9%iwsBVb} z@%@erTfPSP4ftY^;AOtQ!sJrlqmV4|72)?%-^Y+F_I-tDi+mGdXrb?0NEZ0ML$>Gp z=HYjqZxsqz=X(gDwZ7M(S>wAM^0__>T#ZRLJW)gLMz9?yMdavqh2#RH7}LuOOz?OM zM>0d-nhbRTDqlN9wtWL33A5}pMDunoL;!TVTuI$Tqq_|O$~PJU+gFO;FyCV^>#^)f zD4Mr)0z|Q;z+~^>U%{DiLnt3gw&HH2)$=vb6PIBJ-{_JWPmgzEA~F>lcVA@i`!2ca zhG4_4%>$Lt?HhYdI(EiJ>~&31EGv$!6T60u<1y78yOtakKXri>dm}M6&WoJJ-prW3 zxGsnkds`21a$E;gTkM8e;Pkj`X7nMZ-Y~A3I*+~vc~+ch-M_r;8ERS0;@+gWEjtj9 z8`qK%wm*OfZR2Ov&9h>kX^7DLxJxPjD+^E<=O;h+9`rk)FyLL3cZnMt7L4zfns7M+ zVvn*CN-Vo^c(6ma9Q$Z^a7?#6d$=dK3cgq?_(-?h^h(-Uxe;mknYRef%ZTIO8yWnj zTdTlBXs3v{ZmHOr?itse2_iyk>>8?l0~k;Wf!eJ>Yy&bIRk>0z6 z`B$nZ6qaI3HRVx?1=>J=4eA)-^nXJCB_aLh;9LY{S9-QS)1$qzTSWzr_iSvxuY$3? z(%YHB^;IlfE)p%6YpK49-BgV%T!glRZz{__%4)wkEO>seWc!(j;M88ly_Pb$tMG$E z0GnFhz9q}OR-t!UDMs=YFjRYMO#<_v*nA*@Iv$J+zTc~BK{B&=t74rqR+@=5I@*bK ztBG|pV@;G;WhJc}RzO$XeI`~56YIWEtl$kL?d|jI;Leg{bLgl?jEy6(k?)6M4u3lT zl?8j;RHgD_eO_#8;c=td?LV}G*?p4jN>8wJ zpT_Cq*-z60^?|Jt_jRBfe(fPjg)<)FJiaKLePOk%WADgsseP- znQV~7HhWDnf*vq2_r<~NA=c$$n}ci>Vy50g`-^Q38F$jp&I&&V*1y9amYo(EOz4|w z&$NPV`wr!9N#DLUddu^DyV_TT1%L0m-QE@++}^JRx-+7lXDV_w%HHutHpzHXWA@t0 zj$ecY|L8Zx9upOu+CMw@31nS;Y_pSvy5>g-Nc|{t_p!~>+HEkA+SC)=(m#jE9q!-N zzAh}7I3U@Eu;ltnmwR{Nb=+l}tw^M~x|^IBN3e)Sx^R zSjuLP8h4t~Wvr=QH>0o#1E>*?!^YU@ZS~qmwTpNn=fNa#r$9Aod{Or^l3sC0Dn5f5 zEIT9Y^ESM`HH!0vN=koZ>L#($U17mMS@F1jFyyoYCpAN-sEW&HI?lvtLC?dxVW%WCugrK znyQlQ|5|PC7ZF|mj9S;s&U(%XJ8J9Zi-tt$4e4pk^`wESVbAJG^QKs}(-&8j*IBcx z7S>sFW>#VXFuSU5`jm2Jl?vr`i>j-vikUO#OrBXa+bS=ghuLf~V(1Cisq}CYsv9+r zx=H7Mo0*nYIc;)vZF%+NNn)n5YD&etnRPm`ol5GDd47de+o2G#VSe(Q*|W>1&z@dq zO|Qm&${dTUgL0FrP#$Wl>dGrBD{HI)gGcu(?>AyZd1>zvqjc#%(lZ+|q4KKvRhU{= zVUbW%T|Q@CUG=;=YaTKeyza6F@hHu#irP!8X$xpW4_cCvt@HAfzlDifTQ{fL8s2+! z|MC(2`dg+@)>)h7Q)cUpc`DsQ3&Dw(q>Qhts;w)RY@rmPdN4&Xi6Ak|V5{d3pHove z#MG9B9Z%#nKga()L_=M)L4^vP1Ve*irOmu zm-Z?nAO#8~I=ynCHP571Q#GZqwqkyjHM?R~6)UpP)LT_ejcH6%inBG=XV}o8p@y7N zQ&nZvE~+h`H@j~7tSVS{X$>CP*F>x>H!Cdam6bbcXVM5|CA46(7EGTqy_`k*r{*(l ze5Sq1Ml$_ig*UZ{=}e(I!J4jeChEqB7SvQ!S69{O50<7B1q;3DI_v9{^h9@1`LwEv zNZRmIz7IF%1MJH)Efa+HK+=-A3B^q)IsHz zoypjR!$uG8+k5b^KIfV4Y!0Q^VWPSJj;r*N&!n}e`ILeXP^6I*p(D5GXre_bn>DA`gcE%Ie0aj6M&A}j2gG!iEUOjVOtu;zsi?Ec%~9KLB#zuMQsC*eI5Zbn^D3*&&;#w-Y3Rr`XPaR96!cmidVga0RlR-b zDVFI*rt)S^pM6Q_SPW(bGTWQ3iGwiIY@x%&$U=vG<(zqwW>#5dBgg)|Db+c2)~Bo%LjlAUu%ncJU@*#(h+naUU0E+!x7dp}4OK zV|{2H5N6g7dw3v0i3idb41g3n>x3|m^6!M1{Rj*OevDSlz+7#R+k%sXS=I)^-N0GG zCEymqW#G2Lqj(?{isu3Z6bp|5_Y}Se%tbI0n+P5x%mZ(@@O1D6!aNAMk>9Jx7ourNF32w^VF#|X32O%TolR|=PcX9y1h&lVmGUQW&o zb?_@4W_$Azi67Zy&)*=-o`0`!GI*147Wf%5PFB?4CCuUFMPVL_N608Hb>0`I%}<4C z^9yi*N?Gvyg8@xKmvcBPA!kD#DQpfo;ZBez3G@H@gB={^wd2>wjCGx)f07w~t&y}_r2`+|QL4)lk|g8`noWE2-W>sJ@sIDjc< zRdtf|7Rq*=o3)U_dQZMBAHkp#2_b81hcY`-go*<)94jec=zlIk0rdt{iJ z7Tk4YL9qIWC)oX+!Rq1Q>US2{`$q=tqw`hw;G(0$)WYB^_}v!FI5y1wbyRT1v7ss} z_!KA}tT?H>I3-C@B^@5Tm4z1LT*2;TbMFtsfBC4MV|UEW`y zCI%mSf0$YyR38kpkBr+o;)5wlwGBS?;V}D9MKI>0`D#sY`A5Ul%;15KhS~d92Ah7| zT3xS~KNXP_ocOWN-g$Mf=HnLO9vqtMf_HqJqizZA`nYBIgS{}_2v&TZbmJ$!@Q>ly zL{BjH6QA-0yL{48T^+2zZ)|Wietp5mK4}@Ak3ltAKbDx8gCy0btzEahGwl50;FfQ4 z)e3#r!)Z-g4?vBXb=TVfI$K4|RNO`RxwFGBGrP#K!Dl~h*Qq%@p2$_9-2m=XR2FvO zp34zAVjeAcJPR2R<;gSQc4;vCvmDh?&wV7VMevf(W=3&jw5@fPKCsM})bvlR+Huje zSFq}DKmQqBuJCpCqK2Kee)#zhVZoC>cy!jbv^x8EcyQ?P)@p;^wJj|toOe;y2Jbqa zqaF`_^kYl4`=-ZyEra<#wNU41VPies=-z2#zFFmZVLnl*v-C27{!QJWM)=I@cyQFJ^cP=ejrhXh7asG`zMSa>;iQJBSW7unLp3vWZACvtvh z#{&!zTEOS3;K=(Sj^fERYKawGb|Og?1=pRp@xNWI`TFHY({`F`Y3(cLm`gLbjP@s* z#i{B>TN|D_6sC3tPyMjKzL)jfBDm&9k5kvNsOx~K>uXG1-@&?8M}h@EwG8JHAuUwn zTTtWfu8Jo#itumOBYe}K5xJRXK&H8(_@+~{j$;$rYkGPZ2 zi?!oUZe4SFPq+%#i9^CNw~qSVW2b$Ob1D*p^Qfk%P{mt)i(_w^qZ$ToK>%87FdE}* zYh8zI+x5^t^GHWZ6xG5PVP~JhkRy+DBr&%0NJjv%(42=%1BP=|j^~*aSc3pii1O^eGk$K54#Xi?eAiM z;TSq_V4)P@k+%|?Q6XwIFuEu0MRsV1e8u=6jx72eV(2W7#K|pUF_pZLC`m*kWg_sd zTU1mcJ95l6=HXg$$+V5FFDl6D<&zH`T7DgqbOS?tMhduTeTX-4}|n-lD6>iS1^t1^#h}I^W+03C;6g13Pv8E0EP%|59Y8#{XAXnCs6$ zD3ZPg^%6HB8a0sUi62`XhG~ocN~oQ{tQ9ejTK;>HNTI(M3^en1!Y_J2cSMS>9)NH} zT6-t<{?}k`S-3v|%F54>U6#KkcDNQ}KY}>%n=XYfniDl&{L_3ECWZ|Vzk_JS9HYhO zG>=qI%vZ=@{GRV2kMi+0Q~aysm>6D!h~NJOI5y@=J=miP0|hW@`3E4j^0!8|ZGR3T zhxuE>w#Uy)4&nZ}kVN>mfFu27H0tL%C)&RkjS}N8L#Wq33X)hWDF;>Q@y%s>_>ZAP zmj4rDx;NPN?}yPa|Kq4DkDu41!mZ4t1cZBh>z`$e83?!h!(l^NcBD=ZSIvj>Ii!Zl z=TTg|rI|h#sosaSmBxPSi&gBmp0rnB&lhJr4bySo%@=RDD2>O0&#$hB^5C=-TVEHh z(sOfQz?Z3bRP0PUjLiA6OalAUK4C};bpuj6l$NJo4_6r-H&UUK;`3)8rbRNLKIY!` zr)fVTufBeYz3GdzIEIv|2ava4GY09*2-T|1E6AL0w0af_5h{a^MENdMUqB;PWn9U~ zV~sCPWi;1wB2=b&Utfb=V?F`nt5aPOFIi=5p_N6d5PUZJu*_wP%--1NVTY|c_5{&QhsE;5$jO3HMQ2b$sMQ<)kCo+o7{>YRbrmKz*_SO zw5LkZbE8yRAVryeg^V`Ey%vZ~Y&Ftq*ct7uhA1`pjO8Jr_Q-ml@neOygV!lu?g z2DKcMfmuc^8`5TF5at5t)I8Pv0{Dl3TU6lZLR?SMk{{4fNxsDyyY zTUNUdF>Y9@-y2|dHXItT)^0G1cpimx3{dOyIkpQkW_nhPJVEv=ZV^pKS3n;+^C`h%n8IPdDkkuI3NK=)QAlrmI7R?3xj6hMg^3qXM zHG`QxTbd^jGgO)x%>7aXT6sliH1!bAH~@1+LalFwHt3bVlP&QOkAsJx8H)H2Bfbr9 zD^9VXV0Ao1wZC-1Z|Jd!qAW-gl5|(E$_`K*w+4a~E0R|8TA}l+Czvl@H^O`ym3IUI z`ClQQ>Ivo}3`uk_)%6NfYlf{2>!mrCP^+QpR7fdgogus9tgOWV$k_C4MgYo^Mq|}@ zHq=z%1jN{PR@Pz?6xn)Kr)WskLDoVOY-)W|^pa4v4l-N4kq=Y0THQWYWd%Avgo;-Q ziuDVdh%gQjayYa@iZR@p%osj^v`pCd3fby>0AkgcCs?Z`mDgX*c&7Y~%|W~Z3N3PJ z041?HA7qu?ql&@z8GVHrbMep$oV3-0IR9fzUOSN$bk;k*xB`Rcnb0wX6A^lM9J=9j zG^t617wOx~f_McopB1MY#;H!>+rfSGg>kBJIK`Li#c`@*MA2hV+peF8Q#t8}V5GQi zzNNO~F*c?=yl6i{59^b0Dm4&}5u?ph@W%p9LKSU==b4IjLDUE$r+apu$Fb~LSKVc! zOf6Vfc^q^)e+}E}1ry#Kezkrz!n1i6gtR#%Um^RUx_&`1j5qIcQaZEOhXkD=FwNCT z-xjZ$_U*cdc3xNPdZ=%!g)tkJ;8gwVrdB4?%rE%DzMC0eaz8X9U}KcDO+UotQE@xcbB+r3XEx*0`c#5SiuG7+szve+B@Ij) zpEiMkBCE}n2waXF#v%ibiR&N>LY8$_R>TW&?2gn~3htbaN>q!@ZO%8~SLD(c`7Cn|&%5x`G_M|K^YK{t zcf%eZT?*C6Wu`)IgumDv6F12*F)(yYINrXYW5V&4v>A`avhG7UQxbLSMAazX3>*(a z_&kJt_2@(lV5O+qi;;X=KA6YCV`f-%1UjEU=Zx?&2qHX-pcl#B-*qg@`K#i5k`6vp zP(3S%je!sj_5ZG?wb zd$JXM>y4GzPhmP5EoFvXW%YQDb=d3YGf`qULYYr)h7`WhcF{~4oAw6S|48e@!ezEVY_}dNwp00ZwPZ7Ne)ws5UPqb zAgk{}1V#;K-F(Yn^YaS`o#{vHB00oHcsLI;7e-3Ukz(qE-kn&z12~`>V^;6;Pzrws z4xK4q(C~mRsQI+V>^^~O5fbk+Rm>qQRK?#z#niLaHy%xx-kSyEIAtm?RF>Yn7npG= z$A%P+XI2Ss1N)9Djto+Hx3K+RQ|1^l?ce_qNLWZ7K`d>mmGU?fGsP{b#IWbPUwx9S zpG#7yK5O71q~VLPjk%OB^xS77=hxqqqMpQ~6umOS;=6jgdCQU#l|P~+UH8tw$w5yH zi_g^S^D{I1rQvK=ge5(c!po9ucniI1bQ+(|=pb@Lro3qN18LK zJufUnb=HZoX&Ft5UFHzjMRaK$-mbdhy@<^8ZZ0WoqYoH^;kvjwwN+7`lkf1B8D&Y` zk>!#+B}IX#dj_*tdPd7jk-oJ$wW)45IWkILwmUga$MuYgYTXYhTKz+DX{t!#4mcCn zn8ULT^}Y<19;tTgyXsPsboVTk6^&Xo&Qm`+OSMZOim=*So-rHO) zQ4i|@Eil#iP~X-KUuOw!*T&x}$p=<-&ozj|HY-wKhAI6s=wtnLQe{}s*1?t=I;s4evVt@MTd}hU2Sz6J(kC}1rPn{wMZF%Thri}&tWWr2efpPS z@lE3}P8r9Ru!E&_NpZZ(!ls=>iB5bkGAXVZkjKL!Big0HlHxdKQpEM4tqb0ZEJ$o- z7N782IM-PUXYdHX9ZlcExj^Cp9_EJ7Q zG}Y_VM@f0Fg!}YYy;O<*sj*$6r)1f_`V*a^Co26cLoVwO?b8nqiTC4Ky|c~-T!D>c znuE=csb>&-$1(ga$Adln&tPMX6r&Ckt?&ML5$rgIzpeX)g*DOZb|m`r@UGDwzUN>T zw@tBv%g0HBj^F9H7GMBV|tC@9)gu`nRo3FoFpV~w>yd%}8vz|!`84D@rT2De5 zqc+Ska%*e%Ig#Il-&x7|@vO+_`nOACngn9m_~Mvh&Uzh3e-ZpN%axYj%CiQX6MiB5 z%rizygy&m)QjPjtF!`-Qi?72KgYPr`B8!(m90&WhwOMEH3vUwG`Ok9e@Hzgk&++p~ zva{)Svf^>ha~$){cNiJYMTs9d;7eeRWB4HW*`-@x^IKhQYmz>-FFeV#PpB;2t!vMT zv*8>+AFFDH_$!Q!p4L8H@kV$OXM)BtnZHAYy`OU_zg1$zF;C(co_vnK)j9sb;^(fZ z)!Uln@@HH9t!nYpR-!e)y3}LoKl-YQ%z^@|&&Uf$^%>X<=ialAY+86 zS%YKyt3d`$I>_kWL8?3;Ih=ryWX$_$h3s|ZJQ+)7$ElnUVR36ECxjT$4D*QVLB^0a zANyM2h1fG1#-%8+9lndqqA)sgGl<6W$L*pUklySK8ikxBWLUbITl2fr#r8AK)HW;eF z)R4?npvX-Pv033vWkQECvRCA$h6Ymub3trKz|;`g=?$h<%Bg`1-b|lL6f&My0!Dx- zH`NSQ6Y&Fg0XE860c7t){J^DSQ)3N=;y{No(=;Mys8f1VyO`vf@|)66Vz5*l0?t&O z$Qh=j&9D-%l4%`|?6f8QP69~ZO2#Caj!j5rGx0DWXJOAY2B~5Ag<~KCC?tDD&XUq- zQ(HO|R+e<8sv+m=ai(d8=tqa*!niaqyLmF(9*!dfnWh&AGs+5KR{mAOG`mrlNt=pg zr-ti;jdmy_dqvLjsj2vZ3vf>*3dvpx$O5Zr_<_3&8+EdTy&`W0zhg*?4rOG=PA+vs z{~^(#j0`)W{@j*I)A0kh6&n+yjO-P8K3L7b58N}@s6!dqEAk?+x&%LPd$Cc6GO}0X zK-^W}FM9*~bEe~gk_1qq=7i+1VI{MA;K*K)n;rmpM-u{lX-YOja-)!tO{nIExQWOq zBYP>2#ukN5jn$VG*=d2XU~#H81TokpH$KZ=ksI4}qKuuBJ}V`e3BZlSM!p04>x3DP zg8=0`CQb4(Xassm0EJ|)1eoqS4Fb6F*ch2IveO;dFP)}lgHVSuvZKSwadb@Ih7M)q zGu^>-;`xxk1+dW&Wn{0&*&vFs;I6_(9m>dFk>4nCmOcxcbL?u7Q$}`6*;>g<@B0r9}Ivq1;~PoB{U_F08{OY zsbX38Vq;{=$X=0~YM%!I++VO!hcdEP;I~?m( zDvhB3Q3uRE%4e_~ZYzxLYjqHA4(`{T9vCgbo||KoSK@G0$~b<>AqmXP4RP@(;bc8` z3aXRG4%{?K!7TbL7uN|#LcWBIRF`4T%}I3ynRN`uXUCGjO!Yb!uM=jKtS7_HM(hLp zaSYu{<}eDkiAvyN@FOnXCd^T4CmDvg+~elh*+b5x70Y^!I$##;fQyfWIAF14AJPLu zpJLC=G4utQtpazPI$#>&y;6ry3)7CmiJfwmGKvhFTx4={Z1Ncy=iRAfUZ_uM6gqA* z7(qBon3ciLGtf|5?72CH^2svxbETRDX6CxMxI~zl8%Tzo!Ps*%b~vaEr-ywEZWNWk z&A?+_JW&|&t?9yTz|~|3>#*nMWNslj3kq;csFM{MrkA^T6?iNI*i<)204l)Zmmer+ zVs{D`fj5yMd>DIfPGVcg*-(JnMjf(VJu`kz+(3}ZV*ri<9X>0*eHl-!j)=1thp%+; zwJr|2c)g47(Mw^j@I9C4Qx|{fVh$!wGJjb5{aNv;aVh9Gjx1ZN+3{(CE-q0&7oYFq zi(Nd!#eAmFF?YF(Z*VbRzjt&VaIrad@+=*g9Uq=?!WHm~izDl9gi}@UsV|uQOc`M(M^AR+M*Sh!?7jJa&Lm}okg87dt z-~|`I;o{F-%==_cV!Su*a0?f=b#bAKi(TB)gY=!qeO&>ATs+*x7r1!5i+PF3v18t% zl}Eioc{J4v^yZAX5f9B%v!2u`Nyuj)(UygH_ zFTOe4!Nnym9^&G0E}rV*Iv4X5HL)46u0QLsZg=q}7eC?R=Ux21i;uhb7Z*oGoJq{$ zTVPIM3Jr()A714;8!*(x<6X?BOP$DTT+A1z9QiLU=DSReyqk-wT>L>tmxpiOI1zq! zaX2PLjy%b*J~&b3B)8_FgUbi5;0yI{b@6FBt3ov@kS@5I!J>L28J6j8Cbtdo-9|^x zuE71Y)_Ow)t{Jx0&tn%S5q}9Od{?2msXU!G2_a(s0<1QnJYf}v9(3uyOO`4Bht!uT z|JNa%P_zF?k3_a(&a&UdX=Eu_u1nsIED4O;BI%0O~n zNPnbDKIW`EU`=)fOe2fYHD{Hq+sRyiz}*RU7Gn>(be$dbT%7eC|Tqb~kg*pxrccQ$giiwntlp~hHuyX4=Kk!iYAoK{p8fa6b- zGag*Oaq$Ef^V*hE6IYY785!Tg0Gl-}_*R$By=1A0%`W-dF8+iZFb#kgMO*NRWo_%e6uiz_px6$2asuyvqIATY9W1TfiRe@K|!W?giesGq$qAdc^enEcX6qU`-ND4KE$7>hU@IL zX=%ZU_s8nuwP~>#=5mB&imx0vGr8qDyK8D%;98gHCKuo8;)lp+Il8~N*j#WB`O_}> zE*HP(V!pWG*f|#BamJ{*`XGk*!68TK8yBB)F<((|=45=6$YDM%;;>&|_njv#z)uG` zqV_KC;9|a7;LOkZyLgC;&v!9jEWq5$xT!9l?c$mcW3>ghBAB=-P2Hg1tBy+>eFsBi z!gZI6H@TRf`Ehjkrhqdydfvr*UA#}P-G;_I>JoiLmbt(Q7ysyDe#pnsF;^)>KY?p- zVSdQRVSdQR;cOQ-4{>NP;*r+~$&Ra4}yUa3(G0tJpGudB!C-S1d%%mj%q+f#t_Hf6h!K-gWVZ zF8(a9x>v9*bbTQvVa3ZgFF`sOAi=~Ch+d>r`)F6OHbj+~$EaoAj=$+C?5-6fCUC6p{9wqjh|AkO7!9HIC5 zQc}xWxn%h+<|lg`BYd~Q;Xy9uXYd{QXkGDWbWQ<;H{KTGNtwtvvf!=+o7KAhZ2_+Qc!ImOCFzod z%9DZ1J=QX6%Bpb%HNnOD;)QsU%%kTmRP8gcl(aTdOAgh0sRj1vze1~^8N6E-n6O-s?;`5tJ;+51Dp6242hV_F{jT)+W>|l`Sp5{p;v6Ik0=Q-_&LuOy zaJ<#(@WmYO(Ua-w$g*laMaHEjI&+a(mfyQPkYmM5cZ7^(9^JR(1iAQNMkFcBTplJ; z0CU+?GR?1TIc>_1TRCT2)5GOVI-7DiFKV(>XainolzX21n38jDxhxXLyK{or$^dEP z{bU*CN_kl@3t5IUkFQIuOhbvCPcP1Nae$2Y%=eYTJYDeS0p&Eyn+N1vjyGC7ZNNOU zGoS!`k8lU@X5o(DzX%tD`3-OC_XIy9+!wq{co6ty;o;!dg)acV2@WvwMew{M0Ttj6 zgeQYP6P^P8Quq?^uVl10Yu-j%l5@aO!pvyAa5pfYXQfUl*nG?nT*k#;mIRDL0B>zj zsSeCr8{`FG-r6892J_Yic^SC7@JjG7GCCbIG+LNdeUWfeaD{L)Fy{k)FY2Fb#90!M z53Utvwe!s+8tnuQ2zLQrDa_JbBRl}SR+!_V79I({LwGFs9^nb#&5qGZc>W>*tm-F( zr-Ppoo(+DDjKc{#Yrl*6w!B{stXMg%mn0@FpIe-9G3nvFu z;_>Q<2=NFoCkK>|0-I0$fyaZBMLr447g?R}NVaov2Vs`Di!jP*^%CagE;m23VgTYS=4+V2>LHR`ROTtsZuL;ir9~7W$evEUnAe3LK}zFn9J-zChk;Q?VD5&Wwq+Gzvk$2OcVEbbO&AKD{~ z0tc*P^dKg4{gE&ue=eK{<~M1mlMnu0xD%K+5GiLL`a_rl4sRw>-UI9v?gvg3z5twN zI1qYEsgVR!BY@wNVdSOYR>D_;+Y4U@?kIc{xQp-|;KAgq&`D^7Fe<|uBitN3LAVvT z5`UOzB5=r@A>0*QEzAuP2>wC%2{7-_vU>M{e-}OiPQ*#TpACRZaX6UxVwV20$`h+w{o;?+7q3*Y zDpAi^iEDzX`r}s;2DC%hr(1~4nFKB)%Or3W86AOcjivLlQd0Hs`y(6aR#&Olbk)Ol zGo7(YbytbODK8Juvm(ROVLyIbT#kNcm5SBNUrR{W8J8xf>mG$+>H4?G@L2O^9ITbt zu$-#Za+OVih_R_QwBQ9D2Q*`9%_fo^=YY9EIYf^Jk8)HC(Ct5r^%ux z(okOwE#2`=Uy^?9YSl&p4v5F@Scb*<`T zPyF|CQHOv0`1i6!gTeiI4L!lWhnuPQjW=spWXRiC zmtN%=ru$Bd^##|wm9B>mNcHH`n$13lD=zg za!VbR63z%7z2l>VWV|dpps9S)z$-op=jAxU?tu*gI({_nu>ekEk{_Hq@Q^K%=OnR?Q?D_fEioXGg~bKVk09JRja{tUu}#lgwA^-4+&J7&==q@3}4u<`OCV zPVv{kLaR_FxN>rvSPv5ep-K}x6+4-T1h_N7XYejDCiEBUl6`TXBA%1^wz^=7KU3uf zm%p2)A3hcDYxm(8EQ!P_Pn(WavmS@v$r!&$l@_vE{7HhZUBj_w3zYAQXD*+*;&H{> zK2)FyuubzN*yu`N0^P_Is1SQ6X@0oOT_8Rw_ntA)WyLur*1^OU=(0|VTqYhk$Hc1E&TEHXUrwIkDHkUlJIoRs`gmw*)+u>4cya?b#8+}eRUh4eZWV#W*$nH*g=EY|_Rf*2-5|fFS@ps+e zNlUy=jGz}9w#uGbF`16 zZ~FLk*A#vYopv0@Dff1L>UNdX<6{K5Gd>MV=vV}^!FV(|W#_lj-6pnSO7M4Gx*jHe zILAa?rDbI$g-mene2Ze6FXO+ zkE1PU;(V8hVdt258B_2E<^#Pwcsbc!j+2-I^0Of{G16t?A~C^3i0&gC#HaOvU*eMz zxoBjyI6?2|MjKRG${dJY6=!{2ihP?+uv{V-L-@(*jWkW2EJ27nH>)u5{1h6@4Tirn zwR-(I7M_8H)20C%tv<)Z%pihblP1RLQyWxf+_nK=bXy!5R#`Cno6PWSsPL;y{NPD^ zjkxj_T;S2!cV#B&x;vHoOSx&`ojVm5n{T(;dm7aryi+~z_r}Db0{Gq3jb44{>dbHP|Jwo48#W!(zfgc}Hou$LJs$Nb1f;`BlQ2FqceDSmqDowt48mlX} zsyubM4sKO_RGfZ$D?V<~TE}ivL+xXcdi*wZQG7l+o#p=)NhvGoM*ZS8Jm0uf;~yNG z4CF#7cEV=}Pw~W!eHDGn|24Gn&CDF6fp2EshKv{bXF%4>{{T=1x8ss3%&ws1&`1y66a4Yo{9{uqN>oXYRB)gt}s9yi1YM{30`X^N( zD)6f(RSSHuIk8@KP)&5ddetIx0`i#9PkjliUnI|irGzrI9&vxoNYN|n@l~n0`e?oC zr$*_l?TDrIsO{={wNZbvUF}s#`q8KGIgihy^>0t13byFtr&UgmwJ56ZqBmfqySEIP z@=a`o3qD8mg_g4fPxF6X`R(Gjz=}s-{6}Mr+SBQ#^?Umtya~7!_>!`|IDIQDg0=qV?Dv zszQ17Gdr*zDXV{HhZ?TzUt@HeXHl=W=@HMWOHsZ1o>lqwvFMwh!xvfR>qgJ1QT}5v zrYbk1t~rgg3ZILtzv4MHPN{MA@9#t;`?E-W(evulqh zmfo{lHM5UJ)xWY^Whwg?um1W))x6DdW+2nU4A4+VlYv7xi4^mbtq5t1wp@eaz)-iB zR8#f2p74^&P^;<}zNAV$>H+=qUeyU-lR33ljm7S~SD~{(&wkYi@1w7W-t#K{HFmNd z_nK;=UZ`LEnhFb7m+8w6sBHY3?ZyMDu;@l6*0dXP5&EuIJ5z(rSc4+?h*jF0pD+`_ zKpk-qAF%1FhaALbNEhkF2T?sk^-~8`Y4zVl<6lkx>{r(7lj7}- zDRx1p`X_SiKV}5XqbulgbYJHC)5>NvEM7SULOW{G_Z-qIB z`B4~4O6woOmN?~@=YlYcKZxlWVzD4*j7|$KyE*cUz2G6|` z@ILrK;ZMN4&_|umz)uPv2k#I*0e)Wi6qw6q>i+=VC;WHtA>rS^M}@-_+W$lGaKz`T zn2}?_yq-u-0P~?GGQY9N2{)N{=qn+m9M}=F0w}&`j zJ`?n;1hhi{m-~#s!GupXk$G8!4>0k*FWpBj=Bk@=jKHD)AOo|Me3*%H7L3bkay0l4 zVN`|{ZtkKX04H|K3r#Aef)j;#vPu(f2+kD7nmY6!WH|ffg84ub|M0Ip*!%|>m<1>i zc}H-6;T~Y~7i7@EKU8BRlYmn27~%fl3BtJS7y1t}M7S6{L*%o-b;5JNi-qTcmkIO4 zvr-tVc<=`8^0p^;c*ew!pC3u7IRbcZ!WzgZs^`OW(a%~a58O#T%Xy+F24q*;r z&kOU!wnumac%Se_j{k?m^B@9_3UlQ8Q20^s--Mq8o12|Tj04wil%w}?%nyqUF>5GV zcp{j8hd`Z5aEkC$aHe6@KdUiY0$7bLh3A0_g_nW52wx8FCCu9DCwx8lJmEFq^MzSM z{MalraVz*@;Z5Ml0r5Nn&vapq&vS&I0P}7qBR>sZD*POHh4Ay>tA%%i*9h+g^FQAi z_bu>x;g7+03kNuqZW7OF@T0<5afklc43WdY=8w(5d;w{v=x}5-|7!+0KZ5a^$hnF* zDBJ>kM3_%wy)WDz{3-v%gt;q(=PL;)0&{^&d1vrX!d=0?3J(I?7=ft6x9FpU$AaU9 z$AgoFtH2F}`5pZ%;iVk^TZrds1hf@i2hJD18{CJS9y-?f&jSt*6K;c=8!em%zDPJ9 zTp`>IJXN?9Jd4Z^b#S&*D*?m7{Hq!!FdA&`vVtqXSBjiH`5NIVU@pn2KLf0VXM^t$ zt^wa8%<*8e@M3U)*J&7eB|J|EvnM|z%$~eU_(t%n!nc4A2=iD!EPMyp+z`d!-wbSS zh=N%Y=7uP^1K8XU%|QEifrkS#AFtq~(JRa<;?q);_XVd54*@q89tmzHJOSKVcp5lg zn5E}`rqIq3aCc!Iy1k>({tUPVo`Dj;(hn8ps5eTOquw}SmUyBtr(#otw}58~Zv)o| zZwD_F-UVJF`~uRqcv*^%TEv2H5>5f%E}RCwOSlpE0pTq0Bf`zWd zjA7LOOnCTT7t9gI|4LzYoEgGA7gP)LG&*1SQZQc~X53}q%Y`oo^Rgf1>^Ij7-v(YM z%p>KtfOzhMXQS|=;QNKyp&k}~9L(2_X_Ou61#&}kwbyz@m=hVkYD{@5n6Da>)4?AI zXMsNx4zz;jYw_fP`PwlfbOrw?+#MW+CAagG4X;>|lOgBVB+2Zg4TRZOvV^n1Eri)g z+X^$SLNCXEXcxd!ECJ{gxU?8D%3eB*jQJLij?uz?@I}HbS%okv#+oXe1)e3$Le>g1 ztp&mzkiNzDn)%d>2Lac+_%3o5N&@)r>@VqSnqrmS8SAxF~W(WLM_);+cHHb!+ga09XEm)zNC}*dO6y6Btw~i^l z7tFu#BC|gQ8jEKqJk5ol2e%S_5!{`ejm0FmxA182K;bdqp~4q~M+ujM`M)HLTLGRZ z%!2W4Ysdp;`8`ttc#QH=C?iyZ7Yf&aFB4t}ULm{~%s()pJ}0qjgs%bfEo{oK2d@{t z5q!5W55-M8m>VUF`Vg?YHXB)kdyn(%|*gTgz(M}+r)`QJuN zYcKdy;SZ6%^_6%&2A>rE0nB&78G(yYUWy~fgQJ9f;CNw9zxV-H>TogIKsXzmCEOa^ zLYPyrw%`CGa5Y*e0bGC<3-<)`#dGSEfcfG%xes`daDVV{VJ<)~5at4OyzofyB;g6* zX~I(!+JClq_|>C2;TrH_;T7Oz!mGh6g|7jx5xySG`#sFu8Zhs~kTv*0VSXiPi!i5j zPZ~!3-wV$U3Ai8pyzs-|J;Hwh?-SAM%W837mfo@5%z&+3G?miTH$o?B5;7Y;PD!efE@6Z z!bRX~gn5Ya%L>%*4c5Y=z;_7qhUz`S{71P5h53OvesO_uF9+8PUv1;~|EqXzK)`O{ zb>LTp`7ZWBVSWhii123c`@-A7p9=Ga)>p!O2<@csF7Qvnd%(XMM*AOy$Hu&wx#NAG zDB;h*@xsT!{5CjscpoQII0c+7+!&lIoC|I*%v(1dg^R%5g!%dY-uyNMjrN46Ot=qt zm@se2jTYv;n~Q`iz!k!LxNWNNV(={CE5Q8sD%!si%)f{tUki59ZM7Mml@h>PF4qb_ z3BFPIS@6yE_dRI8kZSK&n|_D8wz}1e3|yxdzlgvR{R+HljLvuo(vvsq z886xMRc!r7FWHecl)v1A&{4X}EA|34Q$O|!eEC}Kh3@gM^@zQ8YjwN+XnRDGUbENs z**i|?yZ72H!b>M%#;#xAYv8o~2dwYzY z@hW0Hi_j1C+=!$ky@|mK^-~B&SwF%qyyOb>>CoSHkI@CM+3r6>PWKdd=~Tr3LROyo z`(Cquh_J7W(zm~97u)sW`tX}}?{r>jjqq^#8My{O5gyJaqwFhm`$KlhaK0lUkIU4B z^K$h_gxY+JD?AeETK1(F8p5M$fngpGFXiK3hWVdc_H_J28wcCe$#U#E3o8H8)U^3S7 zU5<#JxVZ~pGm(#eS&6(Tpc0RT>(Ab@`#0Z*B$MOI_ykDYi_ncfkA|(d$H+s-D(*`? z{B3(=Jm1@jpJ@J2)v}B9V{h9f@qGFsVaTs2pcQv2QvdO`or;e1*s zj$`%{Mv%M2?bH(x9QQ3UlTh&-M1A8H>D!Lj%?kL+if=$D%>op~H;}=0%JfRhS4Q;2 z@x>+IAaaCd=jm^c*lpr?yWO83z;EoUk-FtOb{G85M8!LHy4s`{zhjTIe+$=dykmEa z<9&Ajzzk#-hIHald!YR}9yK{?_ZdmMY9;M9c#e40O5`Q8L1XeQ*Mb}DMh&W4ZzO(3 z>1`}@gTqKwZJ^19a}m_2C6ZA0J`Nn9PaU<-!xKY2j@hl_nlZ}6=CE&N-LC77**T3& zI>VR_T}}>uqOpyHg=Q`5w;i+pia*iTH6P&UdoDuj5A6Q-;c)%I2X+H|LHd^u?BA2j zLz@Z8d_Ck2Ooof0=l#eorT);5>>tz--REPw6$?50WBb801=Gpqf7UkR-0kIrthd#t zw{HK5-P-;wLSOU=YUJ%mecvbcles=9HyF#3^_hq~CeGpsz{}3=<%@dWUV{c5CLT&OpA!kYRE z^7GyQnNpD7Ngwotb+ZeL>J!4lrso8{#POw25p;acl9fx>1V@tdAP8@RIuCr9x0;he zI()Rzc}4p^a!N?f=k@u>0~WHDdE5?cqQE}oREr34z+6F!l>lDI@eAjG(}nZFJkK(6 zS8y}oUSOVcDIW;#Mn(b1=1~anQ1AeepAY5-PN>5%b!1o|3R1Dng6*@uXERFALuWZxy}|-X+Yp&-;bT zgAWVW0KX|*8+=;0A^0L#Zv+_%!~0^vXYi}Slfj=0PXpf+egyo3FlVwnUWJL~Gx#6E zPlHXg8_Ji1sVG2R4d$nV$lJIO5GRJcut*T*ou(2Qqd^*SnIW7Gt|_b+428K;*+{qv zn8&NoZ*y=bVb-@+t%jT{SN*jd<=+E_A>ybnSgTgU(NORNk+Z(FYBl7e!FvA&n02pJ ztHBe&TD2NH8LU;S!HhT{03NWe*kmvyC&fTKZ8MUe}Khz;BUm@Cos=u z;S1gzumfF;+!!1o+!P!u+yY!gxD~j#FlQj8h1-J53$w@Jm=-JqAW+sv4Y6Pq)D~tH zG!$m>HWg;kJs`Xc++KJ!xU2BX;NHS4p@G83!5sM+?*&%K7%{v9i%G(lzz+*w2G11! z0Q`jTCt%*X7|=EFQsL|1mBL?uUl9HptaZBK{tkFE<$V6S2ZPq>2J^XF>vV%{u-54Y zb1{%}9KQO@f_tsg4XzE=I^AHdI$skv^}$-F8}f!=td!%uIE5Z2ow!1SxPMS$t| z1pR_tp_}OrukFBXI`nIne&HnJTIBGamm3kE4VaKYim1xz~k4FIxvk?pVe_pF^8(|bzy3!Hu2(A_v$(-o2SEy z06Fy>K4{Lgtmi22YF3^vZPny@jxttOM))adJMEjPqp-Ih%|Ko9Vd{`|J)6&GygAE+X0q?s3bOi3l-Ro0R+Bs6qhU(dNj&iX{v3%08?|67|Z&DZ9 zIhvN4>PJs;bVUJKBO-w|Vl^x-a@a05YU@!|tG%O|^=XV6(%w-DdWmz|J33>-@|E_E zEOWW?cW{id4tdp#4vq%cseHJDqi*(Ygy|jU#QenwdIq)6tO<{UDqg{^sx;^t;u=9UbY7=Oetye(I`E@;5_L zC;GXzFu^|(*&Xla36A6ZZQ)_8Ve$1$bf0SoB8nTMd@%>Ub3igt-RkH_FgGc?lcTOV zMCEmIr1av;3DeKJjOBj{fjIo1LE`jR#$Ve%9Ie~szk}j%`%l1)$A1a|M)5X{HTpk}{BwKns(}UYAr~JqNEf2cmoe9ZbF;-9w;qY)?w1*KQ_jVRzEy81-FOM`EKFQ3`9y9hv8(>Oolqt+yTRxB%TNx7^jneA!)N}*3D7Q`aVjH#?>sVmUnYZuNuJ|PCW?c zF6SHg8_6*BgNk<|;y0{OsIR~r-l?M&sfOJhjZm(SbuTE_&n@JI<@$DalW}V@ za#7QeJeTtbtgKzCY7a+Q>u$8_)WcCNG9_PM^1v!X+AhPQg!%_R~%KF|2HL z53;gn5s|ld1H|Tx*7kj9?=h@PXp`Q)>tL|FDz}&8adWUb(aX^|`Y-xeoQ5`OMQ5m@ zy&b7t7PGG}<2IwH=u}jWcRAT-L_Lpci1)5&hHOSpVGXS07ebBb4;jWP{k70&wjS@Z z49^okGJmw;T}_UR-lP`wcH|-PuwE|-R9AaDMwk(*Wgo|b(79249I4TD=pe+wrCsz> z>Me+h?L(@)ugyeE-J+jnJ`SEharKIREm}GII_g+I#Hif9juPfD)w{2wSX6IVnm<-W z!c%IfS$)x(uEna&eI5B`n)3H^WSG5GqkfJSe(i1~-MJ8(QThe-Y}ob;Y~iR#e@CsD zMyO2l;B7cEJC^UQdh|z^HPyQQjy7;{r@!M(m_h>_$uPY?z)=aOdRYVYsF^p=k?c=H zX3WVZOW+6wxhjo9;|5~zhM(nw9O-5w_2wW)HFJ*oX^^9*Ia9UE$7irjH9Wt->o?l# zG&F@Ojnt}q+`I;XG4&q<{|KtPY?R98}sDqh214+f^fVVz{GwIIVZJ z^&@DPD4>iHjuw^q*30xc84X&f*0D5KKZ(caN;*8BlX-qO>|y-~#{gu`H4^pLNR=Du zxRRkA4bqNy*l*65u@en*kdv8v9_A{#Jq&g-)z*@JmFKAHqa3wborBSQQb&qDuHV?3 ztLK$0i1bMvo(DZ69Nv>UyhbpG!<%0yyj`Ol?U5#XG}=H(*3x$8OaysPJ674F9S_5H z$3M1Lwe49oIx1Q>qeB^E z9TBGahN?5pk!f~NBgZ+~MR5uqb((o@I$NC_hkN&5=z>vs`nKM&S}@*`oiZH>PprqGc?N1UJWz9Z@UkZujaRGd;~jlUaU4l3cAG9( zo<@^xsJmkAXVJ;$Ue#v;nqKSB6B8T>rQCm^@Gaw=|K;T;h27e_ZY^I4Yl0c5Z#)PirEfjQQg_ZGq+z&weor&h4v;01H;KnvhX-{PiTG z(D~!$y#ke{d1QGeSVKk|-=KEv}8~kfV0>!OR1u9V7wp5@3#rv3<9QMoILuN{txxQwW4s$vgZHqtsF@e-D_vi4H1`gu? zPc-mGk6&Mo9Oc4%oLoN4&$4q@2s58-&5B`OM6ML(4EEH@VZKPN66Q)ML9=R@^%>#m zVSXF(pqUXiaKVx5bqMbty(*SofnF6$tU#}d>wzZP3f*IT`A4scg;Aha#R4eMt74`L z)T)@z0<|jSE%=XK6*EzwSH(0H=v7q*7wA=GfeZAiI8-;5M6?3)-5e9db)&Yz1Hhey zhl6_xPXhCuUBGUL1qB#}h{bg9C}CF31mP#Z(}b6UgTgPV9rf_#jZF|O5z%I_5`Go@ zobVp-df^b5ulktY{b0Rx2!0KGgmUSGT8m2fg2>V544yGUH)zVn6$c8D2DBD~4-RDZ zjjx1Ri}%Rref<4hh;4*MIV#`q3Nr$~Fumy2KLA@sNs$)?rwW%~BQ7rnHi0^187^`Q zaVue5{?UYD4hl4(I7$>~Lb22L6Zg!FUh$)2{Pc>SuwJO+w{n;Rz2paG1bWF2%pB+? zKQJTEOMYNRpqKo>%*|Rx2IeTSn;aR=@qt2oL>RY0ZG#D#4UQ3h0vsRap#Jh_vRIsgMLFR!;3~ow z!PSM|1=knm;#m{nkHK0|36XsQ?kw^zz*=bu@~^=IME(tUu#Ng>>b`?v8Z9swGWUFE zM$QI5E?f)zlyDvJ65&Q*CEOJJoN#mSdf_(UO~PHluL}2KPu(Mi0bsp4hlumRM@2pg z{Fd-!@LAy*;CF=|2Y)F16!=r&W#BJ`SAxG4UI)Gd4l1#877xc>=UTI9ci%M1Sw)+aQ=jf1Q8`iMptA~3blM>K-DHmQ$j z1pC0P#B&ia54&Z8I796!Og)hS!d1Y-gww%1VT10ggC_~s2S2PC<(~_KKDrT(xDV)Q zT117Xzgn3I%=6dfHr{l3vU7+7Tyi!#sIoG06r~z z2z*ia82EkRli;hu9MC=|bK53IsGDN(9ry>~pTPR4N4Q}Za(Un(COo!B33G148y4lo z!HL2g+e-_NJlst2!2c)<%9K+j*t%rFBJJS@JeCMdDaM{ zCc~#V!aZ*`TSUG9yi@oY@Lu5+;8Xl)HdQqtGtScj%v+>ZLIM{7e=Kqq^=HED>t73} zfNu$>f`1e)2mVu-CF;N}n&GoVBZO-))$wA;0~Z%&zb`G^5?ofeCpd@9DGh#F2}zhM zy*xgczmA1i>lAU)fZuS+g{Omqe3Qc8Oj-ypBgcp3D+=*uGK&PiR}1kQILK7o77xt*ufkQpJVApIr-S)`Os)>rsygff_-R!gVXdkI zwjkH4I$$PRtLlK!84RApM71DRU*iI`9k9`c796(l)9N{32Bg(N#NM@)W}X<6>MPrvUJ~UWm0uPB0}L(D!1&7XFhkZu15|Xh_dYkQV}Oa_7%q zh!cdFppwE2haWnmdt8k2!VHH?#DOy5c|$N)3=FrKFndI6VK&ST!fcG)gd2eS2sZ`~ z5^ez=F5C$`R=5XvvhXl4KZb}z1odm*$HZb3EanQ20WTDu23{dN6a2jJY%pIoFgH(v zUlCpe-Y&cvyjS>n@Im1<;5W3|4m_`e;iOn>1#8tC$oGJ?>J4}w_!DvS8u$z0Ltw3W z12@OO-;4ZBu-3N0Xu~$)Mym~g*?6OcxozBt69ZdsDPi;wqpWZWxUw+2Yfa${aDCw# z;Ksr=!7YUwg4+r=0rM-5OhjvNcW{t~wlIvOMOrwee4~Z(5+7S!XuJQ!=}aSD2;Z7iOs>2(wg5 z3bRyFg)z?P?^H4z6tf*KW{eR4GXq*N2Fyfj#TYOT-w$iXz`(nf){FtO{jL)4?<*dY0Vfg8;jPA0dr9Lj5z?a z=(J`G7zGg4i~-|cSThDt39L0^z${U%83ShTuu%jICmYNUYLe@5{P&BY5iAmfn}fB+ z3>k?hCFfJOG?0oDbHTGze!n_(95pFpPzvqd1xb?k@Z= zxUcYBaK7*Yu-34F-(}!&B3}!hBD@|vU3epSmhc|%JmG!d;36>`fMKaHN3;#(3gJ5& zU)__VAm1sBS~2zs`@pXYb8dNDxCmHl+rTf|(*=>US}%t=d~C}Vv8V!z>%!~>H-y=s zz8B5~|0LWP{JU@)Fc_RT#LEtFipQo^&qX~J{CTB`=`p8{*`naU`C)_oowRSwVLn+tPLdQg~mwvNKA@9x6M;J(5f zpz?(=z!@Wi(H^l4CmcRU$tl7tmB+OD3?j~hVV+oU$Xq1c8oXSXE&N&G?%=h;L%=T! z4+C!%9tqwh%o5r!%n~{*9Apu_DFznNDPb1T6*4N7C3IaF7vqL7ZzTL=EZy)v@{@29 z_;+EJ78@Ad@IK-a#@J;<1vvi0BAaf+qCPlLI2T+>xCOY3a4T>&8TU{$8KbVS?v}!= zK7NyyZrETS6lNFY_h~6F&+)&z7&2hdSC}`9d|^(fMhMphj}vA>CkZzM&n2gayWB!y zFXYRFqrt0$F=iQS$U%5usyB!QyWAGxlHi@fY-sz0)4;C_qwtJ3gsXwyBO@nH@W+Mt zGhr9xUkgWotKJd=`}dE+Dd2m;tg}CbD`3ZlCq8sF-&w5`U&BVvc8>5sD{I<(CwC5> z;$^H#T7b(MH4GQ)!gK1t0%sejY(*@D)T6rdGF5HjB}LuC#k#UywOZtCW8Hr-v}%!a zuZazd?Uz7)?IpEt3H;`&J1}BbVcye_?%SZAej2W?Y*5#Ey|F=6U+Qe5a-YUmF6J+F zHc^Y8b~@FirOwv)07dC#@L5HT!^OI^QN6JY;jK~r<&f4>{c*9*yrOn4ht#LcXCPgs z+VhgA*5YD)uvOiC29aFbrWz?YnyZ#5*hZ<(a8cJ3BFb9fJdO0E9FYE^Q}( z8yXxz(?dONmlMf0+)v_<%efAJJ=PES>nze5f1#09REOjo1E4YS8PnK6d*35|7_MSWvCDZ5f~bY6 z+e^-}DBVYSX{la($yp}p9_)|ce@nRV`P+ibVejGZ0`=)j&J3%rq5K=1Ma(^_{08Su z?B?*l>`XMbs!A_AcUcjp`t)UIY4e^kH#&=(ZB@yQ&ROO|YVAg6uDMQK-{|awt)#U! zIdja#YV0PMMyNM8p;=W`MP6~%s72jna}=k()P|{i9$=0c2w{0@RhVOGWA?3L!P1;a zd5Qxw<$Egl3SxU$J^PBYJtDpJiZfJO`<+2IRmRcRO!_T_F{8>%`hJYY7Bn`ZaTX^g zRCGXKS2sIHAe5F{oZWC)x5fFC`H`x&)mgKJ_PLTiZ_sCP`h1pA@J(MhwX1cEI?U%7 zCeJ6VLIp$fdHUo2dqlBitFr^b{(Gyl9xnB^Ift2-)rM^aQS72q9{7@A~{x>1-J&ZKST6KdRc9CG})4lFr5xiymtjzBc^CbqsI>$Jp^5%@A&))`4iO_$DFPI>uwvBe%#sEIe2`2z8bTuc#+Wjw$Zom;7Owg_U)UNl~p}M^?b)!B3M{hqjq6UF}NvgnN{O|T4q%* z99&k7LONzySy?&%!7y`O!GAA4vbIk~t;8kLuJWra}C1D@DO}Aa0E) z*bYR6CTs`7Gz7my8aNxkPj6h}qzb>Ylyg#r-wY(OU`tP9G&i$!SWaDi?#W=>al#CW zUq`1r0h}z%pvnq!epZ>MSI`k>8JS{H23$+HHkf+*bi;YrgJhHt3!tMgGumC46GQ6l z(+v}mFU&-Y5N2HCgv&GkQ^ZgSJYASmnpwg*;CaHFhf&X;5i|iW73S^YC9+i6rb7H0 zS*nk!%>{fB9OMgMKKi^*3oxfc*M&I`quxH{O!be#Y2bUp+2Fs0IWgoQLibI<5yCCO z#mUlEO8?8Umk1UJL!bU$@Pdc>`~}=Z7|p?GC5!?v+6gmrU4&!6y@WA+(`Pg@9A;8) z4MKe}9KAKjkMgHyy*CIJ^!zwIgX!TZVYWxTSqO5@ua}FQk4GEHh>3wx|DViS&_^zV z*)a8y%V7L7coqQNu%s{Qh|y~3S?djgnINq<2xfvlrw1?-r1b{DOpw+a1T#TDiyJ0L zZybU=4IG7l3*Kn?3bEb@gci#77v2cO=8B)*2!zlXXf8c~S@+F_+3VT}r-Jq8R^g^B zSnC9W`G})+0>Kr*S|t!%8LU+T!FUMa1|d8K!B7JRy+a7h2Bmihfop;F1|e`mu-+g9 zZUlZt6442)Hw8i79lT!Tqrh4X5OPc$!)k!wC&5|`5WJZA*Lr|3tboN)@%$Y4P2m^7 zACNJ6q=EGYAux0ErO26^Z-vvrcZ8V%ecCbH*9QM3a%RAZF(nX$MH?9OamV0xV6FQH z?hMvP9D{p+^$Ew|abV6Mm>@phRug8Wcg0Op@F&8pzIoC39~Eq5N7fA6K2T`7OoB+C0qxr zPdkRk`e1GZ(x;c@!SI+kV$sbNX3=StJ$T^VZF1aWTw2q)W7}&z zR;_GxC)zGz*5)PN!emWfvucE|HMBX-feD++obCKH)F9Tb?!a^SxPZ;4+M@yc1#4f9 z8W3ks#skrZagfed72|Q)sHWkfD#Y7S>QcPD%(`7$4KHH1fnMPLBCubrB8uYT40SJR z4>6(MaWnzO7ZpCXGR3;lPCc0jw;uIjBBaYy#U#73`A1llaA=ZERl;dWc6obgITVI^ zDalT?5-NqCldsXbqPj!t{*^FdgpXY*2I(UzuNb5|AlFQ3uFi=%Ky3wuZ@ZvU%Ocy4M^qLp1+^^1tBU|o1B^k{MWm15poxV4!4 zvg%uYRimbzilaul*0jr+PpL<1;xm{}D^=5OTI~Vc;ha_3A}sD%7PZ2PxVMQ~;b=cF ztX6m|Rz=pbt3vBCr;zOTB~vU@`RWOpsQi#b4fbL=eZ{aBTkV~@l~bhhQ#Ma_VE zGsmuLehjTmJHd3Tq}q1r=pmR!7y&9~1p|Xr^V)WL&k@mh6%^o+8j}J%q;q1R6H+rF z@DwsJJ`j(;;{qq)0g8frO&Qha7X%T>-HyKK1N=ro%qqBvK1eiTxV1(;Y!ow3U9621 z3{uf`?3AF^Z3%G1wgRuiha+$k!8rqI_-hBI%kb?rOoDyQq&NoG0qWj(t_g)*omf3Ep0Vqct4>0iULgqi4X{zlqnMM5=|Ti;F! zMj_|^X672CVogG4q{-hxtLLpt;E8Ge*4pr5!qdnA))44yLqZB|I+)zivN2&jvgz-r z4O z*}$HTuNr;Rz)p!;%hb-XQF4(>RMCbgS*5x+EGW{?nIc`J>l)hCFce&DXqS)Pf>ihd ze=>(LtCXE@_J-X zObMhmu0GvFd8dpXWW+Tf$Hef}dR#-YFNW*Fak=CGS_O9qMHWR6zWAaaGfMSVuAP=V z3m*Q}R@@E8RuhVfaX*e#R7K|5^%}$?HYh8$K*tT-M5qXm0R@7{REpuhf2x%t22u0zHMLVSYcQ-(G5Bd0!wh)$k=w^aG2HzoxI@fY#N<6NA5nLT z*{u3CMM-`Vqoy^r2bm?+Cr#~i>w-_kHnZEA`Kn(tjGUGVHM4sqPel67V-~jro79pn zJ_7{~L3zYuq%2X@o7>q?Hy_&E&N7>Zo@;KG!wRQ5-pX!SnvW@FZ`*@T$FI_q=>#uk zADcewqnax|7pnGveaM+wjP7ci_c2GTHFn?t!>r4(C5JDC1iP!4c6N&Sx=L?nABIlZ z5AE#KDqPDqSJLSm^qacF409E;eG!H_+V8Wpqask9IjTW>yDL5e`%HVgQZieF`8tdE zE}CkcO{h)tFjp-6XgCdVGE#f{rRon*8euZACFWxQHX}`zL5azX)oWgbb&0tQC`xn5 z5&^ZhgWVvwoc z>$}(op{(AotNjpGM?darKWcVWJ-XQyVVd2|K52a)8*0Ngq4e z&wVzg*U4j72jZEq%-+yZGyu~Kgl_h=^Gx4!4B(c%4-Zh#Yb=u#ltJxVcbG9c(9C*JIVn!S-PD!@Wc7FG{;ZMG&>|-TyBdeu<$) zPug2k)DLT&MMBSSwjcQKYJNAi+nZDH(qq|0ySlIN%3pR)jVyKfqMc&Z$_o8<(e^D5 za{a|bL*#EVTBnIA4u3zA(PQ|V%b^&Zoj*U^7Od4xz^%Jrxve_<6)dscA#()*zxlW` z7HHOKbv^w)6Hi768_RHfZsEue1K%;?H;J4aX5Iy;z<-g^YFYhG^ayfoaHMcuuwEL2 zoR7stMcxoxLO2gxMz|@sf?lD5hZZnY6N@(BEa7%wy_5zw9l&}i4cr6VOx*MXw-#ne zbP%2h?k4;wxR3BW@F3x!f?>EAo&%2+-U6O1ybt_{@EhP6!so$D$x+A&c%?8q#S6kU zz%L1BgEtFv$z_LLw}WREV@NDmbccj3BB68c!U8~8Kfe&DZ# zSwgpjCvp7wQ4F(SaZi{<^tbQ|FemEFf8VqxVuY(r~e+gbDd;_f4-jKLoz-vT)54=H`T4-B@sfD&vI2OE5 z*bja^%s6ZghT~$vx72S7CxR~s7YAP!rmET%VLk(27fuD=5UvRRUYP1^KM8Ys^1CqA z*^Gj(j@5&~g}WJxy)igSn8#NKg!y?R9{5T(y}>-elgz`Q(u600D+$j4^GnQh!!H`u z6n+|9Pk1@c>T4tho{Qf?n8)AiwK{m-4AyIP;H}`E;$}Ozzwklu5aBn#BZQBGA0-#T z3tnV+wlKTjli(mN*yR?BMK1Um;b!2~!Y#q;gj<6*3Ujd9Cd|QVw=lcn0pU*IBf?$4 zCxm-){68ax{;+sQm|f)qVfKzsgxNd35S|Lw%6!PcOz>@yF981{%&vQ1cs?t;7YS<*{{gJWS( zVqoz;C(Ikhdg0mNO~P})uL{ov?-6FPzb3pKd{p>3@LR$!fzJxR0)AJkFCzD>f)B;w z0Qgg3j$B^~e+<@2esIrX*IyvRM8OBPJScWBtioR)1D6EHh&&mrzd!~#t3!W*44lpJ zKSdnnz(Rk43>J03RYYD7TwS;!SfBL^H+kR&B5w?CBHSF@O1LGsoiKY%7h(34UgRJG z>ITCAvFHaLDm)ZCT6he2qA>644+&2J&k$yn%@&>u)?Xki9)8)Rzd#1&tyzD83|t!= z)Sn=Op%D!F3uIvCK!1S@%v9?ykbygck1_%<8_`?BgTe0z4+DQF%z5QC;nCo)gqeZw z!W=Z1gS%q!5coIYN5FpxGiT0-aKtmfk;0FIeZrig@zd>092;E;;TOPVgxLTq2yX;e z(_bBf2e!s6vDgBxBfJ}&D|`^#O!ySIwJ>j~9fU7{y9s{+?j!sic#!b-V68=ncyFWq z8DqubE_kx=pJ4rIGB}Df@mfXXyp7Hk=52JLF!x<)twXr40M=TE;A&v4by$KcVVH8! zJs8bSpO_M)p)3rC#G)ejE#WHQv%Fm8ZGif{m2PPizziZI83TEa+&(LlH&xQQ@_ z-nN=i{v2+*h(%p+FX3k3A;PV}qlKBviNfu{S_2We=?%#PlbVp(6CtMfwjsacnSER$Q4+tDMG#)d`{%ggD(lM1%E2M3H+7tt6=>>G5BSp z{!Qe;y)fJt!+vlq%AU%6iQpo_rNPC8)4-*L%Y(}cvq-B7=YaJ`#1KvcFpq#^m~1Oe zg;}}}X!S){uz1^x1t$(&g?oT|3-Y_k>wZACrSf zDeLJov0y!YExZGKOPF=`qi_g(PncEqxA1FV8=aiFKMdCDj^Hz3t?mdu2iEG2U=CJ6 zt?vlKWf-)+BlrWb{^}U`D=<$oVxZrHvxR>Gb2}g9zk>6Gd1zO2VGdAjggI^3Un7Hi zPRVUlo1?yhnH@_%&f3v3*o{IruH%RbZYr$P!u&epeVrY#ThV zkn-J}|9>h5&f&ilJ^}t#_$2s_@Hz0W!WY1Q3SR*`FjO+oFTfGPH^8yN--3$>{{}7& z4$^~dp-+nix51Sc4uGo)^NdlxU7&mJaH}m`6PzpD1k5)-bkhplm0UVJMe8k`gtjtJ zI0f+=!^BVl7Gs1fgC7#E2A(O*o6r-&b-)XRbHPi6TY^^#bHeh1a5wNv!o9(pH3!4b z=zQ(Uln#JJNSL#lL&8JB$AljNpAvo&d|r3~_&wpp;E#n@g87bz;d9vjT9^+cw|IO7 zEjTmzQJCYwJ>e~2txpLz+rV0%63nqd>r;X`255as@atf$PYFH(*7}s-V_>aM34R+~ zF(w>u@H`A!p%NBXz%|6;6L2$fnee)v{^}SQ=?Z^!49r`w{^}Sw9<0AQ24)=(62Gk0 zp~BU{50g{FlaZNPeGvvfES?aHIPe1DBH*RMydkX=#>B>WL6|qBmxOsk+AN#}-XUBQ z91`Zu>5y=Jj{nER&N}ZM2&31K=#-F5o)CZ0)(i z{lLwH^T9!$Y{|&j!h4fZh8R3$)&jPPQ#Kcj*eI5<=jX1~u8<`k`t@BwhH@DXq`;Wxng%Vdb)IJkqzPl5H9$sj)m z9w72dU~X3kGDX*5;2TEr_u!erzkufo-vcicz7Jj|Y?+ur3CDo>B9IE92rB%gF)*t} ze`yTNsyQTXP&Gm0m>5_$r-WHI=Y?4{e3i{WSv4OEvud<{B;>4`uSL$Pxg|Ud{G;$B z@IB#2!GCK;`OksD#t6g+6xb{LGT1M?1Dqhd2h4*}>7G-rRN+J5io%D%>B4V<^;gH> zoOIV0T*M7a6EXYF#GyGVZ>(~6z0IigQuzZ$;jRlW@H}= zGqTTw8Q0gs0q|Wv>Ytt&**&pfWPb~%fNi*>n>4Ujn2GQUR|O{sXMjr!bAC`>m?LRb z;ilkB;np1go6vx)aMWuh%n_}fFm8+nj~J#KCZd;cIq(2sw)UaIC{<&$FcYUwR)=4- zcH<$D^CmQd9E3$(80LrtTmF3Emf)v_+k#gJcK|;x+!_3$a5wNP!ac#;h5Li|3J(My z6xQRv)_p`GhQQ*aSPTQdBRmrPf$$jc72%2CAIR0hb^o(4>;4a6);;w!=!WwKw=jC1 z5glfHbsUB`v0$+$2(#ELk<-HwWC%0Rn!*gUo-i91Pc)``#Ba0^E&^^N%!x@S;bd@+ zIMhEq@b1({ELfN0$Y@PXz*B@-9n*!|fM*G}2hS7k2wo)I2fSQ(F!)*F5#Y7LTM)nT zvKV%Qw+inA?-J$!vS0We@L}Pr;5UVDf=>&73%)3P8~ncTUGP<54(*?VgUsb`Fx(Ui zzQ6fFnB)1+!aPOr58)DE=-lWM;&Yu_I0YOnTmu{@%-tYK!nMK4!g)Ntu&fwb!=kcq zXKXP{^T9)e7lFqKF9S~zR^0k9T@25`Vy5sK@G>&86$M^Zh}Q@QAm1R2i?KzR zgUn804rqIYORI}Fi{+?OYa^pVEK1ii>sfgsS$c3tHQ6sYh{zF~vNp0H!AHCF{lvYp=?u7KhW%c|{gm>}-^*yggK2i;K!BxCkunVrXtE;@UR#kW7 zGFDCJWtlpQi*@Z2Rca5MZd9Z8Kw3f_+T)r6H`#l&)5rJ1doJ(SBGMvB`)!7`syyf76v7JmJPfKK8VOk7@70Vq)xjkyts4J%NzM$4AtX~p7Gv95CFId%I@R|2-5c}}?M=JBx4=&KII6Ki;!++h~O zts%~s)fO(X`LH%(rz0yStUVCL^G^vg#%Xd3LXmT7_6b*YlvC&g!XB|-B65O7)^8rQ zNsGmCJs*6wyS1? zRR{$eqWNMjmh0C>>~f$l_5e7=h-m|l*bse*);qyQtk(06<<0>sc8;oe+LeZ#xou9n zQj^LdDDQ)L_#5TrdwFl04h+isn0oTGt6_96ror1ue>KTcm*JzB_R&rIFdVnx*xS7q zygN>KRNNWYY-sDRIO9r-PNU6YK7U%?Om*svD>bG*lILA^6rw2a#}Vpx$jTO>vsGm+ zruZ=VS$gpV!aJDBk=|OW(OFksG|Sh!zBNQnZ#lL2tScR#tvzxU74Vw6f7bP&br0>zpeWUnOmL z-Zcx`n2()z9Wg7Z*%w?jVS4R?YmgbEQZBkmn(wLx7hNr)`G&##kxj7D=MkZ$7hMxg z>xxH3yz6?wOi-KN)&8!%>*@>-H7~hZ__c?5^l%FC($k_#u1RKMb7aWu$Jvn9EHqaa z11A6O4wbl!#ud2DcvhL&xCfkr%j5&d%KNV7Vfhv<=L<~AFTL;T-IAxkMvODLIU$N2 z;Tk+fbE0P&we>lR-V2b_9*?eJrk+ODYx7-~nZ|;uGZYwinpn4udgue!4D*)y;{(?N z*1ZVT;zL(==+vzH&^0Q04H6YQg?kn1-;E5F_{eoX+INRT?TvcAGS^Yma^WXJ0)!(-WZNBN+8?DCrB1(o% z|LUs!-#@hK_`_8;H@FQAv0zIpm2eBTwAN>#p|JT|L`HG(#~mUjiiAHFiiu+7ZylMB z82IsQ;)2gt>__R1YGbvhB@H+B3}${EWC=3G%dyOBDk&a%iw|!GVB8ve30QJxWBl0 z8(i=`hWEguME)Uog7Bwct#pmdd;y*=^6$Wl!9i|CZ4JXSv;cPouNLkKUMD;dtd*|e zW*B&v$VY&+qBZ24X&w>z(_kJwz%bW=&j@bF5~*ba-YgpY&ysWN%)CS z9{ii|Ww7353O65s^)6HJH(V75Zb`>0rH46g(gNh~Cl)!$KGy zlYsb+Y_9Ng;Dy4Qz{`ZW&25!1x4Eqmehs`q_&AtfF=Hw671>VVGvIx~!Amf_E{3b% zZVmv6! zfvlr&EV#QcX3$1o;iBMtVUBJigiC|R36}*=5v~fJE}Q|LMdlYdIC4E97EQo<*C>Wt zcFQ%CgFAusu2FCou--Ka=DNvFaWe>fP?&?#8^R;OCxzK9&k3&s2QP_%{qhrG^vm$> zP(;9PsdtBhkAwB@P%yit-W>{Nw={5HU_#j~_2y782OqsT6kG;vMQ;uTR{@s{yAK-d zW_m{`EEHmdO@#RpxRvk{FpuA1#LK|_g!wjku<%RZk-{&7#|!TPPt{vm z;dvhndgmvYU1+vAVi)4hPe#CQqc?tnFN5{QPw*#Tz3~(L6oNzKYNw^F+SvU<`R+ufk zvT!yyQ#co#E!+a!f*hq6h=T^_?liDVbP}!s?jc+k+)tPbzJrAy0FM-Y5IkPE2Y9M5 zZ_|$ov!~1!9u9s|Gx|U8(~HGo9{3sI#o$%KOTk;o(Wo=?=cW7G^ccTbA&EI*@-4>^@<+Z^jLoLC@I@3X2 zZ{u!*r?SkpkY=fwyv$Y?dD*B+w{y2u7uvd=YGONgYj`@^&OOEYX^g7V-rdHU4gIdk zNk!F~_U;^fSNFsA?#k93xB6&Z@iJIkso23?-mYB}J3Q3I-(%v`&<<{&b)`{Q4Sq2U z_V^(#get{?@2F3~ewRObvfMH>0B)YojW! zqr1Fyt(h9$(OnKXTmqv#bs>i0u&WCl-T&&tw;7R`;LOgftv|7AUCRzt>x2>reu~1H zfL>MjXZ3~YpF`xR%YsAXcn-?HhsZsFrjC>2xS<{=$NkNV$DT%^$IUGzI601!NE{f) z6GZgMaqN=t!rtX_&PNQKG^qPs+!4VmjKa~Hu?|9d9N};GCc>w~J(be08Kh?@5XZ_L zq7#p^4sJ9NHjBzx<6GE7z6(drtZhK}Xb(ru+V21(LWnWmuFL)W+KpY0XhgaZfZbpP z5|J|{5O0oGNADM{7(E7gNpv;kY$I~LI^Wfu800;b^kLu2`1_ELt$3P`Cmv1p@m!lJK6c2-KAspd$(M_8 zCi>sk?C|}CJUM+w zz_u?I32^zSqvZBgf^(0rDq@K6@zW!C^9)f6M=6KQg8T5!NT-i zg$K*G1Ccp=?RC(c_v2&l0jl~tBUcxr4{qQwe2d`EM8imdD2|87lrSTmCZ}NW%w?q8 zq+=tV)e{+IvU;5HeIbgB)`k*AhD?FZvgWLKR(WK=q*_Po_z&PVvWWQ+3|r!-ArSRl zcXvdEJZ7Z0$+mDLz7IX5==d(g+lV!?oOv3TOYu>vWDj>zP3lEN)--z{kZbYRn4-oe z3;T^PZb9N__kiYN8J2Gs zvN_{1%l8Tradm;^D~^yqUu^k!yZi#zhhTpj*BB)E=_Qu$77FY|TvJhgXK+0N`?I(v z!2CI`)GYZGS1RkxSZ5g#mpGMlMb$e53*7;u>a!Hkm^eF+iE8~lEoQ4)z1?Z%x2jif zciB2@0cLwvc@;P;#aXV|u@qwHM&m*JF*~it-^cJjnOa$97aC(yI;+=uyDyjE`8H;Z zsXHm;T&^`&SHvW-Y!O>+?c=VO`7**beI|X?L5|AnDEubl=t*-YfEm#CqhYQvSQYE* zK9t&taWzawNE~{wC_^m^GxuLX%&a*wqx=v5PbrO4NQdxSb{2YA7HfP$d z{bQqBchz?gSfJl8|5I9-vtwTaofq8f!Xat*RkkA}PZ=FaxdJPr@?xYBhh?~{m}Nu9 z`?*Is-PHE9j4S$x!wRGGCk`8Ir2pU7Q0`1hnD$=|9_$~NP(74C*ggHfE}E1NT_1*I zDM$0zq|mX^?j;V@=8Q8%Z9DJGRe!y0`&6k5&J5M(H0b$&H=wGNO=zROuNje|inWW$ z2<@EUUgZzoL;)5ox$wiUChDBOpCIQGP6hDq!s)bt8_KH#UBY~86eZjU%*QOcX%0>l z?f@<&%;$%+Fb9o(FjNwY!C*c@(ep5HJ>k({K0;B>@j@TM2YwXXN#wJ@J%s0h`w2e- z9xS{TJW`m?665*E#Xxyem?{=;fgcsV2%as>RgEWwKLPWQ75e=Kyh`{d@EYOYz#D{} zD8Vhld>^}0IGzs>d&R()v!}?Y0v|k|7v^;AJz>t@J{B$q{!EzF^tCW2ueXFbN&Qhc z7kp2+5%_O#HY4Ngl^v1HB^R%7f3RP8EVzj9czqbM+G=~;p%qWKw>$6(spV6c?G05c zpK`x|iCgXYm=;}0Q%}x!PsWMD<^ou*QSEWDu4Jfn3*42=V&Uo4wFQ`jMX5UrFzafF z`F=lDav{cCX#X#SWC!w_qjpS5ijPO(;NL&Lo3Qce_e>iXB7|JEpYHEL>QQ+uBIDHd zx;`Ifsu7FaXMKA*OqJisp20GSM#ed~Yq?nx0dzE_6_^#m78nRX$x{Dz}6ekCV$hm|C&( zS#uz=tCz)J&vg7T*WeF(F2?VO_u$UlG?Nni!on!XB1h$q5(~3Kx>v!{+;otCI~oyj zyq>2g7D_TrtLMQ}ly-LhpsMn;yJV0Xuw&C``R;1`Esg&^`b4`iVoTxAzjCxJ9|T+s z378!mKbjaI;&#Hn`2}Op@vT107$$4sObA*0+E?$wzT$7w!DYuxL!Eru9Tj8&6sZQM zkTLme(M5DJ!)6X3I+W2ml#YnI<3C9#${o@P>@^82)&v$|*hra?h+B){uFSD0eCKjG z866JELjB}3jlHWd0D3cuu?$>27)=7LjN<2zQdd`UIAFX{eBIqK^v+Uu2g_X%?kr;k zZ!d|d|K-lozl@ptA6Do8`&xgd@}GAnsgQDKyU`e`4K-}_hjJIgVK7BkxEHDIE8I2y z%dO08Zi8VitvRFtahJs2G5~P z3T{Ju-iX7%%HN0hZ~8SFpOY~}@%J_U#|i%pE^rf#5-#8bGAj(f;$W^Gux*tq%e@h1^dq|K8SGHl^NtPNXD#9>rQ|N=vyaqNDJ1+_rfK>CL#++DRYI3OwXLAlQ|^m zS&EdPo~3~4hO1Xxn)NO9zZtJu#(JVc^*6Z3II(Q8^%dOTW~e`Lv0jW(Z8l?N<7A9_ zelzZKkE_hB?l^UOK2|HD7{0o**_~>?gfVet_)fKW0TxFxwz#A4uDt#h+^(WjJ}x%* z0p#ji-0fptr`iY?))#SV?-s066j4{{a;UPm!evvGQ&q;3YF&$0UADT*+2fI$WHpnb zC6VC;lY?84g!RZucz?zhH1aU8L>))eHmt22FQQ6qgYO?9{y>X+QGBC_8Vzy88LY$Q zq8Q4l{(BOWk^@@9!p_gCGg z?Z|K7-_*}vs@fiR$@U!cao6Ph@!z{97gKQC>!|Ih8HF31y+vQbw^^rsh9;+*%Yyn& z*$V-{i`!DSySR%aaCRoEA^VBp)sW@t)7ZO}5hT03SZ%4U3aQS8FZ};}*>I z&j_A&;&UJ1ogs23*nNve1aqV+8**31iAn84?y2Td^>)Zz z3!6@?eeQl{eKl~OyOy8NL*^p=JT)Ddv`uZ^=N@YwRwedpx1IL8_rpuf0rwVMUOV7^ z1a>*E75F@2PK^6tdA$<;nC+0vooPLVQ^0Jol$QbX&O9>qx{4HaPE%#2(aJY6^g zJWIF+nDaThsR>>rTo1flI1l`+a7*x7;r8H{g*$=yI*{S?WBy;K0maUeWk8_e6n zrNI}3%YykbgKjE;uLyII@49efFkb=EO&jo!!o9)zITiB0U^F-^k-;zktRGatgTNeU zC?5;v+>QJYn7xzy7+Bu|z_Y>n766_D*3YTngb_R^b`oUBZunIgTNFZF}w(a-aP@& zTfkREz8n0x@LsTffQ6gaz`s+DyAXPt?k)xFLf0XqgpDX+3|vM)m?fPkOcf2Ilo&V_ zNE0p!t|VL>oFSY7t|?pr%*}O-tQxqHFndZ1VOEVkmkVy#Q@E6>w;6)-9jJdA*r&&c z1rwxqKtRYu%o2Gqus(AOa?Vqf$dkcqh10;Bh0BBY2v-Cj7G}HAM`$6O430m1@4!TG zxkjI%11nPt@$ylO#Lj$-7SZ`IdZ$ z;;1w%^u`4^N&|l+a@HT8c^N?!u->2mt_J3NAIdYq7KT(ZtIs1`3mhX{2OKZl2wY4b zZ4M7DV9=Wq!0o_#^8q#zuwHA?1DLsKB+T5j6ix)U73KqcXJMA2-iH9c)xaYu$K4O< zHO33`)l~RYcvzr^7>|kt>vFbmJorgrM!Zm%qvTpLDw~1w1rV8SVyiIPtg%a&?O?w! z8{=VckRBM&n_|Hm&uQVx;ETd6-uH#M$iR0l^vmM?T$shH_Z~pr68y8s9{~R$+y=}! z2K}O>%NcGl^nyjSa33%qUFoPFI3ZLu*7I?MT_qD$rTotok5eg0o*Zlm@1EpoYx~f3 zcdH!~AA#6D4s)6^pNH934CWg!XQ=ix_k$U$Z7Yj;`2O`KF7`$YR~ahr1=zML4%-jZ zyy6fyK`ztOXB6Lt*d7XVCzZJd=G+o6AA~tW&7^rT%+`0c)Y~OIld(TNuOtG;TT))K z)Mq6wp7M5wvgib=cPURQc5lw4Bn8bpM;+bd)-Psp)Bfkz zOq=ks*Sg|Gl`k2=;I(nGho_Ubzk#5P?38k`-O}XR%F37A)FrM^fqvy+ehcrthj7x!IL1xtIL zcz|oa-pUQ|H@uc)J7d7nm^c_#i)eIK!?7TSGd<_?X7nLCdnuaJBUk`!Jr-C^~ zR*5sw+C1uLCfXNwx8qB7cv^p^I;3lrzdEG5&{e|^%t1Lg>vJ9Kkl;jdW? zV6FyoF{JR%ngr873(qStS3(+TCO@AI5GXU?2C=Q-^hEIjO~#A@}n zZNZ7h9?=yNhf_T5$$RP7a9O~-&R9D2t>>#|_&6G4`o`g}$7kbjl&=i_dVQB+8EyD` z!;y)T8mKml<8%cW$N{YwA7ajiv-stRBY}U+VJ3BI37<01;rc1%O6UqF<~VI&R$haH z*gE(Vit$pn#btGdxyy`#pF|zQE=FMFKEnX-&ITe{z0%rT!#01Cc63)ef`yJfS;zh- ztqVhzq7(2JONrSb55IN@%NPRN6rGv}v{7}kEGx7bMGL7a1-pFTGG6?^C}PWS$^RQf zP{S7(!|Sz&mV04Y5Ly*rfG@Xxd5S-Dl3IB_-T(H%h3;!|Azt}S{9|afN1o#3_ zJYt(c%>gADZvvw6KM$>#0yecX_<5kzD9rlppnAEQl^SBJGJHo{^c|(Zflh?EMW=y_ zDRmmqG%}b?=D~0py2C=Jfu9P!K|5`A8Yt0e*bc};k4(c5#H7HmEkK!RaO)VQj^JXpJNK`%SnT#{luCdr zU&(9u8}?l46*%*i%^~;$$?;XpAvh0zzDoZJFuk5_A7AFb5~EaM`l*>iFpbgl&LLpm z%-27MfZNLY2ImkQpo^(F1Wz!Qxj6)N>0(~SLrK{ch$goAY&hgpq>`C18s*rBjBQzR zc6e0g#~RjrZ)^?7JjT!eU3c|=cT{F<^?a=rG+~ZPsc&^_iefwl!!juMpfC&>F>%nq zLH#EVfe{*Sy67{0!a$htereN~al zuUkP6=ZJ?vIXpa)gU9CJ$?E$Bc5)u7%_4C=nS+%o@PwUK@kkDl9``7$BR0OvA*U`m z5`-7a!F&ah^w1?ozEHyT)bogaaaN7&yx_<2#fY4Pl@YFy!%f{B@>XP4{P?v4Gkks} zy612+H0*}`HB7mq0VRpQS@a;hJckFiI3fzvwRFR}96zdyA_+Q7)*o`rl%g9jZ|uVy zZZ47K#;$k2p|2l{KE}1=aDq696!-zz{1sf*&6!PF1M;TOl~K|`&uMc*7As2nlbvB8gvF(MIg0ft#8 zET5A@P92C@H!NSCL%yC|FD&1ZL;fmeDjr^8S3l6x+7}i2$Al}`^4Ep0j=aD6C71Vf zD&_KSZX(MoLRD_0d{es`DR4f>+4Dj!8-X00TbQp?zA%UMiIs)Lf{ho}Ui2IUv%yVf z4OB@uKe(E3L2w=6bZ{f#3~&o!>YLgKmk0MH%T12eGrHt1AE$-XI#1?cJ#!0kX23Hd z=N+sTW}$%}3U+G#&>z4RWtA8=T2xsS65#tI@zaOA`x5P(qjyloRIT(8_MO=i{iJ z{dGTUajfTjel=~FwJtgyv6c_(qskA5>Zq<7HXN#>1rXN^>!Z#<>^W9I{j(N&o76|3 zH!|@2mS|;E_LxVk6pv>~LG|QFt0YeM?zi3ysuLs8g&vrS1vKi)NGOMXQRXQ0kf$I+ z-wb!i>yEPGJuenl?MGR~qN^fl;nVGwK#a8m8|ivJq~US#YjpfYN%adIbN9wN>g>ck ziTQDdEU9(zpTC8rz{pCz`{h+(g@p7SZCNof$d2#5YSd`V{`^(#sTrTFUL1{hqSe_w zxs%lyaxHazG~zs2hIeglrk-mI#Di3YF;?*y3uTcX??MP+gqjUe^cpCDapoYkRIWNZ zCP!}{`|aAPu&W;^5M%P2nrrJv>5H3149fI1?Z==Ki# zr#zlJUR7{k@+8mw=;f`yD~XeV-rAR(7R@?i&GL=krI|;UU%y-2ys&ald~q{g_4^Im zAY8-44Tcpe*b(5jK(gvN&5A72$Wqj*L|4eFTB)KcyDqV~`AYU{)2x?Mo!fZa<`k5Y z?*nS|b5{ONJU0${lQ;2RKg@Hs7?6cKc=6yoGUN>x)BihRuNe(i>=3+)$bPo2kp1j= zYE4RZjJk%PL&F$mSanhb(TeJ1AtDT`PCO1AM91)p?9nF##y&?161ewO@fw16I)10&3w3yZewn!#xCB)2$2(Od^8mn0-4Hc=c8Haogdp7?1TI>X3hQlj(M|~~# zL4*R7fG3dPwKMA@S?*H4Ywk>hZn}>GJ?;_Qa+Iqe@w$2OH`<+oIyJ_vg`19b|AZUM zjdOeA?^u^xuj9PPA8a*tos~N; zPr&jYdKx!j*xa4N|K@C<*WPBU4eP8V&&?Qha2;xhPU^FDR>2M{bn0*G{2GstJZ=|w zigH5;!0VPoDx(c&3q;szgDpV!6C~bnr{hMrxP$t);Co1)-fCkw5}mkKwOnuI$#(;R z#re%okS}^AM_iod%*4+fHEX?9G>$vA#^p0v0*)kZRIjYJih2IB)n~BF-xN22EjhR_ z@OI*8Bm!Gi{%PD-f=X9)kbEEZ`IbSu{WHs^p>8gdB ztm=N|WZ)iq9GP}s_0c9&eNU;V%?Pf%%GhjmkK=NqKoOH$ZS+i>t(I)Ix|TQu=Ya|) z%jwL-KarR~rZ$8UzoJcLldsCG#3K%Nje#n(EOIkYQwtX){zw;fv|(Z5P5P~?4NDTg zeP~#bI3BqisIP5SB@SXD8<>3c*CZZ55eYQZhINTt3>0Xr4I2{AA&r5iCJXPTMDAl8 zXh}oJ*pfJechN?>dp_|=TD3P5ad|PZ17q!=4cilMFrrS{usiWMgX?OtlOF5IV{Tiw=dF@_(sQ4WJn5Uf0Y2%I&s*g@2jbM< z&s)X(JCW-6_`jJU_F7f`1*<{r7U0B$EPnZO@wCi@YRp!{z5qc&b+X5H$u;<_y>>}N zpHP!**}ME|&kI&k^*gxLggSH^Zx6&hCe$VKbj-Z)neP|86yEq2<|{DduZUt1-%{sq z{(mfGzGxNod|<1L7p*zw61D9`>xSoNS1o=C?VnHl>b;k&{JD4{skzF-X8tV%RrY#7 z{q~a8&vP!Iy1#4{@w^wKX1;6X0V-;n^*W}d zy}8YrQT=5}kGxmH!&VYR~2q**(xiFi5g?XWt>^Vyr% zV)^VbXS+fl)pMtn7SG~g-ic-LpfpM?-f49%c>s^xENp#^CuDZ0g4;!VKMWwk)#Xwfb!kLM$wdU2Ok&~w36Cw5siFd@>r z+v;EB6Fda7yqCGm<*H>^8qEq`mc{}|Q(5H5g56eGEDXrrZMF0u!=m?CpJQRbtvwi^ znWWm;}W|n@ls)wb2Bh7F7v#amJP$u?S8NA01@(QO8hpU2iifc7fK|RQ_jxi?eO!~78y?DxWZ+?QJ($ZTs2>klnW+8K zv#rVQ}Cx&ciu!wtl1tNq%3{%WL_*q#Xb;~ z^^uDOv;pp_sO{NSdNCdF9vyIH9q3*iXytSU^GeK41Zk9hH2Yq*wca#Kt7l%drqtlR zGv;3mw4r|TfAPUL(sBJwsnOs!{57wbKcZpZSj(?ydC@JZ*=tq_GbVfdYgQW%YU!hg ztopg4m=(EoTs<)gU-r18lHahFA*Wt`!)j)xsXK32B@$ZUJ~0NuS0x$!s4^o}*~9oe zZc^+TDt})n(?PhzW=$4qbJ5NjCL*6=(o{Y&a39WZM971c_RKI zy5fDBZgf+lQ-ZqvwpBJ?6+E)U=6uU8(vEW!^03)pbXcP*9JTT!pFrB;N_!}a&48sY z2_0sren+ju{PD<@_|rQ2s3E4s}9`4{9W{QkWNzIYx=!QF7%l|AQP9rJ_*@ zIT+C+&H{%b%EQXY&WOVB8?q<~dmw8gia{6I7SZh~locwy_!OuuCo^L<3pWP8B-{$T zOSmieHR0a8|F^`@7Z&dd4+4KEJQRFZcsQ72?3}U5GWd-!GQ{{v7&mU*6J~L_FPsYY zpit8JtjRmEe?&DL3uiasBH$5Z6hbd}oG=QsF-4ef<4j=&I!Bl<(MmG1 zhmYeq;gaBu!eziO2#0u=)C7+1BgW;}NOb7F}>1ZxcZ#4y815OnA7BF`bpqsbAMTI{E zml8e$ruv_5&Vj26Uj*}*Z^}RC`$zph4Yy#?O!zBs8{uETorM1Y_YwA>MXV=d!mkA$ zFLI9K%@F1|-U8t)@G{}*;5B4UC#?qq2N0Nu#^61|ZNZUqNIAQO0}FJ+;q;TjJ;8dn zD98tZuZVmonDYhbo(h;Bg{Ocyu0T2G%!gR_(=Z1HSNL%-htw!v1kNK&MM=6a=e_IQ zpWue`!Sn=7@O$8z;^r*4vG7H3Tj48U?w5e@L&kL&^e#{E%&|m$PAHgt7rnC+_#T*p z2~5y^@Iv8eyxSa1pq%sDpA{|x=D-5woYTHlnA-X6!gaxW^>k7=qDr2F=Je1U%=OSz~%*!kotXpPdp~@S71Y z%=a}(nALuMVOHs!B0~3kbu)xnK~)s42j<3{bkiKneHX}lMOz7X2J;lp5H0$^&_^sD z2M-f|5;{xFj5@jqD13w4#QjUi-|M3#w>!n}d;`ov9GAW_Ctv0%H5y9Uw& zvu>_%I`}DJ7R<%MRlu9bOeKCV=3wrT z#g?9%fc3eQV180L;f3-J;9}&$D4^id!X3dCg?obaS(I?o2V6TO7X4x14(s$h1l&P* z61cbULhw-GXTalxSAnMsKL^(5Od_0h;DsXJ2-Z6`L%tcjQRJcRFl-mY5%6B&_rV8+ zPlAsMp9Oy?d=Y$6_&WHy@Ymq)gztmz33H_HzHni1EZcv)V}5G&nUG-4>Q2FnN;zA@ z`WQ$sTfiJgqMU<0nZo>xRu>)xt}8qh+*o)zxTP?sO}7_*%Ea^UDuyMn=qfl$~EV6Rb~igqxn=vSE2h?_HEBjz+_xjxeXRHx`}(ZYTUG zxTi2D!weDL2_7ZPNi0)^kAP$*~sf0Kzaw;K?2~+X#fiQInXN3!cFA5i9|Nn{@s7SaeTmk%zFja9s2-gNv&6cZ3 zxGIg!!TJP7$Wdn*1t~{$$tpQrI0!B&jBlG!9vq@0ew3<+1-~oQic-$cL49F<%bN<9 z0k;;;1a}nXm$18VJ#b&)2H?TM&A=msTeJQjBZjuHc#K>$oa!fp*#P0t2Ic%ltQ6)q z;yGb{U^WW#qxXU^o^1F8M))laK1?~SXJ9b=q2S2jienJ}zo#osfJNkV#Yx~O zloEQF3ib=n1_y-~fC~sO0;dZv1D6!u3N9~v2+Vmi4D&F!CYkwv6o&d@@gA777U<|S zxV7*Fa7W=!!QF+gf%^*I01p=a6FgR!imEBXUhs5bevU(nX($n{OgJ5c91G9S3H!hs zh4JY&whFV*9VC|w`#mg7zsH2>_kCgdJta)P*U6=j|M-T4PfIKnZlCMZ62W*};nNbq zeDC#XiQq)AJ}nW(dg!^}y{ZM`d7vy9)F5(}yKO&OXIJku#yAg;_yO6)ukW zjmN}*oHP~*R{|^HuHa3=e4Ta(_XTGQ^L08bJOq49cntWI@D%WQ;c4JY;1KU%1`OZQ zqHH*Oe->ue-4`wlj=^)F8+;m!cwrcgyu!@IbYbRVS>d|iEMe9qb%a~9{%<6PcCct6 z+!w45IYj6q!F@%}yBRLbJJ5$2!p%(ZOp(t4FA!b`UM9Q@{H*Y5@OsV2|Ftk|6^jkv zZNi(tdxW=uvxT1r>vIYb@k`*7BHs)CSa?79nlRt>Z-l=D|15kLe4qV)X6bJ*#Gv$$ zqwrqJfrOY3h1Rghse~#dTnd~fOodeB3_=&-M9v_L1J|dUa(ElSkuwPS21U*w3?;!3 zIfRg}Pw4~oB!TQ`mFbkbN zcM!Z7tj`?;uLSFJ2f^#X`rN?~3@m8++(GcmV14c&cpq4wI|$AO>vIReN5Hiu;`hM~ zg+By07yby`R`?3Iv+y-=PvM*3P=7Jpf?=reSKv{?UxOzIe+Ql>`~!HF@E!0x;lIHP zg=0`KmkH+ruM$oKuM2ZX?_#%AEV!6&n=t!?dxTlSvxO^w-w>`1J}S&nl=picp12Z z@JetO;Z@+_;83ng;qUhtT7dceo+Qlg_jF+gJWDtMyqugF_WP_bE1&hktbDc#<5O>J z6J~w0M>vHqQMMRZ;k+(f5PXVU8MPVsyl^A%=fcgvUkbMb|13NZ{JZcl@IS)iz+S}8 zFxgxSXvXtj2}2&S;J2WVFzfsh!Y_d{g?EB$3m*YD6=pN8z3_2xPvH~b{=y%ChYFtp zk7E7H6kUR0g77u)G-1A$vxI*FKP7w*yi)id@N>e^c&=N8ZSZ#CcNA*X(oQCg3lH+k?Lo?g#!wm{b4n3C{xil3D*(4Hu#S z+DK#;y4=Dnboqo?hzbj{2~}J;16)eDB)B#iUm6xh&afk+hBulE<6^WG&cjN)vlv(a zdkXVw)?c_Zc&ISmKx33JUKV45Fh5{ZgzJKzBBSwWftLz15lR?k(pXCl!4X~qW3yN= z5u71L&;0D}5>5s07fu5o5iSOPU$_MLtT1lcxG3Bhd_}k^_@;0RaOi6>bcErKa5wM+ z;ojhAq>u^X>*NTJ0w)Mh04EDi1s4#W4o(xE4K5)(4_qe9A!7jyb!n&`&WXmty!)2I zso?g)eBND!OM!a}mjMqHt_U73TopVWLW>sBPxIVa+Fmtqla8GbEVdQAYXd{Nfu;?H>6g-%W5Lus(5M}`!Cp-c?MVN(g zrtlc>1FA<&#envC$p9OG@SUd^dB)ky(qVUt;ox)4O`-InmUlU#rJ|eso z{JtC?ba6z!}1Sg3AhXc1xx(XS7roP6gK$X6K}_a1Aggs`ByG1$Pl{ z3GOZ289b2VuXMy_)^M?4Gi!|SB=98Rx!~!-OTcr4mxC7xKMPjE>%r@UsjA;1OjZ5M z!aJ$|-z|nCus9%m6nsdSvs>O4=IoXe!Y9F}gsFxIw!+*pxwCLfa8F^*nCUOv9z0CAJ9vyR_5YK?95Q;tFkLMA zf#(Ph11}IB0bV9N0nGJ?%oQ&A-6Z@Z_(kDG;GM$U9de)WYVd2qTy%9LAD%x0;&w3a zh($K|r0{X@IpGuFOTyd|@~ZGD@E5`yJNQQUQ}9p1*TDCLId*Vg_$zKF>B%2X1ZO8& z!dwj-CmaJ#6y~hOyuu0KqQcxCptLYo%vKam2WJU$a$;@aO5ldz5bwSU49&%Y0}O42 z>w-HAb2ej7;l|+p!p*=#gZkyQqTQ!s&Nh2PEadrz;>3p#mhofxh5{F z)LdS+s0+Aw4t=DG)qb-4Z_89@N0FT0i=CZbVEo}RVQBRs;#`FsJp!EQ;izg@50XC z*!~f#dj4+A;P0r`P2h2bTHC~)Y^JN+P2m(?YOp4}7x{>0c05+Z%xGp8k6yF}ivRHH??V)4st+Odys=i@gKy9M#j0R) zyO{sl0eqtU=n>=b&s|>l`~2onH3}Bd`Cl@z?b6toU{G1F*bmnM>-E<9Opgpa6TRMg z1^k-SmPFQDj{rYh`%4W2*8W!I#S^`hmw)&Dn*py_@Jkg57W_UJzC1#qX*GiBf3CNF zO8fP8;KlR|4zIWF{{L*fb!3yi?W)%Sdz@Z#o&9vS-8l+Jp%lIsm~6T$6XHwdTx`8X zFShy+?f>xGAMWHL@pNs6vqu_E%ByS#VJ{`!#Z4aEEc z-N>RC_3H>Q>lowO^Mz0{zSc44!*nt#$RVzyQO6oLB1zX$5$J*cRbDSqgCg6a% zRD3hyy0hkq<0^_!+)mui%(z|<%!uRO5Yyvk#$d!QjeHs-*Iu=mu_qvmq=svFLxo0?foV~O7L3UIx?cCRl+GdkNLGK#Yfc9?pDw0;afk5vmcl8Gp^VTCu9lY2;3AHSVLelL_IB+|#!DiS$`P8k`cH;_vA{e(DvmwjA%pB|S61cj}se56rX>%f* z+xHUWb+P!n=NY>^7BVh6V;426s8`O|Wh?GNAaRe-qu1uPA#o$fG4?2Uj2lU|>?~wb z+$geb_&TfLS$j^=SxC@}=H+Iv$~9ra2rL%kgEQ=lKHSMwCe&*mQ?H%1JK%QW&e<77 zKZaA+{Pjs(Y|cV6@AA%!T>ZukG0flC5AoWyRgZIa0rMp_^&IMx%4+L5`)RX7cIHQR z&_o^C^t@foESf#%ygk4)kEt&&*ynKc;Hw`)I$r(yu{|j6BP82=*Tb|L`5LLg7jd-S zF?H#pJ<5D9yU8USJm>MpW-t82-s3S3soIzA6?t@8`b0A^NyV71zR^rf(s=dlWt>g- zsj6_rE^U6HdS9`t71oZO7&@+ls0wHgZVWvPr+K_Oc*U-1-pIat1$S;DQ2=ylUt*y9qucyRX?v_#nJ{%}z5PQQuy(D|r5nRRyox z1~pev=W-6W44p-hh^(SYM?s71Lo=W3@_C`bL5>Uad}MKC zRTOp@(c=iT;qe%e1y5J_wAo0&uRI?ex_kT$BBP7I-wJX*YO(Npiw3kO`0J0{(mTb1 z`TB5q4#Ep>IS-~Xiv5nr5}qG~8SWk7H1MCoRlvx8?Y>)kx`5rtiDN@y$R&=3 zgHwdrRp)#mMn-K(IWiK7e7=5}9{<0Ufc3Bzcxe?d9!Nzc3|Gb8(oya4ZixEKn9 z*+-zG(qPUPB3A&jwN2*TEFRBg(6T*>@n<0kgkAZUjCj+!V}y0q2@`1b-{s4g9lkfADX@%-z3*p^FOPSdg&i zsj%<~PX`BtXM*zz&juG2o(C=^yc*1TM@+<4F!vTCzW}Z!ydBK00OhO`+5FEHhx|VP zLmRPp72H|)5SVR#diVr9K=?E8FyX7<(Zb(>Ckp=vepL7u@ND6~!1IL-6wpO_6%``j zfD^YWV`Lm~dRCYNPFsXiz-;EzO#$$J;X>foh0BBA5~ecaUEx;X4}}MTKN1d6Y4M2| zI5zaT@Hp@-VU7WPE6m}YpM@U-|0etd_-|p|+`=ouggykgJ!HkFx2Om6Rn%M5gNuQ; z&^?&1ANO9(#X}LO|J^MX<-pvemySAv_1^VhHj(ryD)1=q32`$P%&pq!eiE3Qe3Bmp z>n-iUe1oou{BiJ?!pp#+@5HbHhF^qV2J5}<;dvMMACYH+y{HKp0pAW=_-$~!@L6z@ z@Odz|cBA`i;9|mGfJ=utq&J={FBW%T!F_W$WgqoSc;9<)L2w(97X^0{&HxV(E(;ze z%*txCa1-!E;nv_;!tKCM=~YySpeqbZ#iBP@3HJkU5*`57d)>o5vo~AhOTljlKLb80 z%$$2qct7|?f<{tL#g?TDWsH+&bD7m+ADtM@H8hE^L2KZ6o(%{*`mBI6c8-f=JHvumf?g@TY zcr18*m_x=?7`BSV6X0#aOTpYujd%78I9r&X(>H`)1RoQA70lfj=>7=!tS}FJxgg9h zrCtVxZ!|yCKX4U2S2^)Jt=EBpQ^9}I1Gos7{a0s;FDye zm6Rr&2 zBOIc3HCqh)PQM}C0DM%KTGsc3yMj*(v%hdbn5tX7NDW!d&-ZnaQv;~is6jp*{JqGj z-2K(Y^XIc+r{WK>V5j1N@H}udiYnbK06W6$U?d2$gOM!EZ+`*d?cg-w{ooS92f^ip z-(vf}vKTljT2q)EhWf%EgY^P8B!UWwHX{EH+*z1Pi0;B{6O1Gm3hN2R3*(buOch4C zHS_{H3yvT&9?PCR#(5Qd3RD#dCgudS^B) zx2xQ9U_3KY4W0wz615*j9G?>X7%mM}r^lSh7?b#rri|BDy^K6Ghcq>#!N@_U1Vh+WOSeDpe|m_1Wp!z81C_7N>e zCzf|4qVxR(qwS>#al$fZG&*yqU*nYj~*T_E!6YZmQ!?VswrA5jW8_ z>&Ji%_ght`ot+=UUp?E|B|=wmBPlVBHqu!ud?n+o&y@`ffR^@ANXN0C9JYVIVkmTwC^!l<^z&hBMpR3?z1ZoE3 zn3~{m2%>^F!QS9cu#FD>#d`_5h$}Y8Jz}h2W4ukiAhjMgwkL&$c>6UICLOVTh-kQb zaWnRtvw>dMUlWnpCm6kzFk;Xs!~TG5yB|@0W;5NpD-e(U5!s(GZqQ)E{*)Z&9#;Rf zxATT7@OFZ@OC)tXV(m_!``pLH0d8!Ecb6QNhg^c|$a8?MEA)<7!I> zyIh4f2;-Xnmmd(W%g(I-4j;bZK8XOsoZ{9;sQx>fAujKl%G=RS3-R&z?;V3hrrQw~ z{(H=&ESK{t{P!B+Z%vol0RKIDtLt9U?wMirT@J_i{~$Ni8Rq|skFaqPRg3;4lOCET zO?YT%med5P^CxSY=E)OAjx$>LQ_N#<*D`4|1IwokZIf2hkl(Bhza5h<@@@)fL+7N) zv?-{abxoSXgcUI#fvjiJZuN6VJ5LSJtj)C2_+Mf0mBu@uc=NRMUoeNsAb0P3>$!5_Jy#I@+)>i8Ctvb+uth()SMy zE0QiCPyO|26EapMou;P-I=D4SpYkReYQwsuS#;M}8#W~6W(ZC7?sA)w*h})a)P^ld zCGmXyZM3uJlVTZKd-FKLc`<1SL+hXo+mlK%*`2guchYJmyQ|rhFTuVf9?j_QVZMQv z=U@`mK>ogF0T>P?HDN^kO_rS_Nq^I3pt%S($CBF6Fxcc4A19K&REs;?dD`A%6yx>Lu?Yh{FhP=R(&)bT0JCCDySpM})wp)~$u<;lqhRaX6e>2&O3iK$foq@1!>i?Xj zF#HZ&&+!gumUrO#W_aT}@OKvs>#S6TyV}VWb&~YH@+&~R|gYG=sUZ5t~a#yQ_Zg#Tykt)&6E?Bf2e31nR! znwJq|p5G9>nN8>X<+-Cqbi)YVx9Z7m$l^t6UpKpAe28worJL*cpL$c>>t>fOJ^>M# zMNEcQ0{_i5bI=+~JB|VZDIMRz|Fk=*S$De-4$B_a-7ey(7_Am{w=0^1)sgOY3(UuG zdtjXHj_TV3Zsw_3J?t`wbY~B{HiX~zusdPP_69vM+<9LO>uDD^KUYh8+Lh9}Am!#X zekr1nzt9PrytV0!R0J=puX@^@LzVFm%vOz13x?$uckM3C@qKe*kB8D`@L0x=K4jCSTR#87S$!jJ2yx%_oR>nxuQCtO2q_ht$z9ELFAu)ghz4d}6UrHTA< zIxF9aI0}EjGpl5u>1F>F6MG9mdW_}&eY6kzw?Fdl?ug0R+XvaVz5jJQFS_4=0fWY< zcB^CaWbYkrzwOOFJ=(roDnx~PWK^#XpB$eiehbNLZ{qhlnOau-I5{hFbT)MsW_(ya zip(w^ejFu;?19MMJoZ4;zpdoNFmFS=7%L0ue&?RBL9d6*7G_v)2=n84R2V%>y#W^o z+6seDi#!c{LAV(BGvSip>%yhMUkR55f6rDu17dIdSFzx@7PWGeXMrCG*9Aw;)2I)o zB93mFf|G^W9p#im%F%!|(uCRkD_VIa6U8IORu+EzF>xU(>GqNgxB z-Tj4A!9#_4_oIX}!ThQ+%&OpN!fYDO0*7c(3x>zVqA^&J@$6w0-uDp9p8RH!^U>&i z4O0I?SXN(jBYU%L)hOpq{pt_Nc z;3qtK2j=6T>XC95(&fUb;Ae&TDO@YeN1zAn@CvXT=m9%0;Q~dkJy3vXg*~GV3z7@!bQPfWIwUd4%paP{Ml`o^!G(2_02X+`WvdMZO1gf z-RcQmx~fljNmnIy;Ic+dQ99XzJG?SiSPdWo05>W^KRI(SHp z-3`+k^%gIyRKgxi_4zv7C2zY269EsZetR%K@FWs9UM<>#R#P3dhmv+Ep5ZfDf1RA`}p z&)yC$lfxcr!}LF=3eKgyFE=mD%j!wWU64HKLaiQ>-Svgse(t!7r3l89I%6G z#9x5|**K#m(Nwd34J2gy{thhmczzEb(qbC_`?SGzdfMP|J#Fyf|9(bG?(nohH#}|7 zeZqM-H#2)No4FL5kI9@dUgQ7ws6 z(KZ!T%PmS{r%>94Qfnx^d%eGEgO>vy7RQF5PWc8lJ`Xu_2M|6ug5|At7HGYL=%7x? ziI z7*JESXrYr5dX4ri$3ud$bOiSCm;}k;J^w(Y-thl~xI=ypkInS+(>uf88$8{=5KbTU z@50|{ehwc^^|KW)#m^?#WIuCalK(PnC;E#*GQqza;f(jch`;0f>~xLwpNH)jOw&B3 ziZ61CRG`wydUFyydVOQzz&f!B99DiIrmqx>9+^!gWpqy2diT#SDwIM!c-f%^Y}OP{|!(rx=4*gF0_khq4s3_Ah;IX z&)^%F%@KE$EN1TS8B{lI@|(H;QZwKkD${3iDM*ExJ;7XoOQM;33`3b}9)>9e$H2@` z=N3EZo`e|n`(me(d03TR;$)%&*>8!Hj;XQpmN@T+hBLFB$~_UWeiNK3^0u&p>C|cf zxrHe^MxxW~JG!~TXWN1)GkounTais4hYOuHyc3PA_#ZAA=UX=*ZUHVy6$&lmYom6w0 zYQ54agt_0NRyujio7oFiI!}3HM zp!bCt&?#XCq&ulB7hv5<1v5e4(+wC6^l%>)jOJ&!j|ygU@PY2g!oc2fH13if*fw;8 z)4>VCWx)A`%Y$_%749p6ONhK0SWjVvoON|&k=F&YdS&>H!PG0W3u!flp}iQG>aN1< zH})202WFr!6QrlJ!ZQ;T>9CelKlif|)sAQ@Hap`D=ZqJ_RDZmMk*Eo(+1nU`x>i`N zej7tj3)I(dV_?d_X&A69t@a#+X_hK+%xR-GEQBpRwXvV&G3Gc7|Eg*HnC0GAjqKPRzx*+Yhh8Y^inb%WwgT1%@Ka`=F|yG%g1;l%Ote;ZC5 zu|>;w270hoSJrCYN3IBp{y!!6x)*TGum3;B5m~RV*3mleyuk#o<+BwW@ba)thtWy%sEoVN$^En*64cQKtV>r$~2m)g@ z?;~(4i!XV+*H?KxqxelnF&VBxP9NOCOs67vhQs4KraQgh;ZcWQglW!wNTxcR*fhmq zOJcIaM(QLd70-O4^D@Gj;FN&h@lIj<9p_+L!w_Sv^8lW)%B3z7)%y)3Fy3o-<8YP3 z2^v2bPBr-a6rWePtLU($n(jow26tNke(W)v1P(t-J#go2M`W|29X3BrX9y&38BV<@ zmFI#}!v6xDOH;9uYIDI!_VcT1pJ6_`zR%S73r@*)Q*j$!XDo}m^EyH^9L~8jor++O zLv2o!!+O^1aCTEP&IV(7chB;ewMlj!)WgO+IOF@JE&O zu~XEO;!(9ec2Y8^GC*sGh3H7IAHzvCJ0sLH!ArC$Wd50R53Xx z@>(#Jt|QH{8;rb>xf(XNgA3`bnK=)#`?)K|s*@i(d8>25hST0$10mXDKO(hGC-Y^v zM|09$nKmcwBa*S^dxf|VE zK2FDSdn{$+!RO1zxO&l1xIyOj(F2UWI*8HjOGbl?N~m~$Wsb}1l=`dacir%ehHrmO zrp{`FRAl(u{zf;S;E%t(z8fDW|N1+IQ^fg}{?1HAjBlX&=@TcpGvo31V902T{fxV6 z821R<=)U5}(6~`7P=*g(9V2cG+3WiZDAT6YtpUXp|YDYFu@y7S=}{ZP7tK2Iu9bBW!c4$p=Zz zVY#Df`BkTk2Os{oui}eeHv5OG&S2B*sXASQZ=In2+V|%OzP$E5Q2XX-5#^7n9oL+N zxQpu7@seItE3P|5&9dsX>rSD3A!MA{!NW{*k){Sr*P5be9+um$?p#MxB%~VLKoQxG zwOmd`bEevG!%0g$jYOG?JPoPZVE`V1UZUyia6 zH;ZMyMy#dk-E>m&1tHH>legG80fqWgq+I_oY8+J)ZaO_Y88PbYO*C@`sDfWOg*-v8 zs`G`DJO2peIY!f%>+PXXOqqrdQi{T4)EuwIz(votxF@Hyhe2~s!4x_*YCM4?B-W#F zIfYvhpHZVe0?Sp4_pyUQ+J+NRo0GMyl}9P%*E5Ar%&0L$UH`&KG{l_m4ZuG7NBC~Vg_#FCL`KDW@>$1IDTN=uc#&bTdt~Gm zf4W0}fZ5B?9Re`NdCnlw>~XMB&z=i86&xACDgx$oGRjMWe-W+%{$02p_@BtgR#O83!kxjoLx6Coa@QRKaDT8~(*_;_W*3WbjpzMy zt^f_w!L5Ynf;$L54elnq1l&h>6?l;F5%6f?+u*6f_rQ+}{{enV_yPDCaEK9mkR_Z; zPIkb01PfditVgiGHNm^YOl_LoD3Jg4_?x8BOFNVAeC_ ziQu_{=)M9e9)Q58(Y|)OxrWujk-*gqd?^gjp$F6fO(CAxy2*cf$3- zoS2d;gh1QDK>ZyfU?=Z^a363qNRSeOg2iVH&p zW0Vo*%Far{PqP-QCImYvP7cuZHxG&7Y6^ojUj{1V*gvWprg&zlVtb}eBfzyRof%Sn~ zkh4ChF7oZ*y21y*jWwh69fYBsSWpwtL-;tD8em3n5*9u0^&K*_i~I!qnS&{yoRj8_7%{NUcZJyk;|GF{7*L8Z>-;of*7GHWi-7g{ zS#Vzz%;5t1Edg#QTo&A1nB}7_XBN;A3ka2TWY$WYe;GNSY@{#~p%+del}X^KBIk!E zB+Nw26;1~~CCrGI3NtPxT!pm{_bg##)nKt%n2C5vxHfo~a9!{#!u7%LkQ2g>=A;ymF8kCXUb55`Ubd(*LvcB;W(ze0Ot4G}8*d1#kFD2DlT>Kjrqd=j+q5d^$sh`)G`7jga zd)P#?C3a5zYz5Ph&{`whk}`*+ni@62O^K?Um8JJVI+nd>gxe%7@BzxV`6{ZA{c&uz zs?mp&Q$n91WGLh}LG(}|ABUzSwCilvLLpxpH5(N2TtW(k{0U?{6!NJaUSczlD6Np^ zrx0GcqUb+V$Qzyj;uL*+JRYm)_-iAW$$qXwo8-?x@+bPw!@~rBb7a|g{{RF(&R+q4$NG~Xhf=&1oLX8bZjDE@ z@xIqMH0zrJH@-te!^aP@Pn6m=ocm7jKEv}Ld>^bqESLbXSnXKmriBjB{>oB_0(g** z!9VoonXOO~{1xcX|1}(#e!lM>{|ZDB<@exGc>O#aF52G%RdbBLG7=l>KMgmQpCb%D z|M$3e+y5tmbNn^Im=A$zQP7ExoynjV=xlE3poTa7-yyjkKNpin=@}PZ|1881ZMcnK z0WCV`5&E+bo#Eewpr}P(3sJ7Y@R8qiye5Y^g3JIX)}&)2com6&W_>NA4Dw^=__aaL zk#OQPX9iKG)T!leI;MgBy4d`bRQkKaYm zZmms_TXWRDXWTv&*>wD$N^JUaeO37&`jVl<=Jy9m?13yRn^Ys^rWKn7QAAJ8g~Jg& zbs8RTL{ELuRZlB7$*iijDz|3bU<4UAnN17V_nM`CRBk4=)=OXIHZdEi5v$x9em;rx?M6jiWI1zb8%)c z1_=mcYC|YEjW(6dy~x;E!F2WWvu>Wy6r?;*Q_B_vc}!}cjy5a|{)kWmb+uth@VAGC z6~R>GTcEzSSrz2DOo0aGE)fupZi3rdNtY>2Ne3QUNJ`ZrLsmU2YSqlRdsMaFbAj zk$HVn5pF_FvgP9;dI`1Y#!Z+!YM_x&n;hrsjd~-Y4msY}NbO(i7V@(b6yH*3biU5& z`dYWBIYY&+bBlRi_N#L1-27PX*%FtciAbW^z{?~S>3|ys&qF{(UO*0*4gVK!=N%tK z)%N|F&2GwWHajUxLPAL;fzT2{4-k5l-USQ@2!cT9D6$};ps0Yzh(@I;aNmd^YAi@m zR1ic^R6v?w0g)igZSq*>h{&xZY!IM}x{Tdjz` zir5>kM1v8_TTXu_oat_X;>}!Bws2MST0L(yoAT_4D7@eD9?9%Mb4~;^XBo}PU$qGO zW9Ksbje0G5fey8uw^m1&Prl78nC#Lgz<)(G3NzWoqODZfthFY(v);{|u_n3^*0{d6 zCb||*XVygLR%pdb30Id=dEx`($ZQMH;dKk4 zkC;!bjjrgr9civxi;|gX?plimdr;Z=wb6&&Sn0cKee@E&?yD$L{bB@KebqIlm#XPP zdWS?@iZw^5)o57i9a*IUW?_VZB=vm#^}WIYalne>W2|~+kJ3obkpgm?L2e; z#^`)~wCR2`dVY;FtpAb39eU%}=#x%?%ItP~eP-;Y==jRqHFPpu^rRIbiQi92WAUT4`zzXPxhXn3 z@dVq4V>;hqp1l)9``PBKO(@;L=H^Y&gE5<`(p%A$F=wUeThXP)k?ZUqwh1vgk^q5LzFPw>975Q(+V#=Ccj{eV*5c^;3VHfJ2v4>H9B;zjN zF)|E{n~%pkWPa4);G98Q1)#cN`5lhqNhDvdY%%9!vd0`RPnzGsNfu+X9avNr3lxFI zu_=0}4$c*B0OmA4%I{2X0=I;`9pxzN3gFJd45z1X7P!A~RdBJe`nIH+7e&phbv%IJIHW zQLbcWHHY8Gjlh24W?;2W2lCcn4$;z0M==jta|4r$#xz>@S)r@?`L1 zijn`UIP=A#GI)`28u)o(+{)U^!qvd5gxOW|A7R!TH7bJ0I)k@Ujyoj@%xM&4Rz|g! z2h7U&wHkJTp(YH6#1V_*xUlN66lP>+gx zoPZmH)yN5$(?~FKf^Ih$n!_+g0_p&sDBK17pzu)eOyNo3$AtN%tAiBJ>N~#+8@Z@ z1@9I47O-0T1NkoSVUh0va}6ou`Uw|jtQ%w8Mxt?aJtBAgL8!Q!66QpGere36bN&LVL32 zRjd$R2&N_lUJO@6a%wnv1(=iN$!vmm2yOYR}+o}*A`~e%t@0BryaOZm~%hd3KxSptP`T6;V|?RixO~uVK$@1!c)NPg`oRs z;L*Ztz{U$d0#;)`aPuTssRINr06!{jo&`T4yo8%AED*y|SS%6d@+0=$FtS&`{Ng9C z0k0AMFL=E$o87mBIRO2>@JHZn!fb+f3-1Acr5N}BVHl2z#Yymw!WY253UdJZqA;7+ ztHK&?Pc>GA#JRwn%f*Cxz>&gSU!%s2AoqdQxDhx8oUDdjV2FnyRXmgfR}oGE^Ocf; zay3@IaAj}<;dF3Q;Vf`F;cRec;cDQX!nMKug+ujVC>8_T>EXhC!J~x-fu{(M1asCO z6U3(ZQQ;@SPY6@P+XCV3;3dL)z@@^cz!;3O+W+#nP1I-GRfSab*P6y|cby}}#`WnVEP zV{h4E;mP0=!mNlt3v+GXZ^EosmxVWguM4xM;)6dP_q%kjNyP`Coyp4nHmLyMFVhOk+TVR2IU68N<6 zH85wB(gR1EuLwut%-%xESwt9)P|RWp7fu653)iAsVd`d4Dg(>o{->5kHOz*9I69dr zj#`3qg*$`ug}Z{;MbC&?Tup^1gIfu+leUBKi{P%p)Zo%vcmsFV2{!OU~M43*ZXE3_D$zVdn^!_o4i2ilGk91;Xqp zYa~1u=OW<+IJXi05N8bQs04kAb9dpLIQJFajq@Pk{WuR5{ubvkWVZil=u(<07OlXK z2)6~#7j6$Wg*$>@5xxujs_;1Qe}!j)Hww=OmkB=uX2O|^FM~rLi(w@UyM*5Xe<}Pf z_#5G!;O~X^f=>$X2cH%`06s7LE%=J?A@HBV--9_>1c?Y~M*-oMK|6tSv@pjAI6;Uh z{Tb&Z;WIc_68;nCOyMwe1XdG{26IS~emNXjPdEw8Av(%AXwWhm2~Pt*Bs?8FOL$fYhR4OQ82prQDfn68m%%Rx zuL3UlU{wqV=oa{_ z$k{J=LD&m+!7dJce_TKxDSQu@Sx@;8aDp&D z(cl+^gWzSt$>7(7Gr;SF*`fKSa1QugVRmkAVfi!AnlS7T=BN1Q!u+(}C(J3?-wJa| z_7UOU;FH3A!Ka1q2A>xm1ZHtEuA$&Rg+s$(;AAaYj0AK1kvtw8Ej$Ix?l;P3f|G>j zfh!3w17`}a1alaU?$?293vUD06Xut7VGQ5@;fSBsEyRL7l zFB||D3v;^laNz{-XyLBl@xq)9Jym#A7|MT!7{jmCxj=17YHu~FA;tLTq?{# zdd@T9#ViA_5$25P^}?@#-xB7B?EB;pJn&0)n^B8(at13JQTwAypTu*oixKMZ~ zxDBUWvIs`N&{ddIskwrT@+sf}!ZX1`g!$b+TKIYJ6k*PXnI*go{G>29(O4qPsbkB9 zLnmPPuNY2(-xmHEyj7SRUVJKi9lT%IkFVN;!t4(?Cd?kLABEW;@T+iT@I_(v4P1?t z_CEuLTVjy~c3}vGSDyop66U5D0paT4pfG#HQiL0U(}bIVvxSSmHH2G&>j<~zvYUot zXa|dC!X3e_h3^7)6dnNXCj2nCk1(fR4-|eHe6KKj!A1(N0*@8`7Cec}_TPgq+=s-1 zoddIkec;E1W57=d8(^;ZV-CfGmkOtYUlC?U)2qTY!2cEI^rel$>|+R(iJ>tJ9||`G zbDba~VCTawVRk-zDclkKjWD%Pe=p2Vsvm^AgMSeo2tF^&&Wb-Q4r$Y2xG5IwXrlH> zM*IvoLYSRSeqnY>#0zu!ba~;|z?FqLV>(OtYjCbG_pi$nJ`QdWFYP}&i>P6O5wr85 zmGCWa7h%qT?kyYu4-ifO4-sbP!$@KF35^r30iGgU8$3g}4*O>2h@l?%Nn!R-EEHx3 zg(+MFeo2_K?^X)4e`u}nMDQEJkAdG7ehU17@B;95uxkIGhhe8!u)pU^;bq`&gsDg2 zdtr9L{2OKye!}d6xkq>k zc$n}K@F-z+uapQc2Tu`R34U1kHSp|^7}mouPk0mf8R7T9&k1hrvnXx~Cx9`J#CredHV+XPrRMEd8SEEkpG~|lcXKE&+!S0{n6ss`gt>!5u5d4K zo-n&w>I;ttHxZu7{-2g&U_VcLVa`A7BK#byk?LTKU&Jl|X;3tJIffow18^sj90e(sN7I>v_5TE30g>%4f2p53g7H03q z2g0qvq3vSm3d3i@y}(}xv&Z9W;Su0N!gIjKh1qHGlkjukv%(*MFA1{~;+pWs;J+*m zX`jImR?aGWb{<6uUj+w*Z-axv9(=i`2(u3-O*jXfEnFL1L%1Qhj&Lh*L*Y)~X62;) zp8!K^v6u|*D9mZ5-Guq6-bZ*oc%bll@V&zCfJX{{4IV4ZPxVQ{Vff;DNH{zM!z?lQ zz>f6r)g>AE+&aD}dVxr-3^Q*8ulajPmDK={;gm2)$n!jr+vLSmQ(!)wCR!Rv%Mb@)wTe$l=w zya2pKm|wR$gqMIn7hVe9C;TG#Tj7_%M}$MmVK^y&lYY4UP7*n zPk3~wy-;>;qkmW*Fo)XOcJYlE!JveD*2~S03+xPhU zxUlA`{FgB9G)I2vpW?c5+dTQDzcZwH`ykCUXYKRn>aUn-MoNN#jul2(gnu3d=Kg*D zY|s43sLAGE`}`TMtB+aw(i-gd8=lC=k&S9?Rxylvky*0epN$#JOL>}UZs%#0d4?y$ zjQt8BY0FVh&5f}s8G3;^_$z;+S)?1birI#yrDC?Apg=9inppOdZam`(okL3WHTXe> z+({ZxbN$Sp1GVvsHC8itaz%Vi88_ni-`o3e(kGT)ZBouWoCJl{T3l9))mks}Cja=x=spv7PR2>1KKJp3t;-f&jm!?u`g!9EB1bw6lK@0r*a?Q~mBS(MIe9mJu ztICO3`povQ;8BQwy|gZ5zS;1K42OVgzI|9a=P_#OEzKI?Mq*>m5!L52#T(%kN7OHL zzS0h-2qL|dlR~X0*@AG|sBqq3I8mi@1% zESpdq)8*gHRW50i(zvWitnsqz-?-LW7}@^OQ$~)vXTrqsWALw;$L_9BuB=~zG0$yw z-Q%ugcCH`Q)m&dc$}p3&5{u0zrh2=Y=j%lkn}?@*YnQD^HYz2A3YY`vY~s;}j9w2O z6Uq2?=W&zFs(_;yS&p0LO_1PSy_YaK!q|n~QGn5^QO{0poQ+t0r>h1ZOSNM@!!HyD0A*wXc&65Ik?cs_EbQRS1)rG z)toM)xWwE@@obd0^>n^S=?A9X#K_iD&8j$gzJ_HdOEv0 z`~ve*6C=?a*QSCeSaWQxR5|kM*0U7xH#DDqMK9;6m)Ag^+NEV{Z^c9hLWglP;w|RR z;d%mi=VAQ_YA+tv)zMb{v!0sICp>4_F^cunZ}JrB;Q%0>&>1|rJw1@Mc-Fha{hT>VR#COT2xQ-P;{U|=1_#>X-VJS&zK_-^*H0)$N4atZxkfqzTeIA{y^)Gy40d>;3q<<*@l+W3-A%qiOn-!JlGY@wbd<=bRXx5YQB|7TFA%# zsTsZ$T;0PyKX|(DZv_63FAp9b^s)bDnvZjtr}{W5HO0sI$f3!;@vxrc;~3&ZALm(3 z@O4IX<9%*;DDmA7TdcOe4N>Hvj}ckqbo^ko^#|}B^&o#X6Oj#w%wBDs3cpc1U#D}m z)n3$YvNx&|B90Pm^9Sk1EQ|@%3{iW#<~xKqbYCQXT|Q1#4f72_z-}LxcYAzXIu`EZ zs-g&A9|r8J!U%m!aqV6or>^;YKf`ad=ADd?vBH{*M10f;s`)r{qx&AhwYYp7HxBc0 zQoh^A3CA8S#k(3FvBG)?eLT&p@v$=wE0a5$?f^!{>lio;@~W}KnlqZUAPW#n ztXY8W;O`8;uM8E+-8Tj0qqrc*`r?bz^WnHtkZO*6L7h`O*9G5WY{@#S&xRmp=s?>k z4cmhK=_gf3l=o=+f;({K(9u{2eh&mk&|R)hJ(CB6Y|?yr`Un_~1o_ed4X7W%a3aXH zG`0rR;5lYdYrQ*SJssryB`oKj53jcpUo#_&K-KD(cv-!44nu|OiQIVxDo^<)7p*6< zu%JzmCcmB-<}n8tf#gOR3}vvA#_EZ)n2uq}6sIS0k~tQ9A45VC^u$jX_B5ppKMC1- z#N1#6GWAc*Zw#zweznXS3sZ>G$Mk@Uj{u$XPg9uf5HO=tn6==62rp$Be!z5t_JLWS zoK5R4mfzcV{B}`(E1)D`r@TIZ`~fSk6}i@49~-7;qGF_^hAfkctr5}-8(yzgiON3o zMqxVVQCn$h6s8KlQhyYRKFOnV60>D9$)o&#NiUN;E8snar2uAFl{+%rDT-4oGdw+H zSwLB2H@xyI1NyCgpjG>D-s3zF4PM8;hcI2`N&9dWKcpF0O4>f0cc9)Qld4N$TEy(> zsio~UAC3={udaObQ9jbdN1y-Uqfa=q20pU3m>Lo@mtv%i>2?qLSv(Ht(u3mmCz)~-L9I3LBeO-lB9f?I) zmxFe-@~{sG6CD&hiFc6#@8Rq_R@`1m?iu*@7-F3?b|iquOSUWXto zcs19T3#8z&`Z*lce~F1);^OPfRFxQZM_P$lqQakz!bw;8wnWA72F<^ljS>Tus;O$W z+^Q=Ds^YA$3^hhDtW_@7JlDda`gfa;BnCcBQ^`(H*LVq6WCdGJXXZA?KY|^Z6sVM@ z>O+!JipqyW`gg2%N%|006JUCOb4^m9N*w1P=#Q(=7C~G;=rKyUc7;Y2%LPV~iacr3-~3PcKyeZ`5Y)Sd;a6*}LfVCp zkUwU6a-dz(LDu3Im2FF9n~6^e+CGvTXqi+%+n-!4*(z8q4GX1F zNiXFfzg2|cZe{~#scUs|SoaG(4CE;O_0m$jD_hPA)ji2^zw|H7r4<5qyKY38S1SbC z)^Er>uEGTwT88p;<&LK+%2RjNU3D{8Q8)7hnjb8iSTPXLbGbM~->l^Dto2qQRK@s} z742pf!XDPjt>*elfeP8NyzZkO=9mvv2VDer93NGVIgc^DpLwZLpdxOwK;=N|#!VPW znraF7zJFLn(i&(*lBVu!F0f7C%Ir*2cYg-Dl+(MI&r}W!ggTycl>=4dR0%9nt}nw@ zYq;3VNrgO&zNUxs^{NnMUmw|iZ)%`v_4k-HYn6NEZx4EYcI8`8_yiPCsXvyX>o>fO{Hx>mt8E}qrLOdTo@ni9$wLT7a!S1(drChfeYc5L< zB!sB*Cazy*qAhRzBSHywu6sw&rZw^`b^s&n@Q?6CWU0}SLUt)zLAK^HwsPaymn?!Y zxEm6C&H6_$5n%`2M<)_Uc8p^}9$-(wsdMuvp`>_`}Q6 z+Bb|S8=Db$JQ%SJb-<-HF!#+glG8?vePCFv`vy!u zpwv_LY3IP+7_;*pcdEI!K~#R(j{^fmeL`GHXm`R4Aft$ROdul%d8{C#PVwMUWu5gN z$1*b7DjpljY&3A3Afo}`!L_kEzQcHMd8>{)mB(Omg6f38dna<=UhmE}S4Wofh(u!a zB#Sw(#a;(Ln#?bC99zlkX~8ju?E+f`9MlG<^D`UASL8|-|3PMJkK=X}%2iJV;i!Ys z*3&Gek}5sj;%r>Go?&r0v=4fw#heMOvr6FL+-bdv#T}75dbY)!RjlV&+!eWKcT=fu z4qUXl{`+WwtKgyfIfQ3Wjv_$V);f4FyPDKGcrY_yfw)NpQ^POaR|CHwTmV+x7Ptt8 zqq;4?%;5LnCdA=l2DFtPz|1|qWRjUnyM>uCs#6266FdK%ow2<408zoRpA+P=;2XmS!<#-@yoLWj| z@f{Fm-8?AFdT^GETan>#rYITFSxec$A;!n%o))}Y_#w6<(D>!06YW+Hx0re9{3}`eNk7>FYFHAR6 zh4E0)W(c#XcvP6V@`Nxe^#Wm5>LtQyy#GqYkO>P;MP+2XmDdRK_FXT`EPYG3I#_83 zhWlDzF2bbWI^fTQ8-c$NE(Cuq+zfn(%&93YU^p%o?ZH0_cLH-xD+BEgR?FAHJ;B#S zJ`}8$uR}f#>_VeL_mjXuGO{oe%zY@xdEhkR`rr_To|Hv%7&xbuj#`2FeN1i(=KNMN z6Q@)QgPAy`S{Te*m#aeQh6z=gg~7eRO0zJy5120(bkiSvuf-v4I1D4jVj@_rS%;%J zV6|i&JP$la+&l$-M)(!*QsGr#&W&XRtHElSI{0<)CXv4beovVF1zXk9bU4}!!zW^~ z6}(&cBk+FV&%oaae-1t>`~~=w@IEl-*fJ46f!X0i{sqiAw&XM5o5H`L{%QPJp~V$& zgz!}`U)U(W4(7U6@=b7g;oD&9-lAOBF}N%22ImS#fT?$nZoJ_7!hUcQaEKNG7+Q)& zEV#XJ0=SECI=Gi`E%4pKR6{XXxGtDl?igkRFz48kIY2W(m;*Fa>qB`vE=^%?0S$M- zVvaC1E-nxr3^s-D1#|K(-H!sV6y{PEPQImlGFYiG22TaQEpn=@psG5$;mG86#mN7e zFnlH!PlDC@bvSw+e2j8DE8WOywPYO}1y)Pe!E8#oke6=QlBy-^U^Y-{$vT(~lonyR zVM7#8MoYyo6GILIC*N{85!>q8!VI*YFj{DhyCKpIBWNMaKskSw@=UP31idP_zsPHX zi-jA2hYE*^U{K4>(OxoQPPmN&Gh$A-B{SlA!i@MCVMhF%Fe83ZI2*iNxHfp5FeBb1 z%y$B;4o3Tr2-pI06>uCL)beu3^TDS@UI@M{+!}mKn2i#@ zz8Ow0uvfS*+kejVr3Ih&<%GwBD+o^qbJj22JPOVcega%mcoCTW33T%UxRLNOaFOsD za2w$b;7;TaJiHAXMJV1C0SS>Y&o9$pOIc5Yqz)Bx7vkHgOhb%msZon?cmyq#H zH^8OBsE^tTVN@3_v_=dF*IGsn4^_Z#iJVWl_k|0<+k^|jp9;4De=gh^%o)I(uEOJ# zgU<*vaqP&2n~)k-tt4elH*NtlVQB#d-xnZj9Mr5hRU ztAaTjn0{-4IRTi=Ct)Gq|7oZT1A9-%jlo=sOl}J9DclN7O{|AFs{K`*bO)M zvley(SdrDjZg5pFXB9Jiwk2v|cUlPdFbryCH!N5W9ur5b2lItl4;BeG2R|>|3(RTA z43y=%N_aF_E%Jt(#itf|gQtMs5jV5Io7K{ESj>ZAn^-Icb6Rm+Isga9+-&|y81E0- zSz%^1N2Tb7cgJ7CydxsE=g1jNRKLowuLV6|!++yXpNA?Gc(NaUly&kK(MzbyP9+y7N!m<@~n2(t(_2%F${giFDjgotY6T-iM&yqt(=|vd+5DUJ?@l%Ia76tYSM}uR8G4P|7v&UuP z6AjL@DF?%gRzo-&Tt}Ei&`_8~&`h`?IK=tM^vojQns;(@uv(lA9tc*8v%#alL&VLq z;L*Y>z*B_RgVn-oxPJ$%)?I_Qfz`Te@W)`a?m83s{{;+7#q+n|SA-9OUll$IUMqYY zyqSzD?FN73V6L5~JOXmAohPIH(m3Ur%m(VPaAoi@wKN?TtjU*X0lYKRLE%(ziZH`Z6Xum^jJ@a}qY)ur*vH z+zPxzxHEVy8JET4ctaR%koLAPbMXUV=HgaiG*D#^?Fzh|1ihbmC!y^4d2<#|oy`3w z15;f4#+V&W1v*1p{nAsAPBqW)w8m`sW1x%c;8^pCA7MGuJOm@QnXUR0PNU6fJUwde z!pU`UyqWwn+>9_s{tV;kiRSw-x~@z#y}v+QYWDjDj^8rZ^7OoUgD3Q^pT=pfxfCbY zl_}=0r{OfxY(k69&cIk?9)b~Cd8_`4Q*CqFuYoCgv3ZH6>1Ok@Fd621XJMLe zM*W7<2(#aBfm}>riCvo*Z$AH9z<_A&Z-H!2eh17kwzT`7hS+tnmo<;nI0rW_GwmGQ zH0q7}$C^$`={B>3(mx^HW6pXnJl@;@vH!#uFr&7QLk^Fz^!)EM&%mXgW5%AxX`R{d zeBd7)|AW>gCb{w(JiFms4laKAy2Q%9DMc|B}d*`-Y>b`DYr+G?*|AC66bU zhu=z=h62|(MLfZi+rtreOhb9jI!&cekL35C$NdNl;gggzH)qsg8VSGoFcSkgR}z__ z_cTjhPh1qa3{G5li#GSqG~)kFM>qP^+ndcML>B!U$DF%Z_RGaUHNC7=e#Hd6Z07HQ zWiHosHx$q&;@k1LSWHG;Wo~~fF~gJX!lUBZ<-cXUnC!t8p|AM7{|0U>k0 zLn6b~oZ5)z;4a+#I({QvTW|xqYYYRshU3}d3FGt7H3?C8JoSnF;lL93}GdvS_dj$(3$*I^fcm$OsC3l75(JpPRog*W7LDvC=R6CxUSS8mL} zDSwWhXEr$Huj|_9HpiawC)O;FOO5O_9}ZCDrAT!E`~T+SY#duHhWSs31~gc;Dxci1!>Ec{dX^FNZU{TjvAaUM|`7?%V;k zX7G4-lfB+WxB~CK_rTHKJ`CV%vOjkGu;H5bFgeCMiGGigxtGE+MCqEw4r5<_7G>_} zf=MtLoT{f8o8eeD_^falQMj-$gI~yQgSzHC2A`7QhKWm!F#ZEKkw!9nMHzjO-Cl!p zMSaF)Tst;srf#3;25P?G*Kp~MQTr4dRC=Ttt=hwpZhV0&bQ!fhRQ8d)&A=L@}!5KZ7J z11j>ig(Prw2e^fI7g7?qL2jkWHgI!4lF}x~b}&#*r-ydIbkw6jxsWoo53=h#kf;nD z%1wM=ycS5(d6RVtat00NVbIVuI32%%3OWbddIoc7sHhCRgE|AKq@48)QXeRGKsbU} z2Lyj(MA`b6a6P)*0~2t$RduFqOb`=OLt3D^@-!}(zz}LE!^CnE25W(u%Font6DHgI zV7c)V$7+Gv%3^x3GNZ{;iJlQ`gCfQpBwk!7SeG_+Rai5F>_`bTQ0aU$$i^bjP#GQz zuH$ey_F3S?%?&o8r)J79Kge%N?6W|d1;L8{7#0W1nA0tk&GW%WSyx)B;7WrJ@k(1M z!^=VLJ&t`Am{rSy?5Dv#3%u+V!5uVoQifHb;C9B^MY($|xSm$sb@mag39e?b_fUp) z!HT$nu+IW*HU!h?tgp_y{jFdZI=fqE6z>LKW@yDam#1$IdRPyJ=&YFAf`2nTL-pG* z>$tUeRSD|; za-Cvf6)#opUs3Mi{N4ZQoO!Cb-euZGf2>@x`m1}E7xYiSnEc2~o663*a5t4eCf?@t zTP~~!J#_IHZ~dr;kyh*o!EE(%7Gq#JFI@9d7e-(u*^OY>=@vB?scIKE&YR3?0Df>Z z0E(pn_<^-k8UV$4p;*-bD1$TrilqTK#ptC0IOS*nPB|KYQ;r7U6mz46mpf1eeqqbk zN>ked1@_Xy7lqKc3O;%cOu80zjZ0&(X$5PQYH^I)L@jolX8g@^aF-iBYz)3aRAr3} z@exvWHNDi$?il1Dt;5~ykBQ(DKJ68dKGU*=RSN#~Qg(KvGw6RTGF0$0 zmH$v0TxF^_W~w;!o>^NM<0Hzt1#GL7X!>jwYB5Y&_8Z7tq)+vF>!p!s-Ey`;Gy|fX z&jD;ja=r!p0H}HrQ1v{2s134O1;`kva!`e%ILZ%S{;f~|cO2!?^Fl~+8Nh!D3}hDo zM|EzVs?S9HstZCdWv4<7wHwGIyh0!Hq$a;&+0((!hgxb6>)GsQs0zDkv@@%p_a}!A zvBN8m(|7f@s{Zl%TH;?Xt?0*BuBtk1RYfa=&y3!zKW$ZI8$q+GIc;@ToyGXiM*+82 z;ppA#uwthosALA$L-!-RoOY0HgTtIAfCH|+pnT9T6lL2`0q`d!@c>o}tpMKu+F7Kv zuHId5gcMg}<;hkxiz()X>ZM#PosJY_ql#6$;IGh!1y)z@sn@Qn_Xzu4?*ZR9p;qSI zhmiHW|K)#|_|J1O(joZIP;ve&B(P6@rEkMeS{9h?sWTi}3F}`ERcsJlq%DBi_ zrR*fFc?DN(cZs+Q{~syKW6Fl{ZvDne8LRO`m9hf#oG@kIs6uQ2H(9OC1(*B@UKT0` zC$oyo^_Tp)al9RT<4mMqKfy?tO)YV&>ZR?`byN5n(|Lm5QhgCyp}K`m?0}n>XjFI53En{0 zVXQF@tLRQL5bCk1^%K3S2joN;o3PmbgDO}94byLQ#KNidA?|R?n2h>fi{m8vIfhR~ zu?_ekTM9h}lyF>zR#+&*bKs$Q9 zJqKRZJx%?w>YiphsBURSq;6@pU`4#8)$ObUwB`@shqv?d@XuSiu~x7IBG#(9A-%in zVHmWU7xB{-|I~_<#We_eoN9S0BaAHSgVE#lc%<+Vm{n`TuWgo@o~ozAk4o7J#?01+ zV+bl`dkAc76fkASDPd!ig=a>RR=|a?*$4&(l4om(a0%dV6Qm(i)UDi$Ba?ggT_eHdx1-0STnNfL6E+&xk<(t9op|P}o z5Jg~eNhhqBN!*Sx!^<++9>%v8?p>C}DN*{zVOb24=I&P3Y6B4+IKn!~U8EA>#VgXM!;+A(`Q%GIARW$^<5bJuqu96#!C z)}stCLYZ6A{0$Qqsm#4u#|Oc_xB1;Qe_GZi#){DLRcP~Jo54*7V4e?0pVIt}*Q|Km zUn!*0kgq}+gPWO|S)hEafvJ^xy{fBhT?>nw*M{$8WJW2%$8*_Lf@r%!#@wTs#o0sM z{Mme6WH!JC*&B@qTFxPesO>F>GoF7TT=b&6BXQrfz6Fuqy#S~sn_pb_SFX-&7xZ;* zyO{1(;k=4)tn6H;-Z!hl1G6*fhCf61n}s+0Ndu`2Uf`XhTvgHKit^Q_F9F}bAnvXpE zUU||7v|&E5))(U+(ucsfY%uDv$_NIavW77QrWMCxp_|n#_Qe-2iCQ-u<$WfFcLN_ zAxOg?*1UiJoeUdH6PtlPalWYk4j&P`q4KC|T2J=y2H^}0HK9N+eX2b2Mm;5yJ$y`V zMs(JjWwM74MyhpUb+kN2p-QltRZzjyg(-E|`0<)v(ZjNCo{C`ksGf{Kks#-5pL)4r z1HgovLvH%xMl&T$NK^dlrGLW@Bf70}e-MJUl6Bk7WIZ7fYbxR|VQO9--mc^7&RdaL z6*$a0)1?(Ogw_9OHy$=m-1H~3o`M%a#_@oM&B8gxq3)pvJiJq5aA&mY$f`S5nQ_jnqmHH(ROL8X=&ZnxR?Z@3=}yU&NZhS6=A*FZ1;?mB&dA72N0<_kyy-=(xp1JMrn+Ed88-Rfyl zHl2%+y_7Q}Ect4f66WAX>(UIC@oDNZOU;rk5p&J1ucve_tE92N-^>ELf1{Jn#JaPThHs?WnPP92N&1{G)@p;MVrcg#|WK_qEMg4$gNl*9O>b zI@!$Y?`Ipp6C6C#!EZWvtAqDA_>hCCqri^rcL!^H+DQfE4Em65NOo9cJGj8X%^j?C z9Y{c&?QVxdEz&k~Jl$q4wX~T7%)%kH$(n7!S?V^w<6y3%x8?gB%sta=IVYXle9ggb zzU)duRiC(UB_+4&pO))z)WE^59o*f)#SZ3tZ##nb9DK~d>a|}Y=JaaYeL21x+Xhaf zwz;l@n>+X}2lsREFbB_bFcnkSVJ>&@>%!{#-*Z@Sqa@pdS{Nv)<`{`Bzu{o28@A$gsr2!Mz+j&cV|iJlDa`Ie3GEH#>NjgMYHvs)&~y7Myo#Uu+dJZet$R z!12P(D6eM8IoH&7-^C&C>5yYi=^Zx@INUtMp*B09IkZ6Kf5f3$60Y>pw|@MEo<@_I$y11UJ_mtVjP7F(-A{S05mw zxOv2b=02+B-bl1-9LHceo$maL>JY>Bo*+7U0JBPmzY;dzBazS<#w(;@$iED`JmGlEn^_PxUmx74x2 zKd0ELe;QTZ+7^F1n0xBj@))v2P>C$LRh5k5;lWv(@nF`Q=9J6Dv~jra=8*U13`^TH zr(W8DDmfCuV>aY0PX=l_JeNA$uXf1Sk;U&`GX8mdg>yXq8O{%sBXR2be-#5A-5}$i z$6q+p1HKQn@EFSj+l=jDm_t5>jDH^7VTOL$b-;~eY`;%Aco7-@Jh+hz-6wKXWTpAkBq(cpoAy#% z+#tqw%Y9&MK1!}>g>jn99&8-Hf#bnUJJ%-I;dsd6-f+mvlkv}k9iH$TQi-qSaMZxT zP00A?(Hv(+hW-VuGv$)#J`OH+@Gvs|c}#IImD<{gdzRa==;&19VZtIF%&Yk?9Z3Wm z93DP!$aguI%4qFC4>{z=$kkQw+IffkciTNH;%$dT7!qJ7C<4p`u|+i~mn=;oOXAYV z_~%j0!F9>vzJ-H3JD5AL+<7A$P7Ah(IPM3>gITX8IXrL#$&UC@hx}=W{8@+mC5N2q zS8Ts;{Nu*jj>WdvLJP^RFC88Z{Nq78=8&Iq$j>?Cm&p>&HHRBspdFW&94ifB3=F*D zNx0(j%7XcTTI!Hjp(*Wsp?!%YK+n^q1t?Z}d#J`Oj<+>XT#bfkmFJ9wspA0y+R z$5ID#M-^NC2ACIf5pLe4T_Shw zE%!M%!NCN#& zeCX)J=CK;gT@iR}amYUsIr>_(&nOqaUy&t(?;P&Gcev;92Hacs-&uzT?%`nv^d}je z&pd8}5#pL!Rf57lK1}K%E?px{)Oj)Xro_Jee##*~?~wmamPETze{8=2a*9>|RK<$N zUK$TGFCJ?D@wbI4zH$Tv9TZ<8hbFCBct;XdTXeQv9OiUh}3 zw(bHpJa!@~ktGos4tY(7ywJfN9DFw!Ve**b;HSxU`@fWiRJg$L5;#89O2kIWCE|B1 z56aDUhx|(iA0Wdoj|&dwr<{E;K60AnCXkHskB5OZKZ6z$S&qX)9f!PuL*CUP??skC zr#jrsCZ}7GJr0fsGp-jYXIzM1TjucaU)uum4;;LWECC&Lxc`xy0mnE_gX6)B;1=a_ zF>F)ptB)p&JQjTC{l9|4BF*8Uh%6DbBFkOS)#1LMgNHcyK8O2p4*4Xq6=q0#fd;AV zuaYy>#b|56@nGKHA5t!<{>b6}3y1uOgMW4K1&8}T9r8%Dih4EXKaO(BU~vjr5>Xk< zM0A8z4Tqb?4lZ)IzlSUrb3ZxD3UdrN9?a*TpnVafM8*3en__ z0js+mJhAM7`7vYjL!1w7_r|KRN9nU{7Y4cXJ3d49S_yNx!O}67OJ)tmp@y`i%V;a* zF_!#18C?K8Dx#;?{+wS!=7yC#xO~R`FyX$A_Pf8D%!Btt9@Lv+zp{@dMBP4;87h{Wj~gmBO|wXB;pF~Hoh-86+#?b zzHYaQN-Ll=U}?w&yG>EOf0>qh&eOB&VOQjisv5lh2`B>26yY(=!CbLJIdV{&Bh1oK zI~zdG(s@DTECmiJ(>-&3wJ1y&jY!EL~5xgxj|I8)qr0dsCW{dNN@4T0d^V5K1t+z(tRZU%vi6eItOVdy~v z@{`%vPncis_XuZ!hY8mJj}p!Yb5SDwHULi-E(CMtJ>^Zoj|(>kzd%MMWUem@iGg?2 zYr?#X)(PXYQ0)&x53JbliJWzFt8gm#6JZv?ZsAPueqlC4-wEe{j|zu!Vc-fgM!?qj zjBp;9vnMGp0ACfZ5B^h_Mdrt4P?00ACSDl1t(6x>256Oqd65~y%-woQDaGQxh{^ZiiV7=!buzE;8DV??Ips@xhcYUbPl6Yyl=*5K*F?ZA%+_XN)u=6%0JnD=_A@V($=!X@BMN-H2Pky-Q}Ex^12PD>#3 zcKSq^w~*2n2zd@zX$u7N4pQ0z!5zR#TOgPTQrZH+eZfjwAb0>+X$u4oM*UMuNEq2z z@Lv+yBybqoU&`l!qlBLZ2ZUb$2Zh&xQ-s%px#pODH-fo^H~AfKP2u;zb-^K8Y=)sw zEVh7K2yX|s6W#&lJPEr06wEEW$veT^s+;^dxLEiL@NnUMV5K1tZoURj5c#)k|CNeB zSR8_d(hvwf0iGj{eg;1&da_U4>8Ui7wPQ*7vPMwHv3v>0# zX2r<=APgUg1^a?`3g>|L3Uh_~0paT4!@@PeCxodi<7Z(mf#hmzCbT~IcVVt0zad-% z{>#2%C`i-{G<{U6%G)P{guUP*;b^c@DF`>L6CFg34AZz5ICWj}xYxn=2{STk{EuU$!SSerLr;r= ziCrqpO0-P468JS?X6ZWNs^AU6%+im^c)H-E?Gk1}zZ7OdzY*r+_>jdREfof?Xtot) zQa1%T3i9j1KJaZ}Jb5)YEa}Dodxe<+hHx5~laA?zHJ=lE$T{FD!nMKGlvY4k)P;ew ze5hEH#lbabWJcCrm^su%n3aw*f#?QbWR`|NFrOVtLm;>Y7_)+u8{R<^gd2c4L5O}E zvHj=DY#R8KjZ9j67%2R2N3es^tsgI~NK&EH|vMErnU$O1mKZ zRs(kxIm^DcVqAJd7zT(%d+-q9LEsU>#bBjg5CO5Vnke$2V5MFVau&@@k&gr`?ShcA zXsF$R7cdsQNO(N>C8ZS*787AmDh0ul!Ahkdn8mSPJg_*nlX1DY8MM!YnG;_KBf~6> zf^fsTfUA$_J`>FKg5+#4XKIl{%nGGm5QaKn&f1~{Te@q)ZNOZlKzT244DLs&9%XSP z2uFaqXoqq*)l!AoaAgX!4X97XEknOelvY3(cm>=9hZeXSwf4fu0FBeXC}*S8OPJ+) zw{Sjquy7IhKH*m265+PsDZ(t`hlM+_>dzKKH&}3r7$fTqeoDA6co`Wri&yiSFcZ2? z7+$nZ!Wm#r9i#hP@F&7-5B3SO4fvkS9`cqjP^l3;FsnI5jNB8<&B@9A!PF~49su?r zCFFa+KH0)F)CyInw1Z{-V!JULz zp}GoJ2Xl&8T&fk>NMRQ1SYbREwMoKwOlS{T98zyDv&4cmR;dw8MJmBhi98Ri)CfY( z+m+ME7+GWRf5`C23bjF)mGK>6oGdMZa1#UOlrp;K1@Bc_0b$@3E7gHuWPqhQ5L^{} zOg!X*mF7TX10%aeIhc_t&4FOne5E-M%!rldKrm~*(i{k8#7c7@m>Z^R}kGpoA_GlIK?S$s-EAj07tq%;JA`BWSYHz7t)9R{Tp z5QWMJ=Fl^k<@BU51L9&<%JHY>tdW^RFNvIO$x30~mahx5wwDPv0(1Q;{T3lw?PD=? zgauU@&|(Pqfbjj`KM6ksJ}W!}d_j07*oA_Q!zHqnj1*?e7$eM_;2gKOEaX3O zUP~5>Y;dY@4R94jFT`|);=89Vz_@s}c??F^j@f3-i#VU2ZO*_Mn{Iw_F{TT& z_*J|FS8qLPj=2PBg83nhzs)gYF2nJf$IU@F>kZ7;FGIX}u6di{19Q#JzvFyjuK6;~ z*suHC?+B}t+2jgioM%3L1-1*GFpuF3&o%yl_{5Xuj6am)FKC=Q->h^M#@glsSK;?j z^Fy3m7oRd?t|>nQuR%J%d>tp(^G}<%DeYw5bsfeX&zLV?hq0%5?s`nFKF2J7BPPRB zycC~tW^>}J$jxr%_Ls52==2*ghU;pc`SgvLDo_OZ_Klcq{VVe*Pqj_YpE&($*5Iko z?1fYK3Y7X=G3FzG#-zJeoi$(kGp35C_aJl>nEU^X$#7+lvh+Ph-;6QzhGxZ^G1;Dy zQHWUSdmI3%Yr1ZZxd~t0M&m{_2j3qTZ?2g!|&-G=5AB@qpun6;N6C*3a-k4NreymeZX?|R0X?|P`zdFB3ZOxDOga6U|NQL>( zHJHhh%kvCRksf%#DdJ(C+#Y_bLi6KN>x3(yhkTg+r{>3b%CEZ{Pr7TUrTMY%|1Zst z=8D%maptz#72h{UH8+Nc3dq8i#wr&!hfli-#hsD=TLa_@r2%r6(g69r(g2xYX@KOi znevtf$ON;bt?`d)O||oD-G;UEl=?@#LfKDkjb8!*s*IExd8?0+oJ{Q@u1m<ws zA?WZr)FTm9)(VpFg0JBUUf4Sn-tZdGI}pioN6uwWhVMKZSYKOM>OO4oqG6lYKOus4 z$a_>6;bv4nBRe_~R~pfhKD_hH!hS~kWOn#PwPy{|qM%hsi|V)STtZy0_b^wr|+;0wp^RNqV_VTx}7QZU)a4$?`! zZxO;o-!%A};0qzQ#{2mGQsU!EAn1*x@_z52V+ho6`}!?HfWAlI_B?de#~{SRny)UN zD*3*)5N7%&!z-@wDWuIeZX_JT)57iaGy*m=J-$R-m5!}M`O)H=g>ri&OmhuJK)y9E z!C7P(M27GEhB!s>HOIG^h%H^=&$o3J&>a56{eh7o5M$)&N?2XDcKksj3==03; z{f*Snn{cN4_&jv^<|C*uAIHAjK8})ke9e&Ra9=S}9pT%?kbIvrPTy!`rPsHTN%m0< zJaj-(XLWRgX0Z02hfBA=W1mGiIQXVpPC2`lsn7@CJ?AuBK+gfkvk5j|lUgfkqvDlKJdF zqrmk>gt=>=k>PqR$~-^NXyw}JF$)G6v$Hrj>W--!Kru#@A%vKEa!*iqQB0Go5Jj#s zj|?*IsZ#`}F#}a`DV=OF_s~~#)Xzw1OflKeBH6QN1nRzPg=dbr$4GC=Jv{>5Rk%@H z`xWTPK-^LNknlk7)!^_bYHce$=anFouFM*8Ds z{9q#^v=vU`?xvH%sCKyCxMH>nMNz76;9e%LRn)6UO58AV>nPPLHiju^7o~be#<8Av z(!7Hqa>oz(14;BP#C2-EW%$v3`{3E-dm5!5<|~54?K^>JJicX+ghNB$cx1afp+36= ze4~&9*m4(jQulp@@LawJz+paWb#?n*L{56NyMS4A7c1)D0TkxULzyw0z%eDYSl-XRfZZ3WA8(3`l>KqHpeAv zm6+p(8c(^7MwovOHR`!`N1FAA8I|-{v-dCroolWdW>nXkljyso+nve9~IyZKzVhg7#wzTQg zShmNwt*6CCWTwTaXT7Gm!tZVQ|dJmovOEq)v=!LSsVr_UsJE*r{&qBkRuVH0+IoZFGtsYwfrx*Lz z&WH_Z)0_!}=Xl>UP8ap}6rStc`6l9H%T&7ANgrPJhG@)e)(CGfobMOSjJ2-m9u}bumy=rExLGYQd|G>;x^CCTUriQeo{H{o+!y@ew zf$rbs_`lDL^$nJ0`#sK!P4$NQ+s})&3Lc60N6(8DdBgla&f`u({yWi2ywRrlDU`g>7ZRtFM)TeNXluloB!*2d+pfH;p^fBmV)`m&Z8Yvq_L zHK5K&0X(TL9vmScfhX#qS z<;PnkDx|v*^`!>0tljZk0|AfCZs}qaw%>Uv)&Fau1hkaZ# z5yl1PBJITH%DBkYK$EB@f!a2}^>%4i=Ugq!gK=B)INZ^EHtuGgh~0IWJkP-cEnZy# z4L7UJ*V*Rt)XHdz1=QF1O!Is^&%6M;FZ7YAS|}~E_>1sLv+{BE@1#+yq-!nyHmsg} zwI=ghz1m(BlRbsgY#OpX9o|IUPy z_)Ckghrcs(-nu6Xth1!6PAC0v>?)VB z9u}{#G-I)=LMMJQ_RA98M8JJJOXuVOMQV`WNsai`V(%4fF5# zJ@a4qi1{Dvs>&HRtqS{-Hb5W0`N6Dj75-+{BkMorDp(yMXsy)5`DWG2Ytt#d9oAO} zxobKoQHLX zD(hQ?3(QOK#pblf_FrXz6%4q}tZ#0pJ8q4<6RTOIth3wwW}VUW5TN)M@e}4(@gehJ z?5e&=a|FApZ~Q6#L}}D(!wCZ4*a%h!peF%!AF2`h;34LIc$8V)^|*$#Sg(V%p)fHz2z#UN;~Qo6o_I zn|0IilzB0J!MqB;YQ7%7oyYdq+}%t-z4*(w<6~wWekaV2U=_J2jcy`-GCzS;?xOfN zv1$zDw_%R?BrY)jiz}FO(`?t87Kq{o=4!Z^S=VVj@+;G>_%ySQlrH9>xS#nf?5f8J zPsC#_UPp&M`=NYvbWG(pt-vw@vuwa6Sf4~uyuKc@*t`n6>T$yAWcq50_wjo3M(nD= z39FOO`z`(;-fPyi|4H);>e2dT3+V80kFkWc=YM4Jy574gZo)bW+z0e<4m;NmmPUL2 zFJ|reu2!2Ha_+Y?wc1!U5c=4GnpD=pYL%Rbu>I>2sA&TlVD<8K_nOnXknFd>LHwloN&L2)pQ*a~z}%4dW9C-) zgt-m=#;hyq@8%9TKpx7c2h1@Kz%f??O@xkhbyA{4x5utFd~~ReG(J zPG+r%KIU8SQ1d1{+PoQ$H*aPC%X|=zh}{g($1Ieoj`gMH7qC8mp?DqNSD1BtUt>Oj zZ#3%?yuthfcD2`pf5NVon!S?y)WBY)QL!jHZeYIxn4e6QHI8EScB1%GusXt&E8us` z+F{l6iQ=2$qvq!LCs~>B_s4%(hlS#^h);(sz>jNduV%1CSl{80YvbDHMp&iZir2)N zn{{q)W7dAq!L04w)7&4s8f(VY<~}PEpQe1CJ77z+5UYn1O<*xr4=3_6tTiRC#aEcO z;2q|l@k8d{@T0B zCFUu3g?SoYX`YGK%Q3*;?f>Pw%$%vynUC6$h-ZSpJ`IRx$}*lX^AmW^tff)+D@wzE znObU~bGxgh#x?L~mZlCqX|9idF*n94BuT_M{+nTS#iC5LCl{Do*O&Pv07fesd533oMD!M)A(@Bmi>O=`{2FdNVek1`kI=`tlh+TOFxn(zWM zKY=CY6kcI2k5`$shSr!h6Rwt;#A#)EuLcm1cbl~nJ#N;je$HGDziw8h`rLrV)vEr? ztn55jH;Fg)p7xjjQJD1KZ4!?K z4?N_5*(6>s`-MK7O#E_9~6$b3q1jo+|Yygm&EhVYZU>>aM9e%F}=70UB9muBZTui^e$ zwrN{d$F3^iP`eiGTl)w0MH-fV-7G$=C|`X>dFoKAV}XB0?|7BGFuOCAzqS1Hd&eu+ zFO3k&%dU~5pWIvX_z7iiHj+;-)OF4PT9pzv${@d|5lGY~91nd?{S8?TbS zk!8*+Tt-}&W*ST&5D(?G(OYnZYPK3EJdN2-7hcRb-v7m4pzMwEj{QSaSnT2_UUopA4g}QjpDeOkhQ>h#tPTIWj z>>o@zJVx(E7V5s`n?PYd#ylJ-e2LB5s_+&vs8e{1Aiy#7D*i~C@V*Je1|qkRFuZ>O3`HXTfPV1`G!~iM zFJ3!+B{LNMQ0rJ93H*`F!v|UZyzr-2GG@eO^7(&d@};j#n3G8HF%lF$#9{{ucaw`( zI2{HHBP>By;c;R@h4c6~yYL-iate>JOu2=nq{%B(hT%dQ#r6wC3hOh`{6e)4rs`NX zT#==VRB1IUIzQ^& z%Q~r2j+)^7Lg(UCbN`Yv;`O|W{=H|!TXPEdh)`wSapm{)RHJ_)Rl*$P_x08=rN7FT z^Q-rdH{{E*ef2ZkpQoS6{;mDvm1FuKb^ao64P&Y5_Y(iP{&83J`%QncUgy^u5HAkC zp6ibu5U=gs;V&5w?-_h8+kbLE{1Wd?zxTj+@8GLp|C)jE(+ahI3x4Uqwl9wS8u8y9 z7;hFlnCIsW;so?kj^A`pe9S4ovwQ`$JgvX6sn2r#8wSNkr5{yfOHUhaX-XXu78JWc zI;B^F3fg!&5|^cP7hcfL+sEp-G!^0Bg7z-3GIcG}Ea>QxtxBoINI_>8Sd*Hp+`72H zH7Rw1Xo2ffS*-GcZW*H-@;&-I3RiM8MY)oA++Euub3Hn zIHlK;3MRNuaqUZ~9A9m|o(sI0x>HLz-v!=HRa4+Xw`xB~eV6CYAHq)5$-iYte6%;u|7l3P zj@R0+I5b|P&SA~$O1)PT*0;R#3U1e|MrJ94P42uHDd&$H8gHbHzj|od#y_r9ZsWf; zG~Uc>a^tXg{lec^F|p|1T0b0uew$(OZj)5rkt%HGZu;lVJtt7uek*G^5P5?5!qenn zWU$;p6AMMupJ!o5IWN+cg)KZ?X$lexXO#pBJIRHSGg)(mo#j~MhkXCNVe!+Z>J2gP zsMfis#-G(xs^}fnsj8Z)*S(`kUTrGd$yhNAk11_+_u;K$`l@ub+ANlLO#5fG$Hn7f z4Z5iRR9V;jE62ZRc)T)=@%-WOUNtB)4e(8dgN#`xt*nRVYBC(_T7b$s{J)3Ct9aRd zr4g*~p?>EP@$TMW|B?~$CPeNW5#QQUi|bX&RdSDgtYvm4tXy=#Y59VtP|4*wK;aes z6(i%{kjbJ^@rE^B>eJm&)kS1dXTqv?AoY`@;;n;Uh5g?~#g7Mn50!p6I-cWsjY~fn z6F=R{EbU6So2YuVvx@z_Rc_A>wC?A3J}X{5et}lQYPV}wXGOLi>7TFY-dfx%-BD7+ zJh#sFZ$B$uCGOVh)h>FrqFefh&Wbk(ZqN6BIV*ly)+zq?)ZJY8BZXhm@a|d4 zEX-|OYij$KjgM~&-WBniogJS-HaDCdUrtla3KQaOy?*|{3Gq(B7b5=J3Gv5*cjfp4 zCdThbXdm?Uxec+KTWmIr?@fwV(_UXwzntE>PKq}ovze3PH+gA4`$8IWaV7Cuw0c-p60hW4bZ|yycg0HyftGaCdWrJ z8>KTR$KUp7hS~kxcynfU-nsF$UUq44YCP!0T^9ZGl*JrwiaKZe<)+2|ir&mdi}vz# zBJMxguQoki!+Xr{JU!kb_;1LcGd+G<@Ibb|eR{l_cfNmUdc1jg_gLLk*QWPt^Q3l^ zISUM!>BncVjlPKZ9cIK^dRO`9&4{-Omgf7LW^nuYM9BYsM*KAHft$>XR}3D`DeXNo zKC61}Pdp|D1NZpe$)cj#f#y@sKW}pLb0=PK&eVx>OPZHVUeJ8+{9x z8Lk)qQhM<}p7Mv%DzWsHP4UZf|JRQBvo2_Nwtv*tuniq{!}SkR{eh&>!7U4f1j-9D*jZ3QdY~aH_OUu`E#{@@O+>@?b-Cd zkahvRoKw~TgBt9Vb-CfYcS|(RhKAGpMa`7=4#puIxZhj{s{&Z@+LVu&o8SZHX80Mi zHl^x<6S=H^ZNJxTKu7$pxfA}#+!KFd?t{x3m<+~c4NOL0RU~UBM&YssCev|{qek%; z;XLydxUj6D#~K3q+=3Eai}jIhc`L4Aeh{m+S@C;tSu2#ixRu54!|lv3<4)$caS!vm zxU6wXTH9u@4fqJFrdkuwb{cEerqQKa@!#QjGRH56ysNdA8I)`E-3$BkhSt6CS?3Ow9Ipi~4RA6QLjK%AGa>%SqUAGjZsfUkR zd;@&KtWA8<+(YM|e-&Vsm61NZAXmrw3a?xn$IT6K1+#Xjn&!5+zPUYaYVM3%o4exn z<`UdlPBVci1bW(lY4{BD96ZE4505qLVa~N|VcZMxc@}>So@c%bFEZbQ%etu8iS;Q6 zm4L=@+P6Su0=JrLV%-WWQGdMEti5`tSu?HgMJSDC`dOLnQUkwa)>-lm^Xd3Ka~J$^ z#%b5G;4>Sb37j;K#Xp!Q;@`|ASl^e>#55Bj&I|HPtPi!yIvd8!7vS>dj^Zq0XJejizv}8xV`x<+}XSZ_cH6S9AMsqhnXM7W6Y0W*F=Uq58}xd{}lUQ zV1@-=z;n$yMlUoU$4kwh;>*mR<15WS;cLymV%J25iRE}yB3QhtU^koV;!JZH5;Y>Q z%LX*X51ZAtYQMP^e#WdamzT^P@Ec||xpK{A$g>ar*y4xdPt7CoSLSi5F4b+BR`m=9 z{A!+$%et;ug!N#eG@Ec)*A;i-l*Oy4OV5Q$^AN6SeiZAA9g2S(H#MuJLu+T&{~-eH zZGf6ObT;dnuG?gd{5u|E)^&W8`5!#atoqw?%xc9j&76>5s1!i5|FDmP>LFHG= zZ9oye+^pseSD9&&(BZDzIa+G=isA2hedd(Ca|eseqgv^hP2z>5}`iC;6%!ta`A z~z+OAVvp5RKx9$VHe zMN3@PErm`XW!+NfyxmMAlfEl1>y|>7@#a~$#5^BQH!sAq&1^2D^4WWHc84WbxziALfZzO?Nf1OL2~QJuWccg4LXcH0i)?1k?gt zBix5w{}y-$u4D1LaAWfx+{&yXCD#y$^apV#i&yD%H?wZ*N61t->56xjSr@#CuDJ{Y zY7lV!Ti{ywJWEs;t0Yq+H^58Hjj+BYqxh!yYP0SG^j#UnYlqcGapi7!lX(oj$2?u< z|Lqpgb^Sr}68xBXId+YI$Y>RQ(c-lOzGl`AsAqgl>^l6R`6jFaS;gOqzcAm0zr}4d zU<-ktZNP5)r}-)TulX6QdpOll75GO#4_8oMBY`>=RRz1|Jw#T+u6YlxiCyy^td;4S z_h7BSUN&xb+}}J24>eE5qs=q$c=J45qLx;gmkSA~-H*HiUnEmPP=J@4S;WBQ=JI&0 zSu=WrSu?lM+!${&YwMPpo8!mLEp_U6+5*K4&_{PP;nVPI=Fa#Xa}WHXxi>y;9)Q0v z560h`hhf#kD9;gCrChSkWnKiQ3EWE{R{^{o=bLxnYBGz<1`O0OM{y&w4u%%yB7CY@ zH_`gykH*#Wv);jybzJl}*THGmHuSgXkOc!67E*W(2~70Y+AaM?8=xh=+x!6DW-i4KnD^p`&HJ#*hL!1l{FM11 ze$K4@|9!ba=2=I@)iO^PfzQ>_N`XQGKiB}RQrAw1cb|dX3fMtv+fd}Ft=d(0Ts3@(>4rv#oQUcW$uSRF!#sD&00fxjYZ>5z^;c3d>;PU z;#cB7&8x7-2}S9(ljb_J{?`+T+5qjDNpmT#Xx@vfo3(Sfwnt?2JZ`Iaj<=~;CH`f7 zx^y$oCBBdO0zA;X5D$0lhZuPofirD@=6Zs8HFoWgNV5jdw0K=A=9+K9u1ykY?!zlA zUgr|mTL$sFvFjlNKY}+|nzRm&`z&w>yDl}Y0WJt`EK)ecEd?@F^87n!fbsz_J7-U_T^ zRuj-h=Ie0_^R2k8`Ci=7yiG-iuImgk(!EN58}I;DHHap#8;>(Tj!Vo>;`7bAS6O6! z8DC<48((EUfv-2KF8XFU%>;fSu*nAKxkR6M(u5lXxgMC?;s?!Y6us9x67M&U!B3md z#xI&DCdR!3Uu*Gq;hW5_tLX4H3+R)io6RZ!a}A&v`7qvT@kj6;bE^=iRdX?Z#@q=X zGIznQVHElFz^-8wRu8Ib7?swN4J6=NM&UcKYZ-+%W7-wCrN0N~n788svx<-Okt*e* z>Vrz={kX3AAl3)3ltw+Ax&~927o*aFjy51C+geO9AdFp$DXh*&U5hDP1&_4!b?{iT zUWS@v)(cHj&FA1*W|h{=H_yVZA(eW=UqoQJ4N%9Smzh`Ln`9m`nCZZ6W^M-po6WjE zaILCH!-X_(zs2jO^q|ZwwQk*>HS6BuB{PpZfj80?VBrGqm}}uLWv;Ut;X5;z|G+P1 zrT@#U+x8#{m0lChGuOa{=C(LxZig$G(>)2)u)uI!&paCI^IFREOnkab?lo|Cb6wom ztn2+Ca|=Ae+zRU>_8M20_=)CDc&7S#)qoxZ7TSPuc)58pzS4XyzQH^l-(tQ6Z!&Mh z_n7a%+s&KtgXRzLUh^+ZKd|2dRXFuNZB|3q7tJ;CYv%g+9kZUoKQy<+`ZSjoMi;X$ z%ql?p)~sslAI*A6LVupWw{N)uf56CsqSE*JC2lG2_3$s4m>A?;??0`d3;lAF_}Su5 z*3Ve~A^psz%9WphKSDn({JZp1;{U9lnSRd_ep3Do`q}A!s-NrqHj@*BfL(v+p{6k<QFQ;;AmpOZpk@ zSDlt<9Q-Zj_nVferJi@DCF*A%J&!XBFQ_MKd(ZlhDdxS4c))k9?*5vVh-Jr@@Q~)u z*-$y<*PWg?#XI1)nVzWc?efR*6Wz&XxQ2TK?TbVG_}-i<)Z3EDrB}11T&Fg4yYu(- zgmt&lzJ=dxMxrRI^{H*I+x2yW(m68{2O?<|s@=dUZsAsP=AU36euHl+igt9pIHGBK zca)$1)6b1Aj`XfFl2Q=*x#`cTmiBn#6q%R%5!ulm?|X$pxgHa6?eU)G=w=i>wdaJ^ zkhdzM{J%!#hSPev)tczt$YY;1(Oa+BOuIZi7XPPRo*wRKm-iz-Vbu@OF7GR{i~P)V zL&f()=6(@lgxbFj!~2*b?eZ!!*rmztC z7c2GKWRlZYdu$-`5&z_zL2B;rgP(E2%jrLY0W{GY%t|;Vl-ou(B(YbSp+M|YCYg?H zVDzQ2w^O+FDFNw*DRbwilSOa3RW0kZz zW214dzHi3aSIrQ^u_eSrV)+csk9|lEG>&V^Qij`oz{rW6#D^kt&L_KAQ!PkrlABvq zngwHbkuWPZPi1?dm@4zK0||8q6N+qDr7`-DMId&JJk*?SEm6tlIsUFiiHgPA(vbpB zTRN0_k|B|(3%J&FkwWLWZuclUN zQR;cBLwPgRGuQ93I8oF_WrdNpp5C}Uk~+o=MY?+nn5|DzdYX^)^hT5UiPQ-V>Fcdz z$Y13j^sic+sN7y1$wY>FcM=!!%CA+55uQG*o#T~Xs#zZ8xsBnKFHp)cE)@03AMlSd zI^Es;%}+HI>qq8$pD+U{ue_?GBa6I3BGstx2fyt_i8{eH+5Xsz5^67a%|(ggU?j(X z<|0l^FZ*9!L`E0*IZG0Erq3sbP=1?D%1?(|ep@@-eqy=vPhUlR_%KZ6_top5ksM|! z-yJl8hzf)92WW1+h$=Yq2WhE-@w2Cu1oDTtC5)_Rk@APhIgvJGmOn=6^T-9CbrUhX z8uql`>|#1TP=8SQ6ErKaKvJth^%b6}?3eHsac@a&x;H)7E6a~V1ORPt9M!xm} zRf9xlX}_aoC;vug%b|$Ah8>-!BzckF_&2(+JpUF%2FZ&xW zjkI1CE$p(5Y2`(3Vp4@&m97d$9qy*Nsuod^S7CR#Iy<*}jZ`)7p;LP6?aY|&?*g$7 z%#;@h*C3GRP1?_Z$Qm6E=jg-~h`0}Wlql~|eDbW4fHzsr$qH0{$UnL?QN)$(kEMw- zyc_&p=|uhNDrfRG>jlx#B&+wXf_H0-OBH;^Uz1K$uKFS~;cXqnFf~YPa6N-M^1n`} z^)~xYr4tV{+&~WAaoyU0z!UuMZTOoJ>NeKw9v4+BR`&}3_GO96{a;b+2~GB6V(YoN zaKV2R)C+Z)p$$lvnW-<7_fQ3IXNUA$P?b6Lj`=yu6V<%#e%T_%ntW{XGKWo+!ws1>+rl&=3@rp7q zt0KhQd``eS%Z=HhqhE1FqIP9B@$qirEmST?=S`Ywpk?h`f7A*N#>PSasuhW9ahLmF zE_d}SQQXnrw<1y9d&d8OpGI!ff8D6XZk_@`W%D~J+kCCny(8F?S#9%c*sps@;tua7 z|G7&Nd-zFTny4E8Kq;mNwRA)Izxbxo?UyF1cwROCh07B4)6Llty-$MLpVe=5dmRLX z_1K^>i>L9A_gPRYq#B#K_*AX*lR>S}-U@4X_P%yu_2k@o)|5#B@0;M3IAvlQ{(_eK z+o1NO=Lxq^9i4?+pFidNY60&%H}D4~)#}03BL%UawWleN0|Q_)6QD?44d z%UaoOmwDdS-~Bplcy`m@-HfY7Q5szp;I4rbRsobu2}|H%GtUmL0-Sgrn+T`|T#2;u zUNGw+Q5E2duZC3uCD+1w?_X|$RRX2zyBhdMb6u=Ta>duj|C$@(Y!*!Mjd6ZZ#U=!r z5>RcptQ+eJ=3=Z$Z^fU6RnaYLKT$=u+!gB%PwtLYxh?m?I=jnLa98tO+}pf_=?C=Q zzY?v)!^~^3ioq0r4OTIjtdq5h!Q>mU?)2r|SjAxS<5)MY@{?F4T=F4&x%pLm6;5lw z8w9Si0UzS^<|Fua^D%sv`BQwK`E$I({54i-m+l|PHlWfjnd+dx%Vx@&18s|eJx z0a~T5AsZRpj9o)Eya~I8Y1?ql9Bb3KwX^OCG$VNP?F4K?=*T$|P8*Ykkv2j&Oq1$lfb1GJOova=C zVVT1?T|(e-3rxdLnP=b^%=59HoHT+8``;J{4&;6K=JS5TIOT8iTPWsf<>kI6`yYY8>;|O z@ikOzuD(4L7|lsyl=)1ozCaa!4nD^`4^K0zO#giI3Veb28hnvi-8U>ZtIfgXW}S7f zmGy$E3iUVG02S)10 zRFh%X2oCFBE$v#t5jal3wSvQ+Vb=%_tKE@n1c!gaKUhY8VAlwa_!x(wYXpZAIK-)0 z6H8&&2o6`mt`Qv8S=2RxE9CgEM?l4)8bPPjT4uE!YG6JcH#2v}#pa&aeY1&ibxQ4G z@qMvt5J!A}totqHKL`&s55c2di#rAkC*VHXgh$~LOLPvNZk~c?n`hz$=J|Muc>z|@ zt0tz~Srxs?s&H6q)@k>8^BsEHyV(Mp@kaALe7E^Eyv?j5=c<`6#ID0BW=@3yjVyjAZee}^w>7_n-8Y^{|25WI zj#@CCY}_}V@bB35Lxumut{*B@n*`aTT}M<5h~kMh@+tUSvs&DqXHMaH=JMEeO2xR9 z@iL3o+gf^9)l8^Wu3piTYvXIp>WA(o*W!)=`r4#xL5G{+&6cPIzSrCu?=-8XV~<&_ za@_}?7Q8i>O$NPD$O<=G3%riGe3Z7W#`iD!8Eet{*MtJCg57xVV%L6SfWF?m02gD zcIIz!C-Wb;ulZlB@;>FMn_3ls%DH%~SyeKV%yAw6Q!P-D0kh0H3C%ax#f!}i@iMcX z)-E@zMCmGXC+u3&G2uS=7KR zGxx^tnET=n&HeFl^FaKCc_dc%ubP&M2+}`W;4A{}<4+7w&4r!=%34$Bnsx1un%Cf@ z`D(1!qLp5cM0%@Cz7E$l>&~jNc|C5KaoWAsajFftjRB{d@5J5BcjLZh-CPVZZ^I+Z zJFsg_$Aov`i5CALc8%$X--FMy_^0ta*W!)=ZxUE!1Kz=D^XK?7^A}h}y;`#G@jCNg z*f;AHa=q}bG%0+ixjf!#rc^Jm!(3T65f52F^)ru}8{mWHmiSrosrV&xd;Er34JO@J zr-Br3*@D}cw|l($-rfQ`{9S#^)hMm{MfK>UmR3SBH~dRnD)NdX<0zQv4ZMb!i)6jk$_?C6uMz?^6g zmMxd=*BLvylap#VdOH(}L{%-4AAOYtD^R!gZLVb1MAi5p5Y^|&($S|#wluol-&j9c zAw8UDu|-j}w7W36o2%Qxs9NPLh<4>nc|laKYtN5f$du+qpJP7eM(6PFoTyrKQt_h> z5%R}BN7k`W!I=G;&^@I6CJ@!z-iHIxt;}hwXo|Qx(fy3c@+{Si&AySejI(a~HyY^< z1})2uzQ8oSsBYR12BPg)q!o0ma5Xbnutm*B@@^$6R`7^!w!*J6O2Ixc5PpTVS+IXO z429J#RKar(;7p(U1ux2x@OQcX#sGCXH!G~Jg>UrUJvMsoR3DQ}kiPQwXoOptULdMw5~|bLM^r*rH`iBwH|95~ z8I9(8N*qX@ql%7bfv59ADEVU8AJi~eA^2s~pV}~4mqT`K!({8=hXwwV1glKem_0q+ zS)E`^0%cv~zZmyJjgk$5Z{+&T_@z92RHI}=udTnlQL=LEGnRoq@^y>I**AEOzpYWS zj#uA*tx>W#_;J|JZOla8&i6Yu=A^LBpU^njlec5}!d ziBG$bRhqDfxJoni_Mb5Mm)$~ zofxW#M8fkJDKShg2(L(Bw|Ir&9*mb5q4-$1I{zj{%8Br`OfWG@PKAGD0*TRbdAtOPV(ycDw7v_%Rax3(U$^eV z+lfi`lT+bMia$dx3hOQ)*}pMcp-T84W-2*A4OE+iwnN<>q-pm|&QQg-Cqi++D75#!a3PtZr=sZ-!tmH)1TU>7R2V(M~-G~WCRbCW{ zs!l3Dx{a8EK*3jR?NF*%twW^%#(aDf<)=30?{7q zEl*P?MLw?vqH3f0r@JAeO<^>~uuWcc3iEe|7rmLo_|dHBawhT`r%IOW{lchPj(^cG zI-JM{pJpcXX}pkk`R$rsRgwgv4?r(EkEsTus_n~)Ucr)vqBMja!{X`2KZn=TwRrv9 z;x%WzhNCYsvyrI27Z-^xC5!w(<)tL@ZpzlC^o|l$C8(@35mgp5E_U(v7W%DQC7VUv z@Xc<7DvSMDt&$BZxu}B{rBM!MM%kO|?_!kLg<5SdWY=XH{M88f-?mEDI(-uB*E^nl zH=CuJo6x6jtZH{Ld){X*w`zL$_dd_Kzj8T|@gRR->txMZhgbpL$!wMKRvWGP{yKXb z+12_>S>)u@dL!(wYn`lBQFrQIg&ggT)rM-Eq8v9)L;q0gWKnf>N#`xd(K@JFZ5`{# zTjl~TyffF&Do)m|sB@z?DyXwz6*sL>K~1aLB)@BMvRq*n8_PR8m`CnatF`w_ij%GT zxg}ifme3nozXGYf)!CW}_t)S_t$=NAffP}Z|Gf=2l0kj9LNh~}5?g<i%COb4&E4Bk$xBegoctdkF;fob^*$mC?&K#E#Za6JK z?-^S7-w8GPR;zhLuC7mYS^JH~YkiE&)v|UcTMs6P8$V zHXNj&w!WKzSV%Llj6yWG-{3q8R(;-Kp>i(gYHlr7@HEqb zIx2kk`g`7E|4G%~rONEB{k_cIs(o%?W{kRZ{Q6y!-COF;&^w%?Vv7CR`)<||a@ZXK zM_?m2#Se0{>O4kgS#If?tnPi`KiV}}HQ|nhqdCg`AVa&p6)pX;Yx3-1{bKD%52)0} z)$Mp2T5&bWY=;NjVbr_=;Yt4N9?8aOb#v%F=MvXq1aHHn|0I6SCEi5hmMU34q$8r& zYGvLms|kM8rGKYJS?0~$UiK2{+qm`9B1@OUtaTgHnHAj9?K;0}xZ8Y1$P z(E&%-UdeKqZGNW9<|!u00-xI}*~c5@@9dSVm>Ig%?GafVvkX1lE3-%Z*{f`ixYX?t zFEf~p*r0cEwO8d_t@(ZKC}f6R^_aKes@iU@{g?VAD-3sYyWbtRm$D5xg@>+Vc&={E zdQH*-*UMH}!(g{p58`y1S)28;wQ25Ql+0e-z@2g4Al#z@jJoU=fj`f+MgQb)E zCWm>AZ`4WaXi!I;Dk`?~zqg@Ey|Rptx;4LxK`i9)e#sqaw=10PqBA>R=b+p9DmT^A z?FlI-Z#NlacGEp>EoD+Z?2fH!?m*w`5>|6Z!y_Rb4b?dk9u4V8sOAo-eQpI-a~tR} zm!fL5@gYiqyr)Cj)!5&QHS@KC-r@gDuGW9eSe?v_^?h19_x)ZM#!xxBw_!#@7RN2e zPIq`ztjcL}1cUeJ?B}+@L+Qqr95_gM+#4UG2X!IN86+TdeScm^)V-Zp_`19$|{KCX4i35*RX; zl~k0!0S=w%4;qr}6Z|sYUq2+-q{2h25xNJ{x}MANQ>48jFzjOggCQK$H~4=INv;k4 z9P`%3DsdyzY;x_)RG-IVAltGbB8i5hh{O^V)%Xw#)<_t^z(;#<4 zdG1RB>+}VjBEQ84<#KEOzxPoyv6k26e@HgxM9yjdOS01{&n(?~adK{z(gimsAN`-J z;Y(ZIl^j$QY}=}I#be1mH>PjX{>*gH zlK$Q&kFq{&da=sNx~Dmt{K~qdc}mt{$X{LZrt2B@cm57&7p?*L(_@NPE8|CWSoKs`}TTt9Ld(WbxW>9yM!4YX4Pwt-RM|t!XX) zyJZ3Vk(recPzyjMV!i@D%jBY6^w0mY$EH!dwnDC%C!oyNdWdH^+*di2rZ%ovH|&<-~=cf+cMQDwGfqMNxUR*j6}8{)G1<(62rGm6(~Ts1OsPdwS&2hTL0 zq2-@zfgub~ZHq=Y6E8JS!k3z-;492i@ipcP@Qvn$c!PNf*3Fml)SBL6UWFfYCiX4@ zkJx}M_<(sge#ZO=cJ2cd1uD(dZER#9(fb9FpaW>3`g1FD{J zl@nMu!*Ud>sz&Ar3rsg_hnj8X1|zV*%#A=`nOTRpYG*XAcC_ow+E;Eex5xMCWfk=s zt(|3;24D>+HFw01nS0Dnv4vA}!=sClYp z;v%f-9Qk6bGo-AYD9^kapJHBv^;V72T#eNSoqQcu4UT*xZeZSko6Bhi+(kguHcGSy z_b~6pgUko<81swRb(%u@SFv8h(YSA5*Jlbog6CMg3P<&6NTtz!cClIePkVO&)Oe5UvmE3^i4cQO+Q z)WtuT8{pr}IllL4tD*XU|l}ODGk;o!}WWDTVdDl32uX3zbCkzcBl(% zgwydwW}SMMn@3>R?+GKEh1DKi6Bv(OzbCi^uebQ=_;&L$e3$tWe4kl6?=I|KR$fb> z)COFSA2Z*KpEU2p&zm2_ub8!yzGZ$KA2C0LKR3UGzc#;ue>A_T1L}7RyvG37Aqq=# z1ZQ*Q(^4MC>NrpS0>{nY;R@zouv%v;&EL4TImnLI(42#toAYoRXV$+?pX%jMBUi*K zU6-}zyYCR;23TJYReUo%%-kNkZxRu&``qb@ujEegnf_3)&YlY_UT4oGW=09DNL!!= z0oNf4Bh>Mp{h<(lCf;Z9 z>2U;JQGkh;L09}@T-Uq=yDD7bufVPf7wgp9&eB|qJDG3BJs|-+?zKmV1Eq({m<#x*Ay=$F4>eSHP}D7VEU_YGiQ@>}q6jJM3y?aS!Zj zWU)$5)1TVJ1`+tqJRG~ePDrG4wYq}U63oJ`wiPeI>X23ODq*c^UXEMH)iV2sssd%5 zdOMnj;cgkH10xCau>oVS3Yj#*SUlW31)piw{oMrfBCHptlzs_Tzu@vptk&c5Rah^1 z$=W}bnb+aV!#e*n;1&X|_Y-^@zTOgT!YXH1n$38V`5t_aS^LL!^Dg|LxfJg;KY|aK zAH&a@T|Z|pTi_W6ylH+OA2#cHf7Gm<>vQu7{I&U8?5Zr7(eLpe7XKr5y`m7WGoxOS z(Zc+T3vpTjohIEEld!5nD_bJo8w}Jk*TqfD#n|$fRRpJL zY2O-eo}hltN-R*qfa&IQ@oe*Xc!7Bpc0Ht!(KXohkb>9at1QiJ_$Ko`SQXfs@Z)%k z`4xP>Gu!`70=sR%d-!4V`&b`)P1N8_#p-&^daW>_6|D_$AZF&E=TX5AgNFn7Rh%{oJC2}FrIkTKWk#{@H5XLeu8-&o?^Zc&otkO=bCj^z0kY`FE!tf z`PdTYe-EY?2?E_{#{X8w# zVPP5f#s8S?@4mLgfHN4NUeA?CYsGzS2@k`rhZL-nmFpn|Yi+q6Qt%|~dPu<~*!7Tt zwdQizd6ef=>^eokGqCFvB~3u9)b)yjbry5IqTtK0`wA1*6-+M|DWm(a`|=Xrg}Yh& zZtQwRA^sS4y`o^!EXvxgvITs!UAhlAA1EcUJBTPIcJ+wFqps0gds!=B9Y3S!I*17Zozn$!DL%tMcaw zvrazGnfv0G%_>WN(>w+rHt)hm+-IT4bT5I=Y`_70()k1QVkB3^kUi%nr?t{nUwB~3q0oMf!9)YJ@BE6?Q+dK&`G?(C|=JW8S=JW9t<~jHp zv)UiuXub?@FjJPE4%}e@6{o4;k!DD*{M>JT9Pc*&gdZ{giVv98&iEN~D2o~tb5;Dh zxfXuc+z5Z<%<+FZflq9J-k?x(A7}fCjK(3Br8~$NxuN+nU~>0^D3M& zs|j%>vtE>_p;nig*mVTznN^b2#H^C6R_5DqJM$*o*?br7WxfaZH>*}TvbKdT`UsU4UITE%-w0x@p0SvDy(T&BfS#*9u>Ut6Tg-xSm-B zS?(KGq&2QkIX1yHYx^Jn&xgEQ1TDVbwnQmGzNi*HFU_EHM zZdz~!?7C^eRk7=)1y{%ErJ4YNS_Ia~^)i|IW-f?*L@3~i+{B=7vR6m zY}G&(bEt`}#9{L)95Y{mE5t~tMAs9jW&?a&$E?e)>#~J38*mGYza6(V--SDxb!qNq zz9087>(V^b{2U%_epPci)&g(i^W_Ga8_o;NapEsBr|@#KR`uoPO86?XR{M447I?i` zWd^sKwbt*#X-%vPf%|MgFTBe<5SN;V#?|I{Q*M~q#)r)G$tK7zNIf5i`&b!YsrS>*?hn|15K@I`?8PB zD&;z1?udUdcf!Azb;}jz;7>GSs{Ez?%azSR;`R2l(&XV5X0iyJs(x-YKznQl8&Cre zlpAx`gNK{7f1GL7-aEmpePW8aAD(F*fESu|3%}ev7OyeSW%_{|EwGdU8_mn`z2-~s zZu2_)xcNG)cDI_*8}RF9?FS#2H{xUFZTN(_6n`V98TmN^Kihy8@t@|mus#u@3258r zn%~1w^M^QTK7uQmkK>x=FL49&N!-l*Elw9(;0FSynRWl)#aw`UnYH8eHy~_W#+3gMSYQJt;w9!Oc!hZ;UTL0#*UMZ{sxZ^Hn>o4ycbQpX zf&0wO@GkSIxYVqD=rPs*Dx)q0)N)(a8Sr_tcCJ^A)=( zSkHhv%scTG^FDmP`5C<1tgGdtW*rd+&D!&yHEYj*$*ev9P4hSSeP`DHZv>9nfIsmG z^FR0-vmTXyHmg|nPqV6LgXJ=-S2bvP=Gyoaa|2x7+yYlIpN4Cxvtn(6&IB5myWwW$ z0l3&a44-D!QPagd7WXpG#{JC~;-Ti{c(i#XKHHq$NMN!B^hi9@{1{$n){}49jOxkv zGK+r;UupgxuQUISZ!%|d0l3qwhuVA1QGCC?bEKu$Yr6+EfP=M&)&A^%`6Y8@;@>dW z!|$0J;E&B*N&=snIg$fknOorR&8_jT=C(Tj|80Se49F^xekRycv%)Z^Prv_v49Xodf2} z%`>;~i_H<@mzraEoy;oHvqRLkfD+wO`uD@7mNtuh?I7ZE6so zYJFZm*Z38$OAQJhdf1%YfO@TXV&Mt*8w@W8A7Vt(ln?|Gl0tNe;L@w3^V zrk{@fUj0n)!|NI4eEl%*6M^@>B6veqw%C{mk^I z>8FLij-Tvn9^_8K-xaT1n>V$N-kSQqI@7BVYTvqTJ9^Wr@9iudaa-z^{QTeZxwxy_ ztDJoQ&#kE{;hY?HzhLhB5x>U0sk-%_2ouc9*8AnWNu{?zd6P;<36 z$G<|Z>iMpxCVeG|>G`fDInwjp>H;3ZWBrJ$6T6vFSyWXF=FL{YntHy|`}DDu3|W>P zYs1k(TQ}y5j_=gJ+6vx(x|EFawy5|lyi;lO9#IqJ2*u9L0(tvn`UYggyvz$wkyn-e zIUTc^7ohT9lp~Rz{-$m0eEs~Vx20;FaTzo2#l~oUVh5OdR%|^np;$Bi&5m8iT<65* zGS|5=ojLMiYH${gO=nd`VtF_}_6UnX=Xn1{{1)3&<1Z^*VA zi9@k064M#pM?}#Xo(h>_s-UMsFhK*YaUL@o-B7>9))+4!|5_8wjzx0oH z4eKV9+RkA5$5WuJf4n>eic^Pj{X^SRbvdd0uszkKN$RPOq+?NY!Ch z=-Ezp*?*OPIpR;fKh=PDCfD7cYRKC+kMh%`2MHsSy*o*g@XAl&hYsuX+CLrERb-{m zVO<@PP~smP>&JGa>SQ0#82)Qdlxq=uDBGX0Bh@;1caFbtN2+%AVolGV@MO6P{>M8~ zjW{tycBU?^S5d1Xzm48rcYAq$+ozZg>+L<3H2-vcQ-)6B{M|cK zky55wc&3~kxmNLKX?b%Z&oj}&v0AFU$XxcN!g0#BF!FN9pZq|oVY&+$GD-D(mv>69 zHf%xpeDSdQ|gxJT_S6Jd35{6>MCvog-=E(~rj^U6ur~->)ojMjW2`@H< z_+V@a(OI$E`8N~@4`D!&cczYmI9;cWd&7@Dn2NX3j_aMHJvA?~jv4k!G{XgvN7xSD zWGzS{au5G{Q?!7oK;;Jh;0IIHf=}l8vmZ>&2>zVsfB0ako!8JWzdKdE%ahEb7xea$ zRyS}Bn=AV)7e1eGBU*WfTxhd~s*5u($A$k=_{(hng59ZkWcCG_dBgnhL#fVj^&j~$WJz6#nYZCV4*doV{lR-ulgQ!0J*np2eg5%1sR7>2 ze#=tMy$$_yOH<7n9nw_q_H?%O)CRA$TL*W$!?m>@${47LwO;4%FHMd08kSahIQ5Fh z=qLB4>UazN_#>%`gc?7R`lGrV_he8jZ~(K?f>nDmsLiIg)EhMMdpw%@khHb-rJ4q} z=lMhSrK-hG*EZUk)t5O}^=rfB{<3|k;tn@!m7jFcs>y4wI-#kgxi(3fcQr5+(yp;j z1M4$Tw_CF`a9ZiN`%*2v%4)*mRmjqk)nS-gJ9-<2aRbL{>F_vn@KByV{qfY#yly#R ze`-j(Nvw%PPrb(0JxTub)uxU7H6v7XXXhSjrV_qEw|y1+vV;|vGdR#a%l~43s+e1n zY6ntPc*VNI0nS4+{E`E#owfez1F4SQ)uqoINVQGos%ynyVE6yGuG1EkzWiotM6`72 zu~hPZ{z7T#x-U}q4Nf1_GPCjY*GgNM6{f%X%)V;+_4kj=LhDbhKD}thn`L$g{bgyV zqr6mqBem|`1(>@-Ii87EcNtzH>g-3>`0tu4;E&9@ ziT}i01M51k^tJGJW^LGC%nh&(9HnW5gRYx20!;|$TBiZcaG|*^PMN!4b@rn)J#Y=P zc1!j3qxiwNk@-xl{(aOENeiQw!DOu@_2VPQwfyS5M*;Sl%y&R>Eqs>6YY8Tr8{l)z zS_0LVXrrcHN|PA+W&)^u~9Z2VmDMoeAiH-8De>YI{8)Xx=F*Y<1jm{;y=Krm_Nhi%qMVVXV(7@1k`q2Bm9J0$?W-B?XGJytX0~{ z;#KO?!`v13Gxx)T&BO6Xv+kqEnspa8$vhEHbzPt_fpZAVvH?@@eDhSi*gOlXCQvh{ z)w|Ms8D3*n;m)<@+wo22O<3n#jr$~5g!vi# zocVdI3O}Vegx@s3h7X(dtZ>BqCFZt-2X;pIjlfA8pnGD~>?vNYhkh}uF-ABr#$Q6W#;-=eKxxflWM|iY=DZTuQhkVu6;Wrcg3zNHQXKV zP#R9X`~*}hSmsB~Im90{Yhl#kkkYVH|Iil%qBQx*1}XWcf&O@PP?}`8ruM!d|H`xsHkHIWi$z^_aS)(c1_yx zeB96Cmtyrqq%^DXNb_xYta%fjWZsOYx^B`K;T{6BY{0#EzF9}dV)MgznfU@%`qS*tLfzeI5Lw z#W%;gt5-gHhJMGaZgteRx#HX7QrW3N(1YKWg} zR%v0>JRa-5NNFbEisq@fx_Jq%XQt#Z9cW^KwG3!w))QVk^L5y@lP6Oj>xoShSdZ1g zxU8~VsaR^ZAq_h?19rnx4rZ*GXy zOTN-H#jVX+EA7q2xU*Rc)6=YTz!~PQm`5zm|76sUfNS@Tb=<35M)7Ck67xhn!#oAg zG3&TrXkLadHeZI9n>S+D?450`nRCtFafknhxc7{Ys(AnY&)MuI+u4xpo(&0v6hi1N zgbtzij`S9!_s~IQL6NV51yC7FL=dG&69FSOiu9s@fXEjW5fwWq*bu!xpV@2C-~Ht8 z?|$;n3--LH&zUo4$~D)_Vf(+5o?vJK2d(!GX0dC%cQA9R_1?j3dbQp=n2+FX3EL5T zNVp65lrSH`IpI6O9}ABMUncYGj+0>cS{&{HUlo1;{Il?4@E^kL<2j9Erk@8ph1sI{ zh1Y>t#N#vZS_-pq(d$z`x-OQ&_ zCl9Uy4!V#4n6F=|a4m3#a2;?(VGdTS33F^wN0=3v2b4t^QFj=ci9;`NYhk{M9fb#i zy9*Bn_Yr2pGDvt7_)g)m;4#7zz>|d8_)Hg`g7l*b^vJ|4I4l+iHbhSd^F4k>_yO=L zVZISsXC7gT!CGe?yb8?oV0dGEBlZaI1RoN91N@$5y#H^*a7G;VfiDW50BhZNM8uk} zb>qPwgMSh~pM!rBz5@PB_!gMbcxJ-Dqx1;}z)8ZCHl%pPz*W7nCF|PGrnf-7%p}O;8s8zfSSJ!xXO*QY2%R04`7c3j_^0KNmAov{C zD^3o8X|&217@TRlIA1+IFo>>ReKioaRaJvQ!765^DvD1^TE5jCuw8yeEgBTeaeR%2 z@OgFecYl&PG$Snb(hr8!Z==xPoL{(ZFE z;Ek4Lua#f3CRaRc7dw?aG9=i{9x3I(@*;}upMN%XXSY8g#B*V>211R=zYm*BwZYPK zZbTMv*xU_XoDMD@VqJu*1y~n(kS2SA1-Ix4b4V%P&WebDE45)6dyWKJ+4AT+4uxRY zZoy4fOSo}az9Mvyu{uXHxZS=|CupZw#Q7XTVu|EyxVR|xu;*<8BAy=+kG;W3p!0qp zmPoi6NBeO!CK|5kIQ$^(Ax~;{9Aa{`ya7A!m%P#V{9f?jYXob!L!Jsg zPB`$1p(hzto@z287>*>sD!$WH*kD;@4GeDH((5pL*elr#TOuqI2D7VhPQ(w^Bq$|v z{RA)0H;IO;KfK8IdR$Xr<2>{{y$8mRm}oeUlHD$zvEV$Rz+P8(-uwIHh%Yc@#7M(= zo(8{*+a8@Ck$GU-ek74-_vAf_puT1JF?^@-Yx;1yE>3ZJk!9`s0-o%?KVa|h9fD1~ zk5l;sUk`Y9`Whl~BQ#sQ|B}to)5}7z( z2Oal1#%*}tLnL-rF+~@?U*TZ*_zeoKXJ`RN9>S%WF1tAbki^n)C7ASVB(d0CUX#Uc zPx=&AE}u4}C67v(X}Ivd!zC|?58724=N(Zg=A`;&WH2T7No3QNYVwKiPHIFC<#hrl zk~$+ht{juwqE9EyQB_9;Q}VOvA>T~Fw-STXrPWsMGIn}4Zxql0<28gXjw=wKaNdAr&+I(Wr=T@{ZBh8wct zn+>BCAN?5%(rj1(NwT|2;|Sku%r}8UDU@~%WP2JBYZkb)Eva{92cd1MdJ_} z*{-KOgD;o`%bR;uo3X(h^O%}2HdxmDO)VZ9>}=kzJ{%hy3Cn_U!SvF3$TU8!#DU zp{I)M@D5Y&2GOABO$tm=Bfs)LL!9U{@zC{c+qrv|| zrUy4V{x_e@s8zD-u3*!+lD?5(4X0UOExkXK`dD^$sAT7Vf{}2f4Ic(>j(;o2C~f}z zLPj&rzeiXE7^d)#H*2ELjwXnhw_hOr5JOzNQPHqm@t#z3=#GbgK|L&7=WWx}<<%Z2m6>&Zx!_pn76q7fWRk2akS zOyCW1u)vg&)1HYP6lMZcUZFkbKIeov`1(XRAIxnV^wR+RjWFxj55fgt8|rLnlrFcA zM8(iBFflEL2B(3w7#f@j)?#RIHn_Y5W`?vF8ulC|Ru%hdV7AjtfSIT-+z8xMm>FsX zj?hzc7&?eUTQJw7Y2O~)Tev%TpfLJ#gWEair#E=CFy-G9g$u#cgvWv-!qdSEg)sn( zXqhx4S_B6zk_JBs##*CJUL{^?5~3V6#E~+cDxbv&korw%+X+?upQ4mEKGq< zIbo`PRnpR61opyEQyh}P`NEtZH5RS_X3xgNIC|7#XfQWDX)!dIbD{y_rzTj7o?%}X zJX-9jDyAjRu#a$#qeag!^aS4}p6&qOE6n#+i=N?UIGD#NQg+UF`Z-}ZMZd}cd%n^e z#NGqmBFtBMFBu;ADjw3(U@>S>GMMd&7A1pI!CI6IE(_M8WNC1Hv1@?1botwf%A7 z?ck?{Uj?re=3Bs#9{s-!=0KSI4!H0YF&u*7RpBGx!(?~#IlcD}J|oQMs!vCOA2y|* zihTh5rEqERHzg0R3Er}s^-C6S2yU`ruF_z0u&eEAu3EGi^O1S#Ll~hFR%r_^+tqAd zMytbHf(N0iwe)3}+Nn=p4$g$~Sih|>-L2O15>~%$#RTT6+OqIrL=`;?`|7rTOjtJWjJNFd>+27mRmQ%CcNL5bF?ukg`)a;hD zO<--cvCF!BYW6AI3{<`NaZp!0vV&8zO}M+c1RI~X5B?FN0X)SwxB_(DpMX~u$7a`x zc}mc_UWU6aVn}GZSp_yEhs=Iz*W1BLk>kjH*x8z5U^nGB&i0*vhWiM9oE464_XjLf;&JZ22Y?FY@qZ-S&*l`?)i!k%I+aTz;|fZe=@lg~ z-l{jI1jZWRjVXckMQq-GD1mwXS|Kbi`F_OaEp1Zt-zk|&Xx^Zjz9*QRI|8}(rkbp5 zyOVj`i?_ViG&_-8lfH7yu89A1aznLsPcWtK#|ZDuH$R5m#pHLHjh5zo+~4J7Dhhd9 zn-k&TN-}4k-k3Vs$Lg;=!AfoKrrjOpTzJ5zQ45&SKBj&iX6OLQ%iB+z@M+WuOn89# z2z>fYYvS|?hIg=b3qbQhP1=jeR55S*w)z>*?ePAses)u>+l$H64t0EQFwc?3*wn-= z$u-SFRqq`*>{kQd3GVYVCjnmv%KhDzO;z6)45eI$XJ0qw%IT)crB8o>)a5>=2JH)$ ziyVV9P6FrYH~RJU$Mn-yz`@^y%LXnEiJYZ6^7uXXPsmuQPK?fQ4<~mfo9;8X`%+zY zf^BZ5U#cskv>T}};$l{eDiEy#r}4qVf(z1VZ*g!614EP@F$LectfYOGqgtj}S=$@w z7Sb_GZ011*e@j)}9}JsWs`dV0j_(^rcEvUum$Zdy)_yeAd)3PQ!C<0J<~OZt#LQ;C zr4H;5Rx7X1MgGG!0nc_dtSeB@&b(#2!i+C%mHmxMIuQJQ`pu$yt@>NrYn$FZAna6De;EfqL~3NTF7Jrt~1 zmJP6Zo~2>-tgoZL!062$MuWETYWAUEPP+DTonAiB;qhbsOiyu$vd%^I_Mu??N?zK| z;~k*rwTRd(zJz{0dI$5EdNX=|OQjzU7MS;`p@)NYy6A_|QmcbGkn3z+)~!vJbuF58 zhT7nc2UhD+Om}EAihfe%Xi8*M)gS z*P~SkojHZi?21nPxK2$ydnCBT?60aH4W=Ygm)YE-UE3qs%qgnx(O|lXI&(CbW2@v) zD~|@l89L5(y3+6*v1pv_boB}&g6y}{hev~NR@u&sSFo{skX5}BZ5DGkYo<=7f)20+ z0g%k@V>+3O$ASetsJ39Pu$hP9HToW`&}pUVl3Af^meHsm3x5F*b2Y~3+iiuqm94Y3 zPJ8c0M=4Z(8tuYn2 zD>MY74qWz%sl)w2rVs*u>pF$6PW+?&;1b-|JMc~WAbHHB<-wnPhJQw`4@OtVbM;(GSH%i-p;PEEVSDSP5r> zpB1hEUacAB-voyB;?N8no1(V>?-2V|;GM#qz{kjVJD8zU|KPL2tfXI&@z&tQFn$o` zRPlzeAAC~_J>ZEEnefQ~d|S9SK@NfWg&;ETGD(XH=mDm1$brN6;!qv@n{Z9A9Tk*;YlCA7UU}fK*t1A8g;}Cig;}Ec!cD;i!p*^L z$Pq-^3WiSN&<5N?xE+{NSti^CJXp8~IHt(e8$6x%Xl{A;cL}q!<_oiK{YRLkrS-Mo zpN}l^m^iSAo)TseJtv$E=4ulYUXGpK*YXfd1vbF#$%=fTs2zXZ<_{t7%#_*d{kVYZn1bCd{+IcD^8lwfYKeNz0y zgEh%?dQ&dL__F=Hr(E_uB z(Px%|`F2be|8>Cn%u?91ouEX8an=V%&n$(ZAq)?QLu0T$vlRAhG-AqI&A~C{Ew&jD zYw3vEf@8W{oxxkhzAN}O;hx}_zE)rGKCzDshe4lNio`~P&x*rX@C9MM9T$bCfPW&R zePzQ!c?p@LG<`NHn6I$|tr6|B!5-mi;6&lNV9aZw0tZjL%d+Co0h}ewyQwV9JE$q# z51cPN7~Dj7B)FyUIBg)7l4lmw+B-)Nk6^7l<$#;f&)ADkqN zJ}G);Dg5wxr;B|#a0THEa1~)T=e2}$!S$jX(XUDqabRQ8QkW&tUYPZxt8fAM4q?`h z0m9wDlzcJM1Ht2jSwCh77lQ8*z7ss(Rq|(ksD%$2Ld{!+xT6e*sgX^d)tJ%*iLj(rQ70qxw9IED>RU{ zwuSSFuFBR9#wDtIyU=qGs$Xk|up3qL_Mw?jR@&JfrYDuF1H4|Js`_^bRmRMG{?7O$ z^<;-o0OJ4k9YPfy<4``c)R_*UEZb)dqw@Sf$56m=1GOW%!@53=)zH_D);dW;VKg6C zMI90N3D};9e(dsPTGv#2V2uTauXus#BkWJ(Wr} zbqZ~9`8_^#H1pAOq@s$1z@FFLrgjcPK3~9I=QZ5j10CibVVxQd~S=eH%5(M5l;)-M4j$F6-#+JnY-W z^=9Z4{S5zZ>h;?5b^;N2EL`mkJ_5RO@cf}ulmoBYkE1bBjqVdl_f!fiO79?C(3uBE0h<9b_`pvE7&j^Jc0PIqZ0{4{4XQ?T>q~~na8@J zsrP@65O?{x>^#T+4D4t7``~w$pX2zM{v(KWhW{jZx}Q46)BHPd!&CjApfINRAIEQz zpF;(1!G0Ki69(@?tcloyO&N**eR%%f@KY{%-ta$z2U6S558Y+^&mt&p`$^=@Ik_hM zBFxeU80I)!<~jUzFlsXWEs(oChQA^12Me6GPZ5!G-Eeqwaf$|YCj%GvmtKtUoNtm1 z_YMRUeJ6J>WXXAGHLRVbqxw!{x4Wgv=!ZIrU7v0Gh0-Hb>%?II%#fcSPmA+&$<6L( z+vf1Uh-}CErz6`5{&S4VPcekczXoOL_RmLVJpS+D-)s0dPO-a-sDt7E7S4vh1{_R( zI*Q2VUxu8;`MFKY?jHqvhvDNu)LzM5%#-~5JX6~6w?#P0;5Wf4DFyC&BQ}d8`Ag;N zA4(~+9I;{7^$SQWw(FXlmz<*t`iF9GCc>!xp*ptpPF37LR3U8!?g*Q%XCl;<#bT)qg-JHIb*zVv}_>gr&;Rjs&%E zKqw2Z=1T)Yc~CL@gqK8>JTR1PD{-lY14FHBUpUmffuVbHT)a0=-Tllh>$)dj>iRNN zCr^`&uy5yb94hwR|l*%89-Z_8fQ&r^F1{~dT_ zrs3i)pFpV&Jb9Z{6ViC1;T{D0QeF6t+uhGD9};SjzDU=RfqdfrbQA$J`Ub*lp#JCh zb@fz*Lqb-BWsq2p_hr+SII({89@#x7HXz3vzVV0yU&?#~e*M(HO7Zh#<97`IOx(&o z!~Zq%yx;JDhAf;g`~?VlQ){E+6OR6Ua9d^io8$7l>0gJc^hTWjZQRkxIRCY{Jf5uR zzZZ^QRr22t+im;Nq*g+*W`8^TJ@Z2(n#P(63sz(!^)XdtXs8U@>^4I~6V2{w$Iwt_ z!*@^==F{{5(5LyC#cv~%m3V{Z)Au5RW^kyiV|teUhQer6S?^Jag`sNE6n>ARL)Bjx zq$l^1^OS{Z<5d5`P}}A@0)HJ<7BL^f-DmB#)jJ2&N!59 zT&R`VT(un+DzKfms|Ux0%9{78wc|p~>#jyjRtMhbRt!8-mI6{}G732REj5@gz)`v| z{uDlHqrk7qjt^DG0Ho9SP?<2-vBImXU^JM*c3gWjT72tNbH|4&mwgF2Dm7%v|8R{) z)BFRM+CLtx&>;2u_)wa;w8WYaas?7nk)qA`>VK!V_fUyrZYaT9GHOw1=)d2peQ;^0 zZrjMus6jC~bsx4I$TI(^WEE4w^Wn~7GV9M#2qv2i{I!GMn9N#lz1E#`bYn|QX8m9K z;e-Z%CgP-Al*WW8N3`^fn$mRO#5hSf16)ox3(P?Q{p5hF2v-5u6~+s1P^*D{8h~31 zHwSYqp7yQ4RKq3T0UoC1)W{*;5Mv}AglCgcIrz$Jfw%Btv1dk?3TK0ra7FO5!j-^! z(=);{qk7XbxEff?xWP3kr_ei{Vc`5@j|46NYr!_`+kxK~`;K5O%Z5Ei=AVmw5AZj_ zyt5m^9I@XN9tt+`D0yR3!CceP-`2Vt1}?5s^7=TqoG^zL*}_kOD+{j%YfUovUjx>f zWZ-pRtw{#n0B#}vH-Xy;ZwGe~ev@*FUSc=}2Q8;Y;Pc=SVt)lZUic^QOkq1Ju9jKD zKP4~=#GYzyRAu4Klm#yl?gm~iOa;(l%_x6rfIcq{_kuZsVc-YA+l7~ccL}cs?-$+# zJ}Uew_@wYY@CU+F=;VpSjPnebt6^j+cYd$s)G&MjgBDkHszlQyfU@gA} z{{hzWYj7CPm)i;$DHS3zg!z_K6s`lVCR_lnBOGZ7Ljy5TDO1a=5m8@oYq4ir&{23Y zSj)2EXBJqip@HuO4;4RrV@3)u1Zy=k_~9Ev?Ga{_Zw5{(j&9Xn1A`W3!-22K0`asF zyhxY>&?UnA!OMlIKv68rmFMS$&x6+q^DWsd{3Uq1@OOOwse{8D{R)TO!d?_VyG`0B zf~n0wP6wY7=G$;im~X?!!mRb53v;;tjW8?sHDM0Le<4Q@DQo&IahL&)L+ixE=7BjH zCEo|;-W2jea8URGaH=qCeTMKuU`#u;|3|^qgt>ylK{?}j8XRdLhBYuyJBJP%!L5Z~ z19ucY4el;{5!^@k3-BP}t6*+oU_3vA#|X2Dog^Fwo*v~0zLYM~bp!~4?-x&D@T0=n z;3tHuf}att4PGVO7`#@v4S17q7w|S=R@|M!y}-NlR&6BQ8;1Sjz#4s2cmVj6Fvr0k z3bUqvBs>|+HSp4&s6NHd!Y$BP{UO{7Y{O82e)@o&!g`(3FNR@opdJ}LjR%(zo(3*2 zybzot{4iK=bcX*G;M!vUBDlWrYv88BXl|n$o#Fo|xC87XOpJplEnNq{2iDSc@JXF9)Kz|099n`; z3sXDryfD?1FA5I_e<3^yd`)-)_*db{U=9sgS~I{}=nj4utcC92C&7UT1|0PCGz?nm z4lV{~h&_+E%oW}XrX+~|Delpdb}%~y(V=ExlD65>EzxhYnx{J}k_@T8IvN27X`c8Tbn_Mv@pX8{Z1UoAIM?BA5~*`r%Ff zDa?2{2c~_xQ4!BW47qR!2|?sU950Sm_6d6dSAAy!29sd8w~buHrIF zjp5}rwUZY^xvoLh>AVIB=kRNofwWWWuR%l!72+S^99B>L2oYt0O8g0?2UH<1ySEbRjXi2wPrg0 z2FJ-!nWXauTu-Z%8*m-3n&aYV+#T<}I{APn3j))nH$s0O1F1Jf=I7<*=}nOr2A9PD z9D2?X&q>K=HnrhqD61@oUw^9+Z$lM>A~2U_p+pn!^ipXD{*Txr?ce8dw4cBQOt9P;SRzR8qcOjr%i{V$N6h{~4-a z4p1BZ4CM^0j>qp##WpsKkCGd~pSwInCXmP^7a%%!jv0aBbn=&o$z8?#3WjsZbrH9_ zmdSzEh2#s!nmga*0{_Ki7NJ}A5GJ2c)&2^l*!smqC3*|{C-~Lmzd~uH)-kevCLasb zTt}*B{tBfwJW9(#ZJB6>S~H0e+JsXUIab9fi~8h8GjtGng#fS@QltRzvby?LDBFDS ziJ+Bds~Y!2N2`u4)BeOfE6d#S#0%CwTMLI8Yr?caJz`pEcerrJY2MzCFyCA|_4Zkf z#ISFK+?Q-~b3NVLj~TSPITY~rCp+BD5!O3^e&XGnzj_D04_BvqyZXztvi*%2g|EqH zjJmO1)v{TkNF5k_t#t6jY13vJzBbX|XX0Srj`mLX@3?ng2eJz_(ch9iN`OB`fFgP` z@Ho=41*jYtXQXmFg;|9Y2V*4uo5hqersYR%`Skf$mU%I&nd*Se3RHNCj?_9~n}`sP zB1F0lF_r;3!!o_Gx@og2MYhuGdh-x`WN9Dk=_Bh2n9cRH&DJq*V4~T4ZOyIvwT-v) zg{{DGs`(e|0h`&QIyJ7%MN|8WaqWU-G<&AWSbl>!CmDWltYN%b9cQhq$nk;MS>Ga? zbhDV^@aQdeHW|lLNVsfcHP&u5O4PX=q^-|KtzWfU8Fh-8y;cFpK$RCu}_P1=Bb9z)*ht`QuavLzaA#zV}Tj2rVn1HSj zJoukNIWC$}D94fASYZfc4T>RX&yn2>;j&c%E=3_%SjX2(~y+2{#8nC(Mk# zDBK2<0%L<1+JmzpSWEiAhrwFX2YwISQv93-^NdpZzX0wkd>PDTCfa`m*84}n z--CyU{Z;T3GCz1~hhdgBL}vtA(&u6q3{51lr*L+OFe|2(?!gZ$CS@CxbFy8E3H0cH z8|@JZ>yuVI1(ycLgnP;0{V}0j2!@z+kMp6JbT1pszL^oRUA;m^bIiBk`+x9tVTNTR zMnAb=-W|CzFkZMS*ee{V0Yhmq)CN-)!T=mql@o3Rrd)*f1>nlUe9dYKcLK8)p`Sru z%1Fp}g1HBeJOOB?C+Y-zm&CmtzLn&jJ?-F91Wjr|lmG zYvCUJu)EO0J@9JqBJr~Z{Dkl()IZ}nF}x3lHNt1XT5A=7zXEG19+;I#3-Q3ef_IDm zn_w-(gFQqIQ6V0f(qb*d15;m53-Q2yuomL+gQr{*=TMe+#@*6dat989Z-_m2PCL<> zQCXN3M{BTxS?Q9+o?{bzL?P_6!4<@w^?=hRhOGjwEzJ59sV{~C7@7*R@zF;VA^;`) z`iMgC0I)uy5X?t2K>W`HYi(B8v+)@%_V<7%3f~K!CcFeZH_8#cFZcm*D29U;#37>f zU@eFPZvbmS9QbAM^Wy(C@H*iG;4Q)@z*-Oo|9q4OXfGX-K4nn&oCCcB9ni=bAB!h; zfR}_>q&LWX>G5~-AIw=0?eVr5RFEOV*$9?A+r@guiFtQ}K2}$JmEl2N7N`$-$y1g3 z;xbvy#>IA`t~%1!>Vh+eQu@Jmr5eM_KD84U+ll(h-5-v9Rlok$Oxx9V>J*LTRmK2# zva6y2Ru!|1%2<_(3H$&nfKkw%0aiuF(o8IYsP6_?S+)-=M^%h+2g3OqbuGnVscz&f zRXEV92(_gLc^RO#;$pklSDhbdZd|0tNmpZ$lud;t~Ov|PH`!w?Vs@CbWn^0eWK~S*c}Z}`p_q$1YOVN zDLO-t(`v{tE2GLlJP(=1uS3i-jZdd->`bCn+F*}U8-`hBE3}76=Ic8VQ*6He5E6^c z*T0eZ`XoJH_fhg4o3DpevpcPDAkks4&r(XBy z>G|D(!SH%lU;MN?vjSWKni;5rpfdtz;W}MU?WYCSA)cv$t@xc1r~v;( zfgNz2+{3VOaUo&wPK4n18fqYo0NYe-&TRq4=3LG=YX|lqP5N_&NmQ;pCkwd`X|cS)Ud}Nk{TvxZ|`SdNz_>4s~O=m2K`+Wky(a>b62K9Qs3l zCz78)LOAq?jqK@Uo)YM)Vg_&*=aM;)bJa5c3zrMY71X^5YTF#A=B-ODW4hI;5mu$Z zGxUFZn*K(d`s7q11#FnoMsYe!N;vWVq*(J4Z8+p*D@SvTAe1Cn^qby3aC(0d#h`casOL2D|mQ7raB5 zqSsv)iV0(^>~IL-e2tlc>n473ecjgM;(k&!9b;KGn?v;(V`cj5qJVq@_!5N;*IMX%X{CtAs=984r?tqp#a_#avu^%pIlWVK5xjeI-P^<6Hc z2i{~#1;l0Kf2f8}vMQKwsYR3UIz&pgOtQXmBybF7Gw%NPGsF_i5O2o+Kg|46?y)-B zqT2+|MXbwZBM-7N;^Fd-O-O8}$36J5nI7Bj*i7$n_~!&F4F69HXM$G>XM@)W=YTf~ zbBOVZaCPu&QI6=HH*bprhm>5oW&$n2M}#|oPY8DcpB3hteL=W8_>yohFc%^iPj4`l zHOYO!*M$dyf7fRt!C@E-?C$AlG?0xYc{125%<)NS;b*{M;T2#u_Vm9BoGrW-OjS7A zzXXm=N#6$Ni~VWN^csrc0=P37Rj>fei8r}5m};TqcHkkxER_+$ER}J>9H5 z0=A(JB%o54PC)r{O^*sj^pp-x63zvu2v-HC3pWH;5N-#qBHRI7OLzddo-ogkZX!Gs ztf#6-i)#+;^-K?jnK02A>jpKlq$*0DK`1+hZ6Y1j7$>a76>(5N2Slhyr^Crm&TM7}!xV;d!f`!}e<> zwPvl=#df{2`WaW8EZTY<#>szFSIgJwf$`@s;xN&=>#dnk#ox3Zrd)N4m&aA-moQp( zM-SL3pOa`;OJ1_Pw(HH*ikGY$$DgSj>mGgya`|la-Afq#=A(IwD&$w)UWpN(EPSVI6-ZHN6{7~-dEZ}xedlVUN96&)*51Jt!5XO`Jj6>YMX zIak7u4STNC$$5dKf72P^h`;u#*;HrMN>j(o88Kvt$?!QyD*(nrS+pNDNfLPKrI- ztt>}HRKqoot@<|0JpS0HH!7N+Jh2rEP+?X0OR0*ED|WQn`j8_Wd$jeJQkL4c!%A}0 zubH1$^Rb$j!;ZW<_3QHsbh#xNuUgHV9xD5r-8`61`qa3$amwo$)O3{g6Y9~ot<*>v zj1g=j(b?ZVwP-F4&V(hXqbTFv(ZZ#uM^9n;;TfQm2cdTV(yi19Bjz6`r<-bIx z3=g;TnV!2)5;h#MjTa237qv%FS7WtsmzC?Ci?kA2Qis8vqF&!+wNL#9xpuX`4>pGD zSN?Qdi(jl&9&_T;KbRGjMG(XD8X}H(oG6mHo^-s^_t4h3+cOyf@AABh-#H#0(=yw$ z8o#qVREL`BxgVLD;h~6Ox`*?oX`Xs0f~lUKDETQKR`nv!Zp4h$$ar{l4?cuQ19ne8 z%2_=H@cVry!?OV)&*L0alyq&+L1ZD@(}8b^VS5jE=$Xu(6oHmfrs`=9mw67)V@T8V z+=8b)hKHiWd$Ca>sLVZ9sLTL(@w}M@OT$$Tse5+K2ijfRoT?Vw&DE;i9yAJb)%ZPD zmB?CT%=C0&a-N|G8Ryvz8@q?!D|2`%B2)36^T;k$uy{jSDspr3`VNXA!{eq1w6wE1z(%SMnEA7U;Q#LN`2n z5EW-+|Akd)PHWOkzuhbZBn?o__F5@rzCa+q&*Tav4r`rh`2CvmlALPFUMr{6Q;5Nz zYO+%7PP*h)YxiQn8pZ)VR!-{AC~$vk^F>5)C20#X;g^$xf)6PFJ60vLSk=eH_OVCZ z`Hq!qdnZ9X{Ek&7@hRMmf40e$a!#{8Pf)MDg97ZWF1&*U(eL9`>3vomv$krp53{T* zZZ&?N)ynLmw(hfb=h*OYOSM{yn@ez6D9loAUI9A|=X~6hJy@FTNLv`SM<5z#*{-4_k81SAXrdhS-i{_ICh}zcxxBaVSFs z4CgjpO4n_R(#1QnVb@hPN*f$K$Ni(_U&g*KY8XUChV&B=MgP7P9sJ9MUjUavb?Vyzv*$yAc0~mc{ z*QdyE^3YGg1ukwdNxqZOw{iuLZ1M7Uw6&7kcH?T4tBj#$;xn$s#>r-22`%ysl#-S&Od$94GdX&?E~ zTr^cRj#}BJ^HK54*(MV-hogFxy-STaYGtMDWav4%1fn-TM>}V>Q>%_z!!lUm%-3ya zQ12(=UUNTVzF*fdKMHfDyHxfut48KDv>N6v8;jP9TvwhoX1HPQwy}n>53ll*t7Q5y ztI!rnqQ~c=1zv(tP&Cb`MOjbOQ9p?8%xKi!$WG<^@P=uAbUVZw(Hyr!zTlu6x_ZY^ zY0Q0QO(fcskEFO5>lnGZ)c2Vz^{4FWj`yt0vRnBePUsjYl+M(#oYb*YYNH;1&wAJN zl-zm3T5X274ruO#C!-?%o5lQ!ck{bc+9|7ZM92ItBj)jQO*o<4OTl%E9~r2M*$yoo z{}|dV?hE;LG&5CnX1GPoXqm-4FQ!kkMTB*#u@06CxBWWUGK`v{!5Zse)8Q#vW7L&X z)?XOOTzTIri`p4~+8SAUBUAoKM`1R{pcGGe?rAHWn!}R)%QOejPS>};Ox8CX51_W5 zwt|WJUOMQy$wTsTN2(7_TW1jMrZZO9+RL1!$Kh8Wu4xuu#Ht~l{e?4DKS*2i&su%V zBK62w$Xm{%y*-Q9znA*#tkv4~np;)=z)CgSsx}{3+16;p9U4~!r4(je3A0`qog1q8 zA6P-_ZqzkTrb&lB^r4?>#|PA=53F?CI=6cF1FOIFAnq`E7PsGCiN#`c`_ZAAowGXI zN*pDRoU=lS2}6-pn=$kDQAqae{C_i4E6g+tGXB3ubVXO<8~z(_4O7RLwExDc<8`*~ z(PK!gn4^u42bcuVWZ0#*~$UH&aZt%`{^D0z)7SbO+J z;GO1Q0U56j|9FUdY{5E=f{yJdnNLoP`uUn%I?8$qjd=Ms=_xc9wQ10EXgE;ltLM<* ze6XHFgX@F!92(pRtmn{R%0l%V8r%WA3pYc_LMJe_(aBxFCxp9!^%NTRJ;9gsqBacu zV9@hsFemsX7D}WWW31C#C_m0!i&M> zg^MZb$PvSH;Htu_!L@~71lJed2yQC872Ha=1l&RRIG8H#O!yqQxA0}~K;f(4VPJhC z(hV3!i^EOuL}83dqDKTHBI=pV5ql1V=LuH?FBGl`riwcgt^-~s+!)O99ql>AS|N=2 zQ^a^d4E+Ae2I21DSA++GUlSeyep`4fc)#!@uwD{I0-WaQC1Egy1|Nu@d%%<&GZXW` zpJ_(<{|5$rdJ!Bb_|tQ4Fr^7MBmifGdd>~|^gFiH#$fhP)6ac!FL3h*4^^MxE}af z;fCPV!i~XH5u*QQ;4OMl8;0gE>=1{x;5UW&?(P-t13n~7LEXE;gTSYS`HG$w<|}$p zcn0_j;RWDtg%@&B`$sV>gTt@F3jC)q=O_9^BxJN0?8cq*4*0rqNrt=@91`X$nkKv% zoGHv#G*|d_aCI{K=iM;miNiZ!Dw;CV1Kc23V#cZ6p4X~{xgML;CqBif$tMe1}_pW1LoQt6DSW}E?fz`O1L_BqcD~G zUlr~G-W}zL!T0-!I8Z7`l{7|5;SC4(Te@Ct(Zxn{Zk1U&86& zICNBuClgG?GcNBl&NO`@5)5!NGR46U&J_-Ts|&Le%M<3ftiCW4>qwSfvFkthPBJ3Q zg`cs))xeX5^-e=>rl%+Na`y=HwYg8Y30QxT4u0B!9~JwK;3tId02d4Q1wSuL85S2# z8UJYTX5m@j?cfLTX-S(fbfIhW5SPv^(jaQ`vO>>f&|_O)~6tW**SeK z{@(<1EsSaH0skm`0O=dQiQyO={t`Y3j>o`(0X_tKg)e{u!mQQ$KpkApK|da4MnC0r9+Pnen3ry#)( zGu=|`8-VpGNU-M(a6ZI%T7mV!N8mQ#A!6U&C^_FP?04Ia^;Tc^56^(Gx^O_aD-=<- z^0Gjg1H&_UIQ>AFI;q3B*iH;qWd?=2z|WXL;U8>Qhp7I8!(D85Ji9^E`9ZqDht!gqfOv!N}Z3^*1N9E`%>F+7E z6}GO&(fis0iYE@yl@@5YFN3`7hf|i>nN9E?1QQE<%+#DZlque}iT=<`I^IG*AXt_B)Cs49@C>F+n3=t;eL(J;@4@L4?l9^5Qlu!4N^Z(4hPyl3}-x*L9ldH!Vfm~ zd;u%>CH&a)*5en?9*3QqZEbve`ZV0!ArRkj1rXx&qjc!R@ja?c z7P6N(PJLSx&PiwX%(hR$rZs(*qp>}6TSOziI5#C+)_hfUof1wB{E6UZr>1aV451@x z&Xn+&)O@6GevA&lD3AYt&`s3S2mM5bBP*KKN6m$qnkv~sjrTp#XCsp+)v#2WKq zols>KtQ?39cWiG5&X~s78a#U2I)P=CdB#xxofa;KT`|8;3)eCqDycd>JToDoCB{28 zBa!M7>Hk8I@b`zMM%)vILd)KJ!*~DN7pbJ_ec`K4Tdle!H6IH14MocF{*XNXLbw4F z{R97ku#3qPI4i>N5ab(>1Sei3jCFD zF_@E5CdOKPLwGazrtr&P6V;4C!T0=SAW zhiSEhzXJ0OVPZdkn+X31ZYg{n++O$>a93di8NNdptDMFFVFzUhg-U!Yh<8>{MqOK@h0bEU(uUsABx?nAPf`7hE?8z85LXlidPon^Qhd8tc4-oDS zE)?c#7Sq`n4UXw-j0H~>KjXnMosEg$n9jyz@crUv3K%*Y7(*f#e9e}M!ve4pUJj1w zZ#)TJE%q2z-PYe=7a7yvSPkAGe%65B5Z(aZBYXgSQ20H*)W^lZ*MofsGsL&xL*Y-s zp9ud3{#=;Swr_-Qfv*Y2;m5sP6WrHKVbZvfxF0@LuA5GN*vhK28G%0rV4XJ zmLbfhR-ZzGur0y0#l9n0??-@rA8=c-9|Z0!%u3o*cp^B`PYlyw7%n^mJWiNH$Qi=( z!1IJ30xuS3*QRAjNSGB?%aXt^f~nujJ7$H|@+0sLu-{f-9{_W`pJ7XbTa+AMANDxd#h%|BE@#6boxi<|smKee zXe*{7_-ydj@N?KeUib=3`_$G~!ZU5ZR#la^g}XR%F(c}w%$KYrwPahkzT<9~XQ}Qq zU)&Z>#oyPmJgY!Bx+=7cb(Rjs#&vuqbqqKfeI;O_W7B{n5lM`I2q z(P6FHa{@-}Q~z{3<}FQO>lAgN9pQkwxIJuFc{{?{*j?XmN4O$3($B}mF}Vd=OjT>6 z6$)0LRHOXuzgl(k|DkQtpnk2WvV3t#*;m5@6XVaLY~6MhIT+5${R|Jp#^XC|kFjz2 zd(`|03LldW9;Sd%^MmTh!EkCKRcQ49nFrUxb-DWaV7O`(exXFv*xFMWoS(n|Qm*R25dl)wp@lHitbG>hqWsfw= zyA1a@)7uR}XLu=}nC|5wz%*|m!cO(}!|xO?zYkvI<(Y^$H^o*XUcG)eoZ+Kj%C&1g zLfYLU)Rn`Ss=lhcN5YjGy@h+gj`c5?EB4BUw-w@{ip94uC2{k-K523a(oS9gcXxtG z&qne}RdgiWsl^}&Ik0=3BmUjVJoo{-*Xj90G8+W!Ug!INI+-8P#_n|vF3%-%M26k# zJoV>7a&`6Bk#LGXgpA`nN=g>5Bs)~j(Qs~{F9Y>3cfz~f47GBo!AHYo+P+Gk{mj*{ z#ol$!mE8l(vj``jXmStMZumqK&)>v`cKXDIc1~xpp`9jdXdk6^9Sx`190}^9qbQEY zlzA+iXU3Jsp`4bl=IH$)hvyh{H>b&ZaAF7<3hc6Gg^F6 zioWKOp_b2clWpFmgBaCfwHbbE^YB2M_l0}46_WF=iH1ARaO))8iwI};zP2kG?pG%D zluCOq9EJu&-S@&-eoFAX|7E`HhU<_T3A-GA2gNsa5PqHRljNDB@#}R{sopn-`3|__ z9BRvZ;oN3pVQ2T>&EsOdbr6@~%?6s@_mCr-;rWOWm#VXo&TpaA4Q~e&tm(aiQo{L| z>s07OxOxf|ECL10a@hSAyarm3Q`~Q=K_|jB%pU6D6L>9o3WV94&+b0BR_vkDPKGOV zyaQpO#P|g+$*`V|=WG_gj&iKRmw+y)_MgMHiVmM@GJ-_dRpkjaW?3DQ1L3OAsE1C5 z(-U7|{?qkmdETJ)ZuRELaM_OBKVW9)YFHx<*3=ghb6=Xv&^=ST&!m}y0y9gSSHWC~ z)8g}q_^G^2WuFSyOWeYO_{(I`c14z|_E6(bg_~7s!25C9SYi}d*LVSL=F_$Xh@-~m z$dB2_-i!8MtJ9~#xn_>KbqWprN|pJ3xF;?%-VfI|&zEd@KYYVPt$OiHxJiaCh$rnV z2p(%)Rj2&4oheU(IsYydcQ$+nKD*rSY`7i*Ej=4dA6 zCG^`V1f$6&HSxo6P4g4=+=tFbKz`oTj3mVXW?8hl`HALDtNGPP4Ece z+Td}*7@rx_gxwQ(DkO_&0DnVH@g3Y({Da$7ZBn@KEtn z9vqv6=76V&eRXhj=85vphaoog_s9Vzb9B;MnYuDvLM8&+A~Vt$+mH z0&8srFh`tPTLF9mthE)ur@&fU0j&2yXmte`K7>PMyr_ImoF{1w1u#X!u^HoU;FjXY zL>*`^Oes+>VZLHo69Hkf!6U`KB6xyu4RDcG4uGcu7#7gM8GXMO38&(DFA**eUM`#q zE*7o=*0V>1WgD}!CjYt1t{nFq?H4fz`*qudRhk7yV=2ygY|B9 z@N%%;%?@4#j?F^XgJZMM4dB=;bQ8F?#Q8EfHVfSbj?F@MfFpWmJ0g7>h7J1a3w}Yk z1$eV?Yw&hqXcrl;3l9drEj$N&l8jD^kK+U3xnLd{Mf-W+&-5{rFf4}QD{*)j{DUwb z%?)8L(A*T>4K~rIGonM_1Yx#xdiOi*FM%zw{~TOa7=vviOSpUlhDu`KyRNkl5STL5 zrefa!+*-I5xSMbrFg44W395pQ5bh2hC)^7>LwFE)p70p(BCtM&co7U*%K#B^x#cB2s=gxoJqKc&Ik)k|i-QBSxfm@{YEw*hz3jQ5`% z3g_T-=m8!q+zUKHnEG|&gxR_1!y4hADs}p>M(_kMr%H_HZt#P`bHVzsM%Z(V{fyWz z2Cv~5o&ngQY!coC-X^>gyi@p1FsE7czYDAv{=pPk>ftQ-9k5>b2k!@eApR-J{79G` z&}YJt_h9%+45z?92>%Gy3IT|S$Ej$A0Prv1c)ZWd#9v^o1ORrRWz$LkU=LU;0f5;7 zK?y+n4}i4}0PK^&&;fv87lsfFS_uH04c1Bk;5@Ka0suDwYb5}10az;mfLnokN&;=b z{e?S#sn5&!yMadv_W+Lfv17> zr;xxiz|V{SN5JcZp9SkLA;HfJV16y6G*3U<27~?-68KHVPm+M36_&T_P*#8FBpGboFCRl$W32dO{)SpNK^Mncgg(MfAKYO^A5|}!5)X`=FJgdA9N_;TB+)IPG~<TbFM;`e4chZ4mOa9+fDa147J-2q5a?+i zm{L75)#dn|4DvbfC&E92KNtQJ{Ee^;P3kpaFPI;^VA#^&Tf%AJI85JYp9yw>b^Bix zhEn2C6C4!g@rdPxn}90{w+B}frlg>bFgv3L!h^uvQNzTBfLjYw#MM!FLOh;-S24_j z!!R=bmq&dWEnExCZ*9}Q06bf`C3v22d+=Q zuZqJi@SDPWz5yBi3j2GtQbF%QO;QPq$+A=?H$pFjN+YCg7UF zoQ&oRbCtQV@Mv&>FjtU!l6_GTOFv;;j3L5Yg&HAD>B%_ZGT=y&7_woQDVzhoN4OIB zKH=(Me#)JRQ9tid;riewggL!>Mz|?>m2h+LTH#jUO;Pq6e0R5sLq~P;t1{(FCX7fK z<-@1t&P++^YL-_OrlxeYeLF#kXV&BrK@m6aiI_ZhLR6 zI?qB3fAqruFuLtMte%~f^0%5^*ioxyUVgq>I>%Yj%q>Zrol+ymQ&1W`@m4&v$%(4t zb17-go_J@WLsm&mdM+ikVpb`boQ{`}6n0$mad5{q-ZH3*@nPxJun%jmvY7U$TD3Bz zeVeryh9>@Oj9Q1n*3iMN-|mf11giY=X8Laj8szoJ|s-gAg>t~W*1T$N%) zjv%A6y^rH}mbV6anVH_9$ifUSb(*JpJN+N(-UGafqW$~dJvm8EOR^~>Ih+HjKqw&z zy*EKX=~V=z3n;xv_kf6^f`X`H0jX9HL4hcO0)l{|f}$dVf{J26#aXi{#&c)z{on*8eEyH~k+&Wcjyq8^}N+LiX<<8UfCbI$Ke%r1JwC zA-2C#=YNG92sBV7Yr+Mw_P99z$$KG6!DQV|or*xcn-NSX5qH1{t%3tHbQ{nU%0?V< zAwG=W&<_YVK6D(CgwS=kp2W~gaN`SohBWy@uOUkVp+^x+F!U8JFk}R&TjLE*!6cKTS^D#J!DP+#GQJL}u4}_pQf@&IL1&`z$s{!&LeIxR z^*GLv=aKKhcIF1$>$4dHk&2-6HM^+#d~LY8S)wx5g{ylGCaad~!bQcqaaV(XZkokh z3{KJCv%{uY5oAhmhRHQ?sIxuq2Gm{a!Ug7d^~}0(J+rYo$5SJf|4_KlvolF`cqrV~ ztgRM56kghsdoG3g>_u>qs<@s|UyX4r8CPhmiHivJBO3l5$c9>>_S7y9@T&`<4uf&= zMu6E9>d4H?2z+I!i4TW!TfB^X5A|X?s|5J65W4a-d=z0bF~nFJ8u%0g;rLkSDm#!n z7|0-UMj%DK{&2W7S%-VI9qu;2N_r%mmHZ^by*2|O8Ue`aJQ6OcRScOKVh`UFx*Z%B zT7kg4p}t6ayy4%Bth18p4~HK-*oz-QSxmq^PU@krDliz3zN>q>iqTF0(`8`$Mv>eY|$4o#-__Fjn36 zC~DYiVelmn5hf zlX7oBr)yRY4e^2PxY^0G=_nzq%c2{EVaAndGJL~r` z_m)c5cT|r&hEg6@uRInm?b8-XPA+Fq9yc-A63*3vtuXd1mNMJm@!=p=Pj~Z-!1GsvFJFGYEfy85*X}KOWA&TH}QE z;d~$aKL^cFH&wbmoKuH+ld|Yy-lQzH^CpCPFy(fAL580zRlHXHE8r7Fd*1qR7QSM6 z-}>;NiZ}BX4x|_ROO)0iI>MJIlT_M4s*CP%}ld-fqLhOaHS;e?fV4V zn=&_sGtJH_dt-QF(Y=iStTz`i+>F}8T)rB&yhsOq*2|zjgiX=A(3Ia8uIxD+R7W<3 zYvoU5GR}D!-YWR2nTNEQUuiQ{w`%_3S2<6HPp0Z{>c%siZz+$eq)p*s+_I*d!Z{we z8n7w+NYV35!%Cfoc{&XjaF^^ftkh}v1qFp^sJS^@8JibfwmDoWO($Wkj`ApiN0j9= zHi!Kle3oPW)8YD_e7@OEKW_<@giPeiK_|? z^Ig1UP5A8%8>=+=npt#=PVqQ<*WfW|dZ`+>6%o}^Yqla&u(#mWa5l5}^R2kdvC6+K zyc}2i@V0PHDl0qlNt0zKZt0R(%_{2cZQ-q+pOVz#ayYJ1zM(wqGd*u7scp}MuS%ub zhq>9)y%LHkeAcY2syrL6W6mnS;@L3tzc(;XYQ*)0^?k^RnstySvu4~Q5SPQ;f;EL% zE6$E>U981ewe-304D&h_+!4-6OJU#(;&>_fxKVJen(YV=@N7*|_wNYjBja}N2+udy zmABp*PB3BY@O-$ZosT!^(wd75y3H=1UiH-T;r?)w`~o`N3si#_(2cL9hQ1K43gIm; zAYUFRFMlEYsfis$R_;d2o~aJ*4wpb1<(J*aJFhC<6K<5FZ&EWq@6xd_#@-P@3qS9L z7q3G#L+Zvo;o^q9QKgte{J1t_0WWxY#X_f;4bfgl!f{b2+ZFHMYMKkw**)PLeCOKt zVt8Phj%c=aeHZ7k+D}!}UJTdq;Oi*sUkvv#S18Y3T*&3B#@=vib1Ald376Go-EH<{ zesN9}W7C&0e|udNT(%U?Q|esq>v4I8dSx%-Yo@-~8;)Yv7~j5d|E#M~T>SZZ55~4t zF!ifcmeX>zm8%O>F<%Mh2uEr@r6cfC7%k zdE4;J@EC$X%p9BVBInxt9XZeD;ixH0lrbI;k*nBT4-uKTjXXA!aTj=8icB|)Z2k-v zOoawq2i5{0e#hV}2GAFctEU|0#z+*#^ZVxlfJR_v0YDpYmbhsL)|)xvN*O^Z<-&S1 zM=-;0E%FerpOaB^#0a_wb6kLvQIs>#D}>vFwUz`z$pufO99#gNCd>?&BU}pRTNvH2 zGSd3|;QHV@AlCz$4Pnp<{jlf&=0p}fTn^?y6}dC`5#eEAt-&Ai}Ogl|Cn_GXT7v;Y?Gh{ZziN#WbT9|3JtKJHn~>G0CQXtbZzs;VD?;3UeT`s_&4ImhRwoM=O`EM3*IR_4*a60TMR{{FcaX0KX@EEBLhVJ>XAmjv3#=a84|~2Y)C0Bbe{byyD-$7li)-j*qwH z98n1hN5HAV)KSV3=HOf<;TB*{jxo$j!6jOu0S0PD)E5gruT6!=fLjZ5bgiB6onXDO z1R5?M5_A>iVEow|O90Zq*NB|s$P&`78Nn}L zDvXnV2UjAaFTgC-dLiJ-V67Gct_J3?CEc_FbIAj_4Y;W=AMe(hk^j44XfGBof;$Vp z1nwz(0NhVF9`~M8bPO~Jto2C17Fg?%fZ1M56gTC=9E`;vFz`(cpltZ_+@Z=Vd|K57Cr{;u$UuU8$4f_UFute+k)>9egS;9@E-63!c^npdpILI0Nx<{GPqor zozUHyasN5v@`_lT0>3T%5%{$5d9cyCh_Q>=AI!0BM> zjxa&g+|sHe;6iW(tyE(hyWsUAKLzHj2jilmRCxgRpN6ks*eMo2fnOA6-;ST3q#O3_UKgek)LX(-e0oo~ zCit{)L-41<+zH~G@TK7IggdbR_lp=fnsGt6D>y!AN6da+P6zFfuAZaldXdds{aO$Dz57-6{qj3`>M-fbS751}_(G3|=GL2K=Zn_xjo> zd?k2`@G$UpVfK=C310(#$>x|b28KgoF#-IB@Fegt;Tymo2;U6;M3{riUkY=tuWyC7 zfqxceZ-`5wc=g-CUc7OUcY*^Pf1zOy4BQ`?%&t+U@F8$i_ziHrFndYWh0lOXgxO1~ zFYH4z+f+CRZY@mhTuwSOu1qSlb{0c6SSzQ%q5)Vdr+_(!q?J>^!@*iP1^rb z;E#l}z}$_Q5mW;IAY23dn{Zt)S60zYTX3TA<=`aExc|LjNEZuki4_*+Y)_8xZQvTh zRA{Xy%nh-d3f~KEExZccUie{fXJIO|_7pBa+tM#42F`L16Rr*(E!+q^L72_*G~o&0 z>xHSVd86=5@U6mB-CQEP2CRf10zc@uc@&0qV%Q9RT=*IACSf*}+l2RlcL-B0bC2** z@B!iX!LJLm1$|5SWAJ;z=fIyNN&Wvb4Cln+AK>qWy{L|V6;1;4>mIz94ZsP)Y!O4k zO~8D&ryI_nXA92;R~BZATPVDg3XL_yumTpP!ViNv70G}$fSUY!6s960XCoQrx8SSEtp9(2VT@R?(U~O7MrXQkI{12FHZ(U1=Yww*ZU z+yi`%FsEmzH^PY7o~#k(OmOT`G28&dlfnzY+lARCQ00K0?*;D{ehmDo@H5~yh0E~h zy(?S~{DE*o@EPGI;BRb>87*M=RV*$A$EVnlbqA*i_X3B7M}c#MuK`yPz7AYdcs969 zcmcSf@U7tH!uNnLNs;>hJ{UTR#Y5n(!t24kg{z_<_7|=W9wJ-|JW{v>JW03=JV&@O z_-5g@;HAP{`TRd1h92P6!c@I^M0hax31QX?PYZLR_E}-hL%$$AAG}X^5%?A1d%;J9 z9{|4tw(EZwPKw1U@JGUHz@G^}0sdO}MKBc=SSI+)|0c|5p7TMJQ@t!v_)~C_Fm<8Q zg@5Ps9~Q$*lz|*!eo%!fVhkt-t|z<@+(P&zD&k1vsb+<5wXZFX$ z&>x0Zg*gK9rto0!`@)OBRMcUhOTk|X-v|Cqcop~;;U~Zsgg1lZF%Uq%&w_)(vE4AF zis2wQOZW)5lJGHbf$&Lib>UOs65%u8Cc>YCTMK^;ZZFLD{w~4>-jsW%vi?VkxJ%U_ zu?T}l3)cXT7p@DQD%=`8OPJ%h^MpHsZx-e-?w!J%YTRYGC`-nevCAex#L;7FlRX{34Z~uCVU=TCj0|9)=&&T!O&dT#5?^Z z!d`GkVa|kh6%O#dUzlskhY53}W3(`5NXH9jgQp5t2hXxOX4HaVo>-xXc~ z{y=yo_)}rdgq{vFA|0qV_*(F3;o0C%h3A345S|a_cSX|jFbxMz$ROkXvmOpx(o$xvMyg=lvVQ&+TaoX%oF;oWME6j<=2ZdSPt`lYz`?xSy;cOBf4c;a^ z1-wI;D|TNLW(|8#n6>Kb8La>F5FiY1iNyx+d%|48e_Hq@@TbBYmOUr@A^1Dtufe|v zTPW=pgsEE|U%|fjW57Y-DcsN^RSYv>ktNJMCMpRp0T&1_16LQm2V5e&30z;8`s+=F zUjVlj-V1Io%tyU5IhJRuL-Z1h*I?0K_%L{gFo#@63cn8?D|{L}MfezC%gcBTA14Sp9k7y>G5Cm-|)~rZQx)Fvp4O3R5YevGC8}mcj-GGTR9!fiD+M z0e2Tpjlpn*7_z|wge!x`lMC&+oTjq;jLgVX1AE21K@!05wInE3Y;nY5jZN$S~6ewQ*e9xdDnJYKjvc&cz8@GN0AX7f1zmsZu@ zPxofwp|Dsi%&c1`%&falcno-@@Eq_%!gIlo3Eu?XL9S*u$9r6SKsbg@iSe2k@WdEL zg_$eIg;@^xEh+}Ya`1^T?vC-La1HRc!Yp(@3)cq!L%0;|MZgTFE;x|Q`X7d-Fj!*2 zN#ac5*5Ifxvov402e?R>&2DXB=0rVV+*zZE@Ir74VH7%}JDH`}!1LO>{NQI5gV|Jx zeA|p%6_4HR>nBFKnz?ELPm9!BIC)Myr>goQU9etdst?jtY9CL#R0TgySXal>0kxH< zLn=OiQ(M)Wr@`tWoIEE^s2>CHZ>V-bNRO$zdFr6f@bsvvAHpfB7Vs1*e=8IzH?bT2 z;$#@J)yd?@G^oG#PJ!u|dWfgJ>W7p_P4h~XXGIF2tlQ3tRExiW>-2Wwhdy@Qd;%8n_s%zs+g0A`NV@tmHR9gmy>7!gb@*-6YPgJ!X^}<#1nyLT&#}K3 zi4;`gw8X_ND%lgpCX{R809#ZpRFP<;YODzH=|y>*Z-XtT)ZCvzM1IbvCo?i2*CD(c|=jk8KVn_@rD+bz&`jQJQ%^r_%(xj)K}36_Z&~E6p5Pesv4Cd)sqgxakj7B(+n)2 z23Lw?xAQ~f>vTIL*u0V}9xboGem$f-*bsHR5llu@vEU*6ULPz*TIK|~^lo;LL(#K> zoW-6Q9Ikd&ie$x}g<)!tZPk?EUR?0xAlJfA3f=|}6N8&!ixqfKsxbUly@{YLZ=fI7 zCm=Y9VHj8_9TrnTRqjSb~teL2k4VALLAA zLXg^BiNTSG)EDI3hd;nvcLPWL9WTm;JOU$*izfJ)awi;2W36amt|z zNzxRPYE2nt1@`TdW|-7R;+nZOK9!M&96qlaBsb4LR)ZtPbQy8kSN!Dy3N-!uN6UU{Ol9`@w$BYozoz0GEcJn?I99 zC7xgnWNBQGy(n++Cj|1b5#$>1Ge+08!jz203Vbvl(ohi1R`-c#SG9jFg$v)u6&icA-|WXwFplzC<%dhMrtRU!pduR#u_PhN`{eEu5bX&b>I|7iTC&tw>uKNVk9t`cd4PuSjCC6Z^p zt~OMOv@jo0UsQ?IH_KFB)kq2Ky7P3WnpZVa$-G~!tQz?S!X?!rBQrV8YR+LrQ5FB@ za?a(|=%bQ~B9FmCc~N9w&D)VEv%kqIg*`tM8@RhN8857Tkb$t_qri8AyzQ!G^+=9+ zN)4(W*=3$qxiuo;)VGjYv#H6)_B}X+qswZ*Q6F_pjmVX$I*6@0h?|iL*uF*EQ|gBr zk(bO{)sC7@5O?VyCLjw zk5HCRY!c~^^mo@`lt0@(a($eNYo8KUJHM=8sTMy(DwQ9*JTkjUj2jv{%Q3hsy@^}M z;|v*B%A*Tzgo(`I!JFdjDaqZ~oMjrDaUVGI$%8ZC&XSG#ED|ZU++xAu3k42pMVYDk zlTesALL!{i58S|loUV4($jpkdE4WcaMPLqi(YhvhyD;A^b_w&L77pMRl;&>IbuLs5sJ`BtSHcZgfV7@4mM}wWM|Hp%8P|hZEDhx4kGz-iZWqLRY z<|bL>cfd=9-v=w<)8G}t9D!de90EHVGiHFbhCjmLP?3I72Iqid?0hhS0vMca{i&Vz zuE?oj&9;wjI5Mv__EBz8G;NK2Flu94V;_uaN-IuraRiH^*4PL0wM1*|gYi;mYwUCX zBfjWrjeS_~UgjcXdS=1Y8vEcpu-4cI7l5_KKDZXRnYiaYZX?_X%)PJ}4qrw3k@0}x zWDF8!qDOH5D_Sts*NO$|CaqCLITJKXc27AI#LXAd7zz&VWZ>|F!pJmxD}T7b z1FOGXMK^qiw~L!vh~L;HhT356ZAC|Xa6bZ^3VDp4XTqSh>%sp3Ywdb4#~2I5Gq)J6E$jnp<$AbD2e%SA z3s-yLN?>-p7=CqdU*YCp?ruPNOMcj7m>Al@Vze;cs*Lf%-M~|YM}YasWqO_fo+msB ze6#R$@M7Va;AO(I!PMTOUyfm})QtSU0fvXfVgdLu;l*HX*}>gjSPu3GR|6jqt^s~i zn78kJVctHiEDyh|C-|DgaK?cD5axSsqE;7&#oaJ)#T^~324@Se16LM)7+gj8DR52U zt>7}@7r+gL_kf!V?*(5X{1TX3STU{`E0(TeI1Xm7mlh|%dUHka2jC$h{}4P<_zZZQ z@L8}{iii6zz_UdD6`0yy4D%bXR+a~U2fm&AU(wH|9fJ{g~e&%e6UuQhlfHi z)xhYPEu>bK2lL+lA#zqeiKrpzrWsf($b-9pwSqjD?FirH=w<*|>&J64oCTy%Yg*St#HpYaOgP#*-FL}4{KJb3wm%*) zNU?BbFm=x8As5_OnB}9TFv~|f;UX|~(deGHhN@^}_L{W5JGcpWw8*=l{2AlLa0Pg# zaDVVT;ep@Gxb?{N)GVpO>UfC&OUfCzY9l_rScLM(?+y%^jFT?E4hL<}h(ZDWOsC>@S z$Q?n?m+e*Z3XH8SR0CIFsO?xswUNeL^#_dR0M+?HoHnTyJY}eJJPlXPSK`!6Eyl@n zpqqMsC4AhaidR8esOIoAUA?*r18>=?-D;Rdsk?catbw@?ZuQzAXTA2ludcsc+3QkN`g&8W`0sCITuYbZi!~?Ky2swUjqBHIv~1J4 zB8(h1UKe>U$VHwe$H4Y^RL(<@X!nT_U~4SCKwKP!V<#5lZ0yxz6mB%~75im9jG~YI zvetSEC$U0|>&0Z-tPTiT_R1PUDL$%*4&HJd=qUbr zy{mN4-Xd80m+O?&WeX7C?mpgntTf<*eFSggH-LUF4#WmnoT$`p;+qkTz#hosTilDz zZKG*v8J-fa>M|{@2(O!i9>!SN7^FPG*#+wtcu43(Ef9>sakuOgZ({x5V6?7cP*y+0 z7PGEL0RDdTw~$!A?Odf1I0yFaAR2))s_2nOL2?ERzQedI z?10iWPAwUpmD!&?DBquZRB>TR8sE{p{^fV#WUa;MyND+1c@C+@#DAS=n8g$Nn_44cv9gsE4fcS1^0Pupwg$U01|cJ5VuX z{77dJZP=AD6M^}2bp(eqZeD?9oWrbI4Gg9*ty2me5x_b10mg&0u}( zclMN8sA7*|BeX2pO`c$EL$n>f zN5gKN|Ia8pM4CjFmg9 z`RgOkWRHb3x#lHk?BWp%LiciHt+2N0xdB(5qULPC0QQjb`!_`1^CW%_#~x$yf3QEr zb>(e0MgB0$mp>Kx#r)f2Aa`$x{FD@%%LMDoLq7w|H+Qso#!}%dFtr9KXB$MV0Wurf zwZggJ$AsC}q0#`|)C6x8t_^-pm`%`bo4e@NmHJoo&3bQ?WQ@A(yU17cyeIU$6 z_l)oe@Mq=yUc`bfe1z=XeY&Nn{t_pCGS$qNBG;j*IS(V+pVs>$T~(|75wE&yf27F# zO116~NLPpVqx$crPVYyna5?&^UX^qJBfVW!*#StnDTdxvQB61iclW7zkeWs6F`ibd zBRthpzu=VgGn_J8qexM@+Pp9r^;UpBiTz#Pg=*r#h-|2+1|RZ-y$wt2>W_7Zh-M=BL^HJh{s z>{2KhdYjIg~EcQfZTUEG}57 zV^KZ6(BhI$Je#ZF$2Wm(0Q@YyihkJPo*Qpn3dg4PEhNf&BvLzxtDt=^TnA6yKs(j) z2>L58`gMb%W*&*8=W@{!nh1LSOa<|JA7DdBrJS^`yc$%_X8Jw2bPn~Ky_8??MSmQ$A*H<=+fT` zzKVj~xb!CANmTRRj%0coCaC+~j^tlf4Gx0+%khi-2fN_uO? z_yU~GN}5)S{sW9WX(q4M3VfutzZ0omIEYy`&osHrB|3rlHuAd?GYQP=tn{o(JQgWP z8is((8%%C3QRzq3@EEG*s%r4DNM>*C_)2k%M4MOYZ;@4EWdhcLjHB=Vw(r3V+~%Cu z5t}*Ctcr}w(J=`BSpLefNG+3Hk9Q*lsXB`KI;cw!YK>=At>clBRPCdo_PrP4nm?*B z$0NPXE#-TTNBWqk_`@e6z0iFccOvqr2cN9YJ{c)Z)k#UyNqG{by~beG?_}gxPxW}! z`~Ap}t3GFj&1DugtcV|88x&(QVGJCu}&FE z5h1*kKjZOZG#aHcK0wB;SIs|&3^hMgt3JTHQor&;A4IP7C-yI>?*a-357y+Y$9arG{x~x!94>ceQn;y& zGn2w)z|KrcKJR|A?e|fH&t5||j2ndu!0a$X9y6-Iuw5*wfp-bBr$%K)dM*VY5^ezI zw}vR^tMM^mydoO!3%3P-EZiB)-WuI^1#?Y08L!F4kIu$cy7xa8==3!PMZU`@6w)gg0}fqLCO5f}05+0e20UVa2}X7v7Uecv)@au0-hnvoTgH>{!&+U7^uogN6c!@u9542 zmkKkhsqsL0E3n@D3fu*(XSz^U*k#l+UEro*J<|nl0p3Nw;7h@JrVHEw@!L~fFfbrJ z)dlVbeqTIr1Vc}CLC(QGJ=F!C0H*pT1HA|Qqwp%Qp6P=8VX&U*0&fEQP)O;1E10hm zdSk2IFl2}Y-=r%FzXi?}J_V-Y1U;Vx*AnIsS{>mZz|DpK0CN>S-CqD-CLE74)=fAM z+(*w)!BHa^28cx~@L=H%U_HHsnh{TxJ-r1+&fBwFU_NPjb_;BQsrt$3luYn)a?tj> zMi|lAdsactg;n;ZRWM-C(RfN6RRHfJV?>V;zaq?tj|em3cZ3-+C&uZX5r0ia;HU=e z87*)I_;-=BK8Vv_>VgGJuOG3{Lq3?gpX4HNrf?0gp3#Dw1*({Gq<|6BbupLxQ;zE~ zS_(6v?Sz@o%Z0Of$=$`k$EkPu6IG($C7QWvb#auMX6JcYrCQg$-5c>ME2= zwR(CuBWuKz;X_?tRd&9qe9uH*MGsWeI8Ju2TD>7FCwLb!$h;l}GT%_+C;B2I`++aM z^^AcDuP}u?dE#&7$%pEWr^GotdE+_gfVZBz?9;Urn!Y+P#d~jnAz`X^=AEwndifmi zOUCN_L|?(Owr8rTmffRce5>HdgMDk%k-1j--)ZwwzYTU&Ehqb0{T;_<8>^aH^Kg8c z+ErTVgj%&NP({^f7|m2|>r@(EexYHsdz|NIud2Ky>pIi8I~5}n>(uToSq1UcQ2(r0 zw))EgbMLa#KU6c{zI(G(4ISMfKc!TQKZP<@!G5<4sngA(@^1OBGMQQ8Wb#Px#Z2a_ z+Qm#>MAJWKaytsWiTBti$zv{{JVhr9dyFoj39Skpf*(9=j~MFV6G36l3o{7vohrd-vdxMOsxbJZn#>d@e>voPu`KJy-1L<)^ZvQQxCOpY zVX&8vjFk#w8il5>1%!Vs%Qw=Q&)bP7(=*5}%RT?6%CdjRgwZ8ahD{hfq5S+eDY>Su zD%9)WrtB#%?)`7e@!zX2bVd*F_rJ?%W@l}wng5#6Y*LYLlF=MMyjYO`n$dUD&YSoz zGkSsc`+qZ|bAC(jZMS@#U#*-)hueab75Pi1{UGTr&Sop~}ngYClJ>;JH@H&$atL^J+-H=@M82j#d2tNu-; z{U2n1uQ7kk{!-lyS>md-S>sBrk~Iu`F{jZiGvf+PHF0QmdUNS{u+Bi{-f5ryWkpS` z738h1)=keqJ8!%HALi|U-tXA1%Ew3hE6-Hlu=2wbqMhPA-`I7v=jZrkUB0a0?sGh# zOZ6UIs*mbY9kMHH&aI@|rP|9rM?@W%8cm6BRNA0k>3`AjSc3wmOLeKCF261s8Tns! zJlHcq0sd>p<2Jhh|Fz>W!!E%8LmiLCs@L>rh5u&x{pa3C{H%XlkNgL{k7lvI7UaM5 zr~hBi@k8_eFXVVR`g{Mb*7y%Hd&@#6vzKl9G3>3=xUrtHiMs;t3SZYwtyErmOLTxo zy)f4oug))u_Ed{*i{`3fkKsM(#BI^+SldustHNCK%L}`p`Ssz2+}uLE+8>%c`^434 zs&gU%ke+*Wk4nW!p>*?Ox(Y=XeOR1yTUqGFS_{lmT7qv9nIDk)jPd2?dCZgKlb)h7 z^F318s~4IyZ)}zwx?mooxq52zP_b#g4Zgz2J8+@wzy-{xZpu%sQP9Q{4W*aX%dOKU zn)f`VeTI7Tc3)^7G7r(`kryuPYLfTXyb3=Optx zn)AN6@CIT&X_kF)A@8#bb%q+|SCp5Xr4yZ12^bQ%x>9ygs8(DX557Ex1eYQE+N_#o zo>99irl+f}yAtBdPb`jp=}}AiT0Zstl4!O%e2>qk4ljvDRpQd8W|Sib&fysV@*JgS)b5-rK+Bs5hZoy}GTb?|2b>l{ z#Z?`{1)i-KgNUoBJ^A7bXzxqhqg#gfZ8Uikt0rJzPEX8Ha~$5sV9><1yb2%CK$Jeu zc?2h`tUAD_tg_mN!53Lt^(4H@(yDI}!=Fp5u10uhXt?~s{~dw~%)<|2IE&vPhrVK1 zY?THdp>z02sJEBahKJh-CN%zqjs_xxjKrpG95;#0h(_qGAV!B;Yy?_H620|+IC&-j z-vm1Y|B07Si!|i`bII3$3Y=C)_%WxD!8$F?c;cL%8fb|St z2d2shK8qOxEaBP(L#Q)C^>t)OMraRye3vu&3{0lLk*^bjK~IJIvU)h9=by z7yOk>a_~V!?F*!Gcr`Q{P6BDMH*|3P+H4^GB-m>Nr!t;E!@6|ES-C(X4g?vY@koB4 zG1+URa2GyrumzL^3~LthC~RF1Z!hY7>x{jI)flFI&@90?)nUUbL1e!f))JgBD@CQW z)uweNvLLp`v`!)U&&63ik9guqMa2K~K3pZ{Z&D$$GT_*-wjsut z^$Oy+-r_Lo9BV9iw$&LC%(52Zcc#U?{$^O6VLRPgi>Rhq?cnt~>nv=iT4e}qiuDX9 zY$jXW<7|>O96?O9JaCH1&L;b$p_AFU(sgL%>22-vhZq`Dgus~jA@0VQTGJS9I$jr<@7 z#;xS-KY>FRa7U7N5RK4{@RZKQjo<2vTOH6-&_Qbve1(jZpOB+oYvKY1U53jytVM8Y zT8YRck2MMb#p0~KEOnLzAMtoHZ)3Q8@)ErF5Lxm)EkLQAIhUK@-GE>JEBMjRazGO^ zC_u%Y0J8y(j(~$tAp^RlcE1y851q#?O6|$OjL;&;ZO#tG?t{zJp3IHX(AGb>tiqJ> zlSN*q!jvgvgzM@%lG>NC*3&th+K+x4g_`4HQu{OdCLw-)+2&>;&X%VR<^{D1aqq^| zVRYX%bPH0II$|RyCfbF9NPp_M2M}n75T|ofC-63RGCb{(QE4Mrz-@weEq?vnB|Wed zmiFb+nGxjf);@F7N!V4GJYtw(Zr)3I=sLu0K1Ie;JqTCrGoRu1o1vS*=1#riI=oW> zxzv1_TUmyVA|>W4OrjCmjvw<7*$n0JzP(EJgs6jHzDAA<@oU58>pF_iBS?mMnCuJv zK=((;q0nS6_zebch1Svio8;^ew;zp}M`_3nap9Wz7P-i-PZdztr=}64270b}<^V*Y z!wl_HW`SL4o1gKndPC1J_;ebW)>y@#k$M;ysgbFt0K1vyy>vEd1k|az>7*Hz zcqO&qKf9ij0qI~E@)&1VKpOtdY98*TU72ds zv`oln)811xyFVIxVvS{&Hnmb{y8`_m$QYfuJ2KQ5AV@U_^)1r z8!MXwJ-oM`rQK?dm^8^Sukx@7*aiE-q4+t2IDS$&4@3(pbJHmcJ_@jSwgV%a2scaM zh8ES;;0K}^6_|s~wVNKa&VL)$kE>fAz||Jv3UXmwi+^)@0L7p(RRcbNF{d@aKq_+B zwlo9eUIPK=Uby+BcE{JWDvq=&JyfORd}bc+6t3N5H>eg1@O=Ot=6bU-Rr%L&9ZBxv zkXZQt0b%BR2=O+AY2;JPT*W2D#}&bVqv$Q>;3XbT^R&jlx%~D3=4qZ_!M?<^6q1AR zTYLqd@k?}Jj)Rq*!o2)VDIJF#e74O3mGUgi|Zn#4CHr$jJf2LiA-(} zZB{nTS8=X547Mc^}BD(H8*$a2ToqU?lRSeoxpm;$K}G_C@d07 z?(X}ir3V8w)f&Kto1Eph0-$*5`>#{dllDd-N5z)G!Cc#`sh?ih6teF?3+_;fFwHWS z2U=``#j~(@UR(6`_=@-_He$R>M>&p|$*fr3(2lgnYQ2#J{rnka=W$8qLQg4Naby(B zhA{_O*b(?XLQa5z0r_ehh5aDo#%2Xt)(a^>MDcMfK}Iz^+eUIaeDd+*!_)DvuJmJ+ zzZ{miaD`-gV!l~;)f$3SnNNCnw-~3n{AKv7QUh2A|20vWZ}G5}<4kE`I{^12jG=wD>r!)h*>2wB*VzlzbFSv{_+-qy z&cL$=DdRVL7e@a*g{qj$O(*Fjrw|xg7tzKh?A|E`iIXm^XS5!l=P}Jg5<72u;8%CxJVt$PaA1D@6eQx~ zE?&;Jt{~pUMVddxT$1NmNB?8*pRxF>;8_l^Xxbg%DkN>>kFF$*^qLLe$c`hyn*eUe z{fT{D_%6}tH~jb}n&igcAd}|78~Z%=n*>9N1^5PUG-2Nr@KOGeWGf=SNT zO$KY3fPPDB#&#`fEW1B}y$C4~MHu#|L(^*u+z<&Op-kl*Ba=?3u#4b{c|}8h3Hb86504Bc)Jrh z2GC>~!p#`Lbh0i(f?432-HM;232Y!-sc&8b4`zk$lGehKEkFySDZhJ?+)!u0Mmp9% zY;h6C76=mgYT5K1x+>BwF{^Rg6|ca)bnU(g^>|aKzv3Ng*Xscm1EX10-i5iW%k4YB zddAL%=ErfR72=bb8rI@1j3yt@@l0kO>sQ+Yy94$sVaw4dk*PBvR^6v&_bq?uq3A1S zO1u%5+$7jEzGJ#43lFO@gIQVS_dF6!hgHY)W?_>-XCsc5<*Ocz9ye9yhUhjm^YLhR z-vLNXW8eYx=Ht;R<~^#z`e>EBO%TQz{%=+ip2EM!C|$|(PW+q3fSv00_0byLY0}eB z#?nzM!TMl;FXP`ddhis*twQ+P3O|SO{{jAC>xkHjbKVM~^1U0Pjp8aeJwn!R>`9g4 zJWZu;iawyNdc#Po!D97@+Px`yZQ>&+miz|j;ki~utsxU8OfH!`Zps9sWYqYvBT7aN znL2FLkV(T!hL5ws56VJ{P_PB)2MTRLUNgb|Z#kD}7nl+j~H*fe^`xFH}ELcBr%Pz-1}e(DsgD!D7J zN`tAxC)ncQ)((+8JzC-sLflW*``muyfvEd_xOE~n*Id!+tz3S z2F81Bi?+hnA!eKhn%QQY*I%K0^|t8oxKt!+(8v)}Mvb35W$27?L&lC!Gq*>7{X5yD zHEcc{otRaA+jG$qrb_;-LQeUtozcl&)p1Ysao^O@vvEFE5(xU# zDatkl)4gg}&lH~;_fyXe?E{)g{k>qs%;0NP1WFS@uA|bkkc!H&2$g9yZ)#_DmvRPTZ^J+9ly|JJ|H&t;)AisS2Ytbcf zQ1?oGE1xxgKvXSSk!i*F=EkTyY6toHi?2X^Soq~W#;D`; zdw3cadsh)NiaP?VYBc?exya})X14BWSmb-Pm|4fAVGLmw%=Bx=S9_>&D+ErDEDiT- zrI-h34|R;KFgphm#FsG!U`J5TI1Dorn5O?5=x?XeY}+?7ek`y4W^|_cpOvLGN2B%s zvjSWG_R(m-EdSuGCAgt2a^pWS9L!g?G{7h&SN3|Gr)J@d{~&#yd%tf`cjyA z{IxJcj7Q<4UmnTAe0uoCM>%g8U+~DeV6NOFv#`WkiGlA{T;k^hbPX)Yd;kjZZ+5{C zj!F2ZoHBAy^Z}O4D@i_kJ zo-%S!9(;?&rUHGR(J>j6p8^P?jVQWh_l#v}b z&FH2xesCPeKiyD94vM@L*zArU9G~EyZd&pBX$Xo%P;LQlM_b780;dn|K0*(ak%J=d z;Bu2MZYU!=ZaUFTPyFDZ!V$xvj2sJ!1uxdTj84$k6GxPhgCb{^(K8cAT^EOY!JV_X z04laxP8nGjb#OM_P>3S~|7J*|s`-Ajvhxs7Vpi31qdra&P#-u7Iu6Y4&|{Ze#}1j!Ep)xX+aq|DDuliP7k^GH#zr$gZW4I zxx#u*20TdQb8+UwqQ|Uoz83#FQg$}|l{LUS?P8{)pAUk(puE?2)TKG4a9XRg6 zKLe$V9PFpA`5^j2xIY*N3rj`?`zDaF+NsT{=p|-&2yMk4H5W5j+YeC>o{knc*5e`0 zfHm`+92}yKpNmDCo^v!3J*7Qw=_3f}WhnGL~Vf21;2$HP_I{9r4 z@+$n3vv7Wtj7->oGyhF6k4^YDQ4)D&PrLOYnnZ6#gA%MmWq{WQ<_lGr|%=&*~K zG$#lq&Ea2NoPg)ak+TwTxU!3DxR||u$4yV0?fUjAm&G+Mp5Wr^T)f=HkGhyEhMWkv zFxlbPT>Pes-#67|4T1slb2YX>Fslle^f+EpTpV$6HT5c-##*^Vm%5l!woVYeT-@Kq zLtQ-D#S>gS&BfQdm}_tlzMXB0To%h*e7}p=yLhvU%U#UxD>#XM(Z$?b-I43%cT()$ z;%4uT#d|JCr(LXv-^9Z?m;5^y>j^D!bHOF&Aczw_=NBDLbC}OoCC30Rb#X%%w{S5R z+c*Jnv5mvsT|8X%YZNSqO?Qd(fRUu}HkVwvn47;j!EvRa!`vs;Veawf@E0ylKqcqM zLpIxYH_c^{?PBgj;dm%?aSa!jy10Rho4L4+i@Di|6J{4LuGTU1c3BK@@kkesRb`EX zS>_DY9H$r;<~qLLaPj*t{@leJWp&(p;xBSl7uRud3m0GJVydPfoCYWjXo+1G<6KOY z5GS&mT)a#bHwhM0;Vxp1_2(|;UKNf!PM!Y5n-!yug(Irw;<_$w>0*A_(Q)6`#lu`Y z-o@O;%W=cey|2a&to5bmagwH>Pp|qKmZP8=V&+brIvKS=U&*38-B~z3G*6$ zt$;JEf_I^8REghC|7CSK@IsI33J)L4LE)kxvzQ4anzHE;+Z*al`B9hf1Bu z_?=S6^LDai=`NT26|yAaZE_|8!Eqd%4o16eoOZc6OXf=wjxXs3OgBG)V@^N`h{)ko zGT(i1Q~;-g=^^TJQ;i(fPK=s#1E!nSl*?7Nce&@ML(Ph|`yO-;hWnT?(B)_pSv-$* z$>)-pw>WMDr-M-~8_Qho`T0-B?`oI(hs1p)xZmh~MMD=RBR9_=HTK zI6eobgHf&wBjsXb@npFjmP=lNEPnZAPx|HiWHpzYS}~WSQkSE~l$S6jjGMaL40iE! zmm3`p-ko{Ohddq3gx>CQb01l9_d${C>wnB;v5_nRJq2b!#RzDZ%MHK0>A2y?GaXJq zlj$Tnm7K%mpbUZ2!MtTPDVIc)S-Ag>heou>g$o?b=polGP(558`jShu6XR+ZPbBBr z@~Pl-Fbm^tluKkwUG7(qtI_=c`-7HFpc`pX)eh)ImxtHMRc!fDm;4mD(3YQZ$@D!shMuhBqU>_fH~xPBg=xL7Mpi2S@u z&glrpeWHswne52ZTpV_BB^MXkjNUVjBDMODXh9N{(ws0lsv{6}WMk+#e5gvs=6=D%2Ed=2SZrWHK%j1Ak29R$LT&7A5!Ng2eZQ5A;YoOFXy<0 zJkF@a2&p%r7XQdr^1s78_&5_qst2g5fuz@<+B`vFWCzlNs(i~TV zTuj9@M?T5Lvs_Hg0>{nGs?wcVS+P4^BE2W4T-$>#`5G50YrD9PI#(;4l|=n< z$6FVyeo4zJxW)dZ*6Tj^rztUL0@Ro*5~ zR&19`wBN;4pK+XO6;EkJ-*w4PxtRL-j(a@-Ant#4$@x0xxZz$>V7nQG>cgKFd~b6c zalM7Zm0e8rEk|C@#Z6t@(#6!(a$3~hE*=n%_#KPEE(>m5>Bz5jF_pX=`8*ddbnzk= zQ>DdmuUt&6FfHfxbH`4{(H0j|Bi@nkcJV$JA9C?w7r*1;_gws;i$4L!oCv;lS$yYW zDwF-$OuIPA#i=glZtITwsEetD=E&<@Y4Y zxS8N$E)8+yb2QuK&zR@3&^yUVM@BCY5nkqULya;gpa)&N#>MMh{G^Mi7Uy(u_B3-D z^cYW$uGtNKzQ}Pz1vxXgst{;Xtb!8v^xD1MB4%9Ck^)aLj~ld+-ZkO8R0 zuTU$h#bueL<-HRsJ!7i#+mqAFbA6Q>nK3Rpa|T)Zvf|TyRP^@A=(h6M%_mseH~nNw z4Sk-aL|%agFbz^GmXqbp;wV|(Aif~W%YlbO7h!q&%V>}u{$R3H9S@MDAABPRQ{+Yz zbHG9JX#hDFsl>s}ES-$_3>TJ$1lEH5YvD35H*}<&b27hqaQA7b4}*y-CN~8q3bz3# z310@*8%DuRXRzKd3fvW(CvMOu)cV~FX9$>|EF(_=*A<=(ZY;cjrLUzJZU(m#z8ieG z@G5Xu;f>&-WZb4AFc)Z$+0SPCOD+XZ5$4e8OyPE5j(pQid+<$Q{mBYm8COWrf}`+k zk;y~B{D>%dB$zES`5G`kC`!H&%;9nJ67aLa_kdp%ehmDo@Fp-9_0auxzQi3D!wy)S z5@d|5+(_hY!5mv>WW3*d0EjQf^2M-fwZjBY544y7L7aY^yK!Jya zFt9DBXJ*}P!uNrf3aix#i&+0~ z=@cz)hXq@D@>1|b;k&@ogdYU62S7Kg!1IOIfVqN>@=f47gqiL42s5Xb3-1K4AyX}Z zrJdaYdOi$(Qus^oR$=PjaM2^(a9oYO0W$S(_6t-0=2c<%yjK0=LzS^2aOz81{h0Nu<5Unb1^+D&)~m`fPwW;u8yxq>~eHdZ(f^2x%5;5l6H zO-EH>xLGV%fh-kf34cJi9rz*PZeX_V^ve>?)}1^6yoa1=k0Nk^mBWXGEx7rB%&|1Y zZ*Vq88^Ax3vu)4Z^w!}dw1jD4Th9H-9p?VGWSk5xvL>SuG^z-rmbJf)0y%;;no(ZS z4u>;AF~`tBEP`;?|N;DV5vs_m_QRr zQG^=WdP*@A+N4SeZD`1uQY4rdQzW&#A%F>(Xag~^eDKr&2|*MRFcQEoB!nvR%?~wv zFro?1vpXEs1Y_cUncuwo&Y#_xo!PtHeI{#|quUn4+ra$Pf<6P_LBoUKoMDc7`^lBw z*%~v0;6^G@Q8x~n1-)UD z=g&oSaHjkm)6md}=}`WDOrN*pn$}S{tM%OcuUc=NVeJ{6xR%W4=Ibw&a$b_gYW zT`T(-I_u=eYMqAK-?0M_pA5&fQ@3}$_i|G!YQeL_gXI-Bpim=(7=ql5|1d#w>a(Iy z8DD9k+X`=wuL)@zX2`C%PGIRyH|yebsbhCU(mk$k^NpmJL=DNDN4f5-`P=F*nn(T zC3UbQ+~K|Q#)C=AcEM5{}M!!kFmgYNE5 zuMW?pwd1DS449VgeMGT-&(SoB9nZ?QX%xE~y>X2U56lb6^+vyAw{1eB%e-2&%oQ~H zPI;cVvWmyh15|;28L36}-;jl?%OY~Q7AO6~A-M&c?XSTtj$6fw49shXr9K1m*D#-y z;jfB9(hIxYfVsIvhBL^x>nThZa`lfnAvw(?KP;2)ndGNsxVqh(0(CG)mrG@xPN>|7 zG&4N0T;4)h(z+kFMQAs+(K?y>$covyRk$SOTpcnGwBY_kCQ2dSUp*#s>UHXIQddLo zA_I$Jft*ITDUKHf0XJ9NNnp>+LI@{?%P~?MqizSJ!O% zxMtIrHS4lNMIGC<>(HfBZf?6=9`66Sx$WB*7QqU~lz7XsTUl1CmH)eE=wEqwBGa-y zKi9Ip-}t|Js+(#o=L|XU-@V!g23qbjs>dnoZ=9jO|E== zb%y>E2QiOaZT(kg?C3+*e>kt&XvO|#=l#E0vH#`_QNi2rNaXA=)AIgrp4BHU@A66i z>J0rW%l{ATLjN*$brFa^<6i6k>fGVA;vZl0Z%^Ole#@L82i(`ayDZ<|IQ?_RSnf07 z<)zlYJ463Y;eTSE`0Ehs-<+X;r|{phPx@knmGr|tE1*jL>$9iV3JkbR&X5ED{cCcY zb=KcKgR@gDbA|*`;#ygM_e{OvN9*66X=UxK|LhF?Nx0*bmG<8_(}#?({_XkQT~_*k zeTIx>#@REiKb`mXwK5*s^M8G2mhZGOXBYj)^Pyc<=D#?zmWCd*vX=hO&g|sRtpBU? z*0-!|p3h%)`mAyrz&RaOS~=Z+v~v1aTRFo&vvMX>SUFSQvU1S2a~AEfazfp$oXZ~k zTW9??`P<{dYR4DxF-hSy_4aS5w`Rwg*@M)MjE0AlPKfcx?)W*UfgK*v(igrdXH2*% z-oN9U+*^Eh+qU7GTQvzk&?+vxw^jRSGi1`Iwr6BTb?Q+Lt!-H< zUs=|DQI@sOI(^t@LSVnr4w5KO>`T1Zu_t3K%j1cjRaIj}shEQ>*&}0M6C6i-8gSM_SqwVUFo+BK`-ZU9O|lVjQ|&P8`4}cB9mPBmDHlwkn5{ zg!M>eZ0lw~=%m0Rwqzg-{)SNZ$NumSaN?|LEA~f9t%OhEVQlCp8a#RE8LSbE4txb(6j%Y@YXVn-7Y0_r?SjC{XrzCBU^*OBTlO!Id57KtE!)PwxYmWl zg|Lk8#r#V0_zFieLLb0j1?D1P6_^O`?7%t*qAc4FAAFq)p#$A67gP6A*jNGd-_X4u z0y}UO+(iYhg{sH0uNwnvU+HAn_(Kq-`iA@pPWXW0VMHsT5)OPLSy-Ng0pzoC5CL!E zoXRT8cQ!dbp#wvnk_`4I{2Ub?*R?=x53lUnBy<-n`ubOAA`gwH{vKi;j4eSS>%vu=6z!?EGy?gg1X6rBH(&4@^l5s&da2PeU9R(NFh=A#NBj!Ed2 z4jogg6S^}taFB{ij(TYTEm&Ua&^kocO7P>qI?Q}XHQB6Qrb;Hfr5|bgRQN#m%oG-e zs&AVTpm!NfW5YjmZ>BB`H|$Z+dM=WuUZ*>i39L5*VW~IXf?oE5N<992L8}}^t6O5j zH9Z=IT2kYC)gPjU)gUTFoc%;+^`Qp^!zh&5G$_S3g@-ijE1YW6VF=UTBr4Stm-BF@ zo75=9pexK$T#!)F>6Br7Rd5!Lh-O;dTTV*$k36JR2z}^)duI`m--xV9a zqF23U!%>8)uQJIQW3}zZWG+>HxNVJ7ZCZ({m|heeexX-!FZ!r1g_me4#FEIhP zs2s@YaZ{XX)9rD_a-TxFCDd0VmPX1@kHBfWAguHFuX80m+-`DE`S9Fb zY(n2|LhterJ$o?1=xr_akYTIsKbRGHc0TN*n9NNbe37&@q?p0{gkaK52Ikq!z$TET zf9eVEDm~S`1;c#Fc*R7FWGI{76(1~h(AXryQN)8orUcl8>A`2c>o+#FT+{`HqX1>ei-C`Nnx52Fabh+GS&zB09cN*6(CBSPMVZ$Dnxt-27 z0yDdhn`mYi2s3-#A7F0O3!pAE_C2B6tP|XK#yJL_HR^AN*YzD{<8r)jUmF#tX}_-a z$msCYemm{)o^Ve8rl`|!KiFhq6|iF?#%z+wEqi@M$E&^JY5k|$8)CvQ^lwzKnwIa` zEQd%feK!eFx)Nqcc}Kh+UZkHL6;2(H$KbjQ=$iR06ZEmm&3N3vsIxkv^T2?voo}Vi zDWfx(xG6gsI;Opzve{mHA&9QHsX~cOehQ4~UKMUMuzov}fUiw~O+)SNn9U6N&St^c z>t}YnpXqaq6&MX~?{Dz2*ZOetK@H;GL^*iJmrn48M+{00O+tLUXZ;9GAG-jnR|aB~ zG=Ql}M5FRO2sM!7`CS3oFtX_xd-IV>*VW(%6E<&KH=*`oD_K137@OwvKA}4X_ z5*=Q2M#FAzAmNEk=)4o^yz$5P6a#ERAA6M`8@!X5j1jbEG9qF1EsouB@Qmk@Vt1jC zZ0mCU?zE)T9y8`Fs%%}ku-a-nXWq2(Ic*m$tX#0L?Tqq8(`J@0sA!9G(X6U@&b17h z#f6n+6tly|nW#fjA z9n!b=kl}p>TXV{nRW7h9W=^Xvt6W@(5i}w_ZC+JX*{rHrFx1Q}E3c?nU@fYsE~}n4 z)v7L^HoLM0mec0VomDl%npIW3sK%=EcsBddH4DkaCQb;WpQ=@7lOy-M%L zWGplVUsgsxnPNC+l_;Z&>cu1GEvOl4d^qiV(C9wHhYgd`?blz=-x$9>R5P!}IGI&# zD%8SR%PZ-ZREg^HWr(08YtRTwN~Wy$ym@n2B_ruaQAT_nF?{$CS9rrlj2b>*RKL-q z|LcaC{jXYPdli+{4;5?1LTjPPHdmc1ua4BtB@4={t5JFD3gS=VvIUhW%7vABL@Sl0 zpB$tT<1FTTMOpR2aNzum5PJxBYp`a`m|I;ow|rXJ^jULi*aXW_x$8<`_+V3p#mJ&a zwLl(30*vJK%y|oIs>Ow0W zGOAx`-wEOw$_MRw`n>SknOUK_Di_K4A%lhu7PVOm(JGgS!D%FQUiKL>y00sM-l(H> z6{t=L{ea^cdK*Rw9Zvaz>M|+*ikTtwOK9~A*cB}-n_D?|TJnrbD8$KOh9d&Q8UwWTAyjgrg51X+#hYqWX?hf4I!0P*DNTjUt>jTzA1^* z8P1lxs5)FVD^t%*j!V>Ket&d(G&V^NtxYvILDZ#p%%GwDhL0U%%7VR}EnuzuM7rvEXpak!wCQEla~3T;-Cwe8(9dxBob1d+RSRd$sH&{U zHPtSX0_IG3+w`@!%Y^vJt{^)lVw)+KAy zn112X*{QlsJLSt`DHmH6^A=5=Q_1Y6->AiP%0v4N4SzK=Eh};p7(VpR&1hz2d3d-l zE&RDJt^oIr8Wuw}8rQUC=%LCMEG?^^jlO(g<+Mo3%h+o4rx#?7(>FE92EF}Lv9q|YL2`bNBCVY!dH0_!;iGck8mTTTs4jG8RUWp-;A6HN^afm;+*^feh-&CK{wm>KZ9Fca#*Ae1_};CNxCAt2lYoG#o9 zoFm*8%mFOjwg(r0Lo^h@&_*nJfQy7nz+Ht0f=h%af%^+j0S^(L3LYg~0Uj?r9XwgM z3S1#v!|B0u#K4@W7QPU?SomTvr|THeOTiZkUk<)Zcs2M+;kDqag*k0@y)fPvTbqTi z2j5{Bp>BfVUa{B=-Y$Fxc&G4P;3tLe0q+sM54>Oa0q`N=?cmphcY@y%eiZzk@H60( zAu;TS;S1rnz~2hL4dxUTQ~xfQwTJvZkdON055RumkHA6U&%vBsqt1`u9O0kAZOLfH zAzZDFV!*tD)kT=idI(wC_XrnHBcrXuUu%{yoA^B8bnqf!R^%1Jtl$?2vq4?#LHX08 zb}(E^3+Xhrkl~{j@~tj@NEmYv)?>nq-&4X2_+>IW8M-~(5T12TkgX5|aB-4_TmJ>ALZ(DK23gj<0JkwdUx>PLu0 zH}ILlCE!WIgTPaT$AD)Fp9!uK9uKY&o(NtpJOzxIXcGxG#Y==|fkSJ=z;?MoxEj1s zcp;e6A56hg@EyX-!S@NX>DCHg0DeOFYVb3{H-euR-V8n%;gEGJ46lmC?cg_s?*_js zd@uMT;RnH=3qJ<_MtCpyC*c>se6zqv^Ti5Zmyi#GeZp)V$uWpJExv*wLoE0ZUtjnK zaGvl_;O4@=fZGbkD9j@Zr-C_K8mt$oLqmj7$E{JqyaA3E&S2I}76am8RS2`GoFmK| zTD5R4c(HIE_*~&8;0uLWF)tHt0lre0mF{ZcHsI^QA;z>6hRtGe2KYANA>dkacBFnz*|@*cvb$q9FYe2_42a>ETH|C!3MVlf;%QFt7XRdEV_UTgnNVA2=@gS3HJwg6=u&^BFv)fFFXu9 zM0g~4lrVeD@xl|?|4$Y}IV>uK*&EIjW^cHH+&D5UyFeI4Yh5Y~D{HMVD_vN)Dfl|! z=HQ!zTY_&Vhv1TJ@gA`#0&f%U2Cfxm3Z4)i3w}m;D)@O}RaK7l{vQZGg#Y`((Qgk|_lC#5y#(?X!6(A?-x+S_ zPTW!T&UB?}!ml15Zs$x5H+^@pIugF&-QnuN@aOLiw=*vd_k6E~+M~DKqEf==z8A2) ztHW2m*EG5-n&=(6bbV|}_`rJsbv%6Ry=L~;y>#N&=^5er?q+J$G+c8 zy&OId|Hp)H$N%x+7vFCdy%arbYIx+kDf;*!JAg3jpJ;J<(L`o+VTYok-0;ocH$!~a zpD1YbGcu2dtzynsym()y$&Ow}lN~!deDp-?PM=WbiM^gOPwa$<;s+2$doINPm_^3k za|JEDo^NPU_ULer5AxK2aQO!tyzJ#{>kdn=pBbA{^mnJidxhtH_>+EWSWe#G^MZ4B z`n_Q}!5v3F`WA~kwCWdFq5`^fOngiAfSx}uCoj5#jhYx<|6QJXO^;mRZKh7@cgMsx zQ@Q$Pn4#w$FWOxb-I~VFx8)BP>4}V@z z$-xW{o6SkRg0^R2X$V&^U=hkFTuv`SsiaVOk5R>ro==lE8U|cqn;Cb}r_3exGTM1! z*%IO4Q!70Ai`J@tc+D68n;G3se|}F!tR7XK`AGPRQ%U;iHuZD0t&yDHZE`;B|GbsTFj*e`3i4x3_^a1b!gIb) zk!oH2Y<6aJQHS=Oidn7G*YOS<6?xXi4bD2tnqZw<7~cI$x}KDk7`NlM?`NoR=1&FT z&8_`9uqP&Z$9+Fu6@BZZ-|f&o+VV@7ETTN60eH0`g zLrxdu6ePs1g<9QeqK@dTQKq~@*~#(X$ZDc55zo5SM5CI(8H)N&Q@GI|)8vWWhTzR= zqLb+1P}o0Tt5kYu9Xe`RFH{LXWW7)>rOtYxdtktNp$p*5UJSpYqsB4fL5QQH(aBi$ zTZnsf>~+K+5N5RZa$sCC{fq6;8j|?;@h`UMcZi{LGcqG)Idy!Y_n{P1Ul|AgMB2UH z~R(uCPxaUb=!16OT3C}>DunvT^I{CVht(u3LA$pnd{ennp{4DqyKj&c3v&6|(%>QZv?O>I+#+b$E(&s{s3yp} z?!w>%L}o$o7<`x?>;qc_eGl>~VR9Veo$N`RU}lWUq4k9oisxfX;!_&viH}Em68G`;;tlXsQsN8b`1ocXE8a>xbP@)C{Ox*#M-_%R zd56&#T&rLV;%x`}Aazl}-&nN4O86ZeTn|Z1a1A&%IEcOm--Lc#@B$P{d~gFv)>f#mN&ZgLOIJSFFpP4A#g%f-&S|qDlr54Hspw zxdejhN+=J>IH~mdXq8#;2eq>m8_uqb?-02_t_k2!2Ip=9P1RKh?UjsS`f#+$>bQ#v zofIGSj%OTY6#AHT5hpUzkOhH$ifao_W*n!@Aay6=_G{KTx?zlJK424NW7U&Th*4Qp z40fD42@Su>x*Z7(OfaSdmBsm;z(mE0nW*YG()(htu=4@^d5kJjn{?w?TprcqV%0gSg?>6#Eequ#c$KSE5b3GU zjD>+&*`VPQ$RyQXv6(lVgMV;pdLAox4pOM%6x$RJX1v-o2p%-TB8)g?Y9C~c@q(0Q zdZ$KPIpa_(RH;(a>Vhg&O--@oUPB+tjgNein`(UILq?v7Qn^0vRT=0go16*RP}nvt z$G=wE8>hw%E5;NSXRTYQQTDm8S_!K&AZvOFU?k_atfn3DZ#*$~8>`Y76BMV)%5bVp z=fim1hNcxzX=S`=9nXB|%Y-x0^^Ds);kFIm2dTd7;Hu%oYQ2`( zdXS1t4 zq=kI?T&k~(SM@_15vvYRkd(Ka1gpCt8(?IkO>RtujL9pU4|oZdqHMMP7Cx%Uj59zI za|K*R5;K|cI1iRq>oLf5brTC8U^T+2HvJC8UTu#vGjF;Rl6#;Tad;CQz7At^jPG0eEAvan+#PaLrNj@r=WvAEo(XeG8SjcQGf<1V=e2d)3zoHJHW-Q zr)5p2LXm}M6*Y%c?PV_TaZGLc0p>`w_A*+%5f78LfqJrE<%T-GfQ(mBiunsa;h-%l zdLBD$NZB(_ql*AQN+#+XEG)A+-UhJ>niYS|jJqP6C0q{~oX6WK%=DV`+KsrR8s zcQa*r%DInb-vgaAb~kBv@?R5#CT0q)?#Lf2x#i=~iuATI9{SpYr5M;`eDU*X@@)uB zzpJe78<>Z^UaE8A-wfqw6lFxg{ExM|FJ^g`q(dI@IrdAq=pH%`kyO1IctqSYgmS7k z)Qoz1ZAJwR>`=TRr|8P!aR_!QZ3L6Qaw)A%nph9g>i${1m!NA)Y-2Km zx4SeBr_(q*PBY_-UJrOMWtP}T@xB)k^*IPz|8%zEmvoO5l^Nv8#-z_5J_}4BTqUVXgi=MKufcW0A2dxtm&qNLH)^S$#Ib(mR5AvxnB^ z-$4*6(|%lH*~i9sUM2ELvZNbAOrKn8Ua<~fk7_)#N@pV#!4B*@(@xUk{u7Y%8QbjM zp?hJI7%*APJ}i>O-$2FWv(={!awM}i6UKhZWO5`erSBnMvsSQgNMnCy^;!m{z){7X zK{9VAv-5yr8;VH!y$A^t$ri-ardw&-8JJ0KuT|*w0(YpLsrri)g*5^L9;hu%Q(bJm zAw$*ES#M_tRJ3mKc6R+dpBkINbsL43Ux+3Bsy(nnkrkEL)z{58D8TO^7vf6Zlr5Bdb5zEe^E5>4%Z3ddBR`14SPwDDXf)sgc{1-Rf#TLQ!%3^>$POJCI z>Yj!9eWV_7KICkwbZF?vIEgfNgv&QUUF)SzVONF7g3|DB6vmX z{%+6c)qvV@St>JD_q!}PphLMTzjjBiDp2~E+bSvs*`VT3PnEKwZB#ic>RtVD6LqfItfx0cXZ?z;-+kSm zs$XiVW;EDiVPF;)jsNL!DR9SrvCiE=eL*u-(cta>LI)Msin>Wh72ru}i!Lru&^S4LoM(a~j!c)qDthVX4PegfZ|0q@^N(Y8y`)hCNs$PuJ4f5-aibL;V4v!vLo1B)E zWnPmof2ZQK^;h-$DGB*NR_0|!wC$p_lmvEU6!F2!)`zzTQ{sjKc_ix#8rf+&@yG07 zTfPJ1fg22-{ORcQ5rx-xQ^d%3Gs-H_^X>`E(?`EfZKt2SFTR~Vs|1tN*RMzn=qH=j zE7AK`BD%fb=>2NSm{0rPIb^l_ivpk4oP!R|ggGDARXBrI7i+;^>@WF?`5!Q| zCUdY7w7OZ_{$kISS#t#5J|tqjT&x)e*(Y)~EhQbmN-({kjO-IR-6%;4OWa8cD=Ct)c!(+sNt7o; zl*+*wu4E@EKufWq;K1`7K2bDirYFd3Cp{>~C}uIP3x${BnkU=}*XF{dxbjfLBiB#| zTVQ|$x+BDGdU`9lSAVpIwp6aV-~5> z;1dgzMN%hNRt$hLvQsBau1tUc#}J&20+fm)dV~kfP;3FQ%3fQoGE3b8{3gwQs^*vn4BJj@;6^(LqH`iI5VCy zd2%=@X1r3FB{*1D$<$pU%<^3&%;LCIm;r4TW@JoGPXXZQ!)IW6M4@R;Qvf)aVpVR? znt=;-C?oqso(on}@ejxOIH{8>>=SuD%#J@=bSNX!ABK-trl&o+2TYGBBRd|oqRuq@ z!?6P=btohIMBWapD)0}-V>qcp8QCZDBCx8&KOFlRK9wkh!Saa(EftfB!&DYLGdS!M zIn8R85l1Q=YaR|>d?IH(NQIyyEpRwR$zn*&rUWtf&|)?X(xzcSSwoyYk+W=_*3kq^ z$CQzM?$$9E0vsmNEHAPyU6W{5Bi4n_Oi8V8Y%RJb-+=2{VFuq#m@U=>KMsJS7f$L^ zM)rx^)MqL6Nuom;8HH#H+H@06l{rV0SXaqTNi%aCoh70}8QIZ6nOUkD|8US}Mu;-9 zPvlI#nvZ`tE~O2XD7+M>Pb@Zooz&-o)nNR?p>a~4E9|sp80&JeIXJZeC3v@qle`Mo zT47wQ0m4%lGgHzFDVB~94k%+5`$WzHr$-$5n`|Elz`;mUPMJx7$W6A_Py>rQaZ-me zvQOm9;i+mK{^Qt+lS&kleIhs6&Sc&noh7WK${F$&1*Kf)2=to?6Iv)K>X6$(==zv)Zqh0J5ZU}jbFuXFi2Kt$+ zPK6xh}2|W^SEJhCeHD<>~mdikwMbu+W)0;9_uS zt;=w=FuSPDWO#HNt~?!&?jlRKeJ^#uOxZRU?-XXjc9G%F9$a}k{_G>yGwm3ah)U?s z=@GyCcKC=eJ$hG|sXR%Br=Q`<6IFfx#>9FdHqf7Fhi;sV`6k1>cX-Kg!;Lg}IuQww zS#fZrQU}a2MMp?M6CBJ{)yiOGDnuCV#8M$KuzIK#5v4|CCJ_gpj2*`vT-?>g16@4S z#b>#=+{JvXaQqDM=HnR7ck#t8UgP4hi#NIWRu@0&;%8mV&dv$zScH-PI8H*^ zS0eg_Oa8ONOn(e3ktn6Om`eg3c}EuycQI?YqchdTtl^Hl%EdJQ;xioi@7Yyk&kfkxRA@hC25XQ zg^T&^q9dR0VlE(X>ACIgb0fEY5H-KM8bn&UEo47f*HZOcz(Vn4bzd{#;PUNdKjE20V4RIPBu< zTzr#@?{M*U7w>d2m!3HRf8b(npjX%bThXVL5?tKW#T{H+;^Lt$KFh^3T+A=_oJd^Y z;t)5Ib1eSh;=5e@kc*#o@!Kx`%*8*u*o#}COw{$#4kYf^x&8^;+g>v1mTM?R{R zE}W+F+Do5#IYk8#XB)@}g~zpIx%uB>bo3?DR9jV`ABJmOj^dIa4u6g)#8;?p@VD*5iw@yR`NgR7&pkog4UZ90U z=yh^qqhh@kabOH)1(3)&_3h|4AoHOKM`N(_z}DKO)0r$0>hHs|j$;_?a$Kg9+oxrO z&UJ~nir(@2HW%MdmiRtMW+HIx1Ut`j&$x76Bun@&yYx?y2Swce7}1Yp&L1?$gI<&$ zp2~w>BG?Hyi!7ctAd7xGmriH0Jm+--JI{IjT{JHmIuArVCO;a zVwVnAsykKlA+mV-C|TUTKt|$teD9L8{V*qDLKyXB(I5_5kfje8EJ~b$9q-baFY?A1 z#w>No&jmB0yAfE}CBNInJ6yaM9C8AFoffT3M6I{U@^tzh*m*kr+$I0PrT;sbPlq`8 zU61qNnF)4sr9N5wFE}j^S*=|b#iuQ-9%S*f(xp>P#*-k&$L+mj=SIDg zhGh|to^dI?r-;x^WmGe|3_``V^xDC?r z)#@VM@8@7j0zZ0m22~+_!OrZA&>EMBUlKS&s9RjT#l`oz_(2zQ?$B}jw2Sw;_>hZV ziLh=vBp4lf(`E6Fi}^K!&&Axi+tK0tpu@Qlj#Px;i~G5Fh>JNV=mfwIEgYWa;&WVFWplhFDL9W7=n{Bbpyz*F4<+OhUE|{GT+FW~ zoI&GO7n?~Av=L`M4}Tbn)jd{>sJtu)-PG#kx4r z#X!k~`Aw8FYU3&#hs~sgjM})d zk~1K?%Ee(9-{9h#_4-fn`jFcwInMZfgEOjm+Qr;1$&tV0Vs4k@$d9_19~w9VkS|>P zor`~paHPtbc@G(}B=JdJINindT-?aTOkL1upq27hmS$t6XfRK*a6!j-2Vg(J_Ge1%xwHdeFt(I?0inIS?66@tX%{ z#PX_(`9-cHKknkMUHm;bn4}Qoi4uL z#oP6LpCx8Y-RBZiR37 zg}p6q%^-g&8GxV!H_F*gVpVSN=mU+lD<2-eqJki0G>lz;c6GxxOk;* z-zGLk-+r!|qML89+v$(Xv;FPm#=47&lI}e&-ba?3)&awM!FlTY(CzHPQHyyzPL`){ z?nkHMB65Ba?L5X~8F}5P%}mA0SYb8gGFC7%r4pZGluLX%u^c51X7V!KisT)4&2sKv z+~L5~%?}!CEn-7HBgFhAS0RBq2Blrj5V(@RmJ;71POa|5$%oY6P zGr+uMl38)ngwF(L^Y%uIi7@b4fGA&~RHe1$+} zMEMGV+zrfE2;@>QUm=jW49?;^1R6L1`+$$b8OPF1#GPQg|hp_f_g#0@h^A z2r)u82s5j16>bbRyAVPrAIx0{Lv+vrhKEF{9oTF`2syKTx5ztzpA+r^eo>gI`KRyz z@EgKI!S4vOm*Tq!hBX2FsqkckZ+#_(3RwIg%&g}9mJVit*@(zh;8ZeZg8gfHw8}=ZUrtEW?AxO2R&u# z=L!!3FBE11mI*Tf{JxF)i@_HOF9ly~EYP%>8s2a@=fTu$7G`R8kkRDX^*$nugj!Dt zvm+t=VLdoWIkG3j0KO0dE6caSRN`HiN=?9AWI$&9h!JM} z@C&m}1cjL^+?|5@Y<|2WlShH`g~xzf#Gw3XF$sn?Vlfq5N=EdVV*YND!$XCc;?crz zZcPy8NWV;&BjjnqxnSOrgS;n!%?^X$c+Q}&6bt0M6(++M27H|`v-&1s>fA1z3*I7J z0Ol>3`(_q{pBC-|-Y3lZ!4EU3!yA>^VK4;4Fc{1hgWxIPQ za1HoJVfGWh3$Fru(3#Qg4d8g;&ESCWUEol<818`~M|c~!vG60{0^!}@R>FtCy~tUS zEbS+Z_Y9FO2_a{0O`@FlckonU)In=zghLj~tV%3cW;MdBfXjvR!7GKEf-ezfwyzOp zC&oQr7#O?WTghnjez4hLP}uA+2xhns#iIPF#DL8fgJ5nmy38cAzT;r+a0Y)%$-EojSgGsB z)X&f-+aQqKE7ZsOHy{tE?ax&8_5JDfGs6A$XXHA1s;srwseyLw!yD8$Dp+W>Sul?~)VGn(qq@{Sel<2V z&<*DJN9mkv)zWK9vI}&eTU3FbRFzer-qeSm#+E`;C}?$WOo6T*5nG_f>fO)a=ZfZ= zi(Z))U4YLZDbnMs{QBL7Z|R%YdK!jHYP@Q+zPT*eOij?q zQQ6JZWZI{MOOB+fh5Fcas+rFHHPORa9IJ$B!cl=cDeLe!oakpwcf@{fjc$EC^{-0( zv;IlwpAvoaaCQ3Iba_T}ie7g;9`dRY2#3IRfgHiGjdhxVu*K8PueV*NQlcMMxT%NV z{bx!K?uX@eR5K>h@zD{huW^Ly`_O|Ujv~zQ77Q2B2VIgC9caA~&VGdjoi)PgIQ#7{ z&ZfX@0@hR3cs%+*X_UY9)niWw$?==xHZAJUL9T?`<_xla05_BU-RCnUn%oT>2mW0_!7FTdJGtM^VdIJf+!dZ9mxVcXLhsusFfkuYW znDSd<~ zy?a9De~7~>_|Oh683zs^9Up=KcOrJdT*$Qd;5V<-D#6L)LHIBQSNhNqC+%4KI|AH3 zaJ!;NRu9}~2U@3|bvo*uUCze-#Th5@?$V9Mrlsb<27h${7sH1Ul6_tDu~^iT2ci6t zDWQNjJJ9^HiKpucZ`*XusF{8US0{rv>94~0inioRk2e7|%^aIynam9r^=DgSPK)`> zo~-BJpP9<9JDEPm!5-M8o3N`@l82)R3#DL=w~YU3-~GkKTW}Fz5NT%BmnieXvE|0_ zw&N)w&S$z4y=oFVX~>w{eQ-KSY6ux);~cASmpYK@m`>aA8O`lqyQ#R{VgyM4`r&l^ zYZ>t`vCfAPxGnx>wpZO8m+eV#hc#3`akI+k(d92*dlw;jzKGXs&yLr8x^p`p(;N#- zOis`28Xst#xiYdyoiXBQ!*MqCFV6feFcjA1*hRL-*?$Syb0ORz^XbJ9mluov;zbb# zg6RM01*d7<`Qo`4l`B5t1)m6}pu+8w8S%fEdt!`B*!8L!e$|w!L{a$+7H4tOm zS$8xqMc-md-OSw9$?-@Fn{~A5aSPnIV>9Ne$X6ju5bgtYv0;68XXRJ$;Wk}*n@Xv_ z^)FtuS_domNiW8Rx4oa8u(3ZLY!NdKP5OnCzt4^?MoL@Kd0zCPtFarjPTrcCqR)kQ z?j1)vck0rykUNgrfd;ilZ&ObPeK`q;M^9we`LX)WTD<)%(l6AiruCvx{PsGOL}c4f z?CQ#?UTpRGsP^qty&7|XCR=z;M8lMwI_o1+vQy^-J!hwCV;_vyjk@91xOFGyFVE8N z?8FugOLXcZYM5Q%)fJDZiHYYSC@aXFSd^9Wj(+hGERox<;~rHF2aZB0{>dM}KFyOb z;RQ6<;BU~wevWwv3Hv$Ti|7{yYaz=IKEe(HTZE$hBvju5UAS4#b;Q9tb@ijFu-?;9 zNO;_QT<&ApCOowU4m>`OS3mx!>Z}te2sh|27A)QQp8onnDQk&r4uUXCXm5*b$q$l-z zkE?#_W?k?ET%FL9o={h+&-JHIsQs9+efUZ4V-c^TpF*}gtxKL#c|ACs4@^7=PrCaC zA^gCU=BU6WKJE=0n6?MmE?ZDKTtw}s(kz(=zBzOeo8e_*XX_QDItvbBq!ew zE!+2r{{AV|cI*Slp5#>S{pk1Y!2jelvk#HGSgQD$H|$Ld%TseCH3ny0nhQBtC#Om3sBoW-=#8DSjX&E6YQ9HUA|kDH{>qwNO((T?{NIf zYX%=hVC7$1`|fTvLfM0Sy2CTb+>i8G&!`n@fPU>6)y^)6*WNuUM?IsP>``Na1@xn0 z3v#>|HNh(MduvzkQD-T2XYGg2!j)a<)zh9+uiO4O-F=_ROkM?5wJ1ts_Jz|;P4Co| z`&3W$s=jTXy24KK>2}XMTK5{QT`0z$uj&cUtC4E9zUO(BZx_VX9)4csD%U=TOjtQ=n?!iR4W zVRe(;0*_6jl8lcR9#&D&>IHqtYpRh-(RaP33X9&MtH#|Bf|G;#(xt62rL85RZq*GAD3=oC_fiv!WDb z&%>+|%#ZLdNElzwaO9xS#L1n(T&6+p3QmZ^3c29 zTr7ME7+={Koy)=I4H@*W1e-Tx;Pqhhh78Pc$eAH=pkXkt$Y60j*t{YG-vBmm$iSPy z<_#J6Rz__;F!Y(x-)4N%slA41P)YRq!k3*TUe@n=l*|i?_kYh2IB% zDEtBVGvUv`T&luId;$JZ_$%=5!ry{DXbsf)0UR&<8#o{w#cvYR#b9nZ!hYO48Ve_Z z3xtE{!!TYfI)S;gg$}xbD}+nH z=Lq)(^ZAK7{K9gv@Idgn!h^vpg@=JRkTD2G=2$nlICPsBVqkHXFnVL_QL^;;yIj0i z7-3rngxT%CESv^DBFt`|-!0LfCg2mo&A{fZTO!(ja~RBPHz>6Ro7Zk&b|$}zgHGUN z#E>r$d6*ye5;i~V1x9xt`C%_GQ)zzK3(SO>ANB&rfjf#n$PBBS`L!@uU|0}&?FQy- zvU%+W=FQ5yb_3^tM~Y+KlPbso)D7@C!fnCT!c2g9?FOBWVDs7y+yiWW*bCeX^)K?v zUNDq`uN24q!B-1o8qNH&7Xv#RyjkRP!FLPK13w@i>K_l%&R%buLYY|bKs3&^J)&vPRzWT1M|ja zUd@4T1e;fL;LYs+&AT}m?uLbVHwR|VWnRsJ?+2S#bKr-;xv`OyvE%AMM(tyt-$j@? zWM0idJ_T%E&4DYxgGFZsc%)(EKeKV1STGy;V+!*@O2?E+y}!=!t9@K7k&tQukfSb9l}q69~FKYyi0fwc(3q& z@B!i1z%L8G2R5(rkgyQDQu8hkh9AKvL>16kg@Lhu zzGb6RV9xQO#VgztoG9E1oGRQFT+jSk7#tMBkSi8N;HJWz!L5Y5f(wPu02d371osr? z?*;W0o&@Iif{ailc!V%FoaeUql%L1`f07vZn?h5Cxz&Vu_Xnk0z{@DljI?!j*$!VU z+!8srTDT2(y>L6Q7VZYVLAVsmAK?h{4LC7Wm$zKVxCjTJ30nC+KO#Mc1tT5ZUPxuCK z12Q`Qd~m)nbE1WC2Qar=g-*!o0z)UU;GnTom{~MXxG#8^@KEp=;nCo;geQZi2+ssh z7iQ|`2%igHAk3z_G!Es@n68F_yZ)1zdQRt(+3Q^)%wCU=;*>MR*9zYX-X#10n4fM^ z=Rq((-6Zb>-!Hryyj}Pigl|1dL%qlh06*O%r$K&LI0O8;aDDJG;au?h!cD**3m1UD z6lS)6CtL*nMYtHO;@STrupTf(!$2Mc&Ln3?9vB)3GvIvTTyP6v2G&lv1-O%ND{yyV zMxwWHA$Xv0C-(ot#K5v2BitK&mhdp}6yY<$(}l-_`OzsOdKP$r@FXyQG>7u3;PZu9 zC-?(8l%E5>(lGLW4h&a|1^fT&g;{Yn3-exZhcIuW_X@87Zx>z(=I+f5;6m_|!mKxY zgs%th7iLR26cWSjFuW#wKbT*v(j!)=_k_2DKNMz#`iY!_t`_`CGlW@5M+md7oGF|Oo+QjlI#rlq z&Ge!C>1lfys>A}7!uwPTDTK%PPNAP#T-N3&H_W&!T zg8s0T#gaoXjDjISEXIISgxSyYgIqdb1#BX`0^Cyg0&sibHDG?IOMOSZ!eS~iV z4-#g53XKuNE*SVufR3LA^A|M8&w>|_8$}+!mkN)C{Cwf@U`~%x=WOs5!e!uf!sXy= zg_*ET5e}Kh?_0!zZS*eTYViHS3&0NwF9q{UUE#+ywqa_-61aVfOR<)R_8guD=T31-26+^1H!a;a%WF;eBB4n@YF) z!S#fXBYZ1Y4DW%P3V#c3CCrD>&ccb{p27ieUttcv&JgCq=m=r%(sQP83-Bai4#lQ| zLyQrhMrVozA3&>wdxC3(OTf#8`+!#p_Xl4h%m>gl!h8VTAUqnpQFt==M&aoS?e8`* za2p_gP|XM}06!qS3e49xlwS^hTzEB@A6ip>CHRo=I`C0p4L&Z+ZG%1(=8*0)!^r>J zVE9@r?g0NNd@q-+eiuAM_;c_m;Zxx8!e4{=LoW3HTX2Q&_uzAcLqEd6 zFTbh8Uo2ZJ9B<=^RoD-{P&gTUnJ_m{x>A_Ga(A^bH&eP^xG8wEa4YZ~!rTb_UOxXb zV7^V*E*3q&JB53JpA_adiF<_mfcFdY`@}=S1Hi8dbN{lpg!!{}?+K3upA;Tvqx|{q zgOQj5i?4;Jf}@il&yOrM@(EvqW|=Ik!TkK3I_ym93*QOO6W#)DF1!ugR`@}1M{)>` zYhmam7LR}j2|o!QEzEA1pPw_Z=fE?C*_q4}ei6J__@ChOgkJ|=Bzy|IR`_dhNQ>b| z7;YB+1ALFLLY;V6*aLo2I2OD|m@{Gfh3kV43Fm@e7v^)|+rsU@Cn6lOI>PX&SQLZ5 z7Ut~NPr~eoxSp1&XGg?u=E>}c5`;Mu#!W{k9{|o09t3VE%ucC^@NjU;0Lq^ZX2H;2 zEarjvVLjy+gL?>X1osiX89Yds{l{=&E)5$i{1lkq+tZ%|;BsN^AUH$#6>d{eC5GeR zMZ(-d@Lb`a!50d9P%$qP=C3VWDa_A+uMy^&noYt1@U6o9Ja~(6CU`42#MrUDJ|q@- z;KziEz`KRnM4uDx4SrF04EUeIXM^7m<|o0&g}Fi6N5U6^KNr4&dlG&lhO1!lv+&hm zg`q4X$M1i=!rbsIQFseDRhUaBxvK#6`TcLMF!wuaD$H+zTM6$2^B0JM`6&ORFcgag z7wYvC{s7!p_%rYs!U<8BJQC(AyK%zYvuv_3KlZH@=6j;q!bRZu!d<{iLt^L&gTs7L zbg{_!qG+}7S>W};d>_PD(M<77@D0Mt!M6%u1l}TiF?g%+8t_BH&9}h7-#(&8e82Ow z@WbGJ!u;^}KyBq#`ScTF;cC2oo|nsX)^oU=)U$B0Gq2E(J_ntR zI&L4N$MpnW2I?)i*q#mg=Y6o;sRum|>96`aUTXBmxY(X+bl3f`yi8xdAJWbG4P5ME zty{ccFIHn}Z+^j!wV}M_Mc8iAKfP!#Q4i|*FTu1_@5aS0`b-B8+AZ)4AQwCylcGl) zv;(&1OFi|V-86d1RE%f!?yu7EH6G>NtGQxG?*m5kU(HWmt1mce zXQ?;zKaSc}SpyNG@1G1YA#FkBbjx>?oR~0IH-6J@g&%Gi{-)i$^>Jv$Cv)+TFZmOA z>9+z0Vell(=WEX7O~?o`E8%yzOB_m8 z3BTyTTlVNgF7Hd6!e6HdST;5zc*`zHPI-8P{+0!S)<3ZlLVd-Ykz?ELmmK@=De36mcP1P0RDPMcL> z1qKm43D+XLz!~Hil&0Q#%x;F!2)nKK{K`Zb8Qx@|k~YQ60p{20cQ`nPxN776pIH>C;uw{lPF zqT_a6eG|@bhQlK-5C7tD@~evcn%bJ<_7hQ9G+ubZ&a?fodfW-Szuh=S-*m#Rhj#tw z3H$eyqe!w!Qf8Nn8!!MbhTaPw*rn7@{LubZeWIg2vYRuJZ9cN^&KL%-Q_b&^ZNYfK z$8lM2tIt*X%a809_8GA{`y_HC->WN6+7B0;4dr?hn6f_iA&$v&f5kn=$I9-Tg>Zcr zfUHtatnTx%Jy0#LUGuTs!R!4E>9p}ny#LSsIMi9SIp5eX#{Umik9_=_-84#dy!v3BQ1i+UWZ{9}`D7%3Y!+F7hk?%%`A9HtywqVgeYsg;0>fAs zxbX%p%E8wNPXn{_p?ntjX5rc3JB4xgvF;OQFTX?hGVmk9Yr#(m-w%FPcy9=X7sPNF zd|3Dx_;ulv;A6t4!0!wH3jSD_@3pzmoe^yY{!X|9_!r?WV1+)HI=#TLV6((zCJbE3 zP76NWrwDVyU$bx$@?~JIn553RV1D#L<`|hBIhjxQ<}+mQ1~9kup!^ze58+MVKEn5N zieZo#9)`tGVcxu^kWm5u4|V4qA62pb|8sWt>@L}CvbzZ>BtSw!2`wRn&>{4I^xg@b z(0dbHK;%-S2{Lp+QHmf{Ll+bg1QApa6+2$hD_%e>Sbv|-?6aEtuiw9Z`+}VJJk#r$ zGiRPT>B!|U;Y{#oVZ9V7%r(&I!p*^t3bz6;7G`~~6y}nrcN>wG#31#Fza5cBtt$Kd|KpF!CEC5@>yW5k_={bzawtuf#26#OklAP zhEK$T3uIpkKLyr0$#An3tW}c1+rWBb1^9We-dF+VW2pl@g9$wa)*CCpuYmQ&3NXi0 zy{`fs{0xR<@$fA;Mfg6rCK)4e9WXbvlbeAX3%3Bb5Y7ibB-{qvNtlzG9>N{K+@8*G z*y9GX|I@(w-~dl%6^s*R6>y(A@J%z)uNZ zW`%I)F9UrW7S9X63+BX#@@wEC;p^ZN!XJZQ75)^=t;Tf!IhcowkZ*#o3V#LW;UbjZ z1%E~k!telwuf&2+^tXjA@LgdpGdeKD^2KNl+(!u41^a}#o*gIL5S%RB7|b~X{j&Nh z2|ol5YTag7^oJowEDFH&ga?81golG$3XcM}6&?rfEIb$7Q+NTmzwk1!-jsp3R)O`V z41Q~gb*6V^z+x+Ss(5$?taoKV&XpRyD+7E8%!4DCo1A9qh6`c6;Q~y* zdcy^net)B1u(N1jj@@I~ahon0SJ!^tX1=THHn4Xv+p0yl*nADu2Mz4)@%)t05YmNe z1}}5ed0rk@iH+?4<%3*fm=394jqTI0nfMA#YgK9JbM+>RHwIMi}1cYyANBC zPv_YyI%icxGD@iL^6cfzS<2tUUeQ{X6@JR<*aQyGs)3N2Bh(^ZzEk^o*{0s-WrZ@E z!Uso&chy{1Oq$hv7;>W@vqm(v|Bs49ow~U>Ir;(Xc+qQ3?PUWVeNx^E4@NPM`fpcz z8jf>`>1MAGJuI3JM;701LoMP*mEXaN}GIp*hTQFr?oTSTP#xx2j)ilcT9d;L;p z5xi%D15*{BcOB-!o{3yYi}glDtH*oTOPNR1_8#`qw$@SVY!7>imn)}+zZDz?{aw}f zJ?xoP--q9+{^c$VRsNPp;bcEoH75BV3E*z(=h1`{{2kz7JTjo#_q4|)E`TiR__w$% z8{TQiY}Cu_H4g8OYIaY1ebnTUp7xZW7sIpZ=iS5R-vl3ae|1P4e!k?f{Ik$%oqjuF za{14~joZ)hr-VNnWfTaj2ij`c!@9KH$Mh3My^o#EGKqx!k0-{$Yi()Krk zrNjRbBCzm)I|nAWt29c|78|Jwdf7{&;-~hqXU5(|gl@kJ&9{V~OV|;Ht+zVT%ianN z&+Kil?`7TsKbAmRa=cqq>)!TETPd%a+1q~Cd|r+2V^74Y#DYHdnw3_g1_OEKRitM{ zqFxaT8CEBrMCgI0+GcHHdG#4Q1^MB%Kuhy6By3CKY$P*~Z@vt#Pbc!!(?DBo*p~Pw zG85>aojsR01w|C-Z1N5Mj>PH6c%X|m>`wfIp>@-SeTm~4T2GVJaVSx*4fio^@N+ov zTZUF(V&6#%<9Om-G}yo(vnGV65?3*VA?DjKoJnj&n_=eTFq})|v7&(y=6)D1CibOa zg3ik2#Glp4zV-^X`d;;KT+NBf+s{7R?5>vdv!_HJWi}RkgZxF_P(}UhO;Mn~^a~g0 z7fcWfv}u17Xl7j_Hw26!KbHPW0XXsmnS!S+EZi9=Z%k2KMb%pifW1ge4eg+ z8SI6hCI$9#QQA*W?Z>dqQxhPA9sKrdgxDP3eQHaAJsu6_aDn|X^Pp-p(B90;^MO4p z($V&8-q~u|KzmxFr;&EgYVJXb^o~cKJWrB+MkEh8jrFW;2`{>%dDivdNbIe^FxHbD z-YM$80};uO$~DN|BozHK;pn>!vX3&8)agO?c2MYv9&AtZ{tNl=6mg8`=)JBQLsZJ5 z=-6BY+|$c1LwJs#MPc;yx}(&r!S;H#2GQ#9V0&^!uGE`%>DA<+w`C8Iv^ixLJec28 zn$kl3IvA~_nop$-u@5zK)uJKxEOVDSI>esu*X~BsofDpo)cq=EsJ3lB)SeGVONZKP zM|DN@naA%iwk{QSskeuscgCnv!*Czjr3#1HUxO)gxVLupEIUKLjBpx`QrTndl|tfXS{#9FHf*RyK@3l;$7sKA zjO-Js+K*xz(JydRc?8RTrk$1C0Cierm&zS$e-xgMjI)X8WAN0qH;Rd$@c3@W10ID4;9D(`7)zLG#W z?ih#s-d18gCzjyrKLFK>?*^Hyb|y%WNmJrRv5lZoHwmUX5+>$N2d3C-m_yXfDfW($7m@173#^3}S5)3q+_)b?%|8Dr=g(mbqNjp9bLzs`oT||1vyRJfYMb)Rc$CV>JI2 zbz7>_qrhfak?Ptsw2O5`e@?T}?sw_`!)ny=L-v5BhHv-# ziV~07ZNIgS#d=rKd^6@8034I@RAdcQ8O_#@R!cJ3x*v2hLSm?;J2BK`xbwE zM&{Ny{Du#}-YNM@i)enQuU%Fc?jAkNd0fcq8nCYHqQOlNv!5Wu$5Mda*ty@Zp&{e;;j#*=0Im|BeSWP>Fq zSU~od{uOiZxH#gt5!Sy#!!_23oVn4ffpm)`(+4XsZ2ARD#R+zoC z6q&nPtHY2Y7P(*^=}8Zq_*NBe2F@0q2W}`lAKYB{U*I;vE5O}^&x894Ujz>lz5))8 z5W_n#=u-(1F&EZmiu^_d7lmtq z`R*0+pw=`!Ef)1)pk5CsL8h@7{ta#+{5AL?;d@}MPKC(sgL{blCvZREU%-Qf?U-p53YP$n6Xvqz6k#8D z4p^V-$z4hR5(~~PmkLumWvy^kus+=oiQp54KHU(U4SrtSGz9M#&I7+F%*{vobi>Hd zgj#D*fziE#Ar&eZIF-{XRABb+FX*lUYfULI zdz03b0yhS0O(}45u-25~uGY3Nq+nEFKpntZRSHRCBDAU$xGY$!N`X_sT2%_nL}*nh zFk84*l>)O%YfUL|4X{4Z5S#-pWL#h-Xq?t+f`P4Ft4e{HAgw9|W`eY;6u1*ut4e{p zfVHX=xEoljN`d=>*GUA!z*~gJf}azf4BjmqWXtEQW z_=3ne$XpTL2!2oaDeyVpN0teeQ<`zf8zMxfQG2h*xpo_vmI_( zpgal87w2S-?OdZHvrY6CE(b0Ut_0Q^QE*cQJX++{z*B|U4rYOChs0K8jxAozgrVDMq#q2QCkBf-HlVweHLTf&?LT@ywD88?LI zgFhEu3ce-02CSFokeRh$z3_+r3~R%}9hAzbyhCcuCvZuyKO_(8bLry65&L>+;S_M1 za2hy6xB|GQFpHE2gD?UXX=CBq;5Ncdz@3EI?|TTh2KUigP4L_YhOxBp0r1nRPr{E; z?hncN5xOvIO(sqn@Y_PU@If-Oi(gSOeuEqvl3xlli}y1cSSI*=S&V-s$A#p-72{~! zT6y>^e=)_l0y!Zh*Gfmi4Jk*9cECz26bbWOm>?}MiW=R-5r%Z5k1z{hpfD3YTo_)A z3BoDhX~L|g*}|-*xxyJ>tv6IElnAXi6yjh=aR>&C3n9fJFiTr24uM$!2N)2T5o^UE za2c>x90GGl=0Ygla7ex+TnYTHFuUS);p$)>s}tbIw^%GZ*oR6)WPbLJ%mn=|jD~Hv zQ8bh@L0VY|jQB#zLST*oT3HCpL{t#>%soGiN556UJhp?J39cO!LpBUrL5N)dKdm4n ztQCa7HpsPt5SR(o3PNCZvtbMejEgaY%#jMe`Ndf41VPSlv`!G1@rRUxV8G}YQVIgI z3bu-8);&MEM@1n1juvCB69hQ}Ju7myCmuW!Rz|ukjE)x42`US~4>~~@|HYt{g1`(& zD+Pg>ORW?HW-k9^Kww<-?K+SGz%K!}?l6b-fEZ4?$eEzZ!nhdKh4uPF6B^ip@M~3! z+X*wEF2W3`moP3yKVjxew!MlYE!3Ts#fe#Ch0iP5e2RU@@KmrwG3aP8WU+ ztaW@a+OSPDq#TTk(M*`t(OQ^|x2rHZh|xzl1w4>jPUxBab+lMyfhP&q1kVu81qX#2 zgC7%a4qhVM7Q9@z1NdojdMKeggxRxR5RO6o#vw8A7I0LUL-#3R4l-JQ2LUk$7e$Va zV7x7i0yC})vvGYa%*@;rt^@u?I1hXWtar6HgW*T9U=Ds0?gX}B=wlAp=-k4+z)`|| z!2HM}-4uY!2oDCA6K2D#MMg2R%IXWFnu10XF|b%#3G?pRPMD?AMVO`1OPFKP0AbXi z!4EVtf@)x`rUPc~r-__%g4x0iz>jK1`8S7Qkyx|_FBN7whrEG?~$17=&%>NsEyN?IKU9AwdHeH<9r3-mizF#d(~ zaR8OUS|10@BGvjhVD^ssD1rdE7PyHpi?@|5`6)@d9|WEzJQS?;cOV}L*7`f(@!&<`W(s(@@WbFIg%=`zV}lr$!b0oy z!1HSGc9Cxd?-70md{B4?_=xa};FpCDgI^Oq3O+B)0qq7E{nG*FXD$Ol7$RY~B^Ibg z<2zv=_`WdbmcIy>1as|;0kJ_jg;}qW!Wm#rX6dFXI6;`bpo}ovQ!rf&c`#HKZU)X0 zZV%2CW}P(K}#)V!@nE6K2k43o~br z3NvSmgqgGD!px1<>w$y%;0+?@9d)a49(cQO3-BJT)dUauFdP&Mj&w(a+2~FP^Oky< zjPAf(UK3`{ZV2OId@jt4-4c!ke<#eDJ3sQtaP-GtwJr|~9ML%MqD2bODa>3(3Uh3T z7iNyj2sZ$y3v+C!EZh>DCEN*|E6g6$032jwLttns79+s^Q zAz173K)wX5b#|(R8uc`~0dq8*EzCjbQDNNJg2o~-u)dcIbF_L=m;=-XVGMT0R$(-3 zW4ka%$vwg>6@JQ;5jO$9EX-1QO}H)if@bu8w(u)r(F^>Z@Nn=)!iC^3ghzwF7G??k zSC}RAgD^|zS7DaWpTaC5J|_lHr;*@F z%Z0PRPYUyXu|b%#sjd7nIU{3#-7XePDZlDUd1LTNa%QN@oe}mx{)Vs@d|4O+q;XA{ ziM}DsF88@`Y49!KvK;@v6GJ*I?hB)2jGu+8gFUE|0J7o$`-^eBuoLpq!X?0I!b#u^ z;S_MDFsrO4*?~ZDR&91zzcN1R^oC?t;5BZ zuvvYx($OA@Vs)Q@w4++Y%PI9fFC$dOD!57Cre>~kw6`^Xw&;yjj+gjSe(sZyS9(sp z{UrP@RHK8DKDsU8xU@# zy=o$^=4Ewy15#435ebOh=x7UdwSgNQuOmMho8W7_nz6|-4ME+7$>z4Hrkmk8*{Pn` z?5J$kS!I3}qb_fD_>i#AHajX>yM|#TQr@Q=X|`H3wc1+#Qx2ciYG!yt<#-rPeC_rr zM@8t(?Zm}uj9Ec)NDuB7ZBMBOwC$@>x4`ysg$@%sa{5#1wB1k>wm6EZttD7BvuoB3 z>8;H#`f`h7i7R-^hNVl6U2NN@@IU;sZ2{TdWxudHTyLAW*j!XZbvUfTv6BtE>7;JG zjVCwR13l=>bn`3#yUkidliNzA$?ZDEi^Jk-JVM$IJIeu}CYwEIx|`zabRg-5Ycc*f z9Z%!0+x9*FI!d<1UueK3>5v?A;nemkL{_Cxgtm^5l$ZcppEJ&bOT?fl!whFU(eQkS zKh6ZQ!!sIxL+th}WQ?JWZlw_4GjL{O7|v43{Oh;`LF5*-aHpd@_JO{@%R=?;PDi=K zKVW|f|2bCr{9Qq2;Z^*-sG@f{vTR;cHQD7TX}+#{>~ef_&#Vs&=~_k7BFnmEDd!Y~Kv*adb7WtKoYbb#OrQ7Mf3K~qnw)bff0du_c=x(lo|URJ#l$^ zpJR#niR!=Kk(;l5uA|Re^qE4R8yE%OC5BSFQOBsm+{7@cB2@KZI^0Zu)C52jH}*R^ zBkarrjt01lKHw-cKTy{Wgrhh}rydMsRdu#sq_H-Q-5JnPM$rw%P>jd^&f{@9|0C;NXb zYt||rNzL41!S>BTti{YZIkjpOcU&v`e=TeOk1@A)aksg3{>QR*&7$b{90N0gJSM|L zOXqI}nfGD*u8<=_{1us#2mF2~qv7$_3e6Ckk@Rmc*%#u?WKPZSI(muBSqOeJ&~MDt5H~}DxYvYnw-#nl9fae- zJd%TMI2G(8%&Fi&8{(%$Sr~?kMLF;oVa|#t2y@E!C>bTh0$3!>jPh&&$}u-Fo)l&x zHV88jTZI|dcHxSg7w!=Q9tDhp!qru$NPHcecR_wvoMATypBLtR=tHv9&?m+CE?H{p zhhpqP>GNeRAF6o7067VqAk4BYC(JZv*g4IFqjVTD#iACtmN2KB^@Ur28wTO71y4Tx~z-)bb8xjvpU=3;QMlhEYKW1cziGk`Pq`|BOeS|ca z8PZ2cgYnO}FYZ~?E_mWQF8cKfGeI%JOpsPqgc~L(sI?VgV2a9%BPK{|D?-i$={-r{ zbZ}F;p-=o;7Gu4|NIIC_VkE4$7$I#av%wkN&y2wWSiw;q8TgHP+v$HLGQhKmw$ zSMWQ+eC&K*cnnx8AHqGRtRdw?@M5r5J_N4-Yvn`mTJTTecN6$m;ite+7!mk_kB4`J z_8!5&+$4zwbCW8JXDkC+MA`#$piggx`?}y9kuwAJgxiDjggb&c&0u8Rz@3GAgL{JY zYsLvM=o6dah!4&~#1V6*Pi%(#aj-tI8N3XvPizK10oErrgI9wWh~IVK$Ay{uCxo|v z^_C>Ke+KdE50f)>`(Uw49Gw8aAbbh@3b}M>@kJ{Tg4tFsi@ZGeJz=&FePT1*utfFN zBQQ%;Z#@FDMD^CA(kTBLFzCHUuwe22E&*|5)LV}rZwA&|kH9U!vA8`jL2bZ#yAikp zSZ_B14+ZP(M&R*az1;{r53IKvffs=51|=ZQul05#Sg@$|b|Wy0x`Vh`3Fb_X5kCp; zBg}?2PD@GapP z;O~SV2HzKEZ~8@eE?93pLiqE+dg~E*5x69#t<22hYzcb55e(~KQBEv&gSkPPj`oAA z3LjLb2fI^>`jxO|x^202RE>ZYW6!CTEl{JTK+Rl%Y%Phk)v2ilE_8gNE}cqhqdz97 zd>1^Ginhd9hpEljE6(Ec^v*czDVu@A2jZ=%c+@=|Z($uE0UumUPOzG*j)|5-4N0)t z+G6Xe0}0k>9ZnFQmv>Oqn<&6d?kO-zQ{ zj_PzWq&Jkmv{l8dp|s9p$I=#c9tW1TDq80&pyt)m(pH)|K<%ewLgnxi`W?F4smwA~ zMe~fx;N^kpgo~{~p_*C7s(^19ZH3X=h+(&unw#oLL;QEkSj8X8oi(y@vvRUjqbs%w zwuHxvhLyE;mGb0iMs-zYLo3yLC>jX}P{}M9*sn4hTA9rbdofA|c#6oB0QWRZ4h%yWlLDKN(TRZy z_&XtR4j!QK$k(8e{eMId5lbw@;62KTY!u3}p%rglQ%4$F_3=&09~xRIZL}^;fMdBW za2bKv1G!NsfxrZWVFi}s*6a+#A|h8H1qpNqRv^F<0fkbG2pmMHp1>)jHPWzMRRbDX zarsm}F#>!)W(GDRIkvzeRDwMajoXzYV1rxgI&Of;wE|^hOF}%pT36x8p9-_XSLYYr z*n;XrBde+T=$gh>D>TIX##a5P-AJDQ$8;nhC(7ejD;rzYZJsD~y0LXPX#t}3=a_FG zoM5~Y@%n3-|AApn{3P{eo>eny93A9o*^2mSDyoT7&DszW>YNHeRV_at)T3;fP}qW#=%W;JWb zH;1t?b=E@UnKW^*5mT47XG9%?JfTMZiZMd(nc z%t!47enn75fNvpvft5&jis8?I2dGo(?KkVdQ1?V_n*pAKYYXJ7(JicWHlin5SmjFb z1U^r@Z($V~^%MSj+H+r!FREU&y41pI6vgcbP^WB;+KPgoQZ21=QQA*W?Z>b!R&5|F z??LWGoib$KpZ0FUwhJxXGoSy7NIF78PXp%faCAEYKSp z7QlxQ*o!}AARfWm0?Sm>R#v)q7~@z$l}lUH(`r&HE3MRL$i8Pa$C}6}zMS$rN%k2L zx7EH@R($#D^s=5$b&e>uU(W`5cY8(;9cy?tk|Uz7sc&0ZO}sh>A&tzao2p*EHOlO) zp3Aq|;bUR<^R2YRIVcKG5yz~KQB1GrFu7AyFO}8WiZ8{TA)aGwdp)E0cx3h%D&5sJf5Swv_V~er46{Cml{yC)a|oYPKX$QFux1_K6)otpv)58u!eqLVH)D)7BeXha@zGT)Qn<9IYA-$X|+yN383=C7L`B}*s2%CZ@tEl{p_Xvw3mwPpeM z0n2{lLn+wZ_ALFcHK{lI0ngDccfP2ghjqth{;4|kw(3HYZ%J=_02l`c^s#1Q$@SGf z)+1)2YTDPzfN6AJ>zu8=uPC>l6>T#I7PTB;c}%Q>t1boBCYvWl-7By@#;c4g1FckB zo>$!;XywD$a1a*1e^vtqS&3%4nlZ>K>tD>`@Hlv0>|i|ol{;6oa}eeWW_r<;!B!K~ z_YJdi+d7O#C1_HXn^jb9sMXa(JDE1jT4=t%X1LW7r>C_VZuPMx`_#7KR;Q%9XjgGP z*h(X+W0Wip(0`21Ym{$qR@_$(Kta08ETV&g7wH5Wnb%(6=DQ1?+xoTzmiZ3VDs*_z?O}%QR z*m7$Zt-Wgbo(yuCC%hWCn~eDpe;FL*(K-1$Nk&cb*9u)CyaKorQ~U5D9zSamUbw4> z`({{K@D(ywLh#cXh+KukuNs;H7WepsfKHBX5!M!bo?KRojd^UcsUe=go?9-&++n2O z8NtYnJ0@EmehbMJLwuWDDa71?5LN^{$SzztB>%;a_{}OI!#MWdsv$1LK8qI1UpI1Q zh&Ph6LOg@RPK^+!pgEe^A%2;h6XJR(QLZ+k5R5!wV2BrsMc~rH9JNw~*MM`#=n<^`dct+V zdBXLkwYEQy7}lflb`9|5lxUIbn*98@rH{?43j0zW6b8@yZiF!+G*E8v%e-vXZ}N8;%m z{FX2~#Z}>&;17jsfj<-G%Fb6>tr4DCjJL&tMfbgM9{7Q9OYonh2~XkplOcvjVUa1!BB~|47F=KWX>eoVy`2+9`Vd~L+E=)bT zTf))c?}Yu}`ymb*F);ih7I9z$Hx(9R0@x|cx9^d{)U~5>F5RSn6NJ;iWrQ=p>B7{< zt1QeJah5Rk@p8i-Yij^Q1F>iZZYs=Ezw?DVf!hoB19uhXIfT81r+^ED=YWR^^FvUh zg`WUV6n>Hi5l$Dw2Jj=o+}WVl1d+?HZNVQ4bFjK8%)#m#VRpqk!d<~X3U>#G z&k^gx@!y8AnTZ$(3%4-4N|Z2r2haYc8}^P;!qdSi!gIkDgqMQ#@*v!^>t>7m8E_rp zJ>W)~(f?nBp}ANb2DcIB5^YD}^Wg5nSHOLRKLQsBe+`~Q#xqe0c!qEWSZgmr&Z)*@ zBCiHs61K>MVWn8q0xMxI>24Cv13x3&0=!e0Bj8?P7VnF~yjvaeMgu#jQ54-gFg{o0RB>VA^1PSEcUy?PlA6E-UR+#_*t;s9V($+;1c>{Z73F2 zL9|#L1(y`&$dx4gAy}&^!aa*Un{rGPd|>_IHZZJ0A8rGe1~(TsWx@KxZIH7%^oQHP zwK)FkFSo%^2NwFnZQy#~LE^aqc!Y3c@L1s{;K{>~< z5RvtSVXascfHw<|0B;i>2i_&j`}#iNY2cTHS!G9s7lQSN+mb@B3E!a{%v-bma2vQT zIQWTJG=)KbxD6J}f&OqCn5pK`cJ$m0tUufaW+VDtQ6{k5{sFzs4hGUoFmMf)f1ir&J%tN+)|iRw6?-*bX=llqMriy6lMeLFT4Xh zM5{Hz5nJO(vDghBFMJ3*Rrok~mhgG-JYn8a7YbhnFBAS4yju8M@Ot6zz*~gxp#2%o ziQyi2xA5=a1Hus|);ooH8$Bt^+vpi#?iY$pa}CTVKh5^ z2uzR`6z&B+E<6DIittGAo5CDzwVow1GZFlO z{#Y9f(_!GbI?UxFuvWSRuLN@$jB*9mdY0ggUa6e%d>0n`wr25-y2&WNvipbek z9u{Wl&edv-aKz&MmsoJ(uvEA=c$IKp@H*jv;HQLHyj+ZCqFJObk;~$?3_dPA9Q=xK zA^4o|XpaAv#K2MMUEvwvPlVyb__y#pFqfhk0juer@DlLP!pp#a2=h+pK)<8=4PcKj ztI1Ce!h-b_FBYt)(!%?}X~L|t4B;YhrZB6lmhdq!cL*}Fm%&YhFM_qcCghjET3-{) z!78W~Het91gI3rCUkB@twSoT)=HW~X^gHk<;rn2ohDZ5N;Az4r^HYR7S9S-0q+y84lWYrP3VMhJ@Bi-dEoQHt-)^zbHc*60E~<` zqz{Grfj`q63_YWNB^HBVaa)+Pn(u{2fFB6Y0{L-;oV@Z5em;QfVD;_m}7%h2nBNt&A&mbHHB-=Ynqw^XBxua6^v&55&+E7Jmw}5!o@@U`pG9dFCv2W_{pfVJ5Dea6Gt@ zFcVi@7qvsPZ+@(dE_7htqMa+vB(6s6>b3TEZhj(Q#cRYUzoSiA;J%VM+$cb z^H5nPnyr1RZ~=Ih@KA7Yju_a&SCLVM7{H8m!mN&M!p!mW!p!l0Vdl6Upg)9bfE}nG%4>on zglmC)!W=*NHl1!*qRCpV5e7zFPAuAhD+zNlQeC(!I7he_xSnt!I8S&oxTWxHa9iPj zfjbK?1NRhOf%a$g7Xt@}A;RqUBZWCd8!vnmJXQD6GnW-Jz)-9RsfOVe$B`{!i>x>%*f(}8CPjx zT#QOutr4CXS*BPpvRc9^;QGSp;3mRML@VKHU~Yk7BC^0eggHOpUNp)%k`5Mb0Uj>g zmgE0S8jux^dUJ$1qUkf?A;*o;cwFR6#1q05z-xukiHyy{D0yR>FcY^+7_HsdC(N7B zOXMITs1L(&v0%%8MYuKioNx#5CE?ECcZIuwKM?K-{#3XR_}{_8$j>Y=)?BFwt4AB7i|@rZCq@O)uTOco251+U<-B8-4{ zr`2M?y4+4iYibVOBh2bJDBK==M7R_9W#KO1*M$3nF9;6BG3(P-Aeh zRr*AoJPfCIl=ldvLsY*b&S`LSm8Qe0{85-Xs!d1XG_QsF?kGZcXI z4cpR}9&=W-W}wENRYxGPm07DkKIW`oWueK3zM7hR-08zswraGM>X6V41Pr&d;0O@)u9Li@aK zPPYE2kInsrdg-;K%B$}D=q!5WgtNQb6M=d*XXEx&&ZW}MIxCki6M-&fbESK5{|RZF z+Z-;w=C-*lZZfdBU0H55@vO6c`~!HiD%D16>@EyTR%P}c`>*QES!Y|bw(`I3ED4qB zimyAXn@d#p*PS`Y|B~08W3bol!RyY(=4-0%IcNREK8VUQfy?;5(3c}8Zb3M)o=?=$ zbIw#R-&`2cWf65S`cHN2oHH{RxB<*NJ_c^#XXPmR z;gNQ8tZ3@2nbE57yt4uhU|4b98IKbUcAR(CZxV?lc|Wovo@m4E;69|Nr{LHTwb6!4 zG>=d_v9@WC+ zJLy{`ze7Y(txev%ev6M+-@oDP0+oqY7o083DQf8j_!_59UvMt7wJ4!FU38u|-&9F& zI@_6(RN`bhP&Z#vW3bU-N4eR!v9;AzSP7I2e5o@Xdhh)<`0n|oqWCecI5Ej)Z- z8$H&Gzxkdb`W-(B3219X{GVsB4G0n&t>2~fpSqBEK7kp{Z3(vMwd(vOXF4|ces{^4mN*GPdD=C> z-$>66*n8S{W>B8DROPpvjlFy^jBVEX!%!X6)VG{zrL>Qp+J|9pNbkM+;;%iXggW?^ zbH2Go)w%3U_f9}Co)vuHw0Ry;g_oUaQ5}#x&+606kf&0FS`S%yz8dwcFOT#&Jdq4+ z1HHHdp^ebw2+w@=`DJGlFU!~SOk0Q?o=Ga}iZc`6^)0x93V2g(yy9$UE8|xGx#Gk= za3tDOv;_`3dg?}~q_>^r@U5^$Z=+?MQr+Kn*7ttL5;7}rfjIiQ+WfXN51(!Qtfl7bZnF~{&cb!AbKI+uF&eGf?8v`QAcg!~C92uyR&JQO&E)$)+u% zgxYz{`4q;l*6(S5bKY}ygNJMHIrIJ6!yvG~w92Bnu@tau zD|gZH_tCflHVz}}%~}}rFTrJ57qar9vsFmGTg!bYG0G=@=vtro}%L)Ie+uI(h#xDc<=vsQ~-4Lvy^YWE28G; zaf1hr&YUu7=)_5x!v{_oJYwL)A({9;rEu)H@O8k@N#pBe=jLXPn^-u!a4a?cYy7i) zuPe8CTBwf7o?le&wsWQTp9NCGv?mr__{G`XUexywXL?@nCVL!8nm?)uhd0AcV(FvS z_(mDut0e2JTgjj2N!|yQgK#@-b4;P*V9wWQ}JV|&3IQ(&n z^?Vo#ip4f?`0Etg!AnGb7##jO#W`^3>lC4tmGH+Yu0sBdxPKq4wZf6OPr!RceiM99 z_*?K7T|8+w}pFvuL}Tg)rGHt_5M`2zYf;>Q^DVW^TZ8v zsrRQseh;kor-FX~_t0)o{$)+9M~a6k;6mZr;K{-*!H)=c25W6`1T+l1T;zpdy~h-C zzFgZPa=uX0TTCIJ4c1#s!Hc9S3v+|q zHQ{668^UM6p9}Nl+AZOW;O~Tk@4|3j3?G4i5&i^hpaC%ve52+Rz6*{N{te9DLpKie z=LF#ha2a8~P@_%>-Nb<_3nzlJ^k-#Zkpx4oSn#b|1L3mZroz1S<_l+o+Y8qMcNMM& z?jy`2js^5AFbA?l!qMR6!kB;?PYTC@Hwbfd+bWz2 z-Y#4oyhpei_@HnW_y{?Oh&ghd5R2wuz26kWExV=OZwl@T*85Gt-NAalDVQrRdcP@n z2>2eu0dr9LS$H(~4`Fso2c}PS^E5aZAqMtKtx^sP^vlq`QZTz^y0|$5*855!XSdY* zO2O=wx#EW1Qg17ToP&?vRtheMwxYL{f~$hNgxupBA28^>q_AiP9x4H`JB=5f44x^> z*T-{&SAv%auLf&vafHM7&>KbmEcj{R?O;wGnfn*PFX+v%FdT+K?->QN3+X+hV0NKX z;(^^pZyAOB8dz@`1%C|ITSmeE2J0=O;P1hD%P5%dp7oYdFs2}(Eu&yZ5C*+x6b2Vq z?->P`0P8)YU=LVt83prQwcaucjsfc}qhR(Fy=4?!4y?C~f-8Yj(8HMHEU?}(3g$cP z%8&};qwquEr-j>rcL?_ezaY%p^dVvPl%v8U!KXB%|MNb5 zRxB2QFAA>!Ulv{k4u7e_0sfkDFXsGUe5pcnJUINJ3NDB|5IM&NJ|XhE5cC@mrr(4V zG0<}vVR|knoXi!J<7!VE=$($a6zx*uqoOj@?NN?&)$W|9f$F!y8CkTawQGY5%Lc7G zxjNv~x^=uvS6|~|i|wN7b#}G4&SB6vq*hi=j!|1WyXxRe!tZx>b+9h>L@lTqRUppm z;;Lia(dM}{ub?@$7lsveh2~FTMyQEhUDIq0#;Yf~y4sr;)n{E1*IHGho2!ahQBAlT z7o)~^bNR5yGq;c#j1Vv?=;E42#U;WT$r^#i@VoxJF&>=!JzT|A z{jD0cvU75je?&qhGq-3#4-|@%yLLad)Q7!X$(?xK4o=xCgR1%al)Xmi5ja|p`U*H& z?1|jIwT>j0+@`}*VW zOy5;VX85=dX1b4>P}6+uy_Kf=hQWG@?i@+rtc5@ zwfVB~*Y4vG@9<3nTfS7pj@URA)z6g>WaUN#Osb%?ja^RHCCv|D*d03qULs1F ztm}QTU6}GDZ8#OnJ7q+Qj^J|aaRePv!MuRj-i_s`5>dshg#fO{wqyV`Oit`>#1_y` zuGt%gPh%Cb64A^=QI|Dt#!^!tqJ{YltZv0_qE%~i0sQ_JSKU%Kev7LV97tg|lWHtZ zGwu(XdYHOa%s8$dMD)@ouNg-zwTM0@CmK;^{MadDjEMf)&S%Ein7D!37J~Z<~L}ozSkA=BXX*F?>>qI|l44REI5t4-fFiqg?-OT%2P$dh3s5st? zpNFf&m4MKn@^oL78}r;{bv2%)J-c$EwyM%qJwDi#7|(^TK*5iHS?az}C0QM(C7++& z<+OKxwMKh4s>ZP1|V~0*I9A;$xljRsJs?7LjD=Ale z@!3V|3SG19s$VrTe$C91rHWRJaW!!Kv*12!<*ulLGvl3V?Sq7vqAw@7R@ztPO)j(Q z<7s)SOr=u3Rqdx|sW2GgR+C4V6JozG`&ztk9=Nn{Q*au%8a;DHoFNum#>o^O2(BeO z9$dF*-D1}}cDz{{vkbGhjq1cQ*HdP5)o(fGM!xduh2^fPc%4>$1uWlHQ*co$E_od4 z+zMAEvyr;H0t0NGD!CH#yTN!|n5depbfwv@ChMu)td*FreWjMtwk#eXe5>xh7o#px zI$3>0X(ps@HSlT73FpK``LN<$?Fr24>XgAUIEo|{DU8>%x`ioNdQ_)lqSLI^IcOCj zKgXYN#T0+RRl9EO+>}*Yf2@dOrW04W{tP~jKrn>i=P-Z6Uz2^HjTZd<$L0b5b<*-6My?d8Q`as30+!LufsqMi?)q+8R? zCqn1nCoS7JUOTGsAqCSuPV6x4<4O=FU6}|1|KPvTM*Ouk#vf;PdHi)hi$CTT{Lv1~ zjV12Ei@9?yCHT>oxiKEHh%v#TW5mYn>^Ve>o$Lx`7o!A9*f8IsCzelHnl|#WIZ``& zi_ZA-P8>SfFt5;^*_j(*3=Gu9JUEQz&|$vAd1EU6`)G%TWkhG-kNFN$ovIc;>52$; zL6QPyXZ!aiMvR!Z;Me4QOP?KTZhQmg$W>Z67eZ97;b&Lj-0Cl1v3g9qW~Yn4y>fY| zWL=2NYj!4>4ZWmJf5^;n#qUeRUmo-tFuNcLUH%F)u7Rq$##M%=;2Z8L?cgGGk8?U0 zZX(x`TtgWlQxeajH%f6(arI_s@w73LxT)M#^!OUrew%9+#5UtU%74XG>L0xiFq^sa z{*lN3+iQr^-?;NEyrURALVY?Tp_F=Ty{lIA;K9{LaB4Va=oo-gonG%MWxCXj^{(X+ zGbRlfKXKgT0h0|ia)T?UG29H8R5)`e1pny9%ln;+ffSA{EPAlP^`UK5!$D@){ zc)QC}rJ9;PwTw5ulhb|bm;Ii7YCVo@QM(R!vWq5faUHk!eh0N-`dKGXWx)UN4Uq4W zVvrC1ZsLE~4ZCvq#&{1LgF%x&?jQ`i!Q>LGK7Pd$*CxglYI&G2|7BmFj3j}KyQ#@|yA@r^e-z^-E6 z4i)ouge>ka6m!Exs_-kE55O_##ti4nVs7q`B|AS9legxW61K3&90TxcNR~2hO->8R zyB3q{x47bFX3>LZU7wi2pBcE+2^Y7*^^iiAGSuNoMmSFh$7zCjo8>Q-EcK=*H^NmY z57(D4W{*bg5ck%%VkVxBSV>KUlfg_pmt|Nwy@lzyzc9xpJz0?woJKjAZXPb$zr&>* zSPN;r2RF>$)H+;jDbebiJuZA>VBv!sl_S;C7jPThr}n>q zTViWuPU#!v9XP-S6mu`6pF*0arFnZ@KJVyQ%!UwQdHhdMsViMrYT4^@TPY}kEbVLs zoMD5?R(kFT>6}ocpF(UKQBvL8>#AT~Mm8I$COPgHm9-D@NRPg4_XJyIa8nHJLzzP( zzb%-c1KvTGZR6C@eF%YSZr8Q=XNt$isfhiq3f_Dy=;fhYDj<1Dq5F3fb`pf{-}#vQ zY*IB2B*dz9`(1&*@85}zI(2Gh>)Ur;(GUAw7p#ci5Qw=4e_mB@6uC-w;zBSNXdwCf z=3JRV)6JfXn=_)uebm~mFRlg@I;@K{Ib2-C)Hmd@2moGAntFkzE9Zu?Ky!f@TA<;X z)v`b{n*K{n*P%F8^5S;PfprPCobUq8Cy@WOK%>;w!>)3+Ha4~LLQ;~Mpgue7iu3Xg zYeaFH;Eej0avX6rY|cU9uZ0&*NS$pbGts7vdPXJAj=E;I_}zyOOF$-S>_e>?uoF^bJ}Mt zniG5`pL87w1^6E=?vBm@@xM>H3NgRy_;T1&lx@iL5BitH%P`DGAw>Y}#3O*rR0Opbg?*<$Ic)KIB32_O6oQn93 z&&5z47JQXSi^|~dgtOIZ9DJ9;~0S zdAjmU81zFncpg|kWP|5}^+Psz0a!m|gO`EzLpGStz4{>=%&y&5BG?2TKt@Ai?uQDq zDn|*YfrI+K1xL)izHfo6g4yTknbo0B{0B3~i$u<1*C+l%-UZAf8R@Xh^3*l|x zuZ4Gm^^OyS!-s+&^vVDXFTtQ6zQM=9k?3E1^@Z+a1d6f#P5|U6ZG-FHbc3N zR~F_BCrg+!id^A1FgF|0ul|TzQ!%8#B44-?xV><7a93gWl-|Ou8ZP27Aoi3AWb|Ps znycDmcImmoOpx9*0wELeB;-LlDh0z+;)wH|ox*$s)H_1pCLOF#G6PoxzbjTT+rXk`Fomd7#Gg$m2j@p7FkPW^CM2#3eVa`O8gju9| z6A0Xt1nW&8;3Tl#1OjHFv&DU7a0@a5!Nqt;Gx|Rboy3Cms&{_C5$m;|$Ptz?SeV7A zH-W$n6ERNYEYc~$OvJ;&Dd4%ntk!=Cvs#zx4IT)Hb-79`>VTCnS9W%hqe2PYCk!vf zQDH`WMwk&_5@z*X7fuE1%^nCR9sI4xgRH+F#ZVQ@2Ruf`)I|u_0LKcm{z?hg2B!#f zb&zi>=(j1js&GCS8#%PRBe)qEdnQ<|nAc+bhk?1#n>4`8jozdIP5=)S4_uwln=~M2 zG3rekU?%hty77fdXudEX8WszqgBUA>S(R&q^|x0xih&Vt5#}(dH)Ei(Q8=N^7+|)E zm+1zKHmkS3k=YI|h@6e_iZH{`$Ns|&Z#*A~ybAaWGPT`m!0@$LcrBd`RYWz zE1_sr?QV+) zp8XKufd_9CI;bsWAn#fR^2c%fI^>_?%yoG8)lp5$x~F3I_mQ%YHdiH5aOtUfrMRn@ z)mP2^B1WxEar^N7x1A~Oiq??wXx{2-iaX7gouQvhe5tT)u2NHBI}44uqki-#fYfFb zsEMiW3f4u4vsQJ&x8C;A@pN?>j*+mhc|p3%!RwB}7!TEi{s|@H3MW?|mzfg&)u@$Q zY`c6;-JCk1)x`U1PdWGAAaDF8JK9pr3X1=1Y`YQRZ?$pugol)TT>gGY;ZzGx9Dl+g z9#Z&pkB1b7fn`GsjeJNcO`*f}Yv{sO0}o!9EXQIPoXNAbJI8G8*^$YMX={p$%VASL zrMdrQ=Bi-2JFX6=Mz(w}dZ%Gu8Wn&G$7a*Z#|rCNuinAc(0iBudV4G2;x6>whSL(m zl{w04pvEroM5>bI-P>J^$!276E}f`uly|56qtz))s9URH72J2!qu%I@qH`79bJC^S78oyT!*0>-ku7CIra_{=GZ%0xH*{XGIZYt zJYAUmjB7NI7sX_`TiftbyYh>)tv%MO&en8SHs`9lHQi}u zRaG(vZErtD7<`l~2aWnQXK0l?$L+J;L(dF7Zf~P88UvbJH|~otVrk$b`i+M)^mLzG z3sUIE)N)t!=0kc4sp5@2pdYq*7}bo>!}hlrZ7o?WujT%q#d0+EI$9gVyjhf(>-N~< z-$Z^n0OGG%8(?k(9yC<_I_~7)>zG!dRnNv<`|no0nnKgf`6F8OC^)z6z@NX?#n&KR zXyANZiUxj6UtFu;LO+G?Kv?jdic9fj@fD0hFN@o50WH0AB4{&_B1=D+W3_yR4%l&2 zhhS@si;XSWsaMP0|Bt%!j<2G4|NZXCNwQ~m&q=~bLP7$h0ilHiLJtsn??sS~^d`ND z98f?+P!M$x=}lCmSptd(ii!nAK}8e+k)mQ(tmyrG<~&F9yZ68E_ufD5z98p4&(xir zot=56d1DI;Ve)ZStKsA6Ii{}~{(5}3(4TKE#9klUdeOdYaE$L)+(E35%00_h8FC-8 z5U;e42N*fNdp!7d;f#W8m|`28g^lN1I@Jn!n{7RhGoC>^7s1ZVee`U&ENfnO@&mB& zvGZW~PT{ZV+lap&UjzJ&^7Y4Gua7TrwBbLB9}`DqP%9VU4xccP<0gy0%7k|wu`q434wSu|>T*Y|VapD3_(}KR55@_~vj=CMha43UEkiHhx5601{4AWg z6|2x;eVrprvA(ahY}RM!6xY`o$1iLqzK{m*H!Cs*QSmkSFuQBNY?@@_zqz&p5}ol9 zL+x&|^z?=_oXvgU67Di{7?A4H*h&sP%#MNgkmF;wcE?c z)bQ=~gvrQe8_3+MlgC7xYdL8kd~;jzP0uK@QpPYbXh!MXN6h`<#ITmsiMa=$_seJI z>BLZ?6SEVLN{>v;6ojkOLaC9Ni9i2aTB>eSn~JOop@neZtNtw9M}}FLrW%(Z=0t~@ zbKuo6s;9whc0c=%v)F^c>N6p=tFbJHJy#Da>T=uY1g7XY@WGTT(x|m%`a5rOFR7${8-|WS?|4QR%KH7kXk4hhZLAb~>OTWq>R21=mv|l9grVaxsbuh^TW=k& zzPH?*lIrcO+s%>#?XCTKat24LYL^`CY#sH5PU3-@nfQb2GX6*SS}Fda6#rU^|0=~^ zl#Ga9s<$H?Uy74UaeA05APCk6|9Z$R#d)eyUn|?+v6SehRozRQ4aoU-PdYGv7|vi@I6IfzonAqu6ke&rVcS9vgp=I~1Cxyg|@ zYST@5?L-gRMC4S7MYv5VHyumK`;sO60bqvDuMSmW@Cyw9E>1#omwc|C4N zULW>AG`5oYp}@tdBOHX|b*Pk^*U7rkfSF))1LlpLF6HJTHBgZ|yIRV_@1-2Ef{SQ@ zec&MKa>kcPc_yPp2ahZ{L~T?=P7PGVFBMH@LD+rAh#TI24;q}XMIUew%#;p|I0BC+ zO9XRE@glPLy&Fuw{4POa8(}u>BA%;&>6st7I;GqcmEz{5+*8vO zao?qs8!DF~;SbR6!{yHyQp&@GQjVr-M@)ZsnNZ};_EFvA#V zwM@7;bu!}K2;p@wscOKbn@JK77j&EK4&h2Bi#&_mFf8Xn>WI7!xlvf&pp?87xp7#| zfy{{e-sB=`0C91WX~cq)fz2ji4^;9*+?dST9^cRLn@tlXEW#s%m`TFkr}}q!h9U8@F?fwSYC4A7VExP zPp9&#!#Ha_cBA-W95ev?Rm1V<`WqG0((zUoPf-PR2EXR4lByG|S{{#8QQdqiR08j+ zgxx7ncHN4u{wEpGW2q-^g^J*YdiPdz^Y27Xz8LPa$4`Q4t46NMngrEW3&brNFNkqu z{p3k-eLtk(nE`v~cyx935*@z>@%^e`N@^nK4YDW}<3F$X8mi1>t8xtYTC<~7)5%tr zXJV38Ma-IvaObOccPEuq8_E0C-pN)KPq#dE240}YGp9g}woFy!&*!Q;exegmByqN4 zY%m)$8#Ya`A`32xN2QmGs+S+upzU9^^7D!gUtE)YvJR$dHq}ZS#n%46+Jroqpbub+ z3EG5Wn*Py|y+ffl`ZxU(yN!0<*ese%>nHp~d+)&CnCaTy+erKMdUSxEBz0seve&0F z?{V(8*njk3*BE_v(toCh(i*KB)2w2(`LQxVbz-^WEm=3+O875Yo=?^OKG{_H^bs>!#eXGb^0OSfy)%Ad0_t+M-Vcm}^=)s0;RUAj#$ zMRSQnP%D0*ZuW zqtez{={{~v0X0v#cvZa4Dp&hxy;g;-B>2N<`JP%Hr!-J@$p8%jttXhU( zLPzoXiw>t9q6q77Jlq2!tith(goEf9_EtS1>ZoGxBvR`ZZA}G2$FrMBvAp&0QpYd;1v(VhULx;Dh@w#5DX7=y0^bYb~heuNu0-P<7a zxbNZCqTC-K@w(jQIoe%{>M+J#jhl;ge}@~((o5}_s(XRy-ov;p1NHSjN!6-Xu6FNjK}@VR=01k(#?@-%?7Jnh}-2F?ss@1 zA-5%BnCCu;x`X=Lgkj^Am5AfdWPiLmw#mx%)Q?p^@V9b6rEj)!Yt%zd2S%7IJ6OK51V4dkW+V8= z@|9Z1=fG@pI82yf=ozUdZMJf-Gth&ZtwIlWYk70CRmVK0{)W`!@vBN(tX7_CmKwLk zy3>4EeY?eK>*?)R4Ypd1{Ji0~>zqqiXg{w)Tdi8=Wwm=Ng1bkZ+G^b#;8rDZSthrw z8IbsiD%xiCty-3{0-d&biM^4SxI%3RC2|2&TwU`WBzJydnyX&eW~EfU8@Ccyq=ico zd5lC{Gi_Lw*pz;YwP8hKn>h6soQGyINi9uQ3~Lh;=(m+NtWRXeBd(1$Y)q_)T#RdH zvS4gZyhcMOZP=Rl5~Jv!}Sp6Mteny|rOaVg{Y{HBl7D zW7D$gbl2Z>ant(~H!!#%=6Iy!U?Q7qal_0eFdR-i#t?>^pTKZ5@c>gg(tHR%#}dC} z0He+4VR$QXC=HYKU7ko>&Rd?U4W|;nR_3EtDmEQSdlVnZ>^RlxQR^miidy@ql~Xf? zE@!=pAY#04;cq#{lgbw)mDPaZ8H@rKxA-TN0^dCK^`llaiVGW&dF$JwE;hv&G)6KG|WlG`Fja$E>pL^AT!7BWA0|9tG=!#(bJy zdlBVDWXra3M+r^n#w{~*;&3CODLG(subYHsdD8f zN}kG&I`x=!hxwJd>2d2bPba@>{Dg%s3qmy?^w9foyhNGM)hZ90@UOv?*BL1`S8Fp> zetAXlYRePWP*2Tx6|)m9kepamZKpNd9Ix)%i3LN4)b5?u^Js94d(yhY)6}oNebQ>_ z=@hF9cUg5k)ne7SUDgyFnf&Q4t20JnYV5YAqsVXGZS{%gGd9o1@)<+tT=1N-_E_2R zEC%LJu`C9Z4pNQxSbeG`;31ir))#mPX3u)KS5!Gj+;}>!WHIZxR1KrHU#aI2N*qgx z+0jJiEm$D-Bz$h>Uv#@WsqfdA&&lTb+4%%i)oO;dzZb3Q_cnf22En)Cf? z+Fq-%`GnfD*BX|kb1>h_fSyEJYO;Wu1zr}M@<>r0@~Cj1m1q8;ZrNvb@*oTM?z7He zyQh^;S-EIbKKGQ>unfPBW)oklvhW0tH46hO`e~~hwms|fwDqESmr8!dy0^v8C=O;F z{W#voUFNZXH3cAwCl)_FHwU>oCvhFkhtY!}!FS=VRVMQa^<`rxjp!3jQ>CM&%!{QsY=Dn&o4e z2nbiIz6Y$F$~u(2I+VIPgnc@Mx*^{9Q!%^fw#Ek~n-5qUOk`4v=dD>eFEgEgFq~Gp zMEt=5(ORFBdP9favWJCT+pJ_%0Y5))RmJ(F6%V5Mk2?6)LspA2+_B6|(qRw4M1i~v zSG|15x*yrl=S8c%IZthT(W;uT12>BUB%f9{UbHF|T;|Q}_AS1nB!(O&( zhL-Z}c!EB|%J?qLm`_hGN6JL7k1qCBo4eYiHK_)v};H3L{6v+6uO;nxPMp6}2q72OF{wV&&eM+%W{U2$M>8jwU)v4@< z$bWy9{ZIJe0-e z!crHJp7-HSlA2SPP9Zn$FuIRJX2!pxQ&FE%rY-Eg_ou4KE7nb(KC$YdSFHNEiY|LG zxo0B|jUF8-?ETF@f}7Hs8gvFPUHLJGeHahvt~wxZ;q35%tVOGD;vXMaF~Wb(o9-#483>O=Q|EC&8G= zabBD7pjb9}y+PL63{+kgxJ+2SiyRcyG4()t^E247V`6dw5UyLvRCD0EpNw~v*Ksn+ zI3pC6L#1d|RuA`69U*n5r6=Rd4mM#qH!8 zVNOO?Mb3*I3RQ_&D=a@vE(r63$SJc4tYD58fP zhwO~#9y5@g5q;xIa#7er3uIeFO?VttB{gAu3MYk`F&_!H0iP4@48A1X7yO;@Am0Bk zVi*F88^R;NQ7CAPU^F;Zcr2JJnK_A-WiUe+8DemL0p+-HqlPexOKsr{a06jJk*1oF z|9lLs#3CQe5o-p-TA4vEt#C{5&%*7%e+YL3b2Oap`HVTOgUnnhBitLzeLX4f53VSD zE4WhRs8)Wis*A;3a6REg;9}vm;10rD!M%i!fcpy{2M-lK0Ujm%9+)EnOvHy^jtG#? z@%@`EhD)%}b4g)w1-wY)KY;HM{tf(~Fx6lige~x6!VdT;;RLYWXbfR;vBEKtQ zaC7h!;SS(g!hA*V6z&6F3Jx(9gJF13EEa+{2rmV17k(JLSD3Hje&O|CZUVw^Hi3@{ zKLLJ2co+DD@ILSd!ut`w@rf7?!s0XGm%vwrkAb<32P5G7&8|K9B=~pXkHFDrXi$C* z%!z*FufTerF0hGmlOb}B^jFu6{7-_Ru2_@@Hx|wTw-&An?j%fodJo|ua9`n8;6cKi z8a6_>A6W0rg+vSjPZs$Q@J#Of%ao3Q;dbG%;5&uKgYOoe48Bj8Yla>ao(^V9pW*QR z-bs!Re>o-KW9P58>(n1dzuwaLjoDH5STp2u1n9a9^!ZpC`w9!3Z z%N4>*+(W{};I+bSz?+4;gSV4I@Z1lE12iC+_%U8A#jglEkiRL+?0r|5jpGl6Q^9A2 z)4>;onbqG2vtIdGm^YC5n;2NhQ0rd?p+lqxD#>x`>&9iuhM0pnV$B?^CR_om4_AfL zTyS&B(FDV%%4jRhw09O}aqB6JVrdK%=6&2E%8wi!g8CF=3?7;4lc?uoXt-4w)JCyl@Wqh;SZ@$tz;02aD5WCKK1ErT8;p z59B|S`ABg6QHuW-rW>~Wc-%0rlv127OgFX2A?e7}r9rr%FdcOw^O@tisT25`HfRqA$}cE~Z5TmM@Bnfqx)0!C!o9$wg$IE3nWbv3LwGiLt}v(8-66~w z)=Px%0pBaU0{npR8ZZwk;LWT9ZxrUJ;daf)|7|er6pJ0;eZo(G_X~5v@gd=-z(<9j z1#^Il5gY)Y5IzY0K=?)QC&Dj*KNCIyzRGR_J--LTH^T3Oe-b_e{#}@@Yc2<)`>Ws> z;qSn%@ULLDUFpU|k~iWo-=ob zi+ntItnjVi>B5}WK38}a_%7kw!1w!E|0AG$Ar0d;H2;e;IqP?f-eeR;*6fi37%iV;wQ17BI9@AKfzRhF`=AQ7%Q9!=9(eO zsiO!AQ%8|1Tma4xrj8;PuG1Hwy>BLxk~hGe!#Y zn>1dSpOPuU{2a^@=BIp~a7}P%p%@BbSSrjf;R@mA;D>};g4YVS2X7Yc0^Tm%4SaxH zN!mQZage_v%x}b-VGijw<-20R56p+c{OFw(Mh=Hh>O`P5z&}xr<{KLtzY8-b48%e? zKQ=MKyn9y|R(ee(-7uV#I6QwE_))1Kjv9b-gxT(_Cfo*`FWeDaPnh3@BH@AH7Q!RI zZG=aI`;n`Jb7inF<2Oc#0d3*%DV%V`XFNyb%$51Vyql%MC@#i>!hEh9g!%Zk3G?e0 zIfRop5IKaCkB^6NhM1yGFuWihcsG$#IQf-(UF3tnatfz0417}LyvxgEq=294Yr@RA zAB0(kB8PDDiyAqE6Nv~JkyAJsapV-vA>hajVds229jc>-j5=4>Z2J#*a)nV!AE^s5imtR8NX>q9k#^`V+z z6oK%enqa>7`cO@9A{d8iqW*`0@2);n6U58OK5@Gz=FlS!hHSop_-7hQ?W+mOz1XY zR#3Zz@e&yagpodancyN}Hp4@0!~j1=H{sggn}wN;!-b2%6NOosOc(9~ zzD>A0c!BT`us#bDflmNGBy!%&#xRHU4j=l^OE{Vbi>JlW9pFR4%fR|wX7Cl^t>CYPw}XEzgXhoedJF~+9y)m+*cE;ToGi?DJwy01xQg)4 z;M&5!fQy8q@LIMMP6u}prpl?eaCNp~`-y@2r^s2AE&__2RT%(B&Z+>nWQUib=ltMC`#$Azzf_Xvl+f#F#( z`~*HId;|QFa109OG2t@cw}lhIr-akM9}8CiUl3-W@QN@C_}9V(;2*ii1fN+`7=9Cr z=HS1DsdZo z0T&8S0XGt6bFH=TgW#^h{1)^UW}QD+_%ZNU;a%Wq$$0)u-C-E!i3QtnON3tm-!FU& zyju88@Ot65!CQq-gC7?@58flp*Ya86@4!cdue0)bQw)EB-xZF=bNyJ@27e|T5B@?p z3;eBc74Xl()xm!V7lJvtf;ZU+94p)e8~}%C!PhKFEZTz8g?oUrgolE2g}J=AhVXoF zGjjcK8EP%eLf284g|53W%g{~2XhDUHfnvyo#ZcjD;Av!hX;>KN2;+NV%ooOwu~?X2 zyk){HfcFdYW42nj26(+NUOHo|X5>HK9OH4Z;1_I{a54A@8LdYP{F*Qmaa=eFd{UTi z!AHVO#5rMpb}tEMfWH#X244?}p)w2{KxAZ9fw98K0K+fb1{@S_2Tm342(BpH3tUaO zAGogYAaG-0zD>=ALla?WD~4&{&cd_7J%#6j`w1@q4;EewzD0Nmcm}yqcp!AHFz@~j z;SBH+VLtAAQ&|7QLv=SMe-Y?u0d`P%2_^9wu z@EgJt`0+m>hN-alK=?NBC&CNCp9$XuzAAh-_#5GSz&{DE0{Pk1T#wD23^T-ny_31Zjlp*a z7lW4zcLF~k+y}fyn9Zz>!fa-37oGv$DZB{0Pk06O|NF(T3KlO5KMX!Dya9Yln5z0S z!c^6t7v2TFEPNPzP55Q-55kwu!9AT>Ds|kM%&KLd>Tu<2W;MEo89G6xc|6{~93|)m?a3A3~@BrZ?@G#+W;L*a| z7+|7s7I>O)1MnQ-X5jh4t-yn+@CIS-@w{D_`v0B6gTVWQ zhl2MDj{zSN<`}^-VJ_l*FOBs-?tV55r^R9^_*3EK;LnA*iRPEWYrx+LbLrQ0;eFsg zg-gJm^lwxD7*8|TN<^aQD z;bQPI;g;b0h1-BbtHsbBhV{aoz>f)c1@95=1%6g|Ao!p#Cr7>}JR1DA@HFr#;hEqw z!gIjq!yGcWL)K-n;H1fG!dy!HgYXLQpTgWbAqJm1KC(67c;U6+vcjB9SzefvDRYFm zbwV}aSHSt@dxisg2ZnlL!Tk~%37-LXCN~Q=M0*OCLABaXn4jRm!u-_UQZm7|yX0UZ z_Q5=RnGf6ZwQpc|^)z@xt!ZF)@ua`0zQix~@oU)7?uygo?#7QN{~dLvA#96qD0d@m zJG+s#eVso$Rcd26Dtb?iZ4Aq`>Hv(`rO#KyfKRHMi{Q1@N%c5>)sm*RtGrF@R#+6* zz6so&QV;Xzy!wJa*Hpu%@Z~+FmNtd2_*3c(e~VA4YRwS#Cu(*xSm&NmZ@}m&KBLMN zL;RB(Qw-1T)B*f>ur$tY4(Tz~uQ`kv=hWjcdRm=Rzf+9k^jg62uj*m`993WNXPIi) z5^mEks--O%?`3s{zlE1owN~&mT+MC;SNqlL`0*HDs&cI%-J!;`hIF(#z@H_`*9JdB zR6qXwsUB-%zXrR>ZS8Nd0prki4E|@euN^#oqRjU8Oe~L@-5ySRsn_{)Or>_f;^5J$ zbq71!Q#@3S?O<1qzJk`mR`no7_pH_Hx=(bl;Bj z_*@f1(|VXJwv0TiCZnQmBF>LRH7%RGbK8ul81^PSK1LE=hwRl6u>p;B$nVpM<;_6= zz8@j77vK-VX4A#_87{E_Jhe#f-w=2UkxjTfoT%q*_#4n^gg-c;uSLX7bWsaxpbYnh z>YD4Mo9os1T&HS?({*t)-zGX6Y$1mBRQcd=6#R+lxP^fjp6f_tOefA8z}}Bp$Q_RX zZ?S{kfwiYA&}zZPqQjYymeuAP2KF=pv)bx(xlh2q)$S0)UcGKA-=y9<&s6M$Y{g9l(8oPwZ@;LQls48DTcJ;7HXhzhPj z%Dh3350573$KRM>1;iB_mbIOI-oH2s9OC*)s zHhY4cB^nic0PGF!L_pC&PV0;ba>YPwFb6KJ;9&&n3vxpYJ9rYdPLLDTv3xrP_uw?p z^Zgsb4fgqC*`$Yd$($b{hW5$*kUD=^ zZPTIbvXlH$s8!};8 z<~Ya(BxA?X8cu3}${T+T?O;-Jl*+B)6olB=^B3r7=OuHhwZBjsLdjff;jgP*&rjw_ zd;SJGqJ_y^QtfZ34U3bh1o9VYXG@Z~i?P3%HY`iNgFzQ-!;0js{~8`hUWPpNx1dc3 zsxi(2_qWu+txdkhn`osC>yzu#T^nuKn9TOJznxxYwmJDG2G>a&wk8+h`TDzRXWNrG zyWZc!u4B)rHyE* zB>zQs!%UW)!^uz6X1K}Kx<`{^Xc%d>h2dE8uWCb0C$$^T3HDFbw|pvjCJocH;dC-v z1pZk%Yd=ZmDZTzV+Hf}c6((!0Hhh}gk2WD~IA?gODl5;)Gh3?qc}`V)M2F@%tw#-F ziWYA}c+Nr;56i!S$#&~A6E+=%#Bgt=lPzQ~D$tiAyQ zTi}iFfWH=Y8tbGAYB^mq-#RFS_(S5o9JhKu~$kod3g?QCUu;?$g4PB}lPxW@-> z@L{-})TUZa)*x0N0bAdpoy={u0|{mWB+f-jZ-brlF=UBx4Jb>PI^`B4t|7xWTyEJN z*NE(KdBk;GV||0}YTRC25!rIPtIT|CjCM&i%y%kOx{S1#B?!|Pga78*#}QvS)MPvYF&X-+bpk66gVBt>MFgq(-RAkC)I|V zCTc}(rzUnRHFBWIm;4*Kw*~yMj%1oI2TKkaBYlzZBthn`vC$ zW6ouyA{eTEspIqsU1P#Jw?-`(mRp>>RfC#fb9(=OrS0LYW<>;Q|2+=UJU-1@9^7@H zyLl8r*Q)6S_tKot{f?Yf3*dxvt?WUtHwvahm~cqncJ1HkxM`i~{Bk-Ez8Y~9{(u*@ zD>+~2{1FrT3tV}OZU5DYA>&kqudJ++$BUe+-sqvX+%jU)stezys)}2J(ItO1cV74} zPJ%3XzK!#9_0T?M6*7XC-nELw2iJN&W-6p{@xv8a@>q@!A}%cNO{St6*L-q9n7<;k z>5pq7askU6^;JSn4D$M-FX@MvM?gx=%}ZlIVk zrinZQJV%&!KVP^ItoQhW`}*KzB4^u?dwjKKWKCdrNG#fbA0y-0!^+q#%t!N#Fdq#Y z+H}K5dqgcbiDO`Lfu|{U`C>pjQHnnoX8JjSkZzcMy%G|PPOI^U$SZ)U9H5&FFqHsg zKCyr>A5t0NVsND>sz{JX_A;x}0?dHe*(c|Kn+R72vx84LGl+e9a%-^O?hD)jJe+bo z2|kR8!dYPU*C{Umv$aVsMEv2CF_1gVxRtaJ=K5hW-=}rL40MYy-<8LNF(4IQ*a-K` zq311C+k`W~PYCntxZBIB1RnSZUZMqF0Y;`*Jc1dSK2-zE$WDnHMs`LR zR>pZ@MtoVAk4B%i0S7G9KZv{%__}a4HMB4)qh#GI=ZX&<`9*g)T|HKz`rr#V z?sW7?tNfX(Ug1wWm9!8)ht&xF3{cPTr<00agrAM7_af(8oX^mDF-+stgZx>jE-iLu zLO(L_E|?ChC;4+w-MGuCj=e*gZ^db=MN6D`=oC6HajL|8ij*$$slPI;WVK?6%aC>-9Z_HH$E^}Ma#O41VyTm=KcZvH}?-GZt z^H+WPb7dTVp?8VnD%`a2E^$Tb$iA{EsS~G`J_RGA)MNRpMsjrB+O->okL6oda=f?g zjf?T(eQ6u3J{)d0u-=M6zImcERM`)S$sU3kal1qMQJdw`3;<_6}$>1}~$@pn!j7YUdhxP~xh z1=tOp8Q=$IMu5Hk>47MOlRPcJ4)W9h*YZsXq#=mOfip4claY2x+D6E}F#>E?pTTxs z@Kign8G+>l{!nqF>{PRksyfP^=y7fJ@F;si%{hq94(x_6Comp?yM})u0`%IG?}jPx z5nAm=;2E~v13$&6I-`+c-Bh2^cE55N@Y&7n&OW^T72 zQ;QI`+y60G71>;8=MFgyF1E+3;xTqU`VN!F*p*O!s4;e4D%Xew#?i6YW-m1`o*ZM( zSD%itQ=mlrWsH4CrTR$E4)c@th_%eLY2yv^?9*^%*k8c6`6-j(wLehn$J#xS*dNB) zxs{ePf##1~qiYYNtDl)}qs-7LqYU#Gj&yqMZmQWhyS(|l8aNL6%C_q6arV9Dh?11? zcF;7-s2UUOhGzYekrV7&O!EWv#zgx))F10^g|wRb@K$?7;1cf6e9glY8)-MG4wLN3 zaCmT%J<fJfegQu$G+w6uO$A{P3?rh#D z*>Ib^B|etxt~|!o|EeQ1`#-Ck-i=rn zb($nR44fv++|3l8fcT9nVweq!n!3$oy zzwo2rp~5@Cql8)MPSA|}e-?(RVsQXGNBAIkf$&G*yM)3TcbTE%38syoaom zc&rMUucGb+fh&V`F9^)nPxpe@TdfI$?goL`v(()na38Sl27%e=(%m5NM6m7#fhU7? zHwZiftoMci-v<6m62Ui!dlxf73&HvYr{2j-sjbkE9am2g`y_phhC3wWz=ckph#?+YyY!tjh(3<5tdJQVz@@GW3{ z7$MvB5hIvxGN*bA`8o^Ms!RHxzyoTr7MFtoM~cTxY@DS0==Wufm`=mH}S}>y2f=?BeN- zWx%oEF%pm;JXN>~_;%rH;JbwDfL980Ch;S}1HhYwF@Izn@CGy4|27e^H7JN>4EBKOTxoQZKe&qC_XQr}VaOAURB)j%TQQA< z*@|f;+yvZ3xDB|Ma3}E1!o9&mggM7*r0^*4c;OIRC{x5R6+BCL2AI2b^Da5xYN0Uu zXG?`c;1$C6fFBZG0bVQoAb5-LIxwdyFwBkM-JB^v!)6%RRU_{KKQH_;_=xaZ;Masd z1Rob>E9Ru|B``aF4CgBNobXrR%fdf_^~N=D^BdcLKZwQOu=rJ&>ixfjv%&0=GtkOl zTR0D#BwPqi7j6X35~g}JSD1tIdBU6m#c}O2Aq2|)YOz?b^U_B6L2xJGP2e8FY$x;; zz5pI1{3Up}Fk7hXS~1ZH;7P*NRL&4i2Z!d0p#ltd2xowo31@?qa4vX*FtwT6gzJKz z5T@30uW(y1$KjX=YA0V1o(z6D%s8|fhS$a7Zty$8)I7c~{1BKb3I?9ejBH+`xt3=@c}($r<1Z!dYOw-3{b9V7=W9 zxH33j+~k6}Stb3lCCy=Ja$Rr>;rifq!cD-PggYR9V=xV=;V<3@VSEgYal-h<7?XvW z(3!$a-0i|u!3%^7!4HtpB|?T6YfAA(VRlHigF|$L#*DF3EEw?~VOSYQ$!X!ly(t_A z`Fp~2|B*1eW@m+~g1;jp#Z1t3;b!1Jh1(#0!()dXb%KQ@+zlKM?g>s5?gK6-JQz$( z4kH)=t}KjB1x7x@@|j@n6;C(w!9~K$z%4W*{~v&%vsmy`+e?_A+M9*fgQ;L+K>V(c z6y6W!rq`6e2c99!{z7CAoiD+WZF8dWEx2FYB!E|k#E=NX2H{ljHsLhz6T+F`y~0%2 zmIzk{zaX3o=EllQ5c>kJ3-fdQj&NP@`@*66FnlZqey1-8w*+4i?g0K;xG(reVfGh( z6CMx#TbQ5kXp}G}f;vSkROrok!0c3Hi-*PFs=`aawS?Kh zs4L74Mq^=q`@bWJ{s25d_!IC{VQM<( z2!8{fC(Jehw?8gZF{~$0!uXsR>xA(F7+c5|9O2h^w4}i2JQat1sV}8q#3Eyms+Wop zi}`9%Dn=K6Rqyj>lB!gW!x_WXjB>C%uU?_iJ5eR4!FW`SNQ0vy^$dSzspxc!Qhcs% zPlsth$?>$tN>$Q^<)KDE>V>#B7po2YDPr_FipKu5n~uT)%O)Kp3qArWnhG% zMGGuvRn0S;Y|p!$!YArxU~uE2T29-v&d{Bx?ki#w)$t4`4rw?`@tqKR)#UG!gDO1} zu7{|anHa`c(i?RGTEXpc!_9e?E>d|rETV^_H&H1(bkc6szmpyHxhmee_3MOZJ2oiU zw#s?h4E>6R*l7e)`tnSI$rCvvx+lJbnErSYKmU$t1o3^x5C!`V(5N5cj}^_)Zp?Y4 zq8Vcvx6$N{r6N(!dAxv_V!VqGG(7&O4fmtS8nG04hA@^W)?1!?@Ni|yBPSL|#m=I1 zD5chDdPg!)6=NWTA8TtR;=#1WFJa?jlha%HBoIE>`tmk>7igVEbePsy4%XUDbP>_; z6`7X$Zdg)U4!8P?Zuv80E{6fVG4*=Ef&Vf>q##l~Sw zd%84ypWshSM}@x_0^mnErqfhdV4Q{rgvDbBfK5?9RX2v;1CJs9O8lMY9|H01{z>4u zex3_+n|~z!&haPX=4SgV!giLQldxy{nLD{N{OpWP_kRM5Y5tdRV^jUl;qMebXGBf* z-ve75gmRm@MLAgooDgcgI0GKNzB^%W9oq~JPfWDlB-=g?XIm$ja@Y5_dR95LLsY5Z z{B~HF{ulAr01@|#KfnBM*-JG24l z_+Ne42{fw2u!d?E31-qLL|~85rZQ#{=fm35%mw#< zi&lkeoH{teVe}fO&|Iq4L5hK-m)1CMgs83ZI(2zegnq%Cdh!x-{+QFGCFIsyz(lA0 zHM;p0$#wMGV)(ctrqh}CVfq#!kxo~A_X&f?3^$zaWUr4}bEhXc#??&`UWAzupETi z%0KQ^hI$+x{1bJF^*xFd`6rRRzQ(ZhPo)#fXOm~Xi@&b#9wf^@hcU1~ziu zRQ3jEkhw;U+2CZD1#0OAr(zn1LgJdT+T-|Q3M=Xqean@8E;+ivxd$Hyh&;yh|9BXv z1jn15j8X$@nq?oFla#26e@Ve2uggUCp+MT_BLV5-Lov-d=;3mvhCMNJEt38Hp|%mmFZDgT=DqZb3632&jzh7~LL z@p!Y;zPHd=+o{asXu{>F*~ekoO}$RjR@MA%mlw9e4z2s<9G6Q>{ORR_s%F_-LwKp~)M21LaRQ z)wzJH@j{-ROhCB3#xCbS?KO6C&|bR_ zt#gZmT4=9*ix7P*(B8s*Km^ZySiKED0NSTefW0wG*m-jXvq|r;M`Jovf_e;VAS7tc zHHEbfBD#oZwDhr$65VtqINop>Y!}G=w*oM4V>ZH%Zpkq1{kT(aY`s}v=QW58rwEc5 zOny~6&N?|EE=fs=ZG8~-KAwLO+n!Dh-#7RZ+mYd;kw<-WY$v|lXyk21F2sAS!b->^ zhcgWghvQeK!vP47^FBDrVK2w)G=e1BIl;_zIJGR+sRrkk!&=wpEW#~>Y==`I9OoH$ z!vc;42;6GGL6~^2ukHp$u}eq6LEw-x87Z9Sv;yDm@F1nRP9i+q<}AVAIZglp&UQGF zbC$Ca(am&N5zlZwgza>PBYM-E#_&7Use`{$9Owr|8Izr7VU2d=FStqHpcjz9c(2{> zB%|I3XWtmkci=OI!>?3rhmGbOCkZyV+f(pkPkJ2o@UxPc;T%G-n;-2wid!_D3XmKz zoL@bv;G9#nfLd`|+NiCOeEZm1=7%hvA=^HFob40Lc-Qx}y62ozP4AxTbtdm+@W&Cn z;f&Owe}M#foF@@`ltaC?*C~dRXv1EHWO<#nZ_oqPyoN)~6x)<1ASzP_zSB*|YxaS= z-~`&onsjUgSsXCgjK#ql+)n>~Qx%?fDvsrBVkgPujFO$fDfCm$WLex3{DRKXwBc|t zg@z0r@`>PmxEH6gc^jfR73_qkgL>r>45x#w7(ju!2Zm3AkK&%3dZvw_&j&yBs29#V zDRJv5Y;P`x!#|V0h*1OAyX8U;F^nE2a|*4*?YK3}fqxwS&`O-jm~YZY0J>%p6%S57 zZ9*&YI1|#}WbXm3#EH`<82E(im&Z(^rob7hO=vClV!}pf6IzR1;K7+@R>luni+7+V zG@RLHHyGJm{3Av!zkoh(lG=L#?ZheSGJkMp=Vxdx&R4~sp}9B+cj$HNaz%)Kf!%si z2gJg{ZSp?k*4Ic~qT8N&bKeI@x2xYf!}k)oGm~lhoI;__xI4L_gz7X{k_5|V2SYeVXQH}G-Qy!FFD*g^xw?jEgvKH z_wPmnnuk#cwN+pomC?RW5p!UoE_^#PV$*&%A|qI#NCe{T`#(cMkE! z4Q0Yw`Nq-jFox46JY&uqUuPcd9qdJpzm*V;>2O5RgAVcmK8^-VcDdo|#YbO#_0H<+E9fcx8Kr_(ovaGX6tj!TTrqprVYa};d@*|&HM3RE zt4{q)gLl2vWK!;g^IAI2ZMxp6jK@-Ij(Xy%Q`2)ON}aiidZM@_<_l+}iD|JDzJzam zAH%foa|k|P`yQ@+cSeZ$bJQzeI?K>W>+uy{`+L>SubfJaiy37d&uSzqACI|O5mNMI z87O_t9wr)WHCH0j&7Rucg;h%?cx@%LGi$x3+-qnq)l>bip@hAr7G1-#oVsfNH77e` zF;Z*Z=i!Z*J@X&tJ+IVZTtXa1gFWhxYfhVvRJq1>;kgx!wjnbE^Z61rK7>DB#RpiF zfOmm!Qwp=)X#585s!S0Je;?YMfl>c48qZP7zIOV1&PA&)zIHm9BZxn-Ifbhz+=iHq z#=7C$g!jk{)3Jq<)0C=P>%o^PWfLHUkJ)I04Rt7Q3~PL}h(^@9p5w_(ixjebzcodNgZR-rfXaz(m8smPZ|x92n& z&zsjDWWLV0IB&zmE%M4n_C=Qd6q8x9aJ|mr!UjFA_fQHVGvodsvvH4WBFj=dRfV|t zrH@RRWA{I@CP;UI5HPz#x(ftO0)K`?vtPw-4Et)4K9=qdL7oNqUm~vt_Tu5uO+BzJ z+#DPqncdb7hGenm2u>H~bcihBZs5rBogUzPk@GW3B@QF#1J+$2a6ho_0)dBtJByo9 zV0J3$ek$+3pBUzX2MaF(j}X2WJWhB8c(U+n@J!*uVD`Hi=vDAN!q>qM3I7IOC;T^f z2Uu%9J;*A(d}|FXW>>hKa0Zwva|T)iJW#j+n0+ltcr!-`!`Py??A>j`S$onR&I zkApcX&M-OfxK;QQ)<2Jnf!ReZBpqD?b4@e(8}Msn)Oz?a*uakPX<_EvXTq$Ms8gn! zJTN=%WUB4{5^e#GMu9HF(ar8KQ1M7d>;xwW4+fVN9tKVm9s$-9%lI+HRY9syn>JQlo3 zcq;f&VODfchB>6a08fd<-LQB;m~X@};dS81iDd`DkrT`KEcGNa+~w!s3*!C@@D*X! zdU}!>+*qg^eiS(?y5AzFn#IHLw^(F>ZG6F)bp_x=VU7c*3AX`f3J(F-5FQU^bB%sE zT}w|g1J49E6FKLBwidpZwOB_nuwUCpcrAE{@MiE>;hkWv{9pu}*BKJ#XMCyfDewcr zAA;G@rF$wW^jtFVpJ2`<)3clTseD!(nJ76g2nWDNgxMdY0*7Z|u!Nrx&IX?st_Hp= zoDZhjo$je5)bqr^`~?3c@@9x18k?{qz6Akc7Oqs`A>a(*N#M%D3&9+%Vg$><^@LZ0 zn+vl(=p?)o+(Ypr_ zz%7I;f%UX3$g6_;h&&HGK$zuYm_F4Ej#xmr?uh}hR^sjyTr0~v3kfq397v)(8GMg0 zKRhdinFu`<3vP12>qO3ow+J(?$As&#_Td642HFr7&j>RS&kHvN9}zAFzarcMe43mP zel(v7Gtr+5<9>`Ug_)z@3G)rQPUh@p-oc+@Q69{75ezf~7$n1|7p$jT3FnF&kJ_j$ z3@_oSRdB;ravPDSf~ovvILwush55RMhKr##3=@UoFKm5dZrZQFM=!B)x#EV!a!98Q_c4{U-)})q41AtXl8l?^+i&A z*AlBs$~sd$c}wcTlJ|$XQ7-16d^FMJBG;<7;s<+v@#m^~oj-r7)Jg74=pR;2f@zw% zfFCt~vg=iald3ezODcPdN`lsOGQ zb5-|gZgsO^cnho*)7*FrglwATR*C+-5L*YT<}ny4KTk2{t5AHXI5KvTKONHRs`+%c zidn42@TZGf$)BU@0DpR^3;2o7>4NG`Er<eVjPyKG%8**3#% zn_cTH%Db6}7a##O{6^$mE-~}f(Velfu z!=Kn(c+-Oy{DxuhqA%Wq(t{V7h%hpE!9b(yGoCR4pdP&NJdec4*hOblrT>gw{Gwy? z-fN-mu^JcwzB?F^o=BL?FH!>gpOd*FA%Vd|NwRzBh;C-Mj)ocah0)8CbHe@$CG z|A?C&YK&X6{9Iz;^K&5?+@vyfE(J%|`{E|9p8e++VOp8p5j{Our4H)#bYxA_m@ z?;JnR>znPr3x8+%n?~b%=1;+W%<%JY)9LFO zkEyftFo87{>4^6|_Z>p@@wgn{L89RsgFE(#ntueG`%0<#eQ&OX6WjNt+O*cq4sl+a z@9av5;_wXbgm(-i6m~}6!@ms4G5oFI!1Rv?di>iFN0fgcBwqhzgd6RjfGRr1&r_6Q z{qMky^D7e z)J!b0)m#`{uMV$sE1SQlE9=}kSpJ^2-mRQg3peDnHb)_(t3fZ)`H#Z?J2havTNU%g z7URd$$glRUcXRR1o>}jv#W%+NLJiN8a;b(ts-iczIiA+Gs=fhXuTz6JxP_jetsdOq zW}9QxfemhJ^9A+y26v%?O!2s2kM6tp4c#$j$GgU z%)TLH=*;g!;egJ3I3Ms0)o_!W-Q;74B5LuLWKoOr{Hussyf*Uff2ze9g5|qkJ-o>+ z3LHTcftmTpI@g!vQx`Y6h2|)gve|8m!Pp_2-Nt^FuDI(%;G)p?y4tbXt>x+NsE;<| z{*I{|o86n^qF@)7WyT_=0l_M^8o9;2DYPH4#1&{Q;Jn~aBq**>8$!YNX;atSho?F} z$o5WL19LYX+QK096>$x} zpiP3YI@pORZ>fV@8@x?*-s+}?IL$GxogT&69K0DfAJ<76wgwyXF1l*h+k;uO>0u7V zE$s*%!QZ%^+ORYDAp`BL4SRwM8CqYHuin$aW^~ryq zFyx$(BuND%2PH=lv_SzADnTs+C`my@1p}jq2#Oipm=Prj#;t;hjS0W|UVRtTe!p{_ zKYY)r>*}uGdR7j#s%ougt!mCTZJBnQ(Sqztc^hsrS~44;uZx3V8PEpYG&tL8q|6Dch2E z29Y*=9Gyo7uRr^aL?*WbDynct`I0Bn95r{JkHYHQ4RDy;?f8GHPx zw1zkxek!eQRnCUli6%eQXHA|)HbrZ-Y!P${pH6F2eFuZRn!+oPo;Lh`vOSOCa(=7L zVQ10PX&3n}O>x#fomSQU)Oqpgv_kv&^3R`6JLI=-D1Y&}w7cz0izRtF33n4S>SeF) zbgwgRM_L}XGr4I;TE{{*A-gXNHLfkyiS6jW1ec{cr*@aH?WQ|!pw&6cAIG+Mj#NF6mMEdi2quF_3ukK1w-5ocjb!uQn(d$~v3lOkD=TT*wBghl6UR@Sa$!2g!E{Wtyv>JcCocNu^DpIjKc{U>E)V^g_UPR)j<2|L zFMY^pXgto4(Npl4k79GDL%7V@=9?XkT4=8Bt^p~$=J+y>V-50aSC2E5^f+veCnxhM zQkUz*7{T4(t>SyYJH+>c zcZ=V_yTA3C3?G2GevY0Gf!`B<20kc03O*wK0(?^ZE%;mUDew>CU%_VP0##WAHZvFC z`e4pn#5iEn2!>1;$Si8k!I4{lsaj2L3$7vV46ZBg2`&~712+>-0k;n_`a?}INDSyiOoUlwh2E0-{8+?zLFSKS} z1@7mA&AbZuIA6x>CwNnJ8Fmw^K z3+^Ru4(=~*1*Xb7bI=w{Wh-(A@ECDt@RedJ+)fks2G0@q122km%o+&;73dhyRPahM zXPDQBdH>xkUJ8Cf%o*lq#4Erri5>8pVy;>~Am(iIN8+czpP9KAMEoKQpUZ-M^Vi~6 zz(0uDHUA?17x;HEyJ-uL56l2JZb=k#<~dDlx@_?Y$hp#j?!Sn^P)!D|g)S7I0@o3r z1ve5WqAzGFP6M|RbLP2&nB8|bF(;3yRmaGNfG-t~0FMC2XfX~3syLFTgC~i(b>s~3 zT=3Q6dEo2B?7$X_uLqk6AcS)(c)8@u!FP*Sfme&~=02Ean*n&Z7Z#gk!PQw$h#v$$ zBi;b9(wu@$XI2oKP4uZ|(5!{5p^~~H044E*L$WcXbnK&EV zMqCx#NzDGchd3YHS6l;Zb{0UGd^{T=c^&XLaU<{~ajYo}Gi2cOH`lf?2OQ<3P9k|Y z_-64$FjW&NzXoh}69C@|HoFOcxhR}!%XG5`Obv1JKJXLb6JX3p#ryxtxRlJ46dbW< z+bu`c!LNzg%k2|41HUI`2X;`*+2$i+P8gpQUjzPDd>8l^@qN7hf0tn`EG)b=Fr|-x z&9oJG3)oCsf!XnJ`5fJB1Lulg1J@KE2Gb$+*|_2RF#SNX7B{@N-))!m>|x#&Jy1TzDCSB)`jBdz)QuifMd&K_#TFp;?v-J z#1=}2y1|Sf1-wz50e)1R4c;o|^1SWhJn(KY8}#eqF5q|K95ZvHAIO4pqld%;!Nn%=3!iI=LoLL+$LqqTwF&oO2Vh&!pI}3CI zn`tp5Vk9^wH`LZ$A|406RXiC?wM*uHCfE_r0j~j@{{JQzHpqh0n2(6>1V1UJ-X%x! z8PFE+3*u+MTv9+e>-`P!PVhTo&Q^XPX1!B)m+n8~-0L?oaJupr@sHr&#hfL<#Dnp` zS;<5(b@bB25xNz#>axXo;A&z{G!%-&02*4a&ZY>Y2yG~+G zWA+gD2lo}v0S^+hiiV2s2aghSR&s)PD|iZZZ&(yh!!S$CV&=Lw%6EbniuZz-ieCdS z6Ym4B6n_X_BmNA$QOuE?N5!0p+$xT7DssCFm2loE?us)N;+cqxaehPG2j_Rh{c-+4 z%-kLk56AhWn6pklh_A-^tavfb=Tg=G-wcBvZ@rA{4sfb?6F4G%3S3eAEV!zeGc)<( z@4!XkQ{V>TpTMPJCZL75auD_3PKL%fcM(s+nF}bGpqp^+FJ6xG5b=vR4;R0N^BD0P zIA1B|upPrIP_aPT7WH1Lh$ zdEnc`3&5+yi()X`E5n`O2gR$w4~ZWDZxL?tU<2i8wm_^TsskOgXTm*hg zTo-(R^-o6)VBl03nXlrXiTP^%xtPk^UyG@{{eyTAm{mo;L%_d_F9%Z@i}K;%MDZAK znmA^LNoC-I&TR1va5XU%ybHw(!F9wpgByw0f}4srfLn>TfIEo!X5CH9H|yRZ_Wwv7 zU#$nog8J9gNT8f=z9Yn`cRSBqn zPUq7RKbmm2cp7-Mcn)~I_)hR<@qJ*b^4 ziTSoWNn8w`A#MTYoFWs^1-w|?4}6Ds0Qf#JcO895yac>Od?&a(%>Ew%QAvB3EVy&% zo8tB055(M4`Kb6k@R#D_;P1qItNls*HTbNUV}R$xr@(%UOf%jeV=#neI0LRI{vDhv zw(t^JM@)t7M&dBIg*Y4BNn9V?L);uZP}~7LRD3abJUGTw^o3!HEG`Al6E6hcAYKZ- zMa);|yTtc^SBp1*H;EqxKOue+{Ji)B@GIg&{G`s?GJFGzcg5d9J|Pa{ zCG{I|4e%*3w3b)IVRjvt+@cvMSG zxKw-@xTTmYk2{D*fV+uDfqRR`fQL}`l2tGPhEd|l;0fZn;3?vT;8|k6_g^Qz2Yj=5 z4S1D!EqINXI@g=U+=KIJaqJijFUs&a_;oRLsNWU;2tFu23qB!E$6M{UVvYx#7IPHr zjF{sAe~PPveV83#hB-En%%#jU~3 z#qGdt#T~(&#htnKrl${nf-qNZ@9O~f`bEG7RXZJjtcjRL*NI+5%5FeOz>mkeDF3g2cycx^}#QSsrAIQ zgbbf!46!$5peoS6#2lIWP|U%HPsJR3I41qY)t#dm-!i#ae=UCcp=8e-~M*A+huE*4X_x|#TWaBJ~la7Xb`aF0y& z{~S=_ZW~M;2OkEB{{)W|+jyOxAP$44h_k@6#2kE>FXp(>_2T;Ao5hX5%f*d3e&fhM zmDDw2j!-g5t{H3~^Py|5uVB4;B}R3&92A zTHxB^+Te!bQg9P-GjL0B3vhdJD{xnFTkyr=_TWnlqy9U=aH%Xf>T!jbV?1NU+z8_; z@htFk@m%m+@!jBS#SegQ5U&H@EZzXVL;NuKu9yteWV&DcG{JWtFKm6-S-c!`*! zE4PXdgIAE*|5Fjtk;N(S8u5?d4Pp+pJR<%L{G^!bhtGp8(GmZwJp8zYks{=Ii{8;sm^w-6l?q!LUk(AoyN! z82q5PD)=FBJMd#-zDhqO9uIy|JR7`Md=2<5@gnd6@iOp7VAKCQFnlJ92f<&8H-b-# zw}H=yp9B9X=G(0gx;3ohx53Hc1K^PO5I9TxIXFj*m)Mw9Lx%5R(NO#oxT% zbL}8b2X_;P!M(+Ni5(!W3cgItWf~*I^}*u|qyC%1FkKd{zzf9f!Pkp>fo~G`1K%#b z6nv+64ER1VUtHIUr-C0A&jN1|&jCLblVKhV&xsd+cZshD?-kz!eoMR@d_cSk{E_%> z@Mq$C!Jmuo2Y)So0Q`eEwho40WY_@yUHlZ7Uk75n?gS@^-vFnJ-v(!j-vL(^zYDG| z=G$`(G4;snia!MxXRH6`nw@5{;45}(@o{iR@kwwG@mJu!;?v+k;{Sk$iGKr+5&sFk zQk;eN!D-^Ek-->~m!Uc=t`+BlZxGi9-y$vnuMjr_-zDa&_hxc+qY_|kDSz>W^bPn# zxHIwteEhnVvyG>F9Q#9@Ry+N8Ds$HHROI}~Q=!xTBb>&RulOi^un!8>-yDSTJE!?4 z>2rPAe>+colHMCq=;HEYi2V+w*R{7f*B(kQz&63_4yD%$JTM1M*Vzw=FXu+H1#t4G z>5)La8}XpO>c@{WoklR)W1RM%rq{xU&L;A-(OJRM8_x4Ql{&|93KXtG+g;V~I2LXl z@MSo~pQTrF{>%(#CY3g6)Tl8&Q^@b(HEUX2R_gq?GO5U}SbkYn_*|&cGPD$oTHx^8 z?a*P{-{U2xhu@i65U!fM3$Kk>ZZ*+aRS>RO%yo1=E`mC+aFbY5qQ9~o8 z%@eQ=`%{}x!!^PgV=FQcF~uUBKfNx(7ujpkrckAkN8x#XLIvI9sY%hI(R7+tRj4p z`oW6)3I~U*2xkgPBF~@{3nP5WKyp)%p5U}@a2xgqS8$X!vJW;30}+m6*%7WF-V?JT z&%p-zKfXqYBe;11Oes+$FcRF6jZ~~E!dd-5C%p&`aK^Ezfhu{+Z)cnb0(`pCEVo7Hiq6pR;Hcg?T*RjY?S0bWR&N4)P*@lp? zkuS0t=j_ycBWDRWN?n2f$S>sLj9F7>ic2#1fy7wcqOqyw$Qi~}nu@nOD{_XBm!c#aWYQSdna-*KMz83#Pn^G4zctfGAScrlRhEXb}w;8N;Bc%@C>? zXG5ZUQD2dK`zypcG)h&JNGmMY9+{{g^S$syK6` z6=`7nTwQVI9G9=DIAhjSE7HhVEQl^)G{q)A*G0FmkV=gq7QLS~O-xt|qt~-I%1k;J zN7?^Gnj6E?Xay#%m2q}clw+=uSX*OS7M;)F+8M+0=nWSPcSg%u(jAP=J<)Y+D;-U6 ztE0zRq@9f6fhZ@qBVCMPZInYTSPH^yuaDMYyXa*M8>6-82TP3+=)=)0YSBdc+wI|E zb2Oc?USbSeqAhS;MFtwf*6584ZivlJ;F&0u93q$7%^`a(>Su5xZ0-%WGkO)XH_B$i z+#RjT0LIuUaJDx}y`jiB`xTtth;l3-GQs{DhJCT<0R}hSWbZ(f)BTZ|#_&P(Db~;| zV>lQ+!BV)|6!&M*flSXe#&9^gn$2Q?F&v53V-?4Y;i%=C%HaCXMnsAJ`S>?i7SnqE z%8FT8%vF}TzI-QGStB^ym*{`gbzN<|6FXg3gcHc{mJjh~ArJi48ow<*to?}cK$bJOV7S<^@A(P!A zM|qLOJAmV!4#2QFfa9JHz_2<1!=?j3|8ETH08TJ^bpR(k9l!}s2XMmE0i0lIbVwb> zjDE!qv6E#MC`aC*MKBAYQ41(-2~4(?lEpTW@fVw$>2Na6#mH91G%Mq8)`P#|q_I=5 z9MUw_HZOM^Tj&D?GN3MW4yTVI07i-v` zm_*qXknze`S@wyY?NqNHuG)onKl@XY{3^U#+Mn4h#wr&h9Q&}5TUEb9F!s~-74Uo! zJU`8xS2M1krsHaJokjJ-RbsqlS7Q;_PqPH9>Qp1KyZC6ZA5_d;eDs~u6)hK5HDDEw zx0~-myxo1wfR){!9w)^8bBKv4pAh%|H#0TC$4)b+lwnQqIaL~j(_;+X=8#Y2iBl~5 zKEH{Lw+S#q&AAK33#OCYsk3KU_G*6)7^Ow)M1L*}NxZ}7?F88iG>f}g$mRtWPM z^aYCo6Z}HsKb8kqg(i-LCJuW*jY8CqeZ8^n0Na|=E&B!&>Ij&uT02m>NT1pM$zGj_ zCRfA{>+mVEh)P!MFN%%>jst3Q`^?(E@h^Z9sZ$j)25KDCq?Uv6(+Ncq4+U`EQC)go z0ZCm3@EC!CaOnV!daYUi3lYEBmBd~>7g*n{@w}cn45Cap8)Y`dnhd*!&%>jA10Nk~ z!>$hPoQE2QbBa%LV~^r@7+zP?3p0Nm@v~QR@T9=Bovx;(QPaO*r*pbtxZ+qgpgZv^ zK|Oaj{_OsZ*<^F!HHY3Wv8h;7bO~g;;jpM1fST|{RG;G(&_yLKa5VRKN~!_40Ld!F zYlC&hxvEh(cjR>lCLht%GR-L$)&-_X)iO=8J;ZP8CiW!>KiiiyvHRnM zc3He1p<u*4SK_Y@b6*obWA`^5(RD6DIB!*#t{X#Amp=M4aOcM2aCYn~1kSuJHF>=b z7V*3;HJ8tGFgNAZ$t>W-(z0*zHRGVKRkQ>DpTN3^I(+ok0I%$3$MuhxUOM6|v2jPm zYU7S;K1y@pjyYs`#Y};f)`Q3`4!(*NvnREen-WB?Xw}8fUcD0U&rIublh(@-Ry?iC zO`4E`&z|94u8nbx1&x+gqrUhHqLDTl4#;C`wW{(+vf~~b8Zbe zHEEkW<}4UFQer)ei=sZV_#GX6N=MulByP+>eKtJFO8uU}Q>nGA5uo93d^NRyqHq#~ zZCHx4VKCRsuRRcC9oJa57wo7xY$T?nhDZVrZP^!W2Xw>FKDQh`O;tR{ctt0-a`D&83kHB8a08@69 z682IxaBs0nxjS140%B6GL*`2dK#C1inuPOXA0S{hz?G(VEQ9+38##oTrAxg~Ho!ZL zEg!IJnEJTO*lwVisv`E?#=HmS_JiQ9D(T}^ zubzyFw|qnsw>XMm3eK^HAB^9&(I9FfiR;h@j%XUrt<4$En)rOjLnfTHur4h_IBsbp zMys?t{;qHyX&SB-e3+rbf9-@E=hLR)I>Emn=mia=>xkQV++<(EGz>O2RI{`?aI(aXaoESo!_QuQpS;J6BkEA*!+YGc0;cwC z@Qj>OYUsaFHYg#}{hKZ$#+0hetm4PmLYAALP{d|ItG)V1MuBw1OU~m z7|C*5m0%ti(WRC)f>&?B6f?Q@o&-LAGuVAJt{xjjkvm*q2P@{i3H%mJV_16<_%L$` z%r&x@qE`}Xz{`y^Kj++17A`0m$u?TNm+c_IJd-fo6(-zJMI_gJY9+xupIn4SP|!5! z94!l1t8RLOxQ|yMXYmG%tKVU&(a5RVJX}4>xqUm?1UraLcR0cw>GW+L&I|5h;P6!9 z&v6zs4`=(T2A#W`hpWX*z$L~H^-owrr6yo%k#sVTQcaAlZ^elAEFfMcn-Cgq%)aS} zq%UMF5}H{@mzXQK7M~cIH`t)eD&f{ubP}T15NZ)sw!b3$k%~%$c8Jy4OeOX&1>)0V zU0Q^z*UMpnZt=TiKiY(|72(9oXp4EatPKw=qZKW}1?J(C>IpR#)9sUfmVFQr)TqLX zbgMDfrrDI!He+rDb7?y`WW_KG*MW;4V*MO6apQt9pLMoZpGAv|$9>SmJsw^Ww{f`% zuAIg#!_jzo9yBF(3=TStWt|*S3HB{P@qTK2+e5psh}gOV9FgkV}@m46kvt7&qa{D z=`KQ`NDv?XV&^aada&fR9dB#r`+!yGx$SeNaG9z$_}Qyd@#w}_{Vg7Iyh$gdF7)-XN}I#(zxsz0yvQd9*nhIEH^9$ceZ8Wb9AIbg zJ)<-i+2p`p*z+pyw9Q%3I-FUF_6=b!MP@ve>GW+8jyeZghojN26xQV?tc&3mVL89I z4(Iz)bDU~z!bP!-cr#)SZ!mdyJnjVPxWPpC4$WaSVwj&tET>@Z#NC?gCB`0CHQVG; zbg%>ZcSq5g>BV#F}le$S_^vj;RfTDDWsz&q#;OeL6le9 z(ZFhiv>4_Z)WWlm2iS4!g1LPe;5u9vQ{gq<{4TLddqc=PHL(YJ-%QX_aH%}zeA*6A z3Ym3x!b^PD73?7g?v{%7W>0_rytq57qX!>>Gy2)>(0qC>K*496v-xafhHpecYWNdo#eS&i4H!e2?yaXbv&qJ`xDu1_qI3+(R0e2jq^~68l<;3oo-0mN3 zk23O%-N=dDmz4UCeDC=-xwn%$D3qF7f70BE)3682=m}2f-^sMUpLobdl>b+IYC1 zhqb|%%6*i_VuFXce8Kh1h5IgF;~d@= zu4FHBR$O6MDt^FY!%+>_6*oF@nQIVS-tM%1DqJbXxkgv?frk%y_?U;k^e|TkxPE`~ z@L3O^^DtKjxb9Qq9B*+Ek3}U9clGck9=^iES9y4@hwu0BCJ#UD;g|eQwUKse>}`+i zV-KJ3u$dIqrTM2vp2B;W55MT)w>uIL3WvGOh$EGl)oj@o&+mxqTqd85&7P4kF2rRREE>tQbG zcID4`c&~>Kc$k{huKTkd_TyQ_mDh@Myxo?1EV_Akgoimk`D70py;#@t zQjZ6YUfF1>JnjT%g3-&FucW)~sSE4!vmWLWWY_P0`NiY1#kJ6`dk$L}X8yl+4dCy| zikNz_jF_H(_qa(&yATkU8oPmVzR=Bm4jDDigDZ`>w>eH$W6D)pW#E|WhzhfGgkcGb z3bSrNeLNlpkQL|#^X9U)Pb@nOKR)^vEld6+vyX z8fhsRRmFpgd^5q!7?p6{F#CDj52doLYcY~6&ql65xq{b50(smH<|G{hUGMR`i7fYA zsOyGVPL|(K$oTO%j59Mt)e`GFS}2#lde|Sj;2{}I4}8tdaQ@nvQYlv5V_o2}u1C3o zQ9+@h&Jg$X-o;ieYhsV)9 z9$rJnkHu>jXgS>|g54f|m5d*ck3IZ#2=TkA`7f9mVf19L+iUDpv8m%4nFho_P8 z<3W{Mm#JFoW`=6BHpZTKtOsX;nVIdBD?u-S&p#);=CPm}tn26#vT}UVBmah6&xCJL zd)0N%g`=+f6h!LELu4h0ACF*y&?jO`O+ig{(wim*&~0}!#g}~_Il)Rl2uxVJo2M4 zj|VOgbrbP}M}F2L|BI}ExIom+Wg1x}7bWAzqcYCS@oaFRM_wd(j26YTkmsfzM=j)t zZaRA0^zpd4gscQ{O{g2rRUYO#P*;Afhi}b5{ks+`Xn`M(jUL|a;T>S+<}}>ALb=+( zJ7i_xeUJQzN6xW&H~fEt8BRX8RQ$u^$d8eCH=uM6SM+do4;Oj30U2TO;QCFM2a=W0 zp=A7cjKDcFhCg1HvuL3l%p=RgVvl^KhaHcb^&a^qkNhc*oXacSh~M^bj7ulo$c~XQ zO3&jYn5!F^xU-ZiaesN-C&S*ASM+cdvNBN9Bj@TzH~fZRgda013GF?Ox_BH7_Apm4 zx`ECk^CHG^EjUxWf^sEvorgD(m7pic(YW8IxTF#byUg*X$AT*lDaRO!^`6J`VX`9l z+~fXBkNban+@JBdKj)Eiv7wFeXVd?uz>rA;4lXKmBWUK~)@0?N6PY&)9NoZ~U{=#m zkNYbv`l{O6R(7<&k&w$On6PC|QXZXWXm*pH2gx zig3&ZXM&k~E`f6+SZ+KRC)WKQ`C}g5>T$!>ZLZ%pJ^YTx%_m%Y=Q=v#vG~R#|G^{w z%_BcYR-(B=%`L?oGF8oRR0C&%**;1rSLrsBdz1eT9*eHBpy&P``6v&M_qdtikuUV{ z5|5iZ$x6^>55H28{XgG~aJ&wSOfZX`i@n^G9`*3o9{z|v6`^j}o|7TfiJr<9}Em#oNR*(Dzk9;>-ksb1| zAJ?`UL6}_K1Y~Y@)9CIx?dMqyYco;!epf`Bj+)mDqN465231(yuQ?AG!^SIyck-v6_UCAS_>XFy-$m@CJJ;?&f!__<1>6 z`BNT?7tdQ@8Lo#9c-(yIksl+gcE0eqIqh-tD_IF;m+vN`8aY-oo`ZZCGQoI>vYOID zIcVwe(8VL~>5&ie$S)@=%xNCp;&J~Rd44?J*ef23e~~YVTYTb?f8pW(csLCmotv9{ z4>$I3HxG~UFjwruZ~4sq;fWNL$a^i6% zE>yQqe~g?9A&#HO>IJz*-|etwk#)VlPS!QoBLr4!+(2eyVgAkMGf*5nxRD%-j|cZ< zC!>_(pU(iZc0QM!we!6gX|XuFOZN!dsHl_igl$=nb#O~@KA1Z045t>Di{r?(!TdxWxgPiuaTDhMQW;vn;tFvG z@K|vt@Kxe2U@rS(K)t|o#eKlniu-|Y5Dx<1EWQ+chj=)c`?y!&_DLgP;MR8hOf`#f ziA)K_+(xP0k|ZyVW)}NHYNSy$FC74B&hVG8c z98?hVa>^F-5~?OH0vC#T1(`2hz;6#Q_v~XhOi)wt5U}~u1>{4)9V8!#_^s|TOa=E9 z&jxd!J_d9%c&PYx@F?+pU~aodH(S6{#7}@{i?@O2i?@RpiJu2^DRPXScfxRoEOvpZ z98LKi@crVw;C15Hz*JWCZi{Ao2E#41)UVH$&Tl_xQeCYyyKVtvCPZpoR;yv*( z@ImpHU@m%LWZ!_zXD`5~!QV=L4or;*y7AlC+eMrNHebDfJQbXb&V_EMy-Q7r3K=N> zC=5|qaIr-daS=FA%(d>d#Pz`S#r(2(V{tLKxtMDQ+lrfkx$u_}bLn_5aXWBdu3@1? zHyB2fF_g;7Z=x8NsWnv$D~pSG>4v=mun)yi0X+{(g_{eK`54Fz1I7^nT-a=#~zLymw}1p zCW3UtM)b3|8kozADQA)XEv^ktNQui?q!r1yyTCgB@d+>!YCb*zWJ5TP8QDthrnk0 zbS5H87K_0-;-%nR@k(%A@txoju>&p>uLW~a8Y6oM?0#fo6S%MBTfu|G&#?a=D#H#~ zj1s>D9w*)do<~NRvua{ubeh%@F-Afxu4tqiHdyXtNM?Pn5!V545VP(dF^sG?hv7+C zbO-a>4D>u4OeH7s2=E>;J1Z(YQ9cIDCA(x+&HLhs;7`P?8m`5oo2lS0#52IB-Q3KA z;XksN1O7|Q>fq}(J+nHvzPtjm%gcW0*?~25137^9&an=`wn1sXp1C|fMezZ z53tCBf!iR`1G@V72Ohwz0`q+ba6Z_4-vP`9wL$Ldfwz-$RH@B;!xQ?M4&0xgIU+$c@~Q$37w26~s6x7XET7WD=(BjBEnbkFL0R?I8t z1u^f6FM(rpR1b#tXn{&)1P8^erz2tpbW#jw*0*Ao&}lLIk~3mnmK=#_g+BoARyENUI$Ctn+=tNFQI(4NjXzk>2)A&TWlgOk3<6fzj7$vD2U!=MjsY>u|Og zJNt{VdD1@Tq7t~Ox5SxJ0_ig6MHN=p@~zGhoZ-2CQ;3HwbFOP@9Pg*my3MK9493mQ z;Jqk8r#*2iO0%ESexse~ENBsl`0Ntr_7;(v@c(QJY^QbDIn2{DPM{@DzdH4K z+U*R)De-aCdQ#ZAzGWoeSM;6paLY)|z%#=!VC1~pGE(4Mf0fzPFs)T25_sk+G-R`> zVJVH@!FbFVhr;Nye9n|sh;yHFSF1=ZU*8007mVo#uf_ucSXKL98%9~UUrG;aBE#&>nJ$$!- zd>^oxW4FTQew=(sTo&T@2PRILWhK~&6MPWb$<$j;@CEpOid_#cqcAz?kd2c+z%QJ@ z`wIb%Spt&Lb0zwhFi<<0JBTOxSHh6AguR}Ro46$;^dfGBj|6{b;w7oT_-2S3=^zQ2 zwtQ(Oo(Vu~dq|~nYN`Wz5GxC4T}`Deh?Zi&Feo2tV) zxFiTkFvk6i>|kwJ_^f2U(qsi%a&sFKMxYhZN*M=7fi`@=jaX?6mY)Yop9;V>fpZXk zpd-Uf%&K zh4<@%oG`dHSRK3|xE)UC2f1YAnqV^A%nQzf?bX41kf^!ATfs$hg0)eLvx6L6pA|fV zQkWSGAi5dBiU?wQkb@uCbn#hddYw?k%3Si6vXj$AC?&W`d1(&NpHkwitrM!0o`7&u z4lvPaDc?GK>x4>TnI?hD;nohm1Z!XLGe{DGTx{nLax^*+HPL~a1#=11p~;P9V|gIeZeOYXhM*mG4=qx*p@HgEUz1?QJc$&s@g%n9Rfs|!C;boJzQH+)=e>QiTW^0sRFbh^OhTYLg^pk5MI1rsr zKQ-;fi0y;uHFQ?jX66n?r!#1_8$ ztY1faF@)}ByQ4oV4Rco23)PNort^U|hX@nxN;8=A!M3RtyVAGFeDG3ZO1CTRU}7$} zXTW91&Ym)RvK1U|>>_q0F2e|pG^Px@(jq2qtT9!vD}9e-1!vhuaLTePai7fKJUbbo zWTRm1RZgq=p+fswXJq|QsXes(Zkl2vS?pn78w6zYqn%aELawlnWnIOr+zb1LA;2nw z@dt-=gU*7bpTjQ?+kN7G&z<+%$M~%}elG2d*BD9-Y`k8y9uDoP2{!l0s`7D+p-xRO zvHgfJ!7LK1+M6g&yG4TC#yF#^7RHrTEd!-v&kopkpSPJEF#eCz%k029+1r>nrqN#AsJ8Q0apNj zk1qCVt`dqT;;adan+_tZ>qD;yV^h)Ye?+5PiP#h04emC z!Ok}&q2}2$Sdr5`UPmD;cy(Gd4pp&Z&Y;Gj=Jo(*dE-zt&jfh436OJs`6knCWD5S^+=1+1;n}ljs=*gPB(ZsS6 z;%58&&ZH)x8|*I5=_aA<1||`wSiA4TwzUcL6vO<5Mib^K2APZcYCXwm+B7sG`%RWz zU$YxcdsFOh;+c;v>xrhJZrL0-vhO#x9gQuQD9|?4EYvZ(3vIvf@v*er*#0fsiOoV? z?IzB)W}*3|+-woM!NA@^w5ZpTh+D6F%%x-ZFJ%7(H|)Ql)6n=*XGB>j>O(Yh%R(cH zI8SRQvSFC_OnWuInG|nEiGJqx8hE!Fw{ZT3uXs~!WiGu(AkRPU)My^M+!suBu5TXd z+Uzs~tH}vc^V)5%{sk{W@xW>tPyN|O%{5!oT(dK2F5ccE6t?XZPNZe1ay*Ki#x*wv zE}Y}EXc?+ntAM#UOvM^2h}L1Remc_)`mk}#_xk*+oNHT#F2bdAf6GwkmS%l*p1D@} z5_Skbdv#}EJV|+p%-?_LZw?D5&s^jMcw@>R=~QVI8isu%=Cumdu3)NurE&ceY^~-G zJI_$gKHFZvNh|Ytx@IWTQ>{X6>}gJe)}hLA>qioo!TM&@JFPEm9coywgf%-ck^K}) zDi=R{^`fb+MNCm&4{P&hb>53?MS4v$Qe@TY($smNO{j8L&ZB1xyZ?gxDkLeh1AD<| zDP*se$-=R^9z|$bm2Fxb_;0Iji=1<9LRDjT!z$YU+=akuLXdGeeNgQ=9!}?UB&EWo zg%<>8Q1#K?P0kCt3`PxS45hao7lhp4F4B|2E6xi$cR*MbXHel2fg@h4^FpM*(!fO* zoGf*oY#Yj{*bFYS$MRv3s+^hTVYKsG&QaL;PA8WC(Kd8rG>PxgK5OVd-)LgR#^6xy z_)za3?HBQGq*6)wgM&hgLe8-IcBS%#V?(P0r41)d9X)bV!`U;(&Y0P7{K(m(Cybmi z275`2nLTmJRQG(v*qPJHN}4upICaLv@e`*w$Gaxia$?t1N-WR6D)ffg@u58Rn$V2F zF@B2CMq%(+NM?6|!y%*acu?`h)g>xM<-2Rxs8QkS41GvO55dDMtmjAvj#|7FIIMzW z5E)k|k0shTuG`w|Yb0J?IV`L!!oPv`_0gP%P3`6gFQ z=t(li`*84?+0{9%%!{mgT%Mnb`0d=dVKCaAofl_*-`CEMb5GtP3*yXehV8;Qe@Lzo zXR}PPW}K&@)!4P-{4%*H&U~(?dJm7QU1t9IkWWn+9(QdY&qxevDRtGV2-%ZS> z&|A#vA0Xxk&1K?Tu+dLKIIO9uk~49045R#ez_36T1HtUx7%@f!teeCmz_*J>f$tQL z0pBN{2!2S+_XMM#gmC77jeZh%0odp#ffs>y8oeSIZh&DwJ>y=^;}{v26LZf!E?oXj zjGKV~TFh>K zy_j9aW-&|U2{9Y>Gh#Ms-cA{29{Zo&G8Dq%H8C&cePUj|?}=HY2gUWkN5u`nUx*un z|1E9-=94KSYX$y~xGnfEGUt^$z>t8BfsVR^jq(w=7dRq$e{eR)WPW@G5y;0)9YzGnh~84D>ee)8YrgFN!yU z`4mq#o51gi9|!X}jq>f_!(xsFoCu))X|WRqqlg5432YRRz%PS;m50~C)P|+|x4?Ww zAnyk!i4TC&#b1Ck#b1Fdi@yO^7k`KNEpBqcfPMkj6`uhYi_d~N&OtYSfLn{tfjf$A zTlz_G;|KSVoSHQQ#ni01T$~Ob363#P3`tt!Wsw1%EY1SY6z7BIi5r4r;u7!@aTD;Z z;xh0GF+Z%}h&zM%?NG)GWty0^L57QA!Hac%H*;s)Tw;xh0};#fNv?xz9$B_m!ZX2hGsjQDXeBYs-Uh@TfT;+Mp= zz^{rMfe(lo@yB956JR(6^U8>rJ>US=N{vu`$eizpTGlg`++$4%iz-i)E;ELkT z;9M~~rCQ>F;0EF$?Egz;;QhXZcm}wgcmcSJcrmz__!e+~@k+4KD?;M#0}q#cEqIK0 zGx$pJRxo$VsStyQXJMEliyh#F;$7gS;yvJ7#CyR;uZTs3V*}-44!DwikQ==s+|wiA z-IRmT2Cdh`e1eMYlL6_l-V@gZ9~AR0cSKwYJ}GVm{#M)t{DZhRnC}goVds(L;dC(* zml5Zf(HAbHp?W-}b;N9Fjl{f!nu>9;SgpiNbO$jqXLS?T0QVNx1`iN71YaiRop6NF zD?-FgVBo7R6VVbpL)-?;4T31|1int(1I*2WDDMNlMa+g~^phYT05?;PkC;<=V~lQXK6JTv!7@y&H{H9v(fbw z<7&71h;tEtT$d;>{(Luq7GkaiA+sZzC9VMG?)a2P!3)JmpS4sBD{GmU4SA)wHuxSf z`x1T%sX|^X-kEHa1>3=+VzvYBe9y?(4z`QigLjGtf?pQ1Uf&Q;0>2|>^>Mn1;mide z5-$QDGkQg^xETg+PfSO5f{l(*J^+UgZ$wmP;K5ZfFg*BglDmG1aT3VUq7Y1E_jxhk#P!z z^2XqW;-+A1_=Nr+7VJ!x$)YWIrMLr_9~PsV&fo{c-M|~gJ;9HPnSrfhUUJ*TSAqFC z4~8=Z{Id8O_Wy6la04vf5wi+D5If*Q;?-cIZ-jsz0Dmd@M(}syP2iuzTfl#bKL`8M z;)(bQ%uR7C#1PPF7%Izx&vAufev8Q{AHhu;xI}VH;FukvsDZ({?@2ir&a8goTHwKA zRsna2q8nDhXmN9JY@!UTf~n&6V55`-55vGlDG7WPc&Xg10xuV@2j4G#0{oD8JD4l6 z81ZiKHt{Rq@;JxL<1@F8qN9&s@rw8$_)YO)@P6@8@G&x)v>$Brjl|zco&@<%VsvqoM~s)eIIFgNKPr!K1~jrtxBSO4pE4*-W(2NdmLS zTq-$p%x}ojO(uAyn2Ejz9HRvrj!{YivzvTWj!M8=#q15Yi#vgLhoPIo=cGmH<)Aw+U7-#wu*;$b!JW`?9++&)v z4xa5_oHrRpBXo58oNeo&P?DS)j`*_PadJ|_HKA?OJ{8tOC!$`cCsSY_b5^8=>*(v6 zrK@_M%uZ-pnrrk;cCK1+vU+d`Vlbngy=219cW4p zFj3GfY0r~C@P|1iZK9n&iH}?Ga0aJ<|9bo<&NlY`R>rTNFRIX%sO0RKnOtB8oxEFv zE0dps6Cc*eI4dS3W&X3#ZVbD3cmA4{+^&31dbp1L&jR6)`Kpp1$2fg&5AG>{H5|Uf zXIFLX&XKuxq0@dqYF&G~Gkt2+f93PO%ubi%f$>$F^ zyE0K9jhr9nCs%SJy;1|tZ#M@+|1b5xTbIq3Y_}e&f-lrVJ`2%K{)(snSr6?f^ap-7 zC$}EhvB1NxIQ>7?LqfbBD#q&}_5b^NaON!wra7Z$BvmLs2KrytNI7bxZ^HkwGWI-G zDckA(S$YMx9-IcVD_63cta{)~9eYdpL!YJJ;fwu^60`YA#^=Iz__>GgEa9f=*dZ2dGZJ9(axWA7$&2V^*+prUHm3w zJNXxg6a8x-OQIyvzZw6@zB}kQu7g#FfhOGmF%++!;VIewFi*CxkMrA6e8hLCQ{z~A zO}o0&>sWd=)ZCD>iF~x_fM2k+GwWD-k-f%Qb1c0rn(AS?xeLLgFNQt8NfW%!2^>#v zSa%?O-o#|A0`ZB;yuzhF4zQO|z7295DZe>a9Cw4+z+k8%f?#eup57)N%wu#O!)?O^ z!#j06m?tS;!`lh&T9uvC$J4W_zs}UWehVaAAsYP97;)>ijE2uUPQmBt8!9~lsXvcW zj<{E3q)^@Rl^^~*eNb}JZIJn_o=(QQNjd*$Mh+cIpMTbyVDI;q<$2$wKj7=Zz2C2x zIcvrg{H#e+r;N{~=H5S>)(htpl~+HNewTk$n_0Qej`nt6C#QprJ=}|OBCB>?9dX_Y zB=mK@{V}V=nUt6ia;Dr{Lb8L-B1aE{2`cYs55?kv|t4^I`N3apu8Jc(IL$%%LlXSn=)F${*6i}7G& zZ6M<=NH?rvGM{pu6!R(PS#cEng18cRkGKk$ZHRvPn6_Wc@ZaZNapW<%dM3e;OxUXB>#Gc#_oGBgvt|T4`=4D%fx#DvmzvyEO;HF}n zEPf-8a$XM|#CWH$x`{*J-eQ)-0C5(Wil6k$*X|KwUb5rF%>5*AjE! zT;+N`=rx_D<06^vZ_r;t*$gHXMA7T3qbx$qX0Z z0ew$)$UJZ*X3ZKst-;iWxj2fOG>v~=KK=mQtR(&byw^Mc_e93+AMn>#55Rf2wlCbr zOJTx&{8Koe*MWNKwp*kgIDk`e(N-??dp`@}V6f8+~~CH4nk{{;!ANXUs$J_wk3|zvB5S8NaHL|4-#S2btjBec=;yOR z(k%?_ZFuw7zl_)t@do0$?hT1?UH8ioO(6c9#no(q#7pRwy4(Tt$mQciSs-~PqNvV(8Vhb1=u4={BY^5{>#iEGY--O)o?L8BHM z>;pN}-UmXImDKVI6GoC#dq|{K+6=^<)R8_?PdY<~M7rm^guJD6zZViKr6!&B+ysPT z`W)w_A(6^4j^kRv8xdobT4V+NT!R+D!USY`tXs*)XfWfU;$G+YWs%BN-au&S z>G)hT?6StswbDa|OEU+iIMK@^HA1%`i1aEpThQ*zKb&rtW6jEXXDUur+aa;(oo!CA zex3O)(vaTWUV&);{6ECqXPgwp-v9mS**LR1OV7>#3oJ{9C8q^Z$r;H>az;c1B#DB^ z03u>S5wrnOQBgrb0g*+;fTG8&93v2*E0_od9cLRaThU0q$V zLVmD&j9=(>nr$_-Lu{npg8+&|VY3rBN<&&P7t;YEXjaenu3o$O%PIRBD*V>Q18Z7Q%zBf3~B zXlwh2K0I5{;U@~s{X6($oIj!Ujbtqt=T@Ejcy_@A4V541!ju(El>Jbyo`d=o+U)0t z@`5$v{n{P35vVZ4l^f|H4^ttT5xtFC;mo^mc0?~6R2V7exWX%pRuQ=r9(+BX=BE=# z_b*t<8p)4T&IwML;Fon=!Q#q|xA_;5ZkTvml^b#s6hB1{yX`IBEpHf#BK$*!?>NC4}PqPGgErIRR%WFzO;k;QmBTpa5%gocN$qH4i&C4H?{OaD} zpur@+WjHq{7(L1F@9hb;P4b(BS$uCy@=x*JFE5zv=Xu_nLDeaKoyZwXop(;C$F7@JR)XnS;ew^l?qS$6#d zM2pc|m8s?E4Lw~8l8}}pZSvb)8>~6UuNO|{1rMCV2rdqq&hWd0OLBubGyG&T_j$$4 zEHxnThMZo7LOlx&ZGIIC)634%r{6O;euO$)6YQDc4{oEUg^{`535MzX3kx|i&$-k0 z#QV#N$lg&eDSLx8WEM+=i^S)GcIW!17OPv1SR|}UvU|8tD$;?XNUc&r-OdiKKG(16 zeHv^#*Dnp%iU$8a*Kb~=7n75N+j8Ahq(ftowun$SzJFI`rr#%Am>o===}-4|1~1O^ zTZK>03%pr=k#}!Ub(Y`AyCLYIpQGh-X8DT>bAINQD;#?Df8QMT|G)39jSE_QnOmWJ z=yJcy|FTX|S3-}f5GtX}~VL>qSno6bR8JqoE zC#K%hPNTKLUxdYe@(x<>`?xnVh}VhblTVXotjRz!aXFbw(-s=3Y{=(96y_N zH}flQ(z8>l~N##jcudvEf@Jh3)a;`Az<=^YGSpUkTv-M_6n2T>St0B5;O-Y`GSa0Uwv-h~xl*A`+O^es@rM|3Ib-Dm|Ehw>SQFNW7g3iQU&8j(Zy}A)U8@pDM zcoBBJy5XzvXv=>yc8w!BM3%DG%vU^aj9ueM+zh8&>qr7R9J!$T_v+5IFgUDRg|5*fFi%16EfM2yt+p%jA zN&G$7_0ooQLGiWaIe>pLKZji-Nb>0T5n+jF;(o=t(f) z^H4nBtjh0;&ExT9=BZe(;H#Xou|8`p&%(Ew)!uZ6c?rHByV_Ju#G{t50zYe38`GD~ zyYNx7j&2{BbwqOwA{p89SXYS}@hjMMw1)LEKQFDi`1f!H^T%pcTh#)ekxt)u_ZHQSf_Kz|bVArUTuqrrogRP0Hj?Z^y{i_1|B1_Oa-OJ6Y zw7$%I2EN+dAFneH#GA~6@vY`FvAP%5$VTG*GS{=J?0MAO86VQCqe{^3^qg6{lRhk{ zc-5@FVOGtm-j-CnEjK0zY9xLN{=wpP(eaykF;;tE4Z9jcq1rvvi<+!0 zKWWzazM5HkK`nDO8&|1WTYeL>wtUyXkuX=_=?0Eij}BY|M_e1H25SKRuSY=dmC2=e zoLMIf*VvJ;P8fRKRe4Usi_D$zO0&)p*O+_Zjb@z-ZZVI*cch(i&9?5bgqbAlHmiQC z+`JGUG_S$Wo3F!%%{q6yX}%dBGvAK&61OIL8~)sUH~vOXQsS9b#6{*-xWwEB*EQ>m+T46PZfow2+nf6{{!mW~XkQ;}9*akswN%ENm*J`A z%du<7NLWk7HDttE5=$-5jd->BR=mc%6|cwct-9?5ZnlKIc)MBqx~iTu$Is!1%-X*n zH*5cX+WZ-Q!K_p8zs=ua*C!g`AModjXRG9THx>HE0&MW1AI=Y@-)Sj&CPKmS%vV|;va77%<|75L2pYc6F;H;aslfX4>i}pqs)!)1hYnV zmRZO4bIsZg=9;y>UAsie?1x>uM6A`lR^M#U$fgt6Y`y@yj?jo-jPJGhW%vQ}8vM9< zCw|VXRp$CWW7uc#yB7aB{@DB@{?eTKg}@05{EmM%>+;BTghoLb9B@=EqzTQ!t|K(8 zheEC+G@OTByF{$pv6_}Yfg6}BV%HXtJXFA{Eh5K%0#ymP#)w##R<1E3u7O=+L|hm5 zv4Zs2z;%Si2Ej&@?g-87Izq!-hlJ)UKjy#C#pY^wrMV^J4_#w{_9SdHYn^Q|565?! zC*d9DDR_^08s2X{2Oluc#4pP};P3T+_-$EV=HpPEZghybp9p=Y1ZqQa@h@h6LVuYx zH~QYD^6+1}BQ&66dqs<{iCy1k#Mi~OExrNPM>jQWW1MPhfo25So3$mo&d)xjyIY_u9$@Z?N1D&Tlg-2MO!H_w z-#i&FGV6{?Z_8=~I<8!5o`J74Yr|ZNQ_3`(z-CLBi|;h+;IqqoF@DIr3Li4xi=Q{^ zdhiYNWB5Ju^Y~NqNBBGQ32pm7mH+9-TPMT*%%D}h_yCWG=JnzOV@2~hmvCs-f~XvH zsghSM_@!RFlxJYI>c?FZ*Ln5Hy(2hCkSFNz2E>*w4JJ2;4+xhn4fgO$X0J3pFlaG6 zCo>pU8t+GIfLn?1jt3|B33px|bZtnsIlx6Un1y3}NQ|r=)YLejKiAsqZn#6rt2h%LJLDsx8S+%bB zwLyx#JD5Z)HT#$I6D}MP>}e9OAI^O~ILa^G%6Uy0W z+qTn#=Zsy=yx^isimR_1|64NHRX;1M{LiNGYDJ@T%=B9D&+Tl?pRv?V{)M&S{++JVedKZFrI zYM{?F-9eKlsNE~xAf}#tv%2Z-AjadGGke8*vr2F26)zgSfP-UpKV6#BZt!=eJG_*b zoHpAjDyCb7%$#yZCo*fnFr#p|iSr$Q}P2WydokqtuY7U<~PBhYIdsz@wo8H9l`u z@DmeVx8Mg-nBZqvFp)Xel9yrD#y-Z zCcB^mbCFX}PM+KX6&NYt*=>sRSp!CzS5TYf&Qof=yAf@tamQ5MM)zy#>!(1s-Jt^Y z7^P><`iejhBU+ z<_0bLF%^FX!}`U0gqvgsH};EP;(Zd-=pXMDZX6A!_m7`epc%~n>2yX`79Elo?CKwH z7A}qi@Ac>SRGJfH4Tz7bFpTl!*Y-YOtYed1a)Vg|;v-5cDYB)TzNJaMB$Qv~0;yzo zrL^(1cP>kg362klS1J995#+abajTPRvy$J*1+Gf!9w5K73tXFgCTKb^UM2M)iz>gH zcYp=GIk{GYc6WiBlM`8~`8{1=OY&kCVt#LLJ0rR+`IQ3wTwrVRa*csE8z|t;< z;^~X?+mgCz${*?iJCbWy#reZsU{~^NWgF?S4b2SgP43lpGsY_;`~KuY6*tjaPuzi| zo}T7U_Rb>kc+y?(PxUg%b|_gzDbu`1NqHu@NF$o=>8|mGq&oS@pX+Awm1HZ;-Fz2# zE%{f_a!|ZVxNjurH;Ci-#$f)S_(<=i;Dtf)y55@L#GrW1SQ`z!s+i>vsgoa+431ag zY}00Nyph)8q`@cG;)j}8w-&b#jyGd-dTVgJL4o>e@ne5#?%A1x*pPTvuRItuBwqQ9 z>Xch>nigL;dJl77aJtr6X7o(Ox0iFHo8=D5lV5nj?5UxGj&ect0p_)!lk7+P({^G= z{It|~7L)hBc0x}*50|{f6npRM09B#~^xpf*Uh*Uh-MAnEKTzHpbEZs&XKFCrc6uLZ z!!OZ$V%~>hO}df$SVh+wp;A9lQS7q%$Qw4hwF3pPF=s`0Gpzz8lKI-x*XM7VqZW6O0)aZ^B7=^|1K% zmRdAk)f^S#v2nGWs5z+W%GODzWj)PjI;@)5mdAq0!{c95$lx>M4QsjF9b9fbeMsj{ zhxMd^+&7*XZyoL#4PH4j{$Y4nR`~-X;@O_Js{Fvncn8m08vHgYUhLfwR306#5!WMq z?{c^G)?l=)cL%+Q?x^P;-j!}gP~BT=H`1%zzS*5{r^lHt?`jtgwRUUZ8kbphVXdzU zwvLXMhI8|Smqy1&hpXlUjmE^=#uuv0k>Tyk_F=}_dRF<|G4ZCJH#fLtEQhQa!LwtT zzKKE3xOk0LttiOrlA(qBFw3^}9oj6qy70RSmnywmh6;;t5!afw1tZ7BcZ5TELH79g zG>VxuKEB*LJNRaNye%_Ze?q)txL#f`Z9@E!a409JH!*%&p|)4=fLjrJxi(?N1V<*u zOSDJ)s$Y&_RVKw7QCRm$@eSV5;Mk;iFGBSu$3G4?&kFLVa1}KyD`+z%Uc1 zYpGX%*8KS)?`W1Lk7s#b2J@%HN72kKcxg(!s)qPtN}Sr*obv8d<8OGpWmIiiyg3uw zcUpXnH?jQaw0PKy>j>xd%hhHwmnwix6N9hLj{gz+k*zY;)6>zm-{Zkg)8jS0mxIdZ z#9M?%X9a!EiJw-h8UseS1Y|?Mp$@kN+IgyIQmW{b9UAalu=SjH^GdI>{T6o7S?O)% zdY{!3>i@6c^K)2t-SdLPjCf04!0It0-YQ&}A1s=|C1~}m;Mp1R(~2js{^A|7nFPNc zgQ|=wI+lk9x5+85ac+Eejht*2XgKuX|LMhnbAysEbL*CmzcT(@@_*kLGid&OevR^8 zTjGmz%A?!j&s~~&T3fGXm%sa1Bqy61EM|$FY+mrN%xvmU^LMftK_Iim>F*_37q$FV z*TF*fnf#5_4s5LjT;EyT+UReEwl{U)qQ81N3h17YzYpZfX^+w#sVX1-Hp#lJ<4@Np zCp+-Eg$X#>f!8y#?jiX*Ay-ekJ2&wsJMhwjTs2duNz$9DYF3~D0X2Y=8{!Ymjq&GZ z-GF~%F2g^X+u`5Mr(rzkM$}}N&#IfjnTnHd_lrZmhcx=qe#W8KI<;Cx}bST zW&_h^@wmAze%h>6`GUC#cAr-ye>41+#cNgSZ6ccZZTizMNVO;Yg{5`G-c?2#n&%h^}wOoX&TKpBbruiz&Q|I*a_Ui~Vu>>8VPBv?~AD?X2 zvJZE(JP+dT<^%W)^GkS;`3cyW*rG`GHXrUZmx=T*{@;iVRhf?p0_k0aK9y}V&-X?U7kHX zbl9vy-!khk@~&Bher~RhT~ir`EycfCyjJmF=I&TM|LS5><)kWGpay~J<~q2Jxgl<7 z)^^m|+!mi|J{5N|cfvi)U9h@<)ySse!RBdrMB1s)IRw;>TbbtKDQ4YY*lSp6aUAogQM%sjQ9@tON;M}U2kT@55vD${0PP$`pW`iaVERH3Y~;q zZ)SKZcD!3y1n&ob}F=b9hFbIk{_nq6zg4&jT<&*>oO8sm_lebhC^ z!5`vlEz`$1Fn@|~GXH?Lnt#T3o3lM@mqR&vUhCTB;Ck4#%fXGX?j79M@tP8N&IVRP ztixvY&-IpBH8}qB^t9{m&=HB>(c^LlLd?xlA;E`7eB)Sr2>9H>=5mYUnhfd3d>5%^dXZgyMDTzuK(IuyuNSQ3*u^Hd;b; ze2cjz)+N94)WN&VY7F+Uxe0#C+!{Y`Zi5e-+u=9O6R|1*Rpv~!xBAcmvq?Dlxy3p7 zgvIOqJ=ds*0hVKR(XN57!kL@|WWCoHHS5)lxOqK3`Q^pU*tO%~@~{aTtZT=UBG8h6 zYsiCj0C5d@u#VfERS@oidzy7RcAr=zUKdV7EPgN^X&#Bko5x^Pv#OkNc!qfbPR+5v zYyu0-3-A*21$c$|D!kgf7OydH#OuvEerz&t!CTBaHr#1`8M}r*dfxIHfjyS+Cf;w> zRg`N4#8khF4_W;C_&M`O*maRcp3m_c7XLMV$EopAJZ;D;ZBCP9xyDVNCtlDNPPgi`uc@%!oJOe*w=Cqy)J!OF< zB)n{1j$JDw3R;biS-dvD56#*DKR2(#-azIy3VV+GwtXx0v;Hw$NP` z(A4cQH^z^ewZ8Qs2^HELzhZ8Q-!zxuW9HMa>r##Uo$%)t-yORaN5uESyivjNpFn>C zzgwn3SPl9WKNRPfhvS%8N4JFeZd}E@6RRdt!`_Em$jmOAK&Y)bhTEH6d;hK$C?cVc zS(nxBdyWjO8)?@P32RRoZ+Yrs*Aj_%Eg{$K8rBk8V0l_&*Xh!-elHcRqwDVelxz)tSxzm`EI<&tU2Cq-h)+ntYORXA@hUyIr9OWdc^{d z5qQIV5WBwC7+8D6SBkHkzWe#!%socBRTA+9Sk>0bqXSN!SsPv4Tm|c!M9QQ4i|T2o z+!;^b(on)FBs4VZ^4T?4B3^q(8;kFWPd973>0;J))61;wroUNdKi7(hawcNeT8VYd zjuV=Zr{h0?8U*HO0IdCWp}7%WV%Bcv4zHP8VAs7GdD`IjExr@})O-g1+T0Jj z7ER>W5>ksM_jS~X1YDCQ5@uo7qzSLWu1OPKja`!_tc_IF>6++`Snt=!+A!;x%W-4# zgSe$x+g2O%vpW9wR)GC&Itc^J=iy=Id3dz>d_2*70iI@FhG&{J(euog;|tAK;iYDs zJ61Zg{5KG|!V>Pm>&-jyE#|#=yZIq}zgc_7Bjy*d`~D*{qYIXQTl`n}EwkrwWHe{u zuUva822c|vJzv$5P-~*!%)0Ri#nSN|akjZL&NuhKmCd?$C^75WqOSRJ+{k<-)`NMC zE2S42+gd;^NZXs&U>pyo9eezkzQte}-MNC-Q%VU9%_r6TaW_=tkv1b7`0h4YS%4JY`ms>gUa8 z>iYk%1xAtZrde-~95bJVUB7FL>|Cs8#hRPB_#5*={G(Y_g1?*fGKk0FQTdnR9JB5t zVseTEbqJHNgl)Kr`CeSZyc^dum*d7}o??Vrnjgofn4iEM%+KI%=I3x9^NTn&&;qX# za37Uqf{x&^7XJgDY%b1Vy_!q#Y;z;Lz}yrsHme$MnfVmF%G?!Sl{S^21g^7$O?ZQO zGrrk;8{TTxhXU?4{~PZz>oXer%x~fY=A+oPv0}#F!_QcJt4xlnuDulrdNb@TOVFEP zdbp%@)){|fR^R4YllU=-rFj&_?@`KyjL|@ z^(=4zH!(kkPca|FUCipiskd40XSw!Sj37IU)o1Y$JjPrRPco~nXu7#Bo{dwQ%N7I{ zSc2LtEH+QU%gn0dS!JG$uQD&f>&z=~U|x;ymbvR-I@9g8FqaRZeHPF4K`L~>0-QZV zkDGN-`l`$|wXWTcn00aSA2T;Pp^weXL+EpJZTyGKc~<$u{ByGZ=3KM#7dW&3>$*K@ z2^w)#b4^^++!oh2x5G`$J#Z`YFx<{O61O*x#sg&vuZf47>)|nKZ>a>G?IRX?{0s|5>1TDYT|d_b zzv`!5&}RxiuLT?Rvp@KppK#HZ;IyfQ189AB`BY+m36Ag+&fgw1I*Zu$!J@N>y*7AO zKkb4l)A-pDoWoDJXixCaw8DjS+|crDmuI-$+8L|j|FV4|YG4CX5O&x=kr*4w4nHo-w+X=nDieqIma=kW7daH@W$2b1{8+I9`= zD&16XYOwp9!hbf^tDM=QtYs_LMa;_bdNT?ik7f_g<`zFE_;NvE@!&r>BGUYB1H0(| zG{39OF`wplF)Bf5ewU#vxmig?=H^__YM{3sou}xgXFq$n>viuf&{|zH*vqjUqY9zZnS?$G8^hwIe>d5t6u;KY?NxDVy78W*4sSQz4c8|r%t^QK7 z`)G3uMc?J0?7rmY>O8DkRb#ji}%*CAi${-YsZwdt*Vy~|S9U%~J!6TJkRJ4e;9 z46}B;hG{^`vMk@V8t^|MChK6xe>xmAy`ZpRL7eH#O@GxidP5{QF(#){OmAuDzM{pD zA1w(kyP&XD>J_M(|y5+nzb9?kKTIpo@oMe{wa_sryC zI#0f97JBU%X}_fE*rFA^-UN0e7irL{o;IXiN!_$YtGU4A$x}5Jh!&IN+l|4 zlncdZ*QZGv<6TJ30YKn(FNW|OcqW5bX6Q(>F%=o;=;1uB7tYYw9BEZ@x5t(A~=Oy^0v(<|g`@JWM0VjCPRE)Kp|g zztEjk{zwJVect4cR{6PZ%=u&FqEO^~O6?vyH&2_w;|vg+?Y7J4H!Swp962+3I?Ez9 zUs-aaQTc*OI6pdxe`AX^W035_k$W}J*(O-yX*;^63#!pf=rOj6B)4(DkE+VTrJ zilO)%TGPG3NHU|vgbOthUGH`u;wb#2-Q?^pUi-XQf+0s@7WA(EyxNvFV zp47c$_CD-LItV?%|K8?58Lpl>A@DvF7od7wnA~)}Ed(1d1)pg=FA%7|N>k^8|54CQ zg$w?rU|mgx3+m1>JyD-)ghL3%>$@-Txv-uG)!!IAlqxLoh6hJdg|)m#gWpqyePV7} zDtVfi>K6xtmlYOqy)a{0VR0|LR_~4Uw6LmYXc9+yD!RoAwgPXor_VaHcwZA>R%c7* z=5s^d7&l~#0l|yQ3hPvJqZ#i;(?V5tbWf$iLM@MG2YJicXFu?QF3Sr`;;!^RTWAD~VJM)9=%7FO^Ie^OcVG{Ncq zg4(YM)~_n;S$i@A$Cl}s(CJ*VM6R#T9Y>YcOi-1D%x#F5HU3ytShMV9VsdM{1MN8F za63eoKNzdBEmo9JMRiV9&f}j@ry0SZ%L*%2dXga{>y&uM$)ZDD9u6+LtgyIJTb4+C z;_alpsWc(f^`cy_nIRu`_SkfX;D;m{Vf$}0+59Icr1zwOg^N%`arg?`k1W%Gu`6_Y{dpNk60f4Hr% z{Qvs7&0xc?MO-dlT)AQSSKA6(cS-GJC-qn=`ujmo@@Opn`xZq?Dlg+;_~>D~Gg8 zD!v4(qDrofkDHrdUA^czVNIOHM9cNCo|elEu%4F74RK|2V_aPoRZ3_|Ku^Nu7FbWh z+uEV8}P;Ez4#LIqxf?3lX#u^1+0rEmGcVLRg&u%;#C57Si&)UkNG{Ut7HxE z0agu}{4rJynfxg}X#NVnCUf~gQs}6e$3~&|%+zOxbp5P6R1u^?$1PBUgzwC?@Gs^% zSbeQ%0IkMhRud?*1T9k68jgWC zVb>ZC--=ypIJ_0R)^PYv>{`QNUEGYda(3Z~X5D+tm)QlhRMeNtNvBd4VEA-vI5KH3 zaIN8RCG1+m;Uer>!(r8~xYlsE4tA~Ka8ta~%2dUMYXC?5DY)F?wIM$zvm2+T5_rV| z=ioQY=i+zF3-AYKJs#b{k2{$sog;!Yi_E%OU2a~1FEd|@uQsd0h;?Q)T-a#75pR`KOog5UxL&8Q zo&)T)Ob=l9VNl}LK;dzVe-67AbHwWk%zYOWzl>dPRQTW6wWPyGv1>_()g;-qq{F&g zOSz_W1U@9-n$qDqzTb(iO1&>l0{Zh3c?dW>y2F)65-kXLBdq)2zF=er6qZhnV|d*Q$<@^~2*W zejuJ|9*k$W&ux-v7=byKFaj?$Pr*yf)3B;yHTSwAS5>UM0IxAG#JW9Kye?=rne~uj zi&^y?cbacY5!hjYt$2_509GxK3ObA*HS2c&kojZmTG)~2OZBc6F0@kM4`Ka`kf;kst( zD^j6G7C4`T7Um0aTeIpT+M9RbuI4>hbqt!g7x4h|S6HvZDP9L8*Hsq&6;HDG-|^Yb z?EhhQE7yk>nPPapWl|-~B6A$OHihI#;!7>Q64u3`Mpg}9XVyV$gSi&I*{tTjTg|$_ zzx!mNjS0ABcoftO@3TxT@By>xfSxex>BuwY!T2TfaIE`lP0&bu)I1fxXI_LqF{gC5 zfBa+se`nT_?HBV(oWZr83cUhH&DUUk3rO+TW7p>v-huTloZ@w0b6sxXJ=itX!}~Bz z_0q?G-HW@XdL-y5*U<*nk*&M=I93&a3jGETGXI8MKU>8AjVD{YE^4Qn_0sNavmWCt zFvqq3FSbAx5|){Dq|z%#8d*JjmAN6l&aAt*jb>F`-D2*DU6VY9?TvR@{2;v7d>(c! z@^t*y*NLB30+-UddO2(^!|v;(#OwTh%;HbQ`pCTU_rjl>``~ZP{jlC;Ql0_$ck`K8 zm-vcTEkP>B0%Hio%zE09FzcE?Z%t|do%?ljDqn@`nXkc(&AK0JX%N@5Zi49=;!|NuKiW z!zuGq_|ja~zY<;}aHS=@iPxGx#ew;AtO{o3KY?#I>n44>S?{plXHH_hgQ@(L@WW;* z1w#kT)pQZ@FAM0I&Wq+!{HnPnK4Lxv|HphPR+W%O&=r4aR!hqh<_TDp?8s+Lwzl9UofdpVKR8Ie^F8SgTEBckMP8)X*i+hNEh=H&L0rG6iy8A-U_N`5ZgVN zrJvQoBN>TX_(0mYOhS8uotcRX_^FrWLg(veQ1Db%qA@=wvJ!Q?&OycOM1!m^+j5hq z51rNVlELBOIhBJY*$I8`>}sWs@5;Hzb?oqhVs{0{6uXAl%piUrH_*j7ME?>r%}F$f zt?$LP11A(+de>bS|EXFyvv068Cs9A^4|agd(jSL7kdsLK^TSR>nXTKjZ5MPr9Io%} zDzB28__A7F;{^L=1_y*LIYEWGiQ-|ZpW!J|Yi^PM=P8m-QR>7&KjEx%d`@5&un7PA zg@LsSqoP6QdWqgukFj~?_L)jlDDoEn=Jve{@*wG<;I?{+MpM1?}izXH)7>XTbf>W^?EX$>_AA%P36O~iXS8Z{4*5oXXcN3Od|@D{>Ukpho~Vh=N= ztzzdfeBIb#Qkb73EUElCH;|WM*3S4^1MMYgSyoKPSudtb_k*EWJ7$R*$nY1Gl)p_4 zPjdB?&Ch>Gmt2t#7$pCI7>YDvYVsdj4l^VA>}CEldvN-j1NqO((MVtVAZU=Notn!e z=O5G3R(BA;Qf&SejF687=r%LhtHnp9rX57_2W%l!lw-29NTa z`z@pA8v%E^Zv<3O9ZGDHr+JKf71svwhKXu^7uEqE3(yrN2j=jjLHmY@y3~?SYM3Ys zpB4>*hK#voe(*v=4i(3PZyP3hcoTxQjS?&C>zvA`0(6Pxw(Wv+cl)8RE@cWj93(!s zMq%(?qr`acmY`GPMCGdLD5zkfhTzixXR-$QG{7a~j@%#2X`HCj@kOF43~{?rL>~{S zFidMHGqRegJo#mS&nV;n{W5?`$c@ym5FBotI6XFsbpHaKM)M=j2349Q+Ju|LfkF})y@H6|xGfy6ct28ue+$o)3nO1K!om@9GBSW&u5hGWi4SFDG)tUL(}GUT z5=G%;K`^RWqIPUGr6;;+Qp1rig4N9u%_oguxg~mQdFMwiWNs6E+_I1CBqni&oQ(XT z_`Y&cL>CB&e)=Xsaby%TljyHDu}vb|lz%{9JTtP5e-i_>j*dsJ3W}O1hNT8E^P!k} zviD-Tb~c9cRd%n+>5EA{Z=n_km1-upxqkK-SUD87nev5U{D5Ior;(JbcDx4Hp} zuL}NZk!V=eMIE##4RSC&NHRC*(lXJ^*R_-PTvk2C!C%cWL8@hQ}79 zjp$=HR0#{6=OeDP64eWMpQe46O8G49yMuRICTi7gpdyZEsRFn}%~idxveY$M?GbWz zcI{?-t+G|3b`|w^>s8Ly)>yKWh2|AyyJ1!aV_PMPY7EiRT$rt8P`yNtbiHLR;KF&i z!Maw7dR275^hShrh%9#F8WGmGN*)Ogw@Oqj7|+V`CWLb-y?V*|;D=U;)@Qgmyxh&9 zH>ANla(kC&X(HTTX^95e;buq?RrufAd;O8=e!QyARF$uY?+% zp&e&?)1cvX6O%?pq(K@<~rnB2yDIioK`J<>k%WC02WJH{5YI+$Bs_qep^gPEFJZ zkK&6przVQyZeqU6)Wi&6!7(wFPD}h|gUxm))Di5x3|6asqDFH!XY)MG*_T9X&gQ#w zU_KL_p0fp>3hPFg!p>`-_$EAR8d<%Ho_8f}3ya+ZRdgknxTRRx(?o~r9@ir5=XsC( zH&;KGE4{V$^U_LbALfQM9+^@cC(Bo_+gj- z&6+36Zssb&GkT;qh%0-X+#puE4dNw|S%>?3Brf-g zpU{Fo;C4bL*gZJ&HeX%GO?5D?SEBMTH?@zs-F79bkRy2JI?{7=xz_U$&2arJ)j|w% z8}&errs;)QKTB)oE(S?&#HH?l^D5ysD}rZwot&ngS=z2XQS`X-AA2Q+dW}!$0Q7!X zJDnb3?BsuMb8-EX1;6i>{BDw%$@zT}_odvH(7{Egx4lkbx9wG1t-0Hmsgk_C6p-FZ z_qnB%&bi<1S|x5jf6!$taXZ69nc5j@up>O2>5k8Ck2>HMV2N8nkGLGwOUCO(cJHZ7 zZE0-o*J$EvhrOf!9bN5zOjzCYg!QSZUFTk}Gef9`-P?R_LuSX#$1b;bRH@EUayZHR zbntWQ-~qRLG$Emx7RE*r-GSs_dCk6w?%^R9Y0Tey-dc)E&*=C6*d2dN?_53Oh2(n8 zb#HPfC3u@hG&(uvH(d55Y~o#eyRioQ`X@GdMZw?!i7H{vnllF^+Uj@ffJ9H4e116~ zF@iRh-3D^i`%!TAz(l_$EtrOU-yJHBHs)eUw>3ptl0~{#2@Ni1Ar<9qhC}`p{AXaI zceqD>&~Q+qNoAiULhoc+*7MkZinLXPhQ1Zd9K=5TZE)3~#G3G+cu+hz(Y|yMTU~t7 z9Co>)OJQjEul!r}+*OKD0Yy4ygoYmqmJLo+^d2g|VQ}KF(wu)+;<6<4FMSE<|M2Af z|M$-UWh_a|EB@d2#Z!L%hQ!0s@$K>lj7 z7Ceqq`a4@@E$Q!KoqgQ~&)H9AN7J8LIeMJe^tVLTv5~*)Deq+0IeNkOWOq4ZD4Q;F z*n{|U%|U89hFWR|sh#$>vd)|QU8a+OU9qY8x>r9P@A}dc?Fz4?$52d|kY2U)u<26tFfZQVO|FE>wFV^tIPwfG3u6CCAH@7j85BdY>S7s9e$V>`>Np0>|5 zt6F)kS=Gw!F*W&X;MIy}OVs#7Yb>A*a=kf*H<{VnLR-w*pzbtt$>N^os30ya+*2D_ z=kCWXk2W;5`c%BOm6yz?;`iMXel}fgENU{Q9BNqGQ{n}=bw>sI_!TwqsE?ol)OZ@}X%UgyEHtgq~n2|NXpIUqye8Suh>jQt9 zAhnao%1(PMj+ph>p;%6`{A)6GwbKFDf~VA6N_;c34lHHnw)ix27u?z04fizn#A=MM zm-hSMA!Z$8Mw-Xs@!70UWtvW4swL=PGQ+HOKgYZRFEFpfu7efMa&@umU+K?f`D zm1dnXT>mP>x5BP}72F2jVR>BF-}hLc0|~p$I`o#ChvP@gWAKya@%UM@w(6J7Gw|!? zW%zCLCHQ@_Hr`KhN-tlpA@G$YtjB7Ot@us&SMx6XxA}go&N`Jx8)=^TQS6@b5`PG* zUq0n|5!W%lj2oI?)A7H#1&)x=#{3>W-TWc$V*VWWGJlKvn}5PX&41!i<}e%D1ame% z%bbhPb!PqR@Hy8Ks^AOE+VU?pmtxhUYHph0%gv|atIfJ{-Xd4!aLz=yr@UB4PuKAZ z*3r}TyMieyv|nwMH9$=QuHzM48y~Xx2KYI1GweEEA&)j9*YOHI1-p({u#TP|SpL4) zb-Y5nj)q@b{Am20IW>+zRxT64LAxDRvv^q>W8B;sS2kzI4uhUVV5xmhD_ zV;+W2H*16Ks!xAuWM>oTZ3%Pn0P}@-n0YaFPkG6|1iPoa_zLWv@?sr&XIuX3@B;HD zyx6=MFEih!ti8 zV`gTWb?BXE9*QqaI~6*Uz*0*Xg;$!#;w#M4@U>=L-`!wdgl{r0!MB@N;qB(D@qK1( zAN$N}@gor(|C!Po2^_M7oAGnzTk$LAt=M(ELjJq3>v#og`*0nv;NAFh%U_PaF+YTV zGCzX&Um&;!@O=3+e3Tn|q+m*H7v9RV*icfl*neer7ZVC*_xVO-j_T)!)L zqCWlRI$j|#m4q!ez}eV!yh8je>^fe-tFh~N1z(F@$18Xv)_aJWnVYfREt2oTZPNv(dIHd(X6W@)y}HS)A3BRcEx$- zKKMd&O8cezP80*U-Om!n6Mu!-?SAID#NS|Ei#MBZz_*!i$9fK?iO^B?Uh_8WI$x^w!-tgGA4%)0wg$18<( z)AtJ=>oaZEzw3B~guWE&I$ptADhbP^qm}D;g?JsTT*oU|OUresa!V#p}xIwX{>A+60bTLSy`%xhej{tlG}wW*vOKGwW%Rni6P&bnyAh z+y`fJ2djA1POA@nc@*}|yK$u$>t6{E63_=KYrUDFP!c@Hck7xsZ?-W<#?0IG$mygy)!xvFq7|{AwG$#Nu1v z73Nd%YO`KLS!3>v*W;9?Vi18%mY`0Wx0uIa*ZT{3CgYtJKNasa&%$a=q;k%~kDJw; z;%V~|{DS#X{BJY0^Qq8V7T8XLnjEMgy-MtEGoRV_hpbksEW!u8FQa1*m?LtB|=;&$eRxTAR)?rvU<&oHaG z@*uNb+&EJ$JT=wp2)N!~@C|sf#c#&0_ZQ-C##FGQ>r%GWPz9P7V}}OM=2WkO}x{54Bv153_oc85^a7XBK6?w5{PLO%Y`ToHd|u8Ds(tD*E?W>u$Ua!yt`?Qzts-eS~#OYy2TD>kdG zb6xYSG8Gt^M$ypc`@#7R;{?}6{c?bjSkl<41R$4v6kl% z?7rYd{4;pE;&uF2m6*DP(UiV|&o{q{FEZ&@f64XJg}!L!teNf=hIp2Ex>p$NW7jJT)>Y8QmS0yvu2&f1 zHL^bx-+;XbyIx_iE=*jnFb!D$9SFE?VMyqVU9T`$r(@SE4AyD4CSz1Vld$U*2G7Gy zE&hDm+RR!FooZf%JDFGGp5`lXf1jKxbUlG#mJs04W}S8?nm6NV=3DSg^Bs7eS*PX; z&G%y0TMXsv)T~F68rL&;jrkQ#>2(%(1K%N+rY|_}F~^DDZBF8Hvlg|U4=R6E{G?fn z{aJGh{IXef2Ctj7)ZfM_4cwW)`ym4>C1`alFt5Oi&6nck=GFKz^BTOytnFrl`7V6Bc_+TttU81J=Ev}(DGMAT zaLD{GtR}cxr2odRnBT;2n2%z$(NdoG@CW9f@n>dT8Gmh7{lO1rUAp~kPU+e$$_}i8 zbX}G-tCp+8+#Z*jJK`p0U2=7j8!=Y?&iIE1o5RGb#h3Er;%R2aADX4Eh?Sr%cCIDV z#4F{->E{Ahn6-UeYu46#gIU|eX7d^NHgkWx)2vJQa`RaHgn1t054~W4r6jyzUWVT@ zUxL3duf;!@*Wtg+*W=todZM)*sJ~myz!qF&-hoTZ<+!e#BGWSj)Vf;(JdazNU&p7I zweCBZkKk_RW4Mp`Jv_+#As%7=0*^Nz$5YMU;M5EYd`Do8S=avy&G~qVSsTs@b49$` z+z_uZx5Vqs+CDa!d*Ll+U6S9KHuXOQc38qByvIBZ?>EoH2h4Nv%Q9z_VkTP6x@ETC z(A#DfWaxc!GyJLf6#SK0+tBxV{;PpI6Zq8gMUVj(GuYXx4Vt+Ef-i6;aAHW}(pT=L9b+$ZV)*kV*SzG>}W^MTy71MKn97oMx|@nsuw(*sN;VmS#PkZD-aKw2tOFxQDqE_cOP^L(He)ktqvwA~4?E6;Czy z$1}`B@f@@EnuX@Ec!_xqUSYlvuQo5oYs{*EUMQe4r@sU%d*%pM!6Wp05Rm|Nqf=C(Tix3)lg5>7RD$DPc*a1XPN0e#KG@nG{g zc!YT-9%r71r@3DKz$qr1#hiQmU=$~-gU`=;oJkkkn55I=z{N7 zg1mrrLO(l#F6&4veKNRi9f_-h_X+ZG-j?h685Atn&w}8vezpd+t|x2zSAu!hCkKRc z4+l^1>(Q6W4WzyjOw!NsV7Go&2429=wqP(n;j*`b+XAwV3{C{eZ4qCgoF2q)BykJJ=l$vL{3>=!FiEi^Z|0UIIJhb=5o}TP-e5P;-i5&t{k#=;o5}Rr z5-)UQ-SQ6;LFdiM|9Jy!{GOtsjItJGt^>i>%5U17yfLpuUOp9elUPmPXHd(+az6PN zu7&>lX%v)h?^MdKylJ!!0RzN?3YC6DcU;1n`Yz0vUa0kSFN1oh3CnIB$Eh zO*P%~X7}kwN+_x$e0Ja4`IlF}I^+b8ZBG`ZTw66?EfrG!%S_Nx|8vH2v9@=53{+yv5QF3%5b5%csmV>h zyA^HBB;_Wb(UBni@>cHiax}Un`26l<9X`MqyC+#Q^&Z(gf0U-jS3P=${{u0Zz8+;~ z`FAkY+5U@6b&jv&QLg`h#_vDHqKx{vIM3H}LwXj}V~0pP*BMJWIq6yOQkJ6MiD5&& zKC9vRdgUzaXY+4{-<4rA{qbca(6gXkg{EggRb}}D7<0(ivpl^7ww0)a-X(WE3#uVb z@=);JJ;^H7a#*oycO>h1mjtKnNVewdnzMH#>lf?s2YvnN z<^0c*DMm|Qf4Xk}qf$e@kGq4z(#GJ(j$}h#5X#ue&n-dIoylsxz8*lweCmCG#|7c? zVC2qZ-Eg&>VCl|eYi1_6U%y^X@Yzll>gz%Ny~!TldBKo-lPl{lV6u5p)L~qw@m43z^Ip`JF|9AM&dg=6~k51>t44g+q~+WXO)S*X!ciDJ$fPt4+G7-q(ENm=m-0`+NI4wU>*58YZpWF?XBlb1XgMqTmGX~Kp6sX= zcEMQ9Wo~pH+eyJVjiw;lFe})(E7>rq$L>smI*rS%&{J>iL=OdD>`E4Q>O+Z{e%W!N z{D+ttFI3opDbDl;R_4cFO?=2dhr&GnpbGKz`s=1OCrJk-N|#qgCaq_J;`>QVaD%C)`*ud30~Oa%ooz7 zT*E7ZHG7iP3)Mxbm+hkeP;`&%;E_Ga`3%+a{$vgB-eBsbZ?d_^+YS#T`+GkIiyla}A@aTl zlFbSmu!y`nJv}P$)YPu^%HW#^n1$m(&c5VWZ)N$^eaV+Sa+mE-)~$BAMsshba#Mb& zu^ZKM94i^s{Qb$_$T$1JWOY74eAR==V}xcrlx!N#jRYGXN|wYoXt8e3=)+LAG1`Xj z1kXH_EMtQHd?;BQZk-cUdpKFmJ5+wk!^xIjwFEQcRnE}3>N12HD0-WRa)HOVE;&H4 zek9m)Ao-)WHrVz^a&WsxSbl{)^eS7o*(@Y_dDC|D6$4ap$G+}r5E8jwmxWc-vbD-` zl0)6b2Q42>mX(wVLOnhSE_syQ|LI`IqshA7=fUAelkL4*%L^V$ zwoT;diFr8m^#8qkwngQcuO^4b{tpecN4>|zKoI-0a@F#eKTWP3l+q)nlZ~{yYZYq) z;qO%DU!QH!pRbKsYm+~<81-Ult1FF@4Yt)W`N=NXrfUmyr$?%)bp#k+B<7}ADK10&ajHFjK4MO!u=<6O{~2_d1~V@Gb3xu&`Cxv#RcX@ zIO)1!BcTZabrhsb&2UX~TdaP96yF&)F?YwU%-UG>K{DkTgxi}(WA*!^&dM}1di*6* zYn}c?DUNIYCs_j9Rr(vHB-F-w{-psl2lLIPc#&CikTPoq^!!WtTVS4lIqQ~Wt+^fE zY}O&*cI>)g>rCKYOX!7lepW&K@xx}_q#rcv((GU6$@oR{Ec~kZLVU!mz3e0No%l=h zcHN|(u)q!y^x#b+z7Olco4f~SurbOH;E4HgT*3Sbu4w)@u4aA**D`;C8<;=CO`Tc( z-w|-_-WkCUSP$y-R;m{J8D=fgLFQBNndUBdtoaN)**pwSH|z3twprIm3(S-7V%H5D zBb!1%Pxdt8X?T@+I=;$08((ME;@x1r6zfc*VO61{%N_X^e7E^lyvuw)-e*qjBcP{w z8bIfpC(NoFdB*%G)&o4{c@n>7ej4j@42pjizh`~{>#9NVhw*W0YyXw6;MktDu^OnvWZJXQ9uDfkwsAfML|SyLvTS+z~?w> z&OzV%eLi{JU!MG6`d@2TS65fpdDdCgWK>&qaIP>frn+zoaNQV3ZLQ&GECK9%S_$(} z=^#8D%w3F_=`G+s!qdTngy(~Y3*QYMBm4w-qVO89_X zbSxEq1-wFd7x)q3x4=&dv$d}iX6K`AoPIESv*AB}_Axv%(Z|zY*rPJwFOJ1pg}B4$N`7-iC*=uYnfB6LbMP zg}a0O!qf^T3)A>MRhSyWOyR-cO2R|I)r7}@>j*8%e3=|Yf=O^( zm4JC*%4p1J3D_lkFE}8~cYKQQQ(*4+!1(OZDhRIw=L++EUtO3ZsJg=J(4vLn*b7G! zVZO^-34a9EA1K8MPJp|K|L5R7!e4*~3I7HjF8mjGys+QEV=2tejmvFO=%_X`rz(Y4 zkct2ZNd}43x(PF+$B5} z=eMm8$E^r>T$mlvv%-9iHwiBRzaY#fV!Ln&c&G3h@Bv{y5g!O|2XnhEUhr$+Gn(=I zzX8YB60isSlkgGn6=Amgzl1*nJ3O(B&Vjil88bZ(P7=NbjtJXuD>H?I;7Y<&S5)(f zgEM)xO5bZ6vI5vs?p*IsS8N!U-v@`Q>P{Z&s}Fg2P*v)S!!K$E4>@Wt4@*?29}b_Y zkvtq!FY&NdIr`&pO!e*`dJ=OMztXi-wH^?fW!i67Zwv@^L3;l{_;ypp14Gqt3d50{ ztiHd?8#G-dYV*Jlc9KI+_@Xk_8t@+&;*NCJ28Jp--t2_8xSp6O8WajT{(y6+cHRsp z_RpI!C{)=PpdQD;AKZwz=-!&3PKs7Oe>M#l@dE-JcC@dT)Iuj#`nOY!i$ga)bEGB~ zhf>XY1)QWX?VU@v6^EMIquhD;6a4?@pUKzPjR}f3O^i=XXVU~q5RS1Er(^0NksA_Y z24VzKV%s|I5Q<5QJ@j-r$Max!G-EoulOm3uv{>zc2GP!jhlJa-V+G$7PI{T&F;N1p z*kfB|hh1z8G8+@q_sRYB}8h zK@`^xqRpLzbn?w1H%)_G`=4U;;P{afZLW989``f!Kcc`s_XuA32W0j8h)^IpmhMw@ zbHBH}$T`XGt$#mK__=$s%}>>Z;m<`$On)hABfA^x5Su=!KDD%kLID_PT@2>%3s2c7p2F!qt7 z)NOZ{P;cSif&iO;2GVf~L9fWCA!@qewi{d$oy1*h_WQ2H|-2Ju7Z-l5caSt>OAZEY_^V>u2!8$BxgeI%Ns1UwA z#4Da|s61{jFKhr zOJl_w#mtdor1aHv4xy8Me0mR_U?`p6;eUqeJ0?`tn61W*3FSf`zkEz61Krz}F`>?e zQrE_WM%C2?Ofz1@m9|0J+~G4u+3*o5^aOg}ib`#8wQ#dzTY~V)hfVd+*ibZ$`;!@7 z9ghXH@ZTum7D1KnP_@Q|?y6XiC8>1+(PG~ysYZo_QTuO?>Jv*(j0@f3a$ZM(Y3umk ztBwb$3Vj0J(x0YX-2EHOcDgMsL$nH7|70Y1C1>9}AaTxj4rv-F{~% z8j1GfoyFDhZz~x$hktI~5WEWbx0-dp>cQUuGG4FzJHo2KTakamk(O#z{!xgGGgk|e z5mkRCh|E*WiTOuu%xi%}qOeE16h=w{FBQh{%eF!|70hRsak9Wq2aZ#)Bd0@}2Y*#@X;C-Y<{gmb~43sZ#pR+wYBOTq=<--H{2uL-l= z8K_a_*$kXQM(z68K(#g-4xX%n1f+wtHXHugV6Dvt=YX{~8_WV}Z8n&L%_fqz2AJ~$ zJOK;QLAVi^^U3sQf%uM#($O4_K@!jwJY2Xvc#Lp&@I+w_JUM^Ow0*#HgsDbfAUq7b zSa=**Yqk-82AI!2(_$PM)v9ee?m>XoY=a*GzbKKO0KY2yGsx#jGyETztvhT38?sLbWy<%=J>k#h;?p z1mW6Xt-(f|eDECcZwg)@9HpqlcPTUN30@}L8~mU!pKYzdMx2|$&(R;x5})bkg%K3{ zcnJLYNWU)rUhr;VKGIqtjR<@cp^%1BK^&(U3C#ZFE8#S-)=0xY1FSXD;7l+y(mH+? zSSzIAUlFVo(%?#94@$^9D}z&ntAfi5*XB?$PaJg-pf%D+&<@OHBuv}^+(wu~$!@}3 z!2^Ujyt!F;C|Ga4g0y46Q^o%dFjtN+&wIf0$x%4?=3gWM4}(c z!ffq&BNpWIBAA0_p5SHhHeo&muL!>Zena>z@UT7N*bfKSqcHJ1U=H7@{O5f-^AFY= zw7{SDRd3J&W>@;N#0i4+1}*R}3%*vm?CH=oyHTg~-VLEmCPbcw8$(^qlq%|;jSy>| zh7ktDnio}-O*kA^vw2vm4r~g&ZR}UeH^Vhvo!K0k1;excTi{x)Ht=o(o$O)TB3F{^cb2;9>t%BpND64mGnG3ufnrv zW%o15svCXrX;=8-3$u4K(3OXo6tz3KOhw1j9k3KrJwL!oNgX|5a?MG#D#ZWl zuU)%d!+h1{^+d~F*sy+~7KwbzO1o?eHFZa6dchsB_~wZJnG--aM4}hbpdk{qKt=v7 z5^>5Dl1&&XArcM8!EDZW<(Lnoqw@@RIq%`Y?syR07^I^zcs0hPBRrLqi>SQ&zu0u$ zhG5y@n~$jM@a;h+vcvZu^o`kcQOj{-hi~q42$QbKXe;j55gj{x8wmHT!B1lSJ^K30 zj);^PGwD)JyoIsFcb#}7XAu!*BgnzoWHT^m^DCr6U;%ZD+PNcCCAtV#6LGbE zfN7~Ia)|-hJBa1#$h0s3<32#HPPZTqyq)#zn#;Y&Rm*4RWixoFG-PxRnQxjYmwvJTa3n znnS@Pj58SqJ|2s@g-zHx_3i7S@~MYd1!DWf@Ai4b_N$M|dLv}{r=rZBBdidg=eTP9 zMyPI-mSeE1MSv0Hw?xcfCvZaWW#nWJu0Wt8NS$P2kkhKpU?F^5!Ir#~Aop+Z1ic9L z1}`HmjJ~LC^2Ut5?ts7D7c=^*$g2tRbzlUWv55w05|mCZMdzBsXzZusnmHu~bF`kV#@XIlzefX}DRz3eHRNcR214$K#~15?P&SJvo) z0(45@jG!;1X6y{5$wABhjfa)#X3 z*Um%`TA=YJ{X(B;te$JLrnQ#tZ%Rm!v|x_s!6*-Y1tHmebWtoTL&ME-Oc2G z+of$|pc=F(rGjHT%c~Y{N~!JmfS03QCPs9G?-0TGSPj}8+7rk}yr91WXCgd@3{~^Z zP&oBD6vN+*C3JZ{L&f;@*H_)1&s6c7q4Lo?c*g?y7DDu+9f%vW^+rITF()$IkK-y` zWjbDASc$+HGm2I2e^<_DXBO>1+h> z;B8Nz&T%drEOExjsra5~6&IHWgLx4wlweYRTtRw$IDPjki8tqY~fp04)26{=BTF!Q=<(gKgL zGtaZ&%Uk6N2fnk9w&VwdTu{?G$5035YO;^Ev5baY{{=QJ<40g`ON!EtZvruRMDYG|v*cx7UsM-5M zxtTi3FO2fBPLChsG9%Hdqux*IjeViQDsM5L1-t@OmsUs{C0}4T5Ig$q?d!@suiMcYq|RQ%T0gJP&T03Y>FV+Qp$9Ou zsCgiinnXpFv0I0>2WBr){SJgO4YZj9pTr^v3EnQQ@Lc?HN|)WMQP1V;(U+j`f4*&)jb$0!q{li!BD1o%&s0d7>Zb{P&`kz z?xXlQgqRgxyXtD^!B7QbLFws(p*nu&E4Z7c?VkVFw^&{9Nob8b_F>gOOmFGZbD<;l z|3du|ons}&zNz|T+q7Wmo!^E!HjXOZ7SuZbC|kw#E5DKPEc1^dOWc@m9vMxWe>=#5 z82?J6Qha0yr&rlAnefIEo)dayQ3ga3cP+As}FaZZc! z;4NS+%7b45k73#<9Phy~Q8GFLo-X`8c#iOgU@g}p{tsX+)`KsC`3h#OTn0ZNd>y=& zj608iwhh93TTvLHKU+=oHE~cu6_@4tGU9d;j6`w#J>hIH$078u1g7mfxiR>2;ilko z!Y#m5Co@hf@Q=csz$V%@WKgWCfFo{PM&|Ai6iy@HOfvdI9Bh?@DV$al=5xX~4C63u z17QlMoC=_S7~E2r7a6xR<3)Dm?huT`tK`6koCO{zToF7>xH?$N{)kfmrkud|Y~eG6 zsfJrZ_QwjX#eFcIxtO>QMv|Dg4-Vk`F?k;jzUShGX63L7stU<%-w3l;p@^@)|H$gHp#jnG2)D|XD9ql&C(Np2BV!y^ z9S5Q09B_GIc078oRruEg*AoBQ;G2Z&g5$Pj5FDenE)u{h?I+AC9WKl&9WUGjJX5$i zSbv%mCu;@1UHsdCmk755-zVG!tUt|(_&vanXn)jyA2^<)1HCJ+{&`_m7bm{x&&Kt- zFl*~AVcs&%&M*#Z=&&$r=tE)F&?myIA&zVqzZ&>!KL2#Ex_%I5b^R>NuJnp9YvM0q zUReTeF4J}ZQ;9&+8=hEiyb5Mp$rgW}I8T`8swo_;3y0o#6$x1FdgE0v`)bO2%(N|7 zZ@da-ZFLg=f#ANvlfi?97lUsWUIo^Bts?D{V7=EW_-XLWME3u1JPQXEDCAAx#lo+E zmkPfMULm|2{D?4nMvils_Bi-y;gev_>Cyjd@K)h(z%L8`&i;RgIM`)!aSjtebd7yp z6Py4(B>suuW5U$&9v4mme@8~2$~JLHI1T)pa0T!+;XH7H6Y--+PzMe-9pHxGGQ#XW zL&9vmX~NyXxx&01+Exr{c{{YN7(e?N*vx-y}>H{SA+Hbs^Dk9GbGNl;3Z^K341;2SICHFdoadP-OsO*0KQ;W z3-j@a8;jKg$Bo6@(uFV$H#ETQT+-A31UVS)#UZ zaAgp=Gx%%auHXy8J;7X1$2k4Ke+b_UcA(>+{}`}OcpR8-KKk?N2n$aIQ?f0K?v;j* zv5i#W;Gj%zqzdM9tT$2x=YX3_f*Rnq!ujCN!o13!!t4+F3-e-z3iAR+3HJxnCM?QQ z42DA+g@H$bwNV)O7O=Jn1M>>BO&EACSlfhw7lO4-82BErwh0420@gNR;K#vh<-|{c zpA~+Z{r{_Ugkue4moOX1KH&)XpfKCV`@(D=RJ<@P+s9|ZY#-EN(x2^vnm;nzhqeO) zvwi%j{ZaqT;4txmW~BCDZTki81rCV+P;jd7NN@$=(O|u&D&kK9R~7#$V6Ijxi+jqJ z-|`>aUKsBoTUX8zFcR-~Z{hObfx=nfVZ!XsM+@hHDPJ=!Yhs!(`;yth1>ku8Y#(=u ze>3pC!tL2W_{m6S)D8TY@F4ISVYZKr!o$GY_6zYxfJ?=H6u!}vP@(ix{cxI}%dMM- zyF$s|zD2mJI^QDfQ%|=Dw^D^ILBD{E^QvLXa96W-2X#-&FxQQrfD>~BRa(Kfu%nvO zD%{14bXM>1SiOrX*BY^YS7TcvIMPkMO6PIqZWDeIGYT8pAnh;eN}KR37+Otf3)gA2 z8way!x+>c)Totxl&p!p*sc!AUK`fXX)-GJxu?AIjk6P9)T+yu7NY5qgN2sGQ-m)>1 zs*8*~LmBPEm0{CWg@;qBI}f+2**t7jYjALMYXdcN+XyA;-G+7b zD(^w1BRhn*xV;&Eyj>O=n7Fp9%wFO2?zEc4+`tI5lfUN%9x(ahaUJEsbky|X;L_?q zObBq{CME>-BM(dnOu$Xh69PRjG(eJ832MQbv`};=@)P?gcAa7$wT(F?vL`UP(p*fX zXr6wK$%Z?kf~CvHehZ**uN$o7jZioN$ zKoGSsEpQ3HQv>VpJ0(D?6{z&jBU9(#J;*c(%e?y|!$3`hW0`m0Rir#=3ve&Qx`A~l zLQdd3f^gM8BY)TA+K7xq%a<_G=LlKg2ym2X1X`eUyKRA+5@O4|i*OFt`kN8WP2mt` zTs9m$SCGWDg9sfwN+V`m9!lvhwYN_=*?2;o=!1rdb*b0;gfpYG3N-?XMF_Z2tb_oc zeS4q`ejR~Q_#_67prFpcal~;2C}zUi2|k{{LY&?kXpdU;;d7@bAeM9AhwwmK1lt1K zfY}JlK{3n#2cQXoEl6MwyveL>ermt$Ej=aAGQ|fdpe?`^q15bef>$z^ap>jT^#Ccn zGLO?>WLpZ?HhFvo?KbQwm(=Hd!x3Yl`n_*B*SKG0_6yfD?QYepU$|2G5+-YH%)+_O zr<}!!v7UP|vbY-V<5Qnr4VP0}`h^292YRDlxC$&W&*M;otBgG(4K|*#Mi{RWn`gSg zAu%-S+;bNzy=%ZlGpL|THR&I&XxyuY_Yc=Mt|-OBcy+LUIL9pOQ9tz$w=$b2s=@)` zdAT>^La@@C4O};8Z-F%V6=-7K#v9@9?&?#Y3uOHc| z^Y#s34ld-a4h{@A@=rmye-@{ye4a5XWl*?z$2R)@RK@)>0-TsK1I@q*0ZZRe4h?Zf zhai$Y(Doi20@HL8pxuFiomX%%!7?2_M}X&wT0JOi8C%pVgTgJM=Wr@pfLds@6vTps zVku$;3(w)#y%}e6CFOU*K^HWsfEQ!am5|hcY?h@}Vp3u3B58D;)R3HL^S_Nu@%7Nx zkT^i2veZB_%Jh~k@IFer#}?pZTFbq*Kogwyh%Lb7;(uxje0wO`cy3*B>2xkl4O=AVLM z)S}^%(IU~rX(;(M8qHF+Ok`)CuzYK@_E5l}AR_+4fUY`WPbMs6!MbbrTDa>jK*VKX zb#X*^v)S0ER^J>hV4;rR9Bxua7b>C)#Swk1P!V0IkLlKhO4WJ&26wGLRoju_2F4>Q ziUV_bWn{Pswr}}uWOx`}>itK>d{>OpzDGxeA7!NRqqXz7(c!k($>rzK;l8=t{XKDt z@hl41q_r)L&!5&CGmuSx|aH`oqQSBIuzH6-daBR3{2Dd(TW$J#1n-Zn6!K7BgiEJ(UJ5_~o;S{s2 zTNR88SIwYQP-e)~8?ktYQrUoP&Fgy9ym8_BSC9}>%!ky zGVUn<7Laj2_?L-`k1M}_LtMU{_%{G?vaD8xh;fCP8!p*_O!mYr=gnNUh>(%Qh zA>I$RTNxm%7k}gG(O_&3(_fg=s$>?Fi@(V^;0?l+!F&nRzY18d0|&F9dL1~p23V`% z!L=zw>c!u1P_)sDzroGGTK5ia2R?jxR>xI z@BrZ#!9#_2P>38Qj`tBTUYH7?S;FVR^M!u~-z`l0J*_gwiK*LpSo~?SS0bDNeoD9- zc)c(e7H!sy`lrdO)~h3<+rc{}(h~4K;pO0?!fU}F3vU8*(`D8WjW^B;?*V@!OaoS} zK1ZAn!Q5P#@sES`C%)+T3Jxb)A(_TQe&LH?4v^{p6BzdQnz>JdR_DCjzFC-0j8?0| z|8}r8sRJ(pYm++gVz4%;11|?JlC*q!V3rRhA_CUI@qh&IQF>T-Be+DEkJVGcd%^34 zkAd~NZshYZSgYH?C&Ao&hWYd9*(Llnm5H~ zFrS!jh55u>6y}qm*M8#!lpU^#Kc9dEbY?uU9_5pxaEwF%ZNnHa6C4s=08SIW1I)nz z<8T70vhWgc4dHvh9LqBfCzcut-w$poyd2zGcojI>Q5@^w;C@9+yb;`2_!V%m@G&qA zoEYacc&zYO;7P(4!CdmeIG4dR7$CEYT_~IYzAMI?=AB87_O$=GedSgZ(+!2f10v8<+rb3DXIQsVmmlGbq{=b4ahJ$m3$Aha2PY2f( zUJNc2UIuO=`~8;i(cQ+@e#8G=@F4g{St5?LhD)TwVD3Ic|D)iE z!pFeVg+B&U>|~sC;03~8gSGx2{ujYo{}28hto8rkKfzl655A7`$0h*apr%1j0D%2q zJplj?g7pLdxGY#t0D#lLTK^9&57zpBa1MCC6sS5_>;K_j6MRhksWdsM8TC)Q>(dg@ z68x2LC-C>eG`0Ro_-63$!lS`@G5{x-0HzrgYh^MxC_ED!7G4HU7v^e-?5H?a!I39i z0@jlO$mn(OP2&G1xS23DNZj0uC*zBxi!k3EJ%qUuLhJnfu>p?O`GYYmi0S;nQ45Z_ zOaMnJ_zq!?aP*>Z_*VeyMd9FV@JfkO8?5#G828~Ji0S#k2#)Fb!R5eO&ks%q?_gRm z^Es?nuS1#2#2+#M%*3AvGw~T=CO#+3#J`gEE@j^mFGcq>PNVWRE>*JdETs^xd_)r^(zk#sMeRl z)vy?7$|a~gCaZ@oK}Wf_5brCs8$RZ}ZJ_M5)U`|DGREV|{}Vz#Y=Z)>taCO+b^Zyy zOI0y_GuomF#%!=leu66WceM%L{s%fi5=UJZ@ak43T~2ch?T)TOEzI&(bc}(j{}M4- z75yBJ?{}HMvdfp2y#PkkDrrn4&lpm=>gVv2jzr2eqa3Q~m2kz3n&{^LR)4;LRtH@s zXRe|CY^b7F!f9oXAd1#>V&0IUOA@uFvw%Zf(R8wvi>A|q*rML#NbQDta~Gqy?7h`* zSHc;-%5d2ma@gpepepO>UPrVwhWK2*^ zuZDB;n&Iwx(y%ZO!={u*i07#Q-3uB|3grz?t`UXfSjrWMqv6!F3n+)DzzCoSr&Cy8 z9$8SC@`c)s2u4tSay8t#43)E<{#yKot!;*?buF9*y?jR;%3nn>p#;=M#zy#UoES>L zUdWM3z{k|0YvCL$=iYEFT;Duvs?V=M1$iPtrCdkN>{f->!+Xptc6A-j=x`LxSL9&b z*t~1;!v(*-NdPFy(r{tvzCQP{#GI@3^<@mG02!wr+4TI5v-ih~ z1HXFq&nRhxnCU+t2l(=y^Dl#?F=`kL<5U{%Ju9GmHzpp(w3YE6>njnSsnd>Q($4VA z)JY#&X;rE?hOsvo`w^+4jQmY_{?d;W zPf;HKjgt4FwTRW&Uj~_SL=|2L=5tw!Zyi>8BW?BSHrdSh$5+2m!mnw?Qo2o^eGgKm z59MXK%?-FvT8ANn=80CD)NC-6b%#(lH{FIXDC?M{(O|VY(Ms>W5W&Hbo008$WSUB_ zHKv7;XPt3?K8&2oO#l9|72Slp@9fBq?=0gi#i{j=t>}5>cUr0C`MF#M^P5orQ|Z>^ zSZOP#^_fVsdR#})M#~Q+DSX!%qIK%Z)vxX9oi~zmP6^Z#+=yk4O zD#3e6oL1l=!fn7Kg?oZ;5grJhBs^?o)^>}ZShC$mA2epRWp;&R4)0b8XMk4=XM&#= z&IXr~(VehkdR@3V_$^_U>VPmyby&DP_(N^*io`wO_(TGRfzJq!08_WX6Yy>GgYZ=F z&%$%SSA^$+{}P@LrWrWXE(Cjp7lEmMp#NgXN?K({$K41hF9G+0bA;~$YfT>FU_2Mo z7(7(`M}S8Qj|EQ@z6Gp}ViA8Ln4LTGnS%CbTPTj{;Jbv` zAKxc@EBGPdMPRMHL*iv%t-S;DoujpP;I-h*5`P_-uT!3E6ZkFR55Vt$wXWhLIF3rd zH(;%$LjpD;t)&D14%S*a@SossB|h{GF)bbZsWQGS{xk=?DjWcFFwH`6%H1!F)!)&W zW)1;i1f)s;mx9x5f%e2~ICX{D=n927lHoKc)*!?h4+CuRA%9hfVH9x%v<>_{pIcR>p%Fa zFgnPXat(2svlB>6j3r=|>KzpM(Bn_P{Zks}FH7T?Hz)kJSb9i8K1Z_c&}jaJZ^MeHqwLjp~cQ2h>Y_ ztyyMXdsVX^oc+|ieuz}0-s@*oGn(j6NBH_%K}>~a^tUQIUdqOUsG2W#CaXd4Hp^5~ z6Z>1ajx5~znBCGw#_q3PM{Hw{I>*CuG_DA~1I{A9Ij5>M?s8>`m0vvhh8**bN zOhszb0PBVcllp9c6-lU5S1))rmXu}J&bJ=C(yYa+8RjLGb~aMHNUUKNq!GW#*)c0*?GibywP_I@aI8M`z8Ph3Ng zZ*N=hR}?rJoQ~x4gOt?fX`y{?kc#!&f^G3TCrBI9*+EXJ+#2kOvd;>#YO$)Ay672N z;-4OT6&XznzJ=eZ!3Ib$B{&|T5Y(w7b`IW-6#UXeEu14rF%PSXTY#~u*o$~|gC8JG zj{cejs)e1rYciz>erRGa({R(N1&-i;gcw22tf-~KteXDk8B@gnQR?DAr=>m{X8DXw z>bqf9)gr!Ku*cG`%z>-^@L3DwLy`VZcqMc4MDMZ0zB*+v!m-B^BimAT*;V)9R*vzm znmOF6m){4;uvHS{9ZBhg@?)!{b#NR@G4U#PS2KdRisLC9xVh^XpCIJZlm_ZEBsE7S zsDX#l${FdZ<_N1wa1$;Rdmpi9hiE@FL2W@`#^>}MrhSu)a2IBC!|G>^dSZl?ZeF#k z9V4uY*gxR(2&=wXn4kt9POFEt{vB?%a!hZcntZeMk)H}mPg~}0crL4+Bdv-ZIe4&p z8%)F{1W$tF;_(xRYHHm|0u9KZ2swdYC_*?4wR_v%#ROmL1e~ygPQX;VM_Q5Eo8jkc z%wYF}z!YEm+C1wc`0;5wH=BogPhaO)G3qJzD63*!zTaZX0+(kQa~Q~Aw}-QrzL2g`zldjW^IHsg{%#w1wyvn~*lJ&!XBZ0X@3ofK;Ms0h zFO0IX1K;Cx{(WC+A3$5m+b1$7^}0f zOr?*ts(Y3)eY#QOOS|eZ);ejlRW-(0dyO3R^Ej*6JPO}itQEd$C`Mobud86Lx_FC~ zX;f6f@m6~6ECd9bvq`$pt*25YX)DafZ&C*qH=CZz0jYG^3Y)7ziRs6t(k8B()U6 zT*v<%IW9QQ`Z6Q>7#kq&IR7Xa8K^4$v2n!3InJTQ#kqBePmwHwI2(nt!P|s$z^@4B zg5MD4(1J74Oj{HDPK={^TzNzSIF$TIxFz^g;SS(0ggb#b!@!LAIMbw)+#URja4#^m zqxA0sh9s`JACR3N{Re@4+V%pD;c%3dfH7cBXEV}dFnez@$0a$!kAZ0@NB<|lwT0J! z3xuBq7YY9d%wC!C-vGB0KF0BECvkiV)&ePRK{K!xNWrbaS|A0t15aUmFl%L&Fl%L= zFb8ON2y=jTw{TzZ{lWvl4}tY2Pppc^Bwz@5jqot=v%(|5n}j)1e?fREc)Ku1eLICY zy5kf%3wl5JU18Q7pBnlW@HfJI!Tl)w9+;0T6MqQiyN3J;*gzvC zp9gEp6YzInzxZDUCkvZs8>yO6|D4dvlz>cdCE+}9HDONT)e*i4+(5V;xUp~ta7*EV z;P%4YPrIuy^;q$JnmDa6kgpJydKMhRgy(>@91DLMeQ@&*#(5B|WmoXS;CR~A;5#MG zi(qPB7=Jr>x$pt75;Zo%j3Kb?Tj3!1LINhJnIH^@fm9T%nOIw)fSFiZp@5lKTcLoN*pm2R zWpuLYm7admx@tGmtE$hQwqW{SP1StH>Y@%lWBJsQXQ2A3P)i+xkI_nHtiu3#iJGv^ zn#E08;c|3p3cDX=Y>gzVPS09}j#uCws=Cu%@~oAD5ytb+S{2PmGxgE47%T@d@Gn%x zdU&#d+;Ku&xN-ET9tQ(XaP1-+f>QiQ??@$vN-D{q7E4mFI+2|k6lX>YAA zthaLglhIjHXH*H7R!+~01*_o2tVh+3U2Ra&s?N4ZSVcEjL8ojegn6+@LW8;$^a6oB zE0=$n8Ra<1IE0_JxKI2uS#QR%Jp97i|0(!lu>dAC{xS0ACSjZ{V-(Xtqk1eBfCC3- zWu4B!hX={IneY}Upj(WR_&hVs%Rvttb4sHT-)Gj zVo5XhXmlq3J540si0##~8X5Iek71GR>hebG-)TqHnKI?_N+)l!b|qlIV6+a-!kz}r zdwHs1ugfWu(knWsM|@@F@?R?&msI!LT$RlP`^wLL&4paG1}=vW)f3ShKVi~p_qM+U z9p)~#k&cFEfS$YY^x0iY zXz1W=!N=5F6Mc6DlxaJN#cc36476F9ZAB~y5&t3x}i_HEkWlHBd@ zfRD}nJAXPpi(jnesEmtrchZg3FsU;P+CBMvXL@f%CN^&}&K31?$;*82998_fWkoBa z8=39pB>b&jDsyIePa~6=-bZn(W_VwR|8(yP)Xp^TNL0*JZwh{=c+=nyQEC{XdIs-D z){$vqJlX_ot+W1^l2THx?r zc=!z~rQKvC^{&4Q{x0^;LGP;-ad1yS9PbVywpv96cy}%Y+TC0$=H1VSB=(U$@4IA= z`??zR285FnYQY;;wWx`DHN0IAVtS_{rvz^reC%F+?##Vu-)bvs+OYlC91a>cN>>W1GLU`F* z1xh|-3R>&iyy-|sk?#|DmHh}6oo)o|#xOuKuQK2?7}=KG1otE0GdQDaPj2p16L(sc zF+wfgY2}vr1;q)Z8Eh!Kk{f%~YdbNBo~F(qEX~DCS{u*c%;%Fmj3~P*h0dz%T~-z2 zH`NITv!PGT+GXXL3%uBBHk*lo2kHmJS3tzEgrXc1*vJ&R&H-BnPXW!mUlVsm|p%d!V=8h~*3QT5!L zR_(%aC=zN9)opm!;+$yr)IHgg@+kr8XD6vZo*hniBsIPh{;p3|@>|xBx?E44RIG2Z z7SED~FqO}}47nx^B?qw<2aPCLHlJ%Y@f!37c`;nbG@3I4!gUh{4+4opQ{?~De|6Z$NlDbQw z2h&bw+wNr3-}JK^Lz~0T+Yga!UM|`(ysc4Y(|ZX%30_JNcJC_P+FTsrC#o%bA+Rl0 zhfx;a0|+p#^E_!2)b+hqt@3qn9^+Yq#WV6yqKq}jM?5kzRL6a|=U=Hw`>dAuWa|t2 ztSl@W{BWO@o4c6tZZVlKyFN~2jE`|`T%s`{#$mV0dfU3m%t%zlZ(EsuHgCggvO#AY zQFp&>rKd)D2`MI44GW$mHn!E<87;EdWjQWnL0O2r)DRxnbb5d#A3MiL&u_H z6vWQ=sA{?2$|>6pP0pBYuzN6WMv9D&)a?CM#ncq0o};fdcA0Z@aQ0gD(tc}r7Q1QV zRr5n!z(ibCUK1AWRh{$wa983;tmBdrOo!y@ zYTTpyg-7jb>_IC#!^c!dbPhB@$=10X)wxtzqt+j^4jCDxv);4T8sR~>%Ldi+VlBY0 zus8om)jo`t`;nS|*oqW(=9O2&=1Yi#KgKmm`lZBAT}_{wUkJ3doX_@iFJl@lPO3wP ztyJTq(({L{WW)H6x_ZRQK%V7}TBE8tndi?sPop`;su}t!e%4uK^kvojY^=uR+Hwlj zb4RVz%EMSg9Za6QwJtyhOb^Dcy@PH->_78%tM86lAL1mt-?t)G21}Efz>;;+X-*>z zZrsK9t^UT>s>26X-*N|0RqlrjPC&O`gh+u$bQwD2qu=}hkL?!q+Xq%_Guf+}9JA7l zr__LB&_%qZqQ|UIjfZf8GR4hP(JAsNimE^Iwz{0A6lK=v|CA;9chmTW~Xm*Y3fJTlR@)gmm2yjwigS2 zmFoRh$`7NZtJ%LwIP9`fTLo7+J^w28?r&Yis`huTGNqNzTlM~%1ug@AvBtSd@r}kU zt)tutDXwJMfmRV$tmvkXy5(PURAYQToEB>F`EYGA z3))~#D7BQ6QO(dn_zp0Q-FdEi!F_~FaQ++HC_M?LKZPfO zwUCZ{rh~PR4yL+73+do_U@fGB7l2dI*vrzu{Vq84S`h@?4c6N+fvLyP+cAM32iMUF zu$T$lK$uczW8ojcErk=%aN7&}z?_m{4N)!8TQ~$BNJ~KmaAC?Y;cW0|VQTUw2-CD= znlR^7W(zk0$Mb0pzEk|$fbSJv0A4Ok1)LI&E{5ZAaV!NtEllH){|G+;-YUES{G#wS z@Y`fO<9v+Y6K(+hK=>x`3E?8}=fX|F=kx*>ByJAJcM{MR{F5-B-QR`#g0BlxinOyj zk+vA@5#}SxNg4X{5e*B^1g8rx0%r?rqmevutUy3bVFj))Old{$@q|oEz|F*;k82xY zzN0z`^AYVKycx_HI2MSHD5ns~uY$Q8yDW`HcEK@D0^R~o7TyP*DSQAtSNI_KcHzTd zy(bj%c^`bA_)`V>pzvqlRl;Y$tA)P@NA0~T2J3Yr;4)x6n+;9@?~=sj zza^%A9ezbo7u{JwBM@Nwb6;Ln7|fWH*J75pt&?~-;K92X_v4)A5+#o(*LcY{s5 z*LgJ$g5APTgJ~*E|BYb1trM6pC#o>$zXO~lyc?`na=?Ed&Tp$F0S6I~FMJeSBzywg zLikf~8)3F;y_FO05$-~4D<^OgSTE}UV{9GU$_ZQ!Je6s|>EK&6QM3bW;(5$08%7v@!75N2!FTR9;DTl=5lUk%KmU3^D2r*M>4qrdxy1RQed z@BV>{z!8bm0?gS;?jMGOtcH#arQassyjKP3L`ZKdlv zM*< zSMK6SMeP4kqZmFL@I=QfUB(w9-WfFyzF0By3=U>iCv~VelIt&e3>_}oP6J#=K22TB zR^3$j!I50YFTD_=SF2#n&4j^`8@4W58DCHsQ^xP2GTzI+!=OcWcSALu=1Q}&!GCLf z^WlQV_Y-WTIyybMaec&wX7_?VI61cpRXdv(;(UX{|5w%CoZ&9}Z#vxcXid9$-KLs! z_ALKjQ?*~4?rK&FReLSt-|6dVIlQv&r4g#zecs)r&y0xNZyFV1`u4p4pT7Mit#7{& z)3@7V`u0MtZ#P{I^+s};TzuQE&Ps2p`fPM0DLx0HYR*Wt>W63QHS~iR`pT zUolbj6wPlz1@V!H|C#LcZ+uu`D{IkoaxnP!eOVH_FI-CpO*|h7%!laP;&MJnPrD;S zADrxIwEDdm8Ql2R97go~rosvYI`70!qWy9Fy3Cb`Bt}b*5M!1~e0kikR64I6_DKkK zbHs_wlfHtN-s#9*e*+MOcQBwK1rYZK_`&8$VH8KlaTF14p5`=ub~JecjISp!T`v6f z3KV=jVK~^)@)CUgSMh_-&vk>3-hRjyxC~4T%v22~Mk>J|t$1R@s_-2BIx;sX=b2Mt zCrSfYt(1@RB<)iVPK@N5jSaP9VkF(@u1-vhWK`de7)E=ZdjTjk4H}W9aC{6$N)XA6 zPEFvf2nv6yvL{8x!ZKv(q)3GMteX_MDX23z%?v0hrgT>qCq>dsY~8azpkE|5~*W6QF?4jWR}y}8-pv;R`JHR8uo$$TdjX-=ON$q zx-vUrcl`TDOa8sf@` zMuFKVK{qAjy2OaAJsz9#_kZWa<#^7yp6ahlGp4tA&SxpA{Yp-ljk0g~T)9;G{S+ zng!k|JP*8Am<{S(;f3I%!gqk#beZ-}@G0TDz-NW;27e>W)H@mDa@U&Zk#_)p;y zuz|M7NNnd$;mu&b@K$iL@HTL&@JrxK;RE1G!XJXG34aW(1J(+NlW;VU06rIug+Bwg z6#fRx2a5&z5!_YyCvb1!U%&%}`T7|qY{Ny37ES<95O%OToF)z@0%i;Q!BJsKKz9mL z0=i$A-PuFJ>EOqNGr?!EsZQiQu@Y$z-sSI8(teHNgNBrQl<>Rst4*HwZrr zj+>o40*;%VtOCc)PWT3mo1Lr$zb$FkfoZD7{GS7VAiNKJLijMwAKPFYk@$F=lK?&i z-wB@qUlP6o{!RE#@HOFU-~_x7c(O#?8n-Y-`7**u;E*uI_cSsE5RUz_B!KdJWnp&B zHH7Pe>j|?vZYbOm+)9`#ye`6h!Tp7c!9#@ENJk1!1V{A_DJaBrIA%(~Oz=G6`QRnO z3&1Ocmx8t83TZj?Su6f*uv|CCns^4Rl~rIi*w@7WC9vM)ge&Y{frB=dOmG1FiSR-2 z8R5fV8kaK8Ct$ra0{ktQFE9H40H$#Y`69TC@b6%nR?{DE<=CDjVD_k)j-IgqHym{t z36cr^#g;}0>!lH3FZ^3coB+6ka1gAQNgz&HaIezt>mptU-m|5HpNo_?F*cpI33AMS z_3NfcSI3TAyu;MOXDry+Z;mX1%yVut#GCUfe@kSRnO;L}-U7L$le)GAzN=N|tq@=O z$5zWP-5Lp+kp}9Ctq?bsLbRK%4s4BJoK#L-pjTN4*|0jPo}Qv=JRd3J=m2*_+ZpwG zJ`!|{!2l*ltyzyV&xP9z2W8LJ#{1*dDFiq+R=^`2vt@Zu)!6p8 zK%)k4i=>*dkChp_O4n?Q3`$D;9(6jvsS@@?Dkk!ybLI=G`kqKR7Y%?hSZ=1e?1`i$ zQ3s{R#Sf#lAik_ubM{24SK~rhG1aGjHoc3jJRZRXoZ;q0^lUKsOo zgAHupna`J_?>Y1hHs2?>&ZzHBB%kl2JUq|W3q03H&CzYXEBKw`I|rZHKE9}K^-*m- z%hwG_tIYJ}BEK2FLC9#jj{^5J-!1r^>f@K)r})Yv6ecQPIaHHiVfD)R7b}>%!`K>aLHa@GIxAisI9EJcZ*ePaT76mOo8t#*hMoRe3ta zg|cJ8JxldvN*;=h?KodX$oUkD(c<62;`&HWCu2L_54+xulx;YUfj#K9*^Tg@JaKP> z`c8ZzYXr0GYpmsU7~%cQv%hx1wtuwp?vJE3qIsZanD&HeKLtH(=*a}w(6cPDF-6&V5R@(2O^Q$ zn@}om<4Z{CrV=g1+kO?Z=8ltI-8yWZC&-<7V#9O0s{Br*Vx3gP@%E>e3xxy^B)dK1 znOiY0IKJbj2Qht~wd%HaB9&^hYJEjKfx9-+<@vhN(#gZoy06C`X5`6A0Qb^W=4qjh z;AG`EVeT79r6vsWvk=Mj%_(HM{>uMuB+{3=Q=7i!v~2OTVBD1~jLpL(3%-ZQSb^Y1 z8!&xO-+m*~x_?AkFOj%yr``9;P8~_jeHXRWO|8Z`j23D;T!E9!{u7qeZgZbh-@-4K zhE4uy#YpP%oW-wy))@TyJlyldKZjQm^t@_U^$tezn$CrvJur6}BT#dSXB}wx7K2Tj z_Y^ZOQ*R@Kr=za0{{b>Ld{5%`U{}#0YSqC=&D5oE1)H(R5zk>n4YnYsdJd^G2cgPv ztEBfL(V#Xn=)-r+9SE)LR;%BORO;wMTI@OT6%Hxzo`L7XD0vn4qM92;UC+5mkOaT#>lvP*Q*vZoeUl0viex73Vfi!l$B|y6_xq~Zp-4s@eskW)(yg^t0=!>B zm5RF`-A7rDY#ly}?gDk+p-8GRPOU!_X^^y=SN)g4dgP>6b+@{BDAF|PBG_=5tRCvn zYYkM*4o57g*7_aBwkd^b;o(S*u}!Tz9O;R}ABQ7_#`4m7McdMI@MKWoGbu7}tJYiQ)9E-Hcs?Q6X?-&5x=uXI?)wAf1 zI`-gJ9HYBXIX;X$)scIn`xjhAofVzJPuX_N_9POe@^;vY@=<%qBbn+)dJ=3!L+CkF zKRI}TrxI+9cdDO0jMO$BRuw;rjB3kobd+ht`g@sC-bSve%-Yt}L`Z1u!T;gA4YeHZ z{Kfz9yUw0-oyq9FL^)|=hGiTqH;Id*cvkV!M9t8R}5GfJPk5~==Q zdUUZ#(XYQqsQLffLXzG5E!C_*x3;9=b}LE8qdb zCYnrKzO{p+aRJu{M|}N61#n!br4nfexLm5hak=zA;L8$c6F4r5ZUM(- zQCd#=@f7h~uY!~HGJQB+ha*)2IKa&mJ_6Pj7>M&exSIGM18WNm_@4k5i9e;Tmcl=S zcVTlahY}lxKR7!`F{?MxKO(Z92aW0g5yH%3*fj=`x3a1 zWcmhpknr2!;lc;NV}uWa_0oS7=mePJ2Mc!=JV!6nhvOU^cS^vw;0J_%06#2z9lTnY z+LLv{Dd3I5RO?Zo;0aoQcL}!!Q(&NfJMcl_D2*JBh+_`;EE(@9-i~jC=Y#bIn($u$ z{#E?%1^+3$3~b;n&$PTXPT`eczwj<_vhaQ|2LDiaApv{3iW2YzxQg&Ou(qN=9E`nV zRute0;6@UM&w3kSYHhm-Hw05;W&WJx87|xgJVCe}mo?53M|T9w6XpWXCBntv6~be| zCBpZBx%)X!z-g-Ig{gUcO_;Vy`-G{5JtDjjOygAj?Rsik&q)Batv?Fy22&#D3El$h zy(__c!P?*f%#l|L`Uu830;Uj5=8LJ4@Fj3H;cH+n`DYxyjG_(1Q5Ftu*noh>U@lu` zq?X`b!fn8Vh1-F(VFTjy08bYGUf@~6eZcdChl2HXm54tEe0R)0sp^QcUP2j!4+rjS&?*MD-f5h1drX4TiQ%QPCf0qi5x8OJ{ z0eivU2vd9dqcC4gzX~4)YhwnaeIKli8Nfe*wJ`&jrh!~8&XZ9|s_hrRe}OZ_-@$&p zk~q9zZP9^+!zeQ23?3|U~Sg` ze=12w!e4JG-Ug2G5~%}ts&F^(t-?LP^M&~)yIZ&z{DANXFcn$6;<4ZoVJcOh5}pEH zFAT{vYU6fuOfVAxFACoW*59jwKeej6#Q$mVKH(R@2Zd=W{J!u`@NwZc!CwgP0iPG% z55Axo&;Pq{{2~GGf&Uaf4CaWPg?k_D6y}@HFMJZr)gg>?3S3?owuH7y!ry_b310$p zH3sAV0&bwc8wJM|IP{0Cz|`;P4_Se2=w9`QtiWzCg-s^rTTp+;3QSu<{T(ZCCGaqb zlLyw{v4XoQSbxU~TpK)1;zS$5p+95=k0NlqKuy8?W(`k9<#M2TYA2 zGkpilb$?_ET$h9|gMSmg4!$OA(&8=w(ijua#@sDTQ+=-Kp?^9!B%BTAIx_lK2WJU$ zK}==gdf>Xkjlm6t+k=}5_X4*jv$_Yu(NO}5!QF+2fcpyb?Nuzyx7RS?Tfx*NaAT_q zXfAVv>wp&sHv``*+!DM(xIH-fh&X1#u~v8yc$4rwV1AK?C*bJlP2nBj{lYuJhlF>7 zj|ua&ep2{T@M+=C!C%EVYWo6??{bdE5G)m4RefoltgaGMH*p`W%D2{#6}5T-ENPMCAnU4+Mg zdkAwrdL-G8`;Xq%#1HM~07ks~P74SpCHNlSw z*8~3_?%o4Riemr!?w+09owU2X0d|L(g-x)##9eZhjO3^Yh$ImZCFkH^08~UllmcBP z3aEg9;+jB`3W^9QCPYC+Ma7&G&-YvXYiRF%p8NjKz4txOd)_%`WK_;|HhxFz^;;nv`%h1-ES*~f(P-rXnMg&X_(m3xPUOOoQBz~aMV)vGv) z9s1+Kjj@e?-neiNk2OTSIWF8CQ=C=Dhxrn}Dfo-OV=UT9b-Fqnzc)VIIR0vs{&ZDZ z1Lm3&!i_!ejZ-(&h*ngyVTjKfZx~mrqqIB(vpHMEPYh4P-<*jE@elPX{|>0^N#PoN zBjKcQK34IrpA;^Pf3Xdwaa8LZoL0SQQrI%Psht!LMkTZr4F7;MUcuN(<=&Z?p{h;} zr+E54rn=Wgr@N&PD8gINY_S-2?l9HNeI%N4=k=gNE_+^GYPjB?iR_?VdJyd03X?1lBa zyK!q=Sift5K#WiyL=_9wLnhr2nyeN-5YCKMMN2Rv^fi(@J;aB#X`yEk$kb4MjFqQ^ zHb6c(^cV7BQYaN!KQZ(ka%w_|0~V~-)rC{vRj(oFRIk7P&A9$hD(t^9LO;XfyGDp} z#&tvU;J+Z`1LGR^;0pcY2f!`-EE&yxAE6)MX>NSzM#O1`IKQ;V2rWnQZ-N#d8)5%O zo<-{a7$VF6Omz&w17U>be~xGb8X!NMGrZZd`44P?*r(s8=6{782rN-|Js8f9twDO zL$@M^cq7;wB5$zlD1B5!bjU>n#g)ysAWENr+=-e&ugQ0WWQ5hMmEmyY4g?lVGCAuN ztuS&L-eIV@en#gc_1MaA)s&ABM9^6Q4J50NAoN@kQh`X{z(8aIty2nv6eBL5fW5WmL|#@|tHbr7@Z61mOVv%Q!v&tKWVLa1xSe^MI=4E!q)#bg4qd(O=aXd3P{%3w3#>!JLzfQ0#Tx-;PpA_!FC)+?RUKUu&S_Z{X$tja zI;#e98S;SB@KI#==OcSdLW8z55Kgv*uCfF9oPi7`X9TWQb=HPUl6AP(*x{xI)b(q_ znaKf$JBI4*MgX$A*M{rVycJcz4Dm_86FLiy3;lw?yrJz#dpxQLvd&6sa5enkT!?dP zQ5T0ol+;^aRp43NFG+p3AV6>6L4=+p?>CGhq$Jn-4U+~i1iar6p(YI^V=>f&tI0}k zz{i>Z+k@nWykukv93?j*n}Nn~liZjQcml0Z?8!~8WX#^c0mP8pREKK#3y_SgU0@?&O=zqQ=>?deO1$3o~OG!&#*oB=Y`Cq+#As8npK5{_&^0zujJWuln`K5OP<3R ze1V75Ll1=uTIyU{vNcUOC;;psl@fD<&#y7_2H7sS0c&D&zvQXfvWbkuzpAuMvTAI9*QQ*y(9o05O;c1ns z-drCp?tL5u=?U>=MscCq`1OXq!;SJW)CW-Y&!Ac&{PS2=M&+7ohTg^Bjb`W!5^$3l zQn0((3^l{wEoO+1zVpn`F4b#8I0G9LuGtXI^Sy}R51OGz)#44|Ds`DRDR*4Vo0LU% z-c&|Am~yASARIf$dTuqi0zOf-Pj3ik;`F&+H-raQ`jAC9h+b?x0BbNE;mx1PYU0Ll zv!o>mK6P4O-u{6_>Y0t<)*jrte{KxtV8~GU;czsGcb|D{0&l-6=T*mt!vj-T_04%c zeZ%JBSc`2Bhbv|cKu(%V%^|QW(0-QEOTh;90c_hmj2O(6#I;C>xdl!tAGZakQGF|G z=P8Lgijl}rGgUjR@-DL9OtblvYV=4rJ4t){A;I>hhCULmh^-sb9|=z=`W{(oe&)?V z3=41vnq{kzpduagXI=*VA#953r>fLP!<9WXLaOx9aLv3!OvX7c!&?PkHD>eDzS3rD zjMcazpkj}PPp0Z{>cumh?49TQ8nhNaFw)cc~$e` zcqw@(D7aQ-Pld1aSjp_Zy$e0Wfrj%c=aeGeDBIv!DPJs+;?Y2j1B z-QmljM>uRZE@ZvBeRsGu-bH?Bceu1R+itTD^D7<+#B<_9tdo5&3OauY7pZf3I!Tvt zs>U9~r&O0c;V4eM8MP-oFmn&8i$6~v#@VhKRxtGNv3r?%cTc#)d{G7WhFf`BB&u$E z!;Pb-5qQOZ!9qA=euS9~`p4+6q?_)2{P3a2(yD$lbj9f)}9H7x(K zMx{|pV&Aak;6>n5ic52}AtsV>!TfM_+0k^E=>?oxA`tIng@Qq zB4^snxp@=yj32E46~T-GKhLpXaaZv(34xeZY+g^!u{j=3^=7WkQ_+@~sD=ELldIa? z0TG!fXnyvQQBM3^fnqU>Z2lb=?5Jm$Tv2iiiMV1iFFH*aHS5C81l-&gb|y3iJ3ABF zfQ!X_doXoMxDbqtvJb};=7}tnGkiz)BE;+Gvk@&A!4P52FmT$6at3;>a7XYQGD67# z^BIhs557&98E}_y30QA5fEzYfdZPij0hmi%dPSiT3>(D5rQprNUBHhEcLQ_ji;)cn zbLopb4$LJk@&vFxn*%%zd{pGK!FtmHa|YVIS2x#!|~;lZ0`3FWhh~B=1Ai=Tt^j|ow@|$)F#LfegIracqKST_#tpL;YU~kzEb0n# zO0%)>esD|S7r|VNW5ln3x&B5z4CeY9`D5_q!k>e$6!xL`h6!`we-xRAZI!?UU(Up56%cPW_$<3d9nBb93O8- z_7j*#y))w9!KuQ3fis0U=aMZP0p|---KkiZ(|2`*d19A7jsszK0JqjJDTRSb79GVA z@7Hd^*Ma*8Q-8jn@ZI2R$>_LzNYHp;80}*>0BPXaB1hk4AG-lLJ3y|p(QgFx&pvkp zh8*xcVo?Cr=WamG_I#Ddc^_*{63E#{XiX9@Z$+-TF;L!qTyrC{_;v}826O$5^6S8y zn~c%GGSgZm;CsPuilgP=_k?*neJIS^=`-PV;ID+A0RJHTB=|SsgJ2`Uj`%gA@M*UH zT*zZ0zJ>)C^2jWEzJibZE0~LV16&!bHB7*T;MQ~xZUycr+y>lD zn74Ny&B*^fF!UFTePAx+(esPo5yA(+V}#>T_T08XH%VZvkpi~BS|bI_{^DkFlLuZP zO#M9S!KYQQ>&>c|7_tz-dSPA-r|9U2_c7IR$t}Q73AYFD66SrpU$_tWW#P-fT7?CE z+1$P<@`2#@gkytX_)rXk!Ji0U3)bo^nVgisElN2!3XaF1gv^8ng>%5E!nMIs;RawH zuuAtW!NtO?u$Xg(MiDIf!q7}Cn4s3eOhi{<4leo#v;EiScfjug@YN!}2RugjJ}@6U z7(OekR&xPw1#2}I@Z)U%wVn$MEMu+b0zL%3OFSO~-z)qUSgX9i4F?pfMg9etuj^xE zth`$N1HvvBA+gFW@3@WpPvjE)Zr}Ru^UktSx*g zxHUO~Rby~R;g7)GgwKHann$|%0o>o_n9i=jV(}|1sOLgQzk|79h+Gp_HbJ-vc$)AN z;5owO;G2b?0c({P_@%PwJtE%?UMYM4{ICz@&j{Xt;c>Be3%pDCUGPES&%mz>e*=C; zn3|&>2vc+PjBo-5s$U4FfPWIM0RB@r!WHE>znzF$V88Gs;1uCD;0nT>!4cv9V9s*$ z0k=7M10&6uC$VxH>POKYCM{S@#lk;kZ>JYNjAffoti1=iXo@URTLQsh+d zdPw*Q@T0=J!P|rnfVCD1{JsO;De_a`eZtha!uveY{=?B%FuW!fKZB18bNqKgnB%|G z!qlhwRG2zc=Y(s3zZY%<{#Cdw_`GljaD33t^-DSa3yOhbzEt5J;7s8wz}dnR!1=;c z!NtNe!F7c105=ilG2Ly2c|uwzVX8{?Ajfd^&%&TpQo#GbS|tTct>4k&;TU+F@JaAg zVJZO65$2HW7UA!~w+mCBYOyefWXpu((51)9#NdNrjc|4FM&VlEEy7K}PYAaGKO@`) zyjyqx_(kF2;6uV3NgWgBF0Qw2jv3d%@V;1#2Y)O)5zIvm){mRO-wJam^@}j4pSkUd zZm8(%#nTk|NpL`zBPPDCi1KH^Txlim1V=glLc?Ad^2CC}ry}7);M&5+!1aas-mYfC zR0eJ>d=A`E*oUr|$M!OOj*|KabMIq+;fmZ*GFS{*V6Eo@4-LUu%>~>Jtkqn=9O-B^ z7ciGZwVDffE?BF%fER_!7qs4*TAm`zX?7nd;1wi!C3Ow?pJ~P3$F(c7N+{_2;qG6En{M0s0PCnVJZyF5^fB> zNw_tbZ$e;##)B6NPX{j(reaE&Ftrue2(JNiRg8Wg0&jKPY=q%SF>C`rC;Sw6ukar5 z0pSj-ZFWdF ziS4&=LvWUGV{m2Rrr-kMA>iu5v%w|8>~R|kFA1Rhn~UKAShNvd5581*6S%wZli z&w&RBbD@E2kxcYE;A@1>g0B;%+T=vx@4(Z^Z2y0R;Rdl_&vc70JEq%()4_{{*%>Vp z&I6YTw+F8g?hW23%)W)IpiEpp@Dsv3?mqU67;b`LkMKP3Az^kLuL~~+za#uG_yggm zz-NScME@7UY%RYPZUm-!3lq^4>`BoaGkB&u6})KC0h}q^3!E$57hFSl6u4CQT5u!b zso)mEv%zhJ=Ycy3-wy5}ybOFGPC4}pgYKMEcxTn!cUdf{U5B;lIi8NzkI zw+OTCxJ$SRc!h8~@LJ&>y#F_gp*Q$(;X&Z1g@=Hj7ak3ML3jfA72%oSqrx|X-x9t9 zd{THh_#{G%`%kKctigSpnjV%i5z6lS}SB>WmUUHC&V7pUo; z_kR`PufSB(q5Kct|24!g6P2S>cn-L^a17i*_*O7=DCqfN@IYbK=n=x@;4#Ac!4rgE z2G17$3Orvk%Ad7zky!i&zDL-HE5Bbj1H48!2mG*bEAUp~_TVRkdx2jfXQLfKKlQ3G zXIWnt=Jd=vF)<8;;R9jLfSeH?0{%w$4)D*yOTbjqV+1R}@p#B5uL1{!H-o93NBK5z zrts6?Y~k1*81lt%5L_&L6kJF6ZEyqOli+5;r@*a+&w#rMe-7>={5810FrWK}2pf1( z9+}GaAF1Q^b9dVHk~_!g=5W!Uc%mcufq&usANv zCi8@FKk#W`t`mMLJPdqJcntV^;o0C{g>MA^DSR_HH3NyuMIQpr(v0$FJ6u^TI89zv zcnG+rFe9rcJObQQcqF*B@I-J&;i=$m!mGf2gg1fv3qKAX5);EN7_JfC4ZcqJ1bCt_ zo7fq`KY|^o=p9Zd@;;~MX~Taa2?^r;0D4=!Oeu1fm;i2 z1$PwQ4(=xWJh+eWesF(b-s*$Nv0RMdV7Nvs_@2D$g^z$I33JMIhVc8~nDA-veBpE8 zJA}Uh-z`ivz~#bT+};lg^Hz_o69eaK9}%XS#8zR>-99N?8T_1ZYw$i{?i@ZS%%dw_ z6CMmcE=+}n6T;)br)`cIQ(*X1EN%p!6P^eDUYPp&zY5<5J}+Y3{1p^NY@;9kN8 zCNld8bA#|8;S}(2;nWxm*NPzvJXW|e_(pPpy_T~;7(+f|kuVxIW2rD!ZHyJdY?4fa z4fs#t(O@qYs~Fdvh~Ef^;W1cP!aKkfg%5zE!bib*!l%GR!XJTa3$vB1FZ?OEsW1nn zErq`X_aawA`Deknd}W*@+@LUSm@;Nok8|jXt^0&cg z?pJ0!{ytW{_;-g|&A%_zxBUA?wNAj_D7A!tx2V(jQ*#p|UR6Ia($y@$UO34AP)GT9 zoyzs$?~t0nzgB7w|4PbJ{gHCh+^r4rzP^2(E^)@`dtId#jLS_1WzMq96mRVVy?i|QeRucGfm75ePM9Mqy?<+Nde+SeG zTet^*@%5j?$SeP=?Zr%}D7D}O3B`HT9W6F7M0;z6np$gFL5UT5vkNP7U(qt5bsPttJQGL=H>} za%26(Am=V81bLp__+EzR9i+g2)$8zq7tHqOj^|(xIKX>fhruV_`|5+kx-8T|2P&bS^;ch3iZs6d z5qLF&RB7@A`Fg~-U>$h(26rw=c-G4S$g58U%t@!8RByM+hOq zQ;1{*8*^9^_z7}v(u9rRAeW$xAXTqe2umW7tY%y^@+Ot-p*6>6Mv(7wDAWBO@ z3{f-5YjRC5eG}}H5=}Zb(ifQhPa7xV$Fua#uQ%#IU>UmyCRNDqxl~TAmmDJnZ2`65&LP#BnMj|Qw zDeP}LYvae3Vc6J(quCmSC?T{;5aX7hDik`Y@hc0 zny7kaBiA>o$=Q+7p3f502Q;RuxXO{w!neRxaw|ra<v65=U&3`|2z3PgG;7pxJmkQ7y)QjNAXMMhwvOKMC(v zV>y*|1plXq&1%+^u^9oLKIl!Yvx0>i2R4ILJn;mZBiG}C9ASBb z{t)#hgWPI<#t2f``MeS2D*jx&g4W*%ov9h*^4Lvgun>PYn?bJ9-C_p6hMRe2kmnT5 zH-k%%wgqO8d;M=UgSl#SPNcL26~?@24YnhG-tR_QLw&u5=YB}iS}0jkGkcQiXYu z24-6|C@)e6c8mDeN$t#wWaAwaC-NfSKzJxWGP2^Y%*{E-cda65mT@t#dXnl?5P29L zzAuOjGTW^7IHE33iLr%0OF%sh%vPoPxb zXnr*~N>b~qMF!YG?9f3hK$NgeE!07j7Dis|(wa%R$7C~yL>MFRHOn}AnyW*-M~6BI zj&ct%7TdfM=BgtmPBhGA+UF}U=Ow8&MUnA{_3@&}Ed|thN?NXCZE+W~aW2cKB`+c~ zScX_G`6EFMERHlW2dI0CBSq#GwW}Dd^u6ULiz6zS*cPrm#uMuF@RTf7@@|EH`)wBg z*I(TEQNzf4p>kil$PNF&iI^%jGc!Rg|1~SUd}YVT!%bs*kde;z4{Fz#$ZvikC}IV@T#$^kd;7@aMucz;0}L5r(Ft5hxGOkExCfXzN_5X5eNExM;JU&b-ZvKR4{k1eCAbF}xxuHi%Y=)0 z{dzwDEI2wIDi#gFdOHB*91!d60N~bO=Vb;x!Q7d{K>L98Rst|1=EF1PjMzB?@+$BW zkq-qcaEy+I!|;GuTmxP!JR0mA2ssY?n8>GqcL>h{%i)m58(?;_4D&6p?uxVbT!CR4?m8dqd4 z4QN$=RAh*3O@A;Ncw5uokNjsv)vErmKzn7Y`h)pkq*eXF6~S87AIv9ht?CbES!z{( zFe|23^#|vIwW>cjAFNgV!8O5JyC2LVp3cXA?j30i!)#$b3{m@vr`s^qTGb!SRNpUh zCVI7SDp;%f!wnOpRsF&2Wp{`hCWu;DJfMc3!@{h8#v5Wl&f2fogd_Bs#wQ}@ZT*cf zuiz))+Th=WdCMi?&fo@!0&u!8d&{seD|i)QUNAJb@c0K0tze+)7P$?$p>RJiI~K}E zfIAA$1ao9Z`Cs5Z!kpynFU;douNL-!#|Wo`skueJVJ`p75kodCZWb;EFA{D6UMhSE zm?~ZL+#bvhjLfyBhlG2A9~B+}-X=UATrNBj%wdt<{xKbfePS^ad{B5c_%&fYiz<8* zk zpR`*D-wVD}cs01Y@H#M$%cA@BV4jvm-VPoryaPPa=9uw34A+arUhpL0{oonGFM_qA zJOX0FGEe01f)@&(1TPW(0IY;R1V12r2FxQQn4r(VkLp)=!tezQ`anqVS75DW5B>(M zwd}#)gSD1D_(w1YpbUr=P;1$P*@$T^doYIVww66O2mGP9uL{;m_K+8{T(y=xZfMja zTgx8I-cM`UgW32{e~ij6yr;F6JvaxPDe^pUwlHr$t#J=G>>;(rJ(y)*Pu#HaX#v)+ z@N5o4N3rM*?k3ERX5TDrRX^|KL#k zXR&wz{HO5CVCtUn3SI*Tgx>~R!Y9BLg-?Nb_CMX91Lp~U2QCt3UC~POaKpM%pE_pr zzyo5N3UgCaOJP=`US#x4tRMY^Sw98|vwjR0X8jl~oC6*w%=$4!nDt|paI6T18^yq~ zp`sfjE#f^k}fm;f5$knEN!lKAsL4W;Ap@ju=6Lqd{W))Sm0uLfbRIe47>icFz#OsH( z-pP}W(=zY^o82oSC72QX7WU>k)%rgC{i2re?@D!=f16b4{rI~@-H1Pr)k___AG3|` zsoXM1uTvBFw_EKg!#v;+)#L$~wyN9sw_m;U0OkR4gvc6947@iGuiU9QSyg{9QZ2q8 zy5B-&u7!NmgAvPfLvuYPxEO3MR;wSxRNn!#1U>aDcgA0qXd&otDa~qup45JaPsvI+ zep|I(87WMd-3CpNSACW1%QMT=5{TlP&%+$Do+>=DGLr7R%5v#nH7mw9Y0$X7yhBvg zS`|4F&s@=plCmI2cx8hqa zM+*v_w)zk3d_o7R)e9v&dN#Hzeea{h% zz|ShW7PCgg%aKG^tPCnu#&9C3}|dzYLX7>)>h7tZJ6mYK9~@#FQE-HktM zg1)Fn;goZG%OOf1frz4}-)nM-EQ8Vd6HPicGMIz@kjWhMW}H^L)<&|5SqT0#{l=WG z89Wl%U%_MEfkeK-euOHMBGSTi91XtBrY3iHSK=a%Ac z@Xxf|y~Ja2)V>b?mm|nD}pxiNCWllTYX_29i=sYet4v+1BE>w;s;D{qR#d;a~SIm+|5M1D2P zM{JG!oD^eWIukL}jYvZtpdU8Y3TJ{J7G_^a)d;#_kH14W2mGus2VHxFYk;X_M)$SB zuL`p-eBI{m2AiCB#G)1W1L02KGs2gFsZGX!_;B{EFnfP0kWoGY{Cj!v^Vr&kUhUyM z=#^HfU-9QLGF9ijk*Vlc_UuK^IAk9d!7}z?5$sAebRT*xgYTbCSF84+lbNix?L&`3 zHQ0*kRbm)h6(d13!L#FPB`eLX8FW30g+|`i^D*Q?$ zScBW@r0d~UF6nwWkh#$H@Cg=O&j8iql}L60H}^>&!<`IHAH!_XSV4KWwG7EWCm7B^JJEbjZe!CH&Unq#GdXIr!2 zbe6@(rWNaKpNTo@Z^#7&1%l8kxG24+KN{r1!fnu>(xlLqHB;Oe?<2syEFD7et(X6BQEer zMiG9|p{&Q>8yOu{=x`*A;Zn83k$PrpHQ+Fs;h}2k;Ye}Hal~@5Pw1|;(5^tejK3-z zr=X?h>LyxxZp}bTKMN+d^urR=bHg+9J-;SkmOHbanV|-~7OC%u< zQQl-)FX8WI)4Cq{af@knf@z*<@o8_qX;p;x1#p5i-U@$+_cqg7b~Mr`b|2gs)@){` z#XYj<4Zv|$AEwQU!*9IBt;q>knn%dqz~tYUT<&Hv?AMxMwFdUy!0a$&*6px0tV{4~ zS_$|?FESl+U*LAVRLQy>SjbU^5x5=^bqL%+gBfUs6b2Tp1$zSH5om zVHN0c75{pqPBMcH4PihyF7O-G=JiN^)nhOvP0EEIUtkG&8XsUn0q)64n#rrR0{5xg zUyl?QRD^f)M$_chpXhiZ7n-w~Nnl=Q_IULc0!`v0qj{6blxJ^NiErSsrm-q{BU14) z?RbDVMxxCDCa)%&`3Ba3%%$&vw(p4y+~z8;AvSZ6Sq&LiMaLk#x%~b&A~j9C$?m}M zNPeo0qJa*oEkdn6Uj1=AQYTgWXrz7bhq%UO)%?u}-mh4G_nVQ+O=Qv8w<3Kp>}vUT zWTWS4ulnrmNJ*+rN}5gzXR)hKRK@Q^e)F92s;cishFi4DsziU{E){27NIqj44W@w>>lVJhiFWSF@^ zjX#0DZcKUEiO2wdB4>s@#+v`ifMizrQ)eP~B$h8a7b*S^)`ZK-4RKc92oH{LDnwItxWyL~s_0ct()3Q1l}iy*fYjS#gqW zeg@%l_>cwTZsB||)jlDQ8C798Bo>9>W5PATZwr@z-xqEO{#ck}o6m*ujH_R<%gEY+ ze-e2&Fo%bf_W*lvVPrn@`QF130N-_6~jQy5ISO3QzM>S7t9d>nOXg?a4Ya;;qKtwWYiUo zJNeK_&l@b34=7@^?Cz#r^m;)`!tAlF_vqD`$MhX}~dlz>R#`PGzgqhHO!c6EO;VfP<^{^Na zZ>N#v{d1$=CqgZ-TXD1pH1!_f-+pxtf9j6v(U7{ddbFK-kF*?wxx16qqj&^rrfS!S zb~pQ~IW^#6v3iw%1uDB{bebotn_5;g+TBxhnL0c%Tv7c|Gujvjb~dOLrDosITG4zc z>dmVaEsQ^$kJS~m4HD1f+IkxA%UV&(oUi_*?XKE}(MnI_HLnfn52{;jNdJO#y#0i= zbv$~wzUl#plg5`C#t@VT{)~M6XmkX(=R|!(fBgQdP%V`?C5(4+*NLVj)NfEyQm={1 zJ?hEw)@vvede1Fg@^O`57x*_DpcZy9)g_aBk&zbo;-gYNOnB}&0atibYE6?5?I8aW z*&N_e=_~!0xSn?2L>4bRoW)gC~4=x1&338+1jeEFWg4Art5#y#61 z^%$EBwPaLc`oH&Njwkz0>d(o(R^@BjMbk}{R4-cb-wWwXFJ3_Xq?#};njhZ;&DLW}m;A_AF!Y+`D>Q#or~3v9@$U82FnPT3 zYFBznHM2y0JIj};<~EL||38)l^R1hdL}ldI#gZsx{#_^uj;#KvB>vDjoybjX7fXT} z{`ZpL$|y>LZ51XXvvf(|%<0^P!Mp#f1)+Km&3Z{yXdb=#KPrde>d55i3+1a@L>K;x za@eNJ;d8qjpj~^h98|_i(^7}hQ?i_rc%$_{l|*Biw{Q=YOj)>ibW(z~8zBT?WkQu5t_fy$qz4 zmonfa`NdnHmCk&p3^vftoA`e$gXY@r|NCX2X50}Bso@h7)6}Uuf?unFS46Y_{rdqW zavSPB3t#1an`;ues?!Z@m|~*sB^qAN>u66V3s;Q=wJ8MS0HCiPQ{~8 z23{47jHK?%#T%o9S!wz>e#MRP_d;oH7s~JYFHs7m4o#--C;a{W#*jjxE)H&tO#8+N z{&#PTq}kCH>hd8`i~aR~(l)Uy%25_QXNtqsxEMGc=*S&#U_p)01JBfbYLs0vs%{k3OXK zUK<_wAKeVY%jb@Xc8$XvrXD6m|EYu6tnY(Q?EBys`#vbKI|u{!LAre(6kQl8dDZms z(UiXz#oq_6d{)#q1BOdIX5wb}-wu~Jp2E%W_u*0-T?X-gA1;+pX!`!|443rH@YBR- z>VM&87+#L?(!aVH{)a=QZ8QGyUikla0d)Uw783EsqQM%JVRHZXjxjVq=ltzR{46bDl$(~ws)0L zE6MzTczJVQQLcHCm~$*AFE`FSK`uRXzG;glX6Y;E&9`YTPHhpYWtytaf@nhTm(G{I zbUx2xY|Trpp5Mk34W*aV&#Bucn!A(I%k#XsyU(`>nTP1{=&tj-o97&%;qE-2 z`|SB{p(Y;uwMa5wpb)#u7A}b9s;yn(yy};E(Z2EQ5e+qTel+uH&L!}Zw&$CJxqE&% z|4!=LA%E%R=e#vPG=J7f3sp?>mVSM{Tax($&AI28iucl5pF3ar<@q+l4fAUq31&d9 zNy{n<)r@Q7Db)!sE&b$tn^m*;low7e0<4)(OQ`s zyy;6%HT1`UIX`w}YRqXFaE6#9|_x?4ybse6z3fq4EzC$bw2s9vPxv4m?5rsUr?Kw zhk(6JKBAjW2mni(HDRsY#NwNijnE!U)o8sL%w8pJfrP`0q5kMsl~ z4(@zu&*{+K_kq)20(*_%P{iZ&HOfZrgm|{4uQ6w?jL<-&-WO{^gV#v86(+C0VS2%^c(URV!#arc{BBs)5hqsQUd7*PQ?LE4F|C=fdp6Gc z1tA@cv$&#iBH5yH%-Ld#hk8E#0*b&JXuuUuE4BqGGAy1T7qfV*=M7c~k;(~>pNW3bgKoznP#+uN324P4PcMWP9LU;};SI(5Ge0f9TMR3~S0fOt1fN8#b*&wUuRyO6qX4Lw9U7ks zxA3%NH2v&^AFKpZ3E8ynh0i^Pbshe0LWLQN&_f&B!IDOTv2)8G&XRH5gHMu-a0 zq32_)z~0dB4F14cu&=^(BgPt`SIB|To%CgEIfZzLTFBONsz5ELkgequx`Uxz&~lm# z9~s`H`h2N?H5JJ*tU~;l)(sGNtO2l&vo1q)UW-$)v3RZ9m0*1gL!!mmGM|-qr z{4ii~AZz3TI8E?!3xI!348MW-u(dB&H)lbrk^9W8TnVo*X$0E*ZETQ?&@jYp zZYSfm<~~H9`P3;m3QYo=JJ$e_O`YMp#C)0R3?a_uo3AicsE+tC50TB#vv6v@3XU0` z&?OA^FfHOjTwya`(@}(4BkAT5vM;3Hx^t8q3h}%N^BBXoLW}ACb#hjSXV;oOtqrr#^An7fd0Z90b@gf`DSm=Y}&5E zPcpujJCSnnu<9!OP+E<#7cxJm!4pEf6hC)s|9#^Eb3OTHACIquf%(RwbYI~m4)hek z(X;rPWgSuS#kzJu8Uff_=UfXxMSLG~+}#0bRYzKl9;(rC9p=>xLj#SNg2T|fZ2{U#DY4P~s!|04H;OE**6YrED{MXi+gHM>O&OK><4FG%Ql8j|GD6Ri zQFR943e9qTw@_=g&PKK{=2Kem5CnF?KW(z$pTakn#jzWKF$c|GOm1qg%r+>u^s1l$}`VyCL)fPFXdEyQQ$a5LkR%4(yErju&aU*=^~Wg97EslU<;F zb^LuG&F=t>;1C{u=yf`Ny2I-ywpUZ%M(|nipjez2i&7?@7TaMl89oZstQFB{Y$uGo zm-zx#aZ-30Vr3mSir6okZ9RIJ53^au_ixtjjeLf5J|rV>akbka4wzY_D`B=PL|c8Y zve*lnz#;Fm)jAHj0a4ovS|cy@jkZH#hcK@zTr+m2hPOoNLMGx?-5`vC*(@u>x+(nP z=D>A)BVK*Aje=f~ZGnsjD&vM`X7Ns7eKiV4;fJ?Z-mQRxa77m}-z>zygSgGdJS_fB z_(J0i0aUFHtc!0Aw9-#_*cNj!x1c?Mr8Qnh(nn{x+-(It#g6BgB5JYAfz&8uDn5fh z1j;winEM%I3>~lCN}6S*PqNay=Ai_HWE?{<^|+fKQpRugHtJrDyWMipZ{7x&nX@HRPYC_C9;55K--97lT<#h$~(LZzAT?Y?TkbJ9EywZ zt%)$I>(-_?j=eM9m9^0->-$Zyc{ImjBLv^jI3xlY-YFq>tE z5Nd5|HbcskC89WL^Q{sv)2<%ORcpbbHoi<*8|`c`#04!NVkCUWE)o!$9h)61Ey$~< zc9cb}m_#qPFk?^fGTrsBVYRqI4**yKcG>=kFzm9uLPxL<5g4Ukq46_EQ904>%ggFo zjhShWn(wlNCyAw8x|J$dBX6tb6A^Sz0Y@Gva<&5UfBi!Ki9M}Yy^gsfn_H;rs zYDb4G-3f9~5@3&`pF{$D@H3j?6$CNEx}LG}Cb6%Q)hWPd6FZP5J>in+W`|^_dkLel zlYI@Y)z_03l7u!UpntO1+9Y_>@t4TnJi*HsBPa6VzG*Flo2C^5*_I)}tZ>bz<0m+t z9f~{kJOC-wNO!rTX{CSG!YM)=#}N65*z6Ep73q$g?XvBP>9sFZyKmYGd6Y7p)rIYJ zfMsqp-_0yER?XcGVH}iFR}wfu zkk7wjIU|*=3fqLu`x(n;fDi*kMM=9 zBWeg23?;$Pz4uBr=%MJY^6eXj1$113hT>0-UgADx%Yj`_0NAuLzo1>X(_pFLdN+!=3KVnktQ3mSQ z{y0^(Et&=O+#TDZc`0$& z6J*BC(Jtcr9(8J4G+({GHQE5jk9oI8TP68m?e+Wd>+uK5du@-t8>d=48U0la!aQdA zvhwJAX8D|_qYJ$MURF`NMy+}<;8ng|(e>r!yP~H&YS@uzntEXm@^4&fD4;6ujgC)c zP2h($fuExCm3x^FJ)eyasdx8BLu~wXSG*Aa9HZpn%Q}0PFzcA1f-gjyspt2^h1A{q zqs`Tp3ZYP~wy?mRWQ@U=j!=E{mU#|*7|N~q28EZZ)_;Wx%h$gUZ5g-plF3!n%r<6S zRsUf02K8ils-^ZGjOJz213wJR#P-yC@b6S*k4lY%ZY;m)<>=jUOBc`d>dm{1InBs{ z>ODX{XsV56|6pGE4`wR&IK#6vq;>m0*zbfHl}bNvrWpms%VOpgreRC>DLyvQfh{P~ zdbBjNvr9uZ^4WyuEN!l-RbuJ3lQ!2js95ccPtx#kK~-0pIVwoQFp+1rIv-xpH89h^ z9e#adil>Sl0a`J5XlUFD2Nx62*toy^ve%+BP4&l-X#Mi5jz;|^mK9H@W@nbqJr=#p z#6H-o-iv0IpL;#}wMQ*}E82}+DnGa4%k4!RM6uN&GvE`#OvN|CO!4=^^zKJC>8(j% zKEIGz@%XqxW^VB5gq#DWY6O`@5o3EsLjeqYP$Bctp`$Rw#~d-k>4nC*6n%1^t;H#i*1hSKx@L_1iD-tQATzGT_th`RD!SB13&m|!k3Alj2sks zeXz-b$EO@$x}l656!}hen6%*C))*FMPyFDs7hlRLBL_v^9PGGZe?d2tksUX!z-Bl6 z;PXDdbkj;WDDrkNo4xSE4*PR_bs~g=w7@4tih#v&Da?3q(4S0^Q$`MoysOJiHE}~3 z*>S_`FgxQ1AF2>_W5g8F5EKjM2IY*H8%!PU3wMt0d=HURMh+&Ua;bOTjOJ8Lx2tX* zY%;+7w8odrq2XIlF-=zk@E3*y#Hvq5(!tRozGfeF?A>U-bE`mN znAP};*$jL$=mwt-_>y_sFbBy#{P!1T(7e$p58;25@U8ftEzF=Ay5w14^D_M46KjSa zdZv&Z6bm-Ulrx|xzUJll!KVwplv73yikwsblwXJc9DJQ^3d2NB899hl7U7@n;67hR z!28r>2>9HDF9V{C9PFn$ycc~w%qzx+)gq&UonCUVe|hDT(Y9uIFm1&irNIo-_Jh^T z_fZ;y)r0S&YzC_*-;WM<95;fajLNoSa&WM!{Q=5M!s1OwYajl}u)Y@7=CJZRKZxFE z4!r`h75MU19pqKQ1M$C!j0@e0e|}9~G(Jz@>%89mDR4UK2d-A1p5gF*k!PygPDksM z(&tHv;Ew#Ua1H!_AF<0#z_dFlLVQx5axV?+Jy10*v z*)wbRtgJ)T3$F$8t8y9334>e69lpiI_o}2Lfy_>;U7`&x=1vjE+v6^N+QmFi-Es4R zDn)SSQPl!}L-kau6!}LkS7%-PwTrpG(+P=NMI7d=ro)w7oU4``3Dk)-bBVgUm`74L z-guy!!`#H-@UzbrgG#y7bm+o z!^M?coa1%XI3BF#1jPLo4)Yc24)YKRhq({KVeY+fn0qfA=H3g3x%a|hZoSaV>mThH z!1G=FoQn^*ST7Gr%{b+fb8o5>frW=Fhodeoa&did%yFcr2PM$1E=O0mn8%Mf?)idn zhq)QtVIHmFuwL<#Fb}xoZ(QVP1f&$~E13zHX4#5G;qR<-!jn;9GJ z67gha6Pdyfm!i|bHNiah)?^=q&srC6bh+Oo?m0qy+T~`i%gu}8rU%@-X}jsjFb%%p z(21A_OF7I9z7F$1D2KV@l!;pfzfCBwp{kvWR*rRbx#{O(y#ZFL$!y9oG~s71I2~LB zUPifGB#*gu@@$7o{tQ|C9wE#4@IzZ}7xnKhM;VxNb37EexG5P!PJX(&xF?u1<~fk_ zi~}b@qg>3_1v~PoWC>@cA2~5?yX$scsd*Sh4}0~oD2p7~B)C$haRN3Xi%CtdsrSrYv@n2Fwv3;0dDQCnWGSTW|v zLcxn+S8%bOnwBssLr(W^APm0w)(N|Vi}{9IM?S#CSApr556B}aw=*P$gUl~RJk90d zPO{XDdt7q9nAVBlu!}!+F`q9SH&tES#KmpNb)<3YOoQAD-NDZAmhWtJa{p>_4O}`t zqh0dJF8M7k=IdCUFxR;FNf*Bqqe1G%VKN8U_#6W}gJ`}j)scVeVqX&EQZ&hA@tf)5 zBC>?f7ZsX#9^t1RI2|10!%<6@MH{iG4tYyr-SKczst?*E`Fb!WxMA~2-CrIf7a#Z z2XfeUgO`vR>0s_LHIk8H=PEPEl3fupH-6$%1)L6MpnSooA3`+e{i|^)#c_-mz#u?i;1X6mT+phm~TsT655qqSstf)!jO)q zSEiJ&`|%TElQ)?CMa3a!F$WxsG;X)N^r5a;`0J15O9CDqTUj_`S;I z{#tUO?S7msw;QTiG*q)K7P~x@k*nJB)h_vFa)B-1?vn2!s;yX5CB z#BW|>TLeTV5mWzLIm~$!xX%{1I;$ptT&`A*AN$Bu> zF6Qe49r?>HKAToP;OA%{t{Sy$oYwR!7yszuUrjZvJh^F7E*~C|J^WNvXMc<4CpC46 zTB`8x(fsQNx*Dt}m;5gm$D?gWtIb zR&jBmi)*-;YPXJizKF(Q{ah|1fwnGrAC)~il9_ZBMbcFc!?voV%!KQ;XzBKco9Ph) z>is%Oq>Fph#gDm|`Yeu{7hHVE#YbHHu8ZGy@fjD#&bka#k8vV6@8SeJTRHN8i>YYu z$g^Br#l=(^cHB_w#^EM5+YPav3y`aC=W;|H8>j0V;Nqb!=4qCWo9kSx=L@9Uq;8Jm zhTAF}UKG!USR5^JSuA%k543dLP@Bi$?Jj=W#XDX6qKjX4@ll6){l^^x_&pb&a`C4w z{=&sSxcCYTWj%Ph9B7x3#$rrhJiHn!JxXi_CUA)1?TV4D_0*1s+#QSJb z1!aNHOG`^PXLdT~l2BX8%z+g?XI#u9$jlrF@%hHZ)KPK2va!cR8nosJN;h0;b?s0_`Ox_6LNms*lbm^v1!Q@0 z&>aUxkop{>SsE=p3noty0j6CZ7IMk*Akdf`mJ#Mi8e}lP zj4b!=QL@}lJVVgQ(&3x~ku1HNoP$*2qbE}^dgCXIi{ZgeHNjPcOTkrz>w#-K@RQ&e z4ZJdrO~{zgF!l-$10N6`3FfO%>E>GS8^X7MKM-CF=IlP*ECX|}LVg(hr|?#=7xjtq zXAnOQ_OlJo!NL+g0L~D86U@;H5BkXg*AmVL*AuP=ZX(P_<4c5@EA54uD_w+{D;&h6 zB_sbE!_ZGGT7U-$UjiN_+zzY{c0wXp-m^u18F;=h$G{xcFrin2mkKkt^vhfzp9JPP z+jKJ*{FpvP3Wi%@;JAhs%sTxB7w`)39+9sGza+d4{HpLHVEqOcxZebRN92!zKM>vy z=Aeh+KLtK3977oxT#eun^DKL=Mv%Gm$khn)RbZ}0kgo=FHG+H%n5z-wQQ#b5UNILV zD8C-84}Str2Xirk@>$^K`V=V`Zh)bKSlkTmDLfB6KzJc|i0~rtHNuO**9k8L>$kZe z%m=|d8k&)<0&^=Dc@3EFPa+w0nXPgh+6!_7>=$NZnj%~U9IGIPCNM;V+krXeqUWyQx@3gN2B)zwZ>^TX zC14J-=%y~Xvv7TIPhsA29DdOaz79NB zcpR8xF^0n?_I6?3Sr3pa*t!N>-y!Eh{xHXDG!($_xLB|;;h2kZHYVJrL1wBs&LX!5 zpAhZ|J}t~U=!`J?g8$XpxrWA3MR9y~x|3a#+U#x~yIFf4PHglN^DMCZ*0_=WP2atVyy zP)569(Z4Hg@UP$E!V;NX`#5=}Hy^_x5t%j<%6K9c7n!JM0pyFhWE4Pzn^A#<=)7_c z{JHX0@C+F#nS-m!cnTI*rKo3aZYn3ix0LI_T&;S*2%(5~xtio;xBg*^0 zN0r%po>XQDe@}To_ygqu@L6RxtLMqp-rf2_nUCP2G9THu%EP!Q>w6Vyz}J-%;GdOQ zJKP{FI4SFWAn5(Tec-V217J7U3T&FeeEW_Ukpnj=^G-ah{3Ljb8*T(f>{8qHiw-as z*O-{M=vifUNH3F7YH)Dhb6Mm;)w95I(T#c**f*6~7)O;+?yPsnHLO81NyXG@qH!l|b{{r!?@e@PkD-I@u?g|OKu6RVd63ZaO3&X(B^R|I5g zu%toWFL6?G*N-bwg&)dIsb7{?nKHQ*GqJ+GRpt|Hm5iGTxf(a|Liir@;xeh}4Q2{s z)#fAHo@_HnEL*Kp=SHW!a>RE;QYz&!k zM9pwNzrm*C*p;slhomPGDmnoBbC$fDF!jD;uKIE&9C8}*WZGpmVd(TQoHS|s;4|`2 z5=L$EJjKquj6#&2r18tSq)FL*dHIf-+?Gne_*2k~$VN57v-qO2P-m9glU-6=53`lh zR1dSCx}=-pdU>5$~Mf z+SG?%LJRu~W-J#!K55!e9Cfbk!e~XBGbZW0fLp)YjlnXIF(GFfWiu($&4B4yqr?@V(Fe`N}dm4861WAZm-8 zYQXQACKP@ztjuL5S=H?NqYP$Y){Lr2U;Sm$NO3>J!?GzKE0?aUDYd8GlHM%N?zF&R zffr!rH0+8_9D?jf%f3kB?n~&f`*6!yPq(`6DO + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: NeoCat + * + */ + #ifndef __LWIP_NAPT_H__ #define __LWIP_NAPT_H__ diff --git a/tools/sdk/lwip2/include/lwipopts.h b/tools/sdk/lwip2/include/lwipopts.h index f5197795e..e2ae90030 100644 --- a/tools/sdk/lwip2/include/lwipopts.h +++ b/tools/sdk/lwip2/include/lwipopts.h @@ -3545,6 +3545,9 @@ #error LWIP_FEATURES must be defined #endif +#ifdef __cplusplus +extern "C" { +#endif /** * TCP_RANDOM_PORT: randomize port instead of simply increasing @@ -3561,27 +3564,34 @@ // so we do not define it. sntp server can come from dhcp server, or by // user. //#define SNTP_SERVER_ADDRESS "pool.ntp.org" // default -//#define SNTP_GET_SERVERS_FROM_DHCP // implicitely enabled by LWIP_DHCP_GET_NTP_SRV +//#define SNTP_GET_SERVERS_FROM_DHCP // implicitely enabled by LWIP_DHCP_GET_NTP_SRV -#define SNTP_SERVER_DNS 1 // enable SNTP support DNS names through sntp_setservername / sntp_getservername +#define SNTP_SERVER_DNS 1 // enable SNTP support DNS names through sntp_setservername / sntp_getservername #define SNTP_SET_SYSTEM_TIME_US(t,us) do { struct timeval tv = { t, us }; settimeofday(&tv, NULL); } while (0) +#define SNTP_SUPPRESS_DELAY_CHECK 1 +#define SNTP_UPDATE_DELAY_DEFAULT 3600000 // update delay defined by a default weak function +#define SNTP_UPDATE_DELAY sntp_update_delay_MS_rfc_not_less_than_15000() +extern uint32_t SNTP_UPDATE_DELAY; + #if LWIP_FEATURES -// lwip-1.4 had 3 possible SNTP servers (constant was harcoded) +// esp8266/arduino/lwip-1.4 had 3 possible SNTP servers (constant was harcoded) #define SNTP_MAX_SERVERS 3 #endif -// turn off random delay before sntp request -// when SNTP_STARTUP_DELAY is not defined, -// LWIP_RAND is used to set a delay +// no delay by default before sntp request +// https://github.com/esp8266/Arduino/pull/5564 // from sntp_opts.h: /** According to the RFC, this shall be a random delay * between 1 and 5 minutes (in milliseconds) to prevent load peaks. * This can be defined to a random generation function, * which must return the delay in milliseconds as u32_t. */ -#define SNTP_STARTUP_DELAY 0 +#define SNTP_STARTUP_DELAY 1 // enable startup delay +#define SNTP_STARTUP_DELAY_FUNC_DEFAULT 0 // to 0 by default via a default weak function +#define SNTP_STARTUP_DELAY_FUNC sntp_startup_delay_MS_rfc_not_less_than_60000() +extern uint32_t SNTP_STARTUP_DELAY_FUNC; /* -------------------------------------------------- @@ -3633,4 +3643,8 @@ void tcp_kill_timewait (void); #define MEMP_NUM_TCP_PCB_TIME_WAIT 5 #endif +#ifdef __cplusplus +} // extern "C" +#endif + #endif // MYLWIPOPTS_H From d4757542e479d2ff1d0dbb43d243110099540aa7 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 1 Oct 2019 00:42:46 +0200 Subject: [PATCH 15/58] use arduino IDE stable in CI (#6572) * fix CI by using a stable arduino/builder version * get rid of --allow-unauthenticated issue --- .travis.yml | 18 +++++++++--------- tests/common.sh | 29 ++++++++++++++++++++--------- tests/run_CI_locally.sh | 2 ++ 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index e6a2b4012..1e54251c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,14 +6,6 @@ git: depth: 1 submodules: false -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-7 - - gcc-7 - before_install: - git submodule update --init # no recursive update @@ -87,7 +79,11 @@ jobs: - name: "Host tests" stage: build script: $TRAVIS_BUILD_DIR/tests/ci/host_test.sh - install: sudo apt-get install valgrind lcov + install: + - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + - sudo apt-get update -q + - sudo apt-get install -y --allow-unauthenticated g++-7 gcc-7 + - sudo apt-get install valgrind lcov env: CC=gcc-7 CXX=g++-7 - name: "Docs" @@ -105,6 +101,10 @@ jobs: - name: "Mock trivial test" stage: build script: $TRAVIS_BUILD_DIR/tests/buildm.sh + install: + - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + - sudo apt-get update -q + - sudo apt-get install -y --allow-unauthenticated g++-7 gcc-7 env: CC=gcc-7 CXX=g++-7 - name: "Mac OSX can build sketches" diff --git a/tests/common.sh b/tests/common.sh index b93bd57ba..c5184cece 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -153,6 +153,14 @@ function install_libraries() function install_ide() { + #local idever='nightly' + #local ideurl='https://www.arduino.cc/download.php?f=/arduino-nightly' + + local idever='1.8.10' + local ideurl="https://downloads.arduino.cc/arduino-$idever" + + echo "using Arduino IDE distribution ${idever}" + local ide_path=$1 local core_path=$2 local debug=$3 @@ -164,8 +172,9 @@ function install_ide() choco install --no-progress unzip choco install --no-progress sed #choco install --no-progress golang - test -r arduino-nightly-windows.zip || wget -nv -O arduino-nightly-windows.zip https://www.arduino.cc/download.php?f=/arduino-nightly-windows.zip - unzip -q arduino-nightly-windows.zip + test -r arduino-windows.zip || wget -nv -O arduino-windows.zip "${ideurl}-windows.zip" + unzip -q arduino-windows.zip + mv arduino-${idever} arduino-distrib elif [ "$MACOSX" = "1" ]; then # MACOS only has next-to-obsolete Python2 installed. Install Python 3 from python.org wget https://www.python.org/ftp/python/3.7.4/python-3.7.4-macosx10.9.pkg @@ -173,15 +182,17 @@ function install_ide() # Install the Python3 certificates, because SSL connections fail w/o them and of course they aren't installed by default. ( cd "/Applications/Python 3.7/" && sudo "./Install Certificates.command" ) # Hack to place arduino-builder in the same spot as sane OSes - test -r arduino.zip || wget -O arduino.zip https://downloads.arduino.cc/arduino-nightly-macosx.zip - unzip -q arduino.zip - mv Arduino.app arduino-nightly - mv arduino-nightly/Contents/Java/* arduino-nightly/. + test -r arduino-macos.zip || wget -O arduino-macos.zip "${ideurl}-macosx.zip" + unzip -q arduino-macos.zip + mv Arduino.app arduino-distrib + mv arduino-distrib/Contents/Java/* arduino-distrib/. else - test -r arduino.tar.xz || wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz - tar xf arduino.tar.xz + #test -r arduino.tar.xz || wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz + test -r arduino-linux.tar.xz || wget -O arduino-linux.tar.xz "${ideurl}-linux64.tar.xz" + tar xf arduino-linux.tar.xz + mv arduino-${idever} arduino-distrib fi - mv arduino-nightly $ide_path + mv arduino-distrib $ide_path cd $ide_path/hardware mkdir esp8266com cd esp8266com diff --git a/tests/run_CI_locally.sh b/tests/run_CI_locally.sh index 65b91277f..a370461f6 100755 --- a/tests/run_CI_locally.sh +++ b/tests/run_CI_locally.sh @@ -84,6 +84,8 @@ done cp tests/platformio.sh tests/platformio-custom.sh sed -i 's,pip ,pip2 ,g' tests/platformio-custom.sh +git submodule update --init + export HOME="${TMPCI}" export TRAVIS_BUILD_DIR="${TMPCI}" export BUILD_TYPE="$BUILD_TYPE" From 97c926ea917049885df4ce57cc935062fccf8c50 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 30 Sep 2019 16:27:10 -0700 Subject: [PATCH 16/58] Move all PSTRs to own section, allow string dedup (#6565) * Move all PSTRs to own section, allow string dedup GNU ld can deduplicate strings, and does so for most normal char *s automatically. However, for PSTRs we were using a unique section per string *and* the section was not flagges as containing dedupable 0-terminated strings. Modify the PSTR macro to emit assembly, which lets us set the section flags required (SM) for the variables, and use inline assembly to get the asm-block defined address. Should result in smaller compiled binaries if any strings are duplicated. * Give each PSTR its own segment * Allow disposing of unused strings before merging Add the "a" section flag to allow the linker to throw away unneeded strings. Without this flag, the linker will not discard unreferenced strings and ROMs will increase in size, possibly dramatically. --- tools/sdk/ld/eagle.app.v6.common.ld.h | 3 +++ tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/sdk/ld/eagle.app.v6.common.ld.h b/tools/sdk/ld/eagle.app.v6.common.ld.h index 2f5735fff..383154e49 100644 --- a/tools/sdk/ld/eagle.app.v6.common.ld.h +++ b/tools/sdk/ld/eagle.app.v6.common.ld.h @@ -181,6 +181,9 @@ SECTIONS *libwps.a:(.literal.* .text.*) *(.irom0.literal .irom.literal .irom.text.literal .irom0.text .irom0.text.* .irom.text .irom.text.*) + /* Constant strings in flash (PSTRs) */ + *(.irom0.pstr.*) + /* __FUNCTION__ locals */ *(.rodata._ZZ*__FUNCTION__) *(.rodata._ZZ*__PRETTY_FUNCTION__) diff --git a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h index d74b8b000..20512bed4 100644 --- a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h +++ b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h @@ -23,6 +23,7 @@ extern "C" { // Ref: https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html // Place each progmem object into its own named section, avoiding conflicts #define PROGMEM __attribute__((section( "\".irom.text." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\""))) + #define PROGMEM_PSTR "\".irom0.pstr." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\"" #endif #ifndef PGM_P #define PGM_P const char * @@ -34,7 +35,12 @@ extern "C" { // PSTR() macro modified to start on a 32-bit boundary. This adds on average // 1.5 bytes/string, but in return memcpy_P and strcpy_P will work 4~8x faster #ifndef PSTR - #define PSTR(s) (__extension__({static const char __c[] __attribute__((__aligned__(4))) PROGMEM = (s); &__c[0];})) + // Adapted from AVR-specific code at https://forum.arduino.cc/index.php?topic=194603.0 + #define PSTR(str) (__extension__({ \ + PGM_P ptr; \ + asm volatile ( ".pushsection " PROGMEM_PSTR ", \"aSM\", @progbits, 1 \n .align 4 \n 0: .string " __STRINGIZE(str) "\n .popsection \n" ); \ + asm volatile ( "movi %0, 0b" : "=r" (ptr) ); \ + ptr; })) #endif // Flash memory must be read using 32 bit aligned addresses else a processor From 2a83adb0fd7593069d14e5dbdfa221687972eca5 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Tue, 1 Oct 2019 05:23:25 +0200 Subject: [PATCH 17/58] Fix setURL() handling of path-only parameters (#6570) The function accidentally compared the current location instead of the passed in (new) location, which didn't match intended logic and the code comment. --- libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 6503ea839..61b9a8e4f 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -536,8 +536,8 @@ void HTTPClient::setTimeout(uint16_t timeout) bool HTTPClient::setURL(String url) { // if the new location is only a path then only update the URI - if (_location.startsWith("/")) { - _uri = _location; + if (url && url[0] == '/') { + _uri = url; clear(); return true; } From 1d26b282259680b8058bab21d3a356f9a5b952c0 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Tue, 1 Oct 2019 05:58:09 +0200 Subject: [PATCH 18/58] Remove duplicated sha1 implementation (Fixes #6568) (#6569) * Remove duplicated sha1 implementation (Fixes #6568) The Hash library had its own copy of a loop-unrolled sha1 implementation adding a large code footprint for no good reason, as there are several sha1 implementations already in tree (one in NONOS-SDK as well as one in bearssl). Switching to the bearssl one is straightforward and removes about 3kb of code size overhead. Also cleanup some obvious inefficiencies (copy by value, string summing, no reservation causing repeated reallocations) in the implementation. * Remove overload variants for sha1(...) that accept nonconst data The data is always remaining unmodified, so non-const overloads are confusing and redundant. Also optimize the hexify variant a bit more. --- libraries/Hash/src/Hash.cpp | 53 +++------ libraries/Hash/src/Hash.h | 12 +- libraries/Hash/src/sha1/sha1.c | 208 --------------------------------- libraries/Hash/src/sha1/sha1.h | 32 ----- 4 files changed, 20 insertions(+), 285 deletions(-) delete mode 100644 libraries/Hash/src/sha1/sha1.c delete mode 100644 libraries/Hash/src/sha1/sha1.h diff --git a/libraries/Hash/src/Hash.cpp b/libraries/Hash/src/Hash.cpp index 5a58c961d..2d8866361 100644 --- a/libraries/Hash/src/Hash.cpp +++ b/libraries/Hash/src/Hash.cpp @@ -23,22 +23,18 @@ */ #include +#include #include "Hash.h" -extern "C" { -#include "sha1/sha1.h" -} - /** * create a sha1 hash from data * @param data uint8_t * * @param size uint32_t * @param hash uint8_t[20] */ -void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) { - - SHA1_CTX ctx; +void sha1(const uint8_t* data, uint32_t size, uint8_t hash[20]) { + br_sha1_context ctx; #ifdef DEBUG_SHA1 os_printf("DATA:"); @@ -53,9 +49,9 @@ void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) { os_printf("\n"); #endif - SHA1Init(&ctx); - SHA1Update(&ctx, data, size); - SHA1Final(hash, &ctx); + br_sha1_init(&ctx); + br_sha1_update(&ctx, data, size); + br_sha1_out(&ctx, hash); #ifdef DEBUG_SHA1 os_printf("SHA1:"); @@ -66,52 +62,35 @@ void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]) { #endif } -void sha1(char * data, uint32_t size, uint8_t hash[20]) { - sha1((uint8_t *) data, size, hash); +void sha1(const char* data, uint32_t size, uint8_t hash[20]) { + sha1((const uint8_t *) data, size, hash); } -void sha1(const uint8_t * data, uint32_t size, uint8_t hash[20]) { - sha1((uint8_t *) data, size, hash); -} - -void sha1(const char * data, uint32_t size, uint8_t hash[20]) { - sha1((uint8_t *) data, size, hash); -} - -void sha1(String data, uint8_t hash[20]) { +void sha1(const String& data, uint8_t hash[20]) { sha1(data.c_str(), data.length(), hash); } -String sha1(uint8_t* data, uint32_t size) { +String sha1(const uint8_t* data, uint32_t size) { uint8_t hash[20]; - String hashStr = ""; + String hashStr((const char*)nullptr); + hashStr.reserve(20 * 2 + 1); sha1(&data[0], size, &hash[0]); for(uint16_t i = 0; i < 20; i++) { - String hex = String(hash[i], HEX); - if(hex.length() < 2) { - hex = "0" + hex; - } + char hex[3]; + snprintf(hex, sizeof(hex), "%02x", hash[i]); hashStr += hex; } return hashStr; } -String sha1(char* data, uint32_t size) { - return sha1((uint8_t*) data, size); -} - -String sha1(const uint8_t* data, uint32_t size) { - return sha1((uint8_t*) data, size); -} - String sha1(const char* data, uint32_t size) { - return sha1((uint8_t*) data, size); + return sha1((const uint8_t*) data, size); } -String sha1(String data) { +String sha1(const String& data) { return sha1(data.c_str(), data.length()); } diff --git a/libraries/Hash/src/Hash.h b/libraries/Hash/src/Hash.h index 774b8aad1..67a315112 100644 --- a/libraries/Hash/src/Hash.h +++ b/libraries/Hash/src/Hash.h @@ -27,16 +27,12 @@ //#define DEBUG_SHA1 -void sha1(uint8_t * data, uint32_t size, uint8_t hash[20]); -void sha1(char * data, uint32_t size, uint8_t hash[20]); -void sha1(const uint8_t * data, uint32_t size, uint8_t hash[20]); -void sha1(const char * data, uint32_t size, uint8_t hash[20]); -void sha1(String data, uint8_t hash[20]); +void sha1(const uint8_t* data, uint32_t size, uint8_t hash[20]); +void sha1(const char* data, uint32_t size, uint8_t hash[20]); +void sha1(const String& data, uint8_t hash[20]); -String sha1(uint8_t* data, uint32_t size); -String sha1(char* data, uint32_t size); String sha1(const uint8_t* data, uint32_t size); String sha1(const char* data, uint32_t size); -String sha1(String data); +String sha1(const String& data); #endif /* HASH_H_ */ diff --git a/libraries/Hash/src/sha1/sha1.c b/libraries/Hash/src/sha1/sha1.c deleted file mode 100644 index fae926462..000000000 --- a/libraries/Hash/src/sha1/sha1.c +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @file sha1.c - * @date 20.05.2015 - * @author Steve Reid - * - * from: http://www.virtualbox.org/svn/vbox/trunk/src/recompiler/tests/sha1.c - */ - -/* from valgrind tests */ - -/* ================ sha1.c ================ */ -/* - SHA-1 in C - By Steve Reid - 100% Public Domain - - Test Vectors (from FIPS PUB 180-1) - "abc" - A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" - 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 - A million repetitions of "a" - 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F -*/ - -/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */ -/* #define SHA1HANDSOFF * Copies data before messing with it. */ - -#define SHA1HANDSOFF - -#include -#include -#include -#include - -#include "sha1.h" - -//#include - -#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) - -/* blk0() and blk() perform the initial expand. */ -/* I got the idea of expanding during the round function from SSLeay */ -#if BYTE_ORDER == LITTLE_ENDIAN -#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ - |(rol(block->l[i],8)&0x00FF00FF)) -#elif BYTE_ORDER == BIG_ENDIAN -#define blk0(i) block->l[i] -#else -#error "Endianness not defined!" -#endif -#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ - ^block->l[(i+2)&15]^block->l[i&15],1)) - -/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); -#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); -#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); -#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); - - -/* Hash a single 512-bit block. This is the core of the algorithm. */ - -void ICACHE_FLASH_ATTR SHA1Transform(uint32_t state[5], uint8_t buffer[64]) -{ -uint32_t a, b, c, d, e; -typedef union { - unsigned char c[64]; - uint32_t l[16]; -} CHAR64LONG16; -#ifdef SHA1HANDSOFF -CHAR64LONG16 block[1]; /* use array to appear as a pointer */ - memcpy(block, buffer, 64); -#else - /* The following had better never be used because it causes the - * pointer-to-const buffer to be cast into a pointer to non-const. - * And the result is written through. I threw a "const" in, hoping - * this will cause a diagnostic. - */ -CHAR64LONG16* block = (const CHAR64LONG16*)buffer; -#endif - /* Copy context->state[] to working vars */ - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - /* 4 rounds of 20 operations each. Loop unrolled. */ - R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); - R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); - R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); - R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); - R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); - R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); - R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); - R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); - R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); - R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); - R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); - R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); - R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); - R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); - R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); - R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); - R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); - R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); - R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); - R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); - /* Add the working vars back into context.state[] */ - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - /* Wipe variables */ - a = b = c = d = e = 0; -#ifdef SHA1HANDSOFF - memset(block, '\0', sizeof(block)); -#endif -} - - -/* SHA1Init - Initialize new context */ - -void ICACHE_FLASH_ATTR SHA1Init(SHA1_CTX* context) -{ - /* SHA1 initialization constants */ - context->state[0] = 0x67452301; - context->state[1] = 0xEFCDAB89; - context->state[2] = 0x98BADCFE; - context->state[3] = 0x10325476; - context->state[4] = 0xC3D2E1F0; - context->count[0] = context->count[1] = 0; -} - - -/* Run your data through this. */ - -void ICACHE_FLASH_ATTR SHA1Update(SHA1_CTX* context, uint8_t* data, uint32_t len) -{ - uint32_t i; - uint32_t j; - - j = context->count[0]; - if ((context->count[0] += len << 3) < j) - context->count[1]++; - context->count[1] += (len>>29); - j = (j >> 3) & 63; - if ((j + len) > 63) { - memcpy(&context->buffer[j], data, (i = 64-j)); - SHA1Transform(context->state, context->buffer); - for ( ; i + 63 < len; i += 64) { - SHA1Transform(context->state, &data[i]); - } - j = 0; - } - else i = 0; - memcpy(&context->buffer[j], &data[i], len - i); -} - - -/* Add padding and return the message digest. */ - -void ICACHE_FLASH_ATTR SHA1Final(unsigned char digest[20], SHA1_CTX* context) -{ -unsigned i; -unsigned char finalcount[8]; -unsigned char c; - -#if 0 /* untested "improvement" by DHR */ - /* Convert context->count to a sequence of bytes - * in finalcount. Second element first, but - * big-endian order within element. - * But we do it all backwards. - */ - unsigned char *fcp = &finalcount[8]; - - for (i = 0; i < 2; i++) - { - uint32_t t = context->count[i]; - int j; - - for (j = 0; j < 4; t >>= 8, j++) - *--fcp = (unsigned char) t; - } -#else - for (i = 0; i < 8; i++) { - finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] - >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ - } -#endif - c = 0200; - SHA1Update(context, &c, 1); - while ((context->count[0] & 504) != 448) { - c = 0000; - SHA1Update(context, &c, 1); - } - SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ - for (i = 0; i < 20; i++) { - digest[i] = (unsigned char) - ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); - } - /* Wipe variables */ - memset(context, '\0', sizeof(*context)); - memset(&finalcount, '\0', sizeof(finalcount)); -} -/* ================ end of sha1.c ================ */ diff --git a/libraries/Hash/src/sha1/sha1.h b/libraries/Hash/src/sha1/sha1.h deleted file mode 100644 index 158bd76b3..000000000 --- a/libraries/Hash/src/sha1/sha1.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @file sha1.h - * @date 20.05.2015 - * @author Steve Reid - * - * from: http://www.virtualbox.org/svn/vbox/trunk/src/recompiler/tests/sha1.c - */ - -/* ================ sha1.h ================ */ -/* - SHA-1 in C - By Steve Reid - 100% Public Domain -*/ - -#ifndef SHA1_H_ -#define SHA1_H_ - -typedef struct { - uint32_t state[5]; - uint32_t count[2]; - unsigned char buffer[64]; -} SHA1_CTX; - -void SHA1Transform(uint32_t state[5], uint8_t buffer[64]); -void SHA1Init(SHA1_CTX* context); -void SHA1Update(SHA1_CTX* context, uint8_t* data, uint32_t len); -void SHA1Final(unsigned char digest[20], SHA1_CTX* context); - -#endif /* SHA1_H_ */ - -/* ================ end of sha1.h ================ */ From 1aeea124b358c3dc63e1c6fb96376695cf24840b Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 30 Sep 2019 22:35:23 -0700 Subject: [PATCH 19/58] Speed up empty String creation slightly (#6573) As @dirkmuller found out in #6568, there is a difference in code executed between `String str(nullptr)` and `String str("")`, but in the end the actual object is identical. It's a few bytes of code, but every little bit counts. Update the default `String()` constructor to use `nullptr` and not `""`. This will remove a constant literal load and the execution of the String::copy method and strlen(). --- cores/esp8266/WString.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/WString.h b/cores/esp8266/WString.h index 558d1da85..8c970abf1 100644 --- a/cores/esp8266/WString.h +++ b/cores/esp8266/WString.h @@ -53,7 +53,7 @@ class String { // if the initial value is null or invalid, or if memory allocation // fails, the string will be marked as invalid (i.e. "if (s)" will // be false). - String(const char *cstr = ""); + String(const char *cstr = nullptr); String(const String &str); String(const __FlashStringHelper *str); #ifdef __GXX_EXPERIMENTAL_CXX0X__ From 215459fda4dec459bffb85e9a6e82cdf00d5f018 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Tue, 1 Oct 2019 13:02:02 -0700 Subject: [PATCH 20/58] Replace ASM block w/C macro for PSTR (#6577) * Replace ASM block w/C marco for PSTR GAS doesn't support the C language idiom of catenating two strings together with quotes (i.e. "x" "y" === "xy"). Specify the section attribute fully in the section attribute, instead, to allow this. * Fix WString optimization PR #6573 introduced a corner case where a blind String() without any initialization was in an in invalid state because the buffer and len would not be updated properly. Concatenating to the empty string could cause a failure. Now, set the default state in ::init() to SSO (which is what happened before when we were using String(char *s="")) and fix the crash. --- cores/esp8266/WString.cpp | 5 ++--- tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h | 8 ++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp index 048704074..5e31b2770 100644 --- a/cores/esp8266/WString.cpp +++ b/cores/esp8266/WString.cpp @@ -129,10 +129,9 @@ String::~String() { // /*********************************************/ inline void String::init(void) { - setSSO(false); - setCapacity(0); + setSSO(true); setLen(0); - setBuffer(nullptr); + wbuffer()[0] = 0; } void String::invalidate(void) { diff --git a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h index 20512bed4..3613455bb 100644 --- a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h +++ b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h @@ -23,7 +23,6 @@ extern "C" { // Ref: https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html // Place each progmem object into its own named section, avoiding conflicts #define PROGMEM __attribute__((section( "\".irom.text." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\""))) - #define PROGMEM_PSTR "\".irom0.pstr." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\"" #endif #ifndef PGM_P #define PGM_P const char * @@ -36,11 +35,8 @@ extern "C" { // 1.5 bytes/string, but in return memcpy_P and strcpy_P will work 4~8x faster #ifndef PSTR // Adapted from AVR-specific code at https://forum.arduino.cc/index.php?topic=194603.0 - #define PSTR(str) (__extension__({ \ - PGM_P ptr; \ - asm volatile ( ".pushsection " PROGMEM_PSTR ", \"aSM\", @progbits, 1 \n .align 4 \n 0: .string " __STRINGIZE(str) "\n .popsection \n" ); \ - asm volatile ( "movi %0, 0b" : "=r" (ptr) ); \ - ptr; })) + // Uses C attribute section instead of ASM block to allow for C language string concatenation ("x" "y" === "xy") + #define PSTR(s) (__extension__({static const char __c[] __attribute__((__aligned__(4))) __attribute__((section( "\".irom0.pstr." __FILE__ "." __STRINGIZE(__LINE__) "." __STRINGIZE(__COUNTER__) "\", \"aSM\", @progbits, 1 #"))) = (s); &__c[0];})) #endif // Flash memory must be read using 32 bit aligned addresses else a processor From 9388d08a1db24788ed401f933951b37abeeaeba2 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Wed, 2 Oct 2019 17:54:03 +0200 Subject: [PATCH 21/58] prepare alpha channel release builder (#6512) --- package/build_boards_manager_package.sh | 48 +++++++++++++++---------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/package/build_boards_manager_package.sh b/package/build_boards_manager_package.sh index 8220ad236..f5ffff447 100755 --- a/package/build_boards_manager_package.sh +++ b/package/build_boards_manager_package.sh @@ -3,25 +3,37 @@ #set -x -# Extract next version from platform.txt -next=`sed -n -E 's/version=([0-9.]+)/\1/p' ../platform.txt` +ver=`git describe --tag` +visiblever=$ver +if [ "$ver" = 0.0.1 ]; then -# Figure out how will the package be called -ver=`git describe --exact-match` -if [ $? -ne 0 ]; then - # not tagged version; generate nightly package - date_str=`date +"%Y%m%d"` - is_nightly=1 - plain_ver="${next}-nightly" - ver="${plain_ver}+${date_str}" -else + git tag -d 0.0.1 + ver=`git describe --tag HEAD` plain_ver=$ver + +else + + # Extract next version from platform.txt + next=`sed -n -E 's/version=([0-9.]+)/\1/p' ../platform.txt` + + # Figure out how will the package be called + ver=`git describe --exact-match` + if [ $? -ne 0 ]; then + # not tagged version; generate nightly package + date_str=`date +"%Y%m%d"` + is_nightly=1 + plain_ver="${next}-nightly" + ver="${plain_ver}+${date_str}" + else + plain_ver=$ver + fi + visiblever=$ver fi set -e -package_name=esp8266-$ver -echo "Version: $ver" +package_name=esp8266-$visiblever +echo "Version: $visiblever ($ver)" echo "Package name: $package_name" # Set REMOTE_URL environment variable to the address where the package will be @@ -34,7 +46,7 @@ echo "Remote: $REMOTE_URL" if [ -z "$PKG_URL" ]; then if [ -z "$PKG_URL_PREFIX" ]; then - PKG_URL_PREFIX="$REMOTE_URL/versions/$ver" + PKG_URL_PREFIX="$REMOTE_URL/versions/$visiblever" fi PKG_URL="$PKG_URL_PREFIX/$package_name.zip" fi @@ -43,9 +55,9 @@ echo "Docs: $DOC_URL" pushd .. # Create directory for the package -outdir=package/versions/$ver/$package_name +outdir=package/versions/$visiblever/$package_name srcdir=$PWD -rm -rf package/versions/$ver +rm -rf package/versions/$visiblever mkdir -p $outdir # Some files should be excluded from the package @@ -96,7 +108,7 @@ echo \#define ARDUINO_ESP8266_RELEASE_$ver_define >>$outdir/cores/esp8266/core_v echo \#define ARDUINO_ESP8266_RELEASE \"$ver_define\" >>$outdir/cores/esp8266/core_version.h # Zip the package -pushd package/versions/$ver +pushd package/versions/$visiblever echo "Making $package_name.zip" zip -qr $package_name.zip $package_name rm -rf $package_name @@ -109,7 +121,7 @@ echo SHA-256: $sha echo "Making package_esp8266com_index.json" -jq_arg=".packages[0].platforms[0].version = \"$ver\" | \ +jq_arg=".packages[0].platforms[0].version = \"$visiblever\" | \ .packages[0].platforms[0].url = \"$PKG_URL\" |\ .packages[0].platforms[0].archiveFileName = \"$package_name.zip\"" From 899893294c50ae304148d3d1b7c589d34e44a87c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Wed, 2 Oct 2019 19:26:47 +0200 Subject: [PATCH 22/58] Align to latest EspSoftwareSerial release (#6584) * Align to latest EspSoftwareSerial release - nothing ESP8266 specific, but drifting versions otherwise makes life hard for users. * ghostl array compatibility: aggregate initialization, no implicit cast to T*. --- libraries/SoftwareSerial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 6d9f11595..67836ae6e 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 6d9f1159555f3025078b3510605b5a2721708535 +Subproject commit 67836ae6eecabafd760d32168144f82d46f3b201 From fb2cbe36a1c162baebc47e0a65210eeabb3eae31 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Thu, 3 Oct 2019 08:21:07 -0700 Subject: [PATCH 23/58] Fix pgm_read_float_unaligned macro (#6593) Fixes #6590 The ASM block that implements the read-uint32-unaligned returns a uint32_t. The old code was doing a cast like `(float)(uint32_t ret) which actually goes and creates a new float of the positive uint value (approx, of course due to exponent and sign bits) which is not correct. C and C++ don't have a concise way to convert the bits in a register from int to float interpretation, so avoid the whole issue by making a new function which uses the same ASM block as the read-uint32-unaligned, just make the destination and return values as floats. --- tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h index 3613455bb..ce0dc78b3 100644 --- a/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h +++ b/tools/sdk/libc/xtensa-lx106-elf/include/sys/pgmspace.h @@ -80,6 +80,14 @@ static inline uint16_t pgm_read_word_inlined(const void* addr) { return (uint16_t) res; /* This masks the lower half-word from the returned word */ } +/* Can't legally cast bits of uint32_t to a float w/o conversion or std::memcpy, which is inefficient. */ +/* The ASM block doesn't care the type, so just pass in what C thinks is a float and return in custom fcn. */ +static inline float pgm_read_float_unaligned(const void *addr) { + register float res; + pgm_read_with_offset(addr, res); + return res; +} + #define pgm_read_byte(addr) pgm_read_byte_inlined(addr) #define pgm_read_word_aligned(addr) pgm_read_word_inlined(addr) #ifdef __cplusplus @@ -98,7 +106,6 @@ static inline uint32_t pgm_read_dword_unaligned(const void *addr) { return res; } -#define pgm_read_float_unaligned(addr) ((float)pgm_read_dword_unaligned(addr)) #define pgm_read_ptr_unaligned(addr) ((void*)pgm_read_dword_unaligned(addr)) #define pgm_read_word_unaligned(addr) ((uint16_t)(pgm_read_dword_unaligned(addr) & 0xffff)) From 3890e1af1eb9ffc9ef95083ffcb23db26b36fadc Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Fri, 4 Oct 2019 04:17:36 +0200 Subject: [PATCH 24/58] Put longer string literals into PROGMEM (#6588) * Put longer string literals into PROGMEM * Use Flash Strings for Debug output This is hopefully very infrequently used, so it shouldn't be in main memory. --- .../src/ESP8266HTTPClient.cpp | 12 ++++---- .../ESP8266HTTPClient/src/ESP8266HTTPClient.h | 2 +- libraries/ESP8266WebServer/src/Parsing-impl.h | 2 +- libraries/ESP8266WiFi/src/ESP8266WiFi.cpp | 30 +++++++------------ 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 61b9a8e4f..a05b9dd6f 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -113,8 +113,8 @@ protected: * constructor */ HTTPClient::HTTPClient() + : _client(nullptr), _userAgent(F("ESP8266HTTPClient")) { - _client = nullptr; #if HTTPCLIENT_1_1_COMPATIBLE _tcpDeprecated.reset(nullptr); #endif @@ -1294,21 +1294,21 @@ int HTTPClient::handleHeaderResponse() String headerValue = headerLine.substring(headerLine.indexOf(':') + 1); headerValue.trim(); - if(headerName.equalsIgnoreCase("Content-Length")) { + if(headerName.equalsIgnoreCase(F("Content-Length"))) { _size = headerValue.toInt(); } - if(_canReuse && headerName.equalsIgnoreCase("Connection")) { + if(_canReuse && headerName.equalsIgnoreCase(F("Connection"))) { if(headerValue.indexOf("close") >= 0 && headerValue.indexOf("keep-alive") < 0) { _canReuse = false; } } - if(headerName.equalsIgnoreCase("Transfer-Encoding")) { + if(headerName.equalsIgnoreCase(F("Transfer-Encoding"))) { transferEncoding = headerValue; } - if(headerName.equalsIgnoreCase("Location")) { + if(headerName.equalsIgnoreCase(F("Location"))) { _location = headerValue; } @@ -1334,7 +1334,7 @@ int HTTPClient::handleHeaderResponse() if(transferEncoding.length() > 0) { DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] Transfer-Encoding: %s\n", transferEncoding.c_str()); - if(transferEncoding.equalsIgnoreCase("chunked")) { + if(transferEncoding.equalsIgnoreCase(F("chunked"))) { _transferEncoding = HTTPC_TE_CHUNKED; } else { return HTTPC_ERROR_ENCODING; diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 189070a98..d6e4f88c0 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -242,7 +242,7 @@ protected: String _uri; String _protocol; String _headers; - String _userAgent = "ESP8266HTTPClient"; + String _userAgent; String _base64Authorization; /// Response handling diff --git a/libraries/ESP8266WebServer/src/Parsing-impl.h b/libraries/ESP8266WebServer/src/Parsing-impl.h index c6b8ea16e..decc9c8e0 100644 --- a/libraries/ESP8266WebServer/src/Parsing-impl.h +++ b/libraries/ESP8266WebServer/src/Parsing-impl.h @@ -238,7 +238,7 @@ bool ESP8266WebServerTemplate::_parseRequest(ClientType& client) { DEBUG_OUTPUT.println(headerValue); #endif - if (headerName.equalsIgnoreCase("Host")){ + if (headerName.equalsIgnoreCase(F("Host"))){ _hostHeader = headerValue; } } diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp index 146c968a5..8f63a97fa 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp +++ b/libraries/ESP8266WiFi/src/ESP8266WiFi.cpp @@ -49,24 +49,24 @@ extern "C" { * @param p Print interface */ void ESP8266WiFiClass::printDiag(Print& p) { - const char* modes[] = { "NULL", "STA", "AP", "STA+AP" }; - p.print("Mode: "); + const char* const modes[] = { "NULL", "STA", "AP", "STA+AP" }; + p.print(F("Mode: ")); p.println(modes[wifi_get_opmode()]); - const char* phymodes[] = { "", "B", "G", "N" }; - p.print("PHY mode: "); + const char* const phymodes[] = { "", "B", "G", "N" }; + p.print(F("PHY mode: ")); p.println(phymodes[(int) wifi_get_phy_mode()]); - p.print("Channel: "); + p.print(F("Channel: ")); p.println(wifi_get_channel()); - p.print("AP id: "); + p.print(F("AP id: ")); p.println(wifi_station_get_current_ap_id()); - p.print("Status: "); + p.print(F("Status: ")); p.println(wifi_station_get_connect_status()); - p.print("Auto connect: "); + p.print(F("Auto connect: ")); p.println(wifi_station_get_auto_connect()); struct station_config conf; @@ -75,22 +75,14 @@ void ESP8266WiFiClass::printDiag(Print& p) { char ssid[33]; //ssid can be up to 32chars, => plus null term memcpy(ssid, conf.ssid, sizeof(conf.ssid)); ssid[32] = 0; //nullterm in case of 32 char ssid - - p.print("SSID ("); - p.print(strlen(ssid)); - p.print("): "); - p.println(ssid); + p.printf_P(PSTR("SSID (%d): %s\n"), strlen(ssid), ssid); char passphrase[65]; memcpy(passphrase, conf.password, sizeof(conf.password)); passphrase[64] = 0; + p.printf_P(PSTR("Passphrase (%d): %s\n"), strlen(passphrase), passphrase); - p.print("Passphrase ("); - p.print(strlen(passphrase)); - p.print("): "); - p.println(passphrase); - - p.print("BSSID set: "); + p.print(F("BSSID set: ")); p.println(conf.bssid_set); } From bab2880f016d9152b29fa5c5e9b06a2b5b015dbc Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Sat, 5 Oct 2019 00:36:40 +0200 Subject: [PATCH 25/58] Base64::encode : const correctness / String by reference passing (#6581) This is another instance in the core library where we pass in read-only parameters as pass-by-value, where in the case of String() that is inefficient as it involves copy-constructor/temp string creations. --- cores/esp8266/base64.cpp | 10 +++++----- cores/esp8266/base64.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cores/esp8266/base64.cpp b/cores/esp8266/base64.cpp index 3ae51f5a0..7771153b0 100644 --- a/cores/esp8266/base64.cpp +++ b/cores/esp8266/base64.cpp @@ -31,11 +31,11 @@ extern "C" { /** * convert input data to base64 - * @param data uint8_t * + * @param data const uint8_t * * @param length size_t * @return String */ -String base64::encode(uint8_t * data, size_t length, bool doNewLines) { +String base64::encode(const uint8_t * data, size_t length, bool doNewLines) { // base64 needs more size then the source data, use cencode.h macros size_t size = ((doNewLines ? base64_encode_expected_len(length) : base64_encode_expected_len_nonewlines(length)) + 1); @@ -62,10 +62,10 @@ String base64::encode(uint8_t * data, size_t length, bool doNewLines) { /** * convert input data to base64 - * @param text String + * @param text const String& * @return String */ -String base64::encode(String text, bool doNewLines) { - return base64::encode((uint8_t *) text.c_str(), text.length(), doNewLines); +String base64::encode(const String& text, bool doNewLines) { + return base64::encode((const uint8_t *) text.c_str(), text.length(), doNewLines); } diff --git a/cores/esp8266/base64.h b/cores/esp8266/base64.h index 67140123e..2816877da 100644 --- a/cores/esp8266/base64.h +++ b/cores/esp8266/base64.h @@ -30,8 +30,8 @@ class base64 { // NOTE: The default behaviour of backend (lib64) // is to add a newline every 72 (encoded) characters output. // This may 'break' longer uris and json variables - static String encode(uint8_t * data, size_t length, bool doNewLines = true); - static String encode(String text, bool doNewLines = true); + static String encode(const uint8_t * data, size_t length, bool doNewLines = true); + static String encode(const String& text, bool doNewLines = true); private: }; From 5d20137339442982172dd6d84488f0c2bb639930 Mon Sep 17 00:00:00 2001 From: Kristian Sloth Lauszus Date: Sat, 5 Oct 2019 02:25:54 +0200 Subject: [PATCH 26/58] Set SPI_HAS_TRANSACTION to 1 (#6591) See #2639 --- libraries/SPI/SPI.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index e8fb8a390..40ed0d944 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -24,7 +24,7 @@ #include #include -#define SPI_HAS_TRANSACTION +#define SPI_HAS_TRANSACTION 1 // This defines are not representing the real Divider of the ESP8266 // the Defines match to an AVR Arduino on 16MHz for better compatibility From d4897cd2166380c589e2ca8685ea397948a05c46 Mon Sep 17 00:00:00 2001 From: c0degeek Date: Sat, 5 Oct 2019 20:28:33 +0200 Subject: [PATCH 27/58] Added Chip ID into HTTP header (#3877) --- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index d3029c453..7c3d128f4 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -263,6 +263,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& http.setTimeout(_httpClientTimeout); http.setFollowRedirects(_followRedirects); http.setUserAgent(F("ESP8266-http-Update")); + http.addHeader(F("x-ESP8266-Chip-ID"), String(ESP.getChipId())); http.addHeader(F("x-ESP8266-STA-MAC"), WiFi.macAddress()); http.addHeader(F("x-ESP8266-AP-MAC"), WiFi.softAPmacAddress()); http.addHeader(F("x-ESP8266-free-space"), String(ESP.getFreeSketchSpace())); From 08a0414ee07918309c6a7ea1b5e048cd443c19c9 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sat, 5 Oct 2019 22:27:42 +0200 Subject: [PATCH 28/58] remove esptool.py --trace option (#6606) fixes #6605 --- platform.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform.txt b/platform.txt index 8bccbe2af..bfe7912c2 100644 --- a/platform.txt +++ b/platform.txt @@ -137,7 +137,8 @@ tools.esptool.cmd={runtime.platform.path}/tools/python3/python3 tools.esptool.network_cmd={runtime.platform.path}/tools/python3/python3 tools.esptool.upload.protocol=esp -tools.esptool.upload.params.verbose=--trace +# esptool.py --trace option is a debug option, not a verbose option +tools.esptool.upload.params.verbose= tools.esptool.upload.params.quiet= # First, potentially perform an erase or nothing From a00a4744d06d370513c010ce73002281987beb7c Mon Sep 17 00:00:00 2001 From: Develo Date: Sat, 5 Oct 2019 22:21:41 -0300 Subject: [PATCH 29/58] Update EEPROM.cpp (#6599) use InterruptLock class for scoped interrupts instead of blindly disabling/enabling interrupts, which doesn't support nesting nor restore previous state. Add forgotten include Remove locks, simplify code Fix typo Drop needless include --- libraries/EEPROM/EEPROM.cpp | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/libraries/EEPROM/EEPROM.cpp b/libraries/EEPROM/EEPROM.cpp index a46638b6d..90bbf8ca5 100644 --- a/libraries/EEPROM/EEPROM.cpp +++ b/libraries/EEPROM/EEPROM.cpp @@ -71,11 +71,8 @@ void EEPROMClass::begin(size_t size) { _size = size; - noInterrupts(); - auto ret = spi_flash_read(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); - interrupts(); - if (ret != SPI_FLASH_RESULT_OK) { - DEBUGV("EEPROMClass::begin spi_flash_read failed, %d\n", (int)ret); + if (!ESP.flashRead(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { + DEBUGV("EEPROMClass::begin flash read failed\n"); } _dirty = false; //make sure dirty is cleared in case begin() is called 2nd+ time @@ -128,7 +125,6 @@ void EEPROMClass::write(int const address, uint8_t const value) { } bool EEPROMClass::commit() { - bool ret = false; if (!_size) return false; if(!_dirty) @@ -136,22 +132,15 @@ bool EEPROMClass::commit() { if(!_data) return false; - noInterrupts(); - auto flashret = spi_flash_erase_sector(_sector); - if (flashret == SPI_FLASH_RESULT_OK) { - flashret = spi_flash_write(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size); - if (flashret == SPI_FLASH_RESULT_OK) { + if (ESP.flashEraseSector(_sector)) { + if (ESP.flashWrite(_sector * SPI_FLASH_SEC_SIZE, reinterpret_cast(_data), _size)) { _dirty = false; - ret = true; + return true; } } - interrupts(); - if (flashret != SPI_FLASH_RESULT_OK) { - DEBUGV("EEPROMClass::commit failed, %d\n", (int)flashret); - } - - return ret; + DEBUGV("EEPROMClass::commit failed\n"); + return false; } uint8_t * EEPROMClass::getDataPtr() { From d1b70dfc1d457739fbe9cfb60260d3a4c298eff5 Mon Sep 17 00:00:00 2001 From: Develo Date: Sun, 6 Oct 2019 00:07:26 -0300 Subject: [PATCH 30/58] Minor cleanups in ESPClass (#6608) * Minor cleanups in ESPClass Related to #6599 Fix inverted conditions Remove useless comments --- cores/esp8266/Esp.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index a21dc4bc0..c7d66cef4 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -494,7 +494,7 @@ uint32_t EspClass::getSketchSize() { image_header_t image_header; uint32_t pos = APP_START_OFFSET; - if (spi_flash_read(pos, (uint32_t*) &image_header, sizeof(image_header))) { + if (spi_flash_read(pos, (uint32_t*) &image_header, sizeof(image_header)) != SPI_FLASH_RESULT_OK) { return 0; } pos += sizeof(image_header); @@ -506,7 +506,7 @@ uint32_t EspClass::getSketchSize() { ++section_index) { section_header_t section_header = {0, 0}; - if (spi_flash_read(pos, (uint32_t*) §ion_header, sizeof(section_header))) { + if (spi_flash_read(pos, (uint32_t*) §ion_header, sizeof(section_header)) != SPI_FLASH_RESULT_OK) { return 0; } pos += sizeof(section_header); @@ -579,24 +579,25 @@ bool EspClass::flashEraseSector(uint32_t sector) { #if PUYA_SUPPORT static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { if (data == nullptr) { - return 1; // SPI_FLASH_RESULT_ERR + return SPI_FLASH_RESULT_ERR; } // PUYA flash chips need to read existing data, update in memory and write modified data again. static uint32_t *flash_write_puya_buf = nullptr; - int rc = 0; - uint32_t* ptr = data; if (flash_write_puya_buf == nullptr) { flash_write_puya_buf = (uint32_t*) malloc(PUYA_BUFFER_SIZE); // No need to ever free this, since the flash chip will never change at runtime. if (flash_write_puya_buf == nullptr) { // Memory could not be allocated. - return 1; // SPI_FLASH_RESULT_ERR + return SPI_FLASH_RESULT_ERR; } } + + SpiFlashOpResult rc = SPI_FLASH_RESULT_OK; + uint32_t* ptr = data; size_t bytesLeft = size; uint32_t pos = offset; - while (bytesLeft > 0 && rc == 0) { + while (bytesLeft > 0 && rc == SPI_FLASH_RESULT_OK) { size_t bytesNow = bytesLeft; if (bytesNow > PUYA_BUFFER_SIZE) { bytesNow = PUYA_BUFFER_SIZE; @@ -605,8 +606,8 @@ static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { bytesLeft = 0; } rc = spi_flash_read(pos, flash_write_puya_buf, bytesNow); - if (rc != 0) { - return rc; + if (rc != SPI_FLASH_RESULT_OK) { + return (int)rc; } for (size_t i = 0; i < bytesNow / 4; ++i) { flash_write_puya_buf[i] &= *ptr; @@ -615,12 +616,12 @@ static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { rc = spi_flash_write(pos, flash_write_puya_buf, bytesNow); pos += bytesNow; } - return rc; + return (int)rc; } #endif bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) { - int rc = 0; + SpiFlashOpResult rc = SPI_FLASH_RESULT_OK; #if PUYA_SUPPORT if (getFlashChipVendorId() == SPI_FLASH_VENDOR_PUYA) { rc = spi_flash_write_puya(offset, data, size); @@ -630,12 +631,12 @@ bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) { { rc = spi_flash_write(offset, data, size); } - return rc == 0; + return rc == SPI_FLASH_RESULT_OK; } bool EspClass::flashRead(uint32_t offset, uint32_t *data, size_t size) { - int rc = spi_flash_read(offset, (uint32_t*) data, size); - return rc == 0; + auto rc = spi_flash_read(offset, (uint32_t*) data, size); + return rc == SPI_FLASH_RESULT_OK; } String EspClass::getSketchMD5() From c55f49bd6103dab81c6a389470f6d5bbbee399d0 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 6 Oct 2019 22:50:57 +0200 Subject: [PATCH 31/58] use a scheduled function for settimeofday_cb (#6600) * use a scheduled function for settimeofday_cb * per review * use a generic and clear name for trivial functional variable type name used for callbacks --- cores/esp8266/coredecls.h | 9 ++++++++- cores/esp8266/sntp-lwip2.cpp | 14 ++++++++++---- .../examples/NTP-TZ-DST/NTP-TZ-DST.ino | 19 +++++-------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cores/esp8266/coredecls.h b/cores/esp8266/coredecls.h index 4a70609bf..2496995b0 100644 --- a/cores/esp8266/coredecls.h +++ b/cores/esp8266/coredecls.h @@ -17,7 +17,6 @@ extern bool timeshift64_is_set; void esp_yield(); void esp_schedule(); void tune_timeshift64 (uint64_t now_us); -void settimeofday_cb (void (*cb)(void)); void disable_extra4k_at_link_time (void) __attribute__((noinline)); uint32_t sqrt32 (uint32_t n); @@ -25,6 +24,14 @@ uint32_t crc32 (const void* data, size_t length, uint32_t crc = 0xffffffff); #ifdef __cplusplus } + +#include + +using TrivialCB = std::function; + +void settimeofday_cb (TrivialCB&& cb); +void settimeofday_cb (const TrivialCB& cb); + #endif #endif // __COREDECLS_H diff --git a/cores/esp8266/sntp-lwip2.cpp b/cores/esp8266/sntp-lwip2.cpp index 0dba9a7f8..063cc5be2 100644 --- a/cores/esp8266/sntp-lwip2.cpp +++ b/cores/esp8266/sntp-lwip2.cpp @@ -42,16 +42,22 @@ #include #include #include "coredecls.h" +#include "Schedule.h" -extern "C" { +static TrivialCB _settimeofday_cb; -static void (*_settimeofday_cb)(void) = NULL; +void settimeofday_cb (TrivialCB&& cb) +{ + _settimeofday_cb = std::move(cb); +} -void settimeofday_cb (void (*cb)(void)) +void settimeofday_cb (const TrivialCB& cb) { _settimeofday_cb = cb; } +extern "C" { + #if LWIP_VERSION_MAJOR == 1 #include @@ -478,7 +484,7 @@ int settimeofday(const struct timeval* tv, const struct timezone* tz) sntp_set_system_time(tv->tv_sec); if (_settimeofday_cb) - _settimeofday_cb(); + schedule_function(_settimeofday_cb); } return 0; } diff --git a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino index b3c4e2064..ebfbd112b 100644 --- a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino +++ b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino @@ -152,6 +152,10 @@ void printTm(const char* what, const tm* tm) { void time_is_set_scheduled() { // everything is allowed in this function + if (time_machine_days == 0) { + time_machine_running = !time_machine_running; + } + // time machine demo if (time_machine_running) { if (time_machine_days == 0) @@ -178,19 +182,6 @@ void time_is_set_scheduled() { } } -void time_is_set_callback() { - // As in an ISR, - // it is not allowed to call "heavy" core API - // like yield()/delay()/print()/network/... - // If this is needed, use a scheduled function. - - // This scheduled function is used for the demo, it is normaly unneeded - schedule_function(time_is_set_scheduled); - if (time_machine_days == 0) { - time_machine_running = !time_machine_running; - } -} - void setup() { Serial.begin(115200); Serial.println("\nStarting...\n"); @@ -204,7 +195,7 @@ void setup() { // install callback - called when settimeofday is called (by SNTP or us) // once enabled (by DHCP), SNTP is updated every hour - settimeofday_cb(time_is_set_callback); + settimeofday_cb(time_is_set_scheduled); // NTP servers may be overriden by your DHCP server for a more local one // (see below) From d7abafea2f32818c64253c32c71b3019bf719a56 Mon Sep 17 00:00:00 2001 From: "David J. Fiddes" <35607151+davefiddes@users.noreply.github.com> Date: Sun, 6 Oct 2019 23:25:34 +0100 Subject: [PATCH 32/58] Remove duplication and incompatible declarations in sntp.h (#6610) This removes definitions relating to the built-in SNTP client that are LwIP v1 specific. Instead of duplicating these pull in the LwIP header that correspond to the required functions depending on the version of the stack being used. Without this fix calls to sntp_getserver() work but return invalid data and can lead to stack exhaustion. Update the NTP-TZ-DST example to use the Arduino sntp.h header rather than duplicate the conditional checks to use the LwIP header. Tests: - Build against a simple SNTP API demonstratin app and all LwIP configurations. Verify that the app runs for an extended period and that the expected results are obtained. --- .../examples/NTP-TZ-DST/NTP-TZ-DST.ino | 6 +-- tools/sdk/include/sntp.h | 47 +------------------ 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino index ebfbd112b..256301d95 100644 --- a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino +++ b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino @@ -51,11 +51,7 @@ #include // time() ctime() #include // struct timeval -#if LWIP_VERSION_MAJOR == 1 -#include // sntp_servermode_dhcp() -#else -#include // sntp_servermode_dhcp() -#endif +#include // sntp_servermode_dhcp() // for testing purpose: extern "C" int clock_gettime(clockid_t unused, struct timespec *tp); diff --git a/tools/sdk/include/sntp.h b/tools/sdk/include/sntp.h index 4e842d743..294711057 100644 --- a/tools/sdk/include/sntp.h +++ b/tools/sdk/include/sntp.h @@ -5,11 +5,10 @@ #include "lwip/init.h" #include "lwip/ip_addr.h" - #if LWIP_VERSION_MAJOR == 1 -#define ipv4_addr_t ip_addr_t +#include "lwip/sntp.h" #else -typedef struct ip4_addr ipv4_addr_t; +#include "lwip/apps/sntp.h" #endif #ifdef __cplusplus @@ -32,48 +31,6 @@ sint8 sntp_get_timezone(void); * SNTP set time_zone (default GMT + 8) */ bool sntp_set_timezone(sint8 timezone); -/** - * Initialize this module. - * Send out request instantly or after SNTP_STARTUP_DELAY(_FUNC). - */ -void sntp_init(void); -/** - * Stop this module. - */ -void sntp_stop(void); -/** - * Initialize one of the NTP servers by IP address - * - * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS - * @param dnsserver IP address of the NTP server to set - */ -void sntp_setserver(unsigned char idx, ipv4_addr_t *addr); -/** - * Obtain one of the currently configured by IP address (or DHCP) NTP servers - * - * @param numdns the index of the NTP server - * @return IP address of the indexed NTP server or "ipv4_addr_any" if the NTP - * server has not been configured by address (or at all). - */ -ipv4_addr_t sntp_getserver(unsigned char idx); -/** - * Initialize one of the NTP servers by name - * - * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS,now sdk support SNTP_MAX_SERVERS = 3 - * @param dnsserver DNS name of the NTP server to set, to be resolved at contact time - */ -void sntp_setservername(unsigned char idx, char *server); -/** - * Obtain one of the currently configured by name NTP servers. - * - * @param numdns the index of the NTP server - * @return IP address of the indexed NTP server or NULL if the NTP - * server has not been configured by name (or at all) - */ -char *sntp_getservername(unsigned char idx); - -#define sntp_servermode_dhcp(x) - #ifdef __cplusplus } From d62fb9ffebd57472408d5bfb8fd87d6eea3347ca Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Mon, 7 Oct 2019 15:25:51 +0300 Subject: [PATCH 33/58] MDNS: fix legacy unicast responses (#6613) * mdns: use ID from parameter struct when constructing response message * print id for legacy requests --- libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp | 2 +- libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp index 08d9760ec..61beb7339 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp @@ -245,7 +245,7 @@ bool MDNSResponder::_parseQuery(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHea ((wifi_get_ip_info(STATION_IF, &IPInfo_Local)) && (ip4_addr_netcmp(&IPInfo_Remote.ip, &IPInfo_Local.ip, &IPInfo_Local.netmask))))) { // Remote IP in STATION's subnet - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from local host %s!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str());); + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from local host %s, id %u!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), p_MsgHeader.m_u16ID);); sendParameter.m_u16ID = p_MsgHeader.m_u16ID; sendParameter.m_bLegacyQuery = true; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp index b4eebbedd..53eb32025 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp @@ -141,7 +141,7 @@ bool MDNSResponder::_prepareMDNSMessage(MDNSResponder::stcMDNSSendParameter& p_r bool bResult = true; // Prepare header; count answers - stcMDNS_MsgHeader msgHeader(0, p_rSendParameter.m_bResponse, 0, p_rSendParameter.m_bAuthorative); + stcMDNS_MsgHeader msgHeader(p_rSendParameter.m_u16ID, p_rSendParameter.m_bResponse, 0, p_rSendParameter.m_bAuthorative); // If this is a response, the answers are anwers, // else this is a query or probe and the answers go into auth section uint16_t& ru16Answers = (p_rSendParameter.m_bResponse From 75c3834c8fc3af47d4d8c90125930b4a9535d8fb Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 7 Oct 2019 14:37:59 -0700 Subject: [PATCH 34/58] Move cont_run/cont_yield out of IRAM (#6617) cont_run is only called by loop_task(), which is not going to execute during an IRQ and is stored, itself, in flash. cont_yield cannot be called from an IRQ (since it's illegal to yield inside IRQs), so move it out of IRAM, too. Saves ~71 bytes of IRAM --- cores/esp8266/cont.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/cont.S b/cores/esp8266/cont.S index 4304db448..00ca01778 100644 --- a/cores/esp8266/cont.S +++ b/cores/esp8266/cont.S @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - .text + .section .irom0.text .align 4 .literal_position .global cont_yield @@ -84,7 +84,7 @@ cont_wrapper: //////////////////////////////////////////////////// - .text + .section .irom0.text .align 4 .literal_position .global cont_run From fabd169abceebb0a5fee306850b9176d98b80795 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Tue, 8 Oct 2019 00:31:30 +0200 Subject: [PATCH 35/58] Puyafix (#6619) * PUYA was not correctly enabled * remove duplicate --- cores/esp8266/Arduino.h | 4 ---- cores/esp8266/Esp.cpp | 16 ++++++++++++---- cores/esp8266/Esp.h | 9 --------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 516a2f569..54919ba10 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -285,10 +285,6 @@ void configTime(const char* tz, const char* server1, #include "pins_arduino.h" -#ifndef PUYA_SUPPORT -#define PUYA_SUPPORT 1 -#endif - #endif #ifdef DEBUG_ESP_OOM diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index c7d66cef4..29222d6df 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "Arduino.h" +#include "Esp.h" #include "flash_utils.h" #include "eboot_command.h" #include @@ -36,6 +36,14 @@ extern struct rst_info resetInfo; //#define DEBUG_SERIAL Serial +#ifndef PUYA_SUPPORT + #define PUYA_SUPPORT 1 +#endif +#ifndef PUYA_BUFFER_SIZE + // Good alternative for buffer size is: SPI_FLASH_SEC_SIZE (= 4k) + // Always use a multiple of flash page size (256 bytes) + #define PUYA_BUFFER_SIZE 256 +#endif /** * User-defined Literals @@ -577,7 +585,7 @@ bool EspClass::flashEraseSector(uint32_t sector) { } #if PUYA_SUPPORT -static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { +static SpiFlashOpResult spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { if (data == nullptr) { return SPI_FLASH_RESULT_ERR; } @@ -607,7 +615,7 @@ static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { } rc = spi_flash_read(pos, flash_write_puya_buf, bytesNow); if (rc != SPI_FLASH_RESULT_OK) { - return (int)rc; + return rc; } for (size_t i = 0; i < bytesNow / 4; ++i) { flash_write_puya_buf[i] &= *ptr; @@ -616,7 +624,7 @@ static int spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) { rc = spi_flash_write(pos, flash_write_puya_buf, bytesNow); pos += bytesNow; } - return (int)rc; + return rc; } #endif diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 33c7f10ad..726633d61 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -23,15 +23,6 @@ #include -#ifndef PUYA_SUPPORT - #define PUYA_SUPPORT 0 -#endif -#ifndef PUYA_BUFFER_SIZE - // Good alternative for buffer size is: SPI_FLASH_SEC_SIZE (= 4k) - // Always use a multiple of flash page size (256 bytes) - #define PUYA_BUFFER_SIZE 256 -#endif - // Vendor IDs taken from Flashrom project // https://review.coreboot.org/cgit/flashrom.git/tree/flashchips.h?h=1.0.x typedef enum { From 8b16d9c1d12b8a22d9a70677d51fbceb3e8f5632 Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Tue, 8 Oct 2019 01:57:18 +0200 Subject: [PATCH 36/58] Fix build with -DHTTPCLIENT_1_1_COMPATIBLE=0 (#6597) We need to disable HTTPUPDATE_1_2 support when HTTPCLIENT_1_1 compatibility is not desired to avoid using methods that are disabled. --- .../ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 6 +++--- libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 7c3d128f4..0090390a7 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -43,7 +43,7 @@ ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) { } -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE HTTPUpdateResult ESP8266HTTPUpdate::update(const String& url, const String& currentVersion, const String& httpsFingerprint, bool reboot) { @@ -94,7 +94,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::update(WiFiClient& client, const String& url return handleUpdate(http, currentVersion, false); } -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE HTTPUpdateResult ESP8266HTTPUpdate::updateSpiffs(const String& url, const String& currentVersion, const String& httpsFingerprint) { HTTPClient http; @@ -133,7 +133,7 @@ HTTPUpdateResult ESP8266HTTPUpdate::updateSpiffs(WiFiClient& client, const Strin return handleUpdate(http, currentVersion, true); } -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE HTTPUpdateResult ESP8266HTTPUpdate::update(const String& host, uint16_t port, const String& uri, const String& currentVersion, bool https, const String& httpsFingerprint, bool reboot) { diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index a61e071f7..14c0b6552 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -26,14 +26,16 @@ #ifndef ESP8266HTTPUPDATE_H_ #define ESP8266HTTPUPDATE_H_ -#define HTTPUPDATE_1_2_COMPATIBLE - #include #include #include #include #include +#ifndef HTTPUPDATE_1_2_COMPATIBLE +#define HTTPUPDATE_1_2_COMPATIBLE HTTPCLIENT_1_1_COMPATIBLE +#endif + #ifdef DEBUG_ESP_HTTP_UPDATE #ifdef DEBUG_ESP_PORT #define DEBUG_HTTP_UPDATE(fmt, ...) DEBUG_ESP_PORT.printf_P( (PGM_P)PSTR(fmt), ## __VA_ARGS__ ) @@ -85,7 +87,7 @@ public: _ledOn = ledOn; } -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE // This function is deprecated, use rebootOnUpdate and the next one instead t_httpUpdate_return update(const String& url, const String& currentVersion, const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); @@ -97,7 +99,7 @@ public: #endif t_httpUpdate_return update(WiFiClient& client, const String& url, const String& currentVersion = ""); -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE // This function is deprecated, use one of the overloads below along with rebootOnUpdate t_httpUpdate_return update(const String& host, uint16_t port, const String& uri, const String& currentVersion, bool https, const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); @@ -112,7 +114,7 @@ public: t_httpUpdate_return update(WiFiClient& client, const String& host, uint16_t port, const String& uri = "/", const String& currentVersion = ""); -#ifdef HTTPUPDATE_1_2_COMPATIBLE +#if HTTPUPDATE_1_2_COMPATIBLE // This function is deprecated, use rebootOnUpdate and the next one instead t_httpUpdate_return updateSpiffs(const String& url, const String& currentVersion, const String& httpsFingerprint, bool reboot) __attribute__((deprecated)); From 8c3f1be63f62ef139412cc6e04c3023d3a95a3dd Mon Sep 17 00:00:00 2001 From: dsv19 Date: Tue, 8 Oct 2019 15:36:39 +0300 Subject: [PATCH 37/58] Serial.flush modification (#5293) * Modify Serial.flush * Add function to uart tests --- cores/esp8266/HardwareSerial.cpp | 4 +++- cores/esp8266/uart.cpp | 13 ++++++++++++- cores/esp8266/uart.h | 1 + tests/host/common/MockUART.cpp | 9 +++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 1be050e8c..fc270cfed 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -108,14 +108,16 @@ int HardwareSerial::available(void) void HardwareSerial::flush() { + uint8_t bit_length = 0; if(!_uart || !uart_tx_enabled(_uart)) { return; } + bit_length = uart_get_bit_length(_uart_nr); // data width, parity and stop uart_wait_tx_empty(_uart); //Workaround for a bug in serial not actually being finished yet //Wait for 8 data bits, 1 parity and 2 stop bits, just in case - delayMicroseconds(11000000 / uart_get_baudrate(_uart) + 1); + delayMicroseconds(bit_length * 1000000 / uart_get_baudrate(_uart) + 1); } void HardwareSerial::startDetectBaudrate() diff --git a/cores/esp8266/uart.cpp b/cores/esp8266/uart.cpp index 6c71efccb..05a425c9c 100644 --- a/cores/esp8266/uart.cpp +++ b/cores/esp8266/uart.cpp @@ -48,6 +48,10 @@ #include "user_interface.h" #include "uart_register.h" +#define MODE2WIDTH(mode) (((mode%16)>>2)+5) +#define MODE2STOP(mode) (((mode)>>5)+1) +#define MODE2PARITY(mode) (mode%4) + /* Some general architecture for GDB integration with the UART to enable serial debugging. @@ -204,7 +208,14 @@ uart_read_char_unsafe(uart_t* uart) return -1; } -size_t +uint8_t +uart_get_bit_length(const int uart_nr) +{ + // return bit length from uart mode, +1 for the start bit which is always there. + return MODE2WIDTH(USC0(uart_nr)) + MODE2PARITY(USC0(uart_nr)) + MODE2STOP(USC0(uart_nr)) + 1; +} + +size_t uart_rx_available(uart_t* uart) { if(uart == NULL || !uart->rx_enabled) diff --git a/cores/esp8266/uart.h b/cores/esp8266/uart.h index 7f9dce0f0..fd6158568 100644 --- a/cores/esp8266/uart.h +++ b/cores/esp8266/uart.h @@ -147,6 +147,7 @@ int uart_get_debug(); void uart_start_detect_baudrate(int uart_nr); int uart_detect_baudrate(int uart_nr); +uint8_t uart_get_bit_length(const int uart_nr); #if defined (__cplusplus) } // extern "C" diff --git a/tests/host/common/MockUART.cpp b/tests/host/common/MockUART.cpp index 67af7ed2c..db0d8c889 100644 --- a/tests/host/common/MockUART.cpp +++ b/tests/host/common/MockUART.cpp @@ -313,6 +313,15 @@ uart_get_baudrate(uart_t* uart) return uart->baud_rate; } +uint8_t +uart_get_bit_length(const int uart_nr) +{ + uint8_t width = ((uart_nr % 16) >> 2) + 5; + uint8_t parity = (uart_nr >> 5) + 1; + uint8_t stop = uart_nr % 4; + return (width + parity + stop + 1); +} + uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size) { From d3debb64c9bccb4d7cebb1930fa2f5dc7a0578a3 Mon Sep 17 00:00:00 2001 From: "David J. Fiddes" <35607151+davefiddes@users.noreply.github.com> Date: Tue, 8 Oct 2019 16:41:42 +0100 Subject: [PATCH 38/58] Expand NTP-TZ-DST example to list SNTP servers (#6611) This change expands the NTP-TZ-DST example to list the active SNTP servers. It lists the IP address server name (if used) and reachability in ntpq style octal format. Tests: - Build against all LwIP stack configurations and correct operation with a single SNTP server - Vary connectivity to an SNTP server and check reachability updates - Configure 3 SNTP servers by name - With a patched LwIP stack that supports simultaneous DHCP and DHCPv6 SNTP servers check that all server details are listed and update correctly during operation --- .../examples/NTP-TZ-DST/NTP-TZ-DST.ino | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino index 256301d95..fe713e02d 100644 --- a/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino +++ b/libraries/esp8266/examples/NTP-TZ-DST/NTP-TZ-DST.ino @@ -130,6 +130,25 @@ void showTime() { Serial.print("ctime: "); Serial.print(ctime(&now)); +#if LWIP_VERSION_MAJOR > 1 + // LwIP v2 is able to list more details about the currently configured SNTP servers + for (int i = 0; i < SNTP_MAX_SERVERS; i++) { + IPAddress sntp = *sntp_getserver(i); + const char* name = sntp_getservername(i); + if (sntp.isSet()) { + Serial.printf("sntp%d: ", i); + if (name) { + Serial.printf("%s (%s) ", name, sntp.toString().c_str()); + } else { + Serial.printf("%s ", sntp.toString().c_str()); + } + Serial.printf("IPv6: %s Reachability: %o\n", + sntp.isV6() ? "Yes" : "No", + sntp_getreachability(i)); + } + } +#endif + Serial.println(); } From 5af402e4dc59db5430ba1582ba4813b4137119b9 Mon Sep 17 00:00:00 2001 From: Develo Date: Wed, 9 Oct 2019 00:05:21 -0300 Subject: [PATCH 39/58] Update README.md (#6624) Replace latest git instructions in the README with a pointer to the instructions in readthedocs --- README.md | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index dbe51b4c6..22a12463a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and # Contents - Installing options: - [Using Boards Manager](#installing-with-boards-manager) - - [Using git version](#using-git-version-basic-instructions) + - [Using git version](#using-git-version) - [Using PlatformIO](#using-platformio) - [Building with make](#building-with-make) - [Documentation](#documentation) @@ -38,35 +38,13 @@ Boards manager link: `https://arduino.esp8266.com/stable/package_esp8266com_inde Documentation: [https://arduino-esp8266.readthedocs.io/en/2.5.2/](https://arduino-esp8266.readthedocs.io/en/2.5.2/) -### Using git version (basic instructions) +### Using git version [![Linux build status](https://travis-ci.org/esp8266/Arduino.svg)](https://travis-ci.org/esp8266/Arduino) +Also known as latest git or master branch. + - Install the current upstream Arduino IDE at the 1.8 level or later. The current version is on the [Arduino website](https://www.arduino.cc/en/main/software). -- Go to Arduino directory - - For Mac OS X, it is `Arduino.app` showing as the Arduino icon. - This location may be your `~/Downloads`, `~/Desktop` or even `/Applications`. - ```bash - cd /Arduino.app/Contents/Java - ``` - - For Linux, it is ~/Arduino by default. - ```bash - cd ~/Arduino - ``` -- Clone this repository into hardware/esp8266com/esp8266 directory (or clone it elsewhere and create a symlink) -```bash -cd hardware -mkdir esp8266com -cd esp8266com -git clone https://github.com/esp8266/Arduino.git esp8266 -cd esp8266 -git submodule update --init -``` -- Download binary tools (you need Python 2.7) -```bash -cd esp8266/tools -python get.py -``` -- Restart Arduino +- Follow the [instructions in the documentation](https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version). ### Using PlatformIO From 8e0aac92c03a95a23671b272d74947c295289ad6 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Thu, 10 Oct 2019 17:30:59 +0200 Subject: [PATCH 40/58] CI: trusty (u14.04) -> bionic (u18.04) (#6627) * no-op test * no-op test * bionic * missing python package for doc building with bionic * fix previous commit * remove external repo for gcc7 (causing issues), it is default under bionic fix python3-setuptools install * tryfix git submodule recursive (git 2.21/2.22 ?) --- .travis.yml | 13 ++----------- tests/ci/style_check.sh | 3 ++- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1e54251c8..7c50c68de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: bash os: linux -dist: trusty +dist: bionic git: depth: 1 @@ -80,17 +80,13 @@ jobs: stage: build script: $TRAVIS_BUILD_DIR/tests/ci/host_test.sh install: - - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - - sudo apt-get update -q - - sudo apt-get install -y --allow-unauthenticated g++-7 gcc-7 - sudo apt-get install valgrind lcov - env: CC=gcc-7 CXX=g++-7 - name: "Docs" stage: build script: $TRAVIS_BUILD_DIR/tests/ci/build_docs.sh install: - - sudo apt-get install python3-pip + - sudo apt-get install python3-pip python3-setuptools - pip3 install --user -r doc/requirements.txt; - name: "Style check" @@ -101,11 +97,6 @@ jobs: - name: "Mock trivial test" stage: build script: $TRAVIS_BUILD_DIR/tests/buildm.sh - install: - - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - - sudo apt-get update -q - - sudo apt-get install -y --allow-unauthenticated g++-7 gcc-7 - env: CC=gcc-7 CXX=g++-7 - name: "Mac OSX can build sketches" os: osx diff --git a/tests/ci/style_check.sh b/tests/ci/style_check.sh index a6b353242..5cba58f9f 100755 --- a/tests/ci/style_check.sh +++ b/tests/ci/style_check.sh @@ -9,6 +9,7 @@ ${org}/../restyle.sh # Revert changes which astyle might have done to the submodules, # as we don't want to fail the build because of the 3rd party libraries -git submodule foreach --recursive git reset --hard +git --version || true +git submodule foreach --recursive 'git reset --hard' git diff --exit-code -- $TRAVIS_BUILD_DIR/libraries From 52bc1df424cfcdb05cd912ae64b8a51af1cf8b1a Mon Sep 17 00:00:00 2001 From: Develo Date: Thu, 10 Oct 2019 13:30:01 -0300 Subject: [PATCH 41/58] Update installing.rst (#6625) Add uninstalling of previous core versions into prerequisites for latest git instructions Added prior step for uninstalling to Other OS --- doc/installing.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/installing.rst b/doc/installing.rst index 6e4728aec..a83d4161f 100644 --- a/doc/installing.rst +++ b/doc/installing.rst @@ -47,10 +47,13 @@ Prerequisites - Python 3.x (https://python.org) - terminal, console, or command prompt (depending on your OS) - Internet connection +- Uninstalling any core version installed via Board Manager Instructions - Windows 10 ~~~~~~~~~~~~~~~~~~~~~~~~~ -- First, make sure you don't already have the ESP8266 library installed using the Board Manager (see above) +- First, make sure you don't already have an ESP8266 core version installed + using the Board Manager (see above). If you do, uninstall it from the + Board Manager before proceeding. - Install git for Windows (if not already; see https://git-scm.com/download/win) @@ -131,9 +134,14 @@ Note that you could, in theory install in ``C:\Program Files (x86)\Arduino\hardw Instructions - Other OS ~~~~~~~~~~~~~~~~~~~~~~~ +- First, make sure you don't already have an ESP8266 core version installed + using the Board Manager (see above). If you do, uninstall it from the + Board Manager before proceeding. + - Open the console and go to Arduino directory. This can be either your *sketchbook* directory (usually ``/Arduino``), or the directory of Arduino application itself, the choice is up to you. + - Clone this repository into hardware/esp8266com/esp8266 directory. Alternatively, clone it elsewhere and create a symlink, if your OS supports them. From 9bdcd4f36a2e5285267b69b17e8fc26482dc1c72 Mon Sep 17 00:00:00 2001 From: Allman-astyler <47007540+Allman-astyler@users.noreply.github.com> Date: Thu, 10 Oct 2019 23:30:06 +0200 Subject: [PATCH 42/58] Allman astyle: mDNS (#6629) * allmanize mDNS --- libraries/ESP8266mDNS/src/ESP8266mDNS.cpp | 8 +- libraries/ESP8266mDNS/src/ESP8266mDNS.h | 74 +- .../ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp | 2417 +++++---- .../ESP8266mDNS/src/ESP8266mDNS_Legacy.h | 233 +- libraries/ESP8266mDNS/src/LEAmDNS.cpp | 2592 ++++----- libraries/ESP8266mDNS/src/LEAmDNS.h | 2859 +++++----- libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp | 3962 +++++++------- libraries/ESP8266mDNS/src/LEAmDNS_Helpers.cpp | 1600 +++--- libraries/ESP8266mDNS/src/LEAmDNS_Priv.h | 362 +- libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp | 4694 +++++++++-------- .../ESP8266mDNS/src/LEAmDNS_Transfer.cpp | 3366 ++++++------ libraries/ESP8266mDNS/src/LEAmDNS_lwIPdefs.h | 44 +- tests/restyle-all.sh | 31 - tests/restyle-examples-only.sh | 19 + tests/restyle.sh | 21 +- 15 files changed, 11800 insertions(+), 10482 deletions(-) delete mode 100755 tests/restyle-all.sh create mode 100755 tests/restyle-examples-only.sh diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS.cpp b/libraries/ESP8266mDNS/src/ESP8266mDNS.cpp index 62d54a7ed..c784a0d79 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS.cpp +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS.cpp @@ -1,10 +1,10 @@ #include /* - * MDNS responder global instance - * - * Class type that is instantiated depends on the type mapping in ESP8266mDNS.h - */ + MDNS responder global instance + + Class type that is instantiated depends on the type mapping in ESP8266mDNS.h +*/ #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_MDNS) MDNSResponder MDNS; #endif diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS.h b/libraries/ESP8266mDNS/src/ESP8266mDNS.h index 2987f655c..66d40b1b2 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS.h +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS.h @@ -1,44 +1,44 @@ /* - ESP8266mDNS.h - mDNSResponder for ESP8266 family - This file is part of the esp8266 core for Arduino environment. + ESP8266mDNS.h - mDNSResponder for ESP8266 family + This file is part of the esp8266 core for Arduino environment. - Legacy_ESP8266mDNS: - The well known, thouroughly tested (yet no flawless) default mDNS library for the ESP8266 family + Legacy_ESP8266mDNS: + The well known, thouroughly tested (yet no flawless) default mDNS library for the ESP8266 family - LEA_ESP8266mDNS: - An (currently) experimental mDNS implementation, that supports a lot more of mDNS features than Legacy_ESP8266mDNS, like: - - Presenting a DNS-SD service to interested observers, eg. a http server by presenting _http._tcp service - - Support for multi-level compressed names in input; in output only a very simple one-leven full-name compression is implemented - - Probing host and service domains for uniqueness in the local network - - Tiebreaking while probing is supportet in a very minimalistic way (the 'higher' IP address wins the tiebreak) - - Announcing available services after successful probing - - Using fixed service TXT items or - - Using dynamic service TXT items for presented services (via callback) - - Remove services (and un-announcing them to the observers by sending goodbye-messages) - - Static queries for DNS-SD services (creating a fixed answer set after a certain timeout period) - - Dynamic queries for DNS-SD services with cached and updated answers and user notifications - - Support for multi-homed client host domains + LEA_ESP8266mDNS: + An (currently) experimental mDNS implementation, that supports a lot more of mDNS features than Legacy_ESP8266mDNS, like: + - Presenting a DNS-SD service to interested observers, eg. a http server by presenting _http._tcp service + - Support for multi-level compressed names in input; in output only a very simple one-leven full-name compression is implemented + - Probing host and service domains for uniqueness in the local network + - Tiebreaking while probing is supportet in a very minimalistic way (the 'higher' IP address wins the tiebreak) + - Announcing available services after successful probing + - Using fixed service TXT items or + - Using dynamic service TXT items for presented services (via callback) + - Remove services (and un-announcing them to the observers by sending goodbye-messages) + - Static queries for DNS-SD services (creating a fixed answer set after a certain timeout period) + - Dynamic queries for DNS-SD services with cached and updated answers and user notifications + - Support for multi-homed client host domains - See 'LEA_ESP8266mDNS/EPS8266mDNS.h' for more implementation details and usage informations. - See 'examples/mDNS_Clock' and 'examples/mDNS_ServiceMonitor' for implementation examples of the advanced features. + See 'LEA_ESP8266mDNS/EPS8266mDNS.h' for more implementation details and usage informations. + See 'examples/mDNS_Clock' and 'examples/mDNS_ServiceMonitor' for implementation examples of the advanced features. - LEA_ESP8266mDNS is (mostly) client source code compatible to 'Legacy_ESP8266mDNS', so it could be - use as a 'drop-in' replacement in existing projects. + LEA_ESP8266mDNS is (mostly) client source code compatible to 'Legacy_ESP8266mDNS', so it could be + use as a 'drop-in' replacement in existing projects. - 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 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. + 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 + 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 */ @@ -47,10 +47,10 @@ #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_MDNS) - // Maps the implementation to use to the global namespace type - //using MDNSResponder = Legacy_MDNSResponder::MDNSResponder; //legacy - using MDNSResponder = esp8266::MDNSImplementation::MDNSResponder; //new - - extern MDNSResponder MDNS; +// Maps the implementation to use to the global namespace type +//using MDNSResponder = Legacy_MDNSResponder::MDNSResponder; //legacy +using MDNSResponder = esp8266::MDNSImplementation::MDNSResponder; //new + +extern MDNSResponder MDNS; #endif diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp index 80f55ad81..af98b46b6 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.cpp @@ -1,31 +1,31 @@ /* -ESP8266 Multicast DNS (port of CC3000 Multicast DNS library) -Version 1.1 -Copyright (c) 2013 Tony DiCola (tony@tonydicola.com) -ESP8266 port (c) 2015 Ivan Grokhotkov (ivan@esp8266.com) -MDNS-SD Suport 2015 Hristo Gochkov -Extended MDNS-SD support 2016 Lars Englund (lars.englund@gmail.com) + ESP8266 Multicast DNS (port of CC3000 Multicast DNS library) + Version 1.1 + Copyright (c) 2013 Tony DiCola (tony@tonydicola.com) + ESP8266 port (c) 2015 Ivan Grokhotkov (ivan@esp8266.com) + MDNS-SD Suport 2015 Hristo Gochkov + Extended MDNS-SD support 2016 Lars Englund (lars.englund@gmail.com) -License (MIT license): - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ @@ -44,9 +44,9 @@ License (MIT license): #include "debug.h" extern "C" { - #include "osapi.h" - #include "ets_sys.h" - #include "user_interface.h" +#include "osapi.h" +#include "ets_sys.h" +#include "user_interface.h" } #include "WiFiUdp.h" @@ -59,7 +59,8 @@ extern "C" { -namespace Legacy_MDNSResponder { +namespace Legacy_MDNSResponder +{ #ifdef DEBUG_ESP_MDNS @@ -94,1189 +95,1421 @@ static const IPAddress MDNS_MULTICAST_ADDR(224, 0, 0, 251); static const int MDNS_MULTICAST_TTL = 1; static const int MDNS_PORT = 5353; -struct MDNSService { - MDNSService* _next; - char _name[32]; - char _proto[4]; - uint16_t _port; - uint16_t _txtLen; // length of all txts - struct MDNSTxt * _txts; +struct MDNSService +{ + MDNSService* _next; + char _name[32]; + char _proto[4]; + uint16_t _port; + uint16_t _txtLen; // length of all txts + struct MDNSTxt * _txts; }; -struct MDNSTxt{ - MDNSTxt * _next; - String _txt; +struct MDNSTxt +{ + MDNSTxt * _next; + String _txt; }; -struct MDNSAnswer { - MDNSAnswer* next; - uint8_t ip[4]; - uint16_t port; - char *hostname; +struct MDNSAnswer +{ + MDNSAnswer* next; + uint8_t ip[4]; + uint16_t port; + char *hostname; }; -struct MDNSQuery { - char _service[32]; - char _proto[4]; +struct MDNSQuery +{ + char _service[32]; + char _proto[4]; }; -MDNSResponder::MDNSResponder() : _conn(0) { - _services = 0; - _instanceName = ""; - _answers = 0; - _query = 0; - _newQuery = false; - _waitingForAnswers = false; -} -MDNSResponder::~MDNSResponder() { - if (_query != 0) { - os_free(_query); +MDNSResponder::MDNSResponder() : _conn(0) +{ + _services = 0; + _instanceName = ""; + _answers = 0; _query = 0; - } - - // Clear answer list - MDNSAnswer *answer; - int numAnswers = _getNumAnswers(); - for (int n = numAnswers - 1; n >= 0; n--) { - answer = _getAnswerFromIdx(n); - os_free(answer->hostname); - os_free(answer); - answer = 0; - } - _answers = 0; - - if (_conn) { - _conn->unref(); - } + _newQuery = false; + _waitingForAnswers = false; } - -bool MDNSResponder::begin(const char* hostname){ - size_t n = strlen(hostname); - if (n > 63) { // max size for a single label. - return false; - } - - // Copy in hostname characters as lowercase - _hostName = hostname; - _hostName.toLowerCase(); - - // If instance name is not already set copy hostname to instance name - if (_instanceName.equals("") ) _instanceName=hostname; - - _gotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& event){ - (void) event; - _restart(); - }); - - _disconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected& event) { - (void) event; - _restart(); - }); - - return _listen(); -} - -void MDNSResponder::notifyAPChange() { - _restart(); -} - -void MDNSResponder::_restart() { - if (_conn) { - _conn->unref(); - _conn = nullptr; - } - _listen(); -} - -bool MDNSResponder::_listen() { - // Open the MDNS socket if it isn't already open. - if (!_conn) { - #ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.println("MDNS listening"); - #endif - - IPAddress mdns(MDNS_MULTICAST_ADDR); - - if (igmp_joingroup(IP4_ADDR_ANY4, mdns)!= ERR_OK) { - return false; +MDNSResponder::~MDNSResponder() +{ + if (_query != 0) + { + os_free(_query); + _query = 0; } - _conn = new UdpContext; - _conn->ref(); - - if (!_conn->listen(IP_ADDR_ANY, MDNS_PORT)) { - return false; - } - _conn->setMulticastTTL(MDNS_MULTICAST_TTL); - _conn->onRx(std::bind(&MDNSResponder::update, this)); - _conn->connect(mdns, MDNS_PORT); - } - return true; -} - -void MDNSResponder::update() { - if (!_conn || !_conn->next()) - return; - _parsePacket(); -} - - -void MDNSResponder::setInstanceName(String name){ - if (name.length() > 63) - return; - _instanceName = name; -} - - -bool MDNSResponder::addServiceTxt(char *name, char *proto, char *key, char *value){ - MDNSService* servicePtr; - - uint8_t txtLen = os_strlen(key) + os_strlen(value) + 1; // Add one for equals sign - txtLen += 1; //accounts for length byte added when building the txt responce - //Find the service - for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) { - //Checking Service names - if(strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0) { - //found a service name match - if (servicePtr->_txtLen + txtLen > 1300) - return false; //max txt record size - MDNSTxt *newtxt = new MDNSTxt; - newtxt->_txt = String(key) + "=" + String(value); - newtxt->_next = 0; - if(servicePtr->_txts == 0) { //no services have been added - //Adding First TXT to service - servicePtr->_txts = newtxt; - servicePtr->_txtLen += txtLen; - return true; - } else { - MDNSTxt * txtPtr = servicePtr->_txts; - while(txtPtr->_next != 0) { - txtPtr = txtPtr->_next; - } - //adding another TXT to service - txtPtr->_next = newtxt; - servicePtr->_txtLen += txtLen; - return true; - } - } - } - return false; -} - -void MDNSResponder::addService(char *name, char *proto, uint16_t port){ - if(_getServicePort(name, proto) != 0) - return; - if(os_strlen(name) > 32 || os_strlen(proto) != 3) - return; //bad arguments - struct MDNSService *srv = (struct MDNSService*)(os_malloc(sizeof(struct MDNSService))); - os_strcpy(srv->_name, name); - os_strcpy(srv->_proto, proto); - srv->_port = port; - srv->_next = 0; - srv->_txts = 0; - srv->_txtLen = 0; - - if(_services == 0) { - _services = srv; - } else { - MDNSService* servicePtr = _services; - while(servicePtr->_next != 0) - servicePtr = servicePtr->_next; - servicePtr->_next = srv; - } - -} - -int MDNSResponder::queryService(char *service, char *proto) { -#ifdef DEBUG_ESP_MDNS_TX - DEBUG_ESP_PORT.printf("queryService %s %s\n", service, proto); -#endif - while(_answers!=0){ - MDNSAnswer *currAnswer = _answers; - _answers = _answers->next; - os_free(currAnswer->hostname); - os_free(currAnswer); - currAnswer = 0; - } - if (_query != 0) { - os_free(_query); - _query = 0; - } - _query = (struct MDNSQuery*)(os_malloc(sizeof(struct MDNSQuery))); - os_strcpy(_query->_service, service); - os_strcpy(_query->_proto, proto); - _newQuery = true; - - char underscore[] = "_"; - - // build service name with _ - char serviceName[os_strlen(service) + 2]; - os_strcpy(serviceName, underscore); - os_strcat(serviceName, service); - size_t serviceNameLen = os_strlen(serviceName); - - //build proto name with _ - char protoName[5]; - os_strcpy(protoName, underscore); - os_strcat(protoName, proto); - size_t protoNameLen = 4; - - //local string - char localName[] = "local"; - size_t localNameLen = 5; - - //terminator - char terminator[] = "\0"; - - // Only supports sending one PTR query - uint8_t questionCount = 1; - - _waitingForAnswers = true; - for (int itfn = 0; itfn < 2; itfn++) { - struct ip_info ip_info; - - wifi_get_ip_info((!itfn) ? SOFTAP_IF : STATION_IF, &ip_info); - if (!ip_info.ip.addr) - continue; - _conn->setMulticastInterface(IPAddress(ip_info.ip.addr)); - - // Write the header - _conn->flush(); - uint8_t head[12] = { - 0x00, 0x00, //ID = 0 - 0x00, 0x00, //Flags = response + authoritative answer - 0x00, questionCount, //Question count - 0x00, 0x00, //Answer count - 0x00, 0x00, //Name server records - 0x00, 0x00 //Additional records - }; - _conn->append(reinterpret_cast(head), 12); - - // Only supports sending one PTR query - // Send the Name field (eg. "_http._tcp.local") - _conn->append(reinterpret_cast(&serviceNameLen), 1); // lenght of "_" + service - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_" + service - _conn->append(reinterpret_cast(&protoNameLen), 1); // lenght of "_" + proto - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_" + proto - _conn->append(reinterpret_cast(&localNameLen), 1); // lenght of "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator - - //Send the type and class - uint8_t ptrAttrs[4] = { - 0x00, 0x0c, //PTR record query - 0x00, 0x01 //Class IN - }; - _conn->append(reinterpret_cast(ptrAttrs), 4); - _conn->send(); - } - -#ifdef DEBUG_ESP_MDNS_TX - DEBUG_ESP_PORT.println("Waiting for answers.."); -#endif - delay(1000); - - _waitingForAnswers = false; - - return _getNumAnswers(); -} - -String MDNSResponder::hostname(int idx) { - MDNSAnswer *answer = _getAnswerFromIdx(idx); - if (answer == 0) { - return String(); - } - return answer->hostname; -} - -IPAddress MDNSResponder::IP(int idx) { - MDNSAnswer *answer = _getAnswerFromIdx(idx); - if (answer == 0) { - return IPAddress(); - } - return IPAddress(answer->ip); -} - -uint16_t MDNSResponder::port(int idx) { - MDNSAnswer *answer = _getAnswerFromIdx(idx); - if (answer == 0) { - return 0; - } - return answer->port; -} - -MDNSAnswer* MDNSResponder::_getAnswerFromIdx(int idx) { - MDNSAnswer *answer = _answers; - while (answer != 0 && idx-- > 0) { - answer = answer->next; - } - if (idx > 0) { - return 0; - } - return answer; -} - -int MDNSResponder::_getNumAnswers() { - int numAnswers = 0; - MDNSAnswer *answer = _answers; - while (answer != 0) { - numAnswers++; - answer = answer->next; - } - return numAnswers; -} - -MDNSTxt * MDNSResponder::_getServiceTxt(char *name, char *proto){ - MDNSService* servicePtr; - for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) { - if(servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0){ - if (servicePtr->_txts == 0) - return nullptr; - return servicePtr->_txts; - } - } - return nullptr; -} - -uint16_t MDNSResponder::_getServiceTxtLen(char *name, char *proto){ - MDNSService* servicePtr; - for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) { - if(servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0){ - if (servicePtr->_txts == 0) - return false; - return servicePtr->_txtLen; - } - } - return 0; -} - -uint16_t MDNSResponder::_getServicePort(char *name, char *proto){ - MDNSService* servicePtr; - for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) { - if(servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0){ - return servicePtr->_port; - } - } - return 0; -} - -IPAddress MDNSResponder::_getRequestMulticastInterface(){ - struct ip_info ip_info; - bool match_ap = false; - if (wifi_get_opmode() & SOFTAP_MODE) { - const IPAddress& remote_ip = _conn->getRemoteAddress(); - wifi_get_ip_info(SOFTAP_IF, &ip_info); - IPAddress infoIp(ip_info.ip); - IPAddress infoMask(ip_info.netmask); - if (ip_info.ip.addr && ip_addr_netcmp((const ip_addr_t*)remote_ip, (const ip_addr_t*)infoIp, ip_2_ip4((const ip_addr_t*)infoMask))) - match_ap = true; - } - if (!match_ap) - wifi_get_ip_info(STATION_IF, &ip_info); - return IPAddress(ip_info.ip.addr); -} - -void MDNSResponder::_parsePacket(){ - int i; - char tmp; - bool serviceParsed = false; - bool protoParsed = false; - bool localParsed = false; - - char hostName[255]; - uint8_t hostNameLen; - - char serviceName[32]; - uint8_t serviceNameLen; - uint16_t servicePort = 0; - - char protoName[32]; - protoName[0] = 0; - uint8_t protoNameLen = 0; - - uint16_t packetHeader[6]; - - for(i=0; i<6; i++) - packetHeader[i] = _conn_read16(); - - if ((packetHeader[1] & 0x8000) != 0) { // Read answers -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("Reading answers RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n", packetHeader[0], packetHeader[2], packetHeader[3], packetHeader[4], packetHeader[5]); -#endif - - if (!_waitingForAnswers) { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.println("Not expecting any answers right now, returning"); -#endif - _conn->flush(); - return; - } - - int numAnswers = packetHeader[3] + packetHeader[5]; - // Assume that the PTR answer always comes first and that it is always accompanied by a TXT, SRV, AAAA (optional) and A answer in the same packet. - if (numAnswers < 4) { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("Expected a packet with 4 or more answers, got %u\n", numAnswers); -#endif - _conn->flush(); - return; - } - - uint8_t tmp8; - uint16_t answerPort = 0; - uint8_t answerIp[4] = { 0,0,0,0 }; - char answerHostName[255]; - bool serviceMatch = false; - MDNSAnswer *answer; - uint8_t partsCollected = 0; - uint8_t stringsRead = 0; - - answerHostName[0] = '\0'; - // Clear answer list - if (_newQuery) { - int oldAnswers = _getNumAnswers(); - for (int n = oldAnswers - 1; n >= 0; n--) { + MDNSAnswer *answer; + int numAnswers = _getNumAnswers(); + for (int n = numAnswers - 1; n >= 0; n--) + { answer = _getAnswerFromIdx(n); os_free(answer->hostname); os_free(answer); answer = 0; - } - _answers = 0; - _newQuery = false; + } + _answers = 0; + + if (_conn) + { + _conn->unref(); + } +} + +bool MDNSResponder::begin(const char* hostname) +{ + size_t n = strlen(hostname); + if (n > 63) // max size for a single label. + { + return false; } - while (numAnswers--) { - // Read name - stringsRead = 0; - size_t last_bufferpos = 0; - do { - tmp8 = _conn_read8(); - if (tmp8 == 0x00) { // End of name - break; - } - if (tmp8 & 0xC0) { // Compressed pointer - uint16_t offset = ((((uint16_t)tmp8) & ~0xC0) << 8) | _conn_read8(); - if (_conn->isValidOffset(offset)) { - if (0 == last_bufferpos) - last_bufferpos = _conn->tell(); -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Compressed pointer, jumping from "); - DEBUG_ESP_PORT.print(last_bufferpos); - DEBUG_ESP_PORT.print(" to "); - DEBUG_ESP_PORT.println(offset); -#endif - _conn->seek(offset); - tmp8 = _conn_read8(); - } - else { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Skipping malformed compressed pointer"); -#endif - tmp8 = _conn_read8(); - break; - } - } - if(stringsRead > 3){ -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.println("failed to read the response name"); -#endif - _conn->flush(); - return; - } - _conn_readS(serviceName, tmp8); - serviceName[tmp8] = '\0'; -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf(" %d ", tmp8); - for (int n = 0; n < tmp8; n++) { - DEBUG_ESP_PORT.printf("%c", serviceName[n]); - } - DEBUG_ESP_PORT.println(); -#endif - if (serviceName[0] == '_') { - if (strcmp(&serviceName[1], _query->_service) == 0) { - serviceMatch = true; -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("found matching service: %s\n", _query->_service); -#endif - } - } - stringsRead++; - } while (true); - if (last_bufferpos > 0) - { - _conn->seek(last_bufferpos); -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Compressed pointer, jumping back to "); - DEBUG_ESP_PORT.println(last_bufferpos); -#endif - } + // Copy in hostname characters as lowercase + _hostName = hostname; + _hostName.toLowerCase(); - uint16_t answerType = _conn_read16(); // Read type - uint16_t answerClass = _conn_read16(); // Read class - uint32_t answerTtl = _conn_read32(); // Read ttl - uint16_t answerRdlength = _conn_read16(); // Read rdlength + // If instance name is not already set copy hostname to instance name + if (_instanceName.equals("")) + { + _instanceName = hostname; + } - (void) answerClass; - (void) answerTtl; + _gotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP & event) + { + (void) event; + _restart(); + }); - if(answerRdlength > 255){ - if(answerType == MDNS_TYPE_TXT && answerRdlength < 1460){ - while(--answerRdlength) _conn->read(); - } else { + _disconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected & event) + { + (void) event; + _restart(); + }); + + return _listen(); +} + +void MDNSResponder::notifyAPChange() +{ + _restart(); +} + +void MDNSResponder::_restart() +{ + if (_conn) + { + _conn->unref(); + _conn = nullptr; + } + _listen(); +} + +bool MDNSResponder::_listen() +{ + // Open the MDNS socket if it isn't already open. + if (!_conn) + { #ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("Data len too long! %u\n", answerRdlength); -#endif - _conn->flush(); - return; - } - } - -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("type: %04x rdlength: %d\n", answerType, answerRdlength); + DEBUG_ESP_PORT.println("MDNS listening"); #endif - if (answerType == MDNS_TYPE_PTR) { - partsCollected |= 0x01; - _conn_readS(hostName, answerRdlength); // Read rdata - if(hostName[answerRdlength-2] & 0xc0){ - memcpy(answerHostName, hostName+1, answerRdlength-3); - answerHostName[answerRdlength-3] = '\0'; - } -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("PTR %d ", answerRdlength); - for (int n = 0; n < answerRdlength; n++) { - DEBUG_ESP_PORT.printf("%c", hostName[n]); - } - DEBUG_ESP_PORT.println(); -#endif - } + IPAddress mdns(MDNS_MULTICAST_ADDR); - else if (answerType == MDNS_TYPE_TXT) { - partsCollected |= 0x02; - _conn_readS(hostName, answerRdlength); // Read rdata -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("TXT %d ", answerRdlength); - for (int n = 0; n < answerRdlength; n++) { - DEBUG_ESP_PORT.printf("%c", hostName[n]); - } - DEBUG_ESP_PORT.println(); -#endif - } - - else if (answerType == MDNS_TYPE_SRV) { - partsCollected |= 0x04; - uint16_t answerPrio = _conn_read16(); // Read priority - uint16_t answerWeight = _conn_read16(); // Read weight - answerPort = _conn_read16(); // Read port - last_bufferpos = 0; - - (void) answerPrio; - (void) answerWeight; - - // Read hostname - tmp8 = _conn_read8(); - if (tmp8 & 0xC0) { // Compressed pointer - uint16_t offset = ((((uint16_t)tmp8) & ~0xC0) << 8) | _conn_read8(); - if (_conn->isValidOffset(offset)) { - last_bufferpos = _conn->tell(); -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Compressed pointer, jumping from "); - DEBUG_ESP_PORT.print(last_bufferpos); - DEBUG_ESP_PORT.print(" to "); - DEBUG_ESP_PORT.println(offset); -#endif - _conn->seek(offset); - tmp8 = _conn_read8(); - } - else { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Skipping malformed compressed pointer"); -#endif - tmp8 = _conn_read8(); - break; - } - } - _conn_readS(answerHostName, tmp8); - answerHostName[tmp8] = '\0'; -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("SRV %d ", tmp8); - for (int n = 0; n < tmp8; n++) { - DEBUG_ESP_PORT.printf("%02x ", answerHostName[n]); - } - DEBUG_ESP_PORT.printf("\n%s\n", answerHostName); -#endif - if (last_bufferpos > 0) + if (igmp_joingroup(IP4_ADDR_ANY4, mdns) != ERR_OK) { - _conn->seek(last_bufferpos); - tmp8 = 2; // Size of compression octets -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.print("Compressed pointer, jumping back to "); - DEBUG_ESP_PORT.println(last_bufferpos); -#endif + return false; } - if (answerRdlength - (6 + 1 + tmp8) > 0) { // Skip any remaining rdata - _conn_readS(hostName, answerRdlength - (6 + 1 + tmp8)); - } - } - else if (answerType == MDNS_TYPE_A) { - partsCollected |= 0x08; - for (int i = 0; i < 4; i++) { - answerIp[i] = _conn_read8(); - } - } - else { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("Ignoring unsupported type %02x\n", tmp8); -#endif - for (int n = 0; n < answerRdlength; n++) - (void)_conn_read8(); - } + _conn = new UdpContext; + _conn->ref(); - if ((partsCollected == 0x0F) && serviceMatch) { -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.println("All answers parsed, adding to _answers list.."); -#endif - // Add new answer to answer list - if (_answers == 0) { - _answers = (struct MDNSAnswer*)(os_malloc(sizeof(struct MDNSAnswer))); - answer = _answers; + if (!_conn->listen(IP_ADDR_ANY, MDNS_PORT)) + { + return false; } - else { - answer = _answers; - while (answer->next != 0) { - answer = answer->next; - } - answer->next = (struct MDNSAnswer*)(os_malloc(sizeof(struct MDNSAnswer))); - answer = answer->next; - } - answer->next = 0; - answer->hostname = 0; + _conn->setMulticastTTL(MDNS_MULTICAST_TTL); + _conn->onRx(std::bind(&MDNSResponder::update, this)); + _conn->connect(mdns, MDNS_PORT); + } + return true; +} - // Populate new answer - answer->port = answerPort; - for (int i = 0; i < 4; i++) { - answer->ip[i] = answerIp[i]; +void MDNSResponder::update() +{ + if (!_conn || !_conn->next()) + { + return; + } + _parsePacket(); +} + + +void MDNSResponder::setInstanceName(String name) +{ + if (name.length() > 63) + { + return; + } + _instanceName = name; +} + + +bool MDNSResponder::addServiceTxt(char *name, char *proto, char *key, char *value) +{ + MDNSService* servicePtr; + + uint8_t txtLen = os_strlen(key) + os_strlen(value) + 1; // Add one for equals sign + txtLen += 1; //accounts for length byte added when building the txt responce + //Find the service + for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) + { + //Checking Service names + if (strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0) + { + //found a service name match + if (servicePtr->_txtLen + txtLen > 1300) + { + return false; //max txt record size + } + MDNSTxt *newtxt = new MDNSTxt; + newtxt->_txt = String(key) + "=" + String(value); + newtxt->_next = 0; + if (servicePtr->_txts == 0) //no services have been added + { + //Adding First TXT to service + servicePtr->_txts = newtxt; + servicePtr->_txtLen += txtLen; + return true; + } + else + { + MDNSTxt * txtPtr = servicePtr->_txts; + while (txtPtr->_next != 0) + { + txtPtr = txtPtr->_next; + } + //adding another TXT to service + txtPtr->_next = newtxt; + servicePtr->_txtLen += txtLen; + return true; + } } - answer->hostname = (char *)os_malloc(strlen(answerHostName) + 1); - os_strcpy(answer->hostname, answerHostName); + } + return false; +} + +void MDNSResponder::addService(char *name, char *proto, uint16_t port) +{ + if (_getServicePort(name, proto) != 0) + { + return; + } + if (os_strlen(name) > 32 || os_strlen(proto) != 3) + { + return; //bad arguments + } + struct MDNSService *srv = (struct MDNSService*)(os_malloc(sizeof(struct MDNSService))); + os_strcpy(srv->_name, name); + os_strcpy(srv->_proto, proto); + srv->_port = port; + srv->_next = 0; + srv->_txts = 0; + srv->_txtLen = 0; + + if (_services == 0) + { + _services = srv; + } + else + { + MDNSService* servicePtr = _services; + while (servicePtr->_next != 0) + { + servicePtr = servicePtr->_next; + } + servicePtr->_next = srv; + } + +} + +int MDNSResponder::queryService(char *service, char *proto) +{ +#ifdef DEBUG_ESP_MDNS_TX + DEBUG_ESP_PORT.printf("queryService %s %s\n", service, proto); +#endif + while (_answers != 0) + { + MDNSAnswer *currAnswer = _answers; + _answers = _answers->next; + os_free(currAnswer->hostname); + os_free(currAnswer); + currAnswer = 0; + } + if (_query != 0) + { + os_free(_query); + _query = 0; + } + _query = (struct MDNSQuery*)(os_malloc(sizeof(struct MDNSQuery))); + os_strcpy(_query->_service, service); + os_strcpy(_query->_proto, proto); + _newQuery = true; + + char underscore[] = "_"; + + // build service name with _ + char serviceName[os_strlen(service) + 2]; + os_strcpy(serviceName, underscore); + os_strcat(serviceName, service); + size_t serviceNameLen = os_strlen(serviceName); + + //build proto name with _ + char protoName[5]; + os_strcpy(protoName, underscore); + os_strcat(protoName, proto); + size_t protoNameLen = 4; + + //local string + char localName[] = "local"; + size_t localNameLen = 5; + + //terminator + char terminator[] = "\0"; + + // Only supports sending one PTR query + uint8_t questionCount = 1; + + _waitingForAnswers = true; + for (int itfn = 0; itfn < 2; itfn++) + { + struct ip_info ip_info; + + wifi_get_ip_info((!itfn) ? SOFTAP_IF : STATION_IF, &ip_info); + if (!ip_info.ip.addr) + { + continue; + } + _conn->setMulticastInterface(IPAddress(ip_info.ip.addr)); + + // Write the header + _conn->flush(); + uint8_t head[12] = + { + 0x00, 0x00, //ID = 0 + 0x00, 0x00, //Flags = response + authoritative answer + 0x00, questionCount, //Question count + 0x00, 0x00, //Answer count + 0x00, 0x00, //Name server records + 0x00, 0x00 //Additional records + }; + _conn->append(reinterpret_cast(head), 12); + + // Only supports sending one PTR query + // Send the Name field (eg. "_http._tcp.local") + _conn->append(reinterpret_cast(&serviceNameLen), 1); // lenght of "_" + service + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_" + service + _conn->append(reinterpret_cast(&protoNameLen), 1); // lenght of "_" + proto + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_" + proto + _conn->append(reinterpret_cast(&localNameLen), 1); // lenght of "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + + //Send the type and class + uint8_t ptrAttrs[4] = + { + 0x00, 0x0c, //PTR record query + 0x00, 0x01 //Class IN + }; + _conn->append(reinterpret_cast(ptrAttrs), 4); + _conn->send(); + } + +#ifdef DEBUG_ESP_MDNS_TX + DEBUG_ESP_PORT.println("Waiting for answers.."); +#endif + delay(1000); + + _waitingForAnswers = false; + + return _getNumAnswers(); +} + +String MDNSResponder::hostname(int idx) +{ + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) + { + return String(); + } + return answer->hostname; +} + +IPAddress MDNSResponder::IP(int idx) +{ + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) + { + return IPAddress(); + } + return IPAddress(answer->ip); +} + +uint16_t MDNSResponder::port(int idx) +{ + MDNSAnswer *answer = _getAnswerFromIdx(idx); + if (answer == 0) + { + return 0; + } + return answer->port; +} + +MDNSAnswer* MDNSResponder::_getAnswerFromIdx(int idx) +{ + MDNSAnswer *answer = _answers; + while (answer != 0 && idx-- > 0) + { + answer = answer->next; + } + if (idx > 0) + { + return 0; + } + return answer; +} + +int MDNSResponder::_getNumAnswers() +{ + int numAnswers = 0; + MDNSAnswer *answer = _answers; + while (answer != 0) + { + numAnswers++; + answer = answer->next; + } + return numAnswers; +} + +MDNSTxt * MDNSResponder::_getServiceTxt(char *name, char *proto) +{ + MDNSService* servicePtr; + for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) + { + if (servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0) + { + if (servicePtr->_txts == 0) + { + return nullptr; + } + return servicePtr->_txts; + } + } + return nullptr; +} + +uint16_t MDNSResponder::_getServiceTxtLen(char *name, char *proto) +{ + MDNSService* servicePtr; + for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) + { + if (servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0) + { + if (servicePtr->_txts == 0) + { + return false; + } + return servicePtr->_txtLen; + } + } + return 0; +} + +uint16_t MDNSResponder::_getServicePort(char *name, char *proto) +{ + MDNSService* servicePtr; + for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) + { + if (servicePtr->_port > 0 && strcmp(servicePtr->_name, name) == 0 && strcmp(servicePtr->_proto, proto) == 0) + { + return servicePtr->_port; + } + } + return 0; +} + +IPAddress MDNSResponder::_getRequestMulticastInterface() +{ + struct ip_info ip_info; + bool match_ap = false; + if (wifi_get_opmode() & SOFTAP_MODE) + { + const IPAddress& remote_ip = _conn->getRemoteAddress(); + wifi_get_ip_info(SOFTAP_IF, &ip_info); + IPAddress infoIp(ip_info.ip); + IPAddress infoMask(ip_info.netmask); + if (ip_info.ip.addr && ip_addr_netcmp((const ip_addr_t*)remote_ip, (const ip_addr_t*)infoIp, ip_2_ip4((const ip_addr_t*)infoMask))) + { + match_ap = true; + } + } + if (!match_ap) + { + wifi_get_ip_info(STATION_IF, &ip_info); + } + return IPAddress(ip_info.ip.addr); +} + +void MDNSResponder::_parsePacket() +{ + int i; + char tmp; + bool serviceParsed = false; + bool protoParsed = false; + bool localParsed = false; + + char hostName[255]; + uint8_t hostNameLen; + + char serviceName[32]; + uint8_t serviceNameLen; + uint16_t servicePort = 0; + + char protoName[32]; + protoName[0] = 0; + uint8_t protoNameLen = 0; + + uint16_t packetHeader[6]; + + for (i = 0; i < 6; i++) + { + packetHeader[i] = _conn_read16(); + } + + if ((packetHeader[1] & 0x8000) != 0) // Read answers + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("Reading answers RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n", packetHeader[0], packetHeader[2], packetHeader[3], packetHeader[4], packetHeader[5]); +#endif + + if (!_waitingForAnswers) + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.println("Not expecting any answers right now, returning"); +#endif + _conn->flush(); + return; + } + + int numAnswers = packetHeader[3] + packetHeader[5]; + // Assume that the PTR answer always comes first and that it is always accompanied by a TXT, SRV, AAAA (optional) and A answer in the same packet. + if (numAnswers < 4) + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("Expected a packet with 4 or more answers, got %u\n", numAnswers); +#endif + _conn->flush(); + return; + } + + uint8_t tmp8; + uint16_t answerPort = 0; + uint8_t answerIp[4] = { 0, 0, 0, 0 }; + char answerHostName[255]; + bool serviceMatch = false; + MDNSAnswer *answer; + uint8_t partsCollected = 0; + uint8_t stringsRead = 0; + + answerHostName[0] = '\0'; + + // Clear answer list + if (_newQuery) + { + int oldAnswers = _getNumAnswers(); + for (int n = oldAnswers - 1; n >= 0; n--) + { + answer = _getAnswerFromIdx(n); + os_free(answer->hostname); + os_free(answer); + answer = 0; + } + _answers = 0; + _newQuery = false; + } + + while (numAnswers--) + { + // Read name + stringsRead = 0; + size_t last_bufferpos = 0; + do + { + tmp8 = _conn_read8(); + if (tmp8 == 0x00) // End of name + { + break; + } + if (tmp8 & 0xC0) // Compressed pointer + { + uint16_t offset = ((((uint16_t)tmp8) & ~0xC0) << 8) | _conn_read8(); + if (_conn->isValidOffset(offset)) + { + if (0 == last_bufferpos) + { + last_bufferpos = _conn->tell(); + } +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Compressed pointer, jumping from "); + DEBUG_ESP_PORT.print(last_bufferpos); + DEBUG_ESP_PORT.print(" to "); + DEBUG_ESP_PORT.println(offset); +#endif + _conn->seek(offset); + tmp8 = _conn_read8(); + } + else + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Skipping malformed compressed pointer"); +#endif + tmp8 = _conn_read8(); + break; + } + } + if (stringsRead > 3) + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.println("failed to read the response name"); +#endif + _conn->flush(); + return; + } + _conn_readS(serviceName, tmp8); + serviceName[tmp8] = '\0'; +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf(" %d ", tmp8); + for (int n = 0; n < tmp8; n++) + { + DEBUG_ESP_PORT.printf("%c", serviceName[n]); + } + DEBUG_ESP_PORT.println(); +#endif + if (serviceName[0] == '_') + { + if (strcmp(&serviceName[1], _query->_service) == 0) + { + serviceMatch = true; +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("found matching service: %s\n", _query->_service); +#endif + } + } + stringsRead++; + } while (true); + if (last_bufferpos > 0) + { + _conn->seek(last_bufferpos); +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Compressed pointer, jumping back to "); + DEBUG_ESP_PORT.println(last_bufferpos); +#endif + } + + uint16_t answerType = _conn_read16(); // Read type + uint16_t answerClass = _conn_read16(); // Read class + uint32_t answerTtl = _conn_read32(); // Read ttl + uint16_t answerRdlength = _conn_read16(); // Read rdlength + + (void) answerClass; + (void) answerTtl; + + if (answerRdlength > 255) + { + if (answerType == MDNS_TYPE_TXT && answerRdlength < 1460) + { + while (--answerRdlength) + { + _conn->read(); + } + } + else + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("Data len too long! %u\n", answerRdlength); +#endif + _conn->flush(); + return; + } + } + +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("type: %04x rdlength: %d\n", answerType, answerRdlength); +#endif + + if (answerType == MDNS_TYPE_PTR) + { + partsCollected |= 0x01; + _conn_readS(hostName, answerRdlength); // Read rdata + if (hostName[answerRdlength - 2] & 0xc0) + { + memcpy(answerHostName, hostName + 1, answerRdlength - 3); + answerHostName[answerRdlength - 3] = '\0'; + } +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("PTR %d ", answerRdlength); + for (int n = 0; n < answerRdlength; n++) + { + DEBUG_ESP_PORT.printf("%c", hostName[n]); + } + DEBUG_ESP_PORT.println(); +#endif + } + + else if (answerType == MDNS_TYPE_TXT) + { + partsCollected |= 0x02; + _conn_readS(hostName, answerRdlength); // Read rdata +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("TXT %d ", answerRdlength); + for (int n = 0; n < answerRdlength; n++) + { + DEBUG_ESP_PORT.printf("%c", hostName[n]); + } + DEBUG_ESP_PORT.println(); +#endif + } + + else if (answerType == MDNS_TYPE_SRV) + { + partsCollected |= 0x04; + uint16_t answerPrio = _conn_read16(); // Read priority + uint16_t answerWeight = _conn_read16(); // Read weight + answerPort = _conn_read16(); // Read port + last_bufferpos = 0; + + (void) answerPrio; + (void) answerWeight; + + // Read hostname + tmp8 = _conn_read8(); + if (tmp8 & 0xC0) // Compressed pointer + { + uint16_t offset = ((((uint16_t)tmp8) & ~0xC0) << 8) | _conn_read8(); + if (_conn->isValidOffset(offset)) + { + last_bufferpos = _conn->tell(); +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Compressed pointer, jumping from "); + DEBUG_ESP_PORT.print(last_bufferpos); + DEBUG_ESP_PORT.print(" to "); + DEBUG_ESP_PORT.println(offset); +#endif + _conn->seek(offset); + tmp8 = _conn_read8(); + } + else + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Skipping malformed compressed pointer"); +#endif + tmp8 = _conn_read8(); + break; + } + } + _conn_readS(answerHostName, tmp8); + answerHostName[tmp8] = '\0'; +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("SRV %d ", tmp8); + for (int n = 0; n < tmp8; n++) + { + DEBUG_ESP_PORT.printf("%02x ", answerHostName[n]); + } + DEBUG_ESP_PORT.printf("\n%s\n", answerHostName); +#endif + if (last_bufferpos > 0) + { + _conn->seek(last_bufferpos); + tmp8 = 2; // Size of compression octets +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.print("Compressed pointer, jumping back to "); + DEBUG_ESP_PORT.println(last_bufferpos); +#endif + } + if (answerRdlength - (6 + 1 + tmp8) > 0) // Skip any remaining rdata + { + _conn_readS(hostName, answerRdlength - (6 + 1 + tmp8)); + } + } + + else if (answerType == MDNS_TYPE_A) + { + partsCollected |= 0x08; + for (int i = 0; i < 4; i++) + { + answerIp[i] = _conn_read8(); + } + } + else + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("Ignoring unsupported type %02x\n", tmp8); +#endif + for (int n = 0; n < answerRdlength; n++) + { + (void)_conn_read8(); + } + } + + if ((partsCollected == 0x0F) && serviceMatch) + { +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.println("All answers parsed, adding to _answers list.."); +#endif + // Add new answer to answer list + if (_answers == 0) + { + _answers = (struct MDNSAnswer*)(os_malloc(sizeof(struct MDNSAnswer))); + answer = _answers; + } + else + { + answer = _answers; + while (answer->next != 0) + { + answer = answer->next; + } + answer->next = (struct MDNSAnswer*)(os_malloc(sizeof(struct MDNSAnswer))); + answer = answer->next; + } + answer->next = 0; + answer->hostname = 0; + + // Populate new answer + answer->port = answerPort; + for (int i = 0; i < 4; i++) + { + answer->ip[i] = answerIp[i]; + } + answer->hostname = (char *)os_malloc(strlen(answerHostName) + 1); + os_strcpy(answer->hostname, answerHostName); + _conn->flush(); + return; + } + } + _conn->flush(); return; - } } - - _conn->flush(); - return; - } - // PARSE REQUEST NAME + // PARSE REQUEST NAME - hostNameLen = _conn_read8() % 255; - _conn_readS(hostName, hostNameLen); - hostName[hostNameLen] = '\0'; + hostNameLen = _conn_read8() % 255; + _conn_readS(hostName, hostNameLen); + hostName[hostNameLen] = '\0'; - if(hostName[0] == '_'){ - serviceParsed = true; - memcpy(serviceName, hostName+1, hostNameLen); - serviceNameLen = hostNameLen-1; - hostNameLen = 0; - } - - if(hostNameLen > 0 && !_hostName.equals(hostName) && !_instanceName.equals(hostName)){ -#ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_NO_HOST: %s\n", hostName); - DEBUG_ESP_PORT.printf("hostname: %s\n", _hostName.c_str() ); - DEBUG_ESP_PORT.printf("instance: %s\n", _instanceName.c_str() ); -#endif - _conn->flush(); - return; - } - - if(!serviceParsed){ - serviceNameLen = _conn_read8() % 255; - _conn_readS(serviceName, serviceNameLen); - serviceName[serviceNameLen] = '\0'; - - if(serviceName[0] == '_'){ - memmove(serviceName, serviceName+1, serviceNameLen); - serviceNameLen--; - serviceParsed = true; - } else if(serviceNameLen == 5 && strcmp("local", serviceName) == 0){ - tmp = _conn_read8(); - if(tmp == 0){ + if (hostName[0] == '_') + { serviceParsed = true; - serviceNameLen = 0; - protoParsed = true; - protoNameLen = 0; - localParsed = true; - } else { + memcpy(serviceName, hostName + 1, hostNameLen); + serviceNameLen = hostNameLen - 1; + hostNameLen = 0; + } + + if (hostNameLen > 0 && !_hostName.equals(hostName) && !_instanceName.equals(hostName)) + { #ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_FQDN: %s\n", serviceName); + DEBUG_ESP_PORT.printf("ERR_NO_HOST: %s\n", hostName); + DEBUG_ESP_PORT.printf("hostname: %s\n", _hostName.c_str()); + DEBUG_ESP_PORT.printf("instance: %s\n", _instanceName.c_str()); #endif _conn->flush(); return; - } - } else { -#ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_SERVICE: %s\n", serviceName); -#endif - _conn->flush(); - return; } - } - if(!protoParsed){ - protoNameLen = _conn_read8() % 255; - _conn_readS(protoName, protoNameLen); - protoName[protoNameLen] = '\0'; - if(protoNameLen == 4 && protoName[0] == '_'){ - memmove(protoName, protoName+1, protoNameLen); - protoNameLen--; - protoParsed = true; - } else if(strcmp("services", serviceName) == 0 && strcmp("_dns-sd", protoName) == 0){ - _conn->flush(); - IPAddress interface = _getRequestMulticastInterface(); - _replyToTypeEnumRequest(interface); - return; - } else { + if (!serviceParsed) + { + serviceNameLen = _conn_read8() % 255; + _conn_readS(serviceName, serviceNameLen); + serviceName[serviceNameLen] = '\0'; + + if (serviceName[0] == '_') + { + memmove(serviceName, serviceName + 1, serviceNameLen); + serviceNameLen--; + serviceParsed = true; + } + else if (serviceNameLen == 5 && strcmp("local", serviceName) == 0) + { + tmp = _conn_read8(); + if (tmp == 0) + { + serviceParsed = true; + serviceNameLen = 0; + protoParsed = true; + protoNameLen = 0; + localParsed = true; + } + else + { #ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_PROTO: %s\n", protoName); + DEBUG_ESP_PORT.printf("ERR_FQDN: %s\n", serviceName); #endif - _conn->flush(); - return; - } - } - - if(!localParsed){ - char localName[32]; - uint8_t localNameLen = _conn_read8() % 31; - _conn_readS(localName, localNameLen); - localName[localNameLen] = '\0'; - tmp = _conn_read8(); - if(localNameLen == 5 && strcmp("local", localName) == 0 && tmp == 0){ - localParsed = true; - } else { + _conn->flush(); + return; + } + } + else + { #ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_FQDN: %s\n", localName); + DEBUG_ESP_PORT.printf("ERR_SERVICE: %s\n", serviceName); #endif - _conn->flush(); - return; + _conn->flush(); + return; + } } - } - if(serviceNameLen > 0 && protoNameLen > 0){ - servicePort = _getServicePort(serviceName, protoName); - if(servicePort == 0){ + if (!protoParsed) + { + protoNameLen = _conn_read8() % 255; + _conn_readS(protoName, protoNameLen); + protoName[protoNameLen] = '\0'; + if (protoNameLen == 4 && protoName[0] == '_') + { + memmove(protoName, protoName + 1, protoNameLen); + protoNameLen--; + protoParsed = true; + } + else if (strcmp("services", serviceName) == 0 && strcmp("_dns-sd", protoName) == 0) + { + _conn->flush(); + IPAddress interface = _getRequestMulticastInterface(); + _replyToTypeEnumRequest(interface); + return; + } + else + { #ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_NO_SERVICE: %s\n", serviceName); + DEBUG_ESP_PORT.printf("ERR_PROTO: %s\n", protoName); #endif - _conn->flush(); - return; + _conn->flush(); + return; + } } - } else if(serviceNameLen > 0 || protoNameLen > 0){ + + if (!localParsed) + { + char localName[32]; + uint8_t localNameLen = _conn_read8() % 31; + _conn_readS(localName, localNameLen); + localName[localNameLen] = '\0'; + tmp = _conn_read8(); + if (localNameLen == 5 && strcmp("local", localName) == 0 && tmp == 0) + { + localParsed = true; + } + else + { #ifdef DEBUG_ESP_MDNS_ERR - DEBUG_ESP_PORT.printf("ERR_SERVICE_PROTO: %s\n", serviceName); + DEBUG_ESP_PORT.printf("ERR_FQDN: %s\n", localName); #endif - _conn->flush(); - return; - } - - // RESPOND - -#ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n", packetHeader[0], packetHeader[2], packetHeader[3], packetHeader[4], packetHeader[5]); -#endif - - uint16_t currentType; - uint16_t currentClass; - - int numQuestions = packetHeader[2]; - if(numQuestions > 4) numQuestions = 4; - uint16_t questions[4]; - int question = 0; - - while(numQuestions--){ - currentType = _conn_read16(); - if(currentType & MDNS_NAME_REF){ //new header handle it better! - currentType = _conn_read16(); + _conn->flush(); + return; + } } - currentClass = _conn_read16(); - if(currentClass & MDNS_CLASS_IN) questions[question++] = currentType; - if(numQuestions > 0){ - if(_conn_read16() != 0xC00C){//new question but for another host/service + if (serviceNameLen > 0 && protoNameLen > 0) + { + servicePort = _getServicePort(serviceName, protoName); + if (servicePort == 0) + { +#ifdef DEBUG_ESP_MDNS_ERR + DEBUG_ESP_PORT.printf("ERR_NO_SERVICE: %s\n", serviceName); +#endif + _conn->flush(); + return; + } + } + else if (serviceNameLen > 0 || protoNameLen > 0) + { +#ifdef DEBUG_ESP_MDNS_ERR + DEBUG_ESP_PORT.printf("ERR_SERVICE_PROTO: %s\n", serviceName); +#endif _conn->flush(); - numQuestions = 0; - } + return; } + // RESPOND + #ifdef DEBUG_ESP_MDNS_RX - DEBUG_ESP_PORT.printf("REQ: "); - if(hostNameLen > 0) - DEBUG_ESP_PORT.printf("%s.", hostName); - if(serviceNameLen > 0) - DEBUG_ESP_PORT.printf("_%s.", serviceName); - if(protoNameLen > 0) - DEBUG_ESP_PORT.printf("_%s.", protoName); - DEBUG_ESP_PORT.printf("local. "); - - if(currentType == MDNS_TYPE_AAAA) - DEBUG_ESP_PORT.printf(" AAAA "); - else if(currentType == MDNS_TYPE_A) - DEBUG_ESP_PORT.printf(" A "); - else if(currentType == MDNS_TYPE_PTR) - DEBUG_ESP_PORT.printf(" PTR "); - else if(currentType == MDNS_TYPE_SRV) - DEBUG_ESP_PORT.printf(" SRV "); - else if(currentType == MDNS_TYPE_TXT) - DEBUG_ESP_PORT.printf(" TXT "); - else - DEBUG_ESP_PORT.printf(" 0x%04X ", currentType); - - if(currentClass == MDNS_CLASS_IN) - DEBUG_ESP_PORT.printf(" IN "); - else if(currentClass == MDNS_CLASS_IN_FLUSH_CACHE) - DEBUG_ESP_PORT.printf(" IN[F] "); - else - DEBUG_ESP_PORT.printf(" 0x%04X ", currentClass); - - DEBUG_ESP_PORT.printf("\n"); + DEBUG_ESP_PORT.printf("RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n", packetHeader[0], packetHeader[2], packetHeader[3], packetHeader[4], packetHeader[5]); #endif - } - uint8_t questionMask = 0; - uint8_t responseMask = 0; - for(i=0;i 4) + { + numQuestions = 4; + } + uint16_t questions[4]; + int question = 0; + + while (numQuestions--) + { + currentType = _conn_read16(); + if (currentType & MDNS_NAME_REF) //new header handle it better! + { + currentType = _conn_read16(); + } + currentClass = _conn_read16(); + if (currentClass & MDNS_CLASS_IN) + { + questions[question++] = currentType; + } + + if (numQuestions > 0) + { + if (_conn_read16() != 0xC00C) //new question but for another host/service + { + _conn->flush(); + numQuestions = 0; + } + } + +#ifdef DEBUG_ESP_MDNS_RX + DEBUG_ESP_PORT.printf("REQ: "); + if (hostNameLen > 0) + { + DEBUG_ESP_PORT.printf("%s.", hostName); + } + if (serviceNameLen > 0) + { + DEBUG_ESP_PORT.printf("_%s.", serviceName); + } + if (protoNameLen > 0) + { + DEBUG_ESP_PORT.printf("_%s.", protoName); + } + DEBUG_ESP_PORT.printf("local. "); + + if (currentType == MDNS_TYPE_AAAA) + { + DEBUG_ESP_PORT.printf(" AAAA "); + } + else if (currentType == MDNS_TYPE_A) + { + DEBUG_ESP_PORT.printf(" A "); + } + else if (currentType == MDNS_TYPE_PTR) + { + DEBUG_ESP_PORT.printf(" PTR "); + } + else if (currentType == MDNS_TYPE_SRV) + { + DEBUG_ESP_PORT.printf(" SRV "); + } + else if (currentType == MDNS_TYPE_TXT) + { + DEBUG_ESP_PORT.printf(" TXT "); + } + else + { + DEBUG_ESP_PORT.printf(" 0x%04X ", currentType); + } + + if (currentClass == MDNS_CLASS_IN) + { + DEBUG_ESP_PORT.printf(" IN "); + } + else if (currentClass == MDNS_CLASS_IN_FLUSH_CACHE) + { + DEBUG_ESP_PORT.printf(" IN[F] "); + } + else + { + DEBUG_ESP_PORT.printf(" 0x%04X ", currentClass); + } + + DEBUG_ESP_PORT.printf("\n"); +#endif + } + uint8_t questionMask = 0; + uint8_t responseMask = 0; + for (i = 0; i < question; i++) + { + if (questions[i] == MDNS_TYPE_A) + { + questionMask |= 0x1; + responseMask |= 0x1; + } + else if (questions[i] == MDNS_TYPE_SRV) + { + questionMask |= 0x2; + responseMask |= 0x3; + } + else if (questions[i] == MDNS_TYPE_TXT) + { + questionMask |= 0x4; + responseMask |= 0x4; + } + else if (questions[i] == MDNS_TYPE_PTR) + { + questionMask |= 0x8; + responseMask |= 0xF; + } + } + + IPAddress interface = _getRequestMulticastInterface(); + return _replyToInstanceRequest(questionMask, responseMask, serviceName, protoName, servicePort, interface); } /** - * STRINGIZE - */ + STRINGIZE +*/ #ifndef STRINGIZE - #define STRINGIZE(x) #x +#define STRINGIZE(x) #x #endif #ifndef STRINGIZE_VALUE_OF - #define STRINGIZE_VALUE_OF(x) STRINGIZE(x) +#define STRINGIZE_VALUE_OF(x) STRINGIZE(x) #endif -void MDNSResponder::enableArduino(uint16_t port, bool auth){ +void MDNSResponder::enableArduino(uint16_t port, bool auth) +{ - addService("arduino", "tcp", port); - addServiceTxt("arduino", "tcp", "tcp_check", "no"); - addServiceTxt("arduino", "tcp", "ssh_upload", "no"); - addServiceTxt("arduino", "tcp", "board", STRINGIZE_VALUE_OF(ARDUINO_BOARD)); - addServiceTxt("arduino", "tcp", "auth_upload", (auth) ? "yes":"no"); + addService("arduino", "tcp", port); + addServiceTxt("arduino", "tcp", "tcp_check", "no"); + addServiceTxt("arduino", "tcp", "ssh_upload", "no"); + addServiceTxt("arduino", "tcp", "board", STRINGIZE_VALUE_OF(ARDUINO_BOARD)); + addServiceTxt("arduino", "tcp", "auth_upload", (auth) ? "yes" : "no"); } -void MDNSResponder::_replyToTypeEnumRequest(IPAddress multicastInterface) { - MDNSService* servicePtr; - for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) { - if(servicePtr->_port > 0){ - char *service = servicePtr->_name; - char *proto = servicePtr->_proto; - //uint16_t port = servicePtr->_port; +void MDNSResponder::_replyToTypeEnumRequest(IPAddress multicastInterface) +{ + MDNSService* servicePtr; + for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next) + { + if (servicePtr->_port > 0) + { + char *service = servicePtr->_name; + char *proto = servicePtr->_proto; + //uint16_t port = servicePtr->_port; #ifdef DEBUG_ESP_MDNS_TX - DEBUG_ESP_PORT.printf("TX: service:%s, proto:%s\n", service, proto); + DEBUG_ESP_PORT.printf("TX: service:%s, proto:%s\n", service, proto); #endif - char sdHostName[] = "_services"; - size_t sdHostNameLen = 9; - char sdServiceName[] = "_dns-sd"; - size_t sdServiceNameLen = 7; - char sdProtoName[] = "_udp"; - size_t sdProtoNameLen = 4; + char sdHostName[] = "_services"; + size_t sdHostNameLen = 9; + char sdServiceName[] = "_dns-sd"; + size_t sdServiceNameLen = 7; + char sdProtoName[] = "_udp"; + size_t sdProtoNameLen = 4; - char underscore[] = "_"; + char underscore[] = "_"; - // build service name with _ - char serviceName[os_strlen(service) + 2]; - os_strcpy(serviceName, underscore); - os_strcat(serviceName, service); - size_t serviceNameLen = os_strlen(serviceName); + // build service name with _ + char serviceName[os_strlen(service) + 2]; + os_strcpy(serviceName, underscore); + os_strcat(serviceName, service); + size_t serviceNameLen = os_strlen(serviceName); - //build proto name with _ - char protoName[5]; - os_strcpy(protoName, underscore); - os_strcat(protoName, proto); - size_t protoNameLen = 4; + //build proto name with _ + char protoName[5]; + os_strcpy(protoName, underscore); + os_strcat(protoName, proto); + size_t protoNameLen = 4; - //local string - char localName[] = "local"; - size_t localNameLen = 5; + //local string + char localName[] = "local"; + size_t localNameLen = 5; - //terminator - char terminator[] = "\0"; + //terminator + char terminator[] = "\0"; - //Write the header - _conn->flush(); - uint8_t head[12] = { - 0x00, 0x00, //ID = 0 - 0x84, 0x00, //Flags = response + authoritative answer - 0x00, 0x00, //Question count - 0x00, 0x01, //Answer count - 0x00, 0x00, //Name server records - 0x00, 0x00, //Additional records - }; - _conn->append(reinterpret_cast(head), 12); + //Write the header + _conn->flush(); + uint8_t head[12] = + { + 0x00, 0x00, //ID = 0 + 0x84, 0x00, //Flags = response + authoritative answer + 0x00, 0x00, //Question count + 0x00, 0x01, //Answer count + 0x00, 0x00, //Name server records + 0x00, 0x00, //Additional records + }; + _conn->append(reinterpret_cast(head), 12); - // Send the Name field (ie. "_services._dns-sd._udp.local") - _conn->append(reinterpret_cast(&sdHostNameLen), 1); // length of "_services" - _conn->append(reinterpret_cast(sdHostName), sdHostNameLen); // "_services" - _conn->append(reinterpret_cast(&sdServiceNameLen), 1); // length of "_dns-sd" - _conn->append(reinterpret_cast(sdServiceName), sdServiceNameLen);// "_dns-sd" - _conn->append(reinterpret_cast(&sdProtoNameLen), 1); // length of "_udp" - _conn->append(reinterpret_cast(sdProtoName), sdProtoNameLen); // "_udp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator + // Send the Name field (ie. "_services._dns-sd._udp.local") + _conn->append(reinterpret_cast(&sdHostNameLen), 1); // length of "_services" + _conn->append(reinterpret_cast(sdHostName), sdHostNameLen); // "_services" + _conn->append(reinterpret_cast(&sdServiceNameLen), 1); // length of "_dns-sd" + _conn->append(reinterpret_cast(sdServiceName), sdServiceNameLen);// "_dns-sd" + _conn->append(reinterpret_cast(&sdProtoNameLen), 1); // length of "_udp" + _conn->append(reinterpret_cast(sdProtoName), sdProtoNameLen); // "_udp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator - //Send the type, class, ttl and rdata length - uint8_t ptrDataLen = serviceNameLen + protoNameLen + localNameLen + 4; // 4 is three label sizes and the terminator - uint8_t ptrAttrs[10] = { - 0x00, 0x0c, //PTR record query - 0x00, 0x01, //Class IN - 0x00, 0x00, 0x11, 0x94, //TTL 4500 - 0x00, ptrDataLen, //RData length - }; - _conn->append(reinterpret_cast(ptrAttrs), 10); + //Send the type, class, ttl and rdata length + uint8_t ptrDataLen = serviceNameLen + protoNameLen + localNameLen + 4; // 4 is three label sizes and the terminator + uint8_t ptrAttrs[10] = + { + 0x00, 0x0c, //PTR record query + 0x00, 0x01, //Class IN + 0x00, 0x00, 0x11, 0x94, //TTL 4500 + 0x00, ptrDataLen, //RData length + }; + _conn->append(reinterpret_cast(ptrAttrs), 10); - //Send the RData (ie. "_http._tcp.local") - _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" - _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator + //Send the RData (ie. "_http._tcp.local") + _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" + _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator - _conn->setMulticastInterface(multicastInterface); - _conn->send(); + _conn->setMulticastInterface(multicastInterface); + _conn->send(); + } } - } } -void MDNSResponder::_replyToInstanceRequest(uint8_t questionMask, uint8_t responseMask, char * service, char *proto, uint16_t port, IPAddress multicastInterface) { - int i; - if(questionMask == 0) return; - if(responseMask == 0) return; +void MDNSResponder::_replyToInstanceRequest(uint8_t questionMask, uint8_t responseMask, char * service, char *proto, uint16_t port, IPAddress multicastInterface) +{ + int i; + if (questionMask == 0) + { + return; + } + if (responseMask == 0) + { + return; + } #ifdef DEBUG_ESP_MDNS_TX DEBUG_ESP_PORT.printf("TX: qmask:%01X, rmask:%01X, service:%s, proto:%s, port:%u\n", questionMask, responseMask, service, proto, port); #endif - String instanceName = _instanceName; - size_t instanceNameLen = instanceName.length(); + String instanceName = _instanceName; + size_t instanceNameLen = instanceName.length(); - String hostName = _hostName; - size_t hostNameLen = hostName.length(); + String hostName = _hostName; + size_t hostNameLen = hostName.length(); - char underscore[] = "_"; - - // build service name with _ - char serviceName[os_strlen(service)+2]; - os_strcpy(serviceName,underscore); - os_strcat(serviceName, service); - size_t serviceNameLen = os_strlen(serviceName); + char underscore[] = "_"; - //build proto name with _ - char protoName[5]; - os_strcpy(protoName,underscore); - os_strcat(protoName, proto); - size_t protoNameLen = 4; + // build service name with _ + char serviceName[os_strlen(service) + 2]; + os_strcpy(serviceName, underscore); + os_strcat(serviceName, service); + size_t serviceNameLen = os_strlen(serviceName); - //local string - char localName[] = "local"; - size_t localNameLen = 5; + //build proto name with _ + char protoName[5]; + os_strcpy(protoName, underscore); + os_strcat(protoName, proto); + size_t protoNameLen = 4; - //terminator - char terminator[] = "\0"; + //local string + char localName[] = "local"; + size_t localNameLen = 5; - uint8_t answerMask = responseMask & questionMask; - uint8_t answerCount = 0; - uint8_t additionalMask = responseMask & ~questionMask; - uint8_t additionalCount = 0; - for(i=0;i<4;i++){ - if(answerMask & (1 << i)) - answerCount++; - if(additionalMask & (1 << i)) - additionalCount++; - } + //terminator + char terminator[] = "\0"; - - //Write the header - _conn->flush(); - uint8_t head[12] = { - 0x00, 0x00, //ID = 0 - 0x84, 0x00, //Flags = response + authoritative answer - 0x00, 0x00, //Question count - 0x00, answerCount, //Answer count - 0x00, 0x00, //Name server records - 0x00, additionalCount, //Additional records - }; - _conn->append(reinterpret_cast(head), 12); - - for(int responseSection = 0; responseSection < 2; ++responseSection) { - - // PTR Response - if((responseSection == 0 ? answerMask : additionalMask) & 0x8){ - // Send the Name field (ie. "_http._tcp.local") - _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" - _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator - - //Send the type, class, ttl and rdata length - uint8_t ptrDataLen = instanceNameLen + serviceNameLen + protoNameLen + localNameLen + 5; // 5 is four label sizes and the terminator - uint8_t ptrAttrs[10] = { - 0x00, 0x0c, //PTR record query - 0x00, 0x01, //Class IN - 0x00, 0x00, 0x00, 0x78, //TTL 120 - 0x00, ptrDataLen, //RData length - }; - _conn->append(reinterpret_cast(ptrAttrs), 10); - - //Send the RData (ie. "My IOT device._http._tcp.local") - _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" - _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" - _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" - _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator - } - - //TXT Responce - if((responseSection == 0 ? answerMask : additionalMask) & 0x4){ - //Send the name field (ie. "My IOT device._http._tcp.local") - _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" - _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" - _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" - _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator - - //Send the type, class, ttl and rdata length - uint8_t txtDataLen = _getServiceTxtLen(service,proto); - uint8_t txtAttrs[10] = { - 0x00, 0x10, //TXT record query - 0x80, 0x01, //Class IN, with cache flush - 0x00, 0x00, 0x11, 0x94, //TTL 4500 - 0x00, txtDataLen, //RData length - }; - _conn->append(reinterpret_cast(txtAttrs), 10); - - //Send the RData - MDNSTxt * txtPtr = _getServiceTxt(service,proto); - while(txtPtr !=0){ - uint8_t txtLen = txtPtr->_txt.length(); - _conn->append(reinterpret_cast(&txtLen), 1); // length of txt - _conn->append(reinterpret_cast(txtPtr->_txt.c_str()), txtLen);// the txt - txtPtr = txtPtr->_next; - } + uint8_t answerMask = responseMask & questionMask; + uint8_t answerCount = 0; + uint8_t additionalMask = responseMask & ~questionMask; + uint8_t additionalCount = 0; + for (i = 0; i < 4; i++) + { + if (answerMask & (1 << i)) + { + answerCount++; + } + if (additionalMask & (1 << i)) + { + additionalCount++; + } } - //SRV Responce - if((responseSection == 0 ? answerMask : additionalMask) & 0x2){ - //Send the name field (ie. "My IOT device._http._tcp.local") - _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" - _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" - _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" - _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" - _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" - _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator + //Write the header + _conn->flush(); + uint8_t head[12] = + { + 0x00, 0x00, //ID = 0 + 0x84, 0x00, //Flags = response + authoritative answer + 0x00, 0x00, //Question count + 0x00, answerCount, //Answer count + 0x00, 0x00, //Name server records + 0x00, additionalCount, //Additional records + }; + _conn->append(reinterpret_cast(head), 12); - //Send the type, class, ttl, rdata length, priority and weight - uint8_t srvDataSize = hostNameLen + localNameLen + 3; // 3 is 2 lable size bytes and the terminator - srvDataSize += 6; // Size of Priority, weight and port - uint8_t srvAttrs[10] = { - 0x00, 0x21, //Type SRV - 0x80, 0x01, //Class IN, with cache flush - 0x00, 0x00, 0x00, 0x78, //TTL 120 - 0x00, srvDataSize, //RData length - }; - _conn->append(reinterpret_cast(srvAttrs), 10); + for (int responseSection = 0; responseSection < 2; ++responseSection) + { - //Send the RData Priority weight and port - uint8_t srvRData[6] = { - 0x00, 0x00, //Priority 0 - 0x00, 0x00, //Weight 0 - (uint8_t)((port >> 8) & 0xFF), (uint8_t)(port & 0xFF) - }; - _conn->append(reinterpret_cast(srvRData), 6); - //Send the RData (ie. "esp8266.local") - _conn->append(reinterpret_cast(&hostNameLen), 1); // length of "esp8266" - _conn->append(reinterpret_cast(hostName.c_str()), hostNameLen);// "esp8266" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator + // PTR Response + if ((responseSection == 0 ? answerMask : additionalMask) & 0x8) + { + // Send the Name field (ie. "_http._tcp.local") + _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" + _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + //Send the type, class, ttl and rdata length + uint8_t ptrDataLen = instanceNameLen + serviceNameLen + protoNameLen + localNameLen + 5; // 5 is four label sizes and the terminator + uint8_t ptrAttrs[10] = + { + 0x00, 0x0c, //PTR record query + 0x00, 0x01, //Class IN + 0x00, 0x00, 0x00, 0x78, //TTL 120 + 0x00, ptrDataLen, //RData length + }; + _conn->append(reinterpret_cast(ptrAttrs), 10); + + //Send the RData (ie. "My IOT device._http._tcp.local") + _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" + _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" + _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" + _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + } + + //TXT Responce + if ((responseSection == 0 ? answerMask : additionalMask) & 0x4) + { + //Send the name field (ie. "My IOT device._http._tcp.local") + _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" + _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" + _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" + _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + + //Send the type, class, ttl and rdata length + uint8_t txtDataLen = _getServiceTxtLen(service, proto); + uint8_t txtAttrs[10] = + { + 0x00, 0x10, //TXT record query + 0x80, 0x01, //Class IN, with cache flush + 0x00, 0x00, 0x11, 0x94, //TTL 4500 + 0x00, txtDataLen, //RData length + }; + _conn->append(reinterpret_cast(txtAttrs), 10); + + //Send the RData + MDNSTxt * txtPtr = _getServiceTxt(service, proto); + while (txtPtr != 0) + { + uint8_t txtLen = txtPtr->_txt.length(); + _conn->append(reinterpret_cast(&txtLen), 1); // length of txt + _conn->append(reinterpret_cast(txtPtr->_txt.c_str()), txtLen);// the txt + txtPtr = txtPtr->_next; + } + } + + + //SRV Responce + if ((responseSection == 0 ? answerMask : additionalMask) & 0x2) + { + //Send the name field (ie. "My IOT device._http._tcp.local") + _conn->append(reinterpret_cast(&instanceNameLen), 1); // length of "My IOT device" + _conn->append(reinterpret_cast(instanceName.c_str()), instanceNameLen);// "My IOT device" + _conn->append(reinterpret_cast(&serviceNameLen), 1); // length of "_http" + _conn->append(reinterpret_cast(serviceName), serviceNameLen); // "_http" + _conn->append(reinterpret_cast(&protoNameLen), 1); // length of "_tcp" + _conn->append(reinterpret_cast(protoName), protoNameLen); // "_tcp" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + + //Send the type, class, ttl, rdata length, priority and weight + uint8_t srvDataSize = hostNameLen + localNameLen + 3; // 3 is 2 lable size bytes and the terminator + srvDataSize += 6; // Size of Priority, weight and port + uint8_t srvAttrs[10] = + { + 0x00, 0x21, //Type SRV + 0x80, 0x01, //Class IN, with cache flush + 0x00, 0x00, 0x00, 0x78, //TTL 120 + 0x00, srvDataSize, //RData length + }; + _conn->append(reinterpret_cast(srvAttrs), 10); + + //Send the RData Priority weight and port + uint8_t srvRData[6] = + { + 0x00, 0x00, //Priority 0 + 0x00, 0x00, //Weight 0 + (uint8_t)((port >> 8) & 0xFF), (uint8_t)(port & 0xFF) + }; + _conn->append(reinterpret_cast(srvRData), 6); + //Send the RData (ie. "esp8266.local") + _conn->append(reinterpret_cast(&hostNameLen), 1); // length of "esp8266" + _conn->append(reinterpret_cast(hostName.c_str()), hostNameLen);// "esp8266" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + + } + + // A Response + if ((responseSection == 0 ? answerMask : additionalMask) & 0x1) + { + //Send the RData (ie. "esp8266.local") + _conn->append(reinterpret_cast(&hostNameLen), 1); // length of "esp8266" + _conn->append(reinterpret_cast(hostName.c_str()), hostNameLen);// "esp8266" + _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" + _conn->append(reinterpret_cast(localName), localNameLen); // "local" + _conn->append(reinterpret_cast(&terminator), 1); // terminator + + uint8_t aaaAttrs[10] = + { + 0x00, 0x01, //TYPE A + 0x80, 0x01, //Class IN, with cache flush + 0x00, 0x00, 0x00, 0x78, //TTL 120 + 0x00, 0x04, //DATA LEN + }; + _conn->append(reinterpret_cast(aaaAttrs), 10); + + // Send RData + uint32_t ip = multicastInterface; + uint8_t aaaRData[4] = + { + (uint8_t)(ip & 0xFF), //IP first octet + (uint8_t)((ip >> 8) & 0xFF), //IP second octet + (uint8_t)((ip >> 16) & 0xFF), //IP third octet + (uint8_t)((ip >> 24) & 0xFF) //IP fourth octet + }; + _conn->append(reinterpret_cast(aaaRData), 4); + } } - // A Response - if((responseSection == 0 ? answerMask : additionalMask) & 0x1){ - //Send the RData (ie. "esp8266.local") - _conn->append(reinterpret_cast(&hostNameLen), 1); // length of "esp8266" - _conn->append(reinterpret_cast(hostName.c_str()), hostNameLen);// "esp8266" - _conn->append(reinterpret_cast(&localNameLen), 1); // length "local" - _conn->append(reinterpret_cast(localName), localNameLen); // "local" - _conn->append(reinterpret_cast(&terminator), 1); // terminator - - uint8_t aaaAttrs[10] = { - 0x00, 0x01, //TYPE A - 0x80, 0x01, //Class IN, with cache flush - 0x00, 0x00, 0x00, 0x78, //TTL 120 - 0x00, 0x04, //DATA LEN - }; - _conn->append(reinterpret_cast(aaaAttrs), 10); - - // Send RData - uint32_t ip = multicastInterface; - uint8_t aaaRData[4] = { - (uint8_t)(ip & 0xFF), //IP first octet - (uint8_t)((ip >> 8) & 0xFF), //IP second octet - (uint8_t)((ip >> 16) & 0xFF), //IP third octet - (uint8_t)((ip >> 24) & 0xFF) //IP fourth octet - }; - _conn->append(reinterpret_cast(aaaRData), 4); - } - } - - _conn->setMulticastInterface(multicastInterface); - _conn->send(); + _conn->setMulticastInterface(multicastInterface); + _conn->send(); } #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_MDNS) diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.h b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.h index 6d241ae06..9d3cfd2f6 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.h +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS_Legacy.h @@ -1,43 +1,43 @@ /* -ESP8266 Multicast DNS (port of CC3000 Multicast DNS library) -Version 1.1 -Copyright (c) 2013 Tony DiCola (tony@tonydicola.com) -ESP8266 port (c) 2015 Ivan Grokhotkov (ivan@esp8266.com) -Extended MDNS-SD support 2016 Lars Englund (lars.englund@gmail.com) + ESP8266 Multicast DNS (port of CC3000 Multicast DNS library) + Version 1.1 + Copyright (c) 2013 Tony DiCola (tony@tonydicola.com) + ESP8266 port (c) 2015 Ivan Grokhotkov (ivan@esp8266.com) + Extended MDNS-SD support 2016 Lars Englund (lars.englund@gmail.com) -This is a simple implementation of multicast DNS query support for an Arduino -running on ESP8266 chip. Only support for resolving address queries is currently -implemented. + This is a simple implementation of multicast DNS query support for an Arduino + running on ESP8266 chip. Only support for resolving address queries is currently + implemented. -Requirements: -- ESP8266WiFi library + Requirements: + - ESP8266WiFi library -Usage: -- Include the ESP8266 Multicast DNS library in the sketch. -- Call the begin method in the sketch's setup and provide a domain name (without - the '.local' suffix, i.e. just provide 'foo' to resolve 'foo.local'), and the - Adafruit CC3000 class instance. Optionally provide a time to live (in seconds) - for the DNS record--the default is 1 hour. -- Call the update method in each iteration of the sketch's loop function. + Usage: + - Include the ESP8266 Multicast DNS library in the sketch. + - Call the begin method in the sketch's setup and provide a domain name (without + the '.local' suffix, i.e. just provide 'foo' to resolve 'foo.local'), and the + Adafruit CC3000 class instance. Optionally provide a time to live (in seconds) + for the DNS record--the default is 1 hour. + - Call the update method in each iteration of the sketch's loop function. -License (MIT license): - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. */ #ifndef ESP8266MDNS_LEGACY_H @@ -54,95 +54,108 @@ License (MIT license): class UdpContext; -namespace Legacy_MDNSResponder { +namespace Legacy_MDNSResponder +{ struct MDNSService; struct MDNSTxt; struct MDNSAnswer; -class MDNSResponder { +class MDNSResponder +{ public: - MDNSResponder(); - ~MDNSResponder(); - bool begin(const char* hostName); - bool begin(const String& hostName) { - return begin(hostName.c_str()); - } - //for compatibility - bool begin(const char* hostName, IPAddress ip, uint32_t ttl=120){ - (void) ip; - (void) ttl; - return begin(hostName); - } - bool begin(const String& hostName, IPAddress ip, uint32_t ttl=120) { - return begin(hostName.c_str(), ip, ttl); - } - /* Application should call this whenever AP is configured/disabled */ - void notifyAPChange(); - void update(); + MDNSResponder(); + ~MDNSResponder(); + bool begin(const char* hostName); + bool begin(const String& hostName) + { + return begin(hostName.c_str()); + } + //for compatibility + bool begin(const char* hostName, IPAddress ip, uint32_t ttl = 120) + { + (void) ip; + (void) ttl; + return begin(hostName); + } + bool begin(const String& hostName, IPAddress ip, uint32_t ttl = 120) + { + return begin(hostName.c_str(), ip, ttl); + } + /* Application should call this whenever AP is configured/disabled */ + void notifyAPChange(); + void update(); - void addService(char *service, char *proto, uint16_t port); - void addService(const char *service, const char *proto, uint16_t port){ - addService((char *)service, (char *)proto, port); - } - void addService(const String& service, const String& proto, uint16_t port){ - addService(service.c_str(), proto.c_str(), port); - } - - bool addServiceTxt(char *name, char *proto, char * key, char * value); - bool addServiceTxt(const char *name, const char *proto, const char *key,const char * value){ - return addServiceTxt((char *)name, (char *)proto, (char *)key, (char *)value); - } - bool addServiceTxt(const String& name, const String& proto, const String& key, const String& value){ - return addServiceTxt(name.c_str(), proto.c_str(), key.c_str(), value.c_str()); - } - - int queryService(char *service, char *proto); - int queryService(const char *service, const char *proto){ - return queryService((char *)service, (char *)proto); - } - int queryService(const String& service, const String& proto){ - return queryService(service.c_str(), proto.c_str()); - } - String hostname(int idx); - IPAddress IP(int idx); - uint16_t port(int idx); - - void enableArduino(uint16_t port, bool auth=false); + void addService(char *service, char *proto, uint16_t port); + void addService(const char *service, const char *proto, uint16_t port) + { + addService((char *)service, (char *)proto, port); + } + void addService(const String& service, const String& proto, uint16_t port) + { + addService(service.c_str(), proto.c_str(), port); + } - void setInstanceName(String name); - void setInstanceName(const char * name){ - setInstanceName(String(name)); - } - void setInstanceName(char * name){ - setInstanceName(String(name)); - } + bool addServiceTxt(char *name, char *proto, char * key, char * value); + bool addServiceTxt(const char *name, const char *proto, const char *key, const char * value) + { + return addServiceTxt((char *)name, (char *)proto, (char *)key, (char *)value); + } + bool addServiceTxt(const String& name, const String& proto, const String& key, const String& value) + { + return addServiceTxt(name.c_str(), proto.c_str(), key.c_str(), value.c_str()); + } + + int queryService(char *service, char *proto); + int queryService(const char *service, const char *proto) + { + return queryService((char *)service, (char *)proto); + } + int queryService(const String& service, const String& proto) + { + return queryService(service.c_str(), proto.c_str()); + } + String hostname(int idx); + IPAddress IP(int idx); + uint16_t port(int idx); + + void enableArduino(uint16_t port, bool auth = false); + + void setInstanceName(String name); + void setInstanceName(const char * name) + { + setInstanceName(String(name)); + } + void setInstanceName(char * name) + { + setInstanceName(String(name)); + } private: - struct MDNSService * _services; - UdpContext* _conn; - String _hostName; - String _instanceName; - struct MDNSAnswer * _answers; - struct MDNSQuery * _query; - bool _newQuery; - bool _waitingForAnswers; - WiFiEventHandler _disconnectedHandler; - WiFiEventHandler _gotIPHandler; - + struct MDNSService * _services; + UdpContext* _conn; + String _hostName; + String _instanceName; + struct MDNSAnswer * _answers; + struct MDNSQuery * _query; + bool _newQuery; + bool _waitingForAnswers; + WiFiEventHandler _disconnectedHandler; + WiFiEventHandler _gotIPHandler; - uint16_t _getServicePort(char *service, char *proto); - MDNSTxt * _getServiceTxt(char *name, char *proto); - uint16_t _getServiceTxtLen(char *name, char *proto); - IPAddress _getRequestMulticastInterface(); - void _parsePacket(); - void _replyToTypeEnumRequest(IPAddress multicastInterface); - void _replyToInstanceRequest(uint8_t questionMask, uint8_t responseMask, char * service, char *proto, uint16_t port, IPAddress multicastInterface); - MDNSAnswer* _getAnswerFromIdx(int idx); - int _getNumAnswers(); - bool _listen(); - void _restart(); + + uint16_t _getServicePort(char *service, char *proto); + MDNSTxt * _getServiceTxt(char *name, char *proto); + uint16_t _getServiceTxtLen(char *name, char *proto); + IPAddress _getRequestMulticastInterface(); + void _parsePacket(); + void _replyToTypeEnumRequest(IPAddress multicastInterface); + void _replyToInstanceRequest(uint8_t questionMask, uint8_t responseMask, char * service, char *proto, uint16_t port, IPAddress multicastInterface); + MDNSAnswer* _getAnswerFromIdx(int idx); + int _getNumAnswers(); + bool _listen(); + void _restart(); }; } // namespace Legacy_MDNSResponder diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.cpp b/libraries/ESP8266mDNS/src/LEAmDNS.cpp index 1b468fb26..95f07079d 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS.cpp @@ -1,1212 +1,1380 @@ -/* - * LEAmDNS.cpp - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include -#include - -#include "LEAmDNS_Priv.h" - - -namespace esp8266 { - -/* - * LEAmDNS - */ -namespace MDNSImplementation { - -/** - * STRINGIZE - */ -#ifndef STRINGIZE - #define STRINGIZE(x) #x -#endif -#ifndef STRINGIZE_VALUE_OF - #define STRINGIZE_VALUE_OF(x) STRINGIZE(x) -#endif - - -/** - * INTERFACE - */ - -/** - * MDNSResponder::MDNSResponder - */ -MDNSResponder::MDNSResponder(void) -: m_pServices(0), - m_pUDPContext(0), - m_pcHostname(0), - m_pServiceQueries(0), - m_fnServiceTxtCallback(0), -#ifdef ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE - m_bPassivModeEnabled(true), -#else - m_bPassivModeEnabled(false), -#endif - m_netif(nullptr) { -} - -/* - * MDNSResponder::~MDNSResponder - */ -MDNSResponder::~MDNSResponder(void) { - - _resetProbeStatus(false); - _releaseServiceQueries(); - _releaseHostname(); - _releaseUDPContext(); - _releaseServices(); -} - -/* - * MDNSResponder::begin - * - * Set the host domain (for probing) and install WiFi event handlers for - * IP assignment and disconnection management. In both cases, the MDNS responder - * is restarted (reset and restart probe status) - * Finally the responder is (re)started - * - */ -bool MDNSResponder::begin(const char* p_pcHostname, const IPAddress& p_IPAddress, uint32_t p_u32TTL) { - - (void)p_u32TTL; // ignored - bool bResult = false; - - if (0 == m_pUDPContext) { - if (_setHostname(p_pcHostname)) { - - //// select interface - - m_netif = nullptr; - IPAddress ipAddress = p_IPAddress; - - if (!ipAddress.isSet()) { - - IPAddress sta = WiFi.localIP(); - IPAddress ap = WiFi.softAPIP(); - - if (!sta.isSet() && !ap.isSet()) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] internal interfaces (STA, AP) are not set (none was specified)\n"))); - return false; - } - - if (ap.isSet()) { - - if (sta.isSet()) - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface AP selected over STA (none was specified)\n"))); - else - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface AP selected\n"))); - ipAddress = ap; - - } else { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface STA selected (none was specified)\n"))); - ipAddress = sta; - - } - - // continue to ensure interface is UP - } - - // check existence of this IP address in the interface list - bool found = false; - m_netif = nullptr; - for (auto a: addrList) - if (ipAddress == a.addr()) { - if (a.ifUp()) { - found = true; - m_netif = a.interface(); - break; - } - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] found interface for IP '%s' but it is not UP\n"), ipAddress.toString().c_str());); - } - if (!found) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] interface defined by IP '%s' not found\n"), ipAddress.toString().c_str());); - return false; - } - - //// done selecting the interface - - if (m_netif->num == STATION_IF) { - - m_GotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& pEvent) { - (void) pEvent; - // Ensure that _restart() runs in USER context - schedule_function([this]() { MDNSResponder::_restart(); }); - }); - - m_DisconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected& pEvent) { - (void) pEvent; - // Ensure that _restart() runs in USER context - schedule_function([this]() { MDNSResponder::_restart(); }); - }); - } - - bResult = _restart(); - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: FAILED for '%s'!\n"), (p_pcHostname ?: "-")); } ); - } - else { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: Ignoring multiple calls to begin (Ignored host domain: '%s')!\n"), (p_pcHostname ?: "-"));); - } - return bResult; -} - -/* - * MDNSResponder::close - * - * Ends the MDNS responder. - * Announced services are unannounced (by multicasting a goodbye message) - * - */ -bool MDNSResponder::close(void) { - - m_GotIPHandler.reset(); // reset WiFi event callbacks. - m_DisconnectedHandler.reset(); - - _announce(false, true); - _resetProbeStatus(false); // Stop probing - - _releaseServiceQueries(); - _releaseUDPContext(); - _releaseHostname(); - - return true; -} - -/* - * MDNSResponder::end - * - * Ends the MDNS responder. - * for compatibility with esp32 - * - */ - -bool MDNSResponder::end(void) { - return close(); -} - -/* - * MDNSResponder::setHostname - * - * Replaces the current hostname and restarts probing. - * For services without own instance name (when the host name was used a instance - * name), the instance names are replaced also (and the probing is restarted). - * - */ -bool MDNSResponder::setHostname(const char* p_pcHostname) { - - bool bResult = false; - - if (_setHostname(p_pcHostname)) { - m_HostProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; - - // Replace 'auto-set' service names - bResult = true; - for (stcMDNSService* pService=m_pServices; ((bResult) && (pService)); pService=pService->m_pNext) { - if (pService->m_bAutoName) { - bResult = pService->setName(p_pcHostname); - pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; - } - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setHostname: FAILED for '%s'!\n"), (p_pcHostname ?: "-")); } ); - return bResult; -} - -/* - * MDNSResponder::setHostname (LEGACY) - */ -bool MDNSResponder::setHostname(String p_strHostname) { - - return setHostname(p_strHostname.c_str()); -} - - -/* - * SERVICES - */ - -/* - * MDNSResponder::addService - * - * Add service; using hostname if no name is explicitly provided for the service - * The usual '_' underline, which is prepended to service and protocol, eg. _http, - * may be given. If not, it is added automatically. - * - */ -MDNSResponder::hMDNSService MDNSResponder::addService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol, - uint16_t p_u16Port) { - - hMDNSService hResult = 0; - - if (((!p_pcName) || // NO name OR - (MDNS_DOMAIN_LABEL_MAXLENGTH >= os_strlen(p_pcName))) && // Fitting name - (p_pcService) && - (MDNS_SERVICE_NAME_LENGTH >= os_strlen(p_pcService)) && - (p_pcProtocol) && - ((MDNS_SERVICE_PROTOCOL_LENGTH - 1) != os_strlen(p_pcProtocol)) && - (p_u16Port)) { - - if (!_findService((p_pcName ?: m_pcHostname), p_pcService, p_pcProtocol)) { // Not already used - if (0 != (hResult = (hMDNSService)_allocService(p_pcName, p_pcService, p_pcProtocol, p_u16Port))) { - - // Start probing - ((stcMDNSService*)hResult)->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; - } - } - } // else: bad arguments - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addService: %s to add '%s.%s.%s'!\n"), (hResult ? "Succeeded" : "FAILED"), (p_pcName ?: "-"), p_pcService, p_pcProtocol); ); - DEBUG_EX_ERR(if (!hResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addService: FAILED to add '%s.%s.%s'!\n"), (p_pcName ?: "-"), p_pcService, p_pcProtocol); } ); - return hResult; -} - -/* - * MDNSResponder::removeService - * - * Unanounce a service (by sending a goodbye message) and remove it - * from the MDNS responder - * - */ -bool MDNSResponder::removeService(const MDNSResponder::hMDNSService p_hService) { - - stcMDNSService* pService = 0; - bool bResult = (((pService = _findService(p_hService))) && - (_announceService(*pService, false)) && - (_releaseService(pService))); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeService: FAILED!\n")); } ); - return bResult; -} - -/* - * MDNSResponder::removeService - */ -bool MDNSResponder::removeService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol) { - - return removeService((hMDNSService)_findService((p_pcName ?: m_pcHostname), p_pcService, p_pcProtocol)); -} - -/* - * MDNSResponder::addService (LEGACY) - */ -bool MDNSResponder::addService(String p_strService, - String p_strProtocol, - uint16_t p_u16Port) { - - return (0 != addService(m_pcHostname, p_strService.c_str(), p_strProtocol.c_str(), p_u16Port)); -} - -/* - * MDNSResponder::setServiceName - */ -bool MDNSResponder::setServiceName(const MDNSResponder::hMDNSService p_hService, - const char* p_pcInstanceName) { - - stcMDNSService* pService = 0; - bool bResult = (((!p_pcInstanceName) || - (MDNS_DOMAIN_LABEL_MAXLENGTH >= os_strlen(p_pcInstanceName))) && - ((pService = _findService(p_hService))) && - (pService->setName(p_pcInstanceName)) && - ((pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart))); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setServiceName: FAILED for '%s'!\n"), (p_pcInstanceName ?: "-")); } ); - return bResult; -} - -/* - * SERVICE TXT - */ - -/* - * MDNSResponder::addServiceTxt - * - * Add a static service TXT item ('Key'='Value') to a service. - * - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - const char* p_pcValue) { - - hMDNSTxt hTxt = 0; - stcMDNSService* pService = _findService(p_hService); - if (pService) { - hTxt = (hMDNSTxt)_addServiceTxt(pService, p_pcKey, p_pcValue, false); - } - DEBUG_EX_ERR(if (!hTxt) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addServiceTxt: FAILED for '%s=%s'!\n"), (p_pcKey ?: "-"), (p_pcValue ?: "-")); } ); - return hTxt; -} - -/* - * MDNSResponder::addServiceTxt (uint32_t) - * - * Formats: http://www.cplusplus.com/reference/cstdio/printf/ - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint32_t p_u32Value) { - char acBuffer[32]; *acBuffer = 0; - sprintf(acBuffer, "%u", p_u32Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addServiceTxt (uint16_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint16_t p_u16Value) { - char acBuffer[16]; *acBuffer = 0; - sprintf(acBuffer, "%hu", p_u16Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addServiceTxt (uint8_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint8_t p_u8Value) { - char acBuffer[8]; *acBuffer = 0; - sprintf(acBuffer, "%hhu", p_u8Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addServiceTxt (int32_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int32_t p_i32Value) { - char acBuffer[32]; *acBuffer = 0; - sprintf(acBuffer, "%i", p_i32Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addServiceTxt (int16_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int16_t p_i16Value) { - char acBuffer[16]; *acBuffer = 0; - sprintf(acBuffer, "%hi", p_i16Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addServiceTxt (int8_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int8_t p_i8Value) { - char acBuffer[8]; *acBuffer = 0; - sprintf(acBuffer, "%hhi", p_i8Value); - - return addServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::removeServiceTxt - * - * Remove a static service TXT item from a service. - */ -bool MDNSResponder::removeServiceTxt(const MDNSResponder::hMDNSService p_hService, - const MDNSResponder::hMDNSTxt p_hTxt) { - - bool bResult = false; - - stcMDNSService* pService = _findService(p_hService); - if (pService) { - stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_hTxt); - if (pTxt) { - bResult = _releaseServiceTxt(pService, pTxt); - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceTxt: FAILED!\n")); } ); - return bResult; -} - -/* - * MDNSResponder::removeServiceTxt - */ -bool MDNSResponder::removeServiceTxt(const MDNSResponder::hMDNSService p_hService, - const char* p_pcKey) { - - bool bResult = false; - - stcMDNSService* pService = _findService(p_hService); - if (pService) { - stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_pcKey); - if (pTxt) { - bResult = _releaseServiceTxt(pService, pTxt); - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceTxt: FAILED for '%s'!\n"), (p_pcKey ?: "-")); } ); - return bResult; -} - -/* - * MDNSResponder::removeServiceTxt - */ -bool MDNSResponder::removeServiceTxt(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol, - const char* p_pcKey) { - - bool bResult = false; - - stcMDNSService* pService = _findService((p_pcName ?: m_pcHostname), p_pcService, p_pcProtocol); - if (pService) { - stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_pcKey); - if (pTxt) { - bResult = _releaseServiceTxt(pService, pTxt); - } - } - return bResult; -} - -/* - * MDNSResponder::addServiceTxt (LEGACY) - */ -bool MDNSResponder::addServiceTxt(const char* p_pcService, - const char* p_pcProtocol, - const char* p_pcKey, - const char* p_pcValue) { - - return (0 != _addServiceTxt(_findService(m_pcHostname, p_pcService, p_pcProtocol), p_pcKey, p_pcValue, false)); -} - -/* - * MDNSResponder::addServiceTxt (LEGACY) - */ -bool MDNSResponder::addServiceTxt(String p_strService, - String p_strProtocol, - String p_strKey, - String p_strValue) { - - return (0 != _addServiceTxt(_findService(m_pcHostname, p_strService.c_str(), p_strProtocol.c_str()), p_strKey.c_str(), p_strValue.c_str(), false)); -} - -/* - * MDNSResponder::setDynamicServiceTxtCallback (global) - * - * Set a global callback for dynamic service TXT items. The callback is called, whenever - * service TXT items are needed. - * - */ -bool MDNSResponder::setDynamicServiceTxtCallback(MDNSResponder::MDNSDynamicServiceTxtCallbackFunc p_fnCallback) { - - m_fnServiceTxtCallback = p_fnCallback; - - return true; -} - -/* - * MDNSResponder::setDynamicServiceTxtCallback (service specific) - * - * Set a service specific callback for dynamic service TXT items. The callback is called, whenever - * service TXT items are needed for the given service. - * - */ -bool MDNSResponder::setDynamicServiceTxtCallback(MDNSResponder::hMDNSService p_hService, - MDNSResponder::MDNSDynamicServiceTxtCallbackFunc p_fnCallback) { - - bool bResult = false; - - stcMDNSService* pService = _findService(p_hService); - if (pService) { - pService->m_fnTxtCallback = p_fnCallback; - - bResult = true; - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setDynamicServiceTxtCallback: FAILED!\n")); } ); - return bResult; -} - -/* - * MDNSResponder::addDynamicServiceTxt - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - const char* p_pcValue) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addDynamicServiceTxt (%s=%s)\n"), p_pcKey, p_pcValue);); - - hMDNSTxt hTxt = 0; - - stcMDNSService* pService = _findService(p_hService); - if (pService) { - hTxt = _addServiceTxt(pService, p_pcKey, p_pcValue, true); - } - DEBUG_EX_ERR(if (!hTxt) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addDynamicServiceTxt: FAILED for '%s=%s'!\n"), (p_pcKey ?: "-"), (p_pcValue ?: "-")); } ); - return hTxt; -} - -/* - * MDNSResponder::addDynamicServiceTxt (uint32_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint32_t p_u32Value) { - - char acBuffer[32]; *acBuffer = 0; - sprintf(acBuffer, "%u", p_u32Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addDynamicServiceTxt (uint16_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint16_t p_u16Value) { - - char acBuffer[16]; *acBuffer = 0; - sprintf(acBuffer, "%hu", p_u16Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addDynamicServiceTxt (uint8_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - uint8_t p_u8Value) { - - char acBuffer[8]; *acBuffer = 0; - sprintf(acBuffer, "%hhu", p_u8Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addDynamicServiceTxt (int32_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int32_t p_i32Value) { - - char acBuffer[32]; *acBuffer = 0; - sprintf(acBuffer, "%i", p_i32Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addDynamicServiceTxt (int16_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int16_t p_i16Value) { - - char acBuffer[16]; *acBuffer = 0; - sprintf(acBuffer, "%hi", p_i16Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - -/* - * MDNSResponder::addDynamicServiceTxt (int8_t) - */ -MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, - const char* p_pcKey, - int8_t p_i8Value) { - - char acBuffer[8]; *acBuffer = 0; - sprintf(acBuffer, "%hhi", p_i8Value); - - return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); -} - - -/** - * STATIC SERVICE QUERY (LEGACY) - */ - -/* - * MDNSResponder::queryService - * - * Perform a (blocking) static service query. - * The arrived answers can be queried by calling: - * - answerHostname (or 'hostname') - * - answerIP (or 'IP') - * - answerPort (or 'port') - * - */ -uint32_t MDNSResponder::queryService(const char* p_pcService, - const char* p_pcProtocol, - const uint16_t p_u16Timeout /*= MDNS_QUERYSERVICES_WAIT_TIME*/) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService '%s.%s'\n"), p_pcService, p_pcProtocol);); - - uint32_t u32Result = 0; - - stcMDNSServiceQuery* pServiceQuery = 0; - if ((p_pcService) && - (os_strlen(p_pcService)) && - (p_pcProtocol) && - (os_strlen(p_pcProtocol)) && - (p_u16Timeout) && - (_removeLegacyServiceQuery()) && - ((pServiceQuery = _allocServiceQuery())) && - (_buildDomainForService(p_pcService, p_pcProtocol, pServiceQuery->m_ServiceTypeDomain))) { - - pServiceQuery->m_bLegacyQuery = true; - - if (_sendMDNSServiceQuery(*pServiceQuery)) { - // Wait for answers to arrive - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: Waiting %u ms for answers...\n"), p_u16Timeout);); - delay(p_u16Timeout); - - // All answers should have arrived by now -> stop adding new answers - pServiceQuery->m_bAwaitingAnswers = false; - u32Result = pServiceQuery->answerCount(); - } - else { // FAILED to send query - _removeServiceQuery(pServiceQuery); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: INVALID input data!\n"));); - } - return u32Result; -} - -/* - * MDNSResponder::removeQuery - * - * Remove the last static service query (and all answers). - * - */ -bool MDNSResponder::removeQuery(void) { - - return _removeLegacyServiceQuery(); -} - -/* - * MDNSResponder::queryService (LEGACY) - */ -uint32_t MDNSResponder::queryService(String p_strService, - String p_strProtocol) { - - return queryService(p_strService.c_str(), p_strProtocol.c_str()); -} - -/* - * MDNSResponder::answerHostname - */ -const char* MDNSResponder::answerHostname(const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - - if ((pSQAnswer) && - (pSQAnswer->m_HostDomain.m_u16NameLength) && - (!pSQAnswer->m_pcHostDomain)) { - - char* pcHostDomain = pSQAnswer->allocHostDomain(pSQAnswer->m_HostDomain.c_strLength()); - if (pcHostDomain) { - pSQAnswer->m_HostDomain.c_str(pcHostDomain); - } - } - return (pSQAnswer ? pSQAnswer->m_pcHostDomain : 0); -} - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::answerIP - */ - IPAddress MDNSResponder::answerIP(const uint32_t p_u32AnswerIndex) { - - const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); - const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - const stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = (((pSQAnswer) && (pSQAnswer->m_pIP4Addresses)) ? pSQAnswer->IP4AddressAtIndex(0) : 0); - return (pIP4Address ? pIP4Address->m_IPAddress : IPAddress()); - } -#endif - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::answerIP6 - */ - IPAddress MDNSResponder::answerIP6(const uint32_t p_u32AnswerIndex) { - - const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); - const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - const stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = (((pSQAnswer) && (pSQAnswer->m_pIP6Addresses)) ? pSQAnswer->IP6AddressAtIndex(0) : 0); - return (pIP6Address ? pIP6Address->m_IPAddress : IP6Address()); - } -#endif - -/* - * MDNSResponder::answerPort - */ -uint16_t MDNSResponder::answerPort(const uint32_t p_u32AnswerIndex) { - - const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); - const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return (pSQAnswer ? pSQAnswer->m_u16Port : 0); -} - -/* - * MDNSResponder::hostname (LEGACY) - */ -String MDNSResponder::hostname(const uint32_t p_u32AnswerIndex) { - - return String(answerHostname(p_u32AnswerIndex)); -} - -/* - * MDNSResponder::IP (LEGACY) - */ -IPAddress MDNSResponder::IP(const uint32_t p_u32AnswerIndex) { - - return answerIP(p_u32AnswerIndex); -} - -/* - * MDNSResponder::port (LEGACY) - */ -uint16_t MDNSResponder::port(const uint32_t p_u32AnswerIndex) { - - return answerPort(p_u32AnswerIndex); -} - - -/** - * DYNAMIC SERVICE QUERY - */ - -/* - * MDNSResponder::installServiceQuery - * - * Add a dynamic service query and a corresponding callback to the MDNS responder. - * The callback will be called for every answer update. - * The answers can also be queried by calling: - * - answerServiceDomain - * - answerHostDomain - * - answerIP4Address/answerIP6Address - * - answerPort - * - answerTxts - * - */ -MDNSResponder::hMDNSServiceQuery MDNSResponder::installServiceQuery(const char* p_pcService, - const char* p_pcProtocol, - MDNSResponder::MDNSServiceQueryCallbackFunc p_fnCallback) { - hMDNSServiceQuery hResult = 0; - - stcMDNSServiceQuery* pServiceQuery = 0; - if ((p_pcService) && - (os_strlen(p_pcService)) && - (p_pcProtocol) && - (os_strlen(p_pcProtocol)) && - (p_fnCallback) && - ((pServiceQuery = _allocServiceQuery())) && - (_buildDomainForService(p_pcService, p_pcProtocol, pServiceQuery->m_ServiceTypeDomain))) { - - pServiceQuery->m_fnCallback = p_fnCallback; - pServiceQuery->m_bLegacyQuery = false; - - if (_sendMDNSServiceQuery(*pServiceQuery)) { - pServiceQuery->m_u8SentCount = 1; - pServiceQuery->m_ResendTimeout.reset(MDNS_DYNAMIC_QUERY_RESEND_DELAY); - - hResult = (hMDNSServiceQuery)pServiceQuery; - } - else { - _removeServiceQuery(pServiceQuery); - } - } - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] installServiceQuery: %s for '%s.%s'!\n\n"), (hResult ? "Succeeded" : "FAILED"), (p_pcService ?: "-"), (p_pcProtocol ?: "-"));); - DEBUG_EX_ERR(if (!hResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] installServiceQuery: FAILED for '%s.%s'!\n\n"), (p_pcService ?: "-"), (p_pcProtocol ?: "-")); } ); - return hResult; -} - -/* - * MDNSResponder::removeServiceQuery - * - * Remove a dynamic service query (and all collected answers) from the MDNS responder - * - */ -bool MDNSResponder::removeServiceQuery(MDNSResponder::hMDNSServiceQuery p_hServiceQuery) { - - stcMDNSServiceQuery* pServiceQuery = 0; - bool bResult = (((pServiceQuery = _findServiceQuery(p_hServiceQuery))) && - (_removeServiceQuery(pServiceQuery))); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceQuery: FAILED!\n")); } ); - return bResult; -} - -/* - * MDNSResponder::answerCount - */ -uint32_t MDNSResponder::answerCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - return (pServiceQuery ? pServiceQuery->answerCount() : 0); -} - -std::vector MDNSResponder::answerInfo (const MDNSResponder::hMDNSServiceQuery p_hServiceQuery) { - std::vector tempVector; - for (uint32_t i=0;ianswerAtIndex(p_u32AnswerIndex) : 0); - // Fill m_pcServiceDomain (if not already done) - if ((pSQAnswer) && - (pSQAnswer->m_ServiceDomain.m_u16NameLength) && - (!pSQAnswer->m_pcServiceDomain)) { - - pSQAnswer->m_pcServiceDomain = pSQAnswer->allocServiceDomain(pSQAnswer->m_ServiceDomain.c_strLength()); - if (pSQAnswer->m_pcServiceDomain) { - pSQAnswer->m_ServiceDomain.c_str(pSQAnswer->m_pcServiceDomain); - } - } - return (pSQAnswer ? pSQAnswer->m_pcServiceDomain : 0); -} - -/* - * MDNSResponder::hasAnswerHostDomain - */ -bool MDNSResponder::hasAnswerHostDomain(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return ((pSQAnswer) && - (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostDomainAndPort)); -} - -/* - * MDNSResponder::answerHostDomain - * - * Returns the host domain for the given service. - * If not already existing, the string is allocated, filled and attached to the answer. - * - */ -const char* MDNSResponder::answerHostDomain(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - // Fill m_pcHostDomain (if not already done) - if ((pSQAnswer) && - (pSQAnswer->m_HostDomain.m_u16NameLength) && - (!pSQAnswer->m_pcHostDomain)) { - - pSQAnswer->m_pcHostDomain = pSQAnswer->allocHostDomain(pSQAnswer->m_HostDomain.c_strLength()); - if (pSQAnswer->m_pcHostDomain) { - pSQAnswer->m_HostDomain.c_str(pSQAnswer->m_pcHostDomain); - } - } - return (pSQAnswer ? pSQAnswer->m_pcHostDomain : 0); -} - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::hasAnswerIP4Address - */ - bool MDNSResponder::hasAnswerIP4Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return ((pSQAnswer) && - (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_IP4Address)); - } - - /* - * MDNSResponder::answerIP4AddressCount - */ - uint32_t MDNSResponder::answerIP4AddressCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return (pSQAnswer ? pSQAnswer->IP4AddressCount() : 0); - } - - /* - * MDNSResponder::answerIP4Address - */ - IPAddress MDNSResponder::answerIP4Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex, - const uint32_t p_u32AddressIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = (pSQAnswer ? pSQAnswer->IP4AddressAtIndex(p_u32AddressIndex) : 0); - return (pIP4Address ? pIP4Address->m_IPAddress : IPAddress()); - } -#endif - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::hasAnswerIP6Address - */ - bool MDNSResponder::hasAnswerIP6Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return ((pSQAnswer) && - (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostIP6Address)); - } - - /* - * MDNSResponder::answerIP6AddressCount - */ - uint32_t MDNSResponder::answerIP6AddressCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return (pSQAnswer ? pSQAnswer->IP6AddressCount() : 0); - } - - /* - * MDNSResponder::answerIP6Address - */ - IPAddress MDNSResponder::answerIP6Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex, - const uint32_t p_u32AddressIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = (pSQAnswer ? pSQAnswer->IP6AddressAtIndex(p_u32AddressIndex) : 0); - return (pIP6Address ? pIP6Address->m_IPAddress : IPAddress()); - } -#endif - -/* - * MDNSResponder::hasAnswerPort - */ -bool MDNSResponder::hasAnswerPort(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return ((pSQAnswer) && - (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostDomainAndPort)); -} - -/* - * MDNSResponder::answerPort - */ -uint16_t MDNSResponder::answerPort(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return (pSQAnswer ? pSQAnswer->m_u16Port : 0); -} - -/* - * MDNSResponder::hasAnswerTxts - */ -bool MDNSResponder::hasAnswerTxts(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - return ((pSQAnswer) && - (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_Txts)); -} - -/* - * MDNSResponder::answerTxts - * - * Returns all TXT items for the given service as a ';'-separated string. - * If not already existing; the string is alloced, filled and attached to the answer. - * - */ -const char* MDNSResponder::answerTxts(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - // Fill m_pcTxts (if not already done) - if ((pSQAnswer) && - (pSQAnswer->m_Txts.m_pTxts) && - (!pSQAnswer->m_pcTxts)) { - - pSQAnswer->m_pcTxts = pSQAnswer->allocTxts(pSQAnswer->m_Txts.c_strLength()); - if (pSQAnswer->m_pcTxts) { - pSQAnswer->m_Txts.c_str(pSQAnswer->m_pcTxts); - } - } - return (pSQAnswer ? pSQAnswer->m_pcTxts : 0); -} - -/* - * PROBING - */ - -/* - * MDNSResponder::setProbeResultCallback - * - * Set a global callback for probe results. The callback is called, when probing - * for the host domain (or a service domain, without specific probe result callback) - * failes or succeedes. - * In the case of failure, the domain name should be changed via 'setHostname' or 'setServiceName'. - * When succeeded, the host or service domain will be announced by the MDNS responder. - * - */ -bool MDNSResponder::setHostProbeResultCallback(MDNSResponder::MDNSHostProbeFn p_fnCallback) { - - m_HostProbeInformation.m_fnHostProbeResultCallback = p_fnCallback; - - return true; -} - -bool MDNSResponder::setHostProbeResultCallback(MDNSHostProbeFn1 pfn) { - using namespace std::placeholders; - return setHostProbeResultCallback([this, pfn](const char* p_pcDomainName, bool p_bProbeResult) { pfn(*this, p_pcDomainName, p_bProbeResult); }); -} - -/* - * MDNSResponder::setServiceProbeResultCallback - * - * Set a service specific callback for probe results. The callback is called, when probing - * for the service domain failes or succeedes. - * In the case of failure, the service name should be changed via 'setServiceName'. - * When succeeded, the service domain will be announced by the MDNS responder. - * - */ -bool MDNSResponder::setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, - MDNSResponder::MDNSServiceProbeFn p_fnCallback) { - - bool bResult = false; - - stcMDNSService* pService = _findService(p_hService); - if (pService) { - pService->m_ProbeInformation.m_fnServiceProbeResultCallback = p_fnCallback; - - bResult = true; - } - return bResult; -} - -bool MDNSResponder::setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, - MDNSResponder::MDNSServiceProbeFn1 p_fnCallback) { - using namespace std::placeholders; - return setServiceProbeResultCallback(p_hService, [this, p_fnCallback](const char* p_pcServiceName, const hMDNSService p_hMDNSService, bool p_bProbeResult) { - p_fnCallback(*this, p_pcServiceName, p_hMDNSService, p_bProbeResult); - }); -} - - -/* - * MISC - */ - -/* - * MDNSResponder::notifyAPChange - * - * Should be called, whenever the AP for the MDNS responder changes. - * A bit of this is caught by the event callbacks installed in the constructor. - * - */ -bool MDNSResponder::notifyAPChange(void) { - - return _restart(); -} - -/* - * MDNSResponder::update - * - * Should be called in every 'loop'. - * - */ -bool MDNSResponder::update(void) { - - if (m_bPassivModeEnabled) { - m_bPassivModeEnabled = false; - } - return _process(true); -} - -/* - * MDNSResponder::announce - * - * Should be called, if the 'configuration' changes. Mainly this will be changes in the TXT items... - */ -bool MDNSResponder::announce(void) { - - return (_announce(true, true)); -} - -/* - * MDNSResponder::enableArduino - * - * Enable the OTA update service. - * - */ -MDNSResponder::hMDNSService MDNSResponder::enableArduino(uint16_t p_u16Port, - bool p_bAuthUpload /*= false*/) { - - hMDNSService hService = addService(0, "arduino", "tcp", p_u16Port); - if (hService) { - if ((!addServiceTxt(hService, "tcp_check", "no")) || - (!addServiceTxt(hService, "ssh_upload", "no")) || - (!addServiceTxt(hService, "board", STRINGIZE_VALUE_OF(ARDUINO_BOARD))) || - (!addServiceTxt(hService, "auth_upload", (p_bAuthUpload) ? "yes" : "no"))) { - - removeService(hService); - hService = 0; - } - } - return hService; -} - - -} //namespace MDNSImplementation - -} //namespace esp8266 - - +/* + LEAmDNS.cpp + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include +#include + +#include "LEAmDNS_Priv.h" + + +namespace esp8266 +{ + +/* + LEAmDNS +*/ +namespace MDNSImplementation +{ + +/** + STRINGIZE +*/ +#ifndef STRINGIZE +#define STRINGIZE(x) #x +#endif +#ifndef STRINGIZE_VALUE_OF +#define STRINGIZE_VALUE_OF(x) STRINGIZE(x) +#endif + + +/** + INTERFACE +*/ + +/** + MDNSResponder::MDNSResponder +*/ +MDNSResponder::MDNSResponder(void) + : m_pServices(0), + m_pUDPContext(0), + m_pcHostname(0), + m_pServiceQueries(0), + m_fnServiceTxtCallback(0), +#ifdef ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE + m_bPassivModeEnabled(true), +#else + m_bPassivModeEnabled(false), +#endif + m_netif(nullptr) +{ +} + +/* + MDNSResponder::~MDNSResponder +*/ +MDNSResponder::~MDNSResponder(void) +{ + + _resetProbeStatus(false); + _releaseServiceQueries(); + _releaseHostname(); + _releaseUDPContext(); + _releaseServices(); +} + +/* + MDNSResponder::begin + + Set the host domain (for probing) and install WiFi event handlers for + IP assignment and disconnection management. In both cases, the MDNS responder + is restarted (reset and restart probe status) + Finally the responder is (re)started + +*/ +bool MDNSResponder::begin(const char* p_pcHostname, const IPAddress& p_IPAddress, uint32_t p_u32TTL) +{ + + (void)p_u32TTL; // ignored + bool bResult = false; + + if (0 == m_pUDPContext) + { + if (_setHostname(p_pcHostname)) + { + + //// select interface + + m_netif = nullptr; + IPAddress ipAddress = p_IPAddress; + + if (!ipAddress.isSet()) + { + + IPAddress sta = WiFi.localIP(); + IPAddress ap = WiFi.softAPIP(); + + if (!sta.isSet() && !ap.isSet()) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] internal interfaces (STA, AP) are not set (none was specified)\n"))); + return false; + } + + if (ap.isSet()) + { + + if (sta.isSet()) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface AP selected over STA (none was specified)\n"))); + } + else + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface AP selected\n"))); + } + ipAddress = ap; + + } + else + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] default interface STA selected (none was specified)\n"))); + ipAddress = sta; + + } + + // continue to ensure interface is UP + } + + // check existence of this IP address in the interface list + bool found = false; + m_netif = nullptr; + for (auto a : addrList) + if (ipAddress == a.addr()) + { + if (a.ifUp()) + { + found = true; + m_netif = a.interface(); + break; + } + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] found interface for IP '%s' but it is not UP\n"), ipAddress.toString().c_str());); + } + if (!found) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] interface defined by IP '%s' not found\n"), ipAddress.toString().c_str());); + return false; + } + + //// done selecting the interface + + if (m_netif->num == STATION_IF) + { + + m_GotIPHandler = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP & pEvent) + { + (void) pEvent; + // Ensure that _restart() runs in USER context + schedule_function([this]() + { + MDNSResponder::_restart(); + }); + }); + + m_DisconnectedHandler = WiFi.onStationModeDisconnected([this](const WiFiEventStationModeDisconnected & pEvent) + { + (void) pEvent; + // Ensure that _restart() runs in USER context + schedule_function([this]() + { + MDNSResponder::_restart(); + }); + }); + } + + bResult = _restart(); + } + DEBUG_EX_ERR(if (!bResult) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: FAILED for '%s'!\n"), (p_pcHostname ? : "-")); + }); + } + else + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] begin: Ignoring multiple calls to begin (Ignored host domain: '%s')!\n"), (p_pcHostname ? : "-"));); + } + return bResult; +} + +/* + MDNSResponder::close + + Ends the MDNS responder. + Announced services are unannounced (by multicasting a goodbye message) + +*/ +bool MDNSResponder::close(void) +{ + + m_GotIPHandler.reset(); // reset WiFi event callbacks. + m_DisconnectedHandler.reset(); + + _announce(false, true); + _resetProbeStatus(false); // Stop probing + + _releaseServiceQueries(); + _releaseUDPContext(); + _releaseHostname(); + + return true; +} + +/* + MDNSResponder::end + + Ends the MDNS responder. + for compatibility with esp32 + +*/ + +bool MDNSResponder::end(void) +{ + return close(); +} + +/* + MDNSResponder::setHostname + + Replaces the current hostname and restarts probing. + For services without own instance name (when the host name was used a instance + name), the instance names are replaced also (and the probing is restarted). + +*/ +bool MDNSResponder::setHostname(const char* p_pcHostname) +{ + + bool bResult = false; + + if (_setHostname(p_pcHostname)) + { + m_HostProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; + + // Replace 'auto-set' service names + bResult = true; + for (stcMDNSService* pService = m_pServices; ((bResult) && (pService)); pService = pService->m_pNext) + { + if (pService->m_bAutoName) + { + bResult = pService->setName(p_pcHostname); + pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; + } + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setHostname: FAILED for '%s'!\n"), (p_pcHostname ? : "-")); + }); + return bResult; +} + +/* + MDNSResponder::setHostname (LEGACY) +*/ +bool MDNSResponder::setHostname(String p_strHostname) +{ + + return setHostname(p_strHostname.c_str()); +} + + +/* + SERVICES +*/ + +/* + MDNSResponder::addService + + Add service; using hostname if no name is explicitly provided for the service + The usual '_' underline, which is prepended to service and protocol, eg. _http, + may be given. If not, it is added automatically. + +*/ +MDNSResponder::hMDNSService MDNSResponder::addService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol, + uint16_t p_u16Port) +{ + + hMDNSService hResult = 0; + + if (((!p_pcName) || // NO name OR + (MDNS_DOMAIN_LABEL_MAXLENGTH >= os_strlen(p_pcName))) && // Fitting name + (p_pcService) && + (MDNS_SERVICE_NAME_LENGTH >= os_strlen(p_pcService)) && + (p_pcProtocol) && + ((MDNS_SERVICE_PROTOCOL_LENGTH - 1) != os_strlen(p_pcProtocol)) && + (p_u16Port)) + { + + if (!_findService((p_pcName ? : m_pcHostname), p_pcService, p_pcProtocol)) // Not already used + { + if (0 != (hResult = (hMDNSService)_allocService(p_pcName, p_pcService, p_pcProtocol, p_u16Port))) + { + + // Start probing + ((stcMDNSService*)hResult)->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart; + } + } + } // else: bad arguments + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addService: %s to add '%s.%s.%s'!\n"), (hResult ? "Succeeded" : "FAILED"), (p_pcName ? : "-"), p_pcService, p_pcProtocol);); + DEBUG_EX_ERR(if (!hResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addService: FAILED to add '%s.%s.%s'!\n"), (p_pcName ? : "-"), p_pcService, p_pcProtocol); + }); + return hResult; +} + +/* + MDNSResponder::removeService + + Unanounce a service (by sending a goodbye message) and remove it + from the MDNS responder + +*/ +bool MDNSResponder::removeService(const MDNSResponder::hMDNSService p_hService) +{ + + stcMDNSService* pService = 0; + bool bResult = (((pService = _findService(p_hService))) && + (_announceService(*pService, false)) && + (_releaseService(pService))); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeService: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::removeService +*/ +bool MDNSResponder::removeService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol) +{ + + return removeService((hMDNSService)_findService((p_pcName ? : m_pcHostname), p_pcService, p_pcProtocol)); +} + +/* + MDNSResponder::addService (LEGACY) +*/ +bool MDNSResponder::addService(String p_strService, + String p_strProtocol, + uint16_t p_u16Port) +{ + + return (0 != addService(m_pcHostname, p_strService.c_str(), p_strProtocol.c_str(), p_u16Port)); +} + +/* + MDNSResponder::setServiceName +*/ +bool MDNSResponder::setServiceName(const MDNSResponder::hMDNSService p_hService, + const char* p_pcInstanceName) +{ + + stcMDNSService* pService = 0; + bool bResult = (((!p_pcInstanceName) || + (MDNS_DOMAIN_LABEL_MAXLENGTH >= os_strlen(p_pcInstanceName))) && + ((pService = _findService(p_hService))) && + (pService->setName(p_pcInstanceName)) && + ((pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_ReadyToStart))); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setServiceName: FAILED for '%s'!\n"), (p_pcInstanceName ? : "-")); + }); + return bResult; +} + +/* + SERVICE TXT +*/ + +/* + MDNSResponder::addServiceTxt + + Add a static service TXT item ('Key'='Value') to a service. + +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + const char* p_pcValue) +{ + + hMDNSTxt hTxt = 0; + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + hTxt = (hMDNSTxt)_addServiceTxt(pService, p_pcKey, p_pcValue, false); + } + DEBUG_EX_ERR(if (!hTxt) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addServiceTxt: FAILED for '%s=%s'!\n"), (p_pcKey ? : "-"), (p_pcValue ? : "-")); + }); + return hTxt; +} + +/* + MDNSResponder::addServiceTxt (uint32_t) + + Formats: http://www.cplusplus.com/reference/cstdio/printf/ +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint32_t p_u32Value) +{ + char acBuffer[32]; *acBuffer = 0; + sprintf(acBuffer, "%u", p_u32Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addServiceTxt (uint16_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint16_t p_u16Value) +{ + char acBuffer[16]; *acBuffer = 0; + sprintf(acBuffer, "%hu", p_u16Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addServiceTxt (uint8_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint8_t p_u8Value) +{ + char acBuffer[8]; *acBuffer = 0; + sprintf(acBuffer, "%hhu", p_u8Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addServiceTxt (int32_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int32_t p_i32Value) +{ + char acBuffer[32]; *acBuffer = 0; + sprintf(acBuffer, "%i", p_i32Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addServiceTxt (int16_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int16_t p_i16Value) +{ + char acBuffer[16]; *acBuffer = 0; + sprintf(acBuffer, "%hi", p_i16Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addServiceTxt (int8_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int8_t p_i8Value) +{ + char acBuffer[8]; *acBuffer = 0; + sprintf(acBuffer, "%hhi", p_i8Value); + + return addServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::removeServiceTxt + + Remove a static service TXT item from a service. +*/ +bool MDNSResponder::removeServiceTxt(const MDNSResponder::hMDNSService p_hService, + const MDNSResponder::hMDNSTxt p_hTxt) +{ + + bool bResult = false; + + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_hTxt); + if (pTxt) + { + bResult = _releaseServiceTxt(pService, pTxt); + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceTxt: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::removeServiceTxt +*/ +bool MDNSResponder::removeServiceTxt(const MDNSResponder::hMDNSService p_hService, + const char* p_pcKey) +{ + + bool bResult = false; + + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_pcKey); + if (pTxt) + { + bResult = _releaseServiceTxt(pService, pTxt); + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceTxt: FAILED for '%s'!\n"), (p_pcKey ? : "-")); + }); + return bResult; +} + +/* + MDNSResponder::removeServiceTxt +*/ +bool MDNSResponder::removeServiceTxt(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol, + const char* p_pcKey) +{ + + bool bResult = false; + + stcMDNSService* pService = _findService((p_pcName ? : m_pcHostname), p_pcService, p_pcProtocol); + if (pService) + { + stcMDNSServiceTxt* pTxt = _findServiceTxt(pService, p_pcKey); + if (pTxt) + { + bResult = _releaseServiceTxt(pService, pTxt); + } + } + return bResult; +} + +/* + MDNSResponder::addServiceTxt (LEGACY) +*/ +bool MDNSResponder::addServiceTxt(const char* p_pcService, + const char* p_pcProtocol, + const char* p_pcKey, + const char* p_pcValue) +{ + + return (0 != _addServiceTxt(_findService(m_pcHostname, p_pcService, p_pcProtocol), p_pcKey, p_pcValue, false)); +} + +/* + MDNSResponder::addServiceTxt (LEGACY) +*/ +bool MDNSResponder::addServiceTxt(String p_strService, + String p_strProtocol, + String p_strKey, + String p_strValue) +{ + + return (0 != _addServiceTxt(_findService(m_pcHostname, p_strService.c_str(), p_strProtocol.c_str()), p_strKey.c_str(), p_strValue.c_str(), false)); +} + +/* + MDNSResponder::setDynamicServiceTxtCallback (global) + + Set a global callback for dynamic service TXT items. The callback is called, whenever + service TXT items are needed. + +*/ +bool MDNSResponder::setDynamicServiceTxtCallback(MDNSResponder::MDNSDynamicServiceTxtCallbackFunc p_fnCallback) +{ + + m_fnServiceTxtCallback = p_fnCallback; + + return true; +} + +/* + MDNSResponder::setDynamicServiceTxtCallback (service specific) + + Set a service specific callback for dynamic service TXT items. The callback is called, whenever + service TXT items are needed for the given service. + +*/ +bool MDNSResponder::setDynamicServiceTxtCallback(MDNSResponder::hMDNSService p_hService, + MDNSResponder::MDNSDynamicServiceTxtCallbackFunc p_fnCallback) +{ + + bool bResult = false; + + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + pService->m_fnTxtCallback = p_fnCallback; + + bResult = true; + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] setDynamicServiceTxtCallback: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::addDynamicServiceTxt +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + const char* p_pcValue) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addDynamicServiceTxt (%s=%s)\n"), p_pcKey, p_pcValue);); + + hMDNSTxt hTxt = 0; + + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + hTxt = _addServiceTxt(pService, p_pcKey, p_pcValue, true); + } + DEBUG_EX_ERR(if (!hTxt) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] addDynamicServiceTxt: FAILED for '%s=%s'!\n"), (p_pcKey ? : "-"), (p_pcValue ? : "-")); + }); + return hTxt; +} + +/* + MDNSResponder::addDynamicServiceTxt (uint32_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint32_t p_u32Value) +{ + + char acBuffer[32]; *acBuffer = 0; + sprintf(acBuffer, "%u", p_u32Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addDynamicServiceTxt (uint16_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint16_t p_u16Value) +{ + + char acBuffer[16]; *acBuffer = 0; + sprintf(acBuffer, "%hu", p_u16Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addDynamicServiceTxt (uint8_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + uint8_t p_u8Value) +{ + + char acBuffer[8]; *acBuffer = 0; + sprintf(acBuffer, "%hhu", p_u8Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addDynamicServiceTxt (int32_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int32_t p_i32Value) +{ + + char acBuffer[32]; *acBuffer = 0; + sprintf(acBuffer, "%i", p_i32Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addDynamicServiceTxt (int16_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int16_t p_i16Value) +{ + + char acBuffer[16]; *acBuffer = 0; + sprintf(acBuffer, "%hi", p_i16Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + +/* + MDNSResponder::addDynamicServiceTxt (int8_t) +*/ +MDNSResponder::hMDNSTxt MDNSResponder::addDynamicServiceTxt(MDNSResponder::hMDNSService p_hService, + const char* p_pcKey, + int8_t p_i8Value) +{ + + char acBuffer[8]; *acBuffer = 0; + sprintf(acBuffer, "%hhi", p_i8Value); + + return addDynamicServiceTxt(p_hService, p_pcKey, acBuffer); +} + + +/** + STATIC SERVICE QUERY (LEGACY) +*/ + +/* + MDNSResponder::queryService + + Perform a (blocking) static service query. + The arrived answers can be queried by calling: + - answerHostname (or 'hostname') + - answerIP (or 'IP') + - answerPort (or 'port') + +*/ +uint32_t MDNSResponder::queryService(const char* p_pcService, + const char* p_pcProtocol, + const uint16_t p_u16Timeout /*= MDNS_QUERYSERVICES_WAIT_TIME*/) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService '%s.%s'\n"), p_pcService, p_pcProtocol);); + + uint32_t u32Result = 0; + + stcMDNSServiceQuery* pServiceQuery = 0; + if ((p_pcService) && + (os_strlen(p_pcService)) && + (p_pcProtocol) && + (os_strlen(p_pcProtocol)) && + (p_u16Timeout) && + (_removeLegacyServiceQuery()) && + ((pServiceQuery = _allocServiceQuery())) && + (_buildDomainForService(p_pcService, p_pcProtocol, pServiceQuery->m_ServiceTypeDomain))) + { + + pServiceQuery->m_bLegacyQuery = true; + + if (_sendMDNSServiceQuery(*pServiceQuery)) + { + // Wait for answers to arrive + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: Waiting %u ms for answers...\n"), p_u16Timeout);); + delay(p_u16Timeout); + + // All answers should have arrived by now -> stop adding new answers + pServiceQuery->m_bAwaitingAnswers = false; + u32Result = pServiceQuery->answerCount(); + } + else // FAILED to send query + { + _removeServiceQuery(pServiceQuery); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] queryService: INVALID input data!\n"));); + } + return u32Result; +} + +/* + MDNSResponder::removeQuery + + Remove the last static service query (and all answers). + +*/ +bool MDNSResponder::removeQuery(void) +{ + + return _removeLegacyServiceQuery(); +} + +/* + MDNSResponder::queryService (LEGACY) +*/ +uint32_t MDNSResponder::queryService(String p_strService, + String p_strProtocol) +{ + + return queryService(p_strService.c_str(), p_strProtocol.c_str()); +} + +/* + MDNSResponder::answerHostname +*/ +const char* MDNSResponder::answerHostname(const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + + if ((pSQAnswer) && + (pSQAnswer->m_HostDomain.m_u16NameLength) && + (!pSQAnswer->m_pcHostDomain)) + { + + char* pcHostDomain = pSQAnswer->allocHostDomain(pSQAnswer->m_HostDomain.c_strLength()); + if (pcHostDomain) + { + pSQAnswer->m_HostDomain.c_str(pcHostDomain); + } + } + return (pSQAnswer ? pSQAnswer->m_pcHostDomain : 0); +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::answerIP +*/ +IPAddress MDNSResponder::answerIP(const uint32_t p_u32AnswerIndex) +{ + + const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); + const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + const stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = (((pSQAnswer) && (pSQAnswer->m_pIP4Addresses)) ? pSQAnswer->IP4AddressAtIndex(0) : 0); + return (pIP4Address ? pIP4Address->m_IPAddress : IPAddress()); +} +#endif + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::answerIP6 +*/ +IPAddress MDNSResponder::answerIP6(const uint32_t p_u32AnswerIndex) +{ + + const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); + const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + const stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = (((pSQAnswer) && (pSQAnswer->m_pIP6Addresses)) ? pSQAnswer->IP6AddressAtIndex(0) : 0); + return (pIP6Address ? pIP6Address->m_IPAddress : IP6Address()); +} +#endif + +/* + MDNSResponder::answerPort +*/ +uint16_t MDNSResponder::answerPort(const uint32_t p_u32AnswerIndex) +{ + + const stcMDNSServiceQuery* pServiceQuery = _findLegacyServiceQuery(); + const stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return (pSQAnswer ? pSQAnswer->m_u16Port : 0); +} + +/* + MDNSResponder::hostname (LEGACY) +*/ +String MDNSResponder::hostname(const uint32_t p_u32AnswerIndex) +{ + + return String(answerHostname(p_u32AnswerIndex)); +} + +/* + MDNSResponder::IP (LEGACY) +*/ +IPAddress MDNSResponder::IP(const uint32_t p_u32AnswerIndex) +{ + + return answerIP(p_u32AnswerIndex); +} + +/* + MDNSResponder::port (LEGACY) +*/ +uint16_t MDNSResponder::port(const uint32_t p_u32AnswerIndex) +{ + + return answerPort(p_u32AnswerIndex); +} + + +/** + DYNAMIC SERVICE QUERY +*/ + +/* + MDNSResponder::installServiceQuery + + Add a dynamic service query and a corresponding callback to the MDNS responder. + The callback will be called for every answer update. + The answers can also be queried by calling: + - answerServiceDomain + - answerHostDomain + - answerIP4Address/answerIP6Address + - answerPort + - answerTxts + +*/ +MDNSResponder::hMDNSServiceQuery MDNSResponder::installServiceQuery(const char* p_pcService, + const char* p_pcProtocol, + MDNSResponder::MDNSServiceQueryCallbackFunc p_fnCallback) +{ + hMDNSServiceQuery hResult = 0; + + stcMDNSServiceQuery* pServiceQuery = 0; + if ((p_pcService) && + (os_strlen(p_pcService)) && + (p_pcProtocol) && + (os_strlen(p_pcProtocol)) && + (p_fnCallback) && + ((pServiceQuery = _allocServiceQuery())) && + (_buildDomainForService(p_pcService, p_pcProtocol, pServiceQuery->m_ServiceTypeDomain))) + { + + pServiceQuery->m_fnCallback = p_fnCallback; + pServiceQuery->m_bLegacyQuery = false; + + if (_sendMDNSServiceQuery(*pServiceQuery)) + { + pServiceQuery->m_u8SentCount = 1; + pServiceQuery->m_ResendTimeout.reset(MDNS_DYNAMIC_QUERY_RESEND_DELAY); + + hResult = (hMDNSServiceQuery)pServiceQuery; + } + else + { + _removeServiceQuery(pServiceQuery); + } + } + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] installServiceQuery: %s for '%s.%s'!\n\n"), (hResult ? "Succeeded" : "FAILED"), (p_pcService ? : "-"), (p_pcProtocol ? : "-"));); + DEBUG_EX_ERR(if (!hResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] installServiceQuery: FAILED for '%s.%s'!\n\n"), (p_pcService ? : "-"), (p_pcProtocol ? : "-")); + }); + return hResult; +} + +/* + MDNSResponder::removeServiceQuery + + Remove a dynamic service query (and all collected answers) from the MDNS responder + +*/ +bool MDNSResponder::removeServiceQuery(MDNSResponder::hMDNSServiceQuery p_hServiceQuery) +{ + + stcMDNSServiceQuery* pServiceQuery = 0; + bool bResult = (((pServiceQuery = _findServiceQuery(p_hServiceQuery))) && + (_removeServiceQuery(pServiceQuery))); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] removeServiceQuery: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::answerCount +*/ +uint32_t MDNSResponder::answerCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + return (pServiceQuery ? pServiceQuery->answerCount() : 0); +} + +std::vector MDNSResponder::answerInfo(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery) +{ + std::vector tempVector; + for (uint32_t i = 0; i < answerCount(p_hServiceQuery); i++) + { + tempVector.emplace_back(*this, p_hServiceQuery, i); + } + return tempVector; +} + +/* + MDNSResponder::answerServiceDomain + + Returns the domain for the given service. + If not already existing, the string is allocated, filled and attached to the answer. + +*/ +const char* MDNSResponder::answerServiceDomain(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + // Fill m_pcServiceDomain (if not already done) + if ((pSQAnswer) && + (pSQAnswer->m_ServiceDomain.m_u16NameLength) && + (!pSQAnswer->m_pcServiceDomain)) + { + + pSQAnswer->m_pcServiceDomain = pSQAnswer->allocServiceDomain(pSQAnswer->m_ServiceDomain.c_strLength()); + if (pSQAnswer->m_pcServiceDomain) + { + pSQAnswer->m_ServiceDomain.c_str(pSQAnswer->m_pcServiceDomain); + } + } + return (pSQAnswer ? pSQAnswer->m_pcServiceDomain : 0); +} + +/* + MDNSResponder::hasAnswerHostDomain +*/ +bool MDNSResponder::hasAnswerHostDomain(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return ((pSQAnswer) && + (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostDomainAndPort)); +} + +/* + MDNSResponder::answerHostDomain + + Returns the host domain for the given service. + If not already existing, the string is allocated, filled and attached to the answer. + +*/ +const char* MDNSResponder::answerHostDomain(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + // Fill m_pcHostDomain (if not already done) + if ((pSQAnswer) && + (pSQAnswer->m_HostDomain.m_u16NameLength) && + (!pSQAnswer->m_pcHostDomain)) + { + + pSQAnswer->m_pcHostDomain = pSQAnswer->allocHostDomain(pSQAnswer->m_HostDomain.c_strLength()); + if (pSQAnswer->m_pcHostDomain) + { + pSQAnswer->m_HostDomain.c_str(pSQAnswer->m_pcHostDomain); + } + } + return (pSQAnswer ? pSQAnswer->m_pcHostDomain : 0); +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::hasAnswerIP4Address +*/ +bool MDNSResponder::hasAnswerIP4Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return ((pSQAnswer) && + (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_IP4Address)); +} + +/* + MDNSResponder::answerIP4AddressCount +*/ +uint32_t MDNSResponder::answerIP4AddressCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return (pSQAnswer ? pSQAnswer->IP4AddressCount() : 0); +} + +/* + MDNSResponder::answerIP4Address +*/ +IPAddress MDNSResponder::answerIP4Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex, + const uint32_t p_u32AddressIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = (pSQAnswer ? pSQAnswer->IP4AddressAtIndex(p_u32AddressIndex) : 0); + return (pIP4Address ? pIP4Address->m_IPAddress : IPAddress()); +} +#endif + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::hasAnswerIP6Address +*/ +bool MDNSResponder::hasAnswerIP6Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return ((pSQAnswer) && + (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostIP6Address)); +} + +/* + MDNSResponder::answerIP6AddressCount +*/ +uint32_t MDNSResponder::answerIP6AddressCount(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return (pSQAnswer ? pSQAnswer->IP6AddressCount() : 0); +} + +/* + MDNSResponder::answerIP6Address +*/ +IPAddress MDNSResponder::answerIP6Address(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex, + const uint32_t p_u32AddressIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = (pSQAnswer ? pSQAnswer->IP6AddressAtIndex(p_u32AddressIndex) : 0); + return (pIP6Address ? pIP6Address->m_IPAddress : IPAddress()); +} +#endif + +/* + MDNSResponder::hasAnswerPort +*/ +bool MDNSResponder::hasAnswerPort(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return ((pSQAnswer) && + (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_HostDomainAndPort)); +} + +/* + MDNSResponder::answerPort +*/ +uint16_t MDNSResponder::answerPort(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return (pSQAnswer ? pSQAnswer->m_u16Port : 0); +} + +/* + MDNSResponder::hasAnswerTxts +*/ +bool MDNSResponder::hasAnswerTxts(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + return ((pSQAnswer) && + (pSQAnswer->m_u32ContentFlags & ServiceQueryAnswerType_Txts)); +} + +/* + MDNSResponder::answerTxts + + Returns all TXT items for the given service as a ';'-separated string. + If not already existing; the string is alloced, filled and attached to the answer. + +*/ +const char* MDNSResponder::answerTxts(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + // Fill m_pcTxts (if not already done) + if ((pSQAnswer) && + (pSQAnswer->m_Txts.m_pTxts) && + (!pSQAnswer->m_pcTxts)) + { + + pSQAnswer->m_pcTxts = pSQAnswer->allocTxts(pSQAnswer->m_Txts.c_strLength()); + if (pSQAnswer->m_pcTxts) + { + pSQAnswer->m_Txts.c_str(pSQAnswer->m_pcTxts); + } + } + return (pSQAnswer ? pSQAnswer->m_pcTxts : 0); +} + +/* + PROBING +*/ + +/* + MDNSResponder::setProbeResultCallback + + Set a global callback for probe results. The callback is called, when probing + for the host domain (or a service domain, without specific probe result callback) + failes or succeedes. + In the case of failure, the domain name should be changed via 'setHostname' or 'setServiceName'. + When succeeded, the host or service domain will be announced by the MDNS responder. + +*/ +bool MDNSResponder::setHostProbeResultCallback(MDNSResponder::MDNSHostProbeFn p_fnCallback) +{ + + m_HostProbeInformation.m_fnHostProbeResultCallback = p_fnCallback; + + return true; +} + +bool MDNSResponder::setHostProbeResultCallback(MDNSHostProbeFn1 pfn) +{ + using namespace std::placeholders; + return setHostProbeResultCallback([this, pfn](const char* p_pcDomainName, bool p_bProbeResult) + { + pfn(*this, p_pcDomainName, p_bProbeResult); + }); +} + +/* + MDNSResponder::setServiceProbeResultCallback + + Set a service specific callback for probe results. The callback is called, when probing + for the service domain failes or succeedes. + In the case of failure, the service name should be changed via 'setServiceName'. + When succeeded, the service domain will be announced by the MDNS responder. + +*/ +bool MDNSResponder::setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, + MDNSResponder::MDNSServiceProbeFn p_fnCallback) +{ + + bool bResult = false; + + stcMDNSService* pService = _findService(p_hService); + if (pService) + { + pService->m_ProbeInformation.m_fnServiceProbeResultCallback = p_fnCallback; + + bResult = true; + } + return bResult; +} + +bool MDNSResponder::setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, + MDNSResponder::MDNSServiceProbeFn1 p_fnCallback) +{ + using namespace std::placeholders; + return setServiceProbeResultCallback(p_hService, [this, p_fnCallback](const char* p_pcServiceName, const hMDNSService p_hMDNSService, bool p_bProbeResult) + { + p_fnCallback(*this, p_pcServiceName, p_hMDNSService, p_bProbeResult); + }); +} + + +/* + MISC +*/ + +/* + MDNSResponder::notifyAPChange + + Should be called, whenever the AP for the MDNS responder changes. + A bit of this is caught by the event callbacks installed in the constructor. + +*/ +bool MDNSResponder::notifyAPChange(void) +{ + + return _restart(); +} + +/* + MDNSResponder::update + + Should be called in every 'loop'. + +*/ +bool MDNSResponder::update(void) +{ + + if (m_bPassivModeEnabled) + { + m_bPassivModeEnabled = false; + } + return _process(true); +} + +/* + MDNSResponder::announce + + Should be called, if the 'configuration' changes. Mainly this will be changes in the TXT items... +*/ +bool MDNSResponder::announce(void) +{ + + return (_announce(true, true)); +} + +/* + MDNSResponder::enableArduino + + Enable the OTA update service. + +*/ +MDNSResponder::hMDNSService MDNSResponder::enableArduino(uint16_t p_u16Port, + bool p_bAuthUpload /*= false*/) +{ + + hMDNSService hService = addService(0, "arduino", "tcp", p_u16Port); + if (hService) + { + if ((!addServiceTxt(hService, "tcp_check", "no")) || + (!addServiceTxt(hService, "ssh_upload", "no")) || + (!addServiceTxt(hService, "board", STRINGIZE_VALUE_OF(ARDUINO_BOARD))) || + (!addServiceTxt(hService, "auth_upload", (p_bAuthUpload) ? "yes" : "no"))) + { + + removeService(hService); + hService = 0; + } + } + return hService; +} + + +} //namespace MDNSImplementation + +} //namespace esp8266 + + diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.h b/libraries/ESP8266mDNS/src/LEAmDNS.h index ed05a66a2..da3aa01a1 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS.h @@ -1,1403 +1,1456 @@ -/* - * LEAmDNS.h - * (c) 2018, LaborEtArs - * - * Version 0.9 beta - * - * Some notes (from LaborEtArs, 2018): - * Essentially, this is an rewrite of the original EPS8266 Multicast DNS code (ESP8266mDNS). - * The target of this rewrite was to keep the existing interface as stable as possible while - * adding and extending the supported set of mDNS features. - * A lot of the additions were basicly taken from Erik Ekman's lwIP mdns app code. - * - * Supported mDNS features (in some cases somewhat limited): - * - Presenting a DNS-SD service to interested observers, eg. a http server by presenting _http._tcp service - * - Support for multi-level compressed names in input; in output only a very simple one-leven full-name compression is implemented - * - Probing host and service domains for uniqueness in the local network - * - Tiebreaking while probing is supportet in a very minimalistic way (the 'higher' IP address wins the tiebreak) - * - Announcing available services after successful probing - * - Using fixed service TXT items or - * - Using dynamic service TXT items for presented services (via callback) - * - Remove services (and un-announcing them to the observers by sending goodbye-messages) - * - Static queries for DNS-SD services (creating a fixed answer set after a certain timeout period) - * - Dynamic queries for DNS-SD services with cached and updated answers and user notifications - * - * - * Usage: - * In most cases, this implementation should work as a 'drop-in' replacement for the original - * ESP8266 Multicast DNS code. Adjustments to the existing code would only be needed, if some - * of the new features should be used. - * - * For presenting services: - * In 'setup()': - * Install a callback for the probing of host (and service) domains via 'MDNS.setProbeResultCallback(probeResultCallback, &userData);' - * Register DNS-SD services with 'MDNSResponder::hMDNSService hService = MDNS.addService("MyESP", "http", "tcp", 5000);' - * (Install additional callbacks for the probing of these service domains via 'MDNS.setServiceProbeResultCallback(hService, probeResultCallback, &userData);') - * Add service TXT items with 'MDNS.addServiceTxt(hService, "c#", "1");' or by installing a service TXT callback - * using 'MDNS.setDynamicServiceTxtCallback(dynamicServiceTxtCallback, &userData);' or service specific - * 'MDNS.setDynamicServiceTxtCallback(hService, dynamicServiceTxtCallback, &userData);' - * Call MDNS.begin("MyHostname"); - * - * In 'probeResultCallback(MDNSResponder* p_MDNSResponder, const char* p_pcDomain, MDNSResponder:hMDNSService p_hService, bool p_bProbeResult, void* p_pUserdata)': - * Check the probe result and update the host or service domain name if the probe failed - * - * In 'dynamicServiceTxtCallback(MDNSResponder* p_MDNSResponder, const hMDNSService p_hService, void* p_pUserdata)': - * Add dynamic TXT items by calling 'MDNS.addDynamicServiceTxt(p_hService, "c#", "1");' - * - * In loop(): - * Call 'MDNS.update();' - * - * - * For querying services: - * Static: - * Call 'uint32_t u32AnswerCount = MDNS.queryService("http", "tcp");' - * Iterate answers by: 'for (uint32_t u=0; u // for UdpContext.h -#include "WiFiUdp.h" -#include "lwip/udp.h" -#include "debug.h" -#include "include/UdpContext.h" -#include -#include -#include - - -#include "ESP8266WiFi.h" - - -namespace esp8266 { - -/** - * LEAmDNS - */ -namespace MDNSImplementation { - -//this should be defined at build time -#ifndef ARDUINO_BOARD -#define ARDUINO_BOARD "generic" -#endif - -#define MDNS_IP4_SUPPORT -//#define MDNS_IP6_SUPPORT - - -#ifdef MDNS_IP4_SUPPORT - #define MDNS_IP4_SIZE 4 -#endif -#ifdef MDNS_IP6_SUPPORT - #define MDNS_IP6_SIZE 16 -#endif -/* - * Maximum length for all service txts for one service - */ -#define MDNS_SERVICE_TXT_MAXLENGTH 1300 -/* - * Maximum length for a full domain name eg. MyESP._http._tcp.local - */ -#define MDNS_DOMAIN_MAXLENGTH 256 -/* - * Maximum length of on label in a domain name (length info fits into 6 bits) - */ -#define MDNS_DOMAIN_LABEL_MAXLENGTH 63 -/* - * Maximum length of a service name eg. http - */ -#define MDNS_SERVICE_NAME_LENGTH 15 -/* - * Maximum length of a service protocol name eg. tcp - */ -#define MDNS_SERVICE_PROTOCOL_LENGTH 3 -/* - * Default timeout for static service queries - */ -#define MDNS_QUERYSERVICES_WAIT_TIME 1000 - - -/** - * MDNSResponder - */ -class MDNSResponder { -public: - /* INTERFACE */ - MDNSResponder(void); - virtual ~MDNSResponder(void); - - // Start the MDNS responder by setting the default hostname - // Later call MDNS::update() in every 'loop' to run the process loop - // (probing, announcing, responding, ...) - // if interfaceAddress is not specified, default interface is STA, or AP when STA is not set - bool begin(const char* p_pcHostname, const IPAddress& p_IPAddress = INADDR_ANY, uint32_t p_u32TTL = 120 /*ignored*/); - bool begin(const String& p_strHostname, const IPAddress& p_IPAddress = INADDR_ANY, uint32_t p_u32TTL = 120 /*ignored*/) {return begin(p_strHostname.c_str(), p_IPAddress, p_u32TTL);} - - // Finish MDNS processing - bool close(void); - // for esp32 compatability - bool end(void); - // Change hostname (probing is restarted) - bool setHostname(const char* p_pcHostname); - // for compatibility... - bool setHostname(String p_strHostname); - - /** - * hMDNSService (opaque handle to access the service) - */ - typedef const void* hMDNSService; - - // Add a new service to the MDNS responder. If no name (instance name) is given (p_pcName = 0) - // the current hostname is used. If the hostname is changed later, the instance names for - // these 'auto-named' services are changed to the new name also (and probing is restarted). - // The usual '_' before p_pcService (eg. http) and protocol (eg. tcp) may be given. - hMDNSService addService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol, - uint16_t p_u16Port); - // Removes a service from the MDNS responder - bool removeService(const hMDNSService p_hService); - bool removeService(const char* p_pcInstanceName, - const char* p_pcServiceName, - const char* p_pcProtocol); - // for compatibility... - bool addService(String p_strServiceName, - String p_strProtocol, - uint16_t p_u16Port); - - - // Change the services instance name (and restart probing). - bool setServiceName(const hMDNSService p_hService, - const char* p_pcInstanceName); - //for compatibility - //Warning: this has the side effect of changing the hostname. - //TODO: implement instancename different from hostname - void setInstanceName(const char* p_pcHostname) {setHostname(p_pcHostname);} - // for esp32 compatibilty - void setInstanceName(const String& s_pcHostname) {setInstanceName(s_pcHostname.c_str());} - - /** - * hMDNSTxt (opaque handle to access the TXT items) - */ - typedef void* hMDNSTxt; - - // Add a (static) MDNS TXT item ('key' = 'value') to the service - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - const char* p_pcValue); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - uint32_t p_u32Value); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - uint16_t p_u16Value); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - uint8_t p_u8Value); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - int32_t p_i32Value); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - int16_t p_i16Value); - hMDNSTxt addServiceTxt(const hMDNSService p_hService, - const char* p_pcKey, - int8_t p_i8Value); - - // Remove an existing (static) MDNS TXT item from the service - bool removeServiceTxt(const hMDNSService p_hService, - const hMDNSTxt p_hTxt); - bool removeServiceTxt(const hMDNSService p_hService, - const char* p_pcKey); - bool removeServiceTxt(const char* p_pcinstanceName, - const char* p_pcServiceName, - const char* p_pcProtocol, - const char* p_pcKey); - // for compatibility... - bool addServiceTxt(const char* p_pcService, - const char* p_pcProtocol, - const char* p_pcKey, - const char* p_pcValue); - bool addServiceTxt(String p_strService, - String p_strProtocol, - String p_strKey, - String p_strValue); - - /** - * MDNSDynamicServiceTxtCallbackFn - * Callback function for dynamic MDNS TXT items - */ - - typedef std::function MDNSDynamicServiceTxtCallbackFunc; - - // Set a global callback for dynamic MDNS TXT items. The callback function is called - // every time, a TXT item is needed for one of the installed services. - bool setDynamicServiceTxtCallback(MDNSDynamicServiceTxtCallbackFunc p_fnCallback); - // Set a service specific callback for dynamic MDNS TXT items. The callback function - // is called every time, a TXT item is needed for the given service. - bool setDynamicServiceTxtCallback(const hMDNSService p_hService, - MDNSDynamicServiceTxtCallbackFunc p_fnCallback); - - // Add a (dynamic) MDNS TXT item ('key' = 'value') to the service - // Dynamic TXT items are removed right after one-time use. So they need to be added - // every time the value s needed (via callback). - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - const char* p_pcValue); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - uint32_t p_u32Value); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - uint16_t p_u16Value); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - uint8_t p_u8Value); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - int32_t p_i32Value); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - int16_t p_i16Value); - hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, - const char* p_pcKey, - int8_t p_i8Value); - - // Perform a (static) service query. The function returns after p_u16Timeout milliseconds - // The answers (the number of received answers is returned) can be retrieved by calling - // - answerHostname (or hostname) - // - answerIP (or IP) - // - answerPort (or port) - uint32_t queryService(const char* p_pcService, - const char* p_pcProtocol, - const uint16_t p_u16Timeout = MDNS_QUERYSERVICES_WAIT_TIME); - bool removeQuery(void); - // for compatibility... - uint32_t queryService(String p_strService, - String p_strProtocol); - - const char* answerHostname(const uint32_t p_u32AnswerIndex); - IPAddress answerIP(const uint32_t p_u32AnswerIndex); - uint16_t answerPort(const uint32_t p_u32AnswerIndex); - // for compatibility... - String hostname(const uint32_t p_u32AnswerIndex); - IPAddress IP(const uint32_t p_u32AnswerIndex); - uint16_t port(const uint32_t p_u32AnswerIndex); - - /** - * hMDNSServiceQuery (opaque handle to access dynamic service queries) - */ - typedef const void* hMDNSServiceQuery; - - /** - * enuServiceQueryAnswerType - */ - typedef enum _enuServiceQueryAnswerType { - ServiceQueryAnswerType_ServiceDomain = (1 << 0), // Service instance name - ServiceQueryAnswerType_HostDomainAndPort = (1 << 1), // Host domain and service port - ServiceQueryAnswerType_Txts = (1 << 2), // TXT items -#ifdef MDNS_IP4_SUPPORT - ServiceQueryAnswerType_IP4Address = (1 << 3), // IP4 address -#endif -#ifdef MDNS_IP6_SUPPORT - ServiceQueryAnswerType_IP6Address = (1 << 4), // IP6 address -#endif - } enuServiceQueryAnswerType; - - enum class AnswerType : uint32_t { - Unknown = 0, - ServiceDomain = ServiceQueryAnswerType_ServiceDomain, - HostDomainAndPort = ServiceQueryAnswerType_HostDomainAndPort, - Txt = ServiceQueryAnswerType_Txts, -#ifdef MDNS_IP4_SUPPORT - IP4Address = ServiceQueryAnswerType_IP4Address, -#endif -#ifdef MDNS_IP6_SUPPORT - IP6Address = ServiceQueryAnswerType_IP6Address, -#endif - }; - - /** - * MDNSServiceQueryCallbackFn - * Callback function for received answers for dynamic service queries - */ - struct MDNSServiceInfo; // forward declaration - typedef std::function MDNSServiceQueryCallbackFunc; - - // Install a dynamic service query. For every received answer (part) the given callback - // function is called. The query will be updated every time, the TTL for an answer - // has timed-out. - // The answers can also be retrieved by calling - // - answerCount - // - answerServiceDomain - // - hasAnswerHostDomain/answerHostDomain - // - hasAnswerIP4Address/answerIP4Address - // - hasAnswerIP6Address/answerIP6Address - // - hasAnswerPort/answerPort - // - hasAnswerTxts/answerTxts - hMDNSServiceQuery installServiceQuery(const char* p_pcService, - const char* p_pcProtocol, - MDNSServiceQueryCallbackFunc p_fnCallback); - // Remove a dynamic service query - bool removeServiceQuery(hMDNSServiceQuery p_hServiceQuery); - - uint32_t answerCount(const hMDNSServiceQuery p_hServiceQuery); - std::vector answerInfo (const MDNSResponder::hMDNSServiceQuery p_hServiceQuery); - - const char* answerServiceDomain(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - bool hasAnswerHostDomain(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - const char* answerHostDomain(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); -#ifdef MDNS_IP4_SUPPORT - bool hasAnswerIP4Address(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - uint32_t answerIP4AddressCount(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - IPAddress answerIP4Address(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex, - const uint32_t p_u32AddressIndex); -#endif -#ifdef MDNS_IP6_SUPPORT - bool hasAnswerIP6Address(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - uint32_t answerIP6AddressCount(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - IPAddress answerIP6Address(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex, - const uint32_t p_u32AddressIndex); -#endif - bool hasAnswerPort(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - uint16_t answerPort(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - bool hasAnswerTxts(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - // Get the TXT items as a ';'-separated string - const char* answerTxts(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - - /** - * MDNSProbeResultCallbackFn - * Callback function for (host and service domain) probe results - */ - typedef std::function MDNSHostProbeFn; - - typedef std::function MDNSHostProbeFn1; - - typedef std::function MDNSServiceProbeFn; - - typedef std::function MDNSServiceProbeFn1; - - // Set a global callback function for host and service probe results - // The callback function is called, when the probing for the host domain - // (or a service domain, which hasn't got a service specific callback) - // Succeeds or fails. - // In case of failure, the failed domain name should be changed. - bool setHostProbeResultCallback(MDNSHostProbeFn p_fnCallback); - bool setHostProbeResultCallback(MDNSHostProbeFn1 p_fnCallback); - - // Set a service specific probe result callback - bool setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, - MDNSServiceProbeFn p_fnCallback); - bool setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, - MDNSServiceProbeFn1 p_fnCallback); - - // Application should call this whenever AP is configured/disabled - bool notifyAPChange(void); - - // 'update' should be called in every 'loop' to run the MDNS processing - bool update(void); - - // 'announce' can be called every time, the configuration of some service - // changes. Mainly, this would be changed content of TXT items. - bool announce(void); - - // Enable OTA update - hMDNSService enableArduino(uint16_t p_u16Port, - bool p_bAuthUpload = false); - - // Domain name helper - static bool indexDomain(char*& p_rpcDomain, - const char* p_pcDivider = "-", - const char* p_pcDefaultDomain = 0); - - /** STRUCTS **/ - -public: - /** - * MDNSServiceInfo, used in application callbacks - */ - struct MDNSServiceInfo - { - MDNSServiceInfo(MDNSResponder& p_pM,MDNSResponder::hMDNSServiceQuery p_hS,uint32_t p_u32A) - : p_pMDNSResponder(p_pM), - p_hServiceQuery(p_hS), - p_u32AnswerIndex(p_u32A) - {}; - struct CompareKey - { - bool operator()(char const *a, char const *b) const - { - return strcmp(a, b) < 0; - } - }; - using KeyValueMap = std::map; - protected: - MDNSResponder& p_pMDNSResponder; - MDNSResponder::hMDNSServiceQuery p_hServiceQuery; - uint32_t p_u32AnswerIndex; - KeyValueMap keyValueMap; - public: - const char* serviceDomain(){ - return p_pMDNSResponder.answerServiceDomain(p_hServiceQuery, p_u32AnswerIndex); - }; - bool hostDomainAvailable() - { - return (p_pMDNSResponder.hasAnswerHostDomain(p_hServiceQuery, p_u32AnswerIndex)); - } - const char* hostDomain(){ - return (hostDomainAvailable()) ? - p_pMDNSResponder.answerHostDomain(p_hServiceQuery, p_u32AnswerIndex) : nullptr; - }; - bool hostPortAvailable() - { - return (p_pMDNSResponder.hasAnswerPort(p_hServiceQuery, p_u32AnswerIndex)); - } - uint16_t hostPort(){ - return (hostPortAvailable()) ? - p_pMDNSResponder.answerPort(p_hServiceQuery, p_u32AnswerIndex) : 0; - }; - bool IP4AddressAvailable() - { - return (p_pMDNSResponder.hasAnswerIP4Address(p_hServiceQuery,p_u32AnswerIndex )); - } - std::vector IP4Adresses(){ - std::vector internalIP; - if (IP4AddressAvailable()) { - uint16_t cntIP4Adress = p_pMDNSResponder.answerIP4AddressCount(p_hServiceQuery, p_u32AnswerIndex); - for (uint32_t u2 = 0; u2 < cntIP4Adress; ++u2) { - internalIP.emplace_back(p_pMDNSResponder.answerIP4Address(p_hServiceQuery, p_u32AnswerIndex, u2)); - } - } - return internalIP; - }; - bool txtAvailable() - { - return (p_pMDNSResponder.hasAnswerTxts(p_hServiceQuery, p_u32AnswerIndex)); - } - const char* strKeyValue (){ - return (txtAvailable()) ? - p_pMDNSResponder.answerTxts(p_hServiceQuery, p_u32AnswerIndex) : nullptr; - }; - const KeyValueMap& keyValues() - { - if (txtAvailable() && keyValueMap.size() == 0) - { - for (auto kv = p_pMDNSResponder._answerKeyValue(p_hServiceQuery, p_u32AnswerIndex);kv != nullptr;kv = kv->m_pNext) { - keyValueMap.emplace(std::pair(kv->m_pcKey,kv->m_pcValue)); - } - } - return keyValueMap; - } - const char* value(const char* key) - { - char* result = nullptr; - - for (stcMDNSServiceTxt* pTxt=p_pMDNSResponder._answerKeyValue(p_hServiceQuery, p_u32AnswerIndex); pTxt; pTxt=pTxt->m_pNext) { - if ((key) && - (0 == strcmp(pTxt->m_pcKey, key))) { - result = pTxt->m_pcValue; - break; - } - } - return result; - } - }; -protected: - - /** - * stcMDNSServiceTxt - */ - struct stcMDNSServiceTxt { - stcMDNSServiceTxt* m_pNext; - char* m_pcKey; - char* m_pcValue; - bool m_bTemp; - - stcMDNSServiceTxt(const char* p_pcKey = 0, - const char* p_pcValue = 0, - bool p_bTemp = false); - stcMDNSServiceTxt(const stcMDNSServiceTxt& p_Other); - ~stcMDNSServiceTxt(void); - - stcMDNSServiceTxt& operator=(const stcMDNSServiceTxt& p_Other); - bool clear(void); - - char* allocKey(size_t p_stLength); - bool setKey(const char* p_pcKey, - size_t p_stLength); - bool setKey(const char* p_pcKey); - bool releaseKey(void); - - char* allocValue(size_t p_stLength); - bool setValue(const char* p_pcValue, - size_t p_stLength); - bool setValue(const char* p_pcValue); - bool releaseValue(void); - - bool set(const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp = false); - - bool update(const char* p_pcValue); - - size_t length(void) const; - }; - - /** - * stcMDNSTxts - */ - struct stcMDNSServiceTxts { - stcMDNSServiceTxt* m_pTxts; - - stcMDNSServiceTxts(void); - stcMDNSServiceTxts(const stcMDNSServiceTxts& p_Other); - ~stcMDNSServiceTxts(void); - - stcMDNSServiceTxts& operator=(const stcMDNSServiceTxts& p_Other); - - bool clear(void); - - bool add(stcMDNSServiceTxt* p_pTxt); - bool remove(stcMDNSServiceTxt* p_pTxt); - - bool removeTempTxts(void); - - stcMDNSServiceTxt* find(const char* p_pcKey); - const stcMDNSServiceTxt* find(const char* p_pcKey) const; - stcMDNSServiceTxt* find(const stcMDNSServiceTxt* p_pTxt); - - uint16_t length(void) const; - - size_t c_strLength(void) const; - bool c_str(char* p_pcBuffer); - - size_t bufferLength(void) const; - bool buffer(char* p_pcBuffer); - - bool compare(const stcMDNSServiceTxts& p_Other) const; - bool operator==(const stcMDNSServiceTxts& p_Other) const; - bool operator!=(const stcMDNSServiceTxts& p_Other) const; - }; - - /** - * enuContentFlags - */ - typedef enum _enuContentFlags { - // Host - ContentFlag_A = 0x01, - ContentFlag_PTR_IP4 = 0x02, - ContentFlag_PTR_IP6 = 0x04, - ContentFlag_AAAA = 0x08, - // Service - ContentFlag_PTR_TYPE = 0x10, - ContentFlag_PTR_NAME = 0x20, - ContentFlag_TXT = 0x40, - ContentFlag_SRV = 0x80, - } enuContentFlags; - - /** - * stcMDNS_MsgHeader - */ - struct stcMDNS_MsgHeader { - uint16_t m_u16ID; // Identifier - bool m_1bQR : 1; // Query/Response flag - unsigned char m_4bOpcode : 4; // Operation code - bool m_1bAA : 1; // Authoritative Answer flag - bool m_1bTC : 1; // Truncation flag - bool m_1bRD : 1; // Recursion desired - bool m_1bRA : 1; // Recursion available - unsigned char m_3bZ : 3; // Zero - unsigned char m_4bRCode : 4; // Response code - uint16_t m_u16QDCount; // Question count - uint16_t m_u16ANCount; // Answer count - uint16_t m_u16NSCount; // Authority Record count - uint16_t m_u16ARCount; // Additional Record count - - stcMDNS_MsgHeader(uint16_t p_u16ID = 0, - bool p_bQR = false, - unsigned char p_ucOpcode = 0, - bool p_bAA = false, - bool p_bTC = false, - bool p_bRD = false, - bool p_bRA = false, - unsigned char p_ucRCode = 0, - uint16_t p_u16QDCount = 0, - uint16_t p_u16ANCount = 0, - uint16_t p_u16NSCount = 0, - uint16_t p_u16ARCount = 0); - }; - - /** - * stcMDNS_RRDomain - */ - struct stcMDNS_RRDomain { - char m_acName[MDNS_DOMAIN_MAXLENGTH]; // Encoded domain name - uint16_t m_u16NameLength; // Length (incl. '\0') - - stcMDNS_RRDomain(void); - stcMDNS_RRDomain(const stcMDNS_RRDomain& p_Other); - - stcMDNS_RRDomain& operator=(const stcMDNS_RRDomain& p_Other); - - bool clear(void); - - bool addLabel(const char* p_pcLabel, - bool p_bPrependUnderline = false); - - bool compare(const stcMDNS_RRDomain& p_Other) const; - bool operator==(const stcMDNS_RRDomain& p_Other) const; - bool operator!=(const stcMDNS_RRDomain& p_Other) const; - bool operator>(const stcMDNS_RRDomain& p_Other) const; - - size_t c_strLength(void) const; - bool c_str(char* p_pcBuffer); - }; - - /** - * stcMDNS_RRAttributes - */ - struct stcMDNS_RRAttributes { - uint16_t m_u16Type; // Type - uint16_t m_u16Class; // Class, nearly always 'IN' - - stcMDNS_RRAttributes(uint16_t p_u16Type = 0, - uint16_t p_u16Class = 1 /*DNS_RRCLASS_IN Internet*/); - stcMDNS_RRAttributes(const stcMDNS_RRAttributes& p_Other); - - stcMDNS_RRAttributes& operator=(const stcMDNS_RRAttributes& p_Other); - }; - - /** - * stcMDNS_RRHeader - */ - struct stcMDNS_RRHeader { - stcMDNS_RRDomain m_Domain; - stcMDNS_RRAttributes m_Attributes; - - stcMDNS_RRHeader(void); - stcMDNS_RRHeader(const stcMDNS_RRHeader& p_Other); - - stcMDNS_RRHeader& operator=(const stcMDNS_RRHeader& p_Other); - - bool clear(void); - }; - - /** - * stcMDNS_RRQuestion - */ - struct stcMDNS_RRQuestion { - stcMDNS_RRQuestion* m_pNext; - stcMDNS_RRHeader m_Header; - bool m_bUnicast; // Unicast reply requested - - stcMDNS_RRQuestion(void); - }; - - /** - * enuAnswerType - */ - typedef enum _enuAnswerType { - AnswerType_A, - AnswerType_PTR, - AnswerType_TXT, - AnswerType_AAAA, - AnswerType_SRV, - AnswerType_Generic - } enuAnswerType; - - /** - * stcMDNS_RRAnswer - */ - struct stcMDNS_RRAnswer { - stcMDNS_RRAnswer* m_pNext; - const enuAnswerType m_AnswerType; - stcMDNS_RRHeader m_Header; - bool m_bCacheFlush; // Cache flush command bit - uint32_t m_u32TTL; // Validity time in seconds - - virtual ~stcMDNS_RRAnswer(void); - - enuAnswerType answerType(void) const; - - bool clear(void); - - protected: - stcMDNS_RRAnswer(enuAnswerType p_AnswerType, - const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - }; - -#ifdef MDNS_IP4_SUPPORT - /** - * stcMDNS_RRAnswerA - */ - struct stcMDNS_RRAnswerA : public stcMDNS_RRAnswer { - IPAddress m_IPAddress; - - stcMDNS_RRAnswerA(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerA(void); - - bool clear(void); - }; -#endif - - /** - * stcMDNS_RRAnswerPTR - */ - struct stcMDNS_RRAnswerPTR : public stcMDNS_RRAnswer { - stcMDNS_RRDomain m_PTRDomain; - - stcMDNS_RRAnswerPTR(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerPTR(void); - - bool clear(void); - }; - - /** - * stcMDNS_RRAnswerTXT - */ - struct stcMDNS_RRAnswerTXT : public stcMDNS_RRAnswer { - stcMDNSServiceTxts m_Txts; - - stcMDNS_RRAnswerTXT(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerTXT(void); - - bool clear(void); - }; - -#ifdef MDNS_IP6_SUPPORT - /** - * stcMDNS_RRAnswerAAAA - */ - struct stcMDNS_RRAnswerAAAA : public stcMDNS_RRAnswer { - //TODO: IP6Address m_IPAddress; - - stcMDNS_RRAnswerAAAA(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerAAAA(void); - - bool clear(void); - }; -#endif - - /** - * stcMDNS_RRAnswerSRV - */ - struct stcMDNS_RRAnswerSRV : public stcMDNS_RRAnswer { - uint16_t m_u16Priority; - uint16_t m_u16Weight; - uint16_t m_u16Port; - stcMDNS_RRDomain m_SRVDomain; - - stcMDNS_RRAnswerSRV(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerSRV(void); - - bool clear(void); - }; - - /** - * stcMDNS_RRAnswerGeneric - */ - struct stcMDNS_RRAnswerGeneric : public stcMDNS_RRAnswer { - uint16_t m_u16RDLength; // Length of variable answer - uint8_t* m_pu8RDData; // Offset of start of variable answer in packet - - stcMDNS_RRAnswerGeneric(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL); - ~stcMDNS_RRAnswerGeneric(void); - - bool clear(void); - }; - - - /** - * enuProbingStatus - */ - typedef enum _enuProbingStatus { - ProbingStatus_WaitingForData, - ProbingStatus_ReadyToStart, - ProbingStatus_InProgress, - ProbingStatus_Done - } enuProbingStatus; - - /** - * stcProbeInformation - */ - struct stcProbeInformation { - enuProbingStatus m_ProbingStatus; - uint8_t m_u8SentCount; // Used for probes and announcements - esp8266::polledTimeout::oneShotMs m_Timeout; // Used for probes and announcements - //clsMDNSTimeFlag m_TimeFlag; // Used for probes and announcements - bool m_bConflict; - bool m_bTiebreakNeeded; - MDNSHostProbeFn m_fnHostProbeResultCallback; - MDNSServiceProbeFn m_fnServiceProbeResultCallback; - - stcProbeInformation(void); - - bool clear(bool p_bClearUserdata = false); - }; - - - /** - * stcMDNSService - */ - struct stcMDNSService { - stcMDNSService* m_pNext; - char* m_pcName; - bool m_bAutoName; // Name was set automatically to hostname (if no name was supplied) - char* m_pcService; - char* m_pcProtocol; - uint16_t m_u16Port; - uint8_t m_u8ReplyMask; - stcMDNSServiceTxts m_Txts; - MDNSDynamicServiceTxtCallbackFunc m_fnTxtCallback; - stcProbeInformation m_ProbeInformation; - - stcMDNSService(const char* p_pcName = 0, - const char* p_pcService = 0, - const char* p_pcProtocol = 0); - ~stcMDNSService(void); - - bool setName(const char* p_pcName); - bool releaseName(void); - - bool setService(const char* p_pcService); - bool releaseService(void); - - bool setProtocol(const char* p_pcProtocol); - bool releaseProtocol(void); - }; - - /** - * stcMDNSServiceQuery - */ - struct stcMDNSServiceQuery { - /** - * stcAnswer - */ - struct stcAnswer { - /** - * stcTTL - */ - struct stcTTL { - /** - * timeoutLevel_t - */ - typedef uint8_t timeoutLevel_t; - /** - * TIMEOUTLEVELs - */ - const timeoutLevel_t TIMEOUTLEVEL_UNSET = 0; - const timeoutLevel_t TIMEOUTLEVEL_BASE = 80; - const timeoutLevel_t TIMEOUTLEVEL_INTERVAL = 5; - const timeoutLevel_t TIMEOUTLEVEL_FINAL = 100; - - uint32_t m_u32TTL; - esp8266::polledTimeout::oneShotMs m_TTLTimeout; - timeoutLevel_t m_timeoutLevel; - - stcTTL(void); - bool set(uint32_t p_u32TTL); - - bool flagged(void); - bool restart(void); - - bool prepareDeletion(void); - bool finalTimeoutLevel(void) const; - - unsigned long timeout(void) const; - }; -#ifdef MDNS_IP4_SUPPORT - /** - * stcIP4Address - */ - struct stcIP4Address { - stcIP4Address* m_pNext; - IPAddress m_IPAddress; - stcTTL m_TTL; - - stcIP4Address(IPAddress p_IPAddress, - uint32_t p_u32TTL = 0); - }; -#endif -#ifdef MDNS_IP6_SUPPORT - /** - * stcIP6Address - */ - struct stcIP6Address { - stcIP6Address* m_pNext; - IP6Address m_IPAddress; - stcTTL m_TTL; - - stcIP6Address(IPAddress p_IPAddress, - uint32_t p_u32TTL = 0); - }; -#endif - - stcAnswer* m_pNext; - // The service domain is the first 'answer' (from PTR answer, using service and protocol) to be set - // Defines the key for additional answer, like host domain, etc. - stcMDNS_RRDomain m_ServiceDomain; // 1. level answer (PTR), eg. MyESP._http._tcp.local - char* m_pcServiceDomain; - stcTTL m_TTLServiceDomain; - stcMDNS_RRDomain m_HostDomain; // 2. level answer (SRV, using service domain), eg. esp8266.local - char* m_pcHostDomain; - uint16_t m_u16Port; // 2. level answer (SRV, using service domain), eg. 5000 - stcTTL m_TTLHostDomainAndPort; - stcMDNSServiceTxts m_Txts; // 2. level answer (TXT, using service domain), eg. c#=1 - char* m_pcTxts; - stcTTL m_TTLTxts; -#ifdef MDNS_IP4_SUPPORT - stcIP4Address* m_pIP4Addresses; // 3. level answer (A, using host domain), eg. 123.456.789.012 -#endif -#ifdef MDNS_IP6_SUPPORT - stcIP6Address* m_pIP6Addresses; // 3. level answer (AAAA, using host domain), eg. 1234::09 -#endif - uint32_t m_u32ContentFlags; - - stcAnswer(void); - ~stcAnswer(void); - - bool clear(void); - - char* allocServiceDomain(size_t p_stLength); - bool releaseServiceDomain(void); - - char* allocHostDomain(size_t p_stLength); - bool releaseHostDomain(void); - - char* allocTxts(size_t p_stLength); - bool releaseTxts(void); - -#ifdef MDNS_IP4_SUPPORT - bool releaseIP4Addresses(void); - bool addIP4Address(stcIP4Address* p_pIP4Address); - bool removeIP4Address(stcIP4Address* p_pIP4Address); - const stcIP4Address* findIP4Address(const IPAddress& p_IPAddress) const; - stcIP4Address* findIP4Address(const IPAddress& p_IPAddress); - uint32_t IP4AddressCount(void) const; - const stcIP4Address* IP4AddressAtIndex(uint32_t p_u32Index) const; - stcIP4Address* IP4AddressAtIndex(uint32_t p_u32Index); -#endif -#ifdef MDNS_IP6_SUPPORT - bool releaseIP6Addresses(void); - bool addIP6Address(stcIP6Address* p_pIP6Address); - bool removeIP6Address(stcIP6Address* p_pIP6Address); - const stcIP6Address* findIP6Address(const IPAddress& p_IPAddress) const; - stcIP6Address* findIP6Address(const IPAddress& p_IPAddress); - uint32_t IP6AddressCount(void) const; - const stcIP6Address* IP6AddressAtIndex(uint32_t p_u32Index) const; - stcIP6Address* IP6AddressAtIndex(uint32_t p_u32Index); -#endif - }; - - stcMDNSServiceQuery* m_pNext; - stcMDNS_RRDomain m_ServiceTypeDomain; // eg. _http._tcp.local - MDNSServiceQueryCallbackFunc m_fnCallback; - bool m_bLegacyQuery; - uint8_t m_u8SentCount; - esp8266::polledTimeout::oneShotMs m_ResendTimeout; - bool m_bAwaitingAnswers; - stcAnswer* m_pAnswers; - - stcMDNSServiceQuery(void); - ~stcMDNSServiceQuery(void); - - bool clear(void); - - uint32_t answerCount(void) const; - const stcAnswer* answerAtIndex(uint32_t p_u32Index) const; - stcAnswer* answerAtIndex(uint32_t p_u32Index); - uint32_t indexOfAnswer(const stcAnswer* p_pAnswer) const; - - bool addAnswer(stcAnswer* p_pAnswer); - bool removeAnswer(stcAnswer* p_pAnswer); - - stcAnswer* findAnswerForServiceDomain(const stcMDNS_RRDomain& p_ServiceDomain); - stcAnswer* findAnswerForHostDomain(const stcMDNS_RRDomain& p_HostDomain); - }; - - /** - * stcMDNSSendParameter - */ - struct stcMDNSSendParameter { - protected: - /** - * stcDomainCacheItem - */ - struct stcDomainCacheItem { - stcDomainCacheItem* m_pNext; - const void* m_pHostnameOrService; // Opaque id for host or service domain (pointer) - bool m_bAdditionalData; // Opaque flag for special info (service domain included) - uint16_t m_u16Offset; // Offset in UDP output buffer - - stcDomainCacheItem(const void* p_pHostnameOrService, - bool p_bAdditionalData, - uint32_t p_u16Offset); - }; - - public: - uint16_t m_u16ID; // Query ID (used only in lagacy queries) - stcMDNS_RRQuestion* m_pQuestions; // A list of queries - uint8_t m_u8HostReplyMask; // Flags for reply components/answers - bool m_bLegacyQuery; // Flag: Legacy query - bool m_bResponse; // Flag: Response to a query - bool m_bAuthorative; // Flag: Authorative (owner) response - bool m_bCacheFlush; // Flag: Clients should flush their caches - bool m_bUnicast; // Flag: Unicast response - bool m_bUnannounce; // Flag: Unannounce service - uint16_t m_u16Offset; // Current offset in UDP write buffer (mainly for domain cache) - stcDomainCacheItem* m_pDomainCacheItems; // Cached host and service domains - - stcMDNSSendParameter(void); - ~stcMDNSSendParameter(void); - - bool clear(void); - - bool shiftOffset(uint16_t p_u16Shift); - - bool addDomainCacheItem(const void* p_pHostnameOrService, - bool p_bAdditionalData, - uint16_t p_u16Offset); - uint16_t findCachedDomainOffset(const void* p_pHostnameOrService, - bool p_bAdditionalData) const; - }; - - // Instance variables - stcMDNSService* m_pServices; - UdpContext* m_pUDPContext; - char* m_pcHostname; - stcMDNSServiceQuery* m_pServiceQueries; - WiFiEventHandler m_DisconnectedHandler; - WiFiEventHandler m_GotIPHandler; - MDNSDynamicServiceTxtCallbackFunc m_fnServiceTxtCallback; - bool m_bPassivModeEnabled; - stcProbeInformation m_HostProbeInformation; - CONST netif* m_netif; // network interface to run on - - /** CONTROL **/ - /* MAINTENANCE */ - bool _process(bool p_bUserContext); - bool _restart(void); - - /* RECEIVING */ - bool _parseMessage(void); - bool _parseQuery(const stcMDNS_MsgHeader& p_Header); - - bool _parseResponse(const stcMDNS_MsgHeader& p_Header); - bool _processAnswers(const stcMDNS_RRAnswer* p_pPTRAnswers); - bool _processPTRAnswer(const stcMDNS_RRAnswerPTR* p_pPTRAnswer, - bool& p_rbFoundNewKeyAnswer); - bool _processSRVAnswer(const stcMDNS_RRAnswerSRV* p_pSRVAnswer, - bool& p_rbFoundNewKeyAnswer); - bool _processTXTAnswer(const stcMDNS_RRAnswerTXT* p_pTXTAnswer); -#ifdef MDNS_IP4_SUPPORT - bool _processAAnswer(const stcMDNS_RRAnswerA* p_pAAnswer); -#endif -#ifdef MDNS_IP6_SUPPORT - bool _processAAAAAnswer(const stcMDNS_RRAnswerAAAA* p_pAAAAAnswer); -#endif - - /* PROBING */ - bool _updateProbeStatus(void); - bool _resetProbeStatus(bool p_bRestart = true); - bool _hasProbesWaitingForAnswers(void) const; - bool _sendHostProbe(void); - bool _sendServiceProbe(stcMDNSService& p_rService); - bool _cancelProbingForHost(void); - bool _cancelProbingForService(stcMDNSService& p_rService); - - /* ANNOUNCE */ - bool _announce(bool p_bAnnounce, - bool p_bIncludeServices); - bool _announceService(stcMDNSService& p_rService, - bool p_bAnnounce = true); - - /* SERVICE QUERY CACHE */ - bool _hasServiceQueriesWaitingForAnswers(void) const; - bool _checkServiceQueryCache(void); - - /** TRANSFER **/ - /* SENDING */ - bool _sendMDNSMessage(stcMDNSSendParameter& p_SendParameter); - bool _sendMDNSMessage_Multicast(MDNSResponder::stcMDNSSendParameter& p_rSendParameter); - bool _prepareMDNSMessage(stcMDNSSendParameter& p_SendParameter, - IPAddress p_IPAddress); - bool _sendMDNSServiceQuery(const stcMDNSServiceQuery& p_ServiceQuery); - bool _sendMDNSQuery(const stcMDNS_RRDomain& p_QueryDomain, - uint16_t p_u16QueryType, - stcMDNSServiceQuery::stcAnswer* p_pKnownAnswers = 0); - - const IPAddress _getResponseMulticastInterface() const { return IPAddress(m_netif->ip_addr); } - - uint8_t _replyMaskForHost(const stcMDNS_RRHeader& p_RRHeader, - bool* p_pbFullNameMatch = 0) const; - uint8_t _replyMaskForService(const stcMDNS_RRHeader& p_RRHeader, - const stcMDNSService& p_Service, - bool* p_pbFullNameMatch = 0) const; - - /* RESOURCE RECORD */ - bool _readRRQuestion(stcMDNS_RRQuestion& p_rQuestion); - bool _readRRAnswer(stcMDNS_RRAnswer*& p_rpAnswer); -#ifdef MDNS_IP4_SUPPORT - bool _readRRAnswerA(stcMDNS_RRAnswerA& p_rRRAnswerA, - uint16_t p_u16RDLength); -#endif - bool _readRRAnswerPTR(stcMDNS_RRAnswerPTR& p_rRRAnswerPTR, - uint16_t p_u16RDLength); - bool _readRRAnswerTXT(stcMDNS_RRAnswerTXT& p_rRRAnswerTXT, - uint16_t p_u16RDLength); -#ifdef MDNS_IP6_SUPPORT - bool _readRRAnswerAAAA(stcMDNS_RRAnswerAAAA& p_rRRAnswerAAAA, - uint16_t p_u16RDLength); -#endif - bool _readRRAnswerSRV(stcMDNS_RRAnswerSRV& p_rRRAnswerSRV, - uint16_t p_u16RDLength); - bool _readRRAnswerGeneric(stcMDNS_RRAnswerGeneric& p_rRRAnswerGeneric, - uint16_t p_u16RDLength); - - bool _readRRHeader(stcMDNS_RRHeader& p_rHeader); - bool _readRRDomain(stcMDNS_RRDomain& p_rRRDomain); - bool _readRRDomain_Loop(stcMDNS_RRDomain& p_rRRDomain, - uint8_t p_u8Depth); - bool _readRRAttributes(stcMDNS_RRAttributes& p_rAttributes); - - /* DOMAIN NAMES */ - bool _buildDomainForHost(const char* p_pcHostname, - stcMDNS_RRDomain& p_rHostDomain) const; - bool _buildDomainForDNSSD(stcMDNS_RRDomain& p_rDNSSDDomain) const; - bool _buildDomainForService(const stcMDNSService& p_Service, - bool p_bIncludeName, - stcMDNS_RRDomain& p_rServiceDomain) const; - bool _buildDomainForService(const char* p_pcService, - const char* p_pcProtocol, - stcMDNS_RRDomain& p_rServiceDomain) const; -#ifdef MDNS_IP4_SUPPORT - bool _buildDomainForReverseIP4(IPAddress p_IP4Address, - stcMDNS_RRDomain& p_rReverseIP4Domain) const; -#endif -#ifdef MDNS_IP6_SUPPORT - bool _buildDomainForReverseIP6(IPAddress p_IP4Address, - stcMDNS_RRDomain& p_rReverseIP6Domain) const; -#endif - - /* UDP */ - bool _udpReadBuffer(unsigned char* p_pBuffer, - size_t p_stLength); - bool _udpRead8(uint8_t& p_ru8Value); - bool _udpRead16(uint16_t& p_ru16Value); - bool _udpRead32(uint32_t& p_ru32Value); - - bool _udpAppendBuffer(const unsigned char* p_pcBuffer, - size_t p_stLength); - bool _udpAppend8(uint8_t p_u8Value); - bool _udpAppend16(uint16_t p_u16Value); - bool _udpAppend32(uint32_t p_u32Value); - -#if not defined ESP_8266_MDNS_INCLUDE || defined DEBUG_ESP_MDNS_RESPONDER - bool _udpDump(bool p_bMovePointer = false); - bool _udpDump(unsigned p_uOffset, - unsigned p_uLength); -#endif - - /* READ/WRITE MDNS STRUCTS */ - bool _readMDNSMsgHeader(stcMDNS_MsgHeader& p_rMsgHeader); - - bool _write8(uint8_t p_u8Value, - stcMDNSSendParameter& p_rSendParameter); - bool _write16(uint16_t p_u16Value, - stcMDNSSendParameter& p_rSendParameter); - bool _write32(uint32_t p_u32Value, - stcMDNSSendParameter& p_rSendParameter); - - bool _writeMDNSMsgHeader(const stcMDNS_MsgHeader& p_MsgHeader, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSRRAttributes(const stcMDNS_RRAttributes& p_Attributes, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSRRDomain(const stcMDNS_RRDomain& p_Domain, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSHostDomain(const char* m_pcHostname, - bool p_bPrependRDLength, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSServiceDomain(const stcMDNSService& p_Service, - bool p_bIncludeName, - bool p_bPrependRDLength, - stcMDNSSendParameter& p_rSendParameter); - - bool _writeMDNSQuestion(stcMDNS_RRQuestion& p_Question, - stcMDNSSendParameter& p_rSendParameter); - -#ifdef MDNS_IP4_SUPPORT - bool _writeMDNSAnswer_A(IPAddress p_IPAddress, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSAnswer_PTR_IP4(IPAddress p_IPAddress, - stcMDNSSendParameter& p_rSendParameter); -#endif - bool _writeMDNSAnswer_PTR_TYPE(stcMDNSService& p_rService, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSAnswer_PTR_NAME(stcMDNSService& p_rService, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSAnswer_TXT(stcMDNSService& p_rService, - stcMDNSSendParameter& p_rSendParameter); -#ifdef MDNS_IP6_SUPPORT - bool _writeMDNSAnswer_AAAA(IPAddress p_IPAddress, - stcMDNSSendParameter& p_rSendParameter); - bool _writeMDNSAnswer_PTR_IP6(IPAddress p_IPAddress, - stcMDNSSendParameter& p_rSendParameter); -#endif - bool _writeMDNSAnswer_SRV(stcMDNSService& p_rService, - stcMDNSSendParameter& p_rSendParameter); - - /** HELPERS **/ - /* UDP CONTEXT */ - bool _callProcess(void); - bool _allocUDPContext(void); - bool _releaseUDPContext(void); - - /* SERVICE QUERY */ - stcMDNSServiceQuery* _allocServiceQuery(void); - bool _removeServiceQuery(stcMDNSServiceQuery* p_pServiceQuery); - bool _removeLegacyServiceQuery(void); - stcMDNSServiceQuery* _findServiceQuery(hMDNSServiceQuery p_hServiceQuery); - stcMDNSServiceQuery* _findLegacyServiceQuery(void); - bool _releaseServiceQueries(void); - stcMDNSServiceQuery* _findNextServiceQueryByServiceType(const stcMDNS_RRDomain& p_ServiceDomain, - const stcMDNSServiceQuery* p_pPrevServiceQuery); - - /* HOSTNAME */ - bool _setHostname(const char* p_pcHostname); - bool _releaseHostname(void); - - /* SERVICE */ - stcMDNSService* _allocService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol, - uint16_t p_u16Port); - bool _releaseService(stcMDNSService* p_pService); - bool _releaseServices(void); - - stcMDNSService* _findService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol); - stcMDNSService* _findService(const hMDNSService p_hService); - - size_t _countServices(void) const; - - /* SERVICE TXT */ - stcMDNSServiceTxt* _allocServiceTxt(stcMDNSService* p_pService, - const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp); - bool _releaseServiceTxt(stcMDNSService* p_pService, - stcMDNSServiceTxt* p_pTxt); - stcMDNSServiceTxt* _updateServiceTxt(stcMDNSService* p_pService, - stcMDNSServiceTxt* p_pTxt, - const char* p_pcValue, - bool p_bTemp); - - stcMDNSServiceTxt* _findServiceTxt(stcMDNSService* p_pService, - const char* p_pcKey); - stcMDNSServiceTxt* _findServiceTxt(stcMDNSService* p_pService, - const hMDNSTxt p_hTxt); - - stcMDNSServiceTxt* _addServiceTxt(stcMDNSService* p_pService, - const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp); - - stcMDNSServiceTxt* _answerKeyValue(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex); - - bool _collectServiceTxts(stcMDNSService& p_rService); - bool _releaseTempServiceTxts(stcMDNSService& p_rService); - const stcMDNSServiceTxt* _serviceTxts(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol); - - /* MISC */ -#if not defined ESP_8266_MDNS_INCLUDE || defined DEBUG_ESP_MDNS_RESPONDER - bool _printRRDomain(const stcMDNS_RRDomain& p_rRRDomain) const; - bool _printRRAnswer(const MDNSResponder::stcMDNS_RRAnswer& p_RRAnswer) const; -#endif -}; - -}// namespace MDNSImplementation - -}// namespace esp8266 - -#endif // MDNS_H +/* + LEAmDNS.h + (c) 2018, LaborEtArs + + Version 0.9 beta + + Some notes (from LaborEtArs, 2018): + Essentially, this is an rewrite of the original EPS8266 Multicast DNS code (ESP8266mDNS). + The target of this rewrite was to keep the existing interface as stable as possible while + adding and extending the supported set of mDNS features. + A lot of the additions were basicly taken from Erik Ekman's lwIP mdns app code. + + Supported mDNS features (in some cases somewhat limited): + - Presenting a DNS-SD service to interested observers, eg. a http server by presenting _http._tcp service + - Support for multi-level compressed names in input; in output only a very simple one-leven full-name compression is implemented + - Probing host and service domains for uniqueness in the local network + - Tiebreaking while probing is supportet in a very minimalistic way (the 'higher' IP address wins the tiebreak) + - Announcing available services after successful probing + - Using fixed service TXT items or + - Using dynamic service TXT items for presented services (via callback) + - Remove services (and un-announcing them to the observers by sending goodbye-messages) + - Static queries for DNS-SD services (creating a fixed answer set after a certain timeout period) + - Dynamic queries for DNS-SD services with cached and updated answers and user notifications + + + Usage: + In most cases, this implementation should work as a 'drop-in' replacement for the original + ESP8266 Multicast DNS code. Adjustments to the existing code would only be needed, if some + of the new features should be used. + + For presenting services: + In 'setup()': + Install a callback for the probing of host (and service) domains via 'MDNS.setProbeResultCallback(probeResultCallback, &userData);' + Register DNS-SD services with 'MDNSResponder::hMDNSService hService = MDNS.addService("MyESP", "http", "tcp", 5000);' + (Install additional callbacks for the probing of these service domains via 'MDNS.setServiceProbeResultCallback(hService, probeResultCallback, &userData);') + Add service TXT items with 'MDNS.addServiceTxt(hService, "c#", "1");' or by installing a service TXT callback + using 'MDNS.setDynamicServiceTxtCallback(dynamicServiceTxtCallback, &userData);' or service specific + 'MDNS.setDynamicServiceTxtCallback(hService, dynamicServiceTxtCallback, &userData);' + Call MDNS.begin("MyHostname"); + + In 'probeResultCallback(MDNSResponder* p_MDNSResponder, const char* p_pcDomain, MDNSResponder:hMDNSService p_hService, bool p_bProbeResult, void* p_pUserdata)': + Check the probe result and update the host or service domain name if the probe failed + + In 'dynamicServiceTxtCallback(MDNSResponder* p_MDNSResponder, const hMDNSService p_hService, void* p_pUserdata)': + Add dynamic TXT items by calling 'MDNS.addDynamicServiceTxt(p_hService, "c#", "1");' + + In loop(): + Call 'MDNS.update();' + + + For querying services: + Static: + Call 'uint32_t u32AnswerCount = MDNS.queryService("http", "tcp");' + Iterate answers by: 'for (uint32_t u=0; u // for UdpContext.h +#include "WiFiUdp.h" +#include "lwip/udp.h" +#include "debug.h" +#include "include/UdpContext.h" +#include +#include +#include + + +#include "ESP8266WiFi.h" + + +namespace esp8266 +{ + +/** + LEAmDNS +*/ +namespace MDNSImplementation +{ + +//this should be defined at build time +#ifndef ARDUINO_BOARD +#define ARDUINO_BOARD "generic" +#endif + +#define MDNS_IP4_SUPPORT +//#define MDNS_IP6_SUPPORT + + +#ifdef MDNS_IP4_SUPPORT +#define MDNS_IP4_SIZE 4 +#endif +#ifdef MDNS_IP6_SUPPORT +#define MDNS_IP6_SIZE 16 +#endif +/* + Maximum length for all service txts for one service +*/ +#define MDNS_SERVICE_TXT_MAXLENGTH 1300 +/* + Maximum length for a full domain name eg. MyESP._http._tcp.local +*/ +#define MDNS_DOMAIN_MAXLENGTH 256 +/* + Maximum length of on label in a domain name (length info fits into 6 bits) +*/ +#define MDNS_DOMAIN_LABEL_MAXLENGTH 63 +/* + Maximum length of a service name eg. http +*/ +#define MDNS_SERVICE_NAME_LENGTH 15 +/* + Maximum length of a service protocol name eg. tcp +*/ +#define MDNS_SERVICE_PROTOCOL_LENGTH 3 +/* + Default timeout for static service queries +*/ +#define MDNS_QUERYSERVICES_WAIT_TIME 1000 + + +/** + MDNSResponder +*/ +class MDNSResponder +{ +public: + /* INTERFACE */ + MDNSResponder(void); + virtual ~MDNSResponder(void); + + // Start the MDNS responder by setting the default hostname + // Later call MDNS::update() in every 'loop' to run the process loop + // (probing, announcing, responding, ...) + // if interfaceAddress is not specified, default interface is STA, or AP when STA is not set + bool begin(const char* p_pcHostname, const IPAddress& p_IPAddress = INADDR_ANY, uint32_t p_u32TTL = 120 /*ignored*/); + bool begin(const String& p_strHostname, const IPAddress& p_IPAddress = INADDR_ANY, uint32_t p_u32TTL = 120 /*ignored*/) + { + return begin(p_strHostname.c_str(), p_IPAddress, p_u32TTL); + } + + // Finish MDNS processing + bool close(void); + // for esp32 compatability + bool end(void); + // Change hostname (probing is restarted) + bool setHostname(const char* p_pcHostname); + // for compatibility... + bool setHostname(String p_strHostname); + + /** + hMDNSService (opaque handle to access the service) + */ + typedef const void* hMDNSService; + + // Add a new service to the MDNS responder. If no name (instance name) is given (p_pcName = 0) + // the current hostname is used. If the hostname is changed later, the instance names for + // these 'auto-named' services are changed to the new name also (and probing is restarted). + // The usual '_' before p_pcService (eg. http) and protocol (eg. tcp) may be given. + hMDNSService addService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol, + uint16_t p_u16Port); + // Removes a service from the MDNS responder + bool removeService(const hMDNSService p_hService); + bool removeService(const char* p_pcInstanceName, + const char* p_pcServiceName, + const char* p_pcProtocol); + // for compatibility... + bool addService(String p_strServiceName, + String p_strProtocol, + uint16_t p_u16Port); + + + // Change the services instance name (and restart probing). + bool setServiceName(const hMDNSService p_hService, + const char* p_pcInstanceName); + //for compatibility + //Warning: this has the side effect of changing the hostname. + //TODO: implement instancename different from hostname + void setInstanceName(const char* p_pcHostname) + { + setHostname(p_pcHostname); + } + // for esp32 compatibilty + void setInstanceName(const String& s_pcHostname) + { + setInstanceName(s_pcHostname.c_str()); + } + + /** + hMDNSTxt (opaque handle to access the TXT items) + */ + typedef void* hMDNSTxt; + + // Add a (static) MDNS TXT item ('key' = 'value') to the service + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + const char* p_pcValue); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + uint32_t p_u32Value); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + uint16_t p_u16Value); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + uint8_t p_u8Value); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + int32_t p_i32Value); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + int16_t p_i16Value); + hMDNSTxt addServiceTxt(const hMDNSService p_hService, + const char* p_pcKey, + int8_t p_i8Value); + + // Remove an existing (static) MDNS TXT item from the service + bool removeServiceTxt(const hMDNSService p_hService, + const hMDNSTxt p_hTxt); + bool removeServiceTxt(const hMDNSService p_hService, + const char* p_pcKey); + bool removeServiceTxt(const char* p_pcinstanceName, + const char* p_pcServiceName, + const char* p_pcProtocol, + const char* p_pcKey); + // for compatibility... + bool addServiceTxt(const char* p_pcService, + const char* p_pcProtocol, + const char* p_pcKey, + const char* p_pcValue); + bool addServiceTxt(String p_strService, + String p_strProtocol, + String p_strKey, + String p_strValue); + + /** + MDNSDynamicServiceTxtCallbackFn + Callback function for dynamic MDNS TXT items + */ + + typedef std::function MDNSDynamicServiceTxtCallbackFunc; + + // Set a global callback for dynamic MDNS TXT items. The callback function is called + // every time, a TXT item is needed for one of the installed services. + bool setDynamicServiceTxtCallback(MDNSDynamicServiceTxtCallbackFunc p_fnCallback); + // Set a service specific callback for dynamic MDNS TXT items. The callback function + // is called every time, a TXT item is needed for the given service. + bool setDynamicServiceTxtCallback(const hMDNSService p_hService, + MDNSDynamicServiceTxtCallbackFunc p_fnCallback); + + // Add a (dynamic) MDNS TXT item ('key' = 'value') to the service + // Dynamic TXT items are removed right after one-time use. So they need to be added + // every time the value s needed (via callback). + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + const char* p_pcValue); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + uint32_t p_u32Value); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + uint16_t p_u16Value); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + uint8_t p_u8Value); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + int32_t p_i32Value); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + int16_t p_i16Value); + hMDNSTxt addDynamicServiceTxt(hMDNSService p_hService, + const char* p_pcKey, + int8_t p_i8Value); + + // Perform a (static) service query. The function returns after p_u16Timeout milliseconds + // The answers (the number of received answers is returned) can be retrieved by calling + // - answerHostname (or hostname) + // - answerIP (or IP) + // - answerPort (or port) + uint32_t queryService(const char* p_pcService, + const char* p_pcProtocol, + const uint16_t p_u16Timeout = MDNS_QUERYSERVICES_WAIT_TIME); + bool removeQuery(void); + // for compatibility... + uint32_t queryService(String p_strService, + String p_strProtocol); + + const char* answerHostname(const uint32_t p_u32AnswerIndex); + IPAddress answerIP(const uint32_t p_u32AnswerIndex); + uint16_t answerPort(const uint32_t p_u32AnswerIndex); + // for compatibility... + String hostname(const uint32_t p_u32AnswerIndex); + IPAddress IP(const uint32_t p_u32AnswerIndex); + uint16_t port(const uint32_t p_u32AnswerIndex); + + /** + hMDNSServiceQuery (opaque handle to access dynamic service queries) + */ + typedef const void* hMDNSServiceQuery; + + /** + enuServiceQueryAnswerType + */ + typedef enum _enuServiceQueryAnswerType + { + ServiceQueryAnswerType_ServiceDomain = (1 << 0), // Service instance name + ServiceQueryAnswerType_HostDomainAndPort = (1 << 1), // Host domain and service port + ServiceQueryAnswerType_Txts = (1 << 2), // TXT items +#ifdef MDNS_IP4_SUPPORT + ServiceQueryAnswerType_IP4Address = (1 << 3), // IP4 address +#endif +#ifdef MDNS_IP6_SUPPORT + ServiceQueryAnswerType_IP6Address = (1 << 4), // IP6 address +#endif + } enuServiceQueryAnswerType; + + enum class AnswerType : uint32_t + { + Unknown = 0, + ServiceDomain = ServiceQueryAnswerType_ServiceDomain, + HostDomainAndPort = ServiceQueryAnswerType_HostDomainAndPort, + Txt = ServiceQueryAnswerType_Txts, +#ifdef MDNS_IP4_SUPPORT + IP4Address = ServiceQueryAnswerType_IP4Address, +#endif +#ifdef MDNS_IP6_SUPPORT + IP6Address = ServiceQueryAnswerType_IP6Address, +#endif + }; + + /** + MDNSServiceQueryCallbackFn + Callback function for received answers for dynamic service queries + */ + struct MDNSServiceInfo; // forward declaration + typedef std::function MDNSServiceQueryCallbackFunc; + + // Install a dynamic service query. For every received answer (part) the given callback + // function is called. The query will be updated every time, the TTL for an answer + // has timed-out. + // The answers can also be retrieved by calling + // - answerCount + // - answerServiceDomain + // - hasAnswerHostDomain/answerHostDomain + // - hasAnswerIP4Address/answerIP4Address + // - hasAnswerIP6Address/answerIP6Address + // - hasAnswerPort/answerPort + // - hasAnswerTxts/answerTxts + hMDNSServiceQuery installServiceQuery(const char* p_pcService, + const char* p_pcProtocol, + MDNSServiceQueryCallbackFunc p_fnCallback); + // Remove a dynamic service query + bool removeServiceQuery(hMDNSServiceQuery p_hServiceQuery); + + uint32_t answerCount(const hMDNSServiceQuery p_hServiceQuery); + std::vector answerInfo(const MDNSResponder::hMDNSServiceQuery p_hServiceQuery); + + const char* answerServiceDomain(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + bool hasAnswerHostDomain(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + const char* answerHostDomain(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); +#ifdef MDNS_IP4_SUPPORT + bool hasAnswerIP4Address(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + uint32_t answerIP4AddressCount(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + IPAddress answerIP4Address(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex, + const uint32_t p_u32AddressIndex); +#endif +#ifdef MDNS_IP6_SUPPORT + bool hasAnswerIP6Address(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + uint32_t answerIP6AddressCount(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + IPAddress answerIP6Address(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex, + const uint32_t p_u32AddressIndex); +#endif + bool hasAnswerPort(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + uint16_t answerPort(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + bool hasAnswerTxts(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + // Get the TXT items as a ';'-separated string + const char* answerTxts(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + + /** + MDNSProbeResultCallbackFn + Callback function for (host and service domain) probe results + */ + typedef std::function MDNSHostProbeFn; + + typedef std::function MDNSHostProbeFn1; + + typedef std::function MDNSServiceProbeFn; + + typedef std::function MDNSServiceProbeFn1; + + // Set a global callback function for host and service probe results + // The callback function is called, when the probing for the host domain + // (or a service domain, which hasn't got a service specific callback) + // Succeeds or fails. + // In case of failure, the failed domain name should be changed. + bool setHostProbeResultCallback(MDNSHostProbeFn p_fnCallback); + bool setHostProbeResultCallback(MDNSHostProbeFn1 p_fnCallback); + + // Set a service specific probe result callback + bool setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, + MDNSServiceProbeFn p_fnCallback); + bool setServiceProbeResultCallback(const MDNSResponder::hMDNSService p_hService, + MDNSServiceProbeFn1 p_fnCallback); + + // Application should call this whenever AP is configured/disabled + bool notifyAPChange(void); + + // 'update' should be called in every 'loop' to run the MDNS processing + bool update(void); + + // 'announce' can be called every time, the configuration of some service + // changes. Mainly, this would be changed content of TXT items. + bool announce(void); + + // Enable OTA update + hMDNSService enableArduino(uint16_t p_u16Port, + bool p_bAuthUpload = false); + + // Domain name helper + static bool indexDomain(char*& p_rpcDomain, + const char* p_pcDivider = "-", + const char* p_pcDefaultDomain = 0); + + /** STRUCTS **/ + +public: + /** + MDNSServiceInfo, used in application callbacks + */ + struct MDNSServiceInfo + { + MDNSServiceInfo(MDNSResponder& p_pM, MDNSResponder::hMDNSServiceQuery p_hS, uint32_t p_u32A) + : p_pMDNSResponder(p_pM), + p_hServiceQuery(p_hS), + p_u32AnswerIndex(p_u32A) + {}; + struct CompareKey + { + bool operator()(char const *a, char const *b) const + { + return strcmp(a, b) < 0; + } + }; + using KeyValueMap = std::map; + protected: + MDNSResponder& p_pMDNSResponder; + MDNSResponder::hMDNSServiceQuery p_hServiceQuery; + uint32_t p_u32AnswerIndex; + KeyValueMap keyValueMap; + public: + const char* serviceDomain() + { + return p_pMDNSResponder.answerServiceDomain(p_hServiceQuery, p_u32AnswerIndex); + }; + bool hostDomainAvailable() + { + return (p_pMDNSResponder.hasAnswerHostDomain(p_hServiceQuery, p_u32AnswerIndex)); + } + const char* hostDomain() + { + return (hostDomainAvailable()) ? + p_pMDNSResponder.answerHostDomain(p_hServiceQuery, p_u32AnswerIndex) : nullptr; + }; + bool hostPortAvailable() + { + return (p_pMDNSResponder.hasAnswerPort(p_hServiceQuery, p_u32AnswerIndex)); + } + uint16_t hostPort() + { + return (hostPortAvailable()) ? + p_pMDNSResponder.answerPort(p_hServiceQuery, p_u32AnswerIndex) : 0; + }; + bool IP4AddressAvailable() + { + return (p_pMDNSResponder.hasAnswerIP4Address(p_hServiceQuery, p_u32AnswerIndex)); + } + std::vector IP4Adresses() + { + std::vector internalIP; + if (IP4AddressAvailable()) + { + uint16_t cntIP4Adress = p_pMDNSResponder.answerIP4AddressCount(p_hServiceQuery, p_u32AnswerIndex); + for (uint32_t u2 = 0; u2 < cntIP4Adress; ++u2) + { + internalIP.emplace_back(p_pMDNSResponder.answerIP4Address(p_hServiceQuery, p_u32AnswerIndex, u2)); + } + } + return internalIP; + }; + bool txtAvailable() + { + return (p_pMDNSResponder.hasAnswerTxts(p_hServiceQuery, p_u32AnswerIndex)); + } + const char* strKeyValue() + { + return (txtAvailable()) ? + p_pMDNSResponder.answerTxts(p_hServiceQuery, p_u32AnswerIndex) : nullptr; + }; + const KeyValueMap& keyValues() + { + if (txtAvailable() && keyValueMap.size() == 0) + { + for (auto kv = p_pMDNSResponder._answerKeyValue(p_hServiceQuery, p_u32AnswerIndex); kv != nullptr; kv = kv->m_pNext) + { + keyValueMap.emplace(std::pair(kv->m_pcKey, kv->m_pcValue)); + } + } + return keyValueMap; + } + const char* value(const char* key) + { + char* result = nullptr; + + for (stcMDNSServiceTxt* pTxt = p_pMDNSResponder._answerKeyValue(p_hServiceQuery, p_u32AnswerIndex); pTxt; pTxt = pTxt->m_pNext) + { + if ((key) && + (0 == strcmp(pTxt->m_pcKey, key))) + { + result = pTxt->m_pcValue; + break; + } + } + return result; + } + }; +protected: + + /** + stcMDNSServiceTxt + */ + struct stcMDNSServiceTxt + { + stcMDNSServiceTxt* m_pNext; + char* m_pcKey; + char* m_pcValue; + bool m_bTemp; + + stcMDNSServiceTxt(const char* p_pcKey = 0, + const char* p_pcValue = 0, + bool p_bTemp = false); + stcMDNSServiceTxt(const stcMDNSServiceTxt& p_Other); + ~stcMDNSServiceTxt(void); + + stcMDNSServiceTxt& operator=(const stcMDNSServiceTxt& p_Other); + bool clear(void); + + char* allocKey(size_t p_stLength); + bool setKey(const char* p_pcKey, + size_t p_stLength); + bool setKey(const char* p_pcKey); + bool releaseKey(void); + + char* allocValue(size_t p_stLength); + bool setValue(const char* p_pcValue, + size_t p_stLength); + bool setValue(const char* p_pcValue); + bool releaseValue(void); + + bool set(const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp = false); + + bool update(const char* p_pcValue); + + size_t length(void) const; + }; + + /** + stcMDNSTxts + */ + struct stcMDNSServiceTxts + { + stcMDNSServiceTxt* m_pTxts; + + stcMDNSServiceTxts(void); + stcMDNSServiceTxts(const stcMDNSServiceTxts& p_Other); + ~stcMDNSServiceTxts(void); + + stcMDNSServiceTxts& operator=(const stcMDNSServiceTxts& p_Other); + + bool clear(void); + + bool add(stcMDNSServiceTxt* p_pTxt); + bool remove(stcMDNSServiceTxt* p_pTxt); + + bool removeTempTxts(void); + + stcMDNSServiceTxt* find(const char* p_pcKey); + const stcMDNSServiceTxt* find(const char* p_pcKey) const; + stcMDNSServiceTxt* find(const stcMDNSServiceTxt* p_pTxt); + + uint16_t length(void) const; + + size_t c_strLength(void) const; + bool c_str(char* p_pcBuffer); + + size_t bufferLength(void) const; + bool buffer(char* p_pcBuffer); + + bool compare(const stcMDNSServiceTxts& p_Other) const; + bool operator==(const stcMDNSServiceTxts& p_Other) const; + bool operator!=(const stcMDNSServiceTxts& p_Other) const; + }; + + /** + enuContentFlags + */ + typedef enum _enuContentFlags + { + // Host + ContentFlag_A = 0x01, + ContentFlag_PTR_IP4 = 0x02, + ContentFlag_PTR_IP6 = 0x04, + ContentFlag_AAAA = 0x08, + // Service + ContentFlag_PTR_TYPE = 0x10, + ContentFlag_PTR_NAME = 0x20, + ContentFlag_TXT = 0x40, + ContentFlag_SRV = 0x80, + } enuContentFlags; + + /** + stcMDNS_MsgHeader + */ + struct stcMDNS_MsgHeader + { + uint16_t m_u16ID; // Identifier + bool m_1bQR : 1; // Query/Response flag + unsigned char m_4bOpcode : 4; // Operation code + bool m_1bAA : 1; // Authoritative Answer flag + bool m_1bTC : 1; // Truncation flag + bool m_1bRD : 1; // Recursion desired + bool m_1bRA : 1; // Recursion available + unsigned char m_3bZ : 3; // Zero + unsigned char m_4bRCode : 4; // Response code + uint16_t m_u16QDCount; // Question count + uint16_t m_u16ANCount; // Answer count + uint16_t m_u16NSCount; // Authority Record count + uint16_t m_u16ARCount; // Additional Record count + + stcMDNS_MsgHeader(uint16_t p_u16ID = 0, + bool p_bQR = false, + unsigned char p_ucOpcode = 0, + bool p_bAA = false, + bool p_bTC = false, + bool p_bRD = false, + bool p_bRA = false, + unsigned char p_ucRCode = 0, + uint16_t p_u16QDCount = 0, + uint16_t p_u16ANCount = 0, + uint16_t p_u16NSCount = 0, + uint16_t p_u16ARCount = 0); + }; + + /** + stcMDNS_RRDomain + */ + struct stcMDNS_RRDomain + { + char m_acName[MDNS_DOMAIN_MAXLENGTH]; // Encoded domain name + uint16_t m_u16NameLength; // Length (incl. '\0') + + stcMDNS_RRDomain(void); + stcMDNS_RRDomain(const stcMDNS_RRDomain& p_Other); + + stcMDNS_RRDomain& operator=(const stcMDNS_RRDomain& p_Other); + + bool clear(void); + + bool addLabel(const char* p_pcLabel, + bool p_bPrependUnderline = false); + + bool compare(const stcMDNS_RRDomain& p_Other) const; + bool operator==(const stcMDNS_RRDomain& p_Other) const; + bool operator!=(const stcMDNS_RRDomain& p_Other) const; + bool operator>(const stcMDNS_RRDomain& p_Other) const; + + size_t c_strLength(void) const; + bool c_str(char* p_pcBuffer); + }; + + /** + stcMDNS_RRAttributes + */ + struct stcMDNS_RRAttributes + { + uint16_t m_u16Type; // Type + uint16_t m_u16Class; // Class, nearly always 'IN' + + stcMDNS_RRAttributes(uint16_t p_u16Type = 0, + uint16_t p_u16Class = 1 /*DNS_RRCLASS_IN Internet*/); + stcMDNS_RRAttributes(const stcMDNS_RRAttributes& p_Other); + + stcMDNS_RRAttributes& operator=(const stcMDNS_RRAttributes& p_Other); + }; + + /** + stcMDNS_RRHeader + */ + struct stcMDNS_RRHeader + { + stcMDNS_RRDomain m_Domain; + stcMDNS_RRAttributes m_Attributes; + + stcMDNS_RRHeader(void); + stcMDNS_RRHeader(const stcMDNS_RRHeader& p_Other); + + stcMDNS_RRHeader& operator=(const stcMDNS_RRHeader& p_Other); + + bool clear(void); + }; + + /** + stcMDNS_RRQuestion + */ + struct stcMDNS_RRQuestion + { + stcMDNS_RRQuestion* m_pNext; + stcMDNS_RRHeader m_Header; + bool m_bUnicast; // Unicast reply requested + + stcMDNS_RRQuestion(void); + }; + + /** + enuAnswerType + */ + typedef enum _enuAnswerType + { + AnswerType_A, + AnswerType_PTR, + AnswerType_TXT, + AnswerType_AAAA, + AnswerType_SRV, + AnswerType_Generic + } enuAnswerType; + + /** + stcMDNS_RRAnswer + */ + struct stcMDNS_RRAnswer + { + stcMDNS_RRAnswer* m_pNext; + const enuAnswerType m_AnswerType; + stcMDNS_RRHeader m_Header; + bool m_bCacheFlush; // Cache flush command bit + uint32_t m_u32TTL; // Validity time in seconds + + virtual ~stcMDNS_RRAnswer(void); + + enuAnswerType answerType(void) const; + + bool clear(void); + + protected: + stcMDNS_RRAnswer(enuAnswerType p_AnswerType, + const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + }; + +#ifdef MDNS_IP4_SUPPORT + /** + stcMDNS_RRAnswerA + */ + struct stcMDNS_RRAnswerA : public stcMDNS_RRAnswer + { + IPAddress m_IPAddress; + + stcMDNS_RRAnswerA(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerA(void); + + bool clear(void); + }; +#endif + + /** + stcMDNS_RRAnswerPTR + */ + struct stcMDNS_RRAnswerPTR : public stcMDNS_RRAnswer + { + stcMDNS_RRDomain m_PTRDomain; + + stcMDNS_RRAnswerPTR(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerPTR(void); + + bool clear(void); + }; + + /** + stcMDNS_RRAnswerTXT + */ + struct stcMDNS_RRAnswerTXT : public stcMDNS_RRAnswer + { + stcMDNSServiceTxts m_Txts; + + stcMDNS_RRAnswerTXT(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerTXT(void); + + bool clear(void); + }; + +#ifdef MDNS_IP6_SUPPORT + /** + stcMDNS_RRAnswerAAAA + */ + struct stcMDNS_RRAnswerAAAA : public stcMDNS_RRAnswer + { + //TODO: IP6Address m_IPAddress; + + stcMDNS_RRAnswerAAAA(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerAAAA(void); + + bool clear(void); + }; +#endif + + /** + stcMDNS_RRAnswerSRV + */ + struct stcMDNS_RRAnswerSRV : public stcMDNS_RRAnswer + { + uint16_t m_u16Priority; + uint16_t m_u16Weight; + uint16_t m_u16Port; + stcMDNS_RRDomain m_SRVDomain; + + stcMDNS_RRAnswerSRV(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerSRV(void); + + bool clear(void); + }; + + /** + stcMDNS_RRAnswerGeneric + */ + struct stcMDNS_RRAnswerGeneric : public stcMDNS_RRAnswer + { + uint16_t m_u16RDLength; // Length of variable answer + uint8_t* m_pu8RDData; // Offset of start of variable answer in packet + + stcMDNS_RRAnswerGeneric(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL); + ~stcMDNS_RRAnswerGeneric(void); + + bool clear(void); + }; + + + /** + enuProbingStatus + */ + typedef enum _enuProbingStatus + { + ProbingStatus_WaitingForData, + ProbingStatus_ReadyToStart, + ProbingStatus_InProgress, + ProbingStatus_Done + } enuProbingStatus; + + /** + stcProbeInformation + */ + struct stcProbeInformation + { + enuProbingStatus m_ProbingStatus; + uint8_t m_u8SentCount; // Used for probes and announcements + esp8266::polledTimeout::oneShotMs m_Timeout; // Used for probes and announcements + //clsMDNSTimeFlag m_TimeFlag; // Used for probes and announcements + bool m_bConflict; + bool m_bTiebreakNeeded; + MDNSHostProbeFn m_fnHostProbeResultCallback; + MDNSServiceProbeFn m_fnServiceProbeResultCallback; + + stcProbeInformation(void); + + bool clear(bool p_bClearUserdata = false); + }; + + + /** + stcMDNSService + */ + struct stcMDNSService + { + stcMDNSService* m_pNext; + char* m_pcName; + bool m_bAutoName; // Name was set automatically to hostname (if no name was supplied) + char* m_pcService; + char* m_pcProtocol; + uint16_t m_u16Port; + uint8_t m_u8ReplyMask; + stcMDNSServiceTxts m_Txts; + MDNSDynamicServiceTxtCallbackFunc m_fnTxtCallback; + stcProbeInformation m_ProbeInformation; + + stcMDNSService(const char* p_pcName = 0, + const char* p_pcService = 0, + const char* p_pcProtocol = 0); + ~stcMDNSService(void); + + bool setName(const char* p_pcName); + bool releaseName(void); + + bool setService(const char* p_pcService); + bool releaseService(void); + + bool setProtocol(const char* p_pcProtocol); + bool releaseProtocol(void); + }; + + /** + stcMDNSServiceQuery + */ + struct stcMDNSServiceQuery + { + /** + stcAnswer + */ + struct stcAnswer + { + /** + stcTTL + */ + struct stcTTL + { + /** + timeoutLevel_t + */ + typedef uint8_t timeoutLevel_t; + /** + TIMEOUTLEVELs + */ + const timeoutLevel_t TIMEOUTLEVEL_UNSET = 0; + const timeoutLevel_t TIMEOUTLEVEL_BASE = 80; + const timeoutLevel_t TIMEOUTLEVEL_INTERVAL = 5; + const timeoutLevel_t TIMEOUTLEVEL_FINAL = 100; + + uint32_t m_u32TTL; + esp8266::polledTimeout::oneShotMs m_TTLTimeout; + timeoutLevel_t m_timeoutLevel; + + stcTTL(void); + bool set(uint32_t p_u32TTL); + + bool flagged(void); + bool restart(void); + + bool prepareDeletion(void); + bool finalTimeoutLevel(void) const; + + unsigned long timeout(void) const; + }; +#ifdef MDNS_IP4_SUPPORT + /** + stcIP4Address + */ + struct stcIP4Address + { + stcIP4Address* m_pNext; + IPAddress m_IPAddress; + stcTTL m_TTL; + + stcIP4Address(IPAddress p_IPAddress, + uint32_t p_u32TTL = 0); + }; +#endif +#ifdef MDNS_IP6_SUPPORT + /** + stcIP6Address + */ + struct stcIP6Address + { + stcIP6Address* m_pNext; + IP6Address m_IPAddress; + stcTTL m_TTL; + + stcIP6Address(IPAddress p_IPAddress, + uint32_t p_u32TTL = 0); + }; +#endif + + stcAnswer* m_pNext; + // The service domain is the first 'answer' (from PTR answer, using service and protocol) to be set + // Defines the key for additional answer, like host domain, etc. + stcMDNS_RRDomain m_ServiceDomain; // 1. level answer (PTR), eg. MyESP._http._tcp.local + char* m_pcServiceDomain; + stcTTL m_TTLServiceDomain; + stcMDNS_RRDomain m_HostDomain; // 2. level answer (SRV, using service domain), eg. esp8266.local + char* m_pcHostDomain; + uint16_t m_u16Port; // 2. level answer (SRV, using service domain), eg. 5000 + stcTTL m_TTLHostDomainAndPort; + stcMDNSServiceTxts m_Txts; // 2. level answer (TXT, using service domain), eg. c#=1 + char* m_pcTxts; + stcTTL m_TTLTxts; +#ifdef MDNS_IP4_SUPPORT + stcIP4Address* m_pIP4Addresses; // 3. level answer (A, using host domain), eg. 123.456.789.012 +#endif +#ifdef MDNS_IP6_SUPPORT + stcIP6Address* m_pIP6Addresses; // 3. level answer (AAAA, using host domain), eg. 1234::09 +#endif + uint32_t m_u32ContentFlags; + + stcAnswer(void); + ~stcAnswer(void); + + bool clear(void); + + char* allocServiceDomain(size_t p_stLength); + bool releaseServiceDomain(void); + + char* allocHostDomain(size_t p_stLength); + bool releaseHostDomain(void); + + char* allocTxts(size_t p_stLength); + bool releaseTxts(void); + +#ifdef MDNS_IP4_SUPPORT + bool releaseIP4Addresses(void); + bool addIP4Address(stcIP4Address* p_pIP4Address); + bool removeIP4Address(stcIP4Address* p_pIP4Address); + const stcIP4Address* findIP4Address(const IPAddress& p_IPAddress) const; + stcIP4Address* findIP4Address(const IPAddress& p_IPAddress); + uint32_t IP4AddressCount(void) const; + const stcIP4Address* IP4AddressAtIndex(uint32_t p_u32Index) const; + stcIP4Address* IP4AddressAtIndex(uint32_t p_u32Index); +#endif +#ifdef MDNS_IP6_SUPPORT + bool releaseIP6Addresses(void); + bool addIP6Address(stcIP6Address* p_pIP6Address); + bool removeIP6Address(stcIP6Address* p_pIP6Address); + const stcIP6Address* findIP6Address(const IPAddress& p_IPAddress) const; + stcIP6Address* findIP6Address(const IPAddress& p_IPAddress); + uint32_t IP6AddressCount(void) const; + const stcIP6Address* IP6AddressAtIndex(uint32_t p_u32Index) const; + stcIP6Address* IP6AddressAtIndex(uint32_t p_u32Index); +#endif + }; + + stcMDNSServiceQuery* m_pNext; + stcMDNS_RRDomain m_ServiceTypeDomain; // eg. _http._tcp.local + MDNSServiceQueryCallbackFunc m_fnCallback; + bool m_bLegacyQuery; + uint8_t m_u8SentCount; + esp8266::polledTimeout::oneShotMs m_ResendTimeout; + bool m_bAwaitingAnswers; + stcAnswer* m_pAnswers; + + stcMDNSServiceQuery(void); + ~stcMDNSServiceQuery(void); + + bool clear(void); + + uint32_t answerCount(void) const; + const stcAnswer* answerAtIndex(uint32_t p_u32Index) const; + stcAnswer* answerAtIndex(uint32_t p_u32Index); + uint32_t indexOfAnswer(const stcAnswer* p_pAnswer) const; + + bool addAnswer(stcAnswer* p_pAnswer); + bool removeAnswer(stcAnswer* p_pAnswer); + + stcAnswer* findAnswerForServiceDomain(const stcMDNS_RRDomain& p_ServiceDomain); + stcAnswer* findAnswerForHostDomain(const stcMDNS_RRDomain& p_HostDomain); + }; + + /** + stcMDNSSendParameter + */ + struct stcMDNSSendParameter + { + protected: + /** + stcDomainCacheItem + */ + struct stcDomainCacheItem + { + stcDomainCacheItem* m_pNext; + const void* m_pHostnameOrService; // Opaque id for host or service domain (pointer) + bool m_bAdditionalData; // Opaque flag for special info (service domain included) + uint16_t m_u16Offset; // Offset in UDP output buffer + + stcDomainCacheItem(const void* p_pHostnameOrService, + bool p_bAdditionalData, + uint32_t p_u16Offset); + }; + + public: + uint16_t m_u16ID; // Query ID (used only in lagacy queries) + stcMDNS_RRQuestion* m_pQuestions; // A list of queries + uint8_t m_u8HostReplyMask; // Flags for reply components/answers + bool m_bLegacyQuery; // Flag: Legacy query + bool m_bResponse; // Flag: Response to a query + bool m_bAuthorative; // Flag: Authorative (owner) response + bool m_bCacheFlush; // Flag: Clients should flush their caches + bool m_bUnicast; // Flag: Unicast response + bool m_bUnannounce; // Flag: Unannounce service + uint16_t m_u16Offset; // Current offset in UDP write buffer (mainly for domain cache) + stcDomainCacheItem* m_pDomainCacheItems; // Cached host and service domains + + stcMDNSSendParameter(void); + ~stcMDNSSendParameter(void); + + bool clear(void); + + bool shiftOffset(uint16_t p_u16Shift); + + bool addDomainCacheItem(const void* p_pHostnameOrService, + bool p_bAdditionalData, + uint16_t p_u16Offset); + uint16_t findCachedDomainOffset(const void* p_pHostnameOrService, + bool p_bAdditionalData) const; + }; + + // Instance variables + stcMDNSService* m_pServices; + UdpContext* m_pUDPContext; + char* m_pcHostname; + stcMDNSServiceQuery* m_pServiceQueries; + WiFiEventHandler m_DisconnectedHandler; + WiFiEventHandler m_GotIPHandler; + MDNSDynamicServiceTxtCallbackFunc m_fnServiceTxtCallback; + bool m_bPassivModeEnabled; + stcProbeInformation m_HostProbeInformation; + CONST netif* m_netif; // network interface to run on + + /** CONTROL **/ + /* MAINTENANCE */ + bool _process(bool p_bUserContext); + bool _restart(void); + + /* RECEIVING */ + bool _parseMessage(void); + bool _parseQuery(const stcMDNS_MsgHeader& p_Header); + + bool _parseResponse(const stcMDNS_MsgHeader& p_Header); + bool _processAnswers(const stcMDNS_RRAnswer* p_pPTRAnswers); + bool _processPTRAnswer(const stcMDNS_RRAnswerPTR* p_pPTRAnswer, + bool& p_rbFoundNewKeyAnswer); + bool _processSRVAnswer(const stcMDNS_RRAnswerSRV* p_pSRVAnswer, + bool& p_rbFoundNewKeyAnswer); + bool _processTXTAnswer(const stcMDNS_RRAnswerTXT* p_pTXTAnswer); +#ifdef MDNS_IP4_SUPPORT + bool _processAAnswer(const stcMDNS_RRAnswerA* p_pAAnswer); +#endif +#ifdef MDNS_IP6_SUPPORT + bool _processAAAAAnswer(const stcMDNS_RRAnswerAAAA* p_pAAAAAnswer); +#endif + + /* PROBING */ + bool _updateProbeStatus(void); + bool _resetProbeStatus(bool p_bRestart = true); + bool _hasProbesWaitingForAnswers(void) const; + bool _sendHostProbe(void); + bool _sendServiceProbe(stcMDNSService& p_rService); + bool _cancelProbingForHost(void); + bool _cancelProbingForService(stcMDNSService& p_rService); + + /* ANNOUNCE */ + bool _announce(bool p_bAnnounce, + bool p_bIncludeServices); + bool _announceService(stcMDNSService& p_rService, + bool p_bAnnounce = true); + + /* SERVICE QUERY CACHE */ + bool _hasServiceQueriesWaitingForAnswers(void) const; + bool _checkServiceQueryCache(void); + + /** TRANSFER **/ + /* SENDING */ + bool _sendMDNSMessage(stcMDNSSendParameter& p_SendParameter); + bool _sendMDNSMessage_Multicast(MDNSResponder::stcMDNSSendParameter& p_rSendParameter); + bool _prepareMDNSMessage(stcMDNSSendParameter& p_SendParameter, + IPAddress p_IPAddress); + bool _sendMDNSServiceQuery(const stcMDNSServiceQuery& p_ServiceQuery); + bool _sendMDNSQuery(const stcMDNS_RRDomain& p_QueryDomain, + uint16_t p_u16QueryType, + stcMDNSServiceQuery::stcAnswer* p_pKnownAnswers = 0); + + const IPAddress _getResponseMulticastInterface() const + { + return IPAddress(m_netif->ip_addr); + } + + uint8_t _replyMaskForHost(const stcMDNS_RRHeader& p_RRHeader, + bool* p_pbFullNameMatch = 0) const; + uint8_t _replyMaskForService(const stcMDNS_RRHeader& p_RRHeader, + const stcMDNSService& p_Service, + bool* p_pbFullNameMatch = 0) const; + + /* RESOURCE RECORD */ + bool _readRRQuestion(stcMDNS_RRQuestion& p_rQuestion); + bool _readRRAnswer(stcMDNS_RRAnswer*& p_rpAnswer); +#ifdef MDNS_IP4_SUPPORT + bool _readRRAnswerA(stcMDNS_RRAnswerA& p_rRRAnswerA, + uint16_t p_u16RDLength); +#endif + bool _readRRAnswerPTR(stcMDNS_RRAnswerPTR& p_rRRAnswerPTR, + uint16_t p_u16RDLength); + bool _readRRAnswerTXT(stcMDNS_RRAnswerTXT& p_rRRAnswerTXT, + uint16_t p_u16RDLength); +#ifdef MDNS_IP6_SUPPORT + bool _readRRAnswerAAAA(stcMDNS_RRAnswerAAAA& p_rRRAnswerAAAA, + uint16_t p_u16RDLength); +#endif + bool _readRRAnswerSRV(stcMDNS_RRAnswerSRV& p_rRRAnswerSRV, + uint16_t p_u16RDLength); + bool _readRRAnswerGeneric(stcMDNS_RRAnswerGeneric& p_rRRAnswerGeneric, + uint16_t p_u16RDLength); + + bool _readRRHeader(stcMDNS_RRHeader& p_rHeader); + bool _readRRDomain(stcMDNS_RRDomain& p_rRRDomain); + bool _readRRDomain_Loop(stcMDNS_RRDomain& p_rRRDomain, + uint8_t p_u8Depth); + bool _readRRAttributes(stcMDNS_RRAttributes& p_rAttributes); + + /* DOMAIN NAMES */ + bool _buildDomainForHost(const char* p_pcHostname, + stcMDNS_RRDomain& p_rHostDomain) const; + bool _buildDomainForDNSSD(stcMDNS_RRDomain& p_rDNSSDDomain) const; + bool _buildDomainForService(const stcMDNSService& p_Service, + bool p_bIncludeName, + stcMDNS_RRDomain& p_rServiceDomain) const; + bool _buildDomainForService(const char* p_pcService, + const char* p_pcProtocol, + stcMDNS_RRDomain& p_rServiceDomain) const; +#ifdef MDNS_IP4_SUPPORT + bool _buildDomainForReverseIP4(IPAddress p_IP4Address, + stcMDNS_RRDomain& p_rReverseIP4Domain) const; +#endif +#ifdef MDNS_IP6_SUPPORT + bool _buildDomainForReverseIP6(IPAddress p_IP4Address, + stcMDNS_RRDomain& p_rReverseIP6Domain) const; +#endif + + /* UDP */ + bool _udpReadBuffer(unsigned char* p_pBuffer, + size_t p_stLength); + bool _udpRead8(uint8_t& p_ru8Value); + bool _udpRead16(uint16_t& p_ru16Value); + bool _udpRead32(uint32_t& p_ru32Value); + + bool _udpAppendBuffer(const unsigned char* p_pcBuffer, + size_t p_stLength); + bool _udpAppend8(uint8_t p_u8Value); + bool _udpAppend16(uint16_t p_u16Value); + bool _udpAppend32(uint32_t p_u32Value); + +#if not defined ESP_8266_MDNS_INCLUDE || defined DEBUG_ESP_MDNS_RESPONDER + bool _udpDump(bool p_bMovePointer = false); + bool _udpDump(unsigned p_uOffset, + unsigned p_uLength); +#endif + + /* READ/WRITE MDNS STRUCTS */ + bool _readMDNSMsgHeader(stcMDNS_MsgHeader& p_rMsgHeader); + + bool _write8(uint8_t p_u8Value, + stcMDNSSendParameter& p_rSendParameter); + bool _write16(uint16_t p_u16Value, + stcMDNSSendParameter& p_rSendParameter); + bool _write32(uint32_t p_u32Value, + stcMDNSSendParameter& p_rSendParameter); + + bool _writeMDNSMsgHeader(const stcMDNS_MsgHeader& p_MsgHeader, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSRRAttributes(const stcMDNS_RRAttributes& p_Attributes, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSRRDomain(const stcMDNS_RRDomain& p_Domain, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSHostDomain(const char* m_pcHostname, + bool p_bPrependRDLength, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSServiceDomain(const stcMDNSService& p_Service, + bool p_bIncludeName, + bool p_bPrependRDLength, + stcMDNSSendParameter& p_rSendParameter); + + bool _writeMDNSQuestion(stcMDNS_RRQuestion& p_Question, + stcMDNSSendParameter& p_rSendParameter); + +#ifdef MDNS_IP4_SUPPORT + bool _writeMDNSAnswer_A(IPAddress p_IPAddress, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSAnswer_PTR_IP4(IPAddress p_IPAddress, + stcMDNSSendParameter& p_rSendParameter); +#endif + bool _writeMDNSAnswer_PTR_TYPE(stcMDNSService& p_rService, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSAnswer_PTR_NAME(stcMDNSService& p_rService, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSAnswer_TXT(stcMDNSService& p_rService, + stcMDNSSendParameter& p_rSendParameter); +#ifdef MDNS_IP6_SUPPORT + bool _writeMDNSAnswer_AAAA(IPAddress p_IPAddress, + stcMDNSSendParameter& p_rSendParameter); + bool _writeMDNSAnswer_PTR_IP6(IPAddress p_IPAddress, + stcMDNSSendParameter& p_rSendParameter); +#endif + bool _writeMDNSAnswer_SRV(stcMDNSService& p_rService, + stcMDNSSendParameter& p_rSendParameter); + + /** HELPERS **/ + /* UDP CONTEXT */ + bool _callProcess(void); + bool _allocUDPContext(void); + bool _releaseUDPContext(void); + + /* SERVICE QUERY */ + stcMDNSServiceQuery* _allocServiceQuery(void); + bool _removeServiceQuery(stcMDNSServiceQuery* p_pServiceQuery); + bool _removeLegacyServiceQuery(void); + stcMDNSServiceQuery* _findServiceQuery(hMDNSServiceQuery p_hServiceQuery); + stcMDNSServiceQuery* _findLegacyServiceQuery(void); + bool _releaseServiceQueries(void); + stcMDNSServiceQuery* _findNextServiceQueryByServiceType(const stcMDNS_RRDomain& p_ServiceDomain, + const stcMDNSServiceQuery* p_pPrevServiceQuery); + + /* HOSTNAME */ + bool _setHostname(const char* p_pcHostname); + bool _releaseHostname(void); + + /* SERVICE */ + stcMDNSService* _allocService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol, + uint16_t p_u16Port); + bool _releaseService(stcMDNSService* p_pService); + bool _releaseServices(void); + + stcMDNSService* _findService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol); + stcMDNSService* _findService(const hMDNSService p_hService); + + size_t _countServices(void) const; + + /* SERVICE TXT */ + stcMDNSServiceTxt* _allocServiceTxt(stcMDNSService* p_pService, + const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp); + bool _releaseServiceTxt(stcMDNSService* p_pService, + stcMDNSServiceTxt* p_pTxt); + stcMDNSServiceTxt* _updateServiceTxt(stcMDNSService* p_pService, + stcMDNSServiceTxt* p_pTxt, + const char* p_pcValue, + bool p_bTemp); + + stcMDNSServiceTxt* _findServiceTxt(stcMDNSService* p_pService, + const char* p_pcKey); + stcMDNSServiceTxt* _findServiceTxt(stcMDNSService* p_pService, + const hMDNSTxt p_hTxt); + + stcMDNSServiceTxt* _addServiceTxt(stcMDNSService* p_pService, + const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp); + + stcMDNSServiceTxt* _answerKeyValue(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex); + + bool _collectServiceTxts(stcMDNSService& p_rService); + bool _releaseTempServiceTxts(stcMDNSService& p_rService); + const stcMDNSServiceTxt* _serviceTxts(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol); + + /* MISC */ +#if not defined ESP_8266_MDNS_INCLUDE || defined DEBUG_ESP_MDNS_RESPONDER + bool _printRRDomain(const stcMDNS_RRDomain& p_rRRDomain) const; + bool _printRRAnswer(const MDNSResponder::stcMDNS_RRAnswer& p_RRAnswer) const; +#endif +}; + +}// namespace MDNSImplementation + +}// namespace esp8266 + +#endif // MDNS_H diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp index 61beb7339..41e9524ab 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp @@ -1,1832 +1,2134 @@ -/* - * LEAmDNS_Control.cpp - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include -#include -#include -#include -#include -#include - -/* - * ESP8266mDNS Control.cpp - */ - -extern "C" { - #include "user_interface.h" -} - -#include "LEAmDNS_lwIPdefs.h" -#include "LEAmDNS_Priv.h" - -namespace esp8266 { -/* - * LEAmDNS - */ -namespace MDNSImplementation { - -/** - * CONTROL - */ - - -/** - * MAINTENANCE - */ - -/* - * MDNSResponder::_process - * - * Run the MDNS process. - * Is called, every time the UDPContext receives data AND - * should be called in every 'loop' by calling 'MDNS::update()'. - * - */ -bool MDNSResponder::_process(bool p_bUserContext) { - - bool bResult = true; - - if (!p_bUserContext) { - - if ((m_pUDPContext) && // UDPContext available AND - (m_pUDPContext->next())) { // has content - - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _update: Calling _parseMessage\n"));); - bResult = _parseMessage(); - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parsePacket %s\n"), (bResult ? "succeeded" : "FAILED"));); - } - } - else { - bResult = (m_netif != nullptr) && - (m_netif->flags & NETIF_FLAG_UP) && // network interface is up and running +/* + LEAmDNS_Control.cpp + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include +#include +#include +#include +#include +#include + +/* + ESP8266mDNS Control.cpp +*/ + +extern "C" { +#include "user_interface.h" +} + +#include "LEAmDNS_lwIPdefs.h" +#include "LEAmDNS_Priv.h" + +namespace esp8266 +{ +/* + LEAmDNS +*/ +namespace MDNSImplementation +{ + +/** + CONTROL +*/ + + +/** + MAINTENANCE +*/ + +/* + MDNSResponder::_process + + Run the MDNS process. + Is called, every time the UDPContext receives data AND + should be called in every 'loop' by calling 'MDNS::update()'. + +*/ +bool MDNSResponder::_process(bool p_bUserContext) +{ + + bool bResult = true; + + if (!p_bUserContext) + { + + if ((m_pUDPContext) && // UDPContext available AND + (m_pUDPContext->next())) // has content + { + + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _update: Calling _parseMessage\n"));); + bResult = _parseMessage(); + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parsePacket %s\n"), (bResult ? "succeeded" : "FAILED"));); + } + } + else + { + bResult = (m_netif != nullptr) && + (m_netif->flags & NETIF_FLAG_UP) && // network interface is up and running _updateProbeStatus() && // Probing _checkServiceQueryCache(); // Service query cache check - } - return bResult; -} - -/* - * MDNSResponder::_restart - */ -bool MDNSResponder::_restart(void) { - - return ((m_netif != nullptr) && - (m_netif->flags & NETIF_FLAG_UP) && // network interface is up and running - (_resetProbeStatus(true)) && // Stop and restart probing - (_allocUDPContext())); // Restart UDP -} - - -/** - * RECEIVING - */ - -/* - * MDNSResponder::_parseMessage - */ -bool MDNSResponder::_parseMessage(void) { - DEBUG_EX_INFO( - unsigned long ulStartTime = millis(); - unsigned uStartMemory = ESP.getFreeHeap(); - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage (Time: %lu ms, heap: %u bytes, from %s(%u), to %s(%u))\n"), ulStartTime, uStartMemory, - IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), m_pUDPContext->getRemotePort(), - IPAddress(m_pUDPContext->getDestAddress()).toString().c_str(), m_pUDPContext->getLocalPort()); - ); - //DEBUG_EX_INFO(_udpDump();); - - bool bResult = false; - - stcMDNS_MsgHeader header; - if (_readMDNSMsgHeader(header)) { - if (0 == header.m_4bOpcode) { // A standard query - if (header.m_1bQR) { // Received a response -> answers to a query - //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Reading answers: ID:%u, Q:%u, A:%u, NS:%u, AR:%u\n"), header.m_u16ID, header.m_u16QDCount, header.m_u16ANCount, header.m_u16NSCount, header.m_u16ARCount);); - bResult = _parseResponse(header); - } - else { // Received a query (Questions) - //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Reading query: ID:%u, Q:%u, A:%u, NS:%u, AR:%u\n"), header.m_u16ID, header.m_u16QDCount, header.m_u16ANCount, header.m_u16NSCount, header.m_u16ARCount);); - bResult = _parseQuery(header); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Received UNEXPECTED opcode:%u. Ignoring message!\n"), header.m_4bOpcode);); - m_pUDPContext->flush(); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: FAILED to read header\n"));); - m_pUDPContext->flush(); - } - DEBUG_EX_INFO( - unsigned uFreeHeap = ESP.getFreeHeap(); - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Done (%s after %lu ms, ate %i bytes, remaining %u)\n\n"), (bResult ? "Succeeded" : "FAILED"), (millis() - ulStartTime), (uStartMemory - uFreeHeap), uFreeHeap); - ); - return bResult; -} - -/* - * MDNSResponder::_parseQuery - * - * Queries are of interest in two cases: - * 1. allow for tiebreaking while probing in the case of a race condition between two instances probing for - * the same name at the same time - * 2. provide answers to questions for our host domain or any presented service - * - * When reading the questions, a set of (planned) responses is created, eg. a reverse PTR question for the host domain - * gets an A (IP address) response, a PTR question for the _services._dns-sd domain gets a PTR (type) response for any - * registered service, ... - * - * As any mDNS responder should be able to handle 'legacy' queries (from DNS clients), this case is handled here also. - * Legacy queries have got only one (unicast) question and are directed to the local DNS port (not the multicast port). - * - * 1. - */ -bool MDNSResponder::_parseQuery(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader) { - - bool bResult = true; - - stcMDNSSendParameter sendParameter; - uint8_t u8HostOrServiceReplies = 0; - for (uint16_t qd=0; ((bResult) && (qdm_pNext) { - // Define service replies, BUT only answer queries after probing is done - uint8_t u8ReplyMaskForQuestion = (((m_bPassivModeEnabled) || - (ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus)) - ? _replyMaskForService(questionRR.m_Header, *pService, 0) - : 0); - u8HostOrServiceReplies |= (pService->m_u8ReplyMask |= u8ReplyMaskForQuestion); - DEBUG_EX_INFO(if (u8ReplyMaskForQuestion) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service reply needed for (%s.%s.%s): 0x%X (%s)\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol, u8ReplyMaskForQuestion, IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str()); } ); - - // Check tiebreak need for service domain - if (ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) { - bool bFullNameMatch = false; - if ((_replyMaskForService(questionRR.m_Header, *pService, &bFullNameMatch)) && - (bFullNameMatch)) { - // We're in 'probing' state and someone is asking for this service domain: this might be - // a race-condition: Two services with the same domain names try simutanously to probe their domains - // See: RFC 6762, 8.2 (Tiebraking) - // However, we're using a max. reduced approach for tiebreaking here: The 'higher' SRV host wins! - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Possible race-condition for service domain %s.%s.%s detected while probing.\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); - - pService->m_ProbeInformation.m_bTiebreakNeeded = true; - } - } - } - - // Handle unicast and legacy specialities - // If only one question asks for unicast reply, the whole reply packet is send unicast - if (((DNS_MQUERY_PORT != m_pUDPContext->getRemotePort()) || // Unicast (maybe legacy) query OR - (questionRR.m_bUnicast)) && // Expressivly unicast query - (!sendParameter.m_bUnicast)) { - - sendParameter.m_bUnicast = true; - sendParameter.m_bCacheFlush = false; - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Unicast response for %s!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str());); - - if ((DNS_MQUERY_PORT != m_pUDPContext->getRemotePort()) && // Unicast (maybe legacy) query AND - (1 == p_MsgHeader.m_u16QDCount) && // Only one question AND - ((sendParameter.m_u8HostReplyMask) || // Host replies OR - (u8HostOrServiceReplies))) { // Host or service replies available - // We're a match for this legacy query, BUT - // make sure, that the query comes from a local host - ip_info IPInfo_Local; - ip_info IPInfo_Remote; - if (((IPInfo_Remote.ip.addr = m_pUDPContext->getRemoteAddress())) && - (((wifi_get_ip_info(SOFTAP_IF, &IPInfo_Local)) && - (ip4_addr_netcmp(&IPInfo_Remote.ip, &IPInfo_Local.ip, &IPInfo_Local.netmask))) || // Remote IP in SOFTAP's subnet OR - ((wifi_get_ip_info(STATION_IF, &IPInfo_Local)) && - (ip4_addr_netcmp(&IPInfo_Remote.ip, &IPInfo_Local.ip, &IPInfo_Local.netmask))))) { // Remote IP in STATION's subnet - - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from local host %s, id %u!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), p_MsgHeader.m_u16ID);); - - sendParameter.m_u16ID = p_MsgHeader.m_u16ID; - sendParameter.m_bLegacyQuery = true; - sendParameter.m_pQuestions = new stcMDNS_RRQuestion; - if ((bResult = (0 != sendParameter.m_pQuestions))) { - sendParameter.m_pQuestions->m_Header.m_Domain = questionRR.m_Header.m_Domain; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = questionRR.m_Header.m_Attributes.m_u16Type; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = questionRR.m_Header.m_Attributes.m_u16Class; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to add legacy question!\n"));); - } - } - else { - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from NON-LOCAL host!\n"));); - bResult = false; - } - } - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to read question!\n"));); - } - } // for questions - - //DEBUG_EX_INFO(if (u8HostOrServiceReplies) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Reply needed: %u (%s: %s->%s)\n"), u8HostOrServiceReplies, clsTimeSyncer::timestr(), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), IPAddress(m_pUDPContext->getDestAddress()).toString().c_str()); } ); - - // Handle known answers - uint32_t u32Answers = (p_MsgHeader.m_u16ANCount + p_MsgHeader.m_u16NSCount + p_MsgHeader.m_u16ARCount); - DEBUG_EX_INFO(if ((u8HostOrServiceReplies) && (u32Answers)) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Known answers(%u):\n"), u32Answers); } ); - - for (uint32_t an=0; ((bResult) && (anm_Header.m_Attributes.m_u16Type) && // No ANY type answer - (DNS_RRCLASS_ANY != pKnownRRAnswer->m_Header.m_Attributes.m_u16Class)) { // No ANY class answer - - // Find match between planned answer (sendParameter.m_u8HostReplyMask) and this 'known answer' - uint8_t u8HostMatchMask = (sendParameter.m_u8HostReplyMask & _replyMaskForHost(pKnownRRAnswer->m_Header)); - if ((u8HostMatchMask) && // The RR in the known answer matches an RR we are planning to send, AND - ((MDNS_HOST_TTL / 2) <= pKnownRRAnswer->m_u32TTL)) { // The TTL of the known answer is longer than half of the new host TTL (120s) - - // Compare contents - if (AnswerType_PTR == pKnownRRAnswer->answerType()) { - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain == hostDomain)) { - // Host domain match -#ifdef MDNS_IP4_SUPPORT - if (u8HostMatchMask & ContentFlag_PTR_IP4) { - // IP4 PTR was asked for, but is already known -> skipping - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP4 PTR already known... skipping!\n"));); - sendParameter.m_u8HostReplyMask &= ~ContentFlag_PTR_IP4; - } -#endif -#ifdef MDNS_IP6_SUPPORT - if (u8HostMatchMask & ContentFlag_PTR_IP6) { - // IP6 PTR was asked for, but is already known -> skipping - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP6 PTR already known... skipping!\n"));); - sendParameter.m_u8HostReplyMask &= ~ContentFlag_PTR_IP6; - } -#endif - } - } - else if (u8HostMatchMask & ContentFlag_A) { - // IP4 address was asked for -#ifdef MDNS_IP4_SUPPORT - if ((AnswerType_A == pKnownRRAnswer->answerType()) && - (((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress == _getResponseMulticastInterface())) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP4 address already known... skipping!\n"));); - sendParameter.m_u8HostReplyMask &= ~ContentFlag_A; - } // else: RData NOT IP4 length !! -#endif - } - else if (u8HostMatchMask & ContentFlag_AAAA) { - // IP6 address was asked for -#ifdef MDNS_IP6_SUPPORT - if ((AnswerType_AAAA == pAnswerRR->answerType()) && - (((stcMDNS_RRAnswerAAAA*)pAnswerRR)->m_IPAddress == _getResponseMulticastInterface())) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP6 address already known... skipping!\n"));); - sendParameter.m_u8HostReplyMask &= ~ContentFlag_AAAA; - } // else: RData NOT IP6 length !! -#endif - } - } // Host match /*and TTL*/ - - // - // Check host tiebreak possibility - if (m_HostProbeInformation.m_bTiebreakNeeded) { - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (pKnownRRAnswer->m_Header.m_Domain == hostDomain)) { - // Host domain match -#ifdef MDNS_IP4_SUPPORT - if (AnswerType_A == pKnownRRAnswer->answerType()) { - IPAddress localIPAddress(_getResponseMulticastInterface()); - if (((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress == localIPAddress) { - // SAME IP address -> We've received an old message from ourselfs (same IP) - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) WON (was an old message)!\n"));); - m_HostProbeInformation.m_bTiebreakNeeded = false; - } - else { - if ((uint32_t)(((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress) > (uint32_t)localIPAddress) { // The OTHER IP is 'higher' -> LOST - // LOST tiebreak - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) LOST (lower)!\n"));); - _cancelProbingForHost(); - m_HostProbeInformation.m_bTiebreakNeeded = false; - } - else { // WON tiebreak - //TiebreakState = TiebreakState_Won; // We received an 'old' message from ourselfs -> Just ignore - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) WON (higher IP)!\n"));); - m_HostProbeInformation.m_bTiebreakNeeded = false; - } - } - } -#endif -#ifdef MDNS_IP6_SUPPORT - if (AnswerType_AAAA == pAnswerRR->answerType()) { - // TODO - } -#endif - } - } // Host tiebreak possibility - - // Check service answers - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - - uint8_t u8ServiceMatchMask = (pService->m_u8ReplyMask & _replyMaskForService(pKnownRRAnswer->m_Header, *pService)); - - if ((u8ServiceMatchMask) && // The RR in the known answer matches an RR we are planning to send, AND - ((MDNS_SERVICE_TTL / 2) <= pKnownRRAnswer->m_u32TTL)) { // The TTL of the known answer is longer than half of the new service TTL (4500s) - - if (AnswerType_PTR == pKnownRRAnswer->answerType()) { - stcMDNS_RRDomain serviceDomain; - if ((u8ServiceMatchMask & ContentFlag_PTR_TYPE) && - (_buildDomainForService(*pService, false, serviceDomain)) && - (serviceDomain == ((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain)) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service type PTR already known... skipping!\n"));); - pService->m_u8ReplyMask &= ~ContentFlag_PTR_TYPE; - } - if ((u8ServiceMatchMask & ContentFlag_PTR_NAME) && - (_buildDomainForService(*pService, true, serviceDomain)) && - (serviceDomain == ((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain)) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service name PTR already known... skipping!\n"));); - pService->m_u8ReplyMask &= ~ContentFlag_PTR_NAME; - } - } - else if (u8ServiceMatchMask & ContentFlag_SRV) { - DEBUG_EX_ERR(if (AnswerType_SRV != pKnownRRAnswer->answerType()) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: ERROR! INVALID answer type (SRV)!\n"));); - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (hostDomain == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain)) { // Host domain match - - if ((MDNS_SRV_PRIORITY == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Priority) && - (MDNS_SRV_WEIGHT == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Weight) && - (pService->m_u16Port == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Port)) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service SRV answer already known... skipping!\n"));); - pService->m_u8ReplyMask &= ~ContentFlag_SRV; - } // else: Small differences -> send update message - } - } - else if (u8ServiceMatchMask & ContentFlag_TXT) { - DEBUG_EX_ERR(if (AnswerType_TXT != pKnownRRAnswer->answerType()) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: ERROR! INVALID answer type (TXT)!\n"));); - _collectServiceTxts(*pService); - if (pService->m_Txts == ((stcMDNS_RRAnswerTXT*)pKnownRRAnswer)->m_Txts) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service TXT answer already known... skipping!\n"));); - pService->m_u8ReplyMask &= ~ContentFlag_TXT; - } - _releaseTempServiceTxts(*pService); - } - } // Service match and enough TTL - - // - // Check service tiebreak possibility - if (pService->m_ProbeInformation.m_bTiebreakNeeded) { - stcMDNS_RRDomain serviceDomain; - if ((_buildDomainForService(*pService, true, serviceDomain)) && - (pKnownRRAnswer->m_Header.m_Domain == serviceDomain)) { - // Service domain match - if (AnswerType_SRV == pKnownRRAnswer->answerType()) { - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (hostDomain == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain)) { // Host domain match - - // We've received an old message from ourselfs (same SRV) - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) won (was an old message)!\n"));); - pService->m_ProbeInformation.m_bTiebreakNeeded = false; - } - else { - if (((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain > hostDomain) { // The OTHER domain is 'higher' -> LOST - // LOST tiebreak - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) LOST (lower)!\n"));); - _cancelProbingForService(*pService); - pService->m_ProbeInformation.m_bTiebreakNeeded = false; - } - else { // WON tiebreak - //TiebreakState = TiebreakState_Won; // We received an 'old' message from ourselfs -> Just ignore - DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) won (higher)!\n"));); - pService->m_ProbeInformation.m_bTiebreakNeeded = false; - } - } - } - } - } // service tiebreak possibility - } // for services - } // ANY answers - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to read known answer!\n"));); - } - - if (pKnownRRAnswer) { - delete pKnownRRAnswer; - pKnownRRAnswer = 0; - } - } // for answers - - if (bResult) { - // Check, if a reply is needed - uint8_t u8ReplyNeeded = sendParameter.m_u8HostReplyMask; - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - u8ReplyNeeded |= pService->m_u8ReplyMask; - } - - if (u8ReplyNeeded) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Sending answer(0x%X)...\n"), u8ReplyNeeded);); - - sendParameter.m_bResponse = true; - sendParameter.m_bAuthorative = true; - - bResult = _sendMDNSMessage(sendParameter); - } - DEBUG_EX_INFO( - else { - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: No reply needed\n")); - } - ); - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Something FAILED!\n"));); - m_pUDPContext->flush(); - } - - // - // Check and reset tiebreak-states - if (m_HostProbeInformation.m_bTiebreakNeeded) { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: UNSOLVED tiebreak-need for host domain!\n"));); - m_HostProbeInformation.m_bTiebreakNeeded = false; - } - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - if (pService->m_ProbeInformation.m_bTiebreakNeeded) { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: UNSOLVED tiebreak-need for service domain (%s.%s.%s)\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); - pService->m_ProbeInformation.m_bTiebreakNeeded = false; - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_parseResponse - * - * Responses are of interest in two cases: - * 1. find domain name conflicts while probing - * 2. get answers to service queries - * - * In both cases any included questions are ignored - * - * 1. If any answer has a domain name similar to one of the domain names we're planning to use (and are probing for), - * then we've got a 'probing conflict'. The conflict has to be solved on our side of the conflict (eg. by - * setting a new hostname and restart probing). The callback 'm_fnProbeResultCallback' is called with - * 'p_bProbeResult=false' in this case. - * - * 2. Service queries like '_http._tcp.local' will (if available) produce PTR, SRV, TXT and A/AAAA answers. - * All stored answers are pivoted by the service instance name (from the PTR record). Other answer parts, - * like host domain or IP address are than attached to this element. - * Any answer part carries a TTL, this is also stored (incl. the reception time); if the TTL is '0' the - * answer (part) is withdrawn by the sender and should be removed from any cache. RFC 6762, 10.1 proposes to - * set the caches TTL-value to 1 second in such a case and to delete the item only, if no update has - * has taken place in this second. - * Answer parts may arrive in 'unsorted' order, so they are grouped into three levels: - * Level 1: PRT - names the service instance (and is used as pivot), voids all other parts if is withdrawn or outdates - * Level 2: SRV - links the instance name to a host domain and port, voids A/AAAA parts if is withdrawn or outdates - * TXT - links the instance name to services TXTs - * Level 3: A/AAAA - links the host domain to an IP address - */ -bool MDNSResponder::_parseResponse(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse\n"));); - //DEBUG_EX_INFO(_udpDump();); - - bool bResult = false; - - // A response should be the result of a query or a probe - if ((_hasServiceQueriesWaitingForAnswers()) || // Waiting for query answers OR - (_hasProbesWaitingForAnswers())) { // Probe responses - - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: Received a response\n")); - //_udpDump(); - ); - - bResult = true; - // - // Ignore questions here - stcMDNS_RRQuestion dummyRRQ; - for (uint16_t qd=0; ((bResult) && (qdm_pNext = pCollectedRRAnswers; - pCollectedRRAnswers = pRRAnswer; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED to read answer!\n"));); - if (pRRAnswer) { - delete pRRAnswer; - pRRAnswer = 0; - } - bResult = false; - } - } // for answers - - // - // Process answers - if (bResult) { - bResult = ((!pCollectedRRAnswers) || - (_processAnswers(pCollectedRRAnswers))); - } - else { // Some failure while reading answers - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED to read answers!\n"));); - m_pUDPContext->flush(); - } - - // Delete collected answers - while (pCollectedRRAnswers) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: DELETING answer!\n"));); - stcMDNS_RRAnswer* pNextAnswer = pCollectedRRAnswers->m_pNext; - delete pCollectedRRAnswers; - pCollectedRRAnswers = pNextAnswer; - } - } - else { // Received an unexpected response -> ignore - /*DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: Received an unexpected response... ignoring!\nDUMP:\n")); - bool bDumpResult = true; - for (uint16_t qd=0; ((bDumpResult) && (qdflush(); - bResult = true; - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_processAnswers - * Host: - * A (0x01): eg. esp8266.local A OP TTL 123.456.789.012 - * AAAA (01Cx): eg. esp8266.local AAAA OP TTL 1234:5678::90 - * PTR (0x0C, IP4): eg. 012.789.456.123.in-addr.arpa PTR OP TTL esp8266.local - * PTR (0x0C, IP6): eg. 90.0.0.0.0.0.0.0.0.0.0.0.78.56.34.12.ip6.arpa PTR OP TTL esp8266.local - * Service: - * PTR (0x0C, srv name): eg. _http._tcp.local PTR OP TTL MyESP._http._tcp.local - * PTR (0x0C, srv type): eg. _services._dns-sd._udp.local PTR OP TTL _http._tcp.local - * SRV (0x21): eg. MyESP._http._tcp.local SRV OP TTL PRIORITY WEIGHT PORT esp8266.local - * TXT (0x10): eg. MyESP._http._tcp.local TXT OP TTL c#=1 - * - */ -bool MDNSResponder::_processAnswers(const MDNSResponder::stcMDNS_RRAnswer* p_pAnswers) { - - bool bResult = false; - - if (p_pAnswers) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Processing answers...\n"));); - bResult = true; - - // Answers may arrive in an unexpected order. So we loop our answers as long, as we - // can connect new information to service queries - bool bFoundNewKeyAnswer; - do { - bFoundNewKeyAnswer = false; - - const stcMDNS_RRAnswer* pRRAnswer = p_pAnswers; - while ((pRRAnswer) && - (bResult)) { - // 1. level answer (PTR) - if (AnswerType_PTR == pRRAnswer->answerType()) { - // eg. _http._tcp.local PTR xxxx xx MyESP._http._tcp.local - bResult = _processPTRAnswer((stcMDNS_RRAnswerPTR*)pRRAnswer, bFoundNewKeyAnswer); // May 'enable' new SRV or TXT answers to be linked to queries - } - // 2. level answers - // SRV -> host domain and port - else if (AnswerType_SRV == pRRAnswer->answerType()) { - // eg. MyESP_http._tcp.local SRV xxxx xx yy zz 5000 esp8266.local - bResult = _processSRVAnswer((stcMDNS_RRAnswerSRV*)pRRAnswer, bFoundNewKeyAnswer); // May 'enable' new A/AAAA answers to be linked to queries - } - // TXT -> Txts - else if (AnswerType_TXT == pRRAnswer->answerType()) { - // eg. MyESP_http._tcp.local TXT xxxx xx c#=1 - bResult = _processTXTAnswer((stcMDNS_RRAnswerTXT*)pRRAnswer); - } - // 3. level answers -#ifdef MDNS_IP4_SUPPORT - // A -> IP4Address - else if (AnswerType_A == pRRAnswer->answerType()) { - // eg. esp8266.local A xxxx xx 192.168.2.120 - bResult = _processAAnswer((stcMDNS_RRAnswerA*)pRRAnswer); - } -#endif -#ifdef MDNS_IP6_SUPPORT - // AAAA -> IP6Address - else if (AnswerType_AAAA == pRRAnswer->answerType()) { - // eg. esp8266.local AAAA xxxx xx 09cf::0c - bResult = _processAAAAAnswer((stcMDNS_RRAnswerAAAA*)pRRAnswer); - } -#endif - - // Finally check for probing conflicts - // Host domain - if ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && - ((AnswerType_A == pRRAnswer->answerType()) || - (AnswerType_AAAA == pRRAnswer->answerType()))) { - - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (pRRAnswer->m_Header.m_Domain == hostDomain)) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Probing CONFLICT found with: %s.local\n"), m_pcHostname);); - _cancelProbingForHost(); - } - } - // Service domains - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - if ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && - ((AnswerType_TXT == pRRAnswer->answerType()) || - (AnswerType_SRV == pRRAnswer->answerType()))) { - - stcMDNS_RRDomain serviceDomain; - if ((_buildDomainForService(*pService, true, serviceDomain)) && - (pRRAnswer->m_Header.m_Domain == serviceDomain)) { - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Probing CONFLICT found with: %s.%s.%s\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); - _cancelProbingForService(*pService); - } - } - } - - pRRAnswer = pRRAnswer->m_pNext; // Next collected answer - } // while (answers) - } while ((bFoundNewKeyAnswer) && - (bResult)); - } // else: No answers provided - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_processPTRAnswer - */ -bool MDNSResponder::_processPTRAnswer(const MDNSResponder::stcMDNS_RRAnswerPTR* p_pPTRAnswer, - bool& p_rbFoundNewKeyAnswer) { - - bool bResult = false; - - if ((bResult = (0 != p_pPTRAnswer))) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: Processing PTR answers...\n"));); - // eg. _http._tcp.local PTR xxxx xx MyESP._http._tcp.local - // Check pending service queries for eg. '_http._tcp' - - stcMDNSServiceQuery* pServiceQuery = _findNextServiceQueryByServiceType(p_pPTRAnswer->m_Header.m_Domain, 0); - while (pServiceQuery) { - if (pServiceQuery->m_bAwaitingAnswers) { - // Find answer for service domain (eg. MyESP._http._tcp.local) - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pPTRAnswer->m_PTRDomain); - if (pSQAnswer) { // existing answer - if (p_pPTRAnswer->m_u32TTL) { // Received update message - pSQAnswer->m_TTLServiceDomain.set(p_pPTRAnswer->m_u32TTL); // Update TTL tag - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: Updated TTL(%d) for "), (int)p_pPTRAnswer->m_u32TTL); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - ); - } - else { // received goodbye-message - pSQAnswer->m_TTLServiceDomain.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: 'Goodbye' received for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - ); - } - } - else if ((p_pPTRAnswer->m_u32TTL) && // Not just a goodbye-message - ((pSQAnswer = new stcMDNSServiceQuery::stcAnswer))) { // Not yet included -> add answer - pSQAnswer->m_ServiceDomain = p_pPTRAnswer->m_PTRDomain; - pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_ServiceDomain; - pSQAnswer->m_TTLServiceDomain.set(p_pPTRAnswer->m_u32TTL); - pSQAnswer->releaseServiceDomain(); - - bResult = pServiceQuery->addAnswer(pSQAnswer); - p_rbFoundNewKeyAnswer = true; - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this,(hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_ServiceDomain), true); - } - } - } - pServiceQuery = _findNextServiceQueryByServiceType(p_pPTRAnswer->m_Header.m_Domain, pServiceQuery); - } - } // else: No p_pPTRAnswer - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_processSRVAnswer - */ -bool MDNSResponder::_processSRVAnswer(const MDNSResponder::stcMDNS_RRAnswerSRV* p_pSRVAnswer, - bool& p_rbFoundNewKeyAnswer) { - - bool bResult = false; - - if ((bResult = (0 != p_pSRVAnswer))) { - // eg. MyESP._http._tcp.local SRV xxxx xx yy zz 5000 esp8266.local - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pSRVAnswer->m_Header.m_Domain); - if (pSQAnswer) { // Answer for this service domain (eg. MyESP._http._tcp.local) available - if (p_pSRVAnswer->m_u32TTL) { // First or update message (TTL != 0) - pSQAnswer->m_TTLHostDomainAndPort.set(p_pSRVAnswer->m_u32TTL); // Update TTL tag - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: Updated TTL(%d) for "), (int)p_pSRVAnswer->m_u32TTL); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); - ); - // Host domain & Port - if ((pSQAnswer->m_HostDomain != p_pSRVAnswer->m_SRVDomain) || - (pSQAnswer->m_u16Port != p_pSRVAnswer->m_u16Port)) { - - pSQAnswer->m_HostDomain = p_pSRVAnswer->m_SRVDomain; - pSQAnswer->releaseHostDomain(); - pSQAnswer->m_u16Port = p_pSRVAnswer->m_u16Port; - pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_HostDomainAndPort; - - p_rbFoundNewKeyAnswer = true; - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_HostDomainAndPort), true); - } - } - } - else { // Goodby message - pSQAnswer->m_TTLHostDomainAndPort.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: 'Goodbye' received for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); - ); - } - } - pServiceQuery = pServiceQuery->m_pNext; - } // while(service query) - } // else: No p_pSRVAnswer - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_processTXTAnswer - */ -bool MDNSResponder::_processTXTAnswer(const MDNSResponder::stcMDNS_RRAnswerTXT* p_pTXTAnswer) { - - bool bResult = false; - - if ((bResult = (0 != p_pTXTAnswer))) { - // eg. MyESP._http._tcp.local TXT xxxx xx c#=1 - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pTXTAnswer->m_Header.m_Domain); - if (pSQAnswer) { // Answer for this service domain (eg. MyESP._http._tcp.local) available - if (p_pTXTAnswer->m_u32TTL) { // First or update message - pSQAnswer->m_TTLTxts.set(p_pTXTAnswer->m_u32TTL); // Update TTL tag - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: Updated TTL(%d) for "), (int)p_pTXTAnswer->m_u32TTL); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); - ); - if (!pSQAnswer->m_Txts.compare(p_pTXTAnswer->m_Txts)) { - pSQAnswer->m_Txts = p_pTXTAnswer->m_Txts; - pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_Txts; - pSQAnswer->releaseTxts(); - - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo , static_cast(ServiceQueryAnswerType_Txts), true); - } - } - } - else { // Goodby message - pSQAnswer->m_TTLTxts.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: 'Goodbye' received for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); - ); - } - } - pServiceQuery = pServiceQuery->m_pNext; - } // while(service query) - } // else: No p_pTXTAnswer - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: FAILED!\n")); }); - return bResult; -} - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::_processAAnswer - */ - bool MDNSResponder::_processAAnswer(const MDNSResponder::stcMDNS_RRAnswerA* p_pAAnswer) { - - bool bResult = false; - - if ((bResult = (0 != p_pAAnswer))) { - // eg. esp8266.local A xxxx xx 192.168.2.120 - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForHostDomain(p_pAAnswer->m_Header.m_Domain); - if (pSQAnswer) { // Answer for this host domain (eg. esp8266.local) available - stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = pSQAnswer->findIP4Address(p_pAAnswer->m_IPAddress); - if (pIP4Address) { - // Already known IP4 address - if (p_pAAnswer->m_u32TTL) { // Valid TTL -> Update answers TTL - pIP4Address->m_TTL.set(p_pAAnswer->m_u32TTL); - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: Updated TTL(%d) for "), (int)p_pAAnswer->m_u32TTL); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP4Address (%s)\n"), pIP4Address->m_IPAddress.toString().c_str()); - ); - } - else { // 'Goodbye' message for known IP4 address - pIP4Address->m_TTL.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: 'Goodbye' received for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP4 address (%s)\n"), pIP4Address->m_IPAddress.toString().c_str()); - ); - } - } - else { - // Until now unknown IP4 address -> Add (if the message isn't just a 'Goodbye' note) - if (p_pAAnswer->m_u32TTL) { // NOT just a 'Goodbye' message - pIP4Address = new stcMDNSServiceQuery::stcAnswer::stcIP4Address(p_pAAnswer->m_IPAddress, p_pAAnswer->m_u32TTL); - if ((pIP4Address) && - (pSQAnswer->addIP4Address(pIP4Address))) { - - pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_IP4Address; - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo (*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_IP4Address), true); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED to add IP4 address (%s)!\n"), p_pAAnswer->m_IPAddress.toString().c_str());); - } - } - } - } - pServiceQuery = pServiceQuery->m_pNext; - } // while(service query) - } // else: No p_pAAnswer - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED!\n")); }); - return bResult; - } -#endif - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::_processAAAAAnswer - */ - bool MDNSResponder::_processAAAAAnswer(const MDNSResponder::stcMDNS_RRAnswerAAAA* p_pAAAAAnswer) { - - bool bResult = false; - - if ((bResult = (0 != p_pAAAAAnswer))) { - // eg. esp8266.local AAAA xxxx xx 0bf3::0c - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForHostDomain(p_pAAAAAnswer->m_Header.m_Domain); - if (pSQAnswer) { // Answer for this host domain (eg. esp8266.local) available - stcIP6Address* pIP6Address = pSQAnswer->findIP6Address(p_pAAAAAnswer->m_IPAddress); - if (pIP6Address) { - // Already known IP6 address - if (p_pAAAAAnswer->m_u32TTL) { // Valid TTL -> Update answers TTL - pIP6Address->m_TTL.set(p_pAAAAAnswer->m_u32TTL); - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: Updated TTL(%lu) for "), p_pAAAAAnswer->m_u32TTL); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), pIP6Address->m_IPAddress.toString().c_str()); - ); - } - else { // 'Goodbye' message for known IP6 address - pIP6Address->m_TTL.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: 'Goodbye' received for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), pIP6Address->m_IPAddress.toString().c_str()); - ); - } - } - else { - // Until now unknown IP6 address -> Add (if the message isn't just a 'Goodbye' note) - if (p_pAAAAAnswer->m_u32TTL) { // NOT just a 'Goodbye' message - pIP6Address = new stcIP6Address(p_pAAAAAnswer->m_IPAddress, p_pAAAAAnswer->m_u32TTL); - if ((pIP6Address) && - (pSQAnswer->addIP6Address(pIP6Address))) { - - pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_IP6Address; - - if (pServiceQuery->m_fnCallback) { - pServiceQuery->m_fnCallback(this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer), ServiceQueryAnswerType_IP6Address, true, pServiceQuery->m_pUserdata); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED to add IP6 address (%s)!\n"), p_pAAAAAnswer->m_IPAddress.toString().c_str());); - } - } - } - } - pServiceQuery = pServiceQuery->m_pNext; - } // while(service query) - } // else: No p_pAAAAAnswer - - return bResult; - } -#endif - - -/* - * PROBING - */ - -/* - * MDNSResponder::_updateProbeStatus - * - * Manages the (outgoing) probing process. - * - If probing has not been started yet (ProbingStatus_NotStarted), the initial delay (see RFC 6762) is determined and - * the process is started - * - After timeout (of initial or subsequential delay) a probe message is send out for three times. If the message has - * already been sent out three times, the probing has been successful and is finished. - * - * Conflict management is handled in '_parseResponse ff.' - * Tiebraking is handled in 'parseQuery ff.' - */ -bool MDNSResponder::_updateProbeStatus(void) { - - bool bResult = true; - - // - // Probe host domain - if ((ProbingStatus_ReadyToStart == m_HostProbeInformation.m_ProbingStatus) && // Ready to get started AND - //TODO: Fix the following to allow Ethernet shield or other interfaces - (_getResponseMulticastInterface() != IPAddress())) { // Has IP address - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Starting host probing...\n"));); - - // First probe delay SHOULD be random 0-250 ms - m_HostProbeInformation.m_Timeout.reset(rand() % MDNS_PROBE_DELAY); - m_HostProbeInformation.m_ProbingStatus = ProbingStatus_InProgress; - } - else if ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && // Probing AND - (m_HostProbeInformation.m_Timeout.expired())) { // Time for next probe - - if (MDNS_PROBE_COUNT > m_HostProbeInformation.m_u8SentCount) { // Send next probe - if ((bResult = _sendHostProbe())) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Did sent host probe\n\n"));); - m_HostProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); - ++m_HostProbeInformation.m_u8SentCount; - } - } - else { // Probing finished - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done host probing.\n"));); - m_HostProbeInformation.m_ProbingStatus = ProbingStatus_Done; - m_HostProbeInformation.m_Timeout.resetToNeverExpires(); - if (m_HostProbeInformation.m_fnHostProbeResultCallback) { - m_HostProbeInformation.m_fnHostProbeResultCallback(m_pcHostname, true); - } - - // Prepare to announce host - m_HostProbeInformation.m_u8SentCount = 0; - m_HostProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Prepared host announcing.\n\n"));); - } - } // else: Probing already finished OR waiting for next time slot - else if ((ProbingStatus_Done == m_HostProbeInformation.m_ProbingStatus) && - (m_HostProbeInformation.m_Timeout.expired())) { - - if ((bResult = _announce(true, false))) { // Don't announce services here - ++m_HostProbeInformation.m_u8SentCount; - - if (MDNS_ANNOUNCE_COUNT > m_HostProbeInformation.m_u8SentCount) { - m_HostProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Announcing host (%d).\n\n"), m_HostProbeInformation.m_u8SentCount);); - } - else { - m_HostProbeInformation.m_Timeout.resetToNeverExpires(); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done host announcing.\n\n"));); - } - } - } - - // - // Probe services - for (stcMDNSService* pService=m_pServices; ((bResult) && (pService)); pService=pService->m_pNext) { - if (ProbingStatus_ReadyToStart == pService->m_ProbeInformation.m_ProbingStatus) { // Ready to get started - - pService->m_ProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); // More or equal than first probe for host domain - pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_InProgress; - } - else if ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && // Probing AND - (pService->m_ProbeInformation.m_Timeout.expired())) { // Time for next probe - - if (MDNS_PROBE_COUNT > pService->m_ProbeInformation.m_u8SentCount) { // Send next probe - if ((bResult = _sendServiceProbe(*pService))) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Did sent service probe (%u)\n\n"), (pService->m_ProbeInformation.m_u8SentCount + 1));); - pService->m_ProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); - ++pService->m_ProbeInformation.m_u8SentCount; - } - } - else { // Probing finished - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done service probing %s.%s.%s\n\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); - pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_Done; - pService->m_ProbeInformation.m_Timeout.resetToNeverExpires(); - if (pService->m_ProbeInformation.m_fnServiceProbeResultCallback) { - pService->m_ProbeInformation.m_fnServiceProbeResultCallback(pService->m_pcName, pService, true); - } - // Prepare to announce service - pService->m_ProbeInformation.m_u8SentCount = 0; - pService->m_ProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Prepared service announcing.\n\n"));); - } - } // else: Probing already finished OR waiting for next time slot - else if ((ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus) && - (pService->m_ProbeInformation.m_Timeout.expired())) { - - if ((bResult = _announceService(*pService))) { // Announce service - ++pService->m_ProbeInformation.m_u8SentCount; - - if (MDNS_ANNOUNCE_COUNT > pService->m_ProbeInformation.m_u8SentCount) { - pService->m_ProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Announcing service %s.%s.%s (%d)\n\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol, pService->m_ProbeInformation.m_u8SentCount);); - } - else { - pService->m_ProbeInformation.m_Timeout.resetToNeverExpires(); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done service announcing for %s.%s.%s\n\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); - } - } - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: FAILED!\n\n")); }); - return bResult; -} - -/* - * MDNSResponder::_resetProbeStatus - * - * Resets the probe status. - * If 'p_bRestart' is set, the status is set to ProbingStatus_NotStarted. Consequently, - * when running 'updateProbeStatus' (which is done in every '_update' loop), the probing - * process is restarted. - */ -bool MDNSResponder::_resetProbeStatus(bool p_bRestart /*= true*/) { - - m_HostProbeInformation.clear(false); - m_HostProbeInformation.m_ProbingStatus = (p_bRestart ? ProbingStatus_ReadyToStart : ProbingStatus_Done); - - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - pService->m_ProbeInformation.clear(false); - pService->m_ProbeInformation.m_ProbingStatus = (p_bRestart ? ProbingStatus_ReadyToStart : ProbingStatus_Done); - } - return true; -} - -/* - * MDNSResponder::_hasProbesWaitingForAnswers - */ -bool MDNSResponder::_hasProbesWaitingForAnswers(void) const { - - bool bResult = ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && // Probing - (0 < m_HostProbeInformation.m_u8SentCount)); // And really probing - - for (stcMDNSService* pService=m_pServices; ((!bResult) && (pService)); pService=pService->m_pNext) { - bResult = ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && // Probing - (0 < pService->m_ProbeInformation.m_u8SentCount)); // And really probing - } - return bResult; -} - -/* - * MDNSResponder::_sendHostProbe - * - * Asks (probes) in the local network for the planned host domain - * - (eg. esp8266.local) - * - * To allow 'tiebreaking' (see '_parseQuery'), the answers for these questions are delivered in - * the 'knwon answers' section of the query. - * Host domain: - * - A/AAAA (eg. esp8266.esp -> 192.168.2.120) - */ -bool MDNSResponder::_sendHostProbe(void) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe (%s, %lu)\n"), m_pcHostname, millis());); - - bool bResult = true; - - // Requests for host domain - stcMDNSSendParameter sendParameter; - sendParameter.m_bCacheFlush = false; // RFC 6762 10.2 - - sendParameter.m_pQuestions = new stcMDNS_RRQuestion; - if (((bResult = (0 != sendParameter.m_pQuestions))) && - ((bResult = _buildDomainForHost(m_pcHostname, sendParameter.m_pQuestions->m_Header.m_Domain)))) { - - //sendParameter.m_pQuestions->m_bUnicast = true; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = DNS_RRTYPE_ANY; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (0x8000 | DNS_RRCLASS_IN); // Unicast & INternet - - // Add known answers -#ifdef MDNS_IP4_SUPPORT - sendParameter.m_u8HostReplyMask |= ContentFlag_A; // Add A answer -#endif -#ifdef MDNS_IP6_SUPPORT - sendParameter.m_u8HostReplyMask |= ContentFlag_AAAA; // Add AAAA answer -#endif - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe: FAILED to create host question!\n"));); - if (sendParameter.m_pQuestions) { - delete sendParameter.m_pQuestions; - sendParameter.m_pQuestions = 0; - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe: FAILED!\n")); }); - return ((bResult) && - (_sendMDNSMessage(sendParameter))); -} - -/* - * MDNSResponder::_sendServiceProbe - * - * Asks (probes) in the local network for the planned service instance domain - * - (eg. MyESP._http._tcp.local). - * - * To allow 'tiebreaking' (see '_parseQuery'), the answers for these questions are delivered in - * the 'knwon answers' section of the query. - * Service domain: - * - SRV (eg. MyESP._http._tcp.local -> 5000 esp8266.local) - * - PTR NAME (eg. _http._tcp.local -> MyESP._http._tcp.local) (TODO: Check if needed, maybe TXT is better) - */ -bool MDNSResponder::_sendServiceProbe(stcMDNSService& p_rService) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe (%s.%s.%s, %lu)\n"), (p_rService.m_pcName ?: m_pcHostname), p_rService.m_pcService, p_rService.m_pcProtocol, millis());); - - bool bResult = true; - - // Requests for service instance domain - stcMDNSSendParameter sendParameter; - sendParameter.m_bCacheFlush = false; // RFC 6762 10.2 - - sendParameter.m_pQuestions = new stcMDNS_RRQuestion; - if (((bResult = (0 != sendParameter.m_pQuestions))) && - ((bResult = _buildDomainForService(p_rService, true, sendParameter.m_pQuestions->m_Header.m_Domain)))) { - - sendParameter.m_pQuestions->m_bUnicast = true; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = DNS_RRTYPE_ANY; - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (0x8000 | DNS_RRCLASS_IN); // Unicast & INternet - - // Add known answers - p_rService.m_u8ReplyMask = (ContentFlag_SRV | ContentFlag_PTR_NAME); // Add SRV and PTR NAME answers - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe: FAILED to create service question!\n"));); - if (sendParameter.m_pQuestions) { - delete sendParameter.m_pQuestions; - sendParameter.m_pQuestions = 0; - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe: FAILED!\n")); }); - return ((bResult) && - (_sendMDNSMessage(sendParameter))); -} - -/* - * MDNSResponder::_cancelProbingForHost - */ -bool MDNSResponder::_cancelProbingForHost(void) { - - bool bResult = false; - - m_HostProbeInformation.clear(false); - // Send host notification - if (m_HostProbeInformation.m_fnHostProbeResultCallback) { - m_HostProbeInformation.m_fnHostProbeResultCallback(m_pcHostname, false); - - bResult = true; - } - - for (stcMDNSService* pService=m_pServices; ((!bResult) && (pService)); pService=pService->m_pNext) { - bResult = _cancelProbingForService(*pService); - } - return bResult; -} - -/* - * MDNSResponder::_cancelProbingForService - */ -bool MDNSResponder::_cancelProbingForService(stcMDNSService& p_rService) { - - bool bResult = false; - - p_rService.m_ProbeInformation.clear(false); - // Send notification - if (p_rService.m_ProbeInformation.m_fnServiceProbeResultCallback) { - p_rService.m_ProbeInformation.m_fnServiceProbeResultCallback(p_rService.m_pcName,&p_rService,false); - bResult = true; - } - return bResult; -} - - - -/** - * ANNOUNCING - */ - -/* - * MDNSResponder::_announce - * - * Announces the host domain: - * - A/AAAA (eg. esp8266.local -> 192.168.2.120) - * - PTR (eg. 192.168.2.120.in-addr.arpa -> esp8266.local) - * - * and all presented services: - * - PTR_TYPE (_services._dns-sd._udp.local -> _http._tcp.local) - * - PTR_NAME (eg. _http._tcp.local -> MyESP8266._http._tcp.local) - * - SRV (eg. MyESP8266._http._tcp.local -> 5000 esp8266.local) - * - TXT (eg. MyESP8266._http._tcp.local -> c#=1) - * - * Goodbye (Un-Announcing) for the host domain and all services is also handled here. - * Goodbye messages are created by setting the TTL for the answer to 0, this happens - * inside the '_writeXXXAnswer' procs via 'sendParameter.m_bUnannounce = true' - */ -bool MDNSResponder::_announce(bool p_bAnnounce, - bool p_bIncludeServices) { - - bool bResult = false; - - stcMDNSSendParameter sendParameter; - if (ProbingStatus_Done == m_HostProbeInformation.m_ProbingStatus) { - - bResult = true; - - sendParameter.m_bResponse = true; // Announces are 'Unsolicited authorative responses' - sendParameter.m_bAuthorative = true; - sendParameter.m_bUnannounce = !p_bAnnounce; // When unannouncing, the TTL is set to '0' while creating the answers - - // Announce host - sendParameter.m_u8HostReplyMask = 0; - #ifdef MDNS_IP4_SUPPORT - sendParameter.m_u8HostReplyMask |= ContentFlag_A; // A answer - sendParameter.m_u8HostReplyMask |= ContentFlag_PTR_IP4; // PTR_IP4 answer - #endif - #ifdef MDNS_IP6_SUPPORT - sendParameter.m_u8HostReplyMask |= ContentFlag_AAAA; // AAAA answer - sendParameter.m_u8HostReplyMask |= ContentFlag_PTR_IP6; // PTR_IP6 answer - #endif - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: Announcing host %s (content 0x%X)\n"), m_pcHostname, sendParameter.m_u8HostReplyMask);); - - if (p_bIncludeServices) { - // Announce services (service type, name, SRV (location) and TXTs) - for (stcMDNSService* pService=m_pServices; ((bResult) && (pService)); pService=pService->m_pNext) { - if (ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus) { - pService->m_u8ReplyMask = (ContentFlag_PTR_TYPE | ContentFlag_PTR_NAME | ContentFlag_SRV | ContentFlag_TXT); - - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: Announcing service %s.%s.%s (content %u)\n"), (pService->m_pcName ?: m_pcHostname), pService->m_pcService, pService->m_pcProtocol, pService->m_u8ReplyMask);); - } - } - } - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: FAILED!\n")); }); - return ((bResult) && - (_sendMDNSMessage(sendParameter))); -} - -/* - * MDNSResponder::_announceService - */ -bool MDNSResponder::_announceService(stcMDNSService& p_rService, - bool p_bAnnounce /*= true*/) { - - bool bResult = false; - - stcMDNSSendParameter sendParameter; - if (ProbingStatus_Done == p_rService.m_ProbeInformation.m_ProbingStatus) { - - sendParameter.m_bResponse = true; // Announces are 'Unsolicited authorative responses' - sendParameter.m_bAuthorative = true; - sendParameter.m_bUnannounce = !p_bAnnounce; // When unannouncing, the TTL is set to '0' while creating the answers - - // DON'T announce host - sendParameter.m_u8HostReplyMask = 0; - - // Announce services (service type, name, SRV (location) and TXTs) - p_rService.m_u8ReplyMask = (ContentFlag_PTR_TYPE | ContentFlag_PTR_NAME | ContentFlag_SRV | ContentFlag_TXT); - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announceService: Announcing service %s.%s.%s (content 0x%X)\n"), (p_rService.m_pcName ?: m_pcHostname), p_rService.m_pcService, p_rService.m_pcProtocol, p_rService.m_u8ReplyMask);); - - bResult = true; - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announceService: FAILED!\n")); }); - return ((bResult) && - (_sendMDNSMessage(sendParameter))); -} - - -/** - * SERVICE QUERY CACHE - */ - -/* - * MDNSResponder::_hasServiceQueriesWaitingForAnswers - */ -bool MDNSResponder::_hasServiceQueriesWaitingForAnswers(void) const { - - bool bOpenQueries = false; - - for (stcMDNSServiceQuery* pServiceQuery=m_pServiceQueries; pServiceQuery; pServiceQuery=pServiceQuery->m_pNext) { - if (pServiceQuery->m_bAwaitingAnswers) { - bOpenQueries = true; - break; - } - } - return bOpenQueries; -} - -/* - * MDNSResponder::_checkServiceQueryCache - * - * For any 'living' service query (m_bAwaitingAnswers == true) all available answers (their components) - * are checked for topicality based on the stored reception time and the answers TTL. - * When the components TTL is outlasted by more than 80%, a new question is generated, to get updated information. - * When no update arrived (in time), the component is removed from the answer (cache). - * - */ -bool MDNSResponder::_checkServiceQueryCache(void) { - - bool bResult = true; - - DEBUG_EX_INFO( - bool printedInfo = false; - ); - for (stcMDNSServiceQuery* pServiceQuery=m_pServiceQueries; ((bResult) && (pServiceQuery)); pServiceQuery=pServiceQuery->m_pNext) { - - // - // Resend dynamic service queries, if not already done often enough - if ((!pServiceQuery->m_bLegacyQuery) && - (MDNS_DYNAMIC_QUERY_RESEND_COUNT > pServiceQuery->m_u8SentCount) && - (pServiceQuery->m_ResendTimeout.expired())) { - - if ((bResult = _sendMDNSServiceQuery(*pServiceQuery))) { - ++pServiceQuery->m_u8SentCount; - pServiceQuery->m_ResendTimeout.reset((MDNS_DYNAMIC_QUERY_RESEND_COUNT > pServiceQuery->m_u8SentCount) - ? (MDNS_DYNAMIC_QUERY_RESEND_DELAY * (pServiceQuery->m_u8SentCount - 1)) - : esp8266::polledTimeout::oneShotMs::neverExpires); - } - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: %s to resend service query!"), (bResult ? "Succeeded" : "FAILED")); - printedInfo = true; - ); - } - - // - // Schedule updates for cached answers - if (pServiceQuery->m_bAwaitingAnswers) { - stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->m_pAnswers; - while ((bResult) && - (pSQAnswer)) { - stcMDNSServiceQuery::stcAnswer* pNextSQAnswer = pSQAnswer->m_pNext; - - // 1. level answer - if ((bResult) && - (pSQAnswer->m_TTLServiceDomain.flagged())) { - - if (!pSQAnswer->m_TTLServiceDomain.finalTimeoutLevel()) { - - bResult = ((_sendMDNSServiceQuery(*pServiceQuery)) && - (pSQAnswer->m_TTLServiceDomain.restart())); - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: PTR update scheduled for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" %s\n"), (bResult ? "OK" : "FAILURE")); - printedInfo = true; - ); - } - else { - // Timed out! -> Delete - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_ServiceDomain), false); - } - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove PTR answer for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - printedInfo = true; - ); - - bResult = pServiceQuery->removeAnswer(pSQAnswer); - pSQAnswer = 0; - continue; // Don't use this answer anymore - } - } // ServiceDomain flagged - - // 2. level answers - // HostDomain & Port (from SRV) - if ((bResult) && - (pSQAnswer->m_TTLHostDomainAndPort.flagged())) { - - if (!pSQAnswer->m_TTLHostDomainAndPort.finalTimeoutLevel()) { - - bResult = ((_sendMDNSQuery(pSQAnswer->m_ServiceDomain, DNS_RRTYPE_SRV)) && - (pSQAnswer->m_TTLHostDomainAndPort.restart())); - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: SRV update scheduled for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" host domain and port %s\n"), (bResult ? "OK" : "FAILURE")); - printedInfo = true; - ); - } - else { - // Timed out! -> Delete - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove SRV answer for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); - printedInfo = true; - ); - // Delete - pSQAnswer->m_HostDomain.clear(); - pSQAnswer->releaseHostDomain(); - pSQAnswer->m_u16Port = 0; - pSQAnswer->m_TTLHostDomainAndPort.set(0); - uint32_t u32ContentFlags = ServiceQueryAnswerType_HostDomainAndPort; - // As the host domain is the base for the IP4- and IP6Address, remove these too - #ifdef MDNS_IP4_SUPPORT - pSQAnswer->releaseIP4Addresses(); - u32ContentFlags |= ServiceQueryAnswerType_IP4Address; - #endif - #ifdef MDNS_IP6_SUPPORT - pSQAnswer->releaseIP6Addresses(); - u32ContentFlags |= ServiceQueryAnswerType_IP6Address; - #endif - - // Remove content flags for deleted answer parts - pSQAnswer->m_u32ContentFlags &= ~u32ContentFlags; - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo,static_cast(u32ContentFlags), false); - } - } - } // HostDomainAndPort flagged - - // Txts (from TXT) - if ((bResult) && - (pSQAnswer->m_TTLTxts.flagged())) { - - if (!pSQAnswer->m_TTLTxts.finalTimeoutLevel()) { - - bResult = ((_sendMDNSQuery(pSQAnswer->m_ServiceDomain, DNS_RRTYPE_TXT)) && - (pSQAnswer->m_TTLTxts.restart())); - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: TXT update scheduled for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" TXTs %s\n"), (bResult ? "OK" : "FAILURE")); - printedInfo = true; - ); - } - else { - // Timed out! -> Delete - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove TXT answer for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); - printedInfo = true; - ); - // Delete - pSQAnswer->m_Txts.clear(); - pSQAnswer->m_TTLTxts.set(0); - - // Remove content flags for deleted answer parts - pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_Txts; - - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_Txts), false); - } - } - } // TXTs flagged - - // 3. level answers -#ifdef MDNS_IP4_SUPPORT - // IP4Address (from A) - stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = pSQAnswer->m_pIP4Addresses; - bool bAUpdateQuerySent = false; - while ((pIP4Address) && - (bResult)) { - - stcMDNSServiceQuery::stcAnswer::stcIP4Address* pNextIP4Address = pIP4Address->m_pNext; // Get 'next' early, as 'current' may be deleted at the end... - - if (pIP4Address->m_TTL.flagged()) { - - if (!pIP4Address->m_TTL.finalTimeoutLevel()) { // Needs update - - if ((bAUpdateQuerySent) || - ((bResult = _sendMDNSQuery(pSQAnswer->m_HostDomain, DNS_RRTYPE_A)))) { - - pIP4Address->m_TTL.restart(); - bAUpdateQuerySent = true; - - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: IP4 update scheduled for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP4 address (%s)\n"), (pIP4Address->m_IPAddress.toString().c_str())); - printedInfo = true; - ); - } - } - else { - // Timed out! -> Delete - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove IP4 answer for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP4 address\n")); - printedInfo = true; - ); - pSQAnswer->removeIP4Address(pIP4Address); - if (!pSQAnswer->m_pIP4Addresses) { // NO IP4 address left -> remove content flag - pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_IP4Address; - } - // Notify client - if (pServiceQuery->m_fnCallback) { - MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); - pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_IP4Address), false); - } - } - } // IP4 flagged - - pIP4Address = pNextIP4Address; // Next - } // while -#endif -#ifdef MDNS_IP6_SUPPORT - // IP6Address (from AAAA) - stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = pSQAnswer->m_pIP6Addresses; - bool bAAAAUpdateQuerySent = false; - while ((pIP6Address) && - (bResult)) { - - stcMDNSServiceQuery::stcAnswer::stcIP6Address* pNextIP6Address = pIP6Address->m_pNext; // Get 'next' early, as 'current' may be deleted at the end... - - if (pIP6Address->m_TTL.flagged()) { - - if (!pIP6Address->m_TTL.finalTimeoutLevel()) { // Needs update - - if ((bAAAAUpdateQuerySent) || - ((bResult = _sendMDNSQuery(pSQAnswer->m_HostDomain, DNS_RRTYPE_AAAA)))) { - - pIP6Address->m_TTL.restart(); - bAAAAUpdateQuerySent = true; - - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: IP6 update scheduled for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), (pIP6Address->m_IPAddress.toString().c_str())); - printedInfo = true; - ); - } - } - else { - // Timed out! -> Delete - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove answer for ")); - _printRRDomain(pSQAnswer->m_ServiceDomain); - DEBUG_OUTPUT.printf_P(PSTR(" IP6Address\n")); - printedInfo = true; - ); - pSQAnswer->removeIP6Address(pIP6Address); - if (!pSQAnswer->m_pIP6Addresses) { // NO IP6 address left -> remove content flag - pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_IP6Address; - } - // Notify client - if (pServiceQuery->m_fnCallback) { - pServiceQuery->m_fnCallback(this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer), ServiceQueryAnswerType_IP6Address, false, pServiceQuery->m_pUserdata); - } - } - } // IP6 flagged - - pIP6Address = pNextIP6Address; // Next - } // while -#endif - pSQAnswer = pNextSQAnswer; - } - } - } - DEBUG_EX_INFO( - if (printedInfo) { - DEBUG_OUTPUT.printf_P(PSTR("\n")); - } - ); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: FAILED!\n")); }); - return bResult; -} - - -/* - * MDNSResponder::_replyMaskForHost - * - * Determines the relavant host answers for the given question. - * - A question for the hostname (eg. esp8266.local) will result in an A/AAAA (eg. 192.168.2.129) reply. - * - A question for the reverse IP address (eg. 192-168.2.120.inarpa.arpa) will result in an PTR_IP4 (eg. esp8266.local) reply. - * - * In addition, a full name match (question domain == host domain) is marked. - */ -uint8_t MDNSResponder::_replyMaskForHost(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader, - bool* p_pbFullNameMatch /*= 0*/) const { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost\n"));); - - uint8_t u8ReplyMask = 0; - (p_pbFullNameMatch ? *p_pbFullNameMatch = false : 0); - - if ((DNS_RRCLASS_IN == p_RRHeader.m_Attributes.m_u16Class) || - (DNS_RRCLASS_ANY == p_RRHeader.m_Attributes.m_u16Class)) { - - if ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) { - // PTR request -#ifdef MDNS_IP4_SUPPORT - stcMDNS_RRDomain reverseIP4Domain; - if ((_buildDomainForReverseIP4(_getResponseMulticastInterface(), reverseIP4Domain)) && - (p_RRHeader.m_Domain == reverseIP4Domain)) { - // Reverse domain match - u8ReplyMask |= ContentFlag_PTR_IP4; - } -#endif -#ifdef MDNS_IP6_SUPPORT - // TODO -#endif - } // Address qeuest - - stcMDNS_RRDomain hostDomain; - if ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (p_RRHeader.m_Domain == hostDomain)) { // Host domain match - - (p_pbFullNameMatch ? (*p_pbFullNameMatch = true) : (0)); - -#ifdef MDNS_IP4_SUPPORT - if ((DNS_RRTYPE_A == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) { - // IP4 address request - u8ReplyMask |= ContentFlag_A; - } -#endif -#ifdef MDNS_IP6_SUPPORT - if ((DNS_RRTYPE_AAAA == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) { - // IP6 address request - u8ReplyMask |= ContentFlag_AAAA; - } -#endif - } - } - else { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost: INVALID RR-class (0x%04X)!\n"), p_RRHeader.m_Attributes.m_u16Class);); - } - DEBUG_EX_INFO(if (u8ReplyMask) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost: 0x%X\n"), u8ReplyMask); } ); - return u8ReplyMask; -} - -/* - * MDNSResponder::_replyMaskForService - * - * Determines the relevant service answers for the given question - * - A PTR dns-sd service enum question (_services.dns-sd._udp.local) will result into an PTR_TYPE (eg. _http._tcp.local) answer - * - A PTR service type question (eg. _http._tcp.local) will result into an PTR_NAME (eg. MyESP._http._tcp.local) answer - * - A PTR service name question (eg. MyESP._http._tcp.local) will result into an PTR_NAME (eg. MyESP._http._tcp.local) answer - * - A SRV service name question (eg. MyESP._http._tcp.local) will result into an SRV (eg. 5000 MyESP.local) answer - * - A TXT service name question (eg. MyESP._http._tcp.local) will result into an TXT (eg. c#=1) answer - * - * In addition, a full name match (question domain == service instance domain) is marked. - */ -uint8_t MDNSResponder::_replyMaskForService(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader, - const MDNSResponder::stcMDNSService& p_Service, - bool* p_pbFullNameMatch /*= 0*/) const { - - uint8_t u8ReplyMask = 0; - (p_pbFullNameMatch ? *p_pbFullNameMatch = false : 0); - - if ((DNS_RRCLASS_IN == p_RRHeader.m_Attributes.m_u16Class) || - (DNS_RRCLASS_ANY == p_RRHeader.m_Attributes.m_u16Class)) { - - stcMDNS_RRDomain DNSSDDomain; - if ((_buildDomainForDNSSD(DNSSDDomain)) && // _services._dns-sd._udp.local - (p_RRHeader.m_Domain == DNSSDDomain) && - ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type))) { - // Common service info requested - u8ReplyMask |= ContentFlag_PTR_TYPE; - } - - stcMDNS_RRDomain serviceDomain; - if ((_buildDomainForService(p_Service, false, serviceDomain)) && // eg. _http._tcp.local - (p_RRHeader.m_Domain == serviceDomain) && - ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type))) { - // Special service info requested - u8ReplyMask |= ContentFlag_PTR_NAME; - } - - if ((_buildDomainForService(p_Service, true, serviceDomain)) && // eg. MyESP._http._tcp.local - (p_RRHeader.m_Domain == serviceDomain)) { - - (p_pbFullNameMatch ? (*p_pbFullNameMatch = true) : (0)); - - if ((DNS_RRTYPE_SRV == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) { - // Instance info SRV requested - u8ReplyMask |= ContentFlag_SRV; - } - if ((DNS_RRTYPE_TXT == p_RRHeader.m_Attributes.m_u16Type) || - (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) { - // Instance info TXT requested - u8ReplyMask |= ContentFlag_TXT; - } - } - } - else { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForService: INVALID RR-class (0x%04X)!\n"), p_RRHeader.m_Attributes.m_u16Class);); - } - DEBUG_EX_INFO(if (u8ReplyMask) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForService(%s.%s.%s): 0x%X\n"), p_Service.m_pcName, p_Service.m_pcService, p_Service.m_pcProtocol, u8ReplyMask); } ); - return u8ReplyMask; -} - -} // namespace MDNSImplementation - -} // namespace esp8266 + } + return bResult; +} + +/* + MDNSResponder::_restart +*/ +bool MDNSResponder::_restart(void) +{ + + return ((m_netif != nullptr) && + (m_netif->flags & NETIF_FLAG_UP) && // network interface is up and running + (_resetProbeStatus(true)) && // Stop and restart probing + (_allocUDPContext())); // Restart UDP +} + + +/** + RECEIVING +*/ + +/* + MDNSResponder::_parseMessage +*/ +bool MDNSResponder::_parseMessage(void) +{ + DEBUG_EX_INFO( + unsigned long ulStartTime = millis(); + unsigned uStartMemory = ESP.getFreeHeap(); + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage (Time: %lu ms, heap: %u bytes, from %s(%u), to %s(%u))\n"), ulStartTime, uStartMemory, + IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), m_pUDPContext->getRemotePort(), + IPAddress(m_pUDPContext->getDestAddress()).toString().c_str(), m_pUDPContext->getLocalPort()); + ); + //DEBUG_EX_INFO(_udpDump();); + + bool bResult = false; + + stcMDNS_MsgHeader header; + if (_readMDNSMsgHeader(header)) + { + if (0 == header.m_4bOpcode) // A standard query + { + if (header.m_1bQR) // Received a response -> answers to a query + { + //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Reading answers: ID:%u, Q:%u, A:%u, NS:%u, AR:%u\n"), header.m_u16ID, header.m_u16QDCount, header.m_u16ANCount, header.m_u16NSCount, header.m_u16ARCount);); + bResult = _parseResponse(header); + } + else // Received a query (Questions) + { + //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Reading query: ID:%u, Q:%u, A:%u, NS:%u, AR:%u\n"), header.m_u16ID, header.m_u16QDCount, header.m_u16ANCount, header.m_u16NSCount, header.m_u16ARCount);); + bResult = _parseQuery(header); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Received UNEXPECTED opcode:%u. Ignoring message!\n"), header.m_4bOpcode);); + m_pUDPContext->flush(); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: FAILED to read header\n"));); + m_pUDPContext->flush(); + } + DEBUG_EX_INFO( + unsigned uFreeHeap = ESP.getFreeHeap(); + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseMessage: Done (%s after %lu ms, ate %i bytes, remaining %u)\n\n"), (bResult ? "Succeeded" : "FAILED"), (millis() - ulStartTime), (uStartMemory - uFreeHeap), uFreeHeap); + ); + return bResult; +} + +/* + MDNSResponder::_parseQuery + + Queries are of interest in two cases: + 1. allow for tiebreaking while probing in the case of a race condition between two instances probing for + the same name at the same time + 2. provide answers to questions for our host domain or any presented service + + When reading the questions, a set of (planned) responses is created, eg. a reverse PTR question for the host domain + gets an A (IP address) response, a PTR question for the _services._dns-sd domain gets a PTR (type) response for any + registered service, ... + + As any mDNS responder should be able to handle 'legacy' queries (from DNS clients), this case is handled here also. + Legacy queries have got only one (unicast) question and are directed to the local DNS port (not the multicast port). + + 1. +*/ +bool MDNSResponder::_parseQuery(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader) +{ + + bool bResult = true; + + stcMDNSSendParameter sendParameter; + uint8_t u8HostOrServiceReplies = 0; + for (uint16_t qd = 0; ((bResult) && (qd < p_MsgHeader.m_u16QDCount)); ++qd) + { + + stcMDNS_RRQuestion questionRR; + if ((bResult = _readRRQuestion(questionRR))) + { + // Define host replies, BUT only answer queries after probing is done + u8HostOrServiceReplies = + sendParameter.m_u8HostReplyMask |= (((m_bPassivModeEnabled) || + (ProbingStatus_Done == m_HostProbeInformation.m_ProbingStatus)) + ? _replyMaskForHost(questionRR.m_Header, 0) + : 0); + DEBUG_EX_INFO(if (u8HostOrServiceReplies) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Host reply needed 0x%X\n"), u8HostOrServiceReplies); + }); + + // Check tiebreak need for host domain + if (ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) + { + bool bFullNameMatch = false; + if ((_replyMaskForHost(questionRR.m_Header, &bFullNameMatch)) && + (bFullNameMatch)) + { + // We're in 'probing' state and someone is asking for our host domain: this might be + // a race-condition: Two host with the same domain names try simutanously to probe their domains + // See: RFC 6762, 8.2 (Tiebraking) + // However, we're using a max. reduced approach for tiebreaking here: The higher IP-address wins! + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Possible race-condition for host domain detected while probing.\n"));); + + m_HostProbeInformation.m_bTiebreakNeeded = true; + } + } + + // Define service replies + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + // Define service replies, BUT only answer queries after probing is done + uint8_t u8ReplyMaskForQuestion = (((m_bPassivModeEnabled) || + (ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus)) + ? _replyMaskForService(questionRR.m_Header, *pService, 0) + : 0); + u8HostOrServiceReplies |= (pService->m_u8ReplyMask |= u8ReplyMaskForQuestion); + DEBUG_EX_INFO(if (u8ReplyMaskForQuestion) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service reply needed for (%s.%s.%s): 0x%X (%s)\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol, u8ReplyMaskForQuestion, IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str()); + }); + + // Check tiebreak need for service domain + if (ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) + { + bool bFullNameMatch = false; + if ((_replyMaskForService(questionRR.m_Header, *pService, &bFullNameMatch)) && + (bFullNameMatch)) + { + // We're in 'probing' state and someone is asking for this service domain: this might be + // a race-condition: Two services with the same domain names try simutanously to probe their domains + // See: RFC 6762, 8.2 (Tiebraking) + // However, we're using a max. reduced approach for tiebreaking here: The 'higher' SRV host wins! + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Possible race-condition for service domain %s.%s.%s detected while probing.\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); + + pService->m_ProbeInformation.m_bTiebreakNeeded = true; + } + } + } + + // Handle unicast and legacy specialities + // If only one question asks for unicast reply, the whole reply packet is send unicast + if (((DNS_MQUERY_PORT != m_pUDPContext->getRemotePort()) || // Unicast (maybe legacy) query OR + (questionRR.m_bUnicast)) && // Expressivly unicast query + (!sendParameter.m_bUnicast)) + { + + sendParameter.m_bUnicast = true; + sendParameter.m_bCacheFlush = false; + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Unicast response for %s!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str());); + + if ((DNS_MQUERY_PORT != m_pUDPContext->getRemotePort()) && // Unicast (maybe legacy) query AND + (1 == p_MsgHeader.m_u16QDCount) && // Only one question AND + ((sendParameter.m_u8HostReplyMask) || // Host replies OR + (u8HostOrServiceReplies))) // Host or service replies available + { + // We're a match for this legacy query, BUT + // make sure, that the query comes from a local host + ip_info IPInfo_Local; + ip_info IPInfo_Remote; + if (((IPInfo_Remote.ip.addr = m_pUDPContext->getRemoteAddress())) && + (((wifi_get_ip_info(SOFTAP_IF, &IPInfo_Local)) && + (ip4_addr_netcmp(&IPInfo_Remote.ip, &IPInfo_Local.ip, &IPInfo_Local.netmask))) || // Remote IP in SOFTAP's subnet OR + ((wifi_get_ip_info(STATION_IF, &IPInfo_Local)) && + (ip4_addr_netcmp(&IPInfo_Remote.ip, &IPInfo_Local.ip, &IPInfo_Local.netmask))))) // Remote IP in STATION's subnet + { + + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from local host %s, id %u!\n"), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), p_MsgHeader.m_u16ID);); + + sendParameter.m_u16ID = p_MsgHeader.m_u16ID; + sendParameter.m_bLegacyQuery = true; + sendParameter.m_pQuestions = new stcMDNS_RRQuestion; + if ((bResult = (0 != sendParameter.m_pQuestions))) + { + sendParameter.m_pQuestions->m_Header.m_Domain = questionRR.m_Header.m_Domain; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = questionRR.m_Header.m_Attributes.m_u16Type; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = questionRR.m_Header.m_Attributes.m_u16Class; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to add legacy question!\n"));); + } + } + else + { + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Legacy query from NON-LOCAL host!\n"));); + bResult = false; + } + } + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to read question!\n"));); + } + } // for questions + + //DEBUG_EX_INFO(if (u8HostOrServiceReplies) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Reply needed: %u (%s: %s->%s)\n"), u8HostOrServiceReplies, clsTimeSyncer::timestr(), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str(), IPAddress(m_pUDPContext->getDestAddress()).toString().c_str()); } ); + + // Handle known answers + uint32_t u32Answers = (p_MsgHeader.m_u16ANCount + p_MsgHeader.m_u16NSCount + p_MsgHeader.m_u16ARCount); + DEBUG_EX_INFO(if ((u8HostOrServiceReplies) && (u32Answers)) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Known answers(%u):\n"), u32Answers); + }); + + for (uint32_t an = 0; ((bResult) && (an < u32Answers)); ++an) + { + stcMDNS_RRAnswer* pKnownRRAnswer = 0; + if (((bResult = _readRRAnswer(pKnownRRAnswer))) && + (pKnownRRAnswer)) + { + + if ((DNS_RRTYPE_ANY != pKnownRRAnswer->m_Header.m_Attributes.m_u16Type) && // No ANY type answer + (DNS_RRCLASS_ANY != pKnownRRAnswer->m_Header.m_Attributes.m_u16Class)) // No ANY class answer + { + + // Find match between planned answer (sendParameter.m_u8HostReplyMask) and this 'known answer' + uint8_t u8HostMatchMask = (sendParameter.m_u8HostReplyMask & _replyMaskForHost(pKnownRRAnswer->m_Header)); + if ((u8HostMatchMask) && // The RR in the known answer matches an RR we are planning to send, AND + ((MDNS_HOST_TTL / 2) <= pKnownRRAnswer->m_u32TTL)) // The TTL of the known answer is longer than half of the new host TTL (120s) + { + + // Compare contents + if (AnswerType_PTR == pKnownRRAnswer->answerType()) + { + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain == hostDomain)) + { + // Host domain match +#ifdef MDNS_IP4_SUPPORT + if (u8HostMatchMask & ContentFlag_PTR_IP4) + { + // IP4 PTR was asked for, but is already known -> skipping + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP4 PTR already known... skipping!\n"));); + sendParameter.m_u8HostReplyMask &= ~ContentFlag_PTR_IP4; + } +#endif +#ifdef MDNS_IP6_SUPPORT + if (u8HostMatchMask & ContentFlag_PTR_IP6) + { + // IP6 PTR was asked for, but is already known -> skipping + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP6 PTR already known... skipping!\n"));); + sendParameter.m_u8HostReplyMask &= ~ContentFlag_PTR_IP6; + } +#endif + } + } + else if (u8HostMatchMask & ContentFlag_A) + { + // IP4 address was asked for +#ifdef MDNS_IP4_SUPPORT + if ((AnswerType_A == pKnownRRAnswer->answerType()) && + (((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress == _getResponseMulticastInterface())) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP4 address already known... skipping!\n"));); + sendParameter.m_u8HostReplyMask &= ~ContentFlag_A; + } // else: RData NOT IP4 length !! +#endif + } + else if (u8HostMatchMask & ContentFlag_AAAA) + { + // IP6 address was asked for +#ifdef MDNS_IP6_SUPPORT + if ((AnswerType_AAAA == pAnswerRR->answerType()) && + (((stcMDNS_RRAnswerAAAA*)pAnswerRR)->m_IPAddress == _getResponseMulticastInterface())) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: IP6 address already known... skipping!\n"));); + sendParameter.m_u8HostReplyMask &= ~ContentFlag_AAAA; + } // else: RData NOT IP6 length !! +#endif + } + } // Host match /*and TTL*/ + + // + // Check host tiebreak possibility + if (m_HostProbeInformation.m_bTiebreakNeeded) + { + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (pKnownRRAnswer->m_Header.m_Domain == hostDomain)) + { + // Host domain match +#ifdef MDNS_IP4_SUPPORT + if (AnswerType_A == pKnownRRAnswer->answerType()) + { + IPAddress localIPAddress(_getResponseMulticastInterface()); + if (((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress == localIPAddress) + { + // SAME IP address -> We've received an old message from ourselfs (same IP) + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) WON (was an old message)!\n"));); + m_HostProbeInformation.m_bTiebreakNeeded = false; + } + else + { + if ((uint32_t)(((stcMDNS_RRAnswerA*)pKnownRRAnswer)->m_IPAddress) > (uint32_t)localIPAddress) // The OTHER IP is 'higher' -> LOST + { + // LOST tiebreak + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) LOST (lower)!\n"));); + _cancelProbingForHost(); + m_HostProbeInformation.m_bTiebreakNeeded = false; + } + else // WON tiebreak + { + //TiebreakState = TiebreakState_Won; // We received an 'old' message from ourselfs -> Just ignore + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (IP4) WON (higher IP)!\n"));); + m_HostProbeInformation.m_bTiebreakNeeded = false; + } + } + } +#endif +#ifdef MDNS_IP6_SUPPORT + if (AnswerType_AAAA == pAnswerRR->answerType()) + { + // TODO + } +#endif + } + } // Host tiebreak possibility + + // Check service answers + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + + uint8_t u8ServiceMatchMask = (pService->m_u8ReplyMask & _replyMaskForService(pKnownRRAnswer->m_Header, *pService)); + + if ((u8ServiceMatchMask) && // The RR in the known answer matches an RR we are planning to send, AND + ((MDNS_SERVICE_TTL / 2) <= pKnownRRAnswer->m_u32TTL)) // The TTL of the known answer is longer than half of the new service TTL (4500s) + { + + if (AnswerType_PTR == pKnownRRAnswer->answerType()) + { + stcMDNS_RRDomain serviceDomain; + if ((u8ServiceMatchMask & ContentFlag_PTR_TYPE) && + (_buildDomainForService(*pService, false, serviceDomain)) && + (serviceDomain == ((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain)) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service type PTR already known... skipping!\n"));); + pService->m_u8ReplyMask &= ~ContentFlag_PTR_TYPE; + } + if ((u8ServiceMatchMask & ContentFlag_PTR_NAME) && + (_buildDomainForService(*pService, true, serviceDomain)) && + (serviceDomain == ((stcMDNS_RRAnswerPTR*)pKnownRRAnswer)->m_PTRDomain)) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service name PTR already known... skipping!\n"));); + pService->m_u8ReplyMask &= ~ContentFlag_PTR_NAME; + } + } + else if (u8ServiceMatchMask & ContentFlag_SRV) + { + DEBUG_EX_ERR(if (AnswerType_SRV != pKnownRRAnswer->answerType()) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: ERROR! INVALID answer type (SRV)!\n"));); + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (hostDomain == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain)) // Host domain match + { + + if ((MDNS_SRV_PRIORITY == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Priority) && + (MDNS_SRV_WEIGHT == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Weight) && + (pService->m_u16Port == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_u16Port)) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service SRV answer already known... skipping!\n"));); + pService->m_u8ReplyMask &= ~ContentFlag_SRV; + } // else: Small differences -> send update message + } + } + else if (u8ServiceMatchMask & ContentFlag_TXT) + { + DEBUG_EX_ERR(if (AnswerType_TXT != pKnownRRAnswer->answerType()) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: ERROR! INVALID answer type (TXT)!\n"));); + _collectServiceTxts(*pService); + if (pService->m_Txts == ((stcMDNS_RRAnswerTXT*)pKnownRRAnswer)->m_Txts) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Service TXT answer already known... skipping!\n"));); + pService->m_u8ReplyMask &= ~ContentFlag_TXT; + } + _releaseTempServiceTxts(*pService); + } + } // Service match and enough TTL + + // + // Check service tiebreak possibility + if (pService->m_ProbeInformation.m_bTiebreakNeeded) + { + stcMDNS_RRDomain serviceDomain; + if ((_buildDomainForService(*pService, true, serviceDomain)) && + (pKnownRRAnswer->m_Header.m_Domain == serviceDomain)) + { + // Service domain match + if (AnswerType_SRV == pKnownRRAnswer->answerType()) + { + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (hostDomain == ((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain)) // Host domain match + { + + // We've received an old message from ourselfs (same SRV) + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) won (was an old message)!\n"));); + pService->m_ProbeInformation.m_bTiebreakNeeded = false; + } + else + { + if (((stcMDNS_RRAnswerSRV*)pKnownRRAnswer)->m_SRVDomain > hostDomain) // The OTHER domain is 'higher' -> LOST + { + // LOST tiebreak + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) LOST (lower)!\n"));); + _cancelProbingForService(*pService); + pService->m_ProbeInformation.m_bTiebreakNeeded = false; + } + else // WON tiebreak + { + //TiebreakState = TiebreakState_Won; // We received an 'old' message from ourselfs -> Just ignore + DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Tiebreak (SRV) won (higher)!\n"));); + pService->m_ProbeInformation.m_bTiebreakNeeded = false; + } + } + } + } + } // service tiebreak possibility + } // for services + } // ANY answers + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED to read known answer!\n"));); + } + + if (pKnownRRAnswer) + { + delete pKnownRRAnswer; + pKnownRRAnswer = 0; + } + } // for answers + + if (bResult) + { + // Check, if a reply is needed + uint8_t u8ReplyNeeded = sendParameter.m_u8HostReplyMask; + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + u8ReplyNeeded |= pService->m_u8ReplyMask; + } + + if (u8ReplyNeeded) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Sending answer(0x%X)...\n"), u8ReplyNeeded);); + + sendParameter.m_bResponse = true; + sendParameter.m_bAuthorative = true; + + bResult = _sendMDNSMessage(sendParameter); + } + DEBUG_EX_INFO( + else + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: No reply needed\n")); + } + ); + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: Something FAILED!\n"));); + m_pUDPContext->flush(); + } + + // + // Check and reset tiebreak-states + if (m_HostProbeInformation.m_bTiebreakNeeded) + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: UNSOLVED tiebreak-need for host domain!\n"));); + m_HostProbeInformation.m_bTiebreakNeeded = false; + } + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + if (pService->m_ProbeInformation.m_bTiebreakNeeded) + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: UNSOLVED tiebreak-need for service domain (%s.%s.%s)\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); + pService->m_ProbeInformation.m_bTiebreakNeeded = false; + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseQuery: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_parseResponse + + Responses are of interest in two cases: + 1. find domain name conflicts while probing + 2. get answers to service queries + + In both cases any included questions are ignored + + 1. If any answer has a domain name similar to one of the domain names we're planning to use (and are probing for), + then we've got a 'probing conflict'. The conflict has to be solved on our side of the conflict (eg. by + setting a new hostname and restart probing). The callback 'm_fnProbeResultCallback' is called with + 'p_bProbeResult=false' in this case. + + 2. Service queries like '_http._tcp.local' will (if available) produce PTR, SRV, TXT and A/AAAA answers. + All stored answers are pivoted by the service instance name (from the PTR record). Other answer parts, + like host domain or IP address are than attached to this element. + Any answer part carries a TTL, this is also stored (incl. the reception time); if the TTL is '0' the + answer (part) is withdrawn by the sender and should be removed from any cache. RFC 6762, 10.1 proposes to + set the caches TTL-value to 1 second in such a case and to delete the item only, if no update has + has taken place in this second. + Answer parts may arrive in 'unsorted' order, so they are grouped into three levels: + Level 1: PRT - names the service instance (and is used as pivot), voids all other parts if is withdrawn or outdates + Level 2: SRV - links the instance name to a host domain and port, voids A/AAAA parts if is withdrawn or outdates + TXT - links the instance name to services TXTs + Level 3: A/AAAA - links the host domain to an IP address +*/ +bool MDNSResponder::_parseResponse(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse\n"));); + //DEBUG_EX_INFO(_udpDump();); + + bool bResult = false; + + // A response should be the result of a query or a probe + if ((_hasServiceQueriesWaitingForAnswers()) || // Waiting for query answers OR + (_hasProbesWaitingForAnswers())) // Probe responses + { + + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: Received a response\n")); + //_udpDump(); + ); + + bResult = true; + // + // Ignore questions here + stcMDNS_RRQuestion dummyRRQ; + for (uint16_t qd = 0; ((bResult) && (qd < p_MsgHeader.m_u16QDCount)); ++qd) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: Received a response containing a question... ignoring!\n"));); + bResult = _readRRQuestion(dummyRRQ); + } // for queries + + // + // Read and collect answers + stcMDNS_RRAnswer* pCollectedRRAnswers = 0; + uint32_t u32NumberOfAnswerRRs = (p_MsgHeader.m_u16ANCount + p_MsgHeader.m_u16NSCount + p_MsgHeader.m_u16ARCount); + for (uint32_t an = 0; ((bResult) && (an < u32NumberOfAnswerRRs)); ++an) + { + stcMDNS_RRAnswer* pRRAnswer = 0; + if (((bResult = _readRRAnswer(pRRAnswer))) && + (pRRAnswer)) + { + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: ADDING answer!\n"));); + pRRAnswer->m_pNext = pCollectedRRAnswers; + pCollectedRRAnswers = pRRAnswer; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED to read answer!\n"));); + if (pRRAnswer) + { + delete pRRAnswer; + pRRAnswer = 0; + } + bResult = false; + } + } // for answers + + // + // Process answers + if (bResult) + { + bResult = ((!pCollectedRRAnswers) || + (_processAnswers(pCollectedRRAnswers))); + } + else // Some failure while reading answers + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED to read answers!\n"));); + m_pUDPContext->flush(); + } + + // Delete collected answers + while (pCollectedRRAnswers) + { + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: DELETING answer!\n"));); + stcMDNS_RRAnswer* pNextAnswer = pCollectedRRAnswers->m_pNext; + delete pCollectedRRAnswers; + pCollectedRRAnswers = pNextAnswer; + } + } + else // Received an unexpected response -> ignore + { + /* DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: Received an unexpected response... ignoring!\nDUMP:\n")); + bool bDumpResult = true; + for (uint16_t qd=0; ((bDumpResult) && (qdflush(); + bResult = true; + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _parseResponse: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_processAnswers + Host: + A (0x01): eg. esp8266.local A OP TTL 123.456.789.012 + AAAA (01Cx): eg. esp8266.local AAAA OP TTL 1234:5678::90 + PTR (0x0C, IP4): eg. 012.789.456.123.in-addr.arpa PTR OP TTL esp8266.local + PTR (0x0C, IP6): eg. 90.0.0.0.0.0.0.0.0.0.0.0.78.56.34.12.ip6.arpa PTR OP TTL esp8266.local + Service: + PTR (0x0C, srv name): eg. _http._tcp.local PTR OP TTL MyESP._http._tcp.local + PTR (0x0C, srv type): eg. _services._dns-sd._udp.local PTR OP TTL _http._tcp.local + SRV (0x21): eg. MyESP._http._tcp.local SRV OP TTL PRIORITY WEIGHT PORT esp8266.local + TXT (0x10): eg. MyESP._http._tcp.local TXT OP TTL c#=1 + +*/ +bool MDNSResponder::_processAnswers(const MDNSResponder::stcMDNS_RRAnswer* p_pAnswers) +{ + + bool bResult = false; + + if (p_pAnswers) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Processing answers...\n"));); + bResult = true; + + // Answers may arrive in an unexpected order. So we loop our answers as long, as we + // can connect new information to service queries + bool bFoundNewKeyAnswer; + do + { + bFoundNewKeyAnswer = false; + + const stcMDNS_RRAnswer* pRRAnswer = p_pAnswers; + while ((pRRAnswer) && + (bResult)) + { + // 1. level answer (PTR) + if (AnswerType_PTR == pRRAnswer->answerType()) + { + // eg. _http._tcp.local PTR xxxx xx MyESP._http._tcp.local + bResult = _processPTRAnswer((stcMDNS_RRAnswerPTR*)pRRAnswer, bFoundNewKeyAnswer); // May 'enable' new SRV or TXT answers to be linked to queries + } + // 2. level answers + // SRV -> host domain and port + else if (AnswerType_SRV == pRRAnswer->answerType()) + { + // eg. MyESP_http._tcp.local SRV xxxx xx yy zz 5000 esp8266.local + bResult = _processSRVAnswer((stcMDNS_RRAnswerSRV*)pRRAnswer, bFoundNewKeyAnswer); // May 'enable' new A/AAAA answers to be linked to queries + } + // TXT -> Txts + else if (AnswerType_TXT == pRRAnswer->answerType()) + { + // eg. MyESP_http._tcp.local TXT xxxx xx c#=1 + bResult = _processTXTAnswer((stcMDNS_RRAnswerTXT*)pRRAnswer); + } + // 3. level answers +#ifdef MDNS_IP4_SUPPORT + // A -> IP4Address + else if (AnswerType_A == pRRAnswer->answerType()) + { + // eg. esp8266.local A xxxx xx 192.168.2.120 + bResult = _processAAnswer((stcMDNS_RRAnswerA*)pRRAnswer); + } +#endif +#ifdef MDNS_IP6_SUPPORT + // AAAA -> IP6Address + else if (AnswerType_AAAA == pRRAnswer->answerType()) + { + // eg. esp8266.local AAAA xxxx xx 09cf::0c + bResult = _processAAAAAnswer((stcMDNS_RRAnswerAAAA*)pRRAnswer); + } +#endif + + // Finally check for probing conflicts + // Host domain + if ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && + ((AnswerType_A == pRRAnswer->answerType()) || + (AnswerType_AAAA == pRRAnswer->answerType()))) + { + + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (pRRAnswer->m_Header.m_Domain == hostDomain)) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Probing CONFLICT found with: %s.local\n"), m_pcHostname);); + _cancelProbingForHost(); + } + } + // Service domains + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + if ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && + ((AnswerType_TXT == pRRAnswer->answerType()) || + (AnswerType_SRV == pRRAnswer->answerType()))) + { + + stcMDNS_RRDomain serviceDomain; + if ((_buildDomainForService(*pService, true, serviceDomain)) && + (pRRAnswer->m_Header.m_Domain == serviceDomain)) + { + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: Probing CONFLICT found with: %s.%s.%s\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); + _cancelProbingForService(*pService); + } + } + } + + pRRAnswer = pRRAnswer->m_pNext; // Next collected answer + } // while (answers) + } while ((bFoundNewKeyAnswer) && + (bResult)); + } // else: No answers provided + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAnswers: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_processPTRAnswer +*/ +bool MDNSResponder::_processPTRAnswer(const MDNSResponder::stcMDNS_RRAnswerPTR* p_pPTRAnswer, + bool& p_rbFoundNewKeyAnswer) +{ + + bool bResult = false; + + if ((bResult = (0 != p_pPTRAnswer))) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: Processing PTR answers...\n"));); + // eg. _http._tcp.local PTR xxxx xx MyESP._http._tcp.local + // Check pending service queries for eg. '_http._tcp' + + stcMDNSServiceQuery* pServiceQuery = _findNextServiceQueryByServiceType(p_pPTRAnswer->m_Header.m_Domain, 0); + while (pServiceQuery) + { + if (pServiceQuery->m_bAwaitingAnswers) + { + // Find answer for service domain (eg. MyESP._http._tcp.local) + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pPTRAnswer->m_PTRDomain); + if (pSQAnswer) // existing answer + { + if (p_pPTRAnswer->m_u32TTL) // Received update message + { + pSQAnswer->m_TTLServiceDomain.set(p_pPTRAnswer->m_u32TTL); // Update TTL tag + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: Updated TTL(%d) for "), (int)p_pPTRAnswer->m_u32TTL); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + ); + } + else // received goodbye-message + { + pSQAnswer->m_TTLServiceDomain.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: 'Goodbye' received for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + ); + } + } + else if ((p_pPTRAnswer->m_u32TTL) && // Not just a goodbye-message + ((pSQAnswer = new stcMDNSServiceQuery::stcAnswer))) // Not yet included -> add answer + { + pSQAnswer->m_ServiceDomain = p_pPTRAnswer->m_PTRDomain; + pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_ServiceDomain; + pSQAnswer->m_TTLServiceDomain.set(p_pPTRAnswer->m_u32TTL); + pSQAnswer->releaseServiceDomain(); + + bResult = pServiceQuery->addAnswer(pSQAnswer); + p_rbFoundNewKeyAnswer = true; + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_ServiceDomain), true); + } + } + } + pServiceQuery = _findNextServiceQueryByServiceType(p_pPTRAnswer->m_Header.m_Domain, pServiceQuery); + } + } // else: No p_pPTRAnswer + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processPTRAnswer: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_processSRVAnswer +*/ +bool MDNSResponder::_processSRVAnswer(const MDNSResponder::stcMDNS_RRAnswerSRV* p_pSRVAnswer, + bool& p_rbFoundNewKeyAnswer) +{ + + bool bResult = false; + + if ((bResult = (0 != p_pSRVAnswer))) + { + // eg. MyESP._http._tcp.local SRV xxxx xx yy zz 5000 esp8266.local + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pSRVAnswer->m_Header.m_Domain); + if (pSQAnswer) // Answer for this service domain (eg. MyESP._http._tcp.local) available + { + if (p_pSRVAnswer->m_u32TTL) // First or update message (TTL != 0) + { + pSQAnswer->m_TTLHostDomainAndPort.set(p_pSRVAnswer->m_u32TTL); // Update TTL tag + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: Updated TTL(%d) for "), (int)p_pSRVAnswer->m_u32TTL); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); + ); + // Host domain & Port + if ((pSQAnswer->m_HostDomain != p_pSRVAnswer->m_SRVDomain) || + (pSQAnswer->m_u16Port != p_pSRVAnswer->m_u16Port)) + { + + pSQAnswer->m_HostDomain = p_pSRVAnswer->m_SRVDomain; + pSQAnswer->releaseHostDomain(); + pSQAnswer->m_u16Port = p_pSRVAnswer->m_u16Port; + pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_HostDomainAndPort; + + p_rbFoundNewKeyAnswer = true; + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_HostDomainAndPort), true); + } + } + } + else // Goodby message + { + pSQAnswer->m_TTLHostDomainAndPort.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: 'Goodbye' received for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); + ); + } + } + pServiceQuery = pServiceQuery->m_pNext; + } // while(service query) + } // else: No p_pSRVAnswer + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_processTXTAnswer +*/ +bool MDNSResponder::_processTXTAnswer(const MDNSResponder::stcMDNS_RRAnswerTXT* p_pTXTAnswer) +{ + + bool bResult = false; + + if ((bResult = (0 != p_pTXTAnswer))) + { + // eg. MyESP._http._tcp.local TXT xxxx xx c#=1 + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForServiceDomain(p_pTXTAnswer->m_Header.m_Domain); + if (pSQAnswer) // Answer for this service domain (eg. MyESP._http._tcp.local) available + { + if (p_pTXTAnswer->m_u32TTL) // First or update message + { + pSQAnswer->m_TTLTxts.set(p_pTXTAnswer->m_u32TTL); // Update TTL tag + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: Updated TTL(%d) for "), (int)p_pTXTAnswer->m_u32TTL); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); + ); + if (!pSQAnswer->m_Txts.compare(p_pTXTAnswer->m_Txts)) + { + pSQAnswer->m_Txts = p_pTXTAnswer->m_Txts; + pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_Txts; + pSQAnswer->releaseTxts(); + + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_Txts), true); + } + } + } + else // Goodby message + { + pSQAnswer->m_TTLTxts.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: 'Goodbye' received for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); + ); + } + } + pServiceQuery = pServiceQuery->m_pNext; + } // while(service query) + } // else: No p_pTXTAnswer + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: FAILED!\n")); + }); + return bResult; +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::_processAAnswer +*/ +bool MDNSResponder::_processAAnswer(const MDNSResponder::stcMDNS_RRAnswerA* p_pAAnswer) +{ + + bool bResult = false; + + if ((bResult = (0 != p_pAAnswer))) + { + // eg. esp8266.local A xxxx xx 192.168.2.120 + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForHostDomain(p_pAAnswer->m_Header.m_Domain); + if (pSQAnswer) // Answer for this host domain (eg. esp8266.local) available + { + stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = pSQAnswer->findIP4Address(p_pAAnswer->m_IPAddress); + if (pIP4Address) + { + // Already known IP4 address + if (p_pAAnswer->m_u32TTL) // Valid TTL -> Update answers TTL + { + pIP4Address->m_TTL.set(p_pAAnswer->m_u32TTL); + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: Updated TTL(%d) for "), (int)p_pAAnswer->m_u32TTL); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP4Address (%s)\n"), pIP4Address->m_IPAddress.toString().c_str()); + ); + } + else // 'Goodbye' message for known IP4 address + { + pIP4Address->m_TTL.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: 'Goodbye' received for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP4 address (%s)\n"), pIP4Address->m_IPAddress.toString().c_str()); + ); + } + } + else + { + // Until now unknown IP4 address -> Add (if the message isn't just a 'Goodbye' note) + if (p_pAAnswer->m_u32TTL) // NOT just a 'Goodbye' message + { + pIP4Address = new stcMDNSServiceQuery::stcAnswer::stcIP4Address(p_pAAnswer->m_IPAddress, p_pAAnswer->m_u32TTL); + if ((pIP4Address) && + (pSQAnswer->addIP4Address(pIP4Address))) + { + + pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_IP4Address; + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_IP4Address), true); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED to add IP4 address (%s)!\n"), p_pAAnswer->m_IPAddress.toString().c_str());); + } + } + } + } + pServiceQuery = pServiceQuery->m_pNext; + } // while(service query) + } // else: No p_pAAnswer + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED!\n")); + }); + return bResult; +} +#endif + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::_processAAAAAnswer +*/ +bool MDNSResponder::_processAAAAAnswer(const MDNSResponder::stcMDNS_RRAnswerAAAA* p_pAAAAAnswer) +{ + + bool bResult = false; + + if ((bResult = (0 != p_pAAAAAnswer))) + { + // eg. esp8266.local AAAA xxxx xx 0bf3::0c + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->findAnswerForHostDomain(p_pAAAAAnswer->m_Header.m_Domain); + if (pSQAnswer) // Answer for this host domain (eg. esp8266.local) available + { + stcIP6Address* pIP6Address = pSQAnswer->findIP6Address(p_pAAAAAnswer->m_IPAddress); + if (pIP6Address) + { + // Already known IP6 address + if (p_pAAAAAnswer->m_u32TTL) // Valid TTL -> Update answers TTL + { + pIP6Address->m_TTL.set(p_pAAAAAnswer->m_u32TTL); + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: Updated TTL(%lu) for "), p_pAAAAAnswer->m_u32TTL); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), pIP6Address->m_IPAddress.toString().c_str()); + ); + } + else // 'Goodbye' message for known IP6 address + { + pIP6Address->m_TTL.prepareDeletion(); // Prepare answer deletion according to RFC 6762, 10.1 + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: 'Goodbye' received for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), pIP6Address->m_IPAddress.toString().c_str()); + ); + } + } + else + { + // Until now unknown IP6 address -> Add (if the message isn't just a 'Goodbye' note) + if (p_pAAAAAnswer->m_u32TTL) // NOT just a 'Goodbye' message + { + pIP6Address = new stcIP6Address(p_pAAAAAnswer->m_IPAddress, p_pAAAAAnswer->m_u32TTL); + if ((pIP6Address) && + (pSQAnswer->addIP6Address(pIP6Address))) + { + + pSQAnswer->m_u32ContentFlags |= ServiceQueryAnswerType_IP6Address; + + if (pServiceQuery->m_fnCallback) + { + pServiceQuery->m_fnCallback(this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer), ServiceQueryAnswerType_IP6Address, true, pServiceQuery->m_pUserdata); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED to add IP6 address (%s)!\n"), p_pAAAAAnswer->m_IPAddress.toString().c_str());); + } + } + } + } + pServiceQuery = pServiceQuery->m_pNext; + } // while(service query) + } // else: No p_pAAAAAnswer + + return bResult; +} +#endif + + +/* + PROBING +*/ + +/* + MDNSResponder::_updateProbeStatus + + Manages the (outgoing) probing process. + - If probing has not been started yet (ProbingStatus_NotStarted), the initial delay (see RFC 6762) is determined and + the process is started + - After timeout (of initial or subsequential delay) a probe message is send out for three times. If the message has + already been sent out three times, the probing has been successful and is finished. + + Conflict management is handled in '_parseResponse ff.' + Tiebraking is handled in 'parseQuery ff.' +*/ +bool MDNSResponder::_updateProbeStatus(void) +{ + + bool bResult = true; + + // + // Probe host domain + if ((ProbingStatus_ReadyToStart == m_HostProbeInformation.m_ProbingStatus) && // Ready to get started AND + //TODO: Fix the following to allow Ethernet shield or other interfaces + (_getResponseMulticastInterface() != IPAddress())) // Has IP address + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Starting host probing...\n"));); + + // First probe delay SHOULD be random 0-250 ms + m_HostProbeInformation.m_Timeout.reset(rand() % MDNS_PROBE_DELAY); + m_HostProbeInformation.m_ProbingStatus = ProbingStatus_InProgress; + } + else if ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && // Probing AND + (m_HostProbeInformation.m_Timeout.expired())) // Time for next probe + { + + if (MDNS_PROBE_COUNT > m_HostProbeInformation.m_u8SentCount) // Send next probe + { + if ((bResult = _sendHostProbe())) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Did sent host probe\n\n"));); + m_HostProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); + ++m_HostProbeInformation.m_u8SentCount; + } + } + else // Probing finished + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done host probing.\n"));); + m_HostProbeInformation.m_ProbingStatus = ProbingStatus_Done; + m_HostProbeInformation.m_Timeout.resetToNeverExpires(); + if (m_HostProbeInformation.m_fnHostProbeResultCallback) + { + m_HostProbeInformation.m_fnHostProbeResultCallback(m_pcHostname, true); + } + + // Prepare to announce host + m_HostProbeInformation.m_u8SentCount = 0; + m_HostProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Prepared host announcing.\n\n"));); + } + } // else: Probing already finished OR waiting for next time slot + else if ((ProbingStatus_Done == m_HostProbeInformation.m_ProbingStatus) && + (m_HostProbeInformation.m_Timeout.expired())) + { + + if ((bResult = _announce(true, false))) // Don't announce services here + { + ++m_HostProbeInformation.m_u8SentCount; + + if (MDNS_ANNOUNCE_COUNT > m_HostProbeInformation.m_u8SentCount) + { + m_HostProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Announcing host (%d).\n\n"), m_HostProbeInformation.m_u8SentCount);); + } + else + { + m_HostProbeInformation.m_Timeout.resetToNeverExpires(); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done host announcing.\n\n"));); + } + } + } + + // + // Probe services + for (stcMDNSService* pService = m_pServices; ((bResult) && (pService)); pService = pService->m_pNext) + { + if (ProbingStatus_ReadyToStart == pService->m_ProbeInformation.m_ProbingStatus) // Ready to get started + { + + pService->m_ProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); // More or equal than first probe for host domain + pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_InProgress; + } + else if ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && // Probing AND + (pService->m_ProbeInformation.m_Timeout.expired())) // Time for next probe + { + + if (MDNS_PROBE_COUNT > pService->m_ProbeInformation.m_u8SentCount) // Send next probe + { + if ((bResult = _sendServiceProbe(*pService))) + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Did sent service probe (%u)\n\n"), (pService->m_ProbeInformation.m_u8SentCount + 1));); + pService->m_ProbeInformation.m_Timeout.reset(MDNS_PROBE_DELAY); + ++pService->m_ProbeInformation.m_u8SentCount; + } + } + else // Probing finished + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done service probing %s.%s.%s\n\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); + pService->m_ProbeInformation.m_ProbingStatus = ProbingStatus_Done; + pService->m_ProbeInformation.m_Timeout.resetToNeverExpires(); + if (pService->m_ProbeInformation.m_fnServiceProbeResultCallback) + { + pService->m_ProbeInformation.m_fnServiceProbeResultCallback(pService->m_pcName, pService, true); + } + // Prepare to announce service + pService->m_ProbeInformation.m_u8SentCount = 0; + pService->m_ProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Prepared service announcing.\n\n"));); + } + } // else: Probing already finished OR waiting for next time slot + else if ((ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus) && + (pService->m_ProbeInformation.m_Timeout.expired())) + { + + if ((bResult = _announceService(*pService))) // Announce service + { + ++pService->m_ProbeInformation.m_u8SentCount; + + if (MDNS_ANNOUNCE_COUNT > pService->m_ProbeInformation.m_u8SentCount) + { + pService->m_ProbeInformation.m_Timeout.reset(MDNS_ANNOUNCE_DELAY); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Announcing service %s.%s.%s (%d)\n\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol, pService->m_ProbeInformation.m_u8SentCount);); + } + else + { + pService->m_ProbeInformation.m_Timeout.resetToNeverExpires(); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: Done service announcing for %s.%s.%s\n\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol);); + } + } + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _updateProbeStatus: FAILED!\n\n")); + }); + return bResult; +} + +/* + MDNSResponder::_resetProbeStatus + + Resets the probe status. + If 'p_bRestart' is set, the status is set to ProbingStatus_NotStarted. Consequently, + when running 'updateProbeStatus' (which is done in every '_update' loop), the probing + process is restarted. +*/ +bool MDNSResponder::_resetProbeStatus(bool p_bRestart /*= true*/) +{ + + m_HostProbeInformation.clear(false); + m_HostProbeInformation.m_ProbingStatus = (p_bRestart ? ProbingStatus_ReadyToStart : ProbingStatus_Done); + + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + pService->m_ProbeInformation.clear(false); + pService->m_ProbeInformation.m_ProbingStatus = (p_bRestart ? ProbingStatus_ReadyToStart : ProbingStatus_Done); + } + return true; +} + +/* + MDNSResponder::_hasProbesWaitingForAnswers +*/ +bool MDNSResponder::_hasProbesWaitingForAnswers(void) const +{ + + bool bResult = ((ProbingStatus_InProgress == m_HostProbeInformation.m_ProbingStatus) && // Probing + (0 < m_HostProbeInformation.m_u8SentCount)); // And really probing + + for (stcMDNSService* pService = m_pServices; ((!bResult) && (pService)); pService = pService->m_pNext) + { + bResult = ((ProbingStatus_InProgress == pService->m_ProbeInformation.m_ProbingStatus) && // Probing + (0 < pService->m_ProbeInformation.m_u8SentCount)); // And really probing + } + return bResult; +} + +/* + MDNSResponder::_sendHostProbe + + Asks (probes) in the local network for the planned host domain + - (eg. esp8266.local) + + To allow 'tiebreaking' (see '_parseQuery'), the answers for these questions are delivered in + the 'knwon answers' section of the query. + Host domain: + - A/AAAA (eg. esp8266.esp -> 192.168.2.120) +*/ +bool MDNSResponder::_sendHostProbe(void) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe (%s, %lu)\n"), m_pcHostname, millis());); + + bool bResult = true; + + // Requests for host domain + stcMDNSSendParameter sendParameter; + sendParameter.m_bCacheFlush = false; // RFC 6762 10.2 + + sendParameter.m_pQuestions = new stcMDNS_RRQuestion; + if (((bResult = (0 != sendParameter.m_pQuestions))) && + ((bResult = _buildDomainForHost(m_pcHostname, sendParameter.m_pQuestions->m_Header.m_Domain)))) + { + + //sendParameter.m_pQuestions->m_bUnicast = true; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = DNS_RRTYPE_ANY; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (0x8000 | DNS_RRCLASS_IN); // Unicast & INternet + + // Add known answers +#ifdef MDNS_IP4_SUPPORT + sendParameter.m_u8HostReplyMask |= ContentFlag_A; // Add A answer +#endif +#ifdef MDNS_IP6_SUPPORT + sendParameter.m_u8HostReplyMask |= ContentFlag_AAAA; // Add AAAA answer +#endif + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe: FAILED to create host question!\n"));); + if (sendParameter.m_pQuestions) + { + delete sendParameter.m_pQuestions; + sendParameter.m_pQuestions = 0; + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendHostProbe: FAILED!\n")); + }); + return ((bResult) && + (_sendMDNSMessage(sendParameter))); +} + +/* + MDNSResponder::_sendServiceProbe + + Asks (probes) in the local network for the planned service instance domain + - (eg. MyESP._http._tcp.local). + + To allow 'tiebreaking' (see '_parseQuery'), the answers for these questions are delivered in + the 'knwon answers' section of the query. + Service domain: + - SRV (eg. MyESP._http._tcp.local -> 5000 esp8266.local) + - PTR NAME (eg. _http._tcp.local -> MyESP._http._tcp.local) (TODO: Check if needed, maybe TXT is better) +*/ +bool MDNSResponder::_sendServiceProbe(stcMDNSService& p_rService) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe (%s.%s.%s, %lu)\n"), (p_rService.m_pcName ? : m_pcHostname), p_rService.m_pcService, p_rService.m_pcProtocol, millis());); + + bool bResult = true; + + // Requests for service instance domain + stcMDNSSendParameter sendParameter; + sendParameter.m_bCacheFlush = false; // RFC 6762 10.2 + + sendParameter.m_pQuestions = new stcMDNS_RRQuestion; + if (((bResult = (0 != sendParameter.m_pQuestions))) && + ((bResult = _buildDomainForService(p_rService, true, sendParameter.m_pQuestions->m_Header.m_Domain)))) + { + + sendParameter.m_pQuestions->m_bUnicast = true; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = DNS_RRTYPE_ANY; + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (0x8000 | DNS_RRCLASS_IN); // Unicast & INternet + + // Add known answers + p_rService.m_u8ReplyMask = (ContentFlag_SRV | ContentFlag_PTR_NAME); // Add SRV and PTR NAME answers + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe: FAILED to create service question!\n"));); + if (sendParameter.m_pQuestions) + { + delete sendParameter.m_pQuestions; + sendParameter.m_pQuestions = 0; + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendServiceProbe: FAILED!\n")); + }); + return ((bResult) && + (_sendMDNSMessage(sendParameter))); +} + +/* + MDNSResponder::_cancelProbingForHost +*/ +bool MDNSResponder::_cancelProbingForHost(void) +{ + + bool bResult = false; + + m_HostProbeInformation.clear(false); + // Send host notification + if (m_HostProbeInformation.m_fnHostProbeResultCallback) + { + m_HostProbeInformation.m_fnHostProbeResultCallback(m_pcHostname, false); + + bResult = true; + } + + for (stcMDNSService* pService = m_pServices; ((!bResult) && (pService)); pService = pService->m_pNext) + { + bResult = _cancelProbingForService(*pService); + } + return bResult; +} + +/* + MDNSResponder::_cancelProbingForService +*/ +bool MDNSResponder::_cancelProbingForService(stcMDNSService& p_rService) +{ + + bool bResult = false; + + p_rService.m_ProbeInformation.clear(false); + // Send notification + if (p_rService.m_ProbeInformation.m_fnServiceProbeResultCallback) + { + p_rService.m_ProbeInformation.m_fnServiceProbeResultCallback(p_rService.m_pcName, &p_rService, false); + bResult = true; + } + return bResult; +} + + + +/** + ANNOUNCING +*/ + +/* + MDNSResponder::_announce + + Announces the host domain: + - A/AAAA (eg. esp8266.local -> 192.168.2.120) + - PTR (eg. 192.168.2.120.in-addr.arpa -> esp8266.local) + + and all presented services: + - PTR_TYPE (_services._dns-sd._udp.local -> _http._tcp.local) + - PTR_NAME (eg. _http._tcp.local -> MyESP8266._http._tcp.local) + - SRV (eg. MyESP8266._http._tcp.local -> 5000 esp8266.local) + - TXT (eg. MyESP8266._http._tcp.local -> c#=1) + + Goodbye (Un-Announcing) for the host domain and all services is also handled here. + Goodbye messages are created by setting the TTL for the answer to 0, this happens + inside the '_writeXXXAnswer' procs via 'sendParameter.m_bUnannounce = true' +*/ +bool MDNSResponder::_announce(bool p_bAnnounce, + bool p_bIncludeServices) +{ + + bool bResult = false; + + stcMDNSSendParameter sendParameter; + if (ProbingStatus_Done == m_HostProbeInformation.m_ProbingStatus) + { + + bResult = true; + + sendParameter.m_bResponse = true; // Announces are 'Unsolicited authorative responses' + sendParameter.m_bAuthorative = true; + sendParameter.m_bUnannounce = !p_bAnnounce; // When unannouncing, the TTL is set to '0' while creating the answers + + // Announce host + sendParameter.m_u8HostReplyMask = 0; +#ifdef MDNS_IP4_SUPPORT + sendParameter.m_u8HostReplyMask |= ContentFlag_A; // A answer + sendParameter.m_u8HostReplyMask |= ContentFlag_PTR_IP4; // PTR_IP4 answer +#endif +#ifdef MDNS_IP6_SUPPORT + sendParameter.m_u8HostReplyMask |= ContentFlag_AAAA; // AAAA answer + sendParameter.m_u8HostReplyMask |= ContentFlag_PTR_IP6; // PTR_IP6 answer +#endif + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: Announcing host %s (content 0x%X)\n"), m_pcHostname, sendParameter.m_u8HostReplyMask);); + + if (p_bIncludeServices) + { + // Announce services (service type, name, SRV (location) and TXTs) + for (stcMDNSService* pService = m_pServices; ((bResult) && (pService)); pService = pService->m_pNext) + { + if (ProbingStatus_Done == pService->m_ProbeInformation.m_ProbingStatus) + { + pService->m_u8ReplyMask = (ContentFlag_PTR_TYPE | ContentFlag_PTR_NAME | ContentFlag_SRV | ContentFlag_TXT); + + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: Announcing service %s.%s.%s (content %u)\n"), (pService->m_pcName ? : m_pcHostname), pService->m_pcService, pService->m_pcProtocol, pService->m_u8ReplyMask);); + } + } + } + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announce: FAILED!\n")); + }); + return ((bResult) && + (_sendMDNSMessage(sendParameter))); +} + +/* + MDNSResponder::_announceService +*/ +bool MDNSResponder::_announceService(stcMDNSService& p_rService, + bool p_bAnnounce /*= true*/) +{ + + bool bResult = false; + + stcMDNSSendParameter sendParameter; + if (ProbingStatus_Done == p_rService.m_ProbeInformation.m_ProbingStatus) + { + + sendParameter.m_bResponse = true; // Announces are 'Unsolicited authorative responses' + sendParameter.m_bAuthorative = true; + sendParameter.m_bUnannounce = !p_bAnnounce; // When unannouncing, the TTL is set to '0' while creating the answers + + // DON'T announce host + sendParameter.m_u8HostReplyMask = 0; + + // Announce services (service type, name, SRV (location) and TXTs) + p_rService.m_u8ReplyMask = (ContentFlag_PTR_TYPE | ContentFlag_PTR_NAME | ContentFlag_SRV | ContentFlag_TXT); + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announceService: Announcing service %s.%s.%s (content 0x%X)\n"), (p_rService.m_pcName ? : m_pcHostname), p_rService.m_pcService, p_rService.m_pcProtocol, p_rService.m_u8ReplyMask);); + + bResult = true; + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _announceService: FAILED!\n")); + }); + return ((bResult) && + (_sendMDNSMessage(sendParameter))); +} + + +/** + SERVICE QUERY CACHE +*/ + +/* + MDNSResponder::_hasServiceQueriesWaitingForAnswers +*/ +bool MDNSResponder::_hasServiceQueriesWaitingForAnswers(void) const +{ + + bool bOpenQueries = false; + + for (stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; pServiceQuery; pServiceQuery = pServiceQuery->m_pNext) + { + if (pServiceQuery->m_bAwaitingAnswers) + { + bOpenQueries = true; + break; + } + } + return bOpenQueries; +} + +/* + MDNSResponder::_checkServiceQueryCache + + For any 'living' service query (m_bAwaitingAnswers == true) all available answers (their components) + are checked for topicality based on the stored reception time and the answers TTL. + When the components TTL is outlasted by more than 80%, a new question is generated, to get updated information. + When no update arrived (in time), the component is removed from the answer (cache). + +*/ +bool MDNSResponder::_checkServiceQueryCache(void) +{ + + bool bResult = true; + + DEBUG_EX_INFO( + bool printedInfo = false; + ); + for (stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; ((bResult) && (pServiceQuery)); pServiceQuery = pServiceQuery->m_pNext) + { + + // + // Resend dynamic service queries, if not already done often enough + if ((!pServiceQuery->m_bLegacyQuery) && + (MDNS_DYNAMIC_QUERY_RESEND_COUNT > pServiceQuery->m_u8SentCount) && + (pServiceQuery->m_ResendTimeout.expired())) + { + + if ((bResult = _sendMDNSServiceQuery(*pServiceQuery))) + { + ++pServiceQuery->m_u8SentCount; + pServiceQuery->m_ResendTimeout.reset((MDNS_DYNAMIC_QUERY_RESEND_COUNT > pServiceQuery->m_u8SentCount) + ? (MDNS_DYNAMIC_QUERY_RESEND_DELAY * (pServiceQuery->m_u8SentCount - 1)) + : esp8266::polledTimeout::oneShotMs::neverExpires); + } + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: %s to resend service query!"), (bResult ? "Succeeded" : "FAILED")); + printedInfo = true; + ); + } + + // + // Schedule updates for cached answers + if (pServiceQuery->m_bAwaitingAnswers) + { + stcMDNSServiceQuery::stcAnswer* pSQAnswer = pServiceQuery->m_pAnswers; + while ((bResult) && + (pSQAnswer)) + { + stcMDNSServiceQuery::stcAnswer* pNextSQAnswer = pSQAnswer->m_pNext; + + // 1. level answer + if ((bResult) && + (pSQAnswer->m_TTLServiceDomain.flagged())) + { + + if (!pSQAnswer->m_TTLServiceDomain.finalTimeoutLevel()) + { + + bResult = ((_sendMDNSServiceQuery(*pServiceQuery)) && + (pSQAnswer->m_TTLServiceDomain.restart())); + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: PTR update scheduled for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" %s\n"), (bResult ? "OK" : "FAILURE")); + printedInfo = true; + ); + } + else + { + // Timed out! -> Delete + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_ServiceDomain), false); + } + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove PTR answer for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + printedInfo = true; + ); + + bResult = pServiceQuery->removeAnswer(pSQAnswer); + pSQAnswer = 0; + continue; // Don't use this answer anymore + } + } // ServiceDomain flagged + + // 2. level answers + // HostDomain & Port (from SRV) + if ((bResult) && + (pSQAnswer->m_TTLHostDomainAndPort.flagged())) + { + + if (!pSQAnswer->m_TTLHostDomainAndPort.finalTimeoutLevel()) + { + + bResult = ((_sendMDNSQuery(pSQAnswer->m_ServiceDomain, DNS_RRTYPE_SRV)) && + (pSQAnswer->m_TTLHostDomainAndPort.restart())); + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: SRV update scheduled for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" host domain and port %s\n"), (bResult ? "OK" : "FAILURE")); + printedInfo = true; + ); + } + else + { + // Timed out! -> Delete + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove SRV answer for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" host domain and port\n")); + printedInfo = true; + ); + // Delete + pSQAnswer->m_HostDomain.clear(); + pSQAnswer->releaseHostDomain(); + pSQAnswer->m_u16Port = 0; + pSQAnswer->m_TTLHostDomainAndPort.set(0); + uint32_t u32ContentFlags = ServiceQueryAnswerType_HostDomainAndPort; + // As the host domain is the base for the IP4- and IP6Address, remove these too +#ifdef MDNS_IP4_SUPPORT + pSQAnswer->releaseIP4Addresses(); + u32ContentFlags |= ServiceQueryAnswerType_IP4Address; +#endif +#ifdef MDNS_IP6_SUPPORT + pSQAnswer->releaseIP6Addresses(); + u32ContentFlags |= ServiceQueryAnswerType_IP6Address; +#endif + + // Remove content flags for deleted answer parts + pSQAnswer->m_u32ContentFlags &= ~u32ContentFlags; + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(u32ContentFlags), false); + } + } + } // HostDomainAndPort flagged + + // Txts (from TXT) + if ((bResult) && + (pSQAnswer->m_TTLTxts.flagged())) + { + + if (!pSQAnswer->m_TTLTxts.finalTimeoutLevel()) + { + + bResult = ((_sendMDNSQuery(pSQAnswer->m_ServiceDomain, DNS_RRTYPE_TXT)) && + (pSQAnswer->m_TTLTxts.restart())); + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: TXT update scheduled for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" TXTs %s\n"), (bResult ? "OK" : "FAILURE")); + printedInfo = true; + ); + } + else + { + // Timed out! -> Delete + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove TXT answer for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" TXTs\n")); + printedInfo = true; + ); + // Delete + pSQAnswer->m_Txts.clear(); + pSQAnswer->m_TTLTxts.set(0); + + // Remove content flags for deleted answer parts + pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_Txts; + + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_Txts), false); + } + } + } // TXTs flagged + + // 3. level answers +#ifdef MDNS_IP4_SUPPORT + // IP4Address (from A) + stcMDNSServiceQuery::stcAnswer::stcIP4Address* pIP4Address = pSQAnswer->m_pIP4Addresses; + bool bAUpdateQuerySent = false; + while ((pIP4Address) && + (bResult)) + { + + stcMDNSServiceQuery::stcAnswer::stcIP4Address* pNextIP4Address = pIP4Address->m_pNext; // Get 'next' early, as 'current' may be deleted at the end... + + if (pIP4Address->m_TTL.flagged()) + { + + if (!pIP4Address->m_TTL.finalTimeoutLevel()) // Needs update + { + + if ((bAUpdateQuerySent) || + ((bResult = _sendMDNSQuery(pSQAnswer->m_HostDomain, DNS_RRTYPE_A)))) + { + + pIP4Address->m_TTL.restart(); + bAUpdateQuerySent = true; + + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: IP4 update scheduled for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP4 address (%s)\n"), (pIP4Address->m_IPAddress.toString().c_str())); + printedInfo = true; + ); + } + } + else + { + // Timed out! -> Delete + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove IP4 answer for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP4 address\n")); + printedInfo = true; + ); + pSQAnswer->removeIP4Address(pIP4Address); + if (!pSQAnswer->m_pIP4Addresses) // NO IP4 address left -> remove content flag + { + pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_IP4Address; + } + // Notify client + if (pServiceQuery->m_fnCallback) + { + MDNSServiceInfo serviceInfo(*this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer)); + pServiceQuery->m_fnCallback(serviceInfo, static_cast(ServiceQueryAnswerType_IP4Address), false); + } + } + } // IP4 flagged + + pIP4Address = pNextIP4Address; // Next + } // while +#endif +#ifdef MDNS_IP6_SUPPORT + // IP6Address (from AAAA) + stcMDNSServiceQuery::stcAnswer::stcIP6Address* pIP6Address = pSQAnswer->m_pIP6Addresses; + bool bAAAAUpdateQuerySent = false; + while ((pIP6Address) && + (bResult)) + { + + stcMDNSServiceQuery::stcAnswer::stcIP6Address* pNextIP6Address = pIP6Address->m_pNext; // Get 'next' early, as 'current' may be deleted at the end... + + if (pIP6Address->m_TTL.flagged()) + { + + if (!pIP6Address->m_TTL.finalTimeoutLevel()) // Needs update + { + + if ((bAAAAUpdateQuerySent) || + ((bResult = _sendMDNSQuery(pSQAnswer->m_HostDomain, DNS_RRTYPE_AAAA)))) + { + + pIP6Address->m_TTL.restart(); + bAAAAUpdateQuerySent = true; + + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: IP6 update scheduled for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP6 address (%s)\n"), (pIP6Address->m_IPAddress.toString().c_str())); + printedInfo = true; + ); + } + } + else + { + // Timed out! -> Delete + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: Will remove answer for ")); + _printRRDomain(pSQAnswer->m_ServiceDomain); + DEBUG_OUTPUT.printf_P(PSTR(" IP6Address\n")); + printedInfo = true; + ); + pSQAnswer->removeIP6Address(pIP6Address); + if (!pSQAnswer->m_pIP6Addresses) // NO IP6 address left -> remove content flag + { + pSQAnswer->m_u32ContentFlags &= ~ServiceQueryAnswerType_IP6Address; + } + // Notify client + if (pServiceQuery->m_fnCallback) + { + pServiceQuery->m_fnCallback(this, (hMDNSServiceQuery)pServiceQuery, pServiceQuery->indexOfAnswer(pSQAnswer), ServiceQueryAnswerType_IP6Address, false, pServiceQuery->m_pUserdata); + } + } + } // IP6 flagged + + pIP6Address = pNextIP6Address; // Next + } // while +#endif + pSQAnswer = pNextSQAnswer; + } + } + } + DEBUG_EX_INFO( + if (printedInfo) +{ + DEBUG_OUTPUT.printf_P(PSTR("\n")); + } + ); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _checkServiceQueryCache: FAILED!\n")); + }); + return bResult; +} + + +/* + MDNSResponder::_replyMaskForHost + + Determines the relavant host answers for the given question. + - A question for the hostname (eg. esp8266.local) will result in an A/AAAA (eg. 192.168.2.129) reply. + - A question for the reverse IP address (eg. 192-168.2.120.inarpa.arpa) will result in an PTR_IP4 (eg. esp8266.local) reply. + + In addition, a full name match (question domain == host domain) is marked. +*/ +uint8_t MDNSResponder::_replyMaskForHost(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader, + bool* p_pbFullNameMatch /*= 0*/) const +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost\n"));); + + uint8_t u8ReplyMask = 0; + (p_pbFullNameMatch ? *p_pbFullNameMatch = false : 0); + + if ((DNS_RRCLASS_IN == p_RRHeader.m_Attributes.m_u16Class) || + (DNS_RRCLASS_ANY == p_RRHeader.m_Attributes.m_u16Class)) + { + + if ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) + { + // PTR request +#ifdef MDNS_IP4_SUPPORT + stcMDNS_RRDomain reverseIP4Domain; + if ((_buildDomainForReverseIP4(_getResponseMulticastInterface(), reverseIP4Domain)) && + (p_RRHeader.m_Domain == reverseIP4Domain)) + { + // Reverse domain match + u8ReplyMask |= ContentFlag_PTR_IP4; + } +#endif +#ifdef MDNS_IP6_SUPPORT + // TODO +#endif + } // Address qeuest + + stcMDNS_RRDomain hostDomain; + if ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (p_RRHeader.m_Domain == hostDomain)) // Host domain match + { + + (p_pbFullNameMatch ? (*p_pbFullNameMatch = true) : (0)); + +#ifdef MDNS_IP4_SUPPORT + if ((DNS_RRTYPE_A == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) + { + // IP4 address request + u8ReplyMask |= ContentFlag_A; + } +#endif +#ifdef MDNS_IP6_SUPPORT + if ((DNS_RRTYPE_AAAA == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) + { + // IP6 address request + u8ReplyMask |= ContentFlag_AAAA; + } +#endif + } + } + else + { + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost: INVALID RR-class (0x%04X)!\n"), p_RRHeader.m_Attributes.m_u16Class);); + } + DEBUG_EX_INFO(if (u8ReplyMask) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForHost: 0x%X\n"), u8ReplyMask); + }); + return u8ReplyMask; +} + +/* + MDNSResponder::_replyMaskForService + + Determines the relevant service answers for the given question + - A PTR dns-sd service enum question (_services.dns-sd._udp.local) will result into an PTR_TYPE (eg. _http._tcp.local) answer + - A PTR service type question (eg. _http._tcp.local) will result into an PTR_NAME (eg. MyESP._http._tcp.local) answer + - A PTR service name question (eg. MyESP._http._tcp.local) will result into an PTR_NAME (eg. MyESP._http._tcp.local) answer + - A SRV service name question (eg. MyESP._http._tcp.local) will result into an SRV (eg. 5000 MyESP.local) answer + - A TXT service name question (eg. MyESP._http._tcp.local) will result into an TXT (eg. c#=1) answer + + In addition, a full name match (question domain == service instance domain) is marked. +*/ +uint8_t MDNSResponder::_replyMaskForService(const MDNSResponder::stcMDNS_RRHeader& p_RRHeader, + const MDNSResponder::stcMDNSService& p_Service, + bool* p_pbFullNameMatch /*= 0*/) const +{ + + uint8_t u8ReplyMask = 0; + (p_pbFullNameMatch ? *p_pbFullNameMatch = false : 0); + + if ((DNS_RRCLASS_IN == p_RRHeader.m_Attributes.m_u16Class) || + (DNS_RRCLASS_ANY == p_RRHeader.m_Attributes.m_u16Class)) + { + + stcMDNS_RRDomain DNSSDDomain; + if ((_buildDomainForDNSSD(DNSSDDomain)) && // _services._dns-sd._udp.local + (p_RRHeader.m_Domain == DNSSDDomain) && + ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type))) + { + // Common service info requested + u8ReplyMask |= ContentFlag_PTR_TYPE; + } + + stcMDNS_RRDomain serviceDomain; + if ((_buildDomainForService(p_Service, false, serviceDomain)) && // eg. _http._tcp.local + (p_RRHeader.m_Domain == serviceDomain) && + ((DNS_RRTYPE_PTR == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type))) + { + // Special service info requested + u8ReplyMask |= ContentFlag_PTR_NAME; + } + + if ((_buildDomainForService(p_Service, true, serviceDomain)) && // eg. MyESP._http._tcp.local + (p_RRHeader.m_Domain == serviceDomain)) + { + + (p_pbFullNameMatch ? (*p_pbFullNameMatch = true) : (0)); + + if ((DNS_RRTYPE_SRV == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) + { + // Instance info SRV requested + u8ReplyMask |= ContentFlag_SRV; + } + if ((DNS_RRTYPE_TXT == p_RRHeader.m_Attributes.m_u16Type) || + (DNS_RRTYPE_ANY == p_RRHeader.m_Attributes.m_u16Type)) + { + // Instance info TXT requested + u8ReplyMask |= ContentFlag_TXT; + } + } + } + else + { + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForService: INVALID RR-class (0x%04X)!\n"), p_RRHeader.m_Attributes.m_u16Class);); + } + DEBUG_EX_INFO(if (u8ReplyMask) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _replyMaskForService(%s.%s.%s): 0x%X\n"), p_Service.m_pcName, p_Service.m_pcService, p_Service.m_pcProtocol, u8ReplyMask); + }); + return u8ReplyMask; +} + +} // namespace MDNSImplementation + +} // namespace esp8266 diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Helpers.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Helpers.cpp index cf5cab07b..d23941ce5 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Helpers.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Helpers.cpp @@ -1,750 +1,850 @@ -/* - * LEAmDNS_Helpers.cpp - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "lwip/igmp.h" - -#include "LEAmDNS_lwIPdefs.h" -#include "LEAmDNS_Priv.h" - - -namespace { - -/* - * strrstr (static) - * - * Backwards search for p_pcPattern in p_pcString - * Based on: https://stackoverflow.com/a/1634398/2778898 - * - */ -const char* strrstr(const char*__restrict p_pcString, const char*__restrict p_pcPattern) { - - const char* pcResult = 0; - - size_t stStringLength = (p_pcString ? strlen(p_pcString) : 0); - size_t stPatternLength = (p_pcPattern ? strlen(p_pcPattern) : 0); - - if ((stStringLength) && - (stPatternLength) && - (stPatternLength <= stStringLength)) { - // Pattern is shorter or has the same length tham the string - - for (const char* s=(p_pcString + stStringLength - stPatternLength); s>=p_pcString; --s) { - if (0 == strncmp(s, p_pcPattern, stPatternLength)) { - pcResult = s; - break; - } - } - } - return pcResult; -} - - -} // anonymous - - - - - -namespace esp8266 { - -/* - * LEAmDNS - */ -namespace MDNSImplementation { - -/** - * HELPERS - */ - -/* - * MDNSResponder::indexDomain (static) - * - * Updates the given domain 'p_rpcHostname' by appending a delimiter and an index number. - * - * If the given domain already hasa numeric index (after the given delimiter), this index - * incremented. If not, the delimiter and index '2' is added. - * - * If 'p_rpcHostname' is empty (==0), the given default name 'p_pcDefaultHostname' is used, - * if no default is given, 'esp8266' is used. - * - */ -/*static*/ bool MDNSResponder::indexDomain(char*& p_rpcDomain, - const char* p_pcDivider /*= "-"*/, - const char* p_pcDefaultDomain /*= 0*/) { - - bool bResult = false; - - // Ensure a divider exists; use '-' as default - const char* pcDivider = (p_pcDivider ?: "-"); - - if (p_rpcDomain) { - const char* pFoundDivider = strrstr(p_rpcDomain, pcDivider); - if (pFoundDivider) { // maybe already extended - char* pEnd = 0; - unsigned long ulIndex = strtoul((pFoundDivider + strlen(pcDivider)), &pEnd, 10); - if ((ulIndex) && - ((pEnd - p_rpcDomain) == (ptrdiff_t)strlen(p_rpcDomain)) && - (!*pEnd)) { // Valid (old) index found - - char acIndexBuffer[16]; - sprintf(acIndexBuffer, "%lu", (++ulIndex)); - size_t stLength = ((pFoundDivider - p_rpcDomain + strlen(pcDivider)) + strlen(acIndexBuffer) + 1); - char* pNewHostname = new char[stLength]; - if (pNewHostname) { - memcpy(pNewHostname, p_rpcDomain, (pFoundDivider - p_rpcDomain + strlen(pcDivider))); - pNewHostname[pFoundDivider - p_rpcDomain + strlen(pcDivider)] = 0; - strcat(pNewHostname, acIndexBuffer); - - delete[] p_rpcDomain; - p_rpcDomain = pNewHostname; - - bResult = true; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); - } - } - else { - pFoundDivider = 0; // Flag the need to (base) extend the hostname - } - } - - if (!pFoundDivider) { // not yet extended (or failed to increment extension) -> start indexing - size_t stLength = strlen(p_rpcDomain) + (strlen(pcDivider) + 1 + 1); // Name + Divider + '2' + '\0' - char* pNewHostname = new char[stLength]; - if (pNewHostname) { - sprintf(pNewHostname, "%s%s2", p_rpcDomain, pcDivider); - - delete[] p_rpcDomain; - p_rpcDomain = pNewHostname; - - bResult = true; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); - } - } - } - else { - // No given host domain, use base or default - const char* cpcDefaultName = (p_pcDefaultDomain ?: "esp8266"); - - size_t stLength = strlen(cpcDefaultName) + 1; // '\0' - p_rpcDomain = new char[stLength]; - if (p_rpcDomain) { - strncpy(p_rpcDomain, cpcDefaultName, stLength); - bResult = true; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); - } - } - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] indexDomain: %s\n"), p_rpcDomain);); - return bResult; -} - - -/* - * UDP CONTEXT - */ - -bool MDNSResponder::_callProcess(void) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf("[MDNSResponder] _callProcess (%lu, triggered by: %s)\n", millis(), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str());); - - return _process(false); -} - -/* - * MDNSResponder::_allocUDPContext - * - * (Re-)Creates the one-and-only UDP context for the MDNS responder. - * The context is added to the 'multicast'-group and listens to the MDNS port (5353). - * The travel-distance for multicast messages is set to 1 (local, via MDNS_MULTICAST_TTL). - * Messages are received via the MDNSResponder '_update' function. CAUTION: This function - * is called from the WiFi stack side of the ESP stack system. - * - */ -bool MDNSResponder::_allocUDPContext(void) { - DEBUG_EX_INFO(DEBUG_OUTPUT.println("[MDNSResponder] _allocUDPContext");); - - bool bResult = false; - - _releaseUDPContext(); - -#ifdef MDNS_IP4_SUPPORT - ip_addr_t multicast_addr = DNS_MQUERY_IPV4_GROUP_INIT; -#endif -#ifdef MDNS_IP6_SUPPORT - //TODO: set multicast address (lwip_joingroup() is IPv4 only at the time of writing) - multicast_addr.addr = DNS_MQUERY_IPV6_GROUP_INIT; -#endif - if (ERR_OK == igmp_joingroup(ip_2_ip4(&m_netif->ip_addr), ip_2_ip4(&multicast_addr))) { - m_pUDPContext = new UdpContext; - m_pUDPContext->ref(); - - if (m_pUDPContext->listen(IP4_ADDR_ANY, DNS_MQUERY_PORT)) { - m_pUDPContext->setMulticastTTL(MDNS_MULTICAST_TTL); - m_pUDPContext->onRx(std::bind(&MDNSResponder::_callProcess, this)); - - bResult = m_pUDPContext->connect(&multicast_addr, DNS_MQUERY_PORT); - } - } - return bResult; -} - -/* - * MDNSResponder::_releaseUDPContext - */ -bool MDNSResponder::_releaseUDPContext(void) { - - if (m_pUDPContext) { - m_pUDPContext->unref(); - m_pUDPContext = 0; - } - return true; -} - - -/* - * SERVICE QUERY - */ - -/* - * MDNSResponder::_allocServiceQuery - */ -MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_allocServiceQuery(void) { - - stcMDNSServiceQuery* pServiceQuery = new stcMDNSServiceQuery; - if (pServiceQuery) { - // Link to query list - pServiceQuery->m_pNext = m_pServiceQueries; - m_pServiceQueries = pServiceQuery; - } - return m_pServiceQueries; -} - -/* - * MDNSResponder::_removeServiceQuery - */ -bool MDNSResponder::_removeServiceQuery(MDNSResponder::stcMDNSServiceQuery* p_pServiceQuery) { - - bool bResult = false; - - if (p_pServiceQuery) { - stcMDNSServiceQuery* pPred = m_pServiceQueries; - while ((pPred) && - (pPred->m_pNext != p_pServiceQuery)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pServiceQuery->m_pNext; - delete p_pServiceQuery; - bResult = true; - } - else { // No predecesor - if (m_pServiceQueries == p_pServiceQuery) { - m_pServiceQueries = p_pServiceQuery->m_pNext; - delete p_pServiceQuery; - bResult = true; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.println("[MDNSResponder] _releaseServiceQuery: INVALID service query!");); - } - } - } - return bResult; -} - -/* - * MDNSResponder::_removeLegacyServiceQuery - */ -bool MDNSResponder::_removeLegacyServiceQuery(void) { - - stcMDNSServiceQuery* pLegacyServiceQuery = _findLegacyServiceQuery(); - return (pLegacyServiceQuery ? _removeServiceQuery(pLegacyServiceQuery) : true); -} - -/* - * MDNSResponder::_findServiceQuery - * - * 'Convert' hMDNSServiceQuery to stcMDNSServiceQuery* (ensure existance) - * - */ -MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findServiceQuery(MDNSResponder::hMDNSServiceQuery p_hServiceQuery) { - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - if ((hMDNSServiceQuery)pServiceQuery == p_hServiceQuery) { - break; - } - pServiceQuery = pServiceQuery->m_pNext; - } - return pServiceQuery; -} - -/* - * MDNSResponder::_findLegacyServiceQuery - */ -MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findLegacyServiceQuery(void) { - - stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; - while (pServiceQuery) { - if (pServiceQuery->m_bLegacyQuery) { - break; - } - pServiceQuery = pServiceQuery->m_pNext; - } - return pServiceQuery; -} - -/* - * MDNSResponder::_releaseServiceQueries - */ -bool MDNSResponder::_releaseServiceQueries(void) { - while (m_pServiceQueries) { - stcMDNSServiceQuery* pNext = m_pServiceQueries->m_pNext; - delete m_pServiceQueries; - m_pServiceQueries = pNext; - } - return true; -} - -/* - * MDNSResponder::_findNextServiceQueryByServiceType - */ -MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findNextServiceQueryByServiceType(const stcMDNS_RRDomain& p_ServiceTypeDomain, - const stcMDNSServiceQuery* p_pPrevServiceQuery) { - stcMDNSServiceQuery* pMatchingServiceQuery = 0; - - stcMDNSServiceQuery* pServiceQuery = (p_pPrevServiceQuery ? p_pPrevServiceQuery->m_pNext : m_pServiceQueries); - while (pServiceQuery) { - if (p_ServiceTypeDomain == pServiceQuery->m_ServiceTypeDomain) { - pMatchingServiceQuery = pServiceQuery; - break; - } - pServiceQuery = pServiceQuery->m_pNext; - } - return pMatchingServiceQuery; -} - - -/* - * HOSTNAME - */ - -/* - * MDNSResponder::_setHostname - */ -bool MDNSResponder::_setHostname(const char* p_pcHostname) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _allocHostname (%s)\n"), p_pcHostname);); - - bool bResult = false; - - _releaseHostname(); - - size_t stLength = 0; - if ((p_pcHostname) && - (MDNS_DOMAIN_LABEL_MAXLENGTH >= (stLength = strlen(p_pcHostname)))) { // char max size for a single label - // Copy in hostname characters as lowercase - if ((bResult = (0 != (m_pcHostname = new char[stLength + 1])))) { -#ifdef MDNS_FORCE_LOWERCASE_HOSTNAME - size_t i = 0; - for (; i= strlen(p_pcName))) && - (p_pcService) && - (MDNS_SERVICE_NAME_LENGTH >= strlen(p_pcService)) && - (p_pcProtocol) && - (MDNS_SERVICE_PROTOCOL_LENGTH >= strlen(p_pcProtocol)) && - (p_u16Port) && - (0 != (pService = new stcMDNSService)) && - (pService->setName(p_pcName ?: m_pcHostname)) && - (pService->setService(p_pcService)) && - (pService->setProtocol(p_pcProtocol))) { - - pService->m_bAutoName = (0 == p_pcName); - pService->m_u16Port = p_u16Port; - - // Add to list (or start list) - pService->m_pNext = m_pServices; - m_pServices = pService; - } - return pService; -} - -/* - * MDNSResponder::_releaseService - */ -bool MDNSResponder::_releaseService(MDNSResponder::stcMDNSService* p_pService) { - - bool bResult = false; - - if (p_pService) { - stcMDNSService* pPred = m_pServices; - while ((pPred) && - (pPred->m_pNext != p_pService)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pService->m_pNext; - delete p_pService; - bResult = true; - } - else { // No predecesor - if (m_pServices == p_pService) { - m_pServices = p_pService->m_pNext; - delete p_pService; - bResult = true; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.println("[MDNSResponder] _releaseService: INVALID service!");); - } - } - } - return bResult; -} - -/* - * MDNSResponder::_releaseServices - */ -bool MDNSResponder::_releaseServices(void) { - - stcMDNSService* pService = m_pServices; - while (pService) { - _releaseService(pService); - pService = m_pServices; - } - return true; -} - -/* - * MDNSResponder::_findService - */ -MDNSResponder::stcMDNSService* MDNSResponder::_findService(const char* p_pcName, - const char* p_pcService, - const char* p_pcProtocol) { - - stcMDNSService* pService = m_pServices; - while (pService) { - if ((0 == strcmp(pService->m_pcName, p_pcName)) && - (0 == strcmp(pService->m_pcService, p_pcService)) && - (0 == strcmp(pService->m_pcProtocol, p_pcProtocol))) { - - break; - } - pService = pService->m_pNext; - } - return pService; -} - -/* - * MDNSResponder::_findService - */ -MDNSResponder::stcMDNSService* MDNSResponder::_findService(const MDNSResponder::hMDNSService p_hService) { - - stcMDNSService* pService = m_pServices; - while (pService) { - if (p_hService == (hMDNSService)pService) { - break; - } - pService = pService->m_pNext; - } - return pService; -} - - -/* - * SERVICE TXT - */ - -/* - * MDNSResponder::_allocServiceTxt - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_allocServiceTxt(MDNSResponder::stcMDNSService* p_pService, - const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp) { - - stcMDNSServiceTxt* pTxt = 0; - - if ((p_pService) && - (p_pcKey) && - (MDNS_SERVICE_TXT_MAXLENGTH > (p_pService->m_Txts.length() + - 1 + // Length byte - (p_pcKey ? strlen(p_pcKey) : 0) + - 1 + // '=' - (p_pcValue ? strlen(p_pcValue) : 0)))) { - - pTxt = new stcMDNSServiceTxt; - if (pTxt) { - size_t stLength = (p_pcKey ? strlen(p_pcKey) : 0); - pTxt->m_pcKey = new char[stLength + 1]; - if (pTxt->m_pcKey) { - strncpy(pTxt->m_pcKey, p_pcKey, stLength); pTxt->m_pcKey[stLength] = 0; - } - - if (p_pcValue) { - stLength = (p_pcValue ? strlen(p_pcValue) : 0); - pTxt->m_pcValue = new char[stLength + 1]; - if (pTxt->m_pcValue) { - strncpy(pTxt->m_pcValue, p_pcValue, stLength); pTxt->m_pcValue[stLength] = 0; - } - } - pTxt->m_bTemp = p_bTemp; - - // Add to list (or start list) - p_pService->m_Txts.add(pTxt); - } - } - return pTxt; -} - -/* - * MDNSResponder::_releaseServiceTxt - */ -bool MDNSResponder::_releaseServiceTxt(MDNSResponder::stcMDNSService* p_pService, - MDNSResponder::stcMDNSServiceTxt* p_pTxt) { - - return ((p_pService) && - (p_pTxt) && - (p_pService->m_Txts.remove(p_pTxt))); -} - -/* - * MDNSResponder::_updateServiceTxt - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_updateServiceTxt(MDNSResponder::stcMDNSService* p_pService, - MDNSResponder::stcMDNSServiceTxt* p_pTxt, - const char* p_pcValue, - bool p_bTemp) { - - if ((p_pService) && - (p_pTxt) && - (MDNS_SERVICE_TXT_MAXLENGTH > (p_pService->m_Txts.length() - - (p_pTxt->m_pcValue ? strlen(p_pTxt->m_pcValue) : 0) + - (p_pcValue ? strlen(p_pcValue) : 0)))) { - p_pTxt->update(p_pcValue); - p_pTxt->m_bTemp = p_bTemp; - } - return p_pTxt; -} - -/* - * MDNSResponder::_findServiceTxt - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_findServiceTxt(MDNSResponder::stcMDNSService* p_pService, - const char* p_pcKey) { - - return (p_pService ? p_pService->m_Txts.find(p_pcKey) : 0); -} - -/* - * MDNSResponder::_findServiceTxt - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_findServiceTxt(MDNSResponder::stcMDNSService* p_pService, - const hMDNSTxt p_hTxt) { - - return (((p_pService) && (p_hTxt)) ? p_pService->m_Txts.find((stcMDNSServiceTxt*)p_hTxt) : 0); -} - -/* - * MDNSResponder::_addServiceTxt - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_addServiceTxt(MDNSResponder::stcMDNSService* p_pService, - const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp) { - stcMDNSServiceTxt* pResult = 0; - - if ((p_pService) && - (p_pcKey) && - (strlen(p_pcKey))) { - - stcMDNSServiceTxt* pTxt = p_pService->m_Txts.find(p_pcKey); - if (pTxt) { - pResult = _updateServiceTxt(p_pService, pTxt, p_pcValue, p_bTemp); - } - else { - pResult = _allocServiceTxt(p_pService, p_pcKey, p_pcValue, p_bTemp); - } - } - return pResult; -} - -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_answerKeyValue(const hMDNSServiceQuery p_hServiceQuery, - const uint32_t p_u32AnswerIndex) { - stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); - stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); - // Fill m_pcTxts (if not already done) - return (pSQAnswer) ? pSQAnswer->m_Txts.m_pTxts : 0; -} - -/* - * MDNSResponder::_collectServiceTxts - */ -bool MDNSResponder::_collectServiceTxts(MDNSResponder::stcMDNSService& p_rService) { - - // Call Dynamic service callbacks - if (m_fnServiceTxtCallback) { - m_fnServiceTxtCallback((hMDNSService)&p_rService); - } - if (p_rService.m_fnTxtCallback) { - p_rService.m_fnTxtCallback((hMDNSService)&p_rService); - } - return true; -} - -/* - * MDNSResponder::_releaseTempServiceTxts - */ -bool MDNSResponder::_releaseTempServiceTxts(MDNSResponder::stcMDNSService& p_rService) { - - return (p_rService.m_Txts.removeTempTxts()); -} - - -/* - * MISC - */ - -#ifdef DEBUG_ESP_MDNS_RESPONDER - /* - * MDNSResponder::_printRRDomain - */ - bool MDNSResponder::_printRRDomain(const MDNSResponder::stcMDNS_RRDomain& p_RRDomain) const { - - //DEBUG_OUTPUT.printf_P(PSTR("Domain: ")); - - const char* pCursor = p_RRDomain.m_acName; - uint8_t u8Length = *pCursor++; - if (u8Length) { - while (u8Length) { - for (uint8_t u=0; um_IPAddress.toString().c_str()); - break; -#endif - case DNS_RRTYPE_PTR: - DEBUG_OUTPUT.printf_P(PSTR("PTR ")); - _printRRDomain(((const stcMDNS_RRAnswerPTR*)&p_RRAnswer)->m_PTRDomain); - break; - case DNS_RRTYPE_TXT: { - size_t stTxtLength = ((const stcMDNS_RRAnswerTXT*)&p_RRAnswer)->m_Txts.c_strLength(); - char* pTxts = new char[stTxtLength]; - if (pTxts) { - ((/*const c_str()!!*/stcMDNS_RRAnswerTXT*)&p_RRAnswer)->m_Txts.c_str(pTxts); - DEBUG_OUTPUT.printf_P(PSTR("TXT(%u) %s"), stTxtLength, pTxts); - delete[] pTxts; - } - break; - } -#ifdef MDNS_IP6_SUPPORT - case DNS_RRTYPE_AAAA: - DEBUG_OUTPUT.printf_P(PSTR("AAAA IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); - break; -#endif - case DNS_RRTYPE_SRV: - DEBUG_OUTPUT.printf_P(PSTR("SRV Port:%u "), ((const stcMDNS_RRAnswerSRV*)&p_RRAnswer)->m_u16Port); - _printRRDomain(((const stcMDNS_RRAnswerSRV*)&p_RRAnswer)->m_SRVDomain); - break; - default: - DEBUG_OUTPUT.printf_P(PSTR("generic ")); - break; - } - DEBUG_OUTPUT.printf_P(PSTR("\n")); - - return true; - } -#endif - -} // namespace MDNSImplementation - -} // namespace esp8266 - - - - +/* + LEAmDNS_Helpers.cpp + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "lwip/igmp.h" + +#include "LEAmDNS_lwIPdefs.h" +#include "LEAmDNS_Priv.h" + + +namespace +{ + +/* + strrstr (static) + + Backwards search for p_pcPattern in p_pcString + Based on: https://stackoverflow.com/a/1634398/2778898 + +*/ +const char* strrstr(const char*__restrict p_pcString, const char*__restrict p_pcPattern) +{ + + const char* pcResult = 0; + + size_t stStringLength = (p_pcString ? strlen(p_pcString) : 0); + size_t stPatternLength = (p_pcPattern ? strlen(p_pcPattern) : 0); + + if ((stStringLength) && + (stPatternLength) && + (stPatternLength <= stStringLength)) + { + // Pattern is shorter or has the same length tham the string + + for (const char* s = (p_pcString + stStringLength - stPatternLength); s >= p_pcString; --s) + { + if (0 == strncmp(s, p_pcPattern, stPatternLength)) + { + pcResult = s; + break; + } + } + } + return pcResult; +} + + +} // anonymous + + + + + +namespace esp8266 +{ + +/* + LEAmDNS +*/ +namespace MDNSImplementation +{ + +/** + HELPERS +*/ + +/* + MDNSResponder::indexDomain (static) + + Updates the given domain 'p_rpcHostname' by appending a delimiter and an index number. + + If the given domain already hasa numeric index (after the given delimiter), this index + incremented. If not, the delimiter and index '2' is added. + + If 'p_rpcHostname' is empty (==0), the given default name 'p_pcDefaultHostname' is used, + if no default is given, 'esp8266' is used. + +*/ +/*static*/ bool MDNSResponder::indexDomain(char*& p_rpcDomain, + const char* p_pcDivider /*= "-"*/, + const char* p_pcDefaultDomain /*= 0*/) +{ + + bool bResult = false; + + // Ensure a divider exists; use '-' as default + const char* pcDivider = (p_pcDivider ? : "-"); + + if (p_rpcDomain) + { + const char* pFoundDivider = strrstr(p_rpcDomain, pcDivider); + if (pFoundDivider) // maybe already extended + { + char* pEnd = 0; + unsigned long ulIndex = strtoul((pFoundDivider + strlen(pcDivider)), &pEnd, 10); + if ((ulIndex) && + ((pEnd - p_rpcDomain) == (ptrdiff_t)strlen(p_rpcDomain)) && + (!*pEnd)) // Valid (old) index found + { + + char acIndexBuffer[16]; + sprintf(acIndexBuffer, "%lu", (++ulIndex)); + size_t stLength = ((pFoundDivider - p_rpcDomain + strlen(pcDivider)) + strlen(acIndexBuffer) + 1); + char* pNewHostname = new char[stLength]; + if (pNewHostname) + { + memcpy(pNewHostname, p_rpcDomain, (pFoundDivider - p_rpcDomain + strlen(pcDivider))); + pNewHostname[pFoundDivider - p_rpcDomain + strlen(pcDivider)] = 0; + strcat(pNewHostname, acIndexBuffer); + + delete[] p_rpcDomain; + p_rpcDomain = pNewHostname; + + bResult = true; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); + } + } + else + { + pFoundDivider = 0; // Flag the need to (base) extend the hostname + } + } + + if (!pFoundDivider) // not yet extended (or failed to increment extension) -> start indexing + { + size_t stLength = strlen(p_rpcDomain) + (strlen(pcDivider) + 1 + 1); // Name + Divider + '2' + '\0' + char* pNewHostname = new char[stLength]; + if (pNewHostname) + { + sprintf(pNewHostname, "%s%s2", p_rpcDomain, pcDivider); + + delete[] p_rpcDomain; + p_rpcDomain = pNewHostname; + + bResult = true; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); + } + } + } + else + { + // No given host domain, use base or default + const char* cpcDefaultName = (p_pcDefaultDomain ? : "esp8266"); + + size_t stLength = strlen(cpcDefaultName) + 1; // '\0' + p_rpcDomain = new char[stLength]; + if (p_rpcDomain) + { + strncpy(p_rpcDomain, cpcDefaultName, stLength); + bResult = true; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.println(F("[MDNSResponder] indexDomain: FAILED to alloc new hostname!"));); + } + } + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] indexDomain: %s\n"), p_rpcDomain);); + return bResult; +} + + +/* + UDP CONTEXT +*/ + +bool MDNSResponder::_callProcess(void) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf("[MDNSResponder] _callProcess (%lu, triggered by: %s)\n", millis(), IPAddress(m_pUDPContext->getRemoteAddress()).toString().c_str());); + + return _process(false); +} + +/* + MDNSResponder::_allocUDPContext + + (Re-)Creates the one-and-only UDP context for the MDNS responder. + The context is added to the 'multicast'-group and listens to the MDNS port (5353). + The travel-distance for multicast messages is set to 1 (local, via MDNS_MULTICAST_TTL). + Messages are received via the MDNSResponder '_update' function. CAUTION: This function + is called from the WiFi stack side of the ESP stack system. + +*/ +bool MDNSResponder::_allocUDPContext(void) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.println("[MDNSResponder] _allocUDPContext");); + + bool bResult = false; + + _releaseUDPContext(); + +#ifdef MDNS_IP4_SUPPORT + ip_addr_t multicast_addr = DNS_MQUERY_IPV4_GROUP_INIT; +#endif +#ifdef MDNS_IP6_SUPPORT + //TODO: set multicast address (lwip_joingroup() is IPv4 only at the time of writing) + multicast_addr.addr = DNS_MQUERY_IPV6_GROUP_INIT; +#endif + if (ERR_OK == igmp_joingroup(ip_2_ip4(&m_netif->ip_addr), ip_2_ip4(&multicast_addr))) + { + m_pUDPContext = new UdpContext; + m_pUDPContext->ref(); + + if (m_pUDPContext->listen(IP4_ADDR_ANY, DNS_MQUERY_PORT)) + { + m_pUDPContext->setMulticastTTL(MDNS_MULTICAST_TTL); + m_pUDPContext->onRx(std::bind(&MDNSResponder::_callProcess, this)); + + bResult = m_pUDPContext->connect(&multicast_addr, DNS_MQUERY_PORT); + } + } + return bResult; +} + +/* + MDNSResponder::_releaseUDPContext +*/ +bool MDNSResponder::_releaseUDPContext(void) +{ + + if (m_pUDPContext) + { + m_pUDPContext->unref(); + m_pUDPContext = 0; + } + return true; +} + + +/* + SERVICE QUERY +*/ + +/* + MDNSResponder::_allocServiceQuery +*/ +MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_allocServiceQuery(void) +{ + + stcMDNSServiceQuery* pServiceQuery = new stcMDNSServiceQuery; + if (pServiceQuery) + { + // Link to query list + pServiceQuery->m_pNext = m_pServiceQueries; + m_pServiceQueries = pServiceQuery; + } + return m_pServiceQueries; +} + +/* + MDNSResponder::_removeServiceQuery +*/ +bool MDNSResponder::_removeServiceQuery(MDNSResponder::stcMDNSServiceQuery* p_pServiceQuery) +{ + + bool bResult = false; + + if (p_pServiceQuery) + { + stcMDNSServiceQuery* pPred = m_pServiceQueries; + while ((pPred) && + (pPred->m_pNext != p_pServiceQuery)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pServiceQuery->m_pNext; + delete p_pServiceQuery; + bResult = true; + } + else // No predecesor + { + if (m_pServiceQueries == p_pServiceQuery) + { + m_pServiceQueries = p_pServiceQuery->m_pNext; + delete p_pServiceQuery; + bResult = true; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.println("[MDNSResponder] _releaseServiceQuery: INVALID service query!");); + } + } + } + return bResult; +} + +/* + MDNSResponder::_removeLegacyServiceQuery +*/ +bool MDNSResponder::_removeLegacyServiceQuery(void) +{ + + stcMDNSServiceQuery* pLegacyServiceQuery = _findLegacyServiceQuery(); + return (pLegacyServiceQuery ? _removeServiceQuery(pLegacyServiceQuery) : true); +} + +/* + MDNSResponder::_findServiceQuery + + 'Convert' hMDNSServiceQuery to stcMDNSServiceQuery* (ensure existance) + +*/ +MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findServiceQuery(MDNSResponder::hMDNSServiceQuery p_hServiceQuery) +{ + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + if ((hMDNSServiceQuery)pServiceQuery == p_hServiceQuery) + { + break; + } + pServiceQuery = pServiceQuery->m_pNext; + } + return pServiceQuery; +} + +/* + MDNSResponder::_findLegacyServiceQuery +*/ +MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findLegacyServiceQuery(void) +{ + + stcMDNSServiceQuery* pServiceQuery = m_pServiceQueries; + while (pServiceQuery) + { + if (pServiceQuery->m_bLegacyQuery) + { + break; + } + pServiceQuery = pServiceQuery->m_pNext; + } + return pServiceQuery; +} + +/* + MDNSResponder::_releaseServiceQueries +*/ +bool MDNSResponder::_releaseServiceQueries(void) +{ + while (m_pServiceQueries) + { + stcMDNSServiceQuery* pNext = m_pServiceQueries->m_pNext; + delete m_pServiceQueries; + m_pServiceQueries = pNext; + } + return true; +} + +/* + MDNSResponder::_findNextServiceQueryByServiceType +*/ +MDNSResponder::stcMDNSServiceQuery* MDNSResponder::_findNextServiceQueryByServiceType(const stcMDNS_RRDomain& p_ServiceTypeDomain, + const stcMDNSServiceQuery* p_pPrevServiceQuery) +{ + stcMDNSServiceQuery* pMatchingServiceQuery = 0; + + stcMDNSServiceQuery* pServiceQuery = (p_pPrevServiceQuery ? p_pPrevServiceQuery->m_pNext : m_pServiceQueries); + while (pServiceQuery) + { + if (p_ServiceTypeDomain == pServiceQuery->m_ServiceTypeDomain) + { + pMatchingServiceQuery = pServiceQuery; + break; + } + pServiceQuery = pServiceQuery->m_pNext; + } + return pMatchingServiceQuery; +} + + +/* + HOSTNAME +*/ + +/* + MDNSResponder::_setHostname +*/ +bool MDNSResponder::_setHostname(const char* p_pcHostname) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _allocHostname (%s)\n"), p_pcHostname);); + + bool bResult = false; + + _releaseHostname(); + + size_t stLength = 0; + if ((p_pcHostname) && + (MDNS_DOMAIN_LABEL_MAXLENGTH >= (stLength = strlen(p_pcHostname)))) // char max size for a single label + { + // Copy in hostname characters as lowercase + if ((bResult = (0 != (m_pcHostname = new char[stLength + 1])))) + { +#ifdef MDNS_FORCE_LOWERCASE_HOSTNAME + size_t i = 0; + for (; i < stLength; ++i) + { + m_pcHostname[i] = (isupper(p_pcHostname[i]) ? tolower(p_pcHostname[i]) : p_pcHostname[i]); + } + m_pcHostname[i] = 0; +#else + strncpy(m_pcHostname, p_pcHostname, (stLength + 1)); +#endif + } + } + return bResult; +} + +/* + MDNSResponder::_releaseHostname +*/ +bool MDNSResponder::_releaseHostname(void) +{ + + if (m_pcHostname) + { + delete[] m_pcHostname; + m_pcHostname = 0; + } + return true; +} + + +/* + SERVICE +*/ + +/* + MDNSResponder::_allocService +*/ +MDNSResponder::stcMDNSService* MDNSResponder::_allocService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol, + uint16_t p_u16Port) +{ + + stcMDNSService* pService = 0; + if (((!p_pcName) || + (MDNS_DOMAIN_LABEL_MAXLENGTH >= strlen(p_pcName))) && + (p_pcService) && + (MDNS_SERVICE_NAME_LENGTH >= strlen(p_pcService)) && + (p_pcProtocol) && + (MDNS_SERVICE_PROTOCOL_LENGTH >= strlen(p_pcProtocol)) && + (p_u16Port) && + (0 != (pService = new stcMDNSService)) && + (pService->setName(p_pcName ? : m_pcHostname)) && + (pService->setService(p_pcService)) && + (pService->setProtocol(p_pcProtocol))) + { + + pService->m_bAutoName = (0 == p_pcName); + pService->m_u16Port = p_u16Port; + + // Add to list (or start list) + pService->m_pNext = m_pServices; + m_pServices = pService; + } + return pService; +} + +/* + MDNSResponder::_releaseService +*/ +bool MDNSResponder::_releaseService(MDNSResponder::stcMDNSService* p_pService) +{ + + bool bResult = false; + + if (p_pService) + { + stcMDNSService* pPred = m_pServices; + while ((pPred) && + (pPred->m_pNext != p_pService)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pService->m_pNext; + delete p_pService; + bResult = true; + } + else // No predecesor + { + if (m_pServices == p_pService) + { + m_pServices = p_pService->m_pNext; + delete p_pService; + bResult = true; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.println("[MDNSResponder] _releaseService: INVALID service!");); + } + } + } + return bResult; +} + +/* + MDNSResponder::_releaseServices +*/ +bool MDNSResponder::_releaseServices(void) +{ + + stcMDNSService* pService = m_pServices; + while (pService) + { + _releaseService(pService); + pService = m_pServices; + } + return true; +} + +/* + MDNSResponder::_findService +*/ +MDNSResponder::stcMDNSService* MDNSResponder::_findService(const char* p_pcName, + const char* p_pcService, + const char* p_pcProtocol) +{ + + stcMDNSService* pService = m_pServices; + while (pService) + { + if ((0 == strcmp(pService->m_pcName, p_pcName)) && + (0 == strcmp(pService->m_pcService, p_pcService)) && + (0 == strcmp(pService->m_pcProtocol, p_pcProtocol))) + { + + break; + } + pService = pService->m_pNext; + } + return pService; +} + +/* + MDNSResponder::_findService +*/ +MDNSResponder::stcMDNSService* MDNSResponder::_findService(const MDNSResponder::hMDNSService p_hService) +{ + + stcMDNSService* pService = m_pServices; + while (pService) + { + if (p_hService == (hMDNSService)pService) + { + break; + } + pService = pService->m_pNext; + } + return pService; +} + + +/* + SERVICE TXT +*/ + +/* + MDNSResponder::_allocServiceTxt +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_allocServiceTxt(MDNSResponder::stcMDNSService* p_pService, + const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp) +{ + + stcMDNSServiceTxt* pTxt = 0; + + if ((p_pService) && + (p_pcKey) && + (MDNS_SERVICE_TXT_MAXLENGTH > (p_pService->m_Txts.length() + + 1 + // Length byte + (p_pcKey ? strlen(p_pcKey) : 0) + + 1 + // '=' + (p_pcValue ? strlen(p_pcValue) : 0)))) + { + + pTxt = new stcMDNSServiceTxt; + if (pTxt) + { + size_t stLength = (p_pcKey ? strlen(p_pcKey) : 0); + pTxt->m_pcKey = new char[stLength + 1]; + if (pTxt->m_pcKey) + { + strncpy(pTxt->m_pcKey, p_pcKey, stLength); pTxt->m_pcKey[stLength] = 0; + } + + if (p_pcValue) + { + stLength = (p_pcValue ? strlen(p_pcValue) : 0); + pTxt->m_pcValue = new char[stLength + 1]; + if (pTxt->m_pcValue) + { + strncpy(pTxt->m_pcValue, p_pcValue, stLength); pTxt->m_pcValue[stLength] = 0; + } + } + pTxt->m_bTemp = p_bTemp; + + // Add to list (or start list) + p_pService->m_Txts.add(pTxt); + } + } + return pTxt; +} + +/* + MDNSResponder::_releaseServiceTxt +*/ +bool MDNSResponder::_releaseServiceTxt(MDNSResponder::stcMDNSService* p_pService, + MDNSResponder::stcMDNSServiceTxt* p_pTxt) +{ + + return ((p_pService) && + (p_pTxt) && + (p_pService->m_Txts.remove(p_pTxt))); +} + +/* + MDNSResponder::_updateServiceTxt +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_updateServiceTxt(MDNSResponder::stcMDNSService* p_pService, + MDNSResponder::stcMDNSServiceTxt* p_pTxt, + const char* p_pcValue, + bool p_bTemp) +{ + + if ((p_pService) && + (p_pTxt) && + (MDNS_SERVICE_TXT_MAXLENGTH > (p_pService->m_Txts.length() - + (p_pTxt->m_pcValue ? strlen(p_pTxt->m_pcValue) : 0) + + (p_pcValue ? strlen(p_pcValue) : 0)))) + { + p_pTxt->update(p_pcValue); + p_pTxt->m_bTemp = p_bTemp; + } + return p_pTxt; +} + +/* + MDNSResponder::_findServiceTxt +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_findServiceTxt(MDNSResponder::stcMDNSService* p_pService, + const char* p_pcKey) +{ + + return (p_pService ? p_pService->m_Txts.find(p_pcKey) : 0); +} + +/* + MDNSResponder::_findServiceTxt +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_findServiceTxt(MDNSResponder::stcMDNSService* p_pService, + const hMDNSTxt p_hTxt) +{ + + return (((p_pService) && (p_hTxt)) ? p_pService->m_Txts.find((stcMDNSServiceTxt*)p_hTxt) : 0); +} + +/* + MDNSResponder::_addServiceTxt +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_addServiceTxt(MDNSResponder::stcMDNSService* p_pService, + const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp) +{ + stcMDNSServiceTxt* pResult = 0; + + if ((p_pService) && + (p_pcKey) && + (strlen(p_pcKey))) + { + + stcMDNSServiceTxt* pTxt = p_pService->m_Txts.find(p_pcKey); + if (pTxt) + { + pResult = _updateServiceTxt(p_pService, pTxt, p_pcValue, p_bTemp); + } + else + { + pResult = _allocServiceTxt(p_pService, p_pcKey, p_pcValue, p_bTemp); + } + } + return pResult; +} + +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::_answerKeyValue(const hMDNSServiceQuery p_hServiceQuery, + const uint32_t p_u32AnswerIndex) +{ + stcMDNSServiceQuery* pServiceQuery = _findServiceQuery(p_hServiceQuery); + stcMDNSServiceQuery::stcAnswer* pSQAnswer = (pServiceQuery ? pServiceQuery->answerAtIndex(p_u32AnswerIndex) : 0); + // Fill m_pcTxts (if not already done) + return (pSQAnswer) ? pSQAnswer->m_Txts.m_pTxts : 0; +} + +/* + MDNSResponder::_collectServiceTxts +*/ +bool MDNSResponder::_collectServiceTxts(MDNSResponder::stcMDNSService& p_rService) +{ + + // Call Dynamic service callbacks + if (m_fnServiceTxtCallback) + { + m_fnServiceTxtCallback((hMDNSService)&p_rService); + } + if (p_rService.m_fnTxtCallback) + { + p_rService.m_fnTxtCallback((hMDNSService)&p_rService); + } + return true; +} + +/* + MDNSResponder::_releaseTempServiceTxts +*/ +bool MDNSResponder::_releaseTempServiceTxts(MDNSResponder::stcMDNSService& p_rService) +{ + + return (p_rService.m_Txts.removeTempTxts()); +} + + +/* + MISC +*/ + +#ifdef DEBUG_ESP_MDNS_RESPONDER +/* + MDNSResponder::_printRRDomain +*/ +bool MDNSResponder::_printRRDomain(const MDNSResponder::stcMDNS_RRDomain& p_RRDomain) const +{ + + //DEBUG_OUTPUT.printf_P(PSTR("Domain: ")); + + const char* pCursor = p_RRDomain.m_acName; + uint8_t u8Length = *pCursor++; + if (u8Length) + { + while (u8Length) + { + for (uint8_t u = 0; u < u8Length; ++u) + { + DEBUG_OUTPUT.printf_P(PSTR("%c"), *(pCursor++)); + } + u8Length = *pCursor++; + if (u8Length) + { + DEBUG_OUTPUT.printf_P(PSTR(".")); + } + } + } + else // empty domain + { + DEBUG_OUTPUT.printf_P(PSTR("-empty-")); + } + //DEBUG_OUTPUT.printf_P(PSTR("\n")); + + return true; +} + +/* + MDNSResponder::_printRRAnswer +*/ +bool MDNSResponder::_printRRAnswer(const MDNSResponder::stcMDNS_RRAnswer& p_RRAnswer) const +{ + + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] RRAnswer: ")); + _printRRDomain(p_RRAnswer.m_Header.m_Domain); + DEBUG_OUTPUT.printf_P(PSTR(" Type:0x%04X Class:0x%04X TTL:%u, "), p_RRAnswer.m_Header.m_Attributes.m_u16Type, p_RRAnswer.m_Header.m_Attributes.m_u16Class, p_RRAnswer.m_u32TTL); + switch (p_RRAnswer.m_Header.m_Attributes.m_u16Type & (~0x8000)) // Topmost bit might carry 'cache flush' flag + { +#ifdef MDNS_IP4_SUPPORT + case DNS_RRTYPE_A: + DEBUG_OUTPUT.printf_P(PSTR("A IP:%s"), ((const stcMDNS_RRAnswerA*)&p_RRAnswer)->m_IPAddress.toString().c_str()); + break; +#endif + case DNS_RRTYPE_PTR: + DEBUG_OUTPUT.printf_P(PSTR("PTR ")); + _printRRDomain(((const stcMDNS_RRAnswerPTR*)&p_RRAnswer)->m_PTRDomain); + break; + case DNS_RRTYPE_TXT: + { + size_t stTxtLength = ((const stcMDNS_RRAnswerTXT*)&p_RRAnswer)->m_Txts.c_strLength(); + char* pTxts = new char[stTxtLength]; + if (pTxts) + { + ((/*const c_str()!!*/stcMDNS_RRAnswerTXT*)&p_RRAnswer)->m_Txts.c_str(pTxts); + DEBUG_OUTPUT.printf_P(PSTR("TXT(%u) %s"), stTxtLength, pTxts); + delete[] pTxts; + } + break; + } +#ifdef MDNS_IP6_SUPPORT + case DNS_RRTYPE_AAAA: + DEBUG_OUTPUT.printf_P(PSTR("AAAA IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); + break; +#endif + case DNS_RRTYPE_SRV: + DEBUG_OUTPUT.printf_P(PSTR("SRV Port:%u "), ((const stcMDNS_RRAnswerSRV*)&p_RRAnswer)->m_u16Port); + _printRRDomain(((const stcMDNS_RRAnswerSRV*)&p_RRAnswer)->m_SRVDomain); + break; + default: + DEBUG_OUTPUT.printf_P(PSTR("generic ")); + break; + } + DEBUG_OUTPUT.printf_P(PSTR("\n")); + + return true; +} +#endif + +} // namespace MDNSImplementation + +} // namespace esp8266 + + + + diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Priv.h b/libraries/ESP8266mDNS/src/LEAmDNS_Priv.h index 6371478a9..cc56b133a 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Priv.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Priv.h @@ -1,180 +1,182 @@ -/* - * LEAmDNS_Priv.h - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef MDNS_PRIV_H -#define MDNS_PRIV_H - -namespace esp8266 { - -/* - * LEAmDNS - */ - -namespace MDNSImplementation { - -// Enable class debug functions -#define ESP_8266_MDNS_INCLUDE -//#define DEBUG_ESP_MDNS_RESPONDER - -#if !defined(DEBUG_ESP_MDNS_RESPONDER) && defined(DEBUG_ESP_MDNS) -#define DEBUG_ESP_MDNS_RESPONDER -#endif - -#ifndef LWIP_OPEN_SRC - #define LWIP_OPEN_SRC -#endif - -// -// If ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE is defined, the mDNS responder ignores a successful probing -// This allows to drive the responder in a environment, where 'update()' isn't called in the loop -//#define ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE - -// Enable/disable debug trace macros -#ifdef DEBUG_ESP_MDNS_RESPONDER -#define DEBUG_ESP_MDNS_INFO -#define DEBUG_ESP_MDNS_ERR -#define DEBUG_ESP_MDNS_TX -#define DEBUG_ESP_MDNS_RX -#endif - -#ifdef DEBUG_ESP_MDNS_RESPONDER - #ifdef DEBUG_ESP_MDNS_INFO - #define DEBUG_EX_INFO(A) A - #else - #define DEBUG_EX_INFO(A) do { (void)0; } while (0) - #endif - #ifdef DEBUG_ESP_MDNS_ERR - #define DEBUG_EX_ERR(A) A - #else - #define DEBUG_EX_ERR(A) do { (void)0; } while (0) - #endif - #ifdef DEBUG_ESP_MDNS_TX - #define DEBUG_EX_TX(A) A - #else - #define DEBUG_EX_TX(A) do { (void)0; } while (0) - #endif - #ifdef DEBUG_ESP_MDNS_RX - #define DEBUG_EX_RX(A) A - #else - #define DEBUG_EX_RX(A) do { (void)0; } while (0) - #endif - - #ifdef DEBUG_ESP_PORT - #define DEBUG_OUTPUT DEBUG_ESP_PORT - #else - #define DEBUG_OUTPUT Serial - #endif -#else - #define DEBUG_EX_INFO(A) do { (void)0; } while (0) - #define DEBUG_EX_ERR(A) do { (void)0; } while (0) - #define DEBUG_EX_TX(A) do { (void)0; } while (0) - #define DEBUG_EX_RX(A) do { (void)0; } while (0) -#endif - - -/* Replaced by 'lwip/prot/dns.h' definitions -#ifdef MDNS_IP4_SUPPORT - #define MDNS_MULTICAST_ADDR_IP4 (IPAddress(224, 0, 0, 251)) // ip_addr_t v4group = DNS_MQUERY_IPV4_GROUP_INIT -#endif -#ifdef MDNS_IP6_SUPPORT - #define MDNS_MULTICAST_ADDR_IP6 (IPAddress("FF02::FB")) // ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT -#endif*/ -//#define MDNS_MULTICAST_PORT 5353 - -/* - * This is NOT the TTL (Time-To-Live) for MDNS records, but the - * subnet level distance MDNS records should travel. - * 1 sets the subnet distance to 'local', which is default for MDNS. - * (Btw.: 255 would set it to 'as far as possible' -> internet) - * - * However, RFC 3171 seems to force 255 instead - */ -#define MDNS_MULTICAST_TTL 255/*1*/ - -/* - * This is the MDNS record TTL - * Host level records are set to 2min (120s) - * service level records are set to 75min (4500s) - */ -#define MDNS_HOST_TTL 120 -#define MDNS_SERVICE_TTL 4500 - -/* - * Compressed labels are flaged by the two topmost bits of the length byte being set - */ -#define MDNS_DOMAIN_COMPRESS_MARK 0xC0 -/* - * Avoid endless recursion because of malformed compressed labels - */ -#define MDNS_DOMAIN_MAX_REDIRCTION 6 - -/* - * Default service priority and weight in SRV answers - */ -#define MDNS_SRV_PRIORITY 0 -#define MDNS_SRV_WEIGHT 0 - -/* - * Delay between and number of probes for host and service domains - * Delay between and number of announces for host and service domains - * Delay between and number of service queries; the delay is multiplied by the resent number in '_checkServiceQueryCache' - */ -#define MDNS_PROBE_DELAY 250 -#define MDNS_PROBE_COUNT 3 -#define MDNS_ANNOUNCE_DELAY 1000 -#define MDNS_ANNOUNCE_COUNT 8 -#define MDNS_DYNAMIC_QUERY_RESEND_COUNT 5 -#define MDNS_DYNAMIC_QUERY_RESEND_DELAY 5000 - - -/* - * Force host domain to use only lowercase letters - */ -//#define MDNS_FORCE_LOWERCASE_HOSTNAME - -/* - * Enable/disable the usage of the F() macro in debug trace printf calls. - * There needs to be an PGM comptible printf function to use this. - * - * USE_PGM_PRINTF and F - */ -#define USE_PGM_PRINTF - -#ifdef USE_PGM_PRINTF -#else - #ifdef F - #undef F - #endif - #define F(A) A -#endif - -} // namespace MDNSImplementation - -} // namespace esp8266 - -// Include the main header, so the submodlues only need to include this header -#include "LEAmDNS.h" - - -#endif // MDNS_PRIV_H +/* + LEAmDNS_Priv.h + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#ifndef MDNS_PRIV_H +#define MDNS_PRIV_H + +namespace esp8266 +{ + +/* + LEAmDNS +*/ + +namespace MDNSImplementation +{ + +// Enable class debug functions +#define ESP_8266_MDNS_INCLUDE +//#define DEBUG_ESP_MDNS_RESPONDER + +#if !defined(DEBUG_ESP_MDNS_RESPONDER) && defined(DEBUG_ESP_MDNS) +#define DEBUG_ESP_MDNS_RESPONDER +#endif + +#ifndef LWIP_OPEN_SRC +#define LWIP_OPEN_SRC +#endif + +// +// If ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE is defined, the mDNS responder ignores a successful probing +// This allows to drive the responder in a environment, where 'update()' isn't called in the loop +//#define ENABLE_ESP_MDNS_RESPONDER_PASSIV_MODE + +// Enable/disable debug trace macros +#ifdef DEBUG_ESP_MDNS_RESPONDER +#define DEBUG_ESP_MDNS_INFO +#define DEBUG_ESP_MDNS_ERR +#define DEBUG_ESP_MDNS_TX +#define DEBUG_ESP_MDNS_RX +#endif + +#ifdef DEBUG_ESP_MDNS_RESPONDER +#ifdef DEBUG_ESP_MDNS_INFO +#define DEBUG_EX_INFO(A) A +#else +#define DEBUG_EX_INFO(A) do { (void)0; } while (0) +#endif +#ifdef DEBUG_ESP_MDNS_ERR +#define DEBUG_EX_ERR(A) A +#else +#define DEBUG_EX_ERR(A) do { (void)0; } while (0) +#endif +#ifdef DEBUG_ESP_MDNS_TX +#define DEBUG_EX_TX(A) A +#else +#define DEBUG_EX_TX(A) do { (void)0; } while (0) +#endif +#ifdef DEBUG_ESP_MDNS_RX +#define DEBUG_EX_RX(A) A +#else +#define DEBUG_EX_RX(A) do { (void)0; } while (0) +#endif + +#ifdef DEBUG_ESP_PORT +#define DEBUG_OUTPUT DEBUG_ESP_PORT +#else +#define DEBUG_OUTPUT Serial +#endif +#else +#define DEBUG_EX_INFO(A) do { (void)0; } while (0) +#define DEBUG_EX_ERR(A) do { (void)0; } while (0) +#define DEBUG_EX_TX(A) do { (void)0; } while (0) +#define DEBUG_EX_RX(A) do { (void)0; } while (0) +#endif + + +/* Replaced by 'lwip/prot/dns.h' definitions + #ifdef MDNS_IP4_SUPPORT + #define MDNS_MULTICAST_ADDR_IP4 (IPAddress(224, 0, 0, 251)) // ip_addr_t v4group = DNS_MQUERY_IPV4_GROUP_INIT + #endif + #ifdef MDNS_IP6_SUPPORT + #define MDNS_MULTICAST_ADDR_IP6 (IPAddress("FF02::FB")) // ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT + #endif*/ +//#define MDNS_MULTICAST_PORT 5353 + +/* + This is NOT the TTL (Time-To-Live) for MDNS records, but the + subnet level distance MDNS records should travel. + 1 sets the subnet distance to 'local', which is default for MDNS. + (Btw.: 255 would set it to 'as far as possible' -> internet) + + However, RFC 3171 seems to force 255 instead +*/ +#define MDNS_MULTICAST_TTL 255/*1*/ + +/* + This is the MDNS record TTL + Host level records are set to 2min (120s) + service level records are set to 75min (4500s) +*/ +#define MDNS_HOST_TTL 120 +#define MDNS_SERVICE_TTL 4500 + +/* + Compressed labels are flaged by the two topmost bits of the length byte being set +*/ +#define MDNS_DOMAIN_COMPRESS_MARK 0xC0 +/* + Avoid endless recursion because of malformed compressed labels +*/ +#define MDNS_DOMAIN_MAX_REDIRCTION 6 + +/* + Default service priority and weight in SRV answers +*/ +#define MDNS_SRV_PRIORITY 0 +#define MDNS_SRV_WEIGHT 0 + +/* + Delay between and number of probes for host and service domains + Delay between and number of announces for host and service domains + Delay between and number of service queries; the delay is multiplied by the resent number in '_checkServiceQueryCache' +*/ +#define MDNS_PROBE_DELAY 250 +#define MDNS_PROBE_COUNT 3 +#define MDNS_ANNOUNCE_DELAY 1000 +#define MDNS_ANNOUNCE_COUNT 8 +#define MDNS_DYNAMIC_QUERY_RESEND_COUNT 5 +#define MDNS_DYNAMIC_QUERY_RESEND_DELAY 5000 + + +/* + Force host domain to use only lowercase letters +*/ +//#define MDNS_FORCE_LOWERCASE_HOSTNAME + +/* + Enable/disable the usage of the F() macro in debug trace printf calls. + There needs to be an PGM comptible printf function to use this. + + USE_PGM_PRINTF and F +*/ +#define USE_PGM_PRINTF + +#ifdef USE_PGM_PRINTF +#else +#ifdef F +#undef F +#endif +#define F(A) A +#endif + +} // namespace MDNSImplementation + +} // namespace esp8266 + +// Include the main header, so the submodlues only need to include this header +#include "LEAmDNS.h" + + +#endif // MDNS_PRIV_H diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp index e54beb50d..ce475de3b 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp @@ -1,2218 +1,2476 @@ -/* - * LEAmDNS_Structs.cpp - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#include "LEAmDNS_Priv.h" -#include "LEAmDNS_lwIPdefs.h" - -namespace esp8266 { - -/* - * LEAmDNS - */ -namespace MDNSImplementation { - -/** - * STRUCTS - */ - -/** - * MDNSResponder::stcMDNSServiceTxt - * - * One MDNS TXT item. - * m_pcValue may be '\0'. - * Objects can be chained together (list, m_pNext). - * A 'm_bTemp' flag differentiates between static and dynamic items. - * Output as byte array 'c#=1' is supported. - */ - -/* - * MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt constructor - */ -MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt(const char* p_pcKey /*= 0*/, - const char* p_pcValue /*= 0*/, - bool p_bTemp /*= false*/) -: m_pNext(0), - m_pcKey(0), - m_pcValue(0), - m_bTemp(p_bTemp) { - - setKey(p_pcKey); - setValue(p_pcValue); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt copy-constructor - */ -MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt(const MDNSResponder::stcMDNSServiceTxt& p_Other) -: m_pNext(0), - m_pcKey(0), - m_pcValue(0), - m_bTemp(false) { - - operator=(p_Other); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::~stcMDNSServiceTxt destructor - */ -MDNSResponder::stcMDNSServiceTxt::~stcMDNSServiceTxt(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::operator= - */ -MDNSResponder::stcMDNSServiceTxt& MDNSResponder::stcMDNSServiceTxt::operator=(const MDNSResponder::stcMDNSServiceTxt& p_Other) { - - if (&p_Other != this) { - clear(); - set(p_Other.m_pcKey, p_Other.m_pcValue, p_Other.m_bTemp); - } - return *this; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::clear - */ -bool MDNSResponder::stcMDNSServiceTxt::clear(void) { - - releaseKey(); - releaseValue(); - return true; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::allocKey - */ -char* MDNSResponder::stcMDNSServiceTxt::allocKey(size_t p_stLength) { - - releaseKey(); - if (p_stLength) { - m_pcKey = new char[p_stLength + 1]; - } - return m_pcKey; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::setKey - */ -bool MDNSResponder::stcMDNSServiceTxt::setKey(const char* p_pcKey, - size_t p_stLength) { - - bool bResult = false; - - releaseKey(); - if (p_stLength) { - if (allocKey(p_stLength)) { - strncpy(m_pcKey, p_pcKey, p_stLength); - m_pcKey[p_stLength] = 0; - bResult = true; - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::setKey - */ -bool MDNSResponder::stcMDNSServiceTxt::setKey(const char* p_pcKey) { - - return setKey(p_pcKey, (p_pcKey ? strlen(p_pcKey) : 0)); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::releaseKey - */ -bool MDNSResponder::stcMDNSServiceTxt::releaseKey(void) { - - if (m_pcKey) { - delete[] m_pcKey; - m_pcKey = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::allocValue - */ -char* MDNSResponder::stcMDNSServiceTxt::allocValue(size_t p_stLength) { - - releaseValue(); - if (p_stLength) { - m_pcValue = new char[p_stLength + 1]; - } - return m_pcValue; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::setValue - */ -bool MDNSResponder::stcMDNSServiceTxt::setValue(const char* p_pcValue, - size_t p_stLength) { - - bool bResult = false; - - releaseValue(); - if (p_stLength) { - if (allocValue(p_stLength)) { - strncpy(m_pcValue, p_pcValue, p_stLength); - m_pcValue[p_stLength] = 0; - bResult = true; - } - } - else { // No value -> also OK - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::setValue - */ -bool MDNSResponder::stcMDNSServiceTxt::setValue(const char* p_pcValue) { - - return setValue(p_pcValue, (p_pcValue ? strlen(p_pcValue) : 0)); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::releaseValue - */ -bool MDNSResponder::stcMDNSServiceTxt::releaseValue(void) { - - if (m_pcValue) { - delete[] m_pcValue; - m_pcValue = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceTxt::set - */ -bool MDNSResponder::stcMDNSServiceTxt::set(const char* p_pcKey, - const char* p_pcValue, - bool p_bTemp /*= false*/) { - - m_bTemp = p_bTemp; - return ((setKey(p_pcKey)) && - (setValue(p_pcValue))); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::update - */ -bool MDNSResponder::stcMDNSServiceTxt::update(const char* p_pcValue) { - - return setValue(p_pcValue); -} - -/* - * MDNSResponder::stcMDNSServiceTxt::length - * - * length of eg. 'c#=1' without any closing '\0' - */ -size_t MDNSResponder::stcMDNSServiceTxt::length(void) const { - - size_t stLength = 0; - if (m_pcKey) { - stLength += strlen(m_pcKey); // Key - stLength += 1; // '=' - stLength += (m_pcValue ? strlen(m_pcValue) : 0); // Value - } - return stLength; -} - - -/** - * MDNSResponder::stcMDNSServiceTxts - * - * A list of zero or more MDNS TXT items. - * Dynamic TXT items can be removed by 'removeTempTxts'. - * A TXT item can be looke up by its 'key' member. - * Export as ';'-separated byte array is supported. - * Export as 'length byte coded' byte array is supported. - * Comparision ((all A TXT items in B and equal) AND (all B TXT items in A and equal)) is supported. - * - */ - -/* - * MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts contructor - */ -MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts(void) -: m_pTxts(0) { - -} - -/* - * MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts copy-constructor - */ -MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts(const stcMDNSServiceTxts& p_Other) -: m_pTxts(0) { - - operator=(p_Other); -} - -/* - * MDNSResponder::stcMDNSServiceTxts::~stcMDNSServiceTxts destructor - */ -MDNSResponder::stcMDNSServiceTxts::~stcMDNSServiceTxts(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSServiceTxts::operator= - */ -MDNSResponder::stcMDNSServiceTxts& MDNSResponder::stcMDNSServiceTxts::operator=(const stcMDNSServiceTxts& p_Other) { - - if (this != &p_Other) { - clear(); - - for (stcMDNSServiceTxt* pOtherTxt=p_Other.m_pTxts; pOtherTxt; pOtherTxt=pOtherTxt->m_pNext) { - add(new stcMDNSServiceTxt(*pOtherTxt)); - } - } - return *this; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::clear - */ -bool MDNSResponder::stcMDNSServiceTxts::clear(void) { - - while (m_pTxts) { - stcMDNSServiceTxt* pNext = m_pTxts->m_pNext; - delete m_pTxts; - m_pTxts = pNext; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::add - */ -bool MDNSResponder::stcMDNSServiceTxts::add(MDNSResponder::stcMDNSServiceTxt* p_pTxt) { - - bool bResult = false; - - if (p_pTxt) { - p_pTxt->m_pNext = m_pTxts; - m_pTxts = p_pTxt; - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::remove - */ -bool MDNSResponder::stcMDNSServiceTxts::remove(stcMDNSServiceTxt* p_pTxt) { - - bool bResult = false; - - if (p_pTxt) { - stcMDNSServiceTxt* pPred = m_pTxts; - while ((pPred) && - (pPred->m_pNext != p_pTxt)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pTxt->m_pNext; - delete p_pTxt; - bResult = true; - } - else if (m_pTxts == p_pTxt) { // No predecesor, but first item - m_pTxts = p_pTxt->m_pNext; - delete p_pTxt; - bResult = true; - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::removeTempTxts - */ -bool MDNSResponder::stcMDNSServiceTxts::removeTempTxts(void) { - - bool bResult = true; - - stcMDNSServiceTxt* pTxt = m_pTxts; - while ((bResult) && - (pTxt)) { - stcMDNSServiceTxt* pNext = pTxt->m_pNext; - if (pTxt->m_bTemp) { - bResult = remove(pTxt); - } - pTxt = pNext; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::find - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const char* p_pcKey) { - - stcMDNSServiceTxt* pResult = 0; - - for (stcMDNSServiceTxt* pTxt=m_pTxts; pTxt; pTxt=pTxt->m_pNext) { - if ((p_pcKey) && - (0 == strcmp(pTxt->m_pcKey, p_pcKey))) { - pResult = pTxt; - break; - } - } - return pResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::find - */ -const MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const char* p_pcKey) const { - - const stcMDNSServiceTxt* pResult = 0; - - for (const stcMDNSServiceTxt* pTxt=m_pTxts; pTxt; pTxt=pTxt->m_pNext) { - if ((p_pcKey) && - (0 == strcmp(pTxt->m_pcKey, p_pcKey))) { - - pResult = pTxt; - break; - } - } - return pResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::find - */ -MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const stcMDNSServiceTxt* p_pTxt) { - - stcMDNSServiceTxt* pResult = 0; - - for (stcMDNSServiceTxt* pTxt=m_pTxts; pTxt; pTxt=pTxt->m_pNext) { - if (p_pTxt == pTxt) { - pResult = pTxt; - break; - } - } - return pResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::length - */ -uint16_t MDNSResponder::stcMDNSServiceTxts::length(void) const { - - uint16_t u16Length = 0; - - stcMDNSServiceTxt* pTxt = m_pTxts; - while (pTxt) { - u16Length += 1; // Length byte - u16Length += pTxt->length(); // Text - pTxt = pTxt->m_pNext; - } - return u16Length; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::c_strLength - * - * (incl. closing '\0'). Length bytes place is used for delimiting ';' and closing '\0' - */ -size_t MDNSResponder::stcMDNSServiceTxts::c_strLength(void) const { - - return length(); -} - -/* - * MDNSResponder::stcMDNSServiceTxts::c_str - */ -bool MDNSResponder::stcMDNSServiceTxts::c_str(char* p_pcBuffer) { - - bool bResult = false; - - if (p_pcBuffer) { - bResult = true; - - *p_pcBuffer = 0; - for (stcMDNSServiceTxt* pTxt=m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) { - size_t stLength; - if ((bResult = (0 != (stLength = (pTxt->m_pcKey ? strlen(pTxt->m_pcKey) : 0))))) { - if (pTxt != m_pTxts) { - *p_pcBuffer++ = ';'; - } - strncpy(p_pcBuffer, pTxt->m_pcKey, stLength); p_pcBuffer[stLength] = 0; - p_pcBuffer += stLength; - *p_pcBuffer++ = '='; - if ((stLength = (pTxt->m_pcValue ? strlen(pTxt->m_pcValue) : 0))) { - strncpy(p_pcBuffer, pTxt->m_pcValue, stLength); p_pcBuffer[stLength] = 0; - p_pcBuffer += stLength; - } - } - } - *p_pcBuffer++ = 0; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::bufferLength - * - * (incl. closing '\0'). - */ -size_t MDNSResponder::stcMDNSServiceTxts::bufferLength(void) const { - - return (length() + 1); -} - -/* - * MDNSResponder::stcMDNSServiceTxts::toBuffer - */ -bool MDNSResponder::stcMDNSServiceTxts::buffer(char* p_pcBuffer) { - - bool bResult = false; - - if (p_pcBuffer) { - bResult = true; - - *p_pcBuffer = 0; - for (stcMDNSServiceTxt* pTxt=m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) { - *(unsigned char*)p_pcBuffer++ = pTxt->length(); - size_t stLength; - if ((bResult = (0 != (stLength = (pTxt->m_pcKey ? strlen(pTxt->m_pcKey) : 0))))) { - memcpy(p_pcBuffer, pTxt->m_pcKey, stLength); - p_pcBuffer += stLength; - *p_pcBuffer++ = '='; - if ((stLength = (pTxt->m_pcValue ? strlen(pTxt->m_pcValue) : 0))) { - memcpy(p_pcBuffer, pTxt->m_pcValue, stLength); - p_pcBuffer += stLength; - } - } - } - *p_pcBuffer++ = 0; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::compare - */ -bool MDNSResponder::stcMDNSServiceTxts::compare(const MDNSResponder::stcMDNSServiceTxts& p_Other) const { - - bool bResult = false; - - if ((bResult = (length() == p_Other.length()))) { - // Compare A->B - for (const stcMDNSServiceTxt* pTxt=m_pTxts; ((bResult) && (pTxt)); pTxt=pTxt->m_pNext) { - const stcMDNSServiceTxt* pOtherTxt = p_Other.find(pTxt->m_pcKey); - bResult = ((pOtherTxt) && - (pTxt->m_pcValue) && - (pOtherTxt->m_pcValue) && - (strlen(pTxt->m_pcValue) == strlen(pOtherTxt->m_pcValue)) && - (0 == strcmp(pTxt->m_pcValue, pOtherTxt->m_pcValue))); - } - // Compare B->A - for (const stcMDNSServiceTxt* pOtherTxt=p_Other.m_pTxts; ((bResult) && (pOtherTxt)); pOtherTxt=pOtherTxt->m_pNext) { - const stcMDNSServiceTxt* pTxt = find(pOtherTxt->m_pcKey); - bResult = ((pTxt) && - (pOtherTxt->m_pcValue) && - (pTxt->m_pcValue) && - (strlen(pOtherTxt->m_pcValue) == strlen(pTxt->m_pcValue)) && - (0 == strcmp(pOtherTxt->m_pcValue, pTxt->m_pcValue))); - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceTxts::operator== - */ -bool MDNSResponder::stcMDNSServiceTxts::operator==(const stcMDNSServiceTxts& p_Other) const { - - return compare(p_Other); -} - -/* - * MDNSResponder::stcMDNSServiceTxts::operator!= - */ -bool MDNSResponder::stcMDNSServiceTxts::operator!=(const stcMDNSServiceTxts& p_Other) const { - - return !compare(p_Other); -} - - -/** - * MDNSResponder::stcMDNS_MsgHeader - * - * A MDNS message haeder. - * - */ - -/* - * MDNSResponder::stcMDNS_MsgHeader::stcMDNS_MsgHeader - */ -MDNSResponder::stcMDNS_MsgHeader::stcMDNS_MsgHeader(uint16_t p_u16ID /*= 0*/, - bool p_bQR /*= false*/, - unsigned char p_ucOpcode /*= 0*/, - bool p_bAA /*= false*/, - bool p_bTC /*= false*/, - bool p_bRD /*= false*/, - bool p_bRA /*= false*/, - unsigned char p_ucRCode /*= 0*/, - uint16_t p_u16QDCount /*= 0*/, - uint16_t p_u16ANCount /*= 0*/, - uint16_t p_u16NSCount /*= 0*/, - uint16_t p_u16ARCount /*= 0*/) -: m_u16ID(p_u16ID), - m_1bQR(p_bQR), m_4bOpcode(p_ucOpcode), m_1bAA(p_bAA), m_1bTC(p_bTC), m_1bRD(p_bRD), - m_1bRA(p_bRA), m_3bZ(0), m_4bRCode(p_ucRCode), - m_u16QDCount(p_u16QDCount), - m_u16ANCount(p_u16ANCount), - m_u16NSCount(p_u16NSCount), - m_u16ARCount(p_u16ARCount) { - -} - - -/** - * MDNSResponder::stcMDNS_RRDomain - * - * A MDNS domain object. - * The labels of the domain are stored (DNS-like encoded) in 'm_acName': - * [length byte]varlength label[length byte]varlength label[0] - * 'm_u16NameLength' stores the used length of 'm_acName'. - * Dynamic label addition is supported. - * Comparison is supported. - * Export as byte array 'esp8266.local' is supported. - * - */ - -/* - * MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain constructor - */ -MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain(void) -: m_u16NameLength(0) { - - clear(); -} - -/* - * MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain copy-constructor - */ -MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain(const stcMDNS_RRDomain& p_Other) -: m_u16NameLength(0) { - - operator=(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRDomain::operator = - */ -MDNSResponder::stcMDNS_RRDomain& MDNSResponder::stcMDNS_RRDomain::operator=(const stcMDNS_RRDomain& p_Other) { - - if (&p_Other != this) { - memcpy(m_acName, p_Other.m_acName, sizeof(m_acName)); - m_u16NameLength = p_Other.m_u16NameLength; - } - return *this; -} - -/* - * MDNSResponder::stcMDNS_RRDomain::clear - */ -bool MDNSResponder::stcMDNS_RRDomain::clear(void) { - - memset(m_acName, 0, sizeof(m_acName)); - m_u16NameLength = 0; - return true; -} - -/* - * MDNSResponder::stcMDNS_RRDomain::addLabel - */ -bool MDNSResponder::stcMDNS_RRDomain::addLabel(const char* p_pcLabel, - bool p_bPrependUnderline /*= false*/) { - - bool bResult = false; - - size_t stLength = (p_pcLabel - ? (strlen(p_pcLabel) + (p_bPrependUnderline ? 1 : 0)) - : 0); - if ((MDNS_DOMAIN_LABEL_MAXLENGTH >= stLength) && - (MDNS_DOMAIN_MAXLENGTH >= (m_u16NameLength + (1 + stLength)))) { - // Length byte - m_acName[m_u16NameLength] = (unsigned char)stLength; // Might be 0! - ++m_u16NameLength; - // Label - if (stLength) { - if (p_bPrependUnderline) { - m_acName[m_u16NameLength++] = '_'; - --stLength; - } - strncpy(&(m_acName[m_u16NameLength]), p_pcLabel, stLength); m_acName[m_u16NameLength + stLength] = 0; - m_u16NameLength += stLength; - } - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNS_RRDomain::compare - */ -bool MDNSResponder::stcMDNS_RRDomain::compare(const stcMDNS_RRDomain& p_Other) const { - - bool bResult = false; - - if (m_u16NameLength == p_Other.m_u16NameLength) { - const char* pT = m_acName; - const char* pO = p_Other.m_acName; - while ((pT) && - (pO) && - (*((unsigned char*)pT) == *((unsigned char*)pO)) && // Same length AND - (0 == strncasecmp((pT + 1), (pO + 1), *((unsigned char*)pT)))) { // Same content - if (*((unsigned char*)pT)) { // Not 0 - pT += (1 + *((unsigned char*)pT)); // Shift by length byte and lenght - pO += (1 + *((unsigned char*)pO)); - } - else { // Is 0 -> Successfully reached the end - bResult = true; - break; - } - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNS_RRDomain::operator == - */ -bool MDNSResponder::stcMDNS_RRDomain::operator==(const stcMDNS_RRDomain& p_Other) const { - - return compare(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRDomain::operator != - */ -bool MDNSResponder::stcMDNS_RRDomain::operator!=(const stcMDNS_RRDomain& p_Other) const { - - return !compare(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRDomain::operator > - */ -bool MDNSResponder::stcMDNS_RRDomain::operator>(const stcMDNS_RRDomain& p_Other) const { - - // TODO: Check, if this is a good idea... - return !compare(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRDomain::c_strLength - */ -size_t MDNSResponder::stcMDNS_RRDomain::c_strLength(void) const { - - size_t stLength = 0; - - unsigned char* pucLabelLength = (unsigned char*)m_acName; - while (*pucLabelLength) { - stLength += (*pucLabelLength + 1 /* +1 for '.' or '\0'*/); - pucLabelLength += (*pucLabelLength + 1); - } - return stLength; -} - -/* - * MDNSResponder::stcMDNS_RRDomain::c_str - */ -bool MDNSResponder::stcMDNS_RRDomain::c_str(char* p_pcBuffer) { - - bool bResult = false; - - if (p_pcBuffer) { - *p_pcBuffer = 0; - unsigned char* pucLabelLength = (unsigned char*)m_acName; - while (*pucLabelLength) { - memcpy(p_pcBuffer, (const char*)(pucLabelLength + 1), *pucLabelLength); - p_pcBuffer += *pucLabelLength; - pucLabelLength += (*pucLabelLength + 1); - *p_pcBuffer++ = (*pucLabelLength ? '.' : '\0'); - } - bResult = true; - } - return bResult; -} - - -/** - * MDNSResponder::stcMDNS_RRAttributes - * - * A MDNS attributes object. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes constructor - */ -MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes(uint16_t p_u16Type /*= 0*/, - uint16_t p_u16Class /*= 1 DNS_RRCLASS_IN Internet*/) -: m_u16Type(p_u16Type), - m_u16Class(p_u16Class) { - -} - -/* - * MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes copy-constructor - */ -MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes(const MDNSResponder::stcMDNS_RRAttributes& p_Other) { - - operator=(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRAttributes::operator = - */ -MDNSResponder::stcMDNS_RRAttributes& MDNSResponder::stcMDNS_RRAttributes::operator=(const MDNSResponder::stcMDNS_RRAttributes& p_Other) { - - if (&p_Other != this) { - m_u16Type = p_Other.m_u16Type; - m_u16Class = p_Other.m_u16Class; - } - return *this; -} - - -/** - * MDNSResponder::stcMDNS_RRHeader - * - * A MDNS record header (domain and attributes) object. - * - */ - -/* - * MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader constructor - */ -MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader(void) { - -} - -/* - * MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader copy-constructor - */ -MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader(const stcMDNS_RRHeader& p_Other) { - - operator=(p_Other); -} - -/* - * MDNSResponder::stcMDNS_RRHeader::operator = - */ -MDNSResponder::stcMDNS_RRHeader& MDNSResponder::stcMDNS_RRHeader::operator=(const MDNSResponder::stcMDNS_RRHeader& p_Other) { - - if (&p_Other != this) { - m_Domain = p_Other.m_Domain; - m_Attributes = p_Other.m_Attributes; - } - return *this; -} - -/* - * MDNSResponder::stcMDNS_RRHeader::clear - */ -bool MDNSResponder::stcMDNS_RRHeader::clear(void) { - - m_Domain.clear(); - return true; -} - - -/** - * MDNSResponder::stcMDNS_RRQuestion - * - * A MDNS question record object (header + question flags) - * - */ - -/* - * MDNSResponder::stcMDNS_RRQuestion::stcMDNS_RRQuestion constructor - */ -MDNSResponder::stcMDNS_RRQuestion::stcMDNS_RRQuestion(void) -: m_pNext(0), - m_bUnicast(false) { - -} - - -/** - * MDNSResponder::stcMDNS_RRAnswer - * - * A MDNS answer record object (header + answer content). - * This is a 'virtual' base class for all other MDNS answer classes. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAnswer::stcMDNS_RRAnswer constructor - */ -MDNSResponder::stcMDNS_RRAnswer::stcMDNS_RRAnswer(enuAnswerType p_AnswerType, - const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) -: m_pNext(0), - m_AnswerType(p_AnswerType), - m_Header(p_Header), - m_u32TTL(p_u32TTL) { - - // Extract 'cache flush'-bit - m_bCacheFlush = (m_Header.m_Attributes.m_u16Class & 0x8000); - m_Header.m_Attributes.m_u16Class &= (~0x8000); -} - -/* - * MDNSResponder::stcMDNS_RRAnswer::~stcMDNS_RRAnswer destructor - */ -MDNSResponder::stcMDNS_RRAnswer::~stcMDNS_RRAnswer(void) { - -} - -/* - * MDNSResponder::stcMDNS_RRAnswer::answerType - */ -MDNSResponder::enuAnswerType MDNSResponder::stcMDNS_RRAnswer::answerType(void) const { - - return m_AnswerType; -} - -/* - * MDNSResponder::stcMDNS_RRAnswer::clear - */ -bool MDNSResponder::stcMDNS_RRAnswer::clear(void) { - - m_pNext = 0; - m_Header.clear(); - return true; -} - - -/** - * MDNSResponder::stcMDNS_RRAnswerA - * - * A MDNS A answer object. - * Extends the base class by an IP4 address member. - * - */ - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA constructor - */ - MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA(const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) - : stcMDNS_RRAnswer(AnswerType_A, p_Header, p_u32TTL), - m_IPAddress(0, 0, 0, 0) { - - } - - /* - * MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA destructor - */ - MDNSResponder::stcMDNS_RRAnswerA::~stcMDNS_RRAnswerA(void) { - - clear(); - } - - /* - * MDNSResponder::stcMDNS_RRAnswerA::clear - */ - bool MDNSResponder::stcMDNS_RRAnswerA::clear(void) { - - m_IPAddress = IPAddress(0, 0, 0, 0); - return true; - } -#endif - - -/** - * MDNSResponder::stcMDNS_RRAnswerPTR - * - * A MDNS PTR answer object. - * Extends the base class by a MDNS domain member. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAnswerPTR::stcMDNS_RRAnswerPTR constructor - */ -MDNSResponder::stcMDNS_RRAnswerPTR::stcMDNS_RRAnswerPTR(const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) -: stcMDNS_RRAnswer(AnswerType_PTR, p_Header, p_u32TTL) { - -} - -/* - * MDNSResponder::stcMDNS_RRAnswerPTR::~stcMDNS_RRAnswerPTR destructor - */ -MDNSResponder::stcMDNS_RRAnswerPTR::~stcMDNS_RRAnswerPTR(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNS_RRAnswerPTR::clear - */ -bool MDNSResponder::stcMDNS_RRAnswerPTR::clear(void) { - - m_PTRDomain.clear(); - return true; -} - - -/** - * MDNSResponder::stcMDNS_RRAnswerTXT - * - * A MDNS TXT answer object. - * Extends the base class by a MDNS TXT items list member. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAnswerTXT::stcMDNS_RRAnswerTXT constructor - */ -MDNSResponder::stcMDNS_RRAnswerTXT::stcMDNS_RRAnswerTXT(const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) -: stcMDNS_RRAnswer(AnswerType_TXT, p_Header, p_u32TTL) { - -} - -/* - * MDNSResponder::stcMDNS_RRAnswerTXT::~stcMDNS_RRAnswerTXT destructor - */ -MDNSResponder::stcMDNS_RRAnswerTXT::~stcMDNS_RRAnswerTXT(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNS_RRAnswerTXT::clear - */ -bool MDNSResponder::stcMDNS_RRAnswerTXT::clear(void) { - - m_Txts.clear(); - return true; -} - - -/** - * MDNSResponder::stcMDNS_RRAnswerAAAA - * - * A MDNS AAAA answer object. - * (Should) extend the base class by an IP6 address member. - * - */ - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::stcMDNS_RRAnswerAAAA::stcMDNS_RRAnswerAAAA constructor - */ - MDNSResponder::stcMDNS_RRAnswerAAAA::stcMDNS_RRAnswerAAAA(const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) - : stcMDNS_RRAnswer(AnswerType_AAAA, p_Header, p_u32TTL) { - - } - - /* - * MDNSResponder::stcMDNS_RRAnswerAAAA::~stcMDNS_RRAnswerAAAA destructor - */ - MDNSResponder::stcMDNS_RRAnswerAAAA::~stcMDNS_RRAnswerAAAA(void) { - - clear(); - } - - /* - * MDNSResponder::stcMDNS_RRAnswerAAAA::clear - */ - bool MDNSResponder::stcMDNS_RRAnswerAAAA::clear(void) { - - return true; - } -#endif - - -/** - * MDNSResponder::stcMDNS_RRAnswerSRV - * - * A MDNS SRV answer object. - * Extends the base class by a port member. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAnswerSRV::stcMDNS_RRAnswerSRV constructor - */ -MDNSResponder::stcMDNS_RRAnswerSRV::stcMDNS_RRAnswerSRV(const MDNSResponder::stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) -: stcMDNS_RRAnswer(AnswerType_SRV, p_Header, p_u32TTL), - m_u16Priority(0), - m_u16Weight(0), - m_u16Port(0) { - -} - -/* - * MDNSResponder::stcMDNS_RRAnswerSRV::~stcMDNS_RRAnswerSRV destructor - */ -MDNSResponder::stcMDNS_RRAnswerSRV::~stcMDNS_RRAnswerSRV(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNS_RRAnswerSRV::clear - */ -bool MDNSResponder::stcMDNS_RRAnswerSRV::clear(void) { - - m_u16Priority = 0; - m_u16Weight = 0; - m_u16Port = 0; - m_SRVDomain.clear(); - return true; -} - - -/** - * MDNSResponder::stcMDNS_RRAnswerGeneric - * - * An unknown (generic) MDNS answer object. - * Extends the base class by a RDATA buffer member. - * - */ - -/* - * MDNSResponder::stcMDNS_RRAnswerGeneric::stcMDNS_RRAnswerGeneric constructor - */ -MDNSResponder::stcMDNS_RRAnswerGeneric::stcMDNS_RRAnswerGeneric(const stcMDNS_RRHeader& p_Header, - uint32_t p_u32TTL) -: stcMDNS_RRAnswer(AnswerType_Generic, p_Header, p_u32TTL), - m_u16RDLength(0), - m_pu8RDData(0) { - -} - -/* - * MDNSResponder::stcMDNS_RRAnswerGeneric::~stcMDNS_RRAnswerGeneric destructor - */ -MDNSResponder::stcMDNS_RRAnswerGeneric::~stcMDNS_RRAnswerGeneric(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNS_RRAnswerGeneric::clear - */ -bool MDNSResponder::stcMDNS_RRAnswerGeneric::clear(void) { - - if (m_pu8RDData) { - delete[] m_pu8RDData; - m_pu8RDData = 0; - } - m_u16RDLength = 0; - - return true; -} - - -/** - * MDNSResponder::stcProbeInformation - * - * Probing status information for a host or service domain - * - */ - -/* - * MDNSResponder::stcProbeInformation::stcProbeInformation constructor - */ -MDNSResponder::stcProbeInformation::stcProbeInformation(void) -: m_ProbingStatus(ProbingStatus_WaitingForData), - m_u8SentCount(0), - m_Timeout(esp8266::polledTimeout::oneShotMs::neverExpires), - m_bConflict(false), - m_bTiebreakNeeded(false), - m_fnHostProbeResultCallback(0), - m_fnServiceProbeResultCallback(0) { -} - -/* - * MDNSResponder::stcProbeInformation::clear - */ -bool MDNSResponder::stcProbeInformation::clear(bool p_bClearUserdata /*= false*/) { - - m_ProbingStatus = ProbingStatus_WaitingForData; - m_u8SentCount = 0; - m_Timeout.resetToNeverExpires(); - m_bConflict = false; - m_bTiebreakNeeded = false; - if (p_bClearUserdata) { - m_fnHostProbeResultCallback = 0; - m_fnServiceProbeResultCallback = 0; - } - return true; -} - -/** - * MDNSResponder::stcMDNSService - * - * A MDNS service object (to be announced by the MDNS responder) - * The service instance may be '\0'; in this case the hostname is used - * and the flag m_bAutoName is set. If the hostname changes, all 'auto- - * named' services are renamed also. - * m_u8Replymask is used while preparing a response to a MDNS query. It is - * resetted in '_sendMDNSMessage' afterwards. - */ - -/* - * MDNSResponder::stcMDNSService::stcMDNSService constructor - */ -MDNSResponder::stcMDNSService::stcMDNSService(const char* p_pcName /*= 0*/, - const char* p_pcService /*= 0*/, - const char* p_pcProtocol /*= 0*/) -: m_pNext(0), - m_pcName(0), - m_bAutoName(false), - m_pcService(0), - m_pcProtocol(0), - m_u16Port(0), - m_u8ReplyMask(0), - m_fnTxtCallback(0) { - - setName(p_pcName); - setService(p_pcService); - setProtocol(p_pcProtocol); -} - -/* - * MDNSResponder::stcMDNSService::~stcMDNSService destructor - */ -MDNSResponder::stcMDNSService::~stcMDNSService(void) { - - releaseName(); - releaseService(); - releaseProtocol(); -} - -/* - * MDNSResponder::stcMDNSService::setName - */ -bool MDNSResponder::stcMDNSService::setName(const char* p_pcName) { - - bool bResult = false; - - releaseName(); - size_t stLength = (p_pcName ? strlen(p_pcName) : 0); - if (stLength) { - if ((bResult = (0 != (m_pcName = new char[stLength + 1])))) { - strncpy(m_pcName, p_pcName, stLength); - m_pcName[stLength] = 0; - } - } - else { - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSService::releaseName - */ -bool MDNSResponder::stcMDNSService::releaseName(void) { - - if (m_pcName) { - delete[] m_pcName; - m_pcName = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSService::setService - */ -bool MDNSResponder::stcMDNSService::setService(const char* p_pcService) { - - bool bResult = false; - - releaseService(); - size_t stLength = (p_pcService ? strlen(p_pcService) : 0); - if (stLength) { - if ((bResult = (0 != (m_pcService = new char[stLength + 1])))) { - strncpy(m_pcService, p_pcService, stLength); - m_pcService[stLength] = 0; - } - } - else { - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSService::releaseService - */ -bool MDNSResponder::stcMDNSService::releaseService(void) { - - if (m_pcService) { - delete[] m_pcService; - m_pcService = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSService::setProtocol - */ -bool MDNSResponder::stcMDNSService::setProtocol(const char* p_pcProtocol) { - - bool bResult = false; - - releaseProtocol(); - size_t stLength = (p_pcProtocol ? strlen(p_pcProtocol) : 0); - if (stLength) { - if ((bResult = (0 != (m_pcProtocol = new char[stLength + 1])))) { - strncpy(m_pcProtocol, p_pcProtocol, stLength); - m_pcProtocol[stLength] = 0; - } - } - else { - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSService::releaseProtocol - */ -bool MDNSResponder::stcMDNSService::releaseProtocol(void) { - - if (m_pcProtocol) { - delete[] m_pcProtocol; - m_pcProtocol = 0; - } - return true; -} - - -/** - * MDNSResponder::stcMDNSServiceQuery - * - * A MDNS service query object. - * Service queries may be static or dynamic. - * As the static service query is processed in the blocking function 'queryService', - * only one static service service may exist. The processing of the answers is done - * on the WiFi-stack side of the ESP stack structure (via 'UDPContext.onRx(_update)'). - * - */ - -/** - * MDNSResponder::stcMDNSServiceQuery::stcAnswer - * - * One answer for a service query. - * Every answer must contain - * - a service instance entry (pivot), - * and may contain - * - a host domain, - * - a port - * - an IP4 address - * (- an IP6 address) - * - a MDNS TXTs - * The existance of a component is flaged in 'm_u32ContentFlags'. - * For every answer component a TTL value is maintained. - * Answer objects can be connected to a linked list. - * - * For the host domain, service domain and TXTs components, a char array - * representation can be retrieved (which is created on demand). - * - */ - -/** - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL - * - * The TTL (Time-To-Live) for an specific answer content. - * The 80% and outdated states are calculated based on the current time (millis) - * and the 'set' time (also millis). - * If the answer is scheduled for an update, the corresponding flag should be set. - * - * / - -/ * - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor - * / -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(uint32_t p_u32TTL / *= 0* /) -: m_bUpdateScheduled(false) { - - set(p_u32TTL * 1000); -} - -/ * - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set - * / -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) { - - m_TTLTimeFlag.restart(p_u32TTL * 1000); - m_bUpdateScheduled = false; - - return true; -} - -/ * - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent - * / -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent(void) const { - - return ((m_TTLTimeFlag.getTimeout()) && - (!m_bUpdateScheduled) && - (m_TTLTimeFlag.hypotheticalTimeout((m_TTLTimeFlag.getTimeout() * 800) / 1000))); -} - -/ * - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated - * / -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated(void) const { - - return ((m_TTLTimeFlag.getTimeout()) && - (m_TTLTimeFlag.flagged())); -}*/ - - -/** - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL - * - * The TTL (Time-To-Live) for an specific answer content. - * The 80% and outdated states are calculated based on the current time (millis) - * and the 'set' time (also millis). - * If the answer is scheduled for an update, the corresponding flag should be set. - * - */ - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(void) -: m_u32TTL(0), - m_TTLTimeout(esp8266::polledTimeout::oneShotMs::neverExpires), - m_timeoutLevel(TIMEOUTLEVEL_UNSET) { - -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) { - - m_u32TTL = p_u32TTL; - if (m_u32TTL) { - m_timeoutLevel = TIMEOUTLEVEL_BASE; // Set to 80% - m_TTLTimeout.reset(timeout()); - } - else { - m_timeoutLevel = TIMEOUTLEVEL_UNSET; // undef - m_TTLTimeout.resetToNeverExpires(); - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged(void) { - - return ((m_u32TTL) && - (TIMEOUTLEVEL_UNSET != m_timeoutLevel) && - (m_TTLTimeout.expired())); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart(void) { - - bool bResult = true; - - if ((TIMEOUTLEVEL_BASE <= m_timeoutLevel) && // >= 80% AND - (TIMEOUTLEVEL_FINAL > m_timeoutLevel)) { // < 100% - - m_timeoutLevel += TIMEOUTLEVEL_INTERVAL; // increment by 5% - m_TTLTimeout.reset(timeout()); - } - else { - bResult = false; - m_TTLTimeout.resetToNeverExpires(); - m_timeoutLevel = TIMEOUTLEVEL_UNSET; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion(void) { - - m_timeoutLevel = TIMEOUTLEVEL_FINAL; - m_TTLTimeout.reset(1 * 1000); // See RFC 6762, 10.1 - - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel(void) const { - - return (TIMEOUTLEVEL_FINAL == m_timeoutLevel); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout - */ -unsigned long MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout(void) const { - - uint32_t u32Timeout = esp8266::polledTimeout::oneShotMs::neverExpires; - - if (TIMEOUTLEVEL_BASE == m_timeoutLevel) { // 80% - u32Timeout = (m_u32TTL * 800); // to milliseconds - } - else if ((TIMEOUTLEVEL_BASE < m_timeoutLevel) && // >80% AND - (TIMEOUTLEVEL_FINAL >= m_timeoutLevel)) { // <= 100% - - u32Timeout = (m_u32TTL * 50); - } // else: invalid - return u32Timeout; -} - - -#ifdef MDNS_IP4_SUPPORT -/** - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address - * - */ - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address constructor - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address(IPAddress p_IPAddress, - uint32_t p_u32TTL /*= 0*/) -: m_pNext(0), - m_IPAddress(p_IPAddress) { - - m_TTL.set(p_u32TTL); -} -#endif - - -/** - * MDNSResponder::stcMDNSServiceQuery::stcAnswer - */ - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcAnswer constructor - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcAnswer(void) -: m_pNext(0), - m_pcServiceDomain(0), - m_pcHostDomain(0), - m_u16Port(0), - m_pcTxts(0), -#ifdef MDNS_IP4_SUPPORT - m_pIP4Addresses(0), -#endif -#ifdef MDNS_IP6_SUPPORT - m_pIP6Addresses(0), -#endif - m_u32ContentFlags(0) { -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::~stcAnswer destructor - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::~stcAnswer(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::clear - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::clear(void) { - - return ((releaseTxts()) && -#ifdef MDNS_IP4_SUPPORT - (releaseIP4Addresses()) && -#endif -#ifdef MDNS_IP6_SUPPORT - (releaseIP6Addresses()) -#endif - (releaseHostDomain()) && - (releaseServiceDomain())); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocServiceDomain - * - * Alloc memory for the char array representation of the service domain. - * - */ -char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocServiceDomain(size_t p_stLength) { - - releaseServiceDomain(); - if (p_stLength) { - m_pcServiceDomain = new char[p_stLength]; - } - return m_pcServiceDomain; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseServiceDomain - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseServiceDomain(void) { - - if (m_pcServiceDomain) { - delete[] m_pcServiceDomain; - m_pcServiceDomain = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocHostDomain - * - * Alloc memory for the char array representation of the host domain. - * - */ -char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocHostDomain(size_t p_stLength) { - - releaseHostDomain(); - if (p_stLength) { - m_pcHostDomain = new char[p_stLength]; - } - return m_pcHostDomain; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseHostDomain - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseHostDomain(void) { - - if (m_pcHostDomain) { - delete[] m_pcHostDomain; - m_pcHostDomain = 0; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocTxts - * - * Alloc memory for the char array representation of the TXT items. - * - */ -char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocTxts(size_t p_stLength) { - - releaseTxts(); - if (p_stLength) { - m_pcTxts = new char[p_stLength]; - } - return m_pcTxts; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseTxts - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseTxts(void) { - - if (m_pcTxts) { - delete[] m_pcTxts; - m_pcTxts = 0; - } - return true; -} - -#ifdef MDNS_IP4_SUPPORT -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP4Addresses - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP4Addresses(void) { - - while (m_pIP4Addresses) { - stcIP4Address* pNext = m_pIP4Addresses->m_pNext; - delete m_pIP4Addresses; - m_pIP4Addresses = pNext; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP4Address - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP4Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* p_pIP4Address) { - - bool bResult = false; - - if (p_pIP4Address) { - p_pIP4Address->m_pNext = m_pIP4Addresses; - m_pIP4Addresses = p_pIP4Address; - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP4Address - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP4Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* p_pIP4Address) { - - bool bResult = false; - - if (p_pIP4Address) { - stcIP4Address* pPred = m_pIP4Addresses; - while ((pPred) && - (pPred->m_pNext != p_pIP4Address)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pIP4Address->m_pNext; - delete p_pIP4Address; - bResult = true; - } - else if (m_pIP4Addresses == p_pIP4Address) { // No predecesor, but first item - m_pIP4Addresses = p_pIP4Address->m_pNext; - delete p_pIP4Address; - bResult = true; - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address (const) - */ -const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) const { - - return (stcIP4Address*)(((const stcAnswer*)this)->findIP4Address(p_IPAddress)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) { - - stcIP4Address* pIP4Address = m_pIP4Addresses; - while (pIP4Address) { - if (pIP4Address->m_IPAddress == p_IPAddress) { - break; - } - pIP4Address = pIP4Address->m_pNext; - } - return pIP4Address; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressCount - */ -uint32_t MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressCount(void) const { - - uint32_t u32Count = 0; - - stcIP4Address* pIP4Address = m_pIP4Addresses; - while (pIP4Address) { - ++u32Count; - pIP4Address = pIP4Address->m_pNext; - } - return u32Count; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex(uint32_t p_u32Index) { - - return (stcIP4Address*)(((const stcAnswer*)this)->IP4AddressAtIndex(p_u32Index)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex (const) - */ -const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex(uint32_t p_u32Index) const { - - const stcIP4Address* pIP4Address = 0; - - if (((uint32_t)(-1) != p_u32Index) && - (m_pIP4Addresses)) { - - uint32_t u32Index; - for (pIP4Address=m_pIP4Addresses, u32Index=0; ((pIP4Address) && (u32Indexm_pNext, ++u32Index); - } - return pIP4Address; -} -#endif - -#ifdef MDNS_IP6_SUPPORT -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP6Addresses - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP6Addresses(void) { - - while (m_pIP6Addresses) { - stcIP6Address* pNext = m_pIP6Addresses->m_pNext; - delete m_pIP6Addresses; - m_pIP6Addresses = pNext; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP6Address - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP6Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* p_pIP6Address) { - - bool bResult = false; - - if (p_pIP6Address) { - p_pIP6Address->m_pNext = m_pIP6Addresses; - m_pIP6Addresses = p_pIP6Address; - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP6Address - */ -bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP6Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* p_pIP6Address) { - - bool bResult = false; - - if (p_pIP6Address) { - stcIP6Address* pPred = m_pIP6Addresses; - while ((pPred) && - (pPred->m_pNext != p_pIP6Address)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pIP6Address->m_pNext; - delete p_pIP6Address; - bResult = true; - } - else if (m_pIP6Addresses == p_pIP6Address) { // No predecesor, but first item - m_pIP6Addresses = p_pIP6Address->m_pNext; - delete p_pIP6Address; - bResult = true; - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address(const IP6Address& p_IPAddress) { - - return (stcIP6Address*)(((const stcAnswer*)this)->findIP6Address(p_IPAddress)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address (const) - */ -const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address(const IPAddress& p_IPAddress) const { - - const stcIP6Address* pIP6Address = m_pIP6Addresses; - while (pIP6Address) { - if (p_IP6Address->m_IPAddress == p_IPAddress) { - break; - } - pIP6Address = pIP6Address->m_pNext; - } - return pIP6Address; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressCount - */ -uint32_t MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressCount(void) const { - - uint32_t u32Count = 0; - - stcIP6Address* pIP6Address = m_pIP6Addresses; - while (pIP6Address) { - ++u32Count; - pIP6Address = pIP6Address->m_pNext; - } - return u32Count; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex (const) - */ -const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex(uint32_t p_u32Index) const { - - return (stcIP6Address*)(((const stcAnswer*)this)->IP6AddressAtIndex(p_u32Index)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex(uint32_t p_u32Index) { - - stcIP6Address* pIP6Address = 0; - - if (((uint32_t)(-1) != p_u32Index) && - (m_pIP6Addresses)) { - - uint32_t u32Index; - for (pIP6Address=m_pIP6Addresses, u32Index=0; ((pIP6Address) && (u32Indexm_pNext, ++u32Index); - } - return pIP6Address; -} -#endif - - -/** - * MDNSResponder::stcMDNSServiceQuery - * - * A service query object. - * A static query is flaged via 'm_bLegacyQuery'; while the function 'queryService' - * is waiting for answers, the internal flag 'm_bAwaitingAnswers' is set. When the - * timeout is reached, the flag is removed. These two flags are only used for static - * service queries. - * All answers to the service query are stored in 'm_pAnswers' list. - * Individual answers may be addressed by index (in the list of answers). - * Every time a answer component is added (or changes) in a dynamic service query, - * the callback 'm_fnCallback' is called. - * The answer list may be searched by service and host domain. - * - * Service query object may be connected to a linked list. - */ - -/* - * MDNSResponder::stcMDNSServiceQuery::stcMDNSServiceQuery constructor - */ -MDNSResponder::stcMDNSServiceQuery::stcMDNSServiceQuery(void) -: m_pNext(0), - m_fnCallback(0), - m_bLegacyQuery(false), - m_u8SentCount(0), - m_ResendTimeout(esp8266::polledTimeout::oneShotMs::neverExpires), - m_bAwaitingAnswers(true), - m_pAnswers(0) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::~stcMDNSServiceQuery destructor - */ -MDNSResponder::stcMDNSServiceQuery::~stcMDNSServiceQuery(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::clear - */ -bool MDNSResponder::stcMDNSServiceQuery::clear(void) { - - m_fnCallback = 0; - m_bLegacyQuery = false; - m_u8SentCount = 0; - m_ResendTimeout.resetToNeverExpires(); - m_bAwaitingAnswers = true; - while (m_pAnswers) { - stcAnswer* pNext = m_pAnswers->m_pNext; - delete m_pAnswers; - m_pAnswers = pNext; - } - return true; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::answerCount - */ -uint32_t MDNSResponder::stcMDNSServiceQuery::answerCount(void) const { - - uint32_t u32Count = 0; - - stcAnswer* pAnswer = m_pAnswers; - while (pAnswer) { - ++u32Count; - pAnswer = pAnswer->m_pNext; - } - return u32Count; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::answerAtIndex - */ -const MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::answerAtIndex(uint32_t p_u32Index) const { - - const stcAnswer* pAnswer = 0; - - if (((uint32_t)(-1) != p_u32Index) && - (m_pAnswers)) { - - uint32_t u32Index; - for (pAnswer=m_pAnswers, u32Index=0; ((pAnswer) && (u32Indexm_pNext, ++u32Index); - } - return pAnswer; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::answerAtIndex - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::answerAtIndex(uint32_t p_u32Index) { - - return (stcAnswer*)(((const stcMDNSServiceQuery*)this)->answerAtIndex(p_u32Index)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::indexOfAnswer - */ -uint32_t MDNSResponder::stcMDNSServiceQuery::indexOfAnswer(const MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) const { - - uint32_t u32Index = 0; - - for (const stcAnswer* pAnswer=m_pAnswers; pAnswer; pAnswer=pAnswer->m_pNext, ++u32Index) { - if (pAnswer == p_pAnswer) { - return u32Index; - } - } - return ((uint32_t)(-1)); -} - -/* - * MDNSResponder::stcMDNSServiceQuery::addAnswer - */ -bool MDNSResponder::stcMDNSServiceQuery::addAnswer(MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) { - - bool bResult = false; - - if (p_pAnswer) { - p_pAnswer->m_pNext = m_pAnswers; - m_pAnswers = p_pAnswer; - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::removeAnswer - */ -bool MDNSResponder::stcMDNSServiceQuery::removeAnswer(MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) { - - bool bResult = false; - - if (p_pAnswer) { - stcAnswer* pPred = m_pAnswers; - while ((pPred) && - (pPred->m_pNext != p_pAnswer)) { - pPred = pPred->m_pNext; - } - if (pPred) { - pPred->m_pNext = p_pAnswer->m_pNext; - delete p_pAnswer; - bResult = true; - } - else if (m_pAnswers == p_pAnswer) { // No predecesor, but first item - m_pAnswers = p_pAnswer->m_pNext; - delete p_pAnswer; - bResult = true; - } - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::findAnswerForServiceDomain - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::findAnswerForServiceDomain(const MDNSResponder::stcMDNS_RRDomain& p_ServiceDomain) { - - stcAnswer* pAnswer = m_pAnswers; - while (pAnswer) { - if (pAnswer->m_ServiceDomain == p_ServiceDomain) { - break; - } - pAnswer = pAnswer->m_pNext; - } - return pAnswer; -} - -/* - * MDNSResponder::stcMDNSServiceQuery::findAnswerForHostDomain - */ -MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::findAnswerForHostDomain(const MDNSResponder::stcMDNS_RRDomain& p_HostDomain) { - - stcAnswer* pAnswer = m_pAnswers; - while (pAnswer) { - if (pAnswer->m_HostDomain == p_HostDomain) { - break; - } - pAnswer = pAnswer->m_pNext; - } - return pAnswer; -} - - -/** - * MDNSResponder::stcMDNSSendParameter - * - * A 'collection' of properties and flags for one MDNS query or response. - * Mainly managed by the 'Control' functions. - * The current offset in the UPD output buffer is tracked to be able to do - * a simple host or service domain compression. - * - */ - -/** - * MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem - * - * A cached host or service domain, incl. the offset in the UDP output buffer. - * - */ - -/* - * MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem::stcDomainCacheItem constructor - */ -MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem::stcDomainCacheItem(const void* p_pHostnameOrService, - bool p_bAdditionalData, - uint32_t p_u16Offset) -: m_pNext(0), - m_pHostnameOrService(p_pHostnameOrService), - m_bAdditionalData(p_bAdditionalData), - m_u16Offset(p_u16Offset) { - -} - -/** - * MDNSResponder::stcMDNSSendParameter - */ - -/* - * MDNSResponder::stcMDNSSendParameter::stcMDNSSendParameter constructor - */ -MDNSResponder::stcMDNSSendParameter::stcMDNSSendParameter(void) -: m_pQuestions(0), - m_pDomainCacheItems(0) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSSendParameter::~stcMDNSSendParameter destructor - */ -MDNSResponder::stcMDNSSendParameter::~stcMDNSSendParameter(void) { - - clear(); -} - -/* - * MDNSResponder::stcMDNSSendParameter::clear - */ -bool MDNSResponder::stcMDNSSendParameter::clear(void) { - - m_u16ID = 0; - m_u8HostReplyMask = 0; - m_u16Offset = 0; - - m_bLegacyQuery = false; - m_bResponse = false; - m_bAuthorative = false; - m_bUnicast = false; - m_bUnannounce = false; - - m_bCacheFlush = true; - - while (m_pQuestions) { - stcMDNS_RRQuestion* pNext = m_pQuestions->m_pNext; - delete m_pQuestions; - m_pQuestions = pNext; - } - while (m_pDomainCacheItems) { - stcDomainCacheItem* pNext = m_pDomainCacheItems->m_pNext; - delete m_pDomainCacheItems; - m_pDomainCacheItems = pNext; - } - return true; -} - -/* - * MDNSResponder::stcMDNSSendParameter::shiftOffset - */ -bool MDNSResponder::stcMDNSSendParameter::shiftOffset(uint16_t p_u16Shift) { - - m_u16Offset += p_u16Shift; - return true; -} - -/* - * MDNSResponder::stcMDNSSendParameter::addDomainCacheItem - */ -bool MDNSResponder::stcMDNSSendParameter::addDomainCacheItem(const void* p_pHostnameOrService, - bool p_bAdditionalData, - uint16_t p_u16Offset) { - - bool bResult = false; - - stcDomainCacheItem* pNewItem = 0; - if ((p_pHostnameOrService) && - (p_u16Offset) && - ((pNewItem = new stcDomainCacheItem(p_pHostnameOrService, p_bAdditionalData, p_u16Offset)))) { - - pNewItem->m_pNext = m_pDomainCacheItems; - bResult = ((m_pDomainCacheItems = pNewItem)); - } - return bResult; -} - -/* - * MDNSResponder::stcMDNSSendParameter::findCachedDomainOffset - */ -uint16_t MDNSResponder::stcMDNSSendParameter::findCachedDomainOffset(const void* p_pHostnameOrService, - bool p_bAdditionalData) const { - - const stcDomainCacheItem* pCacheItem = m_pDomainCacheItems; - - for (; pCacheItem; pCacheItem=pCacheItem->m_pNext) { - if ((pCacheItem->m_pHostnameOrService == p_pHostnameOrService) && - (pCacheItem->m_bAdditionalData == p_bAdditionalData)) { // Found cache item - break; - } - } - return (pCacheItem ? pCacheItem->m_u16Offset : 0); -} - -} // namespace MDNSImplementation - -} // namespace esp8266 - - - +/* + LEAmDNS_Structs.cpp + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +#include "LEAmDNS_Priv.h" +#include "LEAmDNS_lwIPdefs.h" + +namespace esp8266 +{ + +/* + LEAmDNS +*/ +namespace MDNSImplementation +{ + +/** + STRUCTS +*/ + +/** + MDNSResponder::stcMDNSServiceTxt + + One MDNS TXT item. + m_pcValue may be '\0'. + Objects can be chained together (list, m_pNext). + A 'm_bTemp' flag differentiates between static and dynamic items. + Output as byte array 'c#=1' is supported. +*/ + +/* + MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt constructor +*/ +MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt(const char* p_pcKey /*= 0*/, + const char* p_pcValue /*= 0*/, + bool p_bTemp /*= false*/) + : m_pNext(0), + m_pcKey(0), + m_pcValue(0), + m_bTemp(p_bTemp) +{ + + setKey(p_pcKey); + setValue(p_pcValue); +} + +/* + MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt copy-constructor +*/ +MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt(const MDNSResponder::stcMDNSServiceTxt& p_Other) + : m_pNext(0), + m_pcKey(0), + m_pcValue(0), + m_bTemp(false) +{ + + operator=(p_Other); +} + +/* + MDNSResponder::stcMDNSServiceTxt::~stcMDNSServiceTxt destructor +*/ +MDNSResponder::stcMDNSServiceTxt::~stcMDNSServiceTxt(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSServiceTxt::operator= +*/ +MDNSResponder::stcMDNSServiceTxt& MDNSResponder::stcMDNSServiceTxt::operator=(const MDNSResponder::stcMDNSServiceTxt& p_Other) +{ + + if (&p_Other != this) + { + clear(); + set(p_Other.m_pcKey, p_Other.m_pcValue, p_Other.m_bTemp); + } + return *this; +} + +/* + MDNSResponder::stcMDNSServiceTxt::clear +*/ +bool MDNSResponder::stcMDNSServiceTxt::clear(void) +{ + + releaseKey(); + releaseValue(); + return true; +} + +/* + MDNSResponder::stcMDNSServiceTxt::allocKey +*/ +char* MDNSResponder::stcMDNSServiceTxt::allocKey(size_t p_stLength) +{ + + releaseKey(); + if (p_stLength) + { + m_pcKey = new char[p_stLength + 1]; + } + return m_pcKey; +} + +/* + MDNSResponder::stcMDNSServiceTxt::setKey +*/ +bool MDNSResponder::stcMDNSServiceTxt::setKey(const char* p_pcKey, + size_t p_stLength) +{ + + bool bResult = false; + + releaseKey(); + if (p_stLength) + { + if (allocKey(p_stLength)) + { + strncpy(m_pcKey, p_pcKey, p_stLength); + m_pcKey[p_stLength] = 0; + bResult = true; + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxt::setKey +*/ +bool MDNSResponder::stcMDNSServiceTxt::setKey(const char* p_pcKey) +{ + + return setKey(p_pcKey, (p_pcKey ? strlen(p_pcKey) : 0)); +} + +/* + MDNSResponder::stcMDNSServiceTxt::releaseKey +*/ +bool MDNSResponder::stcMDNSServiceTxt::releaseKey(void) +{ + + if (m_pcKey) + { + delete[] m_pcKey; + m_pcKey = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceTxt::allocValue +*/ +char* MDNSResponder::stcMDNSServiceTxt::allocValue(size_t p_stLength) +{ + + releaseValue(); + if (p_stLength) + { + m_pcValue = new char[p_stLength + 1]; + } + return m_pcValue; +} + +/* + MDNSResponder::stcMDNSServiceTxt::setValue +*/ +bool MDNSResponder::stcMDNSServiceTxt::setValue(const char* p_pcValue, + size_t p_stLength) +{ + + bool bResult = false; + + releaseValue(); + if (p_stLength) + { + if (allocValue(p_stLength)) + { + strncpy(m_pcValue, p_pcValue, p_stLength); + m_pcValue[p_stLength] = 0; + bResult = true; + } + } + else // No value -> also OK + { + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxt::setValue +*/ +bool MDNSResponder::stcMDNSServiceTxt::setValue(const char* p_pcValue) +{ + + return setValue(p_pcValue, (p_pcValue ? strlen(p_pcValue) : 0)); +} + +/* + MDNSResponder::stcMDNSServiceTxt::releaseValue +*/ +bool MDNSResponder::stcMDNSServiceTxt::releaseValue(void) +{ + + if (m_pcValue) + { + delete[] m_pcValue; + m_pcValue = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceTxt::set +*/ +bool MDNSResponder::stcMDNSServiceTxt::set(const char* p_pcKey, + const char* p_pcValue, + bool p_bTemp /*= false*/) +{ + + m_bTemp = p_bTemp; + return ((setKey(p_pcKey)) && + (setValue(p_pcValue))); +} + +/* + MDNSResponder::stcMDNSServiceTxt::update +*/ +bool MDNSResponder::stcMDNSServiceTxt::update(const char* p_pcValue) +{ + + return setValue(p_pcValue); +} + +/* + MDNSResponder::stcMDNSServiceTxt::length + + length of eg. 'c#=1' without any closing '\0' +*/ +size_t MDNSResponder::stcMDNSServiceTxt::length(void) const +{ + + size_t stLength = 0; + if (m_pcKey) + { + stLength += strlen(m_pcKey); // Key + stLength += 1; // '=' + stLength += (m_pcValue ? strlen(m_pcValue) : 0); // Value + } + return stLength; +} + + +/** + MDNSResponder::stcMDNSServiceTxts + + A list of zero or more MDNS TXT items. + Dynamic TXT items can be removed by 'removeTempTxts'. + A TXT item can be looke up by its 'key' member. + Export as ';'-separated byte array is supported. + Export as 'length byte coded' byte array is supported. + Comparision ((all A TXT items in B and equal) AND (all B TXT items in A and equal)) is supported. + +*/ + +/* + MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts contructor +*/ +MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts(void) + : m_pTxts(0) +{ + +} + +/* + MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts copy-constructor +*/ +MDNSResponder::stcMDNSServiceTxts::stcMDNSServiceTxts(const stcMDNSServiceTxts& p_Other) + : m_pTxts(0) +{ + + operator=(p_Other); +} + +/* + MDNSResponder::stcMDNSServiceTxts::~stcMDNSServiceTxts destructor +*/ +MDNSResponder::stcMDNSServiceTxts::~stcMDNSServiceTxts(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSServiceTxts::operator= +*/ +MDNSResponder::stcMDNSServiceTxts& MDNSResponder::stcMDNSServiceTxts::operator=(const stcMDNSServiceTxts& p_Other) +{ + + if (this != &p_Other) + { + clear(); + + for (stcMDNSServiceTxt* pOtherTxt = p_Other.m_pTxts; pOtherTxt; pOtherTxt = pOtherTxt->m_pNext) + { + add(new stcMDNSServiceTxt(*pOtherTxt)); + } + } + return *this; +} + +/* + MDNSResponder::stcMDNSServiceTxts::clear +*/ +bool MDNSResponder::stcMDNSServiceTxts::clear(void) +{ + + while (m_pTxts) + { + stcMDNSServiceTxt* pNext = m_pTxts->m_pNext; + delete m_pTxts; + m_pTxts = pNext; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceTxts::add +*/ +bool MDNSResponder::stcMDNSServiceTxts::add(MDNSResponder::stcMDNSServiceTxt* p_pTxt) +{ + + bool bResult = false; + + if (p_pTxt) + { + p_pTxt->m_pNext = m_pTxts; + m_pTxts = p_pTxt; + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::remove +*/ +bool MDNSResponder::stcMDNSServiceTxts::remove(stcMDNSServiceTxt* p_pTxt) +{ + + bool bResult = false; + + if (p_pTxt) + { + stcMDNSServiceTxt* pPred = m_pTxts; + while ((pPred) && + (pPred->m_pNext != p_pTxt)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pTxt->m_pNext; + delete p_pTxt; + bResult = true; + } + else if (m_pTxts == p_pTxt) // No predecesor, but first item + { + m_pTxts = p_pTxt->m_pNext; + delete p_pTxt; + bResult = true; + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::removeTempTxts +*/ +bool MDNSResponder::stcMDNSServiceTxts::removeTempTxts(void) +{ + + bool bResult = true; + + stcMDNSServiceTxt* pTxt = m_pTxts; + while ((bResult) && + (pTxt)) + { + stcMDNSServiceTxt* pNext = pTxt->m_pNext; + if (pTxt->m_bTemp) + { + bResult = remove(pTxt); + } + pTxt = pNext; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::find +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const char* p_pcKey) +{ + + stcMDNSServiceTxt* pResult = 0; + + for (stcMDNSServiceTxt* pTxt = m_pTxts; pTxt; pTxt = pTxt->m_pNext) + { + if ((p_pcKey) && + (0 == strcmp(pTxt->m_pcKey, p_pcKey))) + { + pResult = pTxt; + break; + } + } + return pResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::find +*/ +const MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const char* p_pcKey) const +{ + + const stcMDNSServiceTxt* pResult = 0; + + for (const stcMDNSServiceTxt* pTxt = m_pTxts; pTxt; pTxt = pTxt->m_pNext) + { + if ((p_pcKey) && + (0 == strcmp(pTxt->m_pcKey, p_pcKey))) + { + + pResult = pTxt; + break; + } + } + return pResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::find +*/ +MDNSResponder::stcMDNSServiceTxt* MDNSResponder::stcMDNSServiceTxts::find(const stcMDNSServiceTxt* p_pTxt) +{ + + stcMDNSServiceTxt* pResult = 0; + + for (stcMDNSServiceTxt* pTxt = m_pTxts; pTxt; pTxt = pTxt->m_pNext) + { + if (p_pTxt == pTxt) + { + pResult = pTxt; + break; + } + } + return pResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::length +*/ +uint16_t MDNSResponder::stcMDNSServiceTxts::length(void) const +{ + + uint16_t u16Length = 0; + + stcMDNSServiceTxt* pTxt = m_pTxts; + while (pTxt) + { + u16Length += 1; // Length byte + u16Length += pTxt->length(); // Text + pTxt = pTxt->m_pNext; + } + return u16Length; +} + +/* + MDNSResponder::stcMDNSServiceTxts::c_strLength + + (incl. closing '\0'). Length bytes place is used for delimiting ';' and closing '\0' +*/ +size_t MDNSResponder::stcMDNSServiceTxts::c_strLength(void) const +{ + + return length(); +} + +/* + MDNSResponder::stcMDNSServiceTxts::c_str +*/ +bool MDNSResponder::stcMDNSServiceTxts::c_str(char* p_pcBuffer) +{ + + bool bResult = false; + + if (p_pcBuffer) + { + bResult = true; + + *p_pcBuffer = 0; + for (stcMDNSServiceTxt* pTxt = m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) + { + size_t stLength; + if ((bResult = (0 != (stLength = (pTxt->m_pcKey ? strlen(pTxt->m_pcKey) : 0))))) + { + if (pTxt != m_pTxts) + { + *p_pcBuffer++ = ';'; + } + strncpy(p_pcBuffer, pTxt->m_pcKey, stLength); p_pcBuffer[stLength] = 0; + p_pcBuffer += stLength; + *p_pcBuffer++ = '='; + if ((stLength = (pTxt->m_pcValue ? strlen(pTxt->m_pcValue) : 0))) + { + strncpy(p_pcBuffer, pTxt->m_pcValue, stLength); p_pcBuffer[stLength] = 0; + p_pcBuffer += stLength; + } + } + } + *p_pcBuffer++ = 0; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::bufferLength + + (incl. closing '\0'). +*/ +size_t MDNSResponder::stcMDNSServiceTxts::bufferLength(void) const +{ + + return (length() + 1); +} + +/* + MDNSResponder::stcMDNSServiceTxts::toBuffer +*/ +bool MDNSResponder::stcMDNSServiceTxts::buffer(char* p_pcBuffer) +{ + + bool bResult = false; + + if (p_pcBuffer) + { + bResult = true; + + *p_pcBuffer = 0; + for (stcMDNSServiceTxt* pTxt = m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) + { + *(unsigned char*)p_pcBuffer++ = pTxt->length(); + size_t stLength; + if ((bResult = (0 != (stLength = (pTxt->m_pcKey ? strlen(pTxt->m_pcKey) : 0))))) + { + memcpy(p_pcBuffer, pTxt->m_pcKey, stLength); + p_pcBuffer += stLength; + *p_pcBuffer++ = '='; + if ((stLength = (pTxt->m_pcValue ? strlen(pTxt->m_pcValue) : 0))) + { + memcpy(p_pcBuffer, pTxt->m_pcValue, stLength); + p_pcBuffer += stLength; + } + } + } + *p_pcBuffer++ = 0; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::compare +*/ +bool MDNSResponder::stcMDNSServiceTxts::compare(const MDNSResponder::stcMDNSServiceTxts& p_Other) const +{ + + bool bResult = false; + + if ((bResult = (length() == p_Other.length()))) + { + // Compare A->B + for (const stcMDNSServiceTxt* pTxt = m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) + { + const stcMDNSServiceTxt* pOtherTxt = p_Other.find(pTxt->m_pcKey); + bResult = ((pOtherTxt) && + (pTxt->m_pcValue) && + (pOtherTxt->m_pcValue) && + (strlen(pTxt->m_pcValue) == strlen(pOtherTxt->m_pcValue)) && + (0 == strcmp(pTxt->m_pcValue, pOtherTxt->m_pcValue))); + } + // Compare B->A + for (const stcMDNSServiceTxt* pOtherTxt = p_Other.m_pTxts; ((bResult) && (pOtherTxt)); pOtherTxt = pOtherTxt->m_pNext) + { + const stcMDNSServiceTxt* pTxt = find(pOtherTxt->m_pcKey); + bResult = ((pTxt) && + (pOtherTxt->m_pcValue) && + (pTxt->m_pcValue) && + (strlen(pOtherTxt->m_pcValue) == strlen(pTxt->m_pcValue)) && + (0 == strcmp(pOtherTxt->m_pcValue, pTxt->m_pcValue))); + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceTxts::operator== +*/ +bool MDNSResponder::stcMDNSServiceTxts::operator==(const stcMDNSServiceTxts& p_Other) const +{ + + return compare(p_Other); +} + +/* + MDNSResponder::stcMDNSServiceTxts::operator!= +*/ +bool MDNSResponder::stcMDNSServiceTxts::operator!=(const stcMDNSServiceTxts& p_Other) const +{ + + return !compare(p_Other); +} + + +/** + MDNSResponder::stcMDNS_MsgHeader + + A MDNS message haeder. + +*/ + +/* + MDNSResponder::stcMDNS_MsgHeader::stcMDNS_MsgHeader +*/ +MDNSResponder::stcMDNS_MsgHeader::stcMDNS_MsgHeader(uint16_t p_u16ID /*= 0*/, + bool p_bQR /*= false*/, + unsigned char p_ucOpcode /*= 0*/, + bool p_bAA /*= false*/, + bool p_bTC /*= false*/, + bool p_bRD /*= false*/, + bool p_bRA /*= false*/, + unsigned char p_ucRCode /*= 0*/, + uint16_t p_u16QDCount /*= 0*/, + uint16_t p_u16ANCount /*= 0*/, + uint16_t p_u16NSCount /*= 0*/, + uint16_t p_u16ARCount /*= 0*/) + : m_u16ID(p_u16ID), + m_1bQR(p_bQR), m_4bOpcode(p_ucOpcode), m_1bAA(p_bAA), m_1bTC(p_bTC), m_1bRD(p_bRD), + m_1bRA(p_bRA), m_3bZ(0), m_4bRCode(p_ucRCode), + m_u16QDCount(p_u16QDCount), + m_u16ANCount(p_u16ANCount), + m_u16NSCount(p_u16NSCount), + m_u16ARCount(p_u16ARCount) +{ + +} + + +/** + MDNSResponder::stcMDNS_RRDomain + + A MDNS domain object. + The labels of the domain are stored (DNS-like encoded) in 'm_acName': + [length byte]varlength label[length byte]varlength label[0] + 'm_u16NameLength' stores the used length of 'm_acName'. + Dynamic label addition is supported. + Comparison is supported. + Export as byte array 'esp8266.local' is supported. + +*/ + +/* + MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain constructor +*/ +MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain(void) + : m_u16NameLength(0) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain copy-constructor +*/ +MDNSResponder::stcMDNS_RRDomain::stcMDNS_RRDomain(const stcMDNS_RRDomain& p_Other) + : m_u16NameLength(0) +{ + + operator=(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRDomain::operator = +*/ +MDNSResponder::stcMDNS_RRDomain& MDNSResponder::stcMDNS_RRDomain::operator=(const stcMDNS_RRDomain& p_Other) +{ + + if (&p_Other != this) + { + memcpy(m_acName, p_Other.m_acName, sizeof(m_acName)); + m_u16NameLength = p_Other.m_u16NameLength; + } + return *this; +} + +/* + MDNSResponder::stcMDNS_RRDomain::clear +*/ +bool MDNSResponder::stcMDNS_RRDomain::clear(void) +{ + + memset(m_acName, 0, sizeof(m_acName)); + m_u16NameLength = 0; + return true; +} + +/* + MDNSResponder::stcMDNS_RRDomain::addLabel +*/ +bool MDNSResponder::stcMDNS_RRDomain::addLabel(const char* p_pcLabel, + bool p_bPrependUnderline /*= false*/) +{ + + bool bResult = false; + + size_t stLength = (p_pcLabel + ? (strlen(p_pcLabel) + (p_bPrependUnderline ? 1 : 0)) + : 0); + if ((MDNS_DOMAIN_LABEL_MAXLENGTH >= stLength) && + (MDNS_DOMAIN_MAXLENGTH >= (m_u16NameLength + (1 + stLength)))) + { + // Length byte + m_acName[m_u16NameLength] = (unsigned char)stLength; // Might be 0! + ++m_u16NameLength; + // Label + if (stLength) + { + if (p_bPrependUnderline) + { + m_acName[m_u16NameLength++] = '_'; + --stLength; + } + strncpy(&(m_acName[m_u16NameLength]), p_pcLabel, stLength); m_acName[m_u16NameLength + stLength] = 0; + m_u16NameLength += stLength; + } + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNS_RRDomain::compare +*/ +bool MDNSResponder::stcMDNS_RRDomain::compare(const stcMDNS_RRDomain& p_Other) const +{ + + bool bResult = false; + + if (m_u16NameLength == p_Other.m_u16NameLength) + { + const char* pT = m_acName; + const char* pO = p_Other.m_acName; + while ((pT) && + (pO) && + (*((unsigned char*)pT) == *((unsigned char*)pO)) && // Same length AND + (0 == strncasecmp((pT + 1), (pO + 1), *((unsigned char*)pT)))) // Same content + { + if (*((unsigned char*)pT)) // Not 0 + { + pT += (1 + * ((unsigned char*)pT)); // Shift by length byte and lenght + pO += (1 + * ((unsigned char*)pO)); + } + else // Is 0 -> Successfully reached the end + { + bResult = true; + break; + } + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNS_RRDomain::operator == +*/ +bool MDNSResponder::stcMDNS_RRDomain::operator==(const stcMDNS_RRDomain& p_Other) const +{ + + return compare(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRDomain::operator != +*/ +bool MDNSResponder::stcMDNS_RRDomain::operator!=(const stcMDNS_RRDomain& p_Other) const +{ + + return !compare(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRDomain::operator > +*/ +bool MDNSResponder::stcMDNS_RRDomain::operator>(const stcMDNS_RRDomain& p_Other) const +{ + + // TODO: Check, if this is a good idea... + return !compare(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRDomain::c_strLength +*/ +size_t MDNSResponder::stcMDNS_RRDomain::c_strLength(void) const +{ + + size_t stLength = 0; + + unsigned char* pucLabelLength = (unsigned char*)m_acName; + while (*pucLabelLength) + { + stLength += (*pucLabelLength + 1 /* +1 for '.' or '\0'*/); + pucLabelLength += (*pucLabelLength + 1); + } + return stLength; +} + +/* + MDNSResponder::stcMDNS_RRDomain::c_str +*/ +bool MDNSResponder::stcMDNS_RRDomain::c_str(char* p_pcBuffer) +{ + + bool bResult = false; + + if (p_pcBuffer) + { + *p_pcBuffer = 0; + unsigned char* pucLabelLength = (unsigned char*)m_acName; + while (*pucLabelLength) + { + memcpy(p_pcBuffer, (const char*)(pucLabelLength + 1), *pucLabelLength); + p_pcBuffer += *pucLabelLength; + pucLabelLength += (*pucLabelLength + 1); + *p_pcBuffer++ = (*pucLabelLength ? '.' : '\0'); + } + bResult = true; + } + return bResult; +} + + +/** + MDNSResponder::stcMDNS_RRAttributes + + A MDNS attributes object. + +*/ + +/* + MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes constructor +*/ +MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes(uint16_t p_u16Type /*= 0*/, + uint16_t p_u16Class /*= 1 DNS_RRCLASS_IN Internet*/) + : m_u16Type(p_u16Type), + m_u16Class(p_u16Class) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes copy-constructor +*/ +MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes(const MDNSResponder::stcMDNS_RRAttributes& p_Other) +{ + + operator=(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRAttributes::operator = +*/ +MDNSResponder::stcMDNS_RRAttributes& MDNSResponder::stcMDNS_RRAttributes::operator=(const MDNSResponder::stcMDNS_RRAttributes& p_Other) +{ + + if (&p_Other != this) + { + m_u16Type = p_Other.m_u16Type; + m_u16Class = p_Other.m_u16Class; + } + return *this; +} + + +/** + MDNSResponder::stcMDNS_RRHeader + + A MDNS record header (domain and attributes) object. + +*/ + +/* + MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader constructor +*/ +MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader(void) +{ + +} + +/* + MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader copy-constructor +*/ +MDNSResponder::stcMDNS_RRHeader::stcMDNS_RRHeader(const stcMDNS_RRHeader& p_Other) +{ + + operator=(p_Other); +} + +/* + MDNSResponder::stcMDNS_RRHeader::operator = +*/ +MDNSResponder::stcMDNS_RRHeader& MDNSResponder::stcMDNS_RRHeader::operator=(const MDNSResponder::stcMDNS_RRHeader& p_Other) +{ + + if (&p_Other != this) + { + m_Domain = p_Other.m_Domain; + m_Attributes = p_Other.m_Attributes; + } + return *this; +} + +/* + MDNSResponder::stcMDNS_RRHeader::clear +*/ +bool MDNSResponder::stcMDNS_RRHeader::clear(void) +{ + + m_Domain.clear(); + return true; +} + + +/** + MDNSResponder::stcMDNS_RRQuestion + + A MDNS question record object (header + question flags) + +*/ + +/* + MDNSResponder::stcMDNS_RRQuestion::stcMDNS_RRQuestion constructor +*/ +MDNSResponder::stcMDNS_RRQuestion::stcMDNS_RRQuestion(void) + : m_pNext(0), + m_bUnicast(false) +{ + +} + + +/** + MDNSResponder::stcMDNS_RRAnswer + + A MDNS answer record object (header + answer content). + This is a 'virtual' base class for all other MDNS answer classes. + +*/ + +/* + MDNSResponder::stcMDNS_RRAnswer::stcMDNS_RRAnswer constructor +*/ +MDNSResponder::stcMDNS_RRAnswer::stcMDNS_RRAnswer(enuAnswerType p_AnswerType, + const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : m_pNext(0), + m_AnswerType(p_AnswerType), + m_Header(p_Header), + m_u32TTL(p_u32TTL) +{ + + // Extract 'cache flush'-bit + m_bCacheFlush = (m_Header.m_Attributes.m_u16Class & 0x8000); + m_Header.m_Attributes.m_u16Class &= (~0x8000); +} + +/* + MDNSResponder::stcMDNS_RRAnswer::~stcMDNS_RRAnswer destructor +*/ +MDNSResponder::stcMDNS_RRAnswer::~stcMDNS_RRAnswer(void) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswer::answerType +*/ +MDNSResponder::enuAnswerType MDNSResponder::stcMDNS_RRAnswer::answerType(void) const +{ + + return m_AnswerType; +} + +/* + MDNSResponder::stcMDNS_RRAnswer::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswer::clear(void) +{ + + m_pNext = 0; + m_Header.clear(); + return true; +} + + +/** + MDNSResponder::stcMDNS_RRAnswerA + + A MDNS A answer object. + Extends the base class by an IP4 address member. + +*/ + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA constructor +*/ +MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA(const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_A, p_Header, p_u32TTL), + m_IPAddress(0, 0, 0, 0) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA destructor +*/ +MDNSResponder::stcMDNS_RRAnswerA::~stcMDNS_RRAnswerA(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerA::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerA::clear(void) +{ + + m_IPAddress = IPAddress(0, 0, 0, 0); + return true; +} +#endif + + +/** + MDNSResponder::stcMDNS_RRAnswerPTR + + A MDNS PTR answer object. + Extends the base class by a MDNS domain member. + +*/ + +/* + MDNSResponder::stcMDNS_RRAnswerPTR::stcMDNS_RRAnswerPTR constructor +*/ +MDNSResponder::stcMDNS_RRAnswerPTR::stcMDNS_RRAnswerPTR(const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_PTR, p_Header, p_u32TTL) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerPTR::~stcMDNS_RRAnswerPTR destructor +*/ +MDNSResponder::stcMDNS_RRAnswerPTR::~stcMDNS_RRAnswerPTR(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerPTR::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerPTR::clear(void) +{ + + m_PTRDomain.clear(); + return true; +} + + +/** + MDNSResponder::stcMDNS_RRAnswerTXT + + A MDNS TXT answer object. + Extends the base class by a MDNS TXT items list member. + +*/ + +/* + MDNSResponder::stcMDNS_RRAnswerTXT::stcMDNS_RRAnswerTXT constructor +*/ +MDNSResponder::stcMDNS_RRAnswerTXT::stcMDNS_RRAnswerTXT(const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_TXT, p_Header, p_u32TTL) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerTXT::~stcMDNS_RRAnswerTXT destructor +*/ +MDNSResponder::stcMDNS_RRAnswerTXT::~stcMDNS_RRAnswerTXT(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerTXT::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerTXT::clear(void) +{ + + m_Txts.clear(); + return true; +} + + +/** + MDNSResponder::stcMDNS_RRAnswerAAAA + + A MDNS AAAA answer object. + (Should) extend the base class by an IP6 address member. + +*/ + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::stcMDNS_RRAnswerAAAA::stcMDNS_RRAnswerAAAA constructor +*/ +MDNSResponder::stcMDNS_RRAnswerAAAA::stcMDNS_RRAnswerAAAA(const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_AAAA, p_Header, p_u32TTL) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerAAAA::~stcMDNS_RRAnswerAAAA destructor +*/ +MDNSResponder::stcMDNS_RRAnswerAAAA::~stcMDNS_RRAnswerAAAA(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerAAAA::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerAAAA::clear(void) +{ + + return true; +} +#endif + + +/** + MDNSResponder::stcMDNS_RRAnswerSRV + + A MDNS SRV answer object. + Extends the base class by a port member. + +*/ + +/* + MDNSResponder::stcMDNS_RRAnswerSRV::stcMDNS_RRAnswerSRV constructor +*/ +MDNSResponder::stcMDNS_RRAnswerSRV::stcMDNS_RRAnswerSRV(const MDNSResponder::stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_SRV, p_Header, p_u32TTL), + m_u16Priority(0), + m_u16Weight(0), + m_u16Port(0) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerSRV::~stcMDNS_RRAnswerSRV destructor +*/ +MDNSResponder::stcMDNS_RRAnswerSRV::~stcMDNS_RRAnswerSRV(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerSRV::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerSRV::clear(void) +{ + + m_u16Priority = 0; + m_u16Weight = 0; + m_u16Port = 0; + m_SRVDomain.clear(); + return true; +} + + +/** + MDNSResponder::stcMDNS_RRAnswerGeneric + + An unknown (generic) MDNS answer object. + Extends the base class by a RDATA buffer member. + +*/ + +/* + MDNSResponder::stcMDNS_RRAnswerGeneric::stcMDNS_RRAnswerGeneric constructor +*/ +MDNSResponder::stcMDNS_RRAnswerGeneric::stcMDNS_RRAnswerGeneric(const stcMDNS_RRHeader& p_Header, + uint32_t p_u32TTL) + : stcMDNS_RRAnswer(AnswerType_Generic, p_Header, p_u32TTL), + m_u16RDLength(0), + m_pu8RDData(0) +{ + +} + +/* + MDNSResponder::stcMDNS_RRAnswerGeneric::~stcMDNS_RRAnswerGeneric destructor +*/ +MDNSResponder::stcMDNS_RRAnswerGeneric::~stcMDNS_RRAnswerGeneric(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNS_RRAnswerGeneric::clear +*/ +bool MDNSResponder::stcMDNS_RRAnswerGeneric::clear(void) +{ + + if (m_pu8RDData) + { + delete[] m_pu8RDData; + m_pu8RDData = 0; + } + m_u16RDLength = 0; + + return true; +} + + +/** + MDNSResponder::stcProbeInformation + + Probing status information for a host or service domain + +*/ + +/* + MDNSResponder::stcProbeInformation::stcProbeInformation constructor +*/ +MDNSResponder::stcProbeInformation::stcProbeInformation(void) + : m_ProbingStatus(ProbingStatus_WaitingForData), + m_u8SentCount(0), + m_Timeout(esp8266::polledTimeout::oneShotMs::neverExpires), + m_bConflict(false), + m_bTiebreakNeeded(false), + m_fnHostProbeResultCallback(0), + m_fnServiceProbeResultCallback(0) +{ +} + +/* + MDNSResponder::stcProbeInformation::clear +*/ +bool MDNSResponder::stcProbeInformation::clear(bool p_bClearUserdata /*= false*/) +{ + + m_ProbingStatus = ProbingStatus_WaitingForData; + m_u8SentCount = 0; + m_Timeout.resetToNeverExpires(); + m_bConflict = false; + m_bTiebreakNeeded = false; + if (p_bClearUserdata) + { + m_fnHostProbeResultCallback = 0; + m_fnServiceProbeResultCallback = 0; + } + return true; +} + +/** + MDNSResponder::stcMDNSService + + A MDNS service object (to be announced by the MDNS responder) + The service instance may be '\0'; in this case the hostname is used + and the flag m_bAutoName is set. If the hostname changes, all 'auto- + named' services are renamed also. + m_u8Replymask is used while preparing a response to a MDNS query. It is + resetted in '_sendMDNSMessage' afterwards. +*/ + +/* + MDNSResponder::stcMDNSService::stcMDNSService constructor +*/ +MDNSResponder::stcMDNSService::stcMDNSService(const char* p_pcName /*= 0*/, + const char* p_pcService /*= 0*/, + const char* p_pcProtocol /*= 0*/) + : m_pNext(0), + m_pcName(0), + m_bAutoName(false), + m_pcService(0), + m_pcProtocol(0), + m_u16Port(0), + m_u8ReplyMask(0), + m_fnTxtCallback(0) +{ + + setName(p_pcName); + setService(p_pcService); + setProtocol(p_pcProtocol); +} + +/* + MDNSResponder::stcMDNSService::~stcMDNSService destructor +*/ +MDNSResponder::stcMDNSService::~stcMDNSService(void) +{ + + releaseName(); + releaseService(); + releaseProtocol(); +} + +/* + MDNSResponder::stcMDNSService::setName +*/ +bool MDNSResponder::stcMDNSService::setName(const char* p_pcName) +{ + + bool bResult = false; + + releaseName(); + size_t stLength = (p_pcName ? strlen(p_pcName) : 0); + if (stLength) + { + if ((bResult = (0 != (m_pcName = new char[stLength + 1])))) + { + strncpy(m_pcName, p_pcName, stLength); + m_pcName[stLength] = 0; + } + } + else + { + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSService::releaseName +*/ +bool MDNSResponder::stcMDNSService::releaseName(void) +{ + + if (m_pcName) + { + delete[] m_pcName; + m_pcName = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSService::setService +*/ +bool MDNSResponder::stcMDNSService::setService(const char* p_pcService) +{ + + bool bResult = false; + + releaseService(); + size_t stLength = (p_pcService ? strlen(p_pcService) : 0); + if (stLength) + { + if ((bResult = (0 != (m_pcService = new char[stLength + 1])))) + { + strncpy(m_pcService, p_pcService, stLength); + m_pcService[stLength] = 0; + } + } + else + { + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSService::releaseService +*/ +bool MDNSResponder::stcMDNSService::releaseService(void) +{ + + if (m_pcService) + { + delete[] m_pcService; + m_pcService = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSService::setProtocol +*/ +bool MDNSResponder::stcMDNSService::setProtocol(const char* p_pcProtocol) +{ + + bool bResult = false; + + releaseProtocol(); + size_t stLength = (p_pcProtocol ? strlen(p_pcProtocol) : 0); + if (stLength) + { + if ((bResult = (0 != (m_pcProtocol = new char[stLength + 1])))) + { + strncpy(m_pcProtocol, p_pcProtocol, stLength); + m_pcProtocol[stLength] = 0; + } + } + else + { + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSService::releaseProtocol +*/ +bool MDNSResponder::stcMDNSService::releaseProtocol(void) +{ + + if (m_pcProtocol) + { + delete[] m_pcProtocol; + m_pcProtocol = 0; + } + return true; +} + + +/** + MDNSResponder::stcMDNSServiceQuery + + A MDNS service query object. + Service queries may be static or dynamic. + As the static service query is processed in the blocking function 'queryService', + only one static service service may exist. The processing of the answers is done + on the WiFi-stack side of the ESP stack structure (via 'UDPContext.onRx(_update)'). + +*/ + +/** + MDNSResponder::stcMDNSServiceQuery::stcAnswer + + One answer for a service query. + Every answer must contain + - a service instance entry (pivot), + and may contain + - a host domain, + - a port + - an IP4 address + (- an IP6 address) + - a MDNS TXTs + The existance of a component is flaged in 'm_u32ContentFlags'. + For every answer component a TTL value is maintained. + Answer objects can be connected to a linked list. + + For the host domain, service domain and TXTs components, a char array + representation can be retrieved (which is created on demand). + +*/ + +/** + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL + + The TTL (Time-To-Live) for an specific answer content. + The 80% and outdated states are calculated based on the current time (millis) + and the 'set' time (also millis). + If the answer is scheduled for an update, the corresponding flag should be set. + + / + + / * + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor + / + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(uint32_t p_u32TTL / *= 0* /) + : m_bUpdateScheduled(false) { + + set(p_u32TTL * 1000); + } + + / * + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set + / + bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) { + + m_TTLTimeFlag.restart(p_u32TTL * 1000); + m_bUpdateScheduled = false; + + return true; + } + + / * + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent + / + bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::has80Percent(void) const { + + return ((m_TTLTimeFlag.getTimeout()) && + (!m_bUpdateScheduled) && + (m_TTLTimeFlag.hypotheticalTimeout((m_TTLTimeFlag.getTimeout() * 800) / 1000))); + } + + / * + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated + / + bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::isOutdated(void) const { + + return ((m_TTLTimeFlag.getTimeout()) && + (m_TTLTimeFlag.flagged())); + }*/ + + +/** + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL + + The TTL (Time-To-Live) for an specific answer content. + The 80% and outdated states are calculated based on the current time (millis) + and the 'set' time (also millis). + If the answer is scheduled for an update, the corresponding flag should be set. + +*/ + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL constructor +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::stcTTL(void) + : m_u32TTL(0), + m_TTLTimeout(esp8266::polledTimeout::oneShotMs::neverExpires), + m_timeoutLevel(TIMEOUTLEVEL_UNSET) +{ + +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::set(uint32_t p_u32TTL) +{ + + m_u32TTL = p_u32TTL; + if (m_u32TTL) + { + m_timeoutLevel = TIMEOUTLEVEL_BASE; // Set to 80% + m_TTLTimeout.reset(timeout()); + } + else + { + m_timeoutLevel = TIMEOUTLEVEL_UNSET; // undef + m_TTLTimeout.resetToNeverExpires(); + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::flagged(void) +{ + + return ((m_u32TTL) && + (TIMEOUTLEVEL_UNSET != m_timeoutLevel) && + (m_TTLTimeout.expired())); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::restart(void) +{ + + bool bResult = true; + + if ((TIMEOUTLEVEL_BASE <= m_timeoutLevel) && // >= 80% AND + (TIMEOUTLEVEL_FINAL > m_timeoutLevel)) // < 100% + { + + m_timeoutLevel += TIMEOUTLEVEL_INTERVAL; // increment by 5% + m_TTLTimeout.reset(timeout()); + } + else + { + bResult = false; + m_TTLTimeout.resetToNeverExpires(); + m_timeoutLevel = TIMEOUTLEVEL_UNSET; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::prepareDeletion(void) +{ + + m_timeoutLevel = TIMEOUTLEVEL_FINAL; + m_TTLTimeout.reset(1 * 1000); // See RFC 6762, 10.1 + + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::finalTimeoutLevel(void) const +{ + + return (TIMEOUTLEVEL_FINAL == m_timeoutLevel); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout +*/ +unsigned long MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcTTL::timeout(void) const +{ + + uint32_t u32Timeout = esp8266::polledTimeout::oneShotMs::neverExpires; + + if (TIMEOUTLEVEL_BASE == m_timeoutLevel) // 80% + { + u32Timeout = (m_u32TTL * 800); // to milliseconds + } + else if ((TIMEOUTLEVEL_BASE < m_timeoutLevel) && // >80% AND + (TIMEOUTLEVEL_FINAL >= m_timeoutLevel)) // <= 100% + { + + u32Timeout = (m_u32TTL * 50); + } // else: invalid + return u32Timeout; +} + + +#ifdef MDNS_IP4_SUPPORT +/** + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address + +*/ + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address constructor +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address(IPAddress p_IPAddress, + uint32_t p_u32TTL /*= 0*/) + : m_pNext(0), + m_IPAddress(p_IPAddress) +{ + + m_TTL.set(p_u32TTL); +} +#endif + + +/** + MDNSResponder::stcMDNSServiceQuery::stcAnswer +*/ + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcAnswer constructor +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcAnswer(void) + : m_pNext(0), + m_pcServiceDomain(0), + m_pcHostDomain(0), + m_u16Port(0), + m_pcTxts(0), +#ifdef MDNS_IP4_SUPPORT + m_pIP4Addresses(0), +#endif +#ifdef MDNS_IP6_SUPPORT + m_pIP6Addresses(0), +#endif + m_u32ContentFlags(0) +{ +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::~stcAnswer destructor +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::~stcAnswer(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::clear +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::clear(void) +{ + + return ((releaseTxts()) && +#ifdef MDNS_IP4_SUPPORT + (releaseIP4Addresses()) && +#endif +#ifdef MDNS_IP6_SUPPORT + (releaseIP6Addresses()) +#endif + (releaseHostDomain()) && + (releaseServiceDomain())); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocServiceDomain + + Alloc memory for the char array representation of the service domain. + +*/ +char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocServiceDomain(size_t p_stLength) +{ + + releaseServiceDomain(); + if (p_stLength) + { + m_pcServiceDomain = new char[p_stLength]; + } + return m_pcServiceDomain; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseServiceDomain +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseServiceDomain(void) +{ + + if (m_pcServiceDomain) + { + delete[] m_pcServiceDomain; + m_pcServiceDomain = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocHostDomain + + Alloc memory for the char array representation of the host domain. + +*/ +char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocHostDomain(size_t p_stLength) +{ + + releaseHostDomain(); + if (p_stLength) + { + m_pcHostDomain = new char[p_stLength]; + } + return m_pcHostDomain; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseHostDomain +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseHostDomain(void) +{ + + if (m_pcHostDomain) + { + delete[] m_pcHostDomain; + m_pcHostDomain = 0; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocTxts + + Alloc memory for the char array representation of the TXT items. + +*/ +char* MDNSResponder::stcMDNSServiceQuery::stcAnswer::allocTxts(size_t p_stLength) +{ + + releaseTxts(); + if (p_stLength) + { + m_pcTxts = new char[p_stLength]; + } + return m_pcTxts; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseTxts +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseTxts(void) +{ + + if (m_pcTxts) + { + delete[] m_pcTxts; + m_pcTxts = 0; + } + return true; +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP4Addresses +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP4Addresses(void) +{ + + while (m_pIP4Addresses) + { + stcIP4Address* pNext = m_pIP4Addresses->m_pNext; + delete m_pIP4Addresses; + m_pIP4Addresses = pNext; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP4Address +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP4Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* p_pIP4Address) +{ + + bool bResult = false; + + if (p_pIP4Address) + { + p_pIP4Address->m_pNext = m_pIP4Addresses; + m_pIP4Addresses = p_pIP4Address; + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP4Address +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP4Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* p_pIP4Address) +{ + + bool bResult = false; + + if (p_pIP4Address) + { + stcIP4Address* pPred = m_pIP4Addresses; + while ((pPred) && + (pPred->m_pNext != p_pIP4Address)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pIP4Address->m_pNext; + delete p_pIP4Address; + bResult = true; + } + else if (m_pIP4Addresses == p_pIP4Address) // No predecesor, but first item + { + m_pIP4Addresses = p_pIP4Address->m_pNext; + delete p_pIP4Address; + bResult = true; + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address (const) +*/ +const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) const +{ + + return (stcIP4Address*)(((const stcAnswer*)this)->findIP4Address(p_IPAddress)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) +{ + + stcIP4Address* pIP4Address = m_pIP4Addresses; + while (pIP4Address) + { + if (pIP4Address->m_IPAddress == p_IPAddress) + { + break; + } + pIP4Address = pIP4Address->m_pNext; + } + return pIP4Address; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressCount +*/ +uint32_t MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressCount(void) const +{ + + uint32_t u32Count = 0; + + stcIP4Address* pIP4Address = m_pIP4Addresses; + while (pIP4Address) + { + ++u32Count; + pIP4Address = pIP4Address->m_pNext; + } + return u32Count; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex(uint32_t p_u32Index) +{ + + return (stcIP4Address*)(((const stcAnswer*)this)->IP4AddressAtIndex(p_u32Index)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex (const) +*/ +const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressAtIndex(uint32_t p_u32Index) const +{ + + const stcIP4Address* pIP4Address = 0; + + if (((uint32_t)(-1) != p_u32Index) && + (m_pIP4Addresses)) + { + + uint32_t u32Index; + for (pIP4Address = m_pIP4Addresses, u32Index = 0; ((pIP4Address) && (u32Index < p_u32Index)); pIP4Address = pIP4Address->m_pNext, ++u32Index); + } + return pIP4Address; +} +#endif + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP6Addresses +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::releaseIP6Addresses(void) +{ + + while (m_pIP6Addresses) + { + stcIP6Address* pNext = m_pIP6Addresses->m_pNext; + delete m_pIP6Addresses; + m_pIP6Addresses = pNext; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP6Address +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::addIP6Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* p_pIP6Address) +{ + + bool bResult = false; + + if (p_pIP6Address) + { + p_pIP6Address->m_pNext = m_pIP6Addresses; + m_pIP6Addresses = p_pIP6Address; + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP6Address +*/ +bool MDNSResponder::stcMDNSServiceQuery::stcAnswer::removeIP6Address(MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* p_pIP6Address) +{ + + bool bResult = false; + + if (p_pIP6Address) + { + stcIP6Address* pPred = m_pIP6Addresses; + while ((pPred) && + (pPred->m_pNext != p_pIP6Address)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pIP6Address->m_pNext; + delete p_pIP6Address; + bResult = true; + } + else if (m_pIP6Addresses == p_pIP6Address) // No predecesor, but first item + { + m_pIP6Addresses = p_pIP6Address->m_pNext; + delete p_pIP6Address; + bResult = true; + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address(const IP6Address& p_IPAddress) +{ + + return (stcIP6Address*)(((const stcAnswer*)this)->findIP6Address(p_IPAddress)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address (const) +*/ +const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP6Address(const IPAddress& p_IPAddress) const +{ + + const stcIP6Address* pIP6Address = m_pIP6Addresses; + while (pIP6Address) + { + if (p_IP6Address->m_IPAddress == p_IPAddress) + { + break; + } + pIP6Address = pIP6Address->m_pNext; + } + return pIP6Address; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressCount +*/ +uint32_t MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressCount(void) const +{ + + uint32_t u32Count = 0; + + stcIP6Address* pIP6Address = m_pIP6Addresses; + while (pIP6Address) + { + ++u32Count; + pIP6Address = pIP6Address->m_pNext; + } + return u32Count; +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex (const) +*/ +const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex(uint32_t p_u32Index) const +{ + + return (stcIP6Address*)(((const stcAnswer*)this)->IP6AddressAtIndex(p_u32Index)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP6Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP6AddressAtIndex(uint32_t p_u32Index) +{ + + stcIP6Address* pIP6Address = 0; + + if (((uint32_t)(-1) != p_u32Index) && + (m_pIP6Addresses)) + { + + uint32_t u32Index; + for (pIP6Address = m_pIP6Addresses, u32Index = 0; ((pIP6Address) && (u32Index < p_u32Index)); pIP6Address = pIP6Address->m_pNext, ++u32Index); + } + return pIP6Address; +} +#endif + + +/** + MDNSResponder::stcMDNSServiceQuery + + A service query object. + A static query is flaged via 'm_bLegacyQuery'; while the function 'queryService' + is waiting for answers, the internal flag 'm_bAwaitingAnswers' is set. When the + timeout is reached, the flag is removed. These two flags are only used for static + service queries. + All answers to the service query are stored in 'm_pAnswers' list. + Individual answers may be addressed by index (in the list of answers). + Every time a answer component is added (or changes) in a dynamic service query, + the callback 'm_fnCallback' is called. + The answer list may be searched by service and host domain. + + Service query object may be connected to a linked list. +*/ + +/* + MDNSResponder::stcMDNSServiceQuery::stcMDNSServiceQuery constructor +*/ +MDNSResponder::stcMDNSServiceQuery::stcMDNSServiceQuery(void) + : m_pNext(0), + m_fnCallback(0), + m_bLegacyQuery(false), + m_u8SentCount(0), + m_ResendTimeout(esp8266::polledTimeout::oneShotMs::neverExpires), + m_bAwaitingAnswers(true), + m_pAnswers(0) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSServiceQuery::~stcMDNSServiceQuery destructor +*/ +MDNSResponder::stcMDNSServiceQuery::~stcMDNSServiceQuery(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSServiceQuery::clear +*/ +bool MDNSResponder::stcMDNSServiceQuery::clear(void) +{ + + m_fnCallback = 0; + m_bLegacyQuery = false; + m_u8SentCount = 0; + m_ResendTimeout.resetToNeverExpires(); + m_bAwaitingAnswers = true; + while (m_pAnswers) + { + stcAnswer* pNext = m_pAnswers->m_pNext; + delete m_pAnswers; + m_pAnswers = pNext; + } + return true; +} + +/* + MDNSResponder::stcMDNSServiceQuery::answerCount +*/ +uint32_t MDNSResponder::stcMDNSServiceQuery::answerCount(void) const +{ + + uint32_t u32Count = 0; + + stcAnswer* pAnswer = m_pAnswers; + while (pAnswer) + { + ++u32Count; + pAnswer = pAnswer->m_pNext; + } + return u32Count; +} + +/* + MDNSResponder::stcMDNSServiceQuery::answerAtIndex +*/ +const MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::answerAtIndex(uint32_t p_u32Index) const +{ + + const stcAnswer* pAnswer = 0; + + if (((uint32_t)(-1) != p_u32Index) && + (m_pAnswers)) + { + + uint32_t u32Index; + for (pAnswer = m_pAnswers, u32Index = 0; ((pAnswer) && (u32Index < p_u32Index)); pAnswer = pAnswer->m_pNext, ++u32Index); + } + return pAnswer; +} + +/* + MDNSResponder::stcMDNSServiceQuery::answerAtIndex +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::answerAtIndex(uint32_t p_u32Index) +{ + + return (stcAnswer*)(((const stcMDNSServiceQuery*)this)->answerAtIndex(p_u32Index)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::indexOfAnswer +*/ +uint32_t MDNSResponder::stcMDNSServiceQuery::indexOfAnswer(const MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) const +{ + + uint32_t u32Index = 0; + + for (const stcAnswer* pAnswer = m_pAnswers; pAnswer; pAnswer = pAnswer->m_pNext, ++u32Index) + { + if (pAnswer == p_pAnswer) + { + return u32Index; + } + } + return ((uint32_t)(-1)); +} + +/* + MDNSResponder::stcMDNSServiceQuery::addAnswer +*/ +bool MDNSResponder::stcMDNSServiceQuery::addAnswer(MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) +{ + + bool bResult = false; + + if (p_pAnswer) + { + p_pAnswer->m_pNext = m_pAnswers; + m_pAnswers = p_pAnswer; + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::removeAnswer +*/ +bool MDNSResponder::stcMDNSServiceQuery::removeAnswer(MDNSResponder::stcMDNSServiceQuery::stcAnswer* p_pAnswer) +{ + + bool bResult = false; + + if (p_pAnswer) + { + stcAnswer* pPred = m_pAnswers; + while ((pPred) && + (pPred->m_pNext != p_pAnswer)) + { + pPred = pPred->m_pNext; + } + if (pPred) + { + pPred->m_pNext = p_pAnswer->m_pNext; + delete p_pAnswer; + bResult = true; + } + else if (m_pAnswers == p_pAnswer) // No predecesor, but first item + { + m_pAnswers = p_pAnswer->m_pNext; + delete p_pAnswer; + bResult = true; + } + } + return bResult; +} + +/* + MDNSResponder::stcMDNSServiceQuery::findAnswerForServiceDomain +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::findAnswerForServiceDomain(const MDNSResponder::stcMDNS_RRDomain& p_ServiceDomain) +{ + + stcAnswer* pAnswer = m_pAnswers; + while (pAnswer) + { + if (pAnswer->m_ServiceDomain == p_ServiceDomain) + { + break; + } + pAnswer = pAnswer->m_pNext; + } + return pAnswer; +} + +/* + MDNSResponder::stcMDNSServiceQuery::findAnswerForHostDomain +*/ +MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::findAnswerForHostDomain(const MDNSResponder::stcMDNS_RRDomain& p_HostDomain) +{ + + stcAnswer* pAnswer = m_pAnswers; + while (pAnswer) + { + if (pAnswer->m_HostDomain == p_HostDomain) + { + break; + } + pAnswer = pAnswer->m_pNext; + } + return pAnswer; +} + + +/** + MDNSResponder::stcMDNSSendParameter + + A 'collection' of properties and flags for one MDNS query or response. + Mainly managed by the 'Control' functions. + The current offset in the UPD output buffer is tracked to be able to do + a simple host or service domain compression. + +*/ + +/** + MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem + + A cached host or service domain, incl. the offset in the UDP output buffer. + +*/ + +/* + MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem::stcDomainCacheItem constructor +*/ +MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem::stcDomainCacheItem(const void* p_pHostnameOrService, + bool p_bAdditionalData, + uint32_t p_u16Offset) + : m_pNext(0), + m_pHostnameOrService(p_pHostnameOrService), + m_bAdditionalData(p_bAdditionalData), + m_u16Offset(p_u16Offset) +{ + +} + +/** + MDNSResponder::stcMDNSSendParameter +*/ + +/* + MDNSResponder::stcMDNSSendParameter::stcMDNSSendParameter constructor +*/ +MDNSResponder::stcMDNSSendParameter::stcMDNSSendParameter(void) + : m_pQuestions(0), + m_pDomainCacheItems(0) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSSendParameter::~stcMDNSSendParameter destructor +*/ +MDNSResponder::stcMDNSSendParameter::~stcMDNSSendParameter(void) +{ + + clear(); +} + +/* + MDNSResponder::stcMDNSSendParameter::clear +*/ +bool MDNSResponder::stcMDNSSendParameter::clear(void) +{ + + m_u16ID = 0; + m_u8HostReplyMask = 0; + m_u16Offset = 0; + + m_bLegacyQuery = false; + m_bResponse = false; + m_bAuthorative = false; + m_bUnicast = false; + m_bUnannounce = false; + + m_bCacheFlush = true; + + while (m_pQuestions) + { + stcMDNS_RRQuestion* pNext = m_pQuestions->m_pNext; + delete m_pQuestions; + m_pQuestions = pNext; + } + while (m_pDomainCacheItems) + { + stcDomainCacheItem* pNext = m_pDomainCacheItems->m_pNext; + delete m_pDomainCacheItems; + m_pDomainCacheItems = pNext; + } + return true; +} + +/* + MDNSResponder::stcMDNSSendParameter::shiftOffset +*/ +bool MDNSResponder::stcMDNSSendParameter::shiftOffset(uint16_t p_u16Shift) +{ + + m_u16Offset += p_u16Shift; + return true; +} + +/* + MDNSResponder::stcMDNSSendParameter::addDomainCacheItem +*/ +bool MDNSResponder::stcMDNSSendParameter::addDomainCacheItem(const void* p_pHostnameOrService, + bool p_bAdditionalData, + uint16_t p_u16Offset) +{ + + bool bResult = false; + + stcDomainCacheItem* pNewItem = 0; + if ((p_pHostnameOrService) && + (p_u16Offset) && + ((pNewItem = new stcDomainCacheItem(p_pHostnameOrService, p_bAdditionalData, p_u16Offset)))) + { + + pNewItem->m_pNext = m_pDomainCacheItems; + bResult = ((m_pDomainCacheItems = pNewItem)); + } + return bResult; +} + +/* + MDNSResponder::stcMDNSSendParameter::findCachedDomainOffset +*/ +uint16_t MDNSResponder::stcMDNSSendParameter::findCachedDomainOffset(const void* p_pHostnameOrService, + bool p_bAdditionalData) const +{ + + const stcDomainCacheItem* pCacheItem = m_pDomainCacheItems; + + for (; pCacheItem; pCacheItem = pCacheItem->m_pNext) + { + if ((pCacheItem->m_pHostnameOrService == p_pHostnameOrService) && + (pCacheItem->m_bAdditionalData == p_bAdditionalData)) // Found cache item + { + break; + } + } + return (pCacheItem ? pCacheItem->m_u16Offset : 0); +} + +} // namespace MDNSImplementation + +} // namespace esp8266 + + + diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp index 53eb32025..7400abec4 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Transfer.cpp @@ -1,1587 +1,1779 @@ -/* - * LEAmDNS_Transfer.cpp - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -extern "C" { - #include "user_interface.h" -} - -#include "LEAmDNS_lwIPdefs.h" -#include "LEAmDNS_Priv.h" - - -namespace esp8266 { - -/* - * LEAmDNS - */ -namespace MDNSImplementation { - -/** - * CONST STRINGS - */ -static const char* scpcLocal = "local"; -static const char* scpcServices = "services"; -static const char* scpcDNSSD = "dns-sd"; -static const char* scpcUDP = "udp"; -//static const char* scpcTCP = "tcp"; - -#ifdef MDNS_IP4_SUPPORT - static const char* scpcReverseIP4Domain = "in-addr"; -#endif -#ifdef MDNS_IP6_SUPPORT - static const char* scpcReverseIP6Domain = "ip6"; -#endif -static const char* scpcReverseTopDomain = "arpa"; - -/** - * TRANSFER - */ - - -/** - * SENDING - */ - -/* - * MDNSResponder::_sendMDNSMessage - * - * Unicast responses are prepared and sent directly to the querier. - * Multicast responses or queries are transferred to _sendMDNSMessage_Multicast - * - * Any reply flags in installed services are removed at the end! - * - */ -bool MDNSResponder::_sendMDNSMessage(MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - bool bResult = true; - - if (p_rSendParameter.m_bResponse && - p_rSendParameter.m_bUnicast) { // Unicast response -> Send to querier - DEBUG_EX_ERR(if (!m_pUDPContext->getRemoteAddress()) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage: MISSING remote address for response!\n")); }); - IPAddress ipRemote; - ipRemote = m_pUDPContext->getRemoteAddress(); - bResult = ((_prepareMDNSMessage(p_rSendParameter, _getResponseMulticastInterface())) && - (m_pUDPContext->send(ipRemote, m_pUDPContext->getRemotePort()))); - } - else { // Multicast response - bResult = _sendMDNSMessage_Multicast(p_rSendParameter); - } - - // Finally clear service reply masks - for (stcMDNSService* pService=m_pServices; pService; pService=pService->m_pNext) { - pService->m_u8ReplyMask = 0; - } - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_sendMDNSMessage_Multicast - * - * Fills the UDP output buffer (via _prepareMDNSMessage) and sends the buffer - * via the selected WiFi interface (Station or AP) - */ -bool MDNSResponder::_sendMDNSMessage_Multicast(MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - bool bResult = false; - - IPAddress fromIPAddress; - fromIPAddress = _getResponseMulticastInterface(); - m_pUDPContext->setMulticastInterface(fromIPAddress); - -#ifdef MDNS_IP4_SUPPORT - IPAddress toMulticastAddress(DNS_MQUERY_IPV4_GROUP_INIT); -#endif -#ifdef MDNS_IP6_SUPPORT - //TODO: set multicast address - IPAddress toMulticastAddress(DNS_MQUERY_IPV6_GROUP_INIT); -#endif - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage_Multicast: Will send to '%s'.\n"), toMulticastAddress.toString().c_str());); - bResult = ((_prepareMDNSMessage(p_rSendParameter, fromIPAddress)) && - (m_pUDPContext->send(toMulticastAddress, DNS_MQUERY_PORT))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage_Multicast: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_prepareMDNSMessage - * - * The MDNS message is composed in a two-step process. - * In the first loop 'only' the header informations (mainly number of answers) are collected, - * while in the seconds loop, the header and all queries and answers are written to the UDP - * output buffer. - * - */ -bool MDNSResponder::_prepareMDNSMessage(MDNSResponder::stcMDNSSendParameter& p_rSendParameter, - IPAddress p_IPAddress) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage\n"));); - bool bResult = true; - - // Prepare header; count answers - stcMDNS_MsgHeader msgHeader(p_rSendParameter.m_u16ID, p_rSendParameter.m_bResponse, 0, p_rSendParameter.m_bAuthorative); - // If this is a response, the answers are anwers, - // else this is a query or probe and the answers go into auth section - uint16_t& ru16Answers = (p_rSendParameter.m_bResponse - ? msgHeader.m_u16ANCount - : msgHeader.m_u16NSCount); - - /** - * enuSequence - */ - enum enuSequence { - Sequence_Count = 0, - Sequence_Send = 1 - }; - - // Two step sequence: 'Count' and 'Send' - for (uint32_t sequence=Sequence_Count; ((bResult) && (sequence<=Sequence_Send)); ++sequence) { - DEBUG_EX_INFO( - if (Sequence_Send == sequence) { - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), - (unsigned)msgHeader.m_u16ID, - (unsigned)msgHeader.m_1bQR, (unsigned)msgHeader.m_4bOpcode, (unsigned)msgHeader.m_1bAA, (unsigned)msgHeader.m_1bTC, (unsigned)msgHeader.m_1bRD, - (unsigned)msgHeader.m_1bRA, (unsigned)msgHeader.m_4bRCode, - (unsigned)msgHeader.m_u16QDCount, - (unsigned)msgHeader.m_u16ANCount, - (unsigned)msgHeader.m_u16NSCount, - (unsigned)msgHeader.m_u16ARCount); - } - ); - // Count/send - // Header - bResult = ((Sequence_Count == sequence) - ? true - : _writeMDNSMsgHeader(msgHeader, p_rSendParameter)); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSMsgHeader FAILED!\n"));); - // Questions - for (stcMDNS_RRQuestion* pQuestion=p_rSendParameter.m_pQuestions; ((bResult) && (pQuestion)); pQuestion=pQuestion->m_pNext) { - ((Sequence_Count == sequence) - ? ++msgHeader.m_u16QDCount - : (bResult = _writeMDNSQuestion(*pQuestion, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSQuestion FAILED!\n"));); - } - - // Answers and authorative answers -#ifdef MDNS_IP4_SUPPORT - if ((bResult) && - (p_rSendParameter.m_u8HostReplyMask & ContentFlag_A)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_A(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_A(A) FAILED!\n"));); - } - if ((bResult) && - (p_rSendParameter.m_u8HostReplyMask & ContentFlag_PTR_IP4)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_PTR_IP4(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_IP4 FAILED!\n"));); - } -#endif -#ifdef MDNS_IP6_SUPPORT - if ((bResult) && - (p_rSendParameter.m_u8HostReplyMask & ContentFlag_AAAA)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_AAAA(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_AAAA(A) FAILED!\n"));); - } - if ((bResult) && - (p_rSendParameter.m_u8HostReplyMask & ContentFlag_PTR_IP6)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_PTR_IP6(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_IP6 FAILED!\n"));); - } -#endif - - for (stcMDNSService* pService=m_pServices; ((bResult) && (pService)); pService=pService->m_pNext) { - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_PTR_TYPE)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_PTR_TYPE(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_TYPE FAILED!\n"));); - } - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_PTR_NAME)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_PTR_NAME(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_NAME FAILED!\n"));); - } - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_SRV)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_SRV(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_SRV(A) FAILED!\n"));); - } - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_TXT)) { - ((Sequence_Count == sequence) - ? ++ru16Answers - : (bResult = _writeMDNSAnswer_TXT(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_TXT(A) FAILED!\n"));); - } - } // for services - - // Additional answers -#ifdef MDNS_IP4_SUPPORT - bool bNeedsAdditionalAnswerA = false; -#endif -#ifdef MDNS_IP6_SUPPORT - bool bNeedsAdditionalAnswerAAAA = false; -#endif - for (stcMDNSService* pService=m_pServices; ((bResult) && (pService)); pService=pService->m_pNext) { - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_PTR_NAME) && // If PTR_NAME is requested, AND - (!(pService->m_u8ReplyMask & ContentFlag_SRV))) { // NOT SRV -> add SRV as additional answer - ((Sequence_Count == sequence) - ? ++msgHeader.m_u16ARCount - : (bResult = _writeMDNSAnswer_SRV(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_SRV(B) FAILED!\n"));); - } - if ((bResult) && - (pService->m_u8ReplyMask & ContentFlag_PTR_NAME) && // If PTR_NAME is requested, AND - (!(pService->m_u8ReplyMask & ContentFlag_TXT))) { // NOT TXT -> add TXT as additional answer - ((Sequence_Count == sequence) - ? ++msgHeader.m_u16ARCount - : (bResult = _writeMDNSAnswer_TXT(*pService, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_TXT(B) FAILED!\n"));); - } - if ((pService->m_u8ReplyMask & (ContentFlag_PTR_NAME | ContentFlag_SRV)) || // If service instance name or SRV OR - (p_rSendParameter.m_u8HostReplyMask & (ContentFlag_A | ContentFlag_AAAA))) { // any host IP address is requested -#ifdef MDNS_IP4_SUPPORT - if ((bResult) && - (!(p_rSendParameter.m_u8HostReplyMask & ContentFlag_A))) { // Add IP4 address - bNeedsAdditionalAnswerA = true; - } -#endif -#ifdef MDNS_IP6_SUPPORT - if ((bResult) && - (!(p_rSendParameter.m_u8HostReplyMask & ContentFlag_AAAA))) { // Add IP6 address - bNeedsAdditionalAnswerAAAA = true; - } -#endif - } - } // for services - - // Answer A needed? -#ifdef MDNS_IP4_SUPPORT - if ((bResult) && - (bNeedsAdditionalAnswerA)) { - ((Sequence_Count == sequence) - ? ++msgHeader.m_u16ARCount - : (bResult = _writeMDNSAnswer_A(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_A(B) FAILED!\n"));); - } -#endif -#ifdef MDNS_IP6_SUPPORT - // Answer AAAA needed? - if ((bResult) && - (bNeedsAdditionalAnswerAAAA)) { - ((Sequence_Count == sequence) - ? ++msgHeader.m_u16ARCount - : (bResult = _writeMDNSAnswer_AAAA(p_IPAddress, p_rSendParameter))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_AAAA(B) FAILED!\n"));); - } -#endif - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: Loop %i FAILED!\n"), sequence);); - } // for sequence - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_sendMDNSServiceQuery - * - * Creates and sends a PTR query for the given service domain. - * - */ -bool MDNSResponder::_sendMDNSServiceQuery(const MDNSResponder::stcMDNSServiceQuery& p_ServiceQuery) { - - return _sendMDNSQuery(p_ServiceQuery.m_ServiceTypeDomain, DNS_RRTYPE_PTR); -} - -/* - * MDNSResponder::_sendMDNSQuery - * - * Creates and sends a query for the given domain and query type. - * - */ -bool MDNSResponder::_sendMDNSQuery(const MDNSResponder::stcMDNS_RRDomain& p_QueryDomain, - uint16_t p_u16QueryType, - stcMDNSServiceQuery::stcAnswer* p_pKnownAnswers /*= 0*/) { - - bool bResult = false; - - stcMDNSSendParameter sendParameter; - if (0 != ((sendParameter.m_pQuestions = new stcMDNS_RRQuestion))) { - sendParameter.m_pQuestions->m_Header.m_Domain = p_QueryDomain; - - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = p_u16QueryType; - // It seems, that some mDNS implementations don't support 'unicast response' questions... - sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (/*0x8000 |*/ DNS_RRCLASS_IN); // /*Unicast &*/ INternet - - // TODO: Add knwon answer to the query - (void)p_pKnownAnswers; - - bResult = _sendMDNSMessage(sendParameter); - } // else: FAILED to alloc question - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSQuery: FAILED to alloc question!\n"));); - return bResult; -} - -/** - * HELPERS - */ - -/** - * RESOURCE RECORDS - */ - -/* - * MDNSResponder::_readRRQuestion - * - * Reads a question (eg. MyESP._http._tcp.local ANY IN) from the UPD input buffer. - * - */ -bool MDNSResponder::_readRRQuestion(MDNSResponder::stcMDNS_RRQuestion& p_rRRQuestion) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion\n"));); - - bool bResult = false; - - if ((bResult = _readRRHeader(p_rRRQuestion.m_Header))) { - // Extract unicast flag from class field - p_rRRQuestion.m_bUnicast = (p_rRRQuestion.m_Header.m_Attributes.m_u16Class & 0x8000); - p_rRRQuestion.m_Header.m_Attributes.m_u16Class &= (~0x8000); - - DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion ")); - _printRRDomain(p_rRRQuestion.m_Header.m_Domain); - DEBUG_OUTPUT.printf_P(PSTR(" Type:0x%04X Class:0x%04X %s\n"), (unsigned)p_rRRQuestion.m_Header.m_Attributes.m_u16Type, (unsigned)p_rRRQuestion.m_Header.m_Attributes.m_u16Class, (p_rRRQuestion.m_bUnicast ? "Unicast" : "Multicast")); - ); - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_readRRAnswer - * - * Reads an answer (eg. _http._tcp.local PTR OP TTL MyESP._http._tcp.local) - * from the UDP input buffer. - * After reading the domain and type info, the further processing of the answer - * is transferred the answer specific reading functions. - * Unknown answer types are processed by the generic answer reader (to remove them - * from the input buffer). - * - */ -bool MDNSResponder::_readRRAnswer(MDNSResponder::stcMDNS_RRAnswer*& p_rpRRAnswer) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer\n"));); - - bool bResult = false; - - stcMDNS_RRHeader header; - uint32_t u32TTL; - uint16_t u16RDLength; - if ((_readRRHeader(header)) && - (_udpRead32(u32TTL)) && - (_udpRead16(u16RDLength))) { - - /*DEBUG_EX_INFO( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: Reading 0x%04X answer (class:0x%04X, TTL:%u, RDLength:%u) for "), header.m_Attributes.m_u16Type, header.m_Attributes.m_u16Class, u32TTL, u16RDLength); - _printRRDomain(header.m_Domain); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - );*/ - - switch (header.m_Attributes.m_u16Type & (~0x8000)) { // Topmost bit might carry 'cache flush' flag -#ifdef MDNS_IP4_SUPPORT - case DNS_RRTYPE_A: - p_rpRRAnswer = new stcMDNS_RRAnswerA(header, u32TTL); - bResult = _readRRAnswerA(*(stcMDNS_RRAnswerA*&)p_rpRRAnswer, u16RDLength); - break; -#endif - case DNS_RRTYPE_PTR: - p_rpRRAnswer = new stcMDNS_RRAnswerPTR(header, u32TTL); - bResult = _readRRAnswerPTR(*(stcMDNS_RRAnswerPTR*&)p_rpRRAnswer, u16RDLength); - break; - case DNS_RRTYPE_TXT: - p_rpRRAnswer = new stcMDNS_RRAnswerTXT(header, u32TTL); - bResult = _readRRAnswerTXT(*(stcMDNS_RRAnswerTXT*&)p_rpRRAnswer, u16RDLength); - break; -#ifdef MDNS_IP6_SUPPORT - case DNS_RRTYPE_AAAA: - p_rpRRAnswer = new stcMDNS_RRAnswerAAAA(header, u32TTL); - bResult = _readRRAnswerAAAA(*(stcMDNS_RRAnswerAAAA*&)p_rpRRAnswer, u16RDLength); - break; -#endif - case DNS_RRTYPE_SRV: - p_rpRRAnswer = new stcMDNS_RRAnswerSRV(header, u32TTL); - bResult = _readRRAnswerSRV(*(stcMDNS_RRAnswerSRV*&)p_rpRRAnswer, u16RDLength); - break; - default: - p_rpRRAnswer = new stcMDNS_RRAnswerGeneric(header, u32TTL); - bResult = _readRRAnswerGeneric(*(stcMDNS_RRAnswerGeneric*&)p_rpRRAnswer, u16RDLength); - break; - } - DEBUG_EX_INFO( - if ((bResult) && - (p_rpRRAnswer)) { - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: ")); - _printRRDomain(p_rpRRAnswer->m_Header.m_Domain); - DEBUG_OUTPUT.printf_P(PSTR(" Type:0x%04X Class:0x%04X TTL:%u, RDLength:%u "), p_rpRRAnswer->m_Header.m_Attributes.m_u16Type, p_rpRRAnswer->m_Header.m_Attributes.m_u16Class, p_rpRRAnswer->m_u32TTL, u16RDLength); - switch (header.m_Attributes.m_u16Type & (~0x8000)) { // Topmost bit might carry 'cache flush' flag -#ifdef MDNS_IP4_SUPPORT - case DNS_RRTYPE_A: - DEBUG_OUTPUT.printf_P(PSTR("A IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); - break; -#endif - case DNS_RRTYPE_PTR: - DEBUG_OUTPUT.printf_P(PSTR("PTR ")); - _printRRDomain(((stcMDNS_RRAnswerPTR*&)p_rpRRAnswer)->m_PTRDomain); - break; - case DNS_RRTYPE_TXT: { - size_t stTxtLength = ((stcMDNS_RRAnswerTXT*&)p_rpRRAnswer)->m_Txts.c_strLength(); - char* pTxts = new char[stTxtLength]; - if (pTxts) { - ((stcMDNS_RRAnswerTXT*&)p_rpRRAnswer)->m_Txts.c_str(pTxts); - DEBUG_OUTPUT.printf_P(PSTR("TXT(%u) %s"), stTxtLength, pTxts); - delete[] pTxts; - } - break; - } -#ifdef MDNS_IP6_SUPPORT - case DNS_RRTYPE_AAAA: - DEBUG_OUTPUT.printf_P(PSTR("AAAA IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); - break; -#endif - case DNS_RRTYPE_SRV: - DEBUG_OUTPUT.printf_P(PSTR("SRV Port:%u "), ((stcMDNS_RRAnswerSRV*&)p_rpRRAnswer)->m_u16Port); - _printRRDomain(((stcMDNS_RRAnswerSRV*&)p_rpRRAnswer)->m_SRVDomain); - break; - default: - DEBUG_OUTPUT.printf_P(PSTR("generic ")); - break; - } - DEBUG_OUTPUT.printf_P(PSTR("\n")); - } - else { - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: FAILED to read specific answer of type 0x%04X!\n"), p_rpRRAnswer->m_Header.m_Attributes.m_u16Type); - } - ); // DEBUG_EX_INFO - } - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: FAILED!\n"));); - return bResult; -} - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::_readRRAnswerA - */ - bool MDNSResponder::_readRRAnswerA(MDNSResponder::stcMDNS_RRAnswerA& p_rRRAnswerA, - uint16_t p_u16RDLength) { - - uint32_t u32IP4Address; - bool bResult = ((MDNS_IP4_SIZE == p_u16RDLength) && - (_udpReadBuffer((unsigned char*)&u32IP4Address, MDNS_IP4_SIZE)) && - ((p_rRRAnswerA.m_IPAddress = IPAddress(u32IP4Address)))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerA: FAILED!\n"));); - return bResult; - } -#endif - -/* - * MDNSResponder::_readRRAnswerPTR - */ -bool MDNSResponder::_readRRAnswerPTR(MDNSResponder::stcMDNS_RRAnswerPTR& p_rRRAnswerPTR, - uint16_t p_u16RDLength) { - - bool bResult = ((p_u16RDLength) && - (_readRRDomain(p_rRRAnswerPTR.m_PTRDomain))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerPTR: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_readRRAnswerTXT - * - * Read TXT items from a buffer like 4c#=15ff=20 - */ -bool MDNSResponder::_readRRAnswerTXT(MDNSResponder::stcMDNS_RRAnswerTXT& p_rRRAnswerTXT, - uint16_t p_u16RDLength) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: RDLength:%u\n"), p_u16RDLength);); - bool bResult = true; - - p_rRRAnswerTXT.clear(); - if (p_u16RDLength) { - bResult = false; - - unsigned char* pucBuffer = new unsigned char[p_u16RDLength]; - if (pucBuffer) { - if (_udpReadBuffer(pucBuffer, p_u16RDLength)) { - bResult = true; - - const unsigned char* pucCursor = pucBuffer; - while ((pucCursor < (pucBuffer + p_u16RDLength)) && - (bResult)) { - bResult = false; - - stcMDNSServiceTxt* pTxt = 0; - unsigned char ucLength = *pucCursor++; // Length of the next txt item - if (ucLength) { - DEBUG_EX_INFO( - static char sacBuffer[64]; *sacBuffer = 0; - uint8_t u8MaxLength = ((ucLength > (sizeof(sacBuffer) - 1)) ? (sizeof(sacBuffer) - 1) : ucLength); - os_strncpy(sacBuffer, (const char*)pucCursor, u8MaxLength); sacBuffer[u8MaxLength] = 0; - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: Item(%u): %s\n"), ucLength, sacBuffer); - ); - - unsigned char* pucEqualSign = (unsigned char*)os_strchr((const char*)pucCursor, '='); // Position of the '=' sign - unsigned char ucKeyLength; - if ((pucEqualSign) && - ((ucKeyLength = (pucEqualSign - pucCursor)))) { - unsigned char ucValueLength = (ucLength - (pucEqualSign - pucCursor + 1)); - bResult = (((pTxt = new stcMDNSServiceTxt)) && - (pTxt->setKey((const char*)pucCursor, ucKeyLength)) && - (pTxt->setValue((const char*)(pucEqualSign + 1), ucValueLength))); - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: INVALID TXT format (No '=')!\n"));); - } - pucCursor += ucLength; - } - else { // no/zero length TXT - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: TXT answer contains no items.\n"));); - bResult = true; - } - - if ((bResult) && - (pTxt)) { // Everythings fine so far - // Link TXT item to answer TXTs - pTxt->m_pNext = p_rRRAnswerTXT.m_Txts.m_pTxts; - p_rRRAnswerTXT.m_Txts.m_pTxts = pTxt; - } - else { // At least no TXT (migth be OK, if length was 0) OR an error - if (!bResult) { - DEBUG_EX_ERR( - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to read TXT item!\n")); - DEBUG_OUTPUT.printf_P(PSTR("RData dump:\n")); - _udpDump((m_pUDPContext->tell() - p_u16RDLength), p_u16RDLength); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - ); - } - if (pTxt) { - delete pTxt; - pTxt = 0; - } - p_rRRAnswerTXT.clear(); - } - } // while - - DEBUG_EX_ERR( - if (!bResult) { // Some failure - DEBUG_OUTPUT.printf_P(PSTR("RData dump:\n")); - _udpDump((m_pUDPContext->tell() - p_u16RDLength), p_u16RDLength); - DEBUG_OUTPUT.printf_P(PSTR("\n")); - } - ); - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to read TXT content!\n"));); - } - // Clean up - delete[] pucBuffer; - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to alloc buffer for TXT content!\n"));); - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: WARNING! No content!\n"));); - } - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED!\n"));); - return bResult; -} - -#ifdef MDNS_IP6_SUPPORT - bool MDNSResponder::_readRRAnswerAAAA(MDNSResponder::stcMDNS_RRAnswerAAAA& p_rRRAnswerAAAA, - uint16_t p_u16RDLength) { - bool bResult = false; - // TODO: Implement - return bResult; - } -#endif - -/* - * MDNSResponder::_readRRAnswerSRV - */ -bool MDNSResponder::_readRRAnswerSRV(MDNSResponder::stcMDNS_RRAnswerSRV& p_rRRAnswerSRV, - uint16_t p_u16RDLength) { - - bool bResult = (((3 * sizeof(uint16_t)) < p_u16RDLength) && - (_udpRead16(p_rRRAnswerSRV.m_u16Priority)) && - (_udpRead16(p_rRRAnswerSRV.m_u16Weight)) && - (_udpRead16(p_rRRAnswerSRV.m_u16Port)) && - (_readRRDomain(p_rRRAnswerSRV.m_SRVDomain))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerSRV: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_readRRAnswerGeneric - */ -bool MDNSResponder::_readRRAnswerGeneric(MDNSResponder::stcMDNS_RRAnswerGeneric& p_rRRAnswerGeneric, - uint16_t p_u16RDLength) { - bool bResult = (0 == p_u16RDLength); - - p_rRRAnswerGeneric.clear(); - if (((p_rRRAnswerGeneric.m_u16RDLength = p_u16RDLength)) && - ((p_rRRAnswerGeneric.m_pu8RDData = new unsigned char[p_rRRAnswerGeneric.m_u16RDLength]))) { - - bResult = _udpReadBuffer(p_rRRAnswerGeneric.m_pu8RDData, p_rRRAnswerGeneric.m_u16RDLength); - } - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerGeneric: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_readRRHeader - */ -bool MDNSResponder::_readRRHeader(MDNSResponder::stcMDNS_RRHeader& p_rRRHeader) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRHeader\n"));); - - bool bResult = ((_readRRDomain(p_rRRHeader.m_Domain)) && - (_readRRAttributes(p_rRRHeader.m_Attributes))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRHeader: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_readRRDomain - * - * Reads a (maybe multilevel compressed) domain from the UDP input buffer. - * - */ -bool MDNSResponder::_readRRDomain(MDNSResponder::stcMDNS_RRDomain& p_rRRDomain) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain\n"));); - - bool bResult = ((p_rRRDomain.clear()) && - (_readRRDomain_Loop(p_rRRDomain, 0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_readRRDomain_Loop - * - * Reads a domain from the UDP input buffer. For every compression level, the functions - * calls itself recursively. To avoid endless recursion because of malformed MDNS records, - * the maximum recursion depth is set by MDNS_DOMAIN_MAX_REDIRCTION. - * - */ -bool MDNSResponder::_readRRDomain_Loop(MDNSResponder::stcMDNS_RRDomain& p_rRRDomain, - uint8_t p_u8Depth) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u)\n"), p_u8Depth);); - - bool bResult = false; - - if (MDNS_DOMAIN_MAX_REDIRCTION >= p_u8Depth) { - bResult = true; - - uint8_t u8Len = 0; - do { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Offset:%u p0:%02x\n"), p_u8Depth, m_pUDPContext->tell(), m_pUDPContext->peek());); - _udpRead8(u8Len); - - if (u8Len & MDNS_DOMAIN_COMPRESS_MARK) { - // Compressed label(s) - uint16_t u16Offset = ((u8Len & ~MDNS_DOMAIN_COMPRESS_MARK) << 8); // Implicit BE to LE conversion! - _udpRead8(u8Len); - u16Offset |= u8Len; - - if (m_pUDPContext->isValidOffset(u16Offset)) { - size_t stCurrentPosition = m_pUDPContext->tell(); // Prepare return from recursion - - //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Redirecting from %u to %u!\n"), p_u8Depth, stCurrentPosition, u16Offset);); - m_pUDPContext->seek(u16Offset); - if (_readRRDomain_Loop(p_rRRDomain, p_u8Depth + 1)) { // Do recursion - //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Succeeded to read redirected label! Returning to %u\n"), p_u8Depth, stCurrentPosition);); - m_pUDPContext->seek(stCurrentPosition); // Restore after recursion - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): FAILED to read redirected label!\n"), p_u8Depth);); - bResult = false; - } - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): INVALID offset in redirection!\n"), p_u8Depth);); - bResult = false; - } - break; - } - else { - // Normal (uncompressed) label (maybe '\0' only) - if (MDNS_DOMAIN_MAXLENGTH > (p_rRRDomain.m_u16NameLength + u8Len)) { - // Add length byte - p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength] = u8Len; - ++(p_rRRDomain.m_u16NameLength); - if (u8Len) { // Add name - if ((bResult = _udpReadBuffer((unsigned char*)&(p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength]), u8Len))) { - /*DEBUG_EX_INFO( - p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength + u8Len] = 0; // Closing '\0' for printing - DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Domain label (%u): %s\n"), p_u8Depth, (unsigned)(p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength - 1]), &(p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength])); - );*/ - - p_rRRDomain.m_u16NameLength += u8Len; - } - } - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(2) offset:%u p0:%x\n"), m_pUDPContext->tell(), m_pUDPContext->peek());); - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): ERROR! Domain name too long (%u + %u)!\n"), p_u8Depth, p_rRRDomain.m_u16NameLength, u8Len);); - bResult = false; - break; - } - } - } while ((bResult) && - (0 != u8Len)); - } - else { - DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): ERROR! Too many redirections!\n"), p_u8Depth);); - } - return bResult; -} - -/* - * MDNSResponder::_readRRAttributes - */ -bool MDNSResponder::_readRRAttributes(MDNSResponder::stcMDNS_RRAttributes& p_rRRAttributes) { - //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAttributes\n"));); - - bool bResult = ((_udpRead16(p_rRRAttributes.m_u16Type)) && - (_udpRead16(p_rRRAttributes.m_u16Class))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAttributes: FAILED!\n"));); - return bResult; -} - - -/* - * DOMAIN NAMES - */ - -/* - * MDNSResponder::_buildDomainForHost - * - * Builds a MDNS host domain (eg. esp8266.local) for the given hostname. - * - */ -bool MDNSResponder::_buildDomainForHost(const char* p_pcHostname, - MDNSResponder::stcMDNS_RRDomain& p_rHostDomain) const { - - p_rHostDomain.clear(); - bool bResult = ((p_pcHostname) && - (*p_pcHostname) && - (p_rHostDomain.addLabel(p_pcHostname)) && - (p_rHostDomain.addLabel(scpcLocal)) && - (p_rHostDomain.addLabel(0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForHost: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_buildDomainForDNSSD - * - * Builds the '_services._dns-sd._udp.local' domain. - * Used while detecting generic service enum question (DNS-SD) and answering these questions. - * - */ -bool MDNSResponder::_buildDomainForDNSSD(MDNSResponder::stcMDNS_RRDomain& p_rDNSSDDomain) const { - - p_rDNSSDDomain.clear(); - bool bResult = ((p_rDNSSDDomain.addLabel(scpcServices, true)) && - (p_rDNSSDDomain.addLabel(scpcDNSSD, true)) && - (p_rDNSSDDomain.addLabel(scpcUDP, true)) && - (p_rDNSSDDomain.addLabel(scpcLocal)) && - (p_rDNSSDDomain.addLabel(0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForDNSSD: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_buildDomainForService - * - * Builds the domain for the given service (eg. _http._tcp.local or - * MyESP._http._tcp.local (if p_bIncludeName is set)). - * - */ -bool MDNSResponder::_buildDomainForService(const MDNSResponder::stcMDNSService& p_Service, - bool p_bIncludeName, - MDNSResponder::stcMDNS_RRDomain& p_rServiceDomain) const { - - p_rServiceDomain.clear(); - bool bResult = (((!p_bIncludeName) || - (p_rServiceDomain.addLabel(p_Service.m_pcName))) && - (p_rServiceDomain.addLabel(p_Service.m_pcService, true)) && - (p_rServiceDomain.addLabel(p_Service.m_pcProtocol, true)) && - (p_rServiceDomain.addLabel(scpcLocal)) && - (p_rServiceDomain.addLabel(0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForService: FAILED!\n"));); - return bResult; -} - -/* - * MDNSResponder::_buildDomainForService - * - * Builds the domain for the given service properties (eg. _http._tcp.local). - * The usual prepended '_' are added, if missing in the input strings. - * - */ -bool MDNSResponder::_buildDomainForService(const char* p_pcService, - const char* p_pcProtocol, - MDNSResponder::stcMDNS_RRDomain& p_rServiceDomain) const { - - p_rServiceDomain.clear(); - bool bResult = ((p_pcService) && - (p_pcProtocol) && - (p_rServiceDomain.addLabel(p_pcService, ('_' != *p_pcService))) && - (p_rServiceDomain.addLabel(p_pcProtocol, ('_' != *p_pcProtocol))) && - (p_rServiceDomain.addLabel(scpcLocal)) && - (p_rServiceDomain.addLabel(0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForService: FAILED for (%s.%s)!\n"), (p_pcService ?: "-"), (p_pcProtocol ?: "-"));); - return bResult; -} - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::_buildDomainForReverseIP4 - * - * The IP4 address is stringized by printing the four address bytes into a char buffer in reverse order - * and adding 'in-addr.arpa' (eg. 012.789.456.123.in-addr.arpa). - * Used while detecting reverse IP4 questions and answering these - */ - bool MDNSResponder::_buildDomainForReverseIP4(IPAddress p_IP4Address, - MDNSResponder::stcMDNS_RRDomain& p_rReverseIP4Domain) const { - - bool bResult = true; - - p_rReverseIP4Domain.clear(); - - char acBuffer[32]; - for (int i=MDNS_IP4_SIZE; ((bResult) && (i>=1)); --i) { - itoa(p_IP4Address[i - 1], acBuffer, 10); - bResult = p_rReverseIP4Domain.addLabel(acBuffer); - } - bResult = ((bResult) && - (p_rReverseIP4Domain.addLabel(scpcReverseIP4Domain)) && - (p_rReverseIP4Domain.addLabel(scpcReverseTopDomain)) && - (p_rReverseIP4Domain.addLabel(0))); - DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForReverseIP4: FAILED!\n"));); - return bResult; - } -#endif - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::_buildDomainForReverseIP6 - * - * Used while detecting reverse IP6 questions and answering these - */ - bool MDNSResponder::_buildDomainForReverseIP6(IPAddress p_IP4Address, - MDNSResponder::stcMDNS_RRDomain& p_rReverseIP6Domain) const { - // TODO: Implement - return false; - } -#endif - - -/* - * UDP - */ - -/* - * MDNSResponder::_udpReadBuffer - */ -bool MDNSResponder::_udpReadBuffer(unsigned char* p_pBuffer, - size_t p_stLength) { - - bool bResult = ((m_pUDPContext) && - (true/*m_pUDPContext->getSize() > p_stLength*/) && - (p_pBuffer) && - (p_stLength) && - ((p_stLength == m_pUDPContext->read((char*)p_pBuffer, p_stLength)))); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _udpReadBuffer: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_udpRead8 - */ -bool MDNSResponder::_udpRead8(uint8_t& p_ru8Value) { - - return _udpReadBuffer((unsigned char*)&p_ru8Value, sizeof(p_ru8Value)); -} - -/* - * MDNSResponder::_udpRead16 - */ -bool MDNSResponder::_udpRead16(uint16_t& p_ru16Value) { - - bool bResult = false; - - if (_udpReadBuffer((unsigned char*)&p_ru16Value, sizeof(p_ru16Value))) { - p_ru16Value = lwip_ntohs(p_ru16Value); - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::_udpRead32 - */ -bool MDNSResponder::_udpRead32(uint32_t& p_ru32Value) { - - bool bResult = false; - - if (_udpReadBuffer((unsigned char*)&p_ru32Value, sizeof(p_ru32Value))) { - p_ru32Value = lwip_ntohl(p_ru32Value); - bResult = true; - } - return bResult; -} - -/* - * MDNSResponder::_udpAppendBuffer - */ -bool MDNSResponder::_udpAppendBuffer(const unsigned char* p_pcBuffer, - size_t p_stLength) { - - bool bResult = ((m_pUDPContext) && - (p_pcBuffer) && - (p_stLength) && - (p_stLength == m_pUDPContext->append((const char*)p_pcBuffer, p_stLength))); - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _udpAppendBuffer: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_udpAppend8 - */ -bool MDNSResponder::_udpAppend8(uint8_t p_u8Value) { - - return (_udpAppendBuffer((unsigned char*)&p_u8Value, sizeof(p_u8Value))); -} - -/* - * MDNSResponder::_udpAppend16 - */ -bool MDNSResponder::_udpAppend16(uint16_t p_u16Value) { - - p_u16Value = lwip_htons(p_u16Value); - return (_udpAppendBuffer((unsigned char*)&p_u16Value, sizeof(p_u16Value))); -} - -/* - * MDNSResponder::_udpAppend32 - */ -bool MDNSResponder::_udpAppend32(uint32_t p_u32Value) { - - p_u32Value = lwip_htonl(p_u32Value); - return (_udpAppendBuffer((unsigned char*)&p_u32Value, sizeof(p_u32Value))); -} - -#ifdef DEBUG_ESP_MDNS_RESPONDER - /* - * MDNSResponder::_udpDump - */ - bool MDNSResponder::_udpDump(bool p_bMovePointer /*= false*/) { - - const uint8_t cu8BytesPerLine = 16; - - uint32_t u32StartPosition = m_pUDPContext->tell(); - DEBUG_OUTPUT.println("UDP Context Dump:"); - uint32_t u32Counter = 0; - uint8_t u8Byte = 0; - - while (_udpRead8(u8Byte)) { - DEBUG_OUTPUT.printf_P(PSTR("%02x %s"), u8Byte, ((++u32Counter % cu8BytesPerLine) ? "" : "\n")); - } - DEBUG_OUTPUT.printf_P(PSTR("%sDone: %u bytes\n"), (((u32Counter) && (u32Counter % cu8BytesPerLine)) ? "\n" : ""), u32Counter); - - if (!p_bMovePointer) { // Restore - m_pUDPContext->seek(u32StartPosition); - } - return true; - } - - /* - * MDNSResponder::_udpDump - */ - bool MDNSResponder::_udpDump(unsigned p_uOffset, - unsigned p_uLength) { - - if ((m_pUDPContext) && - (m_pUDPContext->isValidOffset(p_uOffset))) { - unsigned uCurrentPosition = m_pUDPContext->tell(); // Remember start position - - m_pUDPContext->seek(p_uOffset); - uint8_t u8Byte; - for (unsigned u=0; ((useek(uCurrentPosition); - } - return true; - } -#endif - - -/** - * READ/WRITE MDNS STRUCTS - */ - -/* - * MDNSResponder::_readMDNSMsgHeader - * - * Read a MDNS header from the UDP input buffer. - * | 8 | 8 | 8 | 8 | - * 00| Identifier | Flags & Codes | - * 01| Question count | Answer count | - * 02| NS answer count | Ad answer count | - * - * All 16-bit and 32-bit elements need to be translated form network coding to host coding (done in _udpRead16 and _udpRead32) - * In addition, bitfield memory order is undefined in C standard (GCC doesn't order them in the coded direction...), so they - * need some mapping here - */ -bool MDNSResponder::_readMDNSMsgHeader(MDNSResponder::stcMDNS_MsgHeader& p_rMsgHeader) { - - bool bResult = false; - - uint8_t u8B1; - uint8_t u8B2; - if ((_udpRead16(p_rMsgHeader.m_u16ID)) && - (_udpRead8(u8B1))&& - (_udpRead8(u8B2)) && - (_udpRead16(p_rMsgHeader.m_u16QDCount)) && - (_udpRead16(p_rMsgHeader.m_u16ANCount)) && - (_udpRead16(p_rMsgHeader.m_u16NSCount)) && - (_udpRead16(p_rMsgHeader.m_u16ARCount))) { - - p_rMsgHeader.m_1bQR = (u8B1 & 0x80); // Query/Responde flag - p_rMsgHeader.m_4bOpcode = (u8B1 & 0x78); // Operation code (0: Standard query, others ignored) - p_rMsgHeader.m_1bAA = (u8B1 & 0x04); // Authorative answer - p_rMsgHeader.m_1bTC = (u8B1 & 0x02); // Truncation flag - p_rMsgHeader.m_1bRD = (u8B1 & 0x01); // Recursion desired - - p_rMsgHeader.m_1bRA = (u8B2 & 0x80); // Recursion available - p_rMsgHeader.m_3bZ = (u8B2 & 0x70); // Zero - p_rMsgHeader.m_4bRCode = (u8B2 & 0x0F); // Response code - - /*DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readMDNSMsgHeader: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), - (unsigned)p_rMsgHeader.m_u16ID, - (unsigned)p_rMsgHeader.m_1bQR, (unsigned)p_rMsgHeader.m_4bOpcode, (unsigned)p_rMsgHeader.m_1bAA, (unsigned)p_rMsgHeader.m_1bTC, (unsigned)p_rMsgHeader.m_1bRD, - (unsigned)p_rMsgHeader.m_1bRA, (unsigned)p_rMsgHeader.m_4bRCode, - (unsigned)p_rMsgHeader.m_u16QDCount, - (unsigned)p_rMsgHeader.m_u16ANCount, - (unsigned)p_rMsgHeader.m_u16NSCount, - (unsigned)p_rMsgHeader.m_u16ARCount););*/ - bResult = true; - } - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readMDNSMsgHeader: FAILED!\n")); } ); - return bResult; -} - -/* - * MDNSResponder::_write8 - */ -bool MDNSResponder::_write8(uint8_t p_u8Value, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - return ((_udpAppend8(p_u8Value)) && - (p_rSendParameter.shiftOffset(sizeof(p_u8Value)))); -} - -/* - * MDNSResponder::_write16 - */ -bool MDNSResponder::_write16(uint16_t p_u16Value, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - return ((_udpAppend16(p_u16Value)) && - (p_rSendParameter.shiftOffset(sizeof(p_u16Value)))); -} - -/* - * MDNSResponder::_write32 - */ -bool MDNSResponder::_write32(uint32_t p_u32Value, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - return ((_udpAppend32(p_u32Value)) && - (p_rSendParameter.shiftOffset(sizeof(p_u32Value)))); -} - -/* - * MDNSResponder::_writeMDNSMsgHeader - * - * Write MDNS header to the UDP output buffer. - * - * All 16-bit and 32-bit elements need to be translated form host coding to network coding (done in _udpAppend16 and _udpAppend32) - * In addition, bitfield memory order is undefined in C standard (GCC doesn't order them in the coded direction...), so they - * need some mapping here - */ -bool MDNSResponder::_writeMDNSMsgHeader(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - /*DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSMsgHeader: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), - (unsigned)p_MsgHeader.m_u16ID, - (unsigned)p_MsgHeader.m_1bQR, (unsigned)p_MsgHeader.m_4bOpcode, (unsigned)p_MsgHeader.m_1bAA, (unsigned)p_MsgHeader.m_1bTC, (unsigned)p_MsgHeader.m_1bRD, - (unsigned)p_MsgHeader.m_1bRA, (unsigned)p_MsgHeader.m_4bRCode, - (unsigned)p_MsgHeader.m_u16QDCount, - (unsigned)p_MsgHeader.m_u16ANCount, - (unsigned)p_MsgHeader.m_u16NSCount, - (unsigned)p_MsgHeader.m_u16ARCount););*/ - - uint8_t u8B1((p_MsgHeader.m_1bQR << 7) | (p_MsgHeader.m_4bOpcode << 3) | (p_MsgHeader.m_1bAA << 2) | (p_MsgHeader.m_1bTC << 1) | (p_MsgHeader.m_1bRD)); - uint8_t u8B2((p_MsgHeader.m_1bRA << 7) | (p_MsgHeader.m_3bZ << 4) | (p_MsgHeader.m_4bRCode)); - bool bResult = ((_write16(p_MsgHeader.m_u16ID, p_rSendParameter)) && - (_write8(u8B1, p_rSendParameter)) && - (_write8(u8B2, p_rSendParameter)) && - (_write16(p_MsgHeader.m_u16QDCount, p_rSendParameter)) && - (_write16(p_MsgHeader.m_u16ANCount, p_rSendParameter)) && - (_write16(p_MsgHeader.m_u16NSCount, p_rSendParameter)) && - (_write16(p_MsgHeader.m_u16ARCount, p_rSendParameter))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSMsgHeader: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_writeRRAttributes - */ -bool MDNSResponder::_writeMDNSRRAttributes(const MDNSResponder::stcMDNS_RRAttributes& p_Attributes, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - bool bResult = ((_write16(p_Attributes.m_u16Type, p_rSendParameter)) && - (_write16(p_Attributes.m_u16Class, p_rSendParameter))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSRRAttributes: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_writeMDNSRRDomain - */ -bool MDNSResponder::_writeMDNSRRDomain(const MDNSResponder::stcMDNS_RRDomain& p_Domain, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - bool bResult = ((_udpAppendBuffer((const unsigned char*)p_Domain.m_acName, p_Domain.m_u16NameLength)) && - (p_rSendParameter.shiftOffset(p_Domain.m_u16NameLength))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSRRDomain: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_writeMDNSHostDomain - * - * Write a host domain to the UDP output buffer. - * If the domain record is part of the answer, the records length is - * prepended (p_bPrependRDLength is set). - * - * A very simple form of name compression is applied here: - * If the domain is written to the UDP output buffer, the write offset is stored - * together with a domain id (the pointer) in a p_rSendParameter substructure (cache). - * If the same domain (pointer) should be written to the UDP output later again, - * the old offset is retrieved from the cache, marked as a compressed domain offset - * and written to the output buffer. - * - */ -bool MDNSResponder::_writeMDNSHostDomain(const char* p_pcHostname, - bool p_bPrependRDLength, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - // The 'skip-compression' version is handled in '_writeMDNSAnswer_SRV' - uint16_t u16CachedDomainOffset = p_rSendParameter.findCachedDomainOffset((const void*)p_pcHostname, false); - - stcMDNS_RRDomain hostDomain; - bool bResult = (u16CachedDomainOffset - // Found cached domain -> mark as compressed domain - ? ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset - ((!p_bPrependRDLength) || - (_write16(2, p_rSendParameter))) && // Length of 'Cxxx' - (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) - (_write8((uint8_t)(u16CachedDomainOffset & 0xFF), p_rSendParameter))) - // No cached domain -> add this domain to cache and write full domain name - : ((_buildDomainForHost(p_pcHostname, hostDomain)) && // eg. esp8266.local - ((!p_bPrependRDLength) || - (_write16(hostDomain.m_u16NameLength, p_rSendParameter))) && // RDLength (if needed) - (p_rSendParameter.addDomainCacheItem((const void*)p_pcHostname, false, p_rSendParameter.m_u16Offset)) && - (_writeMDNSRRDomain(hostDomain, p_rSendParameter)))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSHostDomain: FAILED!\n")); }); - return bResult; - -} - -/* - * MDNSResponder::_writeMDNSServiceDomain - * - * Write a service domain to the UDP output buffer. - * If the domain record is part of the answer, the records length is - * prepended (p_bPrependRDLength is set). - * - * A very simple form of name compression is applied here: see '_writeMDNSHostDomain' - * The cache differentiates of course between service domains which includes - * the instance name (p_bIncludeName is set) and thoose who don't. - * - */ -bool MDNSResponder::_writeMDNSServiceDomain(const MDNSResponder::stcMDNSService& p_Service, - bool p_bIncludeName, - bool p_bPrependRDLength, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - - // The 'skip-compression' version is handled in '_writeMDNSAnswer_SRV' - uint16_t u16CachedDomainOffset = p_rSendParameter.findCachedDomainOffset((const void*)&p_Service, p_bIncludeName); - - stcMDNS_RRDomain serviceDomain; - bool bResult = (u16CachedDomainOffset - // Found cached domain -> mark as compressed domain - ? ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset - ((!p_bPrependRDLength) || - (_write16(2, p_rSendParameter))) && // Lenght of 'Cxxx' - (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) - (_write8((uint8_t)(u16CachedDomainOffset & 0xFF), p_rSendParameter))) - // No cached domain -> add this domain to cache and write full domain name - : ((_buildDomainForService(p_Service, p_bIncludeName, serviceDomain)) && // eg. MyESP._http._tcp.local - ((!p_bPrependRDLength) || - (_write16(serviceDomain.m_u16NameLength, p_rSendParameter))) && // RDLength (if needed) - (p_rSendParameter.addDomainCacheItem((const void*)&p_Service, p_bIncludeName, p_rSendParameter.m_u16Offset)) && - (_writeMDNSRRDomain(serviceDomain, p_rSendParameter)))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSServiceDomain: FAILED!\n")); }); - return bResult; - -} - -/* - * MDNSResponder::_writeMDNSQuestion - * - * Write a MDNS question to the UDP output buffer - * - * QNAME (host/service domain, eg. esp8266.local) - * QTYPE (16bit, eg. ANY) - * QCLASS (16bit, eg. IN) - * - */ -bool MDNSResponder::_writeMDNSQuestion(MDNSResponder::stcMDNS_RRQuestion& p_Question, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSQuestion\n"));); - - bool bResult = ((_writeMDNSRRDomain(p_Question.m_Header.m_Domain, p_rSendParameter)) && - (_writeMDNSRRAttributes(p_Question.m_Header.m_Attributes, p_rSendParameter))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSQuestion: FAILED!\n")); }); - return bResult; - -} - - -#ifdef MDNS_IP4_SUPPORT - /* - * MDNSResponder::_writeMDNSAnswer_A - * - * Write a MDNS A answer to the UDP output buffer. - * - * NAME (var, host/service domain, eg. esp8266.local - * TYPE (16bit, eg. A) - * CLASS (16bit, eg. IN) - * TTL (32bit, eg. 120) - * RDLENGTH (16bit, eg 4) - * RDATA (var, eg. 123.456.789.012) - * - * eg. esp8266.local A 0x8001 120 4 123.456.789.012 - * Ref: http://www.zytrax.com/books/dns/ch8/a.html - */ - bool MDNSResponder::_writeMDNSAnswer_A(IPAddress p_IPAddress, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_A (%s)\n"), p_IPAddress.toString().c_str());); - - stcMDNS_RRAttributes attributes(DNS_RRTYPE_A, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - const unsigned char aucIPAddress[MDNS_IP4_SIZE] = { p_IPAddress[0], p_IPAddress[1], p_IPAddress[2], p_IPAddress[3] }; - bool bResult = ((_writeMDNSHostDomain(m_pcHostname, false, p_rSendParameter)) && - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL - (_write16(MDNS_IP4_SIZE, p_rSendParameter)) && // RDLength - (_udpAppendBuffer(aucIPAddress, MDNS_IP4_SIZE)) && // RData - (p_rSendParameter.shiftOffset(MDNS_IP4_SIZE))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_A: FAILED!\n")); }); - return bResult; - - } - - /* - * MDNSResponder::_writeMDNSAnswer_PTR_IP4 - * - * Write a MDNS reverse IP4 PTR answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * eg. 012.789.456.123.in-addr.arpa PTR 0x8001 120 15 esp8266.local - * Used while answering reverse IP4 questions - */ - bool MDNSResponder::_writeMDNSAnswer_PTR_IP4(IPAddress p_IPAddress, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP4 (%s)\n"), p_IPAddress.toString().c_str());); - - stcMDNS_RRDomain reverseIP4Domain; - stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - stcMDNS_RRDomain hostDomain; - bool bResult = ((_buildDomainForReverseIP4(p_IPAddress, reverseIP4Domain)) && // 012.789.456.123.in-addr.arpa - (_writeMDNSRRDomain(reverseIP4Domain, p_rSendParameter)) && - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL - (_writeMDNSHostDomain(m_pcHostname, true, p_rSendParameter))); // RDLength & RData (host domain, eg. esp8266.local) - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP4: FAILED!\n")); }); - return bResult; - } -#endif - -/* - * MDNSResponder::_writeMDNSAnswer_PTR_TYPE - * - * Write a MDNS PTR answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * PTR all-services -> service type - * eg. _services._dns-sd._udp.local PTR 0x8001 5400 xx _http._tcp.local - * http://www.zytrax.com/books/dns/ch8/ptr.html - */ -bool MDNSResponder::_writeMDNSAnswer_PTR_TYPE(MDNSResponder::stcMDNSService& p_rService, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_TYPE\n"));); - - stcMDNS_RRDomain dnssdDomain; - stcMDNS_RRDomain serviceDomain; - stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, DNS_RRCLASS_IN); // No cache flush! only INternet - bool bResult = ((_buildDomainForDNSSD(dnssdDomain)) && // _services._dns-sd._udp.local - (_writeMDNSRRDomain(dnssdDomain, p_rSendParameter)) && - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL - (_writeMDNSServiceDomain(p_rService, false, true, p_rSendParameter))); // RDLength & RData (service domain, eg. _http._tcp.local) - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_TYPE: FAILED!\n")); }); - return bResult; -} - -/* - * MDNSResponder::_writeMDNSAnswer_PTR_NAME - * - * Write a MDNS PTR answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * PTR service type -> service name - * eg. _http.tcp.local PTR 0x8001 120 xx myESP._http._tcp.local - * http://www.zytrax.com/books/dns/ch8/ptr.html - */ -bool MDNSResponder::_writeMDNSAnswer_PTR_NAME(MDNSResponder::stcMDNSService& p_rService, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_NAME\n"));); - - stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, DNS_RRCLASS_IN); // No cache flush! only INternet - bool bResult = ((_writeMDNSServiceDomain(p_rService, false, false, p_rSendParameter)) && // _http._tcp.local - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL - (_writeMDNSServiceDomain(p_rService, true, true, p_rSendParameter))); // RDLength & RData (service domain, eg. MyESP._http._tcp.local) - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_NAME: FAILED!\n")); }); - return bResult; -} - - -/* - * MDNSResponder::_writeMDNSAnswer_TXT - * - * Write a MDNS TXT answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * The TXT items in the RDATA block are 'length byte encoded': [len]vardata - * - * eg. myESP._http._tcp.local TXT 0x8001 120 4 c#=1 - * http://www.zytrax.com/books/dns/ch8/txt.html - */ -bool MDNSResponder::_writeMDNSAnswer_TXT(MDNSResponder::stcMDNSService& p_rService, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT\n"));); - - bool bResult = false; - - stcMDNS_RRAttributes attributes(DNS_RRTYPE_TXT, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - - if ((_collectServiceTxts(p_rService)) && - (_writeMDNSServiceDomain(p_rService, true, false, p_rSendParameter)) && // MyESP._http._tcp.local - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL - (_write16(p_rService.m_Txts.length(), p_rSendParameter))) { // RDLength - - bResult = true; - // RData Txts - for (stcMDNSServiceTxt* pTxt=p_rService.m_Txts.m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) { - unsigned char ucLengthByte = pTxt->length(); - bResult = ((_udpAppendBuffer((unsigned char*)&ucLengthByte, sizeof(ucLengthByte))) && // Length - (p_rSendParameter.shiftOffset(sizeof(ucLengthByte))) && - ((size_t)os_strlen(pTxt->m_pcKey) == m_pUDPContext->append(pTxt->m_pcKey, os_strlen(pTxt->m_pcKey))) && // Key - (p_rSendParameter.shiftOffset((size_t)os_strlen(pTxt->m_pcKey))) && - (1 == m_pUDPContext->append("=", 1)) && // = - (p_rSendParameter.shiftOffset(1)) && - ((!pTxt->m_pcValue) || - (((size_t)os_strlen(pTxt->m_pcValue) == m_pUDPContext->append(pTxt->m_pcValue, os_strlen(pTxt->m_pcValue))) && // Value - (p_rSendParameter.shiftOffset((size_t)os_strlen(pTxt->m_pcValue)))))); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT: FAILED to write %sTxt %s=%s!\n"), (pTxt->m_bTemp ? "temp. " : ""), (pTxt->m_pcKey ?: "?"), (pTxt->m_pcValue ?: "?")); }); - } - } - _releaseTempServiceTxts(p_rService); - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT: FAILED!\n")); }); - return bResult; -} - -#ifdef MDNS_IP6_SUPPORT - /* - * MDNSResponder::_writeMDNSAnswer_AAAA - * - * Write a MDNS AAAA answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * eg. esp8266.local AAAA 0x8001 120 16 xxxx::xx - * http://www.zytrax.com/books/dns/ch8/aaaa.html - */ - bool MDNSResponder::_writeMDNSAnswer_AAAA(IPAddress p_IPAddress, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_AAAA\n"));); - - stcMDNS_RRAttributes attributes(DNS_RRTYPE_AAAA, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - bool bResult = ((_writeMDNSHostDomain(m_pcHostname, false, p_rSendParameter)) && // esp8266.local - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL - (_write16(MDNS_IP6_SIZE, p_rSendParameter)) && // RDLength - (false /*TODO: IP6 version of: _udpAppendBuffer((uint32_t)p_IPAddress, MDNS_IP4_SIZE)*/)); // RData - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_AAAA: FAILED!\n")); }); - return bResult; - } - - /* - * MDNSResponder::_writeMDNSAnswer_PTR_IP6 - * - * Write a MDNS reverse IP6 PTR answer to the UDP output buffer. - * See: '_writeMDNSAnswer_A' - * - * eg. xxxx::xx.in6.arpa PTR 0x8001 120 15 esp8266.local - * Used while answering reverse IP6 questions - */ - bool MDNSResponder::_writeMDNSAnswer_PTR_IP6(IPAddress p_IPAddress, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP6\n"));); - - stcMDNS_RRDomain reverseIP6Domain; - stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - bool bResult = ((_buildDomainForReverseIP6(p_IPAddress, reverseIP6Domain)) && // xxxx::xx.ip6.arpa - (_writeMDNSRRDomain(reverseIP6Domain, p_rSendParameter)) && - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL - (_writeMDNSHostDomain(m_pcHostname, true, p_rSendParameter))); // RDLength & RData (host domain, eg. esp8266.local) - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP6: FAILED!\n")); }); - return bResult; - } -#endif - -/* - * MDNSResponder::_writeMDNSAnswer_SRV - * - * eg. MyESP._http.tcp.local SRV 0x8001 120 0 0 60068 esp8266.local - * http://www.zytrax.com/books/dns/ch8/srv.html ???? Include instance name ???? - */ -bool MDNSResponder::_writeMDNSAnswer_SRV(MDNSResponder::stcMDNSService& p_rService, - MDNSResponder::stcMDNSSendParameter& p_rSendParameter) { - DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_SRV\n"));); - - uint16_t u16CachedDomainOffset = (p_rSendParameter.m_bLegacyQuery - ? 0 - : p_rSendParameter.findCachedDomainOffset((const void*)m_pcHostname, false)); - - stcMDNS_RRAttributes attributes(DNS_RRTYPE_SRV, - ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet - stcMDNS_RRDomain hostDomain; - bool bResult = ((_writeMDNSServiceDomain(p_rService, true, false, p_rSendParameter)) && // MyESP._http._tcp.local - (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS - (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL - (!u16CachedDomainOffset - // No cache for domain name (or no compression allowed) - ? ((_buildDomainForHost(m_pcHostname, hostDomain)) && - (_write16((sizeof(uint16_t /*Prio*/) + // RDLength - sizeof(uint16_t /*Weight*/) + - sizeof(uint16_t /*Port*/) + - hostDomain.m_u16NameLength), p_rSendParameter)) && // Domain length - (_write16(MDNS_SRV_PRIORITY, p_rSendParameter)) && // Priority - (_write16(MDNS_SRV_WEIGHT, p_rSendParameter)) && // Weight - (_write16(p_rService.m_u16Port, p_rSendParameter)) && // Port - (p_rSendParameter.addDomainCacheItem((const void*)m_pcHostname, false, p_rSendParameter.m_u16Offset)) && - (_writeMDNSRRDomain(hostDomain, p_rSendParameter))) // Host, eg. esp8266.local - // Cache available for domain - : ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset - (_write16((sizeof(uint16_t /*Prio*/) + // RDLength - sizeof(uint16_t /*Weight*/) + - sizeof(uint16_t /*Port*/) + - 2), p_rSendParameter)) && // Length of 'C0xx' - (_write16(MDNS_SRV_PRIORITY, p_rSendParameter)) && // Priority - (_write16(MDNS_SRV_WEIGHT, p_rSendParameter)) && // Weight - (_write16(p_rService.m_u16Port, p_rSendParameter)) && // Port - (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) - (_write8((uint8_t)u16CachedDomainOffset, p_rSendParameter))))); // Offset - - DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_SRV: FAILED!\n")); }); - return bResult; -} - -} // namespace MDNSImplementation - -} // namespace esp8266 - - - - - - +/* + LEAmDNS_Transfer.cpp + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ + +extern "C" { +#include "user_interface.h" +} + +#include "LEAmDNS_lwIPdefs.h" +#include "LEAmDNS_Priv.h" + + +namespace esp8266 +{ + +/* + LEAmDNS +*/ +namespace MDNSImplementation +{ + +/** + CONST STRINGS +*/ +static const char* scpcLocal = "local"; +static const char* scpcServices = "services"; +static const char* scpcDNSSD = "dns-sd"; +static const char* scpcUDP = "udp"; +//static const char* scpcTCP = "tcp"; + +#ifdef MDNS_IP4_SUPPORT +static const char* scpcReverseIP4Domain = "in-addr"; +#endif +#ifdef MDNS_IP6_SUPPORT +static const char* scpcReverseIP6Domain = "ip6"; +#endif +static const char* scpcReverseTopDomain = "arpa"; + +/** + TRANSFER +*/ + + +/** + SENDING +*/ + +/* + MDNSResponder::_sendMDNSMessage + + Unicast responses are prepared and sent directly to the querier. + Multicast responses or queries are transferred to _sendMDNSMessage_Multicast + + Any reply flags in installed services are removed at the end! + +*/ +bool MDNSResponder::_sendMDNSMessage(MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + bool bResult = true; + + if (p_rSendParameter.m_bResponse && + p_rSendParameter.m_bUnicast) // Unicast response -> Send to querier + { + DEBUG_EX_ERR(if (!m_pUDPContext->getRemoteAddress()) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage: MISSING remote address for response!\n")); + }); + IPAddress ipRemote; + ipRemote = m_pUDPContext->getRemoteAddress(); + bResult = ((_prepareMDNSMessage(p_rSendParameter, _getResponseMulticastInterface())) && + (m_pUDPContext->send(ipRemote, m_pUDPContext->getRemotePort()))); + } + else // Multicast response + { + bResult = _sendMDNSMessage_Multicast(p_rSendParameter); + } + + // Finally clear service reply masks + for (stcMDNSService* pService = m_pServices; pService; pService = pService->m_pNext) + { + pService->m_u8ReplyMask = 0; + } + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_sendMDNSMessage_Multicast + + Fills the UDP output buffer (via _prepareMDNSMessage) and sends the buffer + via the selected WiFi interface (Station or AP) +*/ +bool MDNSResponder::_sendMDNSMessage_Multicast(MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + bool bResult = false; + + IPAddress fromIPAddress; + fromIPAddress = _getResponseMulticastInterface(); + m_pUDPContext->setMulticastInterface(fromIPAddress); + +#ifdef MDNS_IP4_SUPPORT + IPAddress toMulticastAddress(DNS_MQUERY_IPV4_GROUP_INIT); +#endif +#ifdef MDNS_IP6_SUPPORT + //TODO: set multicast address + IPAddress toMulticastAddress(DNS_MQUERY_IPV6_GROUP_INIT); +#endif + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage_Multicast: Will send to '%s'.\n"), toMulticastAddress.toString().c_str());); + bResult = ((_prepareMDNSMessage(p_rSendParameter, fromIPAddress)) && + (m_pUDPContext->send(toMulticastAddress, DNS_MQUERY_PORT))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSMessage_Multicast: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_prepareMDNSMessage + + The MDNS message is composed in a two-step process. + In the first loop 'only' the header informations (mainly number of answers) are collected, + while in the seconds loop, the header and all queries and answers are written to the UDP + output buffer. + +*/ +bool MDNSResponder::_prepareMDNSMessage(MDNSResponder::stcMDNSSendParameter& p_rSendParameter, + IPAddress p_IPAddress) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage\n"));); + bool bResult = true; + + // Prepare header; count answers + stcMDNS_MsgHeader msgHeader(p_rSendParameter.m_u16ID, p_rSendParameter.m_bResponse, 0, p_rSendParameter.m_bAuthorative); + // If this is a response, the answers are anwers, + // else this is a query or probe and the answers go into auth section + uint16_t& ru16Answers = (p_rSendParameter.m_bResponse + ? msgHeader.m_u16ANCount + : msgHeader.m_u16NSCount); + + /** + enuSequence + */ + enum enuSequence + { + Sequence_Count = 0, + Sequence_Send = 1 + }; + + // Two step sequence: 'Count' and 'Send' + for (uint32_t sequence = Sequence_Count; ((bResult) && (sequence <= Sequence_Send)); ++sequence) + { + DEBUG_EX_INFO( + if (Sequence_Send == sequence) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), + (unsigned)msgHeader.m_u16ID, + (unsigned)msgHeader.m_1bQR, (unsigned)msgHeader.m_4bOpcode, (unsigned)msgHeader.m_1bAA, (unsigned)msgHeader.m_1bTC, (unsigned)msgHeader.m_1bRD, + (unsigned)msgHeader.m_1bRA, (unsigned)msgHeader.m_4bRCode, + (unsigned)msgHeader.m_u16QDCount, + (unsigned)msgHeader.m_u16ANCount, + (unsigned)msgHeader.m_u16NSCount, + (unsigned)msgHeader.m_u16ARCount); + } + ); + // Count/send + // Header + bResult = ((Sequence_Count == sequence) + ? true + : _writeMDNSMsgHeader(msgHeader, p_rSendParameter)); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSMsgHeader FAILED!\n"));); + // Questions + for (stcMDNS_RRQuestion* pQuestion = p_rSendParameter.m_pQuestions; ((bResult) && (pQuestion)); pQuestion = pQuestion->m_pNext) + { + ((Sequence_Count == sequence) + ? ++msgHeader.m_u16QDCount + : (bResult = _writeMDNSQuestion(*pQuestion, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSQuestion FAILED!\n"));); + } + + // Answers and authorative answers +#ifdef MDNS_IP4_SUPPORT + if ((bResult) && + (p_rSendParameter.m_u8HostReplyMask & ContentFlag_A)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_A(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_A(A) FAILED!\n"));); + } + if ((bResult) && + (p_rSendParameter.m_u8HostReplyMask & ContentFlag_PTR_IP4)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_PTR_IP4(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_IP4 FAILED!\n"));); + } +#endif +#ifdef MDNS_IP6_SUPPORT + if ((bResult) && + (p_rSendParameter.m_u8HostReplyMask & ContentFlag_AAAA)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_AAAA(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_AAAA(A) FAILED!\n"));); + } + if ((bResult) && + (p_rSendParameter.m_u8HostReplyMask & ContentFlag_PTR_IP6)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_PTR_IP6(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_IP6 FAILED!\n"));); + } +#endif + + for (stcMDNSService* pService = m_pServices; ((bResult) && (pService)); pService = pService->m_pNext) + { + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_PTR_TYPE)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_PTR_TYPE(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_TYPE FAILED!\n"));); + } + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_PTR_NAME)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_PTR_NAME(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_PTR_NAME FAILED!\n"));); + } + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_SRV)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_SRV(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_SRV(A) FAILED!\n"));); + } + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_TXT)) + { + ((Sequence_Count == sequence) + ? ++ru16Answers + : (bResult = _writeMDNSAnswer_TXT(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_TXT(A) FAILED!\n"));); + } + } // for services + + // Additional answers +#ifdef MDNS_IP4_SUPPORT + bool bNeedsAdditionalAnswerA = false; +#endif +#ifdef MDNS_IP6_SUPPORT + bool bNeedsAdditionalAnswerAAAA = false; +#endif + for (stcMDNSService* pService = m_pServices; ((bResult) && (pService)); pService = pService->m_pNext) + { + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_PTR_NAME) && // If PTR_NAME is requested, AND + (!(pService->m_u8ReplyMask & ContentFlag_SRV))) // NOT SRV -> add SRV as additional answer + { + ((Sequence_Count == sequence) + ? ++msgHeader.m_u16ARCount + : (bResult = _writeMDNSAnswer_SRV(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_SRV(B) FAILED!\n"));); + } + if ((bResult) && + (pService->m_u8ReplyMask & ContentFlag_PTR_NAME) && // If PTR_NAME is requested, AND + (!(pService->m_u8ReplyMask & ContentFlag_TXT))) // NOT TXT -> add TXT as additional answer + { + ((Sequence_Count == sequence) + ? ++msgHeader.m_u16ARCount + : (bResult = _writeMDNSAnswer_TXT(*pService, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_TXT(B) FAILED!\n"));); + } + if ((pService->m_u8ReplyMask & (ContentFlag_PTR_NAME | ContentFlag_SRV)) || // If service instance name or SRV OR + (p_rSendParameter.m_u8HostReplyMask & (ContentFlag_A | ContentFlag_AAAA))) // any host IP address is requested + { +#ifdef MDNS_IP4_SUPPORT + if ((bResult) && + (!(p_rSendParameter.m_u8HostReplyMask & ContentFlag_A))) // Add IP4 address + { + bNeedsAdditionalAnswerA = true; + } +#endif +#ifdef MDNS_IP6_SUPPORT + if ((bResult) && + (!(p_rSendParameter.m_u8HostReplyMask & ContentFlag_AAAA))) // Add IP6 address + { + bNeedsAdditionalAnswerAAAA = true; + } +#endif + } + } // for services + + // Answer A needed? +#ifdef MDNS_IP4_SUPPORT + if ((bResult) && + (bNeedsAdditionalAnswerA)) + { + ((Sequence_Count == sequence) + ? ++msgHeader.m_u16ARCount + : (bResult = _writeMDNSAnswer_A(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_A(B) FAILED!\n"));); + } +#endif +#ifdef MDNS_IP6_SUPPORT + // Answer AAAA needed? + if ((bResult) && + (bNeedsAdditionalAnswerAAAA)) + { + ((Sequence_Count == sequence) + ? ++msgHeader.m_u16ARCount + : (bResult = _writeMDNSAnswer_AAAA(p_IPAddress, p_rSendParameter))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: _writeMDNSAnswer_AAAA(B) FAILED!\n"));); + } +#endif + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: Loop %i FAILED!\n"), sequence);); + } // for sequence + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _prepareMDNSMessage: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_sendMDNSServiceQuery + + Creates and sends a PTR query for the given service domain. + +*/ +bool MDNSResponder::_sendMDNSServiceQuery(const MDNSResponder::stcMDNSServiceQuery& p_ServiceQuery) +{ + + return _sendMDNSQuery(p_ServiceQuery.m_ServiceTypeDomain, DNS_RRTYPE_PTR); +} + +/* + MDNSResponder::_sendMDNSQuery + + Creates and sends a query for the given domain and query type. + +*/ +bool MDNSResponder::_sendMDNSQuery(const MDNSResponder::stcMDNS_RRDomain& p_QueryDomain, + uint16_t p_u16QueryType, + stcMDNSServiceQuery::stcAnswer* p_pKnownAnswers /*= 0*/) +{ + + bool bResult = false; + + stcMDNSSendParameter sendParameter; + if (0 != ((sendParameter.m_pQuestions = new stcMDNS_RRQuestion))) + { + sendParameter.m_pQuestions->m_Header.m_Domain = p_QueryDomain; + + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Type = p_u16QueryType; + // It seems, that some mDNS implementations don't support 'unicast response' questions... + sendParameter.m_pQuestions->m_Header.m_Attributes.m_u16Class = (/*0x8000 |*/ DNS_RRCLASS_IN); // /*Unicast &*/ INternet + + // TODO: Add knwon answer to the query + (void)p_pKnownAnswers; + + bResult = _sendMDNSMessage(sendParameter); + } // else: FAILED to alloc question + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _sendMDNSQuery: FAILED to alloc question!\n"));); + return bResult; +} + +/** + HELPERS +*/ + +/** + RESOURCE RECORDS +*/ + +/* + MDNSResponder::_readRRQuestion + + Reads a question (eg. MyESP._http._tcp.local ANY IN) from the UPD input buffer. + +*/ +bool MDNSResponder::_readRRQuestion(MDNSResponder::stcMDNS_RRQuestion& p_rRRQuestion) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion\n"));); + + bool bResult = false; + + if ((bResult = _readRRHeader(p_rRRQuestion.m_Header))) + { + // Extract unicast flag from class field + p_rRRQuestion.m_bUnicast = (p_rRRQuestion.m_Header.m_Attributes.m_u16Class & 0x8000); + p_rRRQuestion.m_Header.m_Attributes.m_u16Class &= (~0x8000); + + DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion ")); + _printRRDomain(p_rRRQuestion.m_Header.m_Domain); + DEBUG_OUTPUT.printf_P(PSTR(" Type:0x%04X Class:0x%04X %s\n"), (unsigned)p_rRRQuestion.m_Header.m_Attributes.m_u16Type, (unsigned)p_rRRQuestion.m_Header.m_Attributes.m_u16Class, (p_rRRQuestion.m_bUnicast ? "Unicast" : "Multicast")); + ); + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRQuestion: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_readRRAnswer + + Reads an answer (eg. _http._tcp.local PTR OP TTL MyESP._http._tcp.local) + from the UDP input buffer. + After reading the domain and type info, the further processing of the answer + is transferred the answer specific reading functions. + Unknown answer types are processed by the generic answer reader (to remove them + from the input buffer). + +*/ +bool MDNSResponder::_readRRAnswer(MDNSResponder::stcMDNS_RRAnswer*& p_rpRRAnswer) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer\n"));); + + bool bResult = false; + + stcMDNS_RRHeader header; + uint32_t u32TTL; + uint16_t u16RDLength; + if ((_readRRHeader(header)) && + (_udpRead32(u32TTL)) && + (_udpRead16(u16RDLength))) + { + + /* DEBUG_EX_INFO( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: Reading 0x%04X answer (class:0x%04X, TTL:%u, RDLength:%u) for "), header.m_Attributes.m_u16Type, header.m_Attributes.m_u16Class, u32TTL, u16RDLength); + _printRRDomain(header.m_Domain); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + );*/ + + switch (header.m_Attributes.m_u16Type & (~0x8000)) // Topmost bit might carry 'cache flush' flag + { +#ifdef MDNS_IP4_SUPPORT + case DNS_RRTYPE_A: + p_rpRRAnswer = new stcMDNS_RRAnswerA(header, u32TTL); + bResult = _readRRAnswerA(*(stcMDNS_RRAnswerA*&)p_rpRRAnswer, u16RDLength); + break; +#endif + case DNS_RRTYPE_PTR: + p_rpRRAnswer = new stcMDNS_RRAnswerPTR(header, u32TTL); + bResult = _readRRAnswerPTR(*(stcMDNS_RRAnswerPTR*&)p_rpRRAnswer, u16RDLength); + break; + case DNS_RRTYPE_TXT: + p_rpRRAnswer = new stcMDNS_RRAnswerTXT(header, u32TTL); + bResult = _readRRAnswerTXT(*(stcMDNS_RRAnswerTXT*&)p_rpRRAnswer, u16RDLength); + break; +#ifdef MDNS_IP6_SUPPORT + case DNS_RRTYPE_AAAA: + p_rpRRAnswer = new stcMDNS_RRAnswerAAAA(header, u32TTL); + bResult = _readRRAnswerAAAA(*(stcMDNS_RRAnswerAAAA*&)p_rpRRAnswer, u16RDLength); + break; +#endif + case DNS_RRTYPE_SRV: + p_rpRRAnswer = new stcMDNS_RRAnswerSRV(header, u32TTL); + bResult = _readRRAnswerSRV(*(stcMDNS_RRAnswerSRV*&)p_rpRRAnswer, u16RDLength); + break; + default: + p_rpRRAnswer = new stcMDNS_RRAnswerGeneric(header, u32TTL); + bResult = _readRRAnswerGeneric(*(stcMDNS_RRAnswerGeneric*&)p_rpRRAnswer, u16RDLength); + break; + } + DEBUG_EX_INFO( + if ((bResult) && + (p_rpRRAnswer)) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: ")); + _printRRDomain(p_rpRRAnswer->m_Header.m_Domain); + DEBUG_OUTPUT.printf_P(PSTR(" Type:0x%04X Class:0x%04X TTL:%u, RDLength:%u "), p_rpRRAnswer->m_Header.m_Attributes.m_u16Type, p_rpRRAnswer->m_Header.m_Attributes.m_u16Class, p_rpRRAnswer->m_u32TTL, u16RDLength); + switch (header.m_Attributes.m_u16Type & (~0x8000)) // Topmost bit might carry 'cache flush' flag + { +#ifdef MDNS_IP4_SUPPORT + case DNS_RRTYPE_A: + DEBUG_OUTPUT.printf_P(PSTR("A IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); + break; +#endif + case DNS_RRTYPE_PTR: + DEBUG_OUTPUT.printf_P(PSTR("PTR ")); + _printRRDomain(((stcMDNS_RRAnswerPTR*&)p_rpRRAnswer)->m_PTRDomain); + break; + case DNS_RRTYPE_TXT: + { + size_t stTxtLength = ((stcMDNS_RRAnswerTXT*&)p_rpRRAnswer)->m_Txts.c_strLength(); + char* pTxts = new char[stTxtLength]; + if (pTxts) + { + ((stcMDNS_RRAnswerTXT*&)p_rpRRAnswer)->m_Txts.c_str(pTxts); + DEBUG_OUTPUT.printf_P(PSTR("TXT(%u) %s"), stTxtLength, pTxts); + delete[] pTxts; + } + break; + } +#ifdef MDNS_IP6_SUPPORT + case DNS_RRTYPE_AAAA: + DEBUG_OUTPUT.printf_P(PSTR("AAAA IP:%s"), ((stcMDNS_RRAnswerA*&)p_rpRRAnswer)->m_IPAddress.toString().c_str()); + break; +#endif + case DNS_RRTYPE_SRV: + DEBUG_OUTPUT.printf_P(PSTR("SRV Port:%u "), ((stcMDNS_RRAnswerSRV*&)p_rpRRAnswer)->m_u16Port); + _printRRDomain(((stcMDNS_RRAnswerSRV*&)p_rpRRAnswer)->m_SRVDomain); + break; + default: + DEBUG_OUTPUT.printf_P(PSTR("generic ")); + break; + } + DEBUG_OUTPUT.printf_P(PSTR("\n")); + } + else + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: FAILED to read specific answer of type 0x%04X!\n"), p_rpRRAnswer->m_Header.m_Attributes.m_u16Type); + } + ); // DEBUG_EX_INFO + } + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswer: FAILED!\n"));); + return bResult; +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::_readRRAnswerA +*/ +bool MDNSResponder::_readRRAnswerA(MDNSResponder::stcMDNS_RRAnswerA& p_rRRAnswerA, + uint16_t p_u16RDLength) +{ + + uint32_t u32IP4Address; + bool bResult = ((MDNS_IP4_SIZE == p_u16RDLength) && + (_udpReadBuffer((unsigned char*)&u32IP4Address, MDNS_IP4_SIZE)) && + ((p_rRRAnswerA.m_IPAddress = IPAddress(u32IP4Address)))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerA: FAILED!\n"));); + return bResult; +} +#endif + +/* + MDNSResponder::_readRRAnswerPTR +*/ +bool MDNSResponder::_readRRAnswerPTR(MDNSResponder::stcMDNS_RRAnswerPTR& p_rRRAnswerPTR, + uint16_t p_u16RDLength) +{ + + bool bResult = ((p_u16RDLength) && + (_readRRDomain(p_rRRAnswerPTR.m_PTRDomain))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerPTR: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_readRRAnswerTXT + + Read TXT items from a buffer like 4c#=15ff=20 +*/ +bool MDNSResponder::_readRRAnswerTXT(MDNSResponder::stcMDNS_RRAnswerTXT& p_rRRAnswerTXT, + uint16_t p_u16RDLength) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: RDLength:%u\n"), p_u16RDLength);); + bool bResult = true; + + p_rRRAnswerTXT.clear(); + if (p_u16RDLength) + { + bResult = false; + + unsigned char* pucBuffer = new unsigned char[p_u16RDLength]; + if (pucBuffer) + { + if (_udpReadBuffer(pucBuffer, p_u16RDLength)) + { + bResult = true; + + const unsigned char* pucCursor = pucBuffer; + while ((pucCursor < (pucBuffer + p_u16RDLength)) && + (bResult)) + { + bResult = false; + + stcMDNSServiceTxt* pTxt = 0; + unsigned char ucLength = *pucCursor++; // Length of the next txt item + if (ucLength) + { + DEBUG_EX_INFO( + static char sacBuffer[64]; *sacBuffer = 0; + uint8_t u8MaxLength = ((ucLength > (sizeof(sacBuffer) - 1)) ? (sizeof(sacBuffer) - 1) : ucLength); + os_strncpy(sacBuffer, (const char*)pucCursor, u8MaxLength); sacBuffer[u8MaxLength] = 0; + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: Item(%u): %s\n"), ucLength, sacBuffer); + ); + + unsigned char* pucEqualSign = (unsigned char*)os_strchr((const char*)pucCursor, '='); // Position of the '=' sign + unsigned char ucKeyLength; + if ((pucEqualSign) && + ((ucKeyLength = (pucEqualSign - pucCursor)))) + { + unsigned char ucValueLength = (ucLength - (pucEqualSign - pucCursor + 1)); + bResult = (((pTxt = new stcMDNSServiceTxt)) && + (pTxt->setKey((const char*)pucCursor, ucKeyLength)) && + (pTxt->setValue((const char*)(pucEqualSign + 1), ucValueLength))); + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: INVALID TXT format (No '=')!\n"));); + } + pucCursor += ucLength; + } + else // no/zero length TXT + { + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: TXT answer contains no items.\n"));); + bResult = true; + } + + if ((bResult) && + (pTxt)) // Everythings fine so far + { + // Link TXT item to answer TXTs + pTxt->m_pNext = p_rRRAnswerTXT.m_Txts.m_pTxts; + p_rRRAnswerTXT.m_Txts.m_pTxts = pTxt; + } + else // At least no TXT (migth be OK, if length was 0) OR an error + { + if (!bResult) + { + DEBUG_EX_ERR( + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to read TXT item!\n")); + DEBUG_OUTPUT.printf_P(PSTR("RData dump:\n")); + _udpDump((m_pUDPContext->tell() - p_u16RDLength), p_u16RDLength); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + ); + } + if (pTxt) + { + delete pTxt; + pTxt = 0; + } + p_rRRAnswerTXT.clear(); + } + } // while + + DEBUG_EX_ERR( + if (!bResult) // Some failure + { + DEBUG_OUTPUT.printf_P(PSTR("RData dump:\n")); + _udpDump((m_pUDPContext->tell() - p_u16RDLength), p_u16RDLength); + DEBUG_OUTPUT.printf_P(PSTR("\n")); + } + ); + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to read TXT content!\n"));); + } + // Clean up + delete[] pucBuffer; + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED to alloc buffer for TXT content!\n"));); + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: WARNING! No content!\n"));); + } + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerTXT: FAILED!\n"));); + return bResult; +} + +#ifdef MDNS_IP6_SUPPORT +bool MDNSResponder::_readRRAnswerAAAA(MDNSResponder::stcMDNS_RRAnswerAAAA& p_rRRAnswerAAAA, + uint16_t p_u16RDLength) +{ + bool bResult = false; + // TODO: Implement + return bResult; +} +#endif + +/* + MDNSResponder::_readRRAnswerSRV +*/ +bool MDNSResponder::_readRRAnswerSRV(MDNSResponder::stcMDNS_RRAnswerSRV& p_rRRAnswerSRV, + uint16_t p_u16RDLength) +{ + + bool bResult = (((3 * sizeof(uint16_t)) < p_u16RDLength) && + (_udpRead16(p_rRRAnswerSRV.m_u16Priority)) && + (_udpRead16(p_rRRAnswerSRV.m_u16Weight)) && + (_udpRead16(p_rRRAnswerSRV.m_u16Port)) && + (_readRRDomain(p_rRRAnswerSRV.m_SRVDomain))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerSRV: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_readRRAnswerGeneric +*/ +bool MDNSResponder::_readRRAnswerGeneric(MDNSResponder::stcMDNS_RRAnswerGeneric& p_rRRAnswerGeneric, + uint16_t p_u16RDLength) +{ + bool bResult = (0 == p_u16RDLength); + + p_rRRAnswerGeneric.clear(); + if (((p_rRRAnswerGeneric.m_u16RDLength = p_u16RDLength)) && + ((p_rRRAnswerGeneric.m_pu8RDData = new unsigned char[p_rRRAnswerGeneric.m_u16RDLength]))) + { + + bResult = _udpReadBuffer(p_rRRAnswerGeneric.m_pu8RDData, p_rRRAnswerGeneric.m_u16RDLength); + } + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAnswerGeneric: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_readRRHeader +*/ +bool MDNSResponder::_readRRHeader(MDNSResponder::stcMDNS_RRHeader& p_rRRHeader) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRHeader\n"));); + + bool bResult = ((_readRRDomain(p_rRRHeader.m_Domain)) && + (_readRRAttributes(p_rRRHeader.m_Attributes))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRHeader: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_readRRDomain + + Reads a (maybe multilevel compressed) domain from the UDP input buffer. + +*/ +bool MDNSResponder::_readRRDomain(MDNSResponder::stcMDNS_RRDomain& p_rRRDomain) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain\n"));); + + bool bResult = ((p_rRRDomain.clear()) && + (_readRRDomain_Loop(p_rRRDomain, 0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_readRRDomain_Loop + + Reads a domain from the UDP input buffer. For every compression level, the functions + calls itself recursively. To avoid endless recursion because of malformed MDNS records, + the maximum recursion depth is set by MDNS_DOMAIN_MAX_REDIRCTION. + +*/ +bool MDNSResponder::_readRRDomain_Loop(MDNSResponder::stcMDNS_RRDomain& p_rRRDomain, + uint8_t p_u8Depth) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u)\n"), p_u8Depth);); + + bool bResult = false; + + if (MDNS_DOMAIN_MAX_REDIRCTION >= p_u8Depth) + { + bResult = true; + + uint8_t u8Len = 0; + do + { + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Offset:%u p0:%02x\n"), p_u8Depth, m_pUDPContext->tell(), m_pUDPContext->peek());); + _udpRead8(u8Len); + + if (u8Len & MDNS_DOMAIN_COMPRESS_MARK) + { + // Compressed label(s) + uint16_t u16Offset = ((u8Len & ~MDNS_DOMAIN_COMPRESS_MARK) << 8); // Implicit BE to LE conversion! + _udpRead8(u8Len); + u16Offset |= u8Len; + + if (m_pUDPContext->isValidOffset(u16Offset)) + { + size_t stCurrentPosition = m_pUDPContext->tell(); // Prepare return from recursion + + //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Redirecting from %u to %u!\n"), p_u8Depth, stCurrentPosition, u16Offset);); + m_pUDPContext->seek(u16Offset); + if (_readRRDomain_Loop(p_rRRDomain, p_u8Depth + 1)) // Do recursion + { + //DEBUG_EX_RX(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Succeeded to read redirected label! Returning to %u\n"), p_u8Depth, stCurrentPosition);); + m_pUDPContext->seek(stCurrentPosition); // Restore after recursion + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): FAILED to read redirected label!\n"), p_u8Depth);); + bResult = false; + } + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): INVALID offset in redirection!\n"), p_u8Depth);); + bResult = false; + } + break; + } + else + { + // Normal (uncompressed) label (maybe '\0' only) + if (MDNS_DOMAIN_MAXLENGTH > (p_rRRDomain.m_u16NameLength + u8Len)) + { + // Add length byte + p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength] = u8Len; + ++(p_rRRDomain.m_u16NameLength); + if (u8Len) // Add name + { + if ((bResult = _udpReadBuffer((unsigned char*) & (p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength]), u8Len))) + { + /* DEBUG_EX_INFO( + p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength + u8Len] = 0; // Closing '\0' for printing + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): Domain label (%u): %s\n"), p_u8Depth, (unsigned)(p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength - 1]), &(p_rRRDomain.m_acName[p_rRRDomain.m_u16NameLength])); + );*/ + + p_rRRDomain.m_u16NameLength += u8Len; + } + } + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(2) offset:%u p0:%x\n"), m_pUDPContext->tell(), m_pUDPContext->peek());); + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): ERROR! Domain name too long (%u + %u)!\n"), p_u8Depth, p_rRRDomain.m_u16NameLength, u8Len);); + bResult = false; + break; + } + } + } while ((bResult) && + (0 != u8Len)); + } + else + { + DEBUG_EX_ERR(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRDomain_Loop(%u): ERROR! Too many redirections!\n"), p_u8Depth);); + } + return bResult; +} + +/* + MDNSResponder::_readRRAttributes +*/ +bool MDNSResponder::_readRRAttributes(MDNSResponder::stcMDNS_RRAttributes& p_rRRAttributes) +{ + //DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAttributes\n"));); + + bool bResult = ((_udpRead16(p_rRRAttributes.m_u16Type)) && + (_udpRead16(p_rRRAttributes.m_u16Class))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readRRAttributes: FAILED!\n"));); + return bResult; +} + + +/* + DOMAIN NAMES +*/ + +/* + MDNSResponder::_buildDomainForHost + + Builds a MDNS host domain (eg. esp8266.local) for the given hostname. + +*/ +bool MDNSResponder::_buildDomainForHost(const char* p_pcHostname, + MDNSResponder::stcMDNS_RRDomain& p_rHostDomain) const +{ + + p_rHostDomain.clear(); + bool bResult = ((p_pcHostname) && + (*p_pcHostname) && + (p_rHostDomain.addLabel(p_pcHostname)) && + (p_rHostDomain.addLabel(scpcLocal)) && + (p_rHostDomain.addLabel(0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForHost: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_buildDomainForDNSSD + + Builds the '_services._dns-sd._udp.local' domain. + Used while detecting generic service enum question (DNS-SD) and answering these questions. + +*/ +bool MDNSResponder::_buildDomainForDNSSD(MDNSResponder::stcMDNS_RRDomain& p_rDNSSDDomain) const +{ + + p_rDNSSDDomain.clear(); + bool bResult = ((p_rDNSSDDomain.addLabel(scpcServices, true)) && + (p_rDNSSDDomain.addLabel(scpcDNSSD, true)) && + (p_rDNSSDDomain.addLabel(scpcUDP, true)) && + (p_rDNSSDDomain.addLabel(scpcLocal)) && + (p_rDNSSDDomain.addLabel(0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForDNSSD: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_buildDomainForService + + Builds the domain for the given service (eg. _http._tcp.local or + MyESP._http._tcp.local (if p_bIncludeName is set)). + +*/ +bool MDNSResponder::_buildDomainForService(const MDNSResponder::stcMDNSService& p_Service, + bool p_bIncludeName, + MDNSResponder::stcMDNS_RRDomain& p_rServiceDomain) const +{ + + p_rServiceDomain.clear(); + bool bResult = (((!p_bIncludeName) || + (p_rServiceDomain.addLabel(p_Service.m_pcName))) && + (p_rServiceDomain.addLabel(p_Service.m_pcService, true)) && + (p_rServiceDomain.addLabel(p_Service.m_pcProtocol, true)) && + (p_rServiceDomain.addLabel(scpcLocal)) && + (p_rServiceDomain.addLabel(0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForService: FAILED!\n"));); + return bResult; +} + +/* + MDNSResponder::_buildDomainForService + + Builds the domain for the given service properties (eg. _http._tcp.local). + The usual prepended '_' are added, if missing in the input strings. + +*/ +bool MDNSResponder::_buildDomainForService(const char* p_pcService, + const char* p_pcProtocol, + MDNSResponder::stcMDNS_RRDomain& p_rServiceDomain) const +{ + + p_rServiceDomain.clear(); + bool bResult = ((p_pcService) && + (p_pcProtocol) && + (p_rServiceDomain.addLabel(p_pcService, ('_' != *p_pcService))) && + (p_rServiceDomain.addLabel(p_pcProtocol, ('_' != *p_pcProtocol))) && + (p_rServiceDomain.addLabel(scpcLocal)) && + (p_rServiceDomain.addLabel(0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForService: FAILED for (%s.%s)!\n"), (p_pcService ? : "-"), (p_pcProtocol ? : "-"));); + return bResult; +} + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::_buildDomainForReverseIP4 + + The IP4 address is stringized by printing the four address bytes into a char buffer in reverse order + and adding 'in-addr.arpa' (eg. 012.789.456.123.in-addr.arpa). + Used while detecting reverse IP4 questions and answering these +*/ +bool MDNSResponder::_buildDomainForReverseIP4(IPAddress p_IP4Address, + MDNSResponder::stcMDNS_RRDomain& p_rReverseIP4Domain) const +{ + + bool bResult = true; + + p_rReverseIP4Domain.clear(); + + char acBuffer[32]; + for (int i = MDNS_IP4_SIZE; ((bResult) && (i >= 1)); --i) + { + itoa(p_IP4Address[i - 1], acBuffer, 10); + bResult = p_rReverseIP4Domain.addLabel(acBuffer); + } + bResult = ((bResult) && + (p_rReverseIP4Domain.addLabel(scpcReverseIP4Domain)) && + (p_rReverseIP4Domain.addLabel(scpcReverseTopDomain)) && + (p_rReverseIP4Domain.addLabel(0))); + DEBUG_EX_ERR(if (!bResult) DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _buildDomainForReverseIP4: FAILED!\n"));); + return bResult; +} +#endif + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::_buildDomainForReverseIP6 + + Used while detecting reverse IP6 questions and answering these +*/ +bool MDNSResponder::_buildDomainForReverseIP6(IPAddress p_IP4Address, + MDNSResponder::stcMDNS_RRDomain& p_rReverseIP6Domain) const +{ + // TODO: Implement + return false; +} +#endif + + +/* + UDP +*/ + +/* + MDNSResponder::_udpReadBuffer +*/ +bool MDNSResponder::_udpReadBuffer(unsigned char* p_pBuffer, + size_t p_stLength) +{ + + bool bResult = ((m_pUDPContext) && + (true/*m_pUDPContext->getSize() > p_stLength*/) && + (p_pBuffer) && + (p_stLength) && + ((p_stLength == m_pUDPContext->read((char*)p_pBuffer, p_stLength)))); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _udpReadBuffer: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_udpRead8 +*/ +bool MDNSResponder::_udpRead8(uint8_t& p_ru8Value) +{ + + return _udpReadBuffer((unsigned char*)&p_ru8Value, sizeof(p_ru8Value)); +} + +/* + MDNSResponder::_udpRead16 +*/ +bool MDNSResponder::_udpRead16(uint16_t& p_ru16Value) +{ + + bool bResult = false; + + if (_udpReadBuffer((unsigned char*)&p_ru16Value, sizeof(p_ru16Value))) + { + p_ru16Value = lwip_ntohs(p_ru16Value); + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::_udpRead32 +*/ +bool MDNSResponder::_udpRead32(uint32_t& p_ru32Value) +{ + + bool bResult = false; + + if (_udpReadBuffer((unsigned char*)&p_ru32Value, sizeof(p_ru32Value))) + { + p_ru32Value = lwip_ntohl(p_ru32Value); + bResult = true; + } + return bResult; +} + +/* + MDNSResponder::_udpAppendBuffer +*/ +bool MDNSResponder::_udpAppendBuffer(const unsigned char* p_pcBuffer, + size_t p_stLength) +{ + + bool bResult = ((m_pUDPContext) && + (p_pcBuffer) && + (p_stLength) && + (p_stLength == m_pUDPContext->append((const char*)p_pcBuffer, p_stLength))); + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _udpAppendBuffer: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_udpAppend8 +*/ +bool MDNSResponder::_udpAppend8(uint8_t p_u8Value) +{ + + return (_udpAppendBuffer((unsigned char*)&p_u8Value, sizeof(p_u8Value))); +} + +/* + MDNSResponder::_udpAppend16 +*/ +bool MDNSResponder::_udpAppend16(uint16_t p_u16Value) +{ + + p_u16Value = lwip_htons(p_u16Value); + return (_udpAppendBuffer((unsigned char*)&p_u16Value, sizeof(p_u16Value))); +} + +/* + MDNSResponder::_udpAppend32 +*/ +bool MDNSResponder::_udpAppend32(uint32_t p_u32Value) +{ + + p_u32Value = lwip_htonl(p_u32Value); + return (_udpAppendBuffer((unsigned char*)&p_u32Value, sizeof(p_u32Value))); +} + +#ifdef DEBUG_ESP_MDNS_RESPONDER +/* + MDNSResponder::_udpDump +*/ +bool MDNSResponder::_udpDump(bool p_bMovePointer /*= false*/) +{ + + const uint8_t cu8BytesPerLine = 16; + + uint32_t u32StartPosition = m_pUDPContext->tell(); + DEBUG_OUTPUT.println("UDP Context Dump:"); + uint32_t u32Counter = 0; + uint8_t u8Byte = 0; + + while (_udpRead8(u8Byte)) + { + DEBUG_OUTPUT.printf_P(PSTR("%02x %s"), u8Byte, ((++u32Counter % cu8BytesPerLine) ? "" : "\n")); + } + DEBUG_OUTPUT.printf_P(PSTR("%sDone: %u bytes\n"), (((u32Counter) && (u32Counter % cu8BytesPerLine)) ? "\n" : ""), u32Counter); + + if (!p_bMovePointer) // Restore + { + m_pUDPContext->seek(u32StartPosition); + } + return true; +} + +/* + MDNSResponder::_udpDump +*/ +bool MDNSResponder::_udpDump(unsigned p_uOffset, + unsigned p_uLength) +{ + + if ((m_pUDPContext) && + (m_pUDPContext->isValidOffset(p_uOffset))) + { + unsigned uCurrentPosition = m_pUDPContext->tell(); // Remember start position + + m_pUDPContext->seek(p_uOffset); + uint8_t u8Byte; + for (unsigned u = 0; ((u < p_uLength) && (_udpRead8(u8Byte))); ++u) + { + DEBUG_OUTPUT.printf_P(PSTR("%02x "), u8Byte); + } + // Return to start position + m_pUDPContext->seek(uCurrentPosition); + } + return true; +} +#endif + + +/** + READ/WRITE MDNS STRUCTS +*/ + +/* + MDNSResponder::_readMDNSMsgHeader + + Read a MDNS header from the UDP input buffer. + | 8 | 8 | 8 | 8 | + 00| Identifier | Flags & Codes | + 01| Question count | Answer count | + 02| NS answer count | Ad answer count | + + All 16-bit and 32-bit elements need to be translated form network coding to host coding (done in _udpRead16 and _udpRead32) + In addition, bitfield memory order is undefined in C standard (GCC doesn't order them in the coded direction...), so they + need some mapping here +*/ +bool MDNSResponder::_readMDNSMsgHeader(MDNSResponder::stcMDNS_MsgHeader& p_rMsgHeader) +{ + + bool bResult = false; + + uint8_t u8B1; + uint8_t u8B2; + if ((_udpRead16(p_rMsgHeader.m_u16ID)) && + (_udpRead8(u8B1)) && + (_udpRead8(u8B2)) && + (_udpRead16(p_rMsgHeader.m_u16QDCount)) && + (_udpRead16(p_rMsgHeader.m_u16ANCount)) && + (_udpRead16(p_rMsgHeader.m_u16NSCount)) && + (_udpRead16(p_rMsgHeader.m_u16ARCount))) + { + + p_rMsgHeader.m_1bQR = (u8B1 & 0x80); // Query/Responde flag + p_rMsgHeader.m_4bOpcode = (u8B1 & 0x78); // Operation code (0: Standard query, others ignored) + p_rMsgHeader.m_1bAA = (u8B1 & 0x04); // Authorative answer + p_rMsgHeader.m_1bTC = (u8B1 & 0x02); // Truncation flag + p_rMsgHeader.m_1bRD = (u8B1 & 0x01); // Recursion desired + + p_rMsgHeader.m_1bRA = (u8B2 & 0x80); // Recursion available + p_rMsgHeader.m_3bZ = (u8B2 & 0x70); // Zero + p_rMsgHeader.m_4bRCode = (u8B2 & 0x0F); // Response code + + /* DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readMDNSMsgHeader: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), + (unsigned)p_rMsgHeader.m_u16ID, + (unsigned)p_rMsgHeader.m_1bQR, (unsigned)p_rMsgHeader.m_4bOpcode, (unsigned)p_rMsgHeader.m_1bAA, (unsigned)p_rMsgHeader.m_1bTC, (unsigned)p_rMsgHeader.m_1bRD, + (unsigned)p_rMsgHeader.m_1bRA, (unsigned)p_rMsgHeader.m_4bRCode, + (unsigned)p_rMsgHeader.m_u16QDCount, + (unsigned)p_rMsgHeader.m_u16ANCount, + (unsigned)p_rMsgHeader.m_u16NSCount, + (unsigned)p_rMsgHeader.m_u16ARCount););*/ + bResult = true; + } + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _readMDNSMsgHeader: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_write8 +*/ +bool MDNSResponder::_write8(uint8_t p_u8Value, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + return ((_udpAppend8(p_u8Value)) && + (p_rSendParameter.shiftOffset(sizeof(p_u8Value)))); +} + +/* + MDNSResponder::_write16 +*/ +bool MDNSResponder::_write16(uint16_t p_u16Value, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + return ((_udpAppend16(p_u16Value)) && + (p_rSendParameter.shiftOffset(sizeof(p_u16Value)))); +} + +/* + MDNSResponder::_write32 +*/ +bool MDNSResponder::_write32(uint32_t p_u32Value, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + return ((_udpAppend32(p_u32Value)) && + (p_rSendParameter.shiftOffset(sizeof(p_u32Value)))); +} + +/* + MDNSResponder::_writeMDNSMsgHeader + + Write MDNS header to the UDP output buffer. + + All 16-bit and 32-bit elements need to be translated form host coding to network coding (done in _udpAppend16 and _udpAppend32) + In addition, bitfield memory order is undefined in C standard (GCC doesn't order them in the coded direction...), so they + need some mapping here +*/ +bool MDNSResponder::_writeMDNSMsgHeader(const MDNSResponder::stcMDNS_MsgHeader& p_MsgHeader, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + /* DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSMsgHeader: ID:%u QR:%u OP:%u AA:%u TC:%u RD:%u RA:%u R:%u QD:%u AN:%u NS:%u AR:%u\n"), + (unsigned)p_MsgHeader.m_u16ID, + (unsigned)p_MsgHeader.m_1bQR, (unsigned)p_MsgHeader.m_4bOpcode, (unsigned)p_MsgHeader.m_1bAA, (unsigned)p_MsgHeader.m_1bTC, (unsigned)p_MsgHeader.m_1bRD, + (unsigned)p_MsgHeader.m_1bRA, (unsigned)p_MsgHeader.m_4bRCode, + (unsigned)p_MsgHeader.m_u16QDCount, + (unsigned)p_MsgHeader.m_u16ANCount, + (unsigned)p_MsgHeader.m_u16NSCount, + (unsigned)p_MsgHeader.m_u16ARCount););*/ + + uint8_t u8B1((p_MsgHeader.m_1bQR << 7) | (p_MsgHeader.m_4bOpcode << 3) | (p_MsgHeader.m_1bAA << 2) | (p_MsgHeader.m_1bTC << 1) | (p_MsgHeader.m_1bRD)); + uint8_t u8B2((p_MsgHeader.m_1bRA << 7) | (p_MsgHeader.m_3bZ << 4) | (p_MsgHeader.m_4bRCode)); + bool bResult = ((_write16(p_MsgHeader.m_u16ID, p_rSendParameter)) && + (_write8(u8B1, p_rSendParameter)) && + (_write8(u8B2, p_rSendParameter)) && + (_write16(p_MsgHeader.m_u16QDCount, p_rSendParameter)) && + (_write16(p_MsgHeader.m_u16ANCount, p_rSendParameter)) && + (_write16(p_MsgHeader.m_u16NSCount, p_rSendParameter)) && + (_write16(p_MsgHeader.m_u16ARCount, p_rSendParameter))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSMsgHeader: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_writeRRAttributes +*/ +bool MDNSResponder::_writeMDNSRRAttributes(const MDNSResponder::stcMDNS_RRAttributes& p_Attributes, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + bool bResult = ((_write16(p_Attributes.m_u16Type, p_rSendParameter)) && + (_write16(p_Attributes.m_u16Class, p_rSendParameter))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSRRAttributes: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_writeMDNSRRDomain +*/ +bool MDNSResponder::_writeMDNSRRDomain(const MDNSResponder::stcMDNS_RRDomain& p_Domain, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + bool bResult = ((_udpAppendBuffer((const unsigned char*)p_Domain.m_acName, p_Domain.m_u16NameLength)) && + (p_rSendParameter.shiftOffset(p_Domain.m_u16NameLength))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSRRDomain: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_writeMDNSHostDomain + + Write a host domain to the UDP output buffer. + If the domain record is part of the answer, the records length is + prepended (p_bPrependRDLength is set). + + A very simple form of name compression is applied here: + If the domain is written to the UDP output buffer, the write offset is stored + together with a domain id (the pointer) in a p_rSendParameter substructure (cache). + If the same domain (pointer) should be written to the UDP output later again, + the old offset is retrieved from the cache, marked as a compressed domain offset + and written to the output buffer. + +*/ +bool MDNSResponder::_writeMDNSHostDomain(const char* p_pcHostname, + bool p_bPrependRDLength, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + // The 'skip-compression' version is handled in '_writeMDNSAnswer_SRV' + uint16_t u16CachedDomainOffset = p_rSendParameter.findCachedDomainOffset((const void*)p_pcHostname, false); + + stcMDNS_RRDomain hostDomain; + bool bResult = (u16CachedDomainOffset + // Found cached domain -> mark as compressed domain + ? ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset + ((!p_bPrependRDLength) || + (_write16(2, p_rSendParameter))) && // Length of 'Cxxx' + (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) + (_write8((uint8_t)(u16CachedDomainOffset & 0xFF), p_rSendParameter))) + // No cached domain -> add this domain to cache and write full domain name + : ((_buildDomainForHost(p_pcHostname, hostDomain)) && // eg. esp8266.local + ((!p_bPrependRDLength) || + (_write16(hostDomain.m_u16NameLength, p_rSendParameter))) && // RDLength (if needed) + (p_rSendParameter.addDomainCacheItem((const void*)p_pcHostname, false, p_rSendParameter.m_u16Offset)) && + (_writeMDNSRRDomain(hostDomain, p_rSendParameter)))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSHostDomain: FAILED!\n")); + }); + return bResult; + +} + +/* + MDNSResponder::_writeMDNSServiceDomain + + Write a service domain to the UDP output buffer. + If the domain record is part of the answer, the records length is + prepended (p_bPrependRDLength is set). + + A very simple form of name compression is applied here: see '_writeMDNSHostDomain' + The cache differentiates of course between service domains which includes + the instance name (p_bIncludeName is set) and thoose who don't. + +*/ +bool MDNSResponder::_writeMDNSServiceDomain(const MDNSResponder::stcMDNSService& p_Service, + bool p_bIncludeName, + bool p_bPrependRDLength, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + + // The 'skip-compression' version is handled in '_writeMDNSAnswer_SRV' + uint16_t u16CachedDomainOffset = p_rSendParameter.findCachedDomainOffset((const void*)&p_Service, p_bIncludeName); + + stcMDNS_RRDomain serviceDomain; + bool bResult = (u16CachedDomainOffset + // Found cached domain -> mark as compressed domain + ? ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset + ((!p_bPrependRDLength) || + (_write16(2, p_rSendParameter))) && // Lenght of 'Cxxx' + (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) + (_write8((uint8_t)(u16CachedDomainOffset & 0xFF), p_rSendParameter))) + // No cached domain -> add this domain to cache and write full domain name + : ((_buildDomainForService(p_Service, p_bIncludeName, serviceDomain)) && // eg. MyESP._http._tcp.local + ((!p_bPrependRDLength) || + (_write16(serviceDomain.m_u16NameLength, p_rSendParameter))) && // RDLength (if needed) + (p_rSendParameter.addDomainCacheItem((const void*)&p_Service, p_bIncludeName, p_rSendParameter.m_u16Offset)) && + (_writeMDNSRRDomain(serviceDomain, p_rSendParameter)))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSServiceDomain: FAILED!\n")); + }); + return bResult; + +} + +/* + MDNSResponder::_writeMDNSQuestion + + Write a MDNS question to the UDP output buffer + + QNAME (host/service domain, eg. esp8266.local) + QTYPE (16bit, eg. ANY) + QCLASS (16bit, eg. IN) + +*/ +bool MDNSResponder::_writeMDNSQuestion(MDNSResponder::stcMDNS_RRQuestion& p_Question, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSQuestion\n"));); + + bool bResult = ((_writeMDNSRRDomain(p_Question.m_Header.m_Domain, p_rSendParameter)) && + (_writeMDNSRRAttributes(p_Question.m_Header.m_Attributes, p_rSendParameter))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSQuestion: FAILED!\n")); + }); + return bResult; + +} + + +#ifdef MDNS_IP4_SUPPORT +/* + MDNSResponder::_writeMDNSAnswer_A + + Write a MDNS A answer to the UDP output buffer. + + NAME (var, host/service domain, eg. esp8266.local + TYPE (16bit, eg. A) + CLASS (16bit, eg. IN) + TTL (32bit, eg. 120) + RDLENGTH (16bit, eg 4) + RDATA (var, eg. 123.456.789.012) + + eg. esp8266.local A 0x8001 120 4 123.456.789.012 + Ref: http://www.zytrax.com/books/dns/ch8/a.html +*/ +bool MDNSResponder::_writeMDNSAnswer_A(IPAddress p_IPAddress, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_A (%s)\n"), p_IPAddress.toString().c_str());); + + stcMDNS_RRAttributes attributes(DNS_RRTYPE_A, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + const unsigned char aucIPAddress[MDNS_IP4_SIZE] = { p_IPAddress[0], p_IPAddress[1], p_IPAddress[2], p_IPAddress[3] }; + bool bResult = ((_writeMDNSHostDomain(m_pcHostname, false, p_rSendParameter)) && + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL + (_write16(MDNS_IP4_SIZE, p_rSendParameter)) && // RDLength + (_udpAppendBuffer(aucIPAddress, MDNS_IP4_SIZE)) && // RData + (p_rSendParameter.shiftOffset(MDNS_IP4_SIZE))); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_A: FAILED!\n")); + }); + return bResult; + +} + +/* + MDNSResponder::_writeMDNSAnswer_PTR_IP4 + + Write a MDNS reverse IP4 PTR answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + eg. 012.789.456.123.in-addr.arpa PTR 0x8001 120 15 esp8266.local + Used while answering reverse IP4 questions +*/ +bool MDNSResponder::_writeMDNSAnswer_PTR_IP4(IPAddress p_IPAddress, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP4 (%s)\n"), p_IPAddress.toString().c_str());); + + stcMDNS_RRDomain reverseIP4Domain; + stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + stcMDNS_RRDomain hostDomain; + bool bResult = ((_buildDomainForReverseIP4(p_IPAddress, reverseIP4Domain)) && // 012.789.456.123.in-addr.arpa + (_writeMDNSRRDomain(reverseIP4Domain, p_rSendParameter)) && + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL + (_writeMDNSHostDomain(m_pcHostname, true, p_rSendParameter))); // RDLength & RData (host domain, eg. esp8266.local) + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP4: FAILED!\n")); + }); + return bResult; +} +#endif + +/* + MDNSResponder::_writeMDNSAnswer_PTR_TYPE + + Write a MDNS PTR answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + PTR all-services -> service type + eg. _services._dns-sd._udp.local PTR 0x8001 5400 xx _http._tcp.local + http://www.zytrax.com/books/dns/ch8/ptr.html +*/ +bool MDNSResponder::_writeMDNSAnswer_PTR_TYPE(MDNSResponder::stcMDNSService& p_rService, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_TYPE\n"));); + + stcMDNS_RRDomain dnssdDomain; + stcMDNS_RRDomain serviceDomain; + stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, DNS_RRCLASS_IN); // No cache flush! only INternet + bool bResult = ((_buildDomainForDNSSD(dnssdDomain)) && // _services._dns-sd._udp.local + (_writeMDNSRRDomain(dnssdDomain, p_rSendParameter)) && + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL + (_writeMDNSServiceDomain(p_rService, false, true, p_rSendParameter))); // RDLength & RData (service domain, eg. _http._tcp.local) + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_TYPE: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_writeMDNSAnswer_PTR_NAME + + Write a MDNS PTR answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + PTR service type -> service name + eg. _http.tcp.local PTR 0x8001 120 xx myESP._http._tcp.local + http://www.zytrax.com/books/dns/ch8/ptr.html +*/ +bool MDNSResponder::_writeMDNSAnswer_PTR_NAME(MDNSResponder::stcMDNSService& p_rService, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_NAME\n"));); + + stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, DNS_RRCLASS_IN); // No cache flush! only INternet + bool bResult = ((_writeMDNSServiceDomain(p_rService, false, false, p_rSendParameter)) && // _http._tcp.local + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL + (_writeMDNSServiceDomain(p_rService, true, true, p_rSendParameter))); // RDLength & RData (service domain, eg. MyESP._http._tcp.local) + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_NAME: FAILED!\n")); + }); + return bResult; +} + + +/* + MDNSResponder::_writeMDNSAnswer_TXT + + Write a MDNS TXT answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + The TXT items in the RDATA block are 'length byte encoded': [len]vardata + + eg. myESP._http._tcp.local TXT 0x8001 120 4 c#=1 + http://www.zytrax.com/books/dns/ch8/txt.html +*/ +bool MDNSResponder::_writeMDNSAnswer_TXT(MDNSResponder::stcMDNSService& p_rService, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT\n"));); + + bool bResult = false; + + stcMDNS_RRAttributes attributes(DNS_RRTYPE_TXT, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + + if ((_collectServiceTxts(p_rService)) && + (_writeMDNSServiceDomain(p_rService, true, false, p_rSendParameter)) && // MyESP._http._tcp.local + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL + (_write16(p_rService.m_Txts.length(), p_rSendParameter))) // RDLength + { + + bResult = true; + // RData Txts + for (stcMDNSServiceTxt* pTxt = p_rService.m_Txts.m_pTxts; ((bResult) && (pTxt)); pTxt = pTxt->m_pNext) + { + unsigned char ucLengthByte = pTxt->length(); + bResult = ((_udpAppendBuffer((unsigned char*)&ucLengthByte, sizeof(ucLengthByte))) && // Length + (p_rSendParameter.shiftOffset(sizeof(ucLengthByte))) && + ((size_t)os_strlen(pTxt->m_pcKey) == m_pUDPContext->append(pTxt->m_pcKey, os_strlen(pTxt->m_pcKey))) && // Key + (p_rSendParameter.shiftOffset((size_t)os_strlen(pTxt->m_pcKey))) && + (1 == m_pUDPContext->append("=", 1)) && // = + (p_rSendParameter.shiftOffset(1)) && + ((!pTxt->m_pcValue) || + (((size_t)os_strlen(pTxt->m_pcValue) == m_pUDPContext->append(pTxt->m_pcValue, os_strlen(pTxt->m_pcValue))) && // Value + (p_rSendParameter.shiftOffset((size_t)os_strlen(pTxt->m_pcValue)))))); + + DEBUG_EX_ERR(if (!bResult) + { + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT: FAILED to write %sTxt %s=%s!\n"), (pTxt->m_bTemp ? "temp. " : ""), (pTxt->m_pcKey ? : "?"), (pTxt->m_pcValue ? : "?")); + }); + } + } + _releaseTempServiceTxts(p_rService); + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_TXT: FAILED!\n")); + }); + return bResult; +} + +#ifdef MDNS_IP6_SUPPORT +/* + MDNSResponder::_writeMDNSAnswer_AAAA + + Write a MDNS AAAA answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + eg. esp8266.local AAAA 0x8001 120 16 xxxx::xx + http://www.zytrax.com/books/dns/ch8/aaaa.html +*/ +bool MDNSResponder::_writeMDNSAnswer_AAAA(IPAddress p_IPAddress, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_AAAA\n"));); + + stcMDNS_RRAttributes attributes(DNS_RRTYPE_AAAA, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + bool bResult = ((_writeMDNSHostDomain(m_pcHostname, false, p_rSendParameter)) && // esp8266.local + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL + (_write16(MDNS_IP6_SIZE, p_rSendParameter)) && // RDLength + (false /*TODO: IP6 version of: _udpAppendBuffer((uint32_t)p_IPAddress, MDNS_IP4_SIZE)*/)); // RData + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_AAAA: FAILED!\n")); + }); + return bResult; +} + +/* + MDNSResponder::_writeMDNSAnswer_PTR_IP6 + + Write a MDNS reverse IP6 PTR answer to the UDP output buffer. + See: '_writeMDNSAnswer_A' + + eg. xxxx::xx.in6.arpa PTR 0x8001 120 15 esp8266.local + Used while answering reverse IP6 questions +*/ +bool MDNSResponder::_writeMDNSAnswer_PTR_IP6(IPAddress p_IPAddress, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP6\n"));); + + stcMDNS_RRDomain reverseIP6Domain; + stcMDNS_RRAttributes attributes(DNS_RRTYPE_PTR, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + bool bResult = ((_buildDomainForReverseIP6(p_IPAddress, reverseIP6Domain)) && // xxxx::xx.ip6.arpa + (_writeMDNSRRDomain(reverseIP6Domain, p_rSendParameter)) && + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_HOST_TTL), p_rSendParameter)) && // TTL + (_writeMDNSHostDomain(m_pcHostname, true, p_rSendParameter))); // RDLength & RData (host domain, eg. esp8266.local) + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_PTR_IP6: FAILED!\n")); + }); + return bResult; +} +#endif + +/* + MDNSResponder::_writeMDNSAnswer_SRV + + eg. MyESP._http.tcp.local SRV 0x8001 120 0 0 60068 esp8266.local + http://www.zytrax.com/books/dns/ch8/srv.html ???? Include instance name ???? +*/ +bool MDNSResponder::_writeMDNSAnswer_SRV(MDNSResponder::stcMDNSService& p_rService, + MDNSResponder::stcMDNSSendParameter& p_rSendParameter) +{ + DEBUG_EX_INFO(DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_SRV\n"));); + + uint16_t u16CachedDomainOffset = (p_rSendParameter.m_bLegacyQuery + ? 0 + : p_rSendParameter.findCachedDomainOffset((const void*)m_pcHostname, false)); + + stcMDNS_RRAttributes attributes(DNS_RRTYPE_SRV, + ((p_rSendParameter.m_bCacheFlush ? 0x8000 : 0) | DNS_RRCLASS_IN)); // Cache flush? & INternet + stcMDNS_RRDomain hostDomain; + bool bResult = ((_writeMDNSServiceDomain(p_rService, true, false, p_rSendParameter)) && // MyESP._http._tcp.local + (_writeMDNSRRAttributes(attributes, p_rSendParameter)) && // TYPE & CLASS + (_write32((p_rSendParameter.m_bUnannounce ? 0 : MDNS_SERVICE_TTL), p_rSendParameter)) && // TTL + (!u16CachedDomainOffset + // No cache for domain name (or no compression allowed) + ? ((_buildDomainForHost(m_pcHostname, hostDomain)) && + (_write16((sizeof(uint16_t /*Prio*/) + // RDLength + sizeof(uint16_t /*Weight*/) + + sizeof(uint16_t /*Port*/) + + hostDomain.m_u16NameLength), p_rSendParameter)) && // Domain length + (_write16(MDNS_SRV_PRIORITY, p_rSendParameter)) && // Priority + (_write16(MDNS_SRV_WEIGHT, p_rSendParameter)) && // Weight + (_write16(p_rService.m_u16Port, p_rSendParameter)) && // Port + (p_rSendParameter.addDomainCacheItem((const void*)m_pcHostname, false, p_rSendParameter.m_u16Offset)) && + (_writeMDNSRRDomain(hostDomain, p_rSendParameter))) // Host, eg. esp8266.local + // Cache available for domain + : ((MDNS_DOMAIN_COMPRESS_MARK > ((u16CachedDomainOffset >> 8) & ~MDNS_DOMAIN_COMPRESS_MARK)) && // Valid offset + (_write16((sizeof(uint16_t /*Prio*/) + // RDLength + sizeof(uint16_t /*Weight*/) + + sizeof(uint16_t /*Port*/) + + 2), p_rSendParameter)) && // Length of 'C0xx' + (_write16(MDNS_SRV_PRIORITY, p_rSendParameter)) && // Priority + (_write16(MDNS_SRV_WEIGHT, p_rSendParameter)) && // Weight + (_write16(p_rService.m_u16Port, p_rSendParameter)) && // Port + (_write8(((u16CachedDomainOffset >> 8) | MDNS_DOMAIN_COMPRESS_MARK), p_rSendParameter)) && // Compression mark (and offset) + (_write8((uint8_t)u16CachedDomainOffset, p_rSendParameter))))); // Offset + + DEBUG_EX_ERR(if (!bResult) +{ + DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _writeMDNSAnswer_SRV: FAILED!\n")); + }); + return bResult; +} + +} // namespace MDNSImplementation + +} // namespace esp8266 + + + + + + diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_lwIPdefs.h b/libraries/ESP8266mDNS/src/LEAmDNS_lwIPdefs.h index c58aebdc7..a3bcc4b37 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_lwIPdefs.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS_lwIPdefs.h @@ -1,26 +1,26 @@ /* - * LEAmDNS_Priv.h - * - * License (MIT license): - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ + LEAmDNS_Priv.h + + License (MIT license): + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +*/ #ifndef MDNS_LWIPDEFS_H #define MDNS_LWIPDEFS_H diff --git a/tests/restyle-all.sh b/tests/restyle-all.sh deleted file mode 100755 index e751f476d..000000000 --- a/tests/restyle-all.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -set -e - -org=$(cd ${0%/*}; pwd) -cd ${org}/.. -pwd -test -d cores/esp8266 -test -d libraries - -# this warning question will be removed after restyle-all.sh is renamed to restyle.sh -echo "This is dangerous if you have modified your local repository" -echo "type iknowwhatido to continue" -read ans -test "$ans" = iknowwhatido || exit 1 - -for d in cores/esp8266 libraries; do - for e in c cpp h; do - find $d -name "*.$e" -exec \ - astyle \ - --suffix=none \ - --options=${org}/astyle_core.conf {} \; - done -done - -for d in libraries; do - find $d -name "*.ino" -exec \ - astyle \ - --suffix=none \ - --options=${org}/astyle_examples.conf {} \; -done diff --git a/tests/restyle-examples-only.sh b/tests/restyle-examples-only.sh new file mode 100755 index 000000000..513a89190 --- /dev/null +++ b/tests/restyle-examples-only.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +set -e + +org=$(cd ${0%/*}; pwd) +cd ${org}/.. +pwd +test -d cores/esp8266 +test -d libraries + +# in a near future, restyle-all.sh will be renamed to restyle.sh +# and will be checked against CI + +for d in libraries; do + find $d -name "*.ino" -exec \ + astyle \ + --suffix=none \ + --options=${org}/astyle_examples.conf {} \; +done diff --git a/tests/restyle.sh b/tests/restyle.sh index 513a89190..32a18c107 100755 --- a/tests/restyle.sh +++ b/tests/restyle.sh @@ -8,12 +8,21 @@ pwd test -d cores/esp8266 test -d libraries -# in a near future, restyle-all.sh will be renamed to restyle.sh -# and will be checked against CI +#all="cores/esp8266 libraries" +all="libraries/ESP8266mDNS" + +for d in $all; do + for e in c cpp h; do + find $d -name "*.$e" -exec \ + astyle \ + --suffix=none \ + --options=${org}/astyle_core.conf {} \; + done +done for d in libraries; do - find $d -name "*.ino" -exec \ - astyle \ - --suffix=none \ - --options=${org}/astyle_examples.conf {} \; + find $d -name "*.ino" -exec \ + astyle \ + --suffix=none \ + --options=${org}/astyle_examples.conf {} \; done From 405f945d7e72f88f4d7228fdcc7f2df69182744a Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sat, 12 Oct 2019 23:12:49 +0200 Subject: [PATCH 43/58] esptool-2.7 (#6634) --- tools/esptool | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/esptool b/tools/esptool index 9ad444a6e..1319c49ad 160000 --- a/tools/esptool +++ b/tools/esptool @@ -1 +1 @@ -Subproject commit 9ad444a6e06e58833d5e6044c1d5f3eb3dd56023 +Subproject commit 1319c49adb2fe99d2981151ff781930d6ed62729 From 122e87019f35ecb928c00631b6dbd4d581e12105 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 13 Oct 2019 00:32:07 +0200 Subject: [PATCH 44/58] fix because of SoftwareSerial API change (#6635) --- .../examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino b/libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino index 931afe938..5ba217b23 100644 --- a/libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino +++ b/libraries/ESP8266WiFi/examples/WiFiTelnetToSerial/WiFiTelnetToSerial.ino @@ -85,8 +85,9 @@ void setup() { Serial.swap(); // Hardware serial is now on RX:GPIO13 TX:GPIO15 // use SoftwareSerial on regular RX(3)/TX(1) for logging - logger = new SoftwareSerial(3, 1); - logger->begin(BAUD_LOGGER); + logger = new SoftwareSerial(); + logger->begin(BAUD_LOGGER, 3, 1); + logger->enableIntTx(false); logger->println("\n\nUsing SoftwareSerial for logging"); #else logger->begin(BAUD_LOGGER); From 2a5d21597724faa6d65c420b7263c0f8b6f000ce Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Mon, 14 Oct 2019 14:32:41 -0700 Subject: [PATCH 45/58] Reduce the IRAM usage of I2C code by 600-1500 bytes (#6326) * Reduce the IRAM (and heap) usage of I2C code The I2C code takes a large chunk of IRAM space. Attempt to reduce the size of the routines without impacting functionality. First, remove the `static` classifier on the sda/scl variables in the event handlers. The first instructions in the routines overwrite the last value stored in them, anyway, and their addresses are never taken. * Make most variables ints, not uint8_ts Where it doesn't make a functional difference, make global variables ints and not unit8_t. Bytewide updates and extracts require multiple instructions and hence increase IRAM usage as well as runtime. * Make local flag vars int Sketch uses 270855 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27940 bytes (34%) of dynamic memory, leaving 53980 bytes for local variables. Maximum is 81920 bytes. ./xtensa-lx106-elf/bin/xtensa-lx106-elf-objdump -t -j .text1 /tmp/arduino_build_9615/*elf | sort -k1 | head -20 401000cc l F .text1 00000014 twi_delay 401000ec l F .text1 00000020 twi_reply$part$1 4010010c g F .text1 00000035 twi_reply 4010014c g F .text1 00000052 twi_stop 401001a0 g F .text1 0000003b twi_releaseBus 40100204 g F .text1 000001e6 twi_onTwipEvent 40100404 l F .text1 000001f7 onSdaChange 40100608 l F .text1 000002fd onSclChange 40100908 l F .text1 0000003b onTimer * Factor out !scl in onSdaChange If SCL is low then all branches of the case are no-ops, so factor that portion outo to remove some redundant logic in each case. Sketch uses 270843 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27944 bytes (34%) of dynamic memory, leaving 53976 bytes for local variables. Maximum is 81920 bytes. 401000cc l F .text1 00000014 twi_delay 401000ec l F .text1 00000020 twi_reply$part$1 4010010c g F .text1 00000035 twi_reply 4010014c g F .text1 00000052 twi_stop 401001a0 g F .text1 0000003b twi_releaseBus 40100204 g F .text1 000001e6 twi_onTwipEvent 40100404 l F .text1 000001e7 onSdaChange 401005f8 l F .text1 000002fd onSclChange 401008f8 l F .text1 0000003b onTimer 0x0000000040107468 _text_end = ABSOLUTE (.) * Make tiny twi_reply inline twi_reply is a chunk of code that can be inlined and actually save IRAM space because certain conditions acan be statically evaluated by gcc. Sketch uses 270823 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27944 bytes (34%) of dynamic memory, leaving 53976 bytes for local variables. Maximum is 81920 bytes. 401000cc l F .text1 00000014 twi_delay 401000f4 g F .text1 00000052 twi_stop 40100148 g F .text1 0000003b twi_releaseBus 401001b0 g F .text1 00000206 twi_onTwipEvent 401003d0 l F .text1 000001e7 onSdaChange 401005c4 l F .text1 000002fd onSclChange 401008c4 l F .text1 0000003b onTimer 40100918 g F .text1 00000085 millis 401009a0 g F .text1 0000000f micros 401009b0 g F .text1 00000022 micros64 401009d8 g F .text1 00000013 delayMicroseconds 401009f0 g F .text1 00000034 __digitalRead 401009f0 w F .text1 00000034 digitalRead 40100a3c g F .text1 000000e4 interrupt_handler 40100b20 g F .text1 0000000f vPortFree 0x0000000040107434 _text_end = ABSOLUTE (.) * Inline additional twi_** helper functions Sketch uses 270799 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27944 bytes (34%) of dynamic memory, leaving 53976 bytes for local variables. Maximum is 81920 bytes. 401000cc l F .text1 00000014 twi_delay 401000f4 w F .text1 0000003b twi_releaseBus 4010015c g F .text1 00000246 twi_onTwipEvent 401003bc l F .text1 000001e7 onSdaChange 401005b0 l F .text1 000002f9 onSclChange 401008ac l F .text1 0000003b onTimer 0x000000004010741c _text_end = ABSOLUTE (.) * Convert state machine to 1-hot for faster lookup GCC won't use a lookup table for the TWI state machine, so it ends up using a series of straight line compare-jump, compare-jumps to figure out which branch of code to execute for each state. For branches that have multiple states that call them, this can expand to a lot of code. Short-circuit the whole thing by converting the FSM to a 1-hot encoding while executing it, and then just and-ing the 1-hot state with the bitmask of states with the same code. Sketch uses 270719 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27944 bytes (34%) of dynamic memory, leaving 53976 bytes for local variables. Maximum is 81920 bytes. 401000cc l F .text1 00000014 twi_delay 401000f4 w F .text1 0000003b twi_releaseBus 4010015c g F .text1 00000246 twi_onTwipEvent 401003c0 l F .text1 000001b1 onSdaChange 40100580 l F .text1 000002da onSclChange 4010085c l F .text1 0000003b onTimer 0x00000000401073cc _text_end = ABSOLUTE (.) Saves 228 bytes of IRAM vs. master, uses 32 additional bytes of heap. * Factor out twi_status setting twi_status is set immediately before an event handler is called, resulting in lots of duplicated code. Set the twi_status flag inside the handler itself. Saves an add'l ~100 bytes of IRAM from prior changes, for a total of ~340 bytes. earle@server:~/Arduino/hardware/esp8266com/esp8266/tools$ ./xtensa-lx106-elf/bin/xtensa-lx106-elf-objdump -t -j .text1 /tmp/arduino_build_849115/*elf | sort -k1 | head -20 401000cc l F .text1 00000014 twi_delay 401000f4 w F .text1 0000003b twi_releaseBus 40100160 g F .text1 0000024e twi_onTwipEvent 401003c8 l F .text1 00000181 onSdaChange 40100558 l F .text1 00000297 onSclChange * Use a struct to hold globals for TWI Thanks to the suggestion from @mhightower83, move all global objects into a struct. This lets a single base pointer register to be used in place of constantly reloading the address of each individual variable. This might be better expressed by moving this to a real C++ implementaion based on a class object (the twi.xxxx would go back to the old xxx-only naming for vars), but there would then need to be API wrappers since the functionality is exposed through a plain C API. Saves 168 additional code bytes, for a grand total of 550 bytes IRAM. earle@server:~/Arduino/hardware/esp8266com/esp8266/tools$ ./xtensa-lx106-elf/bin/xtensa-lx106-elf-objdump -t -j .text1 /tmp/arduino_build_849115/*elf | sort -k1 | head -20 401000cc l F .text1 00000014 twi_delay 401000e8 w F .text1 00000032 twi_releaseBus 40100128 g F .text1 00000217 twi_onTwipEvent 4010034c l F .text1 00000149 onSdaChange 4010049c l F .text1 00000267 onSclChange 40100704 l F .text1 00000028 onTimer * Use enums for states, move one more var to twi struct Make the TWI states enums and not #defines, in the hope that it will allow GCC to more easily flag problems and general good code organization. 401000cc l F .text1 00000014 twi_delay 401000e8 w F .text1 00000032 twi_releaseBus 40100128 g F .text1 00000217 twi_onTwipEvent 4010034c l F .text1 00000149 onSdaChange 4010049c l F .text1 00000257 onSclChange 401006f4 l F .text1 00000028 onTimer Looks like another 16 bytes IRAM saved from the prior push. Sketch uses 267079 bytes (25%) of program storage space. Maximum is 1044464 bytes. Global variables use 27696 bytes (33%) of dynamic memory, leaving 54224 bytes for local variables. Maximum is 81920 bytes. * Save 4 heap bytes by reprdering struct * Convert to C++ class, clean up code Convert the entire file into a C++ class (with C wrappers to preserve the ABI). This allows for setting individual values of the global struct(class) in-situ instead of a cryptic list at the end of the struct definition. It also removes a lot of redundant `twi.`s from most class members. Clean up the code by converting from `#defines` to inline functions, get rid of ternarys-as-ifs, use real enums, etc. For slave_receiver.ino, the numbers are: GIT Master IRAM: 0x723c This push IRAM: 0x6fc0 For a savings of 636 total IRAM bytes (note, there may be a slight flash text increase, but we have 1MB of flash to work with and only 32K of IRAM so the tradeoff makes sense. * Run astyle core.conf, clean up space/tab/etc. Since the C++ version has significant text differences anyway, now is a good time to clean up the mess of spaces, tabs, and differing cuddles. * Add enum use comment, rename twi::delay, fix SDA/SCL_READ bool usage Per review comments * Replace clock stretch repeated code w/inline loop There were multiple places where the code was waiting for a slave to finish stretching the clock. Factor them out to an *inline* function to reduce code smell. * Remove slave code when not using slave mode Add a new twi_setSlaveMode call which actually attached the interrupts to the slave pin change code onSdaChenge/onSclChange. Don't attach interrupts in the main twi_begin. Because slave mode is only useful should a onoReceive or onRequest callback, call twi_setSlaveMode and attach interrupts on the Wire setters. This allows GCC to not link in slave code unless slave mode is used, saving over 1,000 bytes of IRAM in the common, master-only case. --- cores/esp8266/core_esp8266_si2c.cpp | 1564 ++++++++++++++++----------- cores/esp8266/twi.h | 35 +- libraries/Wire/Wire.cpp | 433 ++++---- libraries/Wire/Wire.h | 48 +- tests/restyle.sh | 6 +- 5 files changed, 1208 insertions(+), 878 deletions(-) diff --git a/cores/esp8266/core_esp8266_si2c.cpp b/cores/esp8266/core_esp8266_si2c.cpp index 6f6cd5897..7200f6315 100644 --- a/cores/esp8266/core_esp8266_si2c.cpp +++ b/cores/esp8266/core_esp8266_si2c.cpp @@ -1,114 +1,152 @@ /* - si2c.c - Software I2C library for esp8266 + si2c.c - Software I2C library for esp8266 - Copyright (c) 2015 Hristo Gochkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2015 Hristo Gochkov. 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 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. + 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 - Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support + 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 + Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support */ #include "twi.h" #include "pins_arduino.h" #include "wiring_private.h" + + extern "C" { - -unsigned int preferred_si2c_clock = 100000; #include "twi_util.h" - #include "ets_sys.h" +}; -unsigned char twi_dcount = 18; -static unsigned char twi_sda, twi_scl; -static uint32_t twi_clockStretchLimit; -static unsigned char twi_addr = 0; -// modes (private) -#define TWIPM_UNKNOWN 0 -#define TWIPM_IDLE 1 -#define TWIPM_ADDRESSED 2 -#define TWIPM_WAIT 3 +// Implement as a class to reduce code size by allowing access to many global variables with a single base pointer +class Twi +{ +private: + unsigned int preferred_si2c_clock = 100000; + unsigned char twi_dcount = 18; + unsigned char twi_sda = 0; + unsigned char twi_scl = 0; + unsigned char twi_addr = 0; + uint32_t twi_clockStretchLimit = 0; -// states (private) -#define TWIP_UNKNOWN 0 -#define TWIP_IDLE 1 -#define TWIP_START 2 -#define TWIP_SEND_ACK 3 -#define TWIP_WAIT_ACK 4 -#define TWIP_WAIT_STOP 5 -#define TWIP_SLA_W 6 -#define TWIP_SLA_R 7 -#define TWIP_REP_START 8 -#define TWIP_READ 9 -#define TWIP_STOP 10 -#define TWIP_REC_ACK 11 -#define TWIP_READ_ACK 12 -#define TWIP_RWAIT_ACK 13 -#define TWIP_WRITE 14 -#define TWIP_BUS_ERR 15 + // These are int-wide, even though they could all fit in a byte, to reduce code size and avoid any potential + // issues about RmW on packed bytes. The int-wide variations of asm instructions are smaller than the equivalent + // byte-wide ones, and since these emums are used everywhere, the difference adds up fast. There is only a single + // instance of the class, though, so the extra 12 bytes of RAM used here saves a lot more IRAM. + volatile enum { TWIPM_UNKNOWN = 0, TWIPM_IDLE, TWIPM_ADDRESSED, TWIPM_WAIT} twip_mode = TWIPM_IDLE; + volatile enum { TWIP_UNKNOWN = 0, TWIP_IDLE, TWIP_START, TWIP_SEND_ACK, TWIP_WAIT_ACK, TWIP_WAIT_STOP, TWIP_SLA_W, TWIP_SLA_R, TWIP_REP_START, TWIP_READ, TWIP_STOP, TWIP_REC_ACK, TWIP_READ_ACK, TWIP_RWAIT_ACK, TWIP_WRITE, TWIP_BUS_ERR } twip_state = TWIP_IDLE; + volatile int twip_status = TW_NO_INFO; + volatile int bitCount = 0; -static volatile uint8_t twip_mode = TWIPM_IDLE; -static volatile uint8_t twip_state = TWIP_IDLE; -static volatile uint8_t twip_status = TW_NO_INFO; -static volatile uint8_t bitCount = 0; + volatile uint8_t twi_data = 0x00; + volatile int twi_ack = 0; + volatile int twi_ack_rec = 0; + volatile int twi_timeout_ms = 10; -#define TWDR twi_data -static volatile uint8_t twi_data = 0x00; -static volatile uint8_t twi_ack = 0; -static volatile uint8_t twi_ack_rec = 0; -static volatile int twi_timeout_ms = 10; + volatile enum { TWI_READY = 0, TWI_MRX, TWI_MTX, TWI_SRX, TWI_STX } twi_state = TWI_READY; + volatile uint8_t twi_error = 0xFF; -#define TWI_READY 0 -#define TWI_MRX 1 -#define TWI_MTX 2 -#define TWI_SRX 3 -#define TWI_STX 4 -static volatile uint8_t twi_state = TWI_READY; -static volatile uint8_t twi_error = 0xFF; + uint8_t twi_txBuffer[TWI_BUFFER_LENGTH]; + volatile int twi_txBufferIndex = 0; + volatile int twi_txBufferLength = 0; -static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH]; -static volatile uint8_t twi_txBufferIndex; -static volatile uint8_t twi_txBufferLength; + uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; + volatile int twi_rxBufferIndex = 0; -static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH]; -static volatile uint8_t twi_rxBufferIndex; + void (*twi_onSlaveTransmit)(void); + void (*twi_onSlaveReceive)(uint8_t*, size_t); -static void (*twi_onSlaveTransmit)(void); -static void (*twi_onSlaveReceive)(uint8_t*, size_t); + // ETS queue/timer interfaces + enum { EVENTTASK_QUEUE_SIZE = 1, EVENTTASK_QUEUE_PRIO = 2 }; + enum { TWI_SIG_RANGE = 0x00000100, TWI_SIG_RX = 0x00000101, TWI_SIG_TX = 0x00000102 }; + ETSEvent eventTaskQueue[EVENTTASK_QUEUE_SIZE]; + ETSTimer timer; -static void onSclChange(void); -static void onSdaChange(void); + // Event/IRQ callbacks, so they can't use "this" and need to be static + static void ICACHE_RAM_ATTR onSclChange(void); + static void ICACHE_RAM_ATTR onSdaChange(void); + static void eventTask(ETSEvent *e); + static void ICACHE_RAM_ATTR onTimer(void *unused); -#define EVENTTASK_QUEUE_SIZE 1 -#define EVENTTASK_QUEUE_PRIO 2 + // Allow not linking in the slave code if there is no call to setAddress + bool _slaveEnabled = false; -#define TWI_SIG_RANGE 0x00000100 -#define TWI_SIG_RX (TWI_SIG_RANGE + 0x01) -#define TWI_SIG_TX (TWI_SIG_RANGE + 0x02) + // Internal use functions + void ICACHE_RAM_ATTR busywait(unsigned char v); + bool write_start(void); + bool write_stop(void); + bool write_bit(bool bit); + bool read_bit(void); + bool write_byte(unsigned char byte); + unsigned char read_byte(bool nack); + void ICACHE_RAM_ATTR onTwipEvent(uint8_t status); -static ETSEvent eventTaskQueue[EVENTTASK_QUEUE_SIZE]; -static void eventTask(ETSEvent *e); -static ETSTimer timer; -static void onTimer(void *unused); + // Inline helpers + inline void SDA_LOW() + { + GPES = (1 << twi_sda); + } + inline void SDA_HIGH() + { + GPEC = (1 << twi_sda); + } + inline bool SDA_READ() + { + return (GPI & (1 << twi_sda)) != 0; + } + inline void SCL_LOW() + { + GPES = (1 << twi_scl); + } + inline void SCL_HIGH() + { + GPEC = (1 << twi_scl); + } + inline bool SCL_READ() + { + return (GPI & (1 << twi_scl)) != 0; + } + // Handle the case where a slave needs to stretch the clock with a time-limited busy wait + inline void WAIT_CLOCK_STRETCH() + { + for (unsigned int t = 0; !SCL_READ() && (t < twi_clockStretchLimit); t++) + { + /* noop */ + } + } -#define SDA_LOW() (GPES = (1 << twi_sda)) //Enable SDA (becomes output and since GPO is 0 for the pin, it will pull the line low) -#define SDA_HIGH() (GPEC = (1 << twi_sda)) //Disable SDA (becomes input and since it has pullup it will go high) -#define SDA_READ() ((GPI & (1 << twi_sda)) != 0) -#define SCL_LOW() (GPES = (1 << twi_scl)) -#define SCL_HIGH() (GPEC = (1 << twi_scl)) -#define SCL_READ() ((GPI & (1 << twi_scl)) != 0) + +public: + void setClock(unsigned int freq); + void setClockStretchLimit(uint32_t limit); + void init(unsigned char sda, unsigned char scl); + void setAddress(uint8_t address); + unsigned char writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop); + unsigned char readFrom(unsigned char address, unsigned char* buf, unsigned int len, unsigned char sendStop); + uint8_t status(); + uint8_t transmit(const uint8_t* data, uint8_t length); + void attachSlaveRxEvent(void (*function)(uint8_t*, size_t)); + void attachSlaveTxEvent(void (*function)(void)); + inline void ICACHE_RAM_ATTR reply(uint8_t ack); + inline void ICACHE_RAM_ATTR stop(void); + inline void ICACHE_RAM_ATTR releaseBus(void); + void enableSlave(); +}; + +static Twi twi; #ifndef FCPU80 #define FCPU80 80000000L @@ -120,670 +158,910 @@ static void onTimer(void *unused); #define TWI_CLOCK_STRETCH_MULTIPLIER 6 #endif -void twi_setClock(unsigned int freq){ - preferred_si2c_clock = freq; + +void Twi::setClock(unsigned int freq) +{ + preferred_si2c_clock = freq; #if F_CPU == FCPU80 - if(freq <= 50000) twi_dcount = 38;//about 50KHz - else if(freq <= 100000) twi_dcount = 19;//about 100KHz - else if(freq <= 200000) twi_dcount = 8;//about 200KHz - else if(freq <= 300000) twi_dcount = 3;//about 300KHz - else if(freq <= 400000) twi_dcount = 1;//about 400KHz - else twi_dcount = 1;//about 400KHz + if (freq <= 50000) + { + twi_dcount = 38; //about 50KHz + } + else if (freq <= 100000) + { + twi_dcount = 19; //about 100KHz + } + else if (freq <= 200000) + { + twi_dcount = 8; //about 200KHz + } + else if (freq <= 300000) + { + twi_dcount = 3; //about 300KHz + } + else if (freq <= 400000) + { + twi_dcount = 1; //about 400KHz + } + else + { + twi_dcount = 1; //about 400KHz + } #else - if(freq <= 50000) twi_dcount = 64;//about 50KHz - else if(freq <= 100000) twi_dcount = 32;//about 100KHz - else if(freq <= 200000) twi_dcount = 14;//about 200KHz - else if(freq <= 300000) twi_dcount = 8;//about 300KHz - else if(freq <= 400000) twi_dcount = 5;//about 400KHz - else if(freq <= 500000) twi_dcount = 3;//about 500KHz - else if(freq <= 600000) twi_dcount = 2;//about 600KHz - else twi_dcount = 1;//about 700KHz + if (freq <= 50000) + { + twi_dcount = 64; //about 50KHz + } + else if (freq <= 100000) + { + twi_dcount = 32; //about 100KHz + } + else if (freq <= 200000) + { + twi_dcount = 14; //about 200KHz + } + else if (freq <= 300000) + { + twi_dcount = 8; //about 300KHz + } + else if (freq <= 400000) + { + twi_dcount = 5; //about 400KHz + } + else if (freq <= 500000) + { + twi_dcount = 3; //about 500KHz + } + else if (freq <= 600000) + { + twi_dcount = 2; //about 600KHz + } + else + { + twi_dcount = 1; //about 700KHz + } #endif } -void twi_setClockStretchLimit(uint32_t limit){ - twi_clockStretchLimit = limit * TWI_CLOCK_STRETCH_MULTIPLIER; -} - -void twi_init(unsigned char sda, unsigned char scl) +void Twi::setClockStretchLimit(uint32_t limit) { - // set timer function - ets_timer_setfn(&timer, onTimer, NULL); - - // create event task - ets_task(eventTask, EVENTTASK_QUEUE_PRIO, eventTaskQueue, EVENTTASK_QUEUE_SIZE); - - twi_sda = sda; - twi_scl = scl; - pinMode(twi_sda, INPUT_PULLUP); - pinMode(twi_scl, INPUT_PULLUP); - twi_setClock(preferred_si2c_clock); - twi_setClockStretchLimit(230); // default value is 230 uS - - if (twi_addr != 0) - { - attachInterrupt(scl, onSclChange, CHANGE); - attachInterrupt(sda, onSdaChange, CHANGE); - } + twi_clockStretchLimit = limit * TWI_CLOCK_STRETCH_MULTIPLIER; } -void twi_setAddress(uint8_t address) + + +void Twi::init(unsigned char sda, unsigned char scl) { - // set twi slave address (skip over R/W bit) - twi_addr = address << 1; + // set timer function + ets_timer_setfn(&timer, onTimer, NULL); + + // create event task + ets_task(eventTask, EVENTTASK_QUEUE_PRIO, eventTaskQueue, EVENTTASK_QUEUE_SIZE); + + twi_sda = sda; + twi_scl = scl; + pinMode(twi_sda, INPUT_PULLUP); + pinMode(twi_scl, INPUT_PULLUP); + twi_setClock(preferred_si2c_clock); + twi_setClockStretchLimit(230); // default value is 230 uS } -static void ICACHE_RAM_ATTR twi_delay(unsigned char v){ - unsigned int i; +void Twi::setAddress(uint8_t address) +{ + // set twi slave address (skip over R/W bit) + twi_addr = address << 1; +} + +void Twi::enableSlave() +{ + if (!_slaveEnabled) + { + attachInterrupt(twi_scl, onSclChange, CHANGE); + attachInterrupt(twi_sda, onSdaChange, CHANGE); + _slaveEnabled = true; + } +} + +void ICACHE_RAM_ATTR Twi::busywait(unsigned char v) +{ + unsigned int i; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-but-set-variable" - unsigned int reg; - for (i = 0; i < v; i++) { - reg = GPI; - } - (void)reg; + unsigned int reg; + for (i = 0; i < v; i++) + { + reg = GPI; + } + (void)reg; #pragma GCC diagnostic pop } -static bool twi_write_start(void) { - SCL_HIGH(); - SDA_HIGH(); - if (SDA_READ() == 0) { - return false; - } - twi_delay(twi_dcount); - SDA_LOW(); - twi_delay(twi_dcount); - return true; -} - -static bool twi_write_stop(void){ - uint32_t i = 0; - SCL_LOW(); - SDA_LOW(); - twi_delay(twi_dcount); - SCL_HIGH(); - while (SCL_READ() == 0 && (i++) < twi_clockStretchLimit); // Clock stretching - twi_delay(twi_dcount); - SDA_HIGH(); - twi_delay(twi_dcount); - return true; -} - -static bool twi_write_bit(bool bit) { - uint32_t i = 0; - SCL_LOW(); - if (bit) SDA_HIGH(); - else SDA_LOW(); - twi_delay(twi_dcount+1); - SCL_HIGH(); - while (SCL_READ() == 0 && (i++) < twi_clockStretchLimit);// Clock stretching - twi_delay(twi_dcount); - return true; -} - -static bool twi_read_bit(void) { - uint32_t i = 0; - SCL_LOW(); - SDA_HIGH(); - twi_delay(twi_dcount+2); - SCL_HIGH(); - while (SCL_READ() == 0 && (i++) < twi_clockStretchLimit);// Clock stretching - bool bit = SDA_READ(); - twi_delay(twi_dcount); - return bit; -} - -static bool twi_write_byte(unsigned char byte) { - unsigned char bit; - for (bit = 0; bit < 8; bit++) { - twi_write_bit(byte & 0x80); - byte <<= 1; - } - return !twi_read_bit();//NACK/ACK -} - -static unsigned char twi_read_byte(bool nack) { - unsigned char byte = 0; - unsigned char bit; - for (bit = 0; bit < 8; bit++) byte = (byte << 1) | twi_read_bit(); - twi_write_bit(nack); - return byte; -} - -unsigned char twi_writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop){ - unsigned int i; - if(!twi_write_start()) return 4;//line busy - if(!twi_write_byte(((address << 1) | 0) & 0xFF)) { - if (sendStop) twi_write_stop(); - return 2; //received NACK on transmit of address - } - for(i=0; i 0) { // if SDA low, read the bits slaves have to sent to a max - twi_read_bit(); - if (SCL_READ() == 0) { - return I2C_SCL_HELD_LOW_AFTER_READ; // I2C bus error. SCL held low beyond slave clock stretch time +bool Twi::read_bit(void) +{ + SCL_LOW(); + SDA_HIGH(); + busywait(twi_dcount + 2); + SCL_HIGH(); + WAIT_CLOCK_STRETCH(); + bool bit = SDA_READ(); + busywait(twi_dcount); + return bit; +} + +bool Twi::write_byte(unsigned char byte) +{ + unsigned char bit; + for (bit = 0; bit < 8; bit++) + { + write_bit(byte & 0x80); + byte <<= 1; + } + return !read_bit();//NACK/ACK +} + +unsigned char Twi::read_byte(bool nack) +{ + unsigned char byte = 0; + unsigned char bit; + for (bit = 0; bit < 8; bit++) + { + byte = (byte << 1) | read_bit(); + } + write_bit(nack); + return byte; +} + +unsigned char Twi::writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop) +{ + unsigned int i; + if (!write_start()) + { + return 4; //line busy + } + if (!write_byte(((address << 1) | 0) & 0xFF)) + { + if (sendStop) + { + write_stop(); + } + return 2; //received NACK on transmit of address + } + for (i = 0; i < len; i++) + { + if (!write_byte(buf[i])) + { + if (sendStop) + { + write_stop(); + } + return 3;//received NACK on transmit of data } } - if (SDA_READ() == 0) - return I2C_SDA_HELD_LOW; // I2C bus error. SDA line held low by slave/another_master after n bits. - - if (!twi_write_start()) - return I2C_SDA_HELD_LOW_AFTER_INIT; // line busy. SDA again held low by another device. 2nd master? + if (sendStop) + { + write_stop(); + } + i = 0; + while (!SDA_READ() && (i++) < 10) + { + SCL_LOW(); + busywait(twi_dcount); + SCL_HIGH(); + WAIT_CLOCK_STRETCH(); + busywait(twi_dcount); + } + return 0; +} + +unsigned char Twi::readFrom(unsigned char address, unsigned char* buf, unsigned int len, unsigned char sendStop) +{ + unsigned int i; + if (!write_start()) + { + return 4; //line busy + } + if (!write_byte(((address << 1) | 1) & 0xFF)) + { + if (sendStop) + { + write_stop(); + } + return 2;//received NACK on transmit of address + } + for (i = 0; i < (len - 1); i++) + { + buf[i] = read_byte(false); + } + buf[len - 1] = read_byte(true); + if (sendStop) + { + write_stop(); + } + i = 0; + while (!SDA_READ() && (i++) < 10) + { + SCL_LOW(); + busywait(twi_dcount); + SCL_HIGH(); + WAIT_CLOCK_STRETCH(); + busywait(twi_dcount); + } + return 0; +} + +uint8_t Twi::status() +{ + if (!SCL_READ()) + { + return I2C_SCL_HELD_LOW; // SCL held low by another device, no procedure available to recover + } + + int clockCount = 20; + while (!SDA_READ() && clockCount-- > 0) // if SDA low, read the bits slaves have to sent to a max + { + read_bit(); + if (!SCL_READ()) + { + return I2C_SCL_HELD_LOW_AFTER_READ; // I2C bus error. SCL held low beyond slave clock stretch time + } + } + if (!SDA_READ()) + { + return I2C_SDA_HELD_LOW; // I2C bus error. SDA line held low by slave/another_master after n bits. + } + + if (!write_start()) + { + return I2C_SDA_HELD_LOW_AFTER_INIT; // line busy. SDA again held low by another device. 2nd master? + } return I2C_OK; } -uint8_t twi_transmit(const uint8_t* data, uint8_t length) +uint8_t Twi::transmit(const uint8_t* data, uint8_t length) { - uint8_t i; + uint8_t i; - // ensure data will fit into buffer - if (length > TWI_BUFFER_LENGTH) { - return 1; - } + // ensure data will fit into buffer + if (length > TWI_BUFFER_LENGTH) + { + return 1; + } - // ensure we are currently a slave transmitter - if (twi_state != TWI_STX) { - return 2; - } + // ensure we are currently a slave transmitter + if (twi_state != TWI_STX) + { + return 2; + } - // set length and copy data into tx buffer - twi_txBufferLength = length; - for (i = 0; i < length; ++i) { - twi_txBuffer[i] = data[i]; - } + // set length and copy data into tx buffer + twi_txBufferLength = length; + for (i = 0; i < length; ++i) + { + twi_txBuffer[i] = data[i]; + } - return 0; + return 0; } -void twi_attachSlaveRxEvent( void (*function)(uint8_t*, size_t) ) +void Twi::attachSlaveRxEvent(void (*function)(uint8_t*, size_t)) { - twi_onSlaveReceive = function; + twi_onSlaveReceive = function; } -void twi_attachSlaveTxEvent( void (*function)(void) ) +void Twi::attachSlaveTxEvent(void (*function)(void)) { - twi_onSlaveTransmit = function; + twi_onSlaveTransmit = function; } -void ICACHE_RAM_ATTR twi_reply(uint8_t ack) +inline void ICACHE_RAM_ATTR Twi::reply(uint8_t ack) { - // transmit master read ready signal, with or without ack - if (ack) { - //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); - SCL_HIGH(); // _BV(TWINT) - twi_ack = 1; // _BV(TWEA) - } else { - //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); - SCL_HIGH(); // _BV(TWINT) - twi_ack = 0; // ~_BV(TWEA) - } + // transmit master read ready signal, with or without ack + if (ack) + { + //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA); + SCL_HIGH(); // _BV(TWINT) + twi_ack = 1; // _BV(TWEA) + } + else + { + //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT); + SCL_HIGH(); // _BV(TWINT) + twi_ack = 0; // ~_BV(TWEA) + } } -void ICACHE_RAM_ATTR twi_stop(void) +inline void ICACHE_RAM_ATTR Twi::stop(void) { - // send stop condition - //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); - SCL_HIGH(); // _BV(TWINT) - twi_ack = 1; // _BV(TWEA) - twi_delay(5); // Maybe this should be here - SDA_HIGH(); // _BV(TWSTO) - // update twi state - twi_state = TWI_READY; + // send stop condition + //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO); + SCL_HIGH(); // _BV(TWINT) + twi_ack = 1; // _BV(TWEA) + busywait(5); // Maybe this should be here + SDA_HIGH(); // _BV(TWSTO) + // update twi state + twi_state = TWI_READY; } -void ICACHE_RAM_ATTR twi_releaseBus(void) +inline void ICACHE_RAM_ATTR Twi::releaseBus(void) { - // release bus - //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); - SCL_HIGH(); // _BV(TWINT) - twi_ack = 1; // _BV(TWEA) - SDA_HIGH(); + // release bus + //TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); + SCL_HIGH(); // _BV(TWINT) + twi_ack = 1; // _BV(TWEA) + SDA_HIGH(); - // update twi state - twi_state = TWI_READY; + // update twi state + twi_state = TWI_READY; } -void ICACHE_RAM_ATTR twi_onTwipEvent(uint8_t status) +void ICACHE_RAM_ATTR Twi::onTwipEvent(uint8_t status) { - switch(status) { + twip_status = status; + switch (status) + { // Slave Receiver case TW_SR_SLA_ACK: // addressed, returned ack case TW_SR_GCALL_ACK: // addressed generally, returned ack case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack - // enter slave receiver mode - twi_state = TWI_SRX; - // indicate that rx buffer can be overwritten and ack - twi_rxBufferIndex = 0; - twi_reply(1); - break; + // enter slave receiver mode + twi_state = TWI_SRX; + // indicate that rx buffer can be overwritten and ack + twi_rxBufferIndex = 0; + reply(1); + break; case TW_SR_DATA_ACK: // data received, returned ack case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack - // if there is still room in the rx buffer - if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ - // put byte in buffer and ack - twi_rxBuffer[twi_rxBufferIndex++] = TWDR; - twi_reply(1); - }else{ - // otherwise nack - twi_reply(0); - } - break; + // if there is still room in the rx buffer + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) + { + // put byte in buffer and ack + twi_rxBuffer[twi_rxBufferIndex++] = twi_data; + reply(1); + } + else + { + // otherwise nack + reply(0); + } + break; case TW_SR_STOP: // stop or repeated start condition received - // put a null char after data if there's room - if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){ - twi_rxBuffer[twi_rxBufferIndex] = '\0'; - } - // callback to user-defined callback over event task to allow for non-RAM-residing code - //twi_rxBufferLock = true; // This may be necessary - ets_post(EVENTTASK_QUEUE_PRIO, TWI_SIG_RX, twi_rxBufferIndex); + // put a null char after data if there's room + if (twi_rxBufferIndex < TWI_BUFFER_LENGTH) + { + twi_rxBuffer[twi_rxBufferIndex] = '\0'; + } + // callback to user-defined callback over event task to allow for non-RAM-residing code + //twi_rxBufferLock = true; // This may be necessary + ets_post(EVENTTASK_QUEUE_PRIO, TWI_SIG_RX, twi_rxBufferIndex); - // since we submit rx buffer to "wire" library, we can reset it - twi_rxBufferIndex = 0; - break; + // since we submit rx buffer to "wire" library, we can reset it + twi_rxBufferIndex = 0; + break; case TW_SR_DATA_NACK: // data received, returned nack case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack - // nack back at master - twi_reply(0); - break; + // nack back at master + reply(0); + break; // Slave Transmitter case TW_ST_SLA_ACK: // addressed, returned ack case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack - // enter slave transmitter mode - twi_state = TWI_STX; - // ready the tx buffer index for iteration - twi_txBufferIndex = 0; - // set tx buffer length to be zero, to verify if user changes it - twi_txBufferLength = 0; - // callback to user-defined callback over event task to allow for non-RAM-residing code - // request for txBuffer to be filled and length to be set - // note: user must call twi_transmit(bytes, length) to do this - ets_post(EVENTTASK_QUEUE_PRIO, TWI_SIG_TX, 0); - break; + // enter slave transmitter mode + twi_state = TWI_STX; + // ready the tx buffer index for iteration + twi_txBufferIndex = 0; + // set tx buffer length to be zero, to verify if user changes it + twi_txBufferLength = 0; + // callback to user-defined callback over event task to allow for non-RAM-residing code + // request for txBuffer to be filled and length to be set + // note: user must call twi_transmit(bytes, length) to do this + ets_post(EVENTTASK_QUEUE_PRIO, TWI_SIG_TX, 0); + break; - case TW_ST_DATA_ACK: // byte sent, ack returned - // copy data to output register - TWDR = twi_txBuffer[twi_txBufferIndex++]; + case TW_ST_DATA_ACK: // byte sent, ack returned + // copy data to output register + twi_data = twi_txBuffer[twi_txBufferIndex++]; - bitCount = 8; - bitCount--; - (twi_data & 0x80) ? SDA_HIGH() : SDA_LOW(); - twi_data <<= 1; + bitCount = 8; + bitCount--; + if (twi_data & 0x80) + { + SDA_HIGH(); + } + else + { + SDA_LOW(); + } + twi_data <<= 1; - // if there is more to send, ack, otherwise nack - if(twi_txBufferIndex < twi_txBufferLength){ - twi_reply(1); - }else{ - twi_reply(0); - } - break; + // if there is more to send, ack, otherwise nack + if (twi_txBufferIndex < twi_txBufferLength) + { + reply(1); + } + else + { + reply(0); + } + break; case TW_ST_DATA_NACK: // received nack, we are done case TW_ST_LAST_DATA: // received ack, but we are done already! - // leave slave receiver state - twi_releaseBus(); - break; + // leave slave receiver state + releaseBus(); + break; // All case TW_NO_INFO: // no state information - break; + break; case TW_BUS_ERROR: // bus error, illegal stop/start - twi_error = TW_BUS_ERROR; - twi_stop(); - break; - } + twi_error = TW_BUS_ERROR; + stop(); + break; + } } -void ICACHE_RAM_ATTR onTimer(void *unused) +void ICACHE_RAM_ATTR Twi::onTimer(void *unused) { - (void)unused; - twi_releaseBus(); - twip_status = TW_BUS_ERROR; - twi_onTwipEvent(twip_status); - twip_mode = TWIPM_WAIT; - twip_state = TWIP_BUS_ERR; + (void)unused; + twi.releaseBus(); + twi.onTwipEvent(TW_BUS_ERROR); + twi.twip_mode = TWIPM_WAIT; + twi.twip_state = TWIP_BUS_ERR; } -static void eventTask(ETSEvent *e) +void Twi::eventTask(ETSEvent *e) { - if (e == NULL) { - return; - } + if (e == NULL) + { + return; + } - switch (e->sig) - { - case TWI_SIG_TX: - twi_onSlaveTransmit(); + switch (e->sig) + { + case TWI_SIG_TX: + twi.twi_onSlaveTransmit(); - // if they didn't change buffer & length, initialize it - if (twi_txBufferLength == 0) { - twi_txBufferLength = 1; - twi_txBuffer[0] = 0x00; - } + // if they didn't change buffer & length, initialize it + if (twi.twi_txBufferLength == 0) + { + twi.twi_txBufferLength = 1; + twi.twi_txBuffer[0] = 0x00; + } - // Initiate transmission - twi_onTwipEvent(TW_ST_DATA_ACK); + // Initiate transmission + twi.onTwipEvent(TW_ST_DATA_ACK); - break; + break; - case TWI_SIG_RX: - // ack future responses and leave slave receiver state - twi_releaseBus(); - twi_onSlaveReceive(twi_rxBuffer, e->par); - break; - } + case TWI_SIG_RX: + // ack future responses and leave slave receiver state + twi.releaseBus(); + twi.twi_onSlaveReceive(twi.twi_rxBuffer, e->par); + break; + } } -void ICACHE_RAM_ATTR onSclChange(void) +// The state machine is converted from a 0...15 state to a 1-hot encoded state, and then +// compared to the logical-or of all states with the same branch. This removes the need +// for a large series of straight-line compares. The biggest win is when multiple states +// all have the same branch (onSdaChange), but for others there is some benefit, still. +#define S2M(x) (1<<(x)) +// Shorthand for if the state is any of the or'd bitmask x +#define IFSTATE(x) if (twip_state_mask & (x)) + +void ICACHE_RAM_ATTR Twi::onSclChange(void) { - static uint8_t sda; - static uint8_t scl; + unsigned int sda; + unsigned int scl; - sda = SDA_READ(); - scl = SCL_READ(); + // Store bool return in int to reduce final code size. + sda = twi.SDA_READ(); + scl = twi.SCL_READ(); - twip_status = 0xF8; // reset TWI status + twi.twip_status = 0xF8; // reset TWI status - switch (twip_state) - { - case TWIP_IDLE: - case TWIP_WAIT_STOP: - case TWIP_BUS_ERR: - // ignore - break; + int twip_state_mask = S2M(twi.twip_state); + IFSTATE(S2M(TWIP_START) | S2M(TWIP_REP_START) | S2M(TWIP_SLA_W) | S2M(TWIP_READ)) + { + if (!scl) + { + // ignore + } + else + { + twi.bitCount--; + twi.twi_data <<= 1; + twi.twi_data |= sda; - case TWIP_START: - case TWIP_REP_START: - case TWIP_SLA_W: - case TWIP_READ: - if (!scl) { - // ignore - } else { - bitCount--; - twi_data <<= 1; - twi_data |= sda; + if (twi.bitCount != 0) + { + // continue + } + else + { + twi.twip_state = TWIP_SEND_ACK; + } + } + } + else IFSTATE(S2M(TWIP_SEND_ACK)) + { + if (scl) + { + // ignore + } + else + { + if (twi.twip_mode == TWIPM_IDLE) + { + if ((twi.twi_data & 0xFE) != twi.twi_addr) + { + // ignore + } + else + { + twi.SDA_LOW(); + } + } + else + { + if (!twi.twi_ack) + { + // ignore + } + else + { + twi.SDA_LOW(); + } + } + twi.twip_state = TWIP_WAIT_ACK; + } + } + else IFSTATE(S2M(TWIP_WAIT_ACK)) + { + if (scl) + { + // ignore + } + else + { + if (twi.twip_mode == TWIPM_IDLE) + { + if ((twi.twi_data & 0xFE) != twi.twi_addr) + { + twi.SDA_HIGH(); + twi.twip_state = TWIP_WAIT_STOP; + } + else + { + twi.SCL_LOW(); // clock stretching + twi.SDA_HIGH(); + twi.twip_mode = TWIPM_ADDRESSED; + if (!(twi.twi_data & 0x01)) + { + twi.onTwipEvent(TW_SR_SLA_ACK); + twi.bitCount = 8; + twi.twip_state = TWIP_SLA_W; + } + else + { + twi.onTwipEvent(TW_ST_SLA_ACK); + twi.twip_state = TWIP_SLA_R; + } + } + } + else + { + twi.SCL_LOW(); // clock stretching + twi.SDA_HIGH(); + if (!twi.twi_ack) + { + twi.onTwipEvent(TW_SR_DATA_NACK); + twi.twip_mode = TWIPM_WAIT; + twi.twip_state = TWIP_WAIT_STOP; + } + else + { + twi.onTwipEvent(TW_SR_DATA_ACK); + twi.bitCount = 8; + twi.twip_state = TWIP_READ; + } + } + } + } + else IFSTATE(S2M(TWIP_SLA_R) | S2M(TWIP_WRITE)) + { + if (scl) + { + // ignore + } + else + { + twi.bitCount--; + if (twi.twi_data & 0x80) + { + twi.SDA_HIGH(); + } + else + { + twi.SDA_LOW(); + } + twi.twi_data <<= 1; - if (bitCount != 0) { - // continue - } else { - twip_state = TWIP_SEND_ACK; - } - } - break; - - case TWIP_SEND_ACK: - if (scl) { - // ignore - } else { - if (twip_mode == TWIPM_IDLE) { - if ((twi_data & 0xFE) != twi_addr) { - // ignore - } else { - SDA_LOW(); - } - } else { - if (!twi_ack) { - // ignore - } else { - SDA_LOW(); - } - } - twip_state = TWIP_WAIT_ACK; - } - break; - - case TWIP_WAIT_ACK: - if (scl) { - // ignore - } else { - if (twip_mode == TWIPM_IDLE) { - if ((twi_data & 0xFE) != twi_addr) { - SDA_HIGH(); - twip_state = TWIP_WAIT_STOP; - } else { - SCL_LOW(); // clock stretching - SDA_HIGH(); - twip_mode = TWIPM_ADDRESSED; - if (!(twi_data & 0x01)) { - twip_status = TW_SR_SLA_ACK; - twi_onTwipEvent(twip_status); - bitCount = 8; - twip_state = TWIP_SLA_W; - } else { - twip_status = TW_ST_SLA_ACK; - twi_onTwipEvent(twip_status); - twip_state = TWIP_SLA_R; - } - } - } else { - SCL_LOW(); // clock stretching - SDA_HIGH(); - if (!twi_ack) { - twip_status = TW_SR_DATA_NACK; - twi_onTwipEvent(twip_status); - twip_mode = TWIPM_WAIT; - twip_state = TWIP_WAIT_STOP; - } else { - twip_status = TW_SR_DATA_ACK; - twi_onTwipEvent(twip_status); - bitCount = 8; - twip_state = TWIP_READ; - } - } - } - break; - - case TWIP_SLA_R: - case TWIP_WRITE: - if (scl) { - // ignore - } else { - bitCount--; - (twi_data & 0x80) ? SDA_HIGH() : SDA_LOW(); - twi_data <<= 1; - - if (bitCount != 0) { - // continue - } else { - twip_state = TWIP_REC_ACK; - } - } - break; - - case TWIP_REC_ACK: - if (scl) { - // ignore - } else { - SDA_HIGH(); - twip_state = TWIP_READ_ACK; - } - break; - - case TWIP_READ_ACK: - if (!scl) { - // ignore - } else { - twi_ack_rec = !sda; - twip_state = TWIP_RWAIT_ACK; - } - break; - - case TWIP_RWAIT_ACK: - if (scl) { - // ignore - } else { - SCL_LOW(); // clock stretching - if (twi_ack && twi_ack_rec) { - twip_status = TW_ST_DATA_ACK; - twi_onTwipEvent(twip_status); - twip_state = TWIP_WRITE; - } else { - // we have no more data to send and/or the master doesn't want anymore - twip_status = twi_ack_rec ? TW_ST_LAST_DATA : TW_ST_DATA_NACK; - twi_onTwipEvent(twip_status); - twip_mode = TWIPM_WAIT; - twip_state = TWIP_WAIT_STOP; - } - } - break; - - default: - break; - } + if (twi.bitCount != 0) + { + // continue + } + else + { + twi.twip_state = TWIP_REC_ACK; + } + } + } + else IFSTATE(S2M(TWIP_REC_ACK)) + { + if (scl) + { + // ignore + } + else + { + twi.SDA_HIGH(); + twi.twip_state = TWIP_READ_ACK; + } + } + else IFSTATE(S2M(TWIP_READ_ACK)) + { + if (!scl) + { + // ignore + } + else + { + twi.twi_ack_rec = !sda; + twi.twip_state = TWIP_RWAIT_ACK; + } + } + else IFSTATE(S2M(TWIP_RWAIT_ACK)) + { + if (scl) + { + // ignore + } + else + { + twi.SCL_LOW(); // clock stretching + if (twi.twi_ack && twi.twi_ack_rec) + { + twi.onTwipEvent(TW_ST_DATA_ACK); + twi.twip_state = TWIP_WRITE; + } + else + { + // we have no more data to send and/or the master doesn't want anymore + twi.onTwipEvent(twi.twi_ack_rec ? TW_ST_LAST_DATA : TW_ST_DATA_NACK); + twi.twip_mode = TWIPM_WAIT; + twi.twip_state = TWIP_WAIT_STOP; + } + } + } } -void ICACHE_RAM_ATTR onSdaChange(void) +void ICACHE_RAM_ATTR Twi::onSdaChange(void) { - static uint8_t sda; - static uint8_t scl; - sda = SDA_READ(); - scl = SCL_READ(); + unsigned int sda; + unsigned int scl; - switch (twip_state) - { - case TWIP_IDLE: - if (!scl) { - // DATA - ignore - } else if (sda) { - // STOP - ignore - } else { - // START - bitCount = 8; - twip_state = TWIP_START; - ets_timer_arm_new(&timer, twi_timeout_ms, false, true); // Once, ms - } - break; + // Store bool return in int to reduce final code size. + sda = twi.SDA_READ(); + scl = twi.SCL_READ(); - case TWIP_START: - case TWIP_REP_START: - case TWIP_SEND_ACK: - case TWIP_WAIT_ACK: - case TWIP_SLA_R: - case TWIP_REC_ACK: - case TWIP_READ_ACK: - case TWIP_RWAIT_ACK: - case TWIP_WRITE: - if (!scl) { - // DATA - ignore - } else { - // START or STOP - SDA_HIGH(); // Should not be necessary - twip_status = TW_BUS_ERROR; - twi_onTwipEvent(twip_status); - twip_mode = TWIPM_WAIT; - twip_state = TWIP_BUS_ERR; - } - break; - - case TWIP_WAIT_STOP: - case TWIP_BUS_ERR: - if (!scl) { - // DATA - ignore - } else { - if (sda) { - // STOP - SCL_LOW(); // clock stretching - ets_timer_disarm(&timer); - twip_state = TWIP_IDLE; - twip_mode = TWIPM_IDLE; - SCL_HIGH(); - } else { - // START - if (twip_state == TWIP_BUS_ERR) { - // ignore - } else { - bitCount = 8; - twip_state = TWIP_REP_START; - ets_timer_arm_new(&timer, twi_timeout_ms, false, true); // Once, ms - } - } - } - break; - - case TWIP_SLA_W: - case TWIP_READ: - if (!scl) { - // DATA - ignore - } else { - // START or STOP - if (bitCount != 7) { - // inside byte transfer - error - twip_status = TW_BUS_ERROR; - twi_onTwipEvent(twip_status); - twip_mode = TWIPM_WAIT; - twip_state = TWIP_BUS_ERR; - } else { - // during first bit in byte transfer - ok - SCL_LOW(); // clock stretching - twip_status = TW_SR_STOP; - twi_onTwipEvent(twip_status); - if (sda) { - // STOP - ets_timer_disarm(&timer); - twip_state = TWIP_IDLE; - twip_mode = TWIPM_IDLE; - } else { - // START - bitCount = 8; - ets_timer_arm_new(&timer, twi_timeout_ms, false, true); // Once, ms - twip_state = TWIP_REP_START; - twip_mode = TWIPM_IDLE; - } - } - } - break; - - default: - break; - } + int twip_state_mask = S2M(twi.twip_state); + if (scl) /* !DATA */ + { + IFSTATE(S2M(TWIP_IDLE)) + { + if (sda) + { + // STOP - ignore + } + else + { + // START + twi.bitCount = 8; + twi.twip_state = TWIP_START; + ets_timer_arm_new(&twi.timer, twi.twi_timeout_ms, false, true); // Once, ms + } + } + else IFSTATE(S2M(TWIP_START) | S2M(TWIP_REP_START) | S2M(TWIP_SEND_ACK) | S2M(TWIP_WAIT_ACK) | S2M(TWIP_SLA_R) | S2M(TWIP_REC_ACK) | S2M(TWIP_READ_ACK) | S2M(TWIP_RWAIT_ACK) | S2M(TWIP_WRITE)) + { + // START or STOP + twi.SDA_HIGH(); // Should not be necessary + twi.onTwipEvent(TW_BUS_ERROR); + twi.twip_mode = TWIPM_WAIT; + twi.twip_state = TWIP_BUS_ERR; + } + else IFSTATE(S2M(TWIP_WAIT_STOP) | S2M(TWIP_BUS_ERR)) + { + if (sda) + { + // STOP + twi.SCL_LOW(); // clock stretching + ets_timer_disarm(&twi.timer); + twi.twip_state = TWIP_IDLE; + twi.twip_mode = TWIPM_IDLE; + twi.SCL_HIGH(); + } + else + { + // START + if (twi.twip_state == TWIP_BUS_ERR) + { + // ignore + } + else + { + twi.bitCount = 8; + twi.twip_state = TWIP_REP_START; + ets_timer_arm_new(&twi.timer, twi.twi_timeout_ms, false, true); // Once, ms + } + } + } + else IFSTATE(S2M(TWIP_SLA_W) | S2M(TWIP_READ)) + { + // START or STOP + if (twi.bitCount != 7) + { + // inside byte transfer - error + twi.onTwipEvent(TW_BUS_ERROR); + twi.twip_mode = TWIPM_WAIT; + twi.twip_state = TWIP_BUS_ERR; + } + else + { + // during first bit in byte transfer - ok + twi.SCL_LOW(); // clock stretching + twi.onTwipEvent(TW_SR_STOP); + if (sda) + { + // STOP + ets_timer_disarm(&twi.timer); + twi.twip_state = TWIP_IDLE; + twi.twip_mode = TWIPM_IDLE; + } + else + { + // START + twi.bitCount = 8; + ets_timer_arm_new(&twi.timer, twi.twi_timeout_ms, false, true); // Once, ms + twi.twip_state = TWIP_REP_START; + twi.twip_mode = TWIPM_IDLE; + } + } + } + } } +// C wrappers for the object, since API is exposed only as C +extern "C" { + + void twi_init(unsigned char sda, unsigned char scl) + { + return twi.init(sda, scl); + } + + void twi_setAddress(uint8_t a) + { + return twi.setAddress(a); + } + + void twi_stop(void) + { + twi.stop(); + } + + void twi_setClock(unsigned int freq) + { + twi.setClock(freq); + } + + void twi_setClockStretchLimit(uint32_t limit) + { + twi.setClockStretchLimit(limit); + } + + uint8_t twi_writeTo(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop) + { + return twi.writeTo(address, buf, len, sendStop); + } + + uint8_t twi_readFrom(unsigned char address, unsigned char * buf, unsigned int len, unsigned char sendStop) + { + return twi.readFrom(address, buf, len, sendStop); + } + + uint8_t twi_status() + { + return twi.status(); + } + + uint8_t twi_transmit(const uint8_t * buf, uint8_t len) + { + return twi.transmit(buf, len); + } + + void twi_attachSlaveRxEvent(void (*cb)(uint8_t*, size_t)) + { + twi.attachSlaveRxEvent(cb); + } + + void twi_attachSlaveTxEvent(void (*cb)(void)) + { + twi.attachSlaveTxEvent(cb); + } + + void twi_reply(uint8_t r) + { + twi.reply(r); + } + + void twi_releaseBus(void) + { + twi.releaseBus(); + } + + void twi_enableSlaveMode(void) + { + twi.enableSlave(); + } + }; diff --git a/cores/esp8266/twi.h b/cores/esp8266/twi.h index 685221820..27aaaff64 100644 --- a/cores/esp8266/twi.h +++ b/cores/esp8266/twi.h @@ -1,23 +1,23 @@ /* - twi.h - Software I2C library for esp8266 + twi.h - Software I2C library for esp8266 - Copyright (c) 2015 Hristo Gochkov. All rights reserved. - This file is part of the esp8266 core for Arduino environment. + Copyright (c) 2015 Hristo Gochkov. 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 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. + 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 - Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support + 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 + Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support */ #ifndef SI2C_h #define SI2C_h @@ -48,12 +48,13 @@ uint8_t twi_status(); uint8_t twi_transmit(const uint8_t*, uint8_t); -void twi_attachSlaveRxEvent( void (*)(uint8_t*, size_t) ); -void twi_attachSlaveTxEvent( void (*)(void) ); +void twi_attachSlaveRxEvent(void (*)(uint8_t*, size_t)); +void twi_attachSlaveTxEvent(void (*)(void)); void twi_reply(uint8_t); //void twi_stop(void); void twi_releaseBus(void); +void twi_enableSlaveMode(void); #ifdef __cplusplus } diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 88103650d..3aa3604ab 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -1,31 +1,31 @@ /* - TwoWire.cpp - TWI/I2C library for Arduino & Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. + TwoWire.cpp - TWI/I2C library for Arduino & Wiring + Copyright (c) 2006 Nicholas Zambetti. 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 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. + 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 + 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 - Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts - Modified December 2014 by Ivan Grokhotkov (ivan@esp8266.com) - esp8266 support - Modified April 2015 by Hrsto Gochkov (ficeto@ficeto.com) - alternative esp8266 support - Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts + Modified December 2014 by Ivan Grokhotkov (ivan@esp8266.com) - esp8266 support + Modified April 2015 by Hrsto Gochkov (ficeto@ficeto.com) - alternative esp8266 support + Modified January 2017 by Bjorn Hammarberg (bjoham@esp8266.com) - i2c slave support */ extern "C" { - #include - #include - #include +#include +#include +#include } #include "twi.h" @@ -58,226 +58,273 @@ static int default_scl_pin = SCL; // Constructors //////////////////////////////////////////////////////////////// -TwoWire::TwoWire(){} +TwoWire::TwoWire() {} // Public Methods ////////////////////////////////////////////////////////////// -void TwoWire::begin(int sda, int scl){ - default_sda_pin = sda; - default_scl_pin = scl; - twi_init(sda, scl); - flush(); +void TwoWire::begin(int sda, int scl) +{ + default_sda_pin = sda; + default_scl_pin = scl; + twi_init(sda, scl); + flush(); } -void TwoWire::begin(int sda, int scl, uint8_t address){ - default_sda_pin = sda; - default_scl_pin = scl; - twi_setAddress(address); - twi_init(sda, scl); - twi_attachSlaveTxEvent(onRequestService); - twi_attachSlaveRxEvent(onReceiveService); - flush(); +void TwoWire::begin(int sda, int scl, uint8_t address) +{ + default_sda_pin = sda; + default_scl_pin = scl; + twi_setAddress(address); + twi_init(sda, scl); + twi_attachSlaveTxEvent(onRequestService); + twi_attachSlaveRxEvent(onReceiveService); + flush(); } -void TwoWire::pins(int sda, int scl){ - default_sda_pin = sda; - default_scl_pin = scl; +void TwoWire::pins(int sda, int scl) +{ + default_sda_pin = sda; + default_scl_pin = scl; } -void TwoWire::begin(void){ - begin(default_sda_pin, default_scl_pin); +void TwoWire::begin(void) +{ + begin(default_sda_pin, default_scl_pin); } -void TwoWire::begin(uint8_t address){ - twi_setAddress(address); - twi_attachSlaveTxEvent(onRequestService); - twi_attachSlaveRxEvent(onReceiveService); - begin(); +void TwoWire::begin(uint8_t address) +{ + twi_setAddress(address); + twi_attachSlaveTxEvent(onRequestService); + twi_attachSlaveRxEvent(onReceiveService); + begin(); } -uint8_t TwoWire::status(){ - return twi_status(); +uint8_t TwoWire::status() +{ + return twi_status(); } -void TwoWire::begin(int address){ - begin((uint8_t)address); +void TwoWire::begin(int address) +{ + begin((uint8_t)address); } -void TwoWire::setClock(uint32_t frequency){ - twi_setClock(frequency); +void TwoWire::setClock(uint32_t frequency) +{ + twi_setClock(frequency); } -void TwoWire::setClockStretchLimit(uint32_t limit){ - twi_setClockStretchLimit(limit); +void TwoWire::setClockStretchLimit(uint32_t limit) +{ + twi_setClockStretchLimit(limit); } -size_t TwoWire::requestFrom(uint8_t address, size_t size, bool sendStop){ - if(size > BUFFER_LENGTH){ - size = BUFFER_LENGTH; - } - size_t read = (twi_readFrom(address, rxBuffer, size, sendStop) == 0)?size:0; - rxBufferIndex = 0; - rxBufferLength = read; - return read; -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop){ - return requestFrom(address, static_cast(quantity), static_cast(sendStop)); -} - -uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity){ - return requestFrom(address, static_cast(quantity), true); -} - -uint8_t TwoWire::requestFrom(int address, int quantity){ - return requestFrom(static_cast(address), static_cast(quantity), true); -} - -uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop){ - return requestFrom(static_cast(address), static_cast(quantity), static_cast(sendStop)); -} - -void TwoWire::beginTransmission(uint8_t address){ - transmitting = 1; - txAddress = address; - txBufferIndex = 0; - txBufferLength = 0; -} - -void TwoWire::beginTransmission(int address){ - beginTransmission((uint8_t)address); -} - -uint8_t TwoWire::endTransmission(uint8_t sendStop){ - int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, sendStop); - txBufferIndex = 0; - txBufferLength = 0; - transmitting = 0; - return ret; -} - -uint8_t TwoWire::endTransmission(void){ - return endTransmission(true); -} - -size_t TwoWire::write(uint8_t data){ - if(transmitting){ - if(txBufferLength >= BUFFER_LENGTH){ - setWriteError(); - return 0; +size_t TwoWire::requestFrom(uint8_t address, size_t size, bool sendStop) +{ + if (size > BUFFER_LENGTH) + { + size = BUFFER_LENGTH; } - txBuffer[txBufferIndex] = data; - ++txBufferIndex; - txBufferLength = txBufferIndex; - } else { - twi_transmit(&data, 1); - } - return 1; + size_t read = (twi_readFrom(address, rxBuffer, size, sendStop) == 0) ? size : 0; + rxBufferIndex = 0; + rxBufferLength = read; + return read; } -size_t TwoWire::write(const uint8_t *data, size_t quantity){ - if(transmitting){ - for(size_t i = 0; i < quantity; ++i){ - if(!write(data[i])) return i; +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) +{ + return requestFrom(address, static_cast(quantity), static_cast(sendStop)); +} + +uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) +{ + return requestFrom(address, static_cast(quantity), true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity) +{ + return requestFrom(static_cast(address), static_cast(quantity), true); +} + +uint8_t TwoWire::requestFrom(int address, int quantity, int sendStop) +{ + return requestFrom(static_cast(address), static_cast(quantity), static_cast(sendStop)); +} + +void TwoWire::beginTransmission(uint8_t address) +{ + transmitting = 1; + txAddress = address; + txBufferIndex = 0; + txBufferLength = 0; +} + +void TwoWire::beginTransmission(int address) +{ + beginTransmission((uint8_t)address); +} + +uint8_t TwoWire::endTransmission(uint8_t sendStop) +{ + int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, sendStop); + txBufferIndex = 0; + txBufferLength = 0; + transmitting = 0; + return ret; +} + +uint8_t TwoWire::endTransmission(void) +{ + return endTransmission(true); +} + +size_t TwoWire::write(uint8_t data) +{ + if (transmitting) + { + if (txBufferLength >= BUFFER_LENGTH) + { + setWriteError(); + return 0; + } + txBuffer[txBufferIndex] = data; + ++txBufferIndex; + txBufferLength = txBufferIndex; } - }else{ - twi_transmit(data, quantity); - } - return quantity; + else + { + twi_transmit(&data, 1); + } + return 1; } -int TwoWire::available(void){ - int result = rxBufferLength - rxBufferIndex; - - if (!result) { - // yielding here will not make more data "available", - // but it will prevent the system from going into WDT reset - optimistic_yield(1000); - } - - return result; +size_t TwoWire::write(const uint8_t *data, size_t quantity) +{ + if (transmitting) + { + for (size_t i = 0; i < quantity; ++i) + { + if (!write(data[i])) + { + return i; + } + } + } + else + { + twi_transmit(data, quantity); + } + return quantity; } -int TwoWire::read(void){ - int value = -1; - if(rxBufferIndex < rxBufferLength){ - value = rxBuffer[rxBufferIndex]; - ++rxBufferIndex; - } - return value; +int TwoWire::available(void) +{ + int result = rxBufferLength - rxBufferIndex; + + if (!result) + { + // yielding here will not make more data "available", + // but it will prevent the system from going into WDT reset + optimistic_yield(1000); + } + + return result; } -int TwoWire::peek(void){ - int value = -1; - if(rxBufferIndex < rxBufferLength){ - value = rxBuffer[rxBufferIndex]; - } - return value; +int TwoWire::read(void) +{ + int value = -1; + if (rxBufferIndex < rxBufferLength) + { + value = rxBuffer[rxBufferIndex]; + ++rxBufferIndex; + } + return value; } -void TwoWire::flush(void){ - rxBufferIndex = 0; - rxBufferLength = 0; - txBufferIndex = 0; - txBufferLength = 0; +int TwoWire::peek(void) +{ + int value = -1; + if (rxBufferIndex < rxBufferLength) + { + value = rxBuffer[rxBufferIndex]; + } + return value; +} + +void TwoWire::flush(void) +{ + rxBufferIndex = 0; + rxBufferLength = 0; + txBufferIndex = 0; + txBufferLength = 0; } void TwoWire::onReceiveService(uint8_t* inBytes, size_t numBytes) { - // don't bother if user hasn't registered a callback - if (!user_onReceive) { - return; - } - // // don't bother if rx buffer is in use by a master requestFrom() op - // // i know this drops data, but it allows for slight stupidity - // // meaning, they may not have read all the master requestFrom() data yet - // if(rxBufferIndex < rxBufferLength){ - // return; - // } - - // copy twi rx buffer into local read buffer - // this enables new reads to happen in parallel - for (uint8_t i = 0; i < numBytes; ++i) { - rxBuffer[i] = inBytes[i]; - } - - // set rx iterator vars - rxBufferIndex = 0; - rxBufferLength = numBytes; - - // alert user program - user_onReceive(numBytes); + // don't bother if user hasn't registered a callback + if (!user_onReceive) + { + return; + } + // // don't bother if rx buffer is in use by a master requestFrom() op + // // i know this drops data, but it allows for slight stupidity + // // meaning, they may not have read all the master requestFrom() data yet + // if(rxBufferIndex < rxBufferLength){ + // return; + // } + + // copy twi rx buffer into local read buffer + // this enables new reads to happen in parallel + for (uint8_t i = 0; i < numBytes; ++i) + { + rxBuffer[i] = inBytes[i]; + } + + // set rx iterator vars + rxBufferIndex = 0; + rxBufferLength = numBytes; + + // alert user program + user_onReceive(numBytes); } void TwoWire::onRequestService(void) { - // don't bother if user hasn't registered a callback - if (!user_onRequest) { - return; - } - - // reset tx buffer iterator vars - // !!! this will kill any pending pre-master sendTo() activity - txBufferIndex = 0; - txBufferLength = 0; - - // alert user program - user_onRequest(); + // don't bother if user hasn't registered a callback + if (!user_onRequest) + { + return; + } + + // reset tx buffer iterator vars + // !!! this will kill any pending pre-master sendTo() activity + txBufferIndex = 0; + txBufferLength = 0; + + // alert user program + user_onRequest(); } -void TwoWire::onReceive( void (*function)(int) ) { - // arduino api compatibility fixer: - // really hope size parameter will not exceed 2^31 :) - static_assert(sizeof(int) == sizeof(size_t), "something is wrong in Arduino kingdom"); - user_onReceive = reinterpret_cast(function); +void TwoWire::onReceive(void (*function)(int)) +{ + // arduino api compatibility fixer: + // really hope size parameter will not exceed 2^31 :) + static_assert(sizeof(int) == sizeof(size_t), "something is wrong in Arduino kingdom"); + user_onReceive = reinterpret_cast(function); } -void TwoWire::onReceive( void (*function)(size_t) ) { - user_onReceive = function; +void TwoWire::onReceive(void (*function)(size_t)) +{ + user_onReceive = function; + twi_enableSlaveMode(); } -void TwoWire::onRequest( void (*function)(void) ){ - user_onRequest = function; +void TwoWire::onRequest(void (*function)(void)) +{ + user_onRequest = function; + twi_enableSlaveMode(); } // Preinstantiate Objects ////////////////////////////////////////////////////// diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index d396f4a84..5d6b36457 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -1,24 +1,24 @@ /* - TwoWire.h - TWI/I2C library for Arduino & Wiring - Copyright (c) 2006 Nicholas Zambetti. All right reserved. + TwoWire.h - TWI/I2C library for Arduino & Wiring + Copyright (c) 2006 Nicholas Zambetti. 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 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. + 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 + 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 - Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts - Modified December 2014 by Ivan Grokhotkov (ivan@esp8266.com) - esp8266 support - Modified April 2015 by Hrsto Gochkov (ficeto@ficeto.com) - alternative esp8266 support + Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts + Modified December 2014 by Ivan Grokhotkov (ivan@esp8266.com) - esp8266 support + Modified April 2015 by Hrsto Gochkov (ficeto@ficeto.com) - alternative esp8266 support */ #ifndef TwoWire_h @@ -33,7 +33,7 @@ class TwoWire : public Stream { - private: +private: static uint8_t rxBuffer[]; static uint8_t rxBufferIndex; static uint8_t rxBufferLength; @@ -48,10 +48,10 @@ class TwoWire : public Stream static void (*user_onReceive)(size_t); static void onRequestService(void); static void onReceiveService(uint8_t*, size_t); - public: +public: TwoWire(); void begin(int sda, int scl); - void begin(int sda, int scl, uint8_t address); + void begin(int sda, int scl, uint8_t address); void pins(int sda, int scl) __attribute__((deprecated)); // use begin(sda, scl) in new code void begin(); void begin(uint8_t); @@ -63,22 +63,22 @@ class TwoWire : public Stream uint8_t endTransmission(void); uint8_t endTransmission(uint8_t); size_t requestFrom(uint8_t address, size_t size, bool sendStop); - uint8_t status(); + uint8_t status(); uint8_t requestFrom(uint8_t, uint8_t); uint8_t requestFrom(uint8_t, uint8_t, uint8_t); uint8_t requestFrom(int, int); uint8_t requestFrom(int, int, int); - + virtual size_t write(uint8_t); virtual size_t write(const uint8_t *, size_t); virtual int available(void); virtual int read(void); virtual int peek(void); virtual void flush(void); - void onReceive( void (*)(int) ); // arduino api - void onReceive( void (*)(size_t) ); // legacy esp8266 backward compatibility - void onRequest( void (*)(void) ); + void onReceive(void (*)(int)); // arduino api + void onReceive(void (*)(size_t)); // legacy esp8266 backward compatibility + void onRequest(void (*)(void)); using Print::write; }; diff --git a/tests/restyle.sh b/tests/restyle.sh index 32a18c107..b085d33dc 100755 --- a/tests/restyle.sh +++ b/tests/restyle.sh @@ -9,7 +9,11 @@ test -d cores/esp8266 test -d libraries #all="cores/esp8266 libraries" -all="libraries/ESP8266mDNS" +all=" +libraries/ESP8266mDNS +libraries/Wire +cores/esp8266/core_esp8266_si2c.cpp +" for d in $all; do for e in c cpp h; do From 40f456aca3a568a09a5bec275b36a79869ce8bef Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Tue, 15 Oct 2019 09:21:18 -0700 Subject: [PATCH 46/58] Dynamically find the Python3 dir on Windows (#6646) Windows installers place each version of Python in their own, uniquely named directory. Can't programatically override w/free Chocolatey, so use the shell and figure it where it installed it dynamically. --- tests/common.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/common.sh b/tests/common.sh index c5184cece..bf329b3ac 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -166,9 +166,12 @@ function install_ide() local debug=$3 if [ "$WINDOWS" = "1" ]; then # Acquire needed packages from Windows package manager - choco install --no-progress python3 - export PATH="/c/Python37:$PATH" # Ensure it's live from now on... - cp /c/Python37/python.exe /c/Python37/python3.exe + choco install --no-progress python3 >& pylog.txt + # Parse the python instrall dir from the output log. Sorry, can't set it via choco on the free version + PYDIR=$(cat pylog.txt | grep "^Installed to:" | cut -f2 -d"'" | sed 's/C:\\/\/c\//') + echo "Detected python3 install dir: $PYDIR" + export PATH="$PYDIR:$PATH" # Ensure it's live from now on... + cp "$PYDIR/python.exe" "$PYDIR/python3.exe" choco install --no-progress unzip choco install --no-progress sed #choco install --no-progress golang From 45d71ae4bd471284c60bb3b654535a94cdb3a8ed Mon Sep 17 00:00:00 2001 From: Robin Richtsfeld Date: Wed, 16 Oct 2019 10:11:15 +0200 Subject: [PATCH 47/58] Support FS update in two steps (#6505) * Support FS update in two steps --- cores/esp8266/Updater.cpp | 47 +++++++++++++++---- doc/ota_updates/readme.rst | 2 + .../src/ESP8266httpUpdate.cpp | 4 ++ 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index d6b6b621f..b028e19b9 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -23,6 +23,7 @@ extern "C" { } extern "C" uint32_t _FS_start; +extern "C" uint32_t _FS_end; UpdaterClass::UpdaterClass() : _async(false) @@ -105,15 +106,17 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { wifi_set_sleep_type(NONE_SLEEP_T); + //address where we will start writing the update uintptr_t updateStartAddress = 0; + //size of current sketch rounded to a sector + size_t currentSketchSize = (ESP.getSketchSize() + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); + //size of the update rounded to a sector + size_t roundedSize = (size + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); + if (command == U_FLASH) { - //size of current sketch rounded to a sector - size_t currentSketchSize = (ESP.getSketchSize() + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); //address of the end of the space available for sketch and update uintptr_t updateEndAddress = (uintptr_t)&_FS_start - 0x40200000; - //size of the update rounded to a sector - size_t roundedSize = (size + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1)); - //address where we will start writing the update + updateStartAddress = (updateEndAddress > roundedSize)? (updateEndAddress - roundedSize) : 0; #ifdef DEBUG_UPDATER @@ -129,7 +132,24 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { } } else if (command == U_FS) { - updateStartAddress = (uintptr_t)&_FS_start - 0x40200000; + if((uintptr_t)&_FS_start + roundedSize > (uintptr_t)&_FS_end) { + _setError(UPDATE_ERROR_SPACE); + return false; + } + +#ifdef ATOMIC_FS_UPDATE + //address of the end of the space available for update + uintptr_t updateEndAddress = (uintptr_t)&_FS_start - 0x40200000; + + updateStartAddress = (updateEndAddress > roundedSize)? (updateEndAddress - roundedSize) : 0; + + if(updateStartAddress < currentSketchSize) { + _setError(UPDATE_ERROR_SPACE); + return false; + } +#else + updateStartAddress = (uintptr_t)&_FS_start - 0x40200000; +#endif } else { // unknown command @@ -272,8 +292,19 @@ bool UpdaterClass::end(bool evenIfRemaining){ #ifdef DEBUG_UPDATER DEBUG_UPDATER.printf_P(PSTR("Staged: address:0x%08X, size:0x%08zX\n"), _startAddress, _size); +#endif } else if (_command == U_FS) { +#ifdef ATOMIC_FS_UPDATE + eboot_command ebcmd; + ebcmd.action = ACTION_COPY_RAW; + ebcmd.args[0] = _startAddress; + ebcmd.args[1] = (uintptr_t)&_FS_start - 0x40200000; + ebcmd.args[2] = _size; + eboot_command_write(&ebcmd); +#endif + +#ifdef DEBUG_UPDATER DEBUG_UPDATER.printf_P(PSTR("Filesystem: address:0x%08X, size:0x%08zX\n"), _startAddress, _size); #endif } @@ -387,7 +418,7 @@ bool UpdaterClass::_verifyHeader(uint8_t data) { } return true; } else if(_command == U_FS) { - // no check of SPIFFS possible with first byte. + // no check of FS possible with first byte. return true; } return false; @@ -421,7 +452,7 @@ bool UpdaterClass::_verifyEnd() { return true; } else if(_command == U_FS) { - // SPIFFS is already over written checks make no sense any more. + // FS is already over written checks make no sense any more. return true; } return false; diff --git a/doc/ota_updates/readme.rst b/doc/ota_updates/readme.rst index 67f4f9110..f5c76f0d2 100644 --- a/doc/ota_updates/readme.rst +++ b/doc/ota_updates/readme.rst @@ -646,6 +646,8 @@ Update process - memory view - the new sketch is now copied "over" the old one. - the new sketch is started. +By default, filesystem updates are overriding the target flash directly. In order to use the same two step process set the `ATOMIC_FS_UPDATE` flag. + .. figure:: update_memory_copy.png :alt: Memory layout for OTA updates diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 0090390a7..8787562d6 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -389,7 +389,11 @@ HTTPUpdateResult ESP8266HTTPUpdate::handleUpdate(HTTPClient& http, const String& DEBUG_HTTP_UPDATE("[httpUpdate] Update ok\n"); http.end(); +#ifdef ATOMIC_FS_UPDATE + if(_rebootOnUpdate) { +#else if(_rebootOnUpdate && !spiffs) { +#endif ESP.restart(); } From 855b91ea69260f9295c3ebbf5727798bba10f2f7 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Fri, 18 Oct 2019 17:59:26 +0200 Subject: [PATCH 48/58] EspSoftwareSerial bug fix update 5.3.4 (#6651) --- libraries/SoftwareSerial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 67836ae6e..8f85d6490 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 67836ae6eecabafd760d32168144f82d46f3b201 +Subproject commit 8f85d649000b5bbdde1862d879dba4f225dd3a51 From 1e17dddd895883806c9bfd3dd7b7042aa813d94f Mon Sep 17 00:00:00 2001 From: Dirk Mueller Date: Sat, 19 Oct 2019 18:10:41 +0200 Subject: [PATCH 49/58] Fix inconsistent CRLF/LF combinations (#6653) These files had either CRLF, LFCR or LF or a mixture of it. Consistently format them as git text files (unix style) with trailing whitespace removed. --- cores/esp8266/HardwareSerial.cpp | 332 +++++++++++++------------- cores/esp8266/StreamString.h | 78 +++--- cores/esp8266/base64.cpp | 142 +++++------ cores/esp8266/base64.h | 78 +++--- cores/esp8266/core_esp8266_features.h | 156 ++++++------ cores/esp8266/debug.cpp | 72 +++--- 6 files changed, 429 insertions(+), 429 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index fc270cfed..129b55eda 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -1,168 +1,168 @@ -/* - HardwareSerial.cpp - esp8266 UART support - - 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 - - Modified 31 March 2015 by Markus Sattler (rewrite the code for UART0 + UART1 support in ESP8266) - Modified 25 April 2015 by Thomas Flayols (add configuration different from 8N1 in ESP8266) - Modified 3 May 2015 by Hristo Gochkov (change register access methods) - */ - -#include -#include -#include -#include -#include -#include "Arduino.h" -#include "HardwareSerial.h" -#include "Esp.h" - -HardwareSerial::HardwareSerial(int uart_nr) - : _uart_nr(uart_nr), _rx_size(256) -{} - -void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin) -{ - end(); - _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin, _rx_size); -#if defined(DEBUG_ESP_PORT) && !defined(NDEBUG) - if (static_cast(this) == static_cast(&DEBUG_ESP_PORT)) - { - setDebugOutput(true); - println(); - println(ESP.getFullVersion()); - } -#endif -} - -void HardwareSerial::end() -{ - if(uart_get_debug() == _uart_nr) { - uart_set_debug(UART_NO); - } - - uart_uninit(_uart); - _uart = NULL; -} - -void HardwareSerial::updateBaudRate(unsigned long baud) -{ - if(!_uart) { - return; - } - - uart_set_baudrate(_uart, baud); -} - -size_t HardwareSerial::setRxBufferSize(size_t size){ - if(_uart) { - _rx_size = uart_resize_rx_buffer(_uart, size); - } else { - _rx_size = size; - } - return _rx_size; -} - -void HardwareSerial::setDebugOutput(bool en) -{ - if(!_uart) { - return; - } - if(en) { - if(uart_tx_enabled(_uart)) { - uart_set_debug(_uart_nr); - } else { - uart_set_debug(UART_NO); - } - } else { - // disable debug for this interface - if(uart_get_debug() == _uart_nr) { - uart_set_debug(UART_NO); - } - } -} - -int HardwareSerial::available(void) -{ - int result = static_cast(uart_rx_available(_uart)); - if (!result) { - optimistic_yield(10000); - } - return result; -} - -void HardwareSerial::flush() -{ +/* + HardwareSerial.cpp - esp8266 UART support + + 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 + + Modified 31 March 2015 by Markus Sattler (rewrite the code for UART0 + UART1 support in ESP8266) + Modified 25 April 2015 by Thomas Flayols (add configuration different from 8N1 in ESP8266) + Modified 3 May 2015 by Hristo Gochkov (change register access methods) + */ + +#include +#include +#include +#include +#include +#include "Arduino.h" +#include "HardwareSerial.h" +#include "Esp.h" + +HardwareSerial::HardwareSerial(int uart_nr) + : _uart_nr(uart_nr), _rx_size(256) +{} + +void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin) +{ + end(); + _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin, _rx_size); +#if defined(DEBUG_ESP_PORT) && !defined(NDEBUG) + if (static_cast(this) == static_cast(&DEBUG_ESP_PORT)) + { + setDebugOutput(true); + println(); + println(ESP.getFullVersion()); + } +#endif +} + +void HardwareSerial::end() +{ + if(uart_get_debug() == _uart_nr) { + uart_set_debug(UART_NO); + } + + uart_uninit(_uart); + _uart = NULL; +} + +void HardwareSerial::updateBaudRate(unsigned long baud) +{ + if(!_uart) { + return; + } + + uart_set_baudrate(_uart, baud); +} + +size_t HardwareSerial::setRxBufferSize(size_t size){ + if(_uart) { + _rx_size = uart_resize_rx_buffer(_uart, size); + } else { + _rx_size = size; + } + return _rx_size; +} + +void HardwareSerial::setDebugOutput(bool en) +{ + if(!_uart) { + return; + } + if(en) { + if(uart_tx_enabled(_uart)) { + uart_set_debug(_uart_nr); + } else { + uart_set_debug(UART_NO); + } + } else { + // disable debug for this interface + if(uart_get_debug() == _uart_nr) { + uart_set_debug(UART_NO); + } + } +} + +int HardwareSerial::available(void) +{ + int result = static_cast(uart_rx_available(_uart)); + if (!result) { + optimistic_yield(10000); + } + return result; +} + +void HardwareSerial::flush() +{ uint8_t bit_length = 0; - if(!_uart || !uart_tx_enabled(_uart)) { - return; - } - + if(!_uart || !uart_tx_enabled(_uart)) { + return; + } + bit_length = uart_get_bit_length(_uart_nr); // data width, parity and stop - uart_wait_tx_empty(_uart); - //Workaround for a bug in serial not actually being finished yet - //Wait for 8 data bits, 1 parity and 2 stop bits, just in case - delayMicroseconds(bit_length * 1000000 / uart_get_baudrate(_uart) + 1); -} - -void HardwareSerial::startDetectBaudrate() -{ - uart_start_detect_baudrate(_uart_nr); -} - -unsigned long HardwareSerial::testBaudrate() -{ - return uart_detect_baudrate(_uart_nr); -} - -unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis) -{ - esp8266::polledTimeout::oneShotFastMs timeOut(timeoutMillis); - unsigned long detectedBaudrate; - while (!timeOut) { - if ((detectedBaudrate = testBaudrate())) { - break; - } - yield(); - delay(100); - } - return detectedBaudrate; -} - -size_t HardwareSerial::readBytes(char* buffer, size_t size) -{ - size_t got = 0; - - while (got < size) - { - esp8266::polledTimeout::oneShotFastMs timeOut(_timeout); - size_t avail; - while ((avail = available()) == 0 && !timeOut); - if (avail == 0) - break; - got += read(buffer + got, std::min(size - got, avail)); - } - return got; -} - -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL) -HardwareSerial Serial(UART0); -#endif -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL1) -HardwareSerial Serial1(UART1); -#endif + uart_wait_tx_empty(_uart); + //Workaround for a bug in serial not actually being finished yet + //Wait for 8 data bits, 1 parity and 2 stop bits, just in case + delayMicroseconds(bit_length * 1000000 / uart_get_baudrate(_uart) + 1); +} + +void HardwareSerial::startDetectBaudrate() +{ + uart_start_detect_baudrate(_uart_nr); +} + +unsigned long HardwareSerial::testBaudrate() +{ + return uart_detect_baudrate(_uart_nr); +} + +unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis) +{ + esp8266::polledTimeout::oneShotFastMs timeOut(timeoutMillis); + unsigned long detectedBaudrate; + while (!timeOut) { + if ((detectedBaudrate = testBaudrate())) { + break; + } + yield(); + delay(100); + } + return detectedBaudrate; +} + +size_t HardwareSerial::readBytes(char* buffer, size_t size) +{ + size_t got = 0; + + while (got < size) + { + esp8266::polledTimeout::oneShotFastMs timeOut(_timeout); + size_t avail; + while ((avail = available()) == 0 && !timeOut); + if (avail == 0) + break; + got += read(buffer + got, std::min(size - got, avail)); + } + return got; +} + +#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL) +HardwareSerial Serial(UART0); +#endif +#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL1) +HardwareSerial Serial1(UART1); +#endif diff --git a/cores/esp8266/StreamString.h b/cores/esp8266/StreamString.h index 1fedc18de..2e81fa14a 100644 --- a/cores/esp8266/StreamString.h +++ b/cores/esp8266/StreamString.h @@ -1,39 +1,39 @@ -/** - StreamString.h - - Copyright (c) 2015 Markus Sattler. 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 - -*/ - -#ifndef STREAMSTRING_H_ -#define STREAMSTRING_H_ - - -class StreamString: public Stream, public String { -public: - size_t write(const uint8_t *buffer, size_t size) override; - size_t write(uint8_t data) override; - - int available() override; - int read() override; - int peek() override; - void flush() override; -}; - - -#endif /* STREAMSTRING_H_ */ +/** + StreamString.h + + Copyright (c) 2015 Markus Sattler. 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 + +*/ + +#ifndef STREAMSTRING_H_ +#define STREAMSTRING_H_ + + +class StreamString: public Stream, public String { +public: + size_t write(const uint8_t *buffer, size_t size) override; + size_t write(uint8_t data) override; + + int available() override; + int read() override; + int peek() override; + void flush() override; +}; + + +#endif /* STREAMSTRING_H_ */ diff --git a/cores/esp8266/base64.cpp b/cores/esp8266/base64.cpp index 7771153b0..f0d079352 100644 --- a/cores/esp8266/base64.cpp +++ b/cores/esp8266/base64.cpp @@ -1,71 +1,71 @@ -/** - * base64.cpp - * - * Created on: 09.12.2015 - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266 core for Arduino. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "Arduino.h" -extern "C" { -#include "libb64/cdecode.h" -#include "libb64/cencode.h" -} -#include "base64.h" - -/** - * convert input data to base64 - * @param data const uint8_t * - * @param length size_t - * @return String - */ -String base64::encode(const uint8_t * data, size_t length, bool doNewLines) { - // base64 needs more size then the source data, use cencode.h macros - size_t size = ((doNewLines ? base64_encode_expected_len(length) - : base64_encode_expected_len_nonewlines(length)) + 1); - char * buffer = (char *) malloc(size); - if(buffer) { - base64_encodestate _state; - if(doNewLines) - { - base64_init_encodestate(&_state); - } - else - { - base64_init_encodestate_nonewlines(&_state); - } - int len = base64_encode_block((const char *) &data[0], length, &buffer[0], &_state); - len = base64_encode_blockend((buffer + len), &_state); - - String base64 = String(buffer); - free(buffer); - return base64; - } - return String("-FAIL-"); -} - -/** - * convert input data to base64 - * @param text const String& - * @return String - */ -String base64::encode(const String& text, bool doNewLines) { - return base64::encode((const uint8_t *) text.c_str(), text.length(), doNewLines); -} - +/** + * base64.cpp + * + * Created on: 09.12.2015 + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the ESP8266 core for Arduino. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "Arduino.h" +extern "C" { +#include "libb64/cdecode.h" +#include "libb64/cencode.h" +} +#include "base64.h" + +/** + * convert input data to base64 + * @param data const uint8_t * + * @param length size_t + * @return String + */ +String base64::encode(const uint8_t * data, size_t length, bool doNewLines) { + // base64 needs more size then the source data, use cencode.h macros + size_t size = ((doNewLines ? base64_encode_expected_len(length) + : base64_encode_expected_len_nonewlines(length)) + 1); + char * buffer = (char *) malloc(size); + if(buffer) { + base64_encodestate _state; + if(doNewLines) + { + base64_init_encodestate(&_state); + } + else + { + base64_init_encodestate_nonewlines(&_state); + } + int len = base64_encode_block((const char *) &data[0], length, &buffer[0], &_state); + len = base64_encode_blockend((buffer + len), &_state); + + String base64 = String(buffer); + free(buffer); + return base64; + } + return String("-FAIL-"); +} + +/** + * convert input data to base64 + * @param text const String& + * @return String + */ +String base64::encode(const String& text, bool doNewLines) { + return base64::encode((const uint8_t *) text.c_str(), text.length(), doNewLines); +} + diff --git a/cores/esp8266/base64.h b/cores/esp8266/base64.h index 2816877da..1d6e22fac 100644 --- a/cores/esp8266/base64.h +++ b/cores/esp8266/base64.h @@ -1,39 +1,39 @@ -/** - * base64.h - * - * Created on: 09.12.2015 - * - * Copyright (c) 2015 Markus Sattler. All rights reserved. - * This file is part of the ESP8266 core for Arduino. - * - * 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 CORE_BASE64_H_ -#define CORE_BASE64_H_ - -class base64 { - public: - // NOTE: The default behaviour of backend (lib64) - // is to add a newline every 72 (encoded) characters output. - // This may 'break' longer uris and json variables - static String encode(const uint8_t * data, size_t length, bool doNewLines = true); - static String encode(const String& text, bool doNewLines = true); - private: -}; - - -#endif /* CORE_BASE64_H_ */ +/** + * base64.h + * + * Created on: 09.12.2015 + * + * Copyright (c) 2015 Markus Sattler. All rights reserved. + * This file is part of the ESP8266 core for Arduino. + * + * 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 CORE_BASE64_H_ +#define CORE_BASE64_H_ + +class base64 { + public: + // NOTE: The default behaviour of backend (lib64) + // is to add a newline every 72 (encoded) characters output. + // This may 'break' longer uris and json variables + static String encode(const uint8_t * data, size_t length, bool doNewLines = true); + static String encode(const String& text, bool doNewLines = true); + private: +}; + + +#endif /* CORE_BASE64_H_ */ diff --git a/cores/esp8266/core_esp8266_features.h b/cores/esp8266/core_esp8266_features.h index 6b8e22c9b..05bbc4c5c 100644 --- a/cores/esp8266/core_esp8266_features.h +++ b/cores/esp8266/core_esp8266_features.h @@ -1,50 +1,50 @@ -/* - core_esp8266_features.h - list of features integrated in to ESP8266 core - - 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 - - */ - - -#ifndef CORE_ESP8266_FEATURES_H -#define CORE_ESP8266_FEATURES_H - - -#define CORE_HAS_LIBB64 -#define CORE_HAS_BASE64_CLASS -#define CORE_HAS_CXA_GUARD -#define CORE_HAS_UMM - -#define WIFI_HAS_EVENT_CALLBACK - -#ifdef __cplusplus - -#include // malloc() -#include // size_t - +/* + core_esp8266_features.h - list of features integrated in to ESP8266 core + + 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 + + */ + + +#ifndef CORE_ESP8266_FEATURES_H +#define CORE_ESP8266_FEATURES_H + + +#define CORE_HAS_LIBB64 +#define CORE_HAS_BASE64_CLASS +#define CORE_HAS_CXA_GUARD +#define CORE_HAS_UMM + +#define WIFI_HAS_EVENT_CALLBACK + +#ifdef __cplusplus + +#include // malloc() +#include // size_t + namespace arduino -{ +{ extern "C++" template T* new0 (size_t n, TConstructorArgs... TconstructorArgs) - { - // n==0: single allocation, otherwise it is an array - size_t offset = n? sizeof(size_t): 0; + { + // n==0: single allocation, otherwise it is an array + size_t offset = n? sizeof(size_t): 0; size_t arraysize = n? n: 1; T* ptr = (T*)malloc(offset + (arraysize * sizeof(T))); if (ptr) @@ -54,43 +54,43 @@ namespace arduino for (size_t i = 0; i < arraysize; i++) new (ptr + offset + i * sizeof(T)) T(TconstructorArgs...); return ptr + offset; - } + } return nullptr; } } - -#define arduino_new(Type, ...) arduino::new0(0, ##__VA_ARGS__) -#define arduino_newarray(Type, n, ...) arduino::new0(n, ##__VA_ARGS__) - -#endif // __cplusplus - -#ifndef __STRINGIFY -#define __STRINGIFY(a) #a -#endif - -// these low level routines provide a replacement for SREG interrupt save that AVR uses -// but are esp8266 specific. A normal use pattern is like -// -//{ -// uint32_t savedPS = xt_rsil(1); // this routine will allow level 2 and above -// // do work here -// xt_wsr_ps(savedPS); // restore the state -//} -// -// level (0-15), interrupts of the given level and above will be active -// level 15 will disable ALL interrupts, -// level 0 will enable ALL interrupts, -// -#ifndef CORE_MOCK -#define xt_rsil(level) (__extension__({uint32_t state; __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state) :: "memory"); state;})) -#define xt_wsr_ps(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory") - + +#define arduino_new(Type, ...) arduino::new0(0, ##__VA_ARGS__) +#define arduino_newarray(Type, n, ...) arduino::new0(n, ##__VA_ARGS__) + +#endif // __cplusplus + +#ifndef __STRINGIFY +#define __STRINGIFY(a) #a +#endif + +// these low level routines provide a replacement for SREG interrupt save that AVR uses +// but are esp8266 specific. A normal use pattern is like +// +//{ +// uint32_t savedPS = xt_rsil(1); // this routine will allow level 2 and above +// // do work here +// xt_wsr_ps(savedPS); // restore the state +//} +// +// level (0-15), interrupts of the given level and above will be active +// level 15 will disable ALL interrupts, +// level 0 will enable ALL interrupts, +// +#ifndef CORE_MOCK +#define xt_rsil(level) (__extension__({uint32_t state; __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state) :: "memory"); state;})) +#define xt_wsr_ps(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory") + inline uint32_t esp_get_cycle_count() __attribute__((always_inline)); inline uint32_t esp_get_cycle_count() { - uint32_t ccount; - __asm__ __volatile__("rsr %0,ccount":"=a"(ccount)); - return ccount; -} -#endif // not CORE_MOCK - -#endif // CORE_ESP8266_FEATURES_H + uint32_t ccount; + __asm__ __volatile__("rsr %0,ccount":"=a"(ccount)); + return ccount; +} +#endif // not CORE_MOCK + +#endif // CORE_ESP8266_FEATURES_H diff --git a/cores/esp8266/debug.cpp b/cores/esp8266/debug.cpp index d8bf8bb11..0d0bde2df 100644 --- a/cores/esp8266/debug.cpp +++ b/cores/esp8266/debug.cpp @@ -1,36 +1,36 @@ -/* - debug.cpp - debug helper functions - Copyright (c) 2015 Markus Sattler. 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 - */ - -#include "Arduino.h" -#include "debug.h" - -void ICACHE_RAM_ATTR hexdump(const void *mem, uint32_t len, uint8_t cols) { - const uint8_t* src = (const uint8_t*) mem; - os_printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); - for(uint32_t i = 0; i < len; i++) { - if(i % cols == 0) { - os_printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); - yield(); - } - os_printf("%02X ", *src); - src++; - } - os_printf("\n"); -} +/* + debug.cpp - debug helper functions + Copyright (c) 2015 Markus Sattler. 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 + */ + +#include "Arduino.h" +#include "debug.h" + +void ICACHE_RAM_ATTR hexdump(const void *mem, uint32_t len, uint8_t cols) { + const uint8_t* src = (const uint8_t*) mem; + os_printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + os_printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + yield(); + } + os_printf("%02X ", *src); + src++; + } + os_printf("\n"); +} From 41ba21613db91ea34c5d2dd00b09b38d9adedc40 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 26 Oct 2019 13:58:54 -0700 Subject: [PATCH 50/58] Fix Python3 errors for device tests (#6670) * Fix Python3 errors for device tests The Python3 migration didn't include fixes for local scripts in the device test tree. Fatal build and run Python errors fixed. The last update to xunitmerge is ~5 years ago, so it looks to be unsupported now. Use a local copy of the two components to allow patching to work with Python3. The serial test seems to send garbage chars (non-ASCII/etc.), so use a codepage 437 which supports all 255 chars. Fixes: #6660 * Run tests at 160MHz (req'd for some SSL connections) * Fix debuglevel options for builder * Fix Python3 interpreter path in xunitmerge * Remove virtualenv on "make clean" * Add appropriate attribution, license to xunitmerge Add like to the original sources with the author's license to the copied/fixed xunitmerge files. --- tests/device/Makefile | 9 +- .../device/libraries/BSTest/requirements.txt | 3 +- tests/device/libraries/BSTest/runner.py | 4 +- tests/device/libraries/BSTest/xmerge.py | 154 ++++++++++++++++++ tests/device/libraries/BSTest/xunitmerge | 50 ++++++ .../test_ClientContext/test_ClientContext.py | 16 +- .../test_http_client/test_http_client.py | 8 +- .../test_http_server/test_http_server.py | 15 +- 8 files changed, 232 insertions(+), 27 deletions(-) create mode 100644 tests/device/libraries/BSTest/xmerge.py create mode 100755 tests/device/libraries/BSTest/xunitmerge diff --git a/tests/device/Makefile b/tests/device/Makefile index b34cb0dbb..5062e4b2a 100644 --- a/tests/device/Makefile +++ b/tests/device/Makefile @@ -11,9 +11,9 @@ UPLOAD_PORT ?= $(shell ls /dev/tty* | grep -m 1 -i USB) UPLOAD_BAUD ?= 460800 UPLOAD_BOARD ?= nodemcu BS_DIR ?= libraries/BSTest -DEBUG_LEVEL ?= DebugLevel=None____ +DEBUG_LEVEL ?= lvl=None____ #FQBN ?= esp8266com:esp8266:generic:CpuFrequency=80,FlashFreq=40,FlashMode=dio,UploadSpeed=115200,FlashSize=4M1M,LwIPVariant=v2mss536,ResetMethod=none,Debug=Serial,$(DEBUG_LEVEL) -FQBN ?= esp8266com:esp8266:generic:xtal=80,FlashFreq=40,FlashMode=dio,baud=115200,eesz=4M1M,ip=lm2f,ResetMethod=none,dbg=Serial,$(DEBUG_LEVEL) +FQBN ?= esp8266com:esp8266:generic:xtal=160,FlashFreq=40,FlashMode=dio,baud=115200,eesz=4M1M,ip=lm2f,ResetMethod=none,dbg=Serial,$(DEBUG_LEVEL) BUILD_TOOL := $(ARDUINO_IDE_PATH)/arduino-builder TEST_CONFIG := test_env.cfg TEST_REPORT_XML := test_report.xml @@ -104,7 +104,7 @@ ifneq ("$(NO_RUN)","1") endif $(TEST_REPORT_XML): $(HARDWARE_DIR) virtualenv - $(SILENT)$(BS_DIR)/virtualenv/bin/xunitmerge $(shell find $(BUILD_DIR) -name 'test_result.xml' | xargs echo) $(TEST_REPORT_XML) + $(SILENT)$(BS_DIR)/xunitmerge $(shell find $(BUILD_DIR) -name 'test_result.xml' | xargs echo) $(TEST_REPORT_XML) $(TEST_REPORT_HTML): $(TEST_REPORT_XML) | virtualenv $(SILENT)$(BS_DIR)/virtualenv/bin/junit2html $< $@ @@ -124,7 +124,8 @@ virtualenv: clean: rm -rf $(BUILD_DIR) - rm -rf $(HARDWARE_DIR) + rm -rf $(HARDWARE_DIR)A + rm -rf $(BS_DIR)/virtualenv rm -f $(TEST_REPORT_HTML) $(TEST_REPORT_XML) distclean: clean diff --git a/tests/device/libraries/BSTest/requirements.txt b/tests/device/libraries/BSTest/requirements.txt index d31484d2a..a65d9b170 100644 --- a/tests/device/libraries/BSTest/requirements.txt +++ b/tests/device/libraries/BSTest/requirements.txt @@ -3,6 +3,5 @@ junit-xml MarkupSafe pexpect pyserial -xunitmerge junit2html -poster +poster3 diff --git a/tests/device/libraries/BSTest/runner.py b/tests/device/libraries/BSTest/runner.py index 425ac2a42..97849a5e3 100644 --- a/tests/device/libraries/BSTest/runner.py +++ b/tests/device/libraries/BSTest/runner.py @@ -236,10 +236,10 @@ ser = None def spawn_port(port_name, baudrate=115200): global ser ser = serial.serial_for_url(port_name, baudrate=baudrate) - return fdpexpect.fdspawn(ser, 'wb', timeout=0) + return fdpexpect.fdspawn(ser, 'wb', timeout=0, encoding='cp437') def spawn_exec(name): - return pexpect.spawn(name, timeout=0) + return pexpect.spawn(name, timeout=0, encoding='cp437') def run_tests(spawn, name, mocks, env_vars): tw = BSTestRunner(spawn, name, mocks, env_vars) diff --git a/tests/device/libraries/BSTest/xmerge.py b/tests/device/libraries/BSTest/xmerge.py new file mode 100644 index 000000000..c10ca7297 --- /dev/null +++ b/tests/device/libraries/BSTest/xmerge.py @@ -0,0 +1,154 @@ +# Cloned from https://github.com/miki725/xunitmerge +# to fix a Python3 error. +# +# xunitmerge is MIT licensed by Miroslav Shubernetskiy https://github.com/miki725 +# +# The MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +from contextlib import contextmanager +from xml.etree import ElementTree as etree +from xml.sax.saxutils import quoteattr + +import six + + +CNAME_TAGS = ('system-out', 'skipped', 'error', 'failure') +CNAME_PATTERN = '' +TAG_PATTERN = '<{tag}{attrs}>{text}' + + +@contextmanager +def patch_etree_cname(etree): + """ + Patch ElementTree's _serialize_xml function so that it will + write text as CDATA tag for tags tags defined in CNAME_TAGS. + + >>> import re + >>> from xml.etree import ElementTree + >>> xml_string = ''' + ... + ... + ... Some output here + ... + ... + ... Skipped + ... + ... + ... Error here + ... + ... + ... Failure here + ... + ... + ... ''' + >>> tree = ElementTree.fromstring(xml_string) + >>> with patch_etree_cname(ElementTree): + ... saved = str(ElementTree.tostring(tree)) + >>> systemout = re.findall(r'(.*?)', saved)[0] + >>> print(systemout) + + >>> skipped = re.findall(r'()', saved)[0] + >>> print(skipped) + + >>> error = re.findall(r'()', saved)[0] + >>> print(error) + + >>> failure = re.findall(r'()', saved)[0] + >>> print(failure) + + """ + original_serialize = etree._serialize_xml + + def _serialize_xml(write, elem, *args, **kwargs): + if elem.tag in CNAME_TAGS: + attrs = ' '.join( + ['{}={}'.format(k, quoteattr(v)) + for k, v in sorted(elem.attrib.items())] + ) + attrs = ' ' + attrs if attrs else '' + text = CNAME_PATTERN.format(elem.text) + write(TAG_PATTERN.format( + tag=elem.tag, + attrs=attrs, + text=text + )) + else: + original_serialize(write, elem, *args, **kwargs) + + etree._serialize_xml = etree._serialize['xml'] = _serialize_xml + + yield + + etree._serialize_xml = etree._serialize['xml'] = original_serialize + + +def merge_trees(*trees): + """ + Merge all given XUnit ElementTrees into a single ElementTree. + This combines all of the children test-cases and also merges + all of the metadata of how many tests were executed, etc. + """ + first_tree = trees[0] + first_root = first_tree.getroot() + + if len(trees) == 0: + return first_tree + + for tree in trees[1:]: + root = tree.getroot() + + # append children elements (testcases) + first_root.extend(root.getchildren()) + + # combine root attributes which stores the number + # of executed tests, skipped tests, etc + for key, value in first_root.attrib.items(): + if not value.isdigit(): + continue + combined = six.text_type(int(value) + int(root.attrib.get(key, '0'))) + first_root.set(key, combined) + + return first_tree + + +def merge_xunit(files, output, callback=None): + """ + Merge the given xunit xml files into a single output xml file. + + If callback is not None, it will be called with the merged ElementTree + before the output file is written (useful for applying other fixes to + the merged file). This can either modify the element tree in place (and + return None) or return a completely new ElementTree to be written. + """ + trees = [] + + for f in files: + trees.append(etree.parse(f)) + + merged = merge_trees(*trees) + + if callback is not None: + result = callback(merged) + if result is not None: + merged = result + + with patch_etree_cname(etree): + merged.write(output, encoding='utf-8', xml_declaration=True) diff --git a/tests/device/libraries/BSTest/xunitmerge b/tests/device/libraries/BSTest/xunitmerge new file mode 100755 index 000000000..61a69f6ec --- /dev/null +++ b/tests/device/libraries/BSTest/xunitmerge @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 + +# Cloned from https://github.com/miki725/xunitmerge +# to fix a Python3 error. +# +# xunitmerge is MIT licensed by Miroslav Shubernetskiy https://github.com/miki725 +# +# The MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import argparse +from xmerge import merge_xunit + + +parser = argparse.ArgumentParser( + description='Utility for merging multiple XUnit xml reports ' + 'into a single xml report.', +) +parser.add_argument( + 'report', + nargs='+', + type=argparse.FileType('r'), + help='Path of XUnit xml report. Multiple can be provided.', +) +parser.add_argument( + 'output', + help='Path where merged of XUnit will be saved.', +) + + +if __name__ == '__main__': + args = parser.parse_args() + merge_xunit(args.report, args.output) diff --git a/tests/device/test_ClientContext/test_ClientContext.py b/tests/device/test_ClientContext/test_ClientContext.py index ae29bcd2f..6650e1cfd 100644 --- a/tests/device/test_ClientContext/test_ClientContext.py +++ b/tests/device/test_ClientContext/test_ClientContext.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + from mock_decorators import setup, teardown from flask import Flask, request from threading import Thread @@ -21,7 +23,7 @@ def setup_tcpsrv(e): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) for port in range(8266, 8285 + 1): try: - print >>sys.stderr, 'trying port', port + print ('trying port %d' %port, file=sys.stderr) server_address = ("0.0.0.0", port) sock.bind(server_address) sock.listen(1) @@ -31,17 +33,17 @@ def setup_tcpsrv(e): print >>sys.stderr, 'busy' if not running: return - print >>sys.stderr, 'starting up on %s port %s' % server_address - print >>sys.stderr, 'waiting for connections' + print ('starting up on %s port %s' % server_address, file=sys.stderr) + print ( 'waiting for connections', file=sys.stderr) while running: - print >>sys.stderr, 'loop' + print ('loop', file=sys.stderr) readable, writable, errored = select.select([sock], [], [], 1.0) if readable: connection, client_address = sock.accept() try: - print >>sys.stderr, 'client connected:', client_address + print('client connected: %s' % str(client_address), file=sys.stderr) finally: - print >>sys.stderr, 'close' + print ('close', file=sys.stderr) connection.shutdown(socket.SHUT_RDWR) connection.close() @@ -54,7 +56,7 @@ def teardown_tcpsrv(e): global thread global running - print >>sys.stderr, 'closing' + print ('closing', file=sys.stderr) running = False thread.join() return 0 diff --git a/tests/device/test_http_client/test_http_client.py b/tests/device/test_http_client/test_http_client.py index d991ca985..83bc4e8c1 100644 --- a/tests/device/test_http_client/test_http_client.py +++ b/tests/device/test_http_client/test_http_client.py @@ -1,7 +1,7 @@ from mock_decorators import setup, teardown from flask import Flask, request, redirect from threading import Thread -import urllib2 +import urllib import os import ssl import time @@ -20,7 +20,7 @@ def setup_http_get(e): return 'Server shutting down...' @app.route("/", methods = ['GET', 'POST']) def root(): - print('Got data: ' + request.data); + print('Got data: ' + request.data.decode()); return 'hello!!!' @app.route("/data") def get_data(): @@ -48,7 +48,7 @@ def setup_http_get(e): @teardown('HTTP GET & POST requests') def teardown_http_get(e): - response = urllib2.urlopen('http://localhost:8088/shutdown') + response = urllib.request.urlopen('http://localhost:8088/shutdown') html = response.read() time.sleep(1) # avoid address in use error on macOS @@ -86,6 +86,6 @@ def teardown_http_get(e): ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE p = os.path.dirname(os.path.abspath(__file__)) - response = urllib2.urlopen('https://localhost:8088/shutdown', context=ctx) + response = urllib.request.urlopen('https://localhost:8088/shutdown', context=ctx) html = response.read() diff --git a/tests/device/test_http_server/test_http_server.py b/tests/device/test_http_server/test_http_server.py index 319a8a710..e184e367e 100644 --- a/tests/device/test_http_server/test_http_server.py +++ b/tests/device/test_http_server/test_http_server.py @@ -1,10 +1,9 @@ from collections import OrderedDict from mock_decorators import setup, teardown from threading import Thread -from poster.encode import MultipartParam -from poster.encode import multipart_encode -from poster.streaminghttp import register_openers -import urllib2 +from poster3.encode import MultipartParam +from poster3.encode import multipart_encode +from poster3.streaminghttp import register_openers import urllib def http_test(res, url, get=None, post=None): @@ -13,8 +12,8 @@ def http_test(res, url, get=None, post=None): if get: url += '?' + urllib.urlencode(get) if post: - post = urllib.urlencode(post) - request = urllib2.urlopen(url, post, 2) + post = urllib.parse.quote(post) + request = urllib.request.urlopen(url, post, 2) response = request.read() except: return 1 @@ -60,8 +59,8 @@ def setup_http_upload(e): register_openers() p = MultipartParam("file", "0123456789abcdef", "test.txt", "text/plain; charset=utf8") datagen, headers = multipart_encode( [("var4", "val with spaces"), p] ) - request = urllib2.Request('http://etd.local/upload', datagen, headers) - response = urllib2.urlopen(request, None, 2).read() + request = urllib.request('http://etd.local/upload', datagen, headers) + response = urllib.request.urlopen(request, None, 2).read() except: return 1 if response != 'test.txt:16\nvar4 = val with spaces': From fbcc69b989c3d99e862a3ee736c916fcc0d58acf Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 27 Oct 2019 00:06:24 +0200 Subject: [PATCH 51/58] fake library directory: prevent building an archive (#6671) On some cases, this library archive is used but is non existent because there is no source file. disabling archive building fixes this issue. --- libraries/esp8266/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/esp8266/library.properties b/libraries/esp8266/library.properties index 6e1cc8ade..4c879f66a 100644 --- a/libraries/esp8266/library.properties +++ b/libraries/esp8266/library.properties @@ -7,4 +7,4 @@ paragraph= category=Other url= architectures=esp8266 -dot_a_linkage=true +dot_a_linkage=false From 5d0b9aa5ac311b83b38c64c4aef1936f2c87eef9 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 26 Oct 2019 16:45:24 -0700 Subject: [PATCH 52/58] Remove typo in device test "make clean" (#6673) VIM strikes again. --- tests/device/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/device/Makefile b/tests/device/Makefile index 5062e4b2a..dab0ef379 100644 --- a/tests/device/Makefile +++ b/tests/device/Makefile @@ -124,7 +124,7 @@ virtualenv: clean: rm -rf $(BUILD_DIR) - rm -rf $(HARDWARE_DIR)A + rm -rf $(HARDWARE_DIR) rm -rf $(BS_DIR)/virtualenv rm -f $(TEST_REPORT_HTML) $(TEST_REPORT_XML) From 36c369bb8fc8c76945203018e97db70387da6df4 Mon Sep 17 00:00:00 2001 From: Gijs Noorlander Date: Sun, 27 Oct 2019 04:59:19 +0100 Subject: [PATCH 53/58] Double I2C read in one transaction skips a clock pulse (#5528) (#6654) * Double I2C read in one transaction skips a clock pulse (#5528) See https://github.com/esp8266/Arduino/issues/5528 and the more elaborate [description](https://github.com/maarten-pennings/I2C-tool/blob/master/I2Ctest8266/README.md#how-to-fix) where @maarten-pennings did all the hard work, but as far as I could see, no PR was made. I also noticed some code duplication, which I moved to separate functions. According to [this documentation on I2C clock stretching](https://www.i2c-bus.org/clock-stretching/) it is not allowed to have some slave keep the clock low during transmission of a byte, only after an ack. So that's why it is not done in the while loop. But I wondered if there should be an extra delay between the sequence of pulses and the extra added clock "valley". See my comment in the code. Fixes #5528 * [I2C] Restore clock stretch functionality during transfer As requested here: https://github.com/esp8266/Arduino/pull/6654/files/8357a8c644244096cce1df30acd660c35d24a0e4#r339310509 * [I2C] Move duplicated clock stretch call to twi_scl_valley function --- cores/esp8266/core_esp8266_si2c.cpp | 32 +++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/cores/esp8266/core_esp8266_si2c.cpp b/cores/esp8266/core_esp8266_si2c.cpp index 7200f6315..281b19680 100644 --- a/cores/esp8266/core_esp8266_si2c.cpp +++ b/cores/esp8266/core_esp8266_si2c.cpp @@ -128,6 +128,8 @@ private: } } + // Generate a clock "valley" (at the end of a segment, just before a repeated start) + void twi_scl_valley(void); public: void setClock(unsigned int freq); @@ -386,13 +388,16 @@ unsigned char Twi::writeTo(unsigned char address, unsigned char * buf, unsigned { write_stop(); } + else + { + twi_scl_valley(); + // TD-er: Also busywait(twi_dcount) here? + // busywait(twi_dcount); + } i = 0; while (!SDA_READ() && (i++) < 10) { - SCL_LOW(); - busywait(twi_dcount); - SCL_HIGH(); - WAIT_CLOCK_STRETCH(); + twi_scl_valley(); busywait(twi_dcount); } return 0; @@ -422,13 +427,16 @@ unsigned char Twi::readFrom(unsigned char address, unsigned char* buf, unsigned { write_stop(); } + else + { + twi_scl_valley(); + // TD-er: Also busywait(twi_dcount) here? + // busywait(twi_dcount); + } i = 0; while (!SDA_READ() && (i++) < 10) { - SCL_LOW(); - busywait(twi_dcount); - SCL_HIGH(); - WAIT_CLOCK_STRETCH(); + twi_scl_valley(); busywait(twi_dcount); } return 0; @@ -649,6 +657,14 @@ void ICACHE_RAM_ATTR Twi::onTwipEvent(uint8_t status) } } +void Twi::twi_scl_valley(void) +{ + SCL_LOW(); + busywait(twi_dcount); + SCL_HIGH(); + WAIT_CLOCK_STRETCH(); +} + void ICACHE_RAM_ATTR Twi::onTimer(void *unused) { (void)unused; From ba50bd57b81cf4106fe44ab831d5a061facd4be9 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 27 Oct 2019 18:01:28 +0100 Subject: [PATCH 54/58] sdk: testing branch update (v2.2.x), tidy up fw names in menus, add dates (#6672) * sdk: testing branch update (v2.2.x), tidy up fw names in menus, add dates Former default SDK (22y, renamed to 22x-190703) is still available Changelog is included in sdk directory * Keep current FW as default until next release * update for PIO --- boards.txt | 8 ++++--- platform.txt | 2 +- tools/boards.txt.py | 12 +++++----- tools/platformio-build.py | 21 +++++++++++------- .../commitlog-from-221.txt.gz | Bin .../libairkiss.a | Bin .../libcrypto.a | Bin .../libespnow.a | Bin .../libmain.a | Bin .../libnet80211.a | Bin .../libphy.a | Bin .../{NONOSDK22x => NONOSDK22x_190313}/libpp.a | Bin .../libsmartconfig.a | Bin .../libwpa.a | Bin .../libwpa2.a | Bin .../libwps.a | Bin .../{NONOSDK22x => NONOSDK22x_190313}/version | 0 .../commitlog-from-22x-190313.txt.gz} | Bin .../libairkiss.a | Bin .../libcrypto.a | Bin .../libespnow.a | Bin .../libmain.a | Bin .../libnet80211.a | Bin .../libphy.a | Bin .../{NONOSDK22y => NONOSDK22x_190703}/libpp.a | Bin .../libsmartconfig.a | Bin .../libwpa.a | Bin .../libwpa2.a | Bin .../libwps.a | Bin .../{NONOSDK22y => NONOSDK22x_190703}/version | 0 .../commitlog-from-22x-190703.txt.gz | Bin 0 -> 1142 bytes tools/sdk/lib/NONOSDK22x_191024/libairkiss.a | Bin 0 -> 11298 bytes tools/sdk/lib/NONOSDK22x_191024/libcrypto.a | Bin 0 -> 135458 bytes tools/sdk/lib/NONOSDK22x_191024/libespnow.a | Bin 0 -> 72046 bytes tools/sdk/lib/NONOSDK22x_191024/libmain.a | Bin 0 -> 218300 bytes tools/sdk/lib/NONOSDK22x_191024/libnet80211.a | Bin 0 -> 336418 bytes tools/sdk/lib/NONOSDK22x_191024/libphy.a | Bin 0 -> 155884 bytes tools/sdk/lib/NONOSDK22x_191024/libpp.a | Bin 0 -> 266504 bytes .../lib/NONOSDK22x_191024/libsmartconfig.a | Bin 0 -> 118420 bytes tools/sdk/lib/NONOSDK22x_191024/libwpa.a | Bin 0 -> 173286 bytes tools/sdk/lib/NONOSDK22x_191024/libwpa2.a | Bin 0 -> 475222 bytes tools/sdk/lib/NONOSDK22x_191024/libwps.a | Bin 0 -> 322580 bytes tools/sdk/lib/NONOSDK22x_191024/version | 1 + 43 files changed, 27 insertions(+), 17 deletions(-) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/commitlog-from-221.txt.gz (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libairkiss.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libcrypto.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libespnow.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libmain.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libnet80211.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libphy.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libpp.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libsmartconfig.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libwpa.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libwpa2.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/libwps.a (100%) rename tools/sdk/lib/{NONOSDK22x => NONOSDK22x_190313}/version (100%) rename tools/sdk/lib/{NONOSDK22y/commitlog-from-22x.txt.gz => NONOSDK22x_190703/commitlog-from-22x-190313.txt.gz} (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libairkiss.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libcrypto.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libespnow.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libmain.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libnet80211.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libphy.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libpp.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libsmartconfig.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libwpa.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libwpa2.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/libwps.a (100%) rename tools/sdk/lib/{NONOSDK22y => NONOSDK22x_190703}/version (100%) create mode 100644 tools/sdk/lib/NONOSDK22x_191024/commitlog-from-22x-190703.txt.gz create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libairkiss.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libcrypto.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libespnow.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libmain.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libnet80211.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libphy.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libpp.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libsmartconfig.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libwpa.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libwpa2.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/libwps.a create mode 100644 tools/sdk/lib/NONOSDK22x_191024/version diff --git a/boards.txt b/boards.txt index 74509c0b3..e8e009f5f 100644 --- a/boards.txt +++ b/boards.txt @@ -374,11 +374,13 @@ generic.menu.led.15=15 generic.menu.led.15.build.led=-DLED_BUILTIN=15 generic.menu.led.16=16 generic.menu.led.16.build.led=-DLED_BUILTIN=16 -generic.menu.sdk.nonosdk222_100=nonos-sdk 2.2.1+100 (testing) -generic.menu.sdk.nonosdk222_100.build.sdk=NONOSDK22y +generic.menu.sdk.nonosdk222_100=nonos-sdk 2.2.1+100 (190703 approved) +generic.menu.sdk.nonosdk222_100.build.sdk=NONOSDK22x_190703 +generic.menu.sdk.nonosdk222_111=nonos-sdk 2.2.1+111 (191024 testing) +generic.menu.sdk.nonosdk222_111.build.sdk=NONOSDK22x_191024 generic.menu.sdk.nonosdk221=nonos-sdk 2.2.1 (legacy) generic.menu.sdk.nonosdk221.build.sdk=NONOSDK221 -generic.menu.sdk.nonosdk3v0=nonos-sdk pre-3 (known issues) +generic.menu.sdk.nonosdk3v0=nonos-sdk pre-3 (180626 known issues) generic.menu.sdk.nonosdk3v0.build.sdk=NONOSDK3V0 generic.menu.ip.lm2f=v2 Lower Memory generic.menu.ip.lm2f.build.lwip_include=lwip2/include diff --git a/platform.txt b/platform.txt index bfe7912c2..dfeee3ae0 100644 --- a/platform.txt +++ b/platform.txt @@ -39,7 +39,7 @@ build.stdcpp_level=-std=gnu++11 build.float=-u _printf_float -u _scanf_float build.led= -build.sdk=NONOSDK22y +build.sdk=NONOSDK22x_190703 compiler.path={runtime.tools.xtensa-lx106-elf-gcc.path}/bin/ compiler.sdk.path={runtime.platform.path}/tools/sdk diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 79c5af56b..ec29c5d27 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -1366,13 +1366,15 @@ def led (default,max): def sdk (): return { 'sdk': collections.OrderedDict([ - ('.menu.sdk.nonosdk222_100', 'nonos-sdk 2.2.1+100 (testing)'), - ('.menu.sdk.nonosdk222_100.build.sdk', 'NONOSDK22y'), + ('.menu.sdk.nonosdk222_100', 'nonos-sdk 2.2.1+100 (190703 approved)'), + ('.menu.sdk.nonosdk222_100.build.sdk', 'NONOSDK22x_190703'), + ('.menu.sdk.nonosdk222_111', 'nonos-sdk 2.2.1+111 (191024 testing)'), + ('.menu.sdk.nonosdk222_111.build.sdk', 'NONOSDK22x_191024'), + # ('.menu.sdk.nonosdk222_61', 'nonos-sdk 2.2.1+61 (190313 testing)'), + # ('.menu.sdk.nonosdk222_61.build.sdk', 'NONOSDK22x_190313'), ('.menu.sdk.nonosdk221', 'nonos-sdk 2.2.1 (legacy)'), ('.menu.sdk.nonosdk221.build.sdk', 'NONOSDK221'), - # ('.menu.sdk.nonosdk222_61', 'nonos-sdk 2.2.1+61 (testing)'), - # ('.menu.sdk.nonosdk222_61.build.sdk', 'NONOSDK22x'), - ('.menu.sdk.nonosdk3v0', 'nonos-sdk pre-3 (known issues)'), + ('.menu.sdk.nonosdk3v0', 'nonos-sdk pre-3 (180626 known issues)'), ('.menu.sdk.nonosdk3v0.build.sdk', 'NONOSDK3V0'), ]) } diff --git a/tools/platformio-build.py b/tools/platformio-build.py index de225fba1..6c52fd670 100644 --- a/tools/platformio-build.py +++ b/tools/platformio-build.py @@ -164,21 +164,26 @@ if "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK3" in flatten_cppdefines: CPPDEFINES=[("NONOSDK3V0", 1)], LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK3V0")] ) -elif "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x" in flatten_cppdefines: - env.Append( - CPPDEFINES=[("NONOSDK22x", 1)], - LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK22x")] - ) elif "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK221" in flatten_cppdefines: #(previous default) env.Append( CPPDEFINES=[("NONOSDK221", 1)], LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK221")] ) -else: #(default) elif "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22y" in flatten_cppdefines: +elif "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190313" in flatten_cppdefines: env.Append( - CPPDEFINES=[("NONOSDK22y", 1)], - LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK22y")] + CPPDEFINES=[("NONOSDK22x_190313", 1)], + LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK22x_190313")] + ) +elif "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_191024" in flatten_cppdefines: + env.Append( + CPPDEFINES=[("NONOSDK22x_191024", 1)], + LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK22x_191024")] + ) +else: #(default) if "PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK22x_190703" in flatten_cppdefines: + env.Append( + CPPDEFINES=[("NONOSDK22x_190703", 1)], + LIBPATH=[join(FRAMEWORK_DIR, "tools", "sdk", "lib", "NONOSDK22x_190703")] ) # diff --git a/tools/sdk/lib/NONOSDK22x/commitlog-from-221.txt.gz b/tools/sdk/lib/NONOSDK22x_190313/commitlog-from-221.txt.gz similarity index 100% rename from tools/sdk/lib/NONOSDK22x/commitlog-from-221.txt.gz rename to tools/sdk/lib/NONOSDK22x_190313/commitlog-from-221.txt.gz diff --git a/tools/sdk/lib/NONOSDK22x/libairkiss.a b/tools/sdk/lib/NONOSDK22x_190313/libairkiss.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libairkiss.a rename to tools/sdk/lib/NONOSDK22x_190313/libairkiss.a diff --git a/tools/sdk/lib/NONOSDK22x/libcrypto.a b/tools/sdk/lib/NONOSDK22x_190313/libcrypto.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libcrypto.a rename to tools/sdk/lib/NONOSDK22x_190313/libcrypto.a diff --git a/tools/sdk/lib/NONOSDK22x/libespnow.a b/tools/sdk/lib/NONOSDK22x_190313/libespnow.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libespnow.a rename to tools/sdk/lib/NONOSDK22x_190313/libespnow.a diff --git a/tools/sdk/lib/NONOSDK22x/libmain.a b/tools/sdk/lib/NONOSDK22x_190313/libmain.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libmain.a rename to tools/sdk/lib/NONOSDK22x_190313/libmain.a diff --git a/tools/sdk/lib/NONOSDK22x/libnet80211.a b/tools/sdk/lib/NONOSDK22x_190313/libnet80211.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libnet80211.a rename to tools/sdk/lib/NONOSDK22x_190313/libnet80211.a diff --git a/tools/sdk/lib/NONOSDK22x/libphy.a b/tools/sdk/lib/NONOSDK22x_190313/libphy.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libphy.a rename to tools/sdk/lib/NONOSDK22x_190313/libphy.a diff --git a/tools/sdk/lib/NONOSDK22x/libpp.a b/tools/sdk/lib/NONOSDK22x_190313/libpp.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libpp.a rename to tools/sdk/lib/NONOSDK22x_190313/libpp.a diff --git a/tools/sdk/lib/NONOSDK22x/libsmartconfig.a b/tools/sdk/lib/NONOSDK22x_190313/libsmartconfig.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libsmartconfig.a rename to tools/sdk/lib/NONOSDK22x_190313/libsmartconfig.a diff --git a/tools/sdk/lib/NONOSDK22x/libwpa.a b/tools/sdk/lib/NONOSDK22x_190313/libwpa.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libwpa.a rename to tools/sdk/lib/NONOSDK22x_190313/libwpa.a diff --git a/tools/sdk/lib/NONOSDK22x/libwpa2.a b/tools/sdk/lib/NONOSDK22x_190313/libwpa2.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libwpa2.a rename to tools/sdk/lib/NONOSDK22x_190313/libwpa2.a diff --git a/tools/sdk/lib/NONOSDK22x/libwps.a b/tools/sdk/lib/NONOSDK22x_190313/libwps.a similarity index 100% rename from tools/sdk/lib/NONOSDK22x/libwps.a rename to tools/sdk/lib/NONOSDK22x_190313/libwps.a diff --git a/tools/sdk/lib/NONOSDK22x/version b/tools/sdk/lib/NONOSDK22x_190313/version similarity index 100% rename from tools/sdk/lib/NONOSDK22x/version rename to tools/sdk/lib/NONOSDK22x_190313/version diff --git a/tools/sdk/lib/NONOSDK22y/commitlog-from-22x.txt.gz b/tools/sdk/lib/NONOSDK22x_190703/commitlog-from-22x-190313.txt.gz similarity index 100% rename from tools/sdk/lib/NONOSDK22y/commitlog-from-22x.txt.gz rename to tools/sdk/lib/NONOSDK22x_190703/commitlog-from-22x-190313.txt.gz diff --git a/tools/sdk/lib/NONOSDK22y/libairkiss.a b/tools/sdk/lib/NONOSDK22x_190703/libairkiss.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libairkiss.a rename to tools/sdk/lib/NONOSDK22x_190703/libairkiss.a diff --git a/tools/sdk/lib/NONOSDK22y/libcrypto.a b/tools/sdk/lib/NONOSDK22x_190703/libcrypto.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libcrypto.a rename to tools/sdk/lib/NONOSDK22x_190703/libcrypto.a diff --git a/tools/sdk/lib/NONOSDK22y/libespnow.a b/tools/sdk/lib/NONOSDK22x_190703/libespnow.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libespnow.a rename to tools/sdk/lib/NONOSDK22x_190703/libespnow.a diff --git a/tools/sdk/lib/NONOSDK22y/libmain.a b/tools/sdk/lib/NONOSDK22x_190703/libmain.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libmain.a rename to tools/sdk/lib/NONOSDK22x_190703/libmain.a diff --git a/tools/sdk/lib/NONOSDK22y/libnet80211.a b/tools/sdk/lib/NONOSDK22x_190703/libnet80211.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libnet80211.a rename to tools/sdk/lib/NONOSDK22x_190703/libnet80211.a diff --git a/tools/sdk/lib/NONOSDK22y/libphy.a b/tools/sdk/lib/NONOSDK22x_190703/libphy.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libphy.a rename to tools/sdk/lib/NONOSDK22x_190703/libphy.a diff --git a/tools/sdk/lib/NONOSDK22y/libpp.a b/tools/sdk/lib/NONOSDK22x_190703/libpp.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libpp.a rename to tools/sdk/lib/NONOSDK22x_190703/libpp.a diff --git a/tools/sdk/lib/NONOSDK22y/libsmartconfig.a b/tools/sdk/lib/NONOSDK22x_190703/libsmartconfig.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libsmartconfig.a rename to tools/sdk/lib/NONOSDK22x_190703/libsmartconfig.a diff --git a/tools/sdk/lib/NONOSDK22y/libwpa.a b/tools/sdk/lib/NONOSDK22x_190703/libwpa.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libwpa.a rename to tools/sdk/lib/NONOSDK22x_190703/libwpa.a diff --git a/tools/sdk/lib/NONOSDK22y/libwpa2.a b/tools/sdk/lib/NONOSDK22x_190703/libwpa2.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libwpa2.a rename to tools/sdk/lib/NONOSDK22x_190703/libwpa2.a diff --git a/tools/sdk/lib/NONOSDK22y/libwps.a b/tools/sdk/lib/NONOSDK22x_190703/libwps.a similarity index 100% rename from tools/sdk/lib/NONOSDK22y/libwps.a rename to tools/sdk/lib/NONOSDK22x_190703/libwps.a diff --git a/tools/sdk/lib/NONOSDK22y/version b/tools/sdk/lib/NONOSDK22x_190703/version similarity index 100% rename from tools/sdk/lib/NONOSDK22y/version rename to tools/sdk/lib/NONOSDK22x_190703/version diff --git a/tools/sdk/lib/NONOSDK22x_191024/commitlog-from-22x-190703.txt.gz b/tools/sdk/lib/NONOSDK22x_191024/commitlog-from-22x-190703.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..277cc8fa0ae535a7ae26e7947942f39c97972353 GIT binary patch literal 1142 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 literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libcrypto.a b/tools/sdk/lib/NONOSDK22x_191024/libcrypto.a new file mode 100644 index 0000000000000000000000000000000000000000..8a43cb7279c168fb8f5230b9a8725f250cbfa913 GIT binary patch literal 135458 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 NGfu(!Gnm5XzW^&~JV*cl literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libespnow.a b/tools/sdk/lib/NONOSDK22x_191024/libespnow.a new file mode 100644 index 0000000000000000000000000000000000000000..92f6c9ab1a8950ef2db5f2ba4373898d29ebd917 GIT binary patch literal 72046 zcmeHw4}2BXnf6R>2no5d5Mqjo^(I8TSimIw5iDpDAOr;jM8y_O0trIpPe`K1ZMsE7 zO1HFCq%Pg1yMel`ZS5{n*4mbCL6PE$U8S_eR$FRqtF5+FsnynczvnsgzH{F@xskYk zzi+?3znq-sJm;Br&N*}D%)dKx%BD28FI|4|pbHY2RyAQl<)rFy<1U<#NL0Ek`#+JW znpizCSfXi==XtfBm-l!7b)n_~&-*|(1mWgID9r|u=X=!Y0ZEX*Ume!S-L`Q39 zV@K=CWsU7?R-%KsEmKPmZ^15I-n@Es>>*P9Dt&{oK%cOK-I$S9Am`Z0$me zhSFuNolBQzR*uzJy1EnFW!aig$MxK>=7uocx_W8*Ep6Z;tG%hUy<^3i)!r)jpkNIZ zjcb-UA;^~2thC!6u0`A0*L1E~x@ILkWHu;>%sPO`+z>*f+f{sI5MhgHQ(BSXLLIAU zHIfc{3G%`Y0&H3osjxG;4xCX#c1Sh1`IYLv>6*2 zX}8xQmi_Pgm5m*3UdM`6Z7W+F+nQIjH@2?kZrIV;+}WDJ(~)c6Rn1F#W%QQ2^;o~M zLQA=&&~n%U86KP4q!idU*4(&yX=~%EH7%K?!J=ByrOm6e=R?!p*|@s(`Zb*^qP4*) zPLbW-y6nb|);<;w`wUbWMGsqv8R>0j+Lx8Sv4dOJbckrH1Om&_vF>x+IWeG)U86@Q zdsLcGS&aiw@V~0Ea^l4CI4X^wR7EzCXd3jP8MEts-^alzFyFh*OQ$?<(@^j+&l~Tu zliqx9t|)`3c>jq4-~VGO$Ls2TXxZSLgSnpnhtxhC>wcfA&h3hyo|tf3_4KZMzj*)P zq7&&wgXP{xm3v)>tGi#$i+S-_bxoK5I+u;-^r^>s4p(-+T<^f+7BEsb^v+(c`&X59+$T&i@@NTJL$?I}eo|tI8kZ+9zJ@ zpCDh_{^p$c)FS^SCPw-39REe4tJc4n^y^QYa-0mZ6q1U)jw1r%` zu+84!Hk0yT6THO&k#+R9?fawaZ@d3*(rwI$KHZ0!}!|pp` zQD^Jwj^@O)HLKcItZZ#hTooMm6IE4XE5}xkt*)$^P&uKpYFt(Iq)8JJ7bOxhHZ4so z4Hjuh+`OW5IdaBaUY!_o{WvdS-LKpL)YoOb!#`dKq)O|P6<*|oHK z($bdZWzB;OUj@Dj=if^vE}J;0?#fxSr#D_Xch>wXXEe^5j;zYc$_W=%HcuW@TQ_TJ z)u1b{n9*2Ucg5wiuUt5zarUf*GZxg&zG7-69bPqK!4KjPXxilq)bC0((8TgV3unz}oYpX7+GSTGl}XbF^~`$MX8gpxivJtw%V= zl!=&S+=(y_VW8lP5Yz1X=!fZI1o}A>fkuwF2!VdiLr_0sfoX5YPagF2lR!{E^htX= zeyF9Nas>4=3YhkG{QP&8hugwW2HS*fx*ox{A#ouB>opmH#<~#aAdr6#f@*NMbw&-b z^7Da*BT&Bzf%bOVWB~MBmi$9K-svUvLarkHDDb z_Penix2)=HUgC}I=xh(-<%(9Wz(soV%CUMk&0TGejk0pd-HQ*eOZ8@3FNL`@?Nbwa z(HjqM<)u#zGrV3)hWA{0<%D-&dgbt%JbkaOS2i!8Pm!Izebj5|^aVd}1ooY+_mz4n z!W#p9D#BIpzEj`JXU)yLU)F13bE~RX9t#%U1?-i}Lh*KBuMB%%uvezNSuwV=wX4$` z+tS?G?2TR0(cz74Z(Z5!*hu&7&1(nlofCGxuzU8_Wb4GeRiUS_i}uzSPj8_Lx^nNO z)1A3@Ub;K?&Wm*D-hxP%&Mq*Wy0;+gbMF3jmMs$s!fxB!N$;-RTNCpDU23mi^Jq>Zk68e(FBaPu>0f)P1*~ zx?lBEHvo;&pLRK?pSp|tsk^qHy6%4J{f ze(FBfPu&;#sr%L`bZ9nbkBbhs)SX55U)6mFI-d5OO7~2b^X%3_8W+kK@{Z zCF08wIHoX#@yDS_FCzg%A15OIX5+ecA@b?(Y|+u*J5T}ENyn=mV7;6K4E+s) z&X%vo_~T`@mTz3d-y!7bZ4B#gY{cJ5!enJN~pgJKx%y_MEtGn!(U~@UzhR6_EvvaMf`2;!{7Xf zzr)5KZ&j+lnGrKP{;rGoJJyH4Ya;$u8h_J_ zzgr^ySgCB=w=?2zpYb=t_`56OFA0C3Len<;lIYNE&c+~v^;P3GV0Zw!fl4C26*`WA zY6=gDKjkOm0JcjLh*kG6bXo>xmsI1pjm*n|FGXM;kAvTh_$;B8xcvL8%f)qM7=$-GR-4N+F~A$1Zj(T7(|T4 zGLC#)o+D}6Vjf4rw8cD*WNC|q4;=z7<{mcKe2xTZi+S9W(-z|o0*%GIX(q+;%!s6C zM$(yEC6=+JxxCqcSTdH;Q<*j$#^sw1>C$#jpqOUxUDW?uo_t|5u3BnE#Im>E%aw-_lIP%>SX}2g{%9y&B1n zqe3O%u0bfqk>CtdK`wtmBs~>ru8(_mG5*hujHn{_Fx3oy-}ggQQ>3}nr%OkE(ng^cVFYi4*48JQv0Oy1c{ zKlX6zw1modFEc}yNmyC>hBCZSmL^md-tBd_m1U)GA=8`7R;ir&4A-O?cJ0ckI4l5f zCtI&ft0?p+qKvePGH*P?RVJabEZdCk!h6nA*f6cj>5XS8V_(0#Mt1L?Q>zcINbf@j z=XX9%^w!BZrkF?065;sM2V$Q6@QjO?=Y>4F5pyi%7~oIBKN!>GbzCSEo_XpYr=wnp zj6FPx5}${d$1h?YDY*_`ZdN&;;K>menwwY|K4m;{K7kX^I-kIy&nX~bOqYPCPvS!1 z0W-@<0nGUXE(hkB0q-4zJ};(1e1hj9&ZqFq%P6OuS~;J<3FNzS0*5|pK*E?V0U!FT zAsbkRPdPnvK7qq>0*5~9g5{h~@S#uPnX5i|pRPns@p$G;%xhs@7bt$e!Q6i2c`m|0 zT#uOR@TcP+tP+7dIpRX$UH_Q@0@i>)4LRaM;pYm^>wBK_sLv~fCr7M4d3^F^*+$Wj zBUYcS!p}!c)4IF<$pXM!djj*^sSKe+u-jh1Y)jXk!0elDe*vxlWgrrt=9t^l45&GknUWf%6GWpRSz1 zp-)}}!<p-s3eUU@pFC*5oKN5cu=5EV`s9f|%#{;-=u>#+W%%Up&|uCd@VUUwCvfQVeNGbi z1Rweop1B!5=>X<@0w;i-Py7pg%DCam2|n~GJeSY#$%`16^9h^)c0PeapVv_#bq62% z6rOn*KDpDtoKN5cu=5EV`fLITbL9jd`fPHv`L_^N3|^Swt*jLKCs<%gc#nA8aF*eW#0<1%$0b@TISAB9=aO2QeE1whh6TZQ4UD z+u~kgX+yxU9at1?lVJu|7+h&EPc>BU>L_ivki6g~gI5~t>LQvAhIi$c_TNrkuq(6R zJ%-~uoJRN4VFp(iTxswW zgByrtzvgpP#Z3mUG?>puRkOk1JBVdW*lzH>2JbO=pTUO><}(f*Po6XQgu!nZoR57) z_3nA1j716ZG8T4W4K4VuP0x%Q)6)@H&Gx8@$cndko%1JUHlkdksEh@KJ-0 z8~mcduMx}mnT!2f@nD088=N$FyumfZGWO0kc#**^2Dcg9ZSW>y8Mn6@++*;420v)< z0fYH$MaTT74SwF>lLqtVtLozh4?&uWDZ1+__@u4f)0C_cpBhzF=%JBl*0Im6_{Sk@a66^_{ZeKe@iT za-M^52$-itKjY&4#|x@nXntz`qqWcE?td}$QqDv1tz%*j%=Y7>@B5egwtV*N^G22B z^!(xbiF1PHuYE36IHmNqK_f@kjhs?d_G~I>{=6Ko?0CxmIX6Z35xnYH_DsruE=V1! zJvRUO=KQMS{fVLz39oZxqH|>B+C$UxeDBagq)P|?>D8KV*Y$K&J(>Ezm{Gp}eJ(d@ zNNIcSq_QV!I{l+ePd#l+{KGeNPbw7LXnbe_$8=p&=c5&}qK04$n^vdn)pZr7WSkd;g$HX6- z8gB{SpxvHx?Ch%^e>0wQXvncLd0#VLeDIIz|w-9M(D zol}f=LSNSvqYkF*e2Mp9o|ozI_s(Nbfxx5qD=#YE7}g;0GlXv|Kc3@W1|BGWrcU;y zDT1u;?d@U`7hl1)Y_L~&*Y5B-8^-B zY~-HPx{n-cKDPGxTl41^@2@O6;Xj)?H>t4)plXu$7aeC)GaN(^Flyt2}47{{vF-af?Qm$A|v% z#w7!G*A2LT!GK-Y_}3N%{W$M5Z|{}m19tmQ1`A`Mb>)5{S>=D5MAiOOa&+B}GyTV$ zqug1eYySmr)E5+vtDasE&)N87D*n0nvRl8Nn*Y_*`uwd61{4%-T6g_z*Pol)y`}zN zQ&V&5cI1`!Jm`Oei;o)3VRYkx)YQ|~{!^;%2n)SrAl#g_Y{|?5|DUO;?&*n7NRD1! zyQFT{g1Y5*kTHKcw ze}xXVw@Zuj-T3Eg`F1>p47Us9kM3^YzAK*7;8#E4S3lh2|AGq~8y(L%Qnc&HTyNvc zZv6ND2Mv9#VC_?PK6>jj10K&o-x!m(#LFK(;ra=eZazG@dDi?XJ4(+U5dT7a`PzR=?Jn5bKCqzh>%0Ey zwhy0If~|ZaH74#q<;2Brbg!>}F@+6Y^$2{tH|S!Uc8p3sT|6cqeW`B8V*d$BaWs84 z)zF;WF=>8vT}fSC@zi*{<+1W$v|O}f(YbN2^dAOQJ&>x7ZGB*xA0ILKe*XX$%)dV# z8##DjykunJ^pTYV8+KGrABxWnxN$spWTihRwrEG)jG@iI)hw zu#+5hJIR;n1-&e}BR(-%-c{RPw`&Rdnd?~%JC5}9G*ndmO{%(Or2j=KuZ@2?Cq6E@ z7QWf`VKar~XSnA%~hLXd7*n70>W2oxK z{q4-lOQjAUE&B+FPx_w{qWQzAMLVu3=_U1`2vna1^zQ`9L9K#vmOjd!!ve|9Nj(A2c)W>rSOf5*rcIP{ya7Cu7cX1 zrbd;F%H24?8@PR0^YPT8;n(Di8gS6}x`r1F+!ViMSpMj}c!03mKh7#9N2f=hrvqYY zQQeNO2cuZ+cfx^ZYSEZ@-Hvbi-=%2&w^MZk(0GN@>t^KFKb^{tU%376=RcY%IDORM z`d(y{sN|XlicZ9HX5oKOXN*fnH~L=HpK$yfHBOJ582(bI z&Zu!J^WXijL6 zPsB@-b=BTGE-Nn_S2_N!eFHN6vZUrX+wXIP?hjC3Rk1Zb98N zZ_EG;j^Ew*Co}5GEeKh2?+BN8_{>VxNwz9J2I9UH@?uWeZ&UFO-yP|nu15B+Q^9HK z=H2)N$;;g4-Mcpq^2&ahs(K+6_X=VKLvyC(=S(Xo7*{YYXIe66$p`%xD2wOJe-@RP z^~uQRE!??j@6z<2k?rt8)l+3Zc`^0mFH`aOqf;N9ll=5UbCR34Og*h`=k39_Qc&Pu zxstT|zYIzglB<55!wZV?N8k5Ec~L=OdHI|I?g-CPWp{)h2Lyd?36Ah%;!JGy zf5@DiqWnWeysOcfGbjJ5y?@x~sH#J$%}U_H<7j7KP2*u)4qSlCpXfUK7an`M(|+|e#^ssr9;21@&EEiH!9HO zXd2hJRPZ#Fkb5>wV;u?liuFoSZmfCT!QygdpZ25v`Wr{r7hP_&tfxU@M!C52sys2R z0>MuP@j1Zj5vC#VDt9Ns6$rcuO1v0>#&r|(<_h_C1l4>1m_`k;`uQkH7$ctoOrxHdb!OdvhCm}vJQ;!fyZrRBBYC<|4U%* zw_G+iC*39kfob$htmFCVMl;N4i23kpC&GEatRwM-z%=?H=GaI6GGJ~0xkf{*%U)-A zEaLh}#<948Z1D8KPX@7$OZ7pPTQ9Nhr|j?AubP0lik%2c5VWmU0n=D!;xiDa*@!?R zPptL*BuN-~V#d^e8iC^-@plk(e>nk6qmEepq)5WZ)9f*Y?Y16);{lBt;yeWUe-{ER z+p?@Xmu3BE)DUZ%u+6wG`YA=AW%HwB3->=-HVykE*Tv(K`Y#8jWz+w6mW}%t%XS`u zmW}%>P0PmEPX=ji^WosM&-_Qv6Rdx3cb123Mq?f^+jl2I1%j6I-M}6Z)b*v~S2~$5DfBa-H4vhzuyj8vPLKc=9~(5CrO9H~bsGH0p^} zQ-m>4mmLgDqlTFK82u!T=G{g^tlNvfc%gAwe4y!+A8N|_1Mcva}~&A-hFe?A|47Dm4-g<^7<^bh&7E~CH2x0&H$*)qemxo^K@ zTUj(Cyb){H5x)9hN%OmWONXy_xOYP`-oW6OnXS~k#&K$~Q>4G&ZT*C+)R#eQrddh0 z>}(vHbVc(`?tAOjmA+Asg~JW&Wz9FP#HVN?jU2v~U^6nmDVDz7o&8fz**o}(_BE^I z15oKN>-5#zGZfkSdxjv=<1_LieLf>E((5zw!k!rY98&L|pMANoduL?#?)@3r;aXic z&&Udw?46a~2in&JAJ+6KK18WUM&st$pFdwKXva!wy)_X2=cD>UtNw2pYzI45_ zBmQ>5pWcn;D%Ho#h`+5hp2y#2vmO;vnWm@p9Ci)wRpym5W z#9tC=y{kZ<>W{yLHpV{&iAUj_W}DwF<3BdEV;BK}y8naEe8j>g}ED`t8R{B1x?f4ob;Jl5;=h`;BN zo&#P@eVmN=n=~WskL{@bh5?|9gyR)|H=eD0L&0+ywY|n)HAv>Md=~;(f9sImM?y?} zR0AkxR!u#gaG=brFZX5U(cc09>#qhU6dwYwratBXC}v*wEYEumG5zr_81v|F6@c}( z5B~H{AF@Lq{5?FEQER%?^Nxd{zexzpqrVRU&>waSX9?V<(x(z6bU**F=-5`YDbTqq z^&si|(NFYSSJR$k+1imi3~V&ZZAa->oB|{=NjDnEbr? z!8pMBUMxD+_pyjS{=`V{+95mifjM|WOuiHTbpNdp9sRlA`6Jfyb;F_{JHlokk0_b?h zRP9I5J;)3(g|*^O`MYro_?RXTtB&uY*z)bY8v7P9S>N{}Xnp5K{H?|SdYBzkO#RJ@ z_~WBC>gaDVg8CZ*jKfN37vZ+<)mTr;^y1I64KR+@^rGbEcnKb>&;(UG(rG3ZZw zM<9#2=b`CEVv)1$m^;GS{7LBqP|QOk8SDLxGVV!fi@76?P1mFoKruJsr>U4XJ)Lm* z^^r73%(TVah-cHY(+QwhWPZ6=_g^i0Tgr3`O{R)jc7K#*!2MJwbvu?8)){NiQ`HF zL5=AuO(13(mzkk4Jr5!6uiW`n0rPn*R%3dDCJ-}ik4a2#N2o#gEkZFo??#-9z;o1M zTp>M-SdIE4nn29-k0a?+BwdDGfWCOYuNdQ1wb>=OJiocd^_95%r2FO?^*lEz#uZhg zEPshhkM-IlJ;S9dy$u=p)!sIw)#(4zNY6ve<%%(WeJPUv^++1OQV)&GKO0H&U2Qey z=i}hP!&C=CF~&pwBB2|Y%N65_p#o_&>Mw|-`3>^%;2%RM#+gMu(rgc2OB7=~TqtSo zImKR$cax-Xd4P1C_cxN}llWqchkO^C%Ln>;Z(oMK!TX-1d1NR?EB^#(w)Y5^p6k6R z`GLO$-Wy2ssBweKU+CqUV;<`>CX%j;r0sV+ss9x68xWsx{;u-)jcGOJe=U;c%MHCB zN8U7VO?zj3duyxL+}eTJSDhl5P}UF`nfA+Wy&ZBXnI|~yMhNFdGsTVjk{pVb<=GHe z-jz>3&Rm08klRXl-qsR9RhB<=*I6(TcBUt!`O^ zsc(acs!hIIlRVE8QAbc83tCp^6V_xR-Cn3_0O{K6IMEDR$A0b(h za!ZYWw=^FMtyqe0;;mY9Q>%Lvh?IMz!Hje@Z^DGLD_fh}-6YK`TDm-zcgbJ0wy%k( zf(Jry+enoy16PG~_}EEn+=dUT!CBDQRD{oAfz9(Jq{3%A*`E?YVIJ@Fsfj#3vVQg9 zPo^isX27?eBRMRrX~tk;X44V)u(+*lflOY$uxlDR*plX@H>9Wj?Q3cFRyH#nm`eAh zW~ZYR6_b6Tt?kOyT12zne)uwL<`}BqEa7;hm}8l5#suZZfG@$=MB`Z}F||A{5Yq>r z9TB%9zFjcavq>;6z1$frHPe7O{`htH2jg*Dm)~*q*|>_5>fcXM-!UYeRk?BWzFM zU3<<7G;Bj^!uAwC0bakO=Gqe)a;`mPz0Qvu``vboK>%}oK(MQ?VAuYF*>>88;o9?g zawA5(4t`yIac_XO7NG=~T2~%m`q(7=R>U6_%=O$Y_#VWc63nvf6?_2kf_OjhD8r8xOrN-vcbdhB8K`Hut~0pFVAuYlNr3lf;~$LY7F;$V zxKQ|;gfGWBZxQ@W#NC4LM_hs6v+-c-5$J~;aiQ=@VAXtFG~|d?Gumjji-sJrYW66P z@_fZ$wguPAw*QvFmB9X7{DU1upoScAq3}-&&$kQ41N*q2OM4E1dUC{t!gJsB=iwhL zhGnQBM_efU6r^<=D;5noVjahj498ghGOtALjqsi?F|R|03cdg_&qv7<=OXwE@DEmw zK%N|Nq3~>9@?0<5k$5;_nvUTEf%z>)+B*=4OAyl+aWP_=>K&gSaF(ZEe!q}56M>j* z!X{JvPQfz}pJ8yB;E9NBy+#R7j#%r(`qL+O;cp{yXLt)Skt_;AmOA$(hcVz$$%K)6U9l&R8 z2k_J2&$R<^)^>=Sb^xZib`ai`0XQrJaMpGJpS2yphwT8&c3^+-7jaE;%=H7zzNO>s zU}E91ScuuZGRA5d!$F6dn}JJ;$OON;ldnNMg?bs=8-yoEtYbcZH$Xk#PN|{37XM%?g|88;?K2%||62Tm-6|S##D&5) zAno(O3;Tp<$PpI`KO1Rn!>@>j9I>_`l3_m|30!g-nc!IgF~?VTEEe32wDM;QUWnL@ zY0wat8QzVn!jBbx2I5=yCxH3J5BVhUOM=->uL&LvoSPG97#9ex z1kbmBxGZDdUnAx=;Tu21+*acSvuy5-AMo6smk3`2%(s82XUsQ#h^K>ppJ4jqI7t2{ zh~0TL@MnSlPWYcA{*1v5z`DPGU3hZDy1(xi{tVRhQNbLeekAx+#M}@4`S=HW9)V>b zM_efUuZ90I;&}+V-jwjxAn@dfbsS?i^_!`{_z9k6AV*v% z{1oB2J!c5M6!Bu{^n8A{@Z^Z~eEuron-RZHFrR&1CwK*7HwI$8;n=6(1F<9%Fe$Pw!}c~ba+=rgYh zX1{BL&R@bMJ?~B7$q^R{&t>S7eYq2Ps(**@Vh*Xqv{eYiT<#{pTu--P`o2x@rxCmH3VN=8 zi{TFmW_gbb9)|cO!Cdd}1hcMh2&T_V1hZV132s81K+xmM6~HVfIbuD&@VG*r^>D`& z;5oqVcn7=@n1PxTi2q*jcMw+~==sJy!jmJ`^Nl1mi}4TU#%K5;N37=?qk(lleF&KA zB1f$IX{FKpKs4ltRr9j&pF~X4?VbxM?0z;>Moc;{AXizU;UNf=( zl?Y}v6jQ0ovgjpek_mqEM9k|dHWTp$h?%XJ>(ahdE<8D6?MvLQ)K5Xo?MKYMO4Iea z@}NN~z_I8h(l{6z9A;Cvbu|OPxI8uFh;>W`41F@ML{`M6C+7Y|)AhPGKRe*gK~w_F z^}A((nUyCzG0UmTvORg;LZe^h>CD<;6mZA5}xI)K=9Y%AMCvd)RQAF6g~;;bEU9b5vUn!b51U=V>@8DjjjML!3Jl(D>FAf>{$fz&m(3araw2{0&_jD z3(uI_oEnzJogV@-9xOb|J6tg9krd3h1!*qJrf}P$4ghuo0(o-8I*uiPwLLq4sUb(K z?O6frlYo5yff{neg~BI+{Z9OYxnmGC)2jN z&0_q6?M9#P2ej|bMV{hOj8N38XoWHg6GLylNAKNkMuh<_#c4a8Fr^jzW<;mHx} zxj{;JZmSw#)el6PWhO_g`ZI;+8>iEazFc^6#HvTq^K@Boq~GUmAdUz8JmR7NFCsoIz)i#)P+`jv^qbIa#6!u- zIaNu3*CEpHD{mq$4fs2V<=C{1n3aI_Aov_SVfP~F7`TgA#`6b>hvOe?AA-+86?O>0 z$G%T{0>MZ7tLeDP>M7Zcn#k68NNVuP0(%xetQ ztTTAC!TfEBYVI+3m%+S_P|YEOj~aa3;1><%wXiPBYhcCveYfJ_1}6>X^{;Ab40hlC zm%1+^FZ*4K!EFY28@$Qjtp@iP?7sakJ|846`|<&U`F@G=?tLK9Ja71u2IGfSo{j@? zgWb3P^U*`(HFohF@v0`}V(RHW=Q0`(OC&1DEVE65R!S37tg59_O1s^rb9yi#1`(HHfodChP z=(9SWyKn!?*zUglFW7ziU+{RNuQAwt`(KX>hHo+0efwWD?%V%@-M9Y*Z#DWJgWb3P zMdQBxFZh7bxNrXp@4o#n*!>1w@JZ_Bn8lNC#qQhx!n<$(3$8F4_w9e--M9Y*yKnys zUTE}92D@+ni^hHXU+@NMAq4Bl(-A%l+^eB9s{4Svnw zT#R#C=D`LJCmtN^?@5El6Z0Y(R%7sNgBKaxVsM+m-3D(mc&ouZ2H$7!g9aZk_z8ob zHu!miPa4c0+iP9o#B!cC%-{-xD-GuRRjO|wmh-xW1~(bJ(%>$GHyC^evE1L-Zt%SZ z?;)0R#eD`JHu#vq&k@V{AN(ZoD4giSJ-?|Ugfk66x87aP3X z;7)_r5zDna-=k8z&ER_s=DSg<*=sQ0aZ>)M!N-Z^-1tRQfK7;wrkMai$e!}3V4SwF>lf-)d zk7J%mpNUUj3$nTbAZCu|)3I3#1 zCxiL-f5|;4zy2@A{3>hlDfdO*;R)R@*Zbb`(>LGL{VYHIkC_cNZ`s^2t9deJ1{k>q z9|zy~y8Dvo9v87;q z-JtuI4BFlP1Hb)SJ%yjT+`<<2+M;hN*?7sj#F9i>G4-nNe>l!`QTtL zSq$*(#?w4bpz%9bwG-$@$>Q|a>D{bAWiO_xeuWIq^HLm4M}zN?Pm1A-@k7lA$9qtK zc~S@-t}7ARB>h%V;;k~@A`kTmW|6@RI0b%w&NH#?P1Ui1BS%z?95-#`v@1tmF%;8> z1k*d1sbtE%@ufKf7bQwR`R15-ykp-0@8IuK)!z7#LoWh3<4;0j!`DH1PXWl^{ZYvJ zmr@J7@r75G{*3hPe^Bi&QcH^ROE5)jvn~XO#cBU z<4b}GL^$h+_}oo?Z+Y3ylz%_r#)rc!H{C;N@qn`JDgQo~w>MSxH!1%M4u3UOwhbE= z>-!wj)kXP-?~2#?_b^ev8&d-KpCR<`NacH|@QuHUk3bzzp}a4q$~Ff}{%v~6oM7IE zgP%#ocl&=$K5s{VdM2KQxXt8B8GLho{`09t1D2n={qFKdu8!Y^Q}Kg%jc>=v@<$T! z-1zB12atXme<;{hF}Y8?+W!%Yxbd}Ad_nNR`Gdbp1s|K=_)03iGnkFx;EA`YLGk{5 zPd)j^Xzgx3=`)^E_`KZiq2X%vJBeY1nUMm$BO|>Ok|N zd^D}P8p+Vu>Qv*#-2Iqy#LtgERaUw#KVB3sjd#XB75{qt`#0~tYVCnkV*MR|u?g2p z2lKu96<%Jmw{ek|H_zKR)62WWtH01YIM%Bl=^Z@Vt3TbVALJdWnJ_8-l(%Kt#PqnA zjI$>^$Y%Dx5;S)GK>X&V`r+S|jvIDuUUg4PT@CbeiZF7yiIcitHX}TRuaHyD zcrwN8-nSJovF8htrp=U+1Kjg~wEtmbL(z~MBUCgfkrptb_v?E%pcDL@YAiHo} z?@Ha^eD6Z;ed8jlZFPP>pITBgzUuPSEN{s)Z{w#^E3m!BZ~WU-{J<>yri7A7@guV7 z-p3?14ff@D{B&%YMb5pgQQDuAtpBhMoL*oR5@(Beu9-yWM8Iv96!xBI^M7MXIVIGBMkUK~t`mMq%*Y}NNMv&?6L`4=%8 zPf_{UuFWsUi*Vv!xASwpo8aci>aH>IdLBM9=A9|;X{y_K(^OC9U@XD`{YA{07=Nhh z0G90z=C&zc-39*XjW}G!Frm$@-%NcZr+sW!^S`84ymP_Wu4K`yb0_CaE}mQ-&wZ@C z>T9Xs@}TOgsbmpmOT>Qm5Vvl;_}-%Us4bU{-vqX#q-4D6 zMO5>u%YwXF}-`0>QDL@q8p^F5p= z@bqE)1Le7x4Gt$k-nH0_M-KX4ygZoYsn=@huD8Fzr}VewZTmYoz$<$V=WyjYLHSs! z^}+VZUMg2KQ@+IXs|cls>`{)#rfNC_Wew3lJ|J-;c?wB zZ!GdQZ>fIxYRo97y9m^c6+?)B~0iSa5Hs|TXPoS>R6jf zHRNudJ_^(7Va_j|6%3;s=2?ryb2rCkjc})W=bbQXG7mRxz4Zw45X|Fxh?%z&K^|N<9!dAhMEcS4>%3098BRVd|EvHjKaUH; zs3%sw&9MPb%p0Qg)1!Pt0BR7i%#8ViF_w8g0*z%R#)CIk=Bp9oL6pPSA*NA7%m+-Y zm#&vQF>k_?-;6*bPuz?^{v`w&dE)5^64^dN9Ma@j8;(5NToLm%?{5NPE0At?V{U>bR1<$p;M zMxK}tdgw=g$wQvFOnCl+ibkH8+n0L2{Y4{BJQ*?hn+#8^`a2CztlQ;Fh9_qKr=PDH zo|q3u$bZl9#LB;7cw*)G3l$p6Nv!R8mf@LSf#4^Dn0;=w!Ny5m}I6nBvAZDAh{NoU4)DRaT zaGf;>H1ahFc);)Y8HjbeGy~J9Ato*AaVdQCS6F(Wme9W>Qfo(&}reS}ehHXq! z4f`bhFy=Or!Bv>W>0b&-mR4)a#iWHN@v3Z1nM!T!eFhcOqN{to?+)TBA`< ztbK-W$mD>del@W6Rla#eqn`L2#MJOtYc%r2%JZ#18hK*nqx-({zcYGbEzb}Z21Y-` zs;@LWvGSK2o>=+Sh9_43V}>W@gV&u1UoV3#A6VX zFTj&U8hK*fU#bmHd_MB2Ukt3IbnAVAK@v)Dtg9O#U{*6Z1Te{N08}(w)!w$snGG^m>GK27OyT1^sisr@x&D6$mt@ ziFJE%o72b>bL^%5Vgwp_V)auGtYw}9Ok*DHe^VK>zEe;yt?x8f%XEFYjs0Y>txpGL zn{%J0ae3mY2yD;yBWVBWFt{6-Mm@3aBe#--k*C>poq;sh6+Pe9eTUnN{gCVB?<^EA z1I`hCIbuB?u{<WS-M{92ehj%H8SJ`e)=&t zmbnArKH`R1jc!O!QDk%RWwRUGGG{!p+2%87;Y3E6`AcugnBK`|>Zif7F6lDcZZI<^ z*+tu1nV-GL{MwfLR2zQb(zk*?Pif7b?Xns>SFCDXb7LRtZ(ZHl+TQpUJ~F3rvPIX) zX>>v;n-{E^mFr`@&29J!AXnYIdi9zcS1)aCT(zd9?`nv+V`=m1QwXu<_RhxDt=F&V zT+wI4VD0_YwYM(2v7_}=4#Q9IL7shEgc~zMp`T%Ej5gkl`0AdSOw4?n?G#Fz&2`?? z+TO8Z&1x_E)LT(?u>WM8ddo`9&Xk_7$O`Q4)R#hbsO;I{F7+1KZl}tgue(+D+;CgC z9jkAR>=xMtK^G5quI!?W-7C8!I_;BfM%~4-FBz0TcCze}zIL^=>%m(8sqT{-#Vv`Ec1ne7TKYXb0hwqo*jGxiuL6kHucvK@z;dQWxaE2{Y{JbJ32SGs--{P zsZxI{BmUapk5{2;)X}bw_1qkXd zI$zUa_|rRP^r-%#^EGXSKfXUif4p*6f8PbL+ar$3>fI^p?+NJCH~9_M;5~NqA^IDK zp#FXv@plh4#ttqZrat&Sr($M}#^VCMLrs6Y!^u4Mmv^AQ+442KBYk%Z*`W{KLA3rJ zye>U%TqrvFtB&| zh`(L%HwXD@TE2}De;eTMUWiye-u2P)JrME7TW{I?-5>Ecx+(4N665c9#NRyln}&Qf zE#D6#{*E@K`*SVCTE0T;|91Osg}+fushg~={wi&}?&|ydktrU;)A7qA@ z!e_*v^4}f`ohA^gj_>kn8JN8d_0Z!WhRm=Yzl`|Xh}(vTFczt)zn?|?-PaQ6xZUO< za9wO?wrLDOZEiWfZ-Qmj)E{FUazooZ(erAcpV(!Ri(__*JpqM-Iq^VeV&o|&=;WKSb zbL382%;U(LwwP;Co94)uwwN2aY?>oa+G1X9Isp{R7~nsov=r5q>Q1jK}O^jz`z8Z0uSjCY{xjl9@54rKK@*E+ga0O!MRJ%4eC= z$f(_8xbUe}G{fDp_Ue|dp0T9y#rIWbIvVFRFKxUGv)at)TG7$zYK7T= znr~^u3{2LGyIr1j-kkrGX>H6MU(-BUC+|tODsDzETYc(zdvqqA@cwgOYv4U(nc&A( zU7iM5%02?Hd>{Aytt8vc{%C&m4!_OMa$7%=-RoYy&Cj@jZ!;lW$JM+Q5uD|Z&xKM)ehQ{%h7?*p&uODR`Odzd#-v9Dtyx1in(6(0~qo=d*b(_Xgrb{q9&*+o&`?25z;$I4;&sPLjAa--hKu?~>UoJZzF|PrLuS3j0d;{VpgO>|#L!3nL zh)o72(*dY%;Ek9C4xW z!+`Z0nQps7LylO#e>t2QX`f}l^h1tV+pU5cv=J?Vpx7-dyjz#Fk1LyC)D^d zJ(YLuDSFVM=7YeT>xTB%2*lKWLvRn`BL@G%;5Q9+b1`Ar9&o&`O+Q@!MS{uC63jAo z82)y_tjEU5CH%zaqrJ^LHs$r0YV9-y}RaVy*i; zVL$kP8gj&{`I+!N;FnV`W%z^e3llu@t;Y|F44MtF(Zmffb9I^T=F`7>S(?2<4)eJM5dqhKyST)0qhV`T$ za>S}h0Bd<31g3@@v1(j9#6ZB@c5etU|Lb-i0bD{MtP+8EDPp%>fVmux@8oA7zE1Eb z5dVeXTM@f49~%65pAnvZ4jVjL@HoVi1=k>Epnvu|u7jBUw!vVg$@BQ!VX)hFa!%-u z*U*q7)^kPISHXW49JiT23;$qy5a^Q}aiQ>TJMsh;b`XIYa>Rwgg9_WwwXF|AOxt!0 z(wu9K)__1v?Ry2YT%Ce9A^wXHA2ayJ2ESr(wP5;m+Y9Tu7TC2NZw z_dD*K3Yc#R@%L5a`6kg2!F=0@&z#8fjih%9<}ufOw;nv-Y&u(bo);tp^9`vHf_Y9f zNAPOIpA^hDt@aq~&Vk{R{L6+vjpY!2jKTc&w(>U^{8t9wYw*JcKPs5p>q)_vVVzGI zoEHoHlfOVP-$LSVa=2dBrF9o6ex zeB|6*d@?S5TJ+7(R~r343Qvw${qwu>EGOR-8*lXPd=fl4cRnfpe<*ssp*G3rUlg7k zvHIuzdHUxYb5o2yU-}z4V%3)l&o|U+jQ%{~$q}o5g7AEEjhjl_hrj3JddU&1exdMu zqpiW{TZJb_tojb&`KH@!qu(GrIbzk{DLmhRn`iVpg(pX>`Y#F3HwPCQ{WpXsN38lq z)JPvYE*f&g+Q$}C!-~UxBN}qV+E<&9*0#cfFxOV(h;>~p)Z~*yzG%o1>v88y;kh3z zN1pl|B|JG|^|_K7@mVVxa>VL$rttLHW_(^HJUL?Z*+~sgz+vwf4LM?+v#wouzJb_< zJT2$#!jmIbpWW0*8*UX1IbviyEY9oR@%O2sz?Hgc{%;;rVvz9;CILUlyJmvHE~Peg3QPJa+9x zp8EWe@Z^Zq=RRtt;~(sVX!Z%#Havi|`r(+tx;PG4{T!l(C)%(g(U2q7xxo)3t?ir; z4LM?M=aIs*ou8my`uPOm$r0;%$5Vsxh*pW9^M{Nk#`!HRiQvZ_bjMMj7u>J}f}UFr zC!UReuwe*3`ZuivLGfUN=}zYi$tP~WKNy-Y)HAK;obH z`WppvJ-Y>S{f`P}xqcw{$A~?&7yWQqcfJbDdJHqXJI@4P0X`u->zx#w0KQl-+ia%b z(ZFqj*~aSxb6vL!=61Nt@PCOk%kv`QNeDW3=tqSoN33&)-YNVuh^HXv{B_%eCr7OF z*VO>~SKuG42Z8IV5nL$zbfo=-_y@Zeff{neg~IO={vpKNgnHlpLE*^}>wWu2gg=IO zHiGK^O?Yy|s-H)VT)&?b4LM@Het$#w7}}4;QhlMcCplu(yK4&6g>QT>qW((!gVl37_}dV-AkV)V|6uO^C(1+4-TxH+zSuVe_B z;5o5s+%-OUUej}XsQwIK>d6tS9x&86pT%Ud_ynKTC-|sOw_fx!HTE%%Pb{v^BU&by zw}~nQbGa(Ra~Gwans*B3Hf12s<=BqI;}KsdnD=zq|FrHk!jmJ`y1!*P*$H8;oWNl@ zfx~hN@5(9Il@mBDCvaF!;PLS3$_bpcoZ#P9Ik~}MuAIPAfVsXB;IN#+yRrd?Wdjb& z2F$YAcAF@E$PsJ1ISsZajqC6QGp+b+V9wo2J0F3#12Ok&VlH=;VES{%Cee%(ehgv; z>bntF8ypArSy>n(YRD1mGbT5_iDs^7$PugN8sXj80IWV+gvaJ^W2ox;Q+Ky5*x0bK z2qnPF5!VQ2-4_a`Ki59cuo`gDdg`cO#u!2C z+ax?WV$}nN+mz)l;b08oX&f>4X_{_#r{MqtbK@8=#}%5M6S_8}5a!B^b4MCo>$zfr zcp(14k_dW^T1hPDkZcEk5dOhx5PYr>)_|brmh*^lZcJN*pmSt35lg|A6SE+&HUwWP z)kTc)jkXTK$2ddVgy6HGV0R$+*mr2#5OhAD9%8gJ?Op_bn1k+m!Q+$Xx4;6wPHTbx}ylBgKG?Sb2dsD_^zV*X)(CX z;BJFA8NAit9)o+$*(mEeU^Gt{%zL0(hUX1FX)y0csm9IOC_desje;wTrqbXk2D>>M zWvp08UT~AaZq7#G-JFer`L3txd7o7Ac7xrVjiTRU_-u$!|{u$!|{jz@0JM!_ek7t9xP^*H6`Y~(=zHq7u9 z2D>>M%`*v;7}*v;9f=eP7D*v;8EIB1`B z&Dki}&Dki}&Dki}&DkjD$!^X@!N=)eu$!|{u$!|{&ZXU)je^~rje^~rje^~rje^~r zje=`1j_NtNo3l}PH)o?@H)o?@H)o?@H)o@q!@D^f1-m&L1^3XuU^i!@U^i!@U^i!@ zU^i!@U^i!@U^i!@U^i!@U|!(qwS$|pQLZE0oQ;AjjK4qQLvk{QSd^eZ!*}; z*@$aonwzsx@CIrGyEz*LyEz*LyEz*L?=kv)1|K%~7_nUYJZJC;gWoVXAN#KA`5Z%W u!r;*cPcnEqv0PitGkCGV%MI={cpb4^i)}V|o5A-Oyo>nEpbhsL{C@z{g`I8y literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libmain.a b/tools/sdk/lib/NONOSDK22x_191024/libmain.a new file mode 100644 index 0000000000000000000000000000000000000000..58779578adcd34c504189184c52bb4fb8b4d969f GIT binary patch literal 218300 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 b?PB0-xs8CVn19Jof2YHN!0*X{&fot9UJg&; literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libnet80211.a b/tools/sdk/lib/NONOSDK22x_191024/libnet80211.a new file mode 100644 index 0000000000000000000000000000000000000000..2d49d922eabe3ec80b117f648de827fcb738c6ec GIT binary patch literal 336418 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�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 U9=Z7FO;x;?uhsKpXef{OpG-_QD*ylh literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libphy.a b/tools/sdk/lib/NONOSDK22x_191024/libphy.a new file mode 100644 index 0000000000000000000000000000000000000000..cab912d2856b327e074ce5c6a8818d08acfa5425 GIT binary patch literal 155884 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 z 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 literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libpp.a b/tools/sdk/lib/NONOSDK22x_191024/libpp.a new file mode 100644 index 0000000000000000000000000000000000000000..2abbe7a3e99b4180b506fadd65800f007a1e2e70 GIT binary patch literal 266504 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 literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libsmartconfig.a b/tools/sdk/lib/NONOSDK22x_191024/libsmartconfig.a new file mode 100644 index 0000000000000000000000000000000000000000..95aec76c62779bed54d3cba99f22d579c48d15ec GIT binary patch literal 118420 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 F{}0ghk3awb literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libwpa.a b/tools/sdk/lib/NONOSDK22x_191024/libwpa.a new file mode 100644 index 0000000000000000000000000000000000000000..41ad4876fc79a303d3516b76a89b1be13cac7211 GIT binary patch literal 173286 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 literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/libwpa2.a b/tools/sdk/lib/NONOSDK22x_191024/libwpa2.a new file mode 100644 index 0000000000000000000000000000000000000000..07420c5bf00794d2f6254497af25217c70b62696 GIT binary patch literal 475222 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�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

pXPn$AIPlyQ%7JJ~Z6UWmC41^g=!ZQ}n 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 literal 0 HcmV?d00001 diff --git a/tools/sdk/lib/NONOSDK22x_191024/version b/tools/sdk/lib/NONOSDK22x_191024/version new file mode 100644 index 000000000..27a6cd4ec --- /dev/null +++ b/tools/sdk/lib/NONOSDK22x_191024/version @@ -0,0 +1 @@ +v2.2.1-111-gef6d0ed (shows as SDK:2.2.2-dev(5ab15d1) in debug mode) From e4c6a7a73a6dd03c4880bc64ba311833c6dd7605 Mon Sep 17 00:00:00 2001 From: Clemens Kirchgatterer Date: Mon, 28 Oct 2019 01:40:35 +0100 Subject: [PATCH 55/58] Reapply fix for redundant FS size check (#6666) My fix for a redundant FS size check was merged, (https://github.com/esp8266/Arduino/commit/bde1ce0e012321dff7d57900c920fb6314e7c6ca#diff-6690102111beb33824c743666a874d7c) but later reverted (https://github.com/esp8266/Arduino/commit/a389a995fb12459819e33970ec80695f1eaecc58#diff-6690102111beb33824c743666a874d7c) I guess by accident. --- cores/esp8266/spiffs_api.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cores/esp8266/spiffs_api.h b/cores/esp8266/spiffs_api.h index 862813bb4..c19dbc2c4 100644 --- a/cores/esp8266/spiffs_api.h +++ b/cores/esp8266/spiffs_api.h @@ -171,11 +171,6 @@ public: bool begin() override { -#if defined(ARDUINO) && !defined(CORE_MOCK) - if (&_FS_end <= &_FS_start) - return false; -#endif - if (SPIFFS_mounted(&_fs) != 0) { return true; } From 6e51ef0cc8a17706b8981999bfb64e1b039726ee Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Mon, 28 Oct 2019 12:55:00 +0100 Subject: [PATCH 56/58] Wakeup delayed scheduling (#6485) * Fix for scheduling recurrent functions while inside scheduled function * Check that fn are valid. Invoking invalid functions throws otherwise. * Added wakeup token to scheduler. Toggling the token value breaks a scheduled function out from a delayed execution and makes it run on the next scheduler iteration. * Timer reset reliability fix. * Shrink interrupts-locked regions. Add check for periodic yield to scheduled functions run-loop. * Ordered, more predictable, scheduling. Before, it had different ordering compared to FastScheduler as well as sequential calls from loop(). * Optional, for the paranoid: revert changes to (non-recurrent) schedule_function() / run_scheduled_functions(). * Comment * Adapt one-line ifs to general style in same source file. * Fix wakeupToken handling - don't respond to toggle, but to different value vs. that at registering function with scheduler. * Reword comment. * Putting aside std::atomic concerns, use a callback for scheduler alarming. In the future, async future's .then() might take advantage of this direction. * Drop atomic include, align function type syntax. * Reduce flash use. * Prefer const ref over call by value plus std::move(). --- cores/esp8266/Schedule.cpp | 75 ++++++++++++++++++++++++++++---------- cores/esp8266/Schedule.h | 12 +++--- 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/cores/esp8266/Schedule.cpp b/cores/esp8266/Schedule.cpp index ed39736e5..465521e51 100644 --- a/cores/esp8266/Schedule.cpp +++ b/cores/esp8266/Schedule.cpp @@ -24,16 +24,18 @@ struct recurrent_fn_t recurrent_fn_t* mNext = nullptr; mRecFuncT mFunc; esp8266::polledTimeout::periodicFastUs callNow; - recurrent_fn_t (esp8266::polledTimeout::periodicFastUs interval): callNow(interval) { } + std::function alarm = nullptr; + recurrent_fn_t(esp8266::polledTimeout::periodicFastUs interval) : callNow(interval) { } }; -static recurrent_fn_t* rFirst = nullptr; // fifo not needed +static recurrent_fn_t* rFirst = nullptr; +static recurrent_fn_t* rLast = nullptr; // Returns a pointer to an unused sched_fn_t, // or if none are available allocates a new one, // or nullptr if limit is reached IRAM_ATTR // called from ISR -static scheduled_fn_t* get_fn_unsafe () +static scheduled_fn_t* get_fn_unsafe() { scheduled_fn_t* result = nullptr; // try to get an item from unused items list @@ -52,7 +54,7 @@ static scheduled_fn_t* get_fn_unsafe () return result; } -static void recycle_fn_unsafe (scheduled_fn_t* fn) +static void recycle_fn_unsafe(scheduled_fn_t* fn) { fn->mFunc = nullptr; // special overload in c++ std lib fn->mNext = sUnused; @@ -60,8 +62,11 @@ static void recycle_fn_unsafe (scheduled_fn_t* fn) } IRAM_ATTR // (not only) called from ISR -bool schedule_function (const std::function& fn) +bool schedule_function(const std::function& fn) { + if (!fn) + return false; + esp8266::InterruptLock lockAllInterruptsInThisScope; scheduled_fn_t* item = get_fn_unsafe(); @@ -80,27 +85,37 @@ bool schedule_function (const std::function& fn) return true; } -bool schedule_recurrent_function_us (const std::function& fn, uint32_t repeat_us) +bool schedule_recurrent_function_us(const std::function& fn, + uint32_t repeat_us, const std::function& alarm) { assert(repeat_us < decltype(recurrent_fn_t::callNow)::neverExpires); //~26800000us (26.8s) - esp8266::InterruptLock lockAllInterruptsInThisScope; + if (!fn) + return false; recurrent_fn_t* item = new (std::nothrow) recurrent_fn_t(repeat_us); if (!item) return false; item->mFunc = fn; + item->alarm = alarm; - if (rFirst) - item->mNext = rFirst; + esp8266::InterruptLock lockAllInterruptsInThisScope; - rFirst = item; + if (rLast) + { + rLast->mNext = item; + } + else + { + rFirst = item; + } + rLast = item; return true; } -void run_scheduled_functions () +void run_scheduled_functions() { esp8266::polledTimeout::periodicFastMs yieldNow(100); // yield every 100ms @@ -128,15 +143,18 @@ void run_scheduled_functions () } } -void run_scheduled_recurrent_functions () +void run_scheduled_recurrent_functions() { + esp8266::polledTimeout::periodicFastMs yieldNow(100); // yield every 100ms + // Note to the reader: // There is no exposed API to remove a scheduled function: // Scheduled functions are removed only from this function, and // its purpose is that it is never called from an interrupt // (always on cont stack). - if (!rFirst) + auto current = rFirst; + if (!current) return; static bool fence = false; @@ -153,26 +171,35 @@ void run_scheduled_recurrent_functions () } recurrent_fn_t* prev = nullptr; - recurrent_fn_t* current = rFirst; + // prevent scheduling of new functions during this run + auto stop = rLast; - while (current) + bool done; + do { - if (current->callNow && !current->mFunc()) + done = current == stop; + const bool wakeup = current->alarm && current->alarm(); + bool callNow = current->callNow; + + if ((wakeup || callNow) && !current->mFunc()) { // remove function from stack esp8266::InterruptLock lockAllInterruptsInThisScope; auto to_ditch = current; + // removing rLast + if (rLast == current) + rLast = prev; + + current = current->mNext; if (prev) { - current = current->mNext; prev->mNext = current; } else { - rFirst = rFirst->mNext; - current = rFirst; + rFirst = current; } delete(to_ditch); @@ -182,7 +209,15 @@ void run_scheduled_recurrent_functions () prev = current; current = current->mNext; } - } + + if (yieldNow) + { + // because scheduled functions might last too long for watchdog etc, + // this is yield() in cont stack: + esp_schedule(); + cont_yield(g_pcont); + } + } while (current && !done); fence = false; } diff --git a/cores/esp8266/Schedule.h b/cores/esp8266/Schedule.h index 50fc88fc8..a02241fa6 100644 --- a/cores/esp8266/Schedule.h +++ b/cores/esp8266/Schedule.h @@ -10,7 +10,7 @@ // in user stack (called CONT stack) without the common restrictions from // system context. Details are below. -// The purpose of recurrent scheduled function is to independantly execute +// The purpose of recurrent scheduled function is to independently execute // user code in CONT stack on a regular basis. // It has been introduced with ethernet service in mind, it can also be used // for all libraries in the need of a regular `libdaemon_handlestuff()`. @@ -58,14 +58,14 @@ void run_scheduled_functions(); // functions. However a user function returning false will cancel itself. // * Long running operations or yield() or delay() are not allowed in the // recurrent function. -// * A recurrent function currently must not schedule another recurrent -// functions. - -bool schedule_recurrent_function_us (const std::function& fn, uint32_t repeat_us); +// * If alarm is used, anytime during scheduling when it returns true, +// any remaining delay from repeat_us is disregarded, and fn is executed. +bool schedule_recurrent_function_us(const std::function& fn, + uint32_t repeat_us, const std::function& alarm = nullptr); // Test recurrence and run recurrent scheduled functions. // (internally called at every `yield()` and `loop()`) -void run_scheduled_recurrent_functions (); +void run_scheduled_recurrent_functions(); #endif // ESP_SCHEDULE_H From 7a43092df0c8734577870f5630ee0062150c1074 Mon Sep 17 00:00:00 2001 From: M Hightower <27247790+mhightower83@users.noreply.github.com> Date: Mon, 28 Oct 2019 23:42:30 -0700 Subject: [PATCH 57/58] Update core with upstream umm_malloc (#6438) * WIP: Initial overlay of upstream version of umm_malloc over our current version w/o any edits. Using files from: https://github.com/rhempel/umm_malloc/tree/master/src https://github.com/rhempel/c-helper-macros/tree/develop The following file remanents from our old version were removed: umm_malloc.cpp, umm_performance.h, umm_performance.cpp, and umm_stats.h This is intended to be a "compare to" for changes made to upstream version. * WIP: upstream version of umm_malloc customized for Arduino ESP8266 Core See comments at the top of umm_malloc.cpp for a summary of changes so far. Added support for integrity check and poison check to refactored heap.cpp. * Resoved Travis CI - issue * Corrected #ifdef's for UMM_STATS/UMM_STATS_FULL * Corrected UMM_REALLOC_DEFRAG option to be more like the original umm_realloc. Updated some comments and changed method of defining _rom_putc1. * Updated UMM_POISON_CHECK_LITE - Expanded the poison check on the current allocation to include its nearest allocated neighbors in the heap. That is to say, if the nearest neighbor is free, then the next one over is checked. And this is done in both directions. umm_malloc() will also checks the neighbors of the selected allocation before use. Merged umm_malloc.c into umm_malloc.cpp. Added additional stats for debug build. On going comment cleanup. Removed #if 0 block from isr_safe_printf. Corrected mistyped UMM_POISON_CHECK UMM_CHECK_POISON. Corrected other conditional build issues. * Updated printing in heap.cpp to behave the way os_printf did. Updated printing in heap.cpp to behave the way os_printf would have with regards to system_set_os_print. ie. setDebugOutput enable/disables printing Expanded #ifdef fenceing of .c files to prevent Arduino IDE from building them outside of the .cpp file they are included in. Corrected more conditional building issues. Remaining concern - umm_info(0, true) printing - does it need an ISR safe method, all printing is done from within a critical sectionn with rsil(15)? Or should be have the print option disabled for non-debug builds. ie. Debug port: "Disabled" * Merged latest, 2019-09-07, from upstream umm_malloc * R.Hempel 2019-09-07 - Separate the malloc() and free() functionality into * wrappers that use critical section protection macros * and static core functions that assume they are * running in a protected con text. Thanks @devyte * Resolved issue where OOM selected w/ Debug port: "Disabled" caused hang. With OOM selected w/ Debug port: "Disabled" you can now use Serial.setDebugOutput(true); to enable OOM message displaying. This is the behavior previously available with os_printf. commit rev 1 * Fixed realloc OOM bug introduced due to confusing code, added comment for future. umm_info(NULL, true) is now treated as a debug option that is enabled by Arduino IDE->tools `Debug port: "Serial"`, etc. It now prints when DEBUG_ESP_PORT or UMM_INFO_PRINT are defined. Cleanup comments and some conditionals. * Updated to track PRs for various print definitions. Cleaned up comments * Added missing "#ifdef __cplusplus" * Reorganize local enhancements More comment cleanups Added Status TODOs marks for upstream * Print notice message for the need of -DUMM_INFO_PRINT * This updates the heap management library, umm_malloc, to the current upstream version at https://github.com/rhempel/umm_malloc. Some reorganizing and new code was needed to use the new version. This is a list of note worthy changes: UMM_POISON - now has a lite option as well as the previous intensive check option. The code for running the full poison test at the call of the various alloc functions was removed in the upstream version. In this port the missing code was added to heap.cpp and umm_local.cpp. * UMM_POISON - appears to have been partially changed to UMM_POISON_CHECK, I treat it as depricated and used UMM_POISON_CHECK, when needed. However, the Arduino Core's references to UMM_POISON were replaced with UMM_POISON_CHECK_LITE. * UMM_POISON_CHECK_LITE - Less intense, it just checks poison on active neighboring allocations. * UMM_POISON_CHECK - Full heap intensive check of poison UMM_INFO_PRINT - This new define makes building UMM_INFO with printing capability, optional. When umm_info(NULL, true) is used to print a debug view of heap information to the debug port, it has to walk the heap and print out information, while in a critical section. This requires that the print function be able to print w/o doing malloc calls and from an IRQ disabled context. It also requires more IRAM to handle printing. Without this define `umm_info(NULL, true)` will not print. * UMM_INFO_PRINT is enabled as part of selecting `Debug port: "Serial" or * "Serial1"`. To make available all the time use '-D UMM_INFO_PRINT`. A cautionary note, on the use of UMM_INTEGRITY_CHECK, UMM_POISON_CHECK, and UMM_INFO_PRINT. All of these run with IRQs disabled, for periods that can go into 100's of us. With umm_info(NULL, true) that may go into seconds, depending on the serial interface speed and the number of memory allocations present. Use UMM_INTEGRITY_CHECK, UMM_POISON_CHECK, and UMM_INFO_PRINT sparingly. If you want to see numbers for the disabled time, explore using UMM_CRITICAL_METRICS in umm_malloc_cfg.h. * This updates the heap management library, umm_malloc, to the current upstream version at https://github.com/rhempel/umm_malloc. Some reorganizing and new code was needed to use the new version. This is a list of note worthy changes: UMM_POISON - now has a lite option as well as the previous intensive check option. The code for running the full poison test at the call of the various alloc functions was removed in the upstream version. In this port the missing code was added to heap.cpp and umm_local.cpp. * UMM_POISON - appears to have been partially changed to UMM_POISON_CHECK, I treat it as depricated and used UMM_POISON_CHECK, when needed. However, the Arduino Core's references to UMM_POISON were replaced with UMM_POISON_CHECK_LITE. * UMM_POISON_CHECK_LITE - Less intense, it just checks poison on active neighboring allocations. * UMM_POISON_CHECK - Full heap intensive check of poison UMM_INFO_PRINT - This new define makes building UMM_INFO with printing capability, optional. When umm_info(NULL, true) is used to print a debug view of heap information to the debug port, it has to walk the heap and print out information, while in a critical section. This requires that the print function be able to print w/o doing malloc calls and from an IRQ disabled context. It also requires more IRAM to handle printing. Without this define `umm_info(NULL, true)` will not print. * UMM_INFO_PRINT is enabled as part of selecting `Debug port: "Serial" or * "Serial1"`. To make available all the time use '-D UMM_INFO_PRINT`. A cautionary note, on the use of UMM_INTEGRITY_CHECK, UMM_POISON_CHECK, and UMM_INFO_PRINT. All of these run with IRQs disabled, for periods that can go into 100's of us. With umm_info(NULL, true) that may go into seconds, depending on the serial interface speed and the number of memory allocations present. Use UMM_INTEGRITY_CHECK, UMM_POISON_CHECK, and UMM_INFO_PRINT sparingly. If you want to see numbers for the disabled time, explore using UMM_CRITICAL_METRICS in umm_malloc_cfg.h. * Updated upstream TODO * Changes on printing to comply with new understanding of SPI bus availability from an ISR vs forground with INTLEVEL 15. * Removed no longer needed files. * OOM build option now saves file and line number for post mortem reporting. * Missed change. * Consolated upstream integration comments into Notes.h. This helps keep these comments separated from the upstream code and to avoid getting lost. I'll expand this as I think of and remember more. * Comment updates. * Notes update. * Changes to heap.cpp - Refactored macro PTR_CHECK__LOG_LAST_FAIL. Replaced macros __umm_... with uppercase versions. Corrected misplaced POISON_CHECK__PANIC_FL macro in realloc. Added debug free options for OOM and Poison to umm_malloc_cfg.h Updated Notes.h. Lines that start with "//C" are meant to flag reviewer's attention. * Corrected Full Poison Check's placement and documented the thinking behind its placement and Integrity Checks placement with relation to the *alloc function. Just so I don't forget again :/ * Fixed typos --- cores/esp8266/core_esp8266_postmortem.cpp | 12 +- cores/esp8266/heap.cpp | 399 ++-- cores/esp8266/umm_malloc/Notes.h | 251 +++ cores/esp8266/umm_malloc/README.md | 109 +- cores/esp8266/umm_malloc/dbglog/LICENSE | 21 + cores/esp8266/umm_malloc/dbglog/README.txt | 1 + cores/esp8266/umm_malloc/dbglog/dbglog.h | 98 + cores/esp8266/umm_malloc/umm_info.c | 185 ++ cores/esp8266/umm_malloc/umm_integrity.c | 134 ++ cores/esp8266/umm_malloc/umm_local.c | 215 ++ cores/esp8266/umm_malloc/umm_local.h | 54 + cores/esp8266/umm_malloc/umm_malloc.cpp | 1912 ++++-------------- cores/esp8266/umm_malloc/umm_malloc.h | 29 +- cores/esp8266/umm_malloc/umm_malloc_cfg.h | 633 +++++- cores/esp8266/umm_malloc/umm_performance.cpp | 64 - cores/esp8266/umm_malloc/umm_performance.h | 85 - cores/esp8266/umm_malloc/umm_poison.c | 241 +++ cores/esp8266/umm_malloc/umm_stats.h | 36 - 18 files changed, 2507 insertions(+), 1972 deletions(-) create mode 100644 cores/esp8266/umm_malloc/Notes.h create mode 100644 cores/esp8266/umm_malloc/dbglog/LICENSE create mode 100644 cores/esp8266/umm_malloc/dbglog/README.txt create mode 100644 cores/esp8266/umm_malloc/dbglog/dbglog.h create mode 100644 cores/esp8266/umm_malloc/umm_info.c create mode 100644 cores/esp8266/umm_malloc/umm_integrity.c create mode 100644 cores/esp8266/umm_malloc/umm_local.c create mode 100644 cores/esp8266/umm_malloc/umm_local.h delete mode 100644 cores/esp8266/umm_malloc/umm_performance.cpp delete mode 100644 cores/esp8266/umm_malloc/umm_performance.h create mode 100644 cores/esp8266/umm_malloc/umm_poison.c delete mode 100644 cores/esp8266/umm_malloc/umm_stats.h diff --git a/cores/esp8266/core_esp8266_postmortem.cpp b/cores/esp8266/core_esp8266_postmortem.cpp index 0b254b9b7..0486ee573 100644 --- a/cores/esp8266/core_esp8266_postmortem.cpp +++ b/cores/esp8266/core_esp8266_postmortem.cpp @@ -62,6 +62,10 @@ static int s_user_reset_reason = REASON_DEFAULT_RST; // From UMM, the last caller of a malloc/realloc/calloc which failed: extern void *umm_last_fail_alloc_addr; extern int umm_last_fail_alloc_size; +#if defined(DEBUG_ESP_OOM) +extern const char *umm_last_fail_alloc_file; +extern int umm_last_fail_alloc_line; +#endif static void raise_exception() __attribute__((noreturn)); @@ -181,7 +185,13 @@ void __wrap_system_restart_local() { // Use cap-X formatting to ensure the standard EspExceptionDecoder doesn't match the address if (umm_last_fail_alloc_addr) { - ets_printf_P(PSTR("\nlast failed alloc call: %08X(%d)\n"), (uint32_t)umm_last_fail_alloc_addr, umm_last_fail_alloc_size); +#if defined(DEBUG_ESP_OOM) + ets_printf_P(PSTR("\nlast failed alloc call: %08X(%d)@%S:%d\n"), + (uint32_t)umm_last_fail_alloc_addr, umm_last_fail_alloc_size, + umm_last_fail_alloc_file, umm_last_fail_alloc_line); +#else + ets_printf_P(PSTR("\nlast failed alloc call: %08X(%d)\n"), (uint32_t)umm_last_fail_alloc_addr, umm_last_fail_alloc_size); +#endif } custom_crash_callback( &rst_info, sp_dump + offset, stack_end ); diff --git a/cores/esp8266/heap.cpp b/cores/esp8266/heap.cpp index b0bd90861..cf4195c9f 100644 --- a/cores/esp8266/heap.cpp +++ b/cores/esp8266/heap.cpp @@ -7,38 +7,134 @@ #include "umm_malloc/umm_malloc.h" #include #include +#include extern "C" { +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) +#define UMM_MALLOC(s) umm_poison_malloc(s) +#define UMM_CALLOC(n,s) umm_poison_calloc(n,s) +#define UMM_REALLOC_FL(p,s,f,l) umm_poison_realloc_fl(p,s,f,l) +#define UMM_FREE_FL(p,f,l) umm_poison_free_fl(p,f,l) + +#undef realloc +#undef free + +#elif defined(DEBUG_ESP_OOM) +#define UMM_MALLOC(s) umm_malloc(s) +#define UMM_CALLOC(n,s) umm_calloc(n,s) +#define UMM_REALLOC_FL(p,s,f,l) umm_realloc(p,s) +#define UMM_FREE_FL(p,f,l) umm_free(p) + +#undef realloc +#undef free + +#else // ! UMM_POISON_CHECK && ! DEBUG_ESP_OOM +#define UMM_MALLOC(s) malloc(s) +#define UMM_CALLOC(n,s) calloc(n,s) +#define UMM_REALLOC_FL(p,s,f,l) realloc(p,s) +#define UMM_FREE_FL(p,f,l) free(p) +#endif + + +#if defined(UMM_POISON_CHECK) + #define POISON_CHECK__ABORT() \ + do { \ + if ( ! POISON_CHECK() ) \ + abort(); \ + } while(0) + + #define POISON_CHECK__PANIC_FL(file, line) \ + do { \ + if ( ! POISON_CHECK() ) \ + __panic_func(file, line, ""); \ + } while(0) + +#else // No full heap poison checking. + #define POISON_CHECK__ABORT() do {} while(0) + #define POISON_CHECK__PANIC_FL(file, line) do { (void)file; (void)line; } while(0) +#endif + // Debugging helper, last allocation which returned NULL void *umm_last_fail_alloc_addr = NULL; int umm_last_fail_alloc_size = 0; +#if defined(DEBUG_ESP_OOM) +const char *umm_last_fail_alloc_file = NULL; +int umm_last_fail_alloc_line = 0; +#endif + +#ifdef UMM_INTEGRITY_CHECK +#define INTEGRITY_CHECK__ABORT() \ + do { \ + if ( ! INTEGRITY_CHECK() ) \ + abort(); \ + } while(0) + +#define INTEGRITY_CHECK__PANIC_FL(file, line) \ + do { \ + if ( ! INTEGRITY_CHECK() ) \ + __panic_func(file, line, ""); \ + } while(0) + +#else // ! UMM_INTEGRITY_CHECK +#define INTEGRITY_CHECK__ABORT() do {} while(0) +#define INTEGRITY_CHECK__PANIC_FL(file, line) do { (void)file; (void)line; } while(0) + +#endif // UMM_INTEGRITY_CHECK + +#if defined(DEBUG_ESP_OOM) +#define PTR_CHECK__LOG_LAST_FAIL_FL(p, s, f, l) \ + if(0 != (s) && 0 == p)\ + {\ + umm_last_fail_alloc_addr = __builtin_return_address(0);\ + umm_last_fail_alloc_size = s;\ + umm_last_fail_alloc_file = f;\ + umm_last_fail_alloc_line = l;\ + } +#define PTR_CHECK__LOG_LAST_FAIL(p, s) \ + if(0 != (s) && 0 == p)\ + {\ + umm_last_fail_alloc_addr = __builtin_return_address(0);\ + umm_last_fail_alloc_size = s;\ + umm_last_fail_alloc_file = NULL;\ + umm_last_fail_alloc_line = 0;\ + } +#else +#define PTR_CHECK__LOG_LAST_FAIL_FL(p, s, f, l) \ + (void)f;\ + (void)l;\ + if(0 != (s) && 0 == p)\ + {\ + umm_last_fail_alloc_addr = __builtin_return_address(0);\ + umm_last_fail_alloc_size = s;\ + } +#define PTR_CHECK__LOG_LAST_FAIL(p, s) \ + if(0 != (s) && 0 == p)\ + {\ + umm_last_fail_alloc_addr = __builtin_return_address(0);\ + umm_last_fail_alloc_size = s;\ + } +#endif void* _malloc_r(struct _reent* unused, size_t size) { (void) unused; void *ret = malloc(size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } + PTR_CHECK__LOG_LAST_FAIL(ret, size); return ret; } void _free_r(struct _reent* unused, void* ptr) { (void) unused; - return free(ptr); + free(ptr); } void* _realloc_r(struct _reent* unused, void* ptr, size_t size) { (void) unused; void *ret = realloc(ptr, size); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } + PTR_CHECK__LOG_LAST_FAIL(ret, size); return ret; } @@ -46,140 +142,169 @@ void* _calloc_r(struct _reent* unused, size_t count, size_t size) { (void) unused; void *ret = calloc(count, size); - if (0 != (count * size) && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = count * size; + PTR_CHECK__LOG_LAST_FAIL(ret, count * size); + return ret; +} + +#ifdef DEBUG_ESP_OOM +#undef malloc +#undef calloc +#undef realloc + +#define DEBUG_HEAP_PRINTF ets_uart_printf + +void ICACHE_RAM_ATTR print_loc(size_t size, const char* file, int line) +{ + (void)size; + (void)line; + if (system_get_os_print()) { + DEBUG_HEAP_PRINTF(":oom(%d)@", (int)size); + + bool inISR = ETS_INTR_WITHINISR(); + if (inISR && (uint32_t)file >= 0x40200000) { + DEBUG_HEAP_PRINTF("File: %p", file); + } else if (!inISR && (uint32_t)file >= 0x40200000) { + char buf[ets_strlen(file)] __attribute__ ((aligned(4))); + ets_strcpy(buf, file); + DEBUG_HEAP_PRINTF(buf); + } else { + DEBUG_HEAP_PRINTF(file); + } + + DEBUG_HEAP_PRINTF(":%d\n", line); } +} + +void ICACHE_RAM_ATTR print_oom_size(size_t size) +{ + (void)size; + if (system_get_os_print()) { + DEBUG_HEAP_PRINTF(":oom(%d)@?\n", (int)size); + } +} + +#define OOM_CHECK__PRINT_OOM(p, s) if (!p) print_oom_size(s) +#define OOM_CHECK__PRINT_LOC(p, s, f, l) if (!p) print_loc(s, f, l) + +#else // ! DEBUG_ESP_OOM + +#if 1 +//C - to be discussed - is this what you want? +//C Skip OOM logging of last fail for malloc/... and pvPort... . +//C It cost 64 more bytes of IRAM to turn on. And was not previously enabled. +#undef PTR_CHECK__LOG_LAST_FAIL_FL +#define PTR_CHECK__LOG_LAST_FAIL_FL(p, s, f, l) +#undef PTR_CHECK__LOG_LAST_FAIL +#define PTR_CHECK__LOG_LAST_FAIL(p, s) +#endif + +#define OOM_CHECK__PRINT_OOM(p, s) +#define OOM_CHECK__PRINT_LOC(p, s, f, l) +#endif + +#if defined(DEBUG_ESP_OOM) || defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) || defined(UMM_INTEGRITY_CHECK) +/* + The thinking behind the ordering of Integrity Check, Full Poison Check, and + the specific *alloc function. + + 1. Integrity Check - verifies the heap management information is not corrupt. + This allows any other testing, that walks the heap, to run safely. + + 2. Place Full Poison Check before or after a specific *alloc function? + a. After, when the *alloc function operates on an existing allocation. + b. Before, when the *alloc function creates a new, not modified, allocation. + + In a free() or realloc() call, the focus is on their allocation. It is + checked 1st and reported on 1ST if an error exists. Full Posion Check is + done after. + + For malloc(), calloc(), and zalloc() Full Posion Check is done 1st since + these functions do not modify an existing allocation. +*/ +void* ICACHE_RAM_ATTR malloc(size_t size) +{ + INTEGRITY_CHECK__ABORT(); + POISON_CHECK__ABORT(); + void* ret = UMM_MALLOC(size); + PTR_CHECK__LOG_LAST_FAIL(ret, size); + OOM_CHECK__PRINT_OOM(ret, size); + return ret; +} + +void* ICACHE_RAM_ATTR calloc(size_t count, size_t size) +{ + INTEGRITY_CHECK__ABORT(); + POISON_CHECK__ABORT(); + void* ret = UMM_CALLOC(count, size); + PTR_CHECK__LOG_LAST_FAIL(ret, count * size); + OOM_CHECK__PRINT_OOM(ret, size); + return ret; +} + +void* ICACHE_RAM_ATTR realloc(void* ptr, size_t size) +{ + INTEGRITY_CHECK__ABORT(); + void* ret = UMM_REALLOC_FL(ptr, size, NULL, 0); + POISON_CHECK__ABORT(); + PTR_CHECK__LOG_LAST_FAIL(ret, size); + OOM_CHECK__PRINT_OOM(ret, size); + return ret; +} + +void ICACHE_RAM_ATTR free(void* p) +{ + INTEGRITY_CHECK__ABORT(); + UMM_FREE_FL(p, NULL, 0); + POISON_CHECK__ABORT(); +} +#endif + + +void* ICACHE_RAM_ATTR pvPortMalloc(size_t size, const char* file, int line) +{ + INTEGRITY_CHECK__PANIC_FL(file, line); + POISON_CHECK__PANIC_FL(file, line); + void* ret = UMM_MALLOC(size); + PTR_CHECK__LOG_LAST_FAIL_FL(ret, size, file, line); + OOM_CHECK__PRINT_LOC(ret, size, file, line); + return ret; +} + +void* ICACHE_RAM_ATTR pvPortCalloc(size_t count, size_t size, const char* file, int line) +{ + INTEGRITY_CHECK__PANIC_FL(file, line); + POISON_CHECK__PANIC_FL(file, line); + void* ret = UMM_CALLOC(count, size); + PTR_CHECK__LOG_LAST_FAIL_FL(ret, count * size, file, line); + OOM_CHECK__PRINT_LOC(ret, size, file, line); + return ret; +} + +void* ICACHE_RAM_ATTR pvPortRealloc(void *ptr, size_t size, const char* file, int line) +{ + INTEGRITY_CHECK__PANIC_FL(file, line); + void* ret = UMM_REALLOC_FL(ptr, size, file, line); + POISON_CHECK__PANIC_FL(file, line); + PTR_CHECK__LOG_LAST_FAIL_FL(ret, size, file, line); + OOM_CHECK__PRINT_LOC(ret, size, file, line); + return ret; +} + +void* ICACHE_RAM_ATTR pvPortZalloc(size_t size, const char* file, int line) +{ + INTEGRITY_CHECK__PANIC_FL(file, line); + POISON_CHECK__PANIC_FL(file, line); + void* ret = UMM_CALLOC(1, size); + PTR_CHECK__LOG_LAST_FAIL_FL(ret, size, file, line); + OOM_CHECK__PRINT_LOC(ret, size, file, line); return ret; } void ICACHE_RAM_ATTR vPortFree(void *ptr, const char* file, int line) { - (void) file; - (void) line; - free(ptr); -} - -#ifdef DEBUG_ESP_OOM - -void* ICACHE_RAM_ATTR pvPortMalloc(size_t size, const char* file, int line) -{ - return malloc_loc(size, file, line); -} - -void* ICACHE_RAM_ATTR pvPortCalloc(size_t count, size_t size, const char* file, int line) -{ - return calloc_loc(count, size, file, line); -} - -void* ICACHE_RAM_ATTR pvPortRealloc(void *ptr, size_t size, const char* file, int line) -{ - return realloc_loc(ptr, size, file, line); -} - -void* ICACHE_RAM_ATTR pvPortZalloc(size_t size, const char* file, int line) -{ - return calloc_loc(1, size, file, line); -} - -#undef malloc -#undef calloc -#undef realloc - -static const char oom_fmt[] PROGMEM STORE_ATTR = ":oom(%d)@?\n"; -static const char oom_fmt_1[] PROGMEM STORE_ATTR = ":oom(%d)@"; -static const char oom_fmt_2[] PROGMEM STORE_ATTR = ":%d\n"; - -void* malloc (size_t s) -{ - void* ret = umm_malloc(s); - if (!ret) - os_printf(oom_fmt, (int)s); - return ret; -} - -void* calloc (size_t n, size_t s) -{ - void* ret = umm_calloc(n, s); - if (!ret) - os_printf(oom_fmt, (int)s); - return ret; -} - -void* realloc (void* p, size_t s) -{ - void* ret = umm_realloc(p, s); - if (!ret) - os_printf(oom_fmt, (int)s); - return ret; -} - -void print_loc (size_t s, const char* file, int line) -{ - os_printf(oom_fmt_1, (int)s); - os_printf(file); - os_printf(oom_fmt_2, line); -} - -void* malloc_loc (size_t s, const char* file, int line) -{ - void* ret = umm_malloc(s); - if (!ret) - print_loc(s, file, line); - return ret; -} - -void* calloc_loc (size_t n, size_t s, const char* file, int line) -{ - void* ret = umm_calloc(n, s); - if (!ret) - print_loc(s, file, line); - return ret; -} - -void* realloc_loc (void* p, size_t s, const char* file, int line) -{ - void* ret = umm_realloc(p, s); - if (!ret) - print_loc(s, file, line); - return ret; -} - -#else - -void* ICACHE_RAM_ATTR pvPortMalloc(size_t size, const char* file, int line) -{ - (void) file; - (void) line; - return malloc(size); -} - -void* ICACHE_RAM_ATTR pvPortCalloc(size_t count, size_t size, const char* file, int line) -{ - (void) file; - (void) line; - return calloc(count, size); -} - -void* ICACHE_RAM_ATTR pvPortRealloc(void *ptr, size_t size, const char* file, int line) -{ - (void) file; - (void) line; - return realloc(ptr, size); -} - -void* ICACHE_RAM_ATTR pvPortZalloc(size_t size, const char* file, int line) -{ - (void) file; - (void) line; - return calloc(1, size); -} - -#endif // !defined(DEBUG_ESP_OOM) - -size_t xPortGetFreeHeapSize(void) -{ - return umm_free_heap_size(); + INTEGRITY_CHECK__PANIC_FL(file, line); + UMM_FREE_FL(ptr, file, line); + POISON_CHECK__PANIC_FL(file, line); } size_t ICACHE_RAM_ATTR xPortWantedSizeAlign(size_t size) diff --git a/cores/esp8266/umm_malloc/Notes.h b/cores/esp8266/umm_malloc/Notes.h new file mode 100644 index 000000000..e9d96b1e8 --- /dev/null +++ b/cores/esp8266/umm_malloc/Notes.h @@ -0,0 +1,251 @@ +#if 0 +/* + * This .h is nothing but comments about thoughts and observations made while + * updating the Arduino ESP8266 Core, with the new upstream umm_malloc. It is + * added as a .h so that it does not get lost and to avoid cluttering up the + * code with a huge block comment. + + +PR text description: + +upstream version of `umm_malloc` customized for Arduino ESP8266 Core + +This updates the heap management library, umm_malloc, to the current upstream +version at https://github.com/rhempel/umm_malloc. Some reorganizing and new code +was needed to use the new version. + +This is a list of noteworthy changes: + +UMM_POISON - now has a lite option as well as the previous intensive check +option. The code for running the full poison test at the call of the various +alloc functions was removed in the upstream version. In this port, the missing +code was added to heap.cpp and umm_local.cpp. +* UMM_POISON - appears to have been partially changed to UMM_POISON_CHECK, + I treat it as deprecated and used UMM_POISON_CHECK when needed. + However, the Arduino Core's references to UMM_POISON were replaced with + UMM_POISON_CHECK_LITE. +* UMM_POISON_CHECK_LITE - Less intense, it just checks poison on active + neighboring allocations. +* UMM_POISON_CHECK - Full heap intensive check of poison + +A cautionary note, on the use of UMM_INTEGRITY_CHECK and UMM_POISON_CHECK, and +umm_info(). All of these run with IRQs disabled, for periods that can go into +100's of us. With umm_info(NULL, true) that may go into seconds, depending on +the serial interface speed and the number of memory allocations present. Use +UMM_INTEGRITY_CHECK, UMM_POISON_CHECK, and umm_info() sparingly. If you want to +see numbers for the disabled time, explore using UMM_CRITICAL_METRICS in +umm_malloc_cfg.h. + +=============================================================================== + + New upstream umm_malloc feature delta's from the old umm_malloc we were using: + + umm_posion check for a given *alloc - failure - no longer panics. + + option to run full poison check at each *alloc call, not present + + option to run full interity check at each *alloc call, not present + + upstream code does not call panic from poison_check_block. + + Defragmenting effect of realloc is gone. It now minimizes copy. This + may have been an accident during code cleanup. + + In one form or another these features have been restored in the + reintegration of the upstream umm_malloc into the Arduino ESP8266 Core. + +=============================================================================== + + A list of changes made for local adaptation of newer upstream umm_malloc. + + In umm_malloc.c + Renamed to umm_malloc.cpp + Added `extern "C" { ... };` around code. + Surround DBGLOG_LEVEL with #ifndef... Define value of DBGLOG_LEVEL from + umm_malloc_cfg.h + umm_realloc() - Added UMM_CRITICAL_SUSPEND()/UMM_CRITICAL_RESUME() for when + lightweight locks are available. eg. sti/cli. Single threaded single CPU + case. + umm_realloc() - appears to have been refactored to minimize memmove and + memcpy. The old version would always combine an adjacent block in the + direction of the start of the heap when available and do a memmove. This + had a defragging effect. This appears to have been replaced with an attempt + to minimize copy when possible. + Added heap stats tracking. + + In umm_info.c + umm_info() - Added UMM_CRITICAL_DECL(id_info), updated critical sections + with tag. + Carried forward: Added NULL ptr check at beginning (umm_malloc.c). + + In umm_poison.c: + Resolved C++ compiler error reported on get_poisoned(), and get_unpoisoned(). + They now take in void * arg instead of unsigned char *. + Added #if ... || defined(UMM_POISON_CHECK_LITE) to the conditional. + + In umm_integrity.c: + Replaced printf with DBGLOG_FUNCTION. This needs to be a malloc free + function and ISR safe. + Added critical sections. + + In umm_malloc_cfg.h: + Added macro UMM_CRITICAL_SUSPEND()/UMM_CRITICAL_RESUME() + + Globally change across all files %i to %d: umm_info.c, umm_malloc.c, + Added a #ifdef BUILD_UMM_MALLOC_C fence to prevent Arduino IDE from building + the various .c files that are #included into umm_malloc.cpp. They are + normally enabled by #define in umm_malloc_cfg.h. In this + case it builds fine; however, if the define is global, the IDE will try and + build the .c by itself. + + Notes, + umm_integrity_check() is called by macro INTEGRITY_CHECK which returns 1 + on success. No corruption. Does a time consuming scan of the whole heap. + It will call UMM_HEAP_CORRUPTION_CB if an error is found. + + umm_poison_check(), formerly known as check_poison_all_blocks(), + is called by macro POISON_CHECK which returns 1 on success for no + corruption. Does a time consuming scan of all active allocations for + modified poison. The new upstream version does *NOT* call + UMM_HEAP_CORRUPTION_CB if an error is found. The option description says + it does! + + umm_poison_realloc() and umm_poison_free() no longer call the macro + UMM_HEAP_CORRUPTION_CB on poison error. Just a printf message is + generated. I have added alternative functions umm_poison_free_fl, + umm_poison_realloc_fl, and get_unpoisoned_check_neighbors in + umm_local.cpp. These expand the poison check on the current allocation to + include its nearest allocated neighbors in the heap. + + umm_malloc() has been extended to call check_poison_neighbors for the + allocation it selects, conditionally for UMM_POISON_CHECK_LITE. + + For upstream umm_malloc "# define POISON_CHECK() 0" should have been 1 + add to list to report. + + +============================================================================== + +Notes from searching for the best print option + +Printing from the malloc routines is tricky. Since a print library +might call *alloc. Then recursion may follow as each error call may fail +into another error and so on. + +Objective: To be able to print "last gasp" diagnostic messages +when interrupts are disabled and w/o availability of heap resources. + +It turns out things are more complicated than that. These are three cases for +printing from the heap and the current solution.: + + 1. Printing detailed heap info through `umm_info(NULL, 1);`. This function + resides in flash and can only be called from non-ISR context. It can use + PROGMEM strings. Because SPI bus will not be busy when called from foreground. + + At this time it is believed that, while running from foreground, a cache-miss + at INTLEVEL 15 can be handled. The key factor being the SPI bus is not + busy at the time of the cache-miss. It is not clear what gets invoked to + process the cache-miss. A software vector call? A hardware assisted transfer? + In any case `umm_info_safe_printf_P()` is also in flash. + + The focus here is to print w/o allocating memory and use strings + in flash to preserve DRAM. + + 2. Printing diagnostic messages possibly from from ISR context. + + Use `ets_uart_printf()` in boot ROM. + + 3. Printing diagnostic messages from `heap.cpp` these printf's need to check + `system_get_os_print()` to confirm debug-output is enabled just as + `os_printf()` did. + + Do test calls to `system_get_os_print()` and call `ets_uart_printf()` + in boot ROM when debug print allowed. + +Considerations: +* can be called from ISR +* can be called from malloc code, cannot use malloc +* can be called from malloc code that was called from an ISR +* can be called from within a critical section, eg. xt_rsil(15); + * this may be effectively the same as being called from an ISR? + Update: Current thinking is that from foreground we have more leeway + than an ISR. + +Knowns: +* ets_printf - For RTOS SDK they replaced this function with one in the SDK. + Most of the problems I can see with ets_printf center around not being + able to maintain a port to thread context. That is you cannot have one + thread using one port while another thread uses the other. In the no OS + case we cannot have one area of code using one port and another area of + code using the other port. Most of the ROM printf functions are not built + to support this kind of usage. Things get especially dangerous when you + try to use the ets_external_printf stuff. +* ets_vprintf - by itself is safe. +* newlibc printf - not safe - lives in flash. +* newlibc snprintf - not safe - lives in flash. +* builtin putc1 print function - Is installed when you use + ets_install_uart_printf. Which calls ets_install_putc1. The selection of UART + is performed by calling uart_buff_switch with 0 for UART0 and 1 for UART1. + This should work for our purpose here, if handled as follows: + * call uart_buff_switch at each printf call to reselect UART + * Update: uart_buff_switch is now updated by uart_set_debug() in uart.cpp + * use a stack buffer to hold a copy the PROGMEM string to print from. + * use ets_vprintf for printing with putc1 function. +* os_printf_plus looks interesting. It is in IRAM. If no heap is available it + will use up to 64 bytes of stack space to copy a PROGMEM fmt for printing. + Issues: + * Printing is turned off by system_set_os_print + * putc1 needs to be in IRAM - this is a uart.cpp issue + * Need to force system_get_free_heap_size to return 0 during critical periods. + * won't work for umm_info if it prints over 64 characters. + * along with umm_info there are other debug messages that exceed 64 characters. +* ets_uart_printf - Appears safe. Just no PROGMEM support. Uses + uart_buff_switch to select UART. + +=============================================================================== + +heap.cpp is the entry point for most of the heap API calls. +It is a merge point for abstracted heap API calls, such as _malloc_r, +pvPortMalloc, and malloc. Thin wrappers are created here for these entry points +and others. The wrappers call through to equivalent umm_malloc entry-point. +These wrappers also provide the access points to do debug options, like OOM, +Integrity Check, and Poison Check. + +-DEBUG_ESP_OOM or select `Debug Level: "OOM"` from the IDE. +This option will add extra code to save information on the last OOM event. If +your code is built with the `Debug port: "Serial"` option, debug messages will +print on OOM events. You do not have to do `Debug port: "Serial"` to get OOM +debug messages. From within your code, you can make a call to +`Serial.debugOutput(true);` to enable OOM printing. Of course for this to work +your code must be built with `Debug Level: "OOM"` or equal. + +-DUUM_POISON is now the same as -DUMM_POISON_CHECK_LITE +This is new behavior with this updated. UMM_POISON_CHECK_LITE - checks the +allocation presented at realloc() and free(). Expands the poison check on the +current allocation to include its nearest allocated neighbors in the heap. +umm_malloc() will also check the neighbors of the selected allocation before +use. + +For more details and options search on UMM_POISON_CHECK in `umm_malloc_cfg.h` + +TODO: provide some interesting numbers on the time to perform: +* UMM_POISON_CHECK +* UMM_INTEGRITY_CHECK +* umm_info(NUll, 0) built with and without print capability +* umm_info(NUll, 1) printing a report to Serial device. + +=============================================================================== + +Enhancement ideas: + 1. Add tagging to heap allocations. Redefine UMM_POISONED_BLOCK_LEN_TYPE, + expand it to include an element for the calling address of allocating + requester. Expand umm_info(NULL, 1) to print the respective address with each + active allocation. The difficulty here will be the ever-growing complexity of + overlapping build options. I think it would be easiest to build this in with + and expand the UMM_POISON_CHECK_LITE option. + + 2. A build option to not have printing, from umm_info() compiled in. This can + save on the execution time spent with interrupts disabled. + +*/ +#endif diff --git a/cores/esp8266/umm_malloc/README.md b/cores/esp8266/umm_malloc/README.md index 1c7805a1c..f81aa09cc 100644 --- a/cores/esp8266/umm_malloc/README.md +++ b/cores/esp8266/umm_malloc/README.md @@ -10,18 +10,18 @@ might get expensive. ## Acknowledgements -Joerg Wunsch and the avr-libc provided the first malloc() implementation +Joerg Wunsch and the avr-libc provided the first `malloc()` implementation that I examined in detail. -http://www.nongnu.org/avr-libc +`http://www.nongnu.org/avr-libc` Doug Lea's paper on malloc() was another excellent reference and provides a lot of detail on advanced memory management techniques such as binning. -http://g.oswego.edu/dl/html/malloc.html +`http://g.oswego.edu/dl/html/malloc.html` Bill Dittman provided excellent suggestions, including macros to support -using these functions in critical sections, and for optimizing realloc() +using these functions in critical sections, and for optimizing `realloc()` further by checking to see if the previous block was free and could be used for the new block size. This can help to reduce heap fragmentation significantly. @@ -30,11 +30,73 @@ Yaniv Ankin suggested that a way to dump the current heap condition might be useful. I combined this with an idea from plarroy to also allow checking a free pointer to make sure it's valid. +Dimitry Frank contributed many helpful additions to make things more +robust including a user specified config file and a method of testing +the integrity of the data structures. + +## Usage + +Copy the `umm_malloc_cfg_example.h` file to `umm_malloc_cfg.h` and +make the changes required to support your application. + +The following `#define`s must be set to something useful for the +library to work at all + +- `UMM_MALLOC_CFG_HEAP_ADDR` must be set to the symbol representing + the starting address of the heap. The heap must be + aligned on the natural boundary size of the processor. +- `UMM_MALLOC_CFG_HEAP_SIZE` must be set to the size of the heap. + The heap size must be a multiple of the natural boundary size of + the processor. + +The fit algorithm is defined as either: + +- `UMM_BEST_FIT` which scans the entire free list and looks + for either an exact fit or the smallest block that will + satisfy the request. This is the default fit method. +- `UMM_FIRST_FIT` which scans the entire free list and looks + for the first block that satisfies the request. + +The following `#define`s are disabled by default and should +remain disabled for production use. They are helpful when +testing allocation errors (which are normally due to bugs in +the application code) or for running the test suite when +making changes to the code. + +You can define them in your compiler command line or uncomment +the corresponding entries is `umm_malloc_cfg.h`: + +- `UMM_INFO` is used to include code that allows dumping + the entire heap structure (helpful when there's a problem). + +- `UMM_INTEGRITY_CHECK` is used to include code that + performs an integrity check on the heap structure. It's + up to you to call the `umm_integrity_check()` function. + +- `UMM_POISON_CHECK` is used to include code that + adds some bytes around the memory being allocated that + are filled with known data. If the data is not intact + when the block is checked, then somone has written outside + of the memory block they have been allocated. It is up + to you to call the `umm_poison_check()` function. + +## API + +The following functions are available for your application: + +- `void *umm_malloc( size_t size );` +- `void *umm_calloc( size_t num, size_t size );` +- `void *umm_realloc( void *ptr, size_t size );` +- `void umm_free( void *ptr );` + +They have exactly the same semantics as the corresponding standard library +functions. + ## Background The memory manager assumes the following things: -1. The standard POSIX compliant malloc/realloc/free semantics are used +1. The standard POSIX compliant malloc/calloc/realloc/free semantics are used 1. All memory used by the manager is allocated at link time, it is aligned on a 32 bit boundary, it is contiguous, and its extent (start and end address) is filled in by the linker. @@ -45,17 +107,17 @@ The fastest linked list implementations use doubly linked lists so that its possible to insert and delete blocks in constant time. This memory manager keeps track of both free and used blocks in a doubly linked list. -Most memory managers use some kind of list structure made up of pointers +Most memory managers use a list structure made up of pointers to keep track of used - and sometimes free - blocks of memory. In an embedded system, this can get pretty expensive as each pointer can use up to 32 bits. -In most embedded systems there is no need for managing large blocks -of memory dynamically, so a full 32 bit pointer based data structure +In most embedded systems there is no need for managing a large quantity +of memory blocks dynamically, so a full 32 bit pointer based data structure for the free and used block lists is wasteful. A block of memory on the free list would use 16 bytes just for the pointers! -This memory management library sees the malloc heap as an array of blocks, +This memory management library sees the heap as an array of blocks, and uses block numbers to keep track of locations. The block numbers are 15 bits - which allows for up to 32767 blocks of memory. The high order bit marks a block as being either free or in use, which will be explained @@ -75,7 +137,7 @@ can always add more data bytes to the body of the memory block at the expense of free block size overhead. There are a lot of little features and optimizations in this memory -management system that makes it especially suited to small embedded, but +management system that makes it especially suited to small systems, and the best way to appreciate them is to review the data structures and algorithms used, so let's get started. @@ -124,10 +186,9 @@ Where: - n is the index of the next block in the heap - p is the index of the previous block in the heap -Note that the free list information is gone, because it's now being used to -store actual data for the application. It would have been nice to store -the next and previous free list indexes as well, but that would be a waste -of space. If we had even 500 items in use, that would be 2,000 bytes for +Note that the free list information is gone because it's now +being used to store actual data for the application. If we had +even 500 items in use, that would be 2,000 bytes for free list information. We simply can't afford to waste that much. The address of the `...` area is what is returned to the application @@ -143,7 +204,7 @@ described. `...` between memory blocks indicates zero or more additional blocks are allocated for use by the upper block. -And while we're talking about "upper" and "lower" blocks, we should make +While we're talking about "upper" and "lower" blocks, we should make a comment about adresses. In the diagrams, a block higher up in the picture is at a lower address. And the blocks grow downwards their block index increases as does their physical address. @@ -166,24 +227,27 @@ we're at the end of the list! At this point, the malloc has a special test that checks if the current block index is 0, which it is. This special case initializes the free -list to point at block index 1. +list to point at block index 1 and then points block 1 to the +last block (lf) on the heap. ``` BEFORE AFTER +----+----+----+----+ +----+----+----+----+ -0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | +0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | +----+----+----+----+ +----+----+----+----+ +----+----+----+----+ - 1 | 0 | 0 | 0 | 0 | + 1 |*lf | 0 | 0 | 0 | + +----+----+----+----+ + ... + +----+----+----+----+ + lf | 0 | 1 | 0 | 0 | +----+----+----+----+ ``` The heap is now ready to complete the first malloc operation. - -### Operation of malloc when we have reached the end of the free list and -there is no block large enough to accommodate the request. +### Operation of malloc when we have reached the end of the free list and there is no block large enough to accommodate the request. This happens at the very first malloc operation, or any time the free list is traversed and no free block large enough for the request is @@ -306,8 +370,7 @@ else ``` Step 1 of the free operation checks if the next block is free, and if it -is then insert this block into the free list and assimilate the next block -with this one. +is assimilate the next block with this one. Note that c is the block we are freeing up, cf is the free block that follows it. diff --git a/cores/esp8266/umm_malloc/dbglog/LICENSE b/cores/esp8266/umm_malloc/dbglog/LICENSE new file mode 100644 index 000000000..25e920054 --- /dev/null +++ b/cores/esp8266/umm_malloc/dbglog/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Ralph Hempel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cores/esp8266/umm_malloc/dbglog/README.txt b/cores/esp8266/umm_malloc/dbglog/README.txt new file mode 100644 index 000000000..54f86e148 --- /dev/null +++ b/cores/esp8266/umm_malloc/dbglog/README.txt @@ -0,0 +1 @@ +Downloaded from: https://github.com/rhempel/c-helper-macros/tree/develop diff --git a/cores/esp8266/umm_malloc/dbglog/dbglog.h b/cores/esp8266/umm_malloc/dbglog/dbglog.h new file mode 100644 index 000000000..16f57236c --- /dev/null +++ b/cores/esp8266/umm_malloc/dbglog/dbglog.h @@ -0,0 +1,98 @@ +/* ---------------------------------------------------------------------------- + * dbglog.h - A set of macros that cleans up code that needs to produce debug + * or log information. + * + * Many embedded systems still put a premium on code space and therefore need + * a way to conditionally compile in debug code. Yes, it can lead to code that + * runs differently depending on whether the debug code is cmpiled in or not + * but you need to be able to evaluate the tradeoff. + * + * See copyright notice in LICENSE.TXT + * ---------------------------------------------------------------------------- + * NOTE WELL that this file may be included multiple times - this allows you + * to set the trace level #define DBGLOG_LEVEL x + * + * To update which of the DBGLOG macros are compiled in, you must redefine the + * DBGLOG_LEVEL macro and the inlcude the dbglog.h file again, like this: + * + * #undef DBGLOG_LEVEL + * #define DBGLOG_LEVEL 6 + * #include "dbglog/dbglog.txt" + * + * To handle multiple inclusion, we need to first undefine any macros we define + * so that the compiler does not warn us that we are changing a macro. + * ---------------------------------------------------------------------------- + * The DBGLOG_LEVEL and DBGLOG_FUNCTION should be defined BEFORE this + * file is included or else the following defaults are used: + * + * #define DBGLOG_LEVEL 0 + * #define DBGLOG_FUNCTION printf + * ---------------------------------------------------------------------------- + * There are macros to handle the following decreasing levels of detail: + * + * 6 = TRACE + * 5 = DEBUG + * 4 = CRITICAL + * 3 = ERROR + * 2 = WARNING + * 1 = INFO + * 0 = FORCE - The DBGLOG_FUNCTION is always compiled in and is called only when + * the first parameter to the macro is non-0 + * ---------------------------------------------------------------------------- + */ + +#undef DBGLOG_TRACE +#undef DBGLOG_DEBUG +#undef DBGLOG_CRITICAL +#undef DBGLOG_ERROR +#undef DBGLOG_WARNING +#undef DBGLOG_INFO +#undef DBGLOG_FORCE + +#ifndef DBGLOG_LEVEL +# define DBGLOG_LEVEL 0 +#endif + +#ifndef DBGLOG_FUNCTION +# define DBGLOG_FUNCTION printf +#endif + +/* ------------------------------------------------------------------------- */ + +#if DBGLOG_LEVEL >= 6 +# define DBGLOG_TRACE(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_TRACE(format, ...) +#endif + +#if DBGLOG_LEVEL >= 5 +# define DBGLOG_DEBUG(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_DEBUG(format, ...) +#endif + +#if DBGLOG_LEVEL >= 4 +# define DBGLOG_CRITICAL(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_CRITICAL(format, ...) +#endif + +#if DBGLOG_LEVEL >= 3 +# define DBGLOG_ERROR(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_ERROR(format, ...) +#endif + +#if DBGLOG_LEVEL >= 2 +# define DBGLOG_WARNING(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_WARNING(format, ...) +#endif + +#if DBGLOG_LEVEL >= 1 +# define DBGLOG_INFO(format, ...) DBGLOG_FUNCTION(format, ## __VA_ARGS__) +#else +# define DBGLOG_INFO(format, ...) +#endif + +#define DBGLOG_FORCE(force, format, ...) {if(force) {DBGLOG_FUNCTION(format, ## __VA_ARGS__);}} diff --git a/cores/esp8266/umm_malloc/umm_info.c b/cores/esp8266/umm_malloc/umm_info.c new file mode 100644 index 000000000..96a0f89be --- /dev/null +++ b/cores/esp8266/umm_malloc/umm_info.c @@ -0,0 +1,185 @@ +#if defined(BUILD_UMM_MALLOC_C) + +#ifdef UMM_INFO + +/* ---------------------------------------------------------------------------- + * One of the coolest things about this little library is that it's VERY + * easy to get debug information about the memory heap by simply iterating + * through all of the memory blocks. + * + * As you go through all the blocks, you can check to see if it's a free + * block by looking at the high order bit of the next block index. You can + * also see how big the block is by subtracting the next block index from + * the current block number. + * + * The umm_info function does all of that and makes the results available + * in the ummHeapInfo structure. + * ---------------------------------------------------------------------------- + */ + +UMM_HEAP_INFO ummHeapInfo; + +void *umm_info( void *ptr, int force ) { + UMM_CRITICAL_DECL(id_info); + + unsigned short int blockNo = 0; + + if (umm_heap == NULL) { + umm_init(); + } + + /* Protect the critical section... */ + UMM_CRITICAL_ENTRY(id_info); + + /* + * Clear out all of the entries in the ummHeapInfo structure before doing + * any calculations.. + */ + memset( &ummHeapInfo, 0, sizeof( ummHeapInfo ) ); + + DBGLOG_FORCE( force, "\n" ); + DBGLOG_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); + DBGLOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5d|NF %5d|PF %5d|\n", + (unsigned long)(&UMM_BLOCK(blockNo)), + blockNo, + UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, + UMM_PBLOCK(blockNo), + (UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK )-blockNo, + UMM_NFREE(blockNo), + UMM_PFREE(blockNo) ); + + /* + * Now loop through the block lists, and keep track of the number and size + * of used and free blocks. The terminating condition is an nb pointer with + * a value of zero... + */ + + blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; + + while( UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK ) { + size_t curBlocks = (UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK )-blockNo; + + ++ummHeapInfo.totalEntries; + ummHeapInfo.totalBlocks += curBlocks; + + /* Is this a free block? */ + + if( UMM_NBLOCK(blockNo) & UMM_FREELIST_MASK ) { + ++ummHeapInfo.freeEntries; + ummHeapInfo.freeBlocks += curBlocks; + ummHeapInfo.freeSize2 += (unsigned int)curBlocks + * (unsigned int)sizeof(umm_block) + * (unsigned int)curBlocks + * (unsigned int)sizeof(umm_block); + + if (ummHeapInfo.maxFreeContiguousBlocks < curBlocks) { + ummHeapInfo.maxFreeContiguousBlocks = curBlocks; + } + + DBGLOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5u|NF %5d|PF %5d|\n", + (unsigned long)(&UMM_BLOCK(blockNo)), + blockNo, + UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, + UMM_PBLOCK(blockNo), + (unsigned int)curBlocks, + UMM_NFREE(blockNo), + UMM_PFREE(blockNo) ); + + /* Does this block address match the ptr we may be trying to free? */ + + if( ptr == &UMM_BLOCK(blockNo) ) { + + /* Release the critical section... */ + UMM_CRITICAL_EXIT(id_info); + + return( ptr ); + } + } else { + ++ummHeapInfo.usedEntries; + ummHeapInfo.usedBlocks += curBlocks; + + DBGLOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5u|\n", + (unsigned long)(&UMM_BLOCK(blockNo)), + blockNo, + UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, + UMM_PBLOCK(blockNo), + (unsigned int)curBlocks ); + } + + blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; + } + + /* + * Update the accounting totals with information from the last block, the + * rest must be free! + */ + + { + size_t curBlocks = UMM_NUMBLOCKS-blockNo; + ummHeapInfo.freeBlocks += curBlocks; + ummHeapInfo.totalBlocks += curBlocks; + + if (ummHeapInfo.maxFreeContiguousBlocks < curBlocks) { + ummHeapInfo.maxFreeContiguousBlocks = curBlocks; + } + } + + DBGLOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5d|NF %5d|PF %5d|\n", + (unsigned long)(&UMM_BLOCK(blockNo)), + blockNo, + UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, + UMM_PBLOCK(blockNo), + UMM_NUMBLOCKS-blockNo, + UMM_NFREE(blockNo), + UMM_PFREE(blockNo) ); + + DBGLOG_FORCE( force, "+----------+-------+--------+--------+-------+--------+--------+\n" ); + + DBGLOG_FORCE( force, "Total Entries %5d Used Entries %5d Free Entries %5d\n", + ummHeapInfo.totalEntries, + ummHeapInfo.usedEntries, + ummHeapInfo.freeEntries ); + + DBGLOG_FORCE( force, "Total Blocks %5d Used Blocks %5d Free Blocks %5d\n", + ummHeapInfo.totalBlocks, + ummHeapInfo.usedBlocks, + ummHeapInfo.freeBlocks ); + + DBGLOG_FORCE( force, "+--------------------------------------------------------------+\n" ); + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) + if (ummHeapInfo.freeBlocks == ummStats.free_blocks) { + DBGLOG_FORCE( force, "heap info Free blocks and heap statistics Free blocks match.\n"); + } else { + DBGLOG_FORCE( force, "\nheap info Free blocks %5d != heap statistics Free Blocks %5d\n\n", + ummHeapInfo.freeBlocks, + ummStats.free_blocks ); + } + DBGLOG_FORCE( force, "+--------------------------------------------------------------+\n" ); + + print_stats(force); +#endif + + /* Release the critical section... */ + UMM_CRITICAL_EXIT(id_info); + + return( NULL ); +} + +/* ------------------------------------------------------------------------ */ + +size_t umm_free_heap_size( void ) { + umm_info(NULL, 0); + return (size_t)ummHeapInfo.freeBlocks * sizeof(umm_block); +} + +size_t umm_max_block_size( void ) { + umm_info(NULL, 0); + return ummHeapInfo.maxFreeContiguousBlocks * sizeof(umm_block); +} + +/* ------------------------------------------------------------------------ */ + +#endif + +#endif // defined(BUILD_UMM_MALLOC_C) diff --git a/cores/esp8266/umm_malloc/umm_integrity.c b/cores/esp8266/umm_malloc/umm_integrity.c new file mode 100644 index 000000000..ff3cb24a1 --- /dev/null +++ b/cores/esp8266/umm_malloc/umm_integrity.c @@ -0,0 +1,134 @@ +#if defined(BUILD_UMM_MALLOC_C) +/* integrity check (UMM_INTEGRITY_CHECK) {{{ */ +#if defined(UMM_INTEGRITY_CHECK) +/* + * Perform integrity check of the whole heap data. Returns 1 in case of + * success, 0 otherwise. + * + * First of all, iterate through all free blocks, and check that all backlinks + * match (i.e. if block X has next free block Y, then the block Y should have + * previous free block set to X). + * + * Additionally, we check that each free block is correctly marked with + * `UMM_FREELIST_MASK` on the `next` pointer: during iteration through free + * list, we mark each free block by the same flag `UMM_FREELIST_MASK`, but + * on `prev` pointer. We'll check and unmark it later. + * + * Then, we iterate through all blocks in the heap, and similarly check that + * all backlinks match (i.e. if block X has next block Y, then the block Y + * should have previous block set to X). + * + * But before checking each backlink, we check that the `next` and `prev` + * pointers are both marked with `UMM_FREELIST_MASK`, or both unmarked. + * This way, we ensure that the free flag is in sync with the free pointers + * chain. + */ +int umm_integrity_check(void) { + UMM_CRITICAL_DECL(id_integrity); + int ok = 1; + unsigned short int prev; + unsigned short int cur; + + if (umm_heap == NULL) { + umm_init(); + } + + /* Iterate through all free blocks */ + prev = 0; + UMM_CRITICAL_ENTRY(id_integrity); + while(1) { + cur = UMM_NFREE(prev); + + /* Check that next free block number is valid */ + if (cur >= UMM_NUMBLOCKS) { + DBGLOG_FUNCTION("heap integrity broken: too large next free num: %d " + "(in block %d, addr 0x%lx)\n", cur, prev, + (unsigned long)&UMM_NBLOCK(prev)); + ok = 0; + goto clean; + } + if (cur == 0) { + /* No more free blocks */ + break; + } + + /* Check if prev free block number matches */ + if (UMM_PFREE(cur) != prev) { + DBGLOG_FUNCTION("heap integrity broken: free links don't match: " + "%d -> %d, but %d -> %d\n", + prev, cur, cur, UMM_PFREE(cur)); + ok = 0; + goto clean; + } + + UMM_PBLOCK(cur) |= UMM_FREELIST_MASK; + + prev = cur; + } + + /* Iterate through all blocks */ + prev = 0; + while(1) { + cur = UMM_NBLOCK(prev) & UMM_BLOCKNO_MASK; + + /* Check that next block number is valid */ + if (cur >= UMM_NUMBLOCKS) { + DBGLOG_FUNCTION("heap integrity broken: too large next block num: %d " + "(in block %d, addr 0x%lx)\n", cur, prev, + (unsigned long)&UMM_NBLOCK(prev)); + ok = 0; + goto clean; + } + if (cur == 0) { + /* No more blocks */ + break; + } + + /* make sure the free mark is appropriate, and unmark it */ + if ((UMM_NBLOCK(cur) & UMM_FREELIST_MASK) + != (UMM_PBLOCK(cur) & UMM_FREELIST_MASK)) + { + DBGLOG_FUNCTION("heap integrity broken: mask wrong at addr 0x%lx: n=0x%x, p=0x%x\n", + (unsigned long)&UMM_NBLOCK(cur), + (UMM_NBLOCK(cur) & UMM_FREELIST_MASK), + (UMM_PBLOCK(cur) & UMM_FREELIST_MASK) + ); + ok = 0; + goto clean; + } + + /* make sure the block list is sequential */ + if (cur <= prev ) { + DBGLOG_FUNCTION("heap integrity broken: next block %d is before prev this one " + "(in block %d, addr 0x%lx)\n", cur, prev, + (unsigned long)&UMM_NBLOCK(prev)); + ok = 0; + goto clean; + } + +/* unmark */ + UMM_PBLOCK(cur) &= UMM_BLOCKNO_MASK; + + /* Check if prev block number matches */ + if (UMM_PBLOCK(cur) != prev) { + DBGLOG_FUNCTION("heap integrity broken: block links don't match: " + "%d -> %d, but %d -> %d\n", + prev, cur, cur, UMM_PBLOCK(cur)); + ok = 0; + goto clean; + } + + prev = cur; + } + +clean: + UMM_CRITICAL_EXIT(id_integrity); + if (!ok){ + UMM_HEAP_CORRUPTION_CB(); + } + return ok; +} + +#endif +/* }}} */ +#endif // defined(BUILD_UMM_MALLOC_C) diff --git a/cores/esp8266/umm_malloc/umm_local.c b/cores/esp8266/umm_malloc/umm_local.c new file mode 100644 index 000000000..b984e86b8 --- /dev/null +++ b/cores/esp8266/umm_malloc/umm_local.c @@ -0,0 +1,215 @@ +/* + * Local Additions/Enhancements + * + */ +#if defined(BUILD_UMM_MALLOC_C) + +#if defined(UMM_CRITICAL_METRICS) +/* + * umm_malloc performance measurments for critical sections + */ +UMM_TIME_STATS time_stats = { + {0xFFFFFFFF, 0U, 0U, 0U}, + {0xFFFFFFFF, 0U, 0U, 0U}, + {0xFFFFFFFF, 0U, 0U, 0U}, +#ifdef UMM_INFO + {0xFFFFFFFF, 0U, 0U, 0U}, +#endif +#ifdef UMM_POISON_CHECK + {0xFFFFFFFF, 0U, 0U, 0U}, +#endif +#ifdef UMM_INTEGRITY_CHECK + {0xFFFFFFFF, 0U, 0U, 0U}, +#endif + {0xFFFFFFFF, 0U, 0U, 0U} }; + +bool ICACHE_FLASH_ATTR get_umm_get_perf_data(UMM_TIME_STATS *p, size_t size) +{ + UMM_CRITICAL_DECL(id_no_tag); + if (p && sizeof(time_stats) == size) + { + UMM_CRITICAL_ENTRY(id_no_tag); + memcpy(p, &time_stats, size); + UMM_CRITICAL_EXIT(id_no_tag); + return true; + } + return false; +} +#endif + +// Alternate Poison functions + +#if defined(UMM_POISON_CHECK_LITE) +// We skip this when doing the full poison check. + +static int check_poison_neighbors( unsigned short cur ) { + unsigned short int c; + + if ( 0 == cur ) + return 1; + + c = UMM_PBLOCK(cur) & UMM_BLOCKNO_MASK; + while( c && (UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) ) { + /* + There can be up to 1 free block neighbor in either direction. + This loop should self limit to 2 passes, due to heap design. + i.e. Adjacent free space is always consolidated. + */ + if ( !(UMM_NBLOCK(c) & UMM_FREELIST_MASK) ) { + if ( !check_poison_block(&UMM_BLOCK(c)) ) + return 0; + + break; + } + + c = UMM_PBLOCK(c) & UMM_BLOCKNO_MASK; + } + + c = UMM_NBLOCK(cur) & UMM_BLOCKNO_MASK; + while( (UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) ) { + if ( !(UMM_NBLOCK(c) & UMM_FREELIST_MASK) ) { + if ( !check_poison_block(&UMM_BLOCK(c)) ) + return 0; + + break; + } + + c = UMM_NBLOCK(c) & UMM_BLOCKNO_MASK; + } + + return 1; +} +#endif + +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) + +/* ------------------------------------------------------------------------ */ + +static void *get_unpoisoned_check_neighbors( void *v_ptr, const char* file, int line ) { + unsigned char *ptr = (unsigned char *)v_ptr; + + if (ptr != NULL) { + + ptr -= (sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE); + +#if defined(UMM_POISON_CHECK_LITE) + UMM_CRITICAL_DECL(id_poison); + unsigned short int c; + bool poison = false; + + /* Figure out which block we're in. Note the use of truncated division... */ + c = (((char *)ptr)-(char *)(&(umm_heap[0])))/sizeof(umm_block); + + UMM_CRITICAL_ENTRY(id_poison); + poison = check_poison_block(&UMM_BLOCK(c)) && check_poison_neighbors(c); + UMM_CRITICAL_EXIT(id_poison); + + if (!poison) { + if (file) { + __panic_func(file, line, ""); + } else { + abort(); + } + } +#else + /* + * No need to check poison here. POISON_CHECK() has already done a + * full heap check. + */ + (void)file; + (void)line; +#endif + } + + return (void *)ptr; +} + +/* ------------------------------------------------------------------------ */ + +void *umm_poison_realloc_fl(void *ptr, size_t size, const char* file, int line) { + void *ret; + + ptr = get_unpoisoned_check_neighbors(ptr, file, line); + + size += poison_size(size); + ret = umm_realloc(ptr, size); + + ret = get_poisoned(ret, size); + + return ret; +} + +/* ------------------------------------------------------------------------ */ + +void umm_poison_free_fl(void *ptr, const char* file, int line) { + + ptr = get_unpoisoned_check_neighbors(ptr, file, line); + + umm_free(ptr); +} +#endif + +/* ------------------------------------------------------------------------ */ + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) || defined(UMM_INFO) +size_t umm_block_size( void ) { + return sizeof(umm_block); +} +#endif + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) +UMM_STATISTICS ummStats; + +// Keep complete call path in IRAM +size_t umm_free_heap_size_lw( void ) { + return (size_t)ummStats.free_blocks * sizeof(umm_block); +} +#endif + +/* + I assume xPortGetFreeHeapSize needs to be in IRAM. Since + system_get_free_heap_size is in IRAM. Which would mean, umm_free_heap_size() + in flash, was not a safe alternative for returning the same information. +*/ +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) +size_t xPortGetFreeHeapSize(void) __attribute__ ((alias("umm_free_heap_size_lw"))); +#elif defined(UMM_INFO) +#warning "No ISR safe function available to implement xPortGetFreeHeapSize()" +size_t xPortGetFreeHeapSize(void) __attribute__ ((alias("umm_free_heap_size"))); +#endif + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) +void print_stats(int force) { + DBGLOG_FORCE( force, "umm heap statistics:\n"); + DBGLOG_FORCE( force, " Free Space %5u\n", ummStats.free_blocks * sizeof(umm_block)); + DBGLOG_FORCE( force, " OOM Count %5u\n", ummStats.oom_count); +#if defined(UMM_STATS_FULL) + DBGLOG_FORCE( force, " Low Watermark %5u\n", ummStats.free_blocks_min * sizeof(umm_block)); + DBGLOG_FORCE( force, " Low Watermark ISR %5u\n", ummStats.free_blocks_isr_min * sizeof(umm_block)); + DBGLOG_FORCE( force, " MAX Alloc Request %5u\n", ummStats.alloc_max_size); +#endif + DBGLOG_FORCE( force, " Size of umm_block %5u\n", sizeof(umm_block)); + DBGLOG_FORCE( force, "+--------------------------------------------------------------+\n" ); +} +#endif + + + +int ICACHE_FLASH_ATTR umm_info_safe_printf_P(const char *fmt, ...) { + /* + To use ets_strlen() and ets_strcpy() safely with PROGMEM, flash storage, + the PROGMEM address must be word (4 bytes) aligned. The destination + address for ets_memcpy must also be word-aligned. + */ + char ram_buf[ets_strlen(fmt)] __attribute__ ((aligned(4))); + ets_strcpy(ram_buf, fmt); + va_list argPtr; + va_start(argPtr, fmt); + int result = ets_vprintf(ets_uart_putc1, ram_buf, argPtr); + va_end(argPtr); + return result; +} + +#endif // BUILD_UMM_MALLOC_C + + diff --git a/cores/esp8266/umm_malloc/umm_local.h b/cores/esp8266/umm_malloc/umm_local.h new file mode 100644 index 000000000..c2f05a57d --- /dev/null +++ b/cores/esp8266/umm_malloc/umm_local.h @@ -0,0 +1,54 @@ +#ifndef _UMM_LOCAL_H +#define _UMM_LOCAL_H +/* + * A home for local items exclusive to umm_malloc.c and not to be shared in + * umm_malloc_cfg.h. And, not for upstream version. + * Also used to redefine defines made in upstream files we donet want to edit. + * + */ + +#undef memcpy +#undef memmove +#undef memset +#define memcpy ets_memcpy +#define memmove ets_memmove +#define memset ets_memset + + +/* + * This redefines DBGLOG_FORCE defined in dbglog/dbglog.h + * Just for printing from umm_info() which is assumed to always be called from + * non-ISR. Thus SPI bus is available to handle cache-miss and reading a flash + * string while INTLEVEL is non-zero. + */ +#undef DBGLOG_FORCE +#define DBGLOG_FORCE(force, format, ...) {if(force) {UMM_INFO_PRINTF(format, ## __VA_ARGS__);}} +// #define DBGLOG_FORCE(force, format, ...) {if(force) {::printf(PSTR(format), ## __VA_ARGS__);}} + + +#if defined(DEBUG_ESP_OOM) || defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) || defined(UMM_INTEGRITY_CHECK) +#else + +#define umm_malloc(s) malloc(s) +#define umm_calloc(n,s) calloc(n,s) +#define umm_realloc(p,s) realloc(p,s) +#define umm_free(p) free(p) +#endif + + +#if defined(UMM_POISON_CHECK_LITE) +static int check_poison_neighbors( unsigned short cur ); +#endif + + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) +void ICACHE_FLASH_ATTR print_stats(int force); +#endif + + + +int ICACHE_FLASH_ATTR umm_info_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2))); +#define UMM_INFO_PRINTF(fmt, ...) umm_info_safe_printf_P(PSTR(fmt), ##__VA_ARGS__) + + +#endif diff --git a/cores/esp8266/umm_malloc/umm_malloc.cpp b/cores/esp8266/umm_malloc/umm_malloc.cpp index 13930a828..5feaa2ede 100644 --- a/cores/esp8266/umm_malloc/umm_malloc.cpp +++ b/cores/esp8266/umm_malloc/umm_malloc.cpp @@ -1,7 +1,8 @@ /* ---------------------------------------------------------------------------- * umm_malloc.c - a memory allocator for embedded systems (microcontrollers) * - * See copyright notice in LICENSE.TXT + * See LICENSE for copyright notice + * See README.md for acknowledgements and description of internals * ---------------------------------------------------------------------------- * * R.Hempel 2007-09-22 - Original @@ -18,637 +19,49 @@ * not worth the grief. * D.Frank 2014-04-02 - Fixed heap configuration when UMM_TEST_MAIN is NOT set, * added user-dependent configuration file umm_malloc_cfg.h - * ---------------------------------------------------------------------------- - * - * Note: when upgrading this file with upstream code, replace all %i with %d in - * printf format strings. ets_printf doesn't handle %i. - * - * ---------------------------------------------------------------------------- - * - * This is a memory management library specifically designed to work with the - * ARM7 embedded processor, but it should work on many other 32 bit processors, - * as well as 16 and 8 bit devices. - * - * ACKNOWLEDGEMENTS - * - * Joerg Wunsch and the avr-libc provided the first malloc() implementation - * that I examined in detail. - * - * http: *www.nongnu.org/avr-libc - * - * Doug Lea's paper on malloc() was another excellent reference and provides - * a lot of detail on advanced memory management techniques such as binning. - * - * http: *g.oswego.edu/dl/html/malloc.html - * - * Bill Dittman provided excellent suggestions, including macros to support - * using these functions in critical sections, and for optimizing realloc() - * further by checking to see if the previous block was free and could be - * used for the new block size. This can help to reduce heap fragmentation - * significantly. - * - * Yaniv Ankin suggested that a way to dump the current heap condition - * might be useful. I combined this with an idea from plarroy to also - * allow checking a free pointer to make sure it's valid. - * - * ---------------------------------------------------------------------------- - * - * The memory manager assumes the following things: - * - * 1. The standard POSIX compliant malloc/realloc/free semantics are used - * 2. All memory used by the manager is allocated at link time, it is aligned - * on a 32 bit boundary, it is contiguous, and its extent (start and end - * address) is filled in by the linker. - * 3. All memory used by the manager is initialized to 0 as part of the - * runtime startup routine. No other initialization is required. - * - * The fastest linked list implementations use doubly linked lists so that - * its possible to insert and delete blocks in constant time. This memory - * manager keeps track of both free and used blocks in a doubly linked list. - * - * Most memory managers use some kind of list structure made up of pointers - * to keep track of used - and sometimes free - blocks of memory. In an - * embedded system, this can get pretty expensive as each pointer can use - * up to 32 bits. - * - * In most embedded systems there is no need for managing large blocks - * of memory dynamically, so a full 32 bit pointer based data structure - * for the free and used block lists is wasteful. A block of memory on - * the free list would use 16 bytes just for the pointers! - * - * This memory management library sees the malloc heap as an array of blocks, - * and uses block numbers to keep track of locations. The block numbers are - * 15 bits - which allows for up to 32767 blocks of memory. The high order - * bit marks a block as being either free or in use, which will be explained - * later. - * - * The result is that a block of memory on the free list uses just 8 bytes - * instead of 16. - * - * In fact, we go even one step futher when we realize that the free block - * index values are available to store data when the block is allocated. - * - * The overhead of an allocated block is therefore just 4 bytes. - * - * Each memory block holds 8 bytes, and there are up to 32767 blocks - * available, for about 256K of heap space. If that's not enough, you - * can always add more data bytes to the body of the memory block - * at the expense of free block size overhead. - * - * There are a lot of little features and optimizations in this memory - * management system that makes it especially suited to small embedded, but - * the best way to appreciate them is to review the data structures and - * algorithms used, so let's get started. - * - * ---------------------------------------------------------------------------- - * - * We have a general notation for a block that we'll use to describe the - * different scenarios that our memory allocation algorithm must deal with: - * - * +----+----+----+----+ - * c |* n | p | nf | pf | - * +----+----+----+----+ - * - * Where - c is the index of this block - * * is the indicator for a free block - * n is the index of the next block in the heap - * p is the index of the previous block in the heap - * nf is the index of the next block in the free list - * pf is the index of the previous block in the free list - * - * The fact that we have forward and backward links in the block descriptors - * means that malloc() and free() operations can be very fast. It's easy - * to either allocate the whole free item to a new block or to allocate part - * of the free item and leave the rest on the free list without traversing - * the list from front to back first. - * - * The entire block of memory used by the heap is assumed to be initialized - * to 0. The very first block in the heap is special - it't the head of the - * free block list. It is never assimilated with a free block (more on this - * later). - * - * Once a block has been allocated to the application, it looks like this: - * - * +----+----+----+----+ - * c | n | p | ... | - * +----+----+----+----+ - * - * Where - c is the index of this block - * n is the index of the next block in the heap - * p is the index of the previous block in the heap - * - * Note that the free list information is gone, because it's now being used to - * store actual data for the application. It would have been nice to store - * the next and previous free list indexes as well, but that would be a waste - * of space. If we had even 500 items in use, that would be 2,000 bytes for - * free list information. We simply can't afford to waste that much. - * - * The address of the ... area is what is returned to the application - * for data storage. - * - * The following sections describe the scenarios encountered during the - * operation of the library. There are two additional notation conventions: - * - * ?? inside a pointer block means that the data is irrelevant. We don't care - * about it because we don't read or modify it in the scenario being - * described. - * - * ... between memory blocks indicates zero or more additional blocks are - * allocated for use by the upper block. - * - * And while we're talking about "upper" and "lower" blocks, we should make - * a comment about adresses. In the diagrams, a block higher up in the - * picture is at a lower address. And the blocks grow downwards their - * block index increases as does their physical address. - * - * Finally, there's one very important characteristic of the individual - * blocks that make up the heap - there can never be two consecutive free - * memory blocks, but there can be consecutive used memory blocks. - * - * The reason is that we always want to have a short free list of the - * largest possible block sizes. By always assimilating a newly freed block - * with adjacent free blocks, we maximize the size of each free memory area. - * - *--------------------------------------------------------------------------- - * - * Operation of malloc right after system startup - * - * As part of the system startup code, all of the heap has been cleared. - * - * During the very first malloc operation, we start traversing the free list - * starting at index 0. The index of the next free block is 0, which means - * we're at the end of the list! - * - * At this point, the malloc has a special test that checks if the current - * block index is 0, which it is. This special case initializes the free - * list to point at block index 1. - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ - * 1 | 0 | 0 | 0 | 0 | - * +----+----+----+----+ - * - * The heap is now ready to complete the first malloc operation. - * - * ---------------------------------------------------------------------------- - * - * Operation of malloc when we have reached the end of the free list and - * there is no block large enough to accommodate the request. - * - * This happens at the very first malloc operation, or any time the free - * list is traversed and no free block large enough for the request is - * found. - * - * The current block pointer will be at the end of the free list, and we - * know we're at the end of the list because the nf index is 0, like this: - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * pf |*?? | ?? | cf | ?? | pf |*?? | ?? | lf | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * p | cf | ?? | ... | p | cf | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * cf | 0 | p | 0 | pf | c | lf | p | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ - * lf | 0 | cf | 0 | pf | - * +----+----+----+----+ - * - * As we walk the free list looking for a block of size b or larger, we get - * to cf, which is the last item in the free list. We know this because the - * next index is 0. - * - * So we're going to turn cf into the new block of memory, and then create - * a new block that represents the last free entry (lf) and adjust the prev - * index of lf to point at the block we just created. We also need to adjust - * the next index of the new block (c) to point to the last free block. - * - * Note that the next free index of the pf block must point to the new lf - * because cf is no longer a free block! - * - * ---------------------------------------------------------------------------- - * - * Operation of malloc when we have found a block (cf) that will fit the - * current request of b units exactly. - * - * This one is pretty easy, just clear the free list bit in the current - * block and unhook it from the free list. - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * pf |*?? | ?? | cf | ?? | pf |*?? | ?? | nf | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * p | cf | ?? | ... | p | cf | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ Clear the free - * cf |* n | p | nf | pf | cf | n | p | .. | list bit here - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | cf | ... | n | ?? | cf | ... | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | cf | nf | ?? | ?? | ?? | pf | - * +----+----+----+----+ +----+----+----+----+ - * - * Unhooking from the free list is accomplished by adjusting the next and - * prev free list index values in the pf and nf blocks. - * - * ---------------------------------------------------------------------------- - * - * Operation of malloc when we have found a block that will fit the current - * request of b units with some left over. - * - * We'll allocate the new block at the END of the current free block so we - * don't have to change ANY free list pointers. - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * pf |*?? | ?? | cf | ?? | pf |*?? | ?? | cf | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * p | cf | ?? | ... | p | cf | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * cf |* n | p | nf | pf | cf |* c | p | nf | pf | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ This is the new - * c | n | cf | .. | block at cf+b - * +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | cf | ... | n | ?? | c | ... | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | cf | nf | ?? | ?? | ?? | pf | - * +----+----+----+----+ +----+----+----+----+ - * - * This one is prety easy too, except we don't need to mess with the - * free list indexes at all becasue we'll allocate the new block at the - * end of the current free block. We do, however have to adjust the - * indexes in cf, c, and n. - * - * ---------------------------------------------------------------------------- - * - * That covers the initialization and all possible malloc scenarios, so now - * we need to cover the free operation possibilities... - * - * The operation of free depends on the position of the current block being - * freed relative to free list items immediately above or below it. The code - * works like this: - * - * if next block is free - * assimilate with next block already on free list - * if prev block is free - * assimilate with prev block already on free list - * else - * put current block at head of free list - * - * ---------------------------------------------------------------------------- - * - * Step 1 of the free operation checks if the next block is free, and if it - * is then insert this block into the free list and assimilate the next block - * with this one. - * - * Note that c is the block we are freeing up, cf is the free block that - * follows it. - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * pf |*?? | ?? | cf | ?? | pf |*?? | ?? | nf | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * p | c | ?? | ... | p | c | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ This block is - * c | cf | p | ... | c | nn | p | ... | disconnected - * +----+----+----+----+ +----+----+----+----+ from free list, - * +----+----+----+----+ assimilated with - * cf |*nn | c | nf | pf | the next, and - * +----+----+----+----+ ready for step 2 - * +----+----+----+----+ +----+----+----+----+ - * nn | ?? | cf | ?? | ?? | nn | ?? | c | ... | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | cf | nf |*?? | ?? | ?? | pf | - * +----+----+----+----+ +----+----+----+----+ - * - * Take special note that the newly assimilated block (c) is completely - * disconnected from the free list, and it does not have its free list - * bit set. This is important as we move on to step 2 of the procedure... - * - * ---------------------------------------------------------------------------- - * - * Step 2 of the free operation checks if the prev block is free, and if it - * is then assimilate it with this block. - * - * Note that c is the block we are freeing up, pf is the free block that - * precedes it. - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ This block has - * pf |* c | ?? | nf | ?? | pf |* n | ?? | nf | ?? | assimilated the - * +----+----+----+----+ +----+----+----+----+ current block - * +----+----+----+----+ - * c | n | pf | ... | - * +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | c | ... | n | ?? | pf | ?? | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | pf | nf |*?? | ?? | ?? | pf | - * +----+----+----+----+ +----+----+----+----+ - * - * Nothing magic here, except that when we're done, the current block (c) - * is gone since it's been absorbed into the previous free block. Note that - * the previous step guarantees that the next block (n) is not free. - * - * ---------------------------------------------------------------------------- - * - * Step 3 of the free operation only runs if the previous block is not free. - * it just inserts the current block to the head of the free list. - * - * Remember, 0 is always the first block in the memory heap, and it's always - * head of the free list! - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * 0 | ?? | ?? | nf | 0 | 0 | ?? | ?? | c | 0 | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * p | c | ?? | ... | p | c | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * c | n | p | .. | c |* n | p | nf | 0 | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | c | ... | n | ?? | c | ... | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | 0 | nf |*?? | ?? | ?? | c | - * +----+----+----+----+ +----+----+----+----+ - * - * Again, nothing spectacular here, we're simply adjusting a few pointers - * to make the most recently freed block the first item in the free list. - * - * That's because finding the previous free block would mean a reverse - * traversal of blocks until we found a free one, and it's just easier to - * put it at the head of the list. No traversal is needed. - * - * ---------------------------------------------------------------------------- - * - * Finally, we can cover realloc, which has the following basic operation. - * - * The first thing we do is assimilate up with the next free block of - * memory if possible. This step might help if we're resizing to a bigger - * block of memory. It also helps if we're downsizing and creating a new - * free block with the leftover memory. - * - * First we check to see if the next block is free, and we assimilate it - * to this block if it is. If the previous block is also free, and if - * combining it with the current block would satisfy the request, then we - * assimilate with that block and move the current data down to the new - * location. - * - * Assimilating with the previous free block and moving the data works - * like this: - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * pf |*?? | ?? | cf | ?? | pf |*?? | ?? | nf | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * cf |* c | ?? | nf | pf | c | n | ?? | ... | The data gets - * +----+----+----+----+ +----+----+----+----+ moved from c to - * +----+----+----+----+ the new data area - * c | n | cf | ... | in cf, then c is - * +----+----+----+----+ adjusted to cf - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | c | ... | n | ?? | c | ?? | ?? | - * +----+----+----+----+ +----+----+----+----+ - * ... ... - * +----+----+----+----+ +----+----+----+----+ - * nf |*?? | ?? | ?? | cf | nf |*?? | ?? | ?? | pf | - * +----+----+----+----+ +----+----+----+----+ - * - * - * Once we're done that, there are three scenarios to consider: - * - * 1. The current block size is exactly the right size, so no more work is - * needed. - * - * 2. The current block is bigger than the new required size, so carve off - * the excess and add it to the free list. - * - * 3. The current block is still smaller than the required size, so malloc - * a new block of the correct size and copy the current data into the new - * block before freeing the current block. - * - * The only one of these scenarios that involves an operation that has not - * yet been described is the second one, and it's shown below: - * - * BEFORE AFTER - * - * +----+----+----+----+ +----+----+----+----+ - * p | c | ?? | ... | p | c | ?? | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ +----+----+----+----+ - * c | n | p | ... | c | s | p | ... | - * +----+----+----+----+ +----+----+----+----+ - * +----+----+----+----+ This is the - * s | n | c | .. | new block at - * +----+----+----+----+ c+blocks - * +----+----+----+----+ +----+----+----+----+ - * n | ?? | c | ... | n | ?? | s | ... | - * +----+----+----+----+ +----+----+----+----+ - * - * Then we call free() with the adress of the data portion of the new - * block (s) which adds it to the free list. - * + * R.Hempel 2016-12-04 - Add support for Unity test framework + * - Reorganize source files to avoid redundant content + * - Move integrity and poison checking to separate file + * R.Hempel 2017-12-29 - Fix bug in realloc when requesting a new block that + * results in OOM error - see Issue 11 + * R.Hempel 2019-09-07 - Separate the malloc() and free() functionality into + * wrappers that use critical section protection macros + * and static core functions that assume they are + * running in a protected con text. Thanks @devyte * ---------------------------------------------------------------------------- */ +/* + * This include is nothing but comments about thoughts and observations made + * while updating the Arduino ESP8266 Core, with the new upstream umm_malloc. + * It is added here as an include so that it does not get lost and to avoid + * cluttering up the code with a huge block comment. + */ + #include "Notes.h" +/* + * Added for using with Arduino ESP8266 and handling renameing to umm_malloc.cpp + */ + +#define BUILD_UMM_MALLOC_C + +extern "C" { + #include #include -#include #include "umm_malloc.h" #include "umm_malloc_cfg.h" /* user-dependent */ -extern "C" { +/* Use the default DBGLOG_LEVEL and DBGLOG_FUNCTION */ -#undef memcpy -#undef memmove -#undef memset -#define memcpy ets_memcpy -#define memmove ets_memmove -#define memset ets_memset - -// From UMM, the last caller of a malloc/realloc/calloc which failed: -extern void *umm_last_fail_alloc_addr; -extern int umm_last_fail_alloc_size; - -#ifndef UMM_FIRST_FIT -# ifndef UMM_BEST_FIT -# define UMM_BEST_FIT -# endif +#ifndef DBGLOG_LEVEL +#define DBGLOG_LEVEL 0 #endif -#ifndef DBG_LOG_LEVEL -# undef DBG_LOG_LEVEL -# define DBG_LOG_LEVEL 0 -#else -# undef DBG_LOG_LEVEL -# define DBG_LOG_LEVEL DBG_LOG_LEVEL -#endif +#include "dbglog/dbglog.h" -/* -Changes for July 2019: - - Correct critical section with interrupt level preserving and nest support - alternative. Replace ets_intr_lock()/ets_intr_unlock() with uint32_t - oldValue=xt_rsil(3)/xt_wrs(oldValue). Added UMM_CRITICAL_DECL macro to define - storage for current state. Expanded UMM_CRITICAL_... to use unique - identifiers. This helpt facilitate gather function specific timing - information. - - Replace printf with something that is ROM or IRAM based so that a printf - that occurs during an ISR malloc/new does not cause a crash. To avoid any - reentry issue it should also avoid doing malloc lib calls. - - Refactor realloc to avoid memcpy/memmove while in critical section. This is - only effective when realloc is called with interrupts enabled. The copy - process alone can take over 10us (when copying more than ~498 bytes with a - 80MHz CPU clock). It would be good practice for an ISR to avoid realloc. - Note, while doing this might initially sound scary, this appears to be very - stable. It ran on my troublesome sketch for over 3 weeks until I got back from - vacation and flashed an update. Troublesome sketch - runs ESPAsyncTCP, with - modified fauxmo emulation for 10 devices. It receives lost of Network traffic - related to uPnP scans, which includes lots of TCP connects disconnects RSTs - related to uPnP discovery. - - Locking is no longer nested in realloc, due to refactoring for reduced IRQ - off time. - - I have clocked umm_info critical lock time taking as much as 180us. A common - use for the umm_info call is to get the free heap result. It is common - to try and closely monitor free heap as a method to detect memory leaks. - This may result in frequent calls to umm_info. There has not been a clear - test case that shows an issue yet; however, I and others think they are or - have had crashes related to this. - - I have added code that updates a current free heap value from _umm_malloc, - _umm_realloc, and _umm_free. Removing the need to do a long interrupts - disabled calculation via umm_info. - - Build optional, min/max time measurements for locks held while in info, - malloc, realloc, and free. Also, maintains a count of how many times each is - called with INTLEVEL set. - - */ - -/* -- dbglog {{{ */ - -/* ---------------------------------------------------------------------------- - * A set of macros that cleans up code that needs to produce debug - * or log information. - * - * See copyright notice in LICENSE.TXT - * ---------------------------------------------------------------------------- - * - * There are macros to handle the following decreasing levels of detail: - * - * 6 = TRACE - * 5 = DEBUG - * 4 = CRITICAL - * 3 = ERROR - * 2 = WARNING - * 1 = INFO - * 0 = FORCE - The printf is always compiled in and is called only when - * the first parameter to the macro is non-0 - * - * ---------------------------------------------------------------------------- - * - * The following #define should be set up before this file is included so - * that we can be sure that the correct macros are defined. - * - * #define DBG_LOG_LEVEL x - * ---------------------------------------------------------------------------- - */ - -#undef DBG_LOG_TRACE -#undef DBG_LOG_DEBUG -#undef DBG_LOG_CRITICAL -#undef DBG_LOG_ERROR -#undef DBG_LOG_WARNING -#undef DBG_LOG_INFO -#undef DBG_LOG_FORCE - -/* ------------------------------------------------------------------------- */ - -#if DBG_LOG_LEVEL >= 6 -# define DBG_LOG_TRACE( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_TRACE( format, ... ) -#endif - -#if DBG_LOG_LEVEL >= 5 -# define DBG_LOG_DEBUG( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_DEBUG( format, ... ) -#endif - -#if DBG_LOG_LEVEL >= 4 -# define DBG_LOG_CRITICAL( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_CRITICAL( format, ... ) -#endif - -#if DBG_LOG_LEVEL >= 3 -# define DBG_LOG_ERROR( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_ERROR( format, ... ) -#endif - -#if DBG_LOG_LEVEL >= 2 -# define DBG_LOG_WARNING( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_WARNING( format, ... ) -#endif - -#if DBG_LOG_LEVEL >= 1 -# define DBG_LOG_INFO( format, ... ) DBGLOG_FUNCTION( format, ## __VA_ARGS__ ) -#else -# define DBG_LOG_INFO( format, ... ) -#endif - -#define DBG_LOG_FORCE( force, format, ... ) {if(force) {DBGLOG_FUNCTION( format, ## __VA_ARGS__ );}} - -/* }}} */ +#include "umm_local.h" // target-dependent supplemental /* ------------------------------------------------------------------------- */ @@ -673,13 +86,6 @@ UMM_H_ATTPACKPRE typedef struct umm_block_t { /* ------------------------------------------------------------------------- */ -#ifdef UMM_REDEFINE_MEM_FUNCTIONS -# define umm_free free -# define umm_malloc malloc -# define umm_calloc calloc -# define umm_realloc realloc -#endif - umm_block *umm_heap = NULL; unsigned short int umm_numblocks = 0; @@ -695,489 +101,18 @@ unsigned short int umm_numblocks = 0; #define UMM_PFREE(b) (UMM_BLOCK(b).body.free.prev) #define UMM_DATA(b) (UMM_BLOCK(b).body.data) -/* - * This does not look safe, no access locks. It currently is not being - * built, so not an immediate issue. - 06/10/19 - */ -/* integrity check (UMM_INTEGRITY_CHECK) {{{ */ -#if defined(UMM_INTEGRITY_CHECK) -/* - * Perform integrity check of the whole heap data. Returns 1 in case of - * success, 0 otherwise. - * - * First of all, iterate through all free blocks, and check that all backlinks - * match (i.e. if block X has next free block Y, then the block Y should have - * previous free block set to X). - * - * Additionally, we check that each free block is correctly marked with - * `UMM_FREELIST_MASK` on the `next` pointer: during iteration through free - * list, we mark each free block by the same flag `UMM_FREELIST_MASK`, but - * on `prev` pointer. We'll check and unmark it later. - * - * Then, we iterate through all blocks in the heap, and similarly check that - * all backlinks match (i.e. if block X has next block Y, then the block Y - * should have previous block set to X). - * - * But before checking each backlink, we check that the `next` and `prev` - * pointers are both marked with `UMM_FREELIST_MASK`, or both unmarked. - * This way, we ensure that the free flag is in sync with the free pointers - * chain. - */ -static int integrity_check(void) { - int ok = 1; - unsigned short int prev; - unsigned short int cur; - - if (umm_heap == NULL) { - umm_init(); - } - - /* Iterate through all free blocks */ - prev = 0; - while(1) { - cur = UMM_NFREE(prev); - - /* Check that next free block number is valid */ - if (cur >= UMM_NUMBLOCKS) { - DBGLOG_FUNCTION("heap integrity broken: too large next free num: %d " - "(in block %d, addr 0x%lx)\n", cur, prev, - (unsigned long)&UMM_NBLOCK(prev)); - ok = 0; - goto clean; - } - if (cur == 0) { - /* No more free blocks */ - break; - } - - /* Check if prev free block number matches */ - if (UMM_PFREE(cur) != prev) { - DBGLOG_FUNCTION("heap integrity broken: free links don't match: " - "%d -> %d, but %d -> %d\n", - prev, cur, cur, UMM_PFREE(cur)); - ok = 0; - goto clean; - } - - UMM_PBLOCK(cur) |= UMM_FREELIST_MASK; - - prev = cur; - } - - /* Iterate through all blocks */ - prev = 0; - while(1) { - cur = UMM_NBLOCK(prev) & UMM_BLOCKNO_MASK; - - /* Check that next block number is valid */ - if (cur >= UMM_NUMBLOCKS) { - DBGLOG_FUNCTION("heap integrity broken: too large next block num: %d " - "(in block %d, addr 0x%lx)\n", cur, prev, - (unsigned long)&UMM_NBLOCK(prev)); - ok = 0; - goto clean; - } - if (cur == 0) { - /* No more blocks */ - break; - } - - /* make sure the free mark is appropriate, and unmark it */ - if ((UMM_NBLOCK(cur) & UMM_FREELIST_MASK) - != (UMM_PBLOCK(cur) & UMM_FREELIST_MASK)) - { - DBGLOG_FUNCTION("heap integrity broken: mask wrong at addr 0x%lx: n=0x%x, p=0x%x\n", - (unsigned long)&UMM_NBLOCK(cur), - (UMM_NBLOCK(cur) & UMM_FREELIST_MASK), - (UMM_PBLOCK(cur) & UMM_FREELIST_MASK) - ); - ok = 0; - goto clean; - } - - /* unmark */ - UMM_PBLOCK(cur) &= UMM_BLOCKNO_MASK; - - /* Check if prev block number matches */ - if (UMM_PBLOCK(cur) != prev) { - DBGLOG_FUNCTION("heap integrity broken: block links don't match: " - "%d -> %d, but %d -> %d\n", - prev, cur, cur, UMM_PBLOCK(cur)); - ok = 0; - goto clean; - } - - prev = cur; - } - -clean: - if (!ok){ - UMM_HEAP_CORRUPTION_CB(); - } - return ok; -} - -#define INTEGRITY_CHECK() integrity_check() -#else -/* - * Integrity check is disabled, so just define stub macro - */ -#define INTEGRITY_CHECK() 1 -#endif -/* }}} */ - -/* poisoning (UMM_POISON) {{{ */ -#if defined(UMM_POISON) -#define POISON_BYTE (0xa5) - -/* - * Yields a size of the poison for the block of size `s`. - * If `s` is 0, returns 0. - */ -#define POISON_SIZE(s) ( \ - (s) ? \ - (UMM_POISON_SIZE_BEFORE + UMM_POISON_SIZE_AFTER + \ - sizeof(UMM_POISONED_BLOCK_LEN_TYPE) \ - ) : 0 \ - ) - -/* - * Print memory contents starting from given `ptr` - */ -static void dump_mem ( const unsigned char *ptr, size_t len ) { - while (len--) { - DBGLOG_FUNCTION(" 0x%.2x", (unsigned int)(*ptr++)); - } -} - -/* - * Put poison data at given `ptr` and `poison_size` - */ -static void put_poison( unsigned char *ptr, size_t poison_size ) { - memset(ptr, POISON_BYTE, poison_size); -} - -/* - * Check poison data at given `ptr` and `poison_size`. `where` is a pointer to - * a string, either "before" or "after", meaning, before or after the block. - * - * If poison is there, returns 1. - * Otherwise, prints the appropriate message, and returns 0. - */ -static int check_poison( const unsigned char *ptr, size_t poison_size, - const char *where) { - size_t i; - int ok = 1; - - for (i = 0; i < poison_size; i++) { - if (ptr[i] != POISON_BYTE) { - ok = 0; - break; - } - } - - if (!ok) { - DBGLOG_FUNCTION("there is no poison %s the block. " - "Expected poison address: 0x%lx, actual data:", - where, (unsigned long)ptr); - dump_mem(ptr, poison_size); - DBGLOG_FUNCTION("\n"); - } - - return ok; -} - -/* - * Check if a block is properly poisoned. Must be called only for non-free - * blocks. - */ -static int check_poison_block( umm_block *pblock ) { - int ok = 1; - - if (pblock->header.used.next & UMM_FREELIST_MASK) { - DBGLOG_FUNCTION("check_poison_block is called for free block 0x%lx\n", - (unsigned long)pblock); - } else { - /* the block is used; let's check poison */ - unsigned char *pc = (unsigned char *)pblock->body.data; - unsigned char *pc_cur; - - pc_cur = pc + sizeof(UMM_POISONED_BLOCK_LEN_TYPE); - if (!check_poison(pc_cur, UMM_POISON_SIZE_BEFORE, "before")) { - DBGLOG_FUNCTION("block start: %08x\n", pc + sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE); - UMM_HEAP_CORRUPTION_CB(); - ok = 0; - goto clean; - } - - pc_cur = pc + *((UMM_POISONED_BLOCK_LEN_TYPE *)pc) - UMM_POISON_SIZE_AFTER; - if (!check_poison(pc_cur, UMM_POISON_SIZE_AFTER, "after")) { - DBGLOG_FUNCTION("block start: %08x\n", pc + sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE); - UMM_HEAP_CORRUPTION_CB(); - ok = 0; - goto clean; - } - } - -clean: - return ok; -} - -/* - * Iterates through all blocks in the heap, and checks poison for all used - * blocks. - */ -static int check_poison_all_blocks(void) { - int ok = 1; - unsigned short int blockNo = 0; - - if (umm_heap == NULL) { - umm_init(); - } - - /* Now iterate through the blocks list */ - blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; - - while( UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK ) { - if ( !(UMM_NBLOCK(blockNo) & UMM_FREELIST_MASK) ) { - /* This is a used block (not free), so, check its poison */ - ok = check_poison_block(&UMM_BLOCK(blockNo)); - if (!ok){ - break; - } - } - - blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; - } - - return ok; -} - -/* - * Takes a pointer returned by actual allocator function (`_umm_malloc` or - * `_umm_realloc`), puts appropriate poison, and returns adjusted pointer that - * should be returned to the user. - * - * `size_w_poison` is a size of the whole block, including a poison. - */ -static void *get_poisoned( void *vptr, size_t size_w_poison ) { - unsigned char *ptr = (unsigned char *)vptr; - if (size_w_poison != 0 && ptr != NULL) { - - /* Put exact length of the user's chunk of memory */ - memcpy(ptr, &size_w_poison, sizeof(UMM_POISONED_BLOCK_LEN_TYPE)); - - /* Poison beginning and the end of the allocated chunk */ - put_poison(ptr + sizeof(UMM_POISONED_BLOCK_LEN_TYPE), - UMM_POISON_SIZE_BEFORE); - put_poison(ptr + size_w_poison - UMM_POISON_SIZE_AFTER, - UMM_POISON_SIZE_AFTER); - - /* Return pointer at the first non-poisoned byte */ - return ptr + sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE; - } else { - return ptr; - } -} - -/* - * Takes "poisoned" pointer (i.e. pointer returned from `get_poisoned()`), - * and checks that the poison of this particular block is still there. - * - * Returns unpoisoned pointer, i.e. actual pointer to the allocated memory. - */ -static void *get_unpoisoned( void *vptr ) { - unsigned char *ptr = (unsigned char *)vptr; - if (ptr != NULL) { - unsigned short int c; - - ptr -= (sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE); - - /* Figure out which block we're in. Note the use of truncated division... */ - c = (((char *)ptr)-(char *)(&(umm_heap[0])))/sizeof(umm_block); - - check_poison_block(&UMM_BLOCK(c)); - } - - return ptr; -} - -#define CHECK_POISON_ALL_BLOCKS() check_poison_all_blocks() -#define GET_POISONED(ptr, size) get_poisoned(ptr, size) -#define GET_UNPOISONED(ptr) get_unpoisoned(ptr) - -#else -/* - * Integrity check is disabled, so just define stub macros - */ -#define POISON_SIZE(s) 0 -#define CHECK_POISON_ALL_BLOCKS() 1 -#define GET_POISONED(ptr, size) (ptr) -#define GET_UNPOISONED(ptr) (ptr) -#endif -/* }}} */ - -/* ---------------------------------------------------------------------------- - * One of the coolest things about this little library is that it's VERY - * easy to get debug information about the memory heap by simply iterating - * through all of the memory blocks. - * - * As you go through all the blocks, you can check to see if it's a free - * block by looking at the high order bit of the next block index. You can - * also see how big the block is by subtracting the next block index from - * the current block number. - * - * The umm_info function does all of that and makes the results available - * in the ummHeapInfo structure. - * ---------------------------------------------------------------------------- +/* ------------------------------------------------------------------------- + * There are additional files that may be included here - normally it's + * not a good idea to include .c files but in this case it keeps the + * main umm_malloc file clear and prevents issues with exposing internal + * data structures to other programs. + * ------------------------------------------------------------------------- */ -UMM_HEAP_INFO ummHeapInfo; - -void ICACHE_FLASH_ATTR *umm_info( void *ptr, int force ) { - UMM_CRITICAL_DECL(id_info); - - unsigned short int blockNo = 0; - - if (umm_heap == NULL) { - umm_init(); - } - - /* Protect the critical section... */ - UMM_CRITICAL_ENTRY(id_info); - - /* - * Clear out all of the entries in the ummHeapInfo structure before doing - * any calculations.. - */ - memset( &ummHeapInfo, 0, sizeof( ummHeapInfo ) ); - - DBG_LOG_FORCE( force, "\n\nDumping the umm_heap...\n" ); - - DBG_LOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5d|NF %5d|PF %5d|\n", - (unsigned long)(&UMM_BLOCK(blockNo)), - blockNo, - UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, - UMM_PBLOCK(blockNo), - (UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK )-blockNo, - UMM_NFREE(blockNo), - UMM_PFREE(blockNo) ); - - /* - * Now loop through the block lists, and keep track of the number and size - * of used and free blocks. The terminating condition is an nb pointer with - * a value of zero... - */ - - blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; - - while( UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK ) { - size_t curBlocks = (UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK )-blockNo; - - ++ummHeapInfo.totalEntries; - ummHeapInfo.totalBlocks += curBlocks; - - /* Is this a free block? */ - - if( UMM_NBLOCK(blockNo) & UMM_FREELIST_MASK ) { - ++ummHeapInfo.freeEntries; - ummHeapInfo.freeBlocks += curBlocks; - ummHeapInfo.freeSize2 += (unsigned int)curBlocks - * (unsigned int)sizeof(umm_block) - * (unsigned int)curBlocks - * (unsigned int)sizeof(umm_block); - - if (ummHeapInfo.maxFreeContiguousBlocks < curBlocks) { - ummHeapInfo.maxFreeContiguousBlocks = curBlocks; - } - - DBG_LOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5u|NF %5d|PF %5d|\n", - (unsigned long)(&UMM_BLOCK(blockNo)), - blockNo, - UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, - UMM_PBLOCK(blockNo), - (unsigned int)curBlocks, - UMM_NFREE(blockNo), - UMM_PFREE(blockNo) ); - - /* Does this block address match the ptr we may be trying to free? */ - - if( ptr == &UMM_BLOCK(blockNo) ) { - - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_info); - - return( ptr ); - } - } else { - ++ummHeapInfo.usedEntries; - ummHeapInfo.usedBlocks += curBlocks; - - DBG_LOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5u|\n", - (unsigned long)(&UMM_BLOCK(blockNo)), - blockNo, - UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, - UMM_PBLOCK(blockNo), - (unsigned int)curBlocks ); - } - - blockNo = UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK; - } - - /* - * Update the accounting totals with information from the last block, the - * rest must be free! - */ - - { - size_t curBlocks = UMM_NUMBLOCKS-blockNo; - ummHeapInfo.freeBlocks += curBlocks; - ummHeapInfo.totalBlocks += curBlocks; - - if (ummHeapInfo.maxFreeContiguousBlocks < curBlocks) { - ummHeapInfo.maxFreeContiguousBlocks = curBlocks; - } - } - - DBG_LOG_FORCE( force, "|0x%08lx|B %5d|NB %5d|PB %5d|Z %5d|NF %5d|PF %5d|\n", - (unsigned long)(&UMM_BLOCK(blockNo)), - blockNo, - UMM_NBLOCK(blockNo) & UMM_BLOCKNO_MASK, - UMM_PBLOCK(blockNo), - UMM_NUMBLOCKS-blockNo, - UMM_NFREE(blockNo), - UMM_PFREE(blockNo) ); - - DBG_LOG_FORCE( force, "Total Entries %5d Used Entries %5d Free Entries %5d\n", - ummHeapInfo.totalEntries, - ummHeapInfo.usedEntries, - ummHeapInfo.freeEntries ); - - DBG_LOG_FORCE( force, "Total Blocks %5d Used Blocks %5d Free Blocks %5d\n", - ummHeapInfo.totalBlocks, - ummHeapInfo.usedBlocks, - ummHeapInfo.freeBlocks ); - - if (ummHeapInfo.freeBlocks == ummStats.free_blocks) { - DBG_LOG_FORCE( force, "\nheap info Free blocks and heap statistics Free blocks match.\n"); - } else { - DBG_LOG_FORCE( force, "\nheap info Free blocks %5d != heap statistics Free Blocks %5d\n\n", - ummHeapInfo.freeBlocks, - ummStats.free_blocks ); - } - - DBG_LOG_FORCE( force, "\numm heap statistics:\n"); - DBG_LOG_FORCE( force, " Free Space %5u\n", ummStats.free_blocks * sizeof(umm_block)); - DBG_LOG_FORCE( force, " Low Watermark %5u\n", ummStats.free_blocks_min * sizeof(umm_block)); - DBG_LOG_FORCE( force, " MAX Alloc Request %5u\n", ummStats.alloc_max_size); - DBG_LOG_FORCE( force, " OOM Count %5u\n", ummStats.oom_count); - DBG_LOG_FORCE( force, " Size of umm_block %5u\n", sizeof(umm_block)); - - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_info); - - return( NULL ); -} +#include "umm_integrity.c" +#include "umm_poison.c" +#include "umm_info.c" +#include "umm_local.c" // target-dependent supplemental features /* ------------------------------------------------------------------------ */ @@ -1206,26 +141,23 @@ static unsigned short int umm_blocks( size_t size ) { } /* ------------------------------------------------------------------------ */ - /* * Split the block `c` into two blocks: `c` and `c + blocks`. * - * - `cur_freemask` should be `0` if `c` used, or `UMM_FREELIST_MASK` - * otherwise. * - `new_freemask` should be `0` if `c + blocks` used, or `UMM_FREELIST_MASK` * otherwise. * * Note that free pointers are NOT modified by this function. */ -static void umm_make_new_block( unsigned short int c, +static void umm_split_block( unsigned short int c, unsigned short int blocks, - unsigned short int cur_freemask, unsigned short int new_freemask ) { + unsigned short int new_freemask ) { UMM_NBLOCK(c+blocks) = (UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) | new_freemask; UMM_PBLOCK(c+blocks) = c; UMM_PBLOCK(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) = (c+blocks); - UMM_NBLOCK(c) = (c+blocks) | cur_freemask; + UMM_NBLOCK(c) = (c+blocks); } /* ------------------------------------------------------------------------ */ @@ -1241,7 +173,10 @@ static void umm_disconnect_from_free_list( unsigned short int c ) { UMM_NBLOCK(c) &= (~UMM_FREELIST_MASK); } -/* ------------------------------------------------------------------------ */ +/* ------------------------------------------------------------------------ + * The umm_assimilate_up() function assumes that UMM_NBLOCK(c) does NOT + * have the UMM_FREELIST_MASK bit set! + */ static void umm_assimilate_up( unsigned short int c ) { @@ -1251,7 +186,7 @@ static void umm_assimilate_up( unsigned short int c ) { * the free list */ - DBG_LOG_DEBUG( "Assimilate up to next block, which is FREE\n" ); + DBGLOG_DEBUG( "Assimilate up to next block, which is FREE\n" ); /* Disconnect the next block from the FREE list */ @@ -1264,7 +199,10 @@ static void umm_assimilate_up( unsigned short int c ) { } } -/* ------------------------------------------------------------------------ */ +/* ------------------------------------------------------------------------ + * The umm_assimilate_down() function assumes that UMM_NBLOCK(c) does NOT + * have the UMM_FREELIST_MASK bit set! + */ static unsigned short int umm_assimilate_down( unsigned short int c, unsigned short int freemask ) { @@ -1275,13 +213,12 @@ static unsigned short int umm_assimilate_down( unsigned short int c, unsigned sh } /* ------------------------------------------------------------------------- */ -/* This function called only one time during OS startup after flash is */ -/* enabled. No need to keep it in IRAM. */ -void ICACHE_FLASH_ATTR umm_init( void ) { + +void umm_init( void ) { /* init heap pointer and size, and memset it to 0 */ - umm_heap = (umm_block *)UMM_MALLOC_CFG__HEAP_ADDR; - umm_numblocks = (UMM_MALLOC_CFG__HEAP_SIZE / sizeof(umm_block)); - memset(umm_heap, 0x00, UMM_MALLOC_CFG__HEAP_SIZE); + umm_heap = (umm_block *)UMM_MALLOC_CFG_HEAP_ADDR; + umm_numblocks = (UMM_MALLOC_CFG_HEAP_SIZE / sizeof(umm_block)); + memset(umm_heap, 0x00, UMM_MALLOC_CFG_HEAP_SIZE); /* setup initial blank heap structure */ { @@ -1292,12 +229,19 @@ void ICACHE_FLASH_ATTR umm_init( void ) { /* index of the latest `umm_block` */ const unsigned short int block_last = UMM_NUMBLOCKS - 1; - /* init ummStats */ - ummStats.free_blocks = ummStats.free_blocks_min = block_last; + /* init ummStats.free_blocks */ +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) +#if defined(UMM_STATS_FULL) + ummStats.free_blocks_min = + ummStats.free_blocks_isr_min = +#endif + ummStats.free_blocks = block_last; +#endif /* setup the 0th `umm_block`, which just points to the 1st */ UMM_NBLOCK(block_0th) = block_1th; UMM_NFREE(block_0th) = block_1th; + UMM_PFREE(block_0th) = block_1th; /* * Now, we need to set the whole heap space as a huge free block. We should @@ -1335,21 +279,16 @@ void ICACHE_FLASH_ATTR umm_init( void ) { } } -/* ------------------------------------------------------------------------ */ +/* ------------------------------------------------------------------------ + * Must be called only from within critical sections guarded by + * UMM_CRITICAL_ENTRY() and UMM_CRITICAL_EXIT(). + */ -static void _umm_free( void *ptr ) { - UMM_CRITICAL_DECL(id_free); +static void umm_free_core( void *ptr ) { unsigned short int c; - /* If we're being asked to free a NULL pointer, well that's just silly! */ - - if( (void *)0 == ptr ) { - DBG_LOG_DEBUG( "free a null pointer -> do nothing\n" ); - - return; - } - + STATS__FREE_REQUEST(id_free); /* * FIXME: At some point it might be a good idea to add a check to make sure * that the pointer we're being asked to free up is actually within @@ -1363,13 +302,10 @@ static void _umm_free( void *ptr ) { c = (((char *)ptr)-(char *)(&(umm_heap[0])))/sizeof(umm_block); - DBG_LOG_DEBUG( "Freeing block %6d\n", c ); + DBGLOG_DEBUG( "Freeing block %6d\n", c ); - /* Protect the critical section... */ - UMM_CRITICAL_ENTRY(id_free); - - /* Update heap statistics */ - ummStats.free_blocks += (UMM_NBLOCK(c) - c); + /* Update stats Free Block count */ + STATS__FREE_BLOCKS_UPDATE(UMM_NBLOCK(c) - c); /* Now let's assimilate this block with the next one if possible. */ @@ -1379,7 +315,7 @@ static void _umm_free( void *ptr ) { if( UMM_NBLOCK(UMM_PBLOCK(c)) & UMM_FREELIST_MASK ) { - DBG_LOG_DEBUG( "Assimilate down to next block, which is FREE\n" ); + DBGLOG_DEBUG( "Assimilate down to next block, which is FREE\n" ); c = umm_assimilate_down(c, UMM_FREELIST_MASK); } else { @@ -1388,7 +324,7 @@ static void _umm_free( void *ptr ) { * of the free list */ - DBG_LOG_DEBUG( "Just add to head of free list\n" ); + DBGLOG_DEBUG( "Just add to head of free list\n" ); UMM_PFREE(UMM_NFREE(0)) = c; UMM_NFREE(c) = UMM_NFREE(0); @@ -1397,39 +333,41 @@ static void _umm_free( void *ptr ) { UMM_NBLOCK(c) |= UMM_FREELIST_MASK; } - -#if 0 - /* - * The following is experimental code that checks to see if the block we just - * freed can be assimilated with the very last block - it's pretty convoluted in - * terms of block index manipulation, and has absolutely no effect on heap - * fragmentation. I'm not sure that it's worth including but I've left it - * here for posterity. - */ - - if( 0 == UMM_NBLOCK(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK ) ) { - - if( UMM_PBLOCK(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) != UMM_PFREE(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK) ) { - UMM_NFREE(UMM_PFREE(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK)) = c; - UMM_NFREE(UMM_PFREE(c)) = UMM_NFREE(c); - UMM_PFREE(UMM_NFREE(c)) = UMM_PFREE(c); - UMM_PFREE(c) = UMM_PFREE(UMM_NBLOCK(c) & UMM_BLOCKNO_MASK); - } - - UMM_NFREE(c) = 0; - UMM_NBLOCK(c) = 0; - } -#endif - - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_free); } /* ------------------------------------------------------------------------ */ -static void *_umm_malloc( size_t size ) { - UMM_CRITICAL_DECL(id_malloc); +void umm_free( void *ptr ) { + UMM_CRITICAL_DECL(id_free); + if (umm_heap == NULL) { + umm_init(); + } + + /* If we're being asked to free a NULL pointer, well that's just silly! */ + + if( (void *)0 == ptr ) { + DBGLOG_DEBUG( "free a null pointer -> do nothing\n" ); + STATS__NULL_FREE_REQUEST(id_free); + + return; + } + + /* Free the memory withing a protected critical section */ + + UMM_CRITICAL_ENTRY(id_free); + + umm_free_core( ptr ); + + UMM_CRITICAL_EXIT(id_free); +} + +/* ------------------------------------------------------------------------ + * Must be called only from within critical sections guarded by + * UMM_CRITICAL_ENTRY() and UMM_CRITICAL_EXIT(). + */ + +static void *umm_malloc_core( size_t size ) { unsigned short int blocks; unsigned short int blockSize = 0; @@ -1438,25 +376,7 @@ static void *_umm_malloc( size_t size ) { unsigned short int cf; - if (umm_heap == NULL) { - umm_init(); - } - - /* - * the very first thing we do is figure out if we're being asked to allocate - * a size of 0 - and if we are we'll simply return a null pointer. if not - * then reduce the size by 1 byte so that the subsequent calculations on - * the number of blocks to allocate are easier... - */ - - if( 0 == size ) { - DBG_LOG_DEBUG( "malloc a block of 0 bytes -> do nothing\n" ); - - return( (void *)NULL ); - } - - if ( size > ummStats.alloc_max_size ) - ummStats.alloc_max_size = size; + STATS__ALLOC_REQUEST(id_malloc, size); blocks = umm_blocks( size ); @@ -1468,9 +388,6 @@ static void *_umm_malloc( size_t size ) { * algorithm */ - /* Protect the critical section... */ - UMM_CRITICAL_ENTRY(id_malloc); - cf = UMM_NFREE(0); bestBlock = UMM_NFREE(0); @@ -1479,17 +396,19 @@ static void *_umm_malloc( size_t size ) { while( cf ) { blockSize = (UMM_NBLOCK(cf) & UMM_BLOCKNO_MASK) - cf; - DBG_LOG_TRACE( "Looking at block %6d size %6d\n", cf, blockSize ); + DBGLOG_TRACE( "Looking at block %6d size %6d\n", cf, blockSize ); -#if defined UMM_FIRST_FIT - /* This is the first block that fits! */ - if( (blockSize >= blocks) ) - break; -#elif defined UMM_BEST_FIT +#if defined UMM_BEST_FIT if( (blockSize >= blocks) && (blockSize < bestSize) ) { bestBlock = cf; bestSize = blockSize; } +#elif defined UMM_FIRST_FIT + /* This is the first block that fits! */ + if( (blockSize >= blocks) ) + break; +#else +# error "No UMM_*_FIT is defined - check umm_malloc_cfg.h" #endif cf = UMM_NFREE(cf); @@ -1500,6 +419,8 @@ static void *_umm_malloc( size_t size ) { blockSize = bestSize; } + POISON_CHECK_NEIGHBORS(cf); + if( UMM_NBLOCK(cf) & UMM_BLOCKNO_MASK && blockSize >= blocks ) { /* * This is an existing block in the memory heap, we just need to split off @@ -1510,7 +431,7 @@ static void *_umm_malloc( size_t size ) { if( blockSize == blocks ) { /* It's an exact fit and we don't neet to split off a block. */ - DBG_LOG_DEBUG( "Allocating %6d blocks starting at %6d - exact\n", blocks, cf ); + DBGLOG_DEBUG( "Allocating %6d blocks starting at %6d - exact\n", blocks, cf ); /* Disconnect this block from the FREE list */ @@ -1518,18 +439,16 @@ static void *_umm_malloc( size_t size ) { } else { /* It's not an exact fit and we need to split off a block. */ - DBG_LOG_DEBUG( "Allocating %6d blocks starting at %6d - existing\n", blocks, cf ); + DBGLOG_DEBUG( "Allocating %6d blocks starting at %6d - existing\n", blocks, cf ); /* * split current free block `cf` into two blocks. The first one will be * returned to user, so it's not free, and the second one will be free. */ - umm_make_new_block( cf, blocks, - 0/*`cf` is not free*/, - UMM_FREELIST_MASK/*new block is free*/); + umm_split_block( cf, blocks, UMM_FREELIST_MASK /*new block is free*/ ); /* - * `umm_make_new_block()` does not update the free pointers (it affects + * `umm_split_block()` does not update the free pointers (it affects * only free flags), but effectively we've just moved beginning of the * free block from `cf` to `cf + blocks`. So we have to adjust pointers * to and from adjacent free blocks. @@ -1544,37 +463,66 @@ static void *_umm_malloc( size_t size ) { UMM_NFREE( cf + blocks ) = UMM_NFREE(cf); } - /* Update heap statistics */ - ummStats.free_blocks -= blocks; - if (ummStats.free_blocks < ummStats.free_blocks_min) - ummStats.free_blocks_min = ummStats.free_blocks; - + STATS__FREE_BLOCKS_UPDATE( -blocks ); + STATS__FREE_BLOCKS_MIN(); } else { - ummStats.oom_count += 1; - - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_malloc); - /* Out of memory */ + STATS__OOM_UPDATE(); - DBG_LOG_DEBUG( "Can't allocate %5d blocks\n", blocks ); + DBGLOG_DEBUG( "Can't allocate %5d blocks\n", blocks ); return( (void *)NULL ); } - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_malloc); - return( (void *)&UMM_DATA(cf) ); } /* ------------------------------------------------------------------------ */ -static void *_umm_realloc( void *ptr, size_t size ) { +void *umm_malloc( size_t size ) { + UMM_CRITICAL_DECL(id_malloc); + + void *ptr = NULL; + + if (umm_heap == NULL) { + umm_init(); + } + + /* + * the very first thing we do is figure out if we're being asked to allocate + * a size of 0 - and if we are we'll simply return a null pointer. if not + * then reduce the size by 1 byte so that the subsequent calculations on + * the number of blocks to allocate are easier... + */ + + if( 0 == size ) { + DBGLOG_DEBUG( "malloc a block of 0 bytes -> do nothing\n" ); + STATS__ZERO_ALLOC_REQUEST(id_malloc, size); + + return( ptr ); + } + + /* Allocate the memory withing a protected critical section */ + + UMM_CRITICAL_ENTRY(id_malloc); + + ptr = umm_malloc_core( size ); + + UMM_CRITICAL_EXIT(id_malloc); + + return( ptr ); +} + +/* ------------------------------------------------------------------------ */ + +void *umm_realloc( void *ptr, size_t size ) { UMM_CRITICAL_DECL(id_realloc); unsigned short int blocks; unsigned short int blockSize; + unsigned short int prevBlockSize = 0; + unsigned short int nextBlockSize = 0; + unsigned short int c; size_t curSize; @@ -1592,9 +540,9 @@ static void *_umm_realloc( void *ptr, size_t size ) { */ if( ((void *)NULL == ptr) ) { - DBG_LOG_DEBUG( "realloc the NULL pointer - call malloc()\n" ); + DBGLOG_DEBUG( "realloc the NULL pointer - call malloc()\n" ); - return( _umm_malloc(size) ); + return( umm_malloc(size) ); } /* @@ -1603,41 +551,17 @@ static void *_umm_realloc( void *ptr, size_t size ) { * we should operate the same as free. */ - if( 0 == size ) { - DBG_LOG_DEBUG( "realloc to 0 size, just free the block\n" ); - _umm_free( ptr ); + if( 0 == size ) { + DBGLOG_DEBUG( "realloc to 0 size, just free the block\n" ); + STATS__ZERO_ALLOC_REQUEST(id_realloc, size); + + umm_free( ptr ); return( (void *)NULL ); } - if ( size > ummStats.alloc_max_size ) - ummStats.alloc_max_size = size; - - /* - * Defer starting critical section. - * - * Initially we should be safe without a critical section as long as we are - * referencing values that are within our allocation as constants. - * And only reference values that will not change, while the redefintions of - * the allocations around us change. - * - * Example UMM_PBLOCK() could be change by a call to malloc from an ISR. - * On the other hand UMM_NBLOCK() is safe returns an address of the next - * block. The calculation is all based on information within our allocation - * that remains constant, until we change it. - * - * As long as we don't try to modify the next block or walk the chain of - * blocks we are okay. - * - * When called by an "interrupts enabled" type caller, it bears the - * responsibility to not call again, with the allocate we are currently - * working on. I think this is a normal expectation. I could be wrong. - * Such a situation would involve a function that is called from foreground - * and ISR context. Such code would already have to be re-entrant. This - * change may expand the corner cases for such a function. - * - */ + STATS__ALLOC_REQUEST(id_realloc, size); /* * Otherwise we need to actually do a reallocation. A naiive approach @@ -1654,7 +578,7 @@ static void *_umm_realloc( void *ptr, size_t size ) { c = (((char *)ptr)-(char *)(&(umm_heap[0])))/sizeof(umm_block); - /* Figure out how big this block is... */ + /* Figure out how big this block is ... the free bit is not set :-) */ blockSize = (UMM_NBLOCK(c) - c); @@ -1662,297 +586,245 @@ static void *_umm_realloc( void *ptr, size_t size ) { curSize = (blockSize*sizeof(umm_block))-(sizeof(((umm_block *)0)->header)); - /* - * Ok, now that we're here, we know the block number of the original chunk - * of memory, and we know how much new memory we want, and we know the original - * block size... - */ - - if( blockSize == blocks ) { - /* This space intentionally left blank - return the original pointer! */ - - DBG_LOG_DEBUG( "realloc the same size block - %d, do nothing\n", blocks ); - - return( ptr ); - } - - /* Now we need a critical section... */ + /* Protect the critical section... */ UMM_CRITICAL_ENTRY(id_realloc); - /* - * Now we have a block size that could be bigger or smaller. Either - * way, try to assimilate up to the next block before doing anything... + /* Now figure out if the previous and/or next blocks are free as well as + * their sizes - this will help us to minimize special code later when we + * decide if it's possible to use the adjacent blocks. * - * If it's still too small, we have to free it anyways and it will save the - * assimilation step later in free :-) + * We set prevBlockSize and nextBlockSize to non-zero values ONLY if they + * are free! */ - if( UMM_NBLOCK(UMM_NBLOCK(c)) & UMM_FREELIST_MASK ) { - // This will often be most of the free heap. The excess is - // restored when umm_free() is called before returning. - ummStats.free_blocks -= - (UMM_NBLOCK(UMM_NBLOCK(c)) & UMM_BLOCKNO_MASK) - UMM_NBLOCK(c); - umm_assimilate_up( c ); - } + if ((UMM_NBLOCK(UMM_NBLOCK(c)) & UMM_FREELIST_MASK)) { + nextBlockSize = (UMM_NBLOCK(UMM_NBLOCK(c)) & UMM_BLOCKNO_MASK) - UMM_NBLOCK(c); + } + if ((UMM_NBLOCK(UMM_PBLOCK(c)) & UMM_FREELIST_MASK)) { + prevBlockSize = (c - UMM_PBLOCK(c)); + } + + DBGLOG_DEBUG( "realloc blocks %d blockSize %d nextBlockSize %d prevBlockSize %d\n", blocks, blockSize, nextBlockSize, prevBlockSize ); + +#if defined(UMM_REALLOC_MINIMIZE_COPY) /* - * Now check if it might help to assimilate down, but don't actually - * do the downward assimilation unless the resulting block will hold the - * new request! If this block of code runs, then the new block will - * either fit the request exactly, or be larger than the request. + * Ok, now that we're here we know how many blocks we want and the current + * blockSize. The prevBlockSize and nextBlockSize are set and we can figure + * out the best strategy for the new allocation as follows: + * + * 1. If the new block is the same size or smaller than the current block do + * nothing. + * 2. If the next block is free and adding it to the current block gives us + * enough memory, assimilate the next block. + * 3. If the prev block is free and adding it to the current block gives us + * enough memory, remove the previous block from the free list, assimilate + * it, copy to the new block. + * 4. If the prev and next blocks are free and adding them to the current + * block gives us enough memory, assimilate the next block, remove the + * previous block from the free list, assimilate it, copy to the new block. + * 5. Otherwise try to allocate an entirely new block of memory. If the + * allocation works free the old block and return the new pointer. If + * the allocation fails, return NULL and leave the old block intact. + * + * All that's left to do is decide if the fit was exact or not. If the fit + * was not exact, then split the memory block so that we use only the requested + * number of blocks and add what's left to the free list. */ - - if( (UMM_NBLOCK(UMM_PBLOCK(c)) & UMM_FREELIST_MASK) && - (blocks <= (UMM_NBLOCK(c)-UMM_PBLOCK(c))) ) { - - /* Check if the resulting block would be big enough... */ - - DBG_LOG_DEBUG( "realloc() could assimilate down %d blocks - fits!\n\r", c-UMM_PBLOCK(c) ); - - /* - * Calculate the number of blocks to keep while the information is - * still available. - */ - - unsigned short int prevBlockSize = c - UMM_PBLOCK(c); - ummStats.free_blocks -= prevBlockSize; - unsigned short int prelimBlockSize = blockSize + prevBlockSize; - if(prelimBlockSize < blocks) - prelimBlockSize = blocks; - - /* Disconnect the previous block from the FREE list */ - - umm_disconnect_from_free_list( UMM_PBLOCK(c) ); - - /* - * Connect the previous block to the next block ... and then - * realign the current block pointer - */ - - c = umm_assimilate_down(c, 0); - - /* - * Currently all or most of the heap has been grabbed. Do an early split of - * allocation down to the amount needed to do a successful move operation. - * This will allow an alloc/new from a ISR to succeed while a memmove is - * running. - */ - if( (UMM_NBLOCK(c) - c) > prelimBlockSize ) { - umm_make_new_block( c, prelimBlockSize, 0, 0 ); - _umm_free( (void *)&UMM_DATA(c+prelimBlockSize) ); - } - - // This is the lowest low that may be seen by an ISR doing an alloc/new - if( ummStats.free_blocks < ummStats.free_blocks_min ) - ummStats.free_blocks_min = ummStats.free_blocks; - - /* - * For the ESP8266 interrupts should not be off for more than 10us. - * An unprotect/protect around memmove should be safe to do here. - * All variables used are on the stack. - */ - - UMM_CRITICAL_EXIT(id_realloc); - - /* - * Move the bytes down to the new block we just created, but be sure to move - * only the original bytes. - */ - - memmove( (void *)&UMM_DATA(c), ptr, curSize ); - - /* And don't forget to adjust the pointer to the new block location! */ - - ptr = (void *)&UMM_DATA(c); - - /* Now resume critical section... */ - UMM_CRITICAL_ENTRY(id_realloc); - } - - /* Now calculate the block size again...and we'll have three cases */ - - blockSize = (UMM_NBLOCK(c) - c); - - if( blockSize == blocks ) { - /* This space intentionally left blank - return the original pointer! */ - - DBG_LOG_DEBUG( "realloc the same size block - %d, do nothing\n", blocks ); - - } else if (blockSize > blocks ) { - /* - * New block is smaller than the old block, so just make a new block - * at the end of this one and put it up on the free list... - */ - - DBG_LOG_DEBUG( "realloc %d to a smaller block %d, shrink and free the leftover bits\n", blockSize, blocks ); - - umm_make_new_block( c, blocks, 0, 0 ); - _umm_free( (void *)&UMM_DATA(c+blocks) ); - } else { - /* New block is bigger than the old block... */ - - /* Finish up without critical section */ - UMM_CRITICAL_EXIT(id_realloc); - - void *oldptr = ptr; - - DBG_LOG_DEBUG( "realloc %d to a bigger block %d, make new, copy, and free the old\n", blockSize, blocks ); - - /* - * Now _umm_malloc() a new/ one, copy the old data to the new block, and - * free up the old block, but only if the malloc was sucessful! - */ - - if( (ptr = _umm_malloc( size )) ) { - memcpy( ptr, oldptr, curSize ); - _umm_free( oldptr ); + if (blockSize >= blocks) { + DBGLOG_DEBUG( "realloc the same or smaller size block - %i, do nothing\n", blocks ); + /* This space intentionally left blank */ + } else if ((blockSize + nextBlockSize) >= blocks) { + DBGLOG_DEBUG( "realloc using next block - %i\n", blocks ); + umm_assimilate_up( c ); + STATS__FREE_BLOCKS_UPDATE( - nextBlockSize ); + blockSize += nextBlockSize; + } else if ((prevBlockSize + blockSize) >= blocks) { + DBGLOG_DEBUG( "realloc using prev block - %i\n", blocks ); + umm_disconnect_from_free_list( UMM_PBLOCK(c) ); + c = umm_assimilate_down(c, 0); + STATS__FREE_BLOCKS_UPDATE( - prevBlockSize ); + STATS__FREE_BLOCKS_ISR_MIN(); + blockSize += prevBlockSize; + UMM_CRITICAL_SUSPEND(id_realloc); + memmove( (void *)&UMM_DATA(c), ptr, curSize ); + ptr = (void *)&UMM_DATA(c); + UMM_CRITICAL_RESUME(id_realloc); + } else if ((prevBlockSize + blockSize + nextBlockSize) >= blocks) { + DBGLOG_DEBUG( "realloc using prev and next block - %d\n", blocks ); + umm_assimilate_up( c ); + umm_disconnect_from_free_list( UMM_PBLOCK(c) ); + c = umm_assimilate_down(c, 0); + STATS__FREE_BLOCKS_UPDATE( - prevBlockSize - nextBlockSize ); +#ifdef UMM_LIGHTWEIGHT_CPU + if ((prevBlockSize + blockSize + nextBlockSize) > blocks) { + umm_split_block( c, blocks, 0 ); + umm_free_core( (void *)&UMM_DATA(c+blocks) ); + } + STATS__FREE_BLOCKS_ISR_MIN(); + blockSize = blocks; +#else + blockSize += (prevBlockSize + nextBlockSize); +#endif + UMM_CRITICAL_SUSPEND(id_realloc); + memmove( (void *)&UMM_DATA(c), ptr, curSize ); + ptr = (void *)&UMM_DATA(c); + UMM_CRITICAL_RESUME(id_realloc); } else { - ummStats.oom_count += 1; // Needs atomic + DBGLOG_DEBUG( "realloc a completely new block %i\n", blocks ); + void *oldptr = ptr; + if( (ptr = umm_malloc_core( size )) ) { + DBGLOG_DEBUG( "realloc %i to a bigger block %i, copy, and free the old\n", blockSize, blocks ); + UMM_CRITICAL_SUSPEND(id_realloc); + memcpy( ptr, oldptr, curSize ); + UMM_CRITICAL_RESUME(id_realloc); + umm_free_core( oldptr ); + } else { + DBGLOG_DEBUG( "realloc %i to a bigger block %i failed - return NULL and leave the old block!\n", blockSize, blocks ); + /* This space intentionally left blnk */ + STATS__OOM_UPDATE(); + } + /* This is not accurate for OOM case; however, it will work for + * stopping a call to free before return. + */ + blockSize = blocks; } +#elif defined(UMM_REALLOC_DEFRAG) + /* + * Ok, now that we're here we know how many blocks we want and the current + * blockSize. The prevBlockSize and nextBlockSize are set and we can figure + * out the best strategy for the new allocation. The following strategy is + * focused on defragging the heap: + * + * 1. If the prev is free and adding it to the current, or current and next + * block, gives us enough memory, proceed. Note, that next block may not + * be available. + * a. Remove the previous block from the free list, assimilate it. + * b. If this new block gives enough memory, copy to the new block. + * Note, this includes the case of same size or smaller block. + * c. Else assimilate the next block, copy to the new block. + * 2. If the new block is the same size or smaller than the current block do + * nothing. + * 3. If the next block is free and adding it to the current block gives us + * enough memory, assimilate the next block. + * 4. Otherwise try to allocate an entirely new block of memory. If the + * allocation works free the old block and return the new pointer. If + * the allocation fails, return NULL and leave the old block intact. + * + * All that's left to do is decide if the fit was exact or not. If the fit + * was not exact, then split the memory block so that we use only the + * requested number of blocks and add what's left to the free list. + */ + if (prevBlockSize && (prevBlockSize + blockSize + nextBlockSize) >= blocks) { // 1 + umm_disconnect_from_free_list( UMM_PBLOCK(c) ); + c = umm_assimilate_down(c, 0); + STATS__FREE_BLOCKS_UPDATE( - prevBlockSize ); + blockSize += prevBlockSize; + if (blockSize >= blocks) { + DBGLOG_DEBUG( "realloc using prev block - %d\n", blocks ); + STATS__FREE_BLOCKS_ISR_MIN(); + } else { + DBGLOG_DEBUG( "realloc using prev and next block - %d\n", blocks ); + umm_assimilate_up( c ); + STATS__FREE_BLOCKS_UPDATE( - nextBlockSize ); + blockSize += nextBlockSize; +#ifdef UMM_LIGHTWEIGHT_CPU + if (blockSize > blocks) { + umm_split_block( c, blocks, 0 ); + umm_free_core( (void *)&UMM_DATA(c+blocks) ); + } + STATS__FREE_BLOCKS_ISR_MIN(); + blockSize = blocks; +#endif + } + UMM_CRITICAL_SUSPEND(id_realloc); + memmove( (void *)&UMM_DATA(c), ptr, curSize ); + ptr = (void *)&UMM_DATA(c); + UMM_CRITICAL_RESUME(id_realloc); + } else if (blockSize >= blocks) { // 2 + DBGLOG_DEBUG( "realloc the same or smaller size block - %d, do nothing\n", blocks ); + /* This space intentionally left blank */ + } else if ((blockSize + nextBlockSize) >= blocks) { // 3 + DBGLOG_DEBUG( "realloc using next block - %d\n", blocks ); + umm_assimilate_up( c ); + STATS__FREE_BLOCKS_UPDATE( - nextBlockSize ); + blockSize += nextBlockSize; + } else { // 4 + DBGLOG_DEBUG( "realloc a completely new block %d\n", blocks ); + void *oldptr = ptr; + if( (ptr = umm_malloc_core( size )) ) { + DBGLOG_DEBUG( "realloc %d to a bigger block %d, copy, and free the old\n", blockSize, blocks ); + UMM_CRITICAL_SUSPEND(id_realloc); + memcpy( ptr, oldptr, curSize ); + UMM_CRITICAL_RESUME(id_realloc); + umm_free_core( oldptr); + } else { + DBGLOG_DEBUG( "realloc %d to a bigger block %d failed - return NULL and leave the old block!\n", blockSize, blocks ); + /* This space intentionally left blnk */ + STATS__OOM_UPDATE(); + } + /* This is not accurate for OOM case; however, it will work for + * stopping a call to free before return. + */ + blockSize = blocks; + } +#else +#warning "Neither UMM_REALLOC_DEFRAG nor UMM_REALLOC_MINIMIZE_COPY is defined - check umm_malloc_cfg.h" + /* An always copy option just for performance/fragmentation comparison */ + if (blockSize >= blocks) { + DBGLOG_DEBUG( "realloc the same or smaller size block - %d, do nothing\n", blocks ); + /* This space intentionally left blank */ + } else { + DBGLOG_DEBUG( "realloc a completely new block %d\n", blocks ); + void *oldptr = ptr; + if( (ptr = umm_malloc_core( size )) ) { + DBGLOG_DEBUG( "realloc %d to a bigger block %d, copy, and free the old\n", blockSize, blocks ); + UMM_CRITICAL_SUSPEND(id_realloc); + memcpy( ptr, oldptr, curSize ); + UMM_CRITICAL_RESUME(id_realloc); + umm_free_core( oldptr ); + } else { + DBGLOG_DEBUG( "realloc %d to a bigger block %d failed - return NULL and leave the old block!\n", blockSize, blocks ); + /* This space intentionally left blnk */ + STATS__OOM_UPDATE(); + } + /* This is not accurate for OOM case; however, it will work for + * stopping a call to free before return. + */ + blockSize = blocks; + } +#endif + /* Now all we need to do is figure out if the block fit exactly or if we + * need to split and free ... + */ + + if (blockSize > blocks ) { + DBGLOG_DEBUG( "split and free %d blocks from %d\n", blocks, blockSize ); + umm_split_block( c, blocks, 0 ); + umm_free_core( (void *)&UMM_DATA(c+blocks) ); + } + + STATS__FREE_BLOCKS_MIN(); + + /* Release the critical section... */ + UMM_CRITICAL_EXIT(id_realloc); + return( ptr ); - - } - - if (ummStats.free_blocks < ummStats.free_blocks_min) - ummStats.free_blocks_min = ummStats.free_blocks; - - /* Release the critical section... */ - UMM_CRITICAL_EXIT(id_realloc); - - return( ptr ); -} - -/* ------------------------------------------------------------------------ */ - -void *umm_malloc( size_t size ) { - void *ret; - - /* check poison of each blocks, if poisoning is enabled */ - if (!CHECK_POISON_ALL_BLOCKS()) { - return NULL; - } - - /* check full integrity of the heap, if this check is enabled */ - if (!INTEGRITY_CHECK()) { - return NULL; - } - - size += POISON_SIZE(size); - - ret = _umm_malloc( size ); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } - - ret = GET_POISONED(ret, size); - - return ret; } /* ------------------------------------------------------------------------ */ void *umm_calloc( size_t num, size_t item_size ) { void *ret; - size_t size = item_size * num; - /* check poison of each blocks, if poisoning is enabled */ - if (!CHECK_POISON_ALL_BLOCKS()) { - return NULL; - } + ret = umm_malloc((size_t)(item_size * num)); - /* check full integrity of the heap, if this check is enabled */ - if (!INTEGRITY_CHECK()) { - return NULL; - } - - size += POISON_SIZE(size); - ret = _umm_malloc(size); - if (ret) { - memset(ret, 0x00, size); - } - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } - - ret = GET_POISONED(ret, size); + if (ret) + memset(ret, 0x00, (size_t)(item_size * num)); return ret; } /* ------------------------------------------------------------------------ */ -void *umm_realloc( void *ptr, size_t size ) { - void *ret; - - ptr = GET_UNPOISONED(ptr); - - /* check poison of each blocks, if poisoning is enabled */ - if (!CHECK_POISON_ALL_BLOCKS()) { - return NULL; - } - - /* check full integrity of the heap, if this check is enabled */ - if (!INTEGRITY_CHECK()) { - return NULL; - } - - size += POISON_SIZE(size); - ret = _umm_realloc( ptr, size ); - if (0 != size && 0 == ret) { - umm_last_fail_alloc_addr = __builtin_return_address(0); - umm_last_fail_alloc_size = size; - } - - ret = GET_POISONED(ret, size); - - return ret; -} - -/* ------------------------------------------------------------------------ */ - -void umm_free( void *ptr ) { - - ptr = GET_UNPOISONED(ptr); - - /* check poison of each blocks, if poisoning is enabled */ - if (!CHECK_POISON_ALL_BLOCKS()) { - return; - } - - /* check full integrity of the heap, if this check is enabled */ - if (!INTEGRITY_CHECK()) { - return; - } - - _umm_free( ptr ); -} - -/* ------------------------------------------------------------------------ */ - -size_t ICACHE_FLASH_ATTR umm_free_heap_size( void ) { - return (size_t)ummStats.free_blocks * sizeof(umm_block); -} - -size_t ICACHE_FLASH_ATTR umm_free_heap_size_min( void ) { - return (size_t)ummStats.free_blocks_min * sizeof(umm_block); -} - -size_t ICACHE_FLASH_ATTR umm_free_heap_size_min_reset( void ) { - ummStats.free_blocks_min = ummStats.free_blocks; - return (size_t)ummStats.free_blocks_min * sizeof(umm_block); -} - -size_t ICACHE_FLASH_ATTR umm_max_block_size( void ) { - umm_info(NULL, 0); - return ummHeapInfo.maxFreeContiguousBlocks * sizeof(umm_block); -} - -size_t ICACHE_FLASH_ATTR umm_block_size( void ) { - return sizeof(umm_block); -} - }; - -/* ------------------------------------------------------------------------ */ diff --git a/cores/esp8266/umm_malloc/umm_malloc.h b/cores/esp8266/umm_malloc/umm_malloc.h index fcb1ade82..4c68b7202 100644 --- a/cores/esp8266/umm_malloc/umm_malloc.h +++ b/cores/esp8266/umm_malloc/umm_malloc.h @@ -10,41 +10,18 @@ /* ------------------------------------------------------------------------ */ +//C This include is not in upstream neither are the #ifdef __cplusplus #include "umm_malloc_cfg.h" /* user-dependent */ #ifdef __cplusplus extern "C" { #endif -typedef struct UMM_HEAP_INFO_t { - unsigned short int totalEntries; - unsigned short int usedEntries; - unsigned short int freeEntries; - - unsigned short int totalBlocks; - unsigned short int usedBlocks; - unsigned short int freeBlocks; - - unsigned short int maxFreeContiguousBlocks; - - unsigned int freeSize2; -} -UMM_HEAP_INFO; - -extern UMM_HEAP_INFO ummHeapInfo; - -void umm_init( void ); - -void *umm_info( void *ptr, int force ); - +void umm_init( void ); void *umm_malloc( size_t size ); void *umm_calloc( size_t num, size_t size ); void *umm_realloc( void *ptr, size_t size ); -void umm_free( void *ptr ); - -size_t umm_free_heap_size( void ); -size_t umm_max_block_size( void ); -size_t umm_block_size( void ); +void umm_free( void *ptr ); #ifdef __cplusplus } diff --git a/cores/esp8266/umm_malloc/umm_malloc_cfg.h b/cores/esp8266/umm_malloc/umm_malloc_cfg.h index 39d5897cc..9d41d96b4 100644 --- a/cores/esp8266/umm_malloc/umm_malloc_cfg.h +++ b/cores/esp8266/umm_malloc/umm_malloc_cfg.h @@ -1,11 +1,17 @@ /* - * Configuration for umm_malloc + * Configuration for umm_malloc - target Arduino ESP8266 core + * + * Changes specific to a target platform go here. + * */ #ifndef _UMM_MALLOC_CFG_H #define _UMM_MALLOC_CFG_H #include +#include +#include + #ifdef __cplusplus extern "C" { #endif @@ -15,19 +21,6 @@ extern "C" { #include #include "c_types.h" -#include "umm_performance.h" -#include "umm_stats.h" - -#undef DBGLOG_FUNCTION -#if defined(DEBUG_ESP_PORT) || defined(DEBUG_ESP_ISR) -int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2))); -// Note, _isr_safe_printf_P will not handle additional string arguments in -// PROGMEM. Only the 1st parameter, fmt, is supported in PROGMEM. -#define DBGLOG_FUNCTION(fmt, ...) _isr_safe_printf_P(PSTR(fmt), ##__VA_ARGS__) -#else -// Macro to place constant strings into PROGMEM and print them properly -#define DBGLOG_FUNCTION(fmt, ...) printf(PSTR(fmt), ## __VA_ARGS__ ) -#endif /* * There are a number of defines you can set at compile time that affect how @@ -37,19 +30,7 @@ int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2) * * -D UMM_TEST_MAIN * - * Set this if you want to compile in the test suite at the end of this file. - * - * If you leave this define unset, then you might want to set another one: - * - * -D UMM_REDEFINE_MEM_FUNCTIONS - * - * If you leave this define unset, then the function names are left alone as - * umm_malloc() umm_free() and umm_realloc() so that they cannot be confused - * with the C runtime functions malloc() free() and realloc() - * - * If you do set this define, then the function names become malloc() - * free() and realloc() so that they can be used as the C runtime functions - * in an embedded environment. + * Set this if you want to compile in the test suite * * -D UMM_BEST_FIT (defualt) * @@ -75,46 +56,300 @@ int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2) * ---------------------------------------------------------------------------- */ -///////////////////////////////////////////////// -#ifdef DEBUG_ESP_OOM - -#define MEMLEAK_DEBUG - -// umm_*alloc are not renamed to *alloc - -void *umm_malloc( size_t size ); -void *umm_calloc( size_t num, size_t size ); -void *umm_realloc( void *ptr, size_t size ); -#define umm_free free -#define umm_zalloc(s) umm_calloc(1,s) - -void* malloc_loc (size_t s, const char* file, int line); -void* calloc_loc (size_t n, size_t s, const char* file, int line); -void* realloc_loc (void* p, size_t s, const char* file, int line); - -// *alloc are macro calling *alloc_loc calling+checking umm_*alloc() -// they are defined at the bottom of this file - -///////////////////////////////////////////////// -#else // !defined(ESP_DEBUG_OOM) - - // umm_*alloc are renamed to *alloc - #define UMM_REDEFINE_MEM_FUNCTIONS - +#ifdef TEST_BUILD +extern char test_umm_heap[]; #endif - #define UMM_BEST_FIT - +#ifdef TEST_BUILD +/* Start addresses and the size of the heap */ +#define UMM_MALLOC_CFG_HEAP_ADDR (test_umm_heap) +#define UMM_MALLOC_CFG_HEAP_SIZE 0x10000 +#else /* Start addresses and the size of the heap */ extern char _heap_start[]; -#define UMM_MALLOC_CFG__HEAP_ADDR ((uint32_t)&_heap_start) -#define UMM_MALLOC_CFG__HEAP_SIZE ((size_t)(0x3fffc000 - UMM_MALLOC_CFG__HEAP_ADDR)) +#define UMM_MALLOC_CFG_HEAP_ADDR ((uint32_t)&_heap_start[0]) +#define UMM_MALLOC_CFG_HEAP_SIZE ((size_t)(0x3fffc000 - UMM_MALLOC_CFG_HEAP_ADDR)) +#endif /* A couple of macros to make packing structures less compiler dependent */ #define UMM_H_ATTPACKPRE #define UMM_H_ATTPACKSUF __attribute__((__packed__)) +#define UMM_BEST_FIT +#undef UMM_FIRST_FIT + +/* + * -D UMM_INFO : + * + * Enables a dup of the heap contents and a function to return the total + * heap size that is unallocated - note this is not the same as the largest + * unallocated block on the heap! + */ + +#define UMM_INFO + +#ifdef UMM_INFO + typedef struct UMM_HEAP_INFO_t { + unsigned short int totalEntries; + unsigned short int usedEntries; + unsigned short int freeEntries; + + unsigned short int totalBlocks; + unsigned short int usedBlocks; + unsigned short int freeBlocks; + + unsigned short int maxFreeContiguousBlocks; + + unsigned int freeSize2; + } + UMM_HEAP_INFO; + + extern UMM_HEAP_INFO ummHeapInfo; + + void ICACHE_FLASH_ATTR *umm_info( void *ptr, int force ); + size_t ICACHE_FLASH_ATTR umm_free_heap_size( void ); + size_t ICACHE_FLASH_ATTR umm_max_block_size( void ); +#else +#endif + +/* + * -D UMM_STATS : + * -D UMM_STATS_FULL + * + * This option provides a lightweight alternative to using `umm_info` just for + * getting `umm_free_heap_size`. With this option, a "free blocks" value is + * updated on each call to malloc/free/realloc. This option does not offer all + * the information that `umm_info` would have generated. + * + * This option is good for cases where the free heap is checked frequently. An + * example is when an app closely monitors free heap to detect memory leaks. In + * this case a single-core CPUs interrupt processing would have suffered the + * most. + * + * UMM_STATS_FULL provides additional heap statistics. It can be used to gain + * additional insight into heap usage. This option would add an additional 132 + * bytes of IRAM. + * + * Status: TODO: Needs to be proposed for upstream. + */ +/* +#define UMM_STATS +#define UMM_STATS_FULL + */ + +/* + * For the ESP8266 we want at lest UMM_STATS built, so we have an ISR safe + * function to call for implementing xPortGetFreeHeapSize(), because umm_info() + * is in flash. + */ +#if !defined(UMM_STATS) && !defined(UMM_STATS_FULL) +#define UMM_STATS +#endif + +#if defined(UMM_STATS) && defined(UMM_STATS_FULL) +#undef UMM_STATS +#endif + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) + +typedef struct UMM_STATISTICS_t { + unsigned short int free_blocks; + size_t oom_count; +#ifdef UMM_STATS_FULL + unsigned short int free_blocks_min; + unsigned short int free_blocks_isr_min; + size_t alloc_max_size; + size_t last_alloc_size; + size_t id_malloc_count; + size_t id_malloc_zero_count; + size_t id_realloc_count; + size_t id_realloc_zero_count; + size_t id_free_count; + size_t id_free_null_count; +#endif +} +UMM_STATISTICS; +extern UMM_STATISTICS ummStats; + +#define STATS__FREE_BLOCKS_UPDATE(s) ummStats.free_blocks += (s) +#define STATS__OOM_UPDATE() ummStats.oom_count += 1 + +size_t umm_free_heap_size_lw( void ); + +static inline size_t ICACHE_FLASH_ATTR umm_get_oom_count( void ) { + return ummStats.oom_count; +} + +#else // not UMM_STATS or UMM_STATS_FULL +#define STATS__FREE_BLOCKS_UPDATE(s) (void)(s) +#define STATS__OOM_UPDATE() (void)0 +#endif + +#if defined(UMM_STATS) || defined(UMM_STATS_FULL) || defined(UMM_INFO) +size_t ICACHE_FLASH_ATTR umm_block_size( void ); +#endif + +#ifdef UMM_STATS_FULL +#define STATS__FREE_BLOCKS_MIN() \ +do { \ + if (ummStats.free_blocks < ummStats.free_blocks_min) \ + ummStats.free_blocks_min = ummStats.free_blocks; \ +} while(false) + +#define STATS__FREE_BLOCKS_ISR_MIN() \ +do { \ + if (ummStats.free_blocks < ummStats.free_blocks_isr_min) \ + ummStats.free_blocks_isr_min = ummStats.free_blocks; \ +} while(false) + +#define STATS__ALLOC_REQUEST(tag, s) \ +do { \ + ummStats.tag##_count += 1; \ + ummStats.last_alloc_size = s; \ + if (ummStats.alloc_max_size < s) \ + ummStats.alloc_max_size = s; \ +} while(false) + +#define STATS__ZERO_ALLOC_REQUEST(tag, s) \ +do { \ + ummStats.tag##_zero_count += 1; \ +} while(false) + +#define STATS__NULL_FREE_REQUEST(tag) \ +do { \ + ummStats.tag##_null_count += 1; \ +} while(false) + +#define STATS__FREE_REQUEST(tag) \ +do { \ + ummStats.tag##_count += 1; \ +} while(false) + +static inline size_t ICACHE_FLASH_ATTR umm_free_heap_size_lw_min( void ) { + return (size_t)ummStats.free_blocks_min * umm_block_size(); +} + +static inline size_t ICACHE_FLASH_ATTR umm_free_heap_size_min_reset( void ) { + ummStats.free_blocks_min = ummStats.free_blocks; + return (size_t)ummStats.free_blocks_min * umm_block_size(); +} + +static inline size_t ICACHE_FLASH_ATTR umm_free_heap_size_min( void ) { + return ummStats.free_blocks_min * umm_block_size(); +} + +static inline size_t ICACHE_FLASH_ATTR umm_free_heap_size_isr_min( void ) { + return ummStats.free_blocks_isr_min * umm_block_size(); +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_max_alloc_size( void ) { + return ummStats.alloc_max_size; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_last_alloc_size( void ) { + return ummStats.last_alloc_size; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_malloc_count( void ) { + return ummStats.id_malloc_count; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_malloc_zero_count( void ) { + return ummStats.id_malloc_zero_count; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_realloc_count( void ) { + return ummStats.id_realloc_count; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_realloc_zero_count( void ) { + return ummStats.id_realloc_zero_count; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_free_count( void ) { + return ummStats.id_free_count; +} + +static inline size_t ICACHE_FLASH_ATTR umm_get_free_null_count( void ) { + return ummStats.id_free_null_count; +} + +#else // Not UMM_STATS_FULL +#define STATS__FREE_BLOCKS_MIN() (void)0 +#define STATS__FREE_BLOCKS_ISR_MIN() (void)0 +#define STATS__ALLOC_REQUEST(tag, s) (void)(s) +#define STATS__ZERO_ALLOC_REQUEST(tag, s) (void)(s) +#define STATS__NULL_FREE_REQUEST(tag) (void)0 +#define STATS__FREE_REQUEST(tag) (void)0 +#endif + +/* + Per Devyte, the core currently doesn't support masking a specific interrupt + level. That doesn't mean it can't be implemented, only that at this time + locking is implemented as all or nothing. + https://github.com/esp8266/Arduino/issues/6246#issuecomment-508612609 + + So for now we default to all, 15. + */ +#ifndef DEFAULT_CRITICAL_SECTION_INTLEVEL +#define DEFAULT_CRITICAL_SECTION_INTLEVEL 15 +#endif + +/* + * -D UMM_CRITICAL_METRICS + * + * Build option to collect timing usage data on critical section usage in + * functions: info, malloc, realloc. Collects MIN, MAX, and number of time IRQs + * were disabled at request time. Note, for realloc MAX disabled time will + * include the time spent in calling malloc and/or free. Examine code for + * specifics on what info is available and how to access. + * + * Status: TODO: Needs to be proposed for upstream. Also should include updates + * to UMM_POISON_CHECK and UMM_INTEGRITY_CHECK to include a critical section. + */ +/* +#define UMM_CRITICAL_METRICS + */ + +#if defined(UMM_CRITICAL_METRICS) +// This option adds support for gathering time locked data + +typedef struct UMM_TIME_STAT_t { + uint32_t min; + uint32_t max; + uint32_t start; + uint32_t intlevel; +} +UMM_TIME_STAT; + +typedef struct UMM_TIME_STATS_t UMM_TIME_STATS; + +extern UMM_TIME_STATS time_stats; + +bool get_umm_get_perf_data(UMM_TIME_STATS *p, size_t size); + +static inline void _critical_entry(UMM_TIME_STAT *p, uint32_t *saved_ps) { + *saved_ps = xt_rsil(DEFAULT_CRITICAL_SECTION_INTLEVEL); + if (0U != (*saved_ps & 0x0FU)) { + p->intlevel += 1U; + } + + p->start = esp_get_cycle_count(); +} + +static inline void _critical_exit(UMM_TIME_STAT *p, uint32_t *saved_ps) { + uint32_t elapse = esp_get_cycle_count() - p->start; + if (elapse < p->min) + p->min = elapse; + + if (elapse > p->max) + p->max = elapse; + + xt_wsr_ps(*saved_ps); +} +#endif + /* * A couple of macros to make it easier to protect the memory allocator * in a multitasking system. You should set these macros up to use whatever @@ -125,23 +360,82 @@ extern char _heap_start[]; * called from within umm_malloc() */ - -#if defined(UMM_CRITICAL_PERIOD_ANALYZE) - -#define UMM_CRITICAL_DECL(tag) uint32_t _saved_ps_##tag -#define UMM_CRITICAL_ENTRY(tag) _critical_entry(&time_stats.tag, &_saved_ps_##tag) -#define UMM_CRITICAL_EXIT(tag) _critical_exit(&time_stats.tag, &_saved_ps_##tag) - +#ifdef TEST_BUILD + extern int umm_critical_depth; + extern int umm_max_critical_depth; + #define UMM_CRITICAL_ENTRY() {\ + ++umm_critical_depth; \ + if (umm_critical_depth > umm_max_critical_depth) { \ + umm_max_critical_depth = umm_critical_depth; \ + } \ + } + #define UMM_CRITICAL_EXIT() (umm_critical_depth--) #else + #if defined(UMM_CRITICAL_METRICS) + #define UMM_CRITICAL_DECL(tag) uint32_t _saved_ps_##tag + #define UMM_CRITICAL_ENTRY(tag)_critical_entry(&time_stats.tag, &_saved_ps_##tag) + #define UMM_CRITICAL_EXIT(tag) _critical_exit(&time_stats.tag, &_saved_ps_##tag) -// This method preserves the intlevel on entry and restores the -// original intlevel at exit. -#define UMM_CRITICAL_DECL(tag) uint32_t _saved_ps_##tag -#define UMM_CRITICAL_ENTRY(tag) _saved_ps_##tag = xt_rsil(DEFAULT_CRITICAL_SECTION_INTLEVEL) -#define UMM_CRITICAL_EXIT(tag) xt_wsr_ps(_saved_ps_##tag) - + #else // ! UMM_CRITICAL_METRICS + // This method preserves the intlevel on entry and restores the + // original intlevel at exit. + #define UMM_CRITICAL_DECL(tag) uint32_t _saved_ps_##tag + #define UMM_CRITICAL_ENTRY(tag) _saved_ps_##tag = xt_rsil(DEFAULT_CRITICAL_SECTION_INTLEVEL) + #define UMM_CRITICAL_EXIT(tag) xt_wsr_ps(_saved_ps_##tag) + #endif #endif + /* + * -D UMM_LIGHTWEIGHT_CPU + * + * The use of this macro is hardware/application specific. + * + * With some CPUs, the only available method for locking are the instructions + * for interrupts disable/enable. These macros are meant for lightweight single + * CPU systems that are sensitive to interrupts being turned off for too long. A + * typically UMM_CRITICAL_ENTRY would save current IRQ state then disable IRQs. + * Then UMM_CRITICAL_EXIT would restore previous IRQ state. This option adds + * additional critical entry/exit points by the method of defining the macros + * UMM_CRITICAL_SUSPEND and UMM_CRITICAL_RESUME to the values of + * UMM_CRITICAL_EXIT and UMM_CRITICAL_ENTRY. These additional exit/entries + * allow time to service interrupts during the reentrant sections of the code. + * + * Performance may be impacked if used with multicore CPUs. The higher frquency + * of locking and unlocking may be an issue with locking methods that have a + * high overhead. + * + * Status: TODO: Needs to be proposed for upstream. + */ +/* + */ +#define UMM_LIGHTWEIGHT_CPU + +#ifdef UMM_LIGHTWEIGHT_CPU +#define UMM_CRITICAL_SUSPEND(tag) UMM_CRITICAL_EXIT(tag) +#define UMM_CRITICAL_RESUME(tag) UMM_CRITICAL_ENTRY(tag) +#else +#define UMM_CRITICAL_SUSPEND(tag) do {} while(0) +#define UMM_CRITICAL_RESUME(tag) do {} while(0) +#endif + +/* + * -D UMM_REALLOC_MINIMIZE_COPY or + * -D UMM_REALLOC_DEFRAG + * + * Pick one of these two stratagies. UMM_REALLOC_MINIMIZE_COPY grows upward or + * shrinks an allocation, avoiding copy when possible. UMM_REALLOC_DEFRAG gives + * priority with growing the revised allocation toward an adjacent hole in the + * direction of the beginning of the heap when possible. + * + * Status: TODO: These are new options introduced to optionally restore the + * previous defrag propery of realloc. The issue has been raised in the upstream + * repo. No response at this time. Based on response, may propose for upstream. + */ +/* +#define UMM_REALLOC_MINIMIZE_COPY +*/ +#define UMM_REALLOC_DEFRAG + /* * -D UMM_INTEGRITY_CHECK : * @@ -155,12 +449,28 @@ extern char _heap_start[]; * 4 bytes, so there might be some trailing "extra" bytes which are not checked * for corruption. */ -/* -#define UMM_INTEGRITY_CHECK -*/ /* - * -D UMM_POISON : + * Not normally enabled. Full intergity check may exceed 10us. + */ +/* +#define UMM_INTEGRITY_CHECK + */ + +#ifdef UMM_INTEGRITY_CHECK + int umm_integrity_check( void ); +# define INTEGRITY_CHECK() umm_integrity_check() + extern void umm_corruption(void); +# define UMM_HEAP_CORRUPTION_CB() DBGLOG_FUNCTION( "Heap Corruption!" ) +#else +# define INTEGRITY_CHECK() 0 +#endif + +///////////////////////////////////////////////// + +/* + * -D UMM_POISON_CHECK : + * -D UMM_POISON_CHECK_LITE * * Enables heap poisoning: add predefined value (poison) before and after each * allocation, and check before each heap operation that no poison is @@ -185,17 +495,135 @@ extern char _heap_start[]; * * If poison corruption is detected, the message is printed and user-provided * callback is called: `UMM_HEAP_CORRUPTION_CB()` + * + * UMM_POISON_CHECK - does a global heap check on all active allocation at + * every alloc API call. May exceed 10us due to critical section with IRQs + * disabled. + * + * UMM_POISON_CHECK_LITE - checks the allocation presented at realloc() + * and free(). Expands the poison check on the current allocation to + * include its nearest allocated neighbors in the heap. + * umm_malloc() will also checks the neighbors of the selected allocation + * before use. + * + * Status: TODO?: UMM_POISON_CHECK_LITE is a new option. We could propose for + * upstream; however, the upstream version has much of the framework for calling + * poison check on each alloc call refactored out. Not sure how this will be + * received. */ +/* + * Compatibility for deprecated UMM_POISON + */ +#if defined(UMM_POISON) && !defined(UMM_POISON_CHECK) +#define UMM_POISON_CHECK_LITE +#endif + #if defined(DEBUG_ESP_PORT) || defined(DEBUG_ESP_CORE) -#define UMM_POISON +#if !defined(UMM_POISON_CHECK) && !defined(UMM_POISON_CHECK_LITE) +/* +#define UMM_POISON_CHECK + */ + #define UMM_POISON_CHECK_LITE +#endif #endif #define UMM_POISON_SIZE_BEFORE 4 -#define UMM_POISON_SIZE_AFTER 4 +#define UMM_POISON_SIZE_AFTER 4 #define UMM_POISONED_BLOCK_LEN_TYPE uint32_t -#define UMM_HEAP_CORRUPTION_CB() panic() +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) + void *umm_poison_malloc( size_t size ); + void *umm_poison_calloc( size_t num, size_t size ); + void *umm_poison_realloc( void *ptr, size_t size ); + void umm_poison_free( void *ptr ); + int umm_poison_check( void ); + // Local Additions to better report location in code of the caller. + void *umm_poison_realloc_fl( void *ptr, size_t size, const char* file, int line ); + void umm_poison_free_fl( void *ptr, const char* file, int line ); + #if defined(UMM_POISON_CHECK_LITE) + /* + * We can safely do individual poison checks at free and realloc and stay + * under 10us or close. + */ + # define POISON_CHECK() 1 + # define POISON_CHECK_NEIGHBORS(c) \ + do {\ + if(!check_poison_neighbors(c)) \ + panic();\ + } while(false) + #else + /* Not normally enabled. A full heap poison check may exceed 10us. */ + # define POISON_CHECK() umm_poison_check() + # define POISON_CHECK_NEIGHBORS(c) do{}while(false) + #endif +#else +# define POISON_CHECK() 1 +# define POISON_CHECK_NEIGHBORS(c) do{}while(false) +#endif + +///////////////////////////////////////////////// +#undef DBGLOG_FUNCTION +#undef DBGLOG_FUNCTION_P + +#if defined(DEBUG_ESP_PORT) || defined(DEBUG_ESP_OOM) || \ + defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) || \ + defined(UMM_INTEGRITY_CHECK) +#define DBGLOG_FUNCTION(fmt, ...) ets_uart_printf(fmt, ##__VA_ARGS__) +#else +#define DBGLOG_FUNCTION(fmt, ...) do { (void)fmt; } while(false) +#endif + +///////////////////////////////////////////////// + +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) || defined(UMM_INTEGRITY_CHECK) +#if !defined(DBGLOG_LEVEL) || DBGLOG_LEVEL < 3 +// All debug prints in UMM_POISON_CHECK are level 3 +#undef DBGLOG_LEVEL +#define DBGLOG_LEVEL 3 +#endif +#endif + +#if defined(UMM_CRITICAL_METRICS) +struct UMM_TIME_STATS_t { + UMM_TIME_STAT id_malloc; + UMM_TIME_STAT id_realloc; + UMM_TIME_STAT id_free; +#ifdef UMM_INFO + UMM_TIME_STAT id_info; +#endif +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) + UMM_TIME_STAT id_poison; +#endif +#ifdef UMM_INTEGRITY_CHECK + UMM_TIME_STAT id_integrity; +#endif + UMM_TIME_STAT id_no_tag; +}; +#endif +///////////////////////////////////////////////// +#ifdef DEBUG_ESP_OOM + +#define MEMLEAK_DEBUG + +// umm_*alloc are not renamed to *alloc +// Assumes umm_malloc.h has already been included. + +#define umm_zalloc(s) umm_calloc(1,s) + +void* malloc_loc (size_t s, const char* file, int line); +void* calloc_loc (size_t n, size_t s, const char* file, int line); +void* realloc_loc (void* p, size_t s, const char* file, int line); +// *alloc are macro calling *alloc_loc calling+checking umm_*alloc() +// they are defined at the bottom of this file + +///////////////////////////////////////////////// + +#elif defined(UMM_POISON_CHECK) +void* realloc_loc (void* p, size_t s, const char* file, int line); +void free_loc (void* p, const char* file, int line); +#else // !defined(ESP_DEBUG_OOM) +#endif #ifdef __cplusplus } @@ -203,12 +631,57 @@ extern char _heap_start[]; #endif /* _UMM_MALLOC_CFG_H */ +#ifdef __cplusplus +extern "C" { +#endif #ifdef DEBUG_ESP_OOM // this must be outside from "#ifndef _UMM_MALLOC_CFG_H" // because Arduino.h's does #undef *alloc // Arduino.h recall us to redefine them #include -#define malloc(s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; malloc_loc(s, mem_debug_file, __LINE__); }) -#define calloc(n,s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; calloc_loc(n, s, mem_debug_file, __LINE__); }) -#define realloc(p,s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; realloc_loc(p, s, mem_debug_file, __LINE__); }) +// Reuse pvPort* calls, since they already support passing location information. +void* ICACHE_RAM_ATTR pvPortMalloc(size_t size, const char* file, int line); +void* ICACHE_RAM_ATTR pvPortCalloc(size_t count, size_t size, const char* file, int line); +void* ICACHE_RAM_ATTR pvPortRealloc(void *ptr, size_t size, const char* file, int line); +void* ICACHE_RAM_ATTR pvPortZalloc(size_t size, const char* file, int line); +void ICACHE_RAM_ATTR vPortFree(void *ptr, const char* file, int line); + +#define malloc(s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; pvPortMalloc(s, mem_debug_file, __LINE__); }) +#define calloc(n,s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; pvPortCalloc(n, s, mem_debug_file, __LINE__); }) +#define realloc(p,s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; pvPortRealloc(p, s, mem_debug_file, __LINE__); }) + +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) +#define dbg_heap_free(p) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; vPortFree(p, mem_debug_file, __LINE__); }) +#else +#define dbg_heap_free(p) free(p) +#endif + +#elif defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) +#include +void* ICACHE_RAM_ATTR pvPortRealloc(void *ptr, size_t size, const char* file, int line); +#define realloc(p,s) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; pvPortRealloc(p, s, mem_debug_file, __LINE__); }) + +void ICACHE_RAM_ATTR vPortFree(void *ptr, const char* file, int line); +//C - to be discussed +/* + Problem, I would like to report the file and line number with the umm poison + event as close as possible to the event. The #define method works for malloc, + calloc, and realloc those names are not as generic as free. A #define free + captures too much. Classes with methods called free are included :( + Inline functions would report the address of the inline function in the .h + not where they are called. + + Anybody know a trick to make this work? + + Create dbg_heap_free() as an alternative for free() when you need a little + more help in debugging the more challenging problems. +*/ +#define dbg_heap_free(p) ({ static const char mem_debug_file[] PROGMEM STORE_ATTR = __FILE__; vPortFree(p, mem_debug_file, __LINE__); }) + +#else +#define dbg_heap_free(p) free(p) #endif /* DEBUG_ESP_OOM */ + +#ifdef __cplusplus +} +#endif diff --git a/cores/esp8266/umm_malloc/umm_performance.cpp b/cores/esp8266/umm_malloc/umm_performance.cpp deleted file mode 100644 index b2417b02e..000000000 --- a/cores/esp8266/umm_malloc/umm_performance.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * umm_malloc performance measurments and ESP specifics - */ - -#include -#include -#include -#include -#include "umm_performance.h" -#include "umm_stats.h" - -extern "C" { - -UMM_STATS ummStats = {0, 0, 0, 0}; - -#ifdef UMM_CRITICAL_PERIOD_ANALYZE -struct _UMM_TIME_STATS time_stats = { - {0xFFFFFFFF, 0U, 0U, 0U}, - {0xFFFFFFFF, 0U, 0U, 0U}, - {0xFFFFFFFF, 0U, 0U, 0U}, - {0xFFFFFFFF, 0U, 0U, 0U} }; - -bool ICACHE_FLASH_ATTR get_umm_get_perf_data(struct _UMM_TIME_STATS *p, size_t size) { - if (p && sizeof(time_stats) == size) { - uint32_t save_ps = xt_rsil(DEFAULT_CRITICAL_SECTION_INTLEVEL); - memcpy(p, &time_stats, size); - xt_wsr_ps(save_ps); - return true; - } - return false; -} -#endif - -#if defined(DEBUG_ESP_PORT) || defined(DEBUG_ESP_ISR) -/* - Printing from the malloc routines is tricky. Since a lot of library calls - will want to do malloc. - - Objective: To be able to print "last gasp" diagnostic messages - when interrupts are disabled and w/o availability of heap resources. -*/ -int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2))); -int ICACHE_RAM_ATTR _isr_safe_printf_P(const char *fmt, ...) { - /* - To use ets_strlen() and ets_memcpy() safely with PROGMEM, flash storage, - the PROGMEM address must be word (4 bytes) aligned. The destination - address for ets_memcpy must also be word-aligned. We also round the - buf_len up to the nearest word boundary. So that all transfers will be - whole words. - */ - size_t str_len = ets_strlen(fmt); - size_t buf_len = (str_len + 1 + 3) & ~0x03U; - char ram_buf[buf_len] __attribute__ ((aligned(4))); - ets_memcpy(ram_buf, fmt, buf_len); - va_list argPtr; - va_start(argPtr, fmt); - int result = ets_vprintf(ets_uart_putc1, ram_buf, argPtr); - va_end(argPtr); - return result; -} - -#endif - -}; diff --git a/cores/esp8266/umm_malloc/umm_performance.h b/cores/esp8266/umm_malloc/umm_performance.h deleted file mode 100644 index 5d6ae24c6..000000000 --- a/cores/esp8266/umm_malloc/umm_performance.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * umm_malloc performance measurments and ESP specifics - */ - -#ifndef _UMM_PERFORMANCE_H -#define _UMM_PERFORMANCE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * -D UMM_CRITICAL_PERIOD_ANALYZE : - * - * Build option to collect timing usage data on critical section usage in - * functions: info, malloc, realloc. Collects MIN, MAX, and number of time - * IRQs were disabled at request time. Note, for realloc MAX disabled time - * will not include the time from calling malloc and/or free. - * Examine code for specifics on what info is available and how to access. -*/ -// #define UMM_CRITICAL_PERIOD_ANALYZE - - -/* - Per Devyte, the core currently doesn't support masking a specific interrupt - level. That doesn't mean it can't be implemented, only that at this time - locking is implemented as all or nothing. - https://github.com/esp8266/Arduino/issues/6246#issuecomment-508612609 - - So for now we default to all, 15. - */ -#ifndef DEFAULT_CRITICAL_SECTION_INTLEVEL -#define DEFAULT_CRITICAL_SECTION_INTLEVEL 15 -#endif - -#if defined(UMM_CRITICAL_PERIOD_ANALYZE) -// This option adds support for gathering time locked data -typedef struct _TIME_STAT { - uint32_t min; - uint32_t max; - uint32_t start; - uint32_t intlevel; -} time_stat_t; - -struct _UMM_TIME_STATS { - time_stat_t id_malloc; - time_stat_t id_realloc; - time_stat_t id_free; - time_stat_t id_info; -}; - -extern struct _UMM_TIME_STATS time_stats; - -bool get_umm_get_perf_data(struct _UMM_TIME_STATS *p, size_t size); - -static inline void _critical_entry(time_stat_t *p, uint32_t *saved_ps) { - *saved_ps = xt_rsil(DEFAULT_CRITICAL_SECTION_INTLEVEL); - if (0U != (*saved_ps & 0x0FU)) { - p->intlevel += 1U; - } - - p->start = esp_get_cycle_count(); -} - -static inline void _critical_exit(time_stat_t *p, uint32_t *saved_ps) { - uint32_t elapse = esp_get_cycle_count() - p->start; - if (elapse < p->min) - p->min = elapse; - - if (elapse > p->max) - p->max = elapse; - - xt_wsr_ps(*saved_ps); -} -#endif - -#if defined(DEBUG_ESP_PORT) || defined(DEBUG_ESP_ISR) -int _isr_safe_printf_P(const char *fmt, ...) __attribute__((format(printf, 1, 2))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _UMM_PERFORMANCE_H */ diff --git a/cores/esp8266/umm_malloc/umm_poison.c b/cores/esp8266/umm_malloc/umm_poison.c new file mode 100644 index 000000000..760ce1802 --- /dev/null +++ b/cores/esp8266/umm_malloc/umm_poison.c @@ -0,0 +1,241 @@ +#if defined(BUILD_UMM_MALLOC_C) + +/* poisoning (UMM_POISON_CHECK) {{{ */ +#if defined(UMM_POISON_CHECK) || defined(UMM_POISON_CHECK_LITE) +#define POISON_BYTE (0xa5) + +/* + * Yields a size of the poison for the block of size `s`. + * If `s` is 0, returns 0. + */ +static size_t poison_size(size_t s) { + return(s ? (UMM_POISON_SIZE_BEFORE + + sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + + UMM_POISON_SIZE_AFTER) + : 0); +} + +/* + * Print memory contents starting from given `ptr` + */ +static void dump_mem ( const unsigned char *ptr, size_t len ) { + while (len--) { + DBGLOG_ERROR(" 0x%.2x", (unsigned int)(*ptr++)); + } +} + +/* + * Put poison data at given `ptr` and `poison_size` + */ +static void put_poison( unsigned char *ptr, size_t poison_size ) { + memset(ptr, POISON_BYTE, poison_size); +} + +/* + * Check poison data at given `ptr` and `poison_size`. `where` is a pointer to + * a string, either "before" or "after", meaning, before or after the block. + * + * If poison is there, returns 1. + * Otherwise, prints the appropriate message, and returns 0. + */ +static int check_poison( const unsigned char *ptr, size_t poison_size, + const char *where) { + size_t i; + int ok = 1; + + for (i = 0; i < poison_size; i++) { + if (ptr[i] != POISON_BYTE) { + ok = 0; + break; + } + } + + if (!ok) { + DBGLOG_ERROR( "No poison %s block at: 0x%lx, actual data:", where, (unsigned long)ptr); + dump_mem(ptr, poison_size); + DBGLOG_ERROR( "\n" ); + } + + return ok; +} + +/* + * Check if a block is properly poisoned. Must be called only for non-free + * blocks. + */ +static int check_poison_block( umm_block *pblock ) { + int ok = 1; + + if (pblock->header.used.next & UMM_FREELIST_MASK) { + DBGLOG_ERROR( "check_poison_block is called for free block 0x%lx\n", (unsigned long)pblock); + } else { + /* the block is used; let's check poison */ + unsigned char *pc = (unsigned char *)pblock->body.data; + unsigned char *pc_cur; + + pc_cur = pc + sizeof(UMM_POISONED_BLOCK_LEN_TYPE); + if (!check_poison(pc_cur, UMM_POISON_SIZE_BEFORE, "before")) { + ok = 0; + goto clean; + } + + pc_cur = pc + *((UMM_POISONED_BLOCK_LEN_TYPE *)pc) - UMM_POISON_SIZE_AFTER; + if (!check_poison(pc_cur, UMM_POISON_SIZE_AFTER, "after")) { + ok = 0; + goto clean; + } + } + +clean: + return ok; +} + +/* + * Takes a pointer returned by actual allocator function (`umm_malloc` or + * `umm_realloc`), puts appropriate poison, and returns adjusted pointer that + * should be returned to the user. + * + * `size_w_poison` is a size of the whole block, including a poison. + */ +static void *get_poisoned( void *v_ptr, size_t size_w_poison ) { + unsigned char *ptr = (unsigned char *)v_ptr; + + if (size_w_poison != 0 && ptr != NULL) { + + /* Poison beginning and the end of the allocated chunk */ + put_poison(ptr + sizeof(UMM_POISONED_BLOCK_LEN_TYPE), + UMM_POISON_SIZE_BEFORE); + put_poison(ptr + size_w_poison - UMM_POISON_SIZE_AFTER, + UMM_POISON_SIZE_AFTER); + + /* Put exact length of the user's chunk of memory */ + *(UMM_POISONED_BLOCK_LEN_TYPE *)ptr = (UMM_POISONED_BLOCK_LEN_TYPE)size_w_poison; + + /* Return pointer at the first non-poisoned byte */ + ptr += sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE; + } + + return (void *)ptr; +} + +/* + * Takes "poisoned" pointer (i.e. pointer returned from `get_poisoned()`), + * and checks that the poison of this particular block is still there. + * + * Returns unpoisoned pointer, i.e. actual pointer to the allocated memory. + */ +static void *get_unpoisoned( void *v_ptr ) { + unsigned char *ptr = (unsigned char *)v_ptr; + + if (ptr != NULL) { + unsigned short int c; + + ptr -= (sizeof(UMM_POISONED_BLOCK_LEN_TYPE) + UMM_POISON_SIZE_BEFORE); + + /* Figure out which block we're in. Note the use of truncated division... */ + c = (((char *)ptr)-(char *)(&(umm_heap[0])))/sizeof(umm_block); + + check_poison_block(&UMM_BLOCK(c)); + } + + return (void *)ptr; +} + +/* }}} */ + +/* ------------------------------------------------------------------------ */ + +void *umm_poison_malloc( size_t size ) { + void *ret; + + size += poison_size(size); + + ret = umm_malloc( size ); + + ret = get_poisoned(ret, size); + + return ret; +} + +/* ------------------------------------------------------------------------ */ + +void *umm_poison_calloc( size_t num, size_t item_size ) { + void *ret; + size_t size = item_size * num; + + size += poison_size(size); + + ret = umm_malloc(size); + + if (NULL != ret) + memset(ret, 0x00, size); + + ret = get_poisoned(ret, size); + + return ret; +} + +/* ------------------------------------------------------------------------ */ + +void *umm_poison_realloc( void *ptr, size_t size ) { + void *ret; + + ptr = get_unpoisoned(ptr); + + size += poison_size(size); + ret = umm_realloc( ptr, size ); + + ret = get_poisoned(ret, size); + + return ret; +} + +/* ------------------------------------------------------------------------ */ + +void umm_poison_free( void *ptr ) { + + ptr = get_unpoisoned(ptr); + + umm_free( ptr ); +} + +/* + * Iterates through all blocks in the heap, and checks poison for all used + * blocks. + */ + +int umm_poison_check(void) { + UMM_CRITICAL_DECL(id_poison); + int ok = 1; + unsigned short int cur; + + if (umm_heap == NULL) { + umm_init(); + } + + UMM_CRITICAL_ENTRY(id_poison); + + /* Now iterate through the blocks list */ + cur = UMM_NBLOCK(0) & UMM_BLOCKNO_MASK; + + while( UMM_NBLOCK(cur) & UMM_BLOCKNO_MASK ) { + if ( !(UMM_NBLOCK(cur) & UMM_FREELIST_MASK) ) { + /* This is a used block (not free), so, check its poison */ + ok = check_poison_block(&UMM_BLOCK(cur)); + if (!ok){ + break; + } + } + + cur = UMM_NBLOCK(cur) & UMM_BLOCKNO_MASK; + } + UMM_CRITICAL_EXIT(id_poison); + + return ok; +} + +/* ------------------------------------------------------------------------ */ + +#endif + +#endif // defined(BUILD_UMM_MALLOC_C) diff --git a/cores/esp8266/umm_malloc/umm_stats.h b/cores/esp8266/umm_malloc/umm_stats.h deleted file mode 100644 index f2aae9875..000000000 --- a/cores/esp8266/umm_malloc/umm_stats.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * umm_malloc heap statistics - */ - -#ifndef _UMM_STATS_H -#define _UMM_STATS_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct UMM_STATS_t { - unsigned short int free_blocks; - unsigned short int free_blocks_min; - size_t alloc_max_size; - size_t oom_count; -} UMM_STATS; -extern UMM_STATS ummStats; - -size_t ICACHE_FLASH_ATTR umm_free_heap_size_min( void ); -size_t ICACHE_FLASH_ATTR umm_free_heap_size_min_reset( void ); - -inline size_t umm_get_max_alloc_size( void ) { - return ummStats.alloc_max_size; -} - -inline size_t umm_get_oom_count( void ) { - return ummStats.oom_count; -} - - -#ifdef __cplusplus -} -#endif - -#endif /* _UMM_STATS_H */ From dd73a1885e7692716705da175768d43af557d4e4 Mon Sep 17 00:00:00 2001 From: Jason2866 Date: Tue, 29 Oct 2019 13:45:41 +0100 Subject: [PATCH 58/58] Remove non-ASCII or non-UTF8 character (#6687) Newer version of Platformio generates a warning --- libraries/ESP8266HTTPUpdateServer/library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266HTTPUpdateServer/library.properties b/libraries/ESP8266HTTPUpdateServer/library.properties index b52b2e26f..0505141f9 100644 --- a/libraries/ESP8266HTTPUpdateServer/library.properties +++ b/libraries/ESP8266HTTPUpdateServer/library.properties @@ -1,6 +1,6 @@ name=ESP8266HTTPUpdateServer version=1.0 -author=Ivan Grokhotkov, Miguel Ángel Ajo +author=Ivan Grokhotkov, Miguel Angel Ajo maintainer=Ivan Grokhtkov sentence=Simple HTTP Update server based on the ESP8266WebServer paragraph=The library accepts HTTP post requests to the /update url, and updates the ESP8266 firmware.