From c7cc700e4e9ac4100a1d85df83331c6d2a1b5f8e Mon Sep 17 00:00:00 2001 From: dirwin31 <83434411+dirwin31@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:12:02 -0700 Subject: [PATCH] BlueALSA: Bump to v5.0.0 --- .gitignore | 2 + openpilot/starpilot/soloist/README.md | 20 +- openpilot/starpilot/soloist/backend.py | 4 +- .../starpilot/soloist/bluealsa/.gitignore | 1 + .../starpilot/soloist/bluealsa/BUILD_IMAGE | 1 + .../soloist/bluealsa/BUILD_PACKAGES.txt | 245 ++++++++++++++++++ .../starpilot/soloist/bluealsa/Dockerfile | 6 + .../starpilot/soloist/bluealsa/README.md | 125 +++++++++ .../starpilot/soloist/bluealsa/SHA256SUMS | 5 + .../soloist/bluealsa/UPSTREAM_COMMIT | 1 + .../bluealsa/UPSTREAM_TEST_RESULTS.txt | 14 + openpilot/starpilot/soloist/bluealsa/VERSION | 1 + .../soloist/bluealsa/bin/bluealsa-aplay | Bin 0 -> 133800 bytes .../soloist/bluealsa/bin/bluealsactl | Bin 0 -> 67680 bytes .../starpilot/soloist/bluealsa/bin/bluealsad | Bin 0 -> 199568 bytes openpilot/starpilot/soloist/bluealsa/build.sh | 56 ++++ .../starpilot/soloist/bluealsa/launcher.py | 37 +++ .../lib/libasound_module_ctl_bluealsa.so | Bin 0 -> 134352 bytes .../lib/libasound_module_pcm_bluealsa.so | Bin 0 -> 134600 bytes .../soloist/bluealsa/licenses/BlueALSA.txt | 21 ++ .../soloist/bluealsa/licenses/CC0-1.0.txt | 121 +++++++++ .../soloist/bluealsa/licenses/MIT.txt | 21 ++ .../starpilot/soloist/bluealsa_runtime.py | 79 ++++++ openpilot/starpilot/soloist/phone_audio.py | 9 +- openpilot/starpilot/soloist/phone_profile.py | 41 ++- openpilot/starpilot/soloist/supervisor.py | 15 +- .../tests/fixtures/phone_profile_4_1_1.txt | 63 +++++ .../soloist/tests/test_bluealsa_upgrade.py | 145 +++++++++++ .../starpilot/soloist/tests/test_runtime.py | 1 + 29 files changed, 1000 insertions(+), 34 deletions(-) create mode 100644 openpilot/starpilot/soloist/bluealsa/.gitignore create mode 100644 openpilot/starpilot/soloist/bluealsa/BUILD_IMAGE create mode 100644 openpilot/starpilot/soloist/bluealsa/BUILD_PACKAGES.txt create mode 100644 openpilot/starpilot/soloist/bluealsa/Dockerfile create mode 100644 openpilot/starpilot/soloist/bluealsa/README.md create mode 100644 openpilot/starpilot/soloist/bluealsa/SHA256SUMS create mode 100644 openpilot/starpilot/soloist/bluealsa/UPSTREAM_COMMIT create mode 100644 openpilot/starpilot/soloist/bluealsa/UPSTREAM_TEST_RESULTS.txt create mode 100644 openpilot/starpilot/soloist/bluealsa/VERSION create mode 100755 openpilot/starpilot/soloist/bluealsa/bin/bluealsa-aplay create mode 100755 openpilot/starpilot/soloist/bluealsa/bin/bluealsactl create mode 100755 openpilot/starpilot/soloist/bluealsa/bin/bluealsad create mode 100755 openpilot/starpilot/soloist/bluealsa/build.sh create mode 100644 openpilot/starpilot/soloist/bluealsa/launcher.py create mode 100755 openpilot/starpilot/soloist/bluealsa/lib/libasound_module_ctl_bluealsa.so create mode 100755 openpilot/starpilot/soloist/bluealsa/lib/libasound_module_pcm_bluealsa.so create mode 100644 openpilot/starpilot/soloist/bluealsa/licenses/BlueALSA.txt create mode 100644 openpilot/starpilot/soloist/bluealsa/licenses/CC0-1.0.txt create mode 100644 openpilot/starpilot/soloist/bluealsa/licenses/MIT.txt create mode 100644 openpilot/starpilot/soloist/bluealsa_runtime.py create mode 100644 openpilot/starpilot/soloist/tests/fixtures/phone_profile_4_1_1.txt create mode 100644 openpilot/starpilot/soloist/tests/test_bluealsa_upgrade.py diff --git a/.gitignore b/.gitignore index af96cafb86..9e70f57ac5 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ a.out bin/ !openpilot/starpilot/galaxy/bin/ !openpilot/starpilot/soloist/pulseaudio/bin/ +!openpilot/starpilot/soloist/bluealsa/bin/ # created at launch for comma hardware PYTHONPATH (PC uses editable installs via pyproject.toml) /msgq @@ -47,6 +48,7 @@ bin/ !openpilot/tools/replay/libmedia_mux.so !openpilot/starpilot/soloist/pulseaudio/lib/*.so !openpilot/starpilot/soloist/pulseaudio/modules/*.so +!openpilot/starpilot/soloist/bluealsa/lib/*.so *.a st[0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z][0-9A-Za-z] *.unchunked diff --git a/openpilot/starpilot/soloist/README.md b/openpilot/starpilot/soloist/README.md index 70c18e9939..5c7733f1c0 100644 --- a/openpilot/starpilot/soloist/README.md +++ b/openpilot/starpilot/soloist/README.md @@ -43,17 +43,13 @@ page only after they are updated. ## Runtime behavior -The cached AGNOS image's BlueALSA service starts `/usr/bin/bluealsa -p a2dp-source`. -`phone_profile.py`, invoked through noninteractive sudo on the device, temporarily -adds `a2dp-sink` using its own drop-in under `/run/systemd/system/bluealsa.service.d`. -Only BlueALSA is restarted, once on entry and once on exit; Bluetooth bonds, -bluetoothd, adapter power/identity and HFP registration are not changed. Unknown -service commands and externally modified drop-ins are rejected. The override is -removed on orderly shutdown/source change, recovered at the next supervisor start -after an abrupt shutdown, and disappears at reboot. If the supervisor is killed -without restarting, the receiving profile can remain advertised until reboot; -its capture worker exits on parent death. Bluetooth music may briefly disconnect -while BlueALSA restarts. Radio-off is respected; this feature never powers it on. +The checkout bundles BlueALSA 5.0.0's daemon and matching PCM/CTL plugins for +phone reception and Bluetooth output. `phone_profile.py` uses temporary `/run` +overrides; the system's BlueALSA 4.1.1 installation stays intact. Phone capture +uses `hwcompat "silence"` for continuity across input interruptions. Private ALSA +configs select the matching plugins and explicitly preserve software volume. +See [the bundle documentation](bluealsa/README.md) for build inputs, tests, and +the old-commit rollback contract (restart music/openpilot or reboot after checkout). Only the selected paired phone is captured. The existing trusted pairing policy still determines which phones may establish Bluetooth connections; this feature @@ -61,7 +57,7 @@ does not alter trust or erase bonds. `arecord` opens an ALSA plug PCM for that phone, converting to signed 16-bit 48 kHz stereo. A separate Python worker writes to the private server using AGNOS's `libpulse-simple.so.0`, with bounded buffers. The supervisor retries disconnects without repeatedly restarting Bluetooth. -No extra native binaries are bundled or built for this feature. +The versioned BlueALSA bundle and private PulseAudio server are included with the checkout. ## Validation diff --git a/openpilot/starpilot/soloist/backend.py b/openpilot/starpilot/soloist/backend.py index f1bb7253f4..0cf6009a86 100644 --- a/openpilot/starpilot/soloist/backend.py +++ b/openpilot/starpilot/soloist/backend.py @@ -22,6 +22,7 @@ from collections.abc import Callable from dataclasses import dataclass from pathlib import Path +from openpilot.starpilot.soloist import bluealsa_runtime from openpilot.starpilot.soloist.paths import Layout, private_dir from openpilot.starpilot.soloist.preferences import ADDRESS, Preferences @@ -53,7 +54,8 @@ def alsa_config(address: str, base: Path = SYSTEM_ALSA_CONFIG) -> str: raise BackendUnavailable('Choose a Bluetooth speaker or car first') if any(character in str(base) for character in '\n\r<>"'): raise BackendUnavailable('Invalid system ALSA configuration path') - return (f'<{base}>\n\npcm.{PCM_NAME} {{\n type bluealsa\n device "{address}"\n profile "a2dp"\n' + + return (f'<{base}>\n' + bluealsa_runtime.alsa_plugins() + + f'\npcm.{PCM_NAME} {{\n type bluealsa\n device "{address}"\n profile "a2dp"\n softvol "true"\n' + ' hint { show on description "StarPilot Spotify output" }\n}\n') diff --git a/openpilot/starpilot/soloist/bluealsa/.gitignore b/openpilot/starpilot/soloist/bluealsa/.gitignore new file mode 100644 index 0000000000..84c048a73c --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/openpilot/starpilot/soloist/bluealsa/BUILD_IMAGE b/openpilot/starpilot/soloist/bluealsa/BUILD_IMAGE new file mode 100644 index 0000000000..16023ec8a3 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/BUILD_IMAGE @@ -0,0 +1 @@ +sha256:8e0457d4150457e582a95dab9d2d13fc35c437610ec03ac8729d7b57d73d59d7 diff --git a/openpilot/starpilot/soloist/bluealsa/BUILD_PACKAGES.txt b/openpilot/starpilot/soloist/bluealsa/BUILD_PACKAGES.txt new file mode 100644 index 0000000000..561c3417d5 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/BUILD_PACKAGES.txt @@ -0,0 +1,245 @@ +adduser 3.137ubuntu1 +alsa-utils 1.2.9-1ubuntu5 +apt 2.8.3 +autoconf 2.71-3 +automake 1:1.16.5-1.3ubuntu1 +autotools-dev 20220109.1 +base-files 13ubuntu10.4 +base-passwd 3.6.3build1 +bash 5.2.21-2ubuntu4 +binutils 2.42-4ubuntu2.10 +binutils-aarch64-linux-gnu 2.42-4ubuntu2.10 +binutils-common:arm64 2.42-4ubuntu2.10 +bsdutils 1:2.39.3-9ubuntu6.6 +build-essential 12.10ubuntu1 +bzip2 1.0.8-5.1ubuntu0.1 +ca-certificates 20260816ubuntu0.24.04.1 +check:arm64 0.15.2-2build1 +coreutils 9.4-3ubuntu6.2 +cpp 4:13.2.0-7ubuntu1 +cpp-13 13.3.0-6ubuntu2~24.04.1 +cpp-13-aarch64-linux-gnu 13.3.0-6ubuntu2~24.04.1 +cpp-aarch64-linux-gnu 4:13.2.0-7ubuntu1 +dash 0.5.12-6ubuntu5 +dbus 1.14.10-4ubuntu4.1 +dbus-bin 1.14.10-4ubuntu4.1 +dbus-daemon 1.14.10-4ubuntu4.1 +dbus-session-bus-common 1.14.10-4ubuntu4.1 +dbus-system-bus-common 1.14.10-4ubuntu4.1 +debconf 1.5.86ubuntu1 +debianutils 5.17build1 +diffutils 1:3.10-1build1 +dpkg 1.22.6ubuntu6.6 +dpkg-dev 1.22.6ubuntu6.6 +e2fsprogs 1.47.0-2.4~exp1ubuntu4.1 +file 1:5.45-3build1 +findutils 4.9.0-5build1 +g++ 4:13.2.0-7ubuntu1 +g++-13 13.3.0-6ubuntu2~24.04.1 +g++-13-aarch64-linux-gnu 13.3.0-6ubuntu2~24.04.1 +g++-aarch64-linux-gnu 4:13.2.0-7ubuntu1 +gcc 4:13.2.0-7ubuntu1 +gcc-13 13.3.0-6ubuntu2~24.04.1 +gcc-13-aarch64-linux-gnu 13.3.0-6ubuntu2~24.04.1 +gcc-13-base:arm64 13.3.0-6ubuntu2~24.04.1 +gcc-14-base:arm64 14.2.0-4ubuntu2~24.04.1 +gcc-aarch64-linux-gnu 4:13.2.0-7ubuntu1 +git 1:2.43.0-1ubuntu7.4 +git-man 1:2.43.0-1ubuntu7.4 +gpgv 2.4.4-2ubuntu17.4 +grep 3.11-4build1 +gzip 1.12-1ubuntu3.2 +hostname 3.23+nmu2ubuntu2 +init-system-helpers 1.66ubuntu1 +kmod 31+20240202-2ubuntu7.2 +libacl1:arm64 2.3.2-1build1.1 +libapparmor1:arm64 4.0.1really4.0.1-0ubuntu0.24.04.9 +libapt-pkg6.0t64:arm64 2.8.3 +libasan8:arm64 14.2.0-4ubuntu2~24.04.1 +libasound2-data 1.2.11-1ubuntu0.3 +libasound2-dev:arm64 1.2.11-1ubuntu0.3 +libasound2t64:arm64 1.2.11-1ubuntu0.3 +libassuan0:arm64 2.5.6-1build1 +libatomic1:arm64 14.2.0-4ubuntu2~24.04.1 +libatopology2t64:arm64 1.2.11-1ubuntu0.3 +libattr1:arm64 1:2.5.2-1build1.1 +libaudit-common 1:3.1.2-2.1build1.1 +libaudit1:arm64 1:3.1.2-2.1build1.1 +libbinutils:arm64 2.42-4ubuntu2.10 +libblkid-dev:arm64 2.39.3-9ubuntu6.6 +libblkid1:arm64 2.39.3-9ubuntu6.6 +libbluetooth-dev:arm64 5.72-0ubuntu5.8 +libbluetooth3:arm64 5.72-0ubuntu5.8 +libbrotli1:arm64 1.1.0-2build2 +libbsd-dev:arm64 0.12.1-1build1.1 +libbsd0:arm64 0.12.1-1build1.1 +libbz2-1.0:arm64 1.0.8-5.1ubuntu0.1 +libc-bin 2.39-0ubuntu8.9 +libc-dev-bin 2.39-0ubuntu8.9 +libc6:arm64 2.39-0ubuntu8.9 +libc6-dev:arm64 2.39-0ubuntu8.9 +libcap-ng0:arm64 0.8.4-2build2 +libcap2:arm64 1:2.66-5ubuntu2.4 +libcc1-0:arm64 14.2.0-4ubuntu2~24.04.1 +libcom-err2:arm64 1.47.0-2.4~exp1ubuntu4.1 +libcrypt-dev:arm64 1:4.4.36-4build1 +libcrypt1:arm64 1:4.4.36-4build1 +libctf-nobfd0:arm64 2.42-4ubuntu2.10 +libctf0:arm64 2.42-4ubuntu2.10 +libcurl3t64-gnutls:arm64 8.5.0-2ubuntu10.16 +libdb5.3t64:arm64 5.3.28+dfsg2-7 +libdbus-1-3:arm64 1.14.10-4ubuntu4.1 +libdbus-1-dev:arm64 1.14.10-4ubuntu4.1 +libdebconfclient0:arm64 0.271ubuntu3 +libdpkg-perl 1.22.6ubuntu6.6 +libelf1t64:arm64 0.190-1.1ubuntu0.1 +liberror-perl 0.17029-2 +libexpat1:arm64 2.6.1-2ubuntu0.6 +libext2fs2t64:arm64 1.47.0-2.4~exp1ubuntu4.1 +libffi-dev:arm64 3.4.6-1build1 +libffi8:arm64 3.4.6-1build1 +libfftw3-single3:arm64 3.3.10-1ubuntu3 +libgcc-13-dev:arm64 13.3.0-6ubuntu2~24.04.1 +libgcc-s1:arm64 14.2.0-4ubuntu2~24.04.1 +libgcrypt20:arm64 1.10.3-2ubuntu0.1 +libgdbm-compat4t64:arm64 1.23-5.1build1 +libgdbm6t64:arm64 1.23-5.1build1 +libgirepository-2.0-0:arm64 2.80.0-6ubuntu3.10 +libglib2.0-0t64:arm64 2.80.0-6ubuntu3.10 +libglib2.0-bin 2.80.0-6ubuntu3.10 +libglib2.0-data 2.80.0-6ubuntu3.10 +libglib2.0-dev:arm64 2.80.0-6ubuntu3.10 +libglib2.0-dev-bin 2.80.0-6ubuntu3.10 +libgmp10:arm64 2:6.3.0+dfsg-2ubuntu6.1 +libgnutls30t64:arm64 3.8.3-1.1ubuntu3.6 +libgomp1:arm64 14.2.0-4ubuntu2~24.04.1 +libgpg-error0:arm64 1.47-3build2.1 +libgprofng0:arm64 2.42-4ubuntu2.10 +libgssapi-krb5-2:arm64 1.20.1-6ubuntu2.10 +libhogweed6t64:arm64 3.9.1-2.2build1.1 +libhwasan0:arm64 14.2.0-4ubuntu2~24.04.1 +libidn2-0:arm64 2.3.7-2build1.1 +libisl23:arm64 0.26-3build1.1 +libitm1:arm64 14.2.0-4ubuntu2~24.04.1 +libjansson4:arm64 2.14-2build2 +libk5crypto3:arm64 1.20.1-6ubuntu2.10 +libkeyutils1:arm64 1.6.3-3build1 +libkmod2:arm64 31+20240202-2ubuntu7.2 +libkrb5-3:arm64 1.20.1-6ubuntu2.10 +libkrb5support0:arm64 1.20.1-6ubuntu2.10 +libldacbt-abr-dev:arm64 2.0.2.3+git20200429+ed310a0-4ubuntu2 +libldacbt-abr2:arm64 2.0.2.3+git20200429+ed310a0-4ubuntu2 +libldacbt-enc-dev:arm64 2.0.2.3+git20200429+ed310a0-4ubuntu2 +libldacbt-enc2:arm64 2.0.2.3+git20200429+ed310a0-4ubuntu2 +libldap2:arm64 2.6.10+dfsg-0ubuntu0.24.04.1 +liblsan0:arm64 14.2.0-4ubuntu2~24.04.1 +liblz4-1:arm64 1.9.4-1build1.1 +liblzma5:arm64 5.6.1+really5.4.5-1ubuntu0.4 +libmagic-mgc 1:5.45-3build1 +libmagic1t64:arm64 1:5.45-3build1 +libmd-dev:arm64 1.1.0-2build1.1 +libmd0:arm64 1.1.0-2build1.1 +libmount-dev:arm64 2.39.3-9ubuntu6.6 +libmount1:arm64 2.39.3-9ubuntu6.6 +libmpc3:arm64 1.3.1-1build1.1 +libmpfr6:arm64 4.2.1-1build1.1 +libncursesw6:arm64 6.4+20240113-1ubuntu2.1 +libnettle8t64:arm64 3.9.1-2.2build1.1 +libnghttp2-14:arm64 1.59.0-1ubuntu0.4 +libnpth0t64:arm64 1.6-3.1build1 +libp11-kit0:arm64 0.25.3-4ubuntu2.1 +libpam-modules:arm64 1.5.3-5ubuntu5.6 +libpam-modules-bin 1.5.3-5ubuntu5.6 +libpam-runtime 1.5.3-5ubuntu5.6 +libpam0g:arm64 1.5.3-5ubuntu5.6 +libpcre2-16-0:arm64 10.42-4ubuntu2.1 +libpcre2-32-0:arm64 10.42-4ubuntu2.1 +libpcre2-8-0:arm64 10.42-4ubuntu2.1 +libpcre2-dev:arm64 10.42-4ubuntu2.1 +libpcre2-posix3:arm64 10.42-4ubuntu2.1 +libperl5.38t64:arm64 5.38.2-3.2ubuntu0.6 +libpkgconf3:arm64 1.8.1-2build1 +libproc2-0:arm64 2:4.0.4-4ubuntu3.2 +libpsl5t64:arm64 0.21.2-1.1build1 +libpython3-stdlib:arm64 3.12.3-0ubuntu2.1 +libpython3.12-minimal:arm64 3.12.3-1ubuntu0.17 +libpython3.12-stdlib:arm64 3.12.3-1ubuntu0.17 +libreadline8t64:arm64 8.2-4build1 +librtmp1:arm64 2.4+20151223.gitfa8646d.1-2build7 +libsamplerate0:arm64 0.2.2-4build1 +libsamplerate0-dev:arm64 0.2.2-4build1 +libsasl2-2:arm64 2.1.28+dfsg1-5ubuntu3.1 +libsasl2-modules-db:arm64 2.1.28+dfsg1-5ubuntu3.1 +libsbc-dev:arm64 2.0-1build1 +libsbc1:arm64 2.0-1build1 +libseccomp2:arm64 2.5.5-1ubuntu3.1 +libselinux1:arm64 3.5-2ubuntu2.1 +libselinux1-dev:arm64 3.5-2ubuntu2.1 +libsemanage-common 3.5-1build5 +libsemanage2:arm64 3.5-1build5 +libsepol-dev:arm64 3.5-2build1 +libsepol2:arm64 3.5-2build1 +libsframe1:arm64 2.42-4ubuntu2.10 +libsmartcols1:arm64 2.39.3-9ubuntu6.6 +libsqlite3-0:arm64 3.45.1-1ubuntu2.8 +libss2:arm64 1.47.0-2.4~exp1ubuntu4.1 +libssh-4:arm64 0.10.6-2ubuntu0.5 +libssl3t64:arm64 3.0.13-0ubuntu3.16 +libstdc++-13-dev:arm64 13.3.0-6ubuntu2~24.04.1 +libstdc++6:arm64 14.2.0-4ubuntu2~24.04.1 +libsubunit-dev:arm64 1.4.2-3build1 +libsubunit0:arm64 1.4.2-3build1 +libsystemd0:arm64 255.4-1ubuntu8.17 +libtasn1-6:arm64 4.19.0-3ubuntu0.24.04.2 +libtinfo6:arm64 6.4+20240113-1ubuntu2.1 +libtool 2.4.7-7build1 +libtsan2:arm64 14.2.0-4ubuntu2~24.04.1 +libubsan1:arm64 14.2.0-4ubuntu2~24.04.1 +libudev1:arm64 255.4-1ubuntu8.17 +libunistring5:arm64 1.1-2build1.1 +libuuid1:arm64 2.39.3-9ubuntu6.6 +libxxhash0:arm64 0.8.2-2build1 +libzstd1:arm64 1.5.5+dfsg2-2build1.1 +linux-libc-dev:arm64 6.8.0-147.147 +login 1:4.13+dfsg1-4ubuntu3.2 +logsave 1.47.0-2.4~exp1ubuntu4.1 +lto-disabled-list 47 +m4 1.4.19-4build1 +make 4.3-4.1build2 +mawk 1.3.4.20240123-1build1 +media-types 10.1.0 +mount 2.39.3-9ubuntu6.6 +ncurses-base 6.4+20240113-1ubuntu2.1 +ncurses-bin 6.4+20240113-1ubuntu2.1 +netbase 6.4 +openssl 3.0.13-0ubuntu3.16 +passwd 1:4.13+dfsg1-4ubuntu3.2 +patch 2.7.6-7build3 +perl 5.38.2-3.2ubuntu0.6 +perl-base 5.38.2-3.2ubuntu0.6 +perl-modules-5.38 5.38.2-3.2ubuntu0.6 +pkg-config:arm64 1.8.1-2build1 +pkgconf:arm64 1.8.1-2build1 +pkgconf-bin 1.8.1-2build1 +procps 2:4.0.4-4ubuntu3.2 +python3 3.12.3-0ubuntu2.1 +python3-minimal 3.12.3-0ubuntu2.1 +python3-packaging 24.0-1 +python3.12 3.12.3-1ubuntu0.17 +python3.12-minimal 3.12.3-1ubuntu0.17 +readline-common 8.2-4build1 +rpcsvc-proto 1.4.2-0ubuntu7 +sed 4.9-2ubuntu0.24.04.1 +sensible-utils 0.0.22 +sgml-base 1.31 +sysvinit-utils 3.08-6ubuntu3 +tar 1.35+dfsg-3ubuntu0.4 +tzdata 2026e-0ubuntu0.24.04.1 +ubuntu-keyring 2023.11.28.1 +unminimize 0.2.1 +util-linux 2.39.3-9ubuntu6.6 +uuid-dev:arm64 2.39.3-9ubuntu6.6 +xml-core 0.19 +xz-utils 5.6.1+really5.4.5-1ubuntu0.4 +zlib1g:arm64 1:1.3.dfsg-3.1ubuntu2.2 +zlib1g-dev:arm64 1:1.3.dfsg-3.1ubuntu2.2 diff --git a/openpilot/starpilot/soloist/bluealsa/Dockerfile b/openpilot/starpilot/soloist/bluealsa/Dockerfile new file mode 100644 index 0000000000..62a7f4a330 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/Dockerfile @@ -0,0 +1,6 @@ +FROM ubuntu:24.04@sha256:33ceb71981b602c1a7443a53469e4dba065f7503eab3078a2d7a57a2ab987517 +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + build-essential autoconf automake libtool pkg-config git ca-certificates \ + libasound2-dev libbluetooth-dev libdbus-1-dev libglib2.0-dev libsbc-dev \ + libldacbt-enc-dev libldacbt-abr-dev libbsd-dev check dbus alsa-utils libsamplerate0-dev \ + && rm -rf /var/lib/apt/lists/* diff --git a/openpilot/starpilot/soloist/bluealsa/README.md b/openpilot/starpilot/soloist/bluealsa/README.md new file mode 100644 index 0000000000..da355e9261 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/README.md @@ -0,0 +1,125 @@ +# BlueALSA 5.0.0 for StarPilot music + +This is a checkout-local Linux/ARM64 bundle of upstream BlueALSA **5.0.0**, commit +`1935d6dcb8975f2d7a51aaafe61538d157224623`. It replaces the abandoned 4.1.1 SBC +concealment experiment. There are **no custom decoder patches** in this bundle. + +`bin/bluealsad`, `bin/bluealsactl`, `bin/bluealsa-aplay`, and both ALSA plugins in +`lib/` must be committed together with `VERSION`, `UPSTREAM_COMMIT`, and +`SHA256SUMS`. The feature validates checksums and ARM64 ELF headers before +activating the daemon. Build scratch files under `build/` are ignored. + +## Audio integration + +The phone profile helper temporarily selects `bluealsad` through the existing +`bluealsa.service`. Both phone capture and Spotify/Bluetooth output use explicit +paths to the bundled PCM/CTL plugins in their process-local ALSA configuration. +No global plugin search path, ALSA config, D-Bus policy, or system binary changes. +The D-Bus service remains `org.bluealsa`; the bundled plugins and tool use its +5.0 `Rate` property instead of 4.1's `Sampling`. No application code reads that +property directly. Existing diagnostics still query the same systemd unit. + +Phone capture enables `hwcompat "silence"` to maintain capture across transport +inactivity and short input interruptions. It inserts silence; it does not +reconstruct missing music or eliminate interference. Playback leaves `hwcompat` +at its default so a disconnected output is not silently consumed. Both paths +explicitly set `softvol "true"` to preserve the previous software-volume mode +instead of adopting 5.0's new native-volume default. Initial device volume state +is separate from 4.1; the user's existing 4.1 state is never rewritten. + +The build retains SBC reception, SBC/LDAC transmission, and oFono support. The +launcher explicitly enables SBC and LDAC. AAC, Opus, LHDC, and ASHA are not enabled +by this upgrade. `bluealsa-aplay` is built with adaptive resampling available, +but the `arecord` relay does not use it. The existing `Nice=-5` policy is retained; +no real-time scheduling priority is added over driving processes. + +5.0 persistent state is compiled to `/data/starpilot/bluealsa5/lib/bluealsa`. +The launcher creates its parent before starting the daemon. This isolates it +from `/var/lib/bluealsa`, preserving 4.1 volume/mute state for rollback. + +## Rollback contract + +**Guaranteed rollback: check out the old commit, then reboot.** `/run` is cleared at +boot, so the stock 4.1.1 daemon returns with no further steps. Restarting +music/openpilot instead is best-effort: it works only if the old supervisor's +startup release runs (see below). Checking out files alone cannot replace a daemon +already running in memory. + +* `/usr/bin/bluealsa`, system ALSA plugins, system service, and 4.1 persistent + state are never overwritten. +* `90-starpilot-phone.conf` remains **byte-for-byte compatible with the old + helper**. 5.0 selection is a separate `95-starpilot-bluealsa5.conf` in `/run`. +* The launcher is copied into `/run/systemd/system/` before activation. It is + self-contained and remains available after Git removes the new checkout files. +* Checking out a pre-upgrade commit removes the tracked `VERSION` and bundle. + On the old supervisor's normal startup, its existing release code removes + `90-starpilot-phone.conf` and restarts the unit. The retained launcher sees the + absent version marker, removes the 5.0 override and itself, reloads systemd, + then execs the stock 4.1 daemon with the original source profile. Old capture + and playback code generates configs using the system 4.1 plugins again. +* A reboot independently clears all `/run` overrides, including for much older + commits without the phone-profile startup cleanup. No migration command is + required for that rollback path. +* A failed activation removes the new override and restores the prior profile + configuration before trying the system daemon again. Unknown overrides are + refused rather than overwritten. + +The integration test performs a real temporary Git checkout back to an older +commit, then runs the frozen pre-upgrade helper from `3434023608`. Service calls +are simulated so the test cannot change the host or a comma. It verifies the +resulting stock daemon command and removal of both temporary overrides/launcher. +This is local lifecycle verification, not an on-device audio acceptance test. + +## Build and verification + +Read `docs/how-to/laptop-device-build.md` first. This narrowly scoped bundle build +uses Linux/ARM64 Ubuntu 24.04 (AGNOS's userspace generation); it does not invoke +the full openpilot artifact build or deploy anything. The base image is pinned; +`BUILD_IMAGE`, `BUILD_PACKAGES.txt`, and `UPSTREAM_COMMIT` record build inputs. +Package versions are recorded, not guaranteed to remain available from apt. + +```sh +git clone --branch v5.0.0 https://github.com/arkq/bluez-alsa.git /tmp/bluealsa-5 +openpilot/starpilot/soloist/bluealsa/build.sh --setup +openpilot/starpilot/soloist/bluealsa/build.sh /tmp/bluealsa-5 +.venv/bin/python -m pytest openpilot/starpilot/soloist/tests -q +``` + +The setup command downloads build dependencies. The build itself uses +`--network none --pull never`, exports only the pinned committed source, runs +upstream `make check`, builds matching daemon/plugins/tools, verifies ARM64 ELF +and dynamic dependencies in the build container, and writes checksums. It does +not build inside the mounted Git worktree, avoiding container ownership issues. + +`UPSTREAM_TEST_RESULTS.txt` records the upstream suite (19 programs, zero skips). +This includes capture/playback PCM and each `hwcompat` mode. The local integration +suite covers bundle integrity, capture/playback config, profile ownership, +activation failure, Spotify output lifecycle, and old-commit rollback. The actual +packaged plugin was also loaded by `arecord` and `aplay` using generated StarPilot +configs in an isolated D-Bus session: it reached the expected absent-service error +without config or symbol errors. No physical device was used for these checks. + +Device facts verified read-only on the comma (2026-10-21): `bluealsa.service` runs as +root with no `ProtectSystem`/`NoNewPrivileges`, so the launcher can write `/data`, +edit `/run/systemd/system` and `daemon-reload`; every bundled artifact resolves all +shared libraries (`ldd`, including LDAC and samplerate); the private v5 PCM plugin is +the one ALSA loads through the generated config (it overrides the system +`/etc/alsa/conf.d/20-bluealsa.conf` type). A v5 plugin talking to the stock 4.1 +daemon fails (`Incorrect variant for 'Volume'`), which is why Spotify Bluetooth +output refuses to start (`audio_unavailable`) when v5 activation fails instead of +falling back to a mismatched pair. The v5 daemon itself has not yet been started on +the device. + +Behavior changes to be aware of: while Spotify plays to a Bluetooth output the +daemon runs with the same `a2dp-sink` profile as phone reception, so the comma is +advertised as a music receiver; and a player restart releases and re-acquires the +profile, briefly restarting BlueALSA (and so Bluetooth music). + +Remaining hardware acceptance after deployment: reconnect a phone, pause/resume, +exercise Android Auto and Bluetooth output, and confirm perceived dropout +behavior. Local tests do not establish audible smoothness or RF improvement. + +Upstream references: +- https://github.com/arkq/bluez-alsa/blob/v5.0.0/NEWS.md +- https://github.com/arkq/bluez-alsa/blob/v5.0.0/doc/bluealsa-plugins.7.rst +- https://github.com/arkq/bluez-alsa/blob/v5.0.0/doc/bluealsad.8.rst diff --git a/openpilot/starpilot/soloist/bluealsa/SHA256SUMS b/openpilot/starpilot/soloist/bluealsa/SHA256SUMS new file mode 100644 index 0000000000..f95775079f --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/SHA256SUMS @@ -0,0 +1,5 @@ +bcb5e1a1a8462a5aaaf1fa198b09c9fb9bd26cb8d658b052462a0336655cf7b7 bin/bluealsa-aplay +e9d30ca988de2856d4bc98e1b1b2b81a461fe021c008fd15ccaf0faa9925c128 bin/bluealsactl +60c91e60d36b55d670e886170539e4ee7223d2f2153fafafe8e570cbf2b18672 bin/bluealsad +d1cf683fe82ff1f3c7268fe2614ada5a05a63e3ceb2603689c08740b5618f118 lib/libasound_module_ctl_bluealsa.so +3372f48574b56b320424ee8e3f9319aa920967d16538c6ff77f3ac94174b19c4 lib/libasound_module_pcm_bluealsa.so diff --git a/openpilot/starpilot/soloist/bluealsa/UPSTREAM_COMMIT b/openpilot/starpilot/soloist/bluealsa/UPSTREAM_COMMIT new file mode 100644 index 0000000000..a1ab0cbf47 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/UPSTREAM_COMMIT @@ -0,0 +1 @@ +1935d6dcb8975f2d7a51aaafe61538d157224623 diff --git a/openpilot/starpilot/soloist/bluealsa/UPSTREAM_TEST_RESULTS.txt b/openpilot/starpilot/soloist/bluealsa/UPSTREAM_TEST_RESULTS.txt new file mode 100644 index 0000000000..d8873f2f4f --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/UPSTREAM_TEST_RESULTS.txt @@ -0,0 +1,14 @@ +========================================== + BlueALSA v5.0.0: test/test-suite.log +========================================== + +# TOTAL: 19 +# PASS: 19 +# SKIP: 0 +# XFAIL: 0 +# FAIL: 0 +# XPASS: 0 +# ERROR: 0 + +.. contents:: :depth: 2 + diff --git a/openpilot/starpilot/soloist/bluealsa/VERSION b/openpilot/starpilot/soloist/bluealsa/VERSION new file mode 100644 index 0000000000..0062ac9718 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/VERSION @@ -0,0 +1 @@ +5.0.0 diff --git a/openpilot/starpilot/soloist/bluealsa/bin/bluealsa-aplay b/openpilot/starpilot/soloist/bluealsa/bin/bluealsa-aplay new file mode 100755 index 0000000000000000000000000000000000000000..2c2e00c77d87cfb8f23ed477c8c9c69f2c75ef2e GIT binary patch literal 133800 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 z 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 Yye`g3b=}UaAF29}IU{kc`E>OE1z}byp#T5? literal 0 HcmV?d00001 diff --git a/openpilot/starpilot/soloist/bluealsa/bin/bluealsactl b/openpilot/starpilot/soloist/bluealsa/bin/bluealsactl new file mode 100755 index 0000000000000000000000000000000000000000..dde9f90c905427ea22429cc78288e3e05fe2feb8 GIT binary patch literal 67680 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

