From 51019ed9779d1fed67c9fcf5983580cb89c5e42b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 15:25:17 +0200 Subject: [PATCH 01/10] patches/frr: fix mgmtd crash on 32-bit Arm mgmtd hands its message handlers pointers into the receive stream, where messages are packed back to back, so some start unaligned. On 32-bit Arm GCC uses VFP stores for their 64-bit members, which the kernel cannot fix up, and mgmtd dies with SIGBUS as soon as a notification is sent. Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 5 ++ ...msg-hand-handlers-an-aligned-message.patch | 65 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 patches/frr/10.5.5/0005-lib-mgmt_msg-hand-handlers-an-aligned-message.patch diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index f176a5b61..901fce15f 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -14,6 +14,11 @@ All notable changes to the project are documented in this file. - Support building without Frr, which also drops bash. The minimal defconfigs are now built this way, with static routing only, issue #1670 +### Fixes + +- Fix FRR mgmtd crash loop on 32-bit Arm, caused by unaligned access to + messages received from other daemons + [v26.09.0][] - 2026-09-30 ------------------------- diff --git a/patches/frr/10.5.5/0005-lib-mgmt_msg-hand-handlers-an-aligned-message.patch b/patches/frr/10.5.5/0005-lib-mgmt_msg-hand-handlers-an-aligned-message.patch new file mode 100644 index 000000000..8ce645cc5 --- /dev/null +++ b/patches/frr/10.5.5/0005-lib-mgmt_msg-hand-handlers-an-aligned-message.patch @@ -0,0 +1,65 @@ +From 6088ca29476f8776426348ab413ddc4eccc6760b Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 15:15:28 +0200 +Subject: [PATCH] lib: mgmt_msg: hand handlers an aligned message +Organization: Wires + +mgmt_msg_procbufs() passes handlers a pointer into the receive stream, +where messages are packed back to back. A message following one whose +length is not a multiple of 8 starts unaligned, and the native message +structs have 64-bit members. On 32-bit Arm GCC may use a VFP store for +those, e.g., `msg->refer_id = 0` in mgmt_fe_adapter_send_notify(), which +the kernel cannot fix up, so mgmtd dies with SIGBUS: + + Alignment trap: not handling instruction edc30b02 at [<00441bfc>] + Unhandled fault: alignment exception (0x801) at 0x023c3f8e + +Copy unaligned messages to an aligned buffer before calling the handler. + +--- + lib/mgmt_msg.c | 27 +++++++++++++++++++++++---- + 1 file changed, 23 insertions(+), 4 deletions(-) + +diff --git a/lib/mgmt_msg.c b/lib/mgmt_msg.c +index 8f22b31231..c341872dc4 100644 +--- a/lib/mgmt_msg.c ++++ b/lib/mgmt_msg.c +@@ -180,15 +180,34 @@ bool mgmt_msg_procbufs(struct mgmt_msg_state *ms, + + for (; left > sizeof(struct mgmt_msg_hdr); + left -= mhdr->len, data += mhdr->len) { ++ uint8_t *msg, *copy = NULL; ++ size_t msglen; ++ + mhdr = (struct mgmt_msg_hdr *)data; + + assert(MGMT_MSG_IS_MARKER(mhdr->marker)); ++ assert(mhdr->len >= sizeof(struct mgmt_msg_hdr)); + assert(left >= mhdr->len); + +- handle_msg(MGMT_MSG_MARKER_VERSION(mhdr->marker), +- (uint8_t *)(mhdr + 1), +- mhdr->len - sizeof(struct mgmt_msg_hdr), +- user); ++ msg = (uint8_t *)(mhdr + 1); ++ msglen = mhdr->len - sizeof(struct mgmt_msg_hdr); ++ ++ /* ++ * Messages are packed back to back, so one following a ++ * message whose length is not a multiple of 8 starts ++ * unaligned. Handlers cast it to structs with 64-bit ++ * members, which traps on 32-bit Arm when the compiler ++ * uses VFP/NEON stores, so give them an aligned copy. ++ */ ++ if ((uintptr_t)msg % sizeof(uint64_t)) { ++ copy = XMALLOC(MTYPE_TMP, msglen); ++ memcpy(copy, msg, msglen); ++ msg = copy; ++ } ++ ++ handle_msg(MGMT_MSG_MARKER_VERSION(mhdr->marker), msg, ++ msglen, user); ++ XFREE(MTYPE_TMP, copy); + ms->nrxm++; + nproc++; + } From 5ca76357c51a2abc95df19822065f4c1c9f4701b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 15:25:02 +0200 Subject: [PATCH 02/10] board/common: let boards enable SDHCI in U-Boot Every board with an SDHCI controller already enables MMC_SDHCI in its own U-Boot defconfig, so the common fragment only forced the driver on boards with other MMC controllers. On sunxi this breaks the SPL build, which has no DM_MMC and cannot compile sdhci.c. Signed-off-by: Joachim Wiberg --- board/common/uboot/extras.config | 1 - 1 file changed, 1 deletion(-) diff --git a/board/common/uboot/extras.config b/board/common/uboot/extras.config index 0037106a7..d88e46ed6 100644 --- a/board/common/uboot/extras.config +++ b/board/common/uboot/extras.config @@ -19,7 +19,6 @@ CONFIG_CMD_SETEXPR_FMT=y CONFIG_MMC=y -CONFIG_MMC_SDHCI=y CONFIG_CMD_MMC=y CONFIG_FS_SQUASHFS=y From 6e5e8747262d2045b816f0a85395745df85ff5a1 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 15:29:08 +0200 Subject: [PATCH 03/10] board/arm: add support for Banana Pi BPI-M1 The first Banana Pi, an Allwinner A20 board. Mainline U-Boot builds the SPL and U-Boot together from its Bananapi defconfig, and the A20 boot ROM loads them from 8 KiB into the SD card, so the GPT partition entries are moved to 1 MiB. The sunxi board code resets fdtfile after the environment is imported, dropping the vendor directory on 32-bit Arm, so ixvariant sets it again at preboot. POWER_SUPPLY is enabled explicitly, the sun4i USB PHY depends on it and the shared kernel config does not set it. GPIOLIB is added to the shared arm kernel config. Without it LEDS_GPIO and LEDS_TRIGGER_GPIO are dropped before any board fixup has selected a GPIO driver, so GPIO LEDs were missing on all 32-bit Arm boards. The board is enabled in the arm defconfigs like the other 32-bit boards, disable BR2_PACKAGE_BANANAPI_BPI_M1 to leave it out of a build. Signed-off-by: Joachim Wiberg --- .github/workflows/build-boot.yml | 1 + .github/workflows/build-image.yml | 6 + board/arm/Config.in | 1 + board/arm/README.md | 1 + board/arm/bananapi-bpi-m1/Config.in | 9 + board/arm/bananapi-bpi-m1/LICENSE | 13 + board/arm/bananapi-bpi-m1/README.md | 114 +++++++ .../arm/bananapi-bpi-m1/bananapi-bpi-m1.hash | 2 + board/arm/bananapi-bpi-m1/bananapi-bpi-m1.mk | 84 +++++ board/arm/bananapi-bpi-m1/dts/Makefile | 1 + .../bananapi-bpi-m1/dts/allwinner/infix.dtsi | 13 + .../dts/allwinner/sun7i-a20-bananapi.dts | 21 ++ board/arm/bananapi-bpi-m1/genimage.cfg.in | 78 +++++ .../lemaker,bananapi/etc/factory-config.cfg | 311 ++++++++++++++++++ .../finit.d/enabled/input-event-daemon.conf | 1 + .../product/lemaker,bananapi/etc/iitod.json | 124 +++++++ .../etc/input-event-daemon.conf | 5 + .../etc/udev/rules.d/70-power-key.rules | 1 + board/arm/bananapi-bpi-m1/uart-pins.png | Bin 0 -> 217766 bytes .../arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi | 25 ++ board/arm/bananapi-bpi-m1/uboot/extras.config | 6 + board/arm/linux_defconfig | 1 + configs/arm_defconfig | 1 + configs/arm_minimal_defconfig | 1 + configs/bpi_m1_boot_defconfig | 38 +++ doc/ChangeLog.md | 2 + utils/mkimage.sh | 3 + 27 files changed, 863 insertions(+) create mode 100644 board/arm/bananapi-bpi-m1/Config.in create mode 100644 board/arm/bananapi-bpi-m1/LICENSE create mode 100644 board/arm/bananapi-bpi-m1/README.md create mode 100644 board/arm/bananapi-bpi-m1/bananapi-bpi-m1.hash create mode 100644 board/arm/bananapi-bpi-m1/bananapi-bpi-m1.mk create mode 100644 board/arm/bananapi-bpi-m1/dts/Makefile create mode 100644 board/arm/bananapi-bpi-m1/dts/allwinner/infix.dtsi create mode 100644 board/arm/bananapi-bpi-m1/dts/allwinner/sun7i-a20-bananapi.dts create mode 100644 board/arm/bananapi-bpi-m1/genimage.cfg.in create mode 100644 board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/factory-config.cfg create mode 120000 board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/finit.d/enabled/input-event-daemon.conf create mode 100644 board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json create mode 100644 board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/input-event-daemon.conf create mode 100644 board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/udev/rules.d/70-power-key.rules create mode 100644 board/arm/bananapi-bpi-m1/uart-pins.png create mode 100644 board/arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi create mode 100644 board/arm/bananapi-bpi-m1/uboot/extras.config create mode 100644 configs/bpi_m1_boot_defconfig diff --git a/.github/workflows/build-boot.yml b/.github/workflows/build-boot.yml index 26b62920c..6c3a058c2 100644 --- a/.github/workflows/build-boot.yml +++ b/.github/workflows/build-boot.yml @@ -17,6 +17,7 @@ jobs: matrix: defconfig: - aarch64_qemu_boot + - bpi_m1_boot - bpi_r3_sd_boot - bpi_r3_emmc_boot - bpi_r4_sd_boot diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index d13fe1415..8c0625200 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -10,6 +10,7 @@ on: options: - raspberrypi-rpi2 - raspberrypi-rpi64 + - bananapi-bpi-m1 - bananapi-bpi-r3 - bananapi-bpi-r4 - bananapi-bpi-r64 @@ -69,6 +70,11 @@ jobs: targets="sdcard" bootloader_sdcard=rpi64-boot ;; + bananapi-bpi-m1) + arch=arm + targets="sdcard" + bootloader_sdcard=bpi-m1-boot + ;; bananapi-bpi-r3) arch=aarch64 targets="sdcard emmc" diff --git a/board/arm/Config.in b/board/arm/Config.in index 7d30b9695..d465cee1f 100644 --- a/board/arm/Config.in +++ b/board/arm/Config.in @@ -1,5 +1,6 @@ if BR2_arm +source "$BR2_EXTERNAL_INFIX_PATH/board/arm/bananapi-bpi-m1/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/board/arm/microchip-sama7g54-ek/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/board/arm/raspberrypi-rpi2/Config.in" diff --git a/board/arm/README.md b/board/arm/README.md index 6058d7ee3..0768b6bef 100644 --- a/board/arm/README.md +++ b/board/arm/README.md @@ -4,5 +4,6 @@ Arm 32-bit Board Specific Documentation ---------------------------- +- [Banana Pi BPI-M1 (32-bit)](bananapi-bpi-m1/) - [Microchip SAMA7G54-EK (32-bit)](microchip-sama7g54-ek/) - [Raspberry Pi 2 Model B (32-bit)](raspberrypi-rpi2/) diff --git a/board/arm/bananapi-bpi-m1/Config.in b/board/arm/bananapi-bpi-m1/Config.in new file mode 100644 index 000000000..e9545ba29 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_BANANAPI_BPI_M1 + bool "Banana Pi BPI-M1" + depends on BR2_arm + select SDCARD_AUX + select BR2_PACKAGE_INPUT_EVENT_DAEMON + help + Support for the Banana Pi BPI-M1 single-board computer, the + first Banana Pi, with an Allwinner A20 dual-core Cortex-A7, + 1 GiB DDR3, Gigabit Ethernet, SATA and an SD card slot. diff --git a/board/arm/bananapi-bpi-m1/LICENSE b/board/arm/bananapi-bpi-m1/LICENSE new file mode 100644 index 000000000..8cdb30a3a --- /dev/null +++ b/board/arm/bananapi-bpi-m1/LICENSE @@ -0,0 +1,13 @@ +Copyright (c) 2026 The KernelKit Authors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/board/arm/bananapi-bpi-m1/README.md b/board/arm/bananapi-bpi-m1/README.md new file mode 100644 index 000000000..572354827 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/README.md @@ -0,0 +1,114 @@ +Banana Pi BPI-M1 +================ + +The [BPI-M1][1] is the first Banana Pi board, powered by the Allwinner +A20 dual-core Cortex-A7 @ 1 GHz with 1 GB DDR3 RAM. + +The board features: + +- Gigabit Ethernet +- SD card slot (full size) +- SATA 2.0 port +- 2x USB 2.0 host, 1x micro USB OTG +- HDMI, composite video and audio out +- 26-pin GPIO header + +> [!NOTE] +> The BPI-M1+ is a different board with its own device tree and is not +> covered by this BSP. + +How to Build +------------ + +There are no pre-built images for ARM 32-bit, so build both Infix and +the bootloader from source. + +1. Build the bootloader + + make O=x-boot-bpi-m1 bpi_m1_boot_defconfig + make O=x-boot-bpi-m1 + +2. Build Infix + + make O=x-arm arm_defconfig + make O=x-arm + +3. Create the SD card image + + ./utils/mkimage.sh -b x-boot-bpi-m1 -r x-arm bananapi-bpi-m1 + +To test only the bootloader, e.g., to verify the console, create a +boot-only image after step 1: + + ./utils/mkimage.sh -B -b x-boot-bpi-m1 bananapi-bpi-m1 + +Flashing to SD Card +------------------- + +[Flash the image][0] to an SD card (at least 2 GB): + +```bash +sudo bmaptool copy x-boot-bpi-m1/images/infix-bpi-m1-sdcard.img /dev/sdX +``` + +> [!WARNING] +> Ensure `/dev/sdX` is the correct device for your SD card and not used +> by the host system! Use `lsblk` to verify. + +Booting the Board +----------------- + +1. Insert the flashed SD card +2. Connect an Ethernet cable +3. Power up the board, 5V DC via the micro USB port +4. Find the assigned IP and SSH in, default login: `admin` / `admin` + +The board has no user button, so U-Boot always runs in developer mode. +Use `bootmenu` on the console for factory reset. + +LEDs and Buttons +---------------- + +| **Stage** | **USR** (green) | +|----------------|-----------------| +| U-Boot | on | +| System loading | 1 Hz | +| System up | on | +| Locate | 1 Hz | +| Fail safe | 5 Hz | +| Panic | 5 Hz | + +The Ethernet port LEDs show link and activity. + +The power button powers on the board, and a short press when running +powers it off. The reset button is a hardware reset. + +Unsupported Features +-------------------- + +The following hardware has no driver enabled in Infix: + +- Analog audio and composite video out +- HDMI audio, not supported by mainline Linux on the A20 +- IR receiver +- Micro USB OTG port +- Mali-400 GPU and video decoder + +Console Port +------------ + +UART pins + +The debug console is UART0, TX and RX on header J11 and GND on the +neighboring header J12: + +- Baud rate: 115200 +- Data bits: 8 +- Parity: None +- Stop bits: 1 + +> [!WARNING] +> Use only 3.3V serial adapters. + +[0]: https://www.kernelkit.org/posts/flashing-sdcard/ +[1]: https://docs.banana-pi.org/en/BPI-M1/BananaPi_BPI-M1 diff --git a/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.hash b/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.hash new file mode 100644 index 000000000..2b1e74432 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.hash @@ -0,0 +1,2 @@ +# Locally calculated +sha256 d48246c717b505cc11df95171f2fd548b389e1a463f1af4c68d0b69fe0d1009b LICENSE diff --git a/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.mk b/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.mk new file mode 100644 index 000000000..7259b6fa7 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/bananapi-bpi-m1.mk @@ -0,0 +1,84 @@ +# Banana Pi BPI-M1 kernel configuration fixups +define BANANAPI_BPI_M1_LINUX_CONFIG_FIXUPS + # Allwinner A20 SoC + $(call KCONFIG_ENABLE_OPT,CONFIG_ARCH_SUNXI) + $(call KCONFIG_ENABLE_OPT,CONFIG_MACH_SUN7I) + $(call KCONFIG_ENABLE_OPT,CONFIG_SUNXI_SRAM) + + # Serial console + $(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250) + $(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_CONSOLE) + $(call KCONFIG_ENABLE_OPT,CONFIG_SERIAL_8250_DW) + + # Network: GMAC with Realtek PHY + $(call KCONFIG_ENABLE_OPT,CONFIG_NET_VENDOR_STMICRO) + $(call KCONFIG_ENABLE_OPT,CONFIG_STMMAC_ETH) + $(call KCONFIG_ENABLE_OPT,CONFIG_STMMAC_PLATFORM) + $(call KCONFIG_ENABLE_OPT,CONFIG_DWMAC_SUNXI) + $(call KCONFIG_ENABLE_OPT,CONFIG_REALTEK_PHY) + + # MMC/SD and SATA + $(call KCONFIG_ENABLE_OPT,CONFIG_MMC_SUNXI) + $(call KCONFIG_ENABLE_OPT,CONFIG_AHCI_SUNXI) + + # AXP209 PMIC, supplies the CPU and USB VBUS regulators + $(call KCONFIG_ENABLE_OPT,CONFIG_I2C) + $(call KCONFIG_ENABLE_OPT,CONFIG_I2C_MV64XXX) + $(call KCONFIG_ENABLE_OPT,CONFIG_MFD_AXP20X_I2C) + $(call KCONFIG_ENABLE_OPT,CONFIG_REGULATOR_AXP20X) + + # USB Host, the PHY depends on POWER_SUPPLY, with keyboard and mouse + $(call KCONFIG_ENABLE_OPT,CONFIG_POWER_SUPPLY) + $(call KCONFIG_ENABLE_OPT,CONFIG_PHY_SUN4I_USB) + $(call KCONFIG_SET_OPT,CONFIG_USB_EHCI_HCD,m) + $(call KCONFIG_SET_OPT,CONFIG_USB_EHCI_HCD_PLATFORM,m) + $(call KCONFIG_SET_OPT,CONFIG_USB_OHCI_HCD,m) + $(call KCONFIG_SET_OPT,CONFIG_USB_OHCI_HCD_PLATFORM,m) + $(call KCONFIG_ENABLE_OPT,CONFIG_USB_HID) + $(call KCONFIG_SET_OPT,CONFIG_HID_GENERIC,m) + + # Power button on the AXP209, KEY_POWER for input-event-daemon + $(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_MISC) + $(call KCONFIG_ENABLE_OPT,CONFIG_INPUT_AXP20X_PEK) + + # SPI header + $(call KCONFIG_ENABLE_OPT,CONFIG_SPI_SUN4I) + + # Temperature: SoC sensor in the touchscreen controller, used by + # the cpu-thermal zone to throttle, and AXP209 die temp over IIO + $(call KCONFIG_ENABLE_OPT,CONFIG_TOUCHSCREEN_SUN4I) + $(call KCONFIG_ENABLE_OPT,CONFIG_CPU_THERMAL) + $(call KCONFIG_ENABLE_OPT,CONFIG_IIO) + $(call KCONFIG_ENABLE_OPT,CONFIG_AXP20X_ADC) + $(call KCONFIG_ENABLE_OPT,CONFIG_SENSORS_IIO_HWMON) + + # LEDs: green user LED on GPIO, RTL8211E PHY LEDs offloaded to + # the PHY with the netdev trigger + $(call KCONFIG_ENABLE_OPT,CONFIG_LEDS_GPIO) + $(call KCONFIG_ENABLE_OPT,CONFIG_LEDS_TRIGGER_NETDEV) + + # HDMI output with framebuffer console, no HDMI audio in mainline + $(call KCONFIG_ENABLE_OPT,CONFIG_DRM) + $(call KCONFIG_SET_OPT,CONFIG_DRM_SUN4I,m) + $(call KCONFIG_SET_OPT,CONFIG_DRM_SUN4I_HDMI,m) + $(call KCONFIG_ENABLE_OPT,CONFIG_DRM_SUN4I_HDMI_CEC) + $(call KCONFIG_SET_OPT,CONFIG_DRM_SUN4I_BACKEND,m) + $(call KCONFIG_ENABLE_OPT,CONFIG_DRM_FBDEV_EMULATION) + $(call KCONFIG_ENABLE_OPT,CONFIG_FB) + $(call KCONFIG_ENABLE_OPT,CONFIG_FRAMEBUFFER_CONSOLE) + + # Watchdog, RTC and SID (unique chip ID) + $(call KCONFIG_ENABLE_OPT,CONFIG_WATCHDOG) + $(call KCONFIG_ENABLE_OPT,CONFIG_SUNXI_WATCHDOG) + $(call KCONFIG_ENABLE_OPT,CONFIG_RTC_CLASS) + $(call KCONFIG_ENABLE_OPT,CONFIG_RTC_DRV_SUNXI) + $(call KCONFIG_ENABLE_OPT,CONFIG_NVMEM) + $(call KCONFIG_ENABLE_OPT,CONFIG_NVMEM_SUNXI_SID) + + # Crypto hardware acceleration + $(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_ALLWINNER) + $(call KCONFIG_ENABLE_OPT,CONFIG_CRYPTO_DEV_SUN4I_SS) +endef + +$(eval $(ix-board)) +$(eval $(generic-package)) diff --git a/board/arm/bananapi-bpi-m1/dts/Makefile b/board/arm/bananapi-bpi-m1/dts/Makefile new file mode 100644 index 000000000..eeac3f151 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/dts/Makefile @@ -0,0 +1 @@ +dtb-y += allwinner/sun7i-a20-bananapi.dtb diff --git a/board/arm/bananapi-bpi-m1/dts/allwinner/infix.dtsi b/board/arm/bananapi-bpi-m1/dts/allwinner/infix.dtsi new file mode 100644 index 000000000..16cfafc86 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/dts/allwinner/infix.dtsi @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Common Infix OS defaults + */ + +/ { + chosen { + infix { + /* Default admin user password: 'admin' */ + factory-password-hash = "$5$mI/zpOAqZYKLC2WU$i7iPzZiIjOjrBF3NyftS9CCq8dfYwHwrmUK097Jca9A"; + }; + }; +}; diff --git a/board/arm/bananapi-bpi-m1/dts/allwinner/sun7i-a20-bananapi.dts b/board/arm/bananapi-bpi-m1/dts/allwinner/sun7i-a20-bananapi.dts new file mode 100644 index 000000000..662940942 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/dts/allwinner/sun7i-a20-bananapi.dts @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Infix OS device tree for Banana Pi BPI-M1 + */ + +#include +#include "infix.dtsi" + +/* Only used by arch/arm topology to compare cores, silences boot errors */ +&cpu0 { + clock-frequency = <960000000>; +}; + +&cpu1 { + clock-frequency = <960000000>; +}; + +/* Keep the LED lit by U-Boot until iitod takes over */ +&{/leds/led} { + default-state = "keep"; +}; diff --git a/board/arm/bananapi-bpi-m1/genimage.cfg.in b/board/arm/bananapi-bpi-m1/genimage.cfg.in new file mode 100644 index 000000000..b3a21092f --- /dev/null +++ b/board/arm/bananapi-bpi-m1/genimage.cfg.in @@ -0,0 +1,78 @@ +# Disk image for Banana Pi BPI-M1 (Allwinner A20) + +image cfg.ext4 { + empty = true + temporary = true + size = 16M + + ext4 { + label = "cfg" + use-mke2fs = true + features = "uninit_bg" + extraargs = "-m 0 -i 4096" + } +} + +# The /var partition will be expanded automatically at first boot +# to use the full size of the SD-card or eMMC media. +image var.ext4 { + empty = true + temporary = true + size = 128M + + ext4 { + label = "var" + use-mke2fs = true + features = "uninit_bg" + extraargs = "-m 0 -i 4096" + } +} + +image #IX_ID##VERSION#-bpi-m1-#TARGET#.img { + hdimage { + partition-table-type = "gpt" + # The A20 boot ROM loads the SPL from 8 KiB, move the + # GPT partition entries out of its way + gpt-location = 1M + } + + partition u-boot { + in-partition-table = "no" + image = "u-boot-sunxi-with-spl.bin" + offset = 8K + size = 1016K + } + + partition aux { + partition-uuid = D4EF35A0-0652-45A1-B3DE-D63339C82035 + image = "aux.ext4" + offset = 2M + } + + partition primary { + partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4 + bootable = true + size = 250M + image = "rootfs.squashfs" + } + + partition secondary { + partition-type-uuid = 0FC63DAF-8483-4772-8E79-3D69D8477DE4 + bootable = true + size = 250M + image = "rootfs.squashfs" + } + + partition cfg { + partition-uuid = 7aa497f0-73b5-47e5-b2ab-8752d8a48105 + image = "cfg.ext4" + } + + partition var { + partition-uuid = 8046A06A-E45A-4A14-A6AD-6684704A393F + image = "var.ext4" + } +} + +# Silence genimage warnings +config {} diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/factory-config.cfg b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/factory-config.cfg new file mode 100644 index 000000000..e39e37c1d --- /dev/null +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/factory-config.cfg @@ -0,0 +1,311 @@ +{ + "ieee802-dot1ab-lldp:lldp": { + "infix-lldp:enabled": true + }, + "ietf-hardware:hardware": { + "component": [ + { + "name": "USB", + "class": "infix-hardware:usb", + "state": { + "admin-state": "unlocked" + } + } + ] + }, + "ietf-interfaces:interfaces": { + "interface": [ + { + "name": "lo", + "type": "infix-if-type:loopback", + "ietf-ip:ipv4": { + "address": [ + { + "ip": "127.0.0.1", + "prefix-length": 8 + } + ] + }, + "ietf-ip:ipv6": { + "address": [ + { + "ip": "::1", + "prefix-length": 128 + } + ] + } + }, + { + "name": "eth0", + "type": "infix-if-type:ethernet", + "ietf-ip:ipv4": { + "infix-dhcp-client:dhcp": { + "option": [ + { + "id": "netmask" + }, + { + "id": "broadcast" + }, + { + "id": "router" + }, + { + "id": "domain" + }, + { + "id": "hostname", + "value": "auto" + }, + { + "id": "dns-server" + }, + { + "id": "ntp-server" + }, + { + "id": "vendor-class", + "value": "Banana Pi BPI-M1" + } + ] + } + }, + "ietf-ip:ipv6": { + "infix-dhcpv6-client:dhcp": { + "option": [ + { + "id": "ntp-server" + }, + { + "id": "client-fqdn" + }, + { + "id": "domain-search" + }, + { + "id": "dns-server" + } + ] + } + } + } + ] + }, + "ietf-keystore:keystore": { + "asymmetric-keys": { + "asymmetric-key": [ + { + "name": "gencert", + "public-key-format": "infix-crypto-types:x509-public-key-format", + "public-key": "", + "private-key-format": "infix-crypto-types:rsa-private-key-format", + "cleartext-private-key": "", + "certificates": {} + }, + { + "name": "genkey", + "public-key-format": "infix-crypto-types:ssh-public-key-format", + "public-key": "", + "private-key-format": "infix-crypto-types:rsa-private-key-format", + "cleartext-private-key": "", + "certificates": {} + } + ] + } + }, + "ietf-netconf-acm:nacm": { + "enable-nacm": true, + "read-default": "permit", + "write-default": "permit", + "exec-default": "permit", + "groups": { + "group": [ + { + "name": "admin", + "user-name": [ + "admin" + ] + }, + { + "name": "operator", + "user-name": [] + }, + { + "name": "guest", + "user-name": [] + } + ] + }, + "rule-list": [ + { + "name": "admin-acl", + "group": [ + "admin" + ], + "rule": [ + { + "name": "permit-all", + "module-name": "*", + "access-operations": "*", + "action": "permit", + "comment": "Allow 'admin' group complete access to all operations and data." + } + ] + }, + { + "name": "operator-acl", + "group": [ + "operator" + ], + "rule": [ + { + "name": "permit-system-rpcs", + "module-name": "ietf-system", + "rpc-name": "*", + "access-operations": "exec", + "action": "permit", + "comment": "Operators can reboot, shutdown, and set system time." + } + ] + }, + { + "name": "guest-acl", + "group": [ + "guest" + ], + "rule": [ + { + "name": "deny-all-write+exec", + "module-name": "*", + "access-operations": "create update delete exec", + "action": "deny", + "comment": "Guests cannot change anything or exec rpcs." + } + ] + }, + { + "name": "default-deny-all", + "group": [ + "*" + ], + "rule": [ + { + "name": "deny-password-access", + "path": "/ietf-system:system/authentication/user/password", + "access-operations": "*", + "action": "deny", + "comment": "No user except admins can access password hashes." + }, + { + "name": "deny-keystore-access", + "module-name": "ietf-keystore", + "access-operations": "*", + "action": "deny", + "comment": "No user except admins can access cryptographic keys." + }, + { + "name": "deny-truststore-access", + "module-name": "ietf-truststore", + "access-operations": "*", + "action": "deny", + "comment": "No user except admins can access trust store." + } + ] + } + ] + }, + "ietf-system:system": { + "hostname": "bpi-%m", + "infix-system:software": { + "update-url": "https://github.com/kernelkit/infix/releases.atom" + }, + "infix-schedule:schedules": { + "schedule": [ + { + "name": "nightly", + "description": "Every night at 03:00", + "recurrence": { + "frequency": "ietf-schedule:daily", + "byhour": [ + 3 + ] + } + }, + { + "name": "weekly", + "description": "Sunday nights at 03:00", + "recurrence": { + "frequency": "ietf-schedule:weekly", + "byday": [ + { + "weekday": "sunday" + } + ], + "byhour": [ + 3 + ] + } + } + ] + }, + "ntp": { + "enabled": true, + "server": [ + { + "name": "ntp.org", + "udp": { + "address": "pool.ntp.org" + }, + "iburst": true + } + ] + }, + "authentication": { + "user": [ + { + "name": "admin", + "password": "$factory$", + "infix-system:shell": "bash" + } + ] + }, + "infix-system:motd-banner": "Li0tLS0tLS0uCnwgIC4gLiAgfCBJbmZpeCBPUyDigJQgSW1tdXRhYmxlLkZyaWVuZGx5LlNlY3VyZQp8LS4gdiAuLXwgaHR0cHM6Ly9rZXJuZWxraXQub3JnCictJy0tLSctJwo=" + }, + "infix-meta:meta": { + "version": "1.10" + }, + "infix-services:mdns": { + "enabled": true + }, + "infix-services:web": { + "enabled": true, + "certificate": "gencert", + "console": { + "enabled": true + }, + "netbrowse": { + "enabled": true + }, + "restconf": { + "enabled": true + } + }, + "infix-services:ssh": { + "enabled": true, + "hostkey": [ + "genkey" + ], + "listen": [ + { + "name": "ipv4", + "address": "0.0.0.0", + "port": 22 + }, + { + "name": "ipv6", + "address": "::", + "port": 22 + } + ] + } +} diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/finit.d/enabled/input-event-daemon.conf b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/finit.d/enabled/input-event-daemon.conf new file mode 120000 index 000000000..8238fd3b4 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/finit.d/enabled/input-event-daemon.conf @@ -0,0 +1 @@ +../available/input-event-daemon.conf \ No newline at end of file diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json new file mode 100644 index 000000000..e80f55fa2 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json @@ -0,0 +1,124 @@ +{ + "input": { + "path": { + "locate": { + "path": "/run/led/locate" + }, + "status-prime": { + "path": "/run/led/status-prime" + }, + "status-ok": { + "path": "/run/led/status-ok" + }, + "status-err": { + "path": "/run/led/status-err" + }, + "status-crit": { + "path": "/run/led/status-crit" + }, + "fault-prime": { + "path": "/run/led/fault-prime" + }, + "fault-ok": { + "path": "/run/led/fault-ok" + }, + "fault-err": { + "path": "/run/led/fault-err" + }, + "fault-crit": { + "path": "/run/led/fault-crit" + }, + "startup": { + "path": "/run/finit/cond/usr/startup-config-ok" + }, + "fail-safe": { + "path": "/run/finit/cond/usr/failure-config-ok" + }, + "panic": { + "path": "/run/finit/cond/usr/failure-config-error" + } + }, + "udev": { + "power-a": { + "subsystem": "power_supply" + }, + "power-b": { + "subsystem": "power_supply" + } + } + }, + "output": { + "led-group": { + "port-link-act": { + "match": [ + "*:green:tp", + "*:green:sfp", + "*:green:port" + ], + "rules": [ + { + "if": "true", + "then": { + "trigger": "netdev", + "link": 1, + "rx": 1, + "tx": 1 + } + } + ] + }, + "port-alarm": { + "match": [ + "*:yellow:tp", + "*:yellow:sfp", + "*:yellow:port" + ], + "rules": [] + } + }, + "led": { + "bananapi:green:usr": { + "rules": [ + { + "if": "locate", + "then": "@blink-1hz" + }, + { + "if": "panic", + "then": "@blink-5hz" + }, + { + "if": "fail-safe", + "then": "@blink-5hz" + }, + { + "if": "startup", + "then": "@on" + }, + { + "if": "true", + "then": "@blink-1hz" + } + ] + } + } + }, + "aliases": { + "on": { + "brightness": true + }, + "off": { + "brightness": false + }, + "blink-1hz": { + "trigger": "timer", + "delay_on": 500, + "delay_off": 500 + }, + "blink-5hz": { + "trigger": "timer", + "delay_on": 100, + "delay_off": 100 + } + } +} diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/input-event-daemon.conf b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/input-event-daemon.conf new file mode 100644 index 000000000..eb969fb68 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/input-event-daemon.conf @@ -0,0 +1,5 @@ +[Global] +listen = /dev/input/power-key + +[Keys] +POWER = poweroff diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/udev/rules.d/70-power-key.rules b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/udev/rules.d/70-power-key.rules new file mode 100644 index 000000000..9d1f1b10d --- /dev/null +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/udev/rules.d/70-power-key.rules @@ -0,0 +1 @@ +ACTION=="add", SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="axp20x-pek", SYMLINK+="input/power-key" diff --git a/board/arm/bananapi-bpi-m1/uart-pins.png b/board/arm/bananapi-bpi-m1/uart-pins.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e5b5304a70834d90d31691bd50c456445890b9 GIT binary patch literal 217766 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�U1mf`6N7B-Sl3cq~ervm%A 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

