diff --git a/build_legacy.sh b/build_legacy.sh index 8a58791a7..d37bbd810 100755 --- a/build_legacy.sh +++ b/build_legacy.sh @@ -504,6 +504,7 @@ for section, options in data: Heltec_ct62_companion_radio_ble Meshadventurer_sx1262_companion_radio_ble Meshadventurer_companion_radio_ble + Meshadventurer_m33s_companion_radio_ble Meshadventurer_sx1268_companion_radio_ble Heltec_Wireless_Paper_companion_radio_ble Heltec_E213_companion_radio_ble @@ -1404,6 +1405,10 @@ get_env_metadata() { board_family="$IKOKA_HANDHELD_NRF_BOARD_FAMILY" board_modifier="096" ;; + ikoka_handheld_nrf_e22_33dbm_096|ikoka_handheld_nrf_e22_400m33s_096) + board_family=${board_part%_096} + board_modifier="096" + ;; ikoka_handheld_nrf) board_family="$IKOKA_HANDHELD_NRF_BOARD_FAMILY" board_modifier="" @@ -3114,10 +3119,12 @@ requires_dram_limited_neighbors() { # Full sensors plus both OTA backends retain the board's original # 50-neighbor table so the fixed mOTA RAM arena has usable heap. return 0 ;; + generic_e22_m33s_repeater_lora_ota_no_external_sensors|\ generic_e22_repeater_lora_ota_no_external_sensors|\ generic_e22_sx1262_repeater_lora_ota_no_external_sensors|\ generic_e22_sx1268_repeater_lora_ota_no_external_sensors|\ heltec_v2_repeater_lora_ota_no_external_sensors|\ + meshadventurer_m33s_repeater_lora_ota_no_external_sensors|\ meshadventurer_repeater_lora_ota_no_external_sensors|\ meshadventurer_sx1262_repeater_lora_ota_no_external_sensors|\ meshadventurer_sx1268_repeater_lora_ota_no_external_sensors|\ @@ -3125,6 +3132,7 @@ requires_dram_limited_neighbors() { tbeam_sx1262_repeater_lora_ota_no_external_sensors|\ tbeam_sx1276_repeater_lora_ota_no_external_sensors) return 0 ;; + generic_e22_m33s_repeater|meshadventurer_m33s_repeater|\ generic_e22_repeater|generic_e22_sx1262_repeater|generic_e22_sx1268_repeater|\ heltec_v2_repeater|meshadventurer_repeater|meshadventurer_sx1262_repeater|\ meshadventurer_sx1268_repeater|tbeam_repeater|tbeam_sx1262_repeater|\ @@ -3138,7 +3146,9 @@ requires_dram_limited_neighbors() { if [ "$ESP32_FULL_BUILD" = "1" ] \ && [ "${PACKET_LOGGING_OVERRIDE,,}" = "on" ]; then case "${1,,}" in - generic_e22_repeater_bridge_espnow \ + generic_e22_m33s_repeater_bridge_espnow \ + |meshadventurer_m33s_repeater_bridge_espnow \ + |generic_e22_repeater_bridge_espnow \ |generic_e22_sx1262_repeater_bridge_espnow \ |generic_e22_sx1268_repeater_bridge_espnow \ |heltec_v2_repeater_bridge_espnow \ @@ -3950,6 +3960,8 @@ apply_esp32_full_size_profile() { record_build_reduction \ "mesh.flood_rules limited to 31 by measured internal DRAM; complete rule engine retained" ;; + generic_e22_m33s_repeater_bridge_espnow|\ + meshadventurer_m33s_repeater_bridge_espnow|\ generic_e22_repeater_bridge_espnow|\ generic_e22_sx1262_repeater_bridge_espnow|\ generic_e22_sx1268_repeater_bridge_espnow|\ @@ -4681,6 +4693,7 @@ apply_companion_radio_full_profile() { record_build_reduction \ "display.canvas limited to 320x320 internal pixels, scaled to the 480x480 panel; 350 contacts, 512 queued frames and all Full transports retained" ;; + meshadventurer_m33s_companion_radio_full|\ meshadventurer_companion_radio_full|\ meshadventurer_sx1262_companion_radio_full|\ meshadventurer_sx1268_companion_radio_full) @@ -4715,10 +4728,26 @@ apply_companion_radio_full_profile() { } apply_radio_overrides() { + local target=${1:-} + target=${target,,} + local frequency=$RADIO_FREQ_OVERRIDE + local low_band=0 + # The 400M33S PA and SX1268 cannot use the ordinary 900 MHz preset. Keep + # an explicitly selected valid low-band frequency; otherwise start at 433. + case "$target" in + *_400m33s_*) + low_band=1 + if [ -n "$frequency" ] && ! python3 -c 'import sys; sys.exit(0 if 410 <= float(sys.argv[1]) <= 493 else 1)' "$frequency"; then + frequency=433 + echo "${1}: using 433 MHz for the fitted E22-400M33S (900 MHz preset is incompatible)." + fi + ;; + esac if [ -n "$RADIO_FREQ_OVERRIDE" ] && [ -n "$RADIO_BW_OVERRIDE" ] && [ -n "$RADIO_SF_OVERRIDE" ] && [ -n "$RADIO_CR_OVERRIDE" ]; then - export PLATFORMIO_BUILD_FLAGS="${PLATFORMIO_BUILD_FLAGS} -DLORA_FREQ=${RADIO_FREQ_OVERRIDE} -DLORA_BW=${RADIO_BW_OVERRIDE} -DLORA_SF=${RADIO_SF_OVERRIDE} -DLORA_CR=${RADIO_CR_OVERRIDE}" - if [ "$RADIO_SETTING_TITLE" = "$USA_CASCADIA_RADIO_TITLE" ] \ - || is_usa_cascadia_radio_title "$RADIO_SETTING_TITLE"; then + export PLATFORMIO_BUILD_FLAGS="${PLATFORMIO_BUILD_FLAGS} -DLORA_FREQ=${frequency} -DLORA_BW=${RADIO_BW_OVERRIDE} -DLORA_SF=${RADIO_SF_OVERRIDE} -DLORA_CR=${RADIO_CR_OVERRIDE}" + if [ "$low_band" = 0 ] \ + && { [ "$RADIO_SETTING_TITLE" = "$USA_CASCADIA_RADIO_TITLE" ] \ + || is_usa_cascadia_radio_title "$RADIO_SETTING_TITLE"; }; then export PLATFORMIO_BUILD_FLAGS="${PLATFORMIO_BUILD_FLAGS} -DMESHCORE_USA_RADIO_PRESET=1" fi fi @@ -5585,7 +5614,7 @@ build_firmware_one_profile() { apply_nrf52_size_profile "$env_name" apply_lora_ota_no_external_sensors_profile "$env_name" apply_rak4631_rak15002_sd_store_profile "$env_name" - apply_radio_overrides + apply_radio_overrides "$env_name" apply_firmware_profile_overrides # Full LoRa images retain their normal role while a connected host uses # an explicitly enabled raw radio2 KISS session. Reduced profiles omit it. diff --git a/docs/_javascript/firmware_picker.js b/docs/_javascript/firmware_picker.js index f915034c7..796a9c7d9 100644 --- a/docs/_javascript/firmware_picker.js +++ b/docs/_javascript/firmware_picker.js @@ -175,10 +175,27 @@ profiles: profiles, unavailableProfiles: unavailableProfiles }; } + // Only the MCU, flash wiring and application layout are shared here. + // Firmware/OTA hardware identities and PA drive limits stay distinct. + const BOOTLOADER_HARDWARE = Object.freeze({ + ProMicro_m33s: "ProMicro", + ProMicro_400m33s: "ProMicro", + Xiao_nrf52_m33s: "Xiao_nrf52", + Xiao_nrf52_400m33s: "Xiao_nrf52", + ikoka_handheld_nrf_e22_33dbm: "Xiao_nrf52", + ikoka_handheld_nrf_e22_33dbm_096: "Xiao_nrf52", + ikoka_handheld_nrf_e22_400m33s: "Xiao_nrf52", + ikoka_handheld_nrf_e22_400m33s_096: "Xiao_nrf52", + ikoka_nano_nrf_400m33s: "Xiao_nrf52", + ikoka_stick_nrf_400m33s: "Xiao_nrf52", + solarxiao_400M33S: "Xiao_nrf52", + }); + function bootloaderForHardware(catalog, hardware, chipFamily) { if (!catalog || chipFamily !== "nrf52" || !hardware) return null; + const bootHardware = BOOTLOADER_HARDWARE[hardware] || hardware; const matches = catalog.profiles.filter(function (profile) { - return profile.meshcoreHardware.includes(hardware); + return profile.meshcoreHardware.includes(bootHardware); }); return matches.length === 1 ? matches[0] : null; } @@ -228,7 +245,10 @@ "xiao_nrf52", "ikoka_handheld_nrf_e22_30dbm", "ikoka_nano_nrf_22dbm", "ikoka_nano_nrf_30dbm", "ikoka_nano_nrf_33dbm", "ikoka_stick_nrf_22dbm", "ikoka_stick_nrf_30dbm", "ikoka_stick_nrf_33dbm", - "solarxiao_30s", "solarxiao_33s", "lilygo_t-echo-lite", + "solarxiao_30s", "solarxiao_33s", "solarxiao_400m33s", "lilygo_t-echo-lite", + "xiao_nrf52_m33s", "xiao_nrf52_400m33s", + "ikoka_handheld_nrf_e22_33dbm", "ikoka_handheld_nrf_e22_400m33s", + "ikoka_nano_nrf_400m33s", "ikoka_stick_nrf_400m33s", ].concat(QSPI_REPEATER_ALIAS_HARDWARE)); let pickerInstanceCount = 0; @@ -841,7 +861,9 @@ ["Tbeam", ["Tbeam_SX1262", "Tbeam_SX1276"]], ["LilyGo_T3S3", ["LilyGo_T3S3_sx1262", "LilyGo_T3S3_sx1276"]], ["Generic_E22", ["Generic_E22_sx1262", "Generic_E22_sx1268"]], + ["Generic_E22_m33s", []], ["Meshadventurer", ["Meshadventurer_sx1262", "Meshadventurer_sx1268"]], + ["Meshadventurer_m33s", []], ["Tenstar_C3", ["Tenstar_C3_sx1262", "Tenstar_C3_sx1268"]], ["muzi_base", ["muzi_base_uno", "muzi_base_duo", "muzi_base_uno_superIO", "muzi_base_duo_superIO"], "NRF52_PLATFORM"], ]; @@ -2087,6 +2109,14 @@ const target = targetWithoutBootloader(profile.target); const info = profile.controls || {}; const notes = []; + const moduleHardware = String(profile && profile.hardware || "").toLowerCase(); + if (/(?:m33s|_33dbm|solarxiao_33s)/.test(moduleHardware)) { + const drive = /^ikoka_(?:nano|stick)_nrf_33dbm$/.test(moduleHardware) ? "9" : "8"; + notes.push("M33S amplifier profile: " + drive + " dBm maximum chip drive, not RF output. Match the fitted module; ordinary 22 dBm or M30S firmware is unsuitable."); + } + if (moduleHardware.includes("400m33s")) { + notes.push("E22-400M33S / SX1268: starts at 433 MHz. The USA 900 MHz preset is incompatible; keep the matching low-band module and application identity."); + } if (autoRadioProfile(profile)) { notes.push("This image detects the fitted radio at startup. Choose the board and role; a separate radio-chip image is unnecessary."); notes.push(profile.hardware === "muzi_base" diff --git a/docs/e22_amplified_modules.md b/docs/e22_amplified_modules.md new file mode 100644 index 000000000..439579d1c --- /dev/null +++ b/docs/e22_amplified_modules.md @@ -0,0 +1,56 @@ +# Amplified E22 module selection + +The module marking matters. New M33S profiles and SolarXiao 33S limit the +radio chip drive to 8 dBm; existing Ikoka Nano/Stick 33 dBm profiles retain +their 9 dBm ceiling. These are amplifier input levels, not radiated output. +Do not select an ordinary 22 dBm or M30S image for an M33S module. Detection +of SX1262 versus SX1268 cannot identify an external amplifier or its safe +input level. + +These dedicated hardware prefixes keep the drive limit in every published +role, including Companion and KISS. Repeater and Room Server releases retain +the matching Full/Reduced sensor and LoRa OTA choices where supported. + +| Carrier wiring | 900 MHz M33S prefix | 400 MHz M33S prefix | +| --- | --- | --- | +| SolarXiao | `solarxiao_33S` | `solarxiao_400M33S` | +| Ikoka Nano nRF52 | `ikoka_nano_nrf_33dbm` | `ikoka_nano_nrf_400m33s` | +| Ikoka Stick nRF52 | `ikoka_stick_nrf_33dbm` | `ikoka_stick_nrf_400m33s` | +| Ikoka Handheld nRF52 | `ikoka_handheld_nrf_e22_33dbm` | `ikoka_handheld_nrf_e22_400m33s` | +| ProMicro nRF52840 | `ProMicro_m33s` | `ProMicro_400m33s` | +| XIAO nRF52840 | `Xiao_nrf52_m33s` | `Xiao_nrf52_400m33s` | +| Generic E22 ESP32 pinout | `Generic_E22_m33s` | Same image, detected SX1268 | +| Meshadventurer ESP32 pinout | `Meshadventurer_m33s` | Same image, detected SX1268 | + +The existing Ikoka Nano/Stick 900 MHz M33S images retain their 9 dBm ceiling. +All newly added M33S prefixes use the more conservative 8 dBm default and +ceiling. Saved settings above the ceiling are clamped before hardware writes. + +The named 400 MHz profiles start at 433 MHz and are separate from 900 MHz +application/OTA identities. USA Cascade release selection does not replace +their default with 910.525 MHz. The automatic ESP32 profiles detect the radio +family, start at 433 MHz for SX1268, and retain their +M33S drive ceiling on either chip. Set the frequency for your local network +and permitted band after installation. + +The bootloader is shared only where the MCU, flash wiring and application +layout match. The firmware picker maps the ProMicro profiles to the existing +ProMicro loader, and the XIAO-based profiles to the XIAO loader. Application +hardware and MOTA target IDs remain distinct; sharing a bootloader does not +make an M30S application safe for M33S hardware. + +MTL-1, MTL-2 and Ebytastic installations need their actual wiring checked +against the selected profile. These are matching radio-pin profiles, not a +claim that every carrier's display, GPS, battery monitor or other peripheral +is qualified. For example, a ProMicro radio pin match does not establish +Ebytastic peripheral compatibility. + +Module and carrier references: + +- [SolarXiao maker instructions](https://github.com/wehooper4/Meshtastic-Hardware/blob/main/XaioSeries/SolarXaio/readme.md) +- [Ikoka Handheld module choices](https://github.com/ndoo/ikoka-handheld-meshtastic-device#lora-module) +- [MTL-2 hardware](https://github.com/kt314-sh/MTL-2) +- [Ebytastic hardware](https://github.com/Sobollion/Ebytastic) + +A source-tree fix protects devices only after matching updated firmware is +installed. A low-output report alone does not establish amplifier damage. diff --git a/docs/faq.md b/docs/faq.md index 92c9cf40b..172329e93 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1014,9 +1014,12 @@ protect the initial startup. The named SolarXiao/Ikoka limits do not apply automatically to these other targets. The [Ikoka Handheld hardware](https://github.com/ndoo/ikoka-handheld-meshtastic-device#lora-module) -also accepts M33S modules, but the current Handheld firmware targets specify -M30S. Their 20 dBm drive setting is not suitable for an M33S-fitted Handheld; -that combination requires a separate matching firmware target. +also accepts M33S modules. Select its dedicated `e22_33dbm` or `e22_400m33s` +profile, which defaults to and enforces 8 dBm. Its M30S image uses 20 dBm +drive and is unsuitable for an M33S-fitted Handheld. Dedicated M33S profiles +also cover ProMicro, XIAO, Generic E22 and Meshadventurer wiring; see +[amplified E22 module selection](e22_amplified_modules.md). Check the carrier +pinout before using these DIY profiles. Ikoka Nano, Stick and Handheld 30 dBm targets also enforce their established 20 dBm chip-drive limit in every role. This is their amplifier distortion diff --git a/docs/solarxiao_power.md b/docs/solarxiao_power.md index 55d21a6ef..b20266256 100644 --- a/docs/solarxiao_power.md +++ b/docs/solarxiao_power.md @@ -129,6 +129,7 @@ Radio target and role selection remain separate from the power profile: | --- | --- | --- | | E22-900M30S | `solarxiao_30S_repeater` | `solarxiao_30S_room_server_lora_ota` | | E22-900M33S | `solarxiao_33S_repeater` | `solarxiao_33S_room_server_lora_ota` | +| E22-400M33S | `solarxiao_400M33S_repeater` | `solarxiao_400M33S_room_server_lora_ota` | All SolarXiao 33S firmware roles default to and enforce an 8 dBm chip-drive ceiling, including Companion and KISS. Higher saved power settings are clamped @@ -136,9 +137,11 @@ on startup. This follows the [board maker's M33S instructions](https://github.com/wehooper4/Meshtastic-Hardware/blob/main/XaioSeries/SolarXaio/readme.md); the setting is the drive into the amplifier, not the amplified RF output. -The maker also lists a 433 MHz E22-400M33S hardware option. The table above -describes the existing SX1262 firmware targets, not a qualification of that -SX1268 module. Match both the radio module and its frequency band. +The E22-400M33S recipes use SX1268 and start at 433 MHz. They retain the +8 dBm drive ceiling and have separate application and OTA identities from +the 900 MHz boards. Match both the radio module and its frequency band. +See [amplified E22 module selection](e22_amplified_modules.md) for the other +carrier profiles. All three power profiles work in these role builds. Room uses its existing onboard-QSPI OTA target, identity and application layout, with the matching diff --git a/scripts/consolidated_profiles.py b/scripts/consolidated_profiles.py index 4ffdda573..42454afca 100644 --- a/scripts/consolidated_profiles.py +++ b/scripts/consolidated_profiles.py @@ -44,8 +44,8 @@ SPECS = ( "MESH_RADIO_AUTO_SX127X": "0", "USE_SX1262": "1", "USE_SX1268": "1", "RADIO_CLASS": "UniversalLoRaRadio", "WRAPPER_CLASS": "UniversalLoRaRadio"}) for board, target in ( - ("esp32doit-devkit-v1", r"Generic_E22_(?:repeater(?:_bridge_espnow)?|kiss_modem)(?:_observer_mqtt)?"), - ("esp32doit-devkit-v1", r"Meshadventurer_(?:repeater(?:_bridge_espnow)?|room_server|kiss_modem|terminal_chat|companion_radio_(?:usb|ble|full))(?:_observer_mqtt)?"), + ("esp32doit-devkit-v1", r"Generic_E22_(?:m33s_)?(?:repeater(?:_bridge_espnow)?|kiss_modem)(?:_observer_mqtt)?"), + ("esp32doit-devkit-v1", r"Meshadventurer_(?:m33s_)?(?:repeater(?:_bridge_espnow)?|room_server|kiss_modem|terminal_chat|companion_radio_(?:usb|ble|full))(?:_observer_mqtt)?"), ("esp32-c3-devkitm-1", r"Tenstar_C3_(?:repeater(?:_bridge_espnow)?|kiss_modem)(?:_observer_mqtt)?"), )], dict(key="autoLoRaRadio", capability="radio.autodetect.sx1262_lr1121", @@ -116,6 +116,7 @@ RADIO_CAPACITY_MINIMUMS = { "tbeam": dict(MAX_CONTACTS=160, MAX_GROUP_CHANNELS=40, OFFLINE_QUEUE_SIZE=128), "lilygo_t3s3": dict(MAX_CONTACTS=350, MAX_GROUP_CHANNELS=40, OFFLINE_QUEUE_SIZE=512), "meshadventurer": dict(MAX_CONTACTS=160, MAX_GROUP_CHANNELS=40, OFFLINE_QUEUE_SIZE=128), + "meshadventurer_m33s": dict(MAX_CONTACTS=160, MAX_GROUP_CHANNELS=40, OFFLINE_QUEUE_SIZE=128), "muzi_base": dict(MAX_CONTACTS=350, MAX_GROUP_CHANNELS=40, OFFLINE_QUEUE_SIZE=256), } WM1110_CAPACITY_MINIMUMS = dict(MAX_CONTACTS=350, MAX_GROUP_CHANNELS=40, diff --git a/scripts/generate_mesh_america_release.py b/scripts/generate_mesh_america_release.py index 21b1dbc68..f627819d1 100644 --- a/scripts/generate_mesh_america_release.py +++ b/scripts/generate_mesh_america_release.py @@ -196,7 +196,12 @@ def generate(catalog, plan, family, records, profiles, repo): cap = next(name for name in row["files"] if name.endswith(".capabilities.json")) memory = next(name for name in row["files"] if name.endswith(".memory.json")) methods = ", ".join(row.get("ota_update_methods", [])) or "USB or board-specific wired programming" - notes = [f"Keymind Cascade MeshCore {plan['version']}. USA Cascade: 910.525 MHz / BW62.5 / SF7 / CR5. Saved radio settings take precedence.", + low_band = "_400m33s_" in row["target"].lower() + auto_m33 = parsed["hardware"] in ("Generic_E22_m33s", "Meshadventurer_m33s") + radio_defaults = ("433 MHz / BW62.5 / SF7 / CR5 (E22-400M33S)" if low_band + else "910.525 MHz for SX1262 / 433 MHz for SX1268, BW62.5 / SF7 / CR5" if auto_m33 + else "USA Cascade: 910.525 MHz / BW62.5 / SF7 / CR5") + notes = [f"Keymind Cascade MeshCore {plan['version']}. {radio_defaults}. Saved radio settings take precedence.", f"EXACT TARGET - {row['target']}. Match the exact board, radio, screen, and storage hardware.", f"PROFILE - {profile}. See the qualified capabilities and memory reports for this image.", f"SELF-UPDATE - Verified methods: {methods}."] diff --git a/scripts/nrf52_embedded_bootloader.py b/scripts/nrf52_embedded_bootloader.py index 7785ed152..aa0ecf107 100644 --- a/scripts/nrf52_embedded_bootloader.py +++ b/scripts/nrf52_embedded_bootloader.py @@ -52,12 +52,30 @@ def load_manifest(project=ROOT): return manifest +# A PA/module choice does not change the MCU bootloader or its flash wiring. +# This map must never be used for application hardware_id or MOTA target IDs. +BOOTLOADER_HARDWARE = { + "ProMicro_m33s": "ProMicro", + "ProMicro_400m33s": "ProMicro", + "Xiao_nrf52_m33s": "Xiao_nrf52", + "Xiao_nrf52_400m33s": "Xiao_nrf52", + "ikoka_handheld_nrf_e22_33dbm": "Xiao_nrf52", + "ikoka_handheld_nrf_e22_33dbm_096": "Xiao_nrf52", + "ikoka_handheld_nrf_e22_400m33s": "Xiao_nrf52", + "ikoka_handheld_nrf_e22_400m33s_096": "Xiao_nrf52", + "ikoka_nano_nrf_400m33s": "Xiao_nrf52", + "ikoka_stick_nrf_400m33s": "Xiao_nrf52", + "solarxiao_400M33S": "Xiao_nrf52", +} + + def select_profile(manifest, target): from generate_mesh_america_release import target_profiles parsed = target_profiles([target])[target] if parsed["role"] not in ("repeater", "room"): raise ValueError("embedded bootloader is limited to repeater and room-server roles") - names = {parsed["sourceHardware"], parsed["hardware"]} + names = {BOOTLOADER_HARDWARE.get(name, name) + for name in (parsed["sourceHardware"], parsed["hardware"])} if any(parsed["sourceHardware"] in item["meshcoreHardware"] for item in manifest.get("unavailableProfiles", ())): raise ValueError("this exact hardware has no qualified OTAFIX download") @@ -248,7 +266,8 @@ def emit_resource(project, target, output, *, flags=(), cppdefines=(), src_filte if linked_base is not None and linked_base != identity.app_base: raise ValueError("candidate SoftDevice base does not match the application linker") legacy = load_legacy(legacy_path) if legacy_path else None - stock_legacy = legacy_bootloaders_for(profile["id"], parsed["sourceHardware"], + stock_hardware = BOOTLOADER_HARDWARE.get(parsed["sourceHardware"], parsed["sourceHardware"]) + stock_legacy = legacy_bootloaders_for(profile["id"], stock_hardware, identity.app_base, identity.softdevice_fwid) if len(stock_legacy) > 32: raise ValueError("too many reviewed stock bootloader identities") diff --git a/scripts/package_cascade_release.py b/scripts/package_cascade_release.py index a556a0fd6..bcfe370c9 100644 --- a/scripts/package_cascade_release.py +++ b/scripts/package_cascade_release.py @@ -37,11 +37,13 @@ def is_companion(target): def embedded_stock_legacy_records(profile, parsed): """Read the stock inventory for the exact pinned replacement's S140 ABI.""" from nrf52_legacy_bootloaders import legacy_bootloaders_for + from nrf52_embedded_bootloader import BOOTLOADER_HARDWARE match = re.search(r"_s140_([0-9.]+)\.zip$", profile["files"]["zip"]["name"]) geometry = {"6.1.1": (0x26000, 0xB6), "7.3.0": (0x27000, 0x123)} if match is None or match[1] not in geometry: raise ValueError("unrecognized pinned embedded bootloader S140 geometry") - return legacy_bootloaders_for(profile["id"], parsed["sourceHardware"], *geometry[match[1]]) + hardware = BOOTLOADER_HARDWARE.get(parsed["sourceHardware"], parsed["sourceHardware"]) + return legacy_bootloaders_for(profile["id"], hardware, *geometry[match[1]]) def validate_embedded_stock_metadata(metadata, profile, parsed): diff --git a/scripts/qualify_nrf52_embedded_bootloader.py b/scripts/qualify_nrf52_embedded_bootloader.py index b38074d91..134e41bec 100644 --- a/scripts/qualify_nrf52_embedded_bootloader.py +++ b/scripts/qualify_nrf52_embedded_bootloader.py @@ -8,7 +8,7 @@ import sys import zipfile from nrf52_embedded_bootloader import (ROOT, BOOT_SIZE, VERSION, MANIFEST_SHA256, - LEGACY_SHA256, load_manifest, select_profile, download_zip, validate_candidate_zip) + LEGACY_SHA256, BOOTLOADER_HARDWARE, load_manifest, select_profile, download_zip, validate_candidate_zip) from nrf52_legacy_bootloaders import legacy_bootloaders_for sys.path.insert(0, str(ROOT / "tools/mota")) @@ -22,7 +22,8 @@ def qualify(directory, manifest_path): raise ValueError("embedded bootloader requires qualified nRF52 firmware") profile, parsed = select_profile(load_manifest(), manifest["target"]) candidate, identity = validate_candidate_zip(download_zip(profile, ROOT / ".pio/otafix-cache"), profile) - stock_legacy = legacy_bootloaders_for(profile["id"], parsed["sourceHardware"], + hardware = BOOTLOADER_HARDWARE.get(parsed["sourceHardware"], parsed["sourceHardware"]) + stock_legacy = legacy_bootloaders_for(profile["id"], hardware, identity.app_base, identity.softdevice_fwid) resource = directory / "bootloader-migration-resource" metadata = json.loads((resource / "BootloaderMigrationResource.json").read_text()) diff --git a/src/helpers/LoRaRadioFamily.h b/src/helpers/LoRaRadioFamily.h index 6b1c24e37..9083903c6 100644 --- a/src/helpers/LoRaRadioFamily.h +++ b/src/helpers/LoRaRadioFamily.h @@ -32,7 +32,12 @@ inline LoRaRadioFamily& autoLoRaRxPowerSavingFamily() { inline float autoLoRaInitialFrequency(LoRaRadioFamily family, float preferred) { // A universal image can contain a 900 MHz preset, but an SX1268 cannot. // Only its invalid initial default falls back; valid saved tuning is kept. +#if defined(MESH_E22_M33S) && MESH_E22_M33S + const float low_band_default = 433.0f; +#else + const float low_band_default = 434.0f; +#endif return family == LoRaRadioFamily::SX1268 && !(preferred >= 410.0f && preferred <= 810.0f) - ? 434.0f : preferred; + ? low_band_default : preferred; } } diff --git a/src/helpers/ota/OtaTargets.h b/src/helpers/ota/OtaTargets.h index dcf287456..250a9c041 100644 --- a/src/helpers/ota/OtaTargets.h +++ b/src/helpers/ota/OtaTargets.h @@ -3,7 +3,7 @@ #include // AUTO-GENERATED by tools/mota/gen_targets.py - do not edit by hand. -// 683 OTA-capable build targets. Maps target_id (= sha2-256:4 of the target name, LE uint32) +// 796 OTA-capable build targets. Maps target_id (= sha2-256:4 of the target name, LE uint32) // to the human-readable env name, so a node/tool can name a target seen over the air WITHOUT // transmitting the string in the .mota / LoRa protocol. Regenerate when the OTA env set changes. // Size-constrained receivers can set OTA_TARGET_NAME_TABLE=0. They still match targets by ID; @@ -40,12 +40,12 @@ inline const char* ota_target_env_name(uint32_t target_id, char* buffer, size_t // existing SHA-256:4 target ID, so collisions never produce a wrong target name. static const uint8_t FINGERPRINTS[] = { 0x23, 0x42, 0x80, 0x2c, 0xd5, 0x34, 0x86, 0x82, 0xd5, 0x73, 0xf8, 0x1f, 0xf5, 0x1d, 0x19, 0x9d, - 0xc8, 0x92, 0xd0, 0x58, 0xb4, 0x4a, 0x53, 0x97, 0xec, 0x90, 0x24, 0x20, 0x44, 0xbe, 0x99, 0x59, - 0x13, 0x23, 0x8c, 0xf1, 0x8c, 0x34, 0x9f, 0x30, 0xf7, 0x89, 0x4e, 0x2a, 0x87, 0x43, 0x48, 0x10, - 0xb5, 0xca, 0x8d, 0xd8, 0x7c, 0x08, 0x01, 0xa0, 0xec, 0x7f, 0x8a, 0xd1, 0xec, 0xc2, 0x3c, 0xaa, - 0x71, 0xf0, 0xf4, 0x46, 0xa7, 0xf1, 0xa8, 0xc4, 0xdf, 0xed, 0x45, 0x79, 0x6d, 0x59, 0xaf, 0x35, - 0xa7, 0x98, 0x8c, 0xa9, 0x0c, 0xc6, 0x4a, 0xa0, 0x14, 0x14, 0x33, 0xde, 0x68, 0x22, 0x04, 0xf9, - 0x7d, 0x8c, 0xf3, 0x97, 0x33, 0xff, 0xc6, 0x4f, 0x73, 0x56, 0x57, 0x31, 0xcd, 0xcc, 0xf5, 0x44, + 0xc8, 0x92, 0xd0, 0x58, 0xb4, 0x4a, 0x53, 0x97, 0xec, 0x89, 0x55, 0x74, 0x90, 0x24, 0x20, 0x44, + 0xbe, 0x99, 0x59, 0x13, 0x23, 0x8c, 0xf1, 0x8c, 0x34, 0x9f, 0x30, 0xf7, 0x89, 0x4e, 0x2a, 0x87, + 0x43, 0x48, 0x10, 0xb5, 0xca, 0x8d, 0xd8, 0x7c, 0x08, 0x01, 0xa0, 0xec, 0x7f, 0x8a, 0xd1, 0xec, + 0xc2, 0x3c, 0xaa, 0x71, 0xf0, 0xf4, 0x46, 0xa7, 0xf1, 0xa8, 0xc4, 0xdf, 0xed, 0x45, 0x79, 0x6d, + 0x59, 0xaf, 0x35, 0xa7, 0x98, 0x8c, 0xa9, 0x0c, 0xc6, 0x4a, 0xa0, 0x14, 0x14, 0x33, 0x68, 0x22, + 0x04, 0xf9, 0x7d, 0x97, 0x33, 0xff, 0xc6, 0x4f, 0x73, 0x56, 0x57, 0x31, 0xcd, 0xcc, 0xf5, 0x44, 0x6d, 0xf0, 0x9f, 0xce, 0xa0, 0x80, 0x7c, 0x80, 0xf1, 0x84, 0xe2, 0x75, 0x5d, 0x8b, 0x78, 0xf4, 0xb4, 0x9b, 0x4f, 0xa7, 0x19, 0xc4, 0x60, 0xe1, 0x73, 0xc8, 0x7c, 0x67, 0xc9, 0x3a, 0x1a, 0xde, 0x53, 0x13, 0x65, 0x18, 0x8d, 0x59, 0x6f, 0xb3, 0x4e, 0xaf, 0x37, 0x81, 0x63, 0xe6, 0x83, 0x54, @@ -55,147 +55,186 @@ inline const char* ota_target_env_name(uint32_t target_id, char* buffer, size_t 0x92, 0xcb, 0x83, 0x51, 0x42, 0x1d, 0x9e, 0xe4, 0xe1, 0xed, 0xd3, 0x63, 0x7e, 0xca, 0xe6, 0x56, 0x41, 0x31, 0xc1, 0xec, 0x1f, 0x07, 0xb8, 0x81, 0x89, 0xab, 0x38, 0xec, 0xd3, 0x24, 0x41, 0x10, 0xa4, 0xb4, 0xf4, 0xae, 0xd9, 0x57, 0x52, 0xc5, 0xc8, 0x0d, 0x22, 0xc0, 0x75, 0xd5, 0x71, 0x48, - 0x99, 0xb7, 0x59, 0x04, 0xca, 0x91, 0x31, 0x25, 0xde, 0xd1, 0xd9, 0x2c, 0x12, 0x89, 0x0d, 0xb0, - 0xb3, 0x99, 0xcd, 0x93, 0x33, 0xa9, 0x49, 0x92, 0x0b, 0xdd, 0x34, 0xa8, 0x39, 0x1b, 0x76, 0xf5, - 0x17, 0x13, 0xc7, 0x28, 0x02, 0x7b, 0x72, 0x80, 0x65, 0xe1, 0xbe, 0x63, 0x33, 0x7a, 0x03, 0x0a, - 0x66, 0x48, 0xfc, 0x7a, 0xf4, 0x24, 0xa7, 0x6b, 0x63, 0xee, 0xa2, 0x88, 0xe7, 0x84, 0x09, 0x00, - 0x7c, 0x3a, 0x68, 0x5c, 0x93, 0xb7, 0x3e, 0xed, 0x5b, 0x6d, 0x5a, 0xeb, 0x02, 0x56, 0x18, 0xc8, - 0x70, 0x25, 0xd7, 0x36, 0x9e, 0xa4, 0x74, 0x26, 0xf1, 0x71, 0x84, 0x16, 0xe3, 0x82, 0x16, 0x56, - 0xe1, 0x39, 0xab, 0x81, 0x37, 0x8d, 0x14, 0xc1, 0x40, 0x27, 0x84, 0xc0, 0xea, 0xae, 0x2f, 0xf3, - 0x9e, 0xd1, 0x40, 0xbd, 0xf9, 0xcb, 0xd5, 0xb0, 0x75, 0xd0, 0xee, 0xaa, 0x00, 0xed, 0x58, 0x63, - 0x8a, 0xe9, 0xf2, 0x20, 0xff, 0x9d, 0xc1, 0x48, 0xbd, 0x23, 0x8c, 0xb5, 0x8f, 0x3c, 0xdd, 0x30, - 0xcb, 0x27, 0x0c, 0xe7, 0x63, 0x05, 0x4f, 0xd6, 0x4c, 0xb1, 0xca, 0x38, 0xb8, 0x33, 0xf8, 0x54, - 0x80, 0x00, 0x92, 0xa5, 0x5b, 0x8e, 0x8b, 0x48, 0x0d, 0xc3, 0x67, 0x69, 0x32, 0x48, 0x1c, 0xdc, - 0x61, 0x80, 0x24, 0x8c, 0x97, 0x12, 0x83, 0xe9, 0x74, 0x35, 0x05, 0x01, 0xee, 0x25, 0x00, 0x0e, - 0x10, 0x01, 0x9e, 0xf7, 0x22, 0x3f, 0x91, 0x2f, 0xfa, 0x61, 0x50, 0x29, 0xaa, 0xdb, 0x27, 0xf0, - 0xc1, 0xc8, 0xdd, 0xac, 0xc3, 0x8a, 0xd4, 0x5d, 0x84, 0x97, 0x19, 0xdc, 0xd4, 0xae, 0x71, 0x26, - 0x3b, 0xbb, 0xa8, 0x52, 0x91, 0x9b, 0x55, 0x8b, 0x32, 0x49, 0x8b, 0xd5, 0xc7, 0xf4, 0x6b, 0x35, - 0x6c, 0x32, 0x22, 0x3d, 0xe8, 0xcd, 0x37, 0x3d, 0x60, 0x6e, 0x4e, 0x84, 0x8b, 0xb6, 0x24, 0x81, - 0xb4, 0x07, 0xf4, 0x38, 0x3b, 0x3d, 0x8f, 0x41, 0x2e, 0xd5, 0x8b, 0x48, 0xf8, 0xf9, 0xd8, 0x45, - 0x7a, 0x5e, 0xd6, 0x85, 0x19, 0xa0, 0x4d, 0x4f, 0x30, 0xad, 0x49, 0x01, 0xe5, 0x38, 0xf5, 0xe3, - 0x74, 0x7c, 0x75, 0xa3, 0x8c, 0xa4, 0xb3, 0x75, 0x8d, 0x81, 0x0d, 0x73, 0x52, 0xc1, 0x14, 0x9e, - 0xd9, 0x2d, 0x51, 0x4b, 0x53, 0x01, 0xa2, 0x18, 0x75, 0x00, 0x68, 0x2a, 0xd8, 0x77, 0xaf, 0xbb, - 0xe6, 0x3a, 0x83, 0xc9, 0xb7, 0x33, 0xda, 0xc0, 0xfe, 0x63, 0x1c, 0x97, 0x3f, 0x14, 0xc9, 0x3f, - 0xd8, 0x29, 0x8d, 0xff, 0x46, 0xfe, 0x5b, 0x73, 0x5c, 0xed, 0xfd, 0x01, 0x7d, 0xa7, 0x62, 0x2b, - 0x67, 0x8e, 0xea, 0xb2, 0xdc, 0x13, 0x04, 0x40, 0xb3, 0xea, 0x81, 0xaa, 0xfd, 0x78, 0x52, 0x5a, - 0x78, 0xf0, 0xb1, 0x5b, 0xa7, 0x88, 0x8b, 0xc5, 0x91, 0x0f, 0x6a, 0x2c, 0x06, 0xbc, 0xb3, 0x90, - 0x24, 0xc4, 0x5f, 0x51, 0xab, 0x67, 0x04, 0xa0, 0x48, 0xb5, 0x15, 0x0c, 0x98, 0x74, 0xdc, 0xbb, - 0xd5, 0xff, 0x18, 0x00, 0x5c, 0x60, 0xce, 0xc8, 0x42, 0x87, 0xab, 0xc2, 0x22, 0x15, 0x0c, 0x15, - 0xc7, 0x07, 0x03, 0x08, 0xd1, 0x61, 0x05, 0xe2, 0x32, 0x00, 0x36, + 0x99, 0xb7, 0x59, 0x04, 0xca, 0x91, 0x31, 0x00, 0x2a, 0xdc, 0x89, 0xc2, 0xcd, 0x76, 0x8c, 0x24, + 0xf1, 0xe0, 0x25, 0xde, 0xd1, 0xd9, 0x2c, 0x12, 0xa8, 0x89, 0x0d, 0xb0, 0xb3, 0x99, 0x9a, 0xcd, + 0x93, 0x33, 0xa9, 0x49, 0x07, 0xc3, 0x3c, 0x3e, 0xb9, 0x6f, 0x92, 0x0b, 0xdd, 0x34, 0xa8, 0x7e, + 0x39, 0x1b, 0x76, 0xf5, 0x17, 0x54, 0x13, 0xc7, 0x28, 0x02, 0x7b, 0xa0, 0x68, 0x6e, 0x97, 0x31, + 0xb6, 0x72, 0x80, 0x65, 0xe1, 0xbe, 0x63, 0x33, 0x7a, 0x5b, 0x03, 0xbf, 0x0a, 0x66, 0x48, 0xfc, + 0x00, 0x7a, 0x16, 0xf4, 0x24, 0xa7, 0x6b, 0x63, 0x56, 0xa8, 0x7e, 0x2c, 0x56, 0xa7, 0xcc, 0x51, + 0x02, 0xe9, 0xee, 0xa2, 0x88, 0xe7, 0x84, 0x09, 0x00, 0x7c, 0x3a, 0x68, 0x5c, 0x93, 0xb7, 0x3e, + 0xed, 0x5b, 0x6d, 0x5a, 0xeb, 0x8d, 0x02, 0x56, 0x18, 0xc8, 0x70, 0x25, 0xd7, 0x36, 0x9e, 0xa4, + 0x74, 0x26, 0xf1, 0x71, 0x84, 0x16, 0xe3, 0x82, 0x16, 0x56, 0xe1, 0x39, 0xab, 0x81, 0x37, 0x8d, + 0x14, 0xc1, 0x40, 0x27, 0x84, 0xc0, 0xea, 0xae, 0x2f, 0xf3, 0x9e, 0xae, 0x46, 0x4b, 0x1a, 0xf0, + 0xd1, 0x40, 0xbd, 0xf9, 0xcb, 0xd5, 0xb0, 0x03, 0x20, 0x80, 0x25, 0xd8, 0xa0, 0xe5, 0x36, 0x7a, + 0x35, 0xbe, 0x75, 0xd0, 0xee, 0xaa, 0x00, 0xed, 0x58, 0x63, 0x8a, 0xe9, 0xf2, 0x20, 0x8f, 0xff, + 0x9d, 0xc1, 0x48, 0xbd, 0x23, 0x8c, 0xb5, 0x8f, 0x3c, 0xdd, 0x30, 0xcb, 0x27, 0x0c, 0xe7, 0x63, + 0x05, 0x4f, 0xd6, 0x4c, 0xb1, 0xca, 0x38, 0xb8, 0xbb, 0xc0, 0xc3, 0x7c, 0x80, 0x5b, 0x60, 0x00, + 0x92, 0xa5, 0x5b, 0x8e, 0x8b, 0x48, 0x0d, 0xc3, 0x67, 0x69, 0x32, 0x48, 0x1c, 0xdc, 0x61, 0x80, + 0x26, 0x2b, 0xa5, 0x8e, 0x50, 0xd8, 0x67, 0x34, 0x24, 0x8c, 0x97, 0x73, 0x5a, 0x4e, 0xb6, 0x45, + 0xee, 0x11, 0x01, 0x12, 0x83, 0xe9, 0x74, 0x35, 0x05, 0x01, 0xee, 0x25, 0x00, 0x0e, 0x10, 0x01, + 0x9e, 0xf7, 0x22, 0x3f, 0x91, 0x2f, 0xfa, 0x61, 0x50, 0x29, 0xaa, 0xdb, 0x27, 0xf0, 0xc1, 0xc8, + 0xdd, 0xac, 0xc3, 0x8a, 0xd4, 0x5d, 0x84, 0x97, 0x19, 0xdc, 0xd4, 0xae, 0x71, 0x26, 0x3b, 0xbb, + 0xa8, 0x52, 0x91, 0x9b, 0x55, 0x8b, 0x32, 0x49, 0x8b, 0x52, 0xd5, 0xc7, 0xd8, 0xf4, 0x6b, 0xf7, + 0x35, 0x6c, 0x32, 0x22, 0x3d, 0xe8, 0xcd, 0x37, 0x3d, 0x60, 0x6e, 0x4e, 0x84, 0x8b, 0x67, 0x69, + 0xae, 0x8e, 0xd5, 0xb6, 0x24, 0x81, 0xb4, 0x07, 0xf4, 0x38, 0x3b, 0x3d, 0x8f, 0x41, 0x2e, 0xd5, + 0x8b, 0x48, 0xf8, 0xf9, 0xd8, 0x45, 0x7a, 0x5e, 0xd6, 0x85, 0x19, 0xa0, 0x4d, 0x4f, 0x30, 0xad, + 0x49, 0x01, 0xe5, 0x38, 0xf5, 0xe3, 0x74, 0x89, 0xce, 0xfb, 0x3e, 0x8b, 0x32, 0xbd, 0x7c, 0x75, + 0xa3, 0x8c, 0xa4, 0xb3, 0x75, 0x8d, 0x81, 0x0d, 0x73, 0x52, 0xc1, 0x14, 0xbf, 0xdc, 0x64, 0x9e, + 0xd9, 0x2d, 0x51, 0x4b, 0x53, 0x01, 0xa2, 0x18, 0x75, 0x00, 0x4f, 0x68, 0x2a, 0xd8, 0x77, 0xaf, + 0xbb, 0xe6, 0x3a, 0x83, 0xc9, 0xb7, 0x33, 0xda, 0xc0, 0xfe, 0x63, 0x1c, 0x97, 0x3f, 0x14, 0xc9, + 0x3f, 0xd8, 0x29, 0x8d, 0xff, 0x46, 0xfe, 0x5b, 0x73, 0x5c, 0xed, 0x0a, 0xfd, 0x01, 0x7d, 0xa7, + 0x62, 0x2b, 0x67, 0x8e, 0xea, 0xb2, 0xdc, 0x13, 0x04, 0x40, 0xb3, 0xea, 0x81, 0xd6, 0xaa, 0xfd, + 0x78, 0x52, 0x5a, 0x78, 0xf0, 0xb1, 0x5b, 0xa7, 0x88, 0xbc, 0x8b, 0xc5, 0x91, 0x98, 0x0f, 0x6a, + 0x2c, 0x06, 0xbc, 0xb3, 0x90, 0xf5, 0x24, 0xc4, 0x5f, 0x51, 0xab, 0x67, 0x04, 0xa0, 0x48, 0xb5, + 0x15, 0x0c, 0x81, 0x97, 0xc0, 0x54, 0xdd, 0x98, 0x74, 0xdc, 0x46, 0xc1, 0xf6, 0x20, 0xa6, 0xbb, + 0xd5, 0xff, 0xa1, 0x18, 0x00, 0x5c, 0x60, 0xce, 0xc8, 0x42, 0x87, 0xab, 0xc2, 0x22, 0x15, 0x0c, + 0x15, 0xc7, 0x07, 0x03, 0x08, 0xd1, 0x61, 0x05, 0xe2, 0x32, 0x00, 0x36, }; enum { DECODE_CHUNK_BYTES = 4096 }; static const uint16_t OFFSETS[] = { - 0, 1610, + 0, 1669, 2126, }; static const uint16_t RAW_LENGTHS[] = { - 3942, + 4088, 1994, }; static const uint16_t FIRSTS[] = { - 0, 683, + 0, 744, 796, }; - // 1610 encoded bytes; 1 independent chunks, at most 4096 decoded bytes. + // 2126 encoded bytes; 2 independent chunks, at most 4096 decoded bytes. static const uint8_t NAMES[] = { - 0xf2, 0x0c, 0x66, 0x67, 0x88, 0x0f, 0x02, 0x90, 0x52, 0x1d, 0xb8, 0x8e, 0x83, 0x40, 0xd4, 0x37, - 0x4a, 0xcf, 0x75, 0x9e, 0x70, 0x3c, 0xce, 0xa2, 0x50, 0x9c, 0x19, 0xd2, 0x4e, 0xbf, 0xcd, 0x42, - 0x21, 0x7c, 0xe6, 0x57, 0x15, 0xca, 0x6b, 0x74, 0x68, 0x22, 0x93, 0x88, 0x9f, 0x2d, 0xf4, 0x6c, - 0x87, 0x23, 0x81, 0x64, 0x0a, 0xf1, 0xd6, 0xe1, 0x10, 0xfd, 0x04, 0x36, 0x83, 0x8d, 0xb8, 0x48, - 0x5f, 0xf7, 0x71, 0xb3, 0xa3, 0x9d, 0x41, 0x13, 0x6c, 0x0c, 0x45, 0x13, 0xbd, 0xa3, 0xb2, 0x3b, - 0x7b, 0x34, 0x10, 0x6d, 0x74, 0x24, 0x1f, 0xc7, 0x51, 0xe7, 0x42, 0x9b, 0x9a, 0x44, 0xc3, 0xb5, - 0xc4, 0x4c, 0x2b, 0xa1, 0x94, 0x7e, 0x11, 0x07, 0x4a, 0x6f, 0x99, 0xf1, 0xe2, 0x5c, 0x1b, 0x85, - 0x02, 0x97, 0x33, 0xa8, 0x49, 0x6d, 0x7c, 0x21, 0xb6, 0xa6, 0x1a, 0xa7, 0x3c, 0x92, 0x1a, 0x44, - 0x1b, 0xed, 0x1d, 0x29, 0x4c, 0x9e, 0x94, 0xc6, 0x85, 0x26, 0xa5, 0x6f, 0x68, 0xa6, 0x15, 0x73, - 0x7d, 0x6f, 0x0a, 0x14, 0x0a, 0x9c, 0xc7, 0x51, 0xc9, 0xa0, 0x70, 0xfe, 0x9c, 0xd2, 0x3b, 0x54, - 0x15, 0xac, 0x29, 0xca, 0xf4, 0x6a, 0xdb, 0xf3, 0xd6, 0x76, 0x38, 0x59, 0x11, 0xf8, 0x38, 0x90, - 0x2f, 0xdb, 0xe8, 0x30, 0x19, 0x4e, 0x36, 0xfd, 0xd3, 0xd2, 0x7d, 0x32, 0x61, 0x20, 0x6e, 0x61, - 0xe0, 0xfc, 0x08, 0x63, 0x2f, 0xc4, 0x57, 0xe2, 0x79, 0xf2, 0x4d, 0x69, 0x8c, 0x1e, 0xb3, 0xa8, - 0x56, 0xe7, 0x94, 0x67, 0x0b, 0xb9, 0x59, 0xbf, 0x6f, 0x0d, 0x6f, 0x18, 0x58, 0xd6, 0x9b, 0xb5, - 0x02, 0xc3, 0x45, 0x36, 0x88, 0xc9, 0x20, 0x44, 0xd0, 0x3d, 0x11, 0x07, 0xe3, 0x20, 0x14, 0x24, - 0xb2, 0x68, 0x9e, 0xf9, 0x4e, 0xaf, 0x3e, 0xa0, 0x7f, 0x10, 0xfd, 0xe9, 0x69, 0x39, 0x3a, 0x9a, - 0xc3, 0xa3, 0xd8, 0xe5, 0x44, 0x52, 0xec, 0xe3, 0x07, 0x31, 0xca, 0xa1, 0x29, 0x38, 0x54, 0x42, - 0xac, 0x2f, 0x38, 0x36, 0xa7, 0xd5, 0x66, 0xb3, 0x5c, 0xe3, 0xb6, 0xde, 0x9d, 0x57, 0x7b, 0xe4, - 0x39, 0x54, 0x92, 0xdd, 0x72, 0xb9, 0x82, 0xb8, 0x98, 0x70, 0x80, 0x2e, 0x59, 0x43, 0x06, 0x08, - 0xd1, 0x40, 0x8c, 0x18, 0xdc, 0xa3, 0x50, 0x5c, 0x82, 0x1d, 0x2d, 0x0d, 0x2d, 0xb3, 0x32, 0x32, - 0x77, 0xe5, 0xe5, 0x7b, 0xe9, 0xe0, 0xb5, 0x97, 0x7f, 0xcd, 0x0f, 0x36, 0xb0, 0xb4, 0x64, 0x65, - 0x13, 0xd5, 0xfd, 0xca, 0x53, 0xd0, 0x29, 0x64, 0xee, 0xca, 0xdd, 0x9c, 0x94, 0xeb, 0x8f, 0x46, - 0x4b, 0xc4, 0xde, 0xfe, 0x43, 0xfe, 0x94, 0x55, 0x1d, 0xdc, 0x69, 0x23, 0x5d, 0xf4, 0x51, 0x25, - 0x21, 0x1c, 0x13, 0xbe, 0xf4, 0xde, 0x13, 0xb7, 0x6f, 0x91, 0x06, 0x48, 0x75, 0xb7, 0x56, 0xce, - 0x31, 0x76, 0x0a, 0x24, 0x64, 0x4f, 0x9b, 0x23, 0xc4, 0xd8, 0xe8, 0x20, 0x34, 0x1c, 0x69, 0xdc, - 0xf6, 0xd7, 0xef, 0x9b, 0x41, 0xb2, 0x53, 0x6d, 0x4f, 0xbb, 0x33, 0xba, 0xaf, 0xdd, 0xe7, 0x8f, - 0x3c, 0xf1, 0xdb, 0x92, 0x02, 0x38, 0x83, 0x73, 0xc1, 0xa8, 0xc3, 0xbf, 0x7a, 0x2b, 0x5d, 0x02, - 0xba, 0x76, 0xed, 0x59, 0xae, 0xb9, 0xba, 0xe5, 0x82, 0xbb, 0xd9, 0x6b, 0xb5, 0x6d, 0x4a, 0x1a, - 0x5d, 0xba, 0xcf, 0x92, 0x11, 0xdd, 0x0b, 0x04, 0x94, 0xf0, 0x94, 0xac, 0x6a, 0x6a, 0xed, 0x7c, - 0xdf, 0xa2, 0x9f, 0x63, 0x0e, 0xc5, 0x67, 0x0b, 0x64, 0xb5, 0xda, 0x8b, 0x3d, 0x7f, 0xcc, 0x62, - 0xb9, 0x93, 0xa2, 0xaa, 0x7d, 0x4f, 0xf8, 0x23, 0x8b, 0x40, 0x5e, 0x7b, 0x96, 0x63, 0x11, 0x26, - 0xb8, 0x4f, 0x1d, 0xdb, 0x86, 0xdc, 0x33, 0x93, 0x26, 0x67, 0x96, 0xdd, 0xc6, 0xe9, 0xc2, 0xd5, - 0x37, 0xf8, 0xc7, 0xe8, 0x7e, 0x3e, 0xf8, 0xd4, 0x87, 0x62, 0xe1, 0xc3, 0x8e, 0x9b, 0x73, 0x3e, - 0x7f, 0xdd, 0xa6, 0x9d, 0x20, 0x1a, 0x1f, 0x86, 0x58, 0xd5, 0x6f, 0x1b, 0x0d, 0x04, 0xc0, 0x2e, - 0x0b, 0x05, 0xf3, 0xa9, 0x2f, 0xf0, 0x92, 0xa6, 0x99, 0xd7, 0x9e, 0x2d, 0x2c, 0x39, 0x9a, 0x63, - 0x5b, 0x8a, 0x2f, 0x2e, 0x90, 0xb0, 0xf1, 0xb6, 0x01, 0x46, 0xf9, 0xc9, 0xd3, 0xd9, 0x4a, 0x9b, - 0x48, 0x8a, 0x09, 0x0f, 0xbd, 0x58, 0xde, 0x1f, 0xcd, 0xee, 0xc7, 0x3e, 0xb1, 0xa1, 0xaa, 0xcd, - 0x5f, 0xbb, 0x3b, 0x43, 0x39, 0xae, 0x89, 0xa2, 0x29, 0x46, 0xfc, 0x58, 0xd0, 0x61, 0x90, 0x4c, - 0x43, 0xef, 0x1c, 0x2a, 0xf2, 0x78, 0x76, 0x9a, 0x7d, 0x56, 0x34, 0xde, 0xb6, 0xc1, 0x30, 0x2a, - 0x37, 0x6f, 0x3d, 0xfb, 0x3f, 0x59, 0x75, 0x74, 0xcb, 0x6a, 0x82, 0x86, 0xdf, 0x5d, 0xc1, 0xc5, - 0x9f, 0x0f, 0x94, 0xb5, 0x6b, 0x0b, 0x78, 0xa2, 0xf5, 0x2c, 0xc9, 0x48, 0xbf, 0x7e, 0xe3, 0xd9, - 0xe2, 0x72, 0x73, 0x6d, 0x4b, 0x13, 0x16, 0xe4, 0x88, 0xce, 0x4f, 0xd1, 0x49, 0x27, 0x36, 0xe4, - 0x17, 0xc8, 0x3c, 0xe6, 0xb8, 0xef, 0xc5, 0x43, 0xdc, 0xce, 0x08, 0x8a, 0xd4, 0x8b, 0x27, 0x16, - 0xb5, 0x20, 0xdf, 0xdc, 0xaa, 0xd9, 0x50, 0x33, 0x2a, 0xf5, 0x9b, 0xb7, 0xee, 0x3f, 0x40, 0xc6, - 0x2b, 0x8a, 0x72, 0xc6, 0x0a, 0x1f, 0xd1, 0x35, 0x53, 0x9a, 0xb2, 0xea, 0xea, 0x04, 0x6a, 0x9a, - 0x89, 0xc4, 0x1f, 0x2a, 0x58, 0x5b, 0xe1, 0x46, 0x29, 0xae, 0x49, 0x6d, 0xf9, 0x87, 0x40, 0xae, - 0x5e, 0x21, 0x50, 0x36, 0xaa, 0x57, 0x6f, 0xde, 0x7f, 0x64, 0xce, 0x84, 0x39, 0x41, 0xf1, 0x18, - 0x07, 0x82, 0x8a, 0x43, 0x01, 0x39, 0xa3, 0x2a, 0x87, 0xa2, 0x81, 0xe7, 0x06, 0xfa, 0xc1, 0xa8, - 0xcc, 0x5d, 0xbb, 0x75, 0xfb, 0xce, 0x83, 0xc7, 0xc6, 0x2f, 0x58, 0x28, 0x2c, 0x34, 0xb7, 0x6e, - 0xa8, 0x1b, 0x85, 0x8a, 0x59, 0x37, 0x20, 0xff, 0xec, 0x85, 0x41, 0xe3, 0x37, 0xe8, 0x58, 0x53, - 0x79, 0x56, 0xb1, 0xac, 0x2a, 0x40, 0x49, 0xf9, 0xba, 0x46, 0xa7, 0x3c, 0x46, 0xd3, 0x02, 0xa1, - 0x6c, 0x82, 0xf2, 0x0c, 0x62, 0x80, 0xbe, 0xb0, 0x64, 0xcf, 0xa6, 0x0a, 0x8d, 0x96, 0xde, 0x7a, - 0xb0, 0xb0, 0xb4, 0x7a, 0x69, 0x63, 0x3f, 0x88, 0x59, 0xc8, 0xb0, 0x2d, 0x7d, 0xf6, 0xa6, 0x2c, - 0x06, 0x43, 0x33, 0xd3, 0x68, 0xd7, 0xd2, 0x7c, 0xfb, 0x69, 0x4b, 0xef, 0x76, 0x08, 0x98, 0xd2, - 0x23, 0xa9, 0xa7, 0x20, 0x18, 0xf3, 0xb1, 0x47, 0x47, 0xd8, 0x7e, 0xd0, 0x15, 0x43, 0x1a, 0xc5, - 0x87, 0x94, 0xd9, 0x32, 0xa3, 0x87, 0x83, 0x09, 0x95, 0x31, 0xcd, 0x6b, 0xd7, 0x1e, 0xd1, 0x18, - 0x0b, 0x47, 0xb0, 0xa1, 0x5c, 0xdc, 0xc3, 0xb0, 0xac, 0xd6, 0x31, 0x43, 0xcb, 0x91, 0x17, 0x71, - 0x75, 0xc1, 0xb6, 0x11, 0xac, 0x32, 0x7a, 0x61, 0x75, 0x5e, 0xdd, 0x4c, 0x17, 0x35, 0x72, 0x39, - 0x2f, 0x27, 0x22, 0xf0, 0xc7, 0x7f, 0xe0, 0x6b, 0x3f, 0xe3, 0xaf, 0xfe, 0x84, 0x87, 0x3d, 0xc6, - 0xa6, 0x82, 0xb1, 0xa8, 0xd3, 0xb3, 0x64, 0x26, 0x40, 0x27, 0x08, 0xcf, 0x5d, 0x4e, 0x7b, 0x2b, - 0x8e, 0x3f, 0xe2, 0x2b, 0x9d, 0x40, 0x30, 0x28, 0x20, 0xb2, 0x8e, 0x05, 0x1d, 0xd1, 0x04, 0xd9, - 0x87, 0x92, 0x5e, 0x5d, 0xd2, 0x9b, 0xa3, 0xdb, 0x98, 0x33, 0xe9, 0x43, 0x73, 0xe9, 0xa8, 0x93, - 0x2e, 0xc9, 0x8a, 0xaa, 0x72, 0xe1, 0x11, 0xb7, 0xf6, 0x1a, 0xf3, 0x56, 0xcb, 0x56, 0x3a, 0xfd, - 0x38, 0x99, 0x1e, 0x87, 0x09, 0xa3, 0x9f, 0xc3, 0xe3, 0x04, 0xcb, 0x42, 0xdf, 0x62, 0xde, 0x84, - 0x5a, 0x7d, 0xe9, 0xb5, 0x8b, 0x9a, 0xd0, 0x77, 0x98, 0x3f, 0x86, 0xa2, 0xbc, 0xa5, 0x3b, 0xbd, - 0x5d, 0xea, 0x84, 0xc8, 0x26, 0x7b, 0x5b, 0x93, 0xdb, 0x12, 0xa4, 0x14, 0x67, 0xbb, 0x0d, 0x45, - 0xfd, 0xd9, 0xe2, 0x9a, 0xde, 0x91, 0xab, 0xef, 0x36, 0xb5, 0xf0, 0x7f, 0x5b, 0x11, 0xc0, 0xc7, - 0x5a, 0xab, 0xdb, 0x2e, 0xec, 0xb7, 0xba, 0x02, 0x03, 0x45, 0xbf, 0x45, 0x81, 0x40, 0x7c, 0x27, - 0xe5, 0x9b, 0x93, 0xd5, 0x39, 0xe5, 0x18, 0x41, 0x21, 0xed, 0x2f, 0x7a, 0xc3, 0x13, 0x16, 0x89, - 0xe3, 0x98, 0xc5, 0xd9, 0x97, 0xca, 0x0a, 0xe7, 0x5e, 0x7b, 0x93, 0xcd, 0x8a, 0xc1, 0x24, 0x80, - 0xbc, 0xbe, 0x08, 0xb2, 0xb2, 0x23, 0x1e, 0xf2, 0xa3, 0x73, 0x7a, 0x6a, 0xfd, 0x56, 0xce, 0xb0, - 0x1f, 0x44, 0xec, 0x34, 0x61, 0x93, 0x80, 0x4e, 0x98, 0xdd, 0x0a, 0x93, 0x86, 0xf2, 0x6f, 0x6e, - 0xcf, 0xa1, 0x09, 0x41, 0x57, 0xa8, 0xdc, 0x90, 0xf9, 0x35, 0xe1, 0x31, 0xfa, 0x61, 0xc0, 0x22, - 0x7f, 0x24, 0x5b, 0x4e, 0xb3, 0x4d, 0xb0, 0x3a, 0x4b, 0x55, 0x59, 0xe9, 0x38, 0x96, 0xa7, 0x31, - 0x1f, 0x1e, 0xfb, 0xaa, 0xb3, 0x5e, 0x9e, 0xc2, 0x81, 0x4c, 0x0a, 0xd7, 0xa6, 0xdf, 0x42, 0x4c, - 0x66, 0x29, 0x2b, 0x51, 0x30, 0x18, 0x84, 0xe8, 0x1c, 0x3f, 0xc6, 0x58, 0x52, 0x9f, 0x47, 0x11, - 0xf3, 0x05, 0xd6, 0x7c, 0xed, 0xfa, 0xbd, 0xe7, 0x8b, 0xcb, 0x6b, 0xbb, 0xda, 0xbf, 0x2c, 0xe6, - 0x17, 0xfb, 0xba, 0xdc, 0x97, 0xdb, 0x80, 0x22, 0xb9, 0x1f, 0xf8, 0x31, 0x9f, 0x05, 0xe7, 0x2f, - 0x22, 0x19, 0x7d, 0xb5, 0x0e, 0x18, 0x9f, 0xc9, 0x99, 0x5c, 0xe7, 0x36, 0xf7, 0x28, 0xb1, 0xd0, - 0xbe, 0x39, 0x65, 0x5f, 0x56, 0xfc, 0xa5, 0x26, 0x5a, 0x54, 0x20, 0xaf, 0xdf, 0x15, 0x15, 0xa9, - 0x9a, 0x76, 0x65, 0xfe, 0xda, 0xb3, 0x86, 0x45, 0xde, 0xbc, 0x7d, 0xf7, 0x7e, 0x7d, 0xf3, 0x6f, - 0xb7, 0xd8, 0x0f, 0x12, 0xa5, 0xce, 0x3d, 0xef, 0x08, 0xb4, 0xf4, 0x31, 0xe8, 0x62, 0x2b, 0x60, - 0xdb, 0xde, 0x94, 0x76, 0x53, 0x41, 0xd4, 0x3f, 0x46, 0xc3, 0xc0, 0xf7, 0x04, 0x8f, 0x57, 0x1c, - 0x14, 0x5f, 0x7e, 0x0a, 0xb9, 0x42, 0xbd, 0x23, 0x5b, 0xc0, 0x81, 0xd5, 0xfe, 0x8a, 0xc2, 0x5c, - 0xbc, 0x01, 0xf9, 0x42, 0x11, 0x94, 0x80, 0x9e, 0x05, 0x1e, 0x97, 0x6d, 0x60, 0xf6, 0xde, 0xca, - 0xea, 0x86, 0x49, 0x2e, 0xe7, 0x80, 0xf1, 0x55, 0x7e, 0x42, 0xbf, 0x60, 0x4c, 0x8e, 0x82, 0xe8, - 0x08, 0x3d, 0xbe, 0x54, 0x91, 0x7f, 0x0c, 0x42, 0xf1, 0x75, 0x62, 0x67, 0x32, 0x90, 0x01, 0xa4, - 0xee, 0xc7, 0xb8, 0xab, 0x64, 0xa0, 0x96, 0x8e, 0x20, 0xac, 0x46, 0xa3, 0xc1, 0x2e, 0x49, 0xf7, - 0xa8, 0x4a, 0x4f, 0x4c, 0xec, 0xee, 0xf1, 0x34, 0x66, 0x13, 0x46, 0xbb, 0x3f, 0x54, 0x6a, 0x60, - 0xc9, 0xa7, 0x01, 0xcf, 0x0d, 0x10, 0x91, 0x6d, 0x63, 0x5f, 0x50, 0xb9, 0x59, 0xc1, 0xa4, 0xcf, - 0xe6, 0x39, 0x34, 0x5c, 0x78, 0x31, 0xdd, 0xbe, 0xa8, 0x8e, 0x02, 0xde, 0xac, 0xbd, 0x51, 0x43, - 0x6e, 0x84, 0x5d, 0xe6, 0x80, 0x0f, 0x19, 0xdd, 0xb7, 0xd2, 0xbc, 0x34, 0x6d, 0xa9, 0xff, 0xff, - 0x43, 0xb2, 0xb9, 0xfc, 0xaa, 0x6b, 0xa2, 0x5a, 0xce, 0xd8, 0x98, 0x2d, 0x55, 0x23, 0x17, 0x07, - 0xed, 0x0c, 0xff, 0x1a, 0xf1, 0x57, 0x32, 0xd5, 0x33, 0xdf, 0x42, 0x59, 0xbf, 0x7e, 0x0f, 0x2b, - 0x02, 0xfa, 0xde, 0x09, 0x46, 0xc1, 0x8b, 0x99, 0xe4, 0xdf, 0xf9, 0x8a, 0x81, 0xb4, 0x54, 0xb0, - 0x5f, 0xbe, 0x52, 0xb4, 0x76, 0xff, 0xb1, 0x1b, 0x76, 0x8b, 0x0e, 0xbc, 0xe1, 0x11, 0x93, 0x49, - 0x9d, 0x0b, 0x38, 0xcd, 0x3a, 0x68, 0xc7, 0x96, 0xd5, 0x87, 0x22, 0x71, 0x8a, 0x9b, 0xa7, 0x13, - 0xcb, 0xb2, 0x54, 0x0b, 0xec, 0x07, 0x3c, 0x45, 0x74, 0xac, 0x8c, 0x56, 0xd5, 0x41, 0x0b, 0x64, - 0x7f, 0x85, 0x1f, 0x18, 0x23, 0xb4, 0x12, 0xb4, 0xb4, 0x23, 0x94, 0xdb, 0x50, 0xc0, 0xd2, 0x2c, - 0xa1, 0x24, 0xb5, 0xd2, 0x62, 0x5a, 0x59, 0x2d, 0x75, 0xc9, 0x4f, 0xea, 0xe0, 0x68, 0xb4, 0xff, - 0xf1, 0x13, 0xcc, 0xa7, 0x76, 0xbd, 0x48, 0x4b, 0xe8, 0x3f, + 0xf2, 0x8c, 0x66, 0x67, 0x88, 0x0f, 0x02, 0x90, 0x52, 0x2e, 0xba, 0x09, 0xc3, 0x30, 0x14, 0xed, + 0x27, 0xd1, 0x22, 0xf6, 0x3b, 0x57, 0x29, 0x75, 0x59, 0x44, 0x9a, 0x14, 0x3b, 0xbc, 0xfe, 0x7e, + 0x4c, 0x95, 0x45, 0xe8, 0xe2, 0x31, 0x69, 0x7a, 0x11, 0xdf, 0x73, 0xfd, 0x90, 0x49, 0x4a, 0x33, + 0xb9, 0x4c, 0xfc, 0x3c, 0xa1, 0x67, 0x3f, 0x1c, 0x08, 0x24, 0x73, 0x4c, 0xd7, 0x06, 0xfb, 0x34, + 0xcd, 0x60, 0x37, 0xf8, 0x84, 0xb3, 0xf4, 0xeb, 0x18, 0x57, 0x3f, 0xfa, 0x45, 0x74, 0xd1, 0xa7, + 0x88, 0x3e, 0x50, 0x11, 0x2e, 0x46, 0x53, 0x44, 0x5d, 0x1d, 0x69, 0x4a, 0xe3, 0x68, 0xb3, 0x58, + 0x47, 0xb3, 0x58, 0xba, 0x51, 0x51, 0xb1, 0x55, 0x94, 0xf2, 0x27, 0x71, 0xa4, 0xfc, 0x93, 0x8c, + 0xe7, 0x10, 0xea, 0x2a, 0x0c, 0xd9, 0x9a, 0x40, 0x61, 0xad, 0xbf, 0x10, 0x7b, 0xf7, 0xda, 0x47, + 0xf7, 0x5e, 0x15, 0x51, 0x57, 0xfb, 0x40, 0x06, 0xb1, 0x86, 0x52, 0x16, 0xeb, 0xc8, 0x5c, 0xa8, + 0x62, 0x23, 0x59, 0x2f, 0x4b, 0x45, 0x85, 0x21, 0x6b, 0x1f, 0x13, 0x46, 0x83, 0x4d, 0xa7, 0x9c, + 0x7f, 0x41, 0x65, 0x61, 0xc3, 0xb1, 0xae, 0xbe, 0x5a, 0xbb, 0xae, 0xb6, 0xc1, 0xd1, 0x8b, 0x60, + 0x4a, 0x03, 0x4d, 0xe5, 0x19, 0x0d, 0x66, 0xc7, 0xd9, 0xe7, 0x6f, 0x2f, 0xdd, 0x1e, 0x49, 0x03, + 0x71, 0x4d, 0x03, 0xeb, 0xcb, 0x4b, 0xbd, 0x10, 0x5f, 0x88, 0x97, 0xe1, 0xab, 0xd6, 0x94, 0x26, + 0x2c, 0xa6, 0xb5, 0x5b, 0xab, 0x3c, 0x4f, 0xd0, 0xe3, 0xfa, 0x51, 0x5b, 0x7a, 0x25, 0x81, 0xa5, + 0xdb, 0x76, 0x86, 0x8c, 0x90, 0xd8, 0x21, 0x65, 0x87, 0x98, 0x40, 0xb7, 0x07, 0x8e, 0x2e, 0x40, + 0x28, 0x4a, 0x62, 0xb1, 0x72, 0x96, 0x3b, 0xdd, 0xbe, 0xc1, 0xff, 0x28, 0xfd, 0xe7, 0xb1, 0x02, + 0x1d, 0xdc, 0xfe, 0x5e, 0x6c, 0x39, 0x93, 0xe4, 0x82, 0x6b, 0x99, 0x95, 0x64, 0x56, 0x36, 0xfe, + 0x47, 0x4b, 0x87, 0x09, 0xc4, 0x4f, 0x05, 0x63, 0x77, 0x6c, 0xb7, 0xdb, 0x4d, 0x87, 0x6b, 0xb7, + 0x3b, 0xb5, 0x1f, 0xeb, 0xb1, 0xd4, 0xb2, 0xdb, 0x6c, 0x5a, 0x48, 0x48, 0x19, 0x7b, 0xd8, 0x96, + 0x0e, 0x32, 0x40, 0x88, 0x06, 0x62, 0xa4, 0x18, 0xee, 0x85, 0xe3, 0x1c, 0xfd, 0xe8, 0x69, 0xa8, + 0x25, 0x1b, 0x9d, 0xb9, 0x29, 0xef, 0xe3, 0x4b, 0x80, 0xd7, 0x48, 0x3f, 0xa4, 0x6f, 0x16, 0x58, + 0xa6, 0xa8, 0xb3, 0xae, 0x5a, 0xf9, 0xf6, 0xeb, 0xb0, 0x10, 0x94, 0x5d, 0xb8, 0x59, 0x2a, 0xe9, + 0xef, 0xbb, 0x6e, 0x8f, 0xf8, 0xab, 0xcc, 0xea, 0xf0, 0x4e, 0x94, 0x09, 0xe2, 0x83, 0x1a, 0x05, + 0x35, 0x9e, 0xed, 0x7a, 0xef, 0x24, 0xd7, 0x80, 0x35, 0x5e, 0x25, 0x9d, 0x8f, 0xdc, 0x8b, 0xc9, + 0x15, 0xbd, 0xf3, 0xfb, 0x5e, 0xdb, 0x47, 0x70, 0x13, 0x79, 0x2a, 0xf8, 0x00, 0xd3, 0xfe, 0xfa, + 0x6f, 0x76, 0x95, 0xd4, 0xbb, 0x24, 0xb0, 0xd3, 0x98, 0xf9, 0xed, 0x6f, 0x66, 0x77, 0xe4, 0x71, + 0x89, 0xdb, 0x77, 0xe2, 0x2b, 0x4b, 0x0a, 0x60, 0xed, 0x9d, 0xc4, 0x8c, 0x5a, 0xc1, 0x6f, 0xe7, + 0x5d, 0x9b, 0x80, 0x9c, 0xad, 0x3d, 0x97, 0x1a, 0xe6, 0xba, 0x0d, 0xf6, 0x5a, 0x67, 0xa9, 0x69, + 0x50, 0xa2, 0xb5, 0xe9, 0x0e, 0x8b, 0xfa, 0x74, 0xdb, 0x8b, 0x61, 0x0e, 0xb5, 0xc4, 0xcc, 0x89, + 0xb5, 0xf5, 0x77, 0x9d, 0xfe, 0x0c, 0x03, 0xc8, 0x3c, 0x57, 0x89, 0x59, 0xec, 0x84, 0x8e, 0x3b, + 0x60, 0xa1, 0x90, 0x4c, 0xad, 0x8a, 0x5d, 0x27, 0x76, 0xfb, 0x3a, 0x81, 0x54, 0xf6, 0xb9, 0xc4, + 0x7c, 0xe4, 0xbc, 0x4b, 0x2d, 0xc3, 0x00, 0xe9, 0x79, 0x81, 0x8e, 0x08, 0x89, 0x20, 0xf5, 0x5c, + 0x2d, 0x80, 0xa4, 0x16, 0x68, 0x74, 0xac, 0x1b, 0x4d, 0x54, 0xa8, 0x95, 0x4f, 0xf8, 0x47, 0x69, + 0xff, 0xdc, 0xfd, 0xd1, 0x85, 0x4c, 0xfa, 0xdb, 0xa6, 0x2d, 0x59, 0x3f, 0x7f, 0x6f, 0xd0, 0x96, + 0xe7, 0x0f, 0xf6, 0x87, 0xd8, 0xf6, 0x9f, 0x35, 0x0d, 0x0d, 0x60, 0x8b, 0x0d, 0x63, 0xe6, 0x52, + 0x37, 0x46, 0xa7, 0x5c, 0x36, 0x5f, 0x7b, 0xae, 0x2e, 0x5a, 0x39, 0xcb, 0xd0, 0x45, 0xf6, 0xb8, + 0xc0, 0xf4, 0x95, 0xcf, 0x1a, 0x28, 0x73, 0x4f, 0x9f, 0x4d, 0x57, 0xb9, 0x11, 0x4f, 0x38, 0x0a, + 0x86, 0x4e, 0xc8, 0xfd, 0xfb, 0x53, 0xff, 0xd0, 0x25, 0x06, 0x14, 0xb3, 0xa5, 0xda, 0xbd, 0xa9, + 0x95, 0x65, 0x17, 0x70, 0xaa, 0xc6, 0xfd, 0x60, 0x12, 0xd3, 0x9e, 0x17, 0x8d, 0x87, 0xce, 0x09, + 0xe4, 0xb9, 0x7a, 0xaa, 0x4d, 0x3e, 0x1b, 0x6b, 0x9f, 0x9b, 0xa0, 0xc8, 0xca, 0xad, 0xdb, 0xcf, + 0xdf, 0x11, 0xd3, 0x92, 0x75, 0xbd, 0x01, 0x59, 0x51, 0xb1, 0x75, 0xdd, 0x3f, 0x93, 0xad, 0x21, + 0x5e, 0x1d, 0x9d, 0xa7, 0x93, 0xab, 0xdf, 0x7c, 0xbe, 0xf0, 0xa6, 0xb1, 0xbc, 0x9e, 0x8b, 0x75, + 0x90, 0x88, 0x1c, 0x1c, 0x21, 0x5e, 0x87, 0x06, 0xa4, 0x54, 0x72, 0x03, 0xe9, 0xee, 0x3a, 0x61, + 0x0f, 0xc5, 0x49, 0x76, 0xf1, 0x0c, 0xd0, 0x43, 0x9d, 0xea, 0x90, 0x6a, 0xac, 0x97, 0x0d, 0x28, + 0xcb, 0x4a, 0xe5, 0xd6, 0xed, 0x07, 0x0f, 0x31, 0xdd, 0xb7, 0x22, 0xdf, 0x24, 0x25, 0x0c, 0x22, + 0x23, 0x0e, 0x58, 0x87, 0x69, 0xcb, 0x04, 0xca, 0xd9, 0x3c, 0x66, 0xfd, 0x48, 0x98, 0x35, 0x85, + 0x5d, 0x7f, 0x66, 0xd7, 0xa0, 0x06, 0xff, 0x43, 0x40, 0xaa, 0xe4, 0x09, 0x64, 0xe5, 0x42, 0xf9, + 0xd6, 0x83, 0xc7, 0x85, 0xe9, 0xd8, 0x8e, 0x70, 0xb4, 0x0c, 0xbc, 0x98, 0xc6, 0xfb, 0x31, 0x48, + 0x72, 0x91, 0x3f, 0x32, 0x32, 0xea, 0x15, 0x04, 0x41, 0x56, 0x8a, 0xb5, 0xdb, 0x77, 0xee, 0x3e, + 0x7c, 0xa2, 0x5c, 0xb2, 0x85, 0xb4, 0xda, 0x58, 0xbf, 0x25, 0x3c, 0xd2, 0x4a, 0xbe, 0xa2, 0xe0, + 0x96, 0xbe, 0x54, 0x68, 0xf8, 0x09, 0x51, 0xcd, 0x0b, 0x58, 0x45, 0x96, 0x45, 0x61, 0x30, 0x27, + 0x80, 0x2e, 0xd3, 0x71, 0x10, 0x62, 0x69, 0x5e, 0x2c, 0x6a, 0x82, 0xec, 0xd4, 0x44, 0x01, 0x59, + 0x5d, 0xd4, 0xa7, 0xaf, 0xc2, 0x5a, 0x51, 0x2a, 0xb7, 0x1f, 0xaa, 0x8b, 0xe6, 0x79, 0x8d, 0x5d, + 0x2f, 0x64, 0x43, 0x16, 0x45, 0xf4, 0xa7, 0x33, 0xc6, 0x26, 0x56, 0xa6, 0xfb, 0x8e, 0x2e, 0x65, + 0x41, 0xbd, 0x4b, 0x22, 0xb9, 0xdd, 0x22, 0x50, 0xe0, 0x88, 0xcc, 0x90, 0x02, 0x6f, 0x10, 0x0c, + 0x1c, 0xda, 0xc7, 0xc3, 0x09, 0xa1, 0xe8, 0x51, 0x3f, 0xdc, 0xa7, 0xcc, 0xe0, 0xe4, 0xee, 0xed, + 0x8d, 0x28, 0x6e, 0x28, 0x92, 0xb4, 0xf6, 0x84, 0x86, 0xd8, 0x43, 0x31, 0xeb, 0xf1, 0xc5, 0x03, + 0xac, 0xcd, 0x5c, 0xbd, 0x43, 0x12, 0xfd, 0x54, 0xf4, 0x5c, 0x5d, 0xbd, 0xdd, 0xd0, 0x34, 0x4e, + 0xdf, 0x44, 0xfa, 0x48, 0x48, 0xab, 0x48, 0xeb, 0xac, 0xef, 0xf8, 0x81, 0x08, 0x6d, 0x18, 0xe8, + 0x26, 0x48, 0x81, 0x31, 0x6e, 0x10, 0xed, 0xc2, 0xaa, 0x4c, 0x2e, 0xaa, 0x66, 0xb1, 0x78, 0xc7, + 0x60, 0x90, 0x6c, 0x14, 0x7b, 0xee, 0xe0, 0x7a, 0x84, 0xf2, 0xa5, 0x08, 0x15, 0x72, 0x51, 0x75, + 0x39, 0x02, 0x6c, 0x33, 0x36, 0x8e, 0x19, 0xf3, 0x5b, 0x1d, 0x9d, 0xf3, 0x0a, 0x5a, 0xde, 0xf0, + 0xc4, 0x0e, 0x68, 0xe7, 0x9d, 0xe5, 0xf6, 0x83, 0x77, 0x2d, 0x2f, 0x66, 0x90, 0x46, 0xcb, 0x2a, + 0xf5, 0x03, 0x9f, 0x46, 0x88, 0xc5, 0x90, 0xd7, 0x50, 0x85, 0x8c, 0x6a, 0x98, 0xab, 0xf3, 0x74, + 0x83, 0x73, 0x30, 0x87, 0x06, 0x62, 0x99, 0x7c, 0x44, 0x26, 0x6d, 0x72, 0x01, 0xdd, 0xb3, 0x86, + 0xcd, 0x9f, 0x89, 0xec, 0xf2, 0xc7, 0x26, 0x5a, 0x24, 0x2b, 0x6c, 0x6b, 0x5b, 0xa6, 0xdf, 0x47, + 0xe3, 0xc9, 0x30, 0x62, 0xf4, 0xe7, 0x70, 0x12, 0x61, 0xdb, 0xc9, 0xeb, 0xcc, 0x19, 0x51, 0xbd, + 0xcb, 0x37, 0xe6, 0xac, 0xe7, 0xe4, 0x4d, 0xe6, 0x0e, 0x20, 0xc3, 0x3d, 0x65, 0xab, 0xb3, 0x45, + 0xad, 0x21, 0xa6, 0x98, 0xc4, 0x17, 0x89, 0x70, 0x23, 0x31, 0xdf, 0x36, 0x9a, 0x90, 0xc9, 0x3d, + 0x5f, 0x58, 0x96, 0x5b, 0x7c, 0xf5, 0xd7, 0xa0, 0x3a, 0xfe, 0x6f, 0x8a, 0x24, 0x30, 0xd8, 0x92, + 0xb9, 0x61, 0xc3, 0xce, 0x52, 0x3b, 0x46, 0x2e, 0x88, 0x32, 0xc6, 0x13, 0x7e, 0x22, 0xac, 0xf5, + 0x0e, 0x05, 0xf3, 0x54, 0x53, 0xfe, 0xe3, 0x7b, 0x31, 0x06, 0x69, 0x4d, 0xa1, 0x32, 0x25, 0x3e, + 0x12, 0xc6, 0x01, 0x32, 0x27, 0xe6, 0x48, 0x65, 0x9c, 0xde, 0x21, 0xf3, 0xe3, 0x49, 0xc8, 0x42, + 0x81, 0x50, 0x49, 0xcc, 0xa8, 0x19, 0x02, 0x76, 0x09, 0x4d, 0xcc, 0x52, 0x92, 0xd7, 0x4c, 0x58, + 0xff, 0x74, 0xae, 0x96, 0xec, 0x8c, 0x37, 0xf2, 0x20, 0x95, 0x5b, 0x00, 0x3e, 0x6b, 0xfc, 0x60, + 0x18, 0x1c, 0x9c, 0xd0, 0x23, 0xfd, 0xca, 0x80, 0x81, 0x1d, 0xcf, 0x67, 0x47, 0x11, 0x1b, 0x79, + 0x74, 0xc4, 0x8c, 0xa5, 0x61, 0xa4, 0x89, 0x6d, 0x92, 0xb6, 0x2d, 0x1a, 0x71, 0x88, 0x05, 0x61, + 0x39, 0xe9, 0x47, 0x93, 0x53, 0x8f, 0xee, 0x39, 0x88, 0x5e, 0x6f, 0x12, 0x40, 0xca, 0x58, 0xcd, + 0x4f, 0x7c, 0xf1, 0x84, 0x5d, 0x4e, 0x32, 0xdb, 0xa0, 0x7f, 0x86, 0xd8, 0x46, 0x48, 0x52, 0x14, + 0xf9, 0xde, 0x1e, 0xbf, 0x3a, 0x47, 0x6e, 0x88, 0x3b, 0x4f, 0xdd, 0xc0, 0xf7, 0x99, 0x8b, 0x2d, + 0x94, 0xbb, 0x51, 0xbf, 0xff, 0x62, 0xe1, 0xcd, 0xf2, 0x56, 0xee, 0x94, 0x85, 0xc1, 0x99, 0x5c, + 0xe6, 0x72, 0x2e, 0x06, 0x9c, 0xd5, 0x3b, 0x9e, 0x8b, 0xaa, 0x84, 0x44, 0x62, 0x7c, 0x12, 0xfc, + 0xbe, 0x2c, 0x30, 0x90, 0xe9, 0x55, 0x69, 0x56, 0x7d, 0xcf, 0x5f, 0xe0, 0xb7, 0xbe, 0xcb, 0x82, + 0x73, 0x85, 0xb4, 0xb6, 0x4d, 0x89, 0x8e, 0xc5, 0xce, 0x8b, 0x62, 0x93, 0xf1, 0x34, 0xd7, 0xc0, + 0xf2, 0xd2, 0xe4, 0xe3, 0x97, 0x4c, 0xa3, 0x49, 0x74, 0x1c, 0x4b, 0xf3, 0xa5, 0xda, 0xf3, 0x0f, + 0x1a, 0xf9, 0xf4, 0xf9, 0xcb, 0xd7, 0x95, 0xb5, 0x7f, 0xec, 0x4c, 0xd7, 0x8b, 0xc4, 0x51, 0xd2, + 0x71, 0x0e, 0x20, 0x37, 0x0b, 0x06, 0x6d, 0xe6, 0x47, 0x6c, 0xc3, 0x19, 0xd3, 0xb6, 0x98, 0xd7, + 0x29, 0x75, 0x55, 0xfe, 0xee, 0xf7, 0x3c, 0xd7, 0x89, 0x83, 0xf0, 0x9d, 0x85, 0x87, 0x43, 0x70, + 0x04, 0x52, 0xba, 0xda, 0xe2, 0x07, 0xd6, 0xae, 0xde, 0xfc, 0x8d, 0x03, 0x34, 0xa3, 0xde, 0x82, + 0x74, 0x3a, 0xa3, 0x82, 0x18, 0xf1, 0xc7, 0x9e, 0x13, 0xf0, 0x63, 0x6b, 0x1a, 0xf2, 0xad, 0xb9, + 0x5a, 0x20, 0xe7, 0xef, 0x79, 0xac, 0x75, 0x87, 0x90, 0x76, 0xd2, 0x30, 0x48, 0x18, 0x71, 0xa7, + 0x42, 0x44, 0x71, 0xcb, 0x0e, 0x3c, 0xff, 0x00, 0xbf, 0xb8, 0x98, 0xe7, 0x7f, 0x14, 0x42, 0xf1, + 0x73, 0xc4, 0x48, 0x46, 0x57, 0x62, 0xc0, 0x0f, 0xaa, 0x10, 0xa5, 0x62, 0x74, 0x95, 0x67, 0x4f, + 0x88, 0x75, 0x4d, 0xd3, 0xd8, 0x79, 0x19, 0x1d, 0x2a, 0xf8, 0xde, 0x26, 0xb4, 0x3d, 0x19, 0x87, + 0x6c, 0xc4, 0x68, 0xfb, 0x5f, 0xc1, 0x1e, 0x6c, 0xa4, 0x19, 0x1f, 0xa4, 0x3d, 0xb4, 0x40, 0x8f, + 0xbc, 0x60, 0xf9, 0x5c, 0x62, 0x90, 0x08, 0xf2, 0xd8, 0x53, 0xc9, 0xbb, 0x84, 0xa0, 0xc4, 0x4e, + 0x48, 0x37, 0x08, 0x8e, 0x1b, 0xcc, 0x2f, 0xa1, 0x22, 0x5f, 0x94, 0x3f, 0x89, 0x87, 0xd4, 0xc7, + 0x63, 0x72, 0x37, 0xe8, 0x31, 0xba, 0xa3, 0x27, 0x9d, 0x5b, 0xe0, 0x4d, 0x5a, 0xaa, 0x62, 0xf6, + 0x52, 0xca, 0xb4, 0x0b, 0x64, 0x2a, 0x27, 0x66, 0x61, 0x89, 0x77, 0xe1, 0xb9, 0xa2, 0x79, 0xe6, + 0xf0, 0x11, 0x1d, 0xe6, 0x93, 0xd9, 0x5d, 0xf8, 0x0c, 0xd9, 0x5c, 0xfd, 0x3e, 0x36, 0x1d, 0x74, + 0x9d, 0x43, 0xdc, 0x29, 0x27, 0x64, 0xbc, 0xa2, 0xd6, 0x6f, 0xdc, 0x6c, 0x5d, 0x1c, 0x8e, 0xcf, + 0x5f, 0xbd, 0x16, 0xf9, 0x6d, 0xfd, 0x67, 0x68, 0xc6, 0x12, 0x52, 0x16, 0xaf, 0xb9, 0xbc, 0x0d, + 0x24, 0x2f, 0xa0, 0xc9, 0x9d, 0xa0, 0x65, 0xcc, 0x7a, 0x10, 0x8e, 0x50, 0x7a, 0x34, 0xd2, 0x75, + 0x5d, 0x83, 0x54, 0x49, 0x85, 0xae, 0x17, 0xcc, 0x6c, 0x5a, 0x7a, 0x82, 0xdc, 0x6a, 0xd1, 0xc2, + 0x3a, 0xf8, 0xa5, 0xe1, 0x7f, 0xf2, 0x8c, 0x66, 0x67, 0x88, 0x0f, 0x02, 0x90, 0x52, 0x26, 0x38, + 0x0a, 0xc3, 0x30, 0x14, 0xed, 0x91, 0x68, 0x11, 0x73, 0x9d, 0xaf, 0xb4, 0x75, 0x21, 0x22, 0x4b, + 0xb1, 0xc3, 0x76, 0xfb, 0x51, 0x55, 0x45, 0xa4, 0x10, 0x8b, 0x91, 0x46, 0x1b, 0xf1, 0x7f, 0xdf, + 0x8b, 0x4c, 0x52, 0x9a, 0xc9, 0x24, 0xe2, 0xd7, 0x09, 0x3d, 0xdb, 0xf1, 0x48, 0x20, 0x99, 0x43, + 0xbc, 0x37, 0x18, 0xa2, 0x9f, 0xc1, 0x66, 0xb4, 0x11, 0x57, 0xe9, 0xdf, 0x63, 0xdc, 0xed, 0x64, + 0x57, 0xd1, 0x04, 0x1b, 0x03, 0x7a, 0x47, 0x65, 0xb8, 0x1a, 0x35, 0x11, 0x75, 0x75, 0x22, 0x1f, + 0xa7, 0x49, 0x67, 0xa1, 0x8e, 0x66, 0xd1, 0x74, 0xad, 0x62, 0xc6, 0x4a, 0x51, 0x4a, 0x27, 0xe2, + 0x40, 0xe9, 0x93, 0x4c, 0x57, 0xe7, 0xea, 0x2a, 0x14, 0xb9, 0x36, 0x41, 0x86, 0x5a, 0x7f, 0x21, + 0xb6, 0x66, 0xdb, 0x27, 0xef, 0xbd, 0x2a, 0xa2, 0xae, 0xf6, 0x8e, 0x14, 0x92, 0x87, 0xd2, 0x58, + 0xa8, 0x23, 0x75, 0xa1, 0x19, 0x2b, 0xc9, 0xf9, 0xb2, 0x54, 0x54, 0x28, 0x72, 0xee, 0xa3, 0xc2, + 0xa0, 0x30, 0x7f, 0x49, 0x49, 0x47, 0xa9, 0x2c, 0xac, 0x3b, 0xb6, 0xd5, 0xb7, 0x6b, 0xcf, 0xab, + 0x6d, 0x70, 0xb6, 0x22, 0xf0, 0x71, 0x24, 0x5f, 0x9e, 0xd1, 0x60, 0x36, 0x9c, 0x6c, 0x5a, 0xbc, + 0xf4, 0x98, 0x4d, 0x18, 0x89, 0x6b, 0x1a, 0x38, 0xbf, 0xbc, 0xd8, 0x0b, 0xf1, 0x8d, 0x78, 0x1d, + 0xbe, 0x6a, 0x8d, 0xd1, 0x63, 0x31, 0x7d, 0xba, 0x73, 0x95, 0xd7, 0x09, 0xc5, 0x71, 0xfb, 0xa8, + 0x15, 0xbd, 0x92, 0xc0, 0xd2, 0xed, 0x3b, 0x45, 0x86, 0x8b, 0x6c, 0x10, 0x93, 0x41, 0x88, 0xa0, + 0x47, 0x22, 0x0e, 0xc6, 0x41, 0x28, 0x48, 0x64, 0xd1, 0x72, 0xd6, 0x3b, 0xdd, 0x7e, 0xc1, 0xff, + 0x28, 0xfd, 0xe7, 0xb1, 0x1c, 0x1d, 0xcd, 0xf0, 0x2c, 0xb6, 0x9c, 0x48, 0x52, 0xc1, 0x73, 0x99, + 0xad, 0xa4, 0x57, 0xd6, 0xfe, 0x47, 0x45, 0x87, 0x0a, 0xc4, 0xfa, 0x82, 0xb1, 0x39, 0xb7, 0xfb, + 0xfd, 0xae, 0xc3, 0xbd, 0x3b, 0x5c, 0xda, 0x9f, 0x72, 0xac, 0xd2, 0x72, 0xd8, 0xed, 0x5a, 0x88, + 0x8b, 0x09, 0x03, 0x74, 0x4b, 0x07, 0x19, 0x21, 0x44, 0xe3, 0xd2, 0x34, 0xb8, 0x67, 0xe1, 0xb8, + 0x06, 0x3b, 0x59, 0x1a, 0x6b, 0xc9, 0x4a, 0x67, 0x6e, 0x8a, 0xfb, 0xb8, 0x0d, 0xb0, 0x8d, 0xf2, + 0x87, 0xf4, 0xdb, 0x02, 0x8b, 0x94, 0xec, 0xac, 0xab, 0x5a, 0xbe, 0xfe, 0x3a, 0x34, 0x84, 0xcc, + 0x6e, 0xdc, 0xac, 0x95, 0xf2, 0xef, 0xb7, 0x6e, 0x89, 0xd8, 0xdb, 0x45, 0x19, 0x4e, 0x26, 0xbd, + 0x85, 0x68, 0x9a, 0xdf, 0x45, 0x64, 0x26, 0xe6, 0xc7, 0x3b, 0x1b, 0x33, 0xb0, 0xb3, 0x71, 0x09, + 0x4b, 0x29, 0x6b, 0xd8, 0xb2, 0x99, 0x31, 0x30, 0xb3, 0x2b, 0x6b, 0xb2, 0xe6, 0x15, 0xa5, 0x99, + 0x1a, 0xc5, 0x9b, 0x18, 0x18, 0xe4, 0x1a, 0x1b, 0x17, 0x33, 0xb0, 0xb2, 0x09, 0x2b, 0x6b, 0x38, + 0x70, 0x31, 0x30, 0x03, 0x69, 0xae, 0x78, 0x14, 0x21, 0x16, 0x0d, 0x1d, 0x5b, 0x07, 0xd6, 0x60, + 0x63, 0x06, 0x2e, 0x36, 0x2e, 0xa0, 0x88, 0x96, 0x89, 0xad, 0x93, 0x2b, 0x7b, 0x7c, 0xb8, 0xa7, + 0x3f, 0x03, 0x3f, 0x1b, 0x17, 0x9f, 0x10, 0xd0, 0x50, 0x55, 0x88, 0xa0, 0x3b, 0x00, }; // Rare display lookup: one heap buffer, each candidate chunk decoded once. // Keep complete names private until both ID and caller capacity are validated. @@ -276,16 +315,16 @@ inline const char* ota_target_env_name(uint32_t target_id, char* buffer, size_t 0x149bcb23, 0x30d4e442, 0x263a8d80, 0x9070ae2c, 0xe0aea3d5, 0xf190d834, 0x0773c386, 0x32890982, 0xacb599d5, 0x82d3b273, 0xe96a6af8, 0x180bbe1f, 0xf9986af5, 0x98519a1d, 0x06b71719, 0x6384719d, 0x4c0461c8, 0x4fa88992, 0xcd6604d0, 0xc54ea258, 0x217958b4, 0x03d9704a, 0x8456f753, 0xc8104197, - 0xf5eb61ec, 0x70d2d590, 0xd5e04824, 0xa416bb20, 0x875f3744, 0xdaf349be, 0x93b93199, 0x710abb59, - 0x5293da13, 0xc6dd7723, 0xf2eec98c, 0x48a986f1, 0xd2cf978c, 0x53626334, 0xefe4f19f, 0xfcaf3730, - 0xd90deef7, 0x2d2a4089, 0x89ea5c4e, 0xc0eb712a, 0x23b8a187, 0x67293f43, 0x4cc23248, 0x3f364910, - 0xac4b4eb5, 0x822e96ca, 0xe077fb8d, 0x2bbe7fd8, 0x9e40157c, 0x8d8bde08, 0xb12e6e01, 0x930c9fa0, - 0xf6f835ec, 0x7fab017f, 0x9e23928a, 0xf310a4d1, 0xdd5953ec, 0x97574bc2, 0x2d918a3c, 0xd1755faa, - 0x89c28271, 0x8a6ceaf0, 0xba2943f4, 0x57f69746, 0xbc05d6a7, 0x5bad80f1, 0xb4f727a8, 0x112d34c4, - 0xf10a26df, 0xc5409ced, 0xf9022545, 0x75f74679, 0x2023036d, 0x6600f959, 0x4abd24af, 0x35d42b35, - 0x9f736ca7, 0x3fbb1498, 0x42b0818c, 0x80dc72a9, 0xafeed10c, 0x98411ac6, 0xa14d9f4a, 0x6494fda0, - 0x32bcdd14, 0xfe937f14, 0x5b9b1933, 0x1b4399de, 0xf7e47568, 0xb1153422, 0x388f2804, 0x075ca3f9, - 0x2f9f8e7d, 0xc9dc5d8c, 0x34b0e5f3, 0xb4d0ad97, 0xcfa0e233, 0x17d5e1ff, 0xc99313c6, 0xffb3854f, + 0xf5eb61ec, 0x850e8c89, 0x42e6bc55, 0x99a24c74, 0x70d2d590, 0xd5e04824, 0xa416bb20, 0x875f3744, + 0xdaf349be, 0x93b93199, 0x710abb59, 0x5293da13, 0xc6dd7723, 0xf2eec98c, 0x48a986f1, 0xd2cf978c, + 0x53626334, 0xefe4f19f, 0xfcaf3730, 0xd90deef7, 0x2d2a4089, 0x89ea5c4e, 0xc0eb712a, 0x23b8a187, + 0x67293f43, 0x4cc23248, 0x3f364910, 0xac4b4eb5, 0x822e96ca, 0xe077fb8d, 0x2bbe7fd8, 0x9e40157c, + 0x8d8bde08, 0xb12e6e01, 0x930c9fa0, 0xf6f835ec, 0x7fab017f, 0x9e23928a, 0xf310a4d1, 0xdd5953ec, + 0x97574bc2, 0x2d918a3c, 0xd1755faa, 0x89c28271, 0x8a6ceaf0, 0xba2943f4, 0x57f69746, 0xbc05d6a7, + 0x5bad80f1, 0xb4f727a8, 0x112d34c4, 0xf10a26df, 0xc5409ced, 0xf9022545, 0x75f74679, 0x2023036d, + 0x6600f959, 0x4abd24af, 0x35d42b35, 0x9f736ca7, 0x3fbb1498, 0x42b0818c, 0x80dc72a9, 0xafeed10c, + 0x98411ac6, 0xa14d9f4a, 0x6494fda0, 0x32bcdd14, 0xfe937f14, 0x5b9b1933, 0xf7e47568, 0xb1153422, + 0x388f2804, 0x075ca3f9, 0x2f9f8e7d, 0xb4d0ad97, 0xcfa0e233, 0x17d5e1ff, 0xc99313c6, 0xffb3854f, 0x21a73973, 0x3067f656, 0xfdb25057, 0x836e5931, 0x0f1767cd, 0x57172fcc, 0xa529b4f5, 0x85a8c944, 0x3c60586d, 0x0a9dbbf0, 0xb519a89f, 0xa3e8d8ce, 0xb16009a0, 0xdc780e80, 0x28b8007c, 0x4aa63180, 0x6fddcbf1, 0xf4fb5484, 0x2e5384e2, 0xb62a1e75, 0x9e64845d, 0x19232e8b, 0x10f41878, 0xfaf164f4, @@ -305,368 +344,427 @@ inline const char* ota_target_env_name(uint32_t target_id, char* buffer, size_t 0x09f57289, 0x148aeaab, 0xcbb2bf38, 0x6e9f7fec, 0x9a340cd3, 0x6a25d024, 0xc5a2cb41, 0xc4a11710, 0x753947a4, 0xe6fa98b4, 0xf8c27cf4, 0xa139c6ae, 0x90e227d9, 0x89e8d957, 0x812f5e52, 0x61f961c5, 0x1ddd15c8, 0x49d67d0d, 0xbc003322, 0x835b70c0, 0xd7460575, 0x36acced5, 0x33e2c171, 0x5be91148, - 0xa165ae99, 0x04c5c2b7, 0x6c1ca659, 0xa295fb04, 0x61c405ca, 0xe893fe91, 0x2b599d31, 0xf1442d25, - 0x15082ede, 0x6ff350d1, 0xe03d0cd9, 0x82e1eb2c, 0x0ee19b12, 0x6c67ed89, 0xd1c05d0d, 0xb90150b0, - 0x7285bdb3, 0x77cadc99, 0xc177e6cd, 0xf7a38993, 0x83762f33, 0x86cadda9, 0x7e49da49, 0x305d6f92, - 0xbc6b870b, 0x78845fdd, 0x6d35f434, 0xa52d76a8, 0xd8de9639, 0x8ab5c51b, 0x80097676, 0xffe70df5, - 0x3da80417, 0x47ca3c13, 0x28b499c7, 0xf1ab4c28, 0xe5331f02, 0xfba7177b, 0xde7dc472, 0x3625bb80, - 0x69df7765, 0x988cc4e1, 0xe9fbc9be, 0x40818863, 0x65deac33, 0xd86cf67a, 0xed73ac03, 0xab0d550a, - 0x1bd2a266, 0x3655c748, 0x9a5ae8fc, 0x1e9eb97a, 0x139536f4, 0x0716c724, 0x8de23fa7, 0xb92ec96b, - 0x420ebc63, 0x967ccaee, 0x8021afa2, 0x5f7c7688, 0xbd04e6e7, 0x1aeac884, 0x07849209, 0x0c79b100, - 0xbfb60e7c, 0x8a63de3a, 0x96036a68, 0xb76a745c, 0x43023193, 0xa7d97db7, 0x468a133e, 0xb59ea2ed, - 0xcb75495b, 0xbe372c6d, 0xb762985a, 0x6215e9eb, 0x07907102, 0x3898ea56, 0x2fb7e218, 0x8c61d4c8, - 0x4f722e70, 0x694eed25, 0x85b8b9d7, 0xe8421e36, 0x82eaaf9e, 0x9f9caba4, 0xe4a2de74, 0x582c7826, - 0xaeb637f1, 0x86813271, 0x67b2ff84, 0xd0e2e616, 0x3f9edfe3, 0xc23f8082, 0x0e74ae16, 0x8f256e56, - 0x6915c6e1, 0xf1407f39, 0x1b4dc5ab, 0xe90a3181, 0x3b1b4237, 0x21c6d08d, 0x34302c14, 0x268d6fc1, - 0xeabe3b40, 0x3c172d27, 0xf7c5d584, 0x81960cc0, 0x504020ea, 0x9d8b60ae, 0xa2ce002f, 0xba4f47f3, - 0x6f16479e, 0x1018e5d1, 0xc0ab5040, 0xa2bf90bd, 0xe6bff8f9, 0xb9cd26cb, 0x9bc34bd5, 0x144504b0, - 0xdbfe2675, 0xb00241d0, 0x88e77fee, 0xae2d9caa, 0xa0043e00, 0x26bbf4ed, 0xdcc0f158, 0xe3320463, - 0x852b928a, 0x0ec870e9, 0x8f00c1f2, 0xcea95e20, 0xd45277ff, 0x2cad9a9d, 0x02a4a8c1, 0x4a709348, - 0x35d960bd, 0x62977023, 0x17a7ed8c, 0x07f5f5b5, 0xfd0d4b8f, 0x8d88f33c, 0xf5afb7dd, 0x3a0ea830, - 0x6ebf28cb, 0x2d589527, 0x77d0810c, 0x11b131e7, 0x54850763, 0x0fa61805, 0x8039574f, 0xa65555d6, - 0x22b1804c, 0xa9f631b1, 0x49d11eca, 0xd41f0638, 0xe3105eb8, 0xba76cc33, 0x944263f8, 0xc7a8c754, - 0xf8259880, 0x063f1f00, 0x70d71f92, 0xa8a79da5, 0xc0d3815b, 0x966ac88e, 0x104b3f8b, 0x23b49348, - 0xc42cc90d, 0xc24791c3, 0x15e11067, 0x2dbb2669, 0x90799c32, 0x881a6a48, 0xf26af51c, 0x8174cbdc, - 0x0bf0f061, 0x2509dd80, 0x56293b24, 0x8c81078c, 0xbd6a1c97, 0xf4d98c12, 0xccac4283, 0xa68c09e9, - 0x5f606274, 0x84923735, 0x2c0b8b05, 0xdba69401, 0xcb6555ee, 0xd60daf25, 0x410bd800, 0x9aca380e, - 0xd8641710, 0x4d0b1601, 0xab2ac09e, 0xa17fc4f7, 0xe4b2bd22, 0x90c4eb3f, 0x19d9ce91, 0x121cc72f, - 0xfa8510fa, 0xd34d8461, 0x98077550, 0x11628e29, 0x2ed959aa, 0xf1e7cadb, 0xced7e127, 0x6925aaf0, - 0x2fa509c1, 0xa52ba3c8, 0xaf0b81dd, 0x9f4d58ac, 0x7a55dec3, 0x5e69738a, 0x48d3b5d4, 0x14e6965d, - 0x76f3c984, 0x41e33a97, 0x29a0da19, 0x29bc38dc, 0xd5fc71d4, 0x05f5ffae, 0xc62da371, 0x96fc4c26, - 0x8a6dc63b, 0xb48950bb, 0xf1d3c5a8, 0xc6d55752, 0x60683191, 0x8a7cb79b, 0x4fa4ae55, 0xd1d61a8b, - 0x9cb0b232, 0x51fa1a49, 0xdb73638b, 0xd904c2d5, 0x3a14aac7, 0x620569f4, 0x08483f6b, 0x0db48f35, - 0x20532f6c, 0x293ced32, 0xb38ebf22, 0x7c89c73d, 0x2d7c11e8, 0x5bb567cd, 0x61b32037, 0xad1cd53d, - 0x0e18b360, 0x3caf966e, 0xcb59ea4e, 0xe3a28284, 0xa8cb8e8b, 0x05747eb6, 0x75587f24, 0xf2128c81, - 0x1b34e7b4, 0x8e549407, 0x6ca142f4, 0x1deac038, 0x2a2f303b, 0x0ba4453d, 0xf8d1958f, 0x75e85141, - 0xd62ed92e, 0x7abaf0d5, 0x87edc08b, 0xc50b0e48, 0x3c49caf8, 0x58689ef9, 0x91878dd8, 0x72a93c45, - 0x347e087a, 0x4dbf035e, 0xff4102d6, 0x2f9a9185, 0x000fc519, 0x7b071fa0, 0x3e55e34d, 0x54606a4f, - 0x16482630, 0xce0f07ad, 0x01c43d49, 0x51fe3801, 0x857149e5, 0xd9d64938, 0xcb7da3f5, 0x9952fbe3, - 0x3729cd74, 0xdc27c37c, 0x9b9f8775, 0xb27514a3, 0xe9ce038c, 0xe295a7a4, 0x189660b3, 0x99907475, - 0x2082078d, 0x24a94c81, 0x3750e80d, 0xe4b49973, 0xe1372b52, 0x5a79bac1, 0x6f339514, 0x8eaa289e, + 0xa165ae99, 0x04c5c2b7, 0x6c1ca659, 0xa295fb04, 0x61c405ca, 0xe893fe91, 0x2b599d31, 0x21c9b700, + 0xc11d072a, 0x384e00dc, 0xb461d389, 0x01394cc2, 0x44063ccd, 0xc846ab76, 0xb3b0698c, 0x50737424, + 0x707641f1, 0x6a87f9e0, 0xf1442d25, 0x15082ede, 0x6ff350d1, 0xe03d0cd9, 0x82e1eb2c, 0x0ee19b12, + 0x3fae1fa8, 0x6c67ed89, 0xd1c05d0d, 0xb90150b0, 0x7285bdb3, 0x77cadc99, 0xad36c89a, 0xc177e6cd, + 0xf7a38993, 0x83762f33, 0x86cadda9, 0x7e49da49, 0xbca22107, 0xa97c37c3, 0x7599053c, 0x3b4fb43e, + 0xe4e5b2b9, 0xd8b5876f, 0x305d6f92, 0xbc6b870b, 0x78845fdd, 0x6d35f434, 0xa52d76a8, 0x3ebecf7e, + 0xd8de9639, 0x8ab5c51b, 0x80097676, 0xffe70df5, 0x3da80417, 0x44875354, 0x47ca3c13, 0x28b499c7, + 0xf1ab4c28, 0xe5331f02, 0xfba7177b, 0x6844b1a0, 0x0fcc9068, 0x7f32496e, 0xe2c87b97, 0xc4b93731, + 0xa35b0fb6, 0xde7dc472, 0x3625bb80, 0x69df7765, 0x988cc4e1, 0xe9fbc9be, 0x40818863, 0x65deac33, + 0xd86cf67a, 0x5faa225b, 0xed73ac03, 0x7ed14cbf, 0xab0d550a, 0x1bd2a266, 0x3655c748, 0x9a5ae8fc, + 0xc7bddf00, 0x1e9eb97a, 0x3ba7f116, 0x139536f4, 0x0716c724, 0x8de23fa7, 0xb92ec96b, 0x420ebc63, + 0x973f0a56, 0xaa7604a8, 0xc7de3a7e, 0xea6f172c, 0xbed35156, 0x8150baa7, 0x047828cc, 0xa8550751, + 0x8abf8602, 0xfea68de9, 0x967ccaee, 0x8021afa2, 0x5f7c7688, 0xbd04e6e7, 0x1aeac884, 0x07849209, + 0x0c79b100, 0xbfb60e7c, 0x8a63de3a, 0x96036a68, 0xb76a745c, 0x43023193, 0xa7d97db7, 0x468a133e, + 0xb59ea2ed, 0xcb75495b, 0xbe372c6d, 0xb762985a, 0x6215e9eb, 0xa16b488d, 0x07907102, 0x3898ea56, + 0x2fb7e218, 0x8c61d4c8, 0x4f722e70, 0x694eed25, 0x85b8b9d7, 0xe8421e36, 0x82eaaf9e, 0x9f9caba4, + 0xe4a2de74, 0x582c7826, 0xaeb637f1, 0x86813271, 0x67b2ff84, 0xd0e2e616, 0x3f9edfe3, 0xc23f8082, + 0x0e74ae16, 0x8f256e56, 0x6915c6e1, 0xf1407f39, 0x1b4dc5ab, 0xe90a3181, 0x3b1b4237, 0x21c6d08d, + 0x34302c14, 0x268d6fc1, 0xeabe3b40, 0x3c172d27, 0xf7c5d584, 0x81960cc0, 0x504020ea, 0x9d8b60ae, + 0xa2ce002f, 0xba4f47f3, 0x6f16479e, 0x467b1fae, 0x9f7ac346, 0xb875674b, 0xb0d51b1a, 0x805775f0, + 0x1018e5d1, 0xc0ab5040, 0xa2bf90bd, 0xe6bff8f9, 0xb9cd26cb, 0x9bc34bd5, 0x144504b0, 0x81fbeb03, + 0xcfeffb20, 0xfed38680, 0x66c33425, 0x4110e1d8, 0x91e001a0, 0x8492a2e5, 0x99dcc936, 0x1b29b77a, + 0x3f31d335, 0xb553c5be, 0xdbfe2675, 0xb00241d0, 0x88e77fee, 0xae2d9caa, 0xa0043e00, 0x26bbf4ed, + 0xdcc0f158, 0xe3320463, 0x852b928a, 0x0ec870e9, 0x8f00c1f2, 0xcea95e20, 0xa96ddc8f, 0xd45277ff, + 0x2cad9a9d, 0x02a4a8c1, 0x4a709348, 0x35d960bd, 0x62977023, 0x17a7ed8c, 0x07f5f5b5, 0xfd0d4b8f, + 0x8d88f33c, 0xf5afb7dd, 0x3a0ea830, 0x6ebf28cb, 0x2d589527, 0x77d0810c, 0x11b131e7, 0x54850763, + 0x0fa61805, 0x8039574f, 0xa65555d6, 0x22b1804c, 0xa9f631b1, 0x49d11eca, 0xd41f0638, 0xe3105eb8, + 0xa949cfbb, 0x79d4e8c0, 0x71f965c3, 0x81ffc77c, 0xf8259880, 0x06b2235b, 0x431f2060, 0x063f1f00, + 0x70d71f92, 0xa8a79da5, 0xc0d3815b, 0x966ac88e, 0x104b3f8b, 0x23b49348, 0xc42cc90d, 0xc24791c3, + 0x15e11067, 0x2dbb2669, 0x90799c32, 0x881a6a48, 0xf26af51c, 0x8174cbdc, 0x0bf0f061, 0x2509dd80, + 0xf5cccb26, 0x765fa32b, 0xb97bbea5, 0x4b7f908e, 0x95394b50, 0xadec11d8, 0xede52667, 0x6b937e34, + 0x56293b24, 0x8c81078c, 0xbd6a1c97, 0xcc9e3773, 0x8814cf5a, 0x7d36f74e, 0xb7c525b6, 0xd0938945, + 0x15981dee, 0x4c9bc111, 0xef5a0501, 0xf4d98c12, 0xccac4283, 0xa68c09e9, 0x5f606274, 0x84923735, + 0x2c0b8b05, 0xdba69401, 0xcb6555ee, 0xd60daf25, 0x410bd800, 0x9aca380e, 0xd8641710, 0x4d0b1601, + 0xab2ac09e, 0xa17fc4f7, 0xe4b2bd22, 0x90c4eb3f, 0x19d9ce91, 0x121cc72f, 0xfa8510fa, 0xd34d8461, + 0x98077550, 0x11628e29, 0x2ed959aa, 0xf1e7cadb, 0xced7e127, 0x6925aaf0, 0x2fa509c1, 0xa52ba3c8, + 0xaf0b81dd, 0x9f4d58ac, 0x7a55dec3, 0x5e69738a, 0x48d3b5d4, 0x14e6965d, 0x76f3c984, 0x41e33a97, + 0x29a0da19, 0x29bc38dc, 0xd5fc71d4, 0x05f5ffae, 0xc62da371, 0x96fc4c26, 0x8a6dc63b, 0xb48950bb, + 0xf1d3c5a8, 0xc6d55752, 0x60683191, 0x8a7cb79b, 0x4fa4ae55, 0xd1d61a8b, 0x9cb0b232, 0x51fa1a49, + 0xdb73638b, 0x00d7b152, 0xd904c2d5, 0x3a14aac7, 0xc7595ed8, 0x620569f4, 0x08483f6b, 0x500628f7, + 0x0db48f35, 0x20532f6c, 0x293ced32, 0xb38ebf22, 0x7c89c73d, 0x2d7c11e8, 0x5bb567cd, 0x61b32037, + 0xad1cd53d, 0x0e18b360, 0x3caf966e, 0xcb59ea4e, 0xe3a28284, 0xa8cb8e8b, 0xaf9b6e67, 0x5d4bbd69, + 0x20e351ae, 0x240eec8e, 0xf228abd5, 0x05747eb6, 0x75587f24, 0xf2128c81, 0x1b34e7b4, 0x8e549407, + 0x6ca142f4, 0x1deac038, 0x2a2f303b, 0x0ba4453d, 0xf8d1958f, 0x75e85141, 0xd62ed92e, 0x7abaf0d5, + 0x87edc08b, 0xc50b0e48, 0x3c49caf8, 0x58689ef9, 0x91878dd8, 0x72a93c45, 0x347e087a, 0x4dbf035e, + 0xff4102d6, 0x2f9a9185, 0x000fc519, 0x7b071fa0, 0x3e55e34d, 0x54606a4f, 0x16482630, 0xce0f07ad, + 0x01c43d49, 0x51fe3801, 0x857149e5, 0xd9d64938, 0xcb7da3f5, 0x9952fbe3, 0x3729cd74, 0xcbfe8989, + 0x612c7dce, 0x7699aefb, 0x50a86e3e, 0x9daa2d8b, 0x394ba432, 0x3c5059bd, 0xdc27c37c, 0x9b9f8775, + 0xb27514a3, 0xe9ce038c, 0xe295a7a4, 0x189660b3, 0x99907475, 0x2082078d, 0x24a94c81, 0x3750e80d, + 0xe4b49973, 0xe1372b52, 0x5a79bac1, 0x6f339514, 0x3de183bf, 0xedec1ddc, 0x57406964, 0x8eaa289e, 0x70e91bd9, 0x5a7e9c2d, 0x1211b151, 0x0a32044b, 0xa13fe853, 0x79b9ff01, 0xc3decea2, 0x3c012018, - 0x6afd6f75, 0x7517d400, 0xd7598668, 0x61bdb52a, 0x413287d8, 0xe8cd2377, 0x3309bdaf, 0x7330afbb, - 0x9df48ce6, 0xa5cb783a, 0x4b9f8283, 0x311846c9, 0x8b6b29b7, 0x37928233, 0x88ac45da, 0x087f99c0, - 0xdf41affe, 0x2afe6c63, 0xf2d61a1c, 0x14b1b097, 0xec334f3f, 0x1da30414, 0xae8fe1c9, 0x67acd73f, - 0xfb118ed8, 0xe4213729, 0x1298038d, 0x2c47acff, 0x7d641646, 0x51efdbfe, 0xf2aada5b, 0xe59c9373, - 0x236f605c, 0x93994fed, 0x66c47cfd, 0x48061a01, 0x7ed7137d, 0xa01688a7, 0xa5f4a562, 0xef83222b, - 0xc36ec867, 0xb932238e, 0x92f5bbea, 0x26d91ab2, 0x708ac4dc, 0xdc51bf13, 0xc27f8304, 0x7190df40, - 0x609d50b3, 0x5718c7ea, 0x7bbf1081, 0xb151c2aa, 0x3b0174fd, 0xc1fd2578, 0xeb440352, 0xa297f85a, - 0xcbe54778, 0x0343bdf0, 0x3de413b1, 0x37443a5b, 0x603384a7, 0x76456c88, 0x28c4948b, 0xb34a83c5, - 0x63fe9591, 0xce3ef40f, 0x475a2a6a, 0xf4175d2c, 0x3d831006, 0x556eb1bc, 0xb67370b3, 0x0c689b90, - 0x91eac424, 0x7a84a8c4, 0x67843a5f, 0x0e83fd51, 0xfad357ab, 0x16af5c67, 0x8c105104, 0xa80042a0, - 0x4bff0748, 0x77c8f2b5, 0x71ee0e15, 0x8824cd0c, 0xe5439198, 0xe90a6e74, 0x833e5cdc, 0x93145fbb, - 0x8d3dd6d5, 0x33a154ff, 0x6658b418, 0x0cfb9c00, 0x964f4f5c, 0x0a5dc760, 0xd08496ce, 0x293ac2c8, - 0x23b70842, 0x60ebfa87, 0x0ea78cab, 0x60f5fdc2, 0xe8f79d22, 0xb97bbb15, 0xd466590c, 0x9f27be15, - 0x396fecc7, 0xf94e3407, 0xe1930103, 0xa4740508, 0x9f19bcd1, 0xfcebff61, 0xac5c1405, 0xccb734e2, - 0x634ff632, 0xf967a300, 0xa0cc1c36, + 0x6afd6f75, 0x7517d400, 0xcc51754f, 0xd7598668, 0x61bdb52a, 0x413287d8, 0xe8cd2377, 0x3309bdaf, + 0x7330afbb, 0x9df48ce6, 0xa5cb783a, 0x4b9f8283, 0x311846c9, 0x8b6b29b7, 0x37928233, 0x88ac45da, + 0x087f99c0, 0xdf41affe, 0x2afe6c63, 0xf2d61a1c, 0x14b1b097, 0xec334f3f, 0x1da30414, 0xae8fe1c9, + 0x67acd73f, 0xfb118ed8, 0xe4213729, 0x1298038d, 0x2c47acff, 0x7d641646, 0x51efdbfe, 0xf2aada5b, + 0xe59c9373, 0x236f605c, 0x93994fed, 0x730ae20a, 0x66c47cfd, 0x48061a01, 0x7ed7137d, 0xa01688a7, + 0xa5f4a562, 0xef83222b, 0xc36ec867, 0xb932238e, 0x92f5bbea, 0x26d91ab2, 0x708ac4dc, 0xdc51bf13, + 0xc27f8304, 0x7190df40, 0x609d50b3, 0x5718c7ea, 0x7bbf1081, 0xa39983d6, 0xb151c2aa, 0x3b0174fd, + 0xc1fd2578, 0xeb440352, 0xa297f85a, 0xcbe54778, 0x0343bdf0, 0x3de413b1, 0x37443a5b, 0x603384a7, + 0x76456c88, 0xf59a52bc, 0x28c4948b, 0xb34a83c5, 0x63fe9591, 0x165d6098, 0xce3ef40f, 0x475a2a6a, + 0xf4175d2c, 0x3d831006, 0x556eb1bc, 0xb67370b3, 0x0c689b90, 0x93f204f5, 0x91eac424, 0x7a84a8c4, + 0x67843a5f, 0x0e83fd51, 0xfad357ab, 0x16af5c67, 0x8c105104, 0xa80042a0, 0x4bff0748, 0x77c8f2b5, + 0x71ee0e15, 0x8824cd0c, 0xc6ff2781, 0x6a0e5a97, 0x9cfbc0c0, 0x6f428854, 0x7c0b1bdd, 0xe5439198, + 0xe90a6e74, 0x833e5cdc, 0xc9cb4d46, 0xc47f2bc1, 0xb488a5f6, 0xd5435820, 0x8ce235a6, 0x93145fbb, + 0x8d3dd6d5, 0x33a154ff, 0x16b574a1, 0x6658b418, 0x0cfb9c00, 0x964f4f5c, 0x0a5dc760, 0xd08496ce, + 0x293ac2c8, 0x23b70842, 0x60ebfa87, 0x0ea78cab, 0x60f5fdc2, 0xe8f79d22, 0xb97bbb15, 0xd466590c, + 0x9f27be15, 0x396fecc7, 0xf94e3407, 0xe1930103, 0xa4740508, 0x9f19bcd1, 0xfcebff61, 0xac5c1405, + 0xccb734e2, 0x634ff632, 0xf967a300, 0xa0cc1c36, }; enum { DECODE_CHUNK_BYTES = 512 }; static const uint16_t OFFSETS[] = { - 0, 227, 448, 665, 896, 1116, 1323, 1537, 1779, 1926, 2134, 2376, - 2609, 2878, 3114, 3328, 3569, 3806, 3999, 4200, 4442, 4662, + 0, 225, 455, 675, 879, 1090, 1290, 1508, 1728, 1904, 2085, 2282, + 2508, 2759, 2960, 3202, 3424, 3651, 3901, 4113, 4340, 4543, 4773, 5016, + 5242, 5339, }; static const uint16_t RAW_LENGTHS[] = { - 510, 512, 505, 509, 512, 500, 502, 511, 489, 512, 510, 504, - 505, 501, 486, 504, 499, 504, 504, 509, 460, + 508, 510, 483, 492, 468, 490, 501, 482, 503, 501, 503, 505, + 498, 485, 508, 506, 507, 495, 503, 494, 485, 509, 510, 510, + 124, }; static const uint16_t FIRSTS[] = { - 0, 27, 64, 95, 121, 159, 193, 227, 262, 295, 329, 364, - 396, 426, 461, 481, 510, 544, 578, 618, 647, 683, + 0, 27, 63, 94, 116, 156, 186, 222, 257, 290, 323, 361, + 396, 426, 461, 492, 524, 553, 576, 612, 645, 681, 720, 749, + 788, 796, }; - // 4662 encoded bytes; 21 independent chunks, at most 512 decoded bytes. + // 5339 encoded bytes; 25 independent chunks, at most 512 decoded bytes. static const uint8_t NAMES[] = { - 0x8c, 0x51, 0x03, 0x6f, 0x40, 0x41, 0x0c, 0xee, 0x82, 0xd9, 0x76, 0x30, 0xdb, 0x88, 0x67, 0x9b, - 0x71, 0x73, 0x68, 0xf2, 0xdc, 0x77, 0x98, 0x7e, 0xfd, 0x6c, 0x47, 0x77, 0xf5, 0x07, 0x58, 0x95, - 0x37, 0x9e, 0x70, 0x95, 0x8f, 0xc4, 0xc8, 0xf1, 0x14, 0x2a, 0x4e, 0x73, 0x91, 0x85, 0x9c, 0xa1, - 0x15, 0x3a, 0x64, 0x94, 0x09, 0x41, 0xe7, 0x85, 0x93, 0x50, 0x19, 0x87, 0xce, 0x61, 0xca, 0x9a, - 0x52, 0xa8, 0x3c, 0xa2, 0x9c, 0x84, 0x27, 0x0b, 0x95, 0xf6, 0xf9, 0x87, 0x2c, 0x1d, 0xd9, 0xcb, - 0xfb, 0x4f, 0x6a, 0xbc, 0x87, 0x2a, 0xe6, 0x14, 0x9f, 0x12, 0xd0, 0xf2, 0xa9, 0x56, 0xe9, 0xc9, - 0xa6, 0x61, 0x26, 0x12, 0x54, 0x81, 0xf0, 0x00, 0xeb, 0x8b, 0x27, 0x33, 0xb3, 0x93, 0x38, 0x35, - 0x7e, 0x8c, 0xbb, 0xe4, 0x02, 0xdc, 0x0e, 0xfd, 0xb7, 0x30, 0xba, 0x1f, 0x60, 0xd4, 0xbf, 0x83, - 0x51, 0xff, 0x7a, 0x3c, 0x61, 0x2b, 0x90, 0xbd, 0xc0, 0x8c, 0x91, 0xae, 0xef, 0x33, 0x0f, 0xdb, - 0x1d, 0x65, 0x8e, 0xad, 0x83, 0x86, 0x77, 0x58, 0x8a, 0x1e, 0x2f, 0xac, 0x9e, 0x2d, 0xe1, 0x81, - 0x65, 0xfc, 0x6e, 0x17, 0xb4, 0xff, 0x7f, 0x5b, 0xf9, 0x89, 0x15, 0x2a, 0x26, 0xfb, 0xb0, 0xec, - 0x5b, 0xc8, 0xfd, 0x0f, 0x90, 0x9b, 0xdf, 0x9d, 0x69, 0xfe, 0x1f, 0xe4, 0x96, 0xf7, 0x47, 0xce, - 0x85, 0x57, 0xc1, 0xc4, 0xf7, 0xd6, 0xbc, 0x97, 0xa3, 0x80, 0x32, 0xb2, 0xa1, 0xc2, 0xd5, 0xc9, - 0xc9, 0xf7, 0xcc, 0xca, 0xdd, 0xf5, 0xc4, 0xe4, 0xbd, 0xbe, 0xaf, 0x04, 0x6b, 0xe6, 0xef, 0x86, - 0x60, 0x03, 0x00, 0xad, 0x50, 0xb5, 0x62, 0xed, 0x30, 0x0c, 0xd5, 0x5b, 0x5e, 0x99, 0x99, 0x3f, - 0xa1, 0x4c, 0x6b, 0x99, 0x19, 0x46, 0x85, 0x94, 0xc6, 0x21, 0xa5, 0x92, 0xef, 0xcd, 0xe7, 0x97, - 0x99, 0x69, 0xb2, 0x45, 0x87, 0x60, 0x95, 0x72, 0x12, 0xe3, 0xe3, 0xf2, 0xe1, 0xde, 0xce, 0xee, - 0x29, 0xfa, 0x9c, 0x15, 0x28, 0x6e, 0x60, 0x18, 0x2b, 0xea, 0x41, 0x8b, 0x50, 0x41, 0xae, 0x15, - 0x68, 0x65, 0xce, 0x50, 0xab, 0x02, 0x2d, 0x96, 0x24, 0x33, 0xb9, 0x9b, 0xa2, 0x1f, 0xb9, 0x16, - 0xfe, 0x2d, 0xef, 0x1d, 0x2c, 0xe2, 0x96, 0xc9, 0x93, 0x30, 0xe5, 0x12, 0xe7, 0xc7, 0xc6, 0xf0, - 0xf6, 0x84, 0x04, 0x60, 0x8d, 0x52, 0x4b, 0x3e, 0xfa, 0x76, 0x66, 0xe2, 0x06, 0xd8, 0xcd, 0x0d, - 0xe7, 0x77, 0xe8, 0x5e, 0x4a, 0x30, 0x82, 0x85, 0xc2, 0xe0, 0x35, 0x4f, 0x63, 0x62, 0x54, 0x31, - 0xe3, 0x80, 0x32, 0x68, 0x7c, 0x00, 0xe8, 0x44, 0x4f, 0x4c, 0x70, 0x46, 0x48, 0x5a, 0xe4, 0x5c, - 0x42, 0xa3, 0x52, 0xae, 0x2c, 0x50, 0xb3, 0x3c, 0x31, 0x3e, 0xf9, 0x16, 0xe2, 0x77, 0xc0, 0xba, - 0xd8, 0x53, 0x92, 0x2a, 0x09, 0x66, 0xe7, 0xd6, 0x42, 0xd3, 0x8d, 0xc1, 0x9b, 0x06, 0xf4, 0xe0, - 0xf3, 0x59, 0xdd, 0xfc, 0xd8, 0x23, 0xdb, 0x0d, 0x4f, 0xf7, 0x35, 0x4f, 0xdf, 0xcd, 0xf7, 0xcf, - 0xd9, 0x6a, 0x32, 0xd2, 0x08, 0x95, 0x53, 0x57, 0x9e, 0x64, 0x19, 0xdd, 0x66, 0x29, 0xfe, 0xe4, - 0xc4, 0xdb, 0xce, 0xc3, 0x4a, 0x9a, 0xde, 0xfa, 0x1f, 0x2c, 0x4d, 0x68, 0xbe, 0xa8, 0xeb, 0x12, - 0x6c, 0x90, 0x45, 0x7a, 0x04, 0x41, 0x08, 0x85, 0x39, 0x40, 0x67, 0x1b, 0xcf, 0x2a, 0xee, 0x6e, - 0x37, 0xc8, 0x2d, 0xf8, 0x4a, 0xa8, 0x34, 0x6d, 0x74, 0xc9, 0xd8, 0xed, 0xc7, 0x7d, 0x56, 0x38, - 0xfc, 0x0f, 0xc8, 0xa9, 0x4a, 0x64, 0x30, 0x98, 0xf7, 0x37, 0x0c, 0xd4, 0x92, 0x4a, 0x14, 0x50, - 0x74, 0xa4, 0xd0, 0x1d, 0x39, 0xb5, 0x4f, 0x09, 0xf6, 0x44, 0x6a, 0x9c, 0x26, 0xe0, 0x60, 0xa3, - 0x96, 0x45, 0x6a, 0xa2, 0x04, 0xc8, 0x46, 0x63, 0x35, 0x37, 0xaa, 0x42, 0x93, 0xab, 0x51, 0xba, - 0xc7, 0x29, 0x97, 0x4e, 0x42, 0xcb, 0xb1, 0xad, 0xd4, 0x00, 0x8d, 0xd4, 0xad, 0x6a, 0x58, 0x1a, - 0x0c, 0xca, 0xb2, 0xa0, 0xae, 0x08, 0x1e, 0x5c, 0xa7, 0xaa, 0xe0, 0xa1, 0x13, 0x35, 0x3c, 0xf4, - 0xd8, 0x31, 0x9c, 0xce, 0x01, 0xe0, 0x02, 0x75, 0x60, 0xfb, 0x4f, 0x48, 0xb1, 0x6d, 0xa4, 0x07, - 0x97, 0xeb, 0x57, 0xcf, 0x56, 0x88, 0xae, 0x37, 0x88, 0x4e, 0x67, 0x44, 0xf0, 0x37, 0x55, 0x96, - 0x5e, 0x7e, 0xbf, 0x76, 0x9d, 0x47, 0x47, 0xb5, 0x38, 0x07, 0x17, 0x0d, 0x9c, 0x8e, 0x10, 0x56, - 0xc2, 0xac, 0xe4, 0x18, 0xb1, 0x16, 0x4b, 0x35, 0x64, 0x73, 0xa4, 0x39, 0x50, 0x88, 0x6f, 0xa3, - 0x4f, 0x55, 0x12, 0x14, 0x4a, 0x52, 0xd8, 0x08, 0x52, 0x7f, 0x54, 0x1e, 0x2b, 0x9f, 0x1e, 0x8e, - 0x30, 0x9c, 0x28, 0x3e, 0x59, 0xe4, 0xd0, 0x84, 0x87, 0x1e, 0x87, 0xa1, 0xa1, 0x09, 0x36, 0x37, - 0x82, 0x5d, 0x46, 0x84, 0x7b, 0xc8, 0xb0, 0x12, 0x00, 0x62, 0xf0, 0x48, 0xcd, 0x29, 0x49, 0x05, - 0x34, 0x42, 0x0d, 0x3a, 0x16, 0x44, 0x31, 0xb4, 0xd1, 0xda, 0xb6, 0x6d, 0xe3, 0x3f, 0x36, 0x46, - 0x73, 0x31, 0x46, 0xe7, 0xe2, 0xe9, 0xef, 0xf7, 0xd9, 0x98, 0xa8, 0xee, 0x81, 0x40, 0xfb, 0xfa, - 0xfa, 0x81, 0xa5, 0xc0, 0xfa, 0x54, 0xb0, 0x28, 0x03, 0x93, 0xc5, 0xac, 0x82, 0x82, 0x92, 0x8c, - 0xa5, 0x01, 0xa5, 0xa8, 0x99, 0x0c, 0x08, 0x79, 0xec, 0xc0, 0x43, 0xc1, 0x70, 0x38, 0xd0, 0x4e, - 0xe6, 0x30, 0xeb, 0x68, 0xb8, 0x40, 0xae, 0x03, 0xe9, 0x39, 0xa8, 0xcd, 0xdb, 0xfb, 0x1b, 0x5c, - 0xc6, 0xa4, 0x19, 0x92, 0x65, 0x98, 0x12, 0x3a, 0xe5, 0xea, 0x46, 0xca, 0x62, 0x34, 0x4e, 0x6a, - 0x48, 0x1b, 0x38, 0x24, 0x4a, 0xaa, 0x85, 0x2e, 0x56, 0x0f, 0xa7, 0xff, 0x5e, 0x7f, 0x5f, 0x86, - 0x21, 0x20, 0x1c, 0x54, 0x21, 0x10, 0x4e, 0xea, 0xf9, 0x42, 0x14, 0x18, 0x83, 0x09, 0x49, 0x27, - 0x81, 0x85, 0x16, 0x2a, 0xc2, 0x66, 0x13, 0xd5, 0x31, 0x59, 0x4a, 0xa5, 0x6a, 0x4d, 0xbc, 0xf1, - 0x17, 0x13, 0x65, 0x2d, 0x2c, 0x76, 0x80, 0x10, 0x76, 0x7a, 0x67, 0xd3, 0xf6, 0x15, 0xdb, 0x8f, - 0xc6, 0xd2, 0x9d, 0xa1, 0x52, 0x75, 0xa5, 0xf8, 0xd6, 0x5e, 0x87, 0x9d, 0xf1, 0x07, 0x2b, 0x46, - 0x0a, 0xa6, 0x65, 0xce, 0xf7, 0xe0, 0x37, 0xad, 0xd7, 0x4c, 0x44, 0x35, 0xa0, 0x57, 0xec, 0x62, - 0xd6, 0x4b, 0x7a, 0xb3, 0x23, 0xa8, 0x6f, 0xb2, 0xf2, 0x36, 0xd4, 0x44, 0xd7, 0x49, 0xc8, 0x75, - 0xe1, 0x2e, 0x85, 0x33, 0xb7, 0x10, 0xc7, 0xf5, 0xba, 0x9a, 0xd7, 0x9c, 0xed, 0x8c, 0xfe, 0x01, - 0x7d, 0x51, 0x45, 0x76, 0x03, 0x31, 0x0c, 0xfd, 0xbb, 0xd2, 0xaa, 0xcc, 0xb8, 0xed, 0x2a, 0x70, - 0x88, 0xde, 0x42, 0x43, 0x72, 0xe3, 0x17, 0xb3, 0x95, 0xc9, 0xf1, 0x0b, 0x61, 0x36, 0xa3, 0xf4, - 0x01, 0x03, 0x36, 0xc2, 0x35, 0x49, 0x2a, 0xeb, 0x21, 0x27, 0x6a, 0xbb, 0x54, 0x7b, 0x1b, 0x4a, - 0xa7, 0xbd, 0xa3, 0x54, 0x36, 0xda, 0xd3, 0x58, 0x2b, 0x4d, 0x8a, 0xad, 0x57, 0x0a, 0x9f, 0x0e, - 0x17, 0x43, 0x9d, 0x33, 0x59, 0xdf, 0xb0, 0xc5, 0x45, 0xe2, 0xc0, 0xa5, 0x70, 0xc2, 0x03, 0x55, - 0x49, 0x37, 0xdf, 0x4c, 0x9c, 0x83, 0xf3, 0x63, 0x7c, 0xa4, 0xdc, 0xed, 0x75, 0xf1, 0xe8, 0xab, - 0xcc, 0xa9, 0xe5, 0x44, 0x36, 0x8a, 0xe0, 0xd2, 0x7b, 0x4b, 0xd3, 0x03, 0x3c, 0xd3, 0xfa, 0xdd, - 0x45, 0x66, 0x97, 0x7d, 0xc2, 0x85, 0x70, 0xb2, 0xda, 0x95, 0x86, 0xea, 0x41, 0x29, 0xc0, 0xd7, - 0x14, 0xe0, 0x0e, 0x60, 0x95, 0x61, 0x3c, 0x53, 0xc8, 0x78, 0x18, 0xe5, 0x0a, 0x0f, 0xff, 0x38, - 0x71, 0xba, 0x82, 0xee, 0x74, 0x81, 0xee, 0x6c, 0x25, 0xef, 0xe9, 0x7a, 0xfc, 0xe3, 0xde, 0x81, - 0xb8, 0x6a, 0x64, 0xcc, 0x6a, 0xf4, 0x97, 0x29, 0xd4, 0xdd, 0x49, 0x2e, 0x36, 0x24, 0x78, 0x98, - 0x4a, 0x70, 0xb9, 0x4e, 0xf3, 0x8d, 0xb2, 0xb6, 0x6b, 0x80, 0xae, 0x37, 0x84, 0x38, 0x9d, 0x0a, - 0xb1, 0x09, 0x74, 0xee, 0x54, 0xdb, 0xa7, 0xee, 0xff, 0xb0, 0x8d, 0xfb, 0x1f, 0xed, 0xc4, 0x28, - 0x87, 0xd3, 0x9d, 0xac, 0xe6, 0x2e, 0xbe, 0x85, 0x3c, 0x5f, 0xfe, 0x02, 0x85, 0x4f, 0xc3, 0x76, - 0x44, 0x41, 0x10, 0xbd, 0xdb, 0xd1, 0x36, 0x36, 0x36, 0xb1, 0x93, 0xbf, 0xa9, 0x79, 0xa8, 0x3e, - 0xe9, 0x87, 0xf6, 0xe0, 0xef, 0xc7, 0xe6, 0xaa, 0x78, 0x85, 0x7f, 0x2e, 0x02, 0x27, 0xd4, 0xfe, - 0xa2, 0x4f, 0x4a, 0x74, 0x69, 0x22, 0x25, 0xb5, 0x22, 0x17, 0xa5, 0x52, 0x93, 0x68, 0x15, 0x05, - 0x09, 0x2e, 0xb5, 0x10, 0x38, 0x6b, 0xf9, 0x78, 0xd6, 0x77, 0xa4, 0x90, 0xd3, 0xe1, 0xba, 0xb4, - 0x21, 0x4c, 0x87, 0x3a, 0x77, 0x4d, 0xa4, 0xbc, 0xd4, 0x2a, 0x97, 0x81, 0x82, 0x08, 0x6b, 0x9c, - 0x71, 0xc1, 0xb3, 0xe7, 0x3d, 0xf7, 0xab, 0x45, 0xfd, 0xab, 0x05, 0xfd, 0xab, 0x45, 0xfd, 0xea, - 0x06, 0x06, 0x9c, 0x4f, 0xaf, 0x37, 0x0a, 0x17, 0xc6, 0x8f, 0x26, 0x85, 0x93, 0x01, 0xc7, 0xe4, - 0x34, 0x5f, 0x0b, 0x81, 0xfb, 0xc1, 0x69, 0x46, 0xa9, 0x70, 0x39, 0x4b, 0xa4, 0x50, 0x5d, 0x0a, - 0xe4, 0xd8, 0x70, 0x14, 0xd8, 0xe1, 0x92, 0x74, 0xec, 0xd9, 0xb5, 0xd9, 0xd1, 0xf0, 0x19, 0x47, - 0x5a, 0x97, 0x34, 0x59, 0x2c, 0x5f, 0x0e, 0x77, 0x85, 0x54, 0x78, 0x35, 0x1e, 0x8f, 0xb3, 0x9c, - 0x0a, 0xd5, 0x5c, 0x7a, 0x4f, 0xa5, 0x4e, 0xb9, 0x44, 0xd5, 0x44, 0x2e, 0xc8, 0x30, 0x84, 0x8d, - 0x5c, 0xa4, 0xec, 0x50, 0x75, 0x7f, 0x9b, 0xd8, 0x70, 0x45, 0xc6, 0xe3, 0x7c, 0x48, 0x84, 0xf3, - 0x51, 0xca, 0x61, 0x1e, 0x34, 0x16, 0xd8, 0x1a, 0x33, 0xf3, 0x7d, 0x75, 0x50, 0xc5, 0x95, 0x04, - 0x41, 0x08, 0xe5, 0xba, 0xee, 0xee, 0x31, 0xac, 0x66, 0xc3, 0x2b, 0xa1, 0x67, 0x68, 0xa3, 0x84, - 0xb5, 0xe8, 0xc7, 0x5d, 0x4e, 0x38, 0x5f, 0xa0, 0x4b, 0xb5, 0x92, 0xc3, 0x9f, 0x37, 0x4c, 0x5f, - 0x98, 0x28, 0x90, 0x51, 0x4a, 0x28, 0x36, 0x53, 0xfa, 0x19, 0x24, 0x4d, 0x54, 0x85, 0x43, 0x91, - 0x06, 0xc7, 0x0d, 0xb8, 0x5e, 0x99, 0x1d, 0x64, 0x6a, 0xb3, 0x24, 0x38, 0x18, 0x9c, 0x35, 0xdc, - 0x9a, 0x1a, 0x5d, 0xd7, 0x0c, 0x4e, 0x0a, 0x45, 0x27, 0x4d, 0x30, 0x2d, 0x4b, 0x8b, 0xc9, 0x78, - 0x16, 0xb4, 0x35, 0xc1, 0x4b, 0xf1, 0x5d, 0xd7, 0xf0, 0xf2, 0x9d, 0x2d, 0xbc, 0xfc, 0x72, 0xc1, - 0x70, 0x52, 0x71, 0xce, 0xd8, 0x88, 0xa7, 0x06, 0x4e, 0x82, 0x24, 0x4d, 0x86, 0x75, 0x1b, 0x91, - 0xbb, 0x39, 0x91, 0x95, 0xc9, 0xc9, 0xf4, 0x02, 0x6e, 0x56, 0x26, 0xa7, 0x0b, 0xe4, 0xef, 0x57, - 0xaf, 0x26, 0xe4, 0x4f, 0x96, 0xc9, 0xef, 0x4d, 0x7f, 0x9d, 0xa2, 0x4d, 0xec, 0x3b, 0x84, 0x94, - 0x43, 0x2b, 0xbf, 0x70, 0x56, 0x53, 0xc7, 0xb8, 0x7f, 0x0c, 0x26, 0x29, 0xeb, 0x50, 0x99, 0x52, - 0x56, 0x38, 0x5b, 0xfe, 0xba, 0xb7, 0x80, 0x78, 0xb1, 0x82, 0xb8, 0x3b, 0x41, 0xdc, 0x5d, 0x41, - 0xdc, 0x6c, 0x17, 0x16, 0xd4, 0x48, 0x0b, 0x8f, 0x43, 0xd3, 0xa6, 0xf9, 0xc0, 0xba, 0x69, 0x3a, - 0x34, 0x70, 0x92, 0x1f, 0xce, 0xf4, 0x5f, 0xae, 0x70, 0x3e, 0x5a, 0x60, 0x73, 0x38, 0x41, 0xef, - 0x03, 0x75, 0xce, 0x83, 0x72, 0x04, 0x41, 0x10, 0x06, 0xe0, 0x2e, 0xc6, 0xb6, 0x6d, 0x3b, 0x79, - 0x82, 0xd8, 0x2a, 0x77, 0x0d, 0x7a, 0xb3, 0xb3, 0x9a, 0xcd, 0xcc, 0xe4, 0xee, 0xf5, 0x73, 0xf6, - 0x95, 0x9b, 0xdf, 0x0f, 0x3e, 0x45, 0x8e, 0x04, 0x66, 0x4e, 0xd1, 0x79, 0x0e, 0x1d, 0x99, 0x58, - 0x25, 0x2c, 0x42, 0xe1, 0x33, 0x07, 0x70, 0x53, 0x1c, 0x7e, 0x2b, 0x43, 0x11, 0x59, 0x8b, 0x2f, - 0x2c, 0x25, 0x83, 0x42, 0xc7, 0x29, 0x4b, 0x94, 0x4e, 0xd0, 0x30, 0xa9, 0x34, 0xf2, 0x88, 0x60, - 0x0b, 0x53, 0x0b, 0xeb, 0x7f, 0x96, 0xc3, 0x78, 0xa8, 0x72, 0x9b, 0xb1, 0x96, 0x14, 0xc3, 0xb8, - 0xa1, 0x94, 0x58, 0xee, 0x29, 0xcc, 0x23, 0x37, 0x4a, 0xfe, 0x10, 0x92, 0x4d, 0x13, 0x9d, 0x85, - 0x05, 0xcd, 0x2d, 0x99, 0x0c, 0x19, 0x8c, 0x7f, 0x9d, 0x83, 0x09, 0xad, 0x63, 0x2c, 0x36, 0x60, - 0x09, 0xeb, 0x67, 0x83, 0x1f, 0x86, 0x89, 0xb0, 0x8d, 0xbb, 0x93, 0x77, 0x37, 0xf3, 0xee, 0x64, - 0x8d, 0x3b, 0x59, 0x71, 0x17, 0x1b, 0xdc, 0xa5, 0xfa, 0xdf, 0x53, 0x35, 0xee, 0x4a, 0x83, 0xdb, - 0xf9, 0xfe, 0x70, 0xd2, 0xd2, 0x5c, 0xc8, 0x9b, 0xb3, 0x79, 0x73, 0x36, 0xab, 0x3c, 0x05, 0xbd, - 0x15, 0x6d, 0xb4, 0x41, 0x9b, 0x35, 0xf6, 0xf8, 0xe4, 0x18, 0xc6, 0xea, 0x1f, 0xf7, 0xd5, 0xa0, - 0x13, 0x0d, 0x68, 0xaf, 0xa5, 0xc4, 0x6a, 0x03, 0xa0, 0x42, 0x1d, 0x32, 0xf4, 0x59, 0x22, 0x7d, - 0x8a, 0x24, 0x26, 0xc6, 0x43, 0x3a, 0x3e, 0xc6, 0x93, 0x43, 0xc9, 0x63, 0x3c, 0xbc, 0x3a, 0x6f, - 0x99, 0xec, 0x28, 0x1f, 0x6a, 0xc9, 0x68, 0xc7, 0x1c, 0xc9, 0x96, 0x1b, 0x57, 0xf9, 0x8d, 0xb9, - 0x4a, 0xe0, 0x7f, 0xa5, 0xcf, 0x31, 0x0e, 0xc2, 0x30, 0x0c, 0x85, 0x61, 0x4f, 0x5d, 0x01, 0xa1, - 0x96, 0x13, 0xc0, 0x5c, 0x92, 0x63, 0xc0, 0xc8, 0x6e, 0xa5, 0x8d, 0x51, 0xa3, 0x34, 0x76, 0xe5, - 0x14, 0xce, 0x8f, 0xca, 0x50, 0x95, 0x89, 0x21, 0xfb, 0xef, 0x4f, 0x7e, 0x10, 0xa2, 0x44, 0x87, - 0x83, 0x63, 0x3f, 0xd0, 0xe8, 0x91, 0xf5, 0x89, 0x64, 0x0c, 0xda, 0xd6, 0x77, 0x09, 0x55, 0x24, - 0x61, 0x26, 0x7d, 0x93, 0xc2, 0x31, 0x86, 0x9c, 0x31, 0x89, 0xa7, 0x04, 0x15, 0x3b, 0x96, 0x6f, - 0x6b, 0xcc, 0xd2, 0xf5, 0x92, 0x26, 0xc7, 0x41, 0x18, 0xd5, 0xf9, 0x20, 0xd8, 0x8d, 0x04, 0xe7, - 0x57, 0xee, 0xa0, 0xde, 0x1c, 0xd5, 0x4a, 0x13, 0xb9, 0x99, 0x14, 0x9a, 0x0d, 0xbb, 0xb3, 0x6d, - 0xa1, 0xb0, 0xb7, 0x85, 0x40, 0x95, 0xe7, 0xd0, 0xc7, 0x3f, 0x73, 0x2e, 0x8b, 0xd5, 0x6c, 0xac, - 0x66, 0xb5, 0x4e, 0x3f, 0xcf, 0xb4, 0x85, 0xc2, 0xc1, 0x16, 0x02, 0x70, 0x23, 0x9a, 0x66, 0x22, - 0xbe, 0x3f, 0xae, 0xb8, 0x16, 0x1f, 0x8c, 0x8e, 0x35, 0x57, 0x04, 0x51, 0x0c, 0x85, 0xd3, 0xe1, - 0x4e, 0x85, 0x7b, 0x85, 0x6b, 0x8f, 0x5b, 0xc7, 0xf6, 0xf7, 0x8c, 0xe4, 0xb0, 0x6f, 0x24, 0x79, - 0x86, 0xfd, 0x7a, 0xdc, 0xbd, 0xbd, 0xfa, 0xd1, 0x09, 0xb3, 0x8d, 0xcc, 0x72, 0xda, 0x58, 0x81, - 0x67, 0xcb, 0x49, 0x64, 0x8f, 0x4a, 0x7d, 0x02, 0x8d, 0x09, 0x44, 0xc1, 0xd7, 0x91, 0xbd, 0x24, - 0x15, 0x02, 0x4b, 0x50, 0x1f, 0x88, 0x4e, 0x4d, 0x75, 0x73, 0xa0, 0x68, 0x2c, 0xec, 0x65, 0x4d, - 0x5d, 0x38, 0x35, 0x91, 0x91, 0x69, 0x6d, 0x13, 0x31, 0x2a, 0xf0, 0x49, 0x6e, 0x14, 0x69, 0xc5, - 0x34, 0x7d, 0x11, 0x52, 0x1a, 0x28, 0x4d, 0x08, 0xa8, 0x35, 0xe7, 0x9a, 0x06, 0x44, 0x05, 0xa1, - 0xc9, 0x55, 0xf5, 0x6d, 0x7e, 0xe1, 0x31, 0xff, 0xc2, 0x40, 0x83, 0xaa, 0x35, 0x02, 0xfb, 0x4b, - 0xf6, 0xd4, 0x85, 0x9d, 0xc4, 0xe7, 0xff, 0x7c, 0xf9, 0x76, 0xa1, 0xfb, 0xbb, 0xee, 0xd8, 0x43, - 0xb7, 0xfb, 0x5d, 0xb7, 0xfb, 0xb5, 0xdb, 0xf3, 0xae, 0xdb, 0xba, 0x76, 0xb6, 0x86, 0x70, 0xbd, - 0xb2, 0xba, 0xb9, 0xfa, 0x2d, 0xc2, 0x1c, 0x6c, 0xf8, 0x8d, 0x63, 0x18, 0xa9, 0x37, 0xf9, 0x39, - 0x83, 0x83, 0x15, 0xbd, 0xa2, 0x11, 0x4d, 0x9f, 0x96, 0x51, 0xbb, 0x18, 0x3f, 0x60, 0x8e, 0xe1, - 0xa3, 0x37, 0x10, 0xd9, 0xd7, 0x46, 0x92, 0x0a, 0x59, 0x33, 0x89, 0xd4, 0xbb, 0x75, 0x37, 0x33, - 0x6c, 0x2e, 0xa0, 0xc0, 0x72, 0x00, 0x6d, 0x90, 0x35, 0x7b, 0x03, 0x31, 0x10, 0x44, 0xb7, 0x0b, - 0x33, 0x33, 0x53, 0x67, 0x76, 0x1d, 0x66, 0xa6, 0x72, 0x4c, 0xeb, 0x44, 0x9f, 0xa5, 0xd3, 0x9d, - 0x20, 0xf0, 0xeb, 0xc3, 0x60, 0x38, 0x71, 0xf5, 0xe6, 0x69, 0xe8, 0x44, 0xc8, 0xd7, 0x7d, 0x8d, - 0x9b, 0xf4, 0x75, 0x1a, 0xf6, 0x25, 0x99, 0xca, 0xe7, 0x60, 0xb4, 0x56, 0xb0, 0x6c, 0x9e, 0xd8, - 0xd0, 0x2c, 0x74, 0xe9, 0xfb, 0x09, 0x15, 0x39, 0x47, 0x43, 0x8e, 0x8d, 0x12, 0x41, 0x51, 0xa2, - 0xfc, 0x58, 0x74, 0xd4, 0x8e, 0x43, 0x15, 0x7a, 0x69, 0x19, 0x17, 0xd2, 0x5b, 0x18, 0x0e, 0xb9, - 0xe8, 0xd8, 0x50, 0xfb, 0x16, 0x17, 0x15, 0x92, 0xf7, 0x28, 0x6b, 0x15, 0x16, 0x03, 0xa1, 0x03, - 0x98, 0x62, 0x45, 0x68, 0x94, 0x24, 0xd3, 0x12, 0x42, 0x4b, 0xf3, 0x55, 0x2f, 0x25, 0xcd, 0x7b, - 0x5b, 0xa2, 0xf9, 0x67, 0x51, 0x15, 0xd4, 0x5f, 0x13, 0xd6, 0x42, 0xe9, 0x0a, 0x2b, 0xea, 0xff, - 0x03, 0x8d, 0xa3, 0x64, 0x44, 0xe5, 0x81, 0xc1, 0x36, 0x0c, 0xf4, 0x33, 0x4d, 0x34, 0xea, 0x0c, - 0xd4, 0xa9, 0x4e, 0x35, 0xa9, 0xb6, 0xef, 0x70, 0xb9, 0x16, 0x2b, 0x30, 0xf3, 0x99, 0xda, 0x53, - 0x97, 0xd7, 0xf3, 0x2f, 0xbe, 0x7b, 0x73, 0x80, 0x5d, 0x29, 0x1c, 0x7f, 0xb5, 0x91, 0x4b, 0xc5, - 0x02, 0x36, 0x3e, 0x01, 0x13, 0x75, 0x80, 0x89, 0x3f, 0xc0, 0x42, 0x93, 0xc5, 0x64, 0x9d, 0xe1, - 0x72, 0xb3, 0xa1, 0xd4, 0xa6, 0x88, 0xed, 0x5c, 0x5c, 0x06, 0xe2, 0x0b, 0x41, 0xfd, 0x97, 0x41, - 0xed, 0x27, 0x9f, 0x84, 0xbb, 0x14, 0x92, 0x1f, 0x33, 0x17, 0xef, 0xfa, 0xd9, 0xf6, 0xea, 0xa7, - 0xf0, 0xea, 0x57, 0xcf, 0xa3, 0x75, 0xd8, 0x77, 0xad, 0x8f, 0x35, 0x5b, 0x04, 0x61, 0x0c, 0x84, - 0x83, 0x53, 0xe1, 0x52, 0xe1, 0x52, 0xe3, 0x50, 0xe3, 0xda, 0x60, 0xed, 0x3c, 0x2b, 0x39, 0x36, - 0x6b, 0xd9, 0x4f, 0xce, 0x7e, 0x3d, 0xee, 0x50, 0x5e, 0x19, 0x99, 0x99, 0x77, 0xe8, 0x52, 0xf2, - 0xf6, 0x89, 0xe2, 0xf6, 0x52, 0x6d, 0x80, 0xfb, 0x0d, 0xac, 0x63, 0x1d, 0x3b, 0xb0, 0x5c, 0x71, - 0xe0, 0xd9, 0xd2, 0x2c, 0x34, 0x74, 0x6c, 0x1b, 0x6c, 0x51, 0x18, 0xef, 0x41, 0xd3, 0xaa, 0x05, - 0xde, 0x36, 0xb4, 0xf0, 0xfb, 0x38, 0xf5, 0x2c, 0x29, 0xa4, 0x0c, 0x72, 0x44, 0x49, 0xe0, 0x89, - 0xae, 0xb6, 0x6f, 0x7c, 0x10, 0x65, 0xb8, 0x2b, 0xc5, 0xe3, 0x60, 0xe7, 0x12, 0x91, 0x16, 0x55, - 0x50, 0x8a, 0x96, 0xb0, 0x41, 0x2c, 0x8a, 0x30, 0x67, 0x5a, 0xa8, 0xbb, 0x90, 0x46, 0x33, 0x71, - 0x0e, 0x85, 0xc6, 0x5c, 0xd0, 0xe8, 0x67, 0xfa, 0xd8, 0xb7, 0xb0, 0x2e, 0x76, 0x09, 0x2a, 0x8d, - 0x32, 0xf6, 0x5f, 0x78, 0x13, 0xc8, 0x5f, 0xb8, 0xd5, 0x07, 0x28, 0x15, 0xdc, 0x7a, 0xde, 0xbd, - 0xa4, 0x3b, 0x2e, 0x9d, 0x5a, 0x47, 0xbd, 0x41, 0xdc, 0xe0, 0xd2, 0xd7, 0x2d, 0x5b, 0xb8, 0xd6, - 0xfa, 0xc6, 0xce, 0xc6, 0xbf, 0x04, 0xab, 0x2f, 0x04, 0x53, 0xdf, 0x08, 0xa6, 0x3e, 0x03, 0xbe, - 0xd5, 0xfd, 0xdd, 0x6e, 0x62, 0xaf, 0x83, 0x66, 0xbd, 0x52, 0xc8, 0x7f, 0x76, 0xa0, 0xc1, 0x0f, - 0x39, 0x88, 0x0a, 0x76, 0x49, 0xa9, 0xb9, 0x3e, 0xb4, 0xd1, 0x5c, 0xff, 0xbf, 0xcb, 0x5c, 0xad, - 0x9e, 0xe7, 0x34, 0xf7, 0x02, 0x31, 0xd7, 0x94, 0x9a, 0xd0, 0xf0, 0x37, 0x94, 0xe1, 0x4f, 0x94, - 0x27, 0x6d, 0x8f, 0xb5, 0x76, 0x43, 0x31, 0x0c, 0x40, 0x55, 0x66, 0x58, 0xca, 0xb4, 0x75, 0x0d, - 0xd3, 0x5e, 0xa6, 0xad, 0xb3, 0xce, 0x03, 0x25, 0xf1, 0x89, 0x6d, 0xbd, 0xca, 0x0e, 0xfd, 0x7d, - 0xc3, 0x6c, 0x46, 0xe9, 0x5e, 0x30, 0xe4, 0xea, 0x96, 0x35, 0xd7, 0xba, 0xd8, 0xce, 0x64, 0x51, - 0x28, 0xa1, 0xc0, 0x93, 0x60, 0x28, 0x2a, 0xae, 0x11, 0x92, 0x4b, 0x2c, 0xb7, 0xe1, 0x92, 0x43, - 0x47, 0xd2, 0x22, 0x41, 0xf3, 0xe7, 0x3d, 0x9c, 0x32, 0x1b, 0x1c, 0x1e, 0xc0, 0x35, 0xce, 0xdf, - 0x9d, 0x38, 0xb2, 0x8e, 0x05, 0x4e, 0x3c, 0x89, 0x51, 0x36, 0xd0, 0x18, 0xd5, 0x03, 0x0f, 0xf0, - 0xad, 0x2c, 0xb5, 0x1d, 0x19, 0x85, 0x86, 0xb2, 0x05, 0xed, 0xd2, 0x99, 0x49, 0x32, 0xb8, 0x41, - 0xcd, 0x12, 0x20, 0xfb, 0x00, 0x2d, 0x23, 0x75, 0x3c, 0x49, 0xff, 0xe3, 0x30, 0x92, 0x83, 0xb5, - 0xcf, 0x67, 0x74, 0x39, 0x8c, 0xd8, 0x24, 0x81, 0x55, 0x6c, 0x51, 0x82, 0x58, 0x31, 0x86, 0x9a, - 0xe0, 0xa2, 0xe9, 0x42, 0xb8, 0x68, 0xab, 0xaa, 0x82, 0x9d, 0x49, 0xb8, 0x93, 0x05, 0xfa, 0x0b, - 0x71, 0xd9, 0x5c, 0x16, 0x76, 0x67, 0xa8, 0x77, 0x46, 0x94, 0x3b, 0x0b, 0x94, 0x86, 0xc5, 0x11, - 0x86, 0x64, 0xa3, 0x3a, 0x4a, 0xd0, 0xc8, 0x17, 0x73, 0x99, 0x69, 0x5e, 0x38, 0xf4, 0xe9, 0x4a, - 0x71, 0x66, 0xbf, 0x9d, 0x08, 0xc7, 0xcd, 0xc8, 0xf7, 0xd6, 0x2b, 0x5e, 0xc3, 0x4f, 0x60, 0x19, - 0x5f, 0xb3, 0xf8, 0xab, 0xbd, 0x04, 0x53, 0x5b, 0xb0, 0x2a, 0x0c, 0x35, 0xa1, 0x8b, 0x84, 0xc8, - 0x62, 0xc4, 0xd6, 0x52, 0xe4, 0x57, 0xe9, 0x21, 0x3c, 0x56, 0x9b, 0x5a, 0xf7, 0xa6, 0x9e, 0x66, - 0x6f, 0xec, 0x7b, 0x22, 0x9c, 0x37, 0x94, 0x73, 0x68, 0x38, 0x26, 0xd3, 0xdb, 0x8c, 0xc3, 0x22, - 0x3c, 0xcc, 0x59, 0x23, 0x5c, 0x4c, 0x7d, 0x7b, 0xef, 0xe6, 0x44, 0x11, 0xfe, 0x01, 0x7d, 0x90, - 0x45, 0x5a, 0x04, 0x41, 0x0c, 0x46, 0x83, 0xbb, 0xbb, 0xed, 0x38, 0xc0, 0xc8, 0x09, 0xd8, 0xe2, - 0x70, 0x81, 0xb4, 0x65, 0x20, 0x2d, 0x95, 0x26, 0x55, 0xe8, 0xe9, 0xa9, 0x71, 0x9f, 0xee, 0x72, - 0x7b, 0xff, 0xf7, 0xc0, 0x70, 0x14, 0xe5, 0x84, 0x7f, 0xa4, 0x82, 0xb1, 0x18, 0x43, 0xb1, 0xc3, - 0x58, 0x8a, 0x32, 0x34, 0x2c, 0x06, 0x35, 0x4c, 0x58, 0xb0, 0x79, 0x00, 0xae, 0x1b, 0x9f, 0x79, - 0xee, 0xbb, 0x4f, 0x1b, 0xf9, 0xf6, 0x9b, 0x1b, 0x8c, 0x70, 0xa8, 0x54, 0x52, 0xe8, 0x48, 0x11, - 0xae, 0x22, 0xe5, 0xe4, 0x8d, 0x90, 0x6c, 0x69, 0xe4, 0x1b, 0xe1, 0x48, 0xa4, 0x40, 0x4b, 0xfa, - 0xd5, 0xdc, 0x3c, 0x74, 0xa4, 0x05, 0x9b, 0x30, 0xc7, 0xf8, 0x3d, 0x74, 0x08, 0xf0, 0xac, 0xf2, - 0xc0, 0xb1, 0xca, 0x24, 0x14, 0x9c, 0x79, 0x04, 0xac, 0x65, 0x6c, 0x2d, 0x16, 0x92, 0x50, 0x01, - 0x6b, 0x5d, 0x0c, 0xec, 0x61, 0x07, 0xa3, 0xb6, 0x56, 0xaf, 0x35, 0xdf, 0xe7, 0x30, 0xaf, 0xc2, - 0x7e, 0x2e, 0x1a, 0xa2, 0xb8, 0x10, 0x8d, 0x20, 0xfd, 0x38, 0xd2, 0x26, 0xcb, 0x92, 0xb1, 0xa2, - 0x16, 0xd6, 0xfb, 0x51, 0x60, 0xad, 0xb5, 0xe8, 0xfb, 0xa1, 0x44, 0x00, 0xaf, 0xd5, 0x47, 0x9a, - 0x9c, 0xe6, 0xb8, 0x99, 0x66, 0x79, 0x20, 0xcd, 0x72, 0x2f, 0xcd, 0x36, 0xce, 0xe4, 0xae, 0x0c, - 0x70, 0x97, 0x3b, 0xdc, 0xe5, 0x61, 0xee, 0xdc, 0xcd, 0x1d, 0xd6, 0xab, 0xd5, 0xda, 0x64, 0x0f, - 0x4d, 0xe3, 0x6d, 0x1b, 0x67, 0x4d, 0xdf, 0xb3, 0x9c, 0xf4, 0xd5, 0xc3, 0x59, 0xcb, 0x0d, 0xec, - 0x4b, 0xd4, 0xd1, 0x5f, 0x7c, 0x38, 0x37, 0x24, 0xe1, 0x1f, 0x62, 0x08, 0x72, 0xf4, 0x06, 0x10, - 0x3e, 0xdd, 0x58, 0x0a, 0xc4, 0x30, 0x54, 0x9b, 0x77, 0x5a, 0xba, 0x39, 0xc0, 0xd6, 0x93, 0x7d, - 0x1d, 0x3d, 0x07, 0xb1, 0xf8, 0x61, 0x5b, 0x20, 0x8b, 0x70, 0xfb, 0xcd, 0xa1, 0x83, 0x4a, 0xf1, - 0x27, 0x9c, 0x86, 0x61, 0x44, 0x61, 0xce, 0x58, 0x49, 0x8e, 0x24, 0xc8, 0xee, 0xa7, 0xc9, 0x7b, - 0x55, 0x68, 0x2a, 0x95, 0xca, 0x02, 0x8d, 0x92, 0xe4, 0x58, 0x6c, 0x42, 0xbf, 0xb1, 0x0a, 0x0f, - 0x73, 0x3f, 0xa0, 0xd0, 0x8e, 0xac, 0x92, 0x60, 0x62, 0xb1, 0xc8, 0x6a, 0xb1, 0x30, 0xd2, 0x59, - 0x49, 0x3e, 0xff, 0xbe, 0x81, 0x15, 0x56, 0x62, 0xb7, 0xc3, 0x34, 0xf5, 0x23, 0x9e, 0xc6, 0x65, - 0x3f, 0x98, 0xbf, 0x6f, 0x58, 0x1d, 0x4a, 0x5c, 0x47, 0x0a, 0xff, 0x9b, 0xfb, 0xd9, 0x4c, 0x03, - 0x7a, 0xce, 0x3b, 0x5b, 0x22, 0x17, 0x14, 0x1b, 0x22, 0xa3, 0x4b, 0x04, 0x2d, 0xe9, 0x86, 0xa4, - 0x90, 0x42, 0xbb, 0x3e, 0xa4, 0x04, 0xed, 0xa1, 0x3a, 0x68, 0xb6, 0xb1, 0x56, 0xcc, 0x1c, 0x28, - 0x43, 0xf3, 0xe7, 0xc6, 0x49, 0x0c, 0xaf, 0x84, 0x52, 0xc7, 0x69, 0xfc, 0x0c, 0x15, 0x6d, 0x1a, - 0x2e, 0x5b, 0x7c, 0x19, 0xaf, 0x44, 0xb8, 0x1e, 0x70, 0xe9, 0xfb, 0x01, 0x6b, 0x62, 0x45, 0xff, - 0x1f, 0xa7, 0xfd, 0xd0, 0x0f, 0x1f, 0x7f, 0x14, 0x48, 0x90, 0x4b, 0x7a, 0x5f, 0x25, 0x16, 0x2f, - 0x0b, 0xa1, 0x87, 0x0a, 0x17, 0x52, 0x5c, 0xc0, 0x3c, 0x8d, 0xdf, 0x79, 0xa2, 0x78, 0x65, 0x01, - 0xb4, 0x4f, 0x03, 0x8f, 0x05, 0x41, 0x0c, 0xee, 0xd9, 0xb6, 0x1d, 0x9e, 0x15, 0x27, 0x67, 0x9b, - 0x71, 0x33, 0x58, 0xcc, 0x5b, 0x74, 0xd3, 0x99, 0x87, 0x7f, 0x7f, 0xb6, 0xc2, 0x0b, 0xea, 0x7e, - 0x80, 0x8b, 0xf5, 0x43, 0x5c, 0x5e, 0x5d, 0x5a, 0x40, 0xeb, 0xa5, 0x96, 0x18, 0x63, 0x62, 0x81, - 0xe4, 0x04, 0xa6, 0x84, 0x5e, 0xc9, 0x79, 0x9c, 0x8a, 0xf8, 0x65, 0x67, 0xa1, 0xee, 0xa1, 0x4f, - 0xcc, 0xe3, 0x44, 0x85, 0xc2, 0x41, 0xe5, 0xad, 0xb1, 0xc7, 0x9e, 0x0d, 0xf1, 0x4a, 0x04, 0xa8, - 0x28, 0xc9, 0x44, 0x6a, 0x28, 0x45, 0x16, 0xda, 0x10, 0xca, 0xd8, 0x83, 0xd1, 0xbc, 0x95, 0xd0, - 0x1a, 0x19, 0x6b, 0x31, 0x21, 0xed, 0x25, 0xd0, 0xca, 0x5e, 0xe6, 0x09, 0xe7, 0x31, 0xf4, 0xfe, - 0xcd, 0xd4, 0x46, 0x94, 0x3c, 0x34, 0x5c, 0xf0, 0x18, 0x5a, 0x9f, 0x87, 0x00, 0x97, 0x0f, 0xd9, - 0xdb, 0x14, 0x19, 0x5e, 0x52, 0x2c, 0x18, 0xdf, 0xb0, 0x6a, 0xf7, 0x53, 0x6d, 0x94, 0x70, 0xc4, - 0x33, 0xdb, 0x97, 0x67, 0x27, 0x54, 0x7c, 0x12, 0xf3, 0xa2, 0xe3, 0x51, 0x42, 0xfb, 0x11, 0x5d, - 0x88, 0x99, 0x93, 0x85, 0xd5, 0x8b, 0xc5, 0x2f, 0x2b, 0x2c, 0x1a, 0xdf, 0x40, 0xf7, 0xd7, 0x87, - 0xa9, 0xe7, 0x39, 0xd8, 0x47, 0xa2, 0x92, 0x11, 0x84, 0x4b, 0xf3, 0x97, 0x3f, 0x5a, 0x1c, 0x7e, - 0x3c, 0x6f, 0xfe, 0x60, 0xb1, 0xf9, 0x4d, 0x56, 0x37, 0x4a, 0x36, 0x3a, 0xf0, 0x90, 0xed, 0xe2, - 0xd2, 0x22, 0xb4, 0x7c, 0xb0, 0xd4, 0xf7, 0xe6, 0x1e, 0x1a, 0x96, 0xfe, 0x09, 0x18, 0x2e, 0x9d, - 0x70, 0x8f, 0x98, 0xf7, 0x73, 0x37, 0x02, 0x0a, 0xa6, 0xa7, 0x67, 0xe6, 0xa5, 0x23, 0x82, 0x0c, - 0x00, 0x6d, 0x51, 0x03, 0x8f, 0xc4, 0x50, 0x10, 0x9e, 0xe8, 0x6c, 0x5b, 0xd1, 0x19, 0xab, 0x18, - 0xe7, 0xf8, 0x8c, 0x70, 0x52, 0xcc, 0x36, 0xaf, 0x9a, 0x3e, 0x2c, 0xfe, 0xfd, 0x9a, 0x4d, 0xc3, - 0xf1, 0x7c, 0x80, 0x2f, 0x63, 0x19, 0xc1, 0x31, 0xbe, 0xe6, 0x30, 0x64, 0xcf, 0x13, 0xb1, 0x87, - 0x8a, 0x12, 0xb2, 0x0c, 0x29, 0xb4, 0x95, 0x70, 0x3d, 0x42, 0xd2, 0x49, 0xcc, 0x35, 0x98, 0xed, - 0xd7, 0x61, 0x35, 0xd5, 0x99, 0xce, 0xe3, 0xf3, 0xd7, 0x7b, 0x3e, 0x87, 0x0e, 0x47, 0x89, 0x15, - 0xb7, 0xcf, 0x29, 0xcb, 0x15, 0x8c, 0x76, 0x48, 0x70, 0x5c, 0xae, 0x84, 0x21, 0x1c, 0x57, 0xb4, - 0x0d, 0xc7, 0x35, 0x51, 0x16, 0xb0, 0x1c, 0x08, 0xad, 0x31, 0x62, 0x97, 0x22, 0x58, 0x4e, 0xff, - 0x84, 0x65, 0x95, 0x1b, 0x26, 0x7b, 0xc8, 0xb6, 0x26, 0x55, 0x25, 0x85, 0x91, 0x34, 0x06, 0xd6, - 0x99, 0x23, 0xec, 0x16, 0xe0, 0x30, 0xd5, 0x5b, 0xd3, 0x14, 0x6b, 0x56, 0xb0, 0xd2, 0x5f, 0xde, - 0x4e, 0x0d, 0xac, 0xf4, 0x97, 0x33, 0x0e, 0x2f, 0xf7, 0x96, 0xc1, 0xdc, 0xdd, 0xde, 0xde, 0x52, - 0x26, 0x91, 0xcd, 0x36, 0x85, 0xc9, 0x11, 0xf0, 0x93, 0x03, 0x9c, 0x8b, 0x18, 0xb2, 0xb2, 0x90, - 0x8d, 0x85, 0x31, 0x23, 0xd5, 0x5b, 0xb5, 0xd8, 0x0a, 0xb1, 0x7b, 0x54, 0xc3, 0xd4, 0xc8, 0xe7, - 0xc9, 0xfe, 0xa7, 0x6f, 0x7c, 0x20, 0x2b, 0xc2, 0xaf, 0x3c, 0x7e, 0x55, 0x12, 0x45, 0x11, 0xe1, - 0xd7, 0xff, 0x5d, 0xae, 0x94, 0x2d, 0xe2, 0x25, 0x26, 0x1a, 0xce, 0x3a, 0xf2, 0x6d, 0x8f, 0x20, - 0xd8, 0x1e, 0x20, 0x38, 0x4e, 0x59, 0x72, 0x32, 0xce, 0x6f, 0x67, 0x04, 0x41, 0x13, 0xb5, 0x50, - 0xb5, 0x56, 0x05, 0x31, 0x10, 0x9d, 0x2d, 0x71, 0x77, 0xfd, 0x04, 0x1c, 0x6a, 0x68, 0x71, 0xef, - 0xee, 0x59, 0x99, 0x07, 0x39, 0x2f, 0x2e, 0x2c, 0x7f, 0x8f, 0xbb, 0x6b, 0x95, 0x8c, 0x5d, 0xa3, - 0x7d, 0xac, 0x72, 0xae, 0xb0, 0x37, 0x8f, 0xbd, 0x64, 0x3d, 0x2b, 0xc6, 0xde, 0xf1, 0xec, 0xdc, - 0xd2, 0x1c, 0xbc, 0x31, 0x0a, 0x81, 0xfd, 0x19, 0x7b, 0x98, 0xe2, 0xee, 0xa3, 0x5c, 0x8c, 0x94, - 0x15, 0x9c, 0xab, 0xfb, 0xb5, 0xd2, 0x28, 0x9b, 0x6b, 0x61, 0x34, 0x7c, 0x5e, 0x09, 0x83, 0x42, - 0x32, 0x4d, 0xc3, 0x06, 0xea, 0x68, 0x8a, 0x10, 0xa0, 0x4c, 0xc5, 0x8a, 0x3a, 0x3c, 0x5b, 0xce, - 0x23, 0x7b, 0x1a, 0x78, 0x81, 0xd5, 0xf9, 0xc8, 0x42, 0xc3, 0x2f, 0x66, 0xad, 0xcb, 0x4b, 0xff, - 0x09, 0x9f, 0xb1, 0x0e, 0x31, 0xf7, 0x58, 0x9b, 0x47, 0x38, 0xbf, 0xf1, 0xf2, 0x04, 0xb2, 0xf7, - 0x01, 0x72, 0x14, 0x85, 0x17, 0xd5, 0x09, 0x83, 0x83, 0xd5, 0xa6, 0xa6, 0xee, 0x95, 0xaf, 0xed, - 0x65, 0xa7, 0x42, 0x37, 0x37, 0x4d, 0xc5, 0xd8, 0x98, 0x7d, 0xd3, 0xc6, 0x44, 0x0a, 0xc5, 0x3b, - 0x36, 0x9e, 0xca, 0x6e, 0x9b, 0x7b, 0xfb, 0xba, 0x91, 0xa4, 0xa4, 0x89, 0xab, 0x25, 0x91, 0xcb, - 0x5b, 0xac, 0x89, 0x5a, 0x34, 0xc4, 0x73, 0xc4, 0xdd, 0xc7, 0x60, 0x9e, 0xab, 0xbb, 0x04, 0x95, - 0xd0, 0x41, 0x4b, 0xc4, 0x30, 0x10, 0x05, 0xe0, 0xb9, 0x97, 0x7a, 0x13, 0xbc, 0x14, 0xfc, 0x0d, - 0x8a, 0x8a, 0x3f, 0x42, 0x0f, 0xe2, 0xfd, 0x91, 0x6e, 0xdf, 0xda, 0xb0, 0x49, 0xa6, 0xce, 0x64, - 0x5d, 0x7f, 0xbe, 0x68, 0x0f, 0x6e, 0x21, 0x08, 0x9e, 0x43, 0xde, 0xf7, 0xde, 0xc8, 0xeb, 0x1c, - 0xcb, 0xe1, 0x59, 0x27, 0xe2, 0xe9, 0x06, 0xa6, 0x9a, 0xe1, 0xb4, 0x0f, 0x9a, 0xf4, 0x95, 0x96, - 0x63, 0x09, 0x09, 0xbb, 0x39, 0x54, 0xe9, 0x6e, 0xb1, 0xd3, 0xbc, 0x84, 0x12, 0xb5, 0xc0, 0xc2, - 0x14, 0x15, 0x63, 0xa2, 0x0c, 0x47, 0x1f, 0xa5, 0x3f, 0x44, 0x77, 0x64, 0x9d, 0x98, 0xa5, 0x37, - 0x2e, 0x0c, 0x95, 0x26, 0x97, 0x48, 0x6a, 0x01, 0x5a, 0x03, 0x8a, 0x82, 0x9f, 0x95, 0xf6, 0x9d, - 0xe6, 0x2c, 0xae, 0xe6, 0x72, 0x71, 0x66, 0x75, 0x77, 0xcd, 0xf0, 0x6b, 0x2c, 0x2e, 0xc3, 0xfe, - 0x98, 0x92, 0x0c, 0x4e, 0x8b, 0x21, 0xad, 0xde, 0x70, 0x8a, 0xfb, 0xb8, 0x55, 0x5f, 0x7e, 0xd5, - 0xd1, 0xe2, 0xf4, 0x46, 0xd0, 0x97, 0xa2, 0x27, 0xe9, 0xff, 0xda, 0x74, 0xff, 0xdf, 0x4d, 0x9b, - 0xd2, 0x0f, 0xed, 0xdf, 0xac, 0x33, 0xad, 0xb0, 0xae, 0xcd, 0xdb, 0x8d, 0xb7, 0x77, 0xd2, 0x71, - 0x8d, 0x44, 0x7e, 0xaf, 0x75, 0x63, 0x5c, 0x61, 0xfb, 0xd6, 0x3d, 0xb6, 0x4c, 0xfc, 0x20, 0x58, - 0x15, 0xb4, 0x19, 0x9c, 0xe7, 0x42, 0xbe, 0x00, 0x6c, 0x50, 0x35, 0x76, 0xc3, 0x60, 0x0c, 0x56, - 0xe6, 0x32, 0x33, 0xe3, 0x16, 0xbe, 0x40, 0x99, 0x96, 0x72, 0x3b, 0xe9, 0xc9, 0xb1, 0x5e, 0x6b, - 0x94, 0x7f, 0x08, 0x1c, 0x3f, 0xcc, 0x9e, 0xc4, 0xfa, 0x00, 0xbe, 0xa9, 0xc6, 0xe6, 0x9f, 0x34, - 0xe3, 0x7b, 0x11, 0x5f, 0xde, 0xf2, 0xf9, 0x42, 0x1e, 0x2b, 0x12, 0x25, 0x14, 0x7b, 0x12, 0xa3, - 0x26, 0xd7, 0x13, 0x74, 0x42, 0x86, 0xd3, 0xaa, 0x71, 0x60, 0x35, 0xf0, 0x8c, 0xc1, 0x48, 0x5c, - 0x8e, 0x60, 0x35, 0x21, 0x6d, 0x3d, 0xdb, 0xde, 0xe2, 0x46, 0x6b, 0xdd, 0x65, 0x8d, 0x9a, 0x13, - 0x26, 0xdb, 0x4a, 0xc4, 0x31, 0xac, 0x6b, 0xad, 0x24, 0x52, 0xd6, 0xc2, 0xa5, 0x48, 0x84, 0xed, - 0xc6, 0xd4, 0x64, 0xb5, 0x7f, 0x01, 0xbb, 0x13, 0x93, 0xb5, 0xe1, 0x0d, 0x1c, 0x4c, 0xcc, 0x32, - 0x0f, 0xbf, 0x85, 0x5c, 0xa1, 0x8c, 0x0e, 0xb9, 0x7f, 0x9c, 0xc6, 0x16, 0x61, 0x7e, 0x40, 0x05, - 0x32, 0xad, 0xde, 0x87, 0xa6, 0x4a, 0xd0, 0x2a, 0x5e, 0x0a, 0xa9, 0xe2, 0x0e, 0xda, 0xe2, 0x16, - 0x06, 0x5c, 0x16, 0x47, 0xb0, 0xa1, 0xde, 0xda, 0xa9, 0x47, 0xf9, 0x7c, 0x3e, 0x87, 0x83, 0x05, - 0xf8, 0xf6, 0xa4, 0xf7, 0xf2, 0x25, 0xdd, 0xae, 0xbd, 0xf6, 0xc7, 0xb9, 0x11, 0xbb, 0xe6, 0x06, - 0xc7, 0x6b, 0x18, 0x8a, 0x26, 0x14, 0x4b, 0x18, 0x0b, 0x72, 0xa3, 0xd5, 0x8b, 0x29, 0x44, 0xc3, - 0xb1, 0x11, 0x6d, 0x60, 0x7e, 0x04, 0x7c, 0xf6, 0xd6, 0x8b, 0x83, 0xd4, 0xff, 0x4b, 0x23, 0xaf, - 0xe1, 0xc7, 0x23, 0xc1, 0xeb, 0x62, 0xea, 0xe2, 0x0e, 0x26, 0x06, 0x36, 0x9b, 0x03, 0xb9, 0x46, - 0xa2, 0x3c, 0x33, 0x2d, 0x93, 0x81, 0x03, 0x49, 0x23, 0x00, 0x6d, 0x8f, 0x05, 0x72, 0x03, 0x31, - 0x0c, 0x45, 0x55, 0x0e, 0x94, 0x99, 0x7b, 0x86, 0xe2, 0x05, 0x3a, 0xd4, 0x81, 0x32, 0x0d, 0x6a, - 0x16, 0xb4, 0xad, 0x97, 0xe4, 0x48, 0x0e, 0xdc, 0x3e, 0xcc, 0xc9, 0x80, 0xf9, 0xff, 0xf7, 0x0c, - 0xbf, 0xc6, 0x63, 0x7c, 0xbc, 0x45, 0x21, 0x4b, 0x9e, 0x23, 0x81, 0x22, 0x73, 0x86, 0x4a, 0x52, - 0x23, 0x81, 0xd5, 0x07, 0x0c, 0x38, 0xb3, 0x5e, 0x6e, 0x38, 0x47, 0xf1, 0x42, 0xc3, 0xe8, 0xa7, - 0x84, 0x50, 0x48, 0x8c, 0x2a, 0x66, 0x1c, 0x52, 0x06, 0x85, 0x41, 0x12, 0x61, 0x25, 0x97, 0xe8, - 0xfe, 0x66, 0x5e, 0x04, 0xce, 0xaa, 0xea, 0x43, 0x79, 0x2c, 0x56, 0x1e, 0x02, 0xf7, 0xd0, 0x17, - 0x13, 0xfe, 0x11, 0x8a, 0xde, 0xdc, 0xde, 0xc0, 0xfa, 0x18, 0x7f, 0xe5, 0xe3, 0x76, 0x7e, 0x1b, - 0x5a, 0x85, 0xe3, 0x4e, 0xe5, 0x5c, 0x13, 0xd8, 0x1e, 0x54, 0x92, 0xda, 0x9c, 0xeb, 0xb0, 0xc3, - 0x7e, 0xaf, 0x11, 0xb3, 0x8a, 0x73, 0x13, 0x5f, 0xdc, 0xc3, 0xc9, 0xbb, 0x82, 0x52, 0xae, 0x2c, - 0x50, 0xf8, 0x79, 0x7a, 0x99, 0xcb, 0xbe, 0xea, 0xb0, 0xcf, 0xa3, 0x6a, 0x9a, 0xc2, 0xb9, 0x92, - 0x18, 0xaf, 0x3d, 0x77, 0x4c, 0xce, 0xeb, 0x26, 0x32, 0xb0, 0x3e, 0xe6, 0xb3, 0x6e, 0x3d, 0x71, - 0xc6, 0x75, 0xe2, 0xd4, 0x68, 0xf7, 0x84, 0x24, 0xb0, 0x3e, 0x74, 0xdc, 0x9f, 0x72, 0x3c, 0x98, - 0xf4, 0xd8, 0x18, 0x73, 0x3c, 0x9a, 0x72, 0x5c, 0xef, 0x3b, 0xae, 0x3b, 0x92, 0xcc, 0xe4, 0x5e, - 0x8a, 0xc1, 0xbf, 0xe7, 0xa0, 0x05, + 0x8c, 0x51, 0x03, 0x6f, 0x47, 0x41, 0x0c, 0xef, 0x82, 0xd9, 0x76, 0x30, 0xdb, 0x8b, 0x93, 0xd9, + 0x66, 0xdc, 0x1c, 0x9a, 0x3c, 0xf7, 0xad, 0x77, 0xd3, 0xa7, 0x9f, 0xcd, 0x7f, 0x74, 0x57, 0xff, + 0x00, 0xab, 0xfa, 0xd6, 0x13, 0xae, 0xf2, 0x91, 0x1a, 0x3b, 0x9e, 0x41, 0xc3, 0x69, 0xae, 0xb2, + 0x90, 0x33, 0x14, 0x65, 0x43, 0x46, 0x9d, 0x10, 0x74, 0x5f, 0x3a, 0x0d, 0xd5, 0x71, 0xe8, 0x1c, + 0xa6, 0x6c, 0x29, 0x85, 0xea, 0x23, 0xca, 0x49, 0x79, 0x12, 0xa8, 0x96, 0x97, 0x1f, 0xb2, 0x76, + 0x24, 0x57, 0x24, 0x98, 0x5e, 0x78, 0x0f, 0x35, 0xcc, 0x29, 0x3e, 0x27, 0xa0, 0xed, 0x4b, 0xad, + 0xda, 0x93, 0xa4, 0x61, 0xa6, 0x12, 0x34, 0x81, 0xf2, 0x00, 0xeb, 0x8b, 0x27, 0x73, 0xf3, 0xd3, + 0x38, 0x33, 0x79, 0x8c, 0xbb, 0xe4, 0x02, 0xdc, 0x0e, 0xfd, 0x8f, 0x30, 0x7a, 0x1f, 0x61, 0x34, + 0x7e, 0x80, 0xd1, 0xf8, 0x76, 0x3c, 0x61, 0x51, 0xc8, 0x5e, 0x61, 0xc6, 0x48, 0x37, 0x0f, 0x99, + 0xc7, 0xed, 0x8e, 0x32, 0xc7, 0xe2, 0xa0, 0xe9, 0x03, 0x96, 0x92, 0xa7, 0x0b, 0xab, 0x67, 0x4b, + 0x78, 0x20, 0x8c, 0x3f, 0xed, 0x82, 0xce, 0xc2, 0xb7, 0x55, 0x9e, 0x88, 0x32, 0x31, 0xc9, 0xe3, + 0xb2, 0x1f, 0x21, 0x0f, 0x3e, 0x42, 0x6e, 0xfd, 0x70, 0xa6, 0xb5, 0x30, 0xc8, 0x6d, 0x1f, 0x8f, + 0x9c, 0x2b, 0x6f, 0x82, 0xa9, 0x9f, 0xad, 0xf9, 0x28, 0x47, 0x11, 0x65, 0x24, 0xa1, 0xc1, 0xd5, + 0xe9, 0xe9, 0x8f, 0xcc, 0xee, 0xc7, 0x93, 0x6b, 0x6c, 0x5c, 0x8c, 0x2c, 0x20, 0x08, 0xf7, 0x2a, + 0x00, 0xad, 0x50, 0xc3, 0x7a, 0x04, 0x41, 0x10, 0xae, 0x5c, 0x62, 0xdb, 0x79, 0x84, 0xb5, 0xae, + 0xb1, 0x8d, 0x63, 0x8d, 0x6a, 0x33, 0xfd, 0x6d, 0x63, 0x52, 0xdd, 0x8b, 0xb7, 0x8f, 0x6d, 0x9d, + 0xba, 0x4b, 0xbf, 0x60, 0x8d, 0x34, 0xb1, 0x08, 0x71, 0x25, 0x9b, 0x45, 0xa6, 0x84, 0x7c, 0x47, + 0x0c, 0xbd, 0xb6, 0x95, 0xc9, 0x16, 0x9f, 0x35, 0x86, 0xca, 0x4f, 0xff, 0xae, 0xa3, 0xfd, 0xdd, + 0xbd, 0x33, 0x0c, 0x8d, 0x4a, 0x90, 0xfd, 0x48, 0x18, 0xac, 0xdb, 0x00, 0x06, 0xee, 0xe6, 0x0c, + 0x83, 0xc6, 0x28, 0xb4, 0x0d, 0x86, 0x01, 0x47, 0xac, 0x84, 0xf6, 0x25, 0x86, 0xb1, 0xef, 0xa0, + 0x6d, 0x65, 0xff, 0x70, 0x09, 0xb7, 0x85, 0xae, 0x55, 0xa5, 0x69, 0x62, 0x25, 0x9d, 0x7e, 0x82, + 0x84, 0x75, 0x92, 0x8e, 0x42, 0x0c, 0x5d, 0x31, 0x7b, 0x0b, 0xec, 0x6b, 0x61, 0xf4, 0x3d, 0x7a, + 0x20, 0x09, 0x16, 0x30, 0xb1, 0x30, 0x7b, 0xc3, 0xd3, 0x5b, 0x13, 0xd6, 0xa2, 0x32, 0x11, 0x29, + 0xe8, 0x7d, 0x04, 0x18, 0xc5, 0x80, 0x45, 0x74, 0x4e, 0x48, 0x36, 0xd1, 0xa6, 0x09, 0xbd, 0x96, + 0xb4, 0x35, 0x0c, 0x1d, 0x2b, 0xd9, 0x4c, 0xee, 0x5d, 0xc4, 0x1f, 0x80, 0x8d, 0x99, 0xc0, 0x12, + 0x37, 0x88, 0x51, 0x5d, 0x38, 0x07, 0x7d, 0xc6, 0x28, 0xbc, 0x6b, 0xc0, 0x04, 0xbe, 0x9c, 0x75, + 0x55, 0xd2, 0x4f, 0x6c, 0xb7, 0x3c, 0xe3, 0x37, 0x3c, 0x53, 0xb7, 0xdf, 0x7f, 0x67, 0xeb, 0x50, + 0x64, 0x63, 0xb4, 0x46, 0xfa, 0xfc, 0x2c, 0xcb, 0xf8, 0x2e, 0x4b, 0x0e, 0x73, 0xd9, 0xf7, 0x9d, + 0x57, 0xeb, 0x52, 0xde, 0xf9, 0xbf, 0x02, 0x7d, 0xd0, 0x05, 0x6e, 0xc5, 0x30, 0x0c, 0x80, 0x61, + 0x0b, 0x47, 0x9d, 0x68, 0x4c, 0xa2, 0x31, 0x33, 0xdd, 0x60, 0xb7, 0xb0, 0x0a, 0xee, 0x1a, 0x2d, + 0x89, 0x3b, 0xc7, 0x8f, 0x4e, 0xff, 0x98, 0x49, 0x18, 0xce, 0xa7, 0x1f, 0x0a, 0xb2, 0x4a, 0x29, + 0x4a, 0xfa, 0xfa, 0x82, 0x29, 0xbb, 0x32, 0xf6, 0x86, 0x3d, 0x4a, 0x9c, 0x19, 0xc6, 0x9a, 0xc9, + 0x0d, 0x44, 0x7f, 0x26, 0x04, 0x74, 0x9c, 0x91, 0x83, 0x48, 0xa8, 0xa4, 0x58, 0x49, 0x60, 0x1b, + 0x13, 0x31, 0xd9, 0x2f, 0x21, 0x85, 0xd2, 0x73, 0x0d, 0x76, 0x38, 0x09, 0x24, 0x55, 0x12, 0x74, + 0xff, 0xaa, 0xb0, 0xc9, 0xec, 0xb0, 0xb7, 0x00, 0x7b, 0x38, 0xb9, 0x17, 0x05, 0xf2, 0x81, 0x05, + 0x22, 0x25, 0x71, 0xc6, 0xc7, 0x16, 0xd3, 0x22, 0x6e, 0x2f, 0xd7, 0x8c, 0x16, 0x5c, 0x51, 0xcc, + 0x4c, 0x28, 0x6d, 0xdc, 0x98, 0xd1, 0x24, 0x96, 0xe0, 0x2e, 0xaf, 0x58, 0x0b, 0x77, 0x95, 0x90, + 0xc0, 0x5d, 0x57, 0x77, 0x3c, 0x14, 0x9d, 0x4d, 0x89, 0xce, 0x27, 0x7f, 0x3d, 0x19, 0x13, 0x5d, + 0x4e, 0x89, 0x8e, 0xfb, 0x22, 0xf8, 0xe9, 0xc5, 0xd0, 0xa7, 0xef, 0x8f, 0x79, 0xdf, 0x63, 0x4e, + 0x8e, 0xf3, 0x1c, 0xce, 0x3c, 0x1c, 0xb7, 0x09, 0xa3, 0xe9, 0xfc, 0x48, 0x03, 0x90, 0x84, 0x97, + 0x76, 0x5c, 0xcb, 0x12, 0x23, 0x6b, 0x8c, 0x9e, 0x91, 0xea, 0x4a, 0xe2, 0x63, 0x8b, 0xbd, 0x8f, + 0x03, 0xec, 0x2c, 0xdb, 0x9d, 0xa8, 0x39, 0xa8, 0xb7, 0xfa, 0xfc, 0xfc, 0x36, 0xcf, 0xd8, 0x95, + 0x4d, 0x78, 0x5a, 0x8d, 0x51, 0x35, 0x56, 0x44, 0x41, 0x10, 0xec, 0x08, 0x77, 0x77, 0xc8, 0x71, + 0x87, 0x1b, 0x70, 0x00, 0xf2, 0x7a, 0x23, 0xfd, 0xd8, 0x6f, 0xd3, 0x63, 0x6b, 0xb7, 0xc7, 0xdd, + 0x36, 0x69, 0xd7, 0x2a, 0xba, 0xe1, 0x3a, 0xb3, 0x41, 0x3e, 0x3e, 0x3e, 0x43, 0x64, 0xcf, 0x2a, + 0x73, 0x44, 0x2d, 0x51, 0x41, 0xb2, 0x82, 0x13, 0x70, 0xef, 0x21, 0xe2, 0x54, 0x8d, 0xc4, 0x2e, + 0x49, 0x4c, 0x34, 0x29, 0xd2, 0x3c, 0x38, 0xb1, 0xc3, 0x91, 0x26, 0x9e, 0x82, 0x0f, 0xba, 0x5b, + 0xe4, 0x96, 0xb4, 0x33, 0x6c, 0x91, 0x7c, 0xad, 0xfa, 0x30, 0xd2, 0x78, 0xe5, 0x0a, 0x71, 0x88, + 0xca, 0x16, 0x02, 0x5d, 0x33, 0xed, 0xb5, 0x93, 0xa6, 0x8d, 0xc1, 0x96, 0x6c, 0x7e, 0x58, 0x32, + 0x7c, 0x7b, 0x7c, 0x7d, 0xf4, 0xd3, 0x44, 0xd0, 0xc6, 0xc3, 0x48, 0xd0, 0xce, 0x93, 0x3d, 0x51, + 0x15, 0x29, 0xa1, 0x11, 0xcb, 0x0d, 0x4d, 0xbc, 0x6d, 0xa1, 0x45, 0x1d, 0x0b, 0x7b, 0xc7, 0xe0, + 0xe4, 0x9d, 0x74, 0x1f, 0x7c, 0xd1, 0xcf, 0x73, 0xd1, 0x84, 0x9c, 0x3f, 0x7e, 0x03, 0x5a, 0xf9, + 0x9c, 0x1b, 0xce, 0xc7, 0x03, 0x62, 0x32, 0x22, 0xdd, 0x87, 0x92, 0xce, 0xc9, 0x5b, 0x39, 0xad, + 0xfc, 0xdd, 0x30, 0x93, 0xac, 0x51, 0xd1, 0x0e, 0x38, 0x9e, 0x5a, 0x2f, 0x2c, 0x45, 0x65, 0xaa, + 0xc7, 0x45, 0xc7, 0xf8, 0x70, 0xd9, 0xe7, 0xa3, 0x17, 0x5f, 0x1f, 0xfa, 0x96, 0xb9, 0x07, 0x7d, + 0x90, 0x35, 0x7a, 0x03, 0x41, 0x0c, 0x85, 0xd5, 0x85, 0xaa, 0x30, 0x63, 0x99, 0x74, 0xeb, 0x4b, + 0xe4, 0x16, 0x5a, 0x18, 0x4d, 0xac, 0xcf, 0x43, 0x91, 0x66, 0xed, 0xe3, 0x9b, 0x99, 0xaa, 0x41, + 0x3d, 0xf8, 0xa1, 0x4b, 0x2e, 0x53, 0x83, 0x59, 0xaa, 0xa6, 0x47, 0x82, 0xfd, 0x02, 0x9b, 0xe8, + 0x53, 0x15, 0x38, 0x06, 0x94, 0xca, 0x70, 0xc4, 0xda, 0x11, 0x5a, 0xf2, 0xd1, 0x5a, 0xf8, 0x0e, + 0xf0, 0x65, 0x5b, 0xe7, 0xa6, 0xe7, 0xf1, 0xbe, 0xd5, 0x7a, 0xfd, 0x69, 0xc0, 0x96, 0x17, 0xe7, + 0x9f, 0x00, 0x57, 0x3d, 0x56, 0x45, 0x1f, 0x0d, 0x79, 0xb8, 0x12, 0x4a, 0x54, 0x65, 0x12, 0x78, + 0xc2, 0x5a, 0xd8, 0xfc, 0x11, 0x92, 0xa6, 0x10, 0x07, 0xf0, 0x25, 0x5a, 0x74, 0x0a, 0x78, 0x8e, + 0xb5, 0x92, 0xf4, 0x49, 0xd0, 0xff, 0xe7, 0x0c, 0xd7, 0x31, 0x7a, 0x9c, 0x5d, 0xc0, 0x2b, 0x6e, + 0xbe, 0x5d, 0x29, 0x05, 0x8d, 0x02, 0x57, 0x63, 0x39, 0xcf, 0xa1, 0x72, 0xd8, 0x74, 0xab, 0x0c, + 0xf0, 0x3b, 0xab, 0xb2, 0xbf, 0xc2, 0x58, 0x25, 0x29, 0x3c, 0xb5, 0x5a, 0xc3, 0xd3, 0x24, 0x27, + 0x9c, 0xaf, 0xa5, 0x3b, 0x5f, 0xa6, 0xbb, 0x58, 0xf3, 0x3d, 0xdf, 0xd4, 0x3f, 0xed, 0x1c, 0xd1, + 0x9d, 0x50, 0x59, 0x57, 0x7f, 0x9b, 0x45, 0xdd, 0x6f, 0x72, 0xb5, 0x85, 0xe0, 0x69, 0x86, 0xe0, + 0x7a, 0xb3, 0xe6, 0x07, 0x2a, 0xfb, 0x8d, 0x40, 0xb7, 0x5b, 0x20, 0xce, 0x67, 0x20, 0xb6, 0x83, + 0x8e, 0x00, 0x84, 0x51, 0x43, 0x9a, 0x44, 0x41, 0x0c, 0xce, 0xb6, 0xb1, 0x1e, 0x1b, 0x9b, 0xb1, + 0xee, 0x93, 0x56, 0xea, 0x9b, 0x3c, 0x24, 0xa5, 0xc6, 0xf1, 0xdb, 0x7e, 0x2c, 0xff, 0x2a, 0xc0, + 0x3f, 0x65, 0x91, 0xfa, 0x38, 0xfa, 0xc3, 0x9f, 0x79, 0xf3, 0x8b, 0x7d, 0xcd, 0x6d, 0x57, 0x58, + 0x05, 0x7d, 0x77, 0xc0, 0x8a, 0x66, 0x98, 0x65, 0x68, 0x28, 0x57, 0x81, 0xe6, 0x31, 0xda, 0xcb, + 0x68, 0x01, 0x1a, 0x03, 0x77, 0x36, 0xac, 0x87, 0x57, 0x73, 0xd1, 0x66, 0x32, 0x0c, 0xbd, 0xcd, + 0x78, 0xcc, 0x86, 0xd7, 0x93, 0xfb, 0xdc, 0xc5, 0xb8, 0x9e, 0xb4, 0x69, 0x62, 0xbb, 0x12, 0x58, + 0x25, 0xe5, 0x88, 0xd1, 0xc4, 0xaa, 0xa8, 0x76, 0x0d, 0x7e, 0xb7, 0x9b, 0x7f, 0x37, 0xcf, 0x5f, + 0x8f, 0x77, 0xf3, 0x9b, 0x05, 0x0e, 0x70, 0xbd, 0x46, 0x1f, 0x04, 0x6e, 0x56, 0x27, 0x12, 0xb8, + 0x98, 0x79, 0xac, 0xa0, 0xcd, 0xf2, 0x9c, 0xf4, 0x3c, 0x83, 0x36, 0x96, 0x02, 0xb7, 0x9b, 0x13, + 0x09, 0x34, 0xf7, 0x0e, 0xe4, 0xc9, 0x52, 0x37, 0x92, 0x87, 0x5b, 0xd4, 0x5e, 0x20, 0x3f, 0x22, + 0x8f, 0x73, 0x32, 0x9c, 0xa9, 0xe6, 0xb8, 0x5a, 0xd8, 0x47, 0x4e, 0xab, 0x0e, 0x29, 0xf0, 0x69, + 0x03, 0xbc, 0xee, 0x3e, 0x4e, 0xca, 0x21, 0x60, 0xae, 0x03, 0xca, 0xa1, 0x69, 0xbb, 0x3e, 0x72, + 0x9c, 0xcb, 0xa6, 0x03, 0xbb, 0x22, 0x05, 0x68, 0x31, 0x00, 0x6d, 0x90, 0x55, 0x92, 0x03, 0x30, + 0x08, 0x86, 0x79, 0x5d, 0x77, 0xf7, 0x33, 0xac, 0xde, 0x86, 0x89, 0x90, 0x36, 0xb3, 0xf1, 0x50, + 0x3b, 0x7d, 0x5d, 0x33, 0x7d, 0xc2, 0xe1, 0xe3, 0x87, 0x2e, 0x39, 0x26, 0x85, 0xfd, 0x2f, 0x2c, + 0x7f, 0xa8, 0xa2, 0x4f, 0x22, 0xd8, 0x18, 0xb0, 0x08, 0x6d, 0x23, 0x4a, 0x47, 0xf0, 0x8e, 0xa9, + 0xc2, 0x8b, 0xe9, 0x39, 0x07, 0x2f, 0xbd, 0x2a, 0xe1, 0x65, 0x60, 0x8d, 0x85, 0x93, 0x7f, 0x5b, + 0x2b, 0xfa, 0xa8, 0xc9, 0xc3, 0x49, 0xa1, 0x44, 0x82, 0xa9, 0xc0, 0x0d, 0x46, 0x59, 0xa9, 0xf4, + 0xa9, 0xa0, 0xcf, 0xcc, 0x70, 0x1a, 0xa3, 0xc7, 0x45, 0x02, 0xee, 0x9b, 0xda, 0x49, 0xa5, 0x50, + 0x63, 0x81, 0x13, 0xa6, 0xe2, 0x6d, 0x10, 0x0e, 0x55, 0x57, 0x4c, 0x47, 0x0c, 0xef, 0xc5, 0xf8, + 0x98, 0x13, 0x7c, 0xcc, 0x08, 0x3e, 0xe6, 0x04, 0x17, 0x5b, 0x04, 0x17, 0x29, 0x16, 0x2e, 0xc2, + 0x32, 0xae, 0x50, 0x9a, 0x63, 0x4f, 0x1b, 0x90, 0xa6, 0x72, 0xb1, 0x86, 0x7f, 0x68, 0x2a, 0x97, + 0x5b, 0xf0, 0xcf, 0xed, 0xd4, 0x12, 0xfe, 0x62, 0x17, 0xfe, 0x68, 0xb5, 0xeb, 0x12, 0x65, 0xb1, + 0xba, 0x43, 0x48, 0x35, 0x85, 0x38, 0x80, 0x2b, 0x47, 0x1d, 0xa1, 0x46, 0x98, 0x44, 0x61, 0xcb, + 0xb3, 0xcf, 0x98, 0x2a, 0xc3, 0xd5, 0xee, 0xd6, 0xa3, 0xad, 0x8b, 0xad, 0x94, 0x87, 0xcb, 0x8b, + 0x87, 0xcd, 0xc5, 0xfd, 0x72, 0xa1, 0x21, 0x1f, 0x03, 0xbc, 0x9a, 0x9e, 0x73, 0x2b, 0xbf, 0x57, + 0xe5, 0xd2, 0x9d, 0x00, 0x75, 0xd1, 0x85, 0x6e, 0x03, 0x31, 0x0c, 0x00, 0x50, 0x0b, 0xc7, 0xcc, + 0xcc, 0x2c, 0x1a, 0xfc, 0xc3, 0x98, 0x49, 0xec, 0x23, 0xdf, 0x1a, 0xf5, 0xc2, 0x5e, 0xfb, 0xf9, + 0x65, 0x06, 0x41, 0x38, 0x79, 0xb1, 0x0d, 0x39, 0xca, 0x98, 0x62, 0x2c, 0xdc, 0x20, 0xa7, 0x8c, + 0xb1, 0x96, 0x26, 0x54, 0x42, 0x2b, 0x74, 0x61, 0x22, 0x34, 0x16, 0x45, 0x2a, 0x30, 0x25, 0xa9, + 0x15, 0x4c, 0x3b, 0x32, 0x14, 0x32, 0x39, 0x58, 0xc6, 0xc8, 0x89, 0xe4, 0x8f, 0x90, 0xbc, 0x51, + 0xba, 0x08, 0x33, 0x5a, 0x4b, 0xf4, 0xe4, 0x0a, 0xe4, 0x60, 0xda, 0x93, 0xf2, 0xba, 0xd2, 0x33, + 0x39, 0x29, 0x54, 0x98, 0x61, 0x9c, 0x0b, 0x19, 0xe0, 0xae, 0xce, 0xfc, 0x0a, 0x47, 0x19, 0x79, + 0x8f, 0x6f, 0xa1, 0x21, 0xd7, 0xc7, 0x45, 0x19, 0xc1, 0x19, 0x1a, 0x0f, 0xc7, 0xff, 0x3e, 0x82, + 0xe5, 0xbc, 0xf0, 0x1e, 0xa5, 0x4e, 0x48, 0xc2, 0x72, 0x4b, 0xdf, 0xee, 0xd1, 0x77, 0x74, 0x54, + 0xb7, 0x51, 0x5a, 0x66, 0x58, 0xe9, 0xf8, 0xcc, 0x1e, 0x76, 0xef, 0xcd, 0x7e, 0xb9, 0x30, 0xce, + 0x0f, 0x71, 0x2f, 0xaa, 0xee, 0x69, 0xd5, 0x5d, 0xed, 0x70, 0x57, 0x5b, 0xee, 0x6e, 0x8f, 0xbb, + 0xd7, 0xfd, 0xf6, 0x5a, 0x87, 0x7b, 0xd0, 0xe3, 0x8e, 0x7e, 0x3e, 0x5d, 0x0f, 0x34, 0x77, 0xaa, + 0xe6, 0x66, 0xd5, 0xdc, 0xac, 0x66, 0x1a, 0x26, 0x5b, 0xda, 0x62, 0x8f, 0xb6, 0xe9, 0xfc, 0xd5, + 0xf5, 0x15, 0x2c, 0x75, 0x3f, 0x3c, 0xd5, 0x81, 0xae, 0xf4, 0xa0, 0x93, 0x8d, 0x4a, 0x94, 0x01, + 0x84, 0x90, 0x03, 0x8e, 0x05, 0x41, 0x10, 0x86, 0x3b, 0xda, 0x03, 0xac, 0x6d, 0x85, 0x63, 0x9d, + 0xa6, 0x52, 0xb3, 0x3d, 0x46, 0x4d, 0x5a, 0xd7, 0xdf, 0x67, 0x2b, 0xc6, 0xf7, 0x93, 0x55, 0x0d, + 0x35, 0x08, 0x25, 0xf6, 0xbc, 0xcc, 0x5a, 0x0e, 0xbd, 0xc8, 0x21, 0x73, 0x5d, 0xf0, 0x6c, 0x9e, + 0x76, 0x60, 0x27, 0x21, 0xfc, 0x51, 0x37, 0x60, 0x5f, 0x51, 0x0f, 0x02, 0x79, 0x45, 0x90, 0xb6, + 0x19, 0x73, 0xb4, 0x4c, 0xd9, 0x9b, 0x20, 0x85, 0x2a, 0xe3, 0x7b, 0x89, 0x64, 0x42, 0x3c, 0x89, + 0x6c, 0xc8, 0xc6, 0x88, 0x60, 0xcf, 0x44, 0x1d, 0xc8, 0x4c, 0x98, 0x4c, 0xb0, 0x5f, 0x68, 0x49, + 0x20, 0x90, 0x42, 0x76, 0xeb, 0x9d, 0x4c, 0x79, 0x6a, 0x2a, 0x29, 0xa1, 0x23, 0x9e, 0x75, 0xfb, + 0xfd, 0x56, 0x6e, 0x37, 0xbe, 0x6d, 0x77, 0x9e, 0x27, 0x0f, 0x1a, 0x7a, 0x13, 0xc3, 0x97, 0x35, + 0xc3, 0x97, 0xa5, 0xe1, 0xeb, 0x3e, 0xc3, 0x8b, 0x35, 0xf4, 0xac, 0xc7, 0x9e, 0xa6, 0xf7, 0xb8, + 0xee, 0xa4, 0xf4, 0x3e, 0xff, 0xaf, 0x89, 0xff, 0xd5, 0x9a, 0xe8, 0x6a, 0xe9, 0x7f, 0xbd, 0x76, + 0xc0, 0xeb, 0x2a, 0x61, 0x34, 0x7e, 0x63, 0x03, 0xea, 0x19, 0x26, 0x60, 0x4c, 0xb4, 0x59, 0x00, + 0xad, 0xd1, 0xb1, 0x4e, 0xc6, 0x40, 0x08, 0xc0, 0x71, 0x26, 0x57, 0x35, 0x31, 0x6d, 0xdd, 0x74, + 0x51, 0xc7, 0xfa, 0x9d, 0x6f, 0xa1, 0xa3, 0x3b, 0xa1, 0x5f, 0x31, 0xb9, 0xb4, 0x07, 0x0d, 0x9c, + 0xc6, 0xc7, 0x37, 0x75, 0x38, 0x16, 0xe3, 0xd4, 0x9d, 0xfc, 0xfe, 0x04, 0x20, 0x2f, 0xba, 0x10, + 0x0a, 0x89, 0xa2, 0xd8, 0x07, 0xa6, 0x34, 0x4f, 0x05, 0x8d, 0x37, 0xa6, 0xca, 0x06, 0x9d, 0x6a, + 0x41, 0x67, 0xfb, 0x62, 0x83, 0x3b, 0x5c, 0xd5, 0x08, 0xb5, 0x12, 0x5c, 0xbe, 0x8c, 0x63, 0x49, + 0xc9, 0xf1, 0xac, 0x65, 0x23, 0xc9, 0x2a, 0x68, 0x34, 0x67, 0xc5, 0x69, 0x65, 0x78, 0xfc, 0xf4, + 0x09, 0xfa, 0x25, 0xbb, 0x63, 0xd1, 0x99, 0x0b, 0xf4, 0x8d, 0x1b, 0x82, 0x0b, 0xec, 0xc2, 0x6b, + 0x3e, 0x2f, 0xbf, 0xf5, 0xd3, 0x69, 0xaf, 0xff, 0x85, 0x3e, 0xec, 0x68, 0x17, 0x28, 0x74, 0x0d, + 0xed, 0x03, 0x85, 0xfb, 0x60, 0xaf, 0xd2, 0x78, 0x1c, 0x76, 0x9d, 0x0e, 0x5c, 0xec, 0xbf, 0xe3, + 0x3d, 0xed, 0xdc, 0x10, 0x1c, 0x0c, 0x8d, 0xbb, 0x0d, 0x2e, 0x30, 0x78, 0x65, 0xde, 0x2a, 0xb3, + 0xbc, 0xbd, 0x3f, 0xc7, 0xdb, 0x6e, 0xda, 0x00, 0x8a, 0x22, 0x7f, 0x57, 0x36, 0xa1, 0x15, 0x9d, + 0xc5, 0xd5, 0x1c, 0x7e, 0x00, 0x94, 0xcd, 0xb3, 0x62, 0x06, 0x51, 0x10, 0x05, 0xe0, 0xe9, 0x62, + 0xdb, 0xaa, 0xb7, 0xda, 0x37, 0x88, 0xd5, 0x25, 0xfd, 0x59, 0xeb, 0x62, 0xae, 0xa2, 0xa7, 0x8f, + 0xed, 0xbf, 0x1c, 0x9c, 0xef, 0xd0, 0x69, 0x2b, 0x6f, 0x0e, 0x18, 0xe7, 0xd1, 0x5e, 0xde, 0x70, + 0x74, 0xda, 0x86, 0x12, 0x39, 0x2b, 0x93, 0xea, 0x96, 0x35, 0x5c, 0x5a, 0xb4, 0x8c, 0x4c, 0x96, + 0xb4, 0x75, 0xe1, 0x33, 0x9a, 0x12, 0xad, 0xf7, 0x50, 0x5c, 0x94, 0x8a, 0xa6, 0x34, 0x6b, 0xf8, + 0xa6, 0x94, 0xf2, 0xdb, 0xff, 0xe8, 0xf1, 0xdf, 0x95, 0xa6, 0x4c, 0x43, 0xe9, 0x68, 0x09, 0x92, + 0x5d, 0x0a, 0x0e, 0x29, 0x4d, 0x33, 0x2b, 0xf8, 0xd2, 0x5d, 0xde, 0xaf, 0x57, 0xdf, 0xd6, 0x23, + 0xd8, 0x49, 0x5d, 0xf1, 0xaf, 0xee, 0x9e, 0xdc, 0xd1, 0xef, 0xc4, 0xd5, 0x07, 0x71, 0xf4, 0x9d, + 0x38, 0xfa, 0x2a, 0x8e, 0xbd, 0x63, 0x16, 0xde, 0x98, 0xfe, 0xf8, 0x2c, 0xc6, 0x77, 0xd4, 0x1a, + 0x8c, 0xa7, 0xe5, 0x07, 0x6f, 0xf8, 0x9d, 0x37, 0xfc, 0xea, 0x4d, 0x23, 0x73, 0x6d, 0x51, 0x97, + 0x28, 0xbd, 0xd1, 0x7c, 0x45, 0x33, 0x9c, 0x3d, 0xe9, 0x50, 0x36, 0x04, 0x1a, 0x79, 0x57, 0x37, + 0x87, 0x8f, 0xb7, 0x61, 0x7f, 0x7d, 0x37, 0x43, 0x23, 0x33, 0x23, 0xac, 0xd6, 0xaa, 0x01, 0xad, + 0xc5, 0x1b, 0x30, 0x68, 0xd6, 0xca, 0xa0, 0x1a, 0x0d, 0x00, 0x8c, 0x51, 0x33, 0x63, 0x06, 0x41, + 0x10, 0x9d, 0x2e, 0xb6, 0xad, 0x2a, 0x5d, 0x9c, 0x3a, 0xb6, 0x55, 0xbe, 0xd3, 0x7c, 0xc9, 0x9e, + 0xd6, 0xc1, 0xaf, 0x8f, 0xed, 0x6a, 0x39, 0x8f, 0xb4, 0x2d, 0xf2, 0x9b, 0x35, 0x89, 0xe3, 0xe9, + 0xa3, 0x69, 0xd8, 0xeb, 0xc9, 0xa9, 0xb9, 0x29, 0x18, 0x29, 0x0b, 0x58, 0x36, 0x97, 0x6c, 0x68, + 0x10, 0x32, 0x7a, 0xda, 0xa2, 0xd0, 0xce, 0x51, 0x9b, 0x63, 0x53, 0x88, 0x32, 0xcc, 0x11, 0x5f, + 0x84, 0x8e, 0x9a, 0xe7, 0xe7, 0x10, 0xcb, 0x42, 0x85, 0xa5, 0x90, 0x25, 0x4c, 0x98, 0x08, 0x89, + 0x28, 0x67, 0x1a, 0xf3, 0x36, 0xa2, 0xb6, 0x4c, 0x58, 0x8b, 0x42, 0x26, 0x5c, 0x50, 0x9b, 0x61, + 0xc5, 0xa1, 0x63, 0x43, 0x7d, 0x88, 0x8c, 0x48, 0xce, 0x19, 0x6c, 0x55, 0x29, 0xaf, 0xa8, 0xff, + 0x23, 0x41, 0xfb, 0xff, 0xc9, 0xeb, 0x3f, 0x1e, 0xab, 0xb1, 0x51, 0x28, 0x9f, 0x5b, 0xc6, 0x7e, + 0xee, 0x2d, 0x5e, 0x09, 0xab, 0x17, 0x39, 0x2c, 0x30, 0x79, 0xf6, 0xbd, 0x50, 0x28, 0x4b, 0xc3, + 0x15, 0x9f, 0xe7, 0x34, 0xfc, 0xa0, 0x79, 0xf8, 0x4a, 0x54, 0x04, 0x35, 0xbf, 0x53, 0xde, 0xfc, + 0x0a, 0xd4, 0xfd, 0x49, 0x79, 0xcf, 0x47, 0x75, 0x2d, 0xef, 0x94, 0xf7, 0x7d, 0x52, 0x5e, 0xbd, + 0xcc, 0x71, 0xf6, 0xad, 0x80, 0x81, 0x07, 0xd6, 0x86, 0x77, 0x7c, 0x0d, 0x6f, 0xc2, 0x57, 0x8e, + 0xd7, 0xb1, 0x92, 0x0b, 0xc7, 0x2f, 0xcd, 0x7c, 0x07, 0x30, 0xfe, 0x00, 0xd0, 0xf3, 0x0e, 0xa0, + 0xe7, 0x15, 0x60, 0xe4, 0x93, 0x8a, 0xbb, 0x49, 0x21, 0xb9, 0x10, 0x00, 0x6c, 0x50, 0x35, 0x57, + 0x24, 0x41, 0x10, 0xae, 0x3b, 0x34, 0xc3, 0x21, 0xc2, 0x3d, 0xc3, 0x63, 0xdc, 0x49, 0xb0, 0xb4, + 0x5e, 0x4b, 0xed, 0xdb, 0x1e, 0xab, 0x69, 0x59, 0xfb, 0xf7, 0xac, 0xfb, 0x68, 0xdb, 0xa7, 0xf0, + 0x6e, 0x92, 0xda, 0x13, 0xe3, 0xf7, 0xc3, 0xf7, 0x33, 0x3e, 0x24, 0x26, 0x10, 0xfa, 0xea, 0xe9, + 0xd9, 0xd5, 0x19, 0x3a, 0xe6, 0x14, 0x3d, 0xb9, 0x32, 0x39, 0x64, 0xd9, 0x1e, 0xa4, 0x36, 0x04, + 0x98, 0x4d, 0xd8, 0x09, 0xbc, 0xbb, 0x42, 0xc5, 0x69, 0x2e, 0x32, 0xc3, 0x19, 0x3a, 0xa1, 0x0d, + 0xa3, 0x4c, 0x08, 0x61, 0x3e, 0x36, 0xde, 0x63, 0xca, 0x9a, 0x52, 0x98, 0x77, 0x94, 0x93, 0x08, + 0x75, 0x20, 0x2c, 0xf4, 0xd1, 0xc1, 0xec, 0x7b, 0x83, 0xe1, 0xf7, 0x0c, 0x4f, 0xeb, 0xf7, 0x58, + 0x1e, 0x38, 0xc6, 0xdc, 0xc3, 0x41, 0xc9, 0x4b, 0x38, 0xa8, 0x98, 0x82, 0x81, 0xd5, 0x3e, 0xda, + 0xd5, 0x0e, 0x2d, 0x6c, 0x0c, 0x5a, 0x43, 0x58, 0xeb, 0xc9, 0xc0, 0xf6, 0xf0, 0xe6, 0x6a, 0x1d, + 0x92, 0x9a, 0x4c, 0x24, 0xa8, 0x8a, 0x22, 0x00, 0x7c, 0x5c, 0x7e, 0x05, 0xa1, 0x62, 0xbc, 0x13, + 0x4e, 0xe7, 0xa5, 0x86, 0xcd, 0x1b, 0x5d, 0x1e, 0xeb, 0xe6, 0xa0, 0x50, 0x4a, 0x92, 0xa6, 0x9d, + 0x9e, 0xf8, 0x80, 0xd6, 0xec, 0x4f, 0x66, 0x42, 0xbd, 0x93, 0xf7, 0xb1, 0xf0, 0xed, 0x06, 0x70, + 0xa1, 0x2f, 0xc1, 0x42, 0x97, 0x64, 0xb1, 0x8f, 0xe4, 0x1f, 0xf9, 0x22, 0xe6, 0xac, 0x62, 0x0a, + 0xd8, 0x3d, 0xb0, 0x8c, 0xcd, 0xba, 0x39, 0x08, 0xcc, 0x18, 0xa9, 0x5a, 0x5f, 0xab, 0x27, 0xa8, + 0x43, 0x32, 0xcf, 0xce, 0xc3, 0xa4, 0xd0, 0x65, 0xca, 0x42, 0xc9, 0x91, 0x1b, 0x2b, 0xbd, 0xd9, + 0x90, 0xfe, 0x1b, 0x3f, 0x92, 0xd5, 0x00, 0x62, 0xf0, 0x4d, 0x05, 0xb4, 0x42, 0xd5, 0x68, 0x15, + 0x04, 0x31, 0x38, 0x38, 0x1d, 0xee, 0xae, 0x35, 0x0e, 0xb7, 0xc9, 0xda, 0xd8, 0xc7, 0x64, 0xb2, + 0x24, 0xb3, 0x4f, 0x4e, 0x8f, 0x3b, 0x94, 0xaf, 0x8b, 0xfe, 0xa6, 0xbe, 0x6c, 0x7a, 0x26, 0xe5, + 0x4e, 0x8c, 0x20, 0x5d, 0x5e, 0x2a, 0xd6, 0x4c, 0x6d, 0x99, 0x02, 0x27, 0x94, 0xb2, 0x09, 0x8c, + 0x55, 0x34, 0x70, 0xdc, 0x69, 0x05, 0xcb, 0xf7, 0x41, 0x15, 0x89, 0x1b, 0x43, 0xb0, 0x2c, 0xa6, + 0x35, 0x65, 0x36, 0x02, 0x2b, 0xcc, 0x84, 0x6a, 0xa4, 0x67, 0x04, 0x96, 0xb3, 0x11, 0x0a, 0xa9, + 0x8c, 0x58, 0xfb, 0x32, 0xc3, 0xdc, 0xe7, 0xd1, 0xfc, 0xb7, 0xa3, 0x39, 0x1d, 0x9c, 0x5f, 0xdc, + 0x5c, 0xfc, 0xcb, 0x73, 0xfa, 0xc2, 0xb3, 0xfa, 0x8d, 0x67, 0xf5, 0x13, 0x62, 0xed, 0x1b, 0xc4, + 0xea, 0x4f, 0x9e, 0xe5, 0xbb, 0x11, 0x82, 0xcd, 0xfd, 0x6c, 0x27, 0x03, 0x85, 0xff, 0xd0, 0x11, + 0x66, 0x3f, 0xd0, 0x10, 0x80, 0x8c, 0xfa, 0xc4, 0x91, 0xdd, 0x10, 0xfb, 0xe7, 0xff, 0x5b, 0xdb, + 0xb3, 0x5d, 0x8c, 0xb0, 0xf7, 0xa2, 0x69, 0xaf, 0x1f, 0x6c, 0x80, 0xb9, 0x6f, 0xca, 0xe6, 0xbe, + 0x94, 0x61, 0x25, 0xa1, 0x71, 0x06, 0x8d, 0xb6, 0x89, 0xfb, 0xb0, 0xce, 0xd5, 0x9b, 0x4e, 0xa4, + 0x87, 0x9c, 0x7f, 0x04, 0xb9, 0x89, 0x3f, 0x77, 0x73, 0x6a, 0x92, 0xb2, 0xfc, 0x76, 0xf0, 0x04, + 0x8d, 0x50, 0xc5, 0x52, 0x05, 0x31, 0x10, 0x1c, 0x2e, 0xb8, 0x9c, 0x70, 0xd7, 0x2b, 0xfe, 0x07, + 0xb8, 0xdd, 0x38, 0x77, 0x45, 0xe6, 0x41, 0x8a, 0xc8, 0x56, 0x66, 0x17, 0xfb, 0x7a, 0xf2, 0x70, + 0x87, 0x95, 0x68, 0x5b, 0x35, 0x9d, 0xba, 0xc8, 0x37, 0xc2, 0xc1, 0x21, 0xf0, 0xc6, 0xb6, 0x97, + 0xb5, 0x75, 0x64, 0xae, 0x58, 0xd5, 0x9c, 0x69, 0x12, 0x3e, 0x65, 0x85, 0x54, 0x2b, 0xc4, 0x04, + 0xbe, 0x2d, 0x67, 0x51, 0x79, 0x08, 0x47, 0x49, 0x59, 0xa8, 0xe3, 0x78, 0x17, 0xb2, 0x09, 0x93, + 0x42, 0xa5, 0xa2, 0x4b, 0x11, 0x59, 0x59, 0x97, 0xa0, 0x3d, 0xd3, 0x68, 0x23, 0x9a, 0x46, 0x6f, + 0x5c, 0xcb, 0x51, 0xd7, 0xab, 0xdc, 0x10, 0x74, 0x76, 0xf6, 0x82, 0xc1, 0x52, 0xc5, 0x74, 0x43, + 0xa3, 0x59, 0x36, 0x36, 0x37, 0xa8, 0x3b, 0xa5, 0x00, 0xe1, 0x7c, 0x5d, 0x20, 0x5d, 0x4f, 0xda, + 0xd4, 0x55, 0xf0, 0xc1, 0xb5, 0xcd, 0xcc, 0xa5, 0xaa, 0x89, 0x42, 0x73, 0xef, 0xa0, 0x95, 0x30, + 0x6c, 0x93, 0x5e, 0x03, 0xbe, 0xc6, 0xa3, 0xa1, 0x37, 0x8d, 0xb7, 0xc3, 0xde, 0x26, 0xfe, 0x1b, + 0x4b, 0x67, 0xaa, 0x80, 0xf7, 0x37, 0x70, 0xee, 0xeb, 0xac, 0xde, 0x2a, 0x18, 0xf9, 0x8b, 0x17, + 0x9d, 0xd6, 0x9e, 0x21, 0x26, 0x33, 0x47, 0x98, 0x14, 0x23, 0x9b, 0xfa, 0xbb, 0x4e, 0x40, 0x2b, + 0xad, 0xc6, 0xfb, 0x32, 0x95, 0x6e, 0xca, 0xd8, 0x2e, 0x07, 0x34, 0x72, 0xe5, 0x44, 0x10, 0x92, + 0xe5, 0x50, 0x36, 0xaf, 0x61, 0x69, 0xf6, 0x43, 0x55, 0xa0, 0xd1, 0x37, 0xf3, 0x82, 0xfb, 0xd0, + 0x0e, 0xa8, 0xeb, 0x9e, 0x73, 0xfa, 0xdd, 0x7b, 0xe9, 0xc9, 0x7b, 0xa9, 0x78, 0x97, 0xf1, 0xc9, + 0xfb, 0x01, 0x7c, 0x90, 0x05, 0x6e, 0x04, 0x51, 0x08, 0x40, 0x89, 0xd7, 0xdd, 0xbd, 0x27, 0x58, + 0x3d, 0x46, 0xfd, 0x02, 0xe4, 0x0b, 0x69, 0xc7, 0x60, 0xc3, 0x68, 0x7a, 0xf9, 0x75, 0xb7, 0x38, + 0xfa, 0x1e, 0x00, 0x07, 0xd6, 0xc6, 0x84, 0xff, 0xa4, 0x82, 0x4e, 0x98, 0xc9, 0x65, 0xa8, 0xd4, + 0x21, 0x93, 0x91, 0x22, 0x3c, 0x5a, 0x0d, 0xfc, 0x2f, 0x21, 0xa5, 0x1d, 0x96, 0x12, 0xe1, 0x52, + 0x24, 0xc1, 0x94, 0xb4, 0x18, 0x14, 0x2f, 0xfa, 0x2d, 0x49, 0xc0, 0x26, 0x46, 0xf7, 0x67, 0x32, + 0x04, 0xf8, 0x52, 0x79, 0x0f, 0x5c, 0x7f, 0x51, 0xbb, 0x5e, 0x4f, 0x5a, 0xad, 0x14, 0x9d, 0x24, + 0x1d, 0xc3, 0x81, 0x30, 0xaa, 0xf1, 0x81, 0x60, 0x9f, 0x04, 0xaf, 0x79, 0x6a, 0xe1, 0x34, 0x0a, + 0xd2, 0x14, 0x13, 0xf1, 0x94, 0xc0, 0xe9, 0x04, 0x07, 0xb7, 0x18, 0x8b, 0x1a, 0x94, 0xcc, 0x20, + 0x0b, 0x52, 0xd5, 0xcf, 0x0d, 0xb6, 0xa7, 0xc4, 0xa9, 0x68, 0x0a, 0x67, 0x33, 0x38, 0x9c, 0x8e, + 0x92, 0x70, 0xba, 0xe0, 0x00, 0xbb, 0xeb, 0x88, 0xb7, 0x03, 0xe2, 0xee, 0x1c, 0x71, 0x77, 0xa3, + 0xdc, 0xd3, 0xa0, 0xf5, 0x68, 0xae, 0xf5, 0x68, 0x2a, 0x77, 0xb5, 0x5d, 0xee, 0x78, 0x4e, 0xee, + 0x68, 0x2c, 0x77, 0xb4, 0x24, 0x37, 0xdd, 0x75, 0x8a, 0xe3, 0xbf, 0x6a, 0xda, 0x6c, 0x35, 0x07, + 0x63, 0x81, 0x89, 0x1b, 0x70, 0xb6, 0x95, 0xb0, 0x37, 0x47, 0xd8, 0x1d, 0x13, 0x76, 0x17, 0x09, + 0xf0, 0xd3, 0xf8, 0x20, 0x59, 0x7b, 0xd9, 0xd5, 0xe0, 0xb2, 0xde, 0xd8, 0x90, 0x7c, 0x06, 0x00, + 0x62, 0x08, 0x32, 0xf4, 0x03, 0x14, 0x3e, 0x16, 0xd9, 0x0d, 0x03, 0x31, 0x00, 0x55, 0x99, 0x99, + 0x0f, 0xd0, 0x75, 0xcc, 0xfb, 0xae, 0x7b, 0x08, 0x3d, 0x7b, 0x46, 0x69, 0xc6, 0x24, 0x0f, 0x04, + 0x8e, 0xdf, 0x30, 0xc3, 0x4e, 0xac, 0xff, 0x89, 0xd1, 0x50, 0x43, 0xa9, 0x23, 0x03, 0xf7, 0x58, + 0xb2, 0x49, 0x91, 0x5d, 0x8a, 0x35, 0x23, 0x0d, 0x86, 0xb5, 0x3a, 0x2d, 0xd1, 0x52, 0x6d, 0xd9, + 0x58, 0xb8, 0x60, 0xae, 0x86, 0x89, 0xe9, 0x0d, 0x47, 0xcf, 0x27, 0x45, 0x38, 0x1f, 0xce, 0x54, + 0x6a, 0x34, 0x25, 0x3a, 0xa9, 0x83, 0xa3, 0x9f, 0x5f, 0x0c, 0x7d, 0x3f, 0x40, 0xc1, 0x55, 0x93, + 0xd6, 0x8a, 0x6b, 0x34, 0xa9, 0x54, 0x8c, 0x59, 0x49, 0xf0, 0xd5, 0xee, 0x96, 0x25, 0x7c, 0x75, + 0x6d, 0x06, 0x5f, 0x7d, 0xd5, 0x56, 0x70, 0x55, 0x28, 0x6b, 0xb1, 0x62, 0x49, 0x15, 0x5c, 0xcd, + 0x29, 0x9e, 0x30, 0x33, 0x4a, 0xfe, 0x11, 0x92, 0x6d, 0x6a, 0xee, 0xc3, 0x97, 0xb1, 0x41, 0x18, + 0xc0, 0x33, 0x67, 0x93, 0xdf, 0x58, 0x69, 0xe7, 0xe0, 0x7a, 0x09, 0xe6, 0x15, 0x57, 0x7b, 0x57, + 0x53, 0xb8, 0xab, 0x55, 0xb8, 0xb3, 0xc8, 0xf3, 0xe7, 0xb2, 0xfb, 0x55, 0x9f, 0x4d, 0x5a, 0xf8, + 0x61, 0xe8, 0x05, 0xd8, 0x0f, 0x62, 0xed, 0x27, 0xf3, 0x69, 0x78, 0xee, 0xd6, 0x43, 0x74, 0x92, + 0x8b, 0xca, 0x69, 0x94, 0x84, 0xfe, 0x76, 0x61, 0x72, 0x9d, 0xe1, 0x5d, 0x72, 0x4b, 0xea, 0xdb, + 0xa5, 0x67, 0xca, 0x63, 0xd5, 0x91, 0x96, 0x4a, 0x4b, 0x7f, 0x3f, 0xe2, 0x77, 0x70, 0x40, 0x61, + 0x6f, 0xf7, 0x1f, 0x7c, 0x50, 0xc5, 0x7a, 0x6b, 0x41, 0x08, 0xe6, 0x4a, 0x75, 0x53, 0x77, 0x7d, + 0x80, 0x5a, 0x74, 0x5d, 0x77, 0xd7, 0x25, 0x1f, 0x39, 0x87, 0x34, 0x13, 0x19, 0x52, 0x98, 0xd8, + 0xd3, 0xd7, 0xdd, 0x56, 0x38, 0xbf, 0xc0, 0xe9, 0xca, 0x1e, 0xa6, 0xb3, 0xa9, 0x04, 0x2a, 0x57, + 0x99, 0x02, 0x2b, 0x2a, 0x95, 0x12, 0x99, 0xa5, 0xa5, 0x04, 0x5a, 0x59, 0x02, 0x46, 0x58, 0x16, + 0x25, 0x94, 0x40, 0x30, 0x96, 0x44, 0x8b, 0xd1, 0x98, 0x63, 0x56, 0x14, 0x5f, 0x6e, 0x41, 0x7f, + 0xcd, 0xbb, 0xbc, 0xe3, 0xf8, 0x6d, 0xa7, 0xbf, 0x91, 0xcc, 0xdc, 0x24, 0xb2, 0x6f, 0x8d, 0x6e, + 0x91, 0x0a, 0x1a, 0x6b, 0x9d, 0x15, 0x39, 0x14, 0x58, 0x3d, 0x87, 0xd7, 0x29, 0x7a, 0x41, 0x6e, + 0x06, 0x56, 0x4f, 0x65, 0x34, 0xf6, 0x26, 0x6a, 0x30, 0xf4, 0xeb, 0xb4, 0xeb, 0x29, 0xc1, 0xdf, + 0x97, 0x02, 0x6b, 0xc5, 0x3d, 0x74, 0xa2, 0x02, 0x05, 0xf8, 0x7f, 0xe5, 0xec, 0x80, 0xad, 0x80, + 0xe7, 0x74, 0x8d, 0x91, 0x54, 0xaa, 0xe4, 0x9d, 0x78, 0x54, 0x8a, 0x9d, 0x60, 0xae, 0xcc, 0x30, + 0x5b, 0xb3, 0x1c, 0xf4, 0x96, 0x9c, 0x19, 0x56, 0x24, 0xe6, 0x0a, 0xf4, 0xbe, 0xb8, 0x01, 0xa3, + 0xbf, 0x23, 0xf5, 0xbd, 0xc9, 0x83, 0xde, 0xa7, 0x26, 0xc0, 0x19, 0x7b, 0xe3, 0x35, 0xaa, 0xe2, + 0x99, 0x94, 0x49, 0xf1, 0xf5, 0x57, 0xef, 0xdb, 0xf2, 0x9b, 0x41, 0x9d, 0x3b, 0x3e, 0x76, 0x11, + 0x05, 0xd1, 0xf9, 0x8d, 0xb3, 0xe3, 0x43, 0x69, 0x3c, 0x32, 0x7c, 0x26, 0xf7, 0xc0, 0xab, 0x7f, + 0x5f, 0x4e, 0x69, 0xfe, 0x30, 0x91, 0x3d, 0x4d, 0x7e, 0x1a, 0x61, 0xc3, 0xe5, 0x1d, 0x4c, 0xbd, + 0xfe, 0xbf, 0x9b, 0x18, 0xba, 0x56, 0x55, 0x88, 0x0a, 0x71, 0xb8, 0x0a, 0x00, 0xb5, 0xd0, 0x05, + 0x6e, 0x03, 0x31, 0x10, 0x40, 0xd1, 0x11, 0x97, 0x99, 0xb9, 0xbd, 0x40, 0xc0, 0x3d, 0x42, 0x41, + 0x50, 0xee, 0x01, 0x46, 0x0b, 0x93, 0xd5, 0x2c, 0xcd, 0x1a, 0x02, 0xb7, 0x0f, 0x33, 0x88, 0x23, + 0x34, 0x3e, 0x7f, 0x19, 0xac, 0xa4, 0x9e, 0x69, 0xb1, 0x27, 0xa8, 0xca, 0xff, 0x18, 0x48, 0x56, + 0x78, 0x39, 0x4b, 0x8e, 0xc6, 0x0b, 0x59, 0xd0, 0x4f, 0x09, 0xee, 0xea, 0xd6, 0x87, 0xbd, 0x84, + 0xad, 0xc5, 0x4c, 0x42, 0xca, 0x60, 0xcf, 0x50, 0x41, 0x9e, 0x23, 0x03, 0x67, 0xe8, 0x1b, 0x0e, + 0x23, 0x42, 0x63, 0xab, 0xaa, 0x0a, 0xfb, 0x22, 0x19, 0x5a, 0x32, 0x8d, 0xee, 0xd6, 0x25, 0xa6, + 0x62, 0x3c, 0x14, 0xe7, 0xc1, 0xb6, 0x5a, 0x13, 0xbc, 0xf5, 0x5c, 0x2e, 0x7f, 0xaa, 0x15, 0xfa, + 0x53, 0x4f, 0x3f, 0x9a, 0xd2, 0x8f, 0xc6, 0xfa, 0xf1, 0x84, 0x9b, 0x60, 0xf0, 0xef, 0x3c, 0xd7, + 0x23, 0xde, 0xab, 0xdd, 0xc5, 0x28, 0xe2, 0x3c, 0xc2, 0xf1, 0x8d, 0xeb, 0x51, 0x0f, 0xd9, 0x22, + 0x97, 0x26, 0x6c, 0x4f, 0xac, 0xb9, 0x9d, 0x4d, 0x85, 0xaf, 0xff, 0x3f, 0xaa, 0xba, 0xb4, 0xe9, + 0xb1, 0x56, 0x4f, 0x53, 0x78, 0xec, 0x95, 0x3d, 0x36, 0xb9, 0xc6, 0x70, 0x38, 0xd5, 0x77, 0xb8, + 0xf0, 0xea, 0xa1, 0xa9, 0x4e, 0x26, 0x37, 0x28, 0xfe, 0xb0, 0x39, 0xd3, 0xce, 0xc1, 0xe9, 0xd4, + 0x9f, 0xdc, 0xcf, 0xed, 0x9d, 0x58, 0xca, 0xad, 0x18, 0x38, 0x1a, 0x5d, 0xbe, 0x9c, 0x3b, 0xd0, + 0x01, 0x7d, 0xcf, 0x03, 0x73, 0x45, 0x31, 0x10, 0x05, 0xe0, 0xad, 0x6d, 0xdb, 0x36, 0xc7, 0xa8, + 0xc7, 0x35, 0x86, 0x3b, 0xb9, 0x7d, 0xdb, 0xce, 0x45, 0xb2, 0xd1, 0xc3, 0xbf, 0xaf, 0xf1, 0x3c, + 0x8a, 0xf3, 0x9d, 0x03, 0xb7, 0x5e, 0xf8, 0x90, 0x15, 0x5e, 0xec, 0xe1, 0xd9, 0xed, 0xd5, 0xde, + 0x2e, 0x5a, 0x66, 0x89, 0x8e, 0x6c, 0x86, 0x2c, 0x8c, 0x23, 0x07, 0xdf, 0x53, 0x94, 0xc6, 0x7b, + 0xe8, 0x71, 0xa4, 0x1c, 0x5b, 0x00, 0xbf, 0xb3, 0xbd, 0xbd, 0x4d, 0xf8, 0xcc, 0x52, 0x0b, 0xf5, + 0xf9, 0xdc, 0x8a, 0x54, 0xc8, 0x18, 0x24, 0x04, 0x43, 0x69, 0x17, 0x40, 0x53, 0x1c, 0x3a, 0x87, + 0x92, 0x53, 0x24, 0xa1, 0xc9, 0x92, 0x26, 0xe1, 0xc9, 0x42, 0x17, 0x26, 0x6c, 0x05, 0xb2, 0x17, + 0xa8, 0x18, 0x29, 0xf7, 0xb1, 0xa7, 0x44, 0x82, 0xdf, 0x9f, 0x3a, 0x68, 0xce, 0x93, 0x9b, 0x7e, + 0xa5, 0x3b, 0x3c, 0x26, 0x21, 0xf1, 0x76, 0x0f, 0x6f, 0xd3, 0xda, 0x92, 0x24, 0xbc, 0x7d, 0xda, + 0xd9, 0x3d, 0xdc, 0x2d, 0x6b, 0xaf, 0xa3, 0x76, 0xb0, 0x92, 0x0d, 0x5f, 0x42, 0x18, 0xc9, 0x4b, + 0x30, 0xf2, 0x97, 0x60, 0x06, 0x03, 0x1b, 0xa6, 0x5e, 0x09, 0xc9, 0x69, 0xc5, 0x59, 0x98, 0x2d, + 0xec, 0x37, 0x9a, 0x97, 0x60, 0xbe, 0xa8, 0x7b, 0x4d, 0x40, 0x42, 0x96, 0x55, 0x47, 0x3e, 0xd5, + 0xc6, 0x3c, 0xaf, 0xf1, 0xcf, 0xeb, 0x2c, 0xfa, 0xa4, 0x29, 0x0f, 0xe8, 0x29, 0x3a, 0x6b, 0xac, + 0x52, 0x6c, 0xfa, 0x93, 0xe8, 0xc8, 0x23, 0x3a, 0xfe, 0x88, 0x81, 0xa2, 0x6f, 0x3a, 0xf3, 0x88, + 0xe1, 0xa2, 0xb3, 0x77, 0x95, 0x50, 0xb5, 0x5a, 0x43, 0x51, 0x0c, 0x4e, 0x57, 0xdc, 0xdd, 0x1e, + 0x01, 0x87, 0x9d, 0x15, 0xf7, 0x2d, 0xdf, 0x91, 0x94, 0xe6, 0x5a, 0x8e, 0xb5, 0xbd, 0x6f, 0x8f, + 0xbb, 0x77, 0x8c, 0xfc, 0x0a, 0xe7, 0x9a, 0x54, 0x89, 0x67, 0xd7, 0x6b, 0xeb, 0x3b, 0xdb, 0x68, + 0xa4, 0x74, 0xaa, 0x62, 0xa9, 0x30, 0x28, 0xcb, 0x82, 0xba, 0x20, 0x58, 0x41, 0x17, 0x61, 0x30, + 0xe7, 0x18, 0xb1, 0x14, 0x4b, 0x25, 0x0c, 0x06, 0x72, 0xa4, 0x12, 0x05, 0x98, 0x44, 0xd1, 0x91, + 0x42, 0x87, 0x02, 0x96, 0x3e, 0x25, 0x18, 0x12, 0x29, 0xf1, 0x69, 0x01, 0x33, 0x9f, 0x6e, 0x0d, + 0xaa, 0x62, 0x52, 0x01, 0xf7, 0x36, 0xf0, 0x1d, 0x57, 0xff, 0x2b, 0xd7, 0x38, 0xea, 0xc0, 0xf6, + 0x86, 0x90, 0xa2, 0xab, 0xa4, 0x0b, 0xfd, 0xb1, 0x5e, 0x5b, 0xdf, 0x5e, 0x7f, 0xff, 0x3c, 0xf6, + 0xfa, 0x3c, 0xf7, 0xe9, 0x79, 0x64, 0xf7, 0x7f, 0x7f, 0x8d, 0x16, 0x57, 0xf9, 0xa1, 0x58, 0xc2, + 0x83, 0xb5, 0x6f, 0xc3, 0x2e, 0xb6, 0xa3, 0xfe, 0x21, 0xec, 0xc7, 0x70, 0x85, 0x04, 0x85, 0x92, + 0x14, 0xf4, 0xaf, 0x7f, 0x4f, 0xd4, 0x6c, 0x17, 0x05, 0x2c, 0x46, 0x0a, 0xac, 0x8a, 0x27, 0xda, + 0xc5, 0x2e, 0x37, 0xf9, 0x23, 0xf9, 0xe9, 0x5b, 0x93, 0x1f, 0x8d, 0x0e, 0x86, 0x77, 0x6a, 0x83, + 0xf7, 0x1f, 0x25, 0x57, 0xaa, 0x40, 0xd3, 0x52, 0x09, 0xfa, 0x37, 0x7a, 0xb5, 0x7e, 0x07, 0x74, + 0x8f, 0x45, 0x76, 0x03, 0x31, 0x10, 0x44, 0x7b, 0x6d, 0x5a, 0x85, 0x99, 0x0e, 0x10, 0x86, 0x33, + 0x84, 0x79, 0x59, 0x6f, 0xa0, 0x9d, 0x91, 0xed, 0x51, 0x4f, 0x5a, 0x32, 0xdc, 0xde, 0xcc, 0xb0, + 0x11, 0xab, 0x7e, 0x7d, 0xfa, 0x4a, 0x8c, 0xad, 0xbe, 0x48, 0xcc, 0x78, 0xbe, 0x82, 0x72, 0xc6, + 0x81, 0x67, 0x45, 0x4d, 0x34, 0x80, 0xf8, 0x00, 0x56, 0xc0, 0x2d, 0xcf, 0x6a, 0x83, 0x1a, 0x1c, + 0x5b, 0x27, 0xea, 0xa8, 0x24, 0x92, 0xc2, 0xb1, 0x36, 0x58, 0x29, 0x7f, 0x83, 0x48, 0xd2, 0x2c, + 0xb0, 0x46, 0x2c, 0x34, 0x88, 0x8d, 0x20, 0xac, 0x31, 0x1d, 0x21, 0x73, 0xb4, 0x5f, 0xae, 0xd7, + 0x6a, 0xb4, 0xef, 0x58, 0x4d, 0xd0, 0x9d, 0xeb, 0x2e, 0xa4, 0xfd, 0xa6, 0x29, 0x1b, 0x2a, 0x56, + 0x8d, 0x73, 0x48, 0xbb, 0xd0, 0x94, 0x8a, 0x1f, 0x43, 0x26, 0xad, 0x23, 0x54, 0x13, 0xff, 0x31, + 0xd8, 0x65, 0x56, 0x9a, 0x54, 0xd4, 0x29, 0x4e, 0xd1, 0xb3, 0xa6, 0xa6, 0xd7, 0x22, 0x4a, 0x02, + 0x4f, 0xf9, 0xdb, 0xa5, 0xd8, 0x1e, 0x63, 0x36, 0x7d, 0x64, 0x34, 0x53, 0x7a, 0x6b, 0xec, 0x47, + 0xf9, 0xbb, 0xe5, 0x41, 0xec, 0x13, 0x56, 0xcb, 0xbe, 0x2f, 0xb1, 0xba, 0xbc, 0x4e, 0xca, 0x4b, + 0x38, 0x48, 0x47, 0xfa, 0xef, 0xfd, 0x2c, 0x6e, 0xee, 0x2e, 0xff, 0xb0, 0x8c, 0x89, 0x3e, 0x04, + 0x03, 0x0a, 0x96, 0x63, 0x30, 0x9d, 0x0b, 0xa2, 0xdf, 0xa0, 0xc1, 0x2e, 0x09, 0x94, 0xf1, 0x79, + 0x85, 0xa7, 0x8f, 0x8b, 0x8b, 0xcb, 0x8b, 0xa5, 0x3a, 0x67, 0x7d, 0x89, 0xb3, 0x9e, 0x44, 0x67, + 0x22, 0x48, 0xe6, 0x02, 0x00, 0x6c, 0x4e, 0xb5, 0x7a, 0xc3, 0x40, 0x0c, 0x56, 0xd6, 0x32, 0x33, + 0xac, 0x1d, 0x43, 0x7e, 0x81, 0x32, 0x2d, 0xe5, 0x76, 0xd2, 0x27, 0xc7, 0x4a, 0x7b, 0x26, 0xb9, + 0xba, 0x0b, 0xbc, 0x7d, 0x98, 0x93, 0xf1, 0xe7, 0x1f, 0xbe, 0xa8, 0xce, 0xf6, 0x8f, 0x94, 0xf1, + 0xad, 0x84, 0xcf, 0xaf, 0x85, 0x42, 0xb1, 0x80, 0x19, 0xa9, 0x33, 0xce, 0x48, 0x8a, 0xdc, 0xcc, + 0x28, 0x0d, 0x58, 0x51, 0x39, 0x63, 0x72, 0xac, 0x28, 0xbe, 0x65, 0xad, 0xb3, 0x62, 0xf2, 0xef, + 0x1c, 0x5c, 0x88, 0x24, 0xd8, 0x25, 0xe6, 0x94, 0x9d, 0x61, 0x02, 0x4e, 0x66, 0x94, 0xdd, 0x71, + 0x06, 0xce, 0x67, 0xb4, 0xdc, 0xfd, 0x4f, 0x31, 0x5f, 0xf4, 0xd0, 0xa7, 0xe0, 0x97, 0xb1, 0x22, + 0x49, 0x67, 0xbe, 0xfb, 0x43, 0x29, 0x30, 0x82, 0x7e, 0xcc, 0x08, 0x6b, 0xa3, 0x2b, 0x90, 0xeb, + 0x70, 0xef, 0x4a, 0x95, 0x88, 0x15, 0x9f, 0x8b, 0x8b, 0xec, 0x70, 0x5e, 0xad, 0xc5, 0x31, 0x9c, + 0xd7, 0xac, 0x0f, 0xeb, 0xa3, 0x47, 0x1b, 0x13, 0x0f, 0xa0, 0xd1, 0x71, 0x36, 0x92, 0x42, 0xa1, + 0x90, 0x9f, 0x2b, 0xe8, 0x65, 0x97, 0x47, 0x31, 0xf8, 0x32, 0x32, 0x98, 0x7b, 0x2e, 0x2c, 0x5c, + 0x3b, 0xed, 0xee, 0xac, 0x46, 0xc6, 0x5a, 0x4c, 0x24, 0xe0, 0x04, 0x56, 0x47, 0xe1, 0x5d, 0x8c, + 0x45, 0x09, 0xc5, 0x11, 0xa6, 0x82, 0xdc, 0xec, 0x70, 0x29, 0xc5, 0x68, 0x39, 0xb5, 0xa2, 0x16, + 0xd6, 0x26, 0x2e, 0x1d, 0x8c, 0xac, 0xb0, 0x72, 0x63, 0xd2, 0x68, 0xe1, 0xd4, 0xe6, 0xc4, 0x0a, + 0x7c, 0x1b, 0x12, 0xbc, 0x2a, 0x2d, 0x34, 0x1e, 0x63, 0x66, 0xe1, 0xa0, 0x7b, 0xec, 0xa0, 0x61, + 0xaa, 0x06, 0xda, 0xe3, 0x40, 0xd2, 0x08, 0x00, 0x75, 0x91, 0x85, 0x6e, 0x03, 0x31, 0x0c, 0x86, + 0x3d, 0x66, 0x66, 0xa6, 0x07, 0x18, 0x14, 0x5e, 0x60, 0xa2, 0x09, 0xc6, 0x24, 0xb4, 0x0e, 0x7c, + 0xd3, 0xa1, 0x6f, 0x76, 0xba, 0x3e, 0x7e, 0x99, 0x9b, 0x09, 0x82, 0x3f, 0x7c, 0x4a, 0xe0, 0x3b, + 0x74, 0x18, 0xef, 0x0b, 0x28, 0x94, 0x93, 0x63, 0x48, 0x60, 0x81, 0x39, 0x45, 0x25, 0xf9, 0x23, + 0x81, 0xd9, 0x32, 0x7a, 0x9c, 0xe6, 0x4e, 0x16, 0x72, 0x86, 0xe2, 0xf8, 0x21, 0xa3, 0x9b, 0x10, + 0xc2, 0x7c, 0x1c, 0xaa, 0x62, 0xca, 0x3e, 0xa5, 0x30, 0xdf, 0x75, 0x22, 0xcc, 0x64, 0x12, 0x94, + 0xee, 0xb0, 0x78, 0x73, 0x93, 0x16, 0x0a, 0x6a, 0xb3, 0xc2, 0x55, 0x45, 0x5d, 0xd8, 0x1a, 0xb0, + 0x6f, 0xf5, 0x8a, 0xb7, 0xfb, 0xc5, 0x98, 0xb0, 0x38, 0xc8, 0xc6, 0x81, 0x25, 0x5b, 0xc8, 0x51, + 0x33, 0x64, 0x69, 0x20, 0x64, 0xe9, 0xdf, 0xbe, 0xf3, 0xa6, 0x74, 0x7d, 0x40, 0xba, 0xde, 0xeb, + 0xdb, 0xb0, 0xf6, 0xf5, 0xae, 0xb7, 0xd0, 0x95, 0xd0, 0xff, 0x21, 0x14, 0xbd, 0x2b, 0xdc, 0xc1, + 0x72, 0x5f, 0x0d, 0xbb, 0x7d, 0xfd, 0xcc, 0x5b, 0x01, 0xad, 0x88, 0x98, 0x2b, 0xec, 0x37, 0xcb, + 0xad, 0x6f, 0x05, 0xeb, 0xdd, 0x74, 0xd2, 0x3c, 0xe3, 0x6a, 0x03, 0xc6, 0xed, 0xa0, 0xa4, 0xbf, + 0xc6, 0x0c, 0x7d, 0xc2, 0x16, 0x0e, 0xdf, 0xcd, 0x2b, 0x65, 0xca, 0x02, 0xf3, 0x5f, 0x0f, 0x4f, + 0xd6, 0xee, 0xb3, 0x66, 0xf7, 0x71, 0x50, 0x49, 0x12, 0x38, 0x56, 0x92, 0xd0, 0x69, 0xcc, 0x4d, + 0x92, 0xe3, 0x6a, 0x18, 0x84, 0xb0, 0x3c, 0xc0, 0x53, 0x07, 0x62, 0x88, 0xc8, 0x4c, 0xcc, 0x8f, + 0x0f, 0x36, 0x8e, 0x0f, 0xf7, 0xf4, 0x07, 0x54, 0x31, 0xd5, 0x06, 0x0c, 0xc4, 0x30, 0x50, 0x03, + 0x38, 0x55, 0x68, 0xbc, 0x7b, 0x32, 0xb3, 0xac, 0xc0, 0xf6, 0xc1, 0xea, 0xab, 0xe3, 0x43, 0x9b, + 0x59, 0xbc, 0xf8, 0x5a, 0xa0, 0x9f, 0x6d, 0x2e, 0x9b, 0x66, 0x52, 0xac, 0x9b, 0x9e, 0xe5, 0xc3, + 0x4e, 0x58, 0xd8, 0x6f, 0x56, 0x43, 0x8f, 0x56, 0xea, 0x83, 0xce, 0x75, 0x19, 0x9a, 0xef, 0x9a, + 0x91, 0xbb, 0x08, 0x1d, 0x6a, 0xcd, 0xf8, 0x1b, 0x74, 0xc5, 0x3e, 0x53, 0x43, 0x97, 0x51, 0x99, + 0xd4, 0xe7, 0x27, 0xfb, 0x32, 0x27, 0xac, 0x6e, 0x16, 0x7a, 0x03, }; for (unsigned i = 0; i < sizeof(IDS) / sizeof(IDS[0]); i++) { if (IDS[i] != target_id) continue; @@ -729,6 +827,9 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x8456f753, "GAT562_Mesh_Watch13_companion_radio_ble" }, { 0xc8104197, "GAT562_Mesh_Watch13_kiss_modem" }, { 0xf5eb61ec, "Generic_E22_kiss_modem" }, + { 0x850e8c89, "Generic_E22_m33s_kiss_modem" }, + { 0x42e6bc55, "Generic_E22_m33s_repeater" }, + { 0x99a24c74, "Generic_E22_repeater" }, { 0x70d2d590, "Generic_E22_sx1262_repeater" }, { 0xd5e04824, "Generic_E22_sx1268_repeater" }, { 0xa416bb20, "Generic_ESPNOW_comp_radio_usb" }, @@ -795,14 +896,11 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x32bcdd14, "Heltec_t114_companion_radio_ble" }, { 0xfe937f14, "Heltec_t114_companion_radio_usb" }, { 0x5b9b1933, "Heltec_t114_kiss_modem" }, - { 0x1b4399de, "Heltec_t114_repeater_bridge_rs232" }, { 0xf7e47568, "Heltec_t114_repeater_lora_ota_no_external_sensors" }, { 0xb1153422, "Heltec_t114_room_server" }, { 0x388f2804, "Heltec_t114_sensor" }, { 0x075ca3f9, "Heltec_t114_without_display_companion_radio_ble" }, { 0x2f9f8e7d, "Heltec_t114_without_display_companion_radio_usb" }, - { 0xc9dc5d8c, "Heltec_t114_without_display_repeater" }, - { 0x34b0e5f3, "Heltec_t114_without_display_repeater_bridge_rs232" }, { 0xb4d0ad97, "Heltec_t114_without_display_repeater_lora_ota_no_external_sensors" }, { 0xcfa0e233, "Heltec_t114_without_display_room_server" }, { 0x17d5e1ff, "Heltec_T190_companion_radio_ble_" }, @@ -967,37 +1065,64 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x61c405ca, "ikoka_handheld_nrf_e22_30dbm_096_rotated_companion_radio_usb" }, { 0xe893fe91, "ikoka_handheld_nrf_e22_30dbm_repeater" }, { 0x2b599d31, "ikoka_handheld_nrf_e22_30dbm_room_server" }, + { 0x21c9b700, "ikoka_handheld_nrf_e22_30dbm_room_server_lora_ota" }, + { 0xc11d072a, "ikoka_handheld_nrf_e22_33dbm_096_companion_radio_ble" }, + { 0x384e00dc, "ikoka_handheld_nrf_e22_33dbm_096_companion_radio_usb" }, + { 0xb461d389, "ikoka_handheld_nrf_e22_33dbm_kiss_modem" }, + { 0x01394cc2, "ikoka_handheld_nrf_e22_33dbm_repeater" }, + { 0x44063ccd, "ikoka_handheld_nrf_e22_33dbm_room_server_lora_ota" }, + { 0xc846ab76, "ikoka_handheld_nrf_e22_400m33s_096_companion_radio_ble" }, + { 0xb3b0698c, "ikoka_handheld_nrf_e22_400m33s_096_companion_radio_usb" }, + { 0x50737424, "ikoka_handheld_nrf_e22_400m33s_kiss_modem" }, + { 0x707641f1, "ikoka_handheld_nrf_e22_400m33s_repeater" }, + { 0x6a87f9e0, "ikoka_handheld_nrf_e22_400m33s_room_server_lora_ota" }, { 0xf1442d25, "ikoka_handheld_nrf_kiss_modem" }, { 0x15082ede, "ikoka_nano_nrf_22dbm_companion_radio_ble" }, { 0x6ff350d1, "ikoka_nano_nrf_22dbm_companion_radio_usb" }, { 0xe03d0cd9, "ikoka_nano_nrf_22dbm_kiss_modem" }, { 0x82e1eb2c, "ikoka_nano_nrf_22dbm_repeater" }, { 0x0ee19b12, "ikoka_nano_nrf_22dbm_room_server" }, + { 0x3fae1fa8, "ikoka_nano_nrf_22dbm_room_server_lora_ota" }, { 0x6c67ed89, "ikoka_nano_nrf_30dbm_companion_radio_ble" }, { 0xd1c05d0d, "ikoka_nano_nrf_30dbm_companion_radio_usb" }, { 0xb90150b0, "ikoka_nano_nrf_30dbm_kiss_modem" }, { 0x7285bdb3, "ikoka_nano_nrf_30dbm_repeater" }, { 0x77cadc99, "ikoka_nano_nrf_30dbm_room_server" }, + { 0xad36c89a, "ikoka_nano_nrf_30dbm_room_server_lora_ota" }, { 0xc177e6cd, "ikoka_nano_nrf_33dbm_companion_radio_ble" }, { 0xf7a38993, "ikoka_nano_nrf_33dbm_companion_radio_usb" }, { 0x83762f33, "ikoka_nano_nrf_33dbm_kiss_modem" }, { 0x86cadda9, "ikoka_nano_nrf_33dbm_repeater" }, { 0x7e49da49, "ikoka_nano_nrf_33dbm_room_server" }, + { 0xbca22107, "ikoka_nano_nrf_33dbm_room_server_lora_ota" }, + { 0xa97c37c3, "ikoka_nano_nrf_400m33s_companion_radio_ble" }, + { 0x7599053c, "ikoka_nano_nrf_400m33s_companion_radio_usb" }, + { 0x3b4fb43e, "ikoka_nano_nrf_400m33s_kiss_modem" }, + { 0xe4e5b2b9, "ikoka_nano_nrf_400m33s_repeater" }, + { 0xd8b5876f, "ikoka_nano_nrf_400m33s_room_server_lora_ota" }, { 0x305d6f92, "ikoka_stick_nrf_22dbm_companion_radio_ble" }, { 0xbc6b870b, "ikoka_stick_nrf_22dbm_companion_radio_usb" }, { 0x78845fdd, "ikoka_stick_nrf_22dbm_kiss_modem" }, { 0x6d35f434, "ikoka_stick_nrf_22dbm_repeater" }, { 0xa52d76a8, "ikoka_stick_nrf_22dbm_room_server" }, + { 0x3ebecf7e, "ikoka_stick_nrf_22dbm_room_server_lora_ota" }, { 0xd8de9639, "ikoka_stick_nrf_30dbm_companion_radio_ble" }, { 0x8ab5c51b, "ikoka_stick_nrf_30dbm_companion_radio_usb" }, { 0x80097676, "ikoka_stick_nrf_30dbm_kiss_modem" }, { 0xffe70df5, "ikoka_stick_nrf_30dbm_repeater" }, { 0x3da80417, "ikoka_stick_nrf_30dbm_room_server" }, + { 0x44875354, "ikoka_stick_nrf_30dbm_room_server_lora_ota" }, { 0x47ca3c13, "ikoka_stick_nrf_33dbm_companion_radio_ble" }, { 0x28b499c7, "ikoka_stick_nrf_33dbm_companion_radio_usb" }, { 0xf1ab4c28, "ikoka_stick_nrf_33dbm_kiss_modem" }, { 0xe5331f02, "ikoka_stick_nrf_33dbm_repeater" }, { 0xfba7177b, "ikoka_stick_nrf_33dbm_room_server" }, + { 0x6844b1a0, "ikoka_stick_nrf_33dbm_room_server_lora_ota" }, + { 0x0fcc9068, "ikoka_stick_nrf_400m33s_companion_radio_ble" }, + { 0x7f32496e, "ikoka_stick_nrf_400m33s_companion_radio_usb" }, + { 0xe2c87b97, "ikoka_stick_nrf_400m33s_kiss_modem" }, + { 0xc4b93731, "ikoka_stick_nrf_400m33s_repeater" }, + { 0xa35b0fb6, "ikoka_stick_nrf_400m33s_room_server_lora_ota" }, { 0xde7dc472, "KeepteenLT1_repeater" }, { 0x3625bb80, "KeepteenLT1_repeater_lora_ota_no_external_sensors" }, { 0x69df7765, "LilyGo_T-Echo-Lite_companion_radio_ble" }, @@ -1006,17 +1131,31 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x40818863, "LilyGo_T-Echo-Lite_non_shell_companion_radio_ble" }, { 0x65deac33, "LilyGo_T-Echo-Lite_non_shell_companion_radio_usb" }, { 0xd86cf67a, "LilyGo_T-Echo-Lite_repeater" }, + { 0x5faa225b, "LilyGo_T-Echo-Lite_repeater_lora_ota" }, { 0xed73ac03, "LilyGo_T-Echo-Lite_room_server" }, + { 0x7ed14cbf, "LilyGo_T-Echo-Lite_room_server_lora_ota" }, { 0xab0d550a, "LilyGo_T-Echo_Card_companion_radio_ble" }, { 0x1bd2a266, "LilyGo_T-Echo_Card_companion_radio_usb" }, { 0x3655c748, "LilyGo_T-Echo_Card_kiss_modem" }, { 0x9a5ae8fc, "LilyGo_T-Echo_Card_repeater" }, + { 0xc7bddf00, "LilyGo_T-Echo_Card_repeater_lora_ota" }, { 0x1e9eb97a, "LilyGo_T-Echo_Card_room_server" }, + { 0x3ba7f116, "LilyGo_T-Echo_Card_room_server_lora_ota" }, { 0x139536f4, "LilyGo_T-Echo_companion_radio_ble" }, { 0x0716c724, "LilyGo_T-Echo_companion_radio_usb" }, { 0x8de23fa7, "LilyGo_T-Echo_kiss_modem" }, { 0xb92ec96b, "LilyGo_T-Echo_repeater" }, { 0x420ebc63, "LilyGo_T-Echo_room_server" }, + { 0x973f0a56, "LilyGo_T-Echo_room_server_lora_ota" }, + { 0xaa7604a8, "LilyGo_T3S3_companion_radio_ble" }, + { 0xc7de3a7e, "LilyGo_T3S3_companion_radio_ble_ps" }, + { 0xea6f172c, "LilyGo_T3S3_companion_radio_usb" }, + { 0xbed35156, "LilyGo_T3S3_kiss_modem" }, + { 0x8150baa7, "LilyGo_T3S3_repeater" }, + { 0x047828cc, "LilyGo_T3S3_repeater_bridge_espnow" }, + { 0xa8550751, "LilyGo_T3S3_repeater_observer_mqtt" }, + { 0x8abf8602, "LilyGo_T3S3_room_server" }, + { 0xfea68de9, "LilyGo_T3S3_room_server_observer_mqtt" }, { 0x967ccaee, "LilyGo_T3S3_sx1262_companion_radio_ble" }, { 0x8021afa2, "LilyGo_T3S3_sx1262_companion_radio_ble_ps" }, { 0x5f7c7688, "LilyGo_T3S3_sx1262_companion_radio_usb" }, @@ -1036,6 +1175,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xbe372c6d, "LilyGo_T3S3_sx1276_room_server" }, { 0xb762985a, "LilyGo_T3S3_sx1276_room_server_observer_mqtt" }, { 0x6215e9eb, "LilyGo_T3S3_sx1276_terminal_chat" }, + { 0xa16b488d, "LilyGo_T3S3_terminal_chat" }, { 0x07907102, "LilyGo_T_Impulse_Plus_repeater" }, { 0x3898ea56, "LilyGo_TBeam_1W_companion_radio_ble" }, { 0x2fb7e218, "LilyGo_TBeam_1W_companion_radio_ble_ps" }, @@ -1073,6 +1213,11 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xa2ce002f, "LilyGo_TLora_V2_1_1_6_room_server" }, { 0xba4f47f3, "LilyGo_TLora_V2_1_1_6_room_server_observer_mqtt_" }, { 0x6f16479e, "LilyGo_TLora_V2_1_1_6_terminal_chat" }, + { 0x467b1fae, "M5Stack_Cardputer_Adv_companion_radio_ble" }, + { 0x9f7ac346, "M5Stack_Cardputer_Adv_companion_radio_full" }, + { 0xb875674b, "M5Stack_Cardputer_Adv_companion_radio_usb" }, + { 0xb0d51b1a, "M5Stack_Cardputer_Adv_repeater" }, + { 0x805775f0, "M5Stack_Cardputer_Adv_room_server" }, { 0x1018e5d1, "M5Stack_Unit_C6L_companion_radio_ble" }, { 0xc0ab5040, "M5Stack_Unit_C6L_companion_radio_usb" }, { 0xa2bf90bd, "M5Stack_Unit_C6L_kiss_modem" }, @@ -1080,6 +1225,17 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xb9cd26cb, "M5Stack_Unit_C6L_room_server" }, { 0x9bc34bd5, "Mesh_pocket_repeater" }, { 0x144504b0, "Mesh_pocket_repeater_lora_ota_no_external_sensors" }, + { 0x81fbeb03, "Meshadventurer_companion_radio_ble" }, + { 0xcfeffb20, "Meshadventurer_companion_radio_usb" }, + { 0xfed38680, "Meshadventurer_kiss_modem" }, + { 0x66c33425, "Meshadventurer_m33s_companion_radio_ble" }, + { 0x4110e1d8, "Meshadventurer_m33s_companion_radio_usb" }, + { 0x91e001a0, "Meshadventurer_m33s_kiss_modem" }, + { 0x8492a2e5, "Meshadventurer_m33s_repeater" }, + { 0x99dcc936, "Meshadventurer_m33s_room_server" }, + { 0x1b29b77a, "Meshadventurer_m33s_terminal_chat" }, + { 0x3f31d335, "Meshadventurer_repeater" }, + { 0xb553c5be, "Meshadventurer_room_server" }, { 0xdbfe2675, "Meshadventurer_sx1262_companion_radio_ble" }, { 0xb00241d0, "Meshadventurer_sx1262_companion_radio_usb" }, { 0x88e77fee, "Meshadventurer_sx1262_kiss_modem" }, @@ -1092,6 +1248,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x0ec870e9, "Meshadventurer_sx1268_repeater" }, { 0x8f00c1f2, "Meshadventurer_sx1268_room_server" }, { 0xcea95e20, "Meshadventurer_sx1268_terminal_chat" }, + { 0xa96ddc8f, "Meshadventurer_terminal_chat" }, { 0xd45277ff, "Meshimi_companion_radio_ble_" }, { 0x2cad9a9d, "Meshimi_repeater_" }, { 0x02a4a8c1, "meshnology_w12_companion_radio_ble" }, @@ -1117,10 +1274,13 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x49d11eca, "MKE_s3_room_server" }, { 0xd41f0638, "MKE_s3_sensor" }, { 0xe3105eb8, "MKE_s3_terminal_chat" }, - { 0xba76cc33, "morse_bench_rak4631_companion" }, - { 0x944263f8, "morse_bench_t096_companion" }, - { 0xc7a8c754, "morse_production_rak4631_companion" }, + { 0xa949cfbb, "muzi_base_duo_repeater_lora_ota" }, + { 0x79d4e8c0, "muzi_base_duo_room_server_lora_ota" }, + { 0x71f965c3, "muzi_base_uno_repeater_lora_ota" }, + { 0x81ffc77c, "muzi_base_uno_room_server_lora_ota" }, { 0xf8259880, "Nano_G2_Ultra_repeater" }, + { 0x06b2235b, "Nano_G2_Ultra_repeater_lora_ota" }, + { 0x431f2060, "Nano_G2_Ultra_room_server_lora_ota" }, { 0x063f1f00, "nibble_screen_connect_companion_radio_ble_" }, { 0x70d71f92, "nibble_screen_connect_companion_radio_full_" }, { 0xa8a79da5, "nibble_screen_connect_companion_radio_usb_" }, @@ -1138,9 +1298,25 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x8174cbdc, "nibble_zero_connect_repeater_bridge_espnow_" }, { 0x0bf0f061, "nibble_zero_connect_room_server_" }, { 0x2509dd80, "nibble_zero_connect_terminal_chat_" }, + { 0xf5cccb26, "ProMicro_400m33s_companion_radio_ble" }, + { 0x765fa32b, "ProMicro_400m33s_companion_radio_usb" }, + { 0xb97bbea5, "ProMicro_400m33s_kiss_modem" }, + { 0x4b7f908e, "ProMicro_400m33s_repeater" }, + { 0x95394b50, "ProMicro_400m33s_repeater_lora_ota_no_external_sensors" }, + { 0xadec11d8, "ProMicro_400m33s_room_server" }, + { 0xede52667, "ProMicro_400m33s_sensor" }, + { 0x6b937e34, "ProMicro_400m33s_terminal_chat" }, { 0x56293b24, "ProMicro_companion_radio_ble" }, { 0x8c81078c, "ProMicro_companion_radio_usb" }, { 0xbd6a1c97, "ProMicro_kiss_modem" }, + { 0xcc9e3773, "ProMicro_m33s_companion_radio_ble" }, + { 0x8814cf5a, "ProMicro_m33s_companion_radio_usb" }, + { 0x7d36f74e, "ProMicro_m33s_kiss_modem" }, + { 0xb7c525b6, "ProMicro_m33s_repeater" }, + { 0xd0938945, "ProMicro_m33s_repeater_lora_ota_no_external_sensors" }, + { 0x15981dee, "ProMicro_m33s_room_server" }, + { 0x4c9bc111, "ProMicro_m33s_sensor" }, + { 0xef5a0501, "ProMicro_m33s_terminal_chat" }, { 0xf4d98c12, "ProMicro_repeater" }, { 0xccac4283, "ProMicro_repeater_bridge_rs232_serial1" }, { 0xa68c09e9, "ProMicro_repeater_lora_ota_no_external_sensors" }, @@ -1195,10 +1371,13 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x9cb0b232, "RAK_WisMesh_Tag_room_server" }, { 0x51fa1a49, "RAK_WisMesh_Tag_sensor" }, { 0xdb73638b, "SenseCap_Solar_repeater" }, + { 0x00d7b152, "SenseCap_Solar_room_server_lora_ota" }, { 0xd904c2d5, "SenseCapIndicator-ESPNow_comp_radio_usb" }, { 0x3a14aac7, "SenseCapIndicator-LoRa-N16R2_comp_radio_usb_wifi" }, + { 0xc7595ed8, "SenseCapIndicator-LoRa-N16R2_repeater" }, { 0x620569f4, "SenseCapIndicator-LoRa_comp_radio_usb" }, { 0x08483f6b, "SenseCapIndicator-LoRa_comp_radio_usb_wifi" }, + { 0x500628f7, "SenseCapIndicator-LoRa_repeater" }, { 0x0db48f35, "solarxiao_30S_companion_radio_ble" }, { 0x20532f6c, "solarxiao_30S_companion_radio_usb" }, { 0x293ced32, "solarxiao_30S_kiss_modem" }, @@ -1213,6 +1392,11 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xcb59ea4e, "solarxiao_33S_repeater_bridge_rs232" }, { 0xe3a28284, "solarxiao_33S_room_server" }, { 0xa8cb8e8b, "solarxiao_33S_room_server_lora_ota" }, + { 0xaf9b6e67, "solarxiao_400M33S_companion_radio_ble" }, + { 0x5d4bbd69, "solarxiao_400M33S_companion_radio_usb" }, + { 0x20e351ae, "solarxiao_400M33S_kiss_modem" }, + { 0x240eec8e, "solarxiao_400M33S_repeater" }, + { 0xf228abd5, "solarxiao_400M33S_room_server_lora_ota" }, { 0x05747eb6, "Station_G2_logging_repeater" }, { 0x75587f24, "Station_G2_logging_repeater_bridge_espnow" }, { 0xf2128c81, "Station_G2_repeater" }, @@ -1249,6 +1433,13 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xcb7da3f5, "T_Beam_S3_Supreme_SX1262_repeater_observer_mqtt" }, { 0x9952fbe3, "T_Beam_S3_Supreme_SX1262_room_server" }, { 0x3729cd74, "T_Beam_S3_Supreme_SX1262_room_server_observer_mqtt" }, + { 0xcbfe8989, "Tbeam_companion_radio_ble" }, + { 0x612c7dce, "Tbeam_companion_radio_ble_ps" }, + { 0x7699aefb, "Tbeam_kiss_modem" }, + { 0x50a86e3e, "Tbeam_repeater" }, + { 0x9daa2d8b, "Tbeam_repeater_observer_mqtt" }, + { 0x394ba432, "Tbeam_room_server" }, + { 0x3c5059bd, "Tbeam_room_server_observer_mqtt" }, { 0xdc27c37c, "Tbeam_SX1262_companion_radio_ble" }, { 0x9b9f8775, "Tbeam_SX1262_companion_radio_ble_ps" }, { 0xb27514a3, "Tbeam_SX1262_kiss_modem" }, @@ -1263,6 +1454,9 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xe1372b52, "Tbeam_SX1276_repeater_observer_mqtt" }, { 0x5a79bac1, "Tbeam_SX1276_room_server" }, { 0x6f339514, "Tbeam_SX1276_room_server_observer_mqtt" }, + { 0x3de183bf, "Tenstar_C3_kiss_modem" }, + { 0xedec1ddc, "Tenstar_C3_repeater" }, + { 0x57406964, "Tenstar_C3_repeater_bridge_espnow" }, { 0x8eaa289e, "Tenstar_C3_sx1262_kiss_modem" }, { 0x70e91bd9, "Tenstar_C3_sx1262_repeater" }, { 0x5a7e9c2d, "Tenstar_C3_sx1262_repeater_bridge_espnow" }, @@ -1274,6 +1468,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x3c012018, "ThinkNode_M1_kiss_modem" }, { 0x6afd6f75, "ThinkNode_M1_repeater" }, { 0x7517d400, "ThinkNode_M1_room_server" }, + { 0xcc51754f, "ThinkNode_M1_room_server_lora_ota" }, { 0xd7598668, "ThinkNode_M2_companion_radio_ble" }, { 0x61bdb52a, "ThinkNode_M2_companion_radio_full" }, { 0x413287d8, "ThinkNode_M2_companion_radio_serial" }, @@ -1306,6 +1501,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0xe59c9373, "ThinkNode_M6_kiss_modem" }, { 0x236f605c, "ThinkNode_M6_repeater" }, { 0x93994fed, "ThinkNode_M6_room_server" }, + { 0x730ae20a, "ThinkNode_M6_room_server_lora_ota" }, { 0x66c47cfd, "ThinkNode_M7_companion_radio_ble" }, { 0x48061a01, "ThinkNode_M7_companion_radio_ethernet" }, { 0x7ed7137d, "ThinkNode_M7_companion_radio_full" }, @@ -1323,6 +1519,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x609d50b3, "ThinkNode_M9_repeater_" }, { 0x5718c7ea, "ThinkNode_M9_room_server_" }, { 0x7bbf1081, "Waveshare_S3_LR1121_companion_radio_ble" }, + { 0xa39983d6, "Waveshare_S3_LR1121_companion_radio_full" }, { 0xb151c2aa, "Waveshare_S3_LR1121_companion_radio_usb" }, { 0x3b0174fd, "Waveshare_S3_LR1121_kiss_modem" }, { 0xc1fd2578, "Waveshare_S3_LR1121_partition_expander_repeater_observer_mqtt" }, @@ -1334,9 +1531,11 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x37443a5b, "WHY2025_badge_companion_radio_ble_" }, { 0x603384a7, "WHY2025_badge_repeater_" }, { 0x76456c88, "Wio_Tracker_L2_companion_radio_ble" }, + { 0xf59a52bc, "Wio_Tracker_L2_companion_radio_full" }, { 0x28c4948b, "Wio_Tracker_L2_companion_radio_usb" }, { 0xb34a83c5, "Wio_Tracker_L2_repeater" }, { 0x63fe9591, "Wio_Tracker_L2_room_server" }, + { 0x165d6098, "wio_wm1110_companion_radio_full" }, { 0xce3ef40f, "wio_wm1110_repeater" }, { 0x475a2a6a, "WioTrackerL1_companion_radio_ble" }, { 0xf4175d2c, "WioTrackerL1_companion_radio_usb" }, @@ -1344,6 +1543,7 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x556eb1bc, "WioTrackerL1_repeater" }, { 0xb67370b3, "WioTrackerL1_repeater_lora_ota_no_external_sensors" }, { 0x0c689b90, "WioTrackerL1_room_server" }, + { 0x93f204f5, "WioTrackerL1_room_server_lora_ota" }, { 0x91eac424, "WioTrackerL1Eink_companion_radio_ble" }, { 0x7a84a8c4, "WioTrackerL1Eink_kiss_modem" }, { 0x67843a5f, "Xiao_C3_companion_radio_ble" }, @@ -1356,12 +1556,23 @@ inline const char* ota_target_env_name(uint32_t target_id) { { 0x77c8f2b5, "Xiao_C6_companion_radio_ble_" }, { 0x71ee0e15, "Xiao_C6_kiss_modem" }, { 0x8824cd0c, "Xiao_C6_repeater_" }, + { 0xc6ff2781, "Xiao_nrf52_400m33s_companion_radio_ble" }, + { 0x6a0e5a97, "Xiao_nrf52_400m33s_companion_radio_usb" }, + { 0x9cfbc0c0, "Xiao_nrf52_400m33s_kiss_modem" }, + { 0x6f428854, "Xiao_nrf52_400m33s_repeater" }, + { 0x7c0b1bdd, "Xiao_nrf52_400m33s_room_server_lora_ota" }, { 0xe5439198, "Xiao_nrf52_companion_radio_ble" }, { 0xe90a6e74, "Xiao_nrf52_companion_radio_usb" }, { 0x833e5cdc, "Xiao_nrf52_kiss_modem" }, + { 0xc9cb4d46, "Xiao_nrf52_m33s_companion_radio_ble" }, + { 0xc47f2bc1, "Xiao_nrf52_m33s_companion_radio_usb" }, + { 0xb488a5f6, "Xiao_nrf52_m33s_kiss_modem" }, + { 0xd5435820, "Xiao_nrf52_m33s_repeater" }, + { 0x8ce235a6, "Xiao_nrf52_m33s_room_server_lora_ota" }, { 0x93145fbb, "Xiao_nrf52_repeater" }, { 0x8d3dd6d5, "Xiao_nrf52_repeater_bridge_rs232" }, { 0x33a154ff, "Xiao_nrf52_room_server" }, + { 0x16b574a1, "Xiao_nrf52_room_server_lora_ota" }, { 0x6658b418, "Xiao_S3_companion_radio_ble" }, { 0x0cfb9c00, "Xiao_S3_companion_radio_ble_ps" }, { 0x964f4f5c, "Xiao_S3_companion_radio_usb" }, diff --git a/test/test_firmware_picker.js b/test/test_firmware_picker.js index c8400f15d..b3ea9f46a 100644 --- a/test/test_firmware_picker.js +++ b/test/test_firmware_picker.js @@ -24,6 +24,28 @@ assert(picker.unavailableBootloaderForHardware(bootloaderCatalog, "Heltec_tower_ assert.strictEqual(picker.bootloaderForHardware(bootloaderCatalog, "RAK_3401", "nrf52").storage, "adaptive"); assert.strictEqual(picker.bootloaderForHardware(bootloaderCatalog, "RAK_4631", "nrf52").id, "wiscore_rak4631_auto"); assert.strictEqual(picker.bootloaderForHardware(bootloaderCatalog, "ThinkNode_M8", "nrf52"), null); +// An RF-module choice changes application identity, while keeping the exact +// MCU/flash bootloader. Keep the picker and embedded-resource aliases aligned. +const m33BootloaderHardware = { + ProMicro_m33s: "ProMicro", + ProMicro_400m33s: "ProMicro", + Xiao_nrf52_m33s: "Xiao_nrf52", + Xiao_nrf52_400m33s: "Xiao_nrf52", + ikoka_handheld_nrf_e22_33dbm: "Xiao_nrf52", + ikoka_handheld_nrf_e22_33dbm_096: "Xiao_nrf52", + ikoka_handheld_nrf_e22_400m33s: "Xiao_nrf52", + ikoka_handheld_nrf_e22_400m33s_096: "Xiao_nrf52", + ikoka_nano_nrf_400m33s: "Xiao_nrf52", + ikoka_stick_nrf_400m33s: "Xiao_nrf52", + solarxiao_400M33S: "Xiao_nrf52", +}; +for (const [hardware, bootHardware] of Object.entries(m33BootloaderHardware)) { + const expected = picker.bootloaderForHardware(bootloaderCatalog, bootHardware, "nrf52"); + assert(expected, bootHardware); + assert.strictEqual(picker.bootloaderForHardware(bootloaderCatalog, hardware, "nrf52").id, + expected.id, hardware); + assert.strictEqual(picker.bootloaderForHardware(bootloaderCatalog, hardware, "esp32"), null); +} const nrf52Hardware = require("./fixtures/firmware_picker_nrf52_1_17_1_7.json").hardware; assert.strictEqual(nrf52Hardware.length, 53); let mappedNrf52 = 0; diff --git a/test/test_ota_target_names.py b/test/test_ota_target_names.py index 3e373ec2a..925851e06 100644 --- a/test/test_ota_target_names.py +++ b/test/test_ota_target_names.py @@ -164,21 +164,34 @@ class OtaTargetNameTest(unittest.TestCase): self.assertEqual(row, firsts[group + 1]) self.assertEqual(position, len(raw)) self.assertEqual(names, [name for _, name in rows]) - return data, lengths + return data, offsets, lengths, firsts def test_rak_full_grouped_roles_keep_all_names_in_same_scratch_and_save_flash(self): - data, lengths = self.grouped_roundtrip(self.rows) + def encoded_bytes(chunks): + data, offsets, lengths, firsts = chunks + return len(data) + 2 * (len(offsets) + len(lengths) + len(firsts)) + + grouped = self.grouped_roundtrip(self.rows) previous = gen_targets.compressed_name_chunks(self.rows, 4096) - self.assertGreater(len(previous[0]) - len(data), 1000) - self.assertLessEqual(max(lengths), 4096) + # Inventory growth changes suffix diversity and chunk boundaries, so + # an absolute byte delta is not a stable live-catalog benchmark. Every + # current name must still round-trip and grouped tables must occupy + # less flash, including all uint16_t restart tables in both encodings. + self.assertLess(encoded_bytes(grouped), encoded_bytes(previous)) + self.assertLessEqual(max(grouped[2]), 4096) # Unusual/legacy names stay complete; larger future inventories restart # board prefixes and carry a complete suffix dictionary in each chunk. future = gen_targets.target_rows( [f"board_{i:04d}_{role}" for i in range(700) for role in ("repeater", "companion_radio_usb", "room_server")] + ["legacy_without_role", "odd_BOARD_repeatr", "case_Companion_ble"]) - _, chunks = self.grouped_roundtrip(future) - self.assertGreater(len(chunks), 1) + future_grouped = self.grouped_roundtrip(future) + self.assertGreater(len(future_grouped[2]), 1) + # This fixed matrix measures role-sharing performance independently + # of the live hardware inventory. Grouped tables must consume at most + # half the old encoding's flash, including restart metadata. + future_previous = gen_targets.compressed_name_chunks(future, 4096) + self.assertLessEqual(2 * encoded_bytes(future_grouped), encoded_bytes(future_previous)) def test_grouped_decoder_rejects_bad_dictionary_prefix_count_and_role_index(self): from zopfli_compress import raw_deflate_compress diff --git a/test/test_radio_tx_power_transaction.py b/test/test_radio_tx_power_transaction.py index 713358745..38d75da6a 100644 --- a/test/test_radio_tx_power_transaction.py +++ b/test/test_radio_tx_power_transaction.py @@ -1,11 +1,14 @@ """Execute real TX-power admission, retry and unchanged-value behavior.""" -import configparser from pathlib import Path import re +import subprocess +import sys import unittest from test_radio_interrupt_recovery import compile_run from test_radio_receive_contract import method +from test_onboard_qspi_profiles import effective_defines +from platformio.project.config import ProjectConfig ROOT = Path(__file__).resolve().parents[1] @@ -288,32 +291,25 @@ int main() { f"-DMESH_ENABLE_CARRIER_TOOLS={carrier_tools}")) -class ExternalPaPowerLimitTests(unittest.TestCase): - """A safe startup default must not become the only external PA protection.""" +class ResolvedPaProfiles: + """Read-only, fully resolved build recipes shared by PA safety checks.""" @classmethod def setUpClass(cls): - cls.config = configparser.ConfigParser( - interpolation=None, strict=False, inline_comment_prefixes=(";",)) - cls.config.read([ROOT / "platformio.ini", - *sorted((ROOT / "variants").glob("*/platformio.ini"))]) + # Resolve the actual PlatformIO inheritance and interpolation rules. + # Loading this Python library does not launch a PlatformIO process. + cls.config = ProjectConfig(str(ROOT / "platformio.ini")) - def option(self, section, key, stack=()): - pair = (section, key) - self.assertNotIn(pair, stack, "recursive PlatformIO option") - value = self.config.get(section, key, fallback=None) - if value is None: - for parent in self.config.get(section, "extends", fallback="").replace(",", " ").split(): - inherited = self.option(parent, key, stack + (pair,)) - if inherited: - return inherited - return "" + def option(self, section, key): + value = self.config.get(section, key, default="") + return "\n".join(value) if isinstance(value, list) else str(value) - def replace(match): - reference_section, reference_key = match.group(1).rsplit(".", 1) - return self.option(reference_section, reference_key, stack + (pair,)) + def defines(self, target): + return effective_defines(self.config.items("env:" + target, as_dict=True)) - return re.sub(r"\$\{([^}]+)\}", replace, value) + +class ExternalPaPowerLimitTests(ResolvedPaProfiles, unittest.TestCase): + """A safe startup default must not become the only external PA protection.""" def targets(self, cap): solar_roles = ("companion_radio_ble", "companion_radio_usb", "repeater", @@ -334,7 +330,7 @@ class ExternalPaPowerLimitTests(unittest.TestCase): "kiss_modem")) pattern = {8: r"env:solarxiao_33S_", 9: r"env:ikoka_(?:nano|stick)_nrf_33dbm_", - 20: r"env:(?:ikoka_(?:nano|stick)_nrf_30dbm_|ikoka_handheld_nrf_)"}[cap] + 20: r"env:(?:ikoka_(?:nano|stick)_nrf_30dbm_|ikoka_handheld_nrf_(?:e22_30dbm_|kiss_modem$))"}[cap] discovered = {section[4:] for section in self.config.sections() if re.match(pattern, section)} self.assertEqual(discovered, expected, @@ -342,11 +338,8 @@ class ExternalPaPowerLimitTests(unittest.TestCase): return sorted(expected) def power_defines(self, target): - pattern = r"-D\s*(LORA_TX_POWER|MAX_LORA_TX_POWER)\s*=\s*(-?\d+)\b" - unflags = set(re.findall(pattern, self.option("env:" + target, "build_unflags"))) - return {key: int(value) for key, value in re.findall( - pattern, self.option("env:" + target, "build_flags")) - if (key, value) not in unflags} + return {name: int(value) for name, value in self.defines(target).items() + if name in ("LORA_TX_POWER", "MAX_LORA_TX_POWER")} def test_all_39_external_pa_roles_have_their_documented_input_limit(self): for cap in (8, 9, 20): @@ -456,6 +449,258 @@ int main() { defines = tuple("-D" + key + "=" + str(value) for key, value in profile) compile_run(code, defines=defines + ("-DMESH_RADIO_PROFILE_CHIP=1262",)) +M33_MODULE_PROFILES = ( + ("ikoka_handheld_nrf_e22_33dbm", "ikoka_handheld_nrf_e22_30dbm", "sx1262"), + ("ikoka_handheld_nrf_e22_400m33s", "ikoka_handheld_nrf_e22_30dbm", "sx1268"), + ("Generic_E22_m33s", "Generic_E22", "auto"), + ("Meshadventurer_m33s", "Meshadventurer", "auto"), + ("ProMicro_m33s", "ProMicro", "sx1262"), + ("ProMicro_400m33s", "ProMicro", "sx1268"), + ("Xiao_nrf52_m33s", "Xiao_nrf52", "sx1262"), + ("Xiao_nrf52_400m33s", "Xiao_nrf52", "sx1268"), + ("solarxiao_400M33S", "solarxiao_33S", "sx1268"), + ("ikoka_nano_nrf_400m33s", "ikoka_nano_nrf_33dbm", "sx1268"), + ("ikoka_stick_nrf_400m33s", "ikoka_stick_nrf_33dbm", "sx1268"), +) +M33_COMMON_ROLES = ("companion_radio_ble", "companion_radio_usb", "repeater", + "room_server_lora_ota", "kiss_modem") + + +def m33_roles(hardware): + if hardware.startswith("ikoka_handheld_"): + return ("096_companion_radio_ble", "096_companion_radio_usb", + "repeater", "room_server_lora_ota", "kiss_modem") + if hardware == "Generic_E22_m33s": + return ("repeater", "repeater_bridge_espnow", "kiss_modem") + if hardware == "Meshadventurer_m33s": + return ("repeater", "repeater_bridge_espnow", "companion_radio_usb", + "companion_radio_ble", "terminal_chat", "room_server", "kiss_modem") + if hardware.startswith("ProMicro_"): + return ("repeater", "room_server", "terminal_chat", "companion_radio_usb", "companion_radio_ble", + "sensor", "kiss_modem") + if hardware.startswith(("Xiao_nrf52_", "solarxiao_")): + return M33_COMMON_ROLES + return M33_COMMON_ROLES + + +class M33ModuleVariantTests(ResolvedPaProfiles, unittest.TestCase): + """M33 PA hardware needs its own safe image before the first radio init.""" + + def profiles(self): + for hardware, parent, family in M33_MODULE_PROFILES: + expected = {hardware + "_" + role for role in m33_roles(hardware)} + actual = {section[4:] for section in self.config.sections() + if section.startswith("env:" + hardware + "_")} + self.assertEqual(actual, expected, "All firmware roles need a safe M33 recipe") + for target in sorted(expected): + role = target[len(hardware) + 1:] + source = parent + "_" + role + if hardware.startswith("ikoka_handheld_") and role == "kiss_modem": + source = "ikoka_handheld_nrf_kiss_modem" + yield target, source, family + + def test_all_m33_roles_limit_initial_and_runtime_drive_to_8_dbm(self): + for target, _, family in self.profiles(): + with self.subTest(target=target): + definitions = self.defines(target) + self.assertEqual(definitions["LORA_TX_POWER"], "8") + self.assertEqual(definitions["MAX_LORA_TX_POWER"], "8") + if family == "auto": + self.assertEqual(definitions["RADIO_CLASS"], "UniversalLoRaRadio") + self.assertEqual(definitions["WRAPPER_CLASS"], "UniversalLoRaRadio") + self.assertEqual(definitions["MESH_RADIO_AUTO_FAMILY"], "1") + self.assertEqual(definitions["MESH_RADIO_AUTO_SX1268"], "1") + self.assertEqual(definitions["MESH_RADIO_AUTO_SX127X"], "0") + else: + suffix = "SX1268" if family == "sx1268" else "SX1262" + self.assertEqual(definitions["RADIO_CLASS"], "Custom" + suffix) + self.assertEqual(definitions["WRAPPER_CLASS"], "Custom" + suffix + "Wrapper") + self.assertIn("USE_" + suffix, definitions) + self.assertNotIn("USE_SX1262" if family == "sx1268" else "USE_SX1268", + definitions) + if family == "sx1268": + self.assertEqual(float(definitions["LORA_FREQ"]), 433.0) + + def test_module_selection_preserves_carrier_wiring_storage_and_roles(self): + def carrier_pins(definitions): + return {key: value for key, value in definitions.items() + if key.startswith(("P_LORA_", "SX126X_", "PIN_GPS_", "PIN_BOARD_", + "PIN_WIRE_")) or key == "PIN_USER_BTN"} + + for target, parent, _ in self.profiles(): + with self.subTest(target=target, parent=parent): + definitions, parent_definitions = self.defines(target), self.defines(parent) + self.assertEqual(carrier_pins(definitions), carrier_pins(parent_definitions)) + for option in ("board", "board_build.ldscript", "board_upload.maximum_size", + "board_build.partitions", "build_src_filter", "lib_deps"): + self.assertEqual(self.option("env:" + target, option), + self.option("env:" + parent, option), option) + for name in ("ENABLE_OTA", "DISABLE_LORA_OTA", "OTA_QSPI_STORE", + "OTA_QSPI_BOOTLOADER_UPDATE", "QSPIFLASH", "ENABLE_USB_INTERFACE", + "BLE_PIN_CODE", "DISPLAY_CLASS", "DISPLAY_ROTATION"): + self.assertEqual(definitions.get(name), parent_definitions.get(name), name) + + def test_m33_choices_get_distinct_ota_identity_and_target_catalog_entries(self): + sys.path.insert(0, str(ROOT / "tools/mota")) + from motalib import hardware_id_for_env, target_id_for_env + + rows = {name: int(identifier, 16) for identifier, name in re.findall( + r'\{ 0x([0-9a-fA-F]{8}), "([^"]+)" \},', + (ROOT / "src/helpers/ota/OtaTargets.h").read_text())} + target_ids = set() + for target, parent, _ in self.profiles(): + with self.subTest(target=target): + definitions = self.defines(target) + self.assertNotIn("OTA_VARIANT", definitions, + "A module choice must not silently alias its parent's OTA image") + self.assertNotIn("MOTA_TARGET_ID", definitions) + self.assertNotIn("MOTA_HW_ID", definitions) + identity = target_id_for_env(target) + self.assertNotEqual(identity, target_id_for_env(parent)) + self.assertNotIn(identity, target_ids) + target_ids.add(identity) + self.assertNotEqual(hardware_id_for_env(target), hardware_id_for_env(parent)) + if "ENABLE_OTA" in definitions and "DISABLE_LORA_OTA" not in definitions: + self.assertEqual(rows.get(target), identity, + "OTA-enabled module choices must be recognizable over LoRa") + + def test_bootloader_choices_share_only_the_mcu_bootloader_identity(self): + sys.path.insert(0, str(ROOT / "scripts")) + from nrf52_embedded_bootloader import load_manifest, select_profile + manifest = load_manifest() + for target, parent, family in self.profiles(): + if family == "auto" or not target.endswith(("_repeater", "_room_server")): + continue + with self.subTest(target=target): + expected, _ = select_profile(manifest, parent) + actual, metadata = select_profile(manifest, target) + self.assertEqual(actual["id"], expected["id"]) + self.assertEqual(metadata["sourceHardware"], + target.rsplit("_room_server" if target.endswith("_room_server") + else "_repeater", 1)[0]) + + def test_release_presets_cannot_retune_a_400m33s_image_to_900_mhz(self): + program = r''' +set -euo pipefail +source "$1/build.sh" +RADIO_FREQ_OVERRIDE=$3 +RADIO_BW_OVERRIDE=62.5 +RADIO_SF_OVERRIDE=7 +RADIO_CR_OVERRIDE=5 +RADIO_SETTING_TITLE=$USA_CASCADIA_RADIO_TITLE +PLATFORMIO_BUILD_FLAGS=-DKEEP_CALLER_FLAG=1 +apply_radio_overrides "$2" >/dev/null +printf '%s\n' "$PLATFORMIO_BUILD_FLAGS" +''' + for hardware, _, family in M33_MODULE_PROFILES: + if family != "sx1268": + continue + for frequency, expected in (("910.525", "433"), ("869.618", "433"), + ("409.999", "433"), ("493.001", "433"), + ("410", "410"), ("433.175", "433.175"), + ("493", "493")): + with self.subTest(hardware=hardware, frequency=frequency): + result = subprocess.run( + ["bash", "-c", program, "m33-release-test", str(ROOT), + hardware + "_repeater", frequency], capture_output=True, + text=True, timeout=30, check=True, cwd=ROOT) + definitions = effective_defines({"build_flags": result.stdout}) + self.assertEqual(definitions["LORA_FREQ"], expected) + self.assertEqual(definitions["KEEP_CALLER_FLAG"], "1") + self.assertEqual(definitions["LORA_BW"], "62.5") + self.assertNotIn("MESHCORE_USA_RADIO_PRESET", definitions) + for target in ("ProMicro_repeater", "Xiao_nrf52_m33s_repeater", + "solarxiao_33S_repeater", "Generic_E22_m33s_repeater"): + with self.subTest(target=target): + result = subprocess.run( + ["bash", "-c", program, "m33-release-test", str(ROOT), + target, "910.525"], capture_output=True, text=True, + timeout=30, check=True, cwd=ROOT) + definitions = effective_defines({"build_flags": result.stdout}) + self.assertEqual(definitions["LORA_FREQ"], "910.525") + self.assertEqual(definitions["MESHCORE_USA_RADIO_PRESET"], "1") + + def test_first_production_begin_uses_safe_power_before_preferences_load(self): + # Execute the production init bodies with resolved board defaults. The + # begin() probe represents the first RadioLib hardware write, before + # CommonCLI/Companion loads and clamps any old saved preferences. + startup_profiles = set() + for target, _, family in self.profiles(): + definitions = self.defines(target) + chips = (1262, 1268) if family == "auto" else (1268 if family == "sx1268" else 1262,) + for chip in chips: + selected = {key: value for key, value in definitions.items() + if key in ("LORA_FREQ", "LORA_BW", "LORA_SF", "LORA_CR", + "LORA_TX_POWER", "MAX_LORA_TX_POWER", "NRF52_PLATFORM", + "ESP32_PLATFORM", "MESH_RADIO_AUTO_SX1268", "MESH_E22_M33S") + or key.startswith(("P_LORA_", "SX126X_"))} + startup_profiles.add((chip, tuple(sorted(selected.items())))) + for chip, definitions in sorted(startup_profiles): + source = (ROOT / f"src/helpers/radiolib/CustomSX{chip}.h").read_text() + init = method(source, "bool std_init(SPIClass* spi = NULL)") + # Both declarations share this body; remove the closing directive + # for the preceding RP2040-only alternative declaration. + init = "bool std_init(SPIClass* spi = NULL) " + init[init.index("{"):] + code = r''' +#include +#include +#include +#include +#define MESH_DEBUG_PRINTLN(...) ((void)0) +#define RADIOLIB_ERR_NONE 0 +#define RADIOLIB_ERR_CHIP_NOT_FOUND -2 +#define RADIOLIB_ERR_SPI_CMD_FAILED -3 +#define RADIOLIB_NC -1 +#define RADIOLIB_SX126X_SYNC_WORD_PRIVATE 18 +#define D0 0 +#define D1 1 +#define D2 2 +#define D3 3 +#define D4 4 +#define D5 5 +#define D6 6 +#define D7 7 +#define D8 8 +#define D9 9 +#define D10 10 +struct SPIClass { + template void begin(Args...) {} + template void setPins(Args...) {} +}; +namespace mesh { +struct Logger { template void print(T) {} template void println(T) {} }; +Logger logger; +Logger& usbLoggingPort() { return logger; } +} +struct Chip { + unsigned begins = 0; + uint32_t tcxoDelay = 1600, _rxDutyCycleTransitionUs = 0; + int begin(float frequency, float, int, int, int, int power, int, float, bool = false) { + ++begins; + assert(begins == 1 && power == 8 && power == MAX_LORA_TX_POWER); +#if MESH_RADIO_AUTO_SX1268 && TEST_CHIP == 1268 + assert(frequency == mesh::autoLoRaInitialFrequency(mesh::LoRaRadioFamily::SX1268, LORA_FREQ)); + assert(frequency == 433.0f); +#else + assert(frequency == static_cast(LORA_FREQ)); +#endif + return RADIOLIB_ERR_NONE; + } + void setCRC(int) {} + void setCurrentLimit(int) {} + void setDio2AsRfSwitch(bool) {} + void setRxBoostedGainMode(bool) {} + void setRfSwitchPins(int, int) {} + @INIT@ +}; +int main() { SPIClass spi; Chip radio; assert(radio.std_init(&spi) && radio.begins == 1); } +''' + flags = tuple("-D" + key + ("=" + value if value is not None else "") + for key, value in definitions) + with self.subTest(chip=chip, definitions=definitions): + compile_run(code.replace("@INIT@", init), + defines=flags + (f"-DTEST_CHIP={chip}",)) + if __name__ == "__main__": unittest.main() diff --git a/tools/mota/nrf52_internal_bootloader_targets.txt b/tools/mota/nrf52_internal_bootloader_targets.txt index 9d98f5226..1991f387c 100644 --- a/tools/mota/nrf52_internal_bootloader_targets.txt +++ b/tools/mota/nrf52_internal_bootloader_targets.txt @@ -18,6 +18,8 @@ Mesh_pocket_repeater_lora_ota_no_external_sensors KeepteenLT1_repeater_lora_ota_no_external_sensors Minewsemi_me25ls01_repeater_lora_ota_no_external_sensors ProMicro_repeater_lora_ota_no_external_sensors +ProMicro_m33s_repeater_lora_ota_no_external_sensors +ProMicro_400m33s_repeater_lora_ota_no_external_sensors t1000e_repeater_lora_ota_no_external_sensors ThinkNode_M3_repeater_lora_ota_no_external_sensors RAK_3401_repeater_lora_ota_no_external_sensors diff --git a/variants/e22_m33s/platformio.ini b/variants/e22_m33s/platformio.ini new file mode 100644 index 000000000..a08360c55 --- /dev/null +++ b/variants/e22_m33s/platformio.ini @@ -0,0 +1,34 @@ +; External-PA E22 M33S modules need a different drive limit from M22/M30. +; 8 dBm is chip drive, not the amplified RF output. Never auto-detect this +; profile from an SX126x chip ID: the external amplifier is not identifiable. +[e22_m33s] +build_flags = + -D MESH_E22_M33S=1 + -D LORA_TX_POWER=8 + -D MAX_LORA_TX_POWER=8 +build_unflags = + -D LORA_TX_POWER=22 + -D LORA_TX_POWER=20 + -D LORA_TX_POWER=9 + -D MAX_LORA_TX_POWER=20 + -D MAX_LORA_TX_POWER=9 + +[e22_m33s_nrf52] +build_flags = ${e22_m33s.build_flags} +build_unflags = + ${nrf52_base.build_unflags} + ${e22_m33s.build_unflags} + +[e22_400m33s_nrf52] +build_flags = + ${e22_m33s_nrf52.build_flags} + -D USE_SX1268 + -D RADIO_CLASS=CustomSX1268 + -D WRAPPER_CLASS=CustomSX1268Wrapper + -D LORA_FREQ=433.0 +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D USE_SX1262 + -D RADIO_CLASS=CustomSX1262 + -D WRAPPER_CLASS=CustomSX1262Wrapper + -D LORA_FREQ=869.618 diff --git a/variants/generic_e22_universal/platformio.ini b/variants/generic_e22_universal/platformio.ini index 181a1a56c..2e79bc3e2 100644 --- a/variants/generic_e22_universal/platformio.ini +++ b/variants/generic_e22_universal/platformio.ini @@ -70,3 +70,35 @@ build_src_filter = lib_deps = ${Generic_E22_Auto.lib_deps} ${esp32_ota.lib_deps} + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:Generic_E22_m33s_repeater] +extends = env:Generic_E22_repeater +build_unflags = + ${e22_m33s.build_unflags} + -D ADVERT_NAME='"E22 Repeater"' +build_flags = + ${env:Generic_E22_repeater.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Generic E22 M33S"' + -D ADVERT_NAME='"Generic E22 M33S Repeater"' + +[env:Generic_E22_m33s_repeater_bridge_espnow] +extends = env:Generic_E22_repeater_bridge_espnow +build_unflags = + ${e22_m33s.build_unflags} + -D ADVERT_NAME='"ESPNow Bridge"' +build_flags = + ${env:Generic_E22_repeater_bridge_espnow.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Generic E22 M33S"' + -D ADVERT_NAME='"Generic E22 M33S Repeater"' + +[env:Generic_E22_m33s_kiss_modem] +extends = env:Generic_E22_kiss_modem +build_unflags = + ${e22_m33s.build_unflags} +build_flags = + ${env:Generic_E22_kiss_modem.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Generic E22 M33S"' diff --git a/variants/generic_e22_universal/target.h b/variants/generic_e22_universal/target.h index d42d56dc2..47d498b10 100644 --- a/variants/generic_e22_universal/target.h +++ b/variants/generic_e22_universal/target.h @@ -15,11 +15,19 @@ class UniversalE22Board : public ESP32Board { prepareUniversalLoRaRadio(); } const char* getManufacturerName() const override { +#if defined(MESH_E22_M33S) + switch (universalLoRaRadioFamily()) { + case mesh::LoRaRadioFamily::SX126x: return "Generic E22 900M33S"; + case mesh::LoRaRadioFamily::SX1268: return "Generic E22 400M33S"; + default: return "Generic E22 M33S (radio undetected)"; + } +#else switch (universalLoRaRadioFamily()) { case mesh::LoRaRadioFamily::SX126x: return "Generic E22 SX1262"; case mesh::LoRaRadioFamily::SX1268: return "Generic E22 SX1268"; default: return "Generic E22 (radio undetected)"; } +#endif } }; diff --git a/variants/ikoka_handheld_nrf/IkokaNrf52Board.h b/variants/ikoka_handheld_nrf/IkokaNrf52Board.h index a97e98b58..a35b67bc5 100644 --- a/variants/ikoka_handheld_nrf/IkokaNrf52Board.h +++ b/variants/ikoka_handheld_nrf/IkokaNrf52Board.h @@ -44,7 +44,11 @@ public: } const char* getManufacturerName() const override { +#ifdef MANUFACTURER_STRING + return MANUFACTURER_STRING; +#else return "Ikoka Handheld E22 30dBm (Xiao_nrf52)"; +#endif } }; diff --git a/variants/ikoka_handheld_nrf/platformio.ini b/variants/ikoka_handheld_nrf/platformio.ini index 7d5ac03e6..833bc345f 100644 --- a/variants/ikoka_handheld_nrf/platformio.ini +++ b/variants/ikoka_handheld_nrf/platformio.ini @@ -137,3 +137,103 @@ build_flags = ${ikoka_handheld_nrf.build_flags} -D LORA_TX_POWER=20 build_src_filter = ${ikoka_handheld_nrf.build_src_filter} +<../examples/kiss_modem/> + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ikoka_handheld_nrf_e22_33dbm_096_companion_radio_ble] +extends = env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-900M33S"' + +[env:ikoka_handheld_nrf_e22_33dbm_096_companion_radio_usb] +extends = env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-900M33S"' + +[env:ikoka_handheld_nrf_e22_33dbm_repeater] +extends = env:ikoka_handheld_nrf_e22_30dbm_repeater +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ikoka_handheld Repeater"' +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_repeater.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-900M33S"' + -D ADVERT_NAME='"Ikoka Handheld E22-900M33S Repeater"' + +[env:ikoka_handheld_nrf_e22_33dbm_room_server_lora_ota] +extends = env:ikoka_handheld_nrf_e22_30dbm_room_server_lora_ota +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ikoka_handheld Room"' +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_room_server_lora_ota.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-900M33S"' + -D ADVERT_NAME='"Ikoka Handheld E22-900M33S Room"' + +[env:ikoka_handheld_nrf_e22_33dbm_kiss_modem] +extends = env:ikoka_handheld_nrf_kiss_modem +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_kiss_modem.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-900M33S"' + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ikoka_handheld_nrf_e22_400m33s_096_companion_radio_ble] +extends = env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-400M33S"' + +[env:ikoka_handheld_nrf_e22_400m33s_096_companion_radio_usb] +extends = env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_096_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-400M33S"' + +[env:ikoka_handheld_nrf_e22_400m33s_repeater] +extends = env:ikoka_handheld_nrf_e22_30dbm_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ikoka_handheld Repeater"' +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-400M33S"' + -D ADVERT_NAME='"Ikoka Handheld E22-400M33S Repeater"' + +[env:ikoka_handheld_nrf_e22_400m33s_room_server_lora_ota] +extends = env:ikoka_handheld_nrf_e22_30dbm_room_server_lora_ota +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ikoka_handheld Room"' +build_flags = + ${env:ikoka_handheld_nrf_e22_30dbm_room_server_lora_ota.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-400M33S"' + -D ADVERT_NAME='"Ikoka Handheld E22-400M33S Room"' + +[env:ikoka_handheld_nrf_e22_400m33s_kiss_modem] +extends = env:ikoka_handheld_nrf_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ikoka_handheld_nrf_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Handheld E22-400M33S"' diff --git a/variants/ikoka_handheld_nrf/target.h b/variants/ikoka_handheld_nrf/target.h index 18f7c9c5e..29c9adc7b 100644 --- a/variants/ikoka_handheld_nrf/target.h +++ b/variants/ikoka_handheld_nrf/target.h @@ -4,7 +4,11 @@ #include #include #include +#if defined(USE_SX1268) +#include +#else #include +#endif #include #include #include diff --git a/variants/ikoka_nano_nrf/platformio.ini b/variants/ikoka_nano_nrf/platformio.ini index 638bfd8f9..3938aceab 100644 --- a/variants/ikoka_nano_nrf/platformio.ini +++ b/variants/ikoka_nano_nrf/platformio.ini @@ -333,3 +333,58 @@ build_src_filter = ${ikoka_nano_nrf_e22_30dbm.build_src_filter} extends = ikoka_nano_nrf_e22_33dbm build_src_filter = ${ikoka_nano_nrf_e22_33dbm.build_src_filter} +<../examples/kiss_modem/> + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ikoka_nano_nrf_400m33s_companion_radio_ble] +extends = env:ikoka_nano_nrf_33dbm_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_nano_nrf_33dbm_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Nano E22-400M33S"' + +[env:ikoka_nano_nrf_400m33s_companion_radio_usb] +extends = env:ikoka_nano_nrf_33dbm_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_nano_nrf_33dbm_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Nano E22-400M33S"' + +[env:ikoka_nano_nrf_400m33s_repeater] +extends = env:ikoka_nano_nrf_33dbm_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Ikoka Nano Repeater"' + -D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_nano_nrf_33dbm_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Nano E22-400M33S"' + -D ADVERT_NAME='"Ikoka Nano E22-400M33S Repeater"' + +[env:ikoka_nano_nrf_400m33s_room_server_lora_ota] +extends = env:ikoka_nano_nrf_33dbm_room_server_lora_ota +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Ikoka Nano Room"' + -D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_nano_nrf_33dbm_room_server_lora_ota.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Nano E22-400M33S"' + -D ADVERT_NAME='"Ikoka Nano E22-400M33S Room"' + +[env:ikoka_nano_nrf_400m33s_kiss_modem] +extends = env:ikoka_nano_nrf_33dbm_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Nano-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_nano_nrf_33dbm_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Nano E22-400M33S"' diff --git a/variants/ikoka_nano_nrf/target.h b/variants/ikoka_nano_nrf/target.h index 30ee5cb69..85817c441 100644 --- a/variants/ikoka_nano_nrf/target.h +++ b/variants/ikoka_nano_nrf/target.h @@ -4,7 +4,11 @@ #include #include #include +#if defined(USE_SX1268) +#include +#else #include +#endif #include #include #include diff --git a/variants/ikoka_stick_nrf/platformio.ini b/variants/ikoka_stick_nrf/platformio.ini index 1766c13cc..fc410fb12 100644 --- a/variants/ikoka_stick_nrf/platformio.ini +++ b/variants/ikoka_stick_nrf/platformio.ini @@ -345,3 +345,58 @@ build_src_filter = ${ikoka_stick_nrf_e22_30dbm.build_src_filter} extends = ikoka_stick_nrf_e22_33dbm build_src_filter = ${ikoka_stick_nrf_e22_33dbm.build_src_filter} +<../examples/kiss_modem/> + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ikoka_stick_nrf_400m33s_companion_radio_ble] +extends = env:ikoka_stick_nrf_33dbm_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_stick_nrf_33dbm_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Stick E22-400M33S"' + +[env:ikoka_stick_nrf_400m33s_companion_radio_usb] +extends = env:ikoka_stick_nrf_33dbm_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_stick_nrf_33dbm_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Stick E22-400M33S"' + +[env:ikoka_stick_nrf_400m33s_repeater] +extends = env:ikoka_stick_nrf_33dbm_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Ikoka Stick Repeater"' + -D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_stick_nrf_33dbm_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Stick E22-400M33S"' + -D ADVERT_NAME='"Ikoka Stick E22-400M33S Repeater"' + +[env:ikoka_stick_nrf_400m33s_room_server_lora_ota] +extends = env:ikoka_stick_nrf_33dbm_room_server_lora_ota +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Ikoka Stick Room"' + -D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_stick_nrf_33dbm_room_server_lora_ota.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Stick E22-400M33S"' + -D ADVERT_NAME='"Ikoka Stick E22-400M33S Room"' + +[env:ikoka_stick_nrf_400m33s_kiss_modem] +extends = env:ikoka_stick_nrf_33dbm_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"Ikoka Stick-E22-33dBm (Xiao_nrf52)"' +build_flags = + ${env:ikoka_stick_nrf_33dbm_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"Ikoka Stick E22-400M33S"' diff --git a/variants/ikoka_stick_nrf/target.h b/variants/ikoka_stick_nrf/target.h index 46b05e8b2..24e869a81 100644 --- a/variants/ikoka_stick_nrf/target.h +++ b/variants/ikoka_stick_nrf/target.h @@ -4,7 +4,11 @@ #include #include #include +#if defined(USE_SX1268) +#include +#else #include +#endif #include #include #include diff --git a/variants/meshadventurer_universal/platformio.ini b/variants/meshadventurer_universal/platformio.ini index 7e4285ce3..9fa60ba2c 100644 --- a/variants/meshadventurer_universal/platformio.ini +++ b/variants/meshadventurer_universal/platformio.ini @@ -153,3 +153,73 @@ build_flags = build_src_filter = ${Meshadventurer_Auto.build_src_filter} +<../examples/kiss_modem/> + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:Meshadventurer_m33s_repeater] +extends = env:Meshadventurer_repeater +build_unflags = + ${e22_m33s.build_unflags} + -D ADVERT_NAME='"Meshadventurer Repeater"' +build_flags = + ${env:Meshadventurer_repeater.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + -D ADVERT_NAME='"Meshadventurer M33S Repeater"' + +[env:Meshadventurer_m33s_room_server] +extends = env:Meshadventurer_room_server +build_unflags = + ${e22_m33s.build_unflags} + -D ADVERT_NAME='"Meshadventurer Room"' +build_flags = + ${env:Meshadventurer_room_server.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + -D ADVERT_NAME='"Meshadventurer M33S Room"' + +[env:Meshadventurer_m33s_terminal_chat] +extends = env:Meshadventurer_terminal_chat +build_unflags = + ${e22_m33s.build_unflags} +build_flags = + ${env:Meshadventurer_terminal_chat.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + +[env:Meshadventurer_m33s_companion_radio_usb] +extends = env:Meshadventurer_companion_radio_usb +build_unflags = + ${e22_m33s.build_unflags} +build_flags = + ${env:Meshadventurer_companion_radio_usb.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + +[env:Meshadventurer_m33s_companion_radio_ble] +extends = env:Meshadventurer_companion_radio_ble +build_unflags = + ${e22_m33s.build_unflags} +build_flags = + ${env:Meshadventurer_companion_radio_ble.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + +[env:Meshadventurer_m33s_kiss_modem] +extends = env:Meshadventurer_kiss_modem +build_unflags = + ${e22_m33s.build_unflags} +build_flags = + ${env:Meshadventurer_kiss_modem.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + +[env:Meshadventurer_m33s_repeater_bridge_espnow] +extends = env:Meshadventurer_repeater_bridge_espnow +build_unflags = + ${e22_m33s.build_unflags} + -D ADVERT_NAME='"ESPNow Bridge"' +build_flags = + ${env:Meshadventurer_repeater_bridge_espnow.build_flags} + ${e22_m33s.build_flags} + -D MANUFACTURER_STRING='"Meshadventurer M33S"' + -D ADVERT_NAME='"Meshadventurer M33S Repeater"' diff --git a/variants/meshadventurer_universal/target.h b/variants/meshadventurer_universal/target.h index e029f4599..9f69b667e 100644 --- a/variants/meshadventurer_universal/target.h +++ b/variants/meshadventurer_universal/target.h @@ -44,11 +44,19 @@ class UniversalMeshadventurerBoard : public MeshadventurerBoard { prepareUniversalLoRaRadio(); } const char* getManufacturerName() const override { +#if defined(MESH_E22_M33S) + switch (universalLoRaRadioFamily()) { + case mesh::LoRaRadioFamily::SX126x: return "Meshadventurer 900M33S"; + case mesh::LoRaRadioFamily::SX1268: return "Meshadventurer 400M33S"; + default: return "Meshadventurer M33S (radio undetected)"; + } +#else switch (universalLoRaRadioFamily()) { case mesh::LoRaRadioFamily::SX126x: return "Meshadventurer SX1262"; case mesh::LoRaRadioFamily::SX1268: return "Meshadventurer SX1268"; default: return "Meshadventurer (radio undetected)"; } +#endif } }; diff --git a/variants/promicro/PromicroBoard.h b/variants/promicro/PromicroBoard.h index 73fb742a2..544a07195 100644 --- a/variants/promicro/PromicroBoard.h +++ b/variants/promicro/PromicroBoard.h @@ -48,6 +48,10 @@ public: } const char* getManufacturerName() const override { +#ifdef MANUFACTURER_STRING + return MANUFACTURER_STRING; +#else return "ProMicro DIY"; +#endif } }; diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index dfa22b5d4..0c3d119a9 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -189,3 +189,143 @@ lib_deps = extends = Promicro build_src_filter = ${Promicro.build_src_filter} +<../examples/kiss_modem/> + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ProMicro_m33s_repeater] +extends = env:ProMicro_repeater +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Repeater"' +build_flags = + ${env:ProMicro_repeater.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + -D ADVERT_NAME='"ProMicro E22-900M33S Repeater"' + +[env:ProMicro_m33s_room_server] +extends = env:ProMicro_room_server +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Room"' +build_flags = + ${env:ProMicro_room_server.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + -D ADVERT_NAME='"ProMicro E22-900M33S Room"' + +[env:ProMicro_m33s_terminal_chat] +extends = env:ProMicro_terminal_chat +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_terminal_chat.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + +[env:ProMicro_m33s_companion_radio_usb] +extends = env:ProMicro_companion_radio_usb +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_companion_radio_usb.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + +[env:ProMicro_m33s_companion_radio_ble] +extends = env:ProMicro_companion_radio_ble +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_companion_radio_ble.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + +[env:ProMicro_m33s_sensor] +extends = env:ProMicro_sensor +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Sensor"' +build_flags = + ${env:ProMicro_sensor.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + -D ADVERT_NAME='"ProMicro E22-900M33S Sensor"' + +[env:ProMicro_m33s_kiss_modem] +extends = env:ProMicro_kiss_modem +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_kiss_modem.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-900M33S"' + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:ProMicro_400m33s_repeater] +extends = env:ProMicro_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Repeater"' +build_flags = + ${env:ProMicro_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + -D ADVERT_NAME='"ProMicro E22-400M33S Repeater"' + +[env:ProMicro_400m33s_room_server] +extends = env:ProMicro_room_server +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Room"' +build_flags = + ${env:ProMicro_room_server.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + -D ADVERT_NAME='"ProMicro E22-400M33S Room"' + +[env:ProMicro_400m33s_terminal_chat] +extends = env:ProMicro_terminal_chat +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_terminal_chat.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + +[env:ProMicro_400m33s_companion_radio_usb] +extends = env:ProMicro_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + +[env:ProMicro_400m33s_companion_radio_ble] +extends = env:ProMicro_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + +[env:ProMicro_400m33s_sensor] +extends = env:ProMicro_sensor +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"ProMicro Sensor"' +build_flags = + ${env:ProMicro_sensor.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' + -D ADVERT_NAME='"ProMicro E22-400M33S Sensor"' + +[env:ProMicro_400m33s_kiss_modem] +extends = env:ProMicro_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:ProMicro_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"ProMicro E22-400M33S"' diff --git a/variants/promicro/target.h b/variants/promicro/target.h index e577ab4e9..bb80e04ad 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -4,7 +4,11 @@ #include #include #include +#if defined(USE_SX1268) +#include +#else #include +#endif #include #ifdef DISPLAY_CLASS #include diff --git a/variants/xiao_nrf52/platformio.ini b/variants/xiao_nrf52/platformio.ini index 8b4747e7c..3cf8277be 100644 --- a/variants/xiao_nrf52/platformio.ini +++ b/variants/xiao_nrf52/platformio.ini @@ -385,3 +385,165 @@ build_flags = -D LORA_TX_POWER=8 -D MAX_LORA_TX_POWER=8 -D MANUFACTURER_STRING='"SolarXiao 33S"' + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:Xiao_nrf52_m33s_companion_radio_ble] +extends = env:Xiao_nrf52_companion_radio_ble +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_companion_radio_ble.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-900M33S"' + +[env:Xiao_nrf52_m33s_companion_radio_usb] +extends = env:Xiao_nrf52_companion_radio_usb +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_companion_radio_usb.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-900M33S"' + +[env:Xiao_nrf52_m33s_repeater] +extends = env:Xiao_nrf52_repeater +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Xiao_nrf52 Repeater"' +build_flags = + ${env:Xiao_nrf52_repeater.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-900M33S"' + -D ADVERT_NAME='"XIAO E22-900M33S Repeater"' + +[env:Xiao_nrf52_m33s_room_server_lora_ota] +extends = env:Xiao_nrf52_room_server_lora_ota +build_unflags = + ${e22_m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Xiao_nrf52 Room"' +build_flags = + ${env:Xiao_nrf52_room_server_lora_ota.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-900M33S"' + -D ADVERT_NAME='"XIAO E22-900M33S Room"' + +[env:Xiao_nrf52_m33s_kiss_modem] +extends = env:Xiao_nrf52_kiss_modem +build_unflags = + ${e22_m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_kiss_modem.build_flags} + ${e22_m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-900M33S"' + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:Xiao_nrf52_400m33s_companion_radio_ble] +extends = env:Xiao_nrf52_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-400M33S"' + +[env:Xiao_nrf52_400m33s_companion_radio_usb] +extends = env:Xiao_nrf52_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-400M33S"' + +[env:Xiao_nrf52_400m33s_repeater] +extends = env:Xiao_nrf52_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Xiao_nrf52 Repeater"' +build_flags = + ${env:Xiao_nrf52_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-400M33S"' + -D ADVERT_NAME='"XIAO E22-400M33S Repeater"' + +[env:Xiao_nrf52_400m33s_room_server_lora_ota] +extends = env:Xiao_nrf52_room_server_lora_ota +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D ADVERT_NAME='"Xiao_nrf52 Room"' +build_flags = + ${env:Xiao_nrf52_room_server_lora_ota.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-400M33S"' + -D ADVERT_NAME='"XIAO E22-400M33S Room"' + +[env:Xiao_nrf52_400m33s_kiss_modem] +extends = env:Xiao_nrf52_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} +build_flags = + ${env:Xiao_nrf52_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"XIAO E22-400M33S"' + +; M33S external-PA profiles: 8 dBm maximum chip drive in every role. +[env:solarxiao_400M33S_companion_radio_ble] +extends = env:solarxiao_33S_companion_radio_ble +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"SolarXiao 30S"' + -D MANUFACTURER_STRING='"SolarXiao 33S"' +build_flags = + ${env:solarxiao_33S_companion_radio_ble.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"SolarXiao 400M33S"' + +[env:solarxiao_400M33S_companion_radio_usb] +extends = env:solarxiao_33S_companion_radio_usb +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"SolarXiao 30S"' + -D MANUFACTURER_STRING='"SolarXiao 33S"' +build_flags = + ${env:solarxiao_33S_companion_radio_usb.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"SolarXiao 400M33S"' + +[env:solarxiao_400M33S_repeater] +extends = env:solarxiao_33S_repeater +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"SolarXiao 30S"' + -D ADVERT_NAME='"SolarXiao 30S Repeater"' + -D ADVERT_NAME='"SolarXiao 33S Repeater"' + -D MANUFACTURER_STRING='"SolarXiao 33S"' +build_flags = + ${env:solarxiao_33S_repeater.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"SolarXiao 400M33S"' + -D ADVERT_NAME='"SolarXiao 400M33S Repeater"' + +[env:solarxiao_400M33S_room_server_lora_ota] +extends = env:solarxiao_33S_room_server_lora_ota +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"SolarXiao 30S"' + -D ADVERT_NAME='"SolarXiao 30S Room"' + -D ADVERT_NAME='"SolarXiao 33S Room"' + -D MANUFACTURER_STRING='"SolarXiao 33S"' +build_flags = + ${env:solarxiao_33S_room_server_lora_ota.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"SolarXiao 400M33S"' + -D ADVERT_NAME='"SolarXiao 400M33S Room"' + +[env:solarxiao_400M33S_kiss_modem] +extends = env:solarxiao_33S_kiss_modem +build_unflags = + ${e22_400m33s_nrf52.build_unflags} + -D MANUFACTURER_STRING='"SolarXiao 30S"' + -D MANUFACTURER_STRING='"SolarXiao 33S"' +build_flags = + ${env:solarxiao_33S_kiss_modem.build_flags} + ${e22_400m33s_nrf52.build_flags} + -D MANUFACTURER_STRING='"SolarXiao 400M33S"' diff --git a/variants/xiao_nrf52/target.h b/variants/xiao_nrf52/target.h index ae5770494..b6b50803d 100644 --- a/variants/xiao_nrf52/target.h +++ b/variants/xiao_nrf52/target.h @@ -4,7 +4,11 @@ #include #include #include +#if defined(USE_SX1268) +#include +#else #include +#endif #include #include