Gx_SO9X7=75j7xS_(Ds>Kz6RaFdsS@p^Q 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�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Კc?m;ycuZ21=L4cz;8@NF#de^0z1 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 VIJCSaMgGoc{{K5n4DlKH{{rvVC*A-6 literal 0 HcmV?d00001 diff --git a/openpilot/starpilot/soloist/bluealsa/build.sh b/openpilot/starpilot/soloist/bluealsa/build.sh new file mode 100755 index 0000000000..922ab04f49 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/build.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# Explicit, isolated ARM64 build. Does not install or restart anything on a comma. +set -euo pipefail +cd "$(dirname "$0")" +image=starpilot-bluealsa-builder:24.04 +source_commit=1935d6dcb8975f2d7a51aaafe61538d157224623 +if [[ ${1:-} == --setup ]]; then + docker build --platform linux/arm64 -t "$image" . + exit +fi +if [[ $# != 1 || ! -d $1/.git ]]; then + echo 'Usage: build.sh --setup | build.sh /path/to/bluez-alsa-v5.0.0' >&2 + exit 2 +fi +source_dir=$(cd "$1" && pwd) +[[ $(git -C "$source_dir" rev-parse HEAD) == "$source_commit" ]] || { echo 'Wrong BlueALSA source revision' >&2; exit 1; } +# Export only committed upstream files. Local changes are never silently bundled. +mkdir -p build +archive=$(mktemp) +trap 'rm -f "$archive"' EXIT +git -C "$source_dir" archive "$source_commit" > "$archive" +cp "$archive" build/upstream.tar +docker run --rm --platform linux/arm64 --pull never --network none \ + --mount "type=bind,src=$PWD,dst=/package" "$image" bash -euc ' + mkdir /tmp/source + cd /tmp/source + tar xf /package/build/upstream.tar + autoreconf --install >/tmp/autoreconf.log 2>&1 || { cat /tmp/autoreconf.log; exit 1; } + ./configure --localstatedir=/data/starpilot/bluealsa5 --disable-debug --disable-manpages --enable-ldac --enable-ofono --enable-test --with-libsamplerate > /tmp/configure.log 2>&1 || { cat /tmp/configure.log; exit 1; } + make -j4 >/tmp/make.log 2>&1 || { cat /tmp/make.log; exit 1; } + make -j4 check >/tmp/check.log 2>&1 || { cat test/test-suite.log /tmp/check.log; exit 1; } + mkdir -p /package/bin /package/lib /package/licenses + cp src/bluealsad src/bluealsactl/bluealsactl utils/aplay/bluealsa-aplay /package/bin/ + cp src/asound/.libs/libasound_module_{pcm,ctl}_bluealsa.so /package/lib/ + strip /package/bin/* /package/lib/* + /package/bin/bluealsad --version + /package/bin/bluealsad --help > /package/build/help.txt + : > /package/build/dependencies.txt + for artifact in /package/bin/* /package/lib/*; do + readelf -h "$artifact" | grep "Machine:.*AArch64" + ldd "$artifact" >> /package/build/dependencies.txt + done + ! grep -q "not found" /package/build/dependencies.txt + dpkg-query -W > /package/build/build-packages.txt + cp /tmp/configure.log /tmp/check.log /package/build/ + cp test/test-suite.log /package/build/ + cp test/test-suite.log /package/UPSTREAM_TEST_RESULTS.txt + cp /package/build/build-packages.txt /package/BUILD_PACKAGES.txt + cp LICENSE /package/licenses/BlueALSA.txt + cp LICENSES/* /package/licenses/ + cd /package + sha256sum bin/* lib/* > SHA256SUMS +' +printf '%s\n' "$source_commit" > UPSTREAM_COMMIT +printf '%s\n' '5.0.0' > VERSION +docker image inspect --format '{{.Id}}' "$image" > BUILD_IMAGE diff --git a/openpilot/starpilot/soloist/bluealsa/launcher.py b/openpilot/starpilot/soloist/bluealsa/launcher.py new file mode 100644 index 0000000000..c095aa3c48 --- /dev/null +++ b/openpilot/starpilot/soloist/bluealsa/launcher.py @@ -0,0 +1,37 @@ +"""Copied to /run before activation; intentionally has no checkout imports. + +An older checkout removes VERSION. Its existing phone_profile.release() restarts +bluealsa, so this retained launcher removes the v5 override and execs stock v4. +A reboot also removes /run overrides. Neither path modifies /usr or v4 state. +""" +from pathlib import Path +import os +import subprocess +import sys + + +def select(bundle: Path, legacy: Path, override: Path, reload): + marker = bundle / 'VERSION' + if marker.exists(): + if marker.read_text().strip() != '5.0.0': + raise RuntimeError('Unsupported bundled BlueALSA version') + binary = bundle / 'bin' / 'bluealsad' + if not binary.is_file(): + raise RuntimeError('Incomplete BlueALSA 5 bundle') + # Keep the existing scheduling policy; no new real-time priority over driving. + return [str(binary), '-p', 'a2dp-source', '-p', 'a2dp-sink', '-c', 'SBC', '-c', 'LDAC'] + override.unlink(missing_ok=True) + (legacy.parent.parent / 'starpilot-bluealsa-launch.py').unlink(missing_ok=True) + reload() + argv = ['/usr/bin/bluealsa', '-p', 'a2dp-source'] + if legacy.exists(): + argv += ['-p', 'a2dp-sink'] + return argv + + +if __name__ == '__main__': + argv = select(*(Path(p) for p in sys.argv[1:]), + reload=lambda: subprocess.run(['/usr/bin/systemctl', 'daemon-reload'], check=True, timeout=15)) + if argv[0] != '/usr/bin/bluealsa': + Path('/data/starpilot/bluealsa5/lib').mkdir(mode=0o700, parents=True, exist_ok=True) + os.execv(argv[0], argv) diff --git a/openpilot/starpilot/soloist/bluealsa/lib/libasound_module_ctl_bluealsa.so b/openpilot/starpilot/soloist/bluealsa/lib/libasound_module_ctl_bluealsa.so new file mode 100755 index 0000000000000000000000000000000000000000..125736ba42248082f1ab8661bb4656fd15524319 GIT binary patch literal 134352 zcmd44dwf*Y)i=K9k`OLJNJ0pgl9_-&)2hgQ6wPG9%}XtYRIS?1OooI+AcQ1H5Gs>E zkv6U6D34ftS|&j)nby9v4N9!719+jOk3vx7seS4s0Y#%02#^dH=ly=qCD|D=ec#{v z*Drn!XV&-Zv-jF-t-bcz>+EyfFz@d9W|K)6e-`nI=%s{k>K7IznvEjBW{Uy%ceEI# zmQCona_x_dQCe-rS?IMBO~f&|Tf08FTdUtV54ldO%cGx-`&f$iRbSQatG=q;XPlEY zQW)nXtr}s)na3gRwrkE4^m4|TW%;-0RMisxK5|JVuQ{K$Xt;4U?zX)8<_)zl$LwIK%j%_$7 zmw`C4O8l-Qk>pyKY@2Hn8P=MVBvH3})FJVnFi&xAvL)Z}bJMs%)>QL+5xC)@hTxvS*oEVH9Q=C$$BQ_Ag`*LN z@fS3H;QSl?_e(hcR>FUW-+#cd7styuUcs>sM>CFBalD3ue}BRe!f^n{8#vy?@fMCl zIR1ize}Bbs7{}j8;P1b1yrcetzHx5B@g9y3bd0AHIQ|>QKS|*4BOI+b+Hq`o^qu65 zJNGYYi4>0g`r9_|tDV2x@gI2)SDVr&4u1XbOMmtspZ@%|sbjOA?;3pe@bA~}yZ^5L z5t~NU+I~{>!P1mZzHWCQu%(w0; zdUN=(-;A94>B@({d)Jp08~0uLSL01z+f#CEXzFuiFQk3&%^AuMr`9hhK6q|*&eHl{ zhXU=FUz&N>^?8l{K?k>p?Ki!#`ibx7o!ztc@`>4vQ#ai4=9!6eZjQXSdhzpZgXY<% z|9pSL@zTnVoQJ1=e5w3jj^|HJePr@qHh$84xc$T~$MDHRx4#~WyuIwk8K-{v{Ejo3 z+vol(!=3z_`L^FBj4oYtabeE0fxA933C#Od$aIQV_wXLxUOJ-_}}9DDnHLjU~G zkM&p2$TQ8a>wKk5Ne-@|ynmFU@_n4Ra<7aLheNBkN=MUq^c|Q2b z!V&w&dDRvRg8o~adLE3Um+!^l^BKe^{q<{WoN@Yg9J{(Lj(q+Z2XBef?hoVG!#Cr| z;k7t&SP{n_3gYNxW*oUa4?g>|+jDWs?~l`8Yn=Wj#L>%raq8)c<0n6i!_TZZ_WX-D za_)-L?tjLq=OyT+KlxmWBj=yT;q&+L^c9EC4RQR;-Z*k@k7LjIaq!u3^l~Cj{m;hn zGlSyv%N9qTXCTl1#^azkSf@;LUuC0BoZ?u{e2Z^yHTIC}gb z4*z50@bhXMygN?)cgEr8FLC6&JWjs?aqzF=@ZTKAPHu|h$6kzM52xakpB_h#yW;T^ z$Db>4GcPGssYJ5e!q_I(edeeJwnwN z^unYH{*3Z}GvuJ_>jCYuFsb$c{(r6k6Lh>nuP3An@*g_>n%=K89Wd(Irpu>5mrqD9 zp8`IIV_iQ*U)RID)xQr_`y4F7?`U+g&i@)+KJWd9hG%Fe;n4XE=zN|BfBd_k>#_WO zjb5mo#EYnp_OR^@4e;oAhhEQ~w>7|~w>w_%Z~0pqZs_Ye@!ocht6mD2@Tk);~t~DF8>KS z{&Rg?9MKDw>$nB&P!8q)O9Rs2clb9;iolNR2cTA%Ln3B|0e7GvK`mxA-a5q z>GHAZc4hE+M(^*Y-)rUP>iwOomp^kv!au_}r%9`bp&Ib{pQW;ePET+F<{~#Yo}M{exbO;PV3VAJ)g+!+QB4sGt7C7UNHD z*6rb>-k?)2KU3GQN9Vs<$M4hY_v`f+=y(OrYEp|(WC|X)tSyfa~@U6V%E6a)syoJk)v}^rear>&h?&8ui z@AA^eibUb^)kWUrm0tJKqAGV$+3FQV72c|%CGOI);+1hPmU&kciOQ;qGGF;xa8+4W zUQt?BRqXbaEF|f`tjkjWHW#0>{%PNYBuaSHu3$H1y zDsfj7l`miG_JS-#!^`^KTnd9wyMlV%Rcp(O`ngO&99Rm(RN z6l=UoN-N80CG7tav8Dp;LRLPu=q_|qAgDnf57Nk?y;u0W*D7CCaV0rd$3%r8@>P{9 zE2{eGLupy54y&WjU0hKV(;@cdS^*FR<0XBoB-%Tc`sk3CV6cTn6@70}1zlEDUDd~6 z^=@3tO^;q6P#AkZbuB6N_196huifJ=uUJ`L+0&e)ksf9Aqb*-mwI&?6FwI5uxWkn& zKy{QZU%3?Bhd`y_K!&|lD=XkeD=PcHqV`_8MP(HusNZT}zH#uXina0;RTq8A5`o#2 zmMw*Clvb|vO`Ybhtn_)yiUo%iY)#czRS9jeQtb)mjAHNV<-N+0q(zCunoreAdhxQA zT1`@6I6+8YIfQ|>)gm-*FTHq=Cg{A#BZoLlWyQ)zi$r;8dC^p@TlD7Duy}B%4w8QL z;9j!4a_tJv5mgoNK~tvO%y9sXQ8&wr9xYlf%C!!dd&_}LT~e+&dzkFX6^7Dd;YVRhFids& zmaajEsF_wGfv}R5Wu-6^w>qJFD@(lnwa^Rq)>2Yj?)ENq7ej5UD~c-JJy$9PFO?L> zy`*}9K3(7q8ro9}#h^tFRIxrQARH-jW414a0kgbjs6OhIg03n>P!d~2bv7}eSW;SC z%+i(Rm^phc7M1l@s?EaJTVC*anm;r_VM=4Wj> zy!K|YgT~6LyrpIR&J9pnWzoMaL65Juug|*IHls%gvZ&QUl8a(w(8m|~5V~Nr0cD&? zJ1b+Pa&6_5k{a^Sz_sg|`t^uacWkU-$?Ec+HY$pJD_5-0rX#AW=Yl#xsS2bkG_=yE zc%S<9E4`X!m`tYNq#mWSytb<_scL8qF*GJUT?qXaTcgIX#jDHIh+7Y_B&n(Dx#mtO z_98Fz{%SC+6(m$qME@?MT1#ZRc)8aI=6b=RGOkwiP`VdhT~>;Txer`|n2zfjZFwMv z$CX7DkCyt1bdmRwVc$#CMsabW<~I04Ez2L3C8fnxqGYPO1d}A3I#x%pn$ohVC0GjJ zn2O&$^9hD7Mvt#(IaVj?ob_ns+Df`9ZS{luD?~A!5~fBnT-+zbdsHTi%U4(V1oY5T zob{+G=RY7s*`t_ZRxVpzj>Q>+0nl{Tngc~x))!cT zJ>JTS%C%)aO%et{B`sM|38P2n+{?X{uzwWlDXbD@m@+Dt7Zqs>JdObrFLGDjJkvcD zy#=Ap>%AAIO?6M_1)$oNOhA3X5in4fR#WF!*s) zSKc_4B**X#H%)qoe2gwAsBsr|ZcEGxjH1g&E1_ z1pG4NH~;0C|7vIc=3&y$8g9X^PveSlHty3(CaC3Eqjuf6U!(XhTjxF6e;O~^RgDXS z7b|wRYFAk&f63RiTG$7JW9^)z()=y|$F>ZPwAKx-z&tJPwaF3h;)6|*$6UIRxv}mf4_8n?W8rxcv(bl&vlFVRKL#l z_Nna;5O?A_i!`Zpg7}V3Yy6pe+BfzYTl562Z4qk`Vv4>Gxd*>j!)M3fNA&W}7~J`( zR(@d&zDUOx#o*niwep@ATj=>+$@iQ^FN5{Kk@Dd#t5iJ33=%rl8lVb2{9Z!zIJs)fQ*kbTx zz5J9IJVVEwG5BO1UlfDS)^Se^?$q(}7<{3QZ;8SEI=(vw-=gDtV(_gxzApxUR>u#; z-~k;!5`*v7@zXK*9vwdugYVPvq)UDE64LR>G58@JpAv%~(eZ^b_z4|f6oZF#yd(xc zqvPcD%8uIzBlD59#>A7<}>}9@jwiotmC_5@C+T_6NCF}wEFkO;8XPZD-?r=AJobpiorK|H2g#i z?$qlE$Kc8NT6v+rhhzBX=f9)j$uYRNU&ANI;Gv}&K05{%-`DU(F?jhy8vZ~GKEsvQeJVU}?mFl-iI0Dk1zsVAgK(ps> zii8`_W_fY8gb(Z~Ere6T2TAxs2_G!sizM85#>>kONH`uT_xyPz{6G&XM2Ups5pmC7 zxr8Ge?)j^haK^*NpI^d<8z9bGBs@jJw@P@bgg-0cX%Zfg@DUQeTf);Ne2;{Wl<<8L zo+05O375yqAqgKXl|LfkV$rStM>3ICc@{)~h-NO-q|XG*v*X;x1= zw@G-Cgl9>3vV@P9@C*r`AmKI%-!0*jCH#5`pCaKCC49DoPm*w_gin_6g%bXC311}P z*%JPMgnvWAJre$cgqKLTvB!j$%O(7vRK8lmWxwZ_@VBJ$TO|A@3EwK=QzZOZ3BOsw z0}?(}!govfGzs4$;nO92pM=kl@Q{Shl<-3mK1;%nNce0CKOy0_NO)MnZ{WZeOAKt&``w#5^jWsys%rs7po<;fA&atfrRgqa6Ob%uZAT2KB@d63BO;$ zk4X3f5`IF$zboNk2|p&`rzQMB2|pv@dPu5X?Urz351M+x(rf?Ulj=#5a6RNzuO>_Q z@1*h>67H68n}mBLe6oalC47p67fSeS3HM33Q^J=>_(BOUlJG?mzDL3zknsPIaF2u+ zOL&Qd>q`aoYPp1$Nad>~yi~&d68?yUZ;|k2624W!^{t!g)n_Gqxl}$N;Y||0Tf$dJ z_#O!_lkj~KzEZ+N5?(Ihha`NJgddUc3JE_U;gu2|mhj(8_-P5RlJGMUzFNY&CHzqd z7uH_;UnAj35?(Fg$r8R+!ZRfNF$uRx_&N!nEaB@Ve2RqsK*DEB_~R1pl<*@GzEHx$ z623^nH%Ryc67H99kA&Aqc!`AnQNqh5yjH@iC48fV`z3sngm01XA4>RE3EwQ?&r0|c z5+0E7EfT(4!ha;;dnEkF624EupOf&Agx5*7W}VdNk+*5G0sg%Uj#bge|s1l=Ifw}3t% z(YJ$clV}%cv$?nZ`Jl5T`cBX;iM|JPp+x6{u9fKfKsQMAgP;#c^!GuxNpvA-v!%EF zV$fL<{Rn86M3;dsl;{f3wG#a(=mv>?4DQn zZ646u{>PxRB>FSZE{XmUbfH9_16?c87eO~j^d-;-B>F4RZ4zzHMf*v;?I(iHlITI8 zT@pPMbfHA2fUcG3bkGeFJsR`@i5>^KO`@|vn+Nu`KM{16L}!C`N%W1N3nh9g=vs-M z3A#a|ZvlNkqHhP?Cebd?=0Uyf&j+0)(RYG&N%TFS3ne-qbge|+2f9I`9|V0sqQ4Ki zO`;1yn+Nx{Uko}+q8|b6lISwfg%Vu>x>lke1>GRgkAXfQ(T{^}ljvH|<{`c9Zw8$u z(LV<5lISNv7fSR~plc=i8PE+9y#w?CiT)+%Hi>QkZN9Fz{TD%JNpujjOQL@Zx=^Bj z54u*OUk2SE(XWC&AklvY-6qioK%0m5w*MCBEQ$UrXqQC41G-S6TR_)J^l{J)68(43 z2PFERpxY$64YYY!Z~GsE&XVZQK)WRROVEW9eGYW3L|+8mAkmjVACTy;K(|S>*@gC# zd)rS0oh8wOK)WP*DCk0oP61sj(dnQYBziRH0}?$BbelwHfi@5CZGR%@EQ!tr?ULvl zK^IE&RM52&Jri_;MBf7XfJEO8x=o^8pv@`0?av3DCDC_+c1iR-pbI5BA9Srm-v_!u zq8|i(K%&17x=o@BL7P*1+b;&4CDD(7c1d&@=t7CE09`B5kAiNH=*K`Gkm$!jw@Gv@ zXmgs{z8WiT2Aw6*KL+j6=$!FdoGHxy7RH()8r?2zNsDt4V>0G^9oKCl-ND$?X%a`o zp#>2qw%@#UH9Atq&WLcD!t!>Uk@M>a2~hz0i2WZ6BFIHFow1mL0&!}8kg>>B0ug4miIr5Mn@X)vsmwph%LFz zyhbbmbl?qVBvY6=4km~Ko7GhJLdY4h;WK*T%ny#$3sDy+@$9oFp-i$^wZ$w7GOc3O zK$9r&uuUPFA+Kh(55AfO&aB&G7SlauKT>E76gYMZeKMlQp+FN0?Tf2A(rS zthxiZJz3m~c3VzatoXE5?KxrFzavv5d}c=(J8TMa`^*NJgopWCJVHcR7WpjdC?a%O zu#ff8Xn}u-cFibflKUU|(jD zSZ69JR{0A*()k=s+E7!me;UJZ%+6+bpR;sV(`M7| z$scXs=uZvmdOgFs3h$N|xHA3ufvZ1D`Q&du$#1n-gD(j4n79A-n+n!5SBO0p;eTpV zXrS`q9FgimJ#Vg`^xO+q3ZH&q{pP!leHGpQsou{V$R-RO7e>#Z+7_xY7xe&36c9p!g*-D~RDzwnT`@n!HaQ@s3K=VDW10er?bvt2oU zk5$>`5=xiP(%5Yg!7hs_I~6v!`pfml!j|-4Wuj1O9$DQz6g-D91~*I;XYJrg^&O`d zKsV{ZQS>cfV>R0fW@BiJ_y$!PBy_q7dV++Qc(bujq&ItQp^p!fN z3?T>BGt+5>t$nkmndL)f0sb`G>x4du#ophCzbnyx`P**rXI|T~cie(wkN3l433!CB zSN+{-oMY|fLX2!JgEZN?B)R56uDS3B9>|qG!2@}gz?XB()g-|uSo4}Q1#Eo4&d~w0 zHpctN0y+pte!>R1(0>W*TWh_q{wTj;*w*~qAq^GSAu(92uYXQlS#pf^e2Fsjuhiul zjFlYg*b2z5z+{`}z&M@pL4s(y54Lw4>kQfgbyC8+gqY*gv>aBOT->q+ehpwF-m_>uHro>b2t^m-1U z9`>8IX4nDiC(ZW$i0g)~U&lQ!gC@@FP54dS@DLbVb{yG=CsZ1?KOXk}F?`|pBukxu zZY)DAb<{`C{6l>}H-F(Aqt8EWn19SY^N;y6JIWaI4<1z(1cWvR^33^z7<~H?JI1oz zZ&l2x{+5rwiq3GuN72VJ_ZEg9q%Z!%WyD0P@6>W|>U_g`;D0$^^wuL3bEdzAx}=Zw zn6x&d2gT7m_$S|c3lMvl8n5Od&O$#sQ$=J6`hIeNh*+VAcFYUb-MP(HYxgX>O(@r+ z&1t|fM>Q8EiM7_>O6M(@c*LsJf*0n=c!edo@BK2?^_-(g{$W-V|z`unp z9DAvQ)j0y~w-0beve2eam^;jhEdSSHM%$Vm@m0>FPQwcrz&%9!hLvzuGfJg#99)`v-~X>UhRFzH@Ox z;~yZSCUb()bt`;1#(9@{F!Y!n6*jWQRZhdyOILzD|B z!@5qPj=V(peziVJkn^`%PiTm85@q1?_W1nQDP4s_l~Z~dxi0d#$#$J`9BW?8?c2%I zNu4LQPrmT1e9sHv>y#7HbzU>-QLj6PDMxT!zLz-0&z=`T!xXzS8J|`2x4exqor~u+ zcHN435aUL`KH4%d{vksb;&9rZX18-21IS%ocxZkjv`CFp;{MmIji)7yU&#_j7W|A;3fJ0w5t=zFo==cvVW zv}b%SHaDu{lVb#O^bOGFKOgMgSkElc`L7i*XRdHI)9-D;@7lyX zHO7TMU1kG6HHnsHj&<4x?K}(pJdOT`lf-lzeyihnu?xB~seXp>%6`XuG=A?w z3_2IFXl>$KYdOa3L#$)QBj$7m?8^k^_l=2(Ygs?rVH>cQ{CCkt2yqVOw*_&5;ky`@ zco1{7LLO|JW3*FhpK&_droR{nS=VA7v>-0MfH~Nom7vT>+VvduvJtYRFQs1FK-ZYf z3fmumwi9tA;Gq8|KOXP`n^k!!0xuUZ=k3?qXWOKW{`0pV^T?~X-fN$)H6B1cv`xmi z7ho?lp$oc`h?}9&=oy~q6-l5{&oa%8E ze%PyNi1wQ@N4dK=e?w;3#yoAz<28wB$0D)=INOC)!H!MEMSFrxR+{~z zL38?-IzQ5K;yANZ2>m75ZU;+GKIr&FyR|A{OaoRe}h+n8j_MLs6%<-e% zn;QHces_VdXHfQ{Ni=PP-EywlRv}<>96xEn46VKyH8;Xe#mHqg_LXrBo*!*6r+4g! z4dI@r*arK}zA!E^`ksolq;bu_^!}>l<+9Y-)pf6Gxd_9LkZ-I#BFn6e5%l+RWdiN} z=sXjA9LDkU!)|MAu#D@j$5^h1pP?_?j(&NDATGza3L(a1`>$IvyH}tuCMQ0Hhq?0q z#s9#s7tkLt9&E!pE(|~PN}f2{j`rZwx3^u>rldgcetxfc6pXRP#Rfw8aIs}XaMhs)r> zSU+mMAt8u4bt}gYVghx{wIcSx+I6cdG*me`%+k2aHe7iO^2;V9Q?v1Fe- zD3rE#q0pakP53RAF^L(}=QH@t_Bn5HJQ!nx^O_b{sPRck2<13lxz=MHEZ@twwloK=oT{j>6n&96SV4N>(M7!#|a}nc!b+sZsS>GMquG#E}pxrrK zNkaWLi($vWJi`?WFvvl-ZD9W4%2((o)`rvV;N>IqRh7Ybp(F$M-k94Q9v^aGp1j#} zBlsSejJm^TT#9haj(a0RSFaQEjI82KkKMLc`wTHzPF|F-MAhejJ(2? z=nN;W@jC1LGs={ruD-S)g5vJ)qVJqX%-Qs($cLyokjjrAgH5IepGAEht7zJUXP~r~ z)1#fun~_)hWDw%;laC$SV77K72y2}$Yts($=M~n&8-?ZY2D7PScamtX%&OV(_9GLz zvG({i;^xD?DNpa%J4ZD8gsCoo+|>r;xLV<#eYVXzd{e~HH^8GGZJA)xq0yo)^B=;| zcBix1JXo}mtb)AU&n5%}J*G)qVF&??1uJOn-Y|f2X1|VO9dGmRT#C(HWh_g22i`rn@PBChl%{Ihg|APEjC+W}eo8uCC&c6k*81+0Jzgsgk-D5rGXaXM`zvP|$bzai)Pe#8_V(c4z zX8+k|XNKt0-`(i%8+yB3^RsQv5tKXSyiwMtg}zU-;VvK6Cm3^v4bhJ23pLv|2U}a_ zJ0i;x8y_1hQZUh_(7(08zG*-9p<<>VV^kn#l<5?!{F6n&UvR(%R)r?;Y)BMGoh826Coy(;eIoG9(Ur5hEY|F&5xZ_k zM=ou=DCp@Y`nG!l`UJgynt@y#azF5YEk^FgW((ojgZZ=lxaV2;93%g;|7)UP!%(rx zmV)yju?jC@6>LaBtThC6BVJ|9vlq|%0@sO|VZUg zd=^I?{1*37c6_F2h91UaorY&@Yc0!c`*M-@qTXy{#4MJj{u)qzFP_O7dV5^goA+F_ zfWFiiW3hgEKkSHpn)Og`Y?FGk+eY9S!n{Vxj(VfcYM?V-XIXn7P2n}h5Ao`59TBH) z=e2b|g1TvwjaWC)?){h4XA){`6U(z5c1WI$d4+r$JTiYLu!f;M(5Ejv9WD3-wr~pe zjJ!+s$Iuh`@39Mis%jVap&zu1nY#S%G2|c8~p%#M;h*t`6kcgy@&6R#`k2sd=kp5d?5 z3%@gwXYgYVnT%&Cl!*<$Gm+1rPvku!G+g00q+fg$~AaJ4Vk)9{S(J1a$b8ozTV|D=VsU-RT| z&#}GwyWcry9~M4WbHLOc_+)_Uzo-Y=rrn>Syoa`OQ9sKXK4H8NXH=iy*ZBEB=jRpF zpJ@}Tn2(?@cpqbkdbOjxs#nxUy}F>+eB9$gx#+})F zIBuCUFqxcBfrq*_fpZe#MxNojFlUfA#F^Ulox;*lgSj{h&kw@zQ}!ftogHz{M;D^o zv2F~8Zxc){g0oY1P%;&8Y8#!J>)vVU4W%&vgTYvcWR4BZM(K zZQVNfPp+3zgI_|nHu%s0`X7y28~rBC=g8kUhlrUqgL0cqLy~5;jW;RGH3jszX)W#v ze*<$U_zFONCi>D;(HzFy97;^Dt3N*9QHy)mU@Z|EBoV`$@i2U; z8@3-o+}3It8+-``@pi_6DF^Te_GPfNnAG&I+eGn>|=d zd9X&pSiD)7FyEoynM1}_1dy-rgMW@q|JN}_A;$o8l>r$ZHz(9(ij0ndV?_aVNZC`~ zl=~~^qkB!T$px6NcL#~y*ep|;hJ`w@ZvmLUbHFwFy3WwoIq);f z-*Ox2N!SB%F4|Os{Gu7ySlFgbm6?dhI`y9&Fq8eiZv^AC(aagQB%ptG*r*7Yu+JvF z!;>Zo5EC}Lk>|u1FEHb|t6QXYv|;UTX+Bw3|}vrntzWR z=R|)?2JLX&tZwE2Y`}LxezZ|IY{i_6xB>0$dRatTP_7+$vL)GAvjFEj?}2R|0$yXD z=b%4%V$eKC81}Jw=sd>{Q|37~rO$J;4i?Sr$lcc@;SzZ5SgQ7cW4@PWW!NvE~1<4L-l(_+$NShjq&BWT6i= zc^1Wk`u)eW@y&j4EE~LX9FzZ#cg}6xoSD-2zFub$Y>(slI@Iy9RqX9toUg8HFIV2z z$T2nvxS_AE9(_Tcu#bA?s12PVm*Vq`?9o*|bVYj%3>8h6p{p)cS7U;URsD>Cu0{sa z)ZZh6t(hjJnZGmlJJg&C^mrEZ0nAw(AI#;@e$3awW<$3tS-2KBKHm`@1HY9ZW_6>C z1H67@9@XK&{2w0UY`%h+Vq~RIGIp8pjAs;bP{=)E+;E(!&(x7K-ie%XE#~EQiOAI> zPm?Lebii*Hcrl;SX4b<#0(fq$J#!xsEVNja@sR0e$c}YjZ0EDiO1-Xwi0_cUiG;Ck zszrUYP3nR7xG?6bai0VJF2|DI(TW(*+h$V-Z$k#O z9opk=)HBKE&!>GF`aOkxLEKBUo%V?`w9n2K(fG*$vG!rK7rj$7p8`*`ndecLI)7s? z40DF3rs0_ro{=YF{&s~ERb6fhrE?vhUo+01ug;Iy3lqXKD~{vckjGvBt`6q_y^fJ; z9rgCuIz|S!qmH{#hcUO(9|-u0CxLNYG7V??Mjp(+8_yMxC)vt83G<-QgV!D9TH4FF z;}w${cQD6Tjk*~R1~BhXH$8L1E4h81i|?O_-1))lke|%$$qQe6*A$U+hZhc;BD*`) zoY0I5hjSwr-_4D1KN@q3UB^t3?hj0nhrzq{{30!Q2in$rOInb;UB$gz|1-YgJ$B@0 zPosQDh#49-68XoWN;@#DU6E@v$_-ZjNes_@ddlIM@P8A-bLAck&w$?p=9wU-lRwBX zpFDOQ%LQ+_>T{`{I`RDXFDM&=E%)4yXTEQ+PSw6?@9Du4;5lq@M!Xo;f5J8FZ$f@J zJva!z@oacHe-FTKzyA9*{LcKFX_X0i8eU`0>uuHn+ZV#=a9)ni@cezgV*~QrCd4zQ zRKx~vIV1Ed%pd!cwRp;lTo&Ud&Kb<9+eLcao5;;nq3m&WY>ntRjd?F^m}ugCyr1Lv zILhwD^^dSOCJSqL)?*VR>g*+})jf44j3wbTDKnuP)^#5GI}aa5Uin;>^X@C>Aj1pj zn;ZKVa9$05M@$g2E`4N*Jcjrr@}Vj6-~`dM7BNY;&!VtxuASNTN9NHT9^@ltt$P%) zAN&h^;!4Pbv7Z(Tj#TsgqahQv-!xV<9mn&6k*I_Hm<^q=AMA4%`tdsYQ9DNKhX?K1 z#mG8Q@@RJ!@_NY0sn54&!;e!|S-5w-E~7K(7iG_Wkzev&r0Oy~_#Dn%&M2qR}(t>A}S*3gch$#JG$+?L@w(6wir0kgdA@22Z09i_jlTM?JKu zcKmLG4`%z6>7$gvG{|#Q@+>d>bT0fMVy;C#$b|Bs-{xGh6LSpr#;(!j(Phr4 zyOfB%49FpzfvhPH%Ag(cXhWPqnM_3+>@&vz;>?*&$|eQzGS-Qii0{0JJ&AclvMM7! zlcFy-^laAk%v>hrMwwagn|-<5o~!Cs?T*|3E2wAo=QY&jL0!}>`^3Kd4C94ymciSH$fvO_?h)m6+TmL$!*TR}f|yBr zTnl~BCNF~D$UxCl4cn$}DOcJNb-EMtUjuTOU5JK)qkd8Gbd(rNyt4K#x0oW*&} zn4b(^KwJKA=p?$)baXuS&TG#bv^=$zm&P6${h7-}=&$P=e3oPmdLUEdnTrMT_CW_e zJmY-&ahx&MHo}&D7-Ji-)7me zU_aV?m4^AMs?U7&WAM*9I4>CGcfr4LFA!zPwY3wxE8O`Y2R8Lb#QlD zCv!%Yqgl|Y3p%~JZXj|;X2e;8unr%LXV#Wrmv2bpZ0ybKY8S|vU)Pv1ew5+>eYtXI zBiD8|{GJE9JGDSy|0{CG;S8+t1biHxH*H90bmWavxNqR(Fwx9C3(>{G5xpPBLpa>R z5so50#F{O-!P?lGXL960|MW{2aOOIA0rbOX^qH_{%!x;67k1ldrG~aKP>ruN%sE56xP)~eZH4h)CyvP|$F|AO z2*_>&d>;0OAa+U(4g^h~PabEYoad|PtP5CMYkMX}1iuR`bTx`S6!g6#g5Lp+_)Ows zl(Gm|0I^vQZ~jrrUA(WGaa?M!)hCn>!Jq$fbS89vMqnL~g}C4p+UZ#bgwz=R2-g6c z0;81Huo}Z3X~KBmzId($ey93v)VC4w9_oX%|F7%Y-+FC*zcA|Ch5fjwFLV?3kz%cT zaxwPSxv_8IA?yLVUnpadmkeBpX$$50<=sD8$!)*3ty;aUm(FN-ft;Gp!`HMP#`9y0OBMR zx=a@Zyca&Br4V_#8Z+J{f}e4P-21Z5WX{eUi|1(=f2}@evp`#6=H5OOYjf}pK_FQa z%z)fqH;Yv!GW?K12RvZ1S|idxkao z$0kkl{#Zmjzc)3nKAz~nvwh{Uzb87P8!U~U))w!V?7;*!V&u~`jhL37nK%Jv*JYR?ITUxU@ z@7#fPXBzgF+zG#R7xIU9BY*fUQX1s+n z$GJMUVT^4w`SUr>Xs0fHd|i(=H)0OjBr;(u;z-RG$m3#s1u(w0Auc>`NxSPPY!Y+Z zS}{kYU=BgPS1dFAD_T%ZTZOFJ(NFH_X+4N%8vnw$!Cp+pz#PvfEeS!V6)`6ITQo?U z4;Tw3(*6hJHFj}saScJPab!m+o}HLP8gdG$!8ee<<9xzAqapuv@TwSn;yMETK;Gv_ z7W%TuW>+?XU-n^tr`Cs%xwj7i@Jd^cR*L3m2llkX$C9V#^;nxc(a&>!Bu^Q6LzJE5 z={oY1QOCNooQN^7@6d#CleNXQb|Yj$n$H7vAve;D@x^^ryOQxv0glbob84QNSLB-A z=!fd-`m>`zrfNsIUtViR?`r+Ns|@u-vB#V7L=<~%D64&l=_soZa!%^n1J9T_{{lN3 z7>rm#wqN*`{{2*z(t1H_w?Oi-`P6ZTb1n5xy?Za>y(_GLDLdwauvX5e+%_jO?<0bV zIFA>(&2C{?_JY4=hut|uDco8+n(v{}-!wpm^^jc~d|S;Rv9?~43-voHo_<5U`fWXb zt$rt?o>P#^QmH<}*7=;xuy^K|Hu=Y>ayET@tzRA+bN|1alj_^9y?+SqH;I~jPeY<& zG6gDDpg+_NawY{{#4z-IZSaA1@WFkrcVN717{?f$*RY3jn6vpeU#jCa+w;%pEKjYv zM#=Xe_PBu9x{ogZ&3tJ;buDkF{=eLR^4k0P%usHhcEs^V*>3XKus+4!X4r%MjCQYK zNAxA3n0rsfvqR5VWq&_KH-dPa&5p?0_`WQM4AlBtIBhE}Y19_nT!hgNO_?q(t^Kc%- zz3}A@_+2#yvWKr%2IHC&`yAES88Y(2=kmQ;m6qzf`Y*g|iaOPJP)t-nZ%4c8eNO#8 zZ7(3=MU=DKCMxGqhOu4^uCqRS+Ro9K@0+;Df zobJYcmk`!YTd*E*vAK{8R9)yx7#tk+u=_? zwpf|-f64`ZXdj!x6BQr&AA4_~GNFmegK^5Jb$BK!`EjoIwBwwp+|f^&Yxwa`RC4+$ zhxdzBzEztB@0)Cslo=>@5OS3F-_q{1y{~we3iAbX1~rfY^9PKv>oL#14V|d5QZ%|( z-rH^LtEKMVPeBgJIZ3?-eP|g6`G&A}aN8hl&B*n48{YM*GN&ER!L^Szi^$HeEN2(O z4qty{`fS=r{Q!UdZ)hWlusN&Kk#hxkXU?OTiwe;PtpA$#<38Ajpnb%x&AH%_ zyw-wGC*oN0X7J=mbgF!@?#lG1cbtH%nScKS&b+4;_g3LPjF+Zd)VCk?ao?NK_Z7T` zH9T`1p>)LPkk@WtAEgM#M?i#I??J;JLFdxCZ2y-ILhtRihKOgoL9OP!_&yiL_J4w(R?OEqcn%(bT?8JRwU04lG+mtaz$QAui_U+3 zk35ja%K}eEUdgM<1MfugeI4vM<$g}|QH$w0*5J>>mYr~k*#FP|BWHF!`p@?}KE`^~ z*x#w;%`EDAU9}Um&3(DdowdVeu+K5rmWtYoxMDsCo7P2^BUR% ze0eMS6CUYr_B`U5?Z>m9wkMolhYwj>kE890+^^T-j53_tRQrt8Gw{B8mhxrPC*PSn z!M0#;#v$(~H{K~=u8MofY3t|B6BU-72F(8$_XnmUCn%c!3b|nJ(QGtDvr#oyRV$R& z9~5U9mvgRWyYy-De(x^Sx%abm$9O&b$m)Hu*G&TJV(bOPbDM11CjOu2M<}~ZVj^Nk zk(Tp-IBP>+vrex&X2)30D_OE{1L9-a3ifN(`SEOm_i-%pEcX$y1->IN5q{R(I1_r{ zxIS*qR@mR|cqg;BpCiI zj;VjU^CpGwN>!tN)!wkqH@*QV;KNu3anC9n$_cS^2m8VM-QN^v2jU$fGx`QUFmpW0 zW#PBaa}%CRV~+{;wGi`#Kv!pVyC9!{NY*gV6bZ}F%gLBc!)!N8KDF;Ae(^bdfe6;ZFF@B% zAy#TOWN66TJwcrP3u3El43eb(jG zM-IBY`p9A7|4|OV{x@=njh#5(sJ4%B@V@zGB>?+nEWt7TK74~=>w8_8dxna$CX6Y4 z9Ou)njTq`U?yba}6?&v{Hm}RqXuq^wficQGDjcia)2-=qdXGJ;bYQybch%ov1 zH}uDNnd8K=B@h0Z?|I{$mkj!Ia~;;X9b4%0)o1wncTYspS+f&sJX`IKX~Keaacb~` z4sFi#--Gu^q_W?G+ys2hO7y!8^>WPl5l7fV)0O*hkAJlGOiNhBw|SlKS@F74h?ktg zgv0!jZOG<1D?57kE0DLvU-Z(^gN!c{kOSv?;scQXHV2Klv~zJ{V=CTJ?eZn5?+HYf z4b(LMV2GG?%doL2?mWvXfxPz?_%ioF^Qsc$N*)_D zd!`R{*Wf*)^O!rm7E>K_RTJ=i8^%J6eLpf|-p5``AMz_9?Du~j?e7$8&()eAxO5P6 zPR>Egsv5|P@pU)D=gQW#WVJ{1L4PDNed46iHV|0c{!M^{qpF(EgnYozrM=$#k zexr@y+s28M^XOmeozCWh%(U!QbLh4jvuT-4Bn>t>Yew7fZ5(l>_-V1e<}M*7jWcaZ z9AjUfFvd1^$UU}X>~@-yaZjcg+wnK>oJKL`Kku@~nOX^TgF55n}>e&mDdfno3B zXZ0+57%~OMvGXGAH#gy0z1Ol0i)9tZbsp}00rXnDXE_1Cqb`%<=b$kbkC?XZzfEjv zy~p6+j=f5)h*@a={GP?{Kf{`GKq`F9c~>?b_6{-CcojUBe$3w zoftzLPd3Qo2HeBnv^4>mg&jTHYe!Dpt73s(>{eixVN1CKHCz1-=u4JS*=^WM zLw{`d&rogd+^5m)XIXBrR_;H^#~g8X#VPDNisj=-9{3oj^05N_SKIv0-ZsbS_x=>` zDfIO7NFMq*@MyR@s@d=Jz2#F-z7x8nPkM03*c8fdy^a|)^YQe}kl}W79>ytjH~e$$ zJ26~8$ZH0Ub>lrS%#G^zFJ@vL>&5!Wg0(_B)(X%~i!DtY&HQ}8*(BH^*A<0{*xQA* zg%f*U1lE2z*!M6Vy26?(|Dyx&6Zp-&7kv6lcjutKw?&WrKFZ`gQ& z30!yDaD7m2#Dj0yc<_u1d)e#AhZDBJXE^@@9z1AEfL{;m!Foi1H_SbI`g`7=3m+-3 zQ;lc+tTT);ybAhf9fl2{t`z3+*#8{7r)9@`QM2%S1KQ&IvQ?001K#c2X0{yOiRbOx zo~qr!JzuZre0jk;rWcjBZDv#5PVuI@SIn5&_F)@b_S-UUB+u_C_R$@kL{U$tAT z*;seLHrRf8(B+(^*u%4wH}Ky5)zgeGC3|1fH`dCJ!dJ}t1H_MiH1Kk}a3r$l?94k&vMc!?gg{y*FIA>40* zedoZwJ>U=iKASS`u_MX8=bal=!k$xuWxzssPl5UkB$}EHUH8mYv11qS821^w2k}l8)~+w;?bSyR zo13lbSlNiWwRhDqZqWV)z5O)qfMO{U&OKQ!n=pq zd-4a+o?DbtSdX1NW>(tUvG=6Yto#$@x%VU&@y_0_tjI@ec3@75yUlV4TqoT_fKcd5-tM4~AiL&M)w8 z7~*dFx4mCl@tr`^bLsdVo#E#K=3YPd1@7bepMLIPnUBD2%5nCQKK}!g`o1geZc0xX z^fh#=(u}^MOp{;l>s>w9`7Xk3%9}Tu$@8Rb!rb!$D|dt?6(;GHPG_e#HTE6S+4IfpSqo^H==4jeEy^SvVC922hs zZ-smUxSugWA?VDWwm2r{C_eK=32l5qIz^-Xpg)!C2;Z*wP>25?+Wb-TMc?`3Zy!^3y>r(-(A=j$ zeQ>UFBk#?4FpxDwjRytlKg#yZT6;@C|5s0Y=(m54G7Xp?`96`P_4`fvdSH(74O|x| zqD>-MyZ$F!=Ugnui#@rx0H0a%TSR6&`>?9>gbRDnwQtc_g2=IM^@$wiKGf-f9Wh_a z^^YI1IrlChR!jLct}*VSo%Me6a754wdE?s;*@>{M<9k1(%^bWm1YWV?6lK z?AV+;{VMlMQCExy85a)xx8>FEhdY#0+=;co1H{(9yvaVUjPjQX= zHA1kpFIC>Ox<3Sd960-$2HeOo^Ly2_O+h&V$KKqCyx&5z|K9JxX=??3d&!FDp9$Gq zH+5MOv%4(=viW_u=*GmOld;Z7dLMh+2b&tH6Jf%$(RbB6Q49Na$&wrKBYyRTG(G(U zyxFkFD{>I)E%3sEzjZiYu5_!h@F2uu{B7c1Abst{_cd=+%cchXI17$L;~njH`>ugnvBwW` zQup<8Jp3HgO977O}62Kyby(r2{PqmL)C$NO2fgYne1i+vxf%I96k zD}=qH)K@HDNjhH-;!M7|214#r^%Lz_f7vmn*p7?!FE%whQ7&{bI^#=}V_j+)#2+k^ zh1la_UV>v5%V5v-8oWE!QwDQ1%QQe=U8slh2waX%uRcFuCgXbToo{i*@J(&tnfo8Y zXE@qU%&d#huDdw3oFdi2Za^bq(P0-AEG z!*AN(T+mUAx}M&8?Rwe_zdRgs1J=}PUIFV`!%tyN&A#*7JD7vj@Ai0*|9KkU7*wBY zP{(-pCxo%Vabt$;@y#(s{l*>SaR7axZF&$7aP1R8UpZEifivI2vEmA(DI70%0SnPa zEWKlBJ~6~CwC4}-o9isbBGjLulOF)@W4keH06W&&@*04#2xOu9F{~ZW%%<&Pe$Vg; zh5KfDFvJZR?b==#Vi`C#d4P?drf|R0C7(%Q{*&uw_JcO?Pw*1Jx2q_x0LC%Da}+}U zp%ZfqzuCib^Pmgb2mKxAAojzC`;gOA=bK;X{j|Z}nXhV4W0cXs{g`LXxE8{@p05Fa z9xb=EOM8xjuH`{W7&Z zr&%e290kgK3^`tt?-3To?lCD3qs(~JnX5kwV)?(L{5W9j=aks`ZR$G#TY2xd^!oX{ zAw@4gA-25156b82Z| zY=htLZ08u@_a;+=9LvZXDj6Fylt`V3&@X+6Hb-EdWc%ghdz(q!>!Za}slj8oPG4Ng zYkZd)I-VuwclxkzDr&~Jd%0%ip2E~%6z@*8?-Gu5l=Gn8)}Q4zQl>5^=iiaR zLn^OmAMLW8m(=#)k5QibmcN&)#y|&?)o*AUW4g6YsQbpWv1?Yx?j?*}Gvr1;Pumul zgMChXlQ=XO^RZP~fV%lj9FB{wX=cW!s&Dkb&%wu~bk8#LJHh!sM>%z_#CL96EqHea z&r$Y)U*trmBi|S49MAQ6YA~`<@O!uFKD`UyFh?%H1~1-Zj$HIvmCJeN$dv`=NEz;% zr0dK=y+CJP_Seb7jJS!F6X(>2Ui5Pi07@`!_N4@8Tp!e-^kz?oV%vs|D80; z#rOZVs^4E9>FN`s(?><|U0~Q6V)R_(7w7hTCxN=+*y5bv(&KU$`oT7+2Mg+_Pl}Ck zcn#kM)8cjLr4%P(#E%**Y#$l>w+?e@HX2~= zVRSH4y>FCSo_pS6`FH}?nUACHsdw5GZOG95FtkHk<`F&E_t_oiA;Yh0@5@^8yd(iW zD*^d%GvfZl#t8PWZpOa#NmxgG0vp74#9R2ip6EBk+PCn24t2#f6z5LZv=YTW(TnIK z{(m-@lf?8-q0c*D!ELB^U4DZ5|fBn zA2}x{2NFq6(wq|-gw_L6>m8ilq=cuhINIKlsds3HcF=KVqB0J*I&-7EA8J5UTHCp_ zVht_y-2Z<)&N+$TuQPXM?)}}n_Ae*jUf*7iZ~fP|zV)rO_g))#GHnjxbBuc*b=wP{ zWe?u*xZ07k9Coy(5BozVoZ^1?H#L1(;ET(b=Q!41F*)zyZIu55togl)_dpV2^oNr% zo~^+%;>F01{hc~>Mq+z~v?objK-;9x*BtOScwY`}09{afohJ9Bdqs_1Kf}8vkD$)A zj;!TD>;>^M-ZP2gy%nxc9LK$ABWIlFTF%KhKb|qN_ZZvo3+|QFkF_$5WBGAB$H3}T=ZE~ zU&-&4_iL~={Q>n8Yj<+JjcaefH+}6pS)N||UXJ`e3Ed^vzGtC4+DPfU^o{J|c!s>> zyhHM^2haZiPe4!P+UN(kCt=pUp>G3}4SN^&Tp^yHfV{YVDesw}%?9Cjj)T9GTEm17 ziZma==er+yy5Q3oIXLf=Yj?Q*8uH{=L!EjVdK%U8x`2=AEARfr&~es*ar^wL#TaMr z#5lVIW9&%jH*A@^SsmyTO6;S)*e0Jx9{A=K-xHAYhjn;P&x`#Y{_dREo_$iS@g(Q|=Gihn zJBl^aHF%fb0}7p#_n|~bbddQUL!QuU%&EtH7{{}7(9E&hls=}T~RsRebK9=?)zxNr$qmS@3 zX!`n?d3KNO#I-T#Wxtv0crO}Pt&4pJ*9U>?RP00I!<=gxaAI1%vqzp6c81U6)uG=! z+fg_86rN3BTZFLh>$4r9!Kqo|?6dm$O2&H^wum_Km)-{E9_(b~834YMkuUc*d;hrf zeRkFXd-?&?Eg!Chvc=gs$Tv6)e}U`gAg{o)d+BY!@rK`u;X6Z|lVU$avvJ@IyIVCE*wWWPJ5i4~PIaCHz9IP7-ah!tc^P>B3j4Vromhbwif4v>g;GKTel_j579))+aK9KK5 zsAn;$%YTXW`j0vO$#1gZS%HkqUg`V!vflVD?86?&{B!lgFCTPf{o3Ki^8|SIfP2dEn@QZaT&8!A>N?^aw_c^cqL=o8zCjLX6wj|r{8ajh zL(|7cbsbKozr6Pnnf~(L-=p1`e!{2HPZ*lMZ&cTzWP12BNJqcsL!Evj>YOe=W#;>n zrVf2byG~@u`u{W1#1D9ee1G8c)FJ3d5A=2e+A-=JkN0^m>uo{Y0KPvk0QuIU&1v7M zJM6P-$EtOhw~>}Q>OlL-XLCjk-7gEa5Z}Yey1+W!-~WJpn0m|iY5I`Qr*t+?=^}0E z8t9r6l;ux`O`@%AQsdWnx$n$>9YDXuv-B(RPAt<$r||jyj1Sk+ zze2wnkNq<`oZ@+`xvZq^EQ5@$KX6TDeD5ugAGSiiPe>WhPF3?Tu4TT9eyN^2Q5dE3 zh}Zd5il6=r&Un~8?hW!2JgWqIzVpV3T>rq{B9NW(tNSXn0~ojA-@SbQM;#?%(pVq% z74nPEkM)SF#)dLWW}e`B7i6!`^v_(A>6z(nhz|Z5^(2;@i?EK|YsvwPDK}+He@BC1 zCF5?{zDfTI{%{8RyU`Q#Y_q&4L0j_+AeD>`Zzz;x2jsah+JI)b&j~aI8#Pp%Q=}YqYrV?pic`pI}y7VI^ zAsuB-*G0;PU6$nd9{j4Zi^P=i%-$y_*`Bz@y-xy*m0f%XyayNK*^2vMd(lUObB>h9 zBEPHGIrN&xgx=A>h;^dBDAzm!SzPnzS8E;5$aA(B%=~G&aQFT>y`Sy2G1Q(hxq)#3FtNK!yA*`?z68WA3lTNKzUh^+4%hbg!&kt zpMK5?T|c%b>zCBE>xPaaFJT=PZI~QK%y(vz^^TA3dJ1LsVC{+Z4B}ZXSx?xD3)R!l zxVQ(&eb5FlZ@35H1m*&lVczhOoHyjidBa>hOT&7`bJe_|7xDTqZ(v+AZ|DcMvaBI< zpcJOpB8?ksIi@Vnr^?EfWnsVVou-`53zWnAJn6dd6B)*SlF+-;z%lVkMw*St#vGRW zC*{CKkJ0a1;vK`#CGuVh)(li%Sfp&k5|o#+5fgg_@*83!dPb+&i1EGq-d270JD{}p z$#z>b%tpv(a~EK~b}Qtlz`E!{*jlv@${FY!{TTM`k9^pZH;Q#n^xY?r=M_?C@_TQf zTv$U}gLxlq3H5%XF8d3-23zrTa@})W?~Ra~Hl>MF+7$J?0QW#;dhRb0ko^4Kkc^9W zJdh99(9cHI7|eSvJm<5(q(u?+LHNLN`2AN>9^7j`TdmfAi9go|8&O}b z`I!5--$S?$_i^b9srj6`@45`>G4}VyaX+5vzKwXWe=}Xs^LK%>!hmbGm-k*p>@a?w z!Tv?`N3M}rU_A}=Y&HBUGj3itbliMe&cFHnB<^vezMu3-DD|EX?IrD*xu^RAWWab= zW%l^vb^39tLBJ=kyF7f8*^r(#~7jd^*tzK@)V z^PKII2h?6-$?;%S&i3=KU=0`T^HKE}_;k*hYFxNv`)_^l2hl!qT)0#91!77WpT-&o z?q}VU__p(=F(|(eYcE4|{m!Af{j6AF^a=EixbS&+=q=WhCiG6nH8*@3wO({t@12wh{-m;R`MuQ$ zvrURtk&gZhu_f;2nUrok3p9>;h<;Itv~JwX=Q-o;!?nqM*mc`t7M6hkM+Ch;JdV+pz4y_MSW$R^Z9HSWb4Lv2$gPff8NwHF&CQ4 z3)J1r=O?drK6dmi$OHeZZlrrV{7&gBhn(VUJKo{JcLiSKx2r;Wy&!$A4V}>6TT|~G zraupYw%mCyWE}oXNV1|13O@p6QZ% zfcRHmQeCq8(&}|Z-UWYF>|L-H-@>ZGAag-E^=ZO)nhNrlgwPWT1x!3X!kx9i7! z59~GV==~n{PkSieUF^lXCQHYNv7yzO)!*N^_)y1XQ%PfKSE{?;m`$~hW znDf9or@zYclue(5^gLl&7M*Zc6E3-c>EU0eK6M`+i#I>NiKXVc87 z`J(u0`w`lcYd$YSH_%4kor3$K<~?89?+m;{qxQ2L1^d8n&Sl|# zqWb3C$9Ip$m?>r+-+=e=VSfVbCv%m(c0tb$p-&0e$O(PpyF}j|H(|}^#=uDTb0?pX za~8-h-$R(`LELzzc<$s>M;B=Tzh=lafW6oquraTyeEQ`aW$sX0>yYc`Ww0mZuqX4k ze*(Jz+Fx0SyymzO^=bijQeBOK4#pk_0J3jA& zx$$`?F3sJ3a>AwC-@iH!d8g)?UvY@#e~$j}?xpduCr99SY1Xy4kJ)v?m)Z5+Lm6Es z*7H6m_DI7%Re?!ym233867tG+`V)=O(Eg5ha-mO?q3gs6zCnI4 z*Mo0=!p8>oYk*Z;?gOo`ko%aY*)n3zzCrs1Y%!%0`R*~ELE`Mo!uPR+WBD5N2lfTi zKL67AX03$laaW)mu9IwoZ=&W^YEDI8gX>`2>o?(@$pH4z>CUC! zlHa=yIMC;WFM@rA;Uj_f3BEB3e-CS^tj{=nhv*794$?oN{>??6Pr=XT`wI_E*|6=V z4Cne6kiQ%6XTv7G7R7rXU%{I2WYLt=+4d_kY2c&#M+mC)(KF5c#KXr<3 zwBbxV*YP#B{TlQ`*4HKAXO0xNGq3b<$g~IZgRPt?$722bApO%g>OEzh*mdeC#*CTb z`M|^O?SY4}4u$)%>G|;6u}_n#e)!JG_PVv6 z?by%cwaHj#{~qKO?ydZm#~W_EiwWNPDU%<6Q=C{=HRZ^z-%P3d$KOo(@_WC5AJxxw zhbefk_I=#r`xf$kRgA#*AMwq;bGL2qoLlpn$jrDB`YZ4EeT04H%(skxc1+ob%zQWQ zdAqkih4vaif4d((dkEi*#Qo~md_rswh{3;dK~CzdL(Amh`=J{(P}LjC@e%vE;LE>vY|4eLeY%!+iL>&`IF$L>w>5Iln6P z%nCJj|+cTXRS9&p)zqj78y`63OV{y|!M&G>P+P+)T-+3133l9CxbNkDxuSlOS#Pj&P zpCK*%n|}nh^wVJv-z)%+cm$AVuui?Vc@KC--V=Cki1x*c_h}jbCD|_exuGwhZ5~o< zT_N2z)XDR!b|u$Fxz>q$(Y-J0{x1EK!FS#qxboC*PE8-tJX$P!l5(qcd&kUQ&K=b} z#_gJPNucCB`Nu!V`0)ziT>mld`%ZZ9!M(q@Ze(*#eaU%`p-IF3~`6My%{z+m+!=#@=Mv>JxNr;X~@dsviaL&zlxL$(q zzw+C6Zo2=T7*#%`KR6JFvOosfgg4V|bP((KERX4f$eZVruX3MVjj${W=OrkM z&xf1vuMp-r-jR~;+x;oRwC{X(I^DjDdc1$J+HocOFXBIc96rt!s1t2F^qESh2YEbo%^f1ZU8@kd#f%y_dQqE6MOk$EfPiNyBL#`m*NUt)nZ%HJWM66Ws{T?cjAKCbajkZCdh&g=R)(@w(JjCY6z z@ZB?m-Mi#Z!F&3!IV-W&@B;9mOz-JBybB6Fsd^r=@gDwWgnx>2iB*5uS%LM`cGP7K z+I$ACaSj^*?&E62_WUflHr2_!o4uF|u${|L_W`VXxsYc7dhr6DNkm>dCZE)Kp)WA6 z@fXMo-#<7Vs7vKF2YKN+W0erM6#$l}79<}{>dJ&2JTW6_Tg4j^yz)t!@g4eevD z^)d`y%wwEM>b?of4@{B1?#{6|2L@y1KE}Y5>EJ8ZJg)g|Y&T#^egI>{Ch&QGkvd8q z*7<6>z~l2@&p>9{CjN-k(^y;JK3n{b8tcct8>|=4d$E@U@%la66Js&=cr)`z_~5c1 z&p6EeCiVPZ-ZvDz?C+dU_TibD0Q$R>74@e-;RNPKse9Pl#+@OsXRPO@IOf0s^xrqg z2X??}=K-DrE1vJ=IWXaQKhHHL#(uqaMES19jsyzn2jKYv$SuE}@}E@ra|rWYg20U` zdy*In2 zA+`{8P3_@eQ#4o*iZvC6glMkz!W|T%H5hBCjRc#+(bixnJa77SEp5xLGm)_nF+UOu zw=Kn`sHeU@TrY6BaA{jOTpx}ukF~TG`n~PZ!bNrWheNT2!ANjfxQ)4{r>hD#x2!-) zbp+d%70sJIEjoP`&Tg1D9Yx6FHi)q3>ydDq4;5LKjDErLm_X%2X^gOimA-}7o9sko zTT5%WE!G&04$bg_@~0wSDBr45-=c*k>!Ia7Q0Nb@Xbgo@Ie(=`SWd`%IzM0A^wO-G$QYwsb{f!B~4#P}mWY-TdKinf z1tZbcmNun_^(%o!V<=hf9g*dcmaj)#OB=&Y^`=miF|Fg~p??=C*IQ#y4%XMVg`=im z(|e7)Uf3y5MYShA9BXNbHMl(O^^GmA^7cBYQY6;a($qv-W8y>4+m|&)lJX|or!mqP zYlMk>AnfuNz*xCLNDUNpLmPaO@gbg$xU{heU2|A{lJTfFslt5=T}_QqlPS`ed~a(> z#R|$AsFsp)r1fkQKbb$}NYDRba)jE#!B|+<3YfUUO=0ShwE0Y8@`W7H_E1AA%XDFk z(x=5w%AxZQuRyM@)<&hBLM&W#+al&)TEYLIRf<;WaFq_1N-HHqMJc>F9M$@IwZ7gO zj7AG$4Q(y$%Nlq++OjnE^xH5> zXgXWdIijK>J>C};A7U(OMJ6~%3o7pv(O`45J+iF8NN&Q_T2IU7-T?H3fJ%nL1z!)Y zEMUt~)6@|THMD>g35Cfl2uA7)A}x*4a6wzRzCA>fs^YC^fz<{x)Uu2Q$grWW1$9i+ z#?-Nvh#82{{J~H|fl3w&n&L!Tn68x+LS`I}z&{Fw>m{c^jWoP4lusK6Ye2pp4+^Be zSRmaH0wPZeBH?8%u#Rc+H7qS?jMO)Vg0Yr1#tTP7Ed|jz1<>UfM3z{BEkaF=1+B2- zunOtP#R@r$qZ};&+OeSePOtDSu9muzv@1wUo9wM9DOfn)KOg=;w4}pT*S>UVxGl{d zC9lInjl#WjVK8ttwM3R7&I9mV%(#|}7ml!MZLWnicjzb-_kw<8VF`Wc!rNLF!bOD- z#$!H`x1rf!>y!t%(gg>*9pz%cMTQ~Qo!d58&t(L|fY1bQBeCj2Qose%+AkGMu`u-BCdb_fya(qLm#(!r|=2mjb~^A|~dR|PMUvj`!o zbPY|}z`qa?&q;xB?uxXqH?&9Uah?A3r{<-qf0qKT+gf6!GG-~fCCF~X60=~zU@qj8 zl;zCggg6;O7=E~#04wIK=5TXedVJkvG!OHpt5JPA^7*X#vGB#=wkSshPd!FdoU?2m zn2N&hOvz`I^0V?=6`h)nlZPHi`uw6$&&)aZ_zax9!FtT`fenTEjCj>*N}^{36dK28 z#P@`-dJy%8BaP77&xm(hOI5hFNq3mfh*#6t9Bye>-R86M({|X?#!>4t@~dcUZj52@ z32{|}y2JzCp^H>HMWALvqTK|cyjdZXw}$@B$T;RJB8+1+Ejr6Z*4H(^POrn%E(^zM zLuwGHZ8W6{k%4%pbzBE%CVpA?#qrYkPAoRz*)AE!@E<>wNW6zdDTYVjXZY*zg5|5f zN+huMFVh?T8(5HS#l|k9!H0XCj6Vg7d$X~TelB?9)A-*5@0Ylldl`6B)A+@|O(gc> zg`{i1`%)S|6E_9_;rEHeE#TFs@lSz={h<>y;t!_r@%_~Vg2{vR@6@5;_5WMQJ-q(k z#|K6JCuCv$((C^n$kq>8SpQM@nff369d4#W7Gg@@-|+EW_{0n66Nwz~E=}Vv(DEhQ zjpOUmFno2nYL;AAt4;CsG5|8cQ5%ia*J91BHkkp|rL>R8>#USTBwa74 z2d3TG&eZkKI;aP1_c8dfPp}VA2mYgu|I_9FN7d7o^M4-#6ASz`zn^@$ThY;O$CVjh z!gC6O4n-w419#zxflkmdFqC}^(_k*f4P($s(0f1wpsk>-pty%B+;=7tTR@AJBoaRa z?E~!t6<3)+8gB9Vs~*38BQd2fp#uUBqpNccQ+&w0nq%$M4}UPH|QQv*K)`K zdIod`jKk@sL}CeOUnG%u5wx=%;}<$*-ZwFZfCj#W^e_-R9!?~7gYNz|Zfb#^?m|6a zH2S}rNW?)0K)XTn@iDPeG$xx+9~hKY&|=W;&56Wn(k=KWTd;=$HA4?>9KwY4_Kr0_lBo2{2fqH=M1}%cY%6l@ACV`#>ug{yy>tZN)}GuY=bA0PT&3UHyL!TtRz&gz`W;e+*p5q8xmntQ<6k zO-COE?E&2Zy7R9f$2ipc1?T~2|6jvr0UZF{1KRgDi9~)r^67(KfVy7>j-Zvh6NySV z9j&1Cp#7kafcE@7(t(}^JqCIP^fYMYtB?Z@N!~v|e$Y7uuFnG( z+g$X* z3%@Pk(Z}O)4SsI?c7s<5Dm(?AT-OtsPiA;GIB$FVt-ZP6fX%cG`27;`(Ea2=-fH|# zfyXYxgS<}sPJ;J3892y$7QdbT0wH893(P$25cB71J>&QAR7B3G+!$U)DWh!^pDD&adv<>pkdw`>p*4kUH1RT$%l5 zCrc{JmREB;`}TS+8mVUQzJn6O9VlbnV%XW?Wi5e(GXI?0H#_IE;EID@WVzYtO9uQG z5y2xx@JJD|4|;Pv2PMW=!MWOXXR3XmVxkDVo#08VLb-WQIG=Qs5M3P9he}*;fZg9s zh9|ekM|JRRaMowP^)~f^{ubkPAl{g}&@Xhn60J5%(&Ej)wI0NarNw(<C4{YD?>=-8)WVNAw;=u?;^QG}+3p@G9Anq97E)DelV@cc zoz>a}9=T=2*34}gC675DcQ_j$;L&4;kEs5l;F9<@A)i?o%j3v~x{-tn z4Z6vp6j-6A`t#$6zZ&s(sQ9X1vR)FL^!OE2Y$lcE>_fUUNOzBFmrh5jVM^*InK&$8Q!g#jfal_LC>~~#>3ttce7Tv zKIRM`^&Ivb@i0V0>JA?%-J0p$ma!Dv`^fboav4uNIMMNBlB1se2M!)Wi74J9i^Nsr z?s*LTtOz1M4!QTNgwLh)CZP0&il9cP&CaE0m84-1w3q!zbMgWBTPjVekJ0?>U#4n| zcz*oOA@1v|;Hz*ViUxqa1lm5+3`%)q6$om^Ob1F!b!@7R%Eym3-vM9w7_vb=sWNYc zB~S>%d@jh|@5}MvpW&5~QMR9n)R_J#@+p59zKvpuO3)tg{NVA$H{>n73k)Z>F=tAU zJSjJvGINsT%r_ilQHxbEH|7PbMseGB{Dn>_|B}j7(86M?Zpm^z9#cvPvF#XgS^ABc(BsPQz*lCT>G}(;-Q-x5rURu$ zHSk#ojQ>dYDAKu^P9Lm$4fuWFuOly|v)vAgsaBx9Vm+q0wM7elbS6K_;50}yAGwJw!@i%ZHt46oV!^BqN~Cc7AKK^-&1=2 z1phCYyEGGUKjiGj)P_bo+54rx!!?T59*pe@OJjq(9W)f$zN-^u4{H#=5Ao|&+jlBI zT-HaHShLw#b+950K$wFC2Qg17RgLXJIa`p&z|-i{X=S3N(E(xhaj-AEh_h3OlMnwF zZ6wEc*+RsU<@oIbFAuz9 zDvzEtxqL~vI7Laxvv8~P?raF-$v*7Kx$Cf(;)rhiT*&y@?eJYy9VN#8+)ns$-J=O? z&E}CMTShF}nB|4v1T}x$5uqD()N`yHu2VS%B?7HFxk_cs4t&Y12`>J&3L*8tUd$4vk_}{P=B})XBpsnC#;-T*)HCqsQn92gr@$MtBW0sG#-0Q39O4m+ zA+p?_?ALNEzXof3MM&Gnc-}Ps4)RE8lns~_oxk7zOBwXF|#^cf||2e(6vNy>eP*_XK-B;c|5DiNsT9^dS&4b&d4yw z)@wYp+qARrcFB=z9!Qoc)E?1lLO3Jw>W}B`nVixP9t6ZPoW3OX3BcVwE}-`j~syS*zELg!4&zR z7Zaa${4dXS%Sxy|+=B_L8L8Ef^9{s7X&80&7VwG%l z29l-+bEK_K_Khvb=h*Y`$yEJzsC@iM?eJ4O<|FChg=uz--iMN5~gx?&*5r3PUm$Ge)zjDEe2h%hl%~gMw?5C-^%bB6J9J0?T8^ZcMjx^;+^CHfH zX(z_9iBC>wgi@=yC)qCib|c;Z;&JRV*h{aFYtS%Ad0?MHoH2dcpFo(rbKuQL<5iN6 z`vQLO#wa~dwt^N&njcExR2HQ|;u!rAHBO2I5g4O+3tX7o@lO4$6l(+J?A|4UrZ^!@{~9LcG@zuakM< zpdS4ayz-YZpHOwfe36T(^eyIZbhZLk3B6pR6|IPW)kMhi3T%anA9p;F_vEF%jbk?D zY|Zj@U$Pv&k1$GAh~!VGEErHPbfcB0H(C{z5)%e?DfQzqLd6ZdZXxc8*Tq<=gI*N@@)4{^N@=SE)HFYblfDqF)lBiiaP zlCl^1xF_YtJ+&gmlK)-!KMVXBbB#^Hy&k#x50@Nz$NN0?un1TLECLn*i-1MIB481) z2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHkY1S|p;0gHe|z#?D~un1TLECLn* zi-1MIB481)2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHkY1S|p;0gHe|z#?D~ zun1TLECLn*i-1MIB481)2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHkY1S|p; z0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix0u}*_fJML}U=gqgSOhEr76FTZMZh9p z5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix0u}*_fJML}U=gqgSOhEr z76FTZMZh9p5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix0u}*_fJML} zU=gqgSOhEr76FTZMZh9p5wHkY1S|p;0gHe|z#?D~un1TLECLn*i-1MIB481)2v`Ix z0u}*_fJML}U=gqgSOhEr76FTZMZh9p5wHkY1S|p;fqy>)T$L(s*X@e->#+OhDqN}Q z;HhCUXujcQ>99jH@^sj#!xMElLx){DoTdQ zrbezF9sYr)CcTk!hvx4ZcHPL`H;ix6JH#S+x<_B{9~SR9aZp}Ar1=BGu3w|CpVs`r zVb`4^Tc*$YP?eacsR{`(O{aHhe$lY&4xQeu`IVo#zCDY1Eg8l)`S*$f331>e*DK0z zmQC4kk?S{9sOzm4xjtK8@6gxdnm(fG7xnedi=?m6*SB2cxaJBIP^92VBWzGcJs_YDi{VC&uLq$sXv zrIGJ072ds6QG?q{mktg04-3CDEd29f;g57US7jqc=c$u1I=rhyom`^BmAYLn*Wnq1 zs>QCB)>c0@>x_u|$N zmHw;_>t zai+}YyV*74j=J_ptlf3}?84cFMFlsu%is;)ykSmZ(VW8TuhkcXD2z5lV{NfuohXd7 z#KMKkBJG8B?Tt0pg1w~=Fp>}CousK}YP>-}Gq*Bxd+uDLFRSI*?R4f7+ zNO6MAjUkB8f{gL6P?n~0u8T%RVW_3KIUI>8efi)0PrrZ|o6&HO_Ad;*W>^7c{$kjZ zaPnJ>)h501PYmtR7mUAQ`~;JJ22Lo0NpJiYLp#Q+m@JohnDoZ4DAIhB-uOd?8vjS- zB82e+O}H2*^hHd1<9`_XGo8T5Z{ius;hesW2^;^$&^}!d<)^P>5V^S zsPU&v`6j)oKiy)c_u|LH_-BS1e~#%1DE9p{5)}kq664KSBtkryp*| zD~%(n6B&Qk literal 0 HcmV?d00001 diff --git a/openpilot/starpilot/soloist/bluealsa/lib/libasound_module_pcm_bluealsa.so b/openpilot/starpilot/soloist/bluealsa/lib/libasound_module_pcm_bluealsa.so new file mode 100755 index 0000000000000000000000000000000000000000..816c9dd8f32bb420e3171cc05a334ecd8d5840bd GIT binary patch literal 134600 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 None: + root = root or ROOT + if (root / 'VERSION').read_text().strip() != '5.0.0': + raise RuntimeError('BlueALSA 5.0.0 bundle is missing') + records = dict(line.split(maxsplit=1)[::-1] for line in (root / 'SHA256SUMS').read_text().splitlines()) + for name in ARTIFACTS: + data = (root / name).read_bytes() + if records.get(name) != hashlib.sha256(data).hexdigest(): + raise RuntimeError(f'BlueALSA artifact checksum failed: {name}') + if data[:6] != b'\x7fELF\x02\x01' or data[18:20] != b'\xb7\x00': + raise RuntimeError(f'BlueALSA artifact is not ARM64: {name}') + if name.startswith('bin/') and not os.access(root / name, os.X_OK): + raise RuntimeError(f'BlueALSA executable is not executable: {name}') + + +def alsa_plugins(root: Path | None = None) -> str: + """Explicit library paths affect this ALSA config only, never system defaults.""" + root = root or ROOT + result = '' + for kind in ('pcm', 'ctl'): + library = str(root / 'lib' / f'libasound_module_{kind}_bluealsa.so') + if any(c in library for c in '\n\r"\\'): + raise RuntimeError('Invalid BlueALSA plugin path') + result += f'{kind}_type.bluealsa {{ lib "{library}" }}\n' + return result + + +def paths(legacy: Path) -> tuple[Path, Path]: + return legacy.with_name('95-starpilot-bluealsa5.conf'), legacy.parent.parent / 'starpilot-bluealsa-launch.py' + + +def contents(legacy: Path, root: Path | None = None) -> str: + root = root or ROOT + override, launcher = paths(legacy) + def quote(path: Path) -> str: + value = str(path) + if any(c in value for c in '\n\r"\\$'): + raise RuntimeError('Invalid BlueALSA service path') + return '"' + value.replace('%', '%%') + '"' + return ('[Service]\nExecStart=\nExecStart=/usr/bin/python3 ' + + ' '.join(quote(p) for p in (launcher, root, legacy, override)) + '\n') + + +def check_owned(legacy: Path, root: Path | None = None) -> None: + override, _ = paths(legacy) + if override.exists() and override.read_text() != contents(legacy, root): + raise RuntimeError('BlueALSA 5 override was changed externally') + + +def install(legacy: Path, root: Path | None = None) -> None: + root = root or ROOT + validate(root) + check_owned(legacy, root) + override, launcher = paths(legacy) + launcher.parent.mkdir(parents=True, exist_ok=True) + temporary = launcher.with_suffix('.tmp') + temporary.write_bytes((root / 'launcher.py').read_bytes()) + temporary.chmod(0o644) + temporary.replace(launcher) + override.write_text(contents(legacy, root)) + + +def remove(legacy: Path, root: Path | None = None) -> None: + check_owned(legacy, root) + override, launcher = paths(legacy) + override.unlink(missing_ok=True) + launcher.unlink(missing_ok=True) diff --git a/openpilot/starpilot/soloist/phone_audio.py b/openpilot/starpilot/soloist/phone_audio.py index cfe1e66fbd..b908617845 100644 --- a/openpilot/starpilot/soloist/phone_audio.py +++ b/openpilot/starpilot/soloist/phone_audio.py @@ -16,7 +16,7 @@ import sys import time from pathlib import Path -from openpilot.starpilot.soloist import backend +from openpilot.starpilot.soloist import backend, bluealsa_runtime from openpilot.starpilot.soloist import preferences from openpilot.starpilot.soloist.paths import Layout from openpilot.starpilot.soloist.preferences import ADDRESS @@ -155,8 +155,8 @@ class PhoneInput: def capture_config(address: str) -> str: if not ADDRESS.fullmatch(address): raise ValueError('Invalid phone Bluetooth address') - return ('\npcm.starpilot_phone {\n type plug\n slave.pcm {\n' + - f' type bluealsa\n device "{address}"\n profile "a2dp"\n' + ' }\n}\n') + return ('\n' + bluealsa_runtime.alsa_plugins() + 'pcm.starpilot_phone {\n type plug\n slave.pcm {\n' + + f' type bluealsa\n device "{address}"\n profile "a2dp"\n hwcompat "silence"\n softvol "true"\n' + ' }\n}\n') class SampleSpec(C.Structure): @@ -246,7 +246,8 @@ def relay(address: str, server: str, config: Path): continue writer.write(data) if log is not None and now - last_log >= 0.5: - log.write(f'{time.time():.3f} latency_ms={writer.latency_ms():.1f} max_read_ms={max_read * 1000:.0f}\n') + epoch = time.time() # noqa: TID251 - correlate diagnostic logs with btmon/journal timestamps + log.write(f'{epoch:.3f} latency_ms={writer.latency_ms():.1f} max_read_ms={max_read * 1000:.0f}\n') log.flush() last_log, max_read = now, 0.0 finally: diff --git a/openpilot/starpilot/soloist/phone_profile.py b/openpilot/starpilot/soloist/phone_profile.py index 65d797143c..b695567bf2 100644 --- a/openpilot/starpilot/soloist/phone_profile.py +++ b/openpilot/starpilot/soloist/phone_profile.py @@ -11,6 +11,11 @@ from pathlib import Path import subprocess import sys +if __package__: + from . import bluealsa_runtime +else: + import bluealsa_runtime + DROP_IN = Path('/run/systemd/system/bluealsa.service.d/90-starpilot-phone.conf') # BlueALSA is tiny but must drain the Bluetooth socket on time; at nice 0 it competes with driving # processes on busy cores and the music chain (nice 10) cannot make up for lost incoming packets. @@ -25,32 +30,40 @@ def systemctl(*args): def configure(action: str, path: Path = DROP_IN, run=systemctl) -> None: if action not in ('acquire', 'release'): raise ValueError('Unknown profile action') - if path.exists() and path.read_text() not in (CONTENTS, LEGACY_CONTENTS): + previous = path.read_text() if path.exists() else None + if previous is not None and previous not in (CONTENTS, LEGACY_CONTENTS): raise RuntimeError('Phone audio profile override was changed externally') + bluealsa_runtime.check_owned(path) + override, _ = bluealsa_runtime.paths(path) if action == 'release': - if path.exists(): - path.unlink() + if previous is not None or override.exists(): + bluealsa_runtime.remove(path) + path.unlink(missing_ok=True) run('daemon-reload') run('try-restart', 'bluealsa.service') return - if path.exists() and path.read_text() == LEGACY_CONTENTS: - path.write_text(CONTENTS) - run('daemon-reload') - run('restart', 'bluealsa.service') - return - command = run('show', '--property=ExecStart', '--value', 'bluealsa.service') - if 'argv[]=/usr/bin/bluealsa -p a2dp-source -p a2dp-sink ;' in command: + bluealsa_runtime.validate() + if previous == CONTENTS and override.exists(): run('start', 'bluealsa.service') return - if 'argv[]=/usr/bin/bluealsa -p a2dp-source ;' not in command: - raise RuntimeError('Unsupported BlueALSA service configuration; phone audio was not enabled') + if previous is None: + command = run('show', '--property=ExecStart', '--value', 'bluealsa.service') + if not any(f'argv[]=/usr/bin/bluealsa {profiles} ;' in command for profiles in + ('-p a2dp-source', '-p a2dp-source -p a2dp-sink')): + raise RuntimeError('Unsupported BlueALSA service configuration; phone audio was not enabled') path.parent.mkdir(parents=True, exist_ok=True) - path.write_text(CONTENTS) try: + # Keep this file byte-for-byte compatible with old commits recovery code. + path.write_text(CONTENTS) + bluealsa_runtime.install(path) run('daemon-reload') run('restart', 'bluealsa.service') except Exception: - path.unlink(missing_ok=True) + bluealsa_runtime.remove(path) + if previous is None: + path.unlink(missing_ok=True) + else: + path.write_text(previous) run('daemon-reload') run('try-restart', 'bluealsa.service') raise diff --git a/openpilot/starpilot/soloist/supervisor.py b/openpilot/starpilot/soloist/supervisor.py index da2080474d..8326ee9320 100644 --- a/openpilot/starpilot/soloist/supervisor.py +++ b/openpilot/starpilot/soloist/supervisor.py @@ -20,7 +20,7 @@ import time from collections.abc import Callable from pathlib import Path -from openpilot.starpilot.soloist import backend, bugsink_report, credentials, package, preferences, phone_audio +from openpilot.starpilot.soloist import backend, bluealsa_runtime, bugsink_report, credentials, package, preferences, phone_audio from openpilot.starpilot.soloist import now_playing as now_playing_module from openpilot.starpilot.soloist.client import PlayerClient from openpilot.starpilot.soloist.paths import CONTROL_SOCKET, Layout, private_dir @@ -357,7 +357,7 @@ class Supervisor: if self.phone_prefs is not None: self.stop_children() self.retry_at = 0 - elif self.phone_profile and self.clock() >= self.pairing_profile_until: + elif self.phone_profile and (prefs.output != 'bluetooth' or self.launched is None) and self.clock() >= self.pairing_profile_until: self._release_profile() state, message, launch_key = self.desired() now = self.clock() @@ -382,6 +382,14 @@ class Supervisor: if not self.network(): self._set('waiting_network', 'Waiting for the comma’s network…') return + if prefs.output == 'bluetooth' and not self.phone_profile: + try: + phone_audio.profile('acquire') + self.phone_profile = True + except (OSError, RuntimeError, subprocess.SubprocessError) as error: + self.retry_at = now + OUTPUT_RETRY_SECONDS + self._set('audio_unavailable', str(error)) + return self.output_available = prefs.output != 'bluetooth' or self._output_ready(prefs.output_address) self.output_check_at = now + OUTPUT_RETRY_SECONDS self.waiting_for = '' if self.output_available else prefs.output_name or 'your Bluetooth speaker' @@ -579,7 +587,8 @@ def main() -> None: os.nice(10) # music yields to everything driving-related; children inherit this supervisor = Supervisor() reap_orphans(supervisor.layout) - if Path('/run/systemd/system/bluealsa.service.d/90-starpilot-phone.conf').exists(): + legacy_profile = Path('/run/systemd/system/bluealsa.service.d/90-starpilot-phone.conf') + if legacy_profile.exists() or bluealsa_runtime.paths(legacy_profile)[0].exists(): phone_audio.profile('release') stop = threading.Event() diff --git a/openpilot/starpilot/soloist/tests/fixtures/phone_profile_4_1_1.txt b/openpilot/starpilot/soloist/tests/fixtures/phone_profile_4_1_1.txt new file mode 100644 index 0000000000..65d797143c --- /dev/null +++ b/openpilot/starpilot/soloist/tests/fixtures/phone_profile_4_1_1.txt @@ -0,0 +1,63 @@ +"""Temporary AGNOS BlueALSA receiving profile. Invoked as root with a fixed action. + +Only a feature-owned /run drop-in is changed; Bluetooth power, bonds, bluetoothd, +HFP and the on-disk service definition are untouched. Unknown service commands +are rejected rather than replaced. The override disappears on reboot. +""" +from __future__ import annotations + +import fcntl +from pathlib import Path +import subprocess +import sys + +DROP_IN = Path('/run/systemd/system/bluealsa.service.d/90-starpilot-phone.conf') +# BlueALSA is tiny but must drain the Bluetooth socket on time; at nice 0 it competes with driving +# processes on busy cores and the music chain (nice 10) cannot make up for lost incoming packets. +LEGACY_CONTENTS = '[Service]\nExecStart=\nExecStart=/usr/bin/bluealsa -p a2dp-source -p a2dp-sink\n' +CONTENTS = LEGACY_CONTENTS + 'Nice=-5\n' + + +def systemctl(*args): + return subprocess.run(['/usr/bin/systemctl', *args], check=True, capture_output=True, text=True, timeout=15).stdout.strip() + + +def configure(action: str, path: Path = DROP_IN, run=systemctl) -> None: + if action not in ('acquire', 'release'): + raise ValueError('Unknown profile action') + if path.exists() and path.read_text() not in (CONTENTS, LEGACY_CONTENTS): + raise RuntimeError('Phone audio profile override was changed externally') + if action == 'release': + if path.exists(): + path.unlink() + run('daemon-reload') + run('try-restart', 'bluealsa.service') + return + if path.exists() and path.read_text() == LEGACY_CONTENTS: + path.write_text(CONTENTS) + run('daemon-reload') + run('restart', 'bluealsa.service') + return + command = run('show', '--property=ExecStart', '--value', 'bluealsa.service') + if 'argv[]=/usr/bin/bluealsa -p a2dp-source -p a2dp-sink ;' in command: + run('start', 'bluealsa.service') + return + if 'argv[]=/usr/bin/bluealsa -p a2dp-source ;' not in command: + raise RuntimeError('Unsupported BlueALSA service configuration; phone audio was not enabled') + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(CONTENTS) + try: + run('daemon-reload') + run('restart', 'bluealsa.service') + except Exception: + path.unlink(missing_ok=True) + run('daemon-reload') + run('try-restart', 'bluealsa.service') + raise + + +if __name__ == '__main__': + # Serializes recovery and normal shutdown; never takes the adapter's pairing lease. + with open('/run/starpilot-phone-profile.lock', 'w') as lock: + fcntl.flock(lock, fcntl.LOCK_EX) + configure(sys.argv[1]) diff --git a/openpilot/starpilot/soloist/tests/test_bluealsa_upgrade.py b/openpilot/starpilot/soloist/tests/test_bluealsa_upgrade.py new file mode 100644 index 0000000000..326eeee78b --- /dev/null +++ b/openpilot/starpilot/soloist/tests/test_bluealsa_upgrade.py @@ -0,0 +1,145 @@ +from pathlib import Path +import runpy +import shutil +import subprocess + +import pytest + +from openpilot.starpilot.soloist import bluealsa_runtime as runtime, phone_profile, phone_audio, backend + + +def test_bundle_is_complete_checksummed_arm64(): + runtime.validate() + assert (runtime.ROOT / 'UPSTREAM_COMMIT').read_text().strip() == '1935d6dcb8975f2d7a51aaafe61538d157224623' + + +def test_capture_and_playback_select_matching_private_plugins(): + capture = phone_audio.capture_config('11:22:33:44:55:66') + playback = backend.alsa_config('11:22:33:44:55:66') + for config in (capture, playback): + assert runtime.alsa_plugins() in config + assert 'softvol "true"' in config + assert 'hwcompat "silence"' in capture + assert 'hwcompat' not in playback + + +def test_checksum_failure_rejects_incomplete_upgrade(tmp_path): + shutil.copytree(runtime.ROOT, tmp_path / 'bundle', ignore=shutil.ignore_patterns('build', '__pycache__')) + root = tmp_path / 'bundle' + (root / 'lib/libasound_module_pcm_bluealsa.so').write_bytes(b'broken') + with pytest.raises(RuntimeError, match='checksum'): + runtime.validate(root) + + +def test_old_commit_restart_restores_stock_daemon_and_removes_upgrade(tmp_path, monkeypatch): + checkout = tmp_path / 'checkout' + checkout.mkdir() + def git(*args): + return subprocess.run(['git', '-C', str(checkout), *args], check=True, capture_output=True, text=True).stdout.strip() + git('init', '-q') + git('config', 'user.name', 'Rollback test') + git('config', 'user.email', 'rollback@example.invalid') + old = Path(__file__).with_name('fixtures') / 'phone_profile_4_1_1.txt' + shutil.copyfile(old, checkout / 'phone_profile.py') + git('add', '.') + git('commit', '-qm', '4.1.1') + previous_commit = git('rev-parse', 'HEAD') + bundle = checkout / 'bluealsa' + shutil.copytree(runtime.ROOT, bundle, ignore=shutil.ignore_patterns('build', '__pycache__')) + git('add', '.') + git('commit', '-qm', '5.0.0') + monkeypatch.setattr(runtime, 'ROOT', bundle) + legacy = tmp_path / 'run/systemd/system/bluealsa.service.d/90-starpilot-phone.conf' + calls = [] + def run(*args): + calls.append(args) + if args[0] == 'show': + return '{ argv[]=/usr/bin/bluealsa -p a2dp-source ; }' + return '' + phone_profile.configure('acquire', legacy, run) + override, launcher = runtime.paths(legacy) + launch = runpy.run_path(str(launcher))['select'] + assert launch(bundle, legacy, override, lambda: None)[0] == str(bundle / 'bin/bluealsad') + # Actual checkout removes tracked v5 bundle; /run intentionally survives. + git('checkout', '-q', previous_commit) + assert not (bundle / 'VERSION').exists() + old_module = runpy.run_path(str(checkout / 'phone_profile.py')) + selected = [] + def old_run(*args): + calls.append(args) + if args[0] == 'try-restart': + selected.append(launch(bundle, legacy, override, lambda: calls.append(('daemon-reload',)))) + return '' + old_module['configure']('release', legacy, old_run) + assert selected == [['/usr/bin/bluealsa', '-p', 'a2dp-source']] + assert not legacy.exists() and not override.exists() and not launcher.exists() + old_module['configure']('acquire', legacy, run) + assert legacy.read_text() == old_module['CONTENTS'] + assert not override.exists() # old code stays on the system daemon/plugins + + +def test_failed_start_rolls_back_both_overrides(tmp_path): + legacy = tmp_path / 'system/bluealsa.service.d/90-starpilot-phone.conf' + calls = [] + def run(*args): + calls.append(args) + if args[0] == 'show': + return '{ argv[]=/usr/bin/bluealsa -p a2dp-source ; }' + if args[0] == 'restart': + raise RuntimeError('start failed') + return '' + with pytest.raises(RuntimeError, match='start failed'): + phone_profile.configure('acquire', legacy, run) + assert not legacy.exists() + assert all(not p.exists() for p in runtime.paths(legacy)) + assert calls[-1] == ('try-restart', 'bluealsa.service') + + +def test_spotify_bluetooth_owns_upgrade_until_output_stops(tmp_path, monkeypatch): + from openpilot.starpilot.soloist import preferences, supervisor + from openpilot.starpilot.soloist.paths import Layout + from openpilot.starpilot.soloist.tests.test_runtime import make_supervisor, ready_layout + layout = Layout(tmp_path / 'music') + ready_layout(layout, monkeypatch) + preferences.save(preferences.Preferences(output='bluetooth', output_address='11:22:33:44:55:66'), layout) + calls, children = [], [] + monkeypatch.setattr(phone_audio, 'profile', calls.append) + monkeypatch.setattr(supervisor, '_kill_group', lambda process: None) + sup, now = make_supervisor(layout, children) + sup.output.ready = lambda address: True + sup.tick() + assert calls == ['acquire'] and sup.phone_profile and len(children) == 2 + now[0] += 300 + sup.tick() + assert calls == ['acquire'] # pairing timeout must not downgrade a playing output + sup.stop_children() + assert calls == ['acquire', 'release'] and not sup.phone_profile + + +def test_spotify_never_starts_v5_plugin_against_v4_after_activation_failure(tmp_path, monkeypatch): + from openpilot.starpilot.soloist import preferences + from openpilot.starpilot.soloist.paths import Layout + from openpilot.starpilot.soloist.tests.test_runtime import make_supervisor, ready_layout + layout = Layout(tmp_path / 'music') + ready_layout(layout, monkeypatch) + preferences.save(preferences.Preferences(output='bluetooth', output_address='11:22:33:44:55:66'), layout) + def failed(action): + raise RuntimeError('upgrade unavailable') + monkeypatch.setattr(phone_audio, 'profile', failed) + children = [] + sup, now = make_supervisor(layout, children) + sup.tick() + assert not children and not sup.phone_profile + assert sup.state == 'audio_unavailable' and sup.retry_at > now[0] + + +def test_daemon_uses_separate_persistent_storage(): + binary = (runtime.ROOT / 'bin/bluealsad').read_bytes() + assert b'/data/starpilot/bluealsa5/lib/bluealsa\0' in binary + assert b'/var/lib/bluealsa\0' not in binary + + +def test_bundle_artifacts_are_not_git_ignored(): + result = subprocess.run(['git', '-C', str(runtime.ROOT.parents[3]), 'check-ignore', + *(str(runtime.ROOT / name) for name in runtime.ARTIFACTS)], check=False, capture_output=True) + assert result.returncode == 1 # all artifacts can travel with the upgrade commit diff --git a/openpilot/starpilot/soloist/tests/test_runtime.py b/openpilot/starpilot/soloist/tests/test_runtime.py index e495b1f8af..e23b7e30bc 100644 --- a/openpilot/starpilot/soloist/tests/test_runtime.py +++ b/openpilot/starpilot/soloist/tests/test_runtime.py @@ -168,6 +168,7 @@ class FakeClient: def ready_layout(layout, monkeypatch, *, expired=False): + monkeypatch.setattr(supervisor.phone_audio, 'profile', lambda action: None) monkeypatch.setattr(supervisor.package, 'release_status', lambda _l: {'installed': True, 'expired': expired}) monkeypatch.setattr(supervisor.backend, 'bundle_ready', lambda: True) layout.root.mkdir(parents=True, exist_ok=True)