`3JZ=M?CdT+AtW@j2+|e=qQUd<}|d`PCEa2$+=m zUX;G0kk|V}Ra2X-dFvKmJ^D6Z@w~nLPW*XGuyvo`d0djNTIVHj!Ry>-q*|mjXdoQ& z;>S=7bTal}m%KCmh2JHf$fuO4Km1Enq3n|bug@vrw1al^)s#+=Y6qE? z^6W9$-v@qjC!-nvA7zV3*k>($kNY^8ox&1M(Z7{?|B6xE07O3UdR{giZ?d;RumR8U z+oZaslYcbGf11C%Q1>}4 zP(R#^%Lfbxs4y>HI{LrCy&tAdTCLSHDG`bcDge{Ea{Zc-+3I#z8m*bYsi=XUuQi|j z*8!hC@5ceJYX=X@?8fh{k)F@AscO#F zNYlK(#0PM6?*oT8oG87fi1*jT`a5^Z2_B@4lHvJRWeLc&wy*`UUw$1(Jo-}AdM;`R z#yR(vF}Y%;U+fyO4q;0#cEz6`EA21P=kLd}SW0}7LD&A;=l@~5v=(@1Ok_j${)|7F z&4c*cc+rvIdhhN5;D=KQgaS64 zcm41@yyYn|^7Z6OC( z{goN;IV+tg+ejoqU^uDJF+b>Jp@YR6ND?|GHsQScC{F2>kv|Zoe zrpJwbx!7GpJJ=?Bt??v!dgu) z@K+;i$ab9Ch}Je|>kPew$Ub{alZLHWFLGRiD~^_AYmc-4V(Ep+go6t7I8=cFO71(= zFi>!))B3#e#G5`~|KBa?r>idKJH5XzwpiMdUJ*NVdN~6 zi&pCupPN5*rpUhbjP;vS^D>O%I1m#oVgEZh@jV|yrX_zto4P{EBD%fIEawD9{6rC9 zW}bHP^%XQR-5*5&q7&br%pc9hAPI1El_>?D%SK3?k=XL9cqGDL#RCWd4z>&T zUELlI_~0S}(dff=zPF?&fLH?hDn8$6-fw$A1OYxmBv}tH7*G9I4YeM|@m>l>d{}%g zJ+U=CAFxkXhLS5)92tVU^1e5!$p38Cuo*lqhKfTaptP29_ywzUmymv_QDRUqo6M)+ zc{X?|`ttb^V{GhJ>O(?ijI+g&y(~`)}qz37lqkG7O_xAfOpDyoY;;Kj)tcdZ%BAoIS7tA!5BXJDr%EnhQHEfm2%1AU%*IST8 zI$UD0C>GOUYSD{;v<|K@~iHXV2*07kT;DyyfB6=X3O#9r`XRFKmMLkqw7{<0(C+K+uD`kf6i^Bqs<(%Ac*=VCY`Hn&`z{qq z|A=q&`fei3-9PVp$}rH}P@mO`K1w+YX;R4fXf0f;%LjEDlXjHHHbW%RWR3RvR)kzi z$*74hVTQK9^Z)iw;B9}7O~;tQ_GC?9Mo&n~Z@vYLa)8Mo^(QTOeJZHHGeR=ud|nZIa_*)cS9hQt;?hCy~hjoWb6!xDh( zO%nZeq48XpE%0q{w(-^}{s50+<-lU3e3dE8hSg-PFB>U7x;HqtUgk2P`Aw8wJ3c^i?ETneO^IpOXasy- zLwXxiZYJR44J>Kc#^ZgP=rg5!ywv{PKh&_t^Lgvjc*gq8CvHO&=|M|I4BDdM@()l% zyJPg`gdC#TaAei=T%|*dBe|qdd2UtT>FYt=o>Cq_cQ^*OsXR8Y8MrI_fM!p zVTSmw^W&Y9yi}`|P6UG~LnOCXzu%^bV=yPgt(S?dUZ=QOKVKoVLGRnRn;lFxOMinz zy7GvGh82ciZmjP6D5n^06O>Jh^zL$js*?;01fN*EB8VKa~x(xSDa@J<;s%@Zm5^NqeC8FGQO zD{DllHb(|G?T;ofCVV!%y%APizG$)L?9KNoMdoV&wrm^+e1{LhIroL+xHc)_ z$w~l*l!9)kJR7&?>8Sf;R+umtuAZ8Pj;LKl_=f$BR9Jkc&*8&kUJ_@~S`fmtv#Ry77u&=V8ch8K)t7U% zVnqL}RY;o7d8DRZ6;&&o<)QwiS)!@#Ip?} zD5&J#86{sG@TSQYLxTRWO#DbUi%=k_(+Ack!Lrg@?tJNi=weNZ`xThOSX)rDMI}T& zqGpJR_RSrAN+%tR2HmlnG%~b19G9N)EhQ3i{shrMn)i$Uk;oNa$)&*k znBsiD0(YMIPvS@*Z&+fN*>gn<*xNQ-$4MqVEq08L~meGd%sWdjL;Nk+A35hrZui_~E0{B!$q>VJWtkIj(U?d;lT3NqjB<2#i}8jP%-4p8f`uiglc(PxbvO~MXlE&MvCVrg)81I z)1KYhM}PXDGFkqBCCyl4j3S-6JBGxR+2M#oIQw5yj(WOo3CwKukK!2_vK*y2lVdaK z@4?W8n$_946mhwNk>JkX`Fx3K#eR){3b})Vu;qGdc#%LgBE|*N$95UcKs`9CnwnL? zWTc|zM!)j~9>-xr9LWbxKW^7Aea5hN|AaT#XG}qC5?`KY4-?b*@kofU;}`U)uLG4#?HAirk!}nQ8`5fWXR=WGfJLrIlMF-3yfIFdTB-BF5p0%* z7a9?>Zzz4%4Xd=6x|`zd@X{1*PTh+UJ2<4U(ykB$y&Com$p?HGzAt~i<86k=iJ$D# z@@_b6^teL$@Kg_lVUuaKSn#D)eI4FQjjnZlz@N+@h~d8EC)0f-{QIMf`TIBfAoYE{ zwFu(BW6N#OwrPgAUwZGJ5>=h}?4na2QEBWVsg8)cQ36FK(Yfo#djm9DGtA|=#}Bgo zIF>yd_;?za&w5kVW_BSy)?~8iiM*-t^h*tJoy?3Z%DX>Y-cilwE!WBfba8tbjc5Y_ z6OF}MP|b(7Jmijr7$;nwDKGtb2hZAOsbjU%C2t}r^flVI^H)9=ks#$igsJzaONk<< zup(*Mb06hQL{*KTAO)dlsvZ;Cpko

$iKVJO3h+t(HrP&K4a* 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%0A8b5R zu58s1irz?>IyJE@0;YD%FBj`{u~PO{qGbQ^*}Rasyl|dGO1>(&o^7jF+k9J7fb5>u z;L|c%rr^V)%|E+4aoHC3`hwy5L(gq(9$g)!Wblo$A|U&uMdmmyj*{BOPLofSkxFQ-0~ZnMcDp9%+XxbTlkRz=G}h33A~1ehW@Z*VXbnaFPAV?!{6n9SS3o8q|hjN zBJxTFB{#lH50VdQuBDNkJuR?*IawA5p{SgH_e0T-OCC0zQpjo<@T06sbU#frAXnxz zCF^}|H2qX+FFXF)(wivb&9YN@UfLiN`@~82Z!)a(h^&78ZdsqtlL5KpxaJu2OY6@z z=+zNY=3`zzN%?Vq4p9VZ)L&E+8nNWswau93Jl5^pAayqBpF>NsJ&YBQWl1#D+KX%8 z4?w2u&t)kg@mi@vN=6xDB3)Y%t`}AOPwLb;kLq*!@b~C71@^OyHGezxCRHfNG81{J zG5RGPdGJ4oo*R41RBr12=Pc)8FR3jZ-3_Z^e=%Bi$+2Q<&|#@elf%A}VzF4Hj4)}P zK3qim(xNGKPjJ)WQ>NR!aekrg&i7ZoT=_N(blLYTKU;0-QcR_}BYln5t7X(NLglVx z$H$j#fb8kp1cSzwMyu0~JMU zP;{0T+p;{nwMy+wEYFB*zhXKm)ppR8wnbC*F=8lFnscfqg&Fufp z34XRFI*<1|l=hikef0F4V&HIJ7AmQ*^UANI+iJ507;&_b($%kPE6JRB39di+sdF2E zQ{?j3SR?sZ%-;gl;m8a2No7>+WQ|tiAt#n%qF}@PPfs?IB#){6&*rv|Bwp&3D)3w^p@tR^9l`Di^9n7$zD2~g2q^mgUOmx^)ie98ef&xr@S0NKil{#KfBxV{)5*W?h4K(|@F8a_7y335}XCyb~bY$?VQr#-d52r)O%~kpKDt zF5jMx@W4s_DqaZLAo3V<-hJ@Dg&`3(?v7Orr5EdXZ*^vaWaWh}@F4mQ);09R|2Y{` zSQjr*HaS0Y&Ra)m5enMTF2ADi_5LMmeVG%$717)@*{ST@z8eJE8c2o7g zWwWykV<=RpFB}uQ(Z)da9?os+A4#7;FU=tGEu%Q%UsD%md0Kbh8uXbj!T$E$451kkd( zQQ2ilAD#^t?iqG_~S=Gm>2_6eDj!;=>5s?69q#ygd5%aY;Iru?fX2eNTT zEYv4h5zmS1)21?hoo>iw8@F4CR*jcDK2p~TXNE01q-CtEB+|!G8!p1$sUGpHeogxk^zaxd! zE=&vo2a>6j@9*6KDdU~MK3sM)+ERtguxK2X1vE44M&uTY40A>Bo-%m`UGC{{w4?zj z1;hQAF~ZyKNYjlk05uSfG(1}<&StZb4sX!?jc33FUD=6JalU;c}Og9AkO~w&L-|ml?PGxa< zJ|`H3AI3yR_T>rruv*VkCNH1N6|1SBgCh53 z62XorvX0kf5B_L6D{hWLn)So^`By(rhA<604T~OI-k=?5h8&SmUM&$Evi5;`tv3?2 zYImRoBxc3>2#Xv3*Cxj6dB)hkk6GvcrUbkYfv@1P zld>a+n=XS_Fn6xUTyL^REcNGr%wDP--0x^X`#2#+x!5v3a{*?sorok{a+`3%a(s}P zb`QpVNGJC8)#s9HLqkDoY)9u-j!;6`YjR$J$;=7n46GLKnkOPwv|+LMwrd8RVf7M& zXs&k_08QJfl{l0xC=!}OiY%fBnA1gx~Bdn(LFq3)w2v3fN;S0ti zU|J%Z{TgQsAs+^GIMRU1*r=~m02jh}%jIy$-xW>>G5ey@n{Z>-LPWsDx34;$fzfR%gpNhQ|Ik3Dahk#T@Pa^9VH zYXr1F5DnOMjL0NMNf4$&@oO*@ z_6i7u20AJVOVe%wXy)tJL`h91$P|s(74ZlDRUQ|NWEdBm+_4wji~Ik0ItTVRzi{ivNny822yQMJPsu56@d6#*vD|xHD%I z_R*3W%`U69cwBIhY<5Jk${%Y?(lrtQ{vJMqS$U(^n7zSOP;VK(>ZdE_;clI5x)S}qyeUbK6fayx-gM>xI zHe9V7Mt0avamA;%kZF=c?J#IU3=80fEoIS@?3hEr?F}}c;5q{$VvXSRG^^R|fo$Gr zTy3{9tPbUE=9ZSbYRt!iGf>)1CLe`8(>zgRS?wj8KRXj>1HNIisAFs?Ac!m2;;D5? z3r0v8Pf*@pvZ068{TyhMw%G=4_1~LuPT{)j z)f{d|SWHca?fVF0jfHq?)B>A_KlGFF5`{lCIoqPb8OJNBr^*bk9ZMKh8z~>;dsMfWd z`GX?xbR7JXxUE34xvNaQls%*2ENl(KNzU}$X%CLVW6IX^g*9EJM4j4pqa)qw%x)DA z>M9)2V2FWu$QW5o>_b7$f}>fT)zf}uCb`ITGE=Fl<9fD=)am^oy~cB)3NpknozB5J z7}x9p7tbSrad?6XcAUvSFD;yYeO7%tWAS4(9=&;mkfVaPb}3bm3XR{A^?=HHwA0SF zn9i|Wul(xVsYWFI-7hTC1-NUZo~32b95Br?|3?+Y?8`bZoGEZlDSK(cn1Oac#^hn_ zfKIi6?Z42g5!z*XDHY*T&7j4>IN|Vmi6Wuv#p>6p)dtDPC;6RhB`8; znw%|Gfv+G4@NwCHYfWUKOX|B{Xf|0MMONJ}!sCQr^Zk}`0JYx4d&6V`97LIm)l%8k zDJmU?{_|B@U-bms3|}|?Hc47=S*@VPYPrcTmh z-gX`;U_60X>lV9@m-7hhE<$J#*5}M)SH{+@#TLo9Jiu^w(2jJ@)evjSa>)1Jo1V#m zPHiG?&r|vs@)TD4xz7r~w&Ag7w@Kx`3pf(T8}jE*y!Z*u8T-ZAwLkVL5jzfqnp`Bc zmT5mi&sPKB&VZ~zoaAs$syk^?pezwTZ(qQxNrUZDqCbdr)%7$ms*!+PGVXmOsfNxQ z4L`CzwYul>n;-u)pTk0B4~LnOdrvxE?Btndp7w#W=fy(mO)vaazFX$v@p={GD#$Oh z=`!+rqo7gWgjWlRI~*90FZgs4HnD=Vdle7>A4~YyTRstv99C|&TZDnlpxC(`f&D_nV7);>Sw4b+|$7@F;l7exQ z`SE?;R3mQSt4$NX*uS76ch%_PB!BHn!|0FxxskT(IXNttsR6!Ke`2mG10-RACLZV! zrR?@R^I-E4ojf{`y*!u6KPiq>QvE4-!52C_1%MmO=k4TMJ{<3j2?W{FAhVaBn!0!; zF~^}24i>{LH8Ojb!E4uin6-vu*j#^9zUYqeptmD~~ zv~H^x1DiD7 zfUk)A<#Anh;XNOGIGU2v+nu+A%QO1}n|uHHiZs^ER(Y%Sdiq-HRqM6gOs9cJlNrs! ziC9NF*QbL}Ti%NJxxTL+QMo^rAzwYH8XIk;Du>t2&De-R%q)nsk5@gjt!j>Mw^r*d z-XtFOdcEnKr8D(ghWkwFn9M#X!w>LJiNA^Bd^F>Y6`rQ(z#)!fQF8_s(I^X!kXRT4 z$F1Q#pHjBxaWA>tZv3HucBoO7Nstt0XEvbDkYS2+E&fb%YHuh-MYmOoFpV9{jIXR> zA&#6k6VLwTmyM{~W!FZ9t9g%_|m zQpQ%Ve|?%Vj>iWQjly9Jo6h7OK4jK$O0m)d|7iB>edTILwcZ!zM0~D6!OBnq+DVO{ zi*lI~q+(veJc50so5NLWnoe(r(nNr6WIa)bkm)}Q14~H2ZK#7z?$9&A6+9BMte&5y2OBXNt4OLp|HI21t#H1+j9(MmE1*XCdThu_QqZqf}HA*P15J zdVrNHAusV!&3f+z;gjRTkcO>b9c-sSgZPXlXMsZcZCaBb{ADfWecQ?k+Z-W&`4thC}Es_p0$=*hP!i9>v-rveNllj6mbrcDMd$lzw4X@1*60uEf97sDX`o zAGQWPVqbMCUU*tzr~7$)A`y4&D*n8Yw@-^>!AOW~XY0VCj~VDn5)K4>4s)rG8w2B~ z1)G*Jp7tro!B)j+_G%wOa1u5(xDFAI(?NJjxQP<@IbYGZpna65&&iKtzoeMO?~fQu zc;C->QeWsC9EG5d6ZBW5X)l(r#pwl4DZ4X>x+32A%^zwdtq^AG>~FOuX@^E0rpUw_ z{vX_mC@UA7?Jz;a$09ktU57%QO#hKIV0S2{d@xzmHxUavh$ zP}6?rJ|8+wAfI(CWinpKE2=;~9^AxrfnjUwCCss84rAUNi|uy{U<*G2FF=c~tZ-p< z-W6U?F3Jy5Z>zkMI4y?MiB_ADmRNFzFKkjB&t9#v1RHROGnQn#c5{srX7FOkjBA-WSeasTkxM)8$k^$%c{7ZNO4owb2OiR@sT(3b2^ z0dL6BuR}9i%#~Uqq@*dIFw)VQ{qy*lPEU`*3~qd}bXiG*6p1UMAjs4!>AviH^rm6W zn~Ma0x^zKk@8+r)?M9J)*~T?W%QcK;H4<_b5p2$*N{LThH}8Gno+*Az=GP#d9kd-qe+Y|x z>B@8=$P`h!@ITD2Mt7r`F#Qem!<1CiA-lVy++{2F*!s*5us_dRzJ*eH%Ec8>b_E{8 z#tTey?)08|{H6k&lv3f9cK4qsq%o>vL0 zFT5F=k)^^+v#Fp)v)}9pgbaqySDD#8{#y(`6{cS@r(~q(WGT*OD(_19?u0BzUtDqT z*RC~^!}T0;7{p~#vl(Hy)gSP!a@vRX$yn-$r)=fgg=w`*c`H%AUJ?~H4d=?G_OpP+ zq<6DAPUC>Zr+MOcr~sD(B0op2btlc4V(#8s z!dUb=SMKvKZ?(=&xcl@!VeNeUgU6Q~(n?{yW409|20PCL*-V^yv01g@uKfSvoIT}0 zs@-%#$V(^0k!i7_{t1OfeOUT#e&t-Btb}>F(FV@A=J@|)RZ+_?FHOYdHL+~QdCvR6 zsi55fk4oE5TpQ8qfml!TG&~;qeY-!<#WCH!*D!6_M{M2de60&|Mb!G&D>3}uM5~R$ z(x9(U1QMF0?y}yh`sv&S6})jF1&E9e;ROj-vN=!^Lq7MnSg!K#AimU0zh5N^mQ!Hm zc>RBr2GgAq@nne5c0xTmwN!(MwnkDVZ0Khz$fD2gnqDx^Stzyd;fM+ z%)kTE(T&xMasu_0P749y5%f4cyCZd2eRtE&R4gI*{SNJXz!H*ANxS`6Xt}&{QW5-< zw5VF7%35mc1tTwj_s88IR$hf{ZZOC+7*!~JoAI&N?R>2bQ~pp>*+m^P}o$ zZ&nzE%uBJ}E+Rzu6;9C2t_dn#L-0c}S%H6@3|Xk7OZQ`mRKcH@V* z{)m`4RKAJ1+`PsWx@z>yatGvu^d%vC+vuVhHgXVI>e^GC-~sKuT7zS?fIAd+$&$379F4Rr0{(n0%0ez241@rPAs3+&abAQpV&)j0A; zL8Ak|<&jLSMRfZixX>U=j6TVe`7Qc-GRw2Oe@?R7J+SCTY6z~bc**v?T*EcR62~sh zmC8obb2<*ENCiyBY3oc_y=d=BR%Y;$gvxhBKUur=^lez6Pub`rG1X_Q3GH~g`oOm} zU4^-_rb=9i?_HDKuzaM$)5aSNy=qjHtEsWEdXfh%T@AJ}Y8u81hS!%a6}Ub5(`n?x z(xB!qxH1$EkTp;A{hnDw95vsE2wt2eA1603qQ@%g z(CZ@#hsT~Rk(sKZ1E({CtR&m=WGhPWIE;8ubx|nUTq#yCrXW{@iB{@KS~owi@yD8a z6Lk_5qH`!N1vE~%WKfAimZBDWN9f0|*_ehDFw;DwLs&0Wc|Gj8y0}euz-**q9|JOAmw)50!}rC-OdpPdlV(+~ z+Jdt2fWwl~rSx3+CE>6rS%WIM9pM#2cr;z;obEjG_)}jus&EGnM1&MinG|*^rv7Y# zOv*uUh0PS%1ueTb)ah6+TL}wXXf4%VL)KawZ`W zZR;Pn+PT@Ne>R?w>rl-T@>bZ4_6(FM{Ur%?hdTU0Xu($LA*)WO2Q`SeFPYzbm%s0G zRbca!v+VJVhp8JP*CEZelvaYA)^@HG)AI*bEm3eISEW%^KFc33m=7quJXt6D;&##` z0Il_m7I?5zDC3;)XGL@)UwGspl!;b|$W*_}6BVnQC_d_|h~!RRsA}sE4P-(A0!B^y zo}1(&bo^vX-&lRP-^!|;r{{u(T53=4S4NhYkS|!EbuJX93TyQ)Q{lw#IBS;8NlUSJ zK8po78~bsbWgPE*cp(1tq)>-;7)Aj88VvC4LF}@QnQeERez}DL?+j=ZdQNdn9N{s}-Pb{1U+c5N@w-ADi(BxqZ-MdX3y`(ICEVVV-$#o{t1Zj$ zg=i71dTe?y6sYAoAOm=Eg_Z=6swS1&V&!q03+&GHM>4y4Xr{En-jueIB@|H!^zK7$ z%5Z?@Fvm;ZY<)TtN)ze5cHa5RR2wOxa9JW|VQ&jeADPN-th^?Wwc^hr?f-Z}P38nM zp#mNB_<{*y`Q#?mz9R8hE~W>s4lv63HxP3FQJ08QUNt!Z&P6m^=?E}n(Fi4F@wqwD zdN`8SguN`Nmlyfv47oNW9R1@$Sp z`Quew-Qb<^dV?yT{{vKsfl6ub&g;ITOyrN=T5yqImNZG z&gA-wBRM(8S01}^~>U~pW z0u?^=lmn(hUVEIetFr_`@`YCmt^_(b{2d=wcF~*Fyw{EhIz7G}u4S9GrF-t`f6kI57Uvv~Sl*Q+lpy%Ka1V7TBqDb~Vic8jf7YO<5kpVbf2WsRpvs0HjDUn0d64fDJ*aZ{ z@ed*S5;oXcR^Eu;+p0qb{97})d3q-`88~ljAsGr}6XdI3YM_LQXCdjk z_7_g5GNne&?cTJ-C=D7%8lnv2SjK3xhDPjC!z*5G7|M}vo>&rppvaIlfYaz4Fz9VU zVZ8BQaDUE4roLVjyvld2m3S_a^Z(8Ii1X)XdDKqw5hWKBMq;I5sQ|$J7!JLSbbGPb z1dqcNq3(bw4p~dS(52hK>G9MLs3VzTxf}Wh677gdQ0>2#Ih;6VH^ZS2uEc6J=5C1X zTE>c2drQsJzW76@*DM^=Oe)#Jh@pf^qJTBqTH4Zw0Bp{)+K?GZE`(aNTUBHwnO?g< z$Y_q*c~I%J{kBi90#$R!9NlX|yYtzp*5d0$y81x$%h>G9XlGrz#b-wd4jDh{$HE_@ zmsza=n$($c6SQ~wwNeB`eMB8wI-V)QsODRscxsoy-tGb;k(jDXA&ITd74dpY7jCCd zyx5L0%FV+$x=>yhmC9ElhGbQ^K(j`WKg_Y_w?k^{tqilkL$?aeywFXp=LTf!RK{q; zdoOB4Y?+Uy4bbg2`vBj=rYw^i69L#s2Hx88domBd&2N0Rkh%wNc;QJrG0XG@h4TN+ z{6(2>bgy?ydb>3dEJA+2FCKHc^p$%oAm)3nzpXn3gL)C32)!o0!8Ecl$tc{*Kv9rc z4N&6d|6}7`-Xg5hAd6DRE;~cgK$LjwmSndb4V?z`D#! zl-m1Y?6icgSxgsNMV^kNaEeZ?l9UD=czSL)!9j$I{>N6LyjBt)WhZ&+E3l;M5{bf0 z7x-S0#TAP3x0`YFCj9`q4y(yyHSBpcLs5s=xyOBHz@KQj782gwZfJ3maHhlrw?pGu zc;0@27=B7url3n`6jCc`PblsJLA;)!>c;9u8_;FSLSe#cvU6)jr%_E#;J=Ba=`d6` zotI;E1Y5x8CpByq&9N3uyjqX)=HW105_|TgDGVHqK2WLt!98Js9mH3^3An{C_uAz# z^m^$iANhRxC(|f1>GUYhwVU1qIj$XjqX1(1_>=|dh8TMNJ!Vy0mx3bqBj8Vm;FTVS zTi3ozHRNM|C1=SI31dE6+R2PeR_T=S+h=?i8Pjx#D!DL8n7vqQzj6)g7K??@vrO zY+d7>yI#&${`U4~w7J|J>d`Je-ubKOAg!CW$qGvld^0i0VrIGQV}^E^)4x@BU;S=! zXUyNM`fZ4)O%?Y~my@!5O#!5jc6w1w!eL}@@QUn)6WHtRZczCaO@-j1E4mvkXc$)Q zz~_kJMD#K#PG7|v&cr}j6&yHBx-uZ&FPY}3CDTmtQ+{22q4KFYzs!h} zNh!Eo1+^Q_qdFWk`}e)ZF{T3Jep;2G{m3kB>3@+W7$Jpxb^CEzStpy@dg%3B_{Qh{ z4Dt3^#n)m2zsLfJ0LEsLYvw=wE!i^E?FtBgmFzi>*;!^s9)3EP7Ds)LO7+Dpm5f)L zwtGH}4jg%06vX59ew!mzwpyVrb7n4I0&AsKF> zL))sIY)*Zc`;&TD#NPKbfUZbEi>X4bn+#9J;Wa*4(D{PA1pOB-l`1pm-P^(O=MF2I z{eX5p8ikB+YWr9!NwmlIt|rgp&(=(ABY69 zcU})&e}u>9|H!5pxw|X{)Y-!q?AmoGd;5QFWMQU``>~Fv^-MT-XIa|^% z5ab=vvlkc-X|Emn1J)(K$EUdV^Dn;?jX*av@L|<{qcC3Nu6|YsZENj!nMC&`0)R% z7>(kGpIJN>Dj&JisWkC~P3p(;A?AN2gBo`~M1Q*`DS09d%Hnq}6#w_h=X55bOTbJh zTK;-OmJOXnT)8y+@a1!?vFCZzrPl3(VB*;tnLzUc+wE*&_|`5QT~@0QFbRi-x$Z-> z!`J9Ryvkb>9wZ%I;9Lb)rd`O6i2DyAxA`PY4?e#C(v+BHxDUq(UOo&}Y)B#fui2^X zdOf>Gseo6>P~DmdiP7eLB;D;MeA#*tCl9FzyiQVA)Nq?dP4xvtMcx02gwb4WQ*Su z<}0doWSd5m@l}+=OxZX1cWwi$(;@4i1EgiHLe?m?a6wnn;JbOnyTVpqqvWYv_4g zbYIB>p-RaQz26lJ$ZM#%Qbfe&QH)_M2N)!}0&&x4Kc$E#axrk)Y&@PlKkvozF$}fB0f7D0uRUWn)Mx_E73olKvmM(F=IMa z)2IKRQTC~Sn~|P@9jL)jMR_O!gj4QqCj~RMi^q&UcVj)@>0*}V=>-g3q;~rr5Q@gN zU{Nxk#7s@`lKSk8W+FuBazt_A6f)!FYn>chF8JI$aRr*HgEKV73;jw}M{>FuR_}L( z<7~jG4Jd7#s_2dtq;1_@lPv<#II-jf{;jT1{5kUiz|7MPyKIWhqC;?Yb{xrv^^0`U z3uAr0%RN$Q62rRl=h&#S!d`;Eb2_aPp7^geDR-!0vr+2)8(Sako8Q20k(P z$7%HnVvrQq$Zz&PR+*?)NVp?k=q7tF;RTG&p&;Sd{$f6)YMML^G!FfqFS)eS;`$P0 z<--l66oETZy6X9xpRH1M{Z^(|Lx`H)R++&i*kU`}wtN9ACN`P)&?Aliv;SX$~rG)2W2pr|(U%Kh~5;a|g zwXPrR9XT}=1a3qz$(q&uhlhrmJOvIya?t!O%1);TX8_J)Wn&TVz_-OtHe}K#6#dC8 z__@Q=a=oaNn@J)mL;N8maIYKq-1cQxPS4ftxeijUkVLvzJQmo6PbZ4VqxwF7<5tKP zB3_c5-kBX#YjOTSb|(>t*W9WU1Fd5{U2Vv42sZNvx9^I27a4_A5RNF~rYS+-eVg%c0vh1B6+_hx14d1@FSk#hPl3Op9 zhu3{&Fj+l+L5Pp!B%9S%qXjWt+edpxe4&KfUQk#`Aomb=y%IzR8|(@?aGefzsj~#! zP|un!hWi#WofLGszRgX}Qi+0yI*_F|Yk~szXeblE(f)YQtAy{2&FND*JPb7fupimj zqNK-052rnb?kT(>vxJ82_Ut6%-90evGibvV|KaKj{CG=y^yqa?A_V}CyYOXcFVUIM zuIAym3AuWA?R+Loe1s1$+E-{^W2!!GG@$k(pYv2$d}Y{Lyr;j^Z|o_)#&k8jNDPXK zCI8F@WkU#%i;%=uXZ4kJ>D`zo#{YF1Xy)^MWjK3+n^Il$BEM6u_)gvN@U*1b?k;RA z;DtEDvKaBVy@$h3qpm5vVXGGyTcPsjr_S#`TPcPw*cF+d6D0AR@E(QEDGVbz_maN- zaXb^39Py4O1$`j%6$y3bCvp+;h}?EIyhPhfP&?SfGL)n7`c|Gb-)npoAf4d9bMB>!RIHRO8k5t1NH#qD0lq`~uD5rF z?^OKFmzTw+S3|4Eaga65a-~3wC$W_}!XYhqm2FMrbg+8o_kf?s?T!<0$6T{`lGuT| z+PMQ`dd$|`$G+)xI(}K>sg}*%tWs&PL=8GfO5-wvy_8*^NK+9^v@~CNRz(fv%Db+z zLIbPMNt2k!yf2TFX9&U`tLG845{tvlSvongax*lv z(VqdvnOE5pn~r25IULddDrvMS)Gl_mT&*M#d2V3v|K}{;a3z3k^h8Qd{|af2dKJ5S zwclS>e&<9l!5X`~BZu6dzd-(+CAM1}<8__7PW`vYL}%I9VRz?6zUAfwu z_$E0~?a7U@S0+^LS7fK_A_`}7&<s0zcnG_KTlhu^d0;5jvGWABBTkIEz z7kU3Max8Q5j64hl12-FHhg)l)Ea$^}KDZMM$;59%s0&w8ut_2oE*7K1i`KT|c-EG> zf^PFd+;~EmNS_}z7swFT9F@}7z<)>YKy^UzZZ6>ScuC!2W4egtal(lluB6vDc{j{n zU;*E8D`Ri!^#-l}X9Xsfuu&?-dO@|pl-+bH0b>E&YJB^(!bvnSFYeYVN!{VE&%?gh zxQXr4q&*&~hC|qF zs{LVQdJk&9{a6K^&9TVJB1buadyBycsQT(2vuZEYBns10;>sLu^el+IcQ}Rn?St2^ zXaAySNjt{H#WlD}P`S!f@g2UFN5u@T8qF`s-&}t>>54SNT?jNt)GGfmc`Z;xSUN_S z0Z|hToNi-0H<;SLAEM#kl%6Z1V^e{AQ8O*>!O%(R1m1t`bef->YKsDm)`j!o)QOxP zG}z2HJg+DOVMwVY1q+;l z+wOf9RO_v!!ER^hg^GYMiNUA>-ISrUZrxn-()OZhm$U51-|gxpDgztq5n(AJ1M;jE zLyTJA$uv)JmVGWo;LYdxnF$Nyy!dbu0FWg0EvHB{QQrRV=lnGo;BD2w#3 z4T=n;MRGdb`G-u)j%wWm7@EHfs)ExWXjZ_*%-vnO_>)s=^qPKGl9?~@prd09*UJUc zR+oJV;L3G8~}Ro;S;#R|w;Y&0+$=SG^9VE3FlQw*V{ua&lZr z_86_^iVqHX=0`FY$ro@A+nnT%lQW6)0wRaJB>>T`U*ND$+T#v^Ht&H zoaUKmzo__pg9R=iPZy@p)D=c6r}b<$0_rGn!j*G+mq$5OUX$xa()qFKihRC06ctWr zZ4H#BoEcBmxp|_e%Gsn!*c_(T(F~G{?2-osrxw~C&>RcD%S-Y3y>T$&Ug%}@_1Y5& z<}8S-%@q9P$M(NN+4ud>FjdT*8p&iH)+y61r7wZ08d}lWIY)*a7^NyEZ*9a`Zl226 z<**|(bM(1r@c|=$@aN&H1l05)+^`7dYl3(=R4fdp#X9|n)Ah{+%~%4pFG`K>y2j;V zI-}0=b=WK&Mb#bFf!?*mPY)M{r`1b-ki1h45?fQTH`+tKp4=9GOu8*NO=;tNc(>GJ zDJ-(0+0hT_BsH}coJGp<&0AB!G?S;`A$!7y>kZ3(Q(3C+)r|z4yo0F=0Z;m*iCZLI zrCh!!v@J$)Va0f+^CwP=JQmelk^P>Etse1ZuWc?0eu71wwAvi1EqCB38iH!IBgmUb zP3B3u$<`}@#RQV;mZX4iI6mlqC~mFj}rSogl}fLej#&_iAc>(Y)lQM?9{rY zT!2ux21uWshV zpfARZ@rGNlTW?rde`e@vDoI0p*Y9?ecG<3U(}!_^6AZ!)&NbY$T>J>ndkw04md!#$)VYo zdXVKMa;0`FQEH7NNc!)e6-D7bPBf)5Mv_y-q(@oDjlM!KNZo2fX+o<3D-)G?*o5EL zJe2N4U#Rh%MBEEo0xfrV7u-o+(8Z$Lf{uj4Bqk?^04{Y1D@y}#rX_POC3^&bn9?Va zbj@RPZea^9SkBiwGatFoqAe7MclqmUZAYDLH~nCiNTkVgnpev24~3zadF3K$TVjV7 zz^&}g{UTW%jvL5d{p!;ca=fe@oU7K{2SUj2mqjYI`WlXuhLiHVetU@ks{o;UM=a#P zU^w_WrP<-1NrRu9;~6)qkk7eB+L@IP%{kYC2pi2-d zp9qZ2=RN0n(kHT9Qye{;);F-7w< z@VCo+{~|v6%(=LJcr>HlK4~zJo6mmTCuFky(RlHlj7Y?v=!OUNG+T*pou#SP*AR0s zt~V6CAaOlWu;mBAd0guE406iW8V@2)WVFMK2Q8ADu7Y24JtndzzixuQPEcgv6D(Ksen*Ax@!>{v*ec70v)PyBdBFJ+Zq6yA<| zKbBkkkUp-7snB)tgl8`)zc}%Eozvkk8AQ@EE^fcZW?rxEIUWs=+v+vr*IO|6#DI&l zMClOjf^ZC9PQUVbybxjXM_m69J0X|mu2#EZ7~^S}7!@K}nwfrtdOzDWMd=!Cdd90n z*6I`SCIK>KDU%8k-kHN2-3|G*xV^ETONGRlvhGG;VV>lgRUF2TM;4{Yw)nhI{jAD} zZjCh4`?&yX4!19$kDg@ zK^8cr1Tjy&#&cGllJ5VXa#mu%4S3YdEB!WFuXn*H)ff9 ztJ*z|#W_Cdv#>)i#NIoZSmdw9ghn2BV);8*1NT&dzBvl`pLx5vXr8xjVcFWgFiHU9 zTk~XDtU!LeX+$~Kk4P!FVHLgmoRsu^6Lnm-rDP&;jW&6jvO6j#Lpn`a!_xNOd>8~q z)K!U2FofKV`Pb^-T}Di+^4(jKm%XUc8y^to-0p^&dg>rwu|x8{QztB1yJwZLq;StA z83Vt`vghIzXi6~R1P&cU8hcqvu1=@*%niY~b^~lc-2L`)CqA&%4KFRPP3>&$mzFHkT zViC}U)QIO79WcbmFjhASOnWy5GN zD;cfs>9gN|mPpU?%1zLxPuf<~AW$7!5#8N3HbJ98np4S1=JOviG~QUn}|Gxez@# zt20CAE@zYut@iwq_u{tA8v;}d?k zp+G*sOo#(XtSR~!Wo={(8VIY5N>Wtbj!E|w%cIqqU&g2ya@LB4SIrdWt(c*UyKmbr z965BMJzoS?B%tCs6w@Pt1|v<$ZdCtaOiICj)+Ter9GcMb!ru~OFPSH>bq=g*4`1x# z2nx67E%Z)`k}t5iG@P(7lCIzZJvwbh>sY6n2t(6wn1reW&2*7x%p@aV{aYEhpD!{SX``&=SCW1c zvbP^l{KNuR(*wroXX+v)c6+!pAopTEQAqL9@IpsH)RX z+e+xv?7WHc8ao-vsgu6od9DUiDgH91uBwlD5)shR4BTKOT6zyb&R-zqV?sGnWBZZn!zSrF~2 zrOznQ{@i7;`B>CVhf%%*9!WFYBT^Nkll$5~`1JGwp+7|){A{hEGI`pw9B z-ahu)b7g!{k;ewOLSCWl0$N#F!HcjVf#(c3p-oo_`3S{Xzk^Td!;!U6O4vmM`u&p7 z*K_zeH!}w^_7b1cemiKJJo0|f(%}^}0m^YaC-KHx5j6<#J3|Jy00hOu$Eqs6iys+h zb0$Tl{?Esiir)qjE69+yH$jx|fgU0NUp8Y*n{gt}KnW;I1Ua} zx(H%n0f34K^E93hUdZ~qhUvVg1*BTmrH0Ji=tv>Q2a+z?ul7CRC!W5yj9u<-GbTz~ z3TzK)*&(*71Rum8TZxD%s=~)OpzU|f$f6{HgaN6Q+*`wtd8N1jUyL8$x?MBHva(T! ziKhdDn!Jtk_LqpE#^FBi!eN0MP(ey#35YI*6P343l_U5NZC=9((a0XlSlLu{_7cF z0Fh2lg#n}D44hb}5nfa+Q29aPw-noNik2<)qV~g0rG89l5w??QeBxcrPGU4OO2Mo` z6zm7hEP}tOo%!30>N`fGSFB%LmnvhU5RKX=xsg=do`kit{Y%N4I(t5;nXgr|uxHgf zISbRMX$%|ivqS2%EZN=KJfgVS>gBJ+tv{h`w<=G(R#MT1$L}QaRi(P%Z8ZtGGibw? zRyD)PTQ#cTvbgopxYy;@IY5`KFmMVGeo((e#%D=l4(k`K6>VYiS!W3D3yw%wL8|qg z@nzEDK;aBF-&vE62Ac{vDz)ok4gfJLcZU>~PHe!+zgNWoc3zlq95&xk1qB11uhF>E zk|Q04^{t=t(wQK`6WvN(cGU5PsoyVC+06)?N7H*BjJ2jO1Te6yvX0k?OnP-09Z=)I zDsaM6zSeU_w?uSpxHpEh1415$rEfPByo2HE`B&1xbGSq1%sR(u`3Y{g$o$r}iAY0-RRxL^WK(7vuo1|6%i4bgWeOC$dJICbF%Pcigt=lBUpQ z!>Hj{8%+N2t@|bNghe_y_#EmLElIbA$yBt#s)ZAj5Lyp1edSZg z6(LRz)=W>u4o;nklf;WZ&~N8L(2)e-EI!<~_NFPe>tjf4kq2;CzyT-BHpb&d#p^AM zc9<67&+Kl-4gd|V_(4H9CR0I%O=}!5tOkM7^1vi5lB!bOx->Te)3L6I1HBGQjGv)Q zgR5rI7(y-_L8Zz)1Wg_z1!RkZx(dZ;8J(8+I3bl%2!4})4&=*tlL7IRAmh>Idy7oE zVgHG=W>mFuUdFWPpRd)ecZWu|5-&xDm1a6jI&6stq?7MQNgnK5RRAKQAh2W=dark< z6>wKp=mH3LNoBIgt}-N6(+svSo?QJ3Xtm`(oJx=OQt*JhN^f?gKGV13$~{PrG6*7fg3wA>nLLp}?$GR(@vt6Q& zP6gR%IDp{=QC^^`LsizGR92HtmVEtNyoRh7W)7R{*s5BQV%lgx{O2R?wgG&_2Csvz z@>>zhEQw@Uy>@-aFP=YcMDfGZBV4h(ZvcnUcZ$odAEYRKg;F}MvU1WazA=ip@4XC)%x4FWQY{|z$Z1MP63 z+6%;Wwl|wh?@R)^ZG?Y1=*0^QdYJqh%I0hFVQjKP>J1|%1U(!(*{*g$XKL2;cXj&I z+8v>uueTEtHrw|;G7CDIj*FkKv_MxhRrQ?uG1l4~(VVX}5NCQ2^^fV5*1Ap8geeZk zp;S0p-f7uxb)jXt+Yg6Tt)*YupD(+i3wjU@JXR_AoUzz$H9-qDIhZZWoUhjAbfC63 z-TA)ZobNVfui;s|Jwp7;ysfUv1i6gMoc8{--Kxd<5AC~{y?-HC>&E#10M|e$zr(g| z!`>ZRuzTx9?A*K_JGM~|dEe$8d$4}TK5X8y7yGv!z>dw-v7H;Rao-kfqMmQwx&eE( zti+M6YjJ4HA?)3J25Yx$!ln}&u#{oj4xPq<9XoK8U}Mi_rp@#1%9A>`g~x5QjqSVk zP+#|8JI{CQ+Krt%cVhGA&DgSK3+-hab$B!Na|`zFVmWs0!j9d$Oj&lUUW&cc{{y_f zeam*N+kOD6b{@v6UHh?S`!;OZx*Gd;ti;X@Avn65<=MIu8#W)J&hNkhrlq}ecWl{4 zJMz`RHrc`MeXN(=*en^1Y|M|>cTjGz>SV{ZP1w6-1rBaqiQU__W6QR~*s^06w(Q!( zx@CG>_OopJX{Woeb=Ov$*s=!4Hm}8|9lNoDcBz--cJkW#&0DZ;<3=3YzYWK>E-_`^ zbR-n(b|1#_wHsMS+p%x=PS)vK>{}a*eLQa4dzAHl4BL6{-c4)SCL1ZsM(m>o;y@yKSStQJwE(J*)k9vTb%_E9-pcmd)79 zboWv2qx2JdnC}ki&+fhSF?$ZOp7+v+F)jLV#_)s&zgP5*tWZHWbHm7V9>gV%?vnPuk16rB2Y7ZP{^v zvNE6Dd$2+B@7#~gJK07%)?&lP)zk<2*gce=?Xi_Qx^4GS>gYE5xQ%T0HN1Zf_U+q@ zL-coh*RP`v>|$FTXE_hBZTGSa2eE$7DYnT$>ccMVqHo^3eFf85O_?{d4YyL39jw2d z*vM<^cCoE??W8U2#s-#YvutK7^<(p1Y@tm^Po-BrEnYy`W_W^9(zYoh9zL-8}(Y~YfquX(k`gCgZ zI-FX)nD)2{D`+F@X&?Hc=(a7il}%ge+qctiGoMYHsI%MY!}ier_Fye}{my-~oxNB^ z8`!;v{*(4LY5YLkzHyoO#S;L_FMxjaVA=l>o6e<3I@;`Z%$YYA2M!#BE#5)4o8=TX zdjjGU;}Mq-Zyul66B1#!CGuJv5_mn4nvjr~h=e#^r;;Y}T0G;%#Ks~aJ^_wIro&@w zd@SN@aY*Df#Z5?bAWobRhnSc!#K*=kZ7t!jne^hBPXf;qZIXkWz;lM_QM2UoaeOLU zzjclA%<+dgKAvTYV;K^x`@YM%rlYPa?$hz~`}^+wrP-3v;(ryneuyPwEOo@H=by}R zEL$vD$9SbZJYEVf$39EW5`j|i*V{ujPy93dB#OkKclE)F=Xj#ENpQx zuu-POIHlpF4pK(ye+2b4*3RF|KOs)nnLgtvUZQkaWl)+-TQW*-V`&S~gj+N{@ zCQ{#R3DJnRMe}+z<%vct^Nr{IHrk2G6dz|J+i4R##xT8@RGC?x#6;c`7mnD3D4z_G za-3auEjcNN&BZd=5f{m@2>Og@8*C~^ObpA&`ea)~ zQU=`{%`_94rp<74D$^e*EyjtZoN8wq+lTd;klH{AOx=J(l*BgEFQ1H@l5_OP?vD^utEK zsq)9hG7Xcy)8ykzi*mCZ@zMjzn&vYVZrWe|Tu0U)kH&{9UsI>PxRyMo4t4KOWXq?D zb?$#nY5iZ*d(kX;{AIOd{2_iijTgaB=ks*ETECx;BmT)UT6#fNyZdy)FI=`lzmymg z$s_#<(~XUdLu9nJlcf&P@5%Ss6rXl3UzHFmpCKPYyQiMU(tpJAT(;!ox%s$HjQlL? zoxi33vbEUgSVT~lVI>YudD}c0 z4}j(8PXVy}6j&BXnWSLauIa>y6KRU(uWZ)&Pa(y%fVf3gm=yb2;Z~SlnDW2=qDXl> zEr({<&Dzq`-`_{N_H_AP6e$nMWL{EBWvku%N%1VUNau?CtoSd2Rkj}`HIK5;ku2NL+BUP^mTZ=Prd5GnJn_AHB5TpwTdh;p#}>>wR;|A`y9$UI zrnYASl2JPdNK{Fyb-T(=(rF!@*Qp&E7$`aPHksDiY3-a@YiGR__{2(Ov1zqp)~K?c zct!u*j7g0**G*OEW@Tp5W|+icB4%kGW+`8_6-!DbV(~`#`OP*)Z4_$ka zWYv>DS+e-EMNfx4UB-VPMYC839(9MgD>Y1hD#c}|z0wYiZ&UiTNOByVpxsVg^KDrF zGgxUm;icX>_}hG$kA7F{?B!PV(l+#-fHRyw=*4-9{Gl!;Ig&7D)I{96b&q=Fdx<&# zmY**Lz_OnqS?5xw=LMFZHgxM=i*;R2QZN3Ab?#3;YUt0Al$T_%K%OPL*y^k#pIGPW zjC8c({8D7qo5fb%mYkB$x@O60h5eGUT6v0ewB)d4(7E;7lGl>W3j0wqpiYQOX)>Qw z*12INAvW>UR+Ne73i3fQ-*#*+hItfjz$>qqt>*M5wqEp$=dI)<0!@NA-@e|wOxErR z+JD?6DAkn*H$q4zG0Vh%x}^Lp)^9^bXrE>Kpr-GIGhJ66=8xERSw{LD*?)M27(0cpDD)Od=o)O|8ZWQ$cIN#VOL2~F-#^7rR7@=t-RvXbSm zw9kc(Dv{)&VWl$9eLWwU`LX@=(xpB|pt!!Fj9SH)o?$C}UJ)4)o|egCLyG5%`(xy< zZx-oXY}vS_m;O3x#kYfvRT)ENwV@3KkXxR zRG3)j&!S&SUMnAenJjt5I=A|wXUY1ba_X|hA|7>%NhvLiCl*ll(ze|$cxcbsveEA5 zK-WVb%5!ZB@XvCR{3`vLlVwU|TKaUqKAW!>V70Ynj3SwxY@&=$F+b%;D3`WN95wn& zg5^7=P6A;0`BMNa`x%#YE@gTVU|C1~e%he*+cJDB{`VRFiy}(~%L!R>Smzci%qoY! z%+|GEf-D*Q*&=@##g=Tpqu2Pp}}o3Thrj$!;bh6%_M zc(POi$;pgEOXf8j{eMToR5E!##cA|ZfcdGmbi<=<&62cJ2Wwcs zUNiM(3rcmiOrJX8d)r-YLgqa_xe4&uAxaOPPTnVJDp}Y3IgPAR{WvKf>8Pcr{<^2% z&+|4WmVr;bmv6>im~)ecXW>qV0#gTHK6 zm=*3%{?~pf^3U^!*pgM}s!P@DkCJY&Sj3}}F{Seh^Z8Go%_e)PQ`D;@f>oQ7eo+39 z*L>dQpJTTM%-S(W;F$SE6It4%>%10EVd9J{mH&vLe5u<|s(hM_b~!O}%y@$3z%q;% zMFFr(qq4|4mohysubtd3|5K=$b#E_Ai&kKSu0g`A@TvzFAB&lSwvCHO;yEGt;C^8B-za zr?$}5mSOr3hCZyJt+bqU+%5t*CmpdvoJ4?}2ZEE58Hi| zZRxC~gH{}W&}oG!?k_=Beox!B6>iCE9j$Z4vshujG+DAJf647XxUl52%Hv;-7fs4T z`6@quvce^&bxmRZvib8bLEl#=3bX3XB1Tl!YtNrD@^hI^RZ-l(WJbTzttgH zWXUG7WVPb@|F(`Vnx3u`om;Y4#@I@R>ilNSs6KKXX?ha*RCG_32KTp!x2kPAnTge=owPF`s$op z`v+?Y1+S5<7Kv6$RAjsLvh5`J=T4{6e(XzHj%%qmQ2<)k-wZOga5T(lKkbf>d!x1 ztaGu|4lkOlysZ5FWw7Mb(F*gwu5(K-ehE^Z)=_ysEte&mWEMYtO<~W4G!W(hSRV^9 z16(~dGf##X=F$^4?axlH`A@T+~_0(OWQ%O zA-OGCEwbePDf0SOx$04!i`s8KdBIQ%aS1GI=8{gG>Cpo}0bOa#wszBz5l|)(xOwUL zT?CeP)}=n%9#8KU=kgNw5r#8NYz)wVW$J}HmiPIIuRb|xGI=mi*k>CHu;nP5{V!?Nfa%br9Ty#%Qq z59^0z(IZm>mQ4ndQ2MMqEdL=knWvJ@Q{^{h5c56>s$j8_d74!LN=o3@d@kAxH)V2A zemgrqCp$MM%cGCoI~k%nH#5lwFf(~Ioy2-NT`Nzq8FZw|WaP6V{NG4=X4#Ry9_rlk zRoZDl*G0N+#kKDHrRZrpR{qwK44uoK{N=LZ>$m)Z&R;Z1wrAO`!j!+{k}Q(Rl22^i zXO-obB1dm>o?i+qi>$g)o|4U~FP&Q~eHB}>Tj9Fzd5|$V`cNNFfKfo08Lr@o+V9EAmz$KuBA09bxe6adRKDvPXhDbw=;%hA!%xN_wR4jnpV_Uv4< zW{vrv!KSo+~A*f9E$TQi1z@^-% zHFHUwvWlytKP!1Tea(otVquScjC(gOCpDnbU|0 ze?+XTnGkwC0#|+BT2^SW+_#*$x_s6;|4Ig4QG7Gg&8vRkPs=aNxh0n&MNn$I$CO7$ zH|vJpKwq(nvg7il2iU*wBDQQgiFK<_VD;*QSifNpwro9wg9p#@`aML1+u(MxPJP0p zk}{Komc(L7omyA_5YO^2s!#qF;8uFy$GSzyscbAW!P|F0}h`(hFf>_Yxoa!6L~lP&oqtNeh@6((O6 z85wEH=wHqkNtW$eq0ytX7^n z#>B*!{%ZgJ{iY732bQer7tWqNiw6%Ln1RVJNs`m*YpnLad-tyCpLg%xou;p1?ftDV zU6ZUo3Diq9EcLL?{liF_b1+9OuQE%gXm_qS%osNqJ!@A$pUP#>x8leDG!Lm*03$19 z$H>arF|=Yf3@n!kgUe;WfNJ^BqV{L#KX@o&W1@+Fv~0uY>CH>cDRBhLi5ND19In$Q zysV=DSbqK#0Ly-k%{rGd`GaMJKdo&3=g%TJJ~Nq6Ip3?1-(;G}b7d8too zmt>EbMRsy9aWCo?j)WdW@U|cfn>zq4M>j&P0TofbUpZ9mQx-M*R6x_g_0aRHZull> zBG&9!jnkJo7>NyM`wAF%jm{f?$9z0mT&{feTWx22o+X?7pu$vtzJtip8S5yr^i@Zt zFFO{P6L6a`V+Mu{8G=52`k;UR{unxRC>$B#F5U%7H+eDcXB#=+dQ&`D&yF zqxbLMH)R!B@>%DW>_3$(+Y{+%rKfPqPE`g?fSf#e(o8sf`Q?|!2Ymkd=V`u5K2`SL zt5+{fm@vT%O4Mfv;44kBRTox1Kb5R|EV6$4r(^w=+{#n3E?>SJUwrWex_9qxcezRx+;)=^Co?jUz%3g(>OKUkYq59K;wAPRtGKST9*B2q9p1@TNPKR-tP@hw)_m4{}E^ch@rI_d}oIMsnmR&_?|$cGOfZe&wO z->q9W6HlG0W=S+C&|^BKr*y5l@OSc}pCYGqzdB$m9ZPO4T~TKu5Uh@{YuB#kDBxk$ zsoHt;=+VZZs|<4ZlJ)DazsA9X2TdAEOX=%q$!*E2aMiE0&xmW7zsxcRI#2;W1_>T$ z4YC}od83*}rP3yOX-{aE0cM+*?lFmVq&g9z zG)pij1%afG877saOak#DvkQkhA(lgB)UpX-ST#?4f}8FC7z=|=qFa|0s8)FzDwUgy zs-G=KrBBzOTKTPLP-{1;e6|i1KV6Q`$^`Q`3$<&^LeK8YIS@RFOP9mU2P=HbO|+9n z9CH;IO+u2(CyyCJSoLWHlz&N`saGuuEK7C@tzsqd=%Ji$f#hWE6rF&_o?AF^YcFPP zn}Bu`8lwK_&(M5&RdiTf2VGXzN6(E-$c@o+Esx7TN9TEs(ekU>Xfdh|hRo`LwFj2s z=EEznd*YGc)C)eW2i2!dc}oOVngRFnd6LVTc~_Y9&>W1eSUM>d>9++Mr9TfJJ~SX% zIw>2UG-;Cg1h{4r^(0A8Xf!yLK5N!igH*+p-cFk~&BT$eDosl_We>{F=x1uaKSsLO zBF$P_vRjYU#TqCJBo7=o5LK#FLD8Z`jqj8n&6X`2^5n^5{He}!<;rEQz5o9E20W=; z@*naemV6@1hDH7|{192oC`3A{%wmO0Ud_4-&4|1aMaQf91wbqZSYCJzrGPLS@z`96a7`KsrJnb zvjNLmh8BSy4L-%qU7A%M&MT($Uv0}#27cN}bgy+wn-#B)imnv1tjEeQhQ_j+o$#N)` zGttqKN&I7^IEt?{b+4R;IuC(N0XaFC$&)8z{`~o7c0o%7G%KswP961IGEJR2)c`($ zYdKc^*3t}X{jI;eGFXwqtn(iu#kI;PR+@T@sabb*GIHc{gqqmKQk23z6b;YL179{;wtj@pUBh^=A><@q^z1!>u=wj8qY zsO{lA>t@5YX4!DMeO6rWNJrf<9l|@mil`oR z;N3IhY`e_Z)jB7ZG%ti<)!sq3D(_+Xh<>2wV4G$$z@c94oE18105dzU&>sH=3YhaRwA)}n5mZ&9P#EYzv749y$w zL8mqs(6!x7bZvVNUE1A2_fB`wq19!yX?_~b8tq2)DvMC@vk7R`aw@+0W-X2$zihtD z<0bEQ@C6lcbxJQAdV3m|na)65*~}*mG+Y z`p;{P_TSb-t0`45aD6k(yfO&OqQ68)+;}XC9F3*1V-XTP9!tW;Bk0B$OgTbuvZ@1m z%xZ!j-!#MI;IX*+@EjZj^?Iqt>GpMyT78kM9>)kO*#wfG4VFdHA4|ujGh+EFvGhw% zzP|b98v}ebTX*Nq9pn2ff2MmaT~oLQoLc@Qzo3p-_9Z>m+GfRl$AvFf6|+pDI5ppDN#4s8Au}TT7HEVa_!vq4@eOAE4z0)-p1Y zC95UxPa(;rxVpz8g^A@?)o18Qkp}hht@2xXN-6McEy1vSfb4w5iWR0VHQ3j{Ss+jT zKu_-k8dZMPgYxtTmOn;{CmD5*Sft;QQ%B9xYhp&eR8J8FkmWPwuk`fLTGn96ELo*5 z8hB`+ugL)UEBRH;+*@nLMONGW6tZNp;``UDRbJ_x>Q8N`ryj~*{gr&DCT%PkrI+dh zG~kfFX!61Gs~X_xy4v5$PkG6Q>gkrrT{4&vv-}mkn1C}$f92C?c`PIU=(=8Tc0ER~ z24%3g?0+Hd^WPz*)o=c3cC`Ip#I%0}QRJ8ouOPa^tBB~34wt*;!#Mie7L`AR-GF7u zZie}kfj+=X+jH6iVEF}804)0%rgbi5`YB*pVU`n;@##^Ij9If8Z@lq_nN1cD76_Ij z*9^1Ra_n;IIu~0VfM%Z63Fxtx3|r1pdC3V``Rl0stS~G5he)!j1JpfoYMLn$D3f#6 zNL>z3&RY&g&PL8h&QWXuJAptsCS8{^)kt2C>*Ux4yp^t1SCY@)L0eAmr;s`a#n*ju zZ0f}2@Z_A;@yKBdWLoPJ<SDS*Ck;li|mhgF}FM@Orkt-4iPD~=w6tDI^Z>7M|NNb-vO+gtLQ7uF)dqC-ZGVrXj=uxi(k;+= z8*WK%p33e114-TgjOd=3ak6!0tgP`Wf@)>Ol-A{Ne(fwe@+(NTMG?^HJABNWdD@jP z<(2I|nO$a`X=YUN^182NwBKaycp+dw`FTyaKRPN22M;8mf4}{xTxk(%)!2?^O)j8) ztB2^=I)-4`NwA!P&TS}m^JD^Lpnb~}0_PO;?&?M7c8}4x{(jV~9*jD5zQ%}AOK{}G zWhB`3wz*FSw60haG?GVR`J9Yol7Ol;wK3(E{EAPx^hj3k<2ecLZ7Bq_h{PjjC^lT4 zfi5dQLDR)=W8k6BFf*(*mbklNfx8`MyPIQPatka@X^#adtua5j6@rr6VM%gVEc5h2 zP)rwmb+HlpuCIcg)9PblNPk?3I)TKL7}kypF1D*TRW`k7WRP>3eDZ%3Ub-RKb(y+h z>9mfP&g)#@Q;(@$S3tnnA4miTsLxnXJ5j zDp~ScX^7Ql2#m{D33$ps$_L2KEnAnb($TVi`6|`F2KcH=O#o;BB5)@VD==%-qa~kJ z$3KO1pMaBmm4E$ekgqmV+i8|oAX&4^@}riV7F)k1t9+E=D6W8*W}W5l1fW%?*5rZ6 zI{p|bp4Hxx(Z60rdOt;eRdUL&YI&XfsAQ3B{`IP(KWJ8%`U=UXHqk7z`aaEut4>Vb zvSq5N(Nuv81C(i3S~6yyboo3%s)d=j<|!CKDqQ!_zkX>f{`9wqYWZ7u+x_OB=9D(6 zKDPx~em9jPI=qf4m2#q8#ZTaT^nk*sZc@RrhjMzND5?#E$9^3E%P)}F8vlCq|I*B| z3|xjT|*>(nw!3%vwt*2PEgN zI#HeZ%c%1oBgIpBm5z>j1gyt@>O9o(sG}3haZ4`AB9_b+`vYk?PO%;>3ux<6qX4sJ z(5&{>(dvkPDp@*Voy(zXhDeVFtw*VnQ+fM4b+P2OSn^u+t2$MDtsU1aliEjv7&*SD zJ0az1ek({~sA>)KhpzEdj@^J|{*ZNOhF4p?Ic^@owr|-PHz5KF)8a!$cNsyRYf9e~3PKInM)DMiBS#O`rE*8*98STkV z#3e-|(t8*Cudhb$IrZ@Qfv@(fQC%ueiju!!9Q?66<%?Y8On$%WiEu%#@&2j6fom}gG%9((K&z%ZZ}#(&~V zJq;g91es&^ucVWPPX#oSpEk+|*R&~rCd$jzKShb_cuv|V-?#XiEF$%^ZFCa#Rrm!T zK;v%-I{2}-fA;aG4q_SDP=@Q1ZGD8CE-U$6r#vHmmHEj4U3@nYT6`t`%H{ID0OmQU zV`OzX$?tind%ndW^2<~SbP7>cw!X5-b&O9>7E?vbD124%#}556RRvX_w`o98}Ashnp{)hl6Hz1l17NXIGsKH0MKJq+1O$3L5^Kj7SP7%iO zxRY_fhvOj6BloDE}u)4g9Xu*IYp_V}LOZyRe3dG8fqS;olF=JZ|UXy)6w#UK4?S zZD=b^=((Hbo_&H=zVoEg)vOJg3}BflAYqN>AS!=M*C_*cVOhJ(Gi4wO@o$_b%e)!T zvQzKAlhCCjU(=C?->Xwkepf>Zi#4!+g$DFbC~u&NWdOM_-?$*d1%stL+YT}wXy^O% zw#PaR@Eq5W{LLC#__0nnVWE!gd4p~q`+ycN+Y~xV<{YE2Eo(5N&p>pM*spnaqPVmn zJBQlKs*@^-Cr#=qtxqr4bIb42CAXcTfzvza`jy9PN~)i3Rew!R_tv=hiJFu?Su@p7 zGt@_ubfTR*Rnu*Ms!r3m#EBXkJ5iI9y)7+IbE}4H(ejHl=IH_rxb{Gex$jD?POJ=& zm}q?v6B&^;>|nnz`n2PaZp_AH_V&a+(*&?BfCmFnZ>K&$&Bgx71E}$~4Pd5i0h*XD zl|3&w7eY2C@7%c$?f$UC4*QzV1PtSA@tgQl(qWG(!}wu8$F&}P=FJ_T8Xri|fagX| zbdZa@7agDr<|upMfGHQWXWBS^(%ZEIVSEE^9Dhn0{s}OO4mpQk;9Bm3pJpln z!5GSPFqsSSJkH3C9k2y_GyRT10{|Bw83n`0fLzGofYW^|TV&@P`FT#B1AF3|8|JWk z{WTOUv*r2NN3U%0rTA6+Hu|AF7@cv9UXclXAv3bMo;m0FUH|0cZ79JP`gY0-A1IqF zq4onkK9>(jyy!0)^7+hm~5#9?>%(Ww}I4(CsP96CVR^WxkYS^EcH*@PUq7(Y${S#cZy za9&Hf6Tvy+aA5X54Ts}S$(=sOKCU zt6Cs~J4|=nI6sa7@ZRCL6ZKBV9VySmlnmys(FxJ9Bd2%zkjtDak(bpr=p=FKlz|SA z!OLgsGSWHuIdlp09LVSS*(V)Y{R0)3G1>uzExVY-7O-rMhUo>C#8UvD;P9@oVw2ME z|3foQZllS2|4>WL+(V^>KT|UAI~nkcbIvpNX&3(;<>+BzQtr`2|0S*bL8 z)>}I2$XnI(xJNX6*eabqyi!93r!;T?oB_y#3r*yKY4z_LSHA&C^&6N}-+t);riTxe zhH<{10qj1jLsWY3;3swLaW|+>|EqM*{m-ko%s`!$nzF$}Ri)|J^%;mR61{&NEK?PH z4_IpQZ%&o!^OE;9`H3sl@A|!T)srV^LHY~>zWp>?1)8HmO;Io196MHHQpah6PS9kX ztg-3i3^bptY3dtza=Mps9|O??H9vla9x1+74=lY-mo6BnUY8uHhu(Z3%uFsbF$l=> z%h?&g%%9MO8>3G<<{4l%CbQcN9Vk;LuvOk(I53G4?KBE>+1BQFvWWpBZ-DSCEa^sB z?gO}ILy2p7b9LNt$8C9A=Ya_PWi+~s@8sh?n0)wA_p9!2@vH2^Oy%g-ty}OfOmjk3 zpH5XDxh|ty`U;i2X5D5n0QVxT0%0+JEfsqscj!$)YTxMj2Ip#e6j&$sbx1s(ab+&D7jmYP6 zMxT*^9doIPfa43151C+egHG7GU*$YHCJlLz54lOBe$cb;^U)_$-e?bHR`--1th^Sm z%u{gwpTKf_y}5?ZGhliD#s$ka1+aXmf#r<>=^)G3!SW^p%cGmYawC$}#eD-RIuNt_c7i+zux()j}Hcx6gwiCpgV*r(IX zmFRexe!?^a7+H`BS&-S~qI}9mX7V5(a&n$6a&w(KOynjX(JDGNWc9D3A(t`N4vBi; zdYm#*6+k^@5)mTWLIjU%sz~){(OLsV~;&HbZ9uhY(i4nMW!7P zZ-8kFHJv1;0#IJR%Fx{^eRjiOP2A=CT6XgPDB0`#iuL-QDhK^U6$L+4MgC91M<$hn zeys9=KU78D50x1F6D5cIRFwn1r*z>D4Wa(K66V0;%yH-$6aWDK^hrcPRAJ8lH#`0} zeKMkjo*mv*Hy*LG#^)cY_aDDoRi#BiBG#MOY>acybUUVFmTU{l+nJo{Oq&j1*>Wb6 zaRY*Bz4c~=h7EZ@haY;E2KN6_c>~JSw|Auq@~!_cpxobhK%Vt2`DqQvk120Rh4RlV zR>3(%>QhjvQ~DZk?r-?sK=UBm7Fzz(ha`0FSsT=^@8de+$ZK`}g}3VM_m`SnW}l|B zm;v8FTbemK#3n$dmPon@TVbLb##V{xeYMu>vBh`l%vn7(boO4FwQ7jQmJc>ie1^tp zxNb?>aeAl$Yq1M`LK#cl0Purt4d<`sDe5xys@1}cud{1S)%^&vP zcCOC4QU;!5wp}v(ce>)(R-qqQx~W8j6o8rhhG{Zw?JTuKiTD~_ zeBI^xZ0X`=u-r)043=wv66E_BQ?6i{ktypZb zc-&EXKF;H8a9lVxq98bS?(L2e9Z@zi=juEG%QSMFI*yVukOLVhhq7G`cib??K}UCML}|0pSHk7%?mu+03nc!f2j3L6x>|Dx{f-A%LFeNRRCe^KJ(A1G}=8Gu}F z+p;_Z$$39gg@NT*;m-^x|ID2Ak5oPA-<2x-55)$4PYGiHvj$t*z#YO@+>6g{qnFR_ zp;>*qYUDAU^~j8|TDNMo%1s0Z%Se?ASgx)%8&9M(f9`AAf8T3$;_;6tKX17T29*Y& z+^?^JU)vTG0+gk`1C#1AutNO?6|2wSwK}C>nFfuBt8j#YX#>jrdS$@!U<1p8`j#lK z|L1m}XLamxH|eBPFVX`KKd+d{5KHmFpLLqd1>Vxk(IMUB*TFK=!YhpVDe&dht2Oh5 zu{vdRcb#|VA$ll&scuc5rHKZ9#~UyPFi)`U#K6OihZ$fVuBis5*^V1@c83ZFlwNl`{`e9C?DQE+^ZJHotm?47dUqGq0YH zNBQt9I`G1lqJ&+;o*uP1KjwV4?*Sk&4T+Bi{l_43ZSzhJlmMV~_V`c-z4%PPE?a^L z_(liLpl!0!Fi7Ht@sxrw#>86H3E)&QHJnuM1oH~`Q#8VpiKNB^5ApWCyhMF>b}XJ z1({qfPlrkKX99%duUL|l`p=b+F`A#cAfnD(Wd;mhuKRa%N7UIFGF33NLMQyS9M2Iu&pYuZW;a0ZN~ zszNiVv<8!^EYi{kZq?N-zpuBC+(G5}KUI0J?J2-`}|mM_x`o6JK@h7b>2yO?d_LUVWP0g1T!!AHV)B{hu<2s zAs<@IoCxa$v+Bokd#1S7tx4*}>z>hp`%P7^Q(x1N!J7;qmnna6l?E16D6gD4xOx4`WR+fD{({cCZGcXl(M8vN zd5R{*`e{OZs3xV((v;*G#v^oVa;Rn`25V-bK(iBrG&`Q*S&4j0FVHjt%TtrXEbr-> zoI2B(YX)jsEKhSbU7#zT%vYbQj?wIUXN8V1tQd!AVXbAr6GM_R(`L+MHZO@;plH-v zV=LGyQ8~a2K%*f*CKuxVw0Y+3@_L^itiV4uq)pMmySxM{nA+w(5ufUQ(tTz_nTRv~ z6yFR3tno2?nC#`|LQ!AAlmi9_+=n+y|B8Q#GXBGXA@?N;&Iir_`&=ma1|#GIcyf&Y zAX<;#Wo7IBjdi9O%<$a?fri@3 zZwS+Wu;tlc?#Ty~^oj4h{iY4jY3Dd9gT%&ZYhVoSLo*A)nZGrFjHKk`oLP*4faMx} z>|VNS-yO7(H*SU7&Q%3JR7L*JR6gi`R59oes?PhJ5(EBAs|)|C(MPw?Nyi+lwHwz2 zKW}a|wDVXZ>k0W&1r9q9WX~b2%I}WoYzrAvEA{($eXL-FJHbqI9#SR5KVT_>&_$FxzxtwclI>D z9tMQ_4*)PdAu1!BYvhJG;6!Qw%pQ%UOga!E15uf_g}D#&z$pV~>~cEM8P=y)^0SHn zPMAmvPM3Z3;1T8R!PFD0tPl<23wECi=&TgZy*ji4oOq^%;PeedMZj{hXste6c#}^5 z^$uE-_j8pE`jL`@eh|QJm@5}RaD)NIwQ)304Omv+f0O$BK%Wlyt%2n~=$!lm^z=(l z1hAY$F!*a=xuyex0$4`!wMwOz*fy@uKP}S57v8Ib_MfKSr@f)Vf(;rtsKh{Wg$5Ru z+qT5Oa*=`MVin|DK1o@!uunt|n+iNXMm=fn*F*D$~t06pEn@~z3?me;^?60kg6Q&RnPYhs}8sJcS8 zym5|>KBtGS8h1se4WY{_lMSKi+>x&aEK~ncunb`*_$us^HU((Tr7bpu9O&W$uvgy5 zc_*DKIe-Ur1L~NoOawXGPi`xFbeVm&_-zKE0K10BN!xe7Mg*1TWxg)Y?x5^nVfV}U zJ$woM5Wk|zhkia4qdua3-KVkTn01?(1I&s*+XH|iC(p~he4ofVZ&leRK;tshMXr0c zJ`f=Yanw;qg=eM@sIB~lGBU#Gl&!A__2d(esj`9rr?qbe#Wi3VYm9>BFjzLqfMrYK zplXG#b+ByyF*bPH8L(U#!16B*EdNSZ+kJ9`D;n-zKn()32>#ArG$|0fvA2)1QI^CR#ysnSGx(=Z-oT-WpgY zvP_hP^?{MajXmlR>m#BHtk8jDC$j3!4Tt=%L_wp>JZMJi08o#DgA)-BY5DNKTVCfMD&6lt3^4ylUk=$(*Prxf6`b5jk3IRI z_??dsQ4T=VOCI73KilG`&R5*11t7=7)fA{7q2Plp}wfcl=g%s_8U1N$eH zmzOfo4BLKwQiF&d=OtAzFr~r)#(7l+l*r!LSX0~w!&S6lfFVf-@k!pO;%eu{5b?!04> z*(#I8tZjwqVU^a3GC!<@2ME53c~2~RX~f@5nsL?g0G1!zdk2;E%6tsH&75!kxbS;Q z6#SbKg+EZrd~JH*_q1;CFLl#Ve^Q^Ld#Gf?m)5?me+oXpL?BjT0wqh68hyoReYtpX z=+BzL^7f}@upDX3QRh+@Sa#>bygV8lVA;RS#uVuH%a<_$X>ip;n9S8Fld9?{` zkuf;;SQc2uUIF~^fKf~1)&Z5S)3f8w(^+KMeEbs`LND zz^`)_c&-7)8UBxuH^VW1_@-&{xBGgADlcLnH=-3k(SJ0bgNWEJT?DSS~0w zU|gwz2C4@Rih^YW)I*l4U*5wyrspUPKjQ|y`uh6;{Gz(Bpa|O_8^WVi1EZlwvQ)%1 zP9%~lO_u4dR~M+~sJ%7d_PsSPd6p(7dl^vftDBA4j#VFxS8q*FFHJO_tkbseBs(UZ z^W!WZd2b2VusVhT>O_CtR(XjQthi3cUbw%88(6MlUJGKu$inx{kzmTeF7i2f)E zw#qAVfD*5`p}UfG{RRM8xfffeHTb&7?o+e)xJbiUo6K>S@a5z*-M5SBlZU$^1AWDjKgLF62sdP$rNq2WE3`W=J9v#v# z;@j_izwi5F*RE^V{&?z~=RD`!=e{??_aYhJ`}{}{bAxMWlP$mP^A+qe5*tzB@XA#r zDUOD1v^bNk(i!?_CNi1VCp5Dicw_m@0ZDe^cLiCC_e>Dd<7T;(JB9y-gVUrmhhFVD!S8|b+O02O4WSLx-k;)_+gW@>h7POaM3z%pz;Gy zVWFpOjb*VL;1twbBI#aMdxyQ`ICVUIyyLCX@DMJSCe4X?;^64;RX~qlMz)i)%DSVN zgw@WsX8!te{P9iIkQbjG;r&UpFAjjnFM`l@yQ96U#us-aj98CfJ6(nykFv+%WSm+d z1XdG0vqWHnUlpOupd}kD_ijP>t)O~tEc9%M$1n_2-*00zCbq_*4{-lK9vqr$J+$&i z^8;+qtNEa%B0MDBfX>USS2_;16Bu*&rhHq^StP!jMd9Go>NVsS&ll^~I?S@}GP)`Y zsNmfTpnGVIi^qB&kMlCs_pz2c{US%P;q!3u6(#0Tzcc8`cOH=`qe>=)k;dS?W8l7Sm_^!4vlJd>PZo2e@U}%2gYeYaDvy;q9-` zVd#ros;)Fu&#HJHI*9|g;`+C+AZDLc1s!+$g<;@Ub88`kTdPRAJ%DBA$49UONlhd! za?dBS>>k{A>463Etq<~)u^XkBi^@nQuGYrHMu`|m75xa=qP-60m&`ZOzaWsH-QtgOlfTm7Q-ny+Um^j6mi3R@3mUWEenI2t2u z(|PqzBWWE0@FkbW<;Q|w%TQkZ>pUCN>Sa-at%sCPP8#45vGbsSN3Nd)l{NF0bDp%d4WPVI^b43|>3c3;N0wCUKiOj%|vSvZ~ zkZtj8K`uR;+dKVqay-1?BwbsH6x6DuTm3*fpRp4O6I5MOGb6ws>+HGabIc4dLhY!5 z)1`L-y93AUhAs=Oa&kQnA0zac?B;&E7SUVT0E%POE8p(RAfttso<1l~gFGe!hnWb+ zyO_*IS(_5jMz|{GnG zRJxdmN^9?s^S`x0NixOu9AF68?r?|5(70s z*+bsJju#Xcu}Qu6RqB3plZ1D`%F4NYHP`~VJBF;EM8~wj3(~H)BbP}FgKdVrmFtb6 z0k^ynI*jPTg3|Uck$jVCQxSQjzz4hfFG{oynwj7$jZ0MwU zOd@sK)Suel@ve91eGvygMt4{verng9NMfb`|p=Sob)c95V4R4HY-QX5?h! zfb%W=ehGFfc1gWl24_4;>kysmeV$9r33lem2F@!QM}LJ-KS^PkJ#bPKp%4a8viqh9 zOVgo8GBw7<)6XN>g2K6PDBRRC+!r8mLn3Z}l)}fkSY7)!7)%)YDY0T4ghhZ|l8RaMT$m&{!e|84d*Oh|s*ZPSmwZSWqvKD*Dm*Y{Ja z*{3$N#}Y1iI8Gf^=QVj<%IKLo_zj^Q_ne;?2XanbjV%?>DY;J5KZsv0N~pk1;_<{>*o^ z4G;b7*rJPYgMdDl{pc3Mq|(rC#x=}LFaSZqF3|4!_gO23bsltFpGxX1N4;ZIXg!3k z=ZbU@s&&-B-6E-X3yDgB^m?6{W%`Q$O;DY&91_snSl@u8wxGQ|k6mIib^7Pg-z0Vz z@DO%F9jcgUk7-QEz=G(ylov{{uNcNB4#PFmbZ zLL(?KC8(Q4MGw_V&UyL~Ss8vk8}#h&XNHW|nQ-V(*P0OVuq*qV9HfcADuV75p(Uvu zi``!BqUl6akt2}}{5Cb3&gVOv6duvcse}!7KEiKunIkPxP6x{xb4jP^|8bOVYfl%J zqd2)u5D%%ulI_1rpjd6_#s0I}b&}EbUQ5D_%Z^@qcq(8JR|~aC9=UY9?Xg!yRaEz{ za4Vaq^8N_|6tchmOoN^MI&ubgNi!PPJSUdnC?_;8Xt!2zxuJ!(I62%u7zh51I)!2~ z;w7{Ds&KwUkx*A~ zS4>e8SLyIH3UNRQ{LaN17QDSJCPJJXswVLQFJ zbs9j3JVLyiUH~fcOrxU8$*#;plkS)_S8wuaq6lAc`e63ua3~RJ?Wt4_1wKDziDva$ zUm;l*$r?|D^z4n{8u)Z1l*m|+OXcjFnZ;3ytn)OXg!5p&wE3RyBsZyK#&UQbyh`E; z*i|$x@x)>lyI~MN7Vy#yh-t%7B}Xz#8`zKTUHh5Uz6I2$nnivXZ|H}N|B=8K<@M8A zo>;@Ky+<~1ilv~q{sI9b(tn25E*+g{M&V~%91H3*Yesd4YkB|jkCMiL)G5cb$pL*+ zi8{}2awCT1I&*BFCI1`#Xk#J}A3F)ezYa?0*LuF{Ig1*^kHkey2-h z!^UKJ757@<+5pVAijcv%&iHokTbv*G9g*MfI&k26RYCYPq0`_JKq-J>o znuJ{v*J*P1SZKsxk~h|Cw;_EJm_JqDBsWGF0jJhQ48EVD3$y(MV05V`OpqO`QqZL{ z@y0_^BQzkF$9cD=I;*_1oWNc4S7a1M`x8kA>-a2ONvpW&$vo~`_e-Jv;1J2z$wZ%} zcO9!E=Ow%)eP}Ps0tcU5wQUuU8%yd5YL8gcM=SCI`t#kOjacT}#7Xqc$}~1-+=`k55I*S+DgI@UQ*92KpAMbmPa9pL^#=#JS)7 zgME+eG(xS^*Bw7qIJ5FjSRdLh&+WJ`^hxSV~gZVw~1TWfHjyHBE5YfyPTFf!OQF;o@@dmnv^XBvu3 zo(_N7v@-n`vqkzv?~8ZTR+3)!oGgd(L%b31H@Qr`hfUQ4pVYM8 zrMPZG0=&0kxSt^zQb^o@G6A@T&_1Qpy7>{QP^ZN#HlTEYJH{Ukrl6W;-wH`RfzRKesouClX;6URLn`dO52!1=%th2J{$D;!M)-%t+4Ud3x%6BB2)sReQ^Q|pfY1gS=m62PX) zj<^$4^Z`H59h9_630TW`^@HamD#pfJk`gQn=~$C>N`E>61nemgGHi@sZf}hA&1DoH zdlq&<2%eI^UyT~UYSz(P`RLNlM@y9*gDgh_CZaH&xdaotcpYqr2=#LvxZepaI{XUe z1xp)CVYRJ01s~OzAkJoBl{DW*xivfLlz9g~G;?wbwXz!`glb|(vxd)TSSa2*T_p#s zQFy3iiL3p|S0X-pE$E$Yp+VI>!c{MR^2*}A|JG~fXG{Kq;`wRuW1c)3a`bmKi;;h` zFl?a#{1{v^i1IJN#q7s^5VaoyI8S#So2mU_yu*iI8L7Ux`-BX9kU*EJUO?mS|EAbn zco|CTexDj?If~f07$;LCPA=uGB3J*lVuI%ciU}zn2#86x1`%m88@T7auT(Xukvwt! zdfe8C4)yIDqrjF0x0mjpC9o=0y0hg$Zlw`CXK`55_7B-Oz{IsDTl8e+lw$}nM}6Uj zx^7pUnEpzDPXVD~hi-p{*Ut(n0p%=q-EZHF^|}kjb`yW*WDwMS?1$ML7&H%o0AydS z&ZpKrd5z~C_IPYK}=$OQ@O+tw$|Z=CyJ};`q3+Z%D?&QTp@rz?WSVc0Fx} zwJ!RvFO-k4YrKK|n@Dgc))kO*z4UJQtIDGbfx9Twaa|pH_pkTm6txDR>Z+(b>5y9q zqJ1Tw4mUmhCvr~1&SD4r=MT{sOjwL+0-3(Rr%o4|X{*MJXtidKM#&mWzMarX@>!k} z=f8b#m8#o<|RYw9$$+@ED{hg+YH-<3!j;2Ik ze9${}gPg7o4SZkq#|rApXg5w4woIZU%B?kyVjD?9B6*IVmw5@@aaSJ@(7c#U4`amq$|t-0t8Rd5ZqL~w>8w2$8^vdTBu`l-sW7) zQdYEgy5JS&kFy*?{cef)U?RfSU}e0U-ocBdB1O7#504Q%`Li>+&6pd6<=Y=2~N z|3}+UA$?1qmEJ+@sZP?!jEHr(7=0}bqbzRJVz=WC02W`BCm){R_9(uTvZCsQf1Q(v z^H4s6d@N+f_O%|lg}#QP8vn)3+-Za+PwI5d53cY5+5`Q!j)S6~5Q0((w_qE+56Z}& zP}NX>tlUw!rj1)e)QI4AJ7-qVLzcjVq<6f-qSamt(=QF5$ zqX0~DGRIeeY&%vC4hb_n2E8ae&%M!T+MgeB*uG+nBikf3?rFWwx1oaHP=U1y4(5ndzUsaLfK75oab8GqZbvBG zPErV?-PO`gf_c;*K6M0K;c|SYnomD6-bx*Sm$f)xLHAr&iAv`DD%UoIK&#i%v)+t8g!-Y!=ONrwYPE`#QMKK?+XhFy&O&NG0gGp*Fn9z+U-yUg z=J&qJ30I7qYgIeMQJkQ(XV4N+v+spdox9!D5t-Xre{ip#J!B*g-+pEOC2c2^&hD^@ zWAYg*4K$sIpkoBuH9jGE8;D`?elw3(-bpWY(uksM7YIGVH?OyN44s9qrW zYS5WPr$A?*lA)!G7n5ArX-%ZXN$sn?ky8vSjb`3xL2b=Iw;$Q!BzR=_qRPlzku zXHOb|RZ3M#CdI}gJOI*IC-H%F()^c(#({HJBf)0}o|KtsLg-g)Cc|xgM<7xM8L>x| zQ3K+yG#m#asl$a`lQ2Z{v@^SfsgJ1*C)$7pOkmn+KM(y{(&jcfFzuy3G0k9?y4hWi z4tVmT8)+B!!xTGzmnCJ1R~}yypU2~f1F7%Oh{x)mmEE(um6CXu1Wj7@N8upB8zw6! z?0c&w)5B5D!l(=AVbiy4j2#+K)#z;k|J#S8qeFyDUX)F_yE-mnLUBc9Xiz5Q3)7Yi znYjXnpR&n}2L_xzdSg7*r+V=>u1$JY9G|B9pC8X3klPNCtv75LQ)hS?UWU)086gBq2+<%DEXK<6x2Cu6S+tu5yTB1 zzGl827FfY?mC^=rPU0;>WAMd3LhP{S8v421KLxt)|6L$0C_m{=QzQz=Mc72%`6$H8 zld`yRzQme+^+ovoG-5zd=- z+z)d7XZ&yjOtG-&Tv1O0{|1G$=v#o-6ZfUZUmqb87=xHJ{}^z@7_kj9S#HkkGoVy0 zPk*e}?gEK9zff}1V)?+3|9rZ{87yF-97b8&fz64#j+ll`lq62$?>BFq9Xqu8k;tYN)Abad3xv5BQ67#x;8mX`KlJ9d?l0d%tR%bp1 z4$=>mr-}y^7o`y1l$e=k{wFyzi>0N%TAa@ry&sU@&SZy64S7MDkzS~s#}^twpRPuJ z_6_A8OC~!^3A&QkJH2L=&gd8&IQztFA&7>@J9XL*E1oGFOiR z`Jv!#vQO-H9cX7)7$$uu!-D-FZI^K_ArHPh*0O(Kx;<$2R8chr3Ih)cUOBCT7>z(b zl#w7AS^2kdFEj}T)5?`VtU$cg8*+_3zVhwkhFG14`+O>8Q8Faj^J7vCqDF08P$>};`Yx|-vB*6jQ4 zos>Hmc{D;=KLoJ1@TboYwz6i{7kGc|(jjMj6XZ-4DMO;6a5XW!SIIRXp8A@sfTX(C z#cFykwQA2g(&xY$w*$!=*=`mOS-OsLiKfrRMgS6e0X3ZnGVd!=7VZ3c>O9o7b5*t}i%O@8X;j!u+gNOkj5 z$A6-xidi_k2$#De3dFslM@=ET6f@`o4YN{XMTP1y!S|VnKCoA^B)4pM5O?;xphWkf zL}I;-N$3EikjM8N#DP2^4I*@t@2&ypY6zAghcFRsG(UHq5S(jS z<8^ZFWHT}L5rRJsD}zE4Btv6ZFEPwS?LpMt%S@AkM)_OmPc-e{we57=zgkkS&YNFS&2K{JcBDOr>7U zkZw)W5MXTnU`mR@N{J>FuR@Op8)Z_>VtrMb{B6`Tst(KMu8*u&)@O z65CffvXtMJ8mTGt>`inzs?Gy=2ndX&1nn9=nymfJjm=l3e{AqyN>m47WDd~fl< zQ>t;M!V%?BBZeI`T6MBMk7ze9T3thFdZswJ&0!{>{*-VA5)-=jIQagD?yrVAPFLcL zsZH7U!!ydNm!DL%)Y1JbZQjwKQOM`ul`*|-(K+o&gigU+e$xKT`WY{eLx<`6k;%Hv zlvEv29Uh}?E4}rv!^{-L7FN=hd#AE48^YT==~6(x^&lEjVc)Xl`*oW$Z^=c6Ahj#O zzyEj;;;CW>J^FFgTL8}!f9?nh0|76q?s(>dh#fY&kI80X?S|U6W=g9)kV67fFcu5t zD%Q0|#16MzLficpdXx^<_J?>ZrH*4KHotTjpB3$fdMMt8z)8xH>~r>2={c;|t)nJ` zPh~xOHvj5#sj|L^isf0rpOR9#r_O>htfoEmVDPNs-H%;bY&_(>uk-C9^9f_~0YLlQ zZ^=OmWsf7g7`a)CX*K`CJBELv;r8q-+Lf|L-K&%&XhtHU+b3QxxdDE<^bN4xnhB28 zT3C45ImWd~CSm7bd%N}EzYX-Az7r2#1uF*LL3VK30j}-~A?dIH$T%DL5&}7FY0 zjy#1$jmmBVK zm!^Xs?Ktds{pm@B@s4AHL(JXBPbGlSunZQdLW-*QxtQ5>0RxB`K?QOGr!o7WA?PL_ zMZe%DF$N1s(dr>^cK^89z|SVCRYK{{+j3ajvb;IkwCjGd@FRkpraPT0P{n>Sa7Hs`e43Hd+?hA#WAV+x9qGA zt~@O@u{~oYvtydg`Cp66r9B&{h zb(*>B$nIW0#O>O0+MWC>_cQlm)E)t*pHyG#-?3smGk$+7OXjF62{#WZduZEvnv6>-6rtsYmTEEQ!BfvAsPee60p7 zd?yC=e8*CkAIrbrK8SB0q8Kt<*K?Rlm#y`JW^3y8Svn{FDJ6))L2<_sX_Zsb@Kkhr zw-oxBOB(*a&s^l#SQ%F>z9)m^258Z+2tc3CAB#(liV{95g5K{c-u6;Gyv&7>KOWlo zVxMK?b$UIO5{_ncpJTUU|HFru7@HFHQs^co%H7b}2O#W&j1~$I^vI!@n(z9)sT7G7g=1&I25(X=x z6@r#U(ORigFoGN!$G+MRiyT^ZnQxc2KInw!U3qM~JN&WU<#d?ciO%wsqD&VV$=rDh zd<_X&6N(Z!g;hl{vm}gt#!$OkhHZHK82hYJxjIZ79mCm0DX<;Kx$yZfFj0cJl*Eby zw8iRgLDF@MYYqRl^(aqevVXA#AGKT_MpNDs;;Uqh_)e^{cTOO&?v(^6Pt2CwV0L_a zt1A{$Yrc~ys7GA}m)p{)gBfwUpsZp~Dqkh4GI?_&&3ePerZA(K;`fux+$T6Ipyu^~ zCPc{jE9E?UF`UWY3wx{;M#>SmVzZ6{0$H+ZPkC8#P3q`beYrV$-B^&lu&N zgNk;>?DnTf3g0+A?|agU4Ft!7z{Z4?ga z*e2T>9`kPwr;fuPd$s|PXrZm-mpWbFUs(j*+*o3bcis%!ou6eriujpyF|51bqhX>1a-jWd`GVN08XzR`GTKfm3+Lek|JoPw613<*(Glh; zjWpT^p52D*8?1a68x(EE@8|3Xm;&feS5dKVR(^0ijpwF#+4sGtWL5%<6vjcr@|-Q;b7Q=vdm7>J%3cGI8?AiVR)erP7cOvm&;4z(0W9L;DYa zoDyUL+2lUO9A1rIBn&$O2a++**NXjoNfhGCCU-ip_N$hBDvnz3D_ah3OKrABT)nSm zI#r`ZeF_6zQGrqOC%#jt=*Jww$6MvYhO?|X-<56;&n46G@HL-+z#`7M66?Y;4FNs( zoJ97AA?Nu!e|@7bJQ@`ak}?0A&Xx=_dzHI^VLU-F9^=3-NaaVB z{ep9w%0X~EhUTdMzJ0?_hn|rcF@vtFLMj}#H?B65Z~6dUU8LhCV1-S(iSD=k&vrJa z-&P*CIh~_B>_(5dTM19O+v$pC4D&@rmc%f^O;bN?6A4 zUu;o*x^0j7>#~bxJ&WR1KlP*`8-?G`UU_~6>1!)L0`QEb_;clV;y-mrXK4CFDZnq@ zB!nBmTmVY^Iu;f#0VbKvB_g~;nbvt3T~eC0FT^yFpbR4u8EcIa)k;VSVtb_s-6@bQ z^iz}tg zquy^6bi%BX$Xrgu+FM;xKhuHBYt=qr?WajrPPbs4-OMeboT7X7_t%e158F7?(MQQ7 z-TR2sAl9h?@2#CFJw+|Ehq@O*4-!eyJ|8Bx+lvbIAHKk65`*f~Qbhfa4fLGTKe4?! zQ=&1CPopE!CKieuBh%ZqGDxY!#~4U%VS?JAMAV1kwFsC4;pIkEW)F^so-L0*=Scas zopC!)G%i|l(>(NM6{IsJzZU9D$@f->DyYkg>N*{hRVFQaeJw?>sn^fpHYM+P@$IXa z{6H&BrpH@cWJaajtqD}d+U^^q++OiNZ)OvpW#`89q%YN8}=X=Jy*#2t(@|KWckfr#aF}hdjoZ>YC{HWj-WirPbcL#Ur+Ec zsoZ3PSr>^k+gaxeQ5Xmb@6AJsZ-AbQm%DmFE8&jUe!q5^CG}IZ`m-sieh%SmV&rx3 zl6vDR-7zY?z1rwF@I*hZw}WTV2+N^NP&2zAD1>|IiM~`j9Yc%pEp|)(<2oDWXwQ@& zh{~sYpWxJ!wlPVWDs~io&Z2i}9S^R)QTLENxn(Zc9#hAN!Nz%=r|!Gao%U(j>szTF z!?LtQ{Pyl*vu&02ZbDiBez&qs&18Ni!-j(#c01X%=~|+)-nK-KZ`{4Vr(WTk*L00+Fdfz#B+kJd4K2 zPxBb(canz5w_;PVYziU^LO#lW&YA;h_ae%Ml8oMik}eh`Vc{EC&&~*5>Njj0U=&Ke z3>k9k2PtFWIxH`w+3Uf=Ha=GFOd%t{_M4@{%c)^i7{;{oA!x=Jv9J&Uz<_YF-LElx zK(u%!e6L~f&K-OjB-un77lYy3lSVKPQMM)~=ZP`(!@Lfk?-KY73)4%P3@xYSuz5j| zXEne0U;q8Qz{BJ|m3v-;Od5)QFN=Gez-C~9%O}CZG&@@1L=_!VUw&M+3(IxwhuDy7 z=PzUAqoIO?=d!KqnyFfq@!KuuMthw#LtT3^`|8l^Pg%a#)o*?8iW7ZL@@L9*%1?7& z<$nXwHvNA7C;u65b9p+8l*_RVfi}Z!^kLi#PGTbzy<)7=7>05Sgsj32^5=RZEBuZ^ z4y#ICH#YA!2al5NU$ZxEhwil(Gcp7JaAiNc(P`v#6sjIQlbj??W8`2i6xL3fjGi-% z+plK|ag1ST)f=aw5RCAty})x=RPo4XHHOV3?Gto``Z{RlaW|*e@3wG-)YQ5>Z7!>V z%G!W!UU+}dd%I9Xen3anBKffqqd}=e{-Lkn;523uD-G74jd|aKH!v#H#KhE!XJIs3 zglJt5uRG-9Q?hL+cT6veVp1|$6*b(>C5QCz(YHF$5lUqb*dTS7N`Q@T_WtY7WJgai zBrgP9e)u%eK~UR?`!~`ftB*c2`eP#7XyfOP&xCf(+bYs?xo0kM<}MJgCD`24nZ!rtz-rhfhFj4}`+dQ4p*A*?vqq)9qK90$c>$(UxJp`j=GL7&oFsv6 z@VAu9b6>*OY*6jOmyp5eJoL{8j)Kk5$O0j6!W!Fh5$9d;;_`v{*OE-}9si9hE7&X; zJ*o|59*rnob~GHJfk>kwvT5e#@yWe@3}18iUOB**iy*hEjw(RQtQpL7V8&|X(#2i@UDj$*qJxs>x5~fU$ts-9is`A0DrUG zxT7fU&7F=iT$RcMzH=u(n4-(yuQxi^60vn*G~%ngiA2yd+{wql>-dCncjvZKQymlj zj-Kg^TR zw;>`PR1LVzibfMNnOwq$3t|-lW(=2Bafr!#oy(iP-1*Irn!;vl`*;yWBV`+8Q^ec> zIO6N2gHas()%&R3cX#N2{WrhT$h6cNxUubv43yi(s$q;gMD<>p#<_K%4HTz$@Q*1sdG* zKNiJL=X&ZLQA}fya=+ui+i7PQL5$VQpL(=;lP4(=wq=2{{=nM*5qNg0%b%3McCei; zxV=rLtq{VUJMtHPeqTgBezt-s1xIrnyk2UF7#Vkxm(p{M*Lh2v7K!&E*IiT}ZAf!p zc-dN9F3k)&nb6bxct}8ttJ{LxYMr@~;v_Gwr`J%C8^MbAJDmo)q9Uouu757boD~Ou zi!7iWbQH=%#lZJB`!kca{n7#$$qGb_{~0As4`g+ty?<&zZUa$5{@o(q0n5>wbp2^F@cExzKA;tlp!{?u( zG7FhtE*sjLA%i5|poWg)KQ8i8^#ePbj#cGsS^M?Xp*2jCObejd?_?v1JRXa$H<8ul z@^6#95gFTSvuC_d-J6w2#^@Xc<3QC?{G$T=;P7HnQPE(tYzDW$wBXf*EG#I;Bab#@+Xrk^N;0}=FjD8C}TzytcM!f9zA zD8v8X-zefDbfCZRBrzl7u4R7q%#_M#$Nn55FQw$3%iYauK0BFrvsysQkyb7oRz%KD zw>=A%nrvz)eufpgaaxlXL0oAsz0;=|c!1L2$8 z(n!~o&u9B&X>D>V(h841(PcD#=x8-G7z$h{pdNH^Pmf_Kkx1gvzLDd`*3N1rr_ zw4W0!s8l5Rw55LcmAd+O{(E^fdmz-sMjPOy9J9|jm>Jc!!wS=h>vQ^Y{M*hw6U>O} zczNab|C}MQ`BaS4Q}}qDIUW5{WjMFH!6nV9Nud;z$7A2SB;bu_{S8ghuu1gb0{X00kR|zhBg*%=n6vEC!g9eU zr@9}{_X23bTW_nBjxqpYA4OXx00h4ksIkwyo$;% zkwVfY_8;-A0p5-{v0MF_Gp{8zm2PS--iSuMvUtFWl#hQi{f66Jw0G_lOaDJ0~@1{&LPjM_R9wV>>TuxtS@nMq-06 zY!Is&Nsc>~^`1HJ80BE}%A`r>i)%AP=BkDIMbFGx%+cuFtYovofixYqwQjVv?h1Qh zA>Y$xR@jb98=t%2_U(mJhmEx(iH;d;tp?o8`r845BKdDQop0LiirRixUod9Cce!u* z?NAWY==4D1ibRM_l1=fkkPSQrfR3X~si?S#tZ1>8yT;u?sxk+ZI@!`$9#s-w2(ZYZSo*$TC?`{i8g7j zX>nq&*0074Irgq*qZnR4AwyS7KT6Q79mY{2$DPXecla%ldm?GM9`>|Q$tCm!(3k&T zSLr{r^FY2xT+*P4%DZyvEmTTMNU%U_7;AOmA_$8Ge4ZKXJ%r$(dyqYnVvRp zV7TFFk|^wc`{s?sbcw1KS|K9l`%;UGxEh!;>5b`%$tLChZ18hsA1SGy{5JEy`K)Fz zNn#UP!oifYCa&&j0pyHI>?5U3O>W`r)ff%G(d0jG5^9T$U3A6SS@`|DcHX3nb9r2N z#lUA(99uFxQVxvb>S*lLVQ`1Kjql$4@1@{Fi7seK7;!yk9ShN5p!qf$fFwkLsmzYt zC@pgG0^B;ce=FU*u&PQcpxw;VfnD@gH?o|EM*IuHB@56Kg>H@_UP}taQzXQlo~SNk zW$QQ02I40#;-zXS4E_`<@G=&!RMMQ2E=<3&^6so=()u31+hPJ$dZRwQ<@lz2xd<1I zAk{|cH-4`E6(;wGgdh}b^g`3}eR1NZ4Lw$;w&08OZZ1$*DRZexUGt~?Aq9bomF${d zUsbh9{pKi{MFjeMo{-xD+s!1 zk=$mdZOgr>;#5J0+yc3jTp_2eot$9G7u!i3`jms`s5R=S=ke}tVb)B*Q*2%|nSLY{ z6au>+;u+n!KL6Y_eyAX8@RM`CJg6N7wWjmi zXjLii`JxH&J?>8WFD@7Cg2j3LT8igIHj!U~cj7Vnf4!FtDF3>`V>R+GKq4zLR2Jp4eU7u`rek~y%S#{?5kK#`oc zIPXr3VU78qS&}=bSsK7rGiB6|Xa$egdsO;=FXYARp4$=mL{vb~qCV|csRJI5Mq0c_ zYVyr{Ao=#Kk4wVdnR=*xp4-z5{CZoYmTG*wnV6Gg`N6OFgto&!@&>&uk}(_8Gl)NB zD_rdC%rjy6@bfj#PXc{|9?;j#F|@h0yoTPYzi5hR8$2!6afbD6g&-2FqSIMwA3 z3`~cirM2`UiMc+Y6-cI-3e#V8Q5w9qe+oMd30#4;rrR(aiD%f`fwQ@Rd*L>#4viH} z>rXCrCzWq*3isA!6%Zy#8E+csq%(_iBv7fgic=(JuPrajif?y%zpJQe8PlOs@g}8= z1ZWEpzDwt-KCsH@fLHy1yvDE? zz^5G*-K<&a*9k0IBMo2ADQ8)M@4=tIe;@8qSnkDFcXxMPvrqWFCO$L#yrmLyGzN_L z38&WpV-IQ4l+S%S@UIQTuKxAn2VYJUDrQl$IMQrX8TP7t`SQ|O)7F@+f%W~5 zn_{;KuWz|>Ec~pKfr`tO;T1yq47dlygjke$0ktTruHAON>qQYUPoenV(R z&r<7m1lpEMf%qbvvwzU4Y`q4U+WEHGL8#&g$m8cizN8vMm+<)A`jV2bCxecvM0PW$ z_{#_iW%~Vt<@Ra26(DaB>VbKuq4Tu$u#g5tSw@4R$X(XG`g+`cIbGkYfZ+MQn7=-4 z70=t5Dx<0Y?J*{KIhBM|n{ZmnAt+bd>^DP5x@Kr^)L7u0mi445oBNr~lGDDkF0Xw| z)QS}vR(R|KZtm{@+dKlNx3dFXdh|T^e;j%4pA#z1L?%T|33GH74eujLT1tA3hVRQF z%6cZAQMgXZyc;f@>qJwxU87@fI^4zo4KqGIuR1aMxZn%}ASV@}y6xp$Xyp|V!GC0S zZCsLOq4b8hgaO~dB*qxLG*ohhlFlTWp^GQ1&L5mh1QzWj0N;7#HjUwDwLd!*3WS;2ZBBc- zb*E!81_jABhm7G$8 zbk36Nf;^j6-7^a`J*9r{TTXdt=YERsKRn%*&VruYP$OI<1}d*wuGlD+(N_;u7g+2p zf@kEJLK2uE^+)Z~e@2Cki;nQbTeB}e%iGWi+njQ0!Yik_CMXIwHo;0q0V{%h@-5(8 za+`@TMsA^H^OtPT0%o+&6aH$=1ESS_cVm+(Y0_B6q;a@^5foig%|(1%$X>tz{DP5F zr-1Wqzc0I+9o9`M7*cu8dS5L8J;4hNHVdG3ZgX1F;d_Hjs@z3$O(h{qx=fz=bulQWb+ZiG3_O#S-(fmZR<}pN-sErJ- zpFRc!hL%svH&p+wI^SNO`XUG9pdG=uvsvguQ=DsWbuGz=P{oTOLn_q+dpaz9aIY0N zrNd`4QAo#p8M;i;n8P-wqOP=WM4Qr3In~xT*ER`(-J6ac5Jz~sdIz$ggB2ZCtA0Wdv-_u28hMu^}aM~mHEEWb=-*L#83yoIRBm#>0*PCwMP|A z*664vvV&YcoGshscNb@PJ3xE79OXChW#MoB5e|GcLffL1HpQ-y_r|5>P2D^+^+!Tn zw!Zo!y%eiR4u4GuI?f|8*`P+ zo23$tc=H)4h2KOP@>3=y59S{*sKr~4+;ywdRQ$_TD-0P6jc4U3-2)9UR#P#KJBa|4 zp{`VX-Tfs33~!}=8RrWv_aZ&kJ`_j=6Ka27(XF)_d*M+nES+?JxK8p9O^mxVpc3QQ zX0U;DH{4VJysNPsAzWjib$PnwMm`(t5vjm@--&~b4SzY*vRg$Jd@M+xM5|`OA`#xO z0&V9W%*nSqN$2KFR3f$Q3_4fLuR>j=k|27r@mkLJt;%$G`lx>DGpg1+Q&z6mQ>da; zA)vPnwQ1NjrOXAv016xFaHZbIKXRz{ z4*tKp~Jlf4_pD*k|Q9qdVweV$o zf~EOf6bQWixWyu{S3mTox0kQnlmSs&vJxfCG4W>kKX&nZV6%^Z_b?4adW*d6GeMw) z+cOL&eg@F@Nj3dT^N)tLu$`C3#}QA?Lk%B~N(tb91NLn`LVg!U$Re@b4@G5M36cwL zLAt>6iTm}bWx@?#gTA@%E6sz10NVh!Rlu`l_~&}mNe3@gKGCvXl}`EEbC@S$R=?sj zHgHXofUS9-Uh3bUk=p|6vZqvSZNpwB{to(HQB3NY<)Qs(MU7j& zH=+~GlMk@!mR7pQB8nwH#N#xP6=_Q_y&PI$`3)tC+}M@jF|4DAxo4%DS#(mR#r1RT z;UQ@cn4fgU$ddM3WB)?htNfg37!-dQ&~rh%=xGwo$>b8`J z@B4tEXCWHqS%Pl8sx{XttGXpXo{tBWd)Z2!x6~C~!{%ltql9;hPRpP>W4EZSIUmes z_R2YWOHygf{(Nw{`&;%X^SGAAGYlc8i<|-&{f{iB`#+_mga6HJvJ*apeCee7_P#)g z7yJ47GJVBk#hJ=8wC}3k zq3PDez;)=z^CA{|+VzJL_Y)Lu82ubzo@rt1QEK0VIl5;Gz&;bM7ugct?ItQlV0}C< z8`F5bww>71dE{tYucedarF8_6$1d=x4pHgtAJQ)@`FkJecN?G-1%VcYev7Ye);Rqh zB8iZXjFXjmB#4oOJ%lkIUS7$1;zm9tzZ{*n{q_0$e#F*1n?Gjf+40p#ecx5c&7uc4 zXM(^Zt}&h6C{MpXq0B!q;N65P=15OSDP9=)j0q(SLc81#7|HqF`(jdFaxIs-F&%NJ zK>Tx^19v=gahdM(R*z}Qx_iWoVB$c+X3U&>A(p?CVv~gSq>AbLfl_ov>OHQpVlVaD zg08vV-$PQl&6t>EeIfYxckF77OdN01SRN)G46+zEG4xUsz>OnyPoHc_c{FaudlN?W z9?-=$XaUSl`qiI%KRJys9HZ{pjPpUr`oI-Lb4(H8Lx9v^LTZZjl@+b#{nz34_SKG& zRFw=BVw508yM(Kip$_Iu@25AC@y+|qIR8~v2FSIfL-!Jhp8;vdcP4OIm*!9AcSH5y#s2*FG6E&Xs_hw_c3a>z8eVSj);8=ULoz zSHwAI_@2z)=~qI6{-Y#OG1*d6e7;@0y>IXwQ&aNP0A;fV^V(VPIUipzfNtiOQ@eKEK{i9* zs^!(K$!Vk@RoU)$m)g%N#m>I`NdE9!!X)Y}Oy#N?=U7nub1Y2Hd?MaxRVqLU|J!=d zOv9uqS@54^zS{Si0ANzCFno6xDNG$3Na7C^kG~#Gk>mvkvRFzI&_bjOI$Jz62msk4 zP{~y%p;&4+k6FkoQ2r0FP9vd{_^+s_B%(>Dc!cU$)FW~ocNh7Ed$Dcf!actW*QrLd zG&G8{|Kxd|9Bonf82E|a%)HjNXuT>@J21 zEkct#m^$rQI1O^OPvh3b4bgv;4<>3qknRN8R*W|}wosdeY4AMxuEvZ?c0QJ9{M`o75`-x1L-@> z3ed@;kJ6d=+hY%*xejB`?J1?*H;LEDs8O8o%yt;cat`ddX6Ucipd7*tk3|Dtc;ukW zjRP~^(d6qGcg~Y!Zn{dt&Z>lQvH@%+`Uox3W1eL2VwDLmtaNN=J0D-0@JT3U{ItF3 zi)Pth?FLb|@ZnUaY>vjJh8LyH67K4e(-VINc=L|&D91CuJBKb(Xf0^PJq7Vq1r@w{ z#K&&!FXWc7o@7+~K23UOOtHbH10%3AUj=fVovArpm*LcHd={@q8TJ(Ad|UH=WP;d{ z*hh(*fAg##W}FP9sSl54Ah1}vO~J5SUvTVF{*^I959F{_49taYm|W>LUY;F0tdP12tf~#Y?wwu*olV|~qILo$2`9F1&nB5bNzbVXoazs9AFUJ3YL7Vx*)CyBRr)w&rbuJ^fb>9sH@=zxq%`s8kd+IpYV3@GQ zk6JY^uP8!^spnn?dC`P(%A7PlUtXMv=#n1PHE=*r1VshTX&48FlmY?WL&les-z_Tj zO)vg0V?`F+-t)2<&xD2%$%_nkXIcFH84_4?M!49ZlJ)a+75D}3-9;tXX(g-E{P6hp z2keh71+?OO3cT0$1A`>4m6pESl)fnB3DrABS5=RkuCCRwEn_yga5LKy94lghYjYvZ z{&_A5T5M?3zsbdV-Grkn$_C}%!kW~{nZJqj_#g5PJYKTtQRqmvx;_-_LO0BKoE6OZ zSWt|-Z5@g_(9qek_q?4<ky zVAG}iQo?aZWPt?a9#=N@Xc&A5@~RDLUQ`i+6LA&XG`p zw-5O8WkK%ENq^+rG?*~ zy#4-G&F_N#;EIl7;k#+n7!Pz!w|;el{Q)iBu_oS=?Ng=M#@_AKio?cz zoYeOKDM}mnTkEjTfpYfTqN&d1vs<#;(Cv|)g7Au@#Q10t^9L=M_+8N2kqUQlkPkLyG9a7n`VN*;cSHcn9U?%g~_^pvxoO4x#0sn1oj?X~je+%$`QEW7ZjlG5 z+y0`OwV%EjR_f^1UXPTDOIzC-|KdHQDMkg=R<5%tYAD^Eq()Hy_Vdk3l;rBR>FV~3 z0gGlf)2ds9Ua!Z-8uL`Cb@g=h;#vZqvSW&?J2Sx5=V-las^Uxg^Qn1~>#ewrj7e13 z5dBj_bNmxFJ}-sCdSDz|#ndLN45juR_k;%yoPPIDl!~1DCrZ5>5Y)jWl` z6!k^viz)P(<*>)bFl?7vNc>AwxKg-}^k46-5ms4485#3D?-}!w=-xmQQ%^`N)bImJ zK}9G1L(WPB9--OGrynTjzFMAGN=S{8YeuQ&0{Q>TbmWgsv4~YrR^{gFfR-po32Bh%D3NI^QCO9iqGqWcVv|F;MpQ~Y zqg*M%)pf5b3CPxGm)EJhqCCK*Lufqz|OTidbR8W{>XE z1s6sHQbUQ8eW0W`J4u*o+{8~qIatyc%CdjdBX;-J`}2Kmmln^KnxU`F9CT1QyD*}> zLe}ksLTcBD7Q8R>4kl1B$oGkc5o_1cFYHeE01zAZbn04xK0oAT6!*Zb{xg9~Gcv-|R6_GeY4YpM1n z48`A`Geq-vE{o85;+86&;v?R$3Q*!e%X@upK zwcoIOtR6+{WXchdqq*7{0qY{5{`;v3!_y}d;);r=ley}Sin6EUQkcwiszU3d@2M(o zi4Lr-`sbxhA984^$`?s#i@h>3ioR_pFxhq+!s(|Y#l)bW?vpIynRv};oF$B zbn-F#)=+MLPV)_@!)E%!q&=pjzunue!l8J3PUj(LaEs8bybQRmSs9=X8n7X-+AB}6 zKb!g%=(*k3>1FfFp~-f5jnw+++qp&t7gy31s=1>_hHP#;3D=+0Aa5_Px5a;5z*1c2 zy3&la8IKD)M&+ay@|y^6@KUHunHJ?A?w z(@A5Yi4%A;)iiIAG}QT^utHqsKd9ONbNh?2mwwMjPVG|K@U`)HN69By(gd>nifNw$ z-%Qq960o)?MZ;h^(+f_iG`=_9_G}qN+rRAOGs(qW=@F9{L-dy6n6R*+DgAvoCMv;H~ZPnF2*ANF(M6Yy}KUA`_eFryvSQoo`_d@a->;@Gg3J--?@7Q z?c-|eQfZ+{XuEHGe88P@{`(CZuhQ(Kph zhbMj-xJ`Xq&@DnG0Dr&Oi(gz2XH;3yEYn!%o&mVnD1-WubFAjZeE#NfLtl8E9vM5Z zk{c^FY?f*V`)G{S2QTu_LECHv3|xC#J^y6PvalH0`g{pkTAqCw?@9(%&n5pOuQdw; zFj{1}_PMmox%)3(>@3xJZY*d_wuXN*IMW>WuW;j|oB!$WB9Gax4-feL0=(|7Rg8R# z;csGHm>buvi|2ETYpera*N0)SiIlQ;xht)y^|rPK&f{aA`;$Ey87#Q5vfiM8Fq7a( zi)e2X?Tk_L9O)e_qY*`-IM1qQpPHPza-Z@1OzB&74)^=DIf~z}x9GM8L+}`g#7W6xlT0D>Dnhq2BWPlm z!B!a@@3P`g3je!bgk03F6TLkZr1sY0e_wGR={(BN)j@T>osd+nE&K(M`XtyLBKuFM za9OOPmPR_!C7`Pt?2WeeKT>as+FJz#scrSGvjO_lZ2XUtD-#UjYHznML~uRDA1~&8 zBZu268(`Oe7=?|f`juXBBQ5N&5Mw!iK!%rqaH9DTfLDQp%+D#|tk-ZtrV4k##kXT` zs+6JBMAryIfRq1AmC-`GS$-WHYqa-Kp{b$h*&3aIO{U!f#{x}`+Y`|IBThZHO$jxec+L4jOCslQ{Ydd+OdEgWBk(v2yaXBx1tO&;)o^;`;e0$R&f zJ{g9`l78%oXUZP{*cEYZ$9kT!yY8J1z}(v3>Wybl|3JnNG5wUeMIT-E`1bDLB7uZY z=`*53mKrxQDD#cE3dM;wK|YNf)&rXn^+Q#eaD(cDo^s12?v{XF2Df(1{b>>mDrCb+ zNc3m8V|G*w`sLOtd|fbgy(b_oGDq*_4;Trnpjm@#EDL}L#vcPlm)J$o~TvQ#6D%A)m2 z9hO9xY2lxYW{NR%ZZGOY$-I6MUADq`qcc}vQhANcYCR9A-aaVPQc@?>=FguJNL7_D ztEiBrywYovny$6|9;~-p&JD`621U%x0@i5!jWD`RvaZ`%HY>$$_RkJRmENoX5<$jH za*vJqofdwU&-Rr&q8G%^40RXx0HVIj9Ta1qm=%9)+p+6ierPAN_#jcrj{61f_K%0K zKqeqoi~8BmE1JLe5W@5`Z(J=k>bZ0PC-zWFhJODwQ5?&{(OA%b?S))}fI~y@9;T+Y zN@V@Oe1rmUTHbU&g@pQSDwPAWd8f31Sd{SEy3*sAT;Go5GZwm6SBBwE(WdWgKW4d5?+7m9b zhcX>@`8IW{eA)?AN*MlT4Nj}Gy9`I|hQ;yvXlC#~AJK6AlrIz%IyLH0KRgV8r(X6p zP$=_cw0>24gUQdItzT~juBv-B+y8d1_p1rmz`eP=^p)GVJ|r2;%DB(-4fmUK&<%8_ zlv?1ufp&_|fT%0-Fs-gb^j#xQzh~E&rwIOKq4Iw`x^=V{r`?)GoPsv+N(^otOxhke+zQrP-oqo-11qw9C*59{dzM~O zs^2-+)~xc|5Fc0nvm#MRF&=M03TY1~5}oY`LP$*VM7jLU=sxsBMY&k3-6=e=J+J=4 zAl?DIpKdTcyEWEKs7sYDRbiSLEn3BzFYeK}Sia3LEv5%x-lNtDo#9TFshGV&q=_e$ zvmRFt)su?#z(5qckF$PJf_)8$kqiX``lRnOAAg#B#L#wANfbD)zYjbrRcX1v%7oTS z)}}rW2Mjhp9O#1)2Tbp;mpc(BY}vF_9rGcDnT>AOPextCmC>s+08np1N)NelySsmP zJ|va2e>xsvq$r=B?a@b^N<)cTLJ4tDe4%?q2O7BLodRHopgIB+OJ>)m-#~nIS8VKT zv}H#XhS@8_Gs=%?lgq=v%^GyHbmX{$ndFA&>`Syu6FifoPNHFQv#Q{I3U)piPV=?f z=+gTT8fqhv)XhdLV>X-1*YrkZOO0qJpZagEmR_BDsVMpl07+h%!e5zUx1@SBy!ZTI zMyap9Ea4N(35V_8o1^TtbEKniC@EHQqxPT3&|xPKIaoAIYdRan@o92d_4e~sz7}jD z1v1sx`c}ar%@6<6FC?>|<(C65oAfz*ae&=LjI0}J(z$fpUFX!~-5tJvE;*CKwY#(C zDH;h18}LLhQ>*bnuR2@YP(zfWpN*{tCT8h4=mBkWlYTq=$Az&{Y&j-<5GLhBDmC^d7wG-a4gY!9g_!u zdogA7`}8Dk*e3@mbiJqp><$4F>zK{H>W`%GEx$L)@NQ^a=Z;1A5zJeUHf}`dnhIVT zsyhb!E_Sj$cK=ryHCqn+cv*XZ{V%lTcK;T&oc+>u!=QjQqgm}OsLjOC<%&tzv3)wg z1<=D2VM#GkY!U?=xjUj&;|-Br`eZjEP26&MXJ_EGLbt%ZFCyQgXvv^AGo@9W zxA;MM<}!ly{oLV$#85u{&!8KuyuP*_N+@tUPZJpy5seHX^=Ced7%R z^^$0h0yTsrV6X)d9B;5Xmdy-yYZ^;kz91o4|l6aHt!eF)dK6 zy}L$n=e``mhP>S=8{{8{bpo^X2-j=9-ymc;7}qrSqWHKEc)(XV-`~FNV6Q$`)C8M9 z5RbH8(tW86QyqahXR>@U0at!7en+pRXb@~4Y3;;c1LCT>>)(yf+ha=i$#_v~Ri@EY zr#dd~f{Fy1lL4sKl_1K?EHSeFrKq)?vj$F7{QeL3jJrg2_uJrtyiEA` zmfL8q^!cOZFMup>jgfE8cXA}_&zY!Y-CpH$4DUC4XHI8J{dWO;knL*drk<}K673Me z!oVp`e#Q;IuW;wBCof|pRsOouFBi|P*uab>T*M!+<6Atv8Om&li=9Q)51)S$_KKb? z2Ab~3nHfA(<1{nY28Si2TZ@zgSz6YE(>og{c$@0h6qUIxZp|5by#a!1=2gL`zc;Y1 z0~hqDKgD=W?xC)};E-6N#ZO|rUu8bQC^L@_IpGwPzsYrgX1KHqe#OA8tEWA(ub#U- z?eZ(z-H56^L1?v5EUgak1AcPl8?c-|Uxl1^B)eC0$+D|VxGKt#E&I-hCt>xo~UjD=cHqyeg{IF?D zUu0RwQ2OTYlZF+-P5k{UvO#%!)A^b9Cf<D!t&6!p~+z z>nmFX>z@+t87#B3mTRpj9Ga^CD*C$Jr^+vTstuPQ>TFMGAa~ua>pm6MwoqwBpmdAI zT|IYFS@|vn+NPVz<_e)w;d-o7&hDVzrjly;#~Q8<=2<_=RHdv!XX@WN*c&%0LIyA@ zYe?au&m(Sgm0GMCuCoT#fY-$9iMVf`)4o=SjZ04y^m_F6WO)Irp{ipi`sCs#Li43o z$nS{>0qfsfQfhY5v@>Dk+dSz`ifzEu7Wv0zHj{=`X9mxR=5?yvkocSKAE_LsRr=15 z3X4&4I-Yad_P>Xjgw^<=Y4i91H_c|O13#UW^>i(dPSf@+jVP~8g&V~@7T|Mu%#%_i z-n(YpIPvSPC{f#17%o>9@=wAe?7}_ukb!2U{$bFHcXCqC$pb^t)Wm-D}K5Y?|ZpS7GNIK%iUs~X=%?LMo_^;Ui*E<4*~tKECDUbuOgh& zZ)1LU>MSm)lo>P+->5mb5@FL})Il0)7j)4b=Vw$CD>>Q^yR}B!X^#_Q>w0!@ znOTJ-rc`{f`;~*7mw91RTklJftlRE#VEm&xlO5ug1^mUEbMMR-bPIo6)36-O$vp%O zY`OWbX@UhqMH(Kf%;g%WP36__yV+J~i0YQ)VjSe$uA0_fe!|ExQbTuYXdpHgNuqq- zOD%}$8*-NN*N0-l>*aD^R1VG`?>$VcV!i>= zp5ehR*CfuW8ud@feVCx0zP!N!qG%cK;k`4ueUP!mV{HpxJ~eBX@i);wInQ<7fmP+Z^^EU;@?Ax$R9 zo?5z9%tXu$;P$>om8kK=Ep*?9I-74yfuRI!7wAZ)d; zXuq4f@cf`M2RM#oSC)V7x?37ez^1%2XV6I`BJR%4tHT;T)agjg#gq9YO)xFzRa7?tMN85JN{P5G=M5<&mAJ}+(qod4s z1od0h=bhQCUDLlktp5*2CIKf7q?9t) z4Pkm4`XNSb3{V2WU4 z0#oqT9OW?Y#;4(X#Kax-Mv#GDA}o6`=6g1~MD>>6@0b-+p8>e3V`SnRn6=koh<7)F z_e;nxWOz1tr%}wA6+wT9ZNzhk4x0`CYIK)}OdbEG8iO{V^+TJv#O!|d_{@lAC3?Md z~{2m%OA2XT|vWvbS+RpZ4Kg$fI9Tn%Z)wDSya%%=;sf||isoC*%X(@% z+&wj5%^NfT*a`q=W9{?``-;AsEFPcy`l$Gr_L}(XzNL7hR<8iNbG}8ALGhad!+Z%X znu>=Fi-mQW6@9(2FOT$TK3IC9Vb{AP`H}xh)aM-=M__!eJ9Oq9?@4g;{gSvsRZ8z% zn|AIJ6ZL|!a#n$z&La}Owdkg;J^lraF<(aw$_MNRJn=>p5 z=m+pGdWg5}^NL$j3wx=aVE+py`$y((RHc1$O`SbR^M74PKbTYkVH8nv@M?G^$W zIK{JncrOA&R%ypt#~ovB+=$|V`{)H<_S=k2&a@xXc)eLH5AR3S)?nG=w`=1jOx!`^ z?CK~>_m-AvAj;-^3gtHA)N<9$%EG@)+0MO;*XVSgxN7xKv5DSjh2~>cYKMR+x>9Yi+6p_{|)*j@(!o~ypey@nd#XaZJe%N`^+fUYa_}KSM z#EpH-GXGmVrp{K_9bMveP{xX?9n&eG${UhT`qCOkN|o3BeFTq2``jinp&c2F=6-G4vlvZd^{CV=z^I)YFRVeQjRawO5Y$sJES7FRSP zI=9HBiL4%d?XnjGxQD1$AgBMNltTEf{=HHZwH3A$@D^&){*>08p0pZO&YkezeD6-W z;#3M_f33r0Q>xQ|lOoNu%s^{;uDVNx(AOi)1BFhmLrR7|8i`@=A4w@_J7cK#g9q@z z2?EfdZ)Cu(nN7fyU8|xy%&DA%YF5p$4f|sYot~-jmX^Fm+}BCGBWR{W^y&G9Wu?L` z&r(9+U)sCF;EMMz8X#7GU;uMNc(&Fy*Ol(`;mvvn1|r<2j(q8SyNGRtR|9T|(cv{( zh?_CAgA63IUfLAV_|)atdq&7@q}e>5V9h48k?S09hB%MW^8;o0e^>ga50C6_@Oi|# zB^Iuao$DrXGnm%_z&?MX~gZNZm1;%6iJB!`A?OKtp*R zJLOM@f*CR6lmKc+T{5<5VZcK;%MP!skOG2qNiG*UUnj` ztVZSJ4N6$d&gi0l6>#VU^)rFW!CL(6A(Q7}3+M4}3-WX3j-YNYiYI)=bG}5NJii9} z@X9axIt@N2xZP>^-};jLD3p>>sc!lBt0yy8nk=MR?H8qBwzyvoRa?aE`V?1qac@oB zbaZl+_uJHzXN*m@4*r%-IF!X(oIVD%Y#T4ntP+f^REnh6AT4h#VG4Fjaz#-JO*4|# z3@c5pv1eTEOZ90i!ied)^6Sl_VWjJ9#vbq4w;J_&U+T8NpSERK=GiIX!!;&7SHhoF_Zy1+F%&`L5w9H{aH`VeXeiIdXZlFFujy0N^A zIIt5T5)Vpvl>8T8o38l5YmjXFVpUCKzY!@tr#$2+fK^|>D3(4$(j2?*>)#FuT zTTdF97-S1}scVyvCOf62QQU((bi%u+I$pT0hB>S260%|QYK(d3vVc?5^?BQ(!0fh9 zL}W2DS#spCO#R9UnJL2v;kVxk2q9#umBKww)Ph(3)&U{AVe7{@%ZSmgq_eRrf=t~- zsf(W?rM;&7Nf9X`60gjDwO+JGTa(=kq`y1h8Z%@tW;<9%bA^bIfCm%_Z;#oJ*pKi0C|}v--G48CATF{jcQSuni5RH_6|%C=7%4?r9i(fl%bvRz!Zl!@Ar-LSZ#jG%mu&Z zsyu>5POYrf)_nm^i-qqGVttgCqVqkdg*<#Z@VhIS=h(;G zynWp6bVIMxIO3eq1*h`PlqOnaPm+&j$dI15i>SjRQ@)Z5{Gkvcg5}TIU`lO{iF=@7 zobSd~mKk847_wv9c>y%JT`K}77BD}G#7dfZ*m#OxkU6QIiYs!88KAY01w0#61vdjx zW6a@3d>_qRiFyZPKQmSM*(Jcfn!i5Ma2at%VQ~5ck zn-?(j&7n+vuFO?il%WyQc4FxdcL$}j+b@}EUMGT;+zGL%CFfRouA+paod#!PjbQzQ zGy$VDmH`4s-6fk_fRDPg$yz7OQM*)GR#V$2zG$)7PwL$tb*= zmt8Je`#JO0HF)dt_!hNugt1_;0Lk!()d;sYg<1`sY~=>5l~hm^aVGKpuU(M7_K`lK z@8v)%f{KcdTL4DIX>`EzJn+Wf?7*&C_%nnF!A28sCSvE2pt#W~nmjIXFPX^Y2PZX{ z8{pY2*+afI=j=j2s}Fb@qKZcbppOq`Q}HmcSaN6L^w>1pqH}J(qe6%@|9OA5DPv`1 zKU9%CBb#B;x|FwXbrykP2W>aRh4$O{953#m&bB+Ia51Obe4XMj<%jJ8#F-ZUZuNVe zJbSGTED2N>3qPY@dj7r)4s2$lUK4Yr zyzRqS^|bK)NzpIZ{5qWm(DQqKKpln?$Ld_=axb3|{?!gr3b_U*Y8(9YGaoE4;r;UY zMMmgOvQ`91o@D1D8J9|uNMNAl_&mqV6|38D=W4WJC(dTDCfS_ydpEZicdKtEotg0$ z*PVGZX0*=1^BhEpJ1OhbK!}%aO{*|UjxfypMRnY-vfyQ z2**6l<$b=bpDK&OcisM60|<9}_5#?^PRSKfzVv3V##6&#eLEvkzKaTnN3Wo3mmZYM zC`o}@+hiX^-_-0#V@Bh!Yot%5xraPh0H4msSf;UYGr@avA~W0v@4h$NAn!xJw4W_A zo<1GB!Z^!c%)Sdt7rm5LMD1-0z&bOZ%K9EperR@)>v>jD-5T;7f*-FwC%R;C7r>F` z9Q&vzvpCezs1Os*F@1B9l4_FW?yXI}Lbj5D8v9)O2wx=AM1(;qL#UN;&~*4Fr0*VR zM4>HN!@K-NDN3KjNJPemb5-I|f8x%r&BuybqMWfy@2x493YO2U+~ zYo@Kp+!yuckt;9uG{&rH*%vmPMB&=XNc;AaeDugT4q2MZ4SLphwY}K8*JP#Ed6=8?xj4@#j;PfW4O8#3L zBG5z=`Hwq22&4N!_Mc(VlizocoeW8$vHJ$XTibU&wa!~fQ(R<)^bu9|DTH4rRt#=Z_OHXMV^fBQJ5U1~$k!uyBwtMk`M9y3 z&%~7>a`!T(4*-l%9AyYe&+5WJKM-i)&)w`=nO&(6v#{KzraO75XV}i$(@N*E5+W*OR0?KXqxACvNcC_(v ztXm&rl3kUCS*}7u0IK&?7FMq>vrzekYKNW2IDg+Gd=2H&BE6HuTTj(QYnqAJ#uE#! z_~Z$>+Aw{WMC7q>xBasG$gS6((zxdl2fmFqdU59gL&X8yFVj70X?-Ysn%JXvKq#sa z!kq&Wr*;$TMW5pJ(pK4;0ck7g zFps{1t^AX>C{39yD0N96IHrd&cr#I|)uA3MKq(G>jg|LX!3~S56c#1CtSvl#G<4^k z`-qt)|MxU?#d)HLwV-twIY4Y$(=Y9KBX}%&8W`wx)7Jr^r2?;T)pw6O&alBEcy}kx zt1P|A&%%9BVu4kruiT_5Ghjal6IUEq4y$9$L>`9rFl~dWD79{bJ+DKT%EOvV1Y~@xqG$3 zG;R+z3^XPTecB%4zKDP!WD(not7%DvuR3uD~iB$?WO-k7bxf)9W!IB{%rM(+UU+iCF%*301q~Pmq z-11c_$e4N93EV_ja_1)uEKcFx7Lzm1%sUCwGQ|x1o%=!qGX5U zT!$Yo^cbrj{74b=^92yiP_>6bU7tv$g4F$a`TvWoj*f&!HRC@^o(tGJE~ahFHt%dy zt%YqOLhpE5AflsvYOOpjRjx6+F5gDhWGw1?2Wq%2NxasCfQ>5I`Ug*T7>*kwHsh`= z7g_CTmn9~KA<~4YMQV^X!vni2Qt*e}IMUG$(MrnkWYZ`||JP`-)Ua)9+g~0H#H(hs zI+vs2=9^?(V=39J+fPNu&rBRwHlyI1(*Zn}fEiq~)#_Smid+^HzX1ELZ^tX=uXAi# zV)rJnvFk!&vHa*pC-LUk3L2FY)vZg7fV^;FQP`5ZLz2AkE6Nj1lV>4SlxYza$wnn^U^o7 zH)Nt$B3^a`l=F=ikBDI*<}4r1U)K<=3my34Ut0`#44ZTUoc?yb=PXgmrto-?(Rb{? zf2$j5mB48J!lh(%dpZL>lS4FJ8ihR7PgBxGo6~lk3-$VM7><{F$qMf|`2Pr;C@ul6 z?wgcXoNbzI;Hx*(o+vG-w;lj>;j1d1r@b#-cNV?22B*pp2X)gn*gsuU)86JKrz-r~ z(mgX8g7p%EP0<|Vwasy^@aZ#DgS-~|zH^A2@O}vyHpYF6?Y5=vTiac@y`lwde@A>( zs3u#c*j3NoVd=e5?RKF%zLl6)J22I2*_Xog0;nr^>pJo2-T1t)Q`3jvlkq>7C(GdccowYc`uOw#Bbu{BrDR7^YWqjWz8&B0N zCbV19oa|J~o(Us7t%u&eWeh8@WA9u)?+f-Zi43JvLNaQp^(-$nQB^3^)_B*~X>^X; z9~V^L8AO`mvp4q*!{Eq~=&&zr3nGyUo4)*E$F^()^NeyfQl{;}{&_B6rdIIY!`-VV@8Yg4b|ZpCCIBcp_1z`nL&WWH+6Uuagh1C>%3xxP z^e_S*>+fX%o6ZN|0gM| z!t^1v=WxZ@PRi*z$HNXY5UTr{ssc<%m^ob#j^O-=-FC8Fd z7FvW9<|~39k9XL~=2an9dGF)IU-Co?&Us>k9+Y!opLOj{(km(*HNcff1IfUeKbV6s^S1GZ< zqUe~|O@)`C&Fq_VGUtq4BdYLvfh{b5(;6GpvFVDUPP>;}2XON?l;q{OSLj^?g8R>u z9e*EBIsE+FK#vRJm5xR|{C3KyN67Zkeof)S@6`@*>500fRtg@^h=GV7RCB+8rQ{X& zf4H3kzokCSRwOQGWHoW7KCs7ZG^B;`x@ZnV2Oo_FpnxgXT8~-tTf)u!|NT3Q2+|8Yd5@CusCm3um|G^ zRwzXjH#s*6Gj1WYd#X*{-f-Zn`uBee#|djq_8U{hR7#md-ORP_yD>M;YC~cC&a2La zP}t-fW8i`tpuQf_*FWjpBgHo&isF#tKQVwJkc0ST)Qh_kw4t~h>b#oC2<$E>m9Gg? zhuGD4PBxk56E#T-wQoGFo{n|PZ<^PxH|#Z6bGAp0=qgi6u8&(_3vp>upM&YjNE#%E zONpu=cr5CZ+?%Kcg$0y3xC?$zhJwlzj3ci^bR9)Y3)%u^OD^W8Ur_ELfV%J3+p&_o zB#`7m~h~3+qF(n_Xrr)!qK9e1P7JwRqY84lQHXHh9 zgr!Y91x$kyBu}qr6I|~r#CHY&Hnn+Bp>ABERHz13(kjCFtAsEoBhzhC_j?mQAIFCf z3xDdC&%o?(`gU5?!gJq*x*J%73H$AkNWWPzJvYO}=a0NE<3e*}-Q;GJKU07gdF11_ z+r86(n8RQ2Y2P9h@v6s{&jcT{Ct}B4?3m>MVxQ*w*scwdcKZ`SIK96qY?4F z{+a36LZvIESTB?N-mcPJiT`U_W6hu?_+mkUKYXvw5%X%SP6e?%OeL`rz^suED!8zm zVBkk)pVJ@ZDO9LF9~e*yWt+!@=iUkY?VeWV4m-|x^Xst;%O~<#SqY9k$tdj z)~FL|mgf@ig?Q6=6e#RyrXc&cDh^PZI`GZNAr#x1Zrcs;8}AOSbt`ohBI1p~UyGes zK`YDydc78-a2^MEkuE-M5-X2+MAOwpe;60w*nEBYReQ2AS`o=DhWFjh1J4<%2(K1^ zZIa=?$1(7Ipa3>c$a4oi5`RYOpm9+KaoKGa7mhS9_dK|){tcS$$T>TVk0d*cDY&$K z6sWVXWyIKc+jP&XHc9GQe$KatmC<#PdHj6xG3(<*ZQXxxp|fH9UcGFSKaxP$87G$8 zIt&N2sXJR{;E*TP?gDlg=s71-WlSkyx}8;;-*Zc!v}R^I4`#|X3F_5!xu`lu`y^O& zRnhUDR*Vz3S*j*?)VI8>dp;fJu^)u=Ih&o}@LG4-wYr_U=)51T(3P2%O8)>A7S&<_ zsq!MO#~x2nKg#IXkB>)@7`T{;7qtGP8j}1!ltttqF-On{vnaZQ35v;Nrhr({C%pbG z@Y1FhQN$;~kd$d23kg7Bcl0}{aE z9}>?{mU_Y+8APoxiRsUa*3_gnjmvh{fE;$liSfU>3tnu zqg;yLM|x1Aki)s8Gyl5E+vLZq(h%ae&y>(;dMLZ$=WP)Q{l1U@afKxO$YreOZ0}!HsFyKm zuAf6-7%1o+Kiz5x{7Dpox@9<%_A*rtF8B2_b@GteS)81c*!7>LK3#BRUS>EEhxvy8 z=k@)e3sp!R`7+zb1XKL<)rGUMJ1K<3p7L?}>o0m$P%i1U#9l6uvuakkN=y4WX?0EsFSRS9;}BeZr|vBai6k*cHqhypXs!=|)HN+pWng!s-58jOg1Me3+ zbLawG($o_S3Mc6eX9Y;37D6ngtgG1G^I@dU^ASmSC2lnI^7uw3!DEpgtrgCH&MP~G z-LMRchqF-T`cX-%1b6P|fd@_C>Y9$*!{7%?1>*|Y8CP>Q|IOTPtLEV#j*@Id@AwmN z0Q8~1KZVO^JwN%#f4E-(S=S;NsF%=Fi*&At!e%A%-ne(d9h-9B&Mz8=ef4?wBKE3# zBnzoG(TN%CYf1bP?~s3iHXUm zuE#ke9jH^SQTlfiS#Gn<8*hqYes^*T{O=YWJU+Q$f<96u?xDz3bZT+sQ-z;3%(j0R zNqSHvylweGWKPcikvZM|SLPHi31dtObH@{t5A6z_%iulvs_fhR>6f@U{M2S2BN19v zPsjwzMRfEB9t8Z(!yxyPr$AiN76s?>(F@0 zZG}NGnBAh}Q2EPpXU?Gnh1IND?!ie19d)zC36LZB6yH?YZI%M8;O>&9rmihNhy4rG zHlMESvIh$uHHIKJ^IAVT;W@kUjK5jf6Z`%n;XTS{qNCwf3qVBWdP1F!m2#f#ejhx{ zy$QB_PH^yi+e>b+9GAR_hDAGFr^WoV^jnY0a28%NPZe@rNjsSVe>)F@+_iw({LlJ$N38wf}@@$ghG7C$$R{@oZGhfTqd_~K2DiS3cnrewO*1yM*Yc83(1oDCv+I2xlj!CA}&jxIpdCwQ~b5}TQz-l-|8sh#;VrL z_BNf2YfWNjJ56GDGfkIC>pV^Yw;ySFuJf@0_Y2sVOtTcsYh?u|g6iKNWD-hpOaFz5 zCbRU%Cu%6l%NR^^{BoCUk`t1Idw;!EZ)YU8ie^eRhW{XVn6S;3_4F9 z(z~p&NLepV@Rd9;`<8Zoys;s_?_6;7!e+p{zv2?VjT)XbXShvE-@v<#r{*LZHVJ0e zix-48YuM=&m8LX&DU)O4EkL$VPQFvQX9IE_qOLI1ym7etW;nzaBqkD|Z_o!@E_Lojdip?+@-unlW6FuG^OCVmfDyw}MeIY3+2nc~i(!}sBxhU)+~ zY-ai&>Mp6WV}&-wMtwo`vK0{sWiQ`gw|`{(0;y{BUK{v~5B*oA>)_1+Vf;gMTPN&D z7h~R|JVak7U@ql~Wd6Vc{Y1D<@HtGNl7MXOfY$~&9!~c29S>u(CeiC9P3!J5 zWeQc;{qxFCw#q~`EQSVBSy>e@GD?$ywOMn~Et#G!NaG-H#d1^60e|RJ{$cNh%jMm#0 zy5fbrW|??`2t^MWpUV?qoD3(>hfU|OVe@{u<~A?VeT!-V%bRbXAwvP4M>1Y|e1(Jx zkCUi1ofM#Yy;Jm=dGDc z+;`#oi;8yMgG5!mb&_QtiO0?tcgd_rx{u40r;WpPAM9F3KWfs=pBsn5`GVKhF#*<# z2kWP8mB0~ksablc=q8d`A=a6~+*($tR8;#b+o4ZhZ_1e)3!%5qG`5?J=w;BFNyHxs z&{c;s!WI6le|iX^oGgtKHPpRxn=}N=f;U?A>qtn8PR`pzaVLc2DD3$R^Df%;;z>yI z_zcpk4upJvWL3Ng6Vhpv@vE4=8MLg0H%UKAcAGaC@59&*#pI>q6GGHbYctdir!E76 zt-@SLe-F#5rIyiPFxJ=61k7~se4xQOQ}j+IC2;3`4QLNnyrY3oqhq}d1WjFqN=#+7 zLIpud=##EbAu~a8(17H8+e_sR6?M>wTI((*qu;BF52st9;9pkBDm|~jcZcC8Pw(A+ z&!`e!aN!9up&GOAj!Pnzt#Zw9b7Sr7Ij}R+B?OtK=XZZ%SlQ0DZoi>~ns zhim&tre&SO7;mdu;!^t4M=t8dLL4>8^i5sSA*rg}?C-J(@GK&n^?RcEk$;-xaq95G z@eZGv#T@-)sq;8Ozbsc7MkQyq4Mni=Nqx$1XsxKF`S-Ni$Z1VTOJsfaBVmvtEZl<-p?3T1``5*+%nFS_eA5tus(3o<-G zjyRB{G8I$oCSj%Ei$n=d^QqFKQOz6{iPa4Q1=B>cxd1IWJVKW9Q=8Dy8WSy}Fb884 z2e8WMG(EIKWy2JT2)&OPu~?YlMqu2 z$4&@;A-uJ&1*}|tr?^qHYQ1wFJ6HM%vlPObW-tndPsE#A(=ssYT<^Xaz^2oFOP#NH zRV&l*%b7dTw6vY3s%Sc($yH(tjvg>B1n1AG7gNcZASkRhmIGq*h79Wnr7M!THB8H-Eq?V`yB9%5I;1e2izc zPw{hgdTKv?MUyGSKdNQnEgG%D=h9)vtiQb0iIUX9I61L%wMY}rs2`9a`Th3#^^s>; z7_;A1gkRsTc^3A1?5qJ%>$hFNS_HqufV?0ANyLj&Ji*mc12AiCJ(D)R{_IZ#ikMMm zkFX#yR&(GHmG|e6_U}nQe!#p=Gm_T5u#tbQHBEyl>V=+rzdS)BuMeIT9H)e6bZQPsiKKl~0AuoKLxW zD;&ss0JkS=`Gft}L{->VGvVqQj%ppAbgq_hN%t>dCmiPS=xW}EyY$2_bd7W? z?KI_(<)nw+k{DZ+B_!;VXReL5uprqdTPRu}YYnFpRj#E^nttyup z#z}>8qL{4frXTnbjoC3SzSmN@x@+pL0)!Y>QRhtbMPa=I($56F#V5wv$Aj>HIf^G+ z$Fpcg6>U>t+M{o#KyRfCqc?dCD&Pn^vL^InA>+^oYG;KE`|VM|O=2X$A>D&m>k6XT zVCCU{5#0hC`I$p~tsq7^twaHHJuU^jJSD+5%FoDud#>+`%&H^Q=g}lDK5Lo1 z6M_M?gs>D%5U3#6jjL(t%u?xL*5agxZ(VG?hZxQ`S>2s~`h~VgA4)dg{wkhWgWiND z>=t~HBqsfId1M$&w zpMq;edA_vEtT_6T@!5rK8A`bi$=F5==O@di)9BrpsY4@@9;z1ACw-f-?gCDHr@iL4 zvRXfeZ$qt%APwnIY9O$a~hbGQ13n{^IcB1wV6TNn(%Ha8)OSbf^E|%4o+n3 z%-mFl#4ImruOCi4+8`Tl`v zUOMkg1mg3@G)-$sdf{Gq8xstnG5=NDwpzhLI`k9ud~R%ss9<@*FaA_*g{QgFX~WF5 z^h}TKU_uuROt9k1VoP(%4X@TW;a4^LMbewZ;3Okm4SNeqgsh9P0EKWgm@@VkMb6lh z>Q^0${op5E44Vbpt-tjI2U@DW;+2xydc}<=1S5|w>_@-wtH*GNz@F!1gO; zx!XYnjPI(IE;C6qw@M9Qnx`0PfCkMNP4qD+%|Vob11hCwuUx~5)9lNqA9o^Usu;Vstsd{?D#WKvskX{mjKM;#GdzWoVz0R=tgZeQQmm5r9QzrDGL z&tayP%0s$%vjF&&%GeFQ#kVtG5=PdOyhva)6ywH&)iOq0VF7t8{c&LUqW9ovRXgaxQ@?6+(!gipbxCzVi9pD9aDRj50Q+^BFzEvMM!V{$V8L)Y zyh?ZDY5?rH<_$h!?jU-cOCFEL@3MJ6{ob}Ax4&WFP3$YfYx+b?+^JjZwa^s72vO z+>wePZK#JUZ(p$Vb#TzqGDAlI(a{-(S?T;!ZTxRtTkZ{PZ_t(8)e>W07h8rgQj6xnve zq@e8_Y?jh_ptCk+2pD{h(f;f5f~3%49YnRt2X=29*x=Jtz0fndb8N#I?@)c1Y}b7l zYivz1^fNTTW&Z2ccHa21%5k8$X6G~Y`o+y+!Zy78btTfCt#Is#YQ?55C)G?09BI#y zX?zr4QAxdWGd_JQfym)BZM)@hu*PZF#F$bR=sIqDn>uh4Y0j8pd2nDAwdPiMWOtq} zp;LbeJ)T~xT&7XZArB_fwnKu<17VYhDceMPyt@bg#&vSib*cU1jfZ5%z>l$5PuF&u zvmJDwED%&pwIYw&w$04UWv+o9pbdt z>}11HagN@K55&L8PI}3aw%20YHV~amu(0U+XQ7hAuNt;eKd9;$TL{^tZTduE!G@=> z{cHRHPf8;}r3eZ4YO-}j=9qoCfu@a(FM`0%ASVMGXX@77BWD@vu|vfZ%ME1Mk)*!g zreUX7ik*gI9k5nsp%BYiwNxHyJ%(DbW^`u{ijQ_l=Bk_@Q7E%%lP!z9^0$s$(A6fC z_aj`$?Te7duZ(T-C)zC{k*_+Dugb4rMVYjJ-odcXKPGpDLQy5^)934TQ^<6t}sa3Qn#*OYD_C1FQ?8ra=r_4(W!CBNFroj zG1c9{CS0&OD!hC4zS-}VvWa3^X*ihZStxxBc$;R1Yto%$o@x^Ps0fa*7}y^t3R_$S-Y7AH|;sqbF3i z<5Lw8Ml-^8KS!cQCFWzPW@;q~aPnk=wjMbeqZ=b`zGd2){xPAB+Mx(~Bh85WM=_dQ zer=su+=U-}g%QV1;!aFV8o6kcMp-arS4&beJuKZE6ZUIkn{Ao3l=<(nskR+w6Ro%E zWoZxDXcuZFl{S-n&>cFA&z6j#7C5;~F`XMI$mM;y$l`Q9G>6vU^mQ-9#pjhWni_rN zX2&&UN5pMsu#?+20mEt)dp`xf$hq7X0q9Mv6hv44s>G7MeZo7NU%@@7KtxYWK}9T= zP)V#PrHe2^sgkaIViC->XCz3iJrF+_t*pkiFVbbg5HRAJkn0qm)EiWLPGp`l*n5Z* zRLwT{^M2JKJvu69Ca))AZV+2^{Jjn_7M_1#Q*=y*WOAps#eGzOH^OevgMah{G3r$k z!|DA;%i$oWrqHFk;IpW|9-!AZR8T5Zls!5OSAl2n5`CI|{y-)v_xBNP`b^%6$Fo%J zox~nhBt5vOXD3QKIuB16g(=ALgG@vYDyN4k(C&V<#Wx= zh*^mxg9Djd#Ed*%X(v&t)M{yH)-qa!tNk;NUu3moeN&|=Nnkf9Qe~B2r_00U4Bs0w z#;>Gw^+3qaKJB8C)x1+)PBH~ar$k4&5;Mmm71FmjKI1cZ(VcWVno;&BI8r^Nl-sCQ z+4wMoTT+{XQtn3-6HUo@z!F@zU{EGLWtz67O*~Q(*`h|MUGsK_w0UL?QwXUr|f06#08DDeb zgU7Oian&oUI1gCdjcd^rdY`$ZFP@aK9UwTV<6s2QoF_E|2u@ z(_mO<)iA=!_Ms65HdvRKJH6f_0MZwuGt9^q_u_+dua z+Vu9L#geKBd{Ju|02!n!K!jt^3JEl{|%J6_fIx*IupEBQ|5{0;5Caa({f-ykN~#1&tn2v7+91?gCm;IO5-UO&VoX->LXteo}#+ zPf=M+?%{6JEMLvX-b1d*1pnR%3TE>3H`7A`Sh9?t$Cz16_RS+6LTLwsk#43>Wm4F@ zK1E}u-oG#`AQhId;{^kms&@9S-(N0Fmg_C|*;b#^Yt|X7l=M&H2dyEEB`bcO`su?` zy9K^1`QzUXY`MV;qej)sr?Lfxfn#-9x9^}YZ*E3+aVE~X;d6xhfHAJ5jgdR84r6P; z=}h*N{zBQj%Ax(AD~+mLK*ii>$~(r1MdeXv+Pj-^xatPCEdS3TV9a z*X7afjrX~#Z`;MX#&yriMweVW&{i&Sz|p%2i0`Y_6?V12(!O2Z<2Y~s1(aA~UCo5l z7UWR{)UKi|R8TXZC=Je6_IeXN_0&(`C`&S71dY=f5UQle?Ucxu`F=lBmv?$v-b(;! zbve@d>Xp801qPmQ8S$JnSn_}kTYjI_AdJpe?%!G2=ry9qY1$8d|jeC*;wW@&vV7+h!`lM<`&F#U9CLlPjLaW7$ z2dB!M;DpPhf8b23Ur=itP?pTx!`rwOt;>}r&?Xg4(q9upu@5^xZIZ){k$@&^F$8=j z9+;jo;TD}{`IB26H-$DbE!u0nqO^7Du8|&-t%qbnNqLI_pGefOmwYt(fj3%MOQJ4F zrI5sS+bzN4I{T>ouHjB^_f=HEeV*$!CKmE~a_JF9A zl&`h6qPDCy27lKNyb;I7uKdlvKB6s@^8SX^le<+;bZ#qWKeTZYDI^=il zf>oBwlBNMF8b6Y%v_e5xqgf`wvIez|Eyrg4+O59_5`#RBMmYBMjwFO>Wu!&~rE?$>csI9;d;$K8YT&FChD_G8c4 zsC4YW5b4U!P!|)JmaXu|Iw}dRCc;BgppR)3SfNWHm2;HHFBRt{=KSJ@I}w=pa9aZQ z5X4k%3CZF~3?~~wYE?+%B?Pa3d{r%+=zmc?P!$vO=>Jbw%QXseiW18$+VY zK&>;N&g5M;P%4`_ir{O^AD;mv`E+jds?L!wtBW;wg5KP)$OM0S0^m#zr*b~pk?+fHF~zdZe&_VP==$~rX|X;^AQ4|Otp%AJ4i({72JZ>pY7dZ(?tC>stu-xP z4c4~1=E`*{pjK)2Pw3q+^ z(~!(p4`5Mx7vJ+(3OB5&A`MLV@(xmb4>=qeRvxq?2xd?xkqJT^kk~xC@sRKZ|2QmF zo~9YV1Q~T__u%z7OV#R81Wk3gF*_elL09NDNrvMvMzGsXk4Ur0IvF%stz$9LD(E%} zV}?bI{|4%^7x~rUSm;YTGrB#|rxQbQjn`Q~%N#A=CE?U>Idq9Ul|EArqL^>{zBioBFX9)(a>OA* z55LoBcg?N?@XeESwD-T>8%^u4Zv3{iI!HDC|Eogx7BkTI_e>`Vx`qCUUKtB9aSK82 zedF@$g2dZq=f83N!&i*q#%BgG6H^%D|JE=!` z&Dd;1uS{BbmQpX39c!5jv-YmFw(qYk5~YCH6XVw{`YjAaxT)H-(hA{XKaAFO~Hm#6}?9#sI(4Op$XZB07bpu_YRU2Jny0a1BC6JnN$s&J~QPX z3cjK6w@M+RKYFz(tr#c`0A2(pm7}qYkc!Cd5e!P6ty%FhxFo$|+KBj>+IorY^K(AUUNR6w#{OhMTQQ4{W)J zYXKBL2SWbegQ6hzEk$jqmGMU@a&|f*pn0DI(urY0_Dm#_G2VP)>V(jg%&V+VTR&Qz4XwpTu)gM{Cy{EAx0S{iW#D} zp*PJx`M(q`2}zmU?+gWEauZ-jR)>#kpfy2EhQSO9( zH_yIb=9yonWl(Sit6Sp3#fG_^6)}(F=iuldZe=+!?^S(Gxy0!+> zz#+(Nc_-L?J?VK)sTZqY4LZ#`<#6OS6+)>w4~`-!O7GsH7!0tii=-u!LfKr*QT{{1 zKi-_f?Qu=n+uJMuVrgeRT2g2JWH|U?SzC^s^yYvLr%8B!+TyJ~y5v;D<_F&yzS z-D@qRnZrH6eE0)xzO_-&rO>@=@k$-4MfMb}>udj&F>K~Q*n}U<;?5LZ!Hhc2^BBF1 ziz0a~YhC%L)Km6OkE<2avrYS+^Ekii3hXfwHVha(->Dv=$^^5iif@%I^I4)M9C!nI z%LlLsdCB!wHqxk85#XCRfFI%fW7}8#m7qH=|2USt`OuLP)K{x_1V_XuOYAjaShXx| z)wPg~V!Yq3et##qrwUVc0~E>wbd-!`aTqlG0Ws0kRF$tbPv%D3rAYj;?~*!>jR8v% zv=)UMpIp~_w%t=(j~=o;)$NaFYnzsR+g|Bg^} zMW0KaYAl1~Y<#BEIO<-L?s^6f8`EZK&XLrjd}2;8-Sk;rFR-q^`7oYNL}j3-xzYxA z)h-UaNxa+Z7Jv5SGuN}7LjG3>MZ44Lv190ZPqN3g324Z7O$h%o`TW}u$R+UarvvjG zw#3?qT}|iT0^CPK0;y#&xR(>D`Gx}1NIzeIA%!bHp8|b^=wi;P6Mg#kAj%U&eaUi% zo2sx#J)g7Ti@?dU{ zC#!}M35<^(s21efLVO;LbcqoPZg&tvkf>_?q3>?H4GVt8?H{}!nd>utR{Q%_gD}CR zz_aojkFGeX`i+(@FWI(iG7QU`a{D52_`GQJU)UtlsWaq4&L3n~7$j*$d$DAQ0^coZ z^{6=D!Bh&MwIkv9QnPD7x)Lw|G%@;6i+uYa*(9eCgGnn+duhHS{& zV0W)&QSc~fw=Jd8E*FrFzE^OCcUzQF%ThV>!--D6p)ATXGTldY%J=c2R7~HBSIv*8 z)_d;KD|WAU>TZv|vKL7Fq$%-P_*l?_MnO|XA|A^MyQ0zDFpVjnwXw6l2!0}zIVbtZ z=Vp&S7KV-lEc2R1|AmAI8tJ#*zDNOOA9;TyzvVXqD>|=u>I@q(V1e9s^M7=)j>##G zBbpw{NB*+Q7|*cC=>@lEj~Y6z84Bsyi>DGAte zg?c;s*qb@slRfHz%Zns{FT^f2TW6It{3w)#7jL#wUSPc`6scO6o(gtxE^ zJPv&@HFR)QRg6YA=={YQ3wT-ckNAS%3(J&6Y!%H5ZF{wV*y87nc!wvEB7S@7Mr~Na zOZ#&6#U0;k^^>~9@0CFlY`&HvKuXN$4}7gZT9n#Oi$N26cFXrxV%o)m|9x(rj(&l9WBqVNulH|t`i1UF?5Kzgsvkxpgfq8*OA85V^q{kJa1I&TG6tbY2T$)Hf&2*QYO zesZKU3RxZ4vA8ChXz?w*w4W0TGMYo_xDq#JuUUoQG_kErOrYjA8})45+vrbOj7CXA z84N@5R(NOTlRwe{#8lQ9WeKIaIqd3=#Ag7a2Qv}d#K2qmtqEt0w`qoENE1VTo}rhP zmun9`ERkvl2kkr@)S?9^rzTeRiaQvrFBz&XwCBYVm58p7xI6M@PA6lZs6rrd7SCK; z{(J-;8)GX%)Umb?7)%)fsM?YvHFn(SViV_#L z^^@FeJ9o8)cl=Ew937a*oygwKP8z#YalxyNQP>(uS=*fZoCjd<3ll&7e&YMc&H0HW z?rfDI-jg4kfDxR9kTNhd?nG<-n3_Z#*vOO?);EaVRPZOU@##rUWN{;vhkgNo z@6*kGig!e;nm-JYH9Hk_D_n8N?M=qu0hdQ>s$%1B76aF)0ZQU)cQx%#3~V=ZDUQ>} z=HOBL0meiLgCz1{e_LUW(c9}(CBYrfRaOL~Tvk@*HzM=1BU8EJmVE0Yx9{9L4_U#s z%CkWRq_}3}oCGifP_UDhhi8Vk>`~(ThgR~XL5-Y5hq$Qu>0C_tWJ586CQz}cZ|NB) z!@HiteS*{yrb4ZzW8M+?Lo7!Y_^ElFn(pz?%(EN31r+gYdD6K~ZzE(vH@elkfAL`G zU=VGSD>f~{m#3s)s&L31REYNmButrb31)CPQ)5wvw*K6eohd}l&6IZR0Sm=27IbZ*VZ9beZrH6cZ(bdg4H2bqRq)0A+@9a3{KGC@;XbFn5|Mvd+z6~6(A`~Hdq<__|I$PVT8PsyN1 zRrHUf+|>Px#>B3UqTTmXM;&DJ3p)B|RgdYbG$*yCQOm>`a8YM;t#CS-Gi0pWLiqoOZbO}`qGElRA1%F^zGc4lMr z?!#t4OYG-Zh7?*ZU#l4%=c0V)d(uEQ@&w@pJehy<2B_<$hw|LnVvigt#P&eEKNx-Q z3Y1d@}BFyAXUg|*9c$4G-23_0`= zO_zG?kzGG_;7q{4LV~;6)*p=*u5WG19k9e0UIcRk!2Ch1iFZLcR5J4 z_^9`9D7Z)* z9oE4oB9o_1n{Wm;cwELjS(DagG;NK{`|8+z@bt3dKTLGK(Cyci9MNJ1{$qBn_wZby zzvkqqvo|CSTp8k~*BwI>vbn@ldFJI5JEf7JFZF($Xj8%T%~Mn!=-SHs=(t>(dD}TU zhLj*v0LcNmzzzQxMfd#nzv1Cw$*ACP;C|NN0G3LU{&dT}J=Rv zUcR+kRT6j$638;Ngp8JsaHlk_o$*#d)4)8*FedL+y{{#R;;`F2c)RANyD_O!lC5R(IWjgGSgFq^OD6s|_D*G^U7ma6I3oXPa zAn@y$8L&d1M(4A&NPp1RxIKQ-myD-<2j9OEUti?C+UG8UY;?(ZU}x`<#A?%(atV!E znGzFy$;ad)kVRP;MdfEsP4ssTOLFX=C2V(PKzRk;LDBQnM6#DoM5eox z4k9T7038i$A{O2q1I&A234qJo|CAQD>C@y_my`%qPHZH;p+goSZ2ixTcCREH^cn*d zT&urzDY^8c)9jw?S3O@Ci}f1t*F7Jch@wMsF!E|A!v-rAkyRc)jvPT3)GOCbt$Wc zv}#d}BF$7-d!%>-1>_m~Oi7k<$ZCx)zhJf8dT*_vBi+q(5IAiYyCqi24wuSETW?Q; zD?8w}?n1%UH_|k#YCoPTvGPfm!?+Ad0;z+L|FvIek_pZ$823qN81P2A(lHV7{#GjT z{WI*eza#99RlAc{W7mUw$YSv|^K=Q9IMwyQPGI^e)f`~FDO|2oi!=-$%HBOcInUb7 zkobh%{}WTaI|ih!pZT$p!;{Zx;^9n(4pdty^|mSEXTsarjxv5faAIlRkao6MK^JIs z5zSi90A%}7k3C{Hr4e$e{UlN=vx zGB~;2&_o6N*X*#^>Bogp_ru|^$TsEvo)B-Uin{gwFoNXGGsl{Fq9(J0#j@A*^yBH9 z9uo$25@Wz;NgN4VhTS#~$?aC#HH7x3SBnS|UbKMcdr8Pm$Ma%he1-<9pQK&EE;Z66U67Oaeul&P-I*$88z0szUq@D(?W#y}Z0ryR#ThGFxSYHZ*fqN%f%8ZBu-Vl?vd6R3Wcz{{AoK~kd z;tDTfDp8dky7+}6ml$<04qz|8Bwbay<5 zD8MHWdG7NJywz28IQHg0h(tZ;i!xf@O$K;fyPxvljQEn%Pl?Ve`Oq03yO8m*5f6%r zj=l6!EB*a_bC4^;UGYWQ(~4k!;t4GP?pEZ2B%|15W#{h79ypqrC+)1=C0V+`F|jE2 zI_h|g0=RSWCBZf4IfBg9`S1kY0iHjEP!EOvczS%xJQu{P@DvKqVU9G<;QE&AN=LEJ zKF|1s!`vlEvQfGE+q4o@-1?>-YG+kSku_ea|7eH?$=eoT{qHS_DC))D;~qIL7u*qT zs8*fTcgaYCNV~Bzw~crAt-Xcnv!afnpOE`he_C|@+N8rSXhjRvpmb~jioHoe<#v#4 zR1+Dpk6?qGfJuu=+-HT-*?s96g*TC0ZFIwQ5=(P|6|n9niA{iucvKdrdEG;-TdT~MPlI)r=f%G6kJAY5w^vLl01uqb%qNo0 z^cR*S`=vmqtKlIR>YdAp2E6$$dOCH6;HZq&owp;>tpJ`Zw#dn=b1(3e{m{<{iYu83 z>4TKIgeVuKDm3l+474Pk=Tl4X|3}qX2DJeAZrMSC=5UfaW zcWrTZcXuuB?(PmR&ol4Ly>}+x`H-;x-Lt=Q_U1vr*?NuSn~ZQ!sx5uUksWOyp=~o- z{fdh)0jE_!ZLu2JTB`3od;fXY#43%8osw#qGIq7l%a@H{TKgTdi2+@*ix>RzFb`b0 zL)TtvQi!i?jEiS_v1RU;hMm4t`~Fe4%~?XbZsPi7Uv0Zal1KrquSOE#9f!UA(U@X0 z#T1xa?`S}h4L8CY&$L$HxRUHsa;A<;zP!Yg(dU6zL4FqZt|jxu9M%vV#=z9Z^`>N_ z^}f_Ii9smcpZ5jl`PAR;0jGQluVFOv*$TcgW*1>C=fg;1;f%mxVlsn)obMw&zMNK* z)pFD|2fSa4-AI7~xS~_~B!0~@ab5bh%prs!_Bt!hNVd%nIA2?D)TWE|LfzX#u?#k( z@_$bg(?^>`o3elHNxB($<`hfNL_IJ~WjMP0V$92WK_h`o=(A+kh{pZA1HbIKSK4rr zKxog8+nr0w5ZUIZ-9mUWSd z`JB7Tbeqw!@q;a5sk44GN=}wb;$C^_*gPn%+%P>bw7 zMmHRg3-xR*R9)W-Bb<<1qSCO}elFc@^NLc`2$rIKImac93GBZ?PWP!F`2Jz$))i%At3Id{<^N{q*1>9zHC3d zazA`?T)lMGmCn8LeZ_@ci=#OBZq*wNs*olIUtD^-?YqKMl_mxK?0>8kLKVrquHpUJ zyY=bgGH9>0A>Qca_NcsDj(g3wXq4~Q(Q5X<1t?1D_v_;yvxy=vmzK9d2oPY}Ri29X zaV4$7>p@yZy2~unD*oSm_1F%lc2oi9&;#>G1Mcp>dm$lv3><4*srd6 zjrS~&VE2k2yr9<&0Pep$e*2y~gA=yQup1rh!;eCoVHxmr$~067=C|EiZa>ItwqH5< zb|LI0-qAWrqP5@q6@^3B(oL9>=1QeYJ) zTMvYhuR#1e@|G?J{A)Fh*LtEnI>oMh%5ez z(r)}(l&M^aH@hk(I z)0N+yVrxBqCfY{x4fXa+v=JCn(W$XM*I{3Ka?Qxuqy1wq2stf+Q-~!uCN89md;Q7z z1%v4yKKv8Z@y!=ES`noqiAhLcOfl#^ypfWU7E{)uGK^(Mk4^ITBk!*OZ<$&t{EA{Y zx)E9=)D(%MrDcu2-<{$Gh@dDosnQBe*1@bMalpiy#yXF`VwShO2!XGO{e#b1#3SN; z{m&`!rpmEG{_U^nx4`mU6ZpGuh~TTnxIbV7A+PzVOUQ|=d?7xcymlWjY)$ZN{~S-^ zfy`N~)~#J0+24cs7_)?c_q2?zTI`8N0&W0g*b06kRL>05E?+ z9Ar#qC)&-?*NlX0hsQC0%Xy!?g~t?jNcfVBE`b^P`hsA18JC>IW5TrxG9!>^?GayX zNUSh_f!}V##Hh7qDpF?%f1}a+dY4cfen-V9sv}Az@L)kCFFoIAkHN2peu(qiOqs7@b)yI3QfT0OJqWCF%d4biy}(Gu!Q_i zvWZmeDcuqEsZ}6DC_$yOmVJTGCMm_W@}{Nn3d*p8xZyvc>(d3qyR{cQ_#5JoL=W^TUX$|*s+blt zzcS{BG&}P$8JiJwmEf)<&+!&51FWb~kGr_9gnAGd){tX5ygZ-&Kmxw(BE8?be!wyH zJjd9Du;I$!Fn2yUnQi1o@H;pQ_aPtnRecLtKdE2sY(%;M7`pQiIeroZ--y)`)UqD5 z-eF+7M7YCMxL=vp*sY;*TB&vi{q?(e-A1&I90VPWs!x=iV9_XVevd1?;1SYpK)$e8 z#3D?)GezTE(geme(XE~JT~I!;-Yyu>s5AkJRLlGgx&sXku9oqr(zr43d2PC7z+>zwj-`Z1tC($Uebct55`wc;$7!M6yV&We z1houh@3TL09wUX;o+_s{w>KG`eK!X3fN%DLL$K)$PEt^I<-M$B1*qiGdR%G3A6+ar z!V@$5CE4@VM-%(9Bu*Y1nq^(CNgi-qNrFXiQYTxu6izJoGLGe!{H2lvlcmj-+qvix zJdv5hJfkhfI-br(Hw4l{_wvX3!P7U>@GLZXTqMRHeNz)%ZZTI(L9A#5@E>;{}0~q55n>lV5eM{wk zJkFSC9M4wFC(aSAmq!9{o0pD@3{t?EQa&~YM{nNrs<7F>oBvhI`moz%`JW_>HQj`K z?2jKESS{mg{GwHIN`Q! z%t-juUZSz4rAp;bGCYK-zaeyVf&;OAkScS?vucI5*FCHPXK6TJt>yYsfUx32HGm|d zNQ6YkOWuS;rMilDOe)f)KGg6wBRRa2?V9)8H1F45-^~8Pg+p&&-Wx#$MtO~}4p*zpW%JgMggxl~Tc)`SxllUK+0WsxqrFA|2Z z(R0$BV*4}uJ?PPFKvt%26K*X_>*2@#avSBQp&{O3Nn|=1V&bajcE3iI>{o8}#26FLfaBO?m5CfZIRU+9_*Hi+0aOwJ z|Lr*Eo@(zg>YSL4jP9zFW`}d@9P;74M9;9rpF@9CtNWD-rTJ^@_~H58h`$F?`)&!q zd9*!|oDkNC9%WEgymmPB5b*~MQX*_lrnp>m)u1_W(ZXE}(n{_AKD}>i#e4e~O60Ml z_*eNSq|Tf+OSw8~>=dUmR&&lv^1cA8oVIG@UvSUDayE!FnqY6MOxw(+}j-8o)9T)+^ z@wg)e8d}oDOesr)V@mlmz&<1CA)dlz->bED6kE0AAWtuj{^Du`dx79Ebb zl*`1J9iqd8*d(C?#_3|Ec;gz>JO$4+>x&6>a@}ACBWH>T2??Xe*%zL4ydS!iNc3$< zza>lvv*rBC3bZO&;gLP@weK=T@}L~d)L*sLqkA~d{HU8+!c`=>DK3_&!aQ7IPnlOg z=rb<#y4G%A>L{w(x%ik>w!nwnBr%{E_w!GYLsznu?v z+}&rs`ow#T7}~wi0Jz#|OdA0Lsq;2u)tJ~8;Ji-u#-;l*ax>QtsA?w~#7H6S7R<}1 zvWu8D(Nacfszme6so*xQ3`iA9R`%9A^=-euuEb$J;d7#ovIco*Y;;N`zzx_Rz)E_0 zP%lu<6q=i=NZ+Lf0dJekL!khN=As?ogpa?xeE}mFB1uHHGN`(R7I_fy?8KNIUMTcsjuf zi_79WBE#D!B-ho}D>LD1+-Q;5snNJcVHou;*|ZG-CZ-cjH0M^vSDc{ z`IT@I-KA(Uj{YX>)QzF_EN*>OPHZG8Ci*#BD0L=&h|7{|Y=eVRYNm8|s*g(k?Ru@c zMAmb5WR}ZR9Ukv9XB_j==kQe5p4D#ZsCTkiLJw7Dy;mz{hYB!EDS_Oxp(0rj-qM6C zNgNltJr96fJ#ZIjwldMpS@|%}masAJ{-Xe_o4Nl)S?Qbd)0Q1?DU0cGzB!CHUplo2 z1KTo0qzk~I4VFPeu?0m6hIaSZ5=VF%rpC8I54NN?NjtZ~wT-qL<`n;0>P}nC6NM(0 zOIS)I956kNIX2hXOxzA8%vU=RE`=g-2@VXjR7;a_pDjj0i@CdCu&p*@%iAR#16Nf> zj<2J#AF#uAhFy$~9^?0?>#zx?ivnq}sLANqx&$=LR)OD%7LeEisJ)}>+a-B zo?Q6|1fF^NP#{RHO%cFhu6ONi>{HstCfsZ6e9fiUbm1DY+){gRH8mIcMHg6r+mPq9 z4H}yE6Z%~bDU!OQ3cT)=E`DE_yT4jZdCEKmpRKR^J8FO-yZ-7@Dh`q_l@PhUe_K9T z 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 literal 0 HcmV?d00001 diff --git a/board/arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi b/board/arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi new file mode 100644 index 000000000..02328336b --- /dev/null +++ b/board/arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi @@ -0,0 +1,25 @@ +/ { + config { + environment { + vendor = "Banana Pi"; + preboot = "led bananapi:green:usr on; run ixpreboot"; + boot_targets = "mmc0"; + ethprime = "eth0"; + + /* The sunxi board code resets fdtfile after the environment + * is imported, without the vendor directory on 32-bit Arm */ + ixvariant = "setenv fdtfile allwinner/sun7i-a20-bananapi.dtb"; + + /* 1 GiB DRAM at 0x40000000, the squashfs is loaded whole + * at ramdisk_addr_r so keep that last with room above it */ + fdt_addr_r = "0x42000000"; + kernel_addr_r = "0x43000000"; + scriptaddr = "0x48000000"; + ramdisk_addr_r = "0x49000000"; + + /* No user button, this is a development platform */ + ixbtn-devmode = "setenv dev_mode yes; echo Enabled"; + ixbtn-factory = "echo \"No button, use bootmenu\""; + }; + }; +}; diff --git a/board/arm/bananapi-bpi-m1/uboot/extras.config b/board/arm/bananapi-bpi-m1/uboot/extras.config new file mode 100644 index 000000000..e5d221816 --- /dev/null +++ b/board/arm/bananapi-bpi-m1/uboot/extras.config @@ -0,0 +1,6 @@ +CONFIG_DEVICE_TREE_INCLUDES="infix-env.dtsi infix-key.dtsi bpi-m1-env.dtsi" +CONFIG_SYS_PROMPT="(bpi-m1) " + +# CONFIG_ENV_IS_IN_FAT is not set +CONFIG_LED=y +CONFIG_LED_GPIO=y diff --git a/board/arm/linux_defconfig b/board/arm/linux_defconfig index 3c0639ad7..20ff6ac33 100644 --- a/board/arm/linux_defconfig +++ b/board/arm/linux_defconfig @@ -306,6 +306,7 @@ CONFIG_SERIAL_DEV_BUS=y CONFIG_VIRTIO_CONSOLE=y CONFIG_I2C_CHARDEV=y CONFIG_SPI=y +CONFIG_GPIOLIB=y CONFIG_THERMAL=y CONFIG_WATCHDOG=y CONFIG_I6300ESB_WDT=y diff --git a/configs/arm_defconfig b/configs/arm_defconfig index a48ad1138..6e93f8c39 100644 --- a/configs/arm_defconfig +++ b/configs/arm_defconfig @@ -137,6 +137,7 @@ BR2_PACKAGE_HOST_MTOOLS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y +BR2_PACKAGE_BANANAPI_BPI_M1=y BR2_PACKAGE_MICROCHIP_SAMA7G54_EK=y BR2_PACKAGE_RASPBERRYPI_RPI2=y IX_VENDOR_HOME="https://www.kernelkit.org" diff --git a/configs/arm_minimal_defconfig b/configs/arm_minimal_defconfig index c1b12bca1..bef740d37 100644 --- a/configs/arm_minimal_defconfig +++ b/configs/arm_minimal_defconfig @@ -115,6 +115,7 @@ BR2_PACKAGE_HOST_MTOOLS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y +BR2_PACKAGE_BANANAPI_BPI_M1=y BR2_PACKAGE_MICROCHIP_SAMA7G54_EK=y BR2_PACKAGE_RASPBERRYPI_RPI2=y IX_VENDOR_HOME="https://www.kernelkit.org" diff --git a/configs/bpi_m1_boot_defconfig b/configs/bpi_m1_boot_defconfig new file mode 100644 index 000000000..0d9999ddf --- /dev/null +++ b/configs/bpi_m1_boot_defconfig @@ -0,0 +1,38 @@ +BR2_arm=y +BR2_cortex_a7=y +BR2_ARM_FPU_NEON_VFPV4=y +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y +BR2_TOOLCHAIN_EXTERNAL_BOOTLIN_ARMV7_EABIHF_GLIBC_STABLE=y +BR2_DL_DIR="$(BR2_EXTERNAL_INFIX_PATH)/dl" +BR2_CCACHE=y +BR2_CCACHE_DIR="$(BR2_EXTERNAL_INFIX_PATH)/.ccache" +BR2_PACKAGE_OVERRIDE_FILE="$(BR2_EXTERNAL_INFIX_PATH)/local.mk" +BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_INFIX_PATH)/patches" +BR2_SSP_NONE=y +BR2_INIT_NONE=y +BR2_SYSTEM_BIN_SH_NONE=y +# BR2_PACKAGE_BUSYBOX is not set +# BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_UBOOT=y +BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y +BR2_TARGET_UBOOT_CUSTOM_VERSION=y +BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2025.01" +BR2_TARGET_UBOOT_BOARD_DEFCONFIG="Bananapi" +BR2_TARGET_UBOOT_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_INFIX_PATH)/board/common/uboot/extras.config $(BR2_EXTERNAL_INFIX_PATH)/board/arm/bananapi-bpi-m1/uboot/extras.config" +BR2_TARGET_UBOOT_NEEDS_DTC=y +BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y +BR2_TARGET_UBOOT_NEEDS_OPENSSL=y +BR2_TARGET_UBOOT_FORMAT_CUSTOM=y +BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-sunxi-with-spl.bin" +BR2_TARGET_UBOOT_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_INFIX_PATH)/board/arm/bananapi-bpi-m1/uboot/bpi-m1-env.dtsi" +BR2_PACKAGE_HOST_BMAP_TOOLS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_RAUC=y +BR2_PACKAGE_HOST_UBOOT_TOOLS=y +BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y +BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y +BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y +IX_TRUSTED_KEYS=y +IX_TRUSTED_KEYS_DEVELOPMENT=y diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 901fce15f..93b6f91d5 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -13,6 +13,8 @@ All notable changes to the project are documented in this file. `ripng`/`ospfv3` type and the IPv6 address-family - Support building without Frr, which also drops bash. The minimal defconfigs are now built this way, with static routing only, issue #1670 +- Add support for the Banana Pi BPI-M1 (Allwinner A20) to the 32-bit Arm + build, with a new `bpi_m1_boot_defconfig` for its U-Boot bootloader ### Fixes diff --git a/utils/mkimage.sh b/utils/mkimage.sh index 7738e4277..c942744e9 100755 --- a/utils/mkimage.sh +++ b/utils/mkimage.sh @@ -185,6 +185,9 @@ get_bootloader_name() acer-connect-vero-w6m) echo "bpi_r3_emmc_boot" ;; + bananapi-bpi-m1) + echo "bpi_m1_boot" + ;; bananapi-bpi-r3) if [ "$target" = "emmc" ]; then echo "bpi_r3_emmc_boot" From b38b9bf614943b715c13f00d54bf2cbdb47c91b8 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 18:50:25 +0200 Subject: [PATCH 04/10] statd: keep sensor names within the YANG pattern hwmon labels are free text, but normalize_sensor_name() only rewrote underscores, so a label like "SoC temperature" from the Allwinner A20 SoC sensor ended up in the name. The space breaks the pattern for sensor names, statd fails to parse the yanger data, and no hardware status is shown at all. Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 2 ++ src/statd/python/yanger/ietf_hardware.py | 7 ++++++- test/case/statd/sensors/cli/show-hardware | 1 + test/case/statd/sensors/ietf-hardware.json | 13 +++++++++++++ test/case/statd/sensors/operational.json | 13 +++++++++++++ .../system/rootfs/sys/class/hwmon/hwmon3/name | 1 + .../rootfs/sys/class/hwmon/hwmon3/temp1_input | 1 + .../rootfs/sys/class/hwmon/hwmon3/temp1_label | 1 + .../statd/sensors/system/run/ls_+sys+class+hwmon | 1 + .../sensors/system/run/ls_+sys+class+hwmon+hwmon3 | 3 +++ 10 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/name create mode 100644 test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_input create mode 100644 test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_label create mode 100644 test/case/statd/sensors/system/run/ls_+sys+class+hwmon+hwmon3 diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 93b6f91d5..7fb89c6ac 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -20,6 +20,8 @@ All notable changes to the project are documented in this file. - Fix FRR mgmtd crash loop on 32-bit Arm, caused by unaligned access to messages received from other daemons +- Fix missing hardware status when a sensor label has characters not + allowed in a sensor name, e.g., "SoC temperature" on the Allwinner A20 [v26.09.0][] - 2026-09-30 ------------------------- diff --git a/src/statd/python/yanger/ietf_hardware.py b/src/statd/python/yanger/ietf_hardware.py index b52580924..850c019d5 100644 --- a/src/statd/python/yanger/ietf_hardware.py +++ b/src/statd/python/yanger/ietf_hardware.py @@ -128,6 +128,7 @@ def normalize_sensor_name(name): cpu_thermal -> cpu-thermal s5_temp -> s5-temp pwmfan -> pwmfan + SoC temperature -> SoC-temperature Strategy: 1. Drop the vendor/chipset prefix of a per-port device, where the @@ -151,7 +152,11 @@ def normalize_sensor_name(name): # Remove underscores before trailing numbers (sfp_2 -> sfp2) name = re.sub(r'_(\d+)$', r'\1', name) - return name.replace("_", "-") + # Labels are free text, e.g. "SoC temperature", but a name must + # match the YANG pattern [a-zA-Z0-9_][a-zA-Z0-9_.:+@-]* + name = re.sub(r'[^a-zA-Z0-9.:+@]+', '-', name.replace("_", "-")) + + return name.strip("-") CPU_COMPONENT = "cpu" diff --git a/test/case/statd/sensors/cli/show-hardware b/test/case/statd/sensors/cli/show-hardware index fb22cbb1e..d906fa0a6 100644 --- a/test/case/statd/sensors/cli/show-hardware +++ b/test/case/statd/sensors/cli/show-hardware @@ -13,3 +13,4 @@ cpu: S5 Temp 59.5 °C ok pwmfan 3200 RPM ok +Soc Temperature 41.2 °C ok diff --git a/test/case/statd/sensors/ietf-hardware.json b/test/case/statd/sensors/ietf-hardware.json index 144df05d7..fd93712b3 100644 --- a/test/case/statd/sensors/ietf-hardware.json +++ b/test/case/statd/sensors/ietf-hardware.json @@ -68,6 +68,19 @@ "value-timestamp": "2026-01-02T20:43:23+00:00", "oper-status": "ok" } + }, + { + "name": "sun4i-ts-SoC-temperature", + "class": "iana-hardware:sensor", + "sensor-data": { + "value": 41200, + "value-type": "celsius", + "value-scale": "milli", + "value-precision": 0, + "value-timestamp": "2026-01-02T20:43:23+00:00", + "oper-status": "ok" + }, + "description": "Soc Temperature" } ] } diff --git a/test/case/statd/sensors/operational.json b/test/case/statd/sensors/operational.json index 144df05d7..fd93712b3 100644 --- a/test/case/statd/sensors/operational.json +++ b/test/case/statd/sensors/operational.json @@ -68,6 +68,19 @@ "value-timestamp": "2026-01-02T20:43:23+00:00", "oper-status": "ok" } + }, + { + "name": "sun4i-ts-SoC-temperature", + "class": "iana-hardware:sensor", + "sensor-data": { + "value": 41200, + "value-type": "celsius", + "value-scale": "milli", + "value-precision": 0, + "value-timestamp": "2026-01-02T20:43:23+00:00", + "oper-status": "ok" + }, + "description": "Soc Temperature" } ] } diff --git a/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/name b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/name new file mode 100644 index 000000000..80a569b99 --- /dev/null +++ b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/name @@ -0,0 +1 @@ +sun4i_ts diff --git a/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_input b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_input new file mode 100644 index 000000000..1a112cfa2 --- /dev/null +++ b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_input @@ -0,0 +1 @@ +41200 diff --git a/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_label b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_label new file mode 100644 index 000000000..8d9a877a5 --- /dev/null +++ b/test/case/statd/sensors/system/rootfs/sys/class/hwmon/hwmon3/temp1_label @@ -0,0 +1 @@ +SoC temperature diff --git a/test/case/statd/sensors/system/run/ls_+sys+class+hwmon b/test/case/statd/sensors/system/run/ls_+sys+class+hwmon index b51997471..324efcb17 100644 --- a/test/case/statd/sensors/system/run/ls_+sys+class+hwmon +++ b/test/case/statd/sensors/system/run/ls_+sys+class+hwmon @@ -1,3 +1,4 @@ hwmon0 hwmon1 hwmon2 +hwmon3 diff --git a/test/case/statd/sensors/system/run/ls_+sys+class+hwmon+hwmon3 b/test/case/statd/sensors/system/run/ls_+sys+class+hwmon+hwmon3 new file mode 100644 index 000000000..27c20f9a3 --- /dev/null +++ b/test/case/statd/sensors/system/run/ls_+sys+class+hwmon+hwmon3 @@ -0,0 +1,3 @@ +name +temp1_input +temp1_label From 9e19ee6668818b70eeb1b4b6f5fb5c6a4968cd9b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 20:36:02 +0200 Subject: [PATCH 05/10] configs: build 32-bit Arm with 64-bit time_t libuev exports -D_TIME_BITS=64 to its users, its ABI has time_t in it, so mdns-alias and finit were built with a 64-bit time_t while everything else on 32-bit Arm used 32 bits. mdns-alias passes a struct timeval between libuev and Avahi, read the wrong size, and turned D-Bus timeouts into garbage. Avahi then reported every connection attempt as "Memory exhausted" and mdns-alias never got to publish anything. One time ABI for the whole system also makes 32-bit Arm Y2038 ready. Signed-off-by: Joachim Wiberg --- configs/arm_defconfig | 1 + configs/arm_minimal_defconfig | 1 + doc/ChangeLog.md | 2 ++ 3 files changed, 4 insertions(+) diff --git a/configs/arm_defconfig b/configs/arm_defconfig index 6e93f8c39..4c3e3be0c 100644 --- a/configs/arm_defconfig +++ b/configs/arm_defconfig @@ -10,6 +10,7 @@ BR2_CCACHE_DIR="${BR2_EXTERNAL_INFIX_PATH}/.ccache" BR2_ENABLE_DEBUG=y BR2_GLOBAL_PATCH_DIR="${BR2_EXTERNAL_INFIX_PATH}/patches" BR2_DOWNLOAD_FORCE_CHECK_HASHES=y +BR2_TIME_BITS_64=y BR2_TARGET_GENERIC_HOSTNAME="infix" BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit" BR2_INIT_FINIT=y diff --git a/configs/arm_minimal_defconfig b/configs/arm_minimal_defconfig index bef740d37..3e6d958f8 100644 --- a/configs/arm_minimal_defconfig +++ b/configs/arm_minimal_defconfig @@ -10,6 +10,7 @@ BR2_CCACHE_DIR="${BR2_EXTERNAL_INFIX_PATH}/.ccache" BR2_ENABLE_DEBUG=y BR2_GLOBAL_PATCH_DIR="${BR2_EXTERNAL_INFIX_PATH}/patches" BR2_DOWNLOAD_FORCE_CHECK_HASHES=y +BR2_TIME_BITS_64=y BR2_TARGET_GENERIC_HOSTNAME="ix" BR2_TARGET_GENERIC_ISSUE="Infix by KernelKit" BR2_INIT_FINIT=y diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 7fb89c6ac..1ba28c8f3 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -20,6 +20,8 @@ All notable changes to the project are documented in this file. - Fix FRR mgmtd crash loop on 32-bit Arm, caused by unaligned access to messages received from other daemons +- Fix mdns-alias failing to publish on 32-bit Arm, every retry ended in + "Memory exhausted". The 32-bit Arm builds now use 64-bit `time_t` - Fix missing hardware status when a sensor label has characters not allowed in a sensor name, e.g., "SoC temperature" on the Allwinner A20 From c55e15ee8f64971e1e5d7f5b0040f0b8fb0a8a0e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 20:36:56 +0200 Subject: [PATCH 06/10] configs: build 32-bit Arm without FRR The 32-bit Arm boards are small, and FRR with bash is a big part of the image. Static routing covers what they are used for. As with the minimal builds, BUSYBOX_SHOW_OTHERS is set explicitly, since it was selected only through bash. neofetch goes too, it selects bash. Signed-off-by: Joachim Wiberg --- configs/arm_defconfig | 5 +---- doc/ChangeLog.md | 3 ++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/configs/arm_defconfig b/configs/arm_defconfig index 4c3e3be0c..c1949506d 100644 --- a/configs/arm_defconfig +++ b/configs/arm_defconfig @@ -34,6 +34,7 @@ BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="${BR2_EXTERNAL_INFIX_PATH}/board/arm/linux_ BR2_LINUX_KERNEL_INSTALL_TARGET=y BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y BR2_PACKAGE_BUSYBOX_CONFIG="${BR2_EXTERNAL_INFIX_PATH}/board/common/busybox_defconfig" +BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_STRACE=y BR2_PACKAGE_STRESS_NG=y BR2_PACKAGE_JQ=y @@ -69,7 +70,6 @@ BR2_PACKAGE_CONNTRACK_TOOLS=y BR2_PACKAGE_DNSMASQ=y BR2_PACKAGE_ETHTOOL=y BR2_PACKAGE_FPING=y -BR2_PACKAGE_FRR=y # BR2_PACKAGE_IFUPDOWN_SCRIPTS is not set BR2_PACKAGE_IPERF3=y BR2_PACKAGE_IPROUTE2=y @@ -99,9 +99,6 @@ BR2_PACKAGE_TRACEROUTE=y BR2_PACKAGE_ULOGD=y BR2_PACKAGE_WHOIS=y BR2_PACKAGE_WIREGUARD_TOOLS=y -BR2_PACKAGE_BASH=y -BR2_PACKAGE_BASH_COMPLETION=y -BR2_PACKAGE_NEOFETCH=y BR2_PACKAGE_SUDO=y BR2_PACKAGE_TTYD=y BR2_PACKAGE_GETENT=y diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 1ba28c8f3..ad0cde25f 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -12,7 +12,8 @@ All notable changes to the project are documented in this file. ietf-rip and ietf-ospf models, selected per control-plane-protocol by the `ripng`/`ospfv3` type and the IPv6 address-family - Support building without Frr, which also drops bash. The minimal - defconfigs are now built this way, with static routing only, issue #1670 + defconfigs, and the 32-bit Arm build, are now built this way, with + static routing only, issue #1670 - Add support for the Banana Pi BPI-M1 (Allwinner A20) to the 32-bit Arm build, with a new `bpi_m1_boot_defconfig` for its U-Boot bootloader From f1716cc7f04646d918e74327659047549a8d15f1 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 22:59:27 +0200 Subject: [PATCH 07/10] patches/iito: fix crash on 32-bit Arm iitod unpacked a boolean into a bool where jansson writes an int, corrupting the stack on 32-bit Arm as soon as an LED was set on or off, and printed 64-bit integers with %d, so blink rates came out wrong. Two latent bugs found along the way are fixed too: rule inputs were matched by name prefix, and resolving an alias freed a string still in use by the config. Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 2 ++ ...Include-PID-of-iitod-in-log-messages.patch | 26 ++++++++++++++++ ...npack-boolean-brightness-into-an-int.patch | 28 +++++++++++++++++ ...teger-attributes-with-JSON_INTEGER_F.patch | 30 +++++++++++++++++++ ...ase-a-borrowed-reference-when-resolv.patch | 29 ++++++++++++++++++ .../0005-in-match-input-names-exactly.patch | 28 +++++++++++++++++ 6 files changed, 143 insertions(+) create mode 100644 patches/iito/1.1.0/0001-Include-PID-of-iitod-in-log-messages.patch create mode 100644 patches/iito/1.1.0/0002-out-led-unpack-boolean-brightness-into-an-int.patch create mode 100644 patches/iito/1.1.0/0003-out-led-print-integer-attributes-with-JSON_INTEGER_F.patch create mode 100644 patches/iito/1.1.0/0004-main-do-not-release-a-borrowed-reference-when-resolv.patch create mode 100644 patches/iito/1.1.0/0005-in-match-input-names-exactly.patch diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index ad0cde25f..003bc2127 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -23,6 +23,8 @@ All notable changes to the project are documented in this file. messages received from other daemons - Fix mdns-alias failing to publish on 32-bit Arm, every retry ended in "Memory exhausted". The 32-bit Arm builds now use 64-bit `time_t` +- Fix the LED daemon, iitod, crashing on 32-bit Arm, which left all LEDs + off after boot - Fix missing hardware status when a sensor label has characters not allowed in a sensor name, e.g., "SoC temperature" on the Allwinner A20 diff --git a/patches/iito/1.1.0/0001-Include-PID-of-iitod-in-log-messages.patch b/patches/iito/1.1.0/0001-Include-PID-of-iitod-in-log-messages.patch new file mode 100644 index 000000000..df1c73905 --- /dev/null +++ b/patches/iito/1.1.0/0001-Include-PID-of-iitod-in-log-messages.patch @@ -0,0 +1,26 @@ +From eae602bb76ac734bc1415e87581eade573435dea Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Mon, 8 Jan 2024 10:21:08 +0100 +Subject: [PATCH 1/8] Include [PID] of iitod in log messages +Organization: Wires + +--- + src/main.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/main.c b/src/main.c +index e98152e..3c035c6 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -89,9 +89,10 @@ int main(int argc, char **argv) + struct ev_loop *loop = ev_default_loop(0); + const char *file = DEFAULT_CONFIG; + struct ev_signal sigusr[2]; +- int err, opt, logopt = 0; ++ int logopt = LOG_PID; + json_t *ins, *outs; + json_error_t jerr; ++ int err, opt; + + while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) > 0) { + switch (opt) { diff --git a/patches/iito/1.1.0/0002-out-led-unpack-boolean-brightness-into-an-int.patch b/patches/iito/1.1.0/0002-out-led-unpack-boolean-brightness-into-an-int.patch new file mode 100644 index 000000000..33a97291f --- /dev/null +++ b/patches/iito/1.1.0/0002-out-led-unpack-boolean-brightness-into-an-int.patch @@ -0,0 +1,28 @@ +From 1ad066f300ecbc73ef24b0f35e3c278696e5dc3d Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 22:05:45 +0200 +Subject: [PATCH 2/8] out-led: unpack boolean brightness into an int +Organization: Wires + +jansson's "b" format stores an int, but set_max was a bool, so unpacking +"brightness": true or false wrote past it on the stack. On 32-bit Arm +this clobbers other locals and iitod dies with SIGSEGV as soon as a rule +like @on or @off is applied. + +--- + src/out-led.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/out-led.c b/src/out-led.c +index ec4f3e6..ed9c173 100644 +--- a/src/out-led.c ++++ b/src/out-led.c +@@ -14,7 +14,7 @@ static int out_led_apply(struct out_dev *odev, struct out_rule *rule) + struct out_led *ol = container_of(odev, struct out_led, odev); + const char *key, *trigger = "none"; + int brightness = 0; +- bool set_max; ++ int set_max; + json_t *val; + + if (!uddev_present(&ol->uddev)) { diff --git a/patches/iito/1.1.0/0003-out-led-print-integer-attributes-with-JSON_INTEGER_F.patch b/patches/iito/1.1.0/0003-out-led-print-integer-attributes-with-JSON_INTEGER_F.patch new file mode 100644 index 000000000..63085f6b9 --- /dev/null +++ b/patches/iito/1.1.0/0003-out-led-print-integer-attributes-with-JSON_INTEGER_F.patch @@ -0,0 +1,30 @@ +From 3b9e7ca6c9dbcf3a87acece4f6a1a4a77fbe059b Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 22:05:56 +0200 +Subject: [PATCH 3/8] out-led: print integer attributes with + JSON_INTEGER_FORMAT +Organization: Wires + +json_integer_value() returns a json_int_t, a long long on most systems, +but it was printed with %d. On 32-bit Arm the variadic 64-bit argument +is aligned in a register pair, so %d picks up the wrong word and timer +attributes like delay_on get garbage, the LED never blinks. + +--- + src/out-led.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/out-led.c b/src/out-led.c +index ed9c173..0b9192b 100644 +--- a/src/out-led.c ++++ b/src/out-led.c +@@ -70,7 +70,8 @@ static int out_led_apply(struct out_dev *odev, struct out_rule *rule) + return -EIO; + break; + case JSON_INTEGER: +- if (uddev_set_sysfs(&ol->uddev, key, "%d", json_integer_value(val))) ++ if (uddev_set_sysfs(&ol->uddev, key, "%" JSON_INTEGER_FORMAT, ++ json_integer_value(val))) + return -EIO; + break; + case JSON_TRUE: diff --git a/patches/iito/1.1.0/0004-main-do-not-release-a-borrowed-reference-when-resolv.patch b/patches/iito/1.1.0/0004-main-do-not-release-a-borrowed-reference-when-resolv.patch new file mode 100644 index 000000000..4462b7d5a --- /dev/null +++ b/patches/iito/1.1.0/0004-main-do-not-release-a-borrowed-reference-when-resolv.patch @@ -0,0 +1,29 @@ +From aae2b54f87170f47452f094cf8dafb1ebf53bd6b Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 22:57:42 +0200 +Subject: [PATCH 4/8] main: do not release a borrowed reference when resolving + an alias +Organization: Wires + +alias_resolve() is handed the rule's "then" value as unpacked from the +config, a borrowed reference, but released it when replacing it with +the alias. That dropped the config's own reference to the string and +freed it while the config still pointed to it. + +--- + src/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/main.c b/src/main.c +index 3c035c6..2563a87 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -19,7 +19,7 @@ int alias_resolve(json_t **aliasp) + return -ENOENT; + } + +- json_decref(*aliasp); ++ /* Both are borrowed from g_config, which outlives every rule */ + *aliasp = alias; + return 0; + } diff --git a/patches/iito/1.1.0/0005-in-match-input-names-exactly.patch b/patches/iito/1.1.0/0005-in-match-input-names-exactly.patch new file mode 100644 index 000000000..97a6b4905 --- /dev/null +++ b/patches/iito/1.1.0/0005-in-match-input-names-exactly.patch @@ -0,0 +1,28 @@ +From bc27366f010c5e77d7dbb7240a5e7676fb280ac7 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 22:57:52 +0200 +Subject: [PATCH 5/8] in: match input names exactly +Organization: Wires + +in_dev_find() compared only as many characters as the rule's name has, +so a rule on "fault" bound to whichever input starting with "fault", +e.g. "fault-prime", was probed first. + +--- + src/in.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/in.c b/src/in.c +index 11782ca..2cfe023 100644 +--- a/src/in.c ++++ b/src/in.c +@@ -34,7 +34,8 @@ int in_dev_find(const char *nameprop, struct in_dev **idevp, const char **propp) + sep = index(nameprop, '\0'); + + for (i = 0, idev = g_in_devs; i < g_in_devs_n; i++, idev++) { +- if (!strncmp(nameprop, (*idev)->name, sep - nameprop)) { ++ if (strlen((*idev)->name) == (size_t)(sep - nameprop) && ++ !strncmp(nameprop, (*idev)->name, sep - nameprop)) { + *idevp = *idev; + return 0; + } From 615fa09d8daf585aecd4398411f8c5f8cf9dc031 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 5 Oct 2026 18:13:16 +0200 Subject: [PATCH 08/10] patches/iito: add iitoctl and locate iitod gets a control socket, root:wheel so admin users need no sudo, and the iitoctl tool to show which rule drives each LED and why. The new locate method sets the config's locate input, optionally for a number of seconds, the base for a locate RPC. Which LEDs blink, and how, stays with each board's iitod.json. The patches change Makefile.am, so the package is now autoreconfigured. Signed-off-by: Joachim Wiberg --- doc/ChangeLog.md | 2 + package/iito/iito.mk | 2 + ...d-an-IPC-socket-with-a-status-method.patch | 539 ++++++++++++++++++ ...-controlling-the-config-s-locate-inp.patch | 211 +++++++ ...-new-tool-to-query-and-control-iitod.patch | 434 ++++++++++++++ 5 files changed, 1188 insertions(+) create mode 100644 patches/iito/1.1.0/0006-iitod-add-an-IPC-socket-with-a-status-method.patch create mode 100644 patches/iito/1.1.0/0007-iitod-add-locate-controlling-the-config-s-locate-inp.patch create mode 100644 patches/iito/1.1.0/0008-iitoctl-new-tool-to-query-and-control-iitod.patch diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index 003bc2127..e342af596 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -16,6 +16,8 @@ All notable changes to the project are documented in this file. static routing only, issue #1670 - Add support for the Banana Pi BPI-M1 (Allwinner A20) to the 32-bit Arm build, with a new `bpi_m1_boot_defconfig` for its U-Boot bootloader +- New `iitoctl` tool, shows which rule drives each LED and why, and can + start locate, the board's LEDs blink as configured: `iitoctl locate on` ### Fixes diff --git a/package/iito/iito.mk b/package/iito/iito.mk index 0d51f205a..bfc9d3635 100644 --- a/package/iito/iito.mk +++ b/package/iito/iito.mk @@ -9,6 +9,8 @@ IITO_SITE = https://github.com/kernelkit/iito/releases/download/v$(IITO_VERSION) IITO_LICENSE = GPL-2.0 IITO_LICENSE_FILES = COPYING IITO_DEPENDENCIES = jansson libev udev +# Patches touch Makefile.am +IITO_AUTORECONF = YES define IITO_INSTALL_HOOK $(INSTALL) -D -m 0644 $(IITO_PKGDIR)/iitod.svc $(FINIT_D)/available/iitod.conf diff --git a/patches/iito/1.1.0/0006-iitod-add-an-IPC-socket-with-a-status-method.patch b/patches/iito/1.1.0/0006-iitod-add-an-IPC-socket-with-a-status-method.patch new file mode 100644 index 000000000..22e61d8a3 --- /dev/null +++ b/patches/iito/1.1.0/0006-iitod-add-an-IPC-socket-with-a-status-method.patch @@ -0,0 +1,539 @@ +From 3ec2a5059dfc6f3b5fee502e33632329e2f202e1 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Sun, 4 Oct 2026 22:51:27 +0200 +Subject: [PATCH 6/8] iitod: add an IPC socket with a status method +Organization: Wires + +Seeing why an LED is in a given state meant reading the config and +guessing which inputs were set. iitod now listens on /run/iitod.sock, +root:wheel 0660 so admin users need no sudo, and answers a JSON status +request with every input's value, and every output's rules with their +current value, the active one, and the alias each rule was written with. + +The reply is JSON so that tools and management systems can use it +directly, a human friendly view belongs in the client. + +--- + src/Makefile.am | 3 +- + src/iito.h | 12 ++++ + src/in-path.c | 1 + + src/in-udev.c | 1 + + src/in.c | 24 +++++++ + src/ipc.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/ipc.h | 16 +++++ + src/main.c | 14 +++- + src/out-led.c | 9 +++ + src/out.c | 52 ++++++++++++++ + 10 files changed, 317 insertions(+), 3 deletions(-) + create mode 100644 src/ipc.c + create mode 100644 src/ipc.h + +diff --git a/src/Makefile.am b/src/Makefile.am +index cb59734..ca194ce 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -10,4 +10,5 @@ iitod_SOURCES = \ + \ + out-led.c \ + \ +- in.c out.c main.c uddev.c iito.h ++ in.c out.c main.c uddev.c iito.h \ ++ ipc.c ipc.h +diff --git a/src/iito.h b/src/iito.h +index 198651d..5fdab0f 100644 +--- a/src/iito.h ++++ b/src/iito.h +@@ -69,6 +69,7 @@ int uddev_init(struct uddev *uddev); + + struct in_dev { + const char *name; ++ const char *type; + + int (*sample)(struct in_dev *dev, const char *prop, bool *state); + }; +@@ -84,6 +85,8 @@ int in_probe(json_t *ins); + + int in_dev_find(const char *nameprop, struct in_dev **idevp, const char **propp); + ++json_t *in_status(void); ++ + + /* output */ + +@@ -92,19 +95,23 @@ struct out_rule { + struct in_dev *idev; + const char *prop; + json_t *state; ++ char *alias; + void *priv; + }; + + struct out_dev { + const char *name; ++ const char *type; + struct out_rule *rules; + size_t n_rules; + + struct out_rule *active_rule; + int (*apply)(struct out_dev *odev, struct out_rule *rule); ++ bool (*present)(struct out_dev *odev); + }; + + void out_dump(void); ++json_t *out_status(void); + + int out_update(const struct in_dev *filter); + +@@ -119,6 +126,11 @@ struct out_drv { + int out_probe(json_t *outs); + + ++/* ipc */ ++ ++int ipc_init(struct ev_loop *loop, const char *path); ++ ++ + /* main */ + + int alias_resolve(json_t **aliasp); +diff --git a/src/in-path.c b/src/in-path.c +index 275a772..2090758 100644 +--- a/src/in-path.c ++++ b/src/in-path.c +@@ -41,6 +41,7 @@ static int in_path_probe(const char *name, json_t *data) + assert(ip); + + ip->dev.name = name; ++ ip->dev.type = "path"; + ip->dev.sample = in_path_sample; + + err = json_unpack(data, "{s:s}", "path", &path); +diff --git a/src/in-udev.c b/src/in-udev.c +index 7600c00..b4c216b 100644 +--- a/src/in-udev.c ++++ b/src/in-udev.c +@@ -64,6 +64,7 @@ static int in_udev_probe(const char *name, json_t *data) + *iu = (struct in_udev) { + .idev = { + .name = name, ++ .type = "udev", + .sample = in_udev_sample, + }, + .uddev = { +diff --git a/src/in.c b/src/in.c +index 2cfe023..9696298 100644 +--- a/src/in.c ++++ b/src/in.c +@@ -14,6 +14,7 @@ static void in_true_probe(void) + assert(tru); + + tru->name = "true"; ++ tru->type = "builtin"; + tru->sample = in_true_sample; + in_dev_add(tru); + } +@@ -56,6 +57,29 @@ void in_dev_add(struct in_dev *idev) + g_in_devs = idevs; + } + ++json_t *in_status(void) ++{ ++ struct in_dev **idev; ++ json_t *ins, *val; ++ bool state; ++ size_t i; ++ ++ ins = json_array(); ++ for (i = 0, idev = g_in_devs; i < g_in_devs_n; i++, idev++) { ++ if ((*idev)->sample(*idev, NULL, &state)) ++ val = json_null(); ++ else ++ val = json_boolean(state); ++ ++ json_array_append_new(ins, json_pack("{s:s, s:s, s:o}", ++ "name", (*idev)->name, ++ "type", (*idev)->type, ++ "value", val)); ++ } ++ ++ return ins; ++} ++ + extern const struct in_drv in_path; + extern const struct in_drv in_udev; + +diff --git a/src/ipc.c b/src/ipc.c +new file mode 100644 +index 0000000..e179c16 +--- /dev/null ++++ b/src/ipc.c +@@ -0,0 +1,188 @@ ++#include "iito.h" ++#include "ipc.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++struct ipc_method { ++ const char *name; ++ json_t *(*call)(json_t *params, const char **err); ++}; ++ ++static struct ev_io g_ipc_ev; ++ ++static json_t *ipc_status(json_t *params, const char **err) ++{ ++ return json_pack("{s:o, s:o}", ++ "inputs", in_status(), ++ "outputs", out_status()); ++} ++ ++static const struct ipc_method ipc_methods[] = { ++ { "status", ipc_status }, ++ ++ { NULL } ++}; ++ ++static json_t *ipc_call(const char *req) ++{ ++ const struct ipc_method *m; ++ json_t *msg, *params = NULL, *result = NULL, *reply; ++ const char *method, *err = "unknown method"; ++ json_error_t jerr; ++ ++ msg = json_loads(req, JSON_DISABLE_EOF_CHECK, &jerr); ++ if (!msg) ++ return json_pack("{s:s}", "error", "invalid request"); ++ ++ if (json_unpack(msg, "{s:s, s?o}", "method", &method, "params", ¶ms)) { ++ json_decref(msg); ++ return json_pack("{s:s}", "error", "request lacks a method"); ++ } ++ ++ for (m = ipc_methods; m->name; m++) { ++ if (!strcmp(m->name, method)) { ++ err = "failed"; ++ result = m->call(params, &err); ++ break; ++ } ++ } ++ ++ if (result) ++ reply = json_pack("{s:o}", "result", result); ++ else ++ reply = json_pack("{s:s}", "error", err); ++ ++ json_decref(msg); ++ return reply; ++} ++ ++static void ipc_send(int sd, json_t *reply) ++{ ++ size_t len, off = 0; ++ ssize_t n; ++ char *buf; ++ ++ buf = json_dumps(reply, JSON_COMPACT); ++ json_decref(reply); ++ if (!buf) ++ return; ++ ++ len = strlen(buf); ++ buf[len++] = '\n'; /* json_dumps() leaves room for the NUL */ ++ ++ while (off < len) { ++ n = write(sd, &buf[off], len - off); ++ if (n <= 0) ++ break; ++ off += n; ++ } ++ ++ free(buf); ++} ++ ++/* ++ * Time left until the request deadline, as a receive timeout, or false ++ * once the deadline has passed. ++ */ ++static bool ipc_time_left(const struct timespec *deadline, struct timeval *tv) ++{ ++ struct timespec now; ++ long long us; ++ ++ clock_gettime(CLOCK_MONOTONIC, &now); ++ us = (deadline->tv_sec - now.tv_sec) * 1000000LL + ++ (deadline->tv_nsec - now.tv_nsec) / 1000; ++ if (us <= 0) ++ return false; ++ ++ tv->tv_sec = us / 1000000; ++ tv->tv_usec = us % 1000000; ++ return true; ++} ++ ++static void ipc_cb(struct ev_loop *loop, struct ev_io *w, int revents) ++{ ++ /* ++ * Bound how long a client can hold up the event loop, in total, ++ * a per-read timeout alone lets a trickling client stall us. ++ */ ++ struct timeval tv = { .tv_sec = 1 }; ++ struct timespec deadline; ++ char buf[IPC_MAX_MSG]; ++ size_t len = 0; ++ ssize_t n; ++ int sd; ++ ++ sd = accept4(w->fd, NULL, NULL, SOCK_CLOEXEC); ++ if (sd < 0) { ++ log_err("(ipc) Failed accepting connection: %s", strerror(errno)); ++ return; ++ } ++ ++ setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); ++ ++ clock_gettime(CLOCK_MONOTONIC, &deadline); ++ deadline.tv_sec += 1; ++ ++ while (len < sizeof(buf) - 1 && ipc_time_left(&deadline, &tv)) { ++ setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); ++ n = read(sd, &buf[len], sizeof(buf) - 1 - len); ++ if (n <= 0) ++ break; ++ ++ len += n; ++ if (memchr(buf, '\n', len)) ++ break; ++ } ++ buf[len] = 0; ++ ++ ipc_send(sd, ipc_call(buf)); ++ close(sd); ++} ++ ++int ipc_init(struct ev_loop *loop, const char *path) ++{ ++ struct sockaddr_un sun = { .sun_family = AF_UNIX }; ++ struct group *gr; ++ int sd, err; ++ ++ if (strlen(path) >= sizeof(sun.sun_path)) { ++ log_err("(ipc) Socket path too long: %s", path); ++ return -ENAMETOOLONG; ++ } ++ strcpy(sun.sun_path, path); ++ ++ sd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0); ++ if (sd < 0) ++ goto err; ++ ++ unlink(path); ++ if (bind(sd, (struct sockaddr *)&sun, sizeof(sun)) || listen(sd, 8)) ++ goto err; ++ ++ /* Admin users, members of IPC_GROUP, may query and control us */ ++ gr = getgrnam(IPC_GROUP); ++ if (!gr || chown(path, -1, gr->gr_gid)) { ++ log_wrn("(ipc) Unable to grant group %s access to %s", IPC_GROUP, path); ++ gr = NULL; ++ } ++ ++ if (chmod(path, gr ? 0660 : 0600)) ++ goto err; ++ ++ ev_io_init(&g_ipc_ev, ipc_cb, sd, EV_READ); ++ ev_io_start(loop, &g_ipc_ev); ++ return 0; ++ ++err: ++ err = errno; ++ log_err("(ipc) Failed setting up %s: %s", path, strerror(err)); ++ if (sd >= 0) ++ close(sd); ++ return -err; ++} +diff --git a/src/ipc.h b/src/ipc.h +new file mode 100644 +index 0000000..1f4e5fe +--- /dev/null ++++ b/src/ipc.h +@@ -0,0 +1,16 @@ ++#ifndef _IITO_IPC_H ++#define _IITO_IPC_H ++ ++/* ++ * iitod listens on a UNIX stream socket. A client sends one JSON ++ * request terminated by a newline, iitod sends back one JSON reply, ++ * also newline terminated, and closes the connection. ++ * ++ * request: { "method": "status" } ++ * reply: { "result": { ... } } or { "error": "reason" } ++ */ ++#define IPC_SOCKET "/run/iitod.sock" ++#define IPC_GROUP "wheel" ++#define IPC_MAX_MSG 4096 ++ ++#endif /* _IITO_IPC_H */ +diff --git a/src/main.c b/src/main.c +index 2563a87..909492f 100644 +--- a/src/main.c ++++ b/src/main.c +@@ -2,6 +2,7 @@ + + #define SYSLOG_NAMES + #include "iito.h" ++#include "ipc.h" + + static json_t *g_config; + +@@ -58,16 +59,18 @@ static void usage() + " -f, --config=FILE Use configuration from FILE instead of %s\n" + " -h, --help Print usage message and exit\n" + " -l, --loglevel=LVL Log level: none, err, warn, notice*, info, debug\n" ++ " -s, --socket=PATH Listen for iitoctl on PATH instead of %s\n" + " -v, --version Print version information\n", +- DEFAULT_CONFIG); ++ DEFAULT_CONFIG, IPC_SOCKET); + } + +-static const char *sopts = "df:hl:v"; ++static const char *sopts = "df:hl:s:v"; + static struct option lopts[] = { + { "debug", no_argument, 0, 'd' }, + { "config", required_argument, 0, 'f' }, + { "help", no_argument, 0, 'h' }, + { "loglevel", required_argument, 0, 'l' }, ++ { "socket", required_argument, 0, 's' }, + { "version", no_argument, 0, 'v' }, + + { NULL } +@@ -88,6 +91,7 @@ int main(int argc, char **argv) + { + struct ev_loop *loop = ev_default_loop(0); + const char *file = DEFAULT_CONFIG; ++ const char *sock = IPC_SOCKET; + struct ev_signal sigusr[2]; + int logopt = LOG_PID; + json_t *ins, *outs; +@@ -113,6 +117,9 @@ int main(int argc, char **argv) + exit(1); + } + break; ++ case 's': ++ sock = optarg; ++ break; + case 'v': + puts(PACKAGE_STRING); + return 0; +@@ -168,6 +175,9 @@ int main(int argc, char **argv) + return 1; + } + ++ /* LEDs keep working without it, so only log a failure */ ++ ipc_init(loop, sock); ++ + ev_signal_init(&sigusr[0], sigusr1_cb, SIGUSR1); + ev_signal_init(&sigusr[1], sigusr2_cb, SIGUSR2); + ev_signal_start(loop, &sigusr[0]); +diff --git a/src/out-led.c b/src/out-led.c +index 0b9192b..355409d 100644 +--- a/src/out-led.c ++++ b/src/out-led.c +@@ -95,6 +95,13 @@ static int out_led_apply(struct out_dev *odev, struct out_rule *rule) + return 0; + } + ++static bool out_led_present(struct out_dev *odev) ++{ ++ struct out_led *ol = container_of(odev, struct out_led, odev); ++ ++ return uddev_present(&ol->uddev); ++} ++ + static void out_led_set_max(struct out_led *ol) + { + const char *maxstr; +@@ -148,7 +155,9 @@ static int out_led_probe(const char *name, struct out_rule *rules, + *ol = (struct out_led) { + .odev = { + .name = name, ++ .type = "led", + .apply = out_led_apply, ++ .present = out_led_present, + .rules = rules, + .n_rules = n_rules, + }, +diff --git a/src/out.c b/src/out.c +index 715f4d0..681926b 100644 +--- a/src/out.c ++++ b/src/out.c +@@ -23,6 +23,53 @@ void out_dump(void) + } + } + ++static json_t *out_rule_status(struct out_rule *rule) ++{ ++ char cond[128]; ++ json_t *val; ++ bool state; ++ ++ snprintf(cond, sizeof(cond), "%s%s%s%s", rule->invert ? "!" : "", ++ rule->idev->name, rule->prop ? ":" : "", rule->prop ? : ""); ++ ++ if (rule->idev->sample(rule->idev, rule->prop, &state)) ++ val = json_null(); ++ else ++ val = json_boolean(state ^ rule->invert); ++ ++ val = json_pack("{s:s, s:o, s:O}", "if", cond, "value", val, ++ "then", rule->state); ++ if (rule->alias) ++ json_object_set_new(val, "alias", json_string(rule->alias)); ++ ++ return val; ++} ++ ++json_t *out_status(void) ++{ ++ struct out_dev **odev; ++ json_t *outs, *rules; ++ size_t i, j; ++ ++ outs = json_array(); ++ for (i = 0, odev = g_out_devs; i < g_out_devs_n; i++, odev++) { ++ rules = json_array(); ++ for (j = 0; j < (*odev)->n_rules; j++) ++ json_array_append_new(rules, out_rule_status(&(*odev)->rules[j])); ++ ++ json_array_append_new(outs, json_pack("{s:s, s:s, s:b, s:o, s:o}", ++ "name", (*odev)->name, ++ "type", (*odev)->type, ++ "present", (*odev)->present(*odev), ++ "active", (*odev)->active_rule ? ++ json_integer((*odev)->active_rule - (*odev)->rules) : ++ json_null(), ++ "rules", rules)); ++ } ++ ++ return outs; ++} ++ + void out_dev_add(struct out_dev *odev) + { + struct out_dev **odevs; +@@ -140,6 +187,11 @@ static int out_probe_rule(json_t *data, struct out_rule *rule) + if (err) + return err; + ++ if (json_is_string(rule->state)) { ++ rule->alias = strdup(json_string_value(rule->state)); ++ assert(rule->alias); ++ } ++ + err = alias_resolve(&rule->state); + if (err) + return err; diff --git a/patches/iito/1.1.0/0007-iitod-add-locate-controlling-the-config-s-locate-inp.patch b/patches/iito/1.1.0/0007-iitod-add-locate-controlling-the-config-s-locate-inp.patch new file mode 100644 index 000000000..224bba13f --- /dev/null +++ b/patches/iito/1.1.0/0007-iitod-add-locate-controlling-the-config-s-locate-inp.patch @@ -0,0 +1,211 @@ +From eefef9d2d3a748ff33744ff6f5d0656f6d8eed99 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Mon, 5 Oct 2026 18:11:24 +0200 +Subject: [PATCH 7/8] iitod: add locate, controlling the config's locate input +Organization: Wires + +Locating a unit is already expressed in configs as a "locate" path +input, with rules for which LEDs blink and how, but nothing set it. +The new locate method creates or removes that input's file, so tools +and management systems get one API regardless of which file the config +uses. An optional timeout, in seconds, stops locate by itself, and the +status and locate replies show the seconds remaining. + +--- + src/iito.h | 2 ++ + src/in-path.c | 24 +++++++++++++ + src/ipc.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-- + src/ipc.h | 1 + + 4 files changed, 123 insertions(+), 3 deletions(-) + +diff --git a/src/iito.h b/src/iito.h +index 5fdab0f..5440014 100644 +--- a/src/iito.h ++++ b/src/iito.h +@@ -87,6 +87,8 @@ int in_dev_find(const char *nameprop, struct in_dev **idevp, const char **propp) + + json_t *in_status(void); + ++int in_path_set(struct in_dev *idev, bool present); ++ + + /* output */ + +diff --git a/src/in-path.c b/src/in-path.c +index 2090758..e9e9a08 100644 +--- a/src/in-path.c ++++ b/src/in-path.c +@@ -1,5 +1,7 @@ + #include "iito.h" + ++#include ++#include + + struct in_path { + struct in_dev dev; +@@ -31,6 +33,28 @@ static int in_path_sample(struct in_dev *dev, const char *prop, bool *state) + return -EINVAL; + } + ++/* ++ * Create, or remove, the file a path input watches. The new state is ++ * applied at once, instead of when ev_stat gets around to noticing it. ++ */ ++int in_path_set(struct in_dev *idev, bool present) ++{ ++ struct in_path *ip = container_of(idev, struct in_path, dev); ++ int fd; ++ ++ if (present) { ++ fd = open(ip->stat.path, O_WRONLY | O_CREAT | O_CLOEXEC, 0644); ++ if (fd < 0) ++ return -errno; ++ close(fd); ++ } else if (unlink(ip->stat.path) && errno != ENOENT) { ++ return -errno; ++ } ++ ++ ev_stat_stat(ev_default_loop(0), &ip->stat); ++ return out_update(idev); ++} ++ + static int in_path_probe(const char *name, json_t *data) + { + struct in_path *ip; +diff --git a/src/ipc.c b/src/ipc.c +index e179c16..9941d95 100644 +--- a/src/ipc.c ++++ b/src/ipc.c +@@ -13,17 +13,107 @@ struct ipc_method { + json_t *(*call)(json_t *params, const char **err); + }; + ++static struct ev_loop *g_loop; + static struct ev_io g_ipc_ev; ++static struct ev_timer g_locate_timer; ++ ++/* ++ * Locate is driven through the configuration's "locate" path input, ++ * the config's rules decide which LEDs blink, and how. ++ */ ++static struct in_dev *ipc_locate_input(void) ++{ ++ const char *prop = NULL; ++ struct in_dev *idev; ++ ++ if (in_dev_find("locate", &idev, &prop) || strcmp(idev->type, "path")) ++ return NULL; ++ ++ return idev; ++} ++ ++static void ipc_locate_timeout(struct ev_loop *loop, struct ev_timer *w, int revents) ++{ ++ struct in_dev *idev = ipc_locate_input(); ++ ++ if (idev && in_path_set(idev, false)) ++ log_err("(ipc) Failed stopping locate"); ++} ++ ++/* "remaining" is only set while a locate timeout is running */ ++static json_t *ipc_locate_state(struct in_dev *idev) ++{ ++ bool state = false; ++ json_t *st; ++ ++ idev->sample(idev, NULL, &state); ++ st = json_pack("{s:b}", "locate", state); ++ if (ev_is_active(&g_locate_timer)) ++ json_object_set_new(st, "remaining", json_integer( ++ (json_int_t)(ev_timer_remaining(g_loop, &g_locate_timer) + 0.999))); ++ ++ return st; ++} + + static json_t *ipc_status(json_t *params, const char **err) + { +- return json_pack("{s:o, s:o}", +- "inputs", in_status(), +- "outputs", out_status()); ++ struct in_dev *idev = ipc_locate_input(); ++ json_t *st; ++ ++ st = idev ? ipc_locate_state(idev) : json_object(); ++ json_object_set_new(st, "inputs", in_status()); ++ json_object_set_new(st, "outputs", out_status()); ++ ++ return st; ++} ++ ++/* ++ * Without params, or without "enable", only report the current state. ++ * An optional "timeout", in seconds, stops locate by itself. ++ */ ++static json_t *ipc_locate(json_t *params, const char **err) ++{ ++ json_t *enable, *timeout; ++ struct in_dev *idev; ++ ++ idev = ipc_locate_input(); ++ if (!idev) { ++ *err = "no locate path input in the configuration"; ++ return NULL; ++ } ++ ++ enable = json_object_get(params, "enable"); ++ timeout = json_object_get(params, "timeout"); ++ ++ if (enable && !json_is_boolean(enable)) { ++ *err = "\"enable\" must be true or false"; ++ return NULL; ++ } ++ if (timeout && (!json_is_integer(timeout) || json_integer_value(timeout) <= 0)) { ++ *err = "\"timeout\" must be a positive number of seconds"; ++ return NULL; ++ } ++ ++ if (enable) { ++ ev_timer_stop(g_loop, &g_locate_timer); ++ ++ if (in_path_set(idev, json_is_true(enable))) { ++ *err = "failed updating the locate input"; ++ return NULL; ++ } ++ ++ if (json_is_true(enable) && timeout) { ++ ev_timer_set(&g_locate_timer, (ev_tstamp)json_integer_value(timeout), 0.); ++ ev_timer_start(g_loop, &g_locate_timer); ++ } ++ } ++ ++ return ipc_locate_state(idev); + } + + static const struct ipc_method ipc_methods[] = { + { "status", ipc_status }, ++ { "locate", ipc_locate }, + + { NULL } + }; +@@ -175,6 +265,9 @@ int ipc_init(struct ev_loop *loop, const char *path) + if (chmod(path, gr ? 0660 : 0600)) + goto err; + ++ g_loop = loop; ++ ev_init(&g_locate_timer, ipc_locate_timeout); ++ + ev_io_init(&g_ipc_ev, ipc_cb, sd, EV_READ); + ev_io_start(loop, &g_ipc_ev); + return 0; +diff --git a/src/ipc.h b/src/ipc.h +index 1f4e5fe..eb7878c 100644 +--- a/src/ipc.h ++++ b/src/ipc.h +@@ -7,6 +7,7 @@ + * also newline terminated, and closes the connection. + * + * request: { "method": "status" } ++ * { "method": "locate", "params": { "enable": true, "timeout": 60 } } + * reply: { "result": { ... } } or { "error": "reason" } + */ + #define IPC_SOCKET "/run/iitod.sock" diff --git a/patches/iito/1.1.0/0008-iitoctl-new-tool-to-query-and-control-iitod.patch b/patches/iito/1.1.0/0008-iitoctl-new-tool-to-query-and-control-iitod.patch new file mode 100644 index 000000000..3e7be3333 --- /dev/null +++ b/patches/iito/1.1.0/0008-iitoctl-new-tool-to-query-and-control-iitod.patch @@ -0,0 +1,434 @@ +From 63dab772b86e3f84b94e2b0bba29d0671f4c0ba3 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Mon, 5 Oct 2026 18:12:37 +0200 +Subject: [PATCH 8/8] iitoctl: new tool to query and control iitod +Organization: Wires + +Talks JSON to iitod over its socket, and prints the reply either as is, +with -j, or as tables for humans: the inputs, then each output's rules +with the active one marked. Also starts and stops locate, optionally +for a number of seconds: "locate on 60". + +--- + ChangeLog.md | 7 ++ + README.md | 49 ++++++++ + src/Makefile.am | 7 +- + src/iitoctl.c | 312 ++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 374 insertions(+), 1 deletion(-) + create mode 100644 src/iitoctl.c + +diff --git a/ChangeLog.md b/ChangeLog.md +index 59b5986..e2a7b42 100644 +--- a/ChangeLog.md ++++ b/ChangeLog.md +@@ -2,6 +2,13 @@ + + All notable changes to the project are documented in this file. + ++## [UNRELEASED] ++ ++### Added ++ ++- IPC socket, `/run/iitod.sock`, with JSON `status` and `locate` methods ++- `iitoctl` tool to show status and start or stop locate ++ + ## [1.1.0] - 2023-11-18 + + ### Added +diff --git a/README.md b/README.md +index 63d2f04..e0c28e7 100644 +--- a/README.md ++++ b/README.md +@@ -171,6 +171,55 @@ of these rules match, the LED will show a solid green, since an LEDs + default rule is "off", and the green LEDs are hardwired to "on". + + ++## Querying and Controlling iitod ++ ++`iitod` listens on `/run/iitod.sock`, owned by `root:wheel` with mode ++0660, so members of `wheel` need no `sudo`. Use `-s PATH` to listen ++on another path. ++ ++The `iitoctl` tool shows each output's rules, with their current value ++and the active rule marked with `*`: ++ ++```sh ++~$ iitoctl ++Locate: off ++ ++INPUT TYPE VALUE ++true builtin true ++locate path false ++startup path true ++panic path false ++ ++sys:green:status (led) ++ IF VALUE THEN ++ locate false @blink-1hz ++ panic false @blink-5hz ++ * startup true @on ++ true true @blink-1hz ++``` ++ ++`iitoctl locate on` creates the file of the configuration's `locate` ++path input, until `iitoctl locate off`, or with `iitoctl locate on 60`, ++for 60 seconds. Which LEDs blink, and how, is up to the rules using the ++`locate` input, e.g., `{ "if": "locate", "then": "@blink-5hz" }`. ++ ++With `-j` the reply from `iitod` is printed as JSON. The protocol is ++one newline terminated JSON request per connection, answered with one ++JSON reply: ++ ++``` ++{ "method": "status" } ++{ "method": "locate", "params": { "enable": true, "timeout": 60 } } ++ ++{ "result": { ... } } ++{ "error": "reason" } ++``` ++ ++`locate` without `params` reports the current state. While a timeout ++is running, the `locate` and `status` replies include the `remaining` ++seconds. ++ ++ + ## Building and Installing + + iito uses Autotools, so the procdure is hopefully familiar to many. +diff --git a/src/Makefile.am b/src/Makefile.am +index ca194ce..66902c9 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -1,4 +1,4 @@ +-sbin_PROGRAMS = iitod ++sbin_PROGRAMS = iitod iitoctl + + iitod_CPPFLAGS = -include $(top_builddir)/config.h -DSYSCONFDIR=\"$(sysconfdir)\" + iitod_CFLAGS = -Wall -Wextra -Wno-unused-parameter +@@ -12,3 +12,8 @@ iitod_SOURCES = \ + \ + in.c out.c main.c uddev.c iito.h \ + ipc.c ipc.h ++ ++iitoctl_CPPFLAGS = -include $(top_builddir)/config.h ++iitoctl_CFLAGS = -Wall -Wextra $(libjansson_CFLAGS) ++iitoctl_LDADD = $(libjansson_LIBS) ++iitoctl_SOURCES = iitoctl.c ipc.h +diff --git a/src/iitoctl.c b/src/iitoctl.c +new file mode 100644 +index 0000000..738a7d4 +--- /dev/null ++++ b/src/iitoctl.c +@@ -0,0 +1,312 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include "ipc.h" ++ ++static const char *g_sock = IPC_SOCKET; ++static int g_json; ++ ++static void usage(void) ++{ ++ fprintf(stderr, ++ "iitoctl - Query and control iitod\n" ++ "\n" ++ "Usage:\n" ++ " iitoctl [options] [COMMAND]\n" ++ "\n" ++ "Commands:\n" ++ " status Show inputs, and each output's rules (default)\n" ++ " locate [on [SEC] | off]\n" ++ " Show, start, or stop locate, the LEDs blink as\n" ++ " configured, with on SEC, locate stops by itself\n" ++ " after SEC seconds\n" ++ "\n" ++ "Options:\n" ++ " -h, --help Print usage message and exit\n" ++ " -j, --json Print the reply from iitod as JSON\n" ++ " -s, --socket=PATH Connect to iitod on PATH instead of %s\n" ++ " -v, --version Print version information\n", ++ IPC_SOCKET); ++} ++ ++static json_t *call(const char *method, json_t *params) ++{ ++ struct sockaddr_un sun = { .sun_family = AF_UNIX }; ++ json_t *req, *reply, *result; ++ char buf[IPC_MAX_MSG], *msg; ++ json_error_t jerr; ++ size_t len = 0; ++ ssize_t n; ++ int sd; ++ ++ if (strlen(g_sock) >= sizeof(sun.sun_path)) { ++ fprintf(stderr, "iitoctl: socket path too long: %s\n", g_sock); ++ return NULL; ++ } ++ strcpy(sun.sun_path, g_sock); ++ ++ sd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); ++ if (sd < 0 || connect(sd, (struct sockaddr *)&sun, sizeof(sun))) { ++ fprintf(stderr, "iitoctl: cannot connect to %s: %s\n", g_sock, strerror(errno)); ++ goto fail; ++ } ++ ++ req = json_pack("{s:s}", "method", method); ++ if (params) ++ json_object_set_new(req, "params", params); ++ msg = json_dumps(req, JSON_COMPACT); ++ json_decref(req); ++ ++ if (!msg || dprintf(sd, "%s\n", msg) < 0) { ++ fprintf(stderr, "iitoctl: failed sending request: %s\n", strerror(errno)); ++ free(msg); ++ goto fail; ++ } ++ free(msg); ++ ++ /* The reply ends when iitod closes the connection */ ++ while (len < sizeof(buf) - 1) { ++ n = read(sd, &buf[len], sizeof(buf) - 1 - len); ++ if (n <= 0) ++ break; ++ len += n; ++ } ++ buf[len] = 0; ++ close(sd); ++ ++ reply = json_loads(buf, 0, &jerr); ++ if (!reply) { ++ fprintf(stderr, "iitoctl: invalid reply from iitod: %s\n", jerr.text); ++ return NULL; ++ } ++ ++ result = json_incref(json_object_get(reply, "result")); ++ if (!result) ++ fprintf(stderr, "iitoctl: %s\n", ++ json_string_value(json_object_get(reply, "error")) ? : "unknown error"); ++ ++ json_decref(reply); ++ return result; ++ ++fail: ++ if (sd >= 0) ++ close(sd); ++ return NULL; ++} ++ ++static const char *value_str(json_t *val) ++{ ++ if (json_is_true(val)) ++ return "true"; ++ if (json_is_false(val)) ++ return "false"; ++ ++ return "error"; ++} ++ ++/* Print a rule's state as its alias, or as key=value pairs */ ++static void print_state(json_t *rule) ++{ ++ const char *alias, *key; ++ json_t *val; ++ ++ alias = json_string_value(json_object_get(rule, "alias")); ++ if (alias) { ++ printf("%s", alias); ++ return; ++ } ++ ++ json_object_foreach(json_object_get(rule, "then"), key, val) { ++ if (json_is_string(val)) ++ printf("%s=%s ", key, json_string_value(val)); ++ else if (json_is_integer(val)) ++ printf("%s=%" JSON_INTEGER_FORMAT " ", key, json_integer_value(val)); ++ else ++ printf("%s=%s ", key, json_is_true(val) ? "true" : "false"); ++ } ++} ++ ++/* No "locate" when the config has no locate input */ ++static void print_locate(json_t *st) ++{ ++ json_t *locate = json_object_get(st, "locate"); ++ json_t *left = json_object_get(st, "remaining"); ++ ++ if (!locate) ++ printf("Locate: not configured\n"); ++ else if (!json_is_true(locate)) ++ printf("Locate: off\n"); ++ else if (json_is_integer(left)) ++ printf("Locate: on, %" JSON_INTEGER_FORMAT " seconds left\n", json_integer_value(left)); ++ else ++ printf("Locate: on\n"); ++} ++ ++static int width(json_t *arr, const char *key, int min) ++{ ++ json_t *obj; ++ size_t i; ++ int len; ++ ++ json_array_foreach(arr, i, obj) { ++ len = strlen(json_string_value(json_object_get(obj, key)) ? : ""); ++ if (len > min) ++ min = len; ++ } ++ ++ return min; ++} ++ ++static int show_status(void) ++{ ++ json_t *st, *ins, *outs, *in, *out, *rules, *rule, *active; ++ int w; ++ size_t i, j; ++ ++ st = call("status", NULL); ++ if (!st) ++ return 1; ++ ++ if (g_json) ++ goto json; ++ ++ print_locate(st); ++ ++ ins = json_object_get(st, "inputs"); ++ w = width(ins, "name", 5); ++ printf("\n%-*s %-7s %s\n", w, "INPUT", "TYPE", "VALUE"); ++ json_array_foreach(ins, i, in) ++ printf("%-*s %-7s %s\n", w, ++ json_string_value(json_object_get(in, "name")), ++ json_string_value(json_object_get(in, "type")), ++ value_str(json_object_get(in, "value"))); ++ ++ outs = json_object_get(st, "outputs"); ++ json_array_foreach(outs, i, out) { ++ printf("\n%s (%s%s)\n", ++ json_string_value(json_object_get(out, "name")), ++ json_string_value(json_object_get(out, "type")), ++ json_is_true(json_object_get(out, "present")) ? "" : ", absent"); ++ ++ rules = json_object_get(out, "rules"); ++ active = json_object_get(out, "active"); ++ w = width(rules, "if", 4); ++ printf(" %-*s %-5s %s\n", w, "IF", "VALUE", "THEN"); ++ json_array_foreach(rules, j, rule) { ++ printf(" %c %-*s %-5s ", ++ json_is_integer(active) && (size_t)json_integer_value(active) == j ? '*' : ' ', ++ w, json_string_value(json_object_get(rule, "if")), ++ value_str(json_object_get(rule, "value"))); ++ print_state(rule); ++ putchar('\n'); ++ } ++ ++ if (!json_is_integer(active)) ++ printf(" * default, no rule matches\n"); ++ } ++ ++ json_decref(st); ++ return 0; ++ ++json: ++ json_dumpf(st, stdout, JSON_INDENT(2)); ++ putchar('\n'); ++ json_decref(st); ++ return 0; ++} ++ ++static int locate(const char *arg, const char *sec) ++{ ++ json_t *params = NULL, *res; ++ char *end; ++ long tmo; ++ ++ if (arg) { ++ if (!strcmp(arg, "on")) ++ params = json_pack("{s:b}", "enable", 1); ++ else if (!strcmp(arg, "off") && !sec) ++ params = json_pack("{s:b}", "enable", 0); ++ else { ++ fprintf(stderr, "iitoctl: locate takes on [SEC] or off\n"); ++ return 1; ++ } ++ } ++ ++ if (sec) { ++ tmo = strtol(sec, &end, 10); ++ if (*end || tmo <= 0) { ++ fprintf(stderr, "iitoctl: invalid number of seconds \"%s\"\n", sec); ++ json_decref(params); ++ return 1; ++ } ++ json_object_set_new(params, "timeout", json_integer(tmo)); ++ } ++ ++ res = call("locate", params); ++ if (!res) ++ return 1; ++ ++ if (g_json) { ++ json_dumpf(res, stdout, JSON_INDENT(2)); ++ putchar('\n'); ++ } else { ++ print_locate(res); ++ } ++ ++ json_decref(res); ++ return 0; ++} ++ ++int main(int argc, char **argv) ++{ ++ static const struct option lopts[] = { ++ { "help", no_argument, 0, 'h' }, ++ { "json", no_argument, 0, 'j' }, ++ { "socket", required_argument, 0, 's' }, ++ { "version", no_argument, 0, 'v' }, ++ { NULL } ++ }; ++ const char *cmd = "status"; ++ int opt; ++ ++ while ((opt = getopt_long(argc, argv, "hjs:v", lopts, NULL)) > 0) { ++ switch (opt) { ++ case 'h': ++ usage(); ++ return 0; ++ case 'j': ++ g_json = 1; ++ break; ++ case 's': ++ g_sock = optarg; ++ break; ++ case 'v': ++ puts(PACKAGE_STRING); ++ return 0; ++ default: ++ usage(); ++ return 1; ++ } ++ } ++ ++ if (optind < argc) ++ cmd = argv[optind++]; ++ ++ if (!strcmp(cmd, "status")) ++ return show_status(); ++ if (!strcmp(cmd, "locate")) ++ return locate(optind < argc ? argv[optind] : NULL, ++ optind + 1 < argc ? argv[optind + 1] : NULL); ++ ++ fprintf(stderr, "iitoctl: unknown command \"%s\"\n\n", cmd); ++ usage(); ++ return 1; ++} From c2e112fcf2e3f1c82419a9716dc6cb10ce8153e6 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 23:22:44 +0200 Subject: [PATCH 09/10] confd: share rpc_user() between RPC handlers RPCs that act on the device should log who asked for them, but the helper that finds the requesting user was private to support.c. Signed-off-by: Joachim Wiberg --- src/confd/src/core.c | 18 ++++++++++++++++++ src/confd/src/core.h | 2 ++ src/confd/src/support.c | 18 ------------------ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/confd/src/core.c b/src/confd/src/core.c index 7ebf70d51..6f88f1d31 100644 --- a/src/confd/src/core.c +++ b/src/confd/src/core.c @@ -61,6 +61,24 @@ FILE *fopenfp(mode_t mode, const char *group, const char *fmt, ...) return fp; } +/* The event session runs as confd itself, the caller is only known + * from the originator data: netopeer2 pushes the NETCONF session id + * and then the username, rousette pushes nothing */ +const char *rpc_user(sr_session_ctx_t *session, const char **via) +{ + const char *orig = sr_session_get_orig_name(session); + const void *data; + uint32_t size; + + *via = orig && orig[0] ? orig : "local session"; + + if (orig && !strcmp(orig, "netopeer2") && + !sr_session_get_orig_data(session, 1, &size, &data) && size) + return data; + + return NULL; +} + /* * Touch a Finit service .conf file to schedule a synchronized reload. * Equivalent to 'initctl touch ' but without the fork+exec overhead. diff --git a/src/confd/src/core.h b/src/confd/src/core.h index 707c6f72a..61d5664df 100644 --- a/src/confd/src/core.h +++ b/src/confd/src/core.h @@ -215,6 +215,8 @@ int finit_enablef(const char *fmt, ...) __attribute__((format(printf, 1, 2))); int finit_disablef(const char *fmt, ...) __attribute__((format(printf, 1, 2))); int finit_deletef(const char *fmt, ...) __attribute__((format(printf, 1, 2))); int finit_reloadf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); + +const char *rpc_user(sr_session_ctx_t *session, const char **via); FILE *fopenp(const char *path, mode_t mode, const char *group); FILE *fopenfp(mode_t mode, const char *group, const char *fmt, ...) __attribute__((format(printf, 3, 4))); diff --git a/src/confd/src/support.c b/src/confd/src/support.c index 089e0f711..6a5c2d313 100644 --- a/src/confd/src/support.c +++ b/src/confd/src/support.c @@ -171,24 +171,6 @@ static void cleanup(const char *dir) WARN("Cannot remove %s: %s", dir, strerror(errno)); } -/* The event session runs as confd itself, the caller is only known - * from the originator data: netopeer2 pushes the NETCONF session id - * and then the username, rousette pushes nothing */ -static const char *rpc_user(sr_session_ctx_t *session, const char **via) -{ - const char *orig = sr_session_get_orig_name(session); - const void *data; - uint32_t size; - - *via = orig && orig[0] ? orig : "local session"; - - if (orig && !strcmp(orig, "netopeer2") && - !sr_session_get_orig_data(session, 1, &size, &data) && size) - return data; - - return NULL; -} - static int add_str(sr_val_t **output, size_t *cnt, const char *path, const char *leaf, sr_val_type_t type, const char *val) { From 2fb92e35d5ddf75826b524d36583ef6e82b99bd0 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 4 Oct 2026 23:22:51 +0200 Subject: [PATCH 10/10] hardware: add locate RPC to find a chassis Blinks the board's locate LEDs, by default for 60 seconds, so the unit can be found, e.g., in a rack. Available over NETCONF/RESTCONF, as the CLI command locate, and from the Hardware page in the web interface. The default NACM rules deny guests, all other users may call it. confd forwards the request to iitod, which sets the locate input of its config and keeps the timer. Which LEDs blink, and how, is up to each board's iitod.json, the BPi-M1 blinks its only LED at 10 Hz to tell it apart from loading. Systems where iitod is disabled, because of unreliable kernel LED support, have no control socket and the RPC fails with an error saying so. Signed-off-by: Joachim Wiberg --- board/arm/bananapi-bpi-m1/README.md | 2 +- .../product/lemaker,bananapi/etc/iitod.json | 7 +- doc/ChangeLog.md | 4 + doc/hardware.md | 28 ++++ src/confd/src/Makefile.am | 1 + src/confd/src/core.c | 4 + src/confd/src/core.h | 3 + src/confd/src/locate.c | 132 ++++++++++++++++++ src/confd/yang/confd.inc | 2 +- src/confd/yang/confd/infix-hardware.yang | 33 +++++ ...24.yang => infix-hardware@2026-10-04.yang} | 0 src/klish-plugin-infix/xml/infix.xml | 21 +++ src/webui/internal/handlers/hardware.go | 14 ++ src/webui/internal/server/server.go | 1 + src/webui/templates/pages/hardware.html | 8 +- 15 files changed, 256 insertions(+), 4 deletions(-) create mode 100644 src/confd/src/locate.c rename src/confd/yang/confd/{infix-hardware@2026-09-24.yang => infix-hardware@2026-10-04.yang} (100%) diff --git a/board/arm/bananapi-bpi-m1/README.md b/board/arm/bananapi-bpi-m1/README.md index 572354827..f9e383566 100644 --- a/board/arm/bananapi-bpi-m1/README.md +++ b/board/arm/bananapi-bpi-m1/README.md @@ -74,7 +74,7 @@ LEDs and Buttons | U-Boot | on | | System loading | 1 Hz | | System up | on | -| Locate | 1 Hz | +| Locate | 10 Hz | | Fail safe | 5 Hz | | Panic | 5 Hz | diff --git a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json index e80f55fa2..287630ac2 100644 --- a/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json +++ b/board/arm/bananapi-bpi-m1/rootfs/usr/share/product/lemaker,bananapi/etc/iitod.json @@ -81,7 +81,7 @@ "rules": [ { "if": "locate", - "then": "@blink-1hz" + "then": "@blink-10hz" }, { "if": "panic", @@ -119,6 +119,11 @@ "trigger": "timer", "delay_on": 100, "delay_off": 100 + }, + "blink-10hz": { + "trigger": "timer", + "delay_on": 50, + "delay_off": 50 } } } diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index e342af596..60705832a 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -18,6 +18,10 @@ All notable changes to the project are documented in this file. build, with a new `bpi_m1_boot_defconfig` for its U-Boot bootloader - New `iitoctl` tool, shows which rule drives each LED and why, and can start locate, the board's LEDs blink as configured: `iitoctl locate on` +- New `infix-hardware:locate` RPC, blinks the board's locate LEDs to + identify the chassis, by default for 60 seconds. Available from the + CLI, `locate`, and the Hardware page in the web interface. Not allowed + for guest users ### Fixes diff --git a/doc/hardware.md b/doc/hardware.md index c54c22b5a..609db0145 100644 --- a/doc/hardware.md +++ b/doc/hardware.md @@ -31,6 +31,34 @@ Which hwmon device or thermal zone belongs to which component is decided when the data is collected, and is the only place platform specific names are recognized. +## Locate + +To find a chassis, e.g., in a rack, its LEDs can be set to blink. Which +LEDs blink, and how, depends on the device. Locate stops by itself after +60 seconds, unless another duration is given, or when stopped. + +

admin@example:/> locate
+admin@example:/> locate duration 300
+admin@example:/> locate stop
+admin@example:/> no locate
+
+ +The CLI commands call the `infix-hardware:locate` RPC, which takes +`enable` and `duration`, in seconds. Over RESTCONF: + +```sh +curl -su admin:admin -X POST -H "Content-Type: application/yang-data+json" \ + -d '{"infix-hardware:input": {"duration": 300}}' \ + https://example/restconf/operations/infix-hardware:locate +``` + +The web interface has a *Locate* button on the Hardware page. + +Users in the `admin` and `operator` NACM groups may call locate, guest +users may not. On systems where LED control is disabled, the LEDs keep +their hardware default behavior and the RPC fails with *LED control is +not available on this device*. + ## GPS/GNSS Receivers Infix supports GPS/GNSS receivers for hardware status monitoring and NTP diff --git a/src/confd/src/Makefile.am b/src/confd/src/Makefile.am index 6ea4efd2a..69ef9dbea 100644 --- a/src/confd/src/Makefile.am +++ b/src/confd/src/Makefile.am @@ -53,6 +53,7 @@ confd_plugin_la_SOURCES = \ keystore.c \ system.c \ support.c \ + locate.c \ schedule.c \ ntp.c \ ptp.c \ diff --git a/src/confd/src/core.c b/src/confd/src/core.c index 6f88f1d31..b89cf9e02 100644 --- a/src/confd/src/core.c +++ b/src/confd/src/core.c @@ -1003,6 +1003,10 @@ int sr_plugin_init_cb(sr_session_ctx_t *session, void **priv) if (rc) goto err; + rc = locate_rpc_init(&confd); + if (rc) + goto err; + rc = syslog_rpc_init(&confd); if (rc) goto err; diff --git a/src/confd/src/core.h b/src/confd/src/core.h index 61d5664df..e784e6a5b 100644 --- a/src/confd/src/core.h +++ b/src/confd/src/core.h @@ -280,6 +280,9 @@ int system_sw_rpc_init(struct confd *confd); /* support.c */ int support_rpc_init(struct confd *confd); +/* locate.c */ +int locate_rpc_init(struct confd *confd); + /* services.c */ int services_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd); diff --git a/src/confd/src/locate.c b/src/confd/src/locate.c new file mode 100644 index 000000000..d28ccdde0 --- /dev/null +++ b/src/confd/src/locate.c @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "core.h" + +#define IITOD_SOCKET "/run/iitod.sock" +#define IITOD_TIMEOUT 2 /* seconds */ + +static int fail(sr_session_ctx_t *session, const char *msg) +{ + sr_session_set_netconf_error(session, "application", "operation-failed", + NULL, NULL, msg, 0); + return SR_ERR_OPERATION_FAILED; +} + +/* + * One request, one reply, over the iitod control socket. Returns the + * parsed reply, or NULL with *err set. iitod is disabled on systems + * where kernel LED support is unreliable, then there is no socket. + */ +static json_t *iitod_call(json_t *req, const char **err) +{ + struct sockaddr_un sun = { .sun_family = AF_UNIX, .sun_path = IITOD_SOCKET }; + struct timeval tv = { .tv_sec = IITOD_TIMEOUT }; + char buf[4096], *msg; + json_t *reply = NULL; + size_t len = 0; + ssize_t n; + int sd; + + sd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + if (sd < 0) { + *err = "failed creating socket"; + return NULL; + } + + /* Do not let a stuck iitod block confd, this also bounds connect() */ + setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); + + if (connect(sd, (struct sockaddr *)&sun, sizeof(sun))) { + if (errno == ENOENT) + *err = "LED control is not available on this device"; + else if (errno == ECONNREFUSED) + *err = "the LED daemon is not running"; + else + *err = "failed connecting to the LED daemon"; + goto done; + } + + msg = json_dumps(req, JSON_COMPACT); + if (!msg || dprintf(sd, "%s\n", msg) < 0) { + *err = "failed sending request to the LED daemon"; + free(msg); + goto done; + } + free(msg); + + while (len < sizeof(buf) - 1) { + n = read(sd, &buf[len], sizeof(buf) - 1 - len); + if (n <= 0) + break; + len += n; + } + buf[len] = 0; + + reply = json_loads(buf, 0, NULL); + if (!reply) + *err = "no valid reply from the LED daemon"; +done: + close(sd); + return reply; +} + +static int rpc_locate(sr_session_ctx_t *session, uint32_t sub_id, const char *path, + const sr_val_t *input, const size_t input_cnt, sr_event_t event, + unsigned request_id, sr_val_t **output, size_t *output_cnt, void *priv) +{ + const char *err, *user, *via; + uint32_t duration = 0; + json_t *req, *reply; + bool enable = false; + int rc = SR_ERR_OK; + + if (event != SR_EV_RPC) + return SR_ERR_OK; + + /* sysrepo passes the YANG defaults for leaves not given */ + for (size_t i = 0; i < input_cnt; i++) { + const char *leaf = strrchr(input[i].xpath, '/'); + + if (!leaf) + continue; + if (!strcmp(leaf, "/enable")) + enable = input[i].data.bool_val; + else if (!strcmp(leaf, "/duration")) + duration = input[i].data.uint32_val; + } + + user = rpc_user(session, &via); + AUDIT("Locate %s by user \"%s\" over %s.", enable ? "started" : "stopped", + user ?: "unknown", via); + + /* iitod only arms the timeout when enabling */ + req = json_pack("{s:s, s:{s:b, s:I}}", "method", "locate", "params", + "enable", enable, "timeout", (json_int_t)duration); + reply = iitod_call(req, &err); + json_decref(req); + if (!reply) + return fail(session, err); + + if (json_object_get(reply, "error")) + rc = fail(session, json_string_value(json_object_get(reply, "error")) ? : "failed"); + + json_decref(reply); + return rc; +} + +int locate_rpc_init(struct confd *confd) +{ + return register_rpc(confd->session, "/infix-hardware:locate", + rpc_locate, NULL, &confd->sub); +} diff --git a/src/confd/yang/confd.inc b/src/confd/yang/confd.inc index 7363a3abe..71adfd628 100644 --- a/src/confd/yang/confd.inc +++ b/src/confd/yang/confd.inc @@ -27,7 +27,7 @@ MODULES=( "infix-syslog@2026-09-24.yang" "iana-hardware@2018-03-13.yang" "ietf-hardware@2018-03-13.yang -e hardware-state -e hardware-sensor" - "infix-hardware@2026-09-24.yang" + "infix-hardware@2026-10-04.yang" "ieee802-dot1q-types@2022-10-29.yang" "infix-ip@2026-04-28.yang" "infix-if-type@2026-01-07.yang" diff --git a/src/confd/yang/confd/infix-hardware.yang b/src/confd/yang/confd/infix-hardware.yang index 6769774b6..a35c38c23 100644 --- a/src/confd/yang/confd/infix-hardware.yang +++ b/src/confd/yang/confd/infix-hardware.yang @@ -21,6 +21,11 @@ module infix-hardware { contact "kernelkit@googlegroups.com"; description "Vital Product Data augmentation of ieee-hardware and deviations."; + revision 2026-10-04 { + description "Add locate RPC, blinks LEDs to identify the chassis."; + reference "internal"; + } + revision 2026-09-24 { description "Constrain the character set of hardware component names."; reference "internal"; @@ -747,4 +752,32 @@ module infix-hardware { } } } + + rpc locate { + description + "Blink the LEDs of the chassis to physically identify it, e.g., in + a rack. Which LEDs blink, and how, is defined per board. Locate + stops by itself after the given duration, or when called again + with enable set to false. + + Fails on systems where LED control is disabled, the LEDs then keep + their hardware default behavior."; + + input { + leaf enable { + type boolean; + default true; + description "Start, or stop, blinking the LEDs."; + } + + leaf duration { + type uint32 { + range "1..86400"; + } + units "seconds"; + default 60; + description "Stop blinking by itself after this many seconds."; + } + } + } } diff --git a/src/confd/yang/confd/infix-hardware@2026-09-24.yang b/src/confd/yang/confd/infix-hardware@2026-10-04.yang similarity index 100% rename from src/confd/yang/confd/infix-hardware@2026-09-24.yang rename to src/confd/yang/confd/infix-hardware@2026-10-04.yang diff --git a/src/klish-plugin-infix/xml/infix.xml b/src/klish-plugin-infix/xml/infix.xml index 0c17ab978..2932efb1f 100644 --- a/src/klish-plugin-infix/xml/infix.xml +++ b/src/klish-plugin-infix/xml/infix.xml @@ -275,6 +275,24 @@ + + + + + + + + + set -- /infix-hardware:locate + if [ -n "$KLISH_PARAM_stop" ]; then + set -- "$@" enable false + elif [ -n "$KLISH_PARAM_seconds" ]; then + set -- "$@" duration "$KLISH_PARAM_seconds" + fi + doas -u "$KLISH_USER" rpc "$@" + + + /ietf-system:system-shutdown @@ -1099,6 +1117,9 @@ echo "Public: $pub" + + doas -u "$KLISH_USER" rpc /infix-hardware:locate enable false + diff --git a/src/webui/internal/handlers/hardware.go b/src/webui/internal/handlers/hardware.go index 8748926f0..30c679d61 100644 --- a/src/webui/internal/handlers/hardware.go +++ b/src/webui/internal/handlers/hardware.go @@ -4,6 +4,7 @@ package handlers import ( "context" + "fmt" "html/template" "log" "net/http" @@ -96,6 +97,19 @@ type HardwareHandler struct { RC *restconf.Client } +// Locate blinks LEDs to identify the chassis, for the duration +// given by the YANG default of the infix-hardware:locate RPC. +func (h *HardwareHandler) Locate(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html") + if err := h.RC.Post(r.Context(), "/operations/infix-hardware:locate"); err != nil { + log.Printf("locate: %v", err) + fmt.Fprintf(w, `Failed: %s`, + template.HTMLEscapeString(err.Error())) + return + } + fmt.Fprint(w, `✓ Locating, LEDs are blinking`) +} + func (h *HardwareHandler) Overview(w http.ResponseWriter, r *http.Request) { data := hardwarePageData{ PageData: newPageData(w, r, "hardware", "Hardware"), diff --git a/src/webui/internal/server/server.go b/src/webui/internal/server/server.go index e2f58199a..0d065954e 100644 --- a/src/webui/internal/server/server.go +++ b/src/webui/internal/server/server.go @@ -308,6 +308,7 @@ func New( mux.HandleFunc("GET /routing", routing.Overview) mux.HandleFunc("GET /wifi", wifi.Overview) mux.HandleFunc("GET /hardware", hw.Overview) + mux.HandleFunc("POST /hardware/locate", hw.Locate) mux.HandleFunc("GET /vpn", vpn.Overview) mux.HandleFunc("GET /dhcp", dhcp.Overview) mux.HandleFunc("GET /ntp", ntp.Overview) diff --git a/src/webui/templates/pages/hardware.html b/src/webui/templates/pages/hardware.html index cdc598d6e..7983180d7 100644 --- a/src/webui/templates/pages/hardware.html +++ b/src/webui/templates/pages/hardware.html @@ -12,7 +12,13 @@ {{/* ── Board ─────────────────────────────────────────────────────────── */}} {{if .Board.Model}}
-
Board
+
Board + +
+
Model{{.Board.Model}}