From 423ea59371218ee4c5aba3bd9a1d858e55243c51 Mon Sep 17 00:00:00 2001 From: Ultradesu Date: Wed, 12 Aug 2026 01:30:57 +0100 Subject: [PATCH] Init commit --- .gitignore | 4 + ARCHITECTURE.md | 74 + Cargo.lock | 9521 ++++++++++++++++++++++++++ Cargo.toml | 76 + LICENSE | 14 + README.md | 92 + apps/desktop/Cargo.toml | 21 + apps/desktop/src/main.rs | 5 + crates/application/Cargo.toml | 14 + crates/application/src/lib.rs | 613 ++ crates/backend-api/Cargo.toml | 13 + crates/backend-api/src/lib.rs | 346 + crates/backend/Cargo.toml | 23 + crates/backend/build.rs | 33 + crates/backend/src/actor_devices.rs | 481 ++ crates/backend/src/audio.rs | 281 + crates/backend/src/devices.rs | 1129 +++ crates/backend/src/devices/store.rs | 875 +++ crates/backend/src/federation.rs | 858 +++ crates/backend/src/lib.rs | 1816 +++++ crates/backend/src/settings/mod.rs | 153 + crates/backend/src/streaming.rs | 97 + crates/backend/src/support.rs | 955 +++ crates/backend/src/tests.rs | 462 ++ crates/domain/Cargo.toml | 10 + crates/domain/src/lib.rs | 555 ++ crates/platform-desktop/Cargo.toml | 23 + crates/platform-desktop/src/lib.rs | 18 + crates/platform-desktop/src/media.rs | 185 + crates/ui/Cargo.toml | 23 + crates/ui/assets/add-end.svg | 1 + crates/ui/assets/back.svg | 1 + crates/ui/assets/close.svg | 1 + crates/ui/assets/devices.svg | 6 + crates/ui/assets/federation.svg | 5 + crates/ui/assets/forward.svg | 1 + crates/ui/assets/heart.svg | 1 + crates/ui/assets/home.svg | 1 + crates/ui/assets/info.svg | 1 + crates/ui/assets/library.svg | 1 + crates/ui/assets/logo.svg | 13 + crates/ui/assets/more.svg | 1 + crates/ui/assets/next.svg | 1 + crates/ui/assets/note.svg | 6 + crates/ui/assets/pause.svg | 1 + crates/ui/assets/play-next.svg | 1 + crates/ui/assets/play.svg | 1 + crates/ui/assets/playlist-add.svg | 1 + crates/ui/assets/plus.svg | 3 + crates/ui/assets/previous.svg | 1 + crates/ui/assets/queue.svg | 1 + crates/ui/assets/search.svg | 1 + crates/ui/assets/settings.svg | 1 + crates/ui/assets/share.svg | 1 + crates/ui/assets/volume.svg | 1 + crates/ui/build.rs | 3 + crates/ui/src/lib.rs | 728 ++ crates/ui/src/render.rs | 1643 +++++ crates/ui/ui/app.slint | 822 +++ crates/ui/ui/components.slint | 702 ++ crates/ui/ui/models.slint | 90 + rust-toolchain.toml | 5 + rustfmt.toml | 2 + screenshots/furumi-desktop.png | Bin 0 -> 1035986 bytes shell.nix | 38 + vendor/block/Cargo.toml | 24 + vendor/block/src/lib.rs | 400 ++ 67 files changed, 23280 insertions(+) create mode 100644 .gitignore create mode 100644 ARCHITECTURE.md create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 apps/desktop/Cargo.toml create mode 100644 apps/desktop/src/main.rs create mode 100644 crates/application/Cargo.toml create mode 100644 crates/application/src/lib.rs create mode 100644 crates/backend-api/Cargo.toml create mode 100644 crates/backend-api/src/lib.rs create mode 100644 crates/backend/Cargo.toml create mode 100644 crates/backend/build.rs create mode 100644 crates/backend/src/actor_devices.rs create mode 100644 crates/backend/src/audio.rs create mode 100644 crates/backend/src/devices.rs create mode 100644 crates/backend/src/devices/store.rs create mode 100644 crates/backend/src/federation.rs create mode 100644 crates/backend/src/lib.rs create mode 100644 crates/backend/src/settings/mod.rs create mode 100644 crates/backend/src/streaming.rs create mode 100644 crates/backend/src/support.rs create mode 100644 crates/backend/src/tests.rs create mode 100644 crates/domain/Cargo.toml create mode 100644 crates/domain/src/lib.rs create mode 100644 crates/platform-desktop/Cargo.toml create mode 100644 crates/platform-desktop/src/lib.rs create mode 100644 crates/platform-desktop/src/media.rs create mode 100644 crates/ui/Cargo.toml create mode 100644 crates/ui/assets/add-end.svg create mode 100644 crates/ui/assets/back.svg create mode 100644 crates/ui/assets/close.svg create mode 100644 crates/ui/assets/devices.svg create mode 100644 crates/ui/assets/federation.svg create mode 100644 crates/ui/assets/forward.svg create mode 100644 crates/ui/assets/heart.svg create mode 100644 crates/ui/assets/home.svg create mode 100644 crates/ui/assets/info.svg create mode 100644 crates/ui/assets/library.svg create mode 100644 crates/ui/assets/logo.svg create mode 100644 crates/ui/assets/more.svg create mode 100644 crates/ui/assets/next.svg create mode 100644 crates/ui/assets/note.svg create mode 100644 crates/ui/assets/pause.svg create mode 100644 crates/ui/assets/play-next.svg create mode 100644 crates/ui/assets/play.svg create mode 100644 crates/ui/assets/playlist-add.svg create mode 100644 crates/ui/assets/plus.svg create mode 100644 crates/ui/assets/previous.svg create mode 100644 crates/ui/assets/queue.svg create mode 100644 crates/ui/assets/search.svg create mode 100644 crates/ui/assets/settings.svg create mode 100644 crates/ui/assets/share.svg create mode 100644 crates/ui/assets/volume.svg create mode 100644 crates/ui/build.rs create mode 100644 crates/ui/src/lib.rs create mode 100644 crates/ui/src/render.rs create mode 100644 crates/ui/ui/app.slint create mode 100644 crates/ui/ui/components.slint create mode 100644 crates/ui/ui/models.slint create mode 100644 rust-toolchain.toml create mode 100644 rustfmt.toml create mode 100644 screenshots/furumi-desktop.png create mode 100644 shell.nix create mode 100644 vendor/block/Cargo.toml create mode 100644 vendor/block/src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5be2a2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.direnv/ +.DS_Store + diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..8122c6e --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,74 @@ +# Architecture + +Furumi Desktop is a modular monolith: it ships as one process and one binary, +while keeping reusable backend services independent from the desktop UI. + +## Invariants + +1. The UI renders state and emits intent; it never performs backend work. +2. Application state changes through deterministic reducers. +3. Backend state is authoritative for playback, queue, library and operations. +4. Navigation is frontend state: the backend does not know which panel is open. +5. Commands use a bounded channel; snapshots use a coalescing watch channel. +6. Long operations carry request IDs and cancellation tokens. Stale results are + rejected before they reach authoritative state. +7. Local numeric IDs remain compatible with Furumi (`i64`). Stable track + identity is an optional normalized `b3:<64 hex>` content ID. +8. Audio output runs on a dedicated worker thread. Device access, decoding and + playback never block the UI or backend actor. +9. Durable settings belong to the backend. UI edits are projected immediately, + then persisted by a dedicated worker without blocking the UI or actor loop. +10. Catalog entities use source-aware keys. Local and federated providers map + into the same artist, release, track, and artwork contracts before a + snapshot reaches the application or UI. +11. UI events identify catalog items by stable source-aware keys. A row index + is never used as track identity because federation can reorder a list while + results are arriving. + +## Data flow + +```text +Slint callback -> UiAction -> reducer -> BackendCommand -> backend actor + ^ | + | BackendSnapshot <-----------+ + +---- UI projection <- reducer/state update +``` + +The desktop application uses typed in-process channels. `backend-api` contains +no Slint, Tokio, database or transport types, so a server adapter can map the +same semantics onto another transport without making desktop pay for HTTP. + +## Catalog providers and artwork + +The local SQLite library and federation are catalog providers, not separate +sets of screens or view models. The backend merges provider results into +`LibrarySnapshot`; `CatalogSource`, `ArtistKey`, and `ReleaseKey` preserve +identity and provenance across that merge. Release tracks are normalized by +disc and metadata track number after every merge, with local records taking +precedence over equivalent remote records. + +Artwork is asynchronously resolved. A provider may initially emit an entity +without a URI, fetch or cache its image, and publish a newer snapshot with the +same entity key and a local URI. Slint renders either that resolved image or +the common placeholder and never performs filesystem or network I/O. + +## Crates + +- `domain`: identifiers, entities and queue rules. +- `backend-api`: commands, snapshots, operation state and errors. +- `application`: frontend navigation state, reducers and UI projections. +- `backend`: actor/runtime orchestration, catalog federation, connected-device + synchronization, persistence and the audio engine. +- `platform-desktop`: narrow native OS adapters such as the folder picker. +- `ui`: Slint components and the adapter connecting callbacks to state. +- `apps/desktop`: composition root only. + +## Settings persistence + +The backend stores settings in `furumi-desktop.sqlite3` under the platform +application-data directory selected by `directories::ProjectDirs`. Schema +changes are ordered migrations recorded in `schema_migrations`; each migration +runs in a transaction. The settings writer owns its SQLite connection on a +dedicated thread and coalesces bursts of edits before writing the latest full +snapshot. The configured device name is also written to the connected-device +identity and published through the device-profile operation log. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..72ea895 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,9521 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common 0.1.7", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alsa" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d" +dependencies = [ + "alsa-sys", + "bitflags 2.13.1", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad7569085a265dd3f607ebecce7458eaab2132a84393534c95b18dcbc3f31e04" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.1", + "cc", + "jni 0.22.4", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.20", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f211a51805bc641f3ad5b7664c77d2547af685cc33b4cd8d31964027a46f13f1" +dependencies = [ + "anstyle", + "memchr", + "unicode-width", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "ashpd" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.5", + "raw-window-handle", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.19.0", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.5.0", + "futures-lite 2.6.1", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.28", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.1", + "parking", + "polling 3.11.0", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.44", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io 2.6.0", + "async-lock 3.4.2", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.2", + "futures-lite 2.6.1", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io 2.6.0", + "async-lock 3.4.2", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "attohttpc" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" +dependencies = [ + "base64", + "http", + "log", + "url", +] + +[[package]] +name = "auto_enums" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3091d68264354f211516b91dce6f71046e444fab1867716035f736667243affb" +dependencies = [ + "derive_utils", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.20", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand 2.5.0", + "gloo-timers", + "tokio", +] + +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.13.1", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.3", + "shlex 1.3.0", + "syn 2.0.119", +] + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitstream-io" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] + +[[package]] +name = "blake3" +version = "1.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block" +version = "0.1.6" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.6.1", + "piper", +] + +[[package]] +name = "borsh" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88b7ea17d208c4193f2c1e6de3c35fe71f98c96982d5ced308bdcc749ff6e1f" +dependencies = [ + "bytes", + "cfg_aliases", +] + +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "by_address" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.1", + "log", + "polling 3.11.0", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.13.1", + "polling 3.11.0", + "rustix 1.1.4", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "clru" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "197fd99cb113a8d5d9b6376f3aa817f32c1078f2343b714fff7d2ca44fdf67d5" +dependencies = [ + "hashbrown 0.16.1", +] + +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation 0.9.4", + "core-graphics 0.22.3", + "foreign-types 0.3.2", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation 0.9.4", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-field-offset" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9713489fbc45a2d113f58d17448c73115d533ed27fd2f2d0e5e5c69663eaf19b" +dependencies = [ + "const-field-offset-macro", + "field-offset", +] + +[[package]] +name = "const-field-offset-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b5dc851b7ea80cc4f69aa28632385ffd3e0f88014d53db3f2e5a781896ca783" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "copypasta" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6811e17f81fe246ef2bc553f76b6ee6ab41a694845df1d37e52a92b7bbd38a" +dependencies = [ + "clipboard-win", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "smithay-clipboard", + "x11-clipboard", +] + +[[package]] +name = "cordyceps" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9ab7e0ca1d179628fa0172b2b97203c7fa0cd81be2448bd446fb9559ca9261" +dependencies = [ + "loom", + "tracing", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "coreaudio-rs" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5d7dca3ebcf65a035582c9ad4385371a9d9ee6537474d2a278f4e1e475bb58" +dependencies = [ + "bitflags 2.13.1", + "libc", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "countme" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" + +[[package]] +name = "cpal" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8942da362c0f0d895d7cac616263f2f9424edc5687364dfd1d25ef7eba506d7" +dependencies = [ + "alsa", + "coreaudio-rs", + "dasp_sample", + "jni 0.21.1", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "objc2 0.6.4", + "objc2-audio-toolbox", + "objc2-avf-audio", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.62.2", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", + "rand_core 0.10.1", +] + +[[package]] +name = "ctor" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83cf0d42651b16c6dfe68685716d18480d18a9c39c62d76e8cf3eb6ed5d8bcbf" +dependencies = [ + "dtor", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "curve25519-dalek" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "curve25519-dalek-derive", + "digest 0.11.3", + "fiat-crypto", + "rand_core 0.10.1", + "rustc_version", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" + +[[package]] +name = "data-encoding-macro" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6a127ecbb3c4632e1525380e04c0c3fcf8dcb44d32a79ea290d8a36906edcd8" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54e03a951783e8b327515db3f2a2fd0e3bed362a96b066f341ce66ed49b4ead" +dependencies = [ + "data-encoding", + "syn 3.0.3", +] + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "der" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69dedd701da44b0536442edf09c81a64b0ab97a7a4a5e3d1971f00027cbc63d" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", + "unicode-xid", +] + +[[package]] +name = "derive_utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc05a5d33db20c784f873e84934ad94bb209a090987ac5f62fede2c178234f23" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", +] + +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "block2 0.6.2", + "libc", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "drm" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "libc", + "rustix 0.38.44", +] + +[[package]] +name = "drm-ffi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690" +dependencies = [ + "drm-sys", + "rustix 1.1.4", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8" +dependencies = [ + "libc", + "linux-raw-sys 0.9.4", +] + +[[package]] +name = "dtor" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edf234dd1594d6dd434a8fb8cada51ddbbc593e40e4a01556a0b31c62da2775b" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ed25519" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" +dependencies = [ + "pkcs8", + "serdect", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.10.1", + "serde", + "sha2", + "signature", + "subtle", + "zeroize", +] + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-assoc" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.2", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "num-complex", + "pulp", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "federation-net" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e690b370c505d153bef214b21a8f2aa55d667367ac1e16bde8bc0de88963c2" +dependencies = [ + "blake3", + "data-encoding", + "futures", + "iroh", + "iroh-base", + "iroh-tickets", + "mainline", + "postcard", + "rand 0.9.5", + "serde", + "thiserror 2.0.20", + "tokio", + "tracing", +] + +[[package]] +name = "femtovg" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43d05da42e81724c16d34a150fb7fda53d3f786e5a94673ee526ff8602f0f6a" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "fnv", + "glow", + "imgref", + "itertools 0.14.0", + "log", + "rgb", + "slotmap", + "swash", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset 0.9.1", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fixed_decimal" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd" +dependencies = [ + "displaydoc", + "smallvec", + "writeable", +] + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "flume" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.9", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "font-types" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "font-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7299a780854a6d391be2ae1c8521c9368471b559dbfd6a8dbd9f407eaff100" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "log", + "slotmap", + "tinyvec", + "ttf-parser", +] + +[[package]] +name = "fontique" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "274fa4f0f0a926ae182c7c076c078cce8a38471d15e61a102a02cac984be9813" +dependencies = [ + "hashbrown 0.17.1", + "linebender_resource_handle", + "memmap2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-text", + "objc2-foundation 0.3.2", + "parlance", + "read-fonts 0.39.2", + "roxmltree", + "smallvec", + "windows 0.62.2", + "windows-core", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "furumi-application" +version = "0.1.0" +dependencies = [ + "furumi-backend-api", + "furumi-domain", +] + +[[package]] +name = "furumi-backend" +version = "0.1.0" +dependencies = [ + "anyhow", + "directories", + "furumi-backend-api", + "furumi-domain", + "furumi-library", + "music-dht", + "rodio", + "rusqlite", + "serde", + "serde_json", + "tokio", + "tokio-util", +] + +[[package]] +name = "furumi-backend-api" +version = "0.1.0" +dependencies = [ + "furumi-domain", +] + +[[package]] +name = "furumi-desktop" +version = "0.1.0" +dependencies = [ + "furumi-backend", + "furumi-ui", +] + +[[package]] +name = "furumi-domain" +version = "0.1.0" + +[[package]] +name = "furumi-library" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f15ab98c65d89ea18e55ed8852abd2f029f63876d357270c4647d73601d0a2" +dependencies = [ + "anyhow", + "blake3", + "directories", + "lofty", + "music-dht", + "rusqlite", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "furumi-platform-desktop" +version = "0.1.0" +dependencies = [ + "core-foundation 0.10.1", + "rfd", + "souvlaki", + "windows-sys 0.61.2", +] + +[[package]] +name = "furumi-ui" +version = "0.1.0" +dependencies = [ + "furumi-application", + "furumi-backend", + "furumi-backend-api", + "furumi-domain", + "furumi-platform-desktop", + "image", + "slint", + "slint-build", + "tokio", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-buffered" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.1", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand 2.5.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gbm" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a" +dependencies = [ + "bitflags 2.13.1", + "drm", + "drm-fourcc", + "gbm-sys", + "libc", +] + +[[package]] +name = "gbm-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f" +dependencies = [ + "libc", +] + +[[package]] +name = "generator" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link", + "windows-result", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link", +] + +[[package]] +name = "getopts" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "glow" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.13.1", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "grid" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" + +[[package]] +name = "h2" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d12c7c642d4ce8c2e784b4751a6634bd89583912265add4a679a8882d123fbcd" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "read-fonts 0.39.2", + "smallvec", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin 0.9.9", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hickory-net" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183" +dependencies = [ + "async-trait", + "bytes", + "cfg-if", + "data-encoding", + "futures-channel", + "futures-io", + "futures-util", + "h2", + "hickory-proto", + "http", + "idna", + "ipnet", + "jni 0.22.4", + "rand 0.10.2", + "rustls", + "thiserror 2.0.20", + "tinyvec", + "tokio", + "tokio-rustls", + "tracing", + "url", +] + +[[package]] +name = "hickory-proto" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643" +dependencies = [ + "data-encoding", + "idna", + "ipnet", + "jni 0.22.4", + "once_cell", + "prefix-trie", + "rand 0.10.2", + "ring", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-net", + "hickory-proto", + "ipconfig", + "ipnet", + "jni 0.22.4", + "moka", + "ndk-context", + "once_cell", + "parking_lot", + "rand 0.10.2", + "resolv-conf", + "rustls", + "smallvec", + "system-configuration", + "thiserror 2.0.20", + "tokio", + "tokio-rustls", + "tracing", +] + +[[package]] +name = "htmlparser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ce8546b993eaf241d69ded33b1be6d205dd9857ec879d9d18bd05d3676e144" + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.5", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "i-slint-backend-linuxkms" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e76f2b13846ca54bba6b8eb3b5454b26879ad987396d0a2d8abedc31a6c469" +dependencies = [ + "bytemuck", + "calloop 0.14.4", + "cfg_aliases", + "drm", + "gbm", + "glutin", + "i-slint-common", + "i-slint-core", + "i-slint-renderer-femtovg", + "i-slint-renderer-software", + "input", + "memmap2", + "nix 0.31.3", + "raw-window-handle", + "xkbcommon", +] + +[[package]] +name = "i-slint-backend-selector" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2247a4590a02a466b2f4916cc789dfe66247f6af826f00eb84a2685259a45c1c" +dependencies = [ + "cfg-if", + "cfg_aliases", + "i-slint-backend-linuxkms", + "i-slint-backend-testing", + "i-slint-backend-winit", + "i-slint-common", + "i-slint-core", + "i-slint-core-macros", + "i-slint-renderer-femtovg", +] + +[[package]] +name = "i-slint-backend-testing" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e901e3d47ab829c0ef500c63155776208707cd93259e6a7803ed627fa2786" +dependencies = [ + "cfg_aliases", + "i-slint-common", + "i-slint-core", + "i-slint-renderer-software", + "vtable", +] + +[[package]] +name = "i-slint-backend-winit" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27c7e8f53418d3017362465367b6612b6e439a68097d627d1b91c94b885f0a6" +dependencies = [ + "block2 0.6.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "copypasta", + "derive_more", + "futures", + "glutin", + "glutin-winit", + "i-slint-common", + "i-slint-core", + "i-slint-core-macros", + "i-slint-renderer-femtovg", + "i-slint-renderer-skia", + "i-slint-renderer-software", + "imgref", + "lyon_path", + "muda", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "objc2-ui-kit 0.3.2", + "pin-weak", + "raw-window-handle", + "rgb", + "scoped-tls-hkt", + "scopeguard", + "softbuffer", + "strum", + "vtable", + "wasm-bindgen", + "web-sys", + "webbrowser", + "windows 0.62.2", + "winit", + "zbus 5.19.0", +] + +[[package]] +name = "i-slint-common" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e63f8ea55ba21e44567ae67d2b01a4f5d09bb1fab693b1e6c79d96bef9e456" +dependencies = [ + "derive_more", + "fontique", + "htmlparser", + "icu_decimal", + "icu_locale_core", + "icu_provider", + "pulldown-cmark", + "resvg", + "skrifa 0.42.1", +] + +[[package]] +name = "i-slint-compiler" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ea275b15a425c7f2f77481151e1f5f8f1ea83feae580273090ef6b9e192218" +dependencies = [ + "annotate-snippets", + "by_address", + "data-url", + "derive_more", + "i-slint-common", + "icu_normalizer", + "image", + "itertools 0.14.0", + "linked_hash_set", + "lyon_extra", + "lyon_path", + "num_enum", + "proc-macro2", + "quote", + "rayon", + "resvg", + "rowan", + "rspolib", + "skrifa 0.42.1", + "smol_str 0.3.6", + "strum", + "swash", + "typed-index-collections", + "unicode-segmentation", + "url", +] + +[[package]] +name = "i-slint-core" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e407dc2bd5385dcbdd9c1cf927213d2e4bacda667545abf8839c60f8290f754" +dependencies = [ + "auto_enums", + "bitflags 2.13.1", + "cfg-if", + "chrono", + "clru", + "const-field-offset", + "derive_more", + "euclid", + "i-slint-common", + "i-slint-core-macros", + "icu_normalizer", + "image", + "lyon_algorithms", + "lyon_extra", + "lyon_geom", + "lyon_path", + "num-traits", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "once_cell", + "parley", + "pin-project", + "pin-weak", + "portable-atomic", + "raw-window-handle", + "resvg", + "rgb", + "scopeguard", + "skrifa 0.42.1", + "slab", + "strum", + "swash", + "sys-locale", + "taffy", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", + "vtable", + "wasm-bindgen", + "web-sys", + "web-time", + "windows 0.62.2", +] + +[[package]] +name = "i-slint-core-macros" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a842640da4c4d0909d25cc5a51e1f9cde02bd48f7fdfa94df10d595d4e3c80a" +dependencies = [ + "quote", + "serde_json", + "syn 2.0.119", +] + +[[package]] +name = "i-slint-renderer-femtovg" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78d0d99a18d66738b684758fe8460743a0aa0f64a96e05940942231a340085b1" +dependencies = [ + "cfg-if", + "const-field-offset", + "derive_more", + "femtovg", + "glow", + "i-slint-common", + "i-slint-core", + "i-slint-core-macros", + "imgref", + "lyon_path", + "pin-weak", + "rgb", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "i-slint-renderer-skia" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b6eed7f3f0a9a3d3ca6e8b9d4ca233371d989351fdb2a7ab88ec368b99e7b57" +dependencies = [ + "bytemuck", + "cfg-if", + "cfg_aliases", + "clru", + "const-field-offset", + "derive_more", + "glow", + "glutin", + "i-slint-common", + "i-slint-core", + "i-slint-core-macros", + "lyon_path", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", + "pin-weak", + "raw-window-handle", + "raw-window-metal", + "read-fonts 0.39.2", + "scoped-tls-hkt", + "skia-safe", + "softbuffer", + "unicode-segmentation", + "vtable", + "windows 0.62.2", + "write-fonts", +] + +[[package]] +name = "i-slint-renderer-software" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73496f164f8e471877c35e0fadb996dcc674922712abd9c2be2cbe80c58859bd" +dependencies = [ + "bytemuck", + "clru", + "derive_more", + "euclid", + "i-slint-common", + "i-slint-core", + "integer-sqrt", + "lyon_path", + "num-traits", + "skrifa 0.42.1", + "swash", + "zeno", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_decimal" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "288247df2e32aa776ac54fdd64de552149ac43cb840f2761811f0e8d09719dd4" +dependencies = [ + "displaydoc", + "fixed_decimal", + "icu_decimal_data", + "icu_locale", + "icu_locale_core", + "icu_plurals", + "icu_provider", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_decimal_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f14a5ca9e8af29eef62064f269078424283d90dbaffeac5225addf62aaabc22" + +[[package]] +name = "icu_locale" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locale_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_plurals" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a50023f1d49ad5c4333380328a0d4a19e4b9d6d842ec06639affd5ba47c8103" +dependencies = [ + "fixed_decimal", + "icu_locale", + "icu_plurals_data", + "icu_provider", + "zerovec", +] + +[[package]] +name = "icu_plurals_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8485497155dc865f901decb93ecc20d3e467df67bfeceb91e3ba34e2b11e8e1d" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_segmenter" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0794db0b1a86193ac9c48768d0e6c52c54448e0870ad87907d456ee0dac964" +dependencies = [ + "icu_collections", + "icu_locale", + "icu_provider", + "icu_segmenter_data", + "potential_utf", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_segmenter_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a2c462a4d927d512f5f882a033ddd62f33a05bb9f230d98f736ac3dc85938f" + +[[package]] +name = "identity-hash" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "igd-next" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de7238d487a9aff61f81b5ab41c0a841532a115a398b5fa92a2fadd0885e2581" +dependencies = [ + "attohttpc", + "bytes", + "futures", + "http", + "http-body-util", + "hyper", + "hyper-util", + "log", + "rand 0.10.2", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" + +[[package]] +name = "imgref" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "input" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9793345a65d71317763a33066b5d8351f8760dde8d4930fe9e39b5f14a7959d" +dependencies = [ + "bitflags 2.13.1", + "input-sys", + "libc", + "log", + "udev", +] + +[[package]] +name = "input-sys" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eee07d8e02bd95bf52b2e642cf13d33701b94c6e4b04fbf1d1fb07e9cb19e7" + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2 0.6.5", + "widestring", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" +dependencies = [ + "serde", +] + +[[package]] +name = "iroh" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460de6bc52163b41b1646931f2897e5ab986f0966ade444467fec25024751a72" +dependencies = [ + "backon", + "blake3", + "bytes", + "cfg_aliases", + "ctutils", + "data-encoding", + "derive_more", + "ed25519-dalek", + "futures-util", + "getrandom 0.4.3", + "hickory-resolver", + "http", + "ipnet", + "iroh-base", + "iroh-dns", + "iroh-metrics", + "iroh-relay", + "n0-error", + "n0-future", + "n0-watcher", + "netwatch", + "noq", + "noq-proto", + "noq-udp", + "papaya", + "pin-project", + "portable-atomic", + "portmapper", + "rand 0.10.2", + "reqwest", + "rustc-hash 2.1.3", + "rustls", + "rustls-pki-types", + "serde", + "smallvec", + "strum", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "iroh-base" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6be73e16ee21c923aca9b3121aaa0db936f7c7ecc156ff47b8dac944c68d59a8" +dependencies = [ + "curve25519-dalek", + "data-encoding", + "data-encoding-macro", + "derive_more", + "ed25519-dalek", + "getrandom 0.4.3", + "n0-error", + "rand 0.10.2", + "serde", + "url", + "zeroize", +] + +[[package]] +name = "iroh-dns" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f6a9b39d18e6345f5c151afd299f2488e2cb5c520fe41b107b6bd3dc4c3349" +dependencies = [ + "arc-swap", + "cfg_aliases", + "derive_more", + "hickory-resolver", + "iroh-base", + "n0-error", + "n0-future", + "ndk-context", + "portable-atomic", + "rand 0.10.2", + "rustls", + "simple-dns", + "strum", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "iroh-metrics" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291065721ad7c477b972e581bbc528df031dc8eb5e39fe1ff3300ae5dfb157ef" +dependencies = [ + "iroh-metrics-derive", + "itoa", + "n0-error", + "portable-atomic", + "ryu", + "serde", + "tracing", +] + +[[package]] +name = "iroh-metrics-derive" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae5f0c4405d1fbc9fb16ff422ca40620e93dc36c30ecaba0c2aee3992b7bd48" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "iroh-relay" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24bd586cf927f7b700f56ec3639b53cb5fa901ce284784051ff71092bfbf8193" +dependencies = [ + "blake3", + "bytes", + "cfg_aliases", + "data-encoding", + "derive_more", + "getrandom 0.4.3", + "hickory-resolver", + "http", + "http-body-util", + "hyper", + "hyper-util", + "iroh-base", + "iroh-dns", + "iroh-metrics", + "lru 0.18.2", + "n0-error", + "n0-future", + "noq", + "noq-proto", + "num_enum", + "pin-project", + "postcard", + "rand 0.10.2", + "reqwest", + "rustls", + "rustls-pki-types", + "serde", + "serde_bytes", + "strum", + "tokio", + "tokio-rustls", + "tokio-util", + "tokio-websockets", + "tracing", + "url", + "webpki-roots", + "ws_stream_wasm", +] + +[[package]] +name = "iroh-tickets" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da53233419ca36bf521ed45683b7748366f9b233032891eefc2d70567a84ac54" +dependencies = [ + "data-encoding", + "derive_more", + "iroh-base", + "n0-error", + "postcard", + "serde", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.20", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.119", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +dependencies = [ + "bitflags 2.13.1", + "libc", + "plain", + "redox_syscall 0.9.1", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "984fb35d06508d1e69fc91050cceba9c0b748f983e6739fa2c7a9237154c52c8" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "lofty" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca260c51a9c71f823fbfd2e6fbc8eb2ee09834b98c00763d877ca8bfa85cde3e" +dependencies = [ + "byteorder", + "data-encoding", + "flate2", + "lofty_attr", + "log", + "ogg_pager", + "paste", +] + +[[package]] +name = "lofty_attr" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9983e64b2358522f745c1251924e3ab7252d55637e80f6a0a3de642d6a9efc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" + +[[package]] +name = "lru" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2f2f9b4ba7e6b24d95e7e899329d35be83bcded72c8540cdd5368932d1d90a" +dependencies = [ + "hashbrown 0.17.1", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "lyon_algorithms" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8575c0d003ae459399623c4def180c63b77f343b1a7fee64f249b349e7699a31" +dependencies = [ + "lyon_path", + "num-traits", +] + +[[package]] +name = "lyon_extra" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7755f08423275157ad1680aaecc9ccb7e0cc633da3240fea2d1522935cc15c72" +dependencies = [ + "lyon_path", + "thiserror 2.0.20", +] + +[[package]] +name = "lyon_geom" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] + +[[package]] +name = "lyon_path" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" +dependencies = [ + "lyon_geom", + "num-traits", +] + +[[package]] +name = "mac-addr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f" + +[[package]] +name = "mach2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] + +[[package]] +name = "mainline" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfad9601b9117218868271c05403853593d4817e7abeab5c95e11eee16382bb" +dependencies = [ + "crc", + "document-features", + "dyn-clone", + "ed25519-dalek", + "flume", + "futures-lite 2.6.1", + "getrandom 0.4.3", + "lru 0.16.4", + "serde", + "serde_bencode", + "serde_bytes", + "sha1_smol", + "thiserror 2.0.20", + "tracing", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moka" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +dependencies = [ + "crossbeam-channel", + "dpi", + "keyboard-types", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "png", + "thiserror 2.0.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "music-dht" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c5b429b90a8f1b0980b3a35a6fa5445d7a275c737eb04db18db4d7f14c81478" +dependencies = [ + "async-trait", + "blake3", + "data-encoding", + "federation-net", + "futures", + "postcard", + "rand 0.9.5", + "rusqlite", + "serde", + "serde_json", + "thiserror 2.0.20", + "tokio", + "tracing", + "unicode-normalization", +] + +[[package]] +name = "n0-error" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c37e81176a83a77d2514528b91bdafc70ef88aab428f0e1b91aebb8d99888895" +dependencies = [ + "n0-error-macros", + "spez", +] + +[[package]] +name = "n0-error-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2acd8b070213b0299282f884b4beba4e7b52d624fdcd504a3ad3665390c11e1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "n0-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe" +dependencies = [ + "cfg_aliases", + "derive_more", + "futures-buffered", + "futures-lite 2.6.1", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "n0-watcher" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc618745ad0b7414b149d0517ad8b5573b2fb4d4e2717add3d2446ce1fdd826" +dependencies = [ + "derive_more", + "n0-error", + "n0-future", +] + +[[package]] +name = "natord" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308d96db8debc727c3fd9744aac51751243420e46edf401010908da7f8d5e57c" + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "netdev" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "569dfbdd2efd771b24ec9bb57f956e04d4fbfc72f62b2f11961723f9b3f4b020" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "dlopen2", + "ipnet", + "jni 0.21.1", + "libc", + "mac-addr", + "ndk-context", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-wlan", + "objc2-foundation 0.3.2", + "objc2-system-configuration", + "once_cell", + "plist", + "windows-sys 0.61.2", +] + +[[package]] +name = "netlink-packet-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b897d7bd4f0af82e68d40d0344cf37e97f9c97ddf74a098de3e4da05e96ca395" +dependencies = [ + "paste", +] + +[[package]] +name = "netlink-packet-route" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2288fcb784eb3defd5fb16f4c4160d5f477de192eac730f43e1d11c24d9a007" +dependencies = [ + "bitflags 2.13.1", + "libc", + "log", + "netlink-packet-core", +] + +[[package]] +name = "netlink-proto" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f7398dddf5f152d2a91a2921a134c6097056e292c0d4b9906007855e7cece6" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.20", +] + +[[package]] +name = "netlink-sys" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae" +dependencies = [ + "bytes", + "futures-util", + "libc", + "log", + "tokio", +] + +[[package]] +name = "netwatch" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d9cbe01741347ef750d743d6690603f5eed8341e679fb51c8e629337aa11976" +dependencies = [ + "atomic-waker", + "bytes", + "cfg_aliases", + "derive_more", + "ipnet", + "js-sys", + "libc", + "n0-error", + "n0-future", + "n0-watcher", + "netdev", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "noq-udp", + "objc2-core-foundation", + "objc2-system-configuration", + "pin-project-lite", + "serde", + "socket2 0.6.5", + "time", + "tokio", + "tokio-util", + "tracing", + "web-sys", + "windows 0.62.2", + "windows-result", + "wmi", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "noq" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e4bb6601fa543c110d8957813267d5a8d775a0f8fbaccf1f615d06ba9b10da" +dependencies = [ + "bytes", + "cfg_aliases", + "derive_more", + "noq-proto", + "noq-udp", + "pin-project-lite", + "rustc-hash 2.1.3", + "rustls", + "socket2 0.6.5", + "thiserror 2.0.20", + "tokio", + "tokio-stream", + "tracing", + "web-time", +] + +[[package]] +name = "noq-proto" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa7b5ccd819a9c68a0d955e67a881032d09b1a17219b1f90b0997a0888e1a15" +dependencies = [ + "aes-gcm", + "bytes", + "derive_more", + "enum-assoc", + "getrandom 0.4.3", + "identity-hash", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash 2.1.3", + "rustls", + "rustls-pki-types", + "slab", + "sorted-index-buffer", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "noq-udp" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02bba20e097a5a16cd0ad14ec882fae1e80a092a124e9422fc4dddd92e96a647" +dependencies = [ + "cfg_aliases", + "libc", + "socket2 0.6.5", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-audio-toolbox" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" +dependencies = [ + "bitflags 2.13.1", + "libc", + "objc2 0.6.4", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-avf-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" +dependencies = [ + "dispatch2", + "objc2 0.6.4", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-audio-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "block2 0.6.2", + "dispatch2", + "libc", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-wlan" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e34919aba0d701380d911702455038a8a3587467fe0141d6a71501e7ffe48" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-security", + "objc2-security-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.13.1", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-security-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef76382e9cedd18123099f17638715cc3d81dba3637d4c0d39ab69df2ef345a5" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-system-configuration" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "libc", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-security", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "ogg_pager" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d36b1d6964c3ac92b7aea701057e02b6b91143d70d83b20abf75a231a3c0216" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "critical-section", + "portable-atomic", +] + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "papaya" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "997ee03cd38c01469a7046643714f0ad28880bcb9e6679ff0666e24817ca19b7" +dependencies = [ + "equivalent", + "seize", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parlance" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6937eda350acc1a5d05872c3cbf99fe78619c269096e2be3d4a350058639d5" + +[[package]] +name = "parley" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1cfcf399c774719fb1fa51bc6b91e86bdf003b03202a0902f1827ba6750746" +dependencies = [ + "fontique", + "harfrust", + "hashbrown 0.17.1", + "icu_normalizer", + "icu_properties", + "icu_segmenter", + "linebender_resource_handle", + "parlance", + "parley_data", + "skrifa 0.42.1", +] + +[[package]] +name = "parley_data" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1d3755e2cc12c0625b0cd2f2773c6a37dd11d1531940c945ade4aeb78f2b145" +dependencies = [ + "icu_properties", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pem-rfc7468" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pin-weak" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b330c9d1b92dfe68442ca20b009c717d5f0b1e3cf4965e62f704c3c6e95a1305" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand 2.5.0", + "futures-io", +] + +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64", + "indexmap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" +dependencies = [ + "critical-section", + "serde", +] + +[[package]] +name = "portmapper" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3713e4977408279158444a18c1a01ac9bf2e7eaf1fbfd1a19ac9cd18d90721" +dependencies = [ + "base64", + "bytes", + "derive_more", + "hyper-util", + "igd-next", + "iroh-metrics", + "libc", + "n0-error", + "n0-future", + "netwatch", + "num_enum", + "rand 0.10.2", + "serde", + "smallvec", + "socket2 0.6.5", + "time", + "tokio", + "tokio-util", + "tower-layer", + "tracing", + "url", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "serde_core", + "writeable", + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" +dependencies = [ + "bitflags 2.13.1", + "getopts", + "memchr", + "pulldown-cmark-escape", + "unicase", +] + +[[package]] +name = "pulldown-cmark-escape" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae" + +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.5", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.20", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" +dependencies = [ + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types 0.11.3", +] + +[[package]] +name = "read-fonts" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" +dependencies = [ + "bytemuck", + "font-types 0.12.2", + "once_cell", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_syscall" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07507be7b4a5f9f26eeb41eeaebb1f5a7ff29dfb29739facc21d35bf8b11c21e" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] +name = "resvg" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be183ad6a216aa96f33e4c8033b0988b8b3ea6fd2359d19af5bac4643fd8e81" +dependencies = [ + "gif", + "image-webp", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia 0.12.0", + "usvg", + "zune-jpeg", +] + +[[package]] +name = "rfd" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" +dependencies = [ + "ashpd", + "block2 0.6.2", + "dispatch2", + "js-sys", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "pollster 0.4.0", + "raw-window-handle", + "urlencoding", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rodio" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a536bb79db59098ef71a4dd4246c02eb87b316deceb1b68e0cde7167ec01eb" +dependencies = [ + "cpal", + "dasp_sample", + "num-rational", + "symphonia", + "thiserror 2.0.20", +] + +[[package]] +name = "rowan" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21" +dependencies = [ + "countme", + "hashbrown 0.14.5", + "rustc-hash 1.1.0", + "text-size", +] + +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + +[[package]] +name = "rspolib" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fda9a7796aff63a7b1b39ccc93fffaaf65e20042984b4843041a49ca4677535" +dependencies = [ + "lazy_static", + "natord", + "snafu", + "unicode-linebreak", + "unicode-width", +] + +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags 2.13.1", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.22.4", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + +[[package]] +name = "rustls-webpki" +version = "0.103.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0527518605e68109d875e248ea259b6758801cf165e4b2c2733ae3b51f12535a" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scoped-tls-hkt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9603871ffe5df3ac39cb624790c296dbd47a400d202f56bf3e414045099524d" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit 0.19.2", + "tiny-skia 0.11.4", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "seize" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_bencode" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70dfc7b7438b99896e7f8992363ab8e2c4ba26aa5ec675d32d1c3c2c33d413e" +dependencies = [ + "serde", + "serde_bytes", +] + +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple-dns" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a75cbde1bf934313596a004973e462f9a82caa814dcf1a5f507bdf51597eeb4" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "skia-bindings" +version = "0.99.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2d1c3ebd697c0cbded0145e9204a38fa6b268446051b7196d0a096414ea7f3" +dependencies = [ + "bindgen", + "cc", + "flate2", + "heck", + "pkg-config", + "regex", + "serde_json", + "tar", + "toml", +] + +[[package]] +name = "skia-safe" +version = "0.99.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f512ac418a64194842dd05566320805dad1c957c521039db2486fd6368865bc" +dependencies = [ + "bitflags 2.13.1", + "skia-bindings", + "windows 0.62.2", +] + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts 0.39.2", +] + +[[package]] +name = "skrifa" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" +dependencies = [ + "bytemuck", + "read-fonts 0.41.0", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slint" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce12038f57f8f3a423564b0c9301a2ab3fda4246e4cbadd6b97acf9124bdc315" +dependencies = [ + "const-field-offset", + "i-slint-backend-selector", + "i-slint-common", + "i-slint-core", + "i-slint-core-macros", + "i-slint-renderer-femtovg", + "i-slint-renderer-software", + "num-traits", + "once_cell", + "pin-weak", + "slint-macros", + "unicode-segmentation", + "vtable", +] + +[[package]] +name = "slint-build" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76684c11441f775b10bbc7b0e6b3016a39f17efdd659ffca112f17cfd6bdaed1" +dependencies = [ + "derive_more", + "fontique", + "i-slint-compiler", + "spin_on", + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "slint-macros" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f2a763e72e1e53c496f571d36327e777da1eb0d9e58fceb83890c2a83ee7223" +dependencies = [ + "i-slint-compiler", + "proc-macro2", + "quote", + "spin_on", +] + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.13.1", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.13.1", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.20", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "smol_str" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aaa7368fcf4852a4c2dd92df0cace6a71f2091ca0a23391ce7f3a31833f1523" +dependencies = [ + "borsh", + "serde_core", +] + +[[package]] +name = "snafu" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e84b3f4eacbf3a1ce05eac6763b4d629d60cbc94d632e4092c54ade71f1e1a2" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "as-raw-xcb-connection", + "bytemuck", + "fastrand 2.5.0", + "js-sys", + "memmap2", + "ndk", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "raw-window-handle", + "redox_syscall 0.5.18", + "rustix 1.1.4", + "tiny-xlib", + "tracing", + "wasm-bindgen", + "wayland-backend", + "wayland-client", + "wayland-sys", + "web-sys", + "windows-sys 0.61.2", + "x11rb", +] + +[[package]] +name = "sorted-index-buffer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea06cc588e43c632923a55450401b8f25e628131571d4e1baea1bdfdb2b5ed06" + +[[package]] +name = "souvlaki" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5855c8f31521af07d896b852eaa9eca974ddd3211fc2ae292e58dda8eb129bc8" +dependencies = [ + "base64", + "block", + "cocoa", + "core-graphics 0.22.3", + "dispatch", + "objc", + "pollster 0.3.0", + "thiserror 1.0.69", + "windows 0.44.0", + "zbus 3.15.2", + "zvariant 3.15.2", +] + +[[package]] +name = "spez" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" + +[[package]] +name = "spin_on" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076e103ed41b9864aa838287efe5f4e3a7a0362dd00671ae62a212e5e4612da2" +dependencies = [ + "pin-utils", +] + +[[package]] +name = "spki" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9efca8738c78ee9484207732f728b1ef517bbb1833d6fc0879ca898a522f6f" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svgtypes" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "695b5790b3131dafa99b3bbfd25a216edb3d216dad9ca208d4657bfb8f2abc3d" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "swash" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2499c2d826531388872b2268718aed907a39bd785ab0dcfe57fab26283f92e" +dependencies = [ + "skrifa 0.44.0", + "yazi", + "zeno", +] + +[[package]] +name = "symphonia" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" +dependencies = [ + "lazy_static", + "symphonia-bundle-flac", + "symphonia-bundle-mp3", + "symphonia-codec-aac", + "symphonia-codec-alac", + "symphonia-codec-pcm", + "symphonia-codec-vorbis", + "symphonia-core", + "symphonia-format-isomp4", + "symphonia-format-ogg", + "symphonia-format-riff", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-flac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91565e180aea25d9b80a910c546802526ffd0072d0b8974e3ebe59b686c9976" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-codec-aac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c263845aa86881416849c1729a54c7f55164f8b96111dba59de46849e73a790" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-alac" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8413fa754942ac16a73634c9dfd1500ed5c61430956b33728567f667fdd393ab" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e89d716c01541ad3ebe7c91ce4c8d38a7cf266a3f7b2f090b108fb0cb031d95" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-codec-vorbis" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73" +dependencies = [ + "log", + "symphonia-core", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-format-isomp4" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243739585d11f81daf8dac8d9f3d18cc7898f6c09a259675fc364b382c30e0a5" +dependencies = [ + "encoding_rs", + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-ogg" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b4955c67c1ed3aa8ae8428d04ca8397fbef6a19b2b051e73b5da8b1435639cb" +dependencies = [ + "log", + "symphonia-core", + "symphonia-metadata", + "symphonia-utils-xiph", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d7c3df0e7d94efb68401d81906eae73c02b40d5ec1a141962c592d0f11a96f" +dependencies = [ + "extended", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-utils-xiph" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16" +dependencies = [ + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "js-sys", + "libc", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "taffy" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aea22054047c16c3f34d3ac473a2170be1424b1115b2a3adcf28cfb067c88859" +dependencies = [ + "arrayvec", + "grid", + "serde", + "slotmap", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tar" +version = "0.4.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6221d9a6003c78398e3b239969f352578258df48c8eb051caadae0015bc840" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand 2.5.0", + "getrandom 0.4.3", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "text-size" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "thread_local" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "js-sys", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path 0.11.4", +] + +[[package]] +name = "tiny-skia" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47ffee5eaaf5527f630fb0e356b90ebdec84d5d18d937c5e440350f88c5a91ea" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path 0.12.0", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-skia-path" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca365c3faccca67d06593c5980fa6c57687de727a03131735bb85f01fdeeb9" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-xlib" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90a0ca3ee6a69f2ad28fd11621a4c3f03b371f366be500b64df260c4ffbafb4" +dependencies = [ + "as-raw-xcb-connection", + "ctor", + "libloading", + "pkg-config", + "tracing", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "serde_core", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.5", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-websockets" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52efb639344a7c6adb8e62c6f3d2c19c001ff1b79a5041ba1c6ed42e19c6aa5" +dependencies = [ + "base64", + "bytes", + "futures-core", + "futures-sink", + "getrandom 0.4.3", + "http", + "httparse", + "rand 0.10.2", + "ring", + "rustls-pki-types", + "sha1_smol", + "simdutf8", + "tokio", + "tokio-rustls", + "tokio-util", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "typed-index-collections" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898160f1dfd383b4e92e17f0512a7d62f3c51c44937b23b6ffc3a1614a8eaccd" +dependencies = [ + "bincode", + "serde", +] + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "udev" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e37e9ea4401fc841ff54b9ddfc9be1079b1e89434c1a6a865dd68980f7e9f" +dependencies = [ + "io-lifetimes", + "libc", + "libudev-sys", + "pkg-config", +] + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "usvg" +version = "0.47.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d46cf96c5f498d36b7a9693bc6a7075c0bb9303189d61b2249b0dc3d309c07de" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path 0.12.0", + "ttf-parser", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vtable" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea953f65593feb5287b022b83c35046d1ff49c7417b6f5851a079d8a231fe31" +dependencies = [ + "const-field-offset", + "portable-atomic", + "stable_deref_trait", + "vtable-macro", +] + +[[package]] +name = "vtable-macro" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "482a37f9777480673d3a99c80ac2edc69f92382230440946855fa27ebc47cba6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016ccf01d1c58b6f8999612813e17c9b2390f7d70671428869913310f83f54b8" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" +dependencies = [ + "bitflags 2.13.1", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.13.1", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" +dependencies = [ + "jni 0.22.4", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webpki-roots" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.13.1", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit 0.2.2", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str 0.2.2", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wmi" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c81b85c57a57500e56669586496bf2abd5cf082b9d32995251185d105208b64" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror 2.0.20", + "windows 0.62.2", + "windows-core", +] + +[[package]] +name = "write-fonts" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb731d4c4d93eacc69a1ad2f270f905788a98e4a3438267bcafbe08d3431c8d8" +dependencies = [ + "font-types 0.11.3", + "indexmap", + "kurbo", + "log", + "read-fonts 0.39.2", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror 2.0.20", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "x11-clipboard" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" +dependencies = [ + "libc", + "x11rb", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xattr" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" +dependencies = [ + "libc", + "rustix 1.1.4", +] + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a974f48060a14e95705c01f24ad9c3345022f4d97441b8a36beb7ed5c4a02d" +dependencies = [ + "libc", + "memmap2", + "xkeysym", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "yazi" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" + +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast 0.5.1", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process 1.8.1", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand 0.8.7", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros 3.15.2", + "zbus_names 2.6.1", + "zvariant 3.15.2", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast 0.7.2", + "async-executor", + "async-io 2.6.0", + "async-lock 3.4.2", + "async-process 2.5.0", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.2", + "futures-core", + "futures-lite 2.6.1", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros 5.19.0", + "zbus_names 4.3.4", + "zvariant 5.14.0", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils 1.0.1", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zbus_names 4.3.4", + "zvariant 5.14.0", + "zvariant_utils 4.0.0", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant 3.15.2", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant 5.14.0", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zeno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "serde", + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive 3.15.2", +] + +[[package]] +name = "zvariant" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e28c25bd8bb8da5a1f3e7065d0c156b9ee9a7973adf78b0e35eaefdf3b1b5c" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive 5.14.0", + "zvariant_utils 4.0.0", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils 1.0.1", +] + +[[package]] +name = "zvariant_derive" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d496a145685283b67e232bd9e47377f6b60ad9d51e3601b23867f77c42477f96" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 3.0.3", + "zvariant_utils 4.0.0", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "zvariant_utils" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629d80ece222cad20fe0e8741be493c4ab166acf3b85341bdc2cdbcfd8f3c2d6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.3", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1df8ac5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,76 @@ +[workspace] +resolver = "2" +members = [ + "apps/desktop", + "crates/application", + "crates/backend", + "crates/backend-api", + "crates/domain", + "crates/platform-desktop", + "crates/ui", +] + +[workspace.package] +version = "0.1.0" +edition = "2024" +rust-version = "1.97" +license = "WTFPL" +authors = ["Furumi contributors"] +description = "A native desktop player for personal music libraries and the Furumi federated network" +readme = "README.md" + +[workspace.dependencies] +anyhow = "1.0.102" +slint = { version = "=1.17.1", default-features = false, features = [ + "backend-winit", + "renderer-femtovg", + "renderer-software", + "compat-1-2", +] } +slint-build = "=1.17.1" +tokio = { version = "=1.52.3", features = ["rt-multi-thread", "sync", "time", "macros", "io-util", "fs"] } +tokio-util = { version = "=0.7.18", features = ["rt"] } +directories = "6.0.0" +image = { version = "0.25.10", default-features = false, features = ["webp"] } +music-dht = "0.4.0" +serde_json = "1.0.150" +serde = { version = "1.0", features = ["derive"] } +rusqlite = { version = "0.32.1", features = ["bundled"] } +rfd = { version = "0.15.4", default-features = false, features = ["xdg-portal"] } +rodio = { version = "0.22.2", default-features = false, features = [ + "playback", + "mp3", + "flac", + "vorbis", + "wav", + "symphonia-aac", + "symphonia-isomp4", + "symphonia-alac", +] } +souvlaki = { version = "0.8.3", default-features = false, features = ["use_zbus"] } +core-foundation = "0.10.1" +windows-sys = { version = "0.61.2", features = ["Win32_System_LibraryLoader", "Win32_UI_WindowsAndMessaging"] } + +furumi-application = { path = "crates/application" } +furumi-backend = { path = "crates/backend" } +furumi-backend-api = { path = "crates/backend-api" } +furumi-domain = { path = "crates/domain" } +furumi-library = "0.1.0" +furumi-platform-desktop = { path = "crates/platform-desktop" } +furumi-ui = { path = "crates/ui" } + +[workspace.lints.rust] +unsafe_code = "deny" + +[workspace.lints.clippy] +all = "warn" +pedantic = "warn" + +[profile.release] +lto = "thin" +codegen-units = 1 +strip = "symbols" + +[patch.crates-io] +# souvlaki 0.8.3 still uses an uninhabited Objective-C FFI marker. +block = { path = "vendor/block" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..00cc4a3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2026 Furumi contributors + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..c58a33b --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# Furumi Desktop + +![Furumi Desktop](screenshots/furumi-desktop.png) + +**Your music. Your devices. Your network.** + +Furumi Desktop is a native graphical player for a personal music collection +and the Furumi federated network. It plays the library you keep on your own +computer, discovers music shared by other Furumi players, and streams missing +tracks directly from peers without requiring an account or a central catalog. + +Pair your own players and they become one listening environment. Likes, +playlists, the queue, and playback state can move between trusted devices while +each player remains useful on its own. + +Furumi Desktop targets **Linux, macOS, and Windows**. + +## Why Furumi? + +Music you own should not depend on a subscription, a remote account, or one +company's servers. Furumi is built around a different model: + +- your local library stays under your control; +- the player works without a cloud backend; +- federation is optional and has no central search service; +- trusted devices synchronize directly with each other; +- missing music can be streamed from an available peer and retained locally. + +A single player is a private desktop library. Several players form a resilient +personal music network. + +## The player + +The desktop interface is focused entirely on listening: artists, releases, +search, playlists, a reusable queue, and familiar playback controls. Local and +federated results share the same views, with clear availability indicators as +remote tracks arrive or become local. + +Furumi Desktop also supports OS media keys, background playback, cover art, +trusted-device pairing, playback handoff, and control of another active Furumi +device. It uses the same library format and federation protocols as the Furumi +terminal player. + +## Build and run + +Rust 1.97 is pinned by `rust-toolchain.toml`. + +```bash +cargo build --release --locked +./target/release/furumi-desktop +``` + +On Debian or Ubuntu, install the native Linux build dependencies first: + +```bash +sudo apt install libasound2-dev libfontconfig1-dev libxkbcommon-dev pkg-config +``` + +A development shell with the Wayland and X11 dependencies is also provided: + +```bash +nix-shell +cargo run --bin furumi-desktop +``` + +macOS and Windows require no additional system packages. Player settings are +available inside the application and are saved automatically. + +## Architecture + +Furumi Desktop is written in Rust with a reactive Slint interface, SQLite +persistence, Rodio audio playback, and the Frid/Furumi P2P protocol crates. It +ships as one application while keeping domain, application, backend, platform, +and presentation code in separate crates. + +More detail is available in [ARCHITECTURE.md](ARCHITECTURE.md). + +## Contributing + +Bug reports, design discussions, and patches are welcome. Before submitting a +change, run: + +```bash +cargo fmt --all -- --check +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace --all-targets +``` + +## License + +Furumi Desktop is released under the +[Do What The Fuck You Want To Public License, Version 2](LICENSE). diff --git a/apps/desktop/Cargo.toml b/apps/desktop/Cargo.toml new file mode 100644 index 0000000..da4c4bf --- /dev/null +++ b/apps/desktop/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "furumi-desktop" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +authors.workspace = true +description.workspace = true +readme.workspace = true +publish = false + +[[bin]] +name = "furumi-desktop" +path = "src/main.rs" + +[dependencies] +furumi-backend.workspace = true +furumi-ui.workspace = true + +[lints] +workspace = true diff --git a/apps/desktop/src/main.rs b/apps/desktop/src/main.rs new file mode 100644 index 0000000..7b161a7 --- /dev/null +++ b/apps/desktop/src/main.rs @@ -0,0 +1,5 @@ +fn main() -> Result<(), Box> { + let backend = furumi_backend::spawn_backend()?; + furumi_ui::run(&backend)?; + Ok(()) +} diff --git a/crates/application/Cargo.toml b/crates/application/Cargo.toml new file mode 100644 index 0000000..e30193c --- /dev/null +++ b/crates/application/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "furumi-application" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +furumi-backend-api.workspace = true +furumi-domain.workspace = true + +[lints] +workspace = true + diff --git a/crates/application/src/lib.rs b/crates/application/src/lib.rs new file mode 100644 index 0000000..58f061a --- /dev/null +++ b/crates/application/src/lib.rs @@ -0,0 +1,613 @@ +//! Deterministic frontend state, reducers and UI projections. + +use furumi_backend_api::{BackendCommand, BackendSnapshot, PlaybackStatus, RequestId}; +use furumi_domain::{ArtistKey, QueueItemId, ReleaseKey, TrackKey}; +use std::time::Duration; + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum Locale { + #[default] + En, +} + +#[derive(Debug, Clone, Copy)] +pub struct Strings { + pub app_name: &'static str, + pub home: &'static str, + pub search: &'static str, + pub library: &'static str, + pub queue: &'static str, + pub recently_played: &'static str, + pub made_for_listening: &'static str, + pub empty_queue: &'static str, + pub search_placeholder: &'static str, +} + +pub const EN: Strings = Strings { + app_name: "Furumi", + home: "Home", + search: "Search", + library: "Your library", + queue: "Queue", + recently_played: "Recently played", + made_for_listening: "Made for listening", + empty_queue: "Your queue is empty", + search_placeholder: "Artists, albums or tracks", +}; + +impl Locale { + #[must_use] + pub const fn strings(self) -> &'static Strings { + match self { + Self::En => &EN, + } + } +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub enum Screen { + #[default] + Home, + Search, + Library, + Artist(ArtistKey), + Release(ReleaseKey, Option), + Playlist(i64), +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FrontendState { + pub screen: Screen, + pub navigation_history: Vec, + pub navigation_forward: Vec, + pub queue_open: bool, + pub settings_open: bool, + pub devices_open: bool, + pub search_query: String, + pub locale: Locale, + pub track_info: Option, + pub playlist_picker_track: Option, +} + +impl Default for FrontendState { + fn default() -> Self { + Self { + screen: Screen::Home, + navigation_history: Vec::new(), + navigation_forward: Vec::new(), + queue_open: false, + settings_open: false, + devices_open: false, + search_query: String::new(), + locale: Locale::En, + track_info: None, + playlist_picker_track: None, + } + } +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct AppState { + pub frontend: FrontendState, + pub backend: BackendSnapshot, + pub next_request_id: u64, + pub transient_error: Option, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum UiAction { + Navigate(Screen), + Back, + Forward, + ToggleQueue, + ToggleSettings, + ToggleDevices, + TogglePlayback, + Next, + Previous, + Seek(f64), + SetVolume(f32), + PlayRelease { + release_id: ReleaseKey, + start: usize, + }, + PlayTrack(TrackKey), + PlayQueueItem(QueueItemId), + PlayContext { + tracks: Vec, + selected: TrackKey, + }, + AddNext(Vec), + AddToEnd(Vec), + ToggleLike(TrackKey), + ShowPlaylistPicker(TrackKey), + ClosePlaylistPicker, + CreatePlaylist(String), + AddToPlaylist { + playlist_id: i64, + tracks: Vec, + }, + CreateDeviceInvite, + ConnectDevice(String), + AnswerDevicePairing { + request_id: String, + accept: bool, + use_requester_group: bool, + }, + SelectPlaybackDevice(String), + SearchChanged(String), + NetworkIdChanged(String), + DeviceNameChanged(String), + LibraryPathChanged(String), + FederationChanged(bool), + SaveFederatedOnListenChanged(bool), + LanguageChanged(String), + ShowTrackInfo(TrackKey), + CloseTrackInfo, + DismissError, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum AppEvent { + BackendSnapshot(Box), + CommandRejected(String), +} + +#[derive(Debug, Clone, PartialEq)] +pub enum Effect { + Send(BackendCommand), +} + +#[allow( + clippy::too_many_lines, + reason = "central exhaustive reducer keeps state transitions together" +)] +pub fn reduce_action(state: &mut AppState, action: UiAction) -> Vec { + match action { + UiAction::Navigate(screen) => { + if state.frontend.screen != screen { + state + .frontend + .navigation_history + .push(state.frontend.screen.clone()); + state.frontend.navigation_forward.clear(); + } + state.frontend.screen = screen.clone(); + state.next_request_id = state.next_request_id.saturating_add(1); + let request_id = RequestId::new(state.next_request_id); + match screen { + Screen::Artist(key) => find_artist(state, &key).map_or_else(Vec::new, |artist| { + send(BackendCommand::LoadArtist { + request_id, + key, + name: artist.name.clone(), + }) + }), + Screen::Release(key, preferred) => { + find_release(state, &key).map_or_else(Vec::new, |release| { + let selected_artist = preferred + .as_ref() + .and_then(|preferred| { + release + .artists + .iter() + .find(|artist| &artist.key == preferred) + .map(|artist| (artist.key.clone(), artist.name.clone())) + .or_else(|| { + find_artist(state, preferred) + .map(|artist| (artist.key.clone(), artist.name.clone())) + }) + }) + .or_else(|| { + release + .artists + .first() + .map(|artist| (artist.key.clone(), artist.name.clone())) + }); + selected_artist.map_or_else(Vec::new, |(artist_key, artist_name)| { + send(BackendCommand::LoadRelease { + request_id, + key, + artist_key, + artist_name, + }) + }) + }) + } + _ => Vec::new(), + } + } + UiAction::Back => { + if let Some(screen) = state.frontend.navigation_history.pop() { + state + .frontend + .navigation_forward + .push(state.frontend.screen.clone()); + state.frontend.screen = screen; + } + Vec::new() + } + UiAction::Forward => { + if let Some(screen) = state.frontend.navigation_forward.pop() { + state + .frontend + .navigation_history + .push(state.frontend.screen.clone()); + state.frontend.screen = screen; + } + Vec::new() + } + UiAction::ToggleQueue => { + state.frontend.queue_open = !state.frontend.queue_open; + Vec::new() + } + UiAction::ToggleSettings => { + state.frontend.settings_open = !state.frontend.settings_open; + if state.frontend.settings_open { + state.frontend.devices_open = false; + } + Vec::new() + } + UiAction::ToggleDevices => { + state.frontend.devices_open = !state.frontend.devices_open; + if state.frontend.devices_open { + state.frontend.settings_open = false; + } + Vec::new() + } + UiAction::TogglePlayback => send(BackendCommand::TogglePlayback), + UiAction::Next => send(BackendCommand::Next), + UiAction::Previous => send(BackendCommand::Previous), + UiAction::Seek(position_seconds) => send(BackendCommand::Seek { position_seconds }), + UiAction::SetVolume(volume) => send(BackendCommand::SetVolume { volume }), + UiAction::PlayRelease { release_id, start } => { + send(BackendCommand::PlayRelease { release_id, start }) + } + UiAction::PlayTrack(track) => send(BackendCommand::PlayTrack { track }), + UiAction::PlayQueueItem(item_id) => send(BackendCommand::PlayQueueItem { item_id }), + UiAction::PlayContext { tracks, selected } => { + send(BackendCommand::PlayContext { tracks, selected }) + } + UiAction::AddNext(tracks) => send(BackendCommand::AddNext { tracks }), + UiAction::AddToEnd(tracks) => send(BackendCommand::AddToEnd { tracks }), + UiAction::ToggleLike(track) => send(BackendCommand::ToggleLike { track }), + UiAction::ShowPlaylistPicker(track) => { + state.frontend.playlist_picker_track = Some(track); + Vec::new() + } + UiAction::ClosePlaylistPicker => { + state.frontend.playlist_picker_track = None; + Vec::new() + } + UiAction::CreatePlaylist(title) => send(BackendCommand::CreatePlaylist { title }), + UiAction::AddToPlaylist { + playlist_id, + tracks, + } => { + state.frontend.playlist_picker_track = None; + send(BackendCommand::AddToPlaylist { + playlist_id, + tracks, + }) + } + UiAction::CreateDeviceInvite => send(BackendCommand::CreateDeviceInvite), + UiAction::ConnectDevice(invite) => send(BackendCommand::ConnectDevice { invite }), + UiAction::AnswerDevicePairing { + request_id, + accept, + use_requester_group, + } => send(BackendCommand::AnswerDevicePairing { + request_id, + accept, + use_requester_group, + }), + UiAction::SelectPlaybackDevice(device_id) => { + send(BackendCommand::SelectPlaybackDevice { device_id }) + } + UiAction::SearchChanged(query) => { + let previous = active_search_request(&state.backend); + state.frontend.search_query.clone_from(&query); + if state.frontend.screen != Screen::Search { + state + .frontend + .navigation_history + .push(state.frontend.screen.clone()); + state.frontend.navigation_forward.clear(); + state.frontend.screen = Screen::Search; + } + state.next_request_id = state.next_request_id.saturating_add(1); + let request_id = RequestId::new(state.next_request_id); + let mut effects = Vec::with_capacity(2); + if let Some(previous) = previous { + effects.push(Effect::Send(BackendCommand::CancelSearch { + request_id: previous, + })); + } + effects.push(Effect::Send(BackendCommand::Search { request_id, query })); + effects + } + UiAction::NetworkIdChanged(value) => { + state.backend.settings.network_id = value; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::DeviceNameChanged(value) => { + state.backend.settings.device_name = value; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::LibraryPathChanged(value) => { + state.backend.settings.library_path = value; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::FederationChanged(enabled) => { + state.backend.settings.federation_enabled = enabled; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::SaveFederatedOnListenChanged(enabled) => { + state.backend.settings.save_federated_on_listen = enabled; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::LanguageChanged(language) => { + state.frontend.locale = Locale::En; + state.backend.settings.language = language; + send(BackendCommand::UpdateSettings( + state.backend.settings.clone(), + )) + } + UiAction::ShowTrackInfo(track) => { + state.frontend.track_info = Some(track); + Vec::new() + } + UiAction::CloseTrackInfo => { + state.frontend.track_info = None; + Vec::new() + } + UiAction::DismissError => { + state.transient_error = None; + Vec::new() + } + } +} + +fn find_artist<'a>(state: &'a AppState, key: &ArtistKey) -> Option<&'a furumi_domain::Artist> { + match &state.backend.library { + furumi_backend_api::RemoteData::Ready(l) => Some(l), + _ => None, + } + .into_iter() + .flat_map(|l| l.artists.iter()) + .chain(state.backend.search.results.artists.iter()) + .find(|a| &a.key == key) +} + +fn find_release<'a>(state: &'a AppState, key: &ReleaseKey) -> Option<&'a furumi_domain::Release> { + match &state.backend.library { + furumi_backend_api::RemoteData::Ready(l) => Some(l), + _ => None, + } + .into_iter() + .flat_map(|l| l.featured_releases.iter()) + .chain(state.backend.search.results.releases.iter()) + .find(|r| &r.key == key) +} + +pub fn reduce_event(state: &mut AppState, event: AppEvent) { + match event { + AppEvent::BackendSnapshot(snapshot) => { + if snapshot.revision >= state.backend.revision { + state.backend = *snapshot; + } + } + AppEvent::CommandRejected(message) => state.transient_error = Some(message), + } +} + +fn active_search_request(snapshot: &BackendSnapshot) -> Option { + snapshot + .search + .federation_pending + .then_some(snapshot.search.request_id) + .flatten() +} + +fn send(command: BackendCommand) -> Vec { + vec![Effect::Send(command)] +} + +#[derive(Debug, Clone, PartialEq)] +pub struct PlayerProjection { + pub has_track: bool, + pub playing: bool, + pub title: String, + pub artist: String, + pub elapsed: String, + pub duration: String, + pub progress: f32, + pub volume: f32, +} + +impl AppState { + #[must_use] + pub fn player_projection(&self) -> PlayerProjection { + let current = self.backend.queue.current().map(|item| &item.track); + let duration = self.backend.playback.duration_seconds.max(0.0); + let elapsed = self.backend.playback.position_seconds.clamp(0.0, duration); + PlayerProjection { + has_track: current.is_some(), + playing: self.backend.playback.status == PlaybackStatus::Playing, + title: current.map_or_else(|| "Nothing playing".into(), |track| track.title.clone()), + artist: current.map_or_else(String::new, |track| track.artist.clone()), + elapsed: duration_label(elapsed), + duration: duration_label(duration), + progress: progress_ratio(elapsed, duration), + volume: self.backend.playback.volume, + } + } +} + +#[must_use] +pub fn duration_label(seconds: f64) -> String { + let seconds = if seconds.is_finite() { + seconds.max(0.0) + } else { + 0.0 + }; + let total = Duration::from_secs_f64(seconds).as_secs(); + format!("{}:{:02}", total / 60, total % 60) +} + +#[allow( + clippy::cast_possible_truncation, + reason = "the clamped unit interval is the precision exposed by Slint" +)] +fn progress_ratio(elapsed: f64, duration: f64) -> f32 { + if duration > 0.0 { + (elapsed / duration).clamp(0.0, 1.0) as f32 + } else { + 0.0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + use furumi_backend_api::{SearchResults, SearchSnapshot}; + use furumi_domain::{Artist, ArtistRef, Artwork, CatalogSource, Release, ReleaseId}; + + #[test] + fn a_new_search_cancels_the_active_request() { + let mut state = AppState::default(); + state.backend.search = SearchSnapshot { + request_id: Some(RequestId::new(9)), + federation_pending: true, + ..SearchSnapshot::default() + }; + + let effects = reduce_action(&mut state, UiAction::SearchChanged("ambient".into())); + assert_eq!(effects.len(), 2); + assert_eq!( + effects[0], + Effect::Send(BackendCommand::CancelSearch { + request_id: RequestId::new(9) + }) + ); + assert!(matches!( + effects[1], + Effect::Send(BackendCommand::Search { .. }) + )); + } + + #[test] + fn stale_backend_snapshots_are_ignored() { + let mut state = AppState::default(); + state.backend.revision = 8; + reduce_event( + &mut state, + AppEvent::BackendSnapshot(Box::new(BackendSnapshot { + revision: 7, + ..BackendSnapshot::default() + })), + ); + assert_eq!(state.backend.revision, 8); + } + + #[test] + fn detail_navigation_returns_to_the_previous_screen() { + let mut state = AppState::default(); + let artist = ArtistKey::Federation { + peer_id: "peer-a".into(), + id: "artist-a".into(), + }; + + reduce_action(&mut state, UiAction::Navigate(Screen::Artist(artist))); + reduce_action(&mut state, UiAction::Back); + + assert_eq!(state.frontend.screen, Screen::Home); + assert!(state.frontend.navigation_history.is_empty()); + } + + #[test] + fn forward_navigation_restores_the_screen_left_by_back() { + let mut state = AppState::default(); + let artist = ArtistKey::Federation { + peer_id: "peer-a".into(), + id: "artist-a".into(), + }; + let artist_screen = Screen::Artist(artist); + + reduce_action(&mut state, UiAction::Navigate(artist_screen.clone())); + reduce_action(&mut state, UiAction::Back); + reduce_action(&mut state, UiAction::Forward); + + assert_eq!(state.frontend.screen, artist_screen); + assert!(state.frontend.navigation_forward.is_empty()); + assert_eq!(state.frontend.navigation_history, vec![Screen::Home]); + } + + #[test] + fn release_lookup_keeps_the_preferred_artist_name_and_key_together() { + let mut state = AppState::default(); + let pasha_key = ArtistKey::Local(furumi_domain::ArtistId::new(1)); + let kunteynir_key = ArtistKey::Local(furumi_domain::ArtistId::new(2)); + let release_key = ReleaseKey::Local(ReleaseId::new(7)); + let artists = [ + (kunteynir_key.clone(), "KUNTEYNIR"), + (pasha_key.clone(), "Паша Техник"), + ]; + state.backend.search.results = SearchResults { + artists: artists + .iter() + .map(|(key, name)| Artist { + key: key.clone(), + source: CatalogSource::Local, + name: (*name).into(), + artwork: Artwork::default(), + release_count: 1, + track_count: 1, + }) + .collect(), + releases: vec![Release { + key: release_key.clone(), + source: CatalogSource::Local, + title: "Порядочный".into(), + artists: artists + .iter() + .map(|(key, name)| ArtistRef { + key: key.clone(), + name: (*name).into(), + }) + .collect(), + featured_artists: Vec::new(), + release_type: "album".into(), + year: None, + artwork: Artwork::default(), + tracks: Vec::new(), + }], + tracks: Vec::new(), + }; + + let effects = reduce_action( + &mut state, + UiAction::Navigate(Screen::Release(release_key, Some(pasha_key.clone()))), + ); + + assert_eq!( + effects, + vec![Effect::Send(BackendCommand::LoadRelease { + request_id: RequestId::new(1), + key: ReleaseKey::Local(ReleaseId::new(7)), + artist_key: pasha_key, + artist_name: "Паша Техник".into(), + })] + ); + } +} diff --git a/crates/backend-api/Cargo.toml b/crates/backend-api/Cargo.toml new file mode 100644 index 0000000..d8ed4b7 --- /dev/null +++ b/crates/backend-api/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "furumi-backend-api" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +furumi-domain.workspace = true + +[lints] +workspace = true + diff --git a/crates/backend-api/src/lib.rs b/crates/backend-api/src/lib.rs new file mode 100644 index 0000000..b663939 --- /dev/null +++ b/crates/backend-api/src/lib.rs @@ -0,0 +1,346 @@ +//! Transport-independent contract between the frontend application and backend. + +use std::fmt; + +use furumi_domain::{Artist, Queue, QueueItemId, Release, ReleaseKey, Track, TrackKey}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct RequestId(u64); + +impl RequestId { + #[must_use] + pub const fn new(value: u64) -> Self { + Self(value) + } + + #[must_use] + pub const fn get(self) -> u64 { + self.0 + } +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum PlaybackStatus { + #[default] + Stopped, + Playing, + Paused, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct PlaybackSnapshot { + pub status: PlaybackStatus, + pub position_seconds: f64, + pub duration_seconds: f64, + pub volume: f32, +} + +impl Default for PlaybackSnapshot { + fn default() -> Self { + Self { + status: PlaybackStatus::Stopped, + position_seconds: 0.0, + duration_seconds: 0.0, + volume: 0.72, + } + } +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub enum RemoteData { + #[default] + NotRequested, + Loading { + request_id: RequestId, + }, + Ready(T), + Failed { + message: String, + }, +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct LibrarySnapshot { + pub artists: Vec, + pub featured_releases: Vec, + pub recently_played: Vec, + pub playlists: Vec, +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct PlaylistSnapshot { + pub id: i64, + pub title: String, + pub is_likes: bool, + pub tracks: Vec, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum DevicePlaybackRole { + #[default] + Active, + Control, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct ConnectedDeviceSnapshot { + pub id: String, + pub name: String, + pub client_version: String, + pub is_self: bool, + pub presence: DevicePresence, + pub trust: DeviceTrust, + pub is_active: bool, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum DevicePresence { + #[default] + Offline, + Online, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum DeviceTrust { + #[default] + Trusted, + Revoked, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct PendingPairingSnapshot { + pub request_id: String, + pub device_id: String, + pub name: String, + pub client_version: String, + pub requester_group_id: Option, + pub requester_group_active_devices: usize, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct ConnectedDevicesSnapshot { + pub this_device_id: String, + pub this_device_name: String, + pub group_id: String, + pub role: DevicePlaybackRole, + pub active_device_id: String, + pub active_device_name: String, + pub devices: Vec, + pub pending_pairings: Vec, + pub invite: Option, + pub busy: bool, + pub last_sync: Option, + pub error: Option, +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct SearchResults { + pub artists: Vec, + pub releases: Vec, + pub tracks: Vec, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct SearchStats { + pub tracks: usize, + pub artists: usize, + pub peers_queried: usize, + pub duration_ms: u64, +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct SearchSnapshot { + pub request_id: Option, + pub results: SearchResults, + pub federation_pending: bool, + pub stats: Option, + pub error: Option, +} + +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub enum FederationOperation { + #[default] + Idle, + Search, + Artist, + Release, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct FederationActivitySnapshot { + pub operation: FederationOperation, + pub pending: bool, + pub stats: Option, + pub error: Option, +} + +/// Lightweight live diagnostics for the federation node. +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct FederationDebugSnapshot { + pub running: bool, + pub endpoint_id: String, + pub dht_node_id: String, + pub connected_peers: usize, + pub known_contacts: usize, + pub stored_dht_records: Option, + pub published_items: usize, + pub error: Option, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct VersionEntrySnapshot { + pub name: String, + pub version: String, +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct BuildInfoSnapshot { + pub software: Vec, + pub protocols: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct SettingsSnapshot { + pub network_id: String, + pub device_name: String, + pub library_path: String, + pub federation_enabled: bool, + pub save_federated_on_listen: bool, + pub language: String, +} + +impl Default for SettingsSnapshot { + fn default() -> Self { + Self { + network_id: "furumi".into(), + device_name: String::new(), + library_path: "~/Music/Furumi".into(), + federation_enabled: true, + save_federated_on_listen: true, + language: "English".into(), + } + } +} + +#[derive(Debug, Clone, Default, PartialEq)] +pub struct BackendSnapshot { + pub revision: u64, + pub library: RemoteData, + pub playback: PlaybackSnapshot, + pub queue: Queue, + pub search: SearchSnapshot, + pub federation_activity: FederationActivitySnapshot, + pub federation_debug: FederationDebugSnapshot, + pub build_info: BuildInfoSnapshot, + pub connected_devices: ConnectedDevicesSnapshot, + pub settings: SettingsSnapshot, + pub playback_error: Option, + pub settings_error: Option, +} + +#[derive(Debug, Clone, PartialEq)] +pub enum BackendCommand { + Initialize, + TogglePlayback, + Play, + Pause, + Stop, + Seek { + position_seconds: f64, + }, + SetVolume { + volume: f32, + }, + PlayRelease { + release_id: ReleaseKey, + start: usize, + }, + PlayTrack { + track: TrackKey, + }, + PlayQueueItem { + item_id: QueueItemId, + }, + PlayContext { + tracks: Vec, + selected: TrackKey, + }, + AddNext { + tracks: Vec, + }, + AddToEnd { + tracks: Vec, + }, + ToggleLike { + track: TrackKey, + }, + CreatePlaylist { + title: String, + }, + RenamePlaylist { + playlist_id: i64, + title: String, + }, + DeletePlaylist { + playlist_id: i64, + }, + AddToPlaylist { + playlist_id: i64, + tracks: Vec, + }, + RemoveFromPlaylist { + playlist_id: i64, + tracks: Vec, + }, + CreateDeviceInvite, + ConnectDevice { + invite: String, + }, + AnswerDevicePairing { + request_id: String, + accept: bool, + use_requester_group: bool, + }, + SelectPlaybackDevice { + device_id: String, + }, + Next, + Previous, + Search { + request_id: RequestId, + query: String, + }, + CancelSearch { + request_id: RequestId, + }, + LoadArtist { + request_id: RequestId, + key: furumi_domain::ArtistKey, + name: String, + }, + LoadRelease { + request_id: RequestId, + key: ReleaseKey, + artist_key: furumi_domain::ArtistKey, + artist_name: String, + }, + UpdateSettings(SettingsSnapshot), + Shutdown, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum SendCommandError { + Busy, + Closed, +} + +impl fmt::Display for SendCommandError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Busy => formatter.write_str("backend command queue is full"), + Self::Closed => formatter.write_str("backend is unavailable"), + } + } +} + +impl std::error::Error for SendCommandError {} diff --git a/crates/backend/Cargo.toml b/crates/backend/Cargo.toml new file mode 100644 index 0000000..62de2b6 --- /dev/null +++ b/crates/backend/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "furumi-backend" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +furumi-backend-api.workspace = true +furumi-domain.workspace = true +furumi-library.workspace = true +music-dht.workspace = true +directories.workspace = true +rusqlite.workspace = true +rodio.workspace = true +tokio.workspace = true +tokio-util.workspace = true +serde_json.workspace = true +serde.workspace = true + +[lints] +workspace = true diff --git a/crates/backend/build.rs b/crates/backend/build.rs new file mode 100644 index 0000000..bb03578 --- /dev/null +++ b/crates/backend/build.rs @@ -0,0 +1,33 @@ +use std::path::PathBuf; + +fn main() { + let manifest_dir = PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").unwrap()); + let lock_path = manifest_dir.join("../../Cargo.lock"); + println!("cargo:rerun-if-changed={}", lock_path.display()); + let lock = std::fs::read_to_string(&lock_path).unwrap_or_default(); + for (package, variable) in [ + ("furumi-library", "FURUMI_LIBRARY_VERSION"), + ("music-dht", "FURUMI_MUSIC_DHT_VERSION"), + ("federation-net", "FURUMI_FEDERATION_NET_VERSION"), + ] { + println!( + "cargo:rustc-env={variable}={}", + package_version(&lock, package).unwrap_or("unknown") + ); + } +} + +fn package_version<'a>(lock: &'a str, package: &str) -> Option<&'a str> { + lock.split("[[package]]").find_map(|section| { + let mut name = None; + let mut version = None; + for line in section.lines().map(str::trim) { + if let Some(value) = line.strip_prefix("name = \"") { + name = value.strip_suffix('"'); + } else if let Some(value) = line.strip_prefix("version = \"") { + version = value.strip_suffix('"'); + } + } + (name == Some(package)).then_some(version).flatten() + }) +} diff --git a/crates/backend/src/actor_devices.rs b/crates/backend/src/actor_devices.rs new file mode 100644 index 0000000..3d1be2f --- /dev/null +++ b/crates/backend/src/actor_devices.rs @@ -0,0 +1,481 @@ +use super::{ + Actor, ArtistKey, ArtistRef, AudioSource, ConnectedDeviceSnapshot, ConnectedDevicesSnapshot, + ContentId, ControlPlaybackAnchor, DeviceOperationResult, DevicePlaybackRole, DevicePresence, + DeviceTrust, Duration, Instant, InternalEvent, PendingControlState, PendingPairingSnapshot, + PlaybackStatus, ReleaseKey, Track, TrackKey, library_track, normalize_device_name, + portable_playback_placeholder, track_to_playback_track, unix_time_ms, volume_percent, +}; + +impl Actor { + pub(super) fn create_device_invite(&mut self) { + let Some(service) = self.device_service.clone() else { + self.state.connected_devices.error = + Some("Federation network is still starting".into()); + self.publish(); + return; + }; + self.state.connected_devices.busy = true; + self.state.connected_devices.error = None; + self.publish(); + let devices = std::sync::Arc::clone(&self.devices); + let internal = self.internal.clone(); + tokio::spawn(async move { + let result = devices + .create_invite(service) + .await + .map(DeviceOperationResult::Invite) + .map_err(|error| format!("{error:#}")); + let _ = internal + .send(InternalEvent::DeviceOperationFinished(result)) + .await; + }); + } + + pub(super) fn connect_device(&mut self, invite: String) { + let Some(service) = self.device_service.clone() else { + self.state.connected_devices.error = + Some("Federation network is still starting".into()); + self.publish(); + return; + }; + self.state.connected_devices.busy = true; + self.state.connected_devices.error = None; + self.publish(); + let devices = std::sync::Arc::clone(&self.devices); + let internal = self.internal.clone(); + tokio::spawn(async move { + let result = devices + .connect_invite(service, &invite) + .await + .map(DeviceOperationResult::Connected) + .map_err(|error| format!("{error:#}")); + let _ = internal + .send(InternalEvent::DeviceOperationFinished(result)) + .await; + }); + } + + pub(super) fn apply_local_device_name(&mut self, name: &str) { + let name = normalize_device_name(name); + if let Err(error) = self.devices.set_device_name(&name, None) { + self.state.connected_devices.error = Some(format!("device name: {error:#}")); + return; + } + if self.active_device_id == self.state.connected_devices.this_device_id { + self.active_device_name = name; + } + self.refresh_connected_devices(); + } + + pub(super) fn schedule_device_name_publish(&self, candidate: String) { + let internal = self.internal.clone(); + tokio::spawn(async move { + tokio::time::sleep(Duration::from_millis(500)).await; + let _ = internal + .send(InternalEvent::DeviceNamePublishDue(candidate)) + .await; + }); + } + + pub(super) fn publish_device_name(&self, name: String) { + let Some(service) = self.device_service.clone() else { + return; + }; + let devices = std::sync::Arc::clone(&self.devices); + let internal = self.internal.clone(); + tokio::spawn(async move { + let result = async { + let ticket = service + .ticket() + .await + .map_err(|error| format!("device name: {error:#}"))?; + devices + .set_device_name(&name, Some(&ticket.to_string())) + .map_err(|error| format!("device name: {error:#}")) + } + .await; + let _ = internal + .send(InternalEvent::DeviceNamePublished(result)) + .await; + }); + } + + pub(super) fn refresh_connected_devices(&mut self) { + let status = self.devices.status(); + let invite = self.state.connected_devices.invite.take(); + let busy = self.state.connected_devices.busy; + let existing_error = self.state.connected_devices.error.take(); + self.state.connected_devices = ConnectedDevicesSnapshot { + this_device_id: status.this_device_id, + this_device_name: status.this_device_name, + group_id: status.group_id, + role: self.device_role, + active_device_id: self.active_device_id.clone(), + active_device_name: self.active_device_name.clone(), + devices: status + .devices + .into_iter() + .filter(|device| !device.revoked) + .map(|device| ConnectedDeviceSnapshot { + is_active: device.id == self.active_device_id, + id: device.id, + name: device.name, + client_version: device.client_version, + is_self: device.is_self, + presence: if device.online { + DevicePresence::Online + } else { + DevicePresence::Offline + }, + trust: if device.revoked { + DeviceTrust::Revoked + } else { + DeviceTrust::Trusted + }, + }) + .collect(), + pending_pairings: status + .pending + .into_iter() + .map(|pending| PendingPairingSnapshot { + request_id: pending.request_id, + device_id: pending.device_id, + name: pending.name, + client_version: pending.client_version, + requester_group_id: pending.requester_group_id, + requester_group_active_devices: pending.requester_group_active_devices, + }) + .collect(), + invite, + busy, + last_sync: status.last_sync, + error: existing_error.or(status.error), + }; + } + + pub(super) fn select_playback_device(&mut self, device_id: &str) { + // Selecting the device that already owns playback must not rebuild or + // restart the current audio stream. + if device_id == self.active_device_id { + return; + } + let target = self + .state + .connected_devices + .devices + .iter() + .find(|device| device.id == device_id && device.trust == DeviceTrust::Trusted) + .cloned(); + let Some(target) = target else { + return; + }; + let wire = self.playback_wire_state(); + let previous = self.active_device_id.clone(); + let mut urgent_targets = Vec::with_capacity(2); + if target.is_self { + if previous != target.id { + let command = music_dht::device_sync::PlaybackCommand::ActiveChanged { + active_device_id: target.id.clone(), + active_device_name: target.name.clone(), + state: wire.clone(), + }; + if let Err(error) = self.devices.record_playback_command(&previous, command) { + self.state.connected_devices.error = Some(format!("device handoff: {error:#}")); + self.publish(); + return; + } + urgent_targets.push(previous.clone()); + } + self.device_role = DevicePlaybackRole::Active; + self.active_device_id = target.id; + self.active_device_name = target.name; + self.control_anchor = None; + self.pending_control = None; + if self.state.playback.status == PlaybackStatus::Playing { + self.play_current(); + } + } else { + let command = music_dht::device_sync::PlaybackCommand::ActiveChanged { + active_device_id: target.id.clone(), + active_device_name: target.name.clone(), + state: wire.clone(), + }; + if let Err(error) = self + .devices + .record_playback_command(&target.id, command.clone()) + { + self.state.connected_devices.error = Some(format!("device handoff: {error:#}")); + self.publish(); + return; + } + urgent_targets.push(target.id.clone()); + if previous != target.id && previous != self.state.connected_devices.this_device_id { + if let Err(error) = self.devices.record_playback_command(&previous, command) { + self.state.connected_devices.error = + Some(format!("previous device handoff: {error:#}")); + } + urgent_targets.push(previous); + } + self.audio.stop(); + self.device_role = DevicePlaybackRole::Control; + self.active_device_id.clone_from(&target.id); + self.active_device_name = target.name; + self.control_anchor = Some(ControlPlaybackAnchor { + device_id: target.id.clone(), + state: wire.clone(), + observed_at: Instant::now(), + }); + self.pending_control = Some(PendingControlState { + device_id: target.id, + state: wire, + seek: true, + sent_at: Instant::now(), + }); + } + self.devices.request_sync(); + if let Some(service) = self.device_service.clone() { + urgent_targets.sort(); + urgent_targets.dedup(); + for target_id in urgent_targets { + let devices = std::sync::Arc::clone(&self.devices); + let service = std::sync::Arc::clone(&service); + tokio::spawn(async move { + let _ = devices.sync_target(service, &target_id).await; + }); + } + } + self.refresh_connected_devices(); + self.publish_device_playback(); + self.publish(); + } + + pub(super) fn playback_wire_state(&self) -> music_dht::device_sync::PlaybackStateWire { + music_dht::device_sync::PlaybackStateWire { + queue: self + .state + .queue + .items() + .iter() + .map(|item| track_to_playback_track(&item.track)) + .collect(), + queue_pos: self.state.queue.current_index().unwrap_or(0), + playing: self.state.playback.status != PlaybackStatus::Stopped, + paused: self.state.playback.status == PlaybackStatus::Paused, + idle_since_ms: (self.state.playback.status != PlaybackStatus::Playing) + .then_some(unix_time_ms()), + position_secs: self.state.playback.position_seconds, + volume: volume_percent(self.state.playback.volume), + shuffle: false, + repeat: music_dht::device_sync::PlaybackRepeat::Off, + } + } + + pub(super) fn publish_device_playback(&self) { + let snapshot = music_dht::device_sync::PlaybackSnapshot { + device_id: self.state.connected_devices.this_device_id.clone(), + device_name: self.state.connected_devices.this_device_name.clone(), + active: self.device_role == DevicePlaybackRole::Active, + updated_at_ms: unix_time_ms(), + state: self.playback_wire_state(), + }; + self.devices.publish_playback(snapshot); + } + + pub(super) fn send_control_state(&mut self, seek: bool) { + if self.device_role != DevicePlaybackRole::Control { + return; + } + let state = self.playback_wire_state(); + let command = music_dht::device_sync::PlaybackCommand::SetState { + state: state.clone(), + seek, + }; + if let Err(error) = self + .devices + .record_playback_command(&self.active_device_id, command) + { + self.state.connected_devices.error = Some(format!("device control: {error:#}")); + } else { + self.pending_control = Some(PendingControlState { + device_id: self.active_device_id.clone(), + state, + seek, + sent_at: Instant::now(), + }); + } + } + + pub(super) fn apply_device_playback_state( + &mut self, + wire: &music_dht::device_sync::PlaybackStateWire, + start_audio: bool, + seek: bool, + ) { + let tracks = wire + .queue + .iter() + .filter_map(|track| self.resolve_playback_track(track)) + .collect::>(); + if !tracks.is_empty() { + self.state.queue.replace_context(tracks, wire.queue_pos); + self.resolve_queue_artwork(); + } + self.state.playback.volume = f32::from(wire.volume.min(100)) / 100.0; + self.state.playback.position_seconds = wire.position_secs.max(0.0); + self.state.playback.duration_seconds = self + .state + .queue + .current() + .map_or(0.0, |item| item.track.duration_seconds); + self.state.playback.status = if !wire.playing { + PlaybackStatus::Stopped + } else if wire.paused { + PlaybackStatus::Paused + } else { + PlaybackStatus::Playing + }; + self.audio.set_volume(self.state.playback.volume); + if !start_audio { + return; + } + if wire.playing { + self.play_current(); + if seek || wire.position_secs > 0.0 { + self.audio + .seek(Duration::from_secs_f64(wire.position_secs.max(0.0))); + self.state.playback.position_seconds = wire.position_secs.max(0.0); + } + if wire.paused { + self.audio.pause(); + self.state.playback.status = PlaybackStatus::Paused; + } + } else { + self.audio.stop(); + } + } + + pub(super) fn apply_device_playback_command( + &mut self, + command: music_dht::device_sync::PlaybackCommand, + ) { + match command { + music_dht::device_sync::PlaybackCommand::SetState { state, seek } => { + self.device_role = DevicePlaybackRole::Active; + self.active_device_id = self.state.connected_devices.this_device_id.clone(); + self.active_device_name = self.state.connected_devices.this_device_name.clone(); + self.control_anchor = None; + self.pending_control = None; + self.apply_device_playback_state(&state, true, seek); + } + music_dht::device_sync::PlaybackCommand::ActiveChanged { + active_device_id, + active_device_name, + state, + } => { + let is_self = active_device_id == self.state.connected_devices.this_device_id; + self.active_device_id = active_device_id; + self.active_device_name = active_device_name; + self.device_role = if is_self { + DevicePlaybackRole::Active + } else { + DevicePlaybackRole::Control + }; + self.pending_control = None; + self.control_anchor = (!is_self).then(|| ControlPlaybackAnchor { + device_id: self.active_device_id.clone(), + state: state.clone(), + observed_at: Instant::now(), + }); + if !is_self { + self.audio.stop(); + } + self.apply_device_playback_state(&state, is_self, true); + } + } + self.refresh_connected_devices(); + self.publish(); + } + + pub(super) fn resolve_playback_track( + &self, + wire: &music_dht::device_sync::PlaybackTrack, + ) -> Option { + if let Some(content_id) = wire + .content_id + .as_deref() + .and_then(|id| ContentId::parse(id).ok()) + { + let key = TrackKey::remote(content_id.clone()); + if let Some(track) = self.track(&key) { + return Some(track.clone()); + } + if let Ok(Some(track)) = self.catalog.track_by_content_id(content_id.as_str()) { + return Some(library_track(track, "")); + } + } + let Some(fed) = wire.fed.as_ref() else { + let content_id = wire + .content_id + .as_deref() + .and_then(|id| ContentId::parse(id).ok())?; + return Some(portable_playback_placeholder(wire, content_id)); + }; + let content_id = ContentId::parse(&fed.content_id).ok()?; + let release_key = ReleaseKey::Federation { + peer_id: fed.owner.clone(), + id: format!( + "name:{}", + music_dht::normalize_name(fed.release_title.as_deref().unwrap_or_default()) + ), + }; + let refs = |names: &[String]| { + names + .iter() + .map(|name| ArtistRef { + key: ArtistKey::Federation { + peer_id: fed.owner.clone(), + id: format!("name:{}", music_dht::normalize_name(name)), + }, + name: name.clone(), + }) + .collect::>() + }; + Some(Track { + key: TrackKey::federation( + fed.owner.clone(), + fed.item_id.clone(), + Some(content_id.clone()), + ), + title: wire.title.clone(), + artist: wire.artist_names.join(", "), + artists: refs(&wire.artist_names), + featured_artists: refs(&wire.featured_artist_names), + release: wire.release_title.clone(), + release_id: release_key, + duration_seconds: wire.duration_seconds, + track_number: wire + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: wire.disc_number.and_then(|value| u32::try_from(value).ok()), + cover_uri: None, + audio_format: wire.audio_format.clone(), + audio_bitrate_kbps: wire + .audio_bitrate + .and_then(|value| u32::try_from(value).ok()), + audio_sample_rate_hz: wire + .audio_sample_rate + .and_then(|value| u32::try_from(value).ok()), + audio_bit_depth: wire + .audio_bit_depth + .and_then(|value| u32::try_from(value).ok()), + file_size_bytes: wire + .file_size_bytes + .and_then(|value| u64::try_from(value).ok()), + liked: false, + audio_source: AudioSource::Federation { + peer_id: fed.owner.clone(), + content_id, + }, + }) + } +} diff --git a/crates/backend/src/audio.rs b/crates/backend/src/audio.rs new file mode 100644 index 0000000..9a3b6e5 --- /dev/null +++ b/crates/backend/src/audio.rs @@ -0,0 +1,281 @@ +//! Real audio output isolated from the backend actor and UI thread. + +use std::fs::File; +use std::io; +use std::path::PathBuf; +use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::mpsc::{Receiver, RecvTimeoutError, Sender}; +use std::time::Duration; + +use rodio::{Decoder, DeviceSinkBuilder, Player, stream::MixerDeviceSink}; + +pub trait TrackReadSeek: std::io::Read + std::io::Seek + Send + Sync {} +impl TrackReadSeek for T where T: std::io::Read + std::io::Seek + Send + Sync {} +pub type TrackReader = Box; + +#[derive(Debug)] +pub enum Event { + Started, + Finished, + Failed(String), +} + +enum Command { + Play { + path: PathBuf, + volume: f32, + }, + PlayStream { + reader: TrackReader, + mime_type: String, + volume: f32, + }, + Pause, + Resume, + Stop, + Seek(Duration), + SetVolume(f32), +} + +#[derive(Debug, Default)] +pub struct Shared { + position_ms: AtomicU64, +} + +impl Shared { + pub fn position_seconds(&self) -> f64 { + Duration::from_millis(self.position_ms.load(Ordering::Relaxed)).as_secs_f64() + } +} + +#[derive(Clone)] +pub struct Controller { + commands: Sender, + pub shared: Arc, +} + +impl Controller { + pub fn play(&self, path: PathBuf, volume: f32) { + self.shared.position_ms.store(0, Ordering::Relaxed); + let _ = self.commands.send(Command::Play { path, volume }); + } + pub fn play_stream(&self, reader: TrackReader, mime_type: String, volume: f32) { + self.shared.position_ms.store(0, Ordering::Relaxed); + let _ = self.commands.send(Command::PlayStream { + reader, + mime_type, + volume, + }); + } + + pub fn pause(&self) { + let _ = self.commands.send(Command::Pause); + } + + pub fn resume(&self) { + let _ = self.commands.send(Command::Resume); + } + + pub fn stop(&self) { + let _ = self.commands.send(Command::Stop); + } + + pub fn seek(&self, position: Duration) { + let millis = u64::try_from(position.as_millis()).unwrap_or(u64::MAX); + self.shared.position_ms.store(millis, Ordering::Relaxed); + let _ = self.commands.send(Command::Seek(position)); + } + + pub fn set_volume(&self, volume: f32) { + let _ = self.commands.send(Command::SetVolume(volume)); + } +} + +pub fn spawn(on_event: impl Fn(Event) + Send + 'static) -> io::Result { + let (commands, receiver) = std::sync::mpsc::channel(); + let shared = Arc::new(Shared::default()); + let thread_shared = Arc::clone(&shared); + std::thread::Builder::new() + .name("furumi-audio".into()) + .spawn(move || run(&receiver, &thread_shared, &on_event))?; + Ok(Controller { commands, shared }) +} + +struct Output { + _device: MixerDeviceSink, + player: Player, +} + +fn run(receiver: &Receiver, shared: &Arc, on_event: &impl Fn(Event)) { + let mut output: Option = None; + let mut track_loaded = false; + let mut previous_queue_len = 0; + + loop { + match receiver.recv_timeout(Duration::from_millis(50)) { + Ok(command) => { + handle(command, shared, &mut output, &mut track_loaded, on_event); + previous_queue_len = output.as_ref().map_or(0, |output| output.player.len()); + } + Err(RecvTimeoutError::Timeout) => { + if let Some(output) = &output { + let millis = + u64::try_from(output.player.get_pos().as_millis()).unwrap_or(u64::MAX); + shared.position_ms.store(millis, Ordering::Relaxed); + let queue_len = output.player.len(); + if track_loaded && queue_len < previous_queue_len { + track_loaded = false; + on_event(Event::Finished); + } + previous_queue_len = queue_len; + } + } + Err(RecvTimeoutError::Disconnected) => return, + } + } +} + +#[allow(clippy::too_many_lines, reason = "exhaustive audio command dispatcher")] +fn handle( + command: Command, + shared: &Arc, + output: &mut Option, + track_loaded: &mut bool, + on_event: &impl Fn(Event), +) { + match command { + Command::Play { path, volume } => { + let output = match ensure_output(output) { + Ok(output) => output, + Err(error) => { + on_event(Event::Failed(format!("cannot open audio output: {error}"))); + return; + } + }; + let file = match File::open(&path) { + Ok(file) => file, + Err(error) => { + on_event(Event::Failed(format!( + "cannot open {}: {error}", + path.display() + ))); + return; + } + }; + let byte_len = file.metadata().ok().map(|metadata| metadata.len()); + let mut decoder = Decoder::builder() + .with_data(file) + .with_seekable(true) + .with_gapless(true); + if let Some(byte_len) = byte_len { + decoder = decoder.with_byte_len(byte_len); + } + match decoder.build() { + Ok(source) => { + output.player.stop(); + output.player.set_volume(amplitude(volume)); + output.player.append(source); + output.player.play(); + shared.position_ms.store(0, Ordering::Relaxed); + *track_loaded = true; + on_event(Event::Started); + } + Err(error) => on_event(Event::Failed(format!( + "cannot decode {}: {error}", + path.display() + ))), + } + } + Command::PlayStream { + reader, + mime_type, + volume, + } => { + let output = match ensure_output(output) { + Ok(output) => output, + Err(error) => { + on_event(Event::Failed(format!("cannot open audio output: {error}"))); + return; + } + }; + match Decoder::builder() + .with_data(reader) + .with_mime_type(&mime_type) + .with_seekable(false) + .with_gapless(true) + .build() + { + Ok(source) => { + output.player.stop(); + output.player.set_volume(amplitude(volume)); + output.player.append(source); + output.player.play(); + shared.position_ms.store(0, Ordering::Relaxed); + *track_loaded = true; + on_event(Event::Started); + } + Err(error) => on_event(Event::Failed(format!( + "cannot decode federated stream: {error}" + ))), + } + } + Command::Pause => { + if let Some(output) = output { + output.player.pause(); + } + } + Command::Resume => { + if let Some(output) = output { + output.player.play(); + } + } + Command::Stop => { + if let Some(output) = output { + output.player.stop(); + } + shared.position_ms.store(0, Ordering::Relaxed); + *track_loaded = false; + } + Command::Seek(position) => { + if let Some(output) = output + && let Err(error) = output.player.try_seek(position) + { + on_event(Event::Failed(format!("cannot seek: {error}"))); + } + } + Command::SetVolume(volume) => { + if let Some(output) = output { + output.player.set_volume(amplitude(volume)); + } + } + } +} + +fn ensure_output(output: &mut Option) -> Result<&Output, rodio::stream::DeviceSinkError> { + if output.is_none() { + let device = DeviceSinkBuilder::open_default_sink()?; + let player = Player::connect_new(device.mixer()); + *output = Some(Output { + _device: device, + player, + }); + } + Ok(output.as_ref().expect("audio output initialized above")) +} + +fn amplitude(volume: f32) -> f32 { + volume.clamp(0.0, 1.0).powi(3) +} + +#[cfg(test)] +mod tests { + use super::amplitude; + + #[test] + fn perceptual_volume_is_clamped_and_cubic() { + assert!(amplitude(-1.0).abs() < f32::EPSILON); + assert!((amplitude(0.5) - 0.125).abs() < f32::EPSILON); + assert!((amplitude(2.0) - 1.0).abs() < f32::EPSILON); + } +} diff --git a/crates/backend/src/devices.rs b/crates/backend/src/devices.rs new file mode 100644 index 0000000..092c606 --- /dev/null +++ b/crates/backend/src/devices.rs @@ -0,0 +1,1129 @@ +//! Trusted personal-device synchronization. +//! +//! The wire format is owned by `music-dht`; this module supplies the durable +//! operation log, materialized `SQLite` state and application integration. + +use std::collections::{BTreeMap, HashMap}; +use std::path::Path; +use std::str::FromStr as _; +use std::sync::{Arc, Mutex, MutexGuard}; +use std::time::Duration; + +use anyhow::{Context as _, Result}; +use music_dht::device_sync::{ + DEFAULT_INVITE_TTL_MS, DEVICE_SYNC_PROTOCOL_VERSION, DeviceProfileWire, InviteWire, + PlaybackCommand, PlaybackSnapshot, SnapshotLike, SnapshotLikeTombstone, SnapshotPlaylist, + SnapshotPlaylistItem, SnapshotPlaylistItemTombstone, SnapshotPlaylistTombstone, SyncOpPayload, + SyncOpWire, SyncSnapshot, SyncedFedTrack, WireMessage, encode_invite, finish_response, + finish_send, hash_secret, parse_invite, random_hex, read_msg, ticket_endpoint_id, write_msg, +}; +use music_dht::{ByteStream, MusicDhtService, PeerTicket, StreamAcceptor}; +use rusqlite::{Connection, OptionalExtension as _, params}; + +use crate::InternalEvent; +mod store; + +const CLIENT_VERSION: &str = env!("CARGO_PKG_VERSION"); +const SYNC_INTERVAL: Duration = Duration::from_secs(2); +const PAIR_RETRY: Duration = Duration::from_secs(1); +const PAIR_WAIT_MS: i64 = 5 * 60 * 1_000; +const RESPONSE_DRAIN: Duration = Duration::from_secs(2); +const ONLINE_TTL_MS: i64 = 15_000; +const MAX_OPS_PER_BATCH: usize = 1_000; +const PLAYBACK_COMMAND_TTL_MS: i64 = 5 * 60 * 1_000; + +#[derive(Debug, Clone, Default)] +pub struct Status { + pub this_device_id: String, + pub this_device_name: String, + pub group_id: String, + pub devices: Vec, + pub pending: Vec, + pub last_sync: Option, + pub error: Option, +} + +#[derive(Debug, Clone, Default)] +pub struct DeviceRow { + pub id: String, + pub name: String, + pub client_version: String, + pub is_self: bool, + pub online: bool, + pub revoked: bool, +} + +#[derive(Debug, Clone, Default)] +pub struct PendingPairing { + pub request_id: String, + pub device_id: String, + pub name: String, + pub client_version: String, + pub requester_group_id: Option, + pub requester_group_active_devices: usize, +} + +#[derive(Debug, Clone)] +struct Identity { + device_id: String, + group_id: String, + name: String, +} + +#[derive(Clone)] +pub struct DeviceSync { + conn: Arc>, + library: Arc, + events: tokio::sync::mpsc::Sender, + playback: Arc>, + sync_requested: Arc, +} + +#[derive(Debug, Default)] +struct PlaybackStore { + local: Option, + remote: HashMap, +} + +impl DeviceSync { + pub fn open( + path: &Path, + library: Arc, + events: tokio::sync::mpsc::Sender, + ) -> Result> { + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent)?; + } + let conn = Connection::open(path) + .with_context(|| format!("opening device sync database {}", path.display()))?; + init_schema(&conn)?; + let sync = Arc::new(Self { + conn: Arc::new(Mutex::new(conn)), + library, + events, + playback: Arc::new(Mutex::new(PlaybackStore::default())), + sync_requested: Arc::new(tokio::sync::Notify::new()), + }); + sync.ensure_identity()?; + Ok(sync) + } + + pub fn status(&self) -> Status { + self.status_inner().unwrap_or_else(|error| Status { + error: Some(format!("{error:#}")), + ..Status::default() + }) + } + + pub fn identity(&self) -> Result<(String, String)> { + let identity = self.ensure_identity()?; + Ok((identity.device_id, identity.name)) + } + + pub fn set_device_name(&self, name: &str, endpoint_ticket: Option<&str>) -> Result<()> { + let name = if name.trim().is_empty() { + "furumi".to_string() + } else { + name.trim().to_string() + }; + let identity = self.ensure_identity()?; + { + let conn = lock(&self.conn); + set_meta(&conn, "device_name", &name)?; + conn.execute( + "UPDATE sync_devices + SET name = ?2, client_version = ?3 + WHERE device_id = ?1", + params![identity.device_id, name, CLIENT_VERSION], + )?; + } + if let Some(ticket) = endpoint_ticket { + self.record_op(SyncOpPayload::DeviceProfileSet { + name, + client_version: CLIENT_VERSION.to_string(), + endpoint_ticket: ticket.to_string(), + endpoint_id: ticket_endpoint_id(ticket).unwrap_or_default(), + })?; + } else { + self.request_sync(); + self.notify(); + } + Ok(()) + } + + pub fn publish_playback(&self, mut snapshot: PlaybackSnapshot) { + if snapshot.updated_at_ms <= 0 { + snapshot.updated_at_ms = now_ms(); + } + lock(&self.playback).local = Some(snapshot); + } + + /// Wake the sync loop immediately after an interactive operation. + pub fn request_sync(&self) { + self.sync_requested.notify_one(); + } + + pub async fn create_invite(&self, service: Arc) -> Result { + let identity = self.ensure_identity()?; + let secret = random_hex(16); + let invite_id = random_hex(8); + let expires_at_ms = now_ms() + DEFAULT_INVITE_TTL_MS; + lock(&self.conn).execute( + "INSERT INTO sync_invites (invite_id, secret_hash, expires_at_ms, created_at_ms) + VALUES (?1, ?2, ?3, ?4)", + params![invite_id, hash_secret(&secret), expires_at_ms, now_ms()], + )?; + encode_invite(&InviteWire { + v: 1, + ticket: service.ticket().await?.to_string(), + device_id: identity.device_id, + invite_id, + secret, + expires_at_ms, + }) + .map_err(Into::into) + } + + pub async fn connect_invite( + &self, + service: Arc, + value: &str, + ) -> Result { + let invite = parse_invite(value)?; + anyhow::ensure!(invite.expires_at_ms >= now_ms(), "device invite expired"); + let ticket = + PeerTicket::from_str(&invite.ticket).context("invalid device invite ticket")?; + let deadline = (now_ms() + PAIR_WAIT_MS).min(invite.expires_at_ms); + loop { + match self + .try_connect_invite(Arc::clone(&service), &invite, ticket.clone()) + .await + { + Ok(PairAttempt::Accepted) => { + return Ok(format!("Connected to {}", short_id(&invite.device_id))); + } + Ok(PairAttempt::Denied(message)) => anyhow::bail!(message), + Ok(PairAttempt::Pending) | Err(_) if now_ms() < deadline => { + tokio::time::sleep(PAIR_RETRY).await; + } + Ok(PairAttempt::Pending) => anyhow::bail!("pairing timed out"), + Err(error) => anyhow::bail!("pairing timed out: {error:#}"), + } + } + } + + async fn try_connect_invite( + &self, + service: Arc, + invite: &InviteWire, + ticket: PeerTicket, + ) -> Result { + let peer = service.connect(ticket).await?; + let identity = self.ensure_identity()?; + let mut stream = service + .open_stream(peer, music_dht::device_sync::SYNC_ALPN) + .await?; + let playback = lock(&self.playback).local.clone(); + write_msg( + &mut stream, + &WireMessage::PairRequest { + invite_id: invite.invite_id.clone(), + secret: invite.secret.clone(), + profile: self.own_profile(&service.ticket().await?.to_string())?, + group_id: Some(identity.group_id), + group_active_devices: self.active_device_count()?, + devices: self.device_profiles()?, + vector: self.vector()?, + ops: self.ops_for_peer(&invite.device_id)?, + snapshot: self.snapshot()?, + playback, + }, + ) + .await?; + finish_send(&mut stream).await?; + match read_msg(&mut stream).await? { + WireMessage::PairResponse { + accepted: true, + group_id: Some(group_id), + profile, + devices, + vector, + ops, + snapshot, + playback, + .. + } => { + self.set_group_id(&group_id)?; + if let Some(profile) = profile { + self.apply_device_profile(&profile, true)?; + } + self.apply_device_profiles(&devices)?; + self.apply_snapshot(snapshot)?; + self.apply_ops(ops)?; + if let Some(playback) = playback { + self.apply_playback_snapshot(playback); + } + self.record_op(SyncOpPayload::DeviceTrusted { + target_device_id: invite.device_id.clone(), + })?; + self.note_peer_vector(&invite.device_id, &vector)?; + self.set_meta("last_sync", &format!("paired · {}", time_label()))?; + self.notify(); + Ok(PairAttempt::Accepted) + } + WireMessage::PairResponse { + accepted: false, + pending: true, + .. + } => Ok(PairAttempt::Pending), + WireMessage::PairResponse { + accepted: false, + error, + .. + } => Ok(PairAttempt::Denied( + error.unwrap_or_else(|| "pairing denied".into()), + )), + _ => anyhow::bail!("unexpected pairing response"), + } + } + + pub fn answer_pairing( + &self, + request_id: &str, + accept: bool, + use_requester_group: bool, + ) -> Result<()> { + let pending = { + let conn = lock(&self.conn); + conn.query_row( + "SELECT device_id, name, client_version, endpoint_id, endpoint_ticket, + requester_group_id, requester_group_devices_json + FROM sync_pending_pairing WHERE request_id = ?1", + [request_id], + |row| { + Ok(( + DeviceProfileWire { + device_id: row.get(0)?, + name: row.get(1)?, + client_version: row.get(2)?, + protocol_version: DEVICE_SYNC_PROTOCOL_VERSION, + endpoint_id: row.get(3)?, + endpoint_ticket: row.get(4)?, + revoked: false, + revoke_cutoff_seq: None, + updated_at_ms: now_ms(), + }, + row.get::<_, Option>(5)?, + row.get::<_, String>(6)?, + )) + }, + ) + .optional()? + }; + let changed = lock(&self.conn).execute( + "UPDATE sync_pending_pairing SET status = ?2, answered_at_ms = ?3, + use_requester_group = ?4 + WHERE request_id = ?1 AND status = 'pending'", + params![ + request_id, + if accept { "accepted" } else { "denied" }, + now_ms(), + i64::from(use_requester_group) + ], + )?; + if accept + && changed > 0 + && let Some((profile, group, devices_json)) = pending + { + if use_requester_group { + if let Some(group) = group.filter(|value| !value.trim().is_empty()) { + self.set_group_id(&group)?; + } + let devices: Vec = serde_json::from_str(&devices_json)?; + self.apply_device_profiles(&devices)?; + } + self.apply_device_profile(&profile, true)?; + self.record_op(SyncOpPayload::DeviceTrusted { + target_device_id: profile.device_id, + })?; + } + self.notify(); + Ok(()) + } + + pub fn record_like( + &self, + content_id: &str, + liked: bool, + fed: Option, + ) -> Result<()> { + let Some(content_id) = music_dht::normalize_content_id(content_id) else { + return Ok(()); + }; + self.record_op(SyncOpPayload::TrackLikeSet { + content_id, + liked, + fed, + }) + } + + pub fn record_playlist_created(&self, id: i64, title: &str) -> Result<()> { + let playlist_id = self.library.ensure_playlist_sync_id(id)?; + self.record_op(SyncOpPayload::PlaylistCreated { + playlist_id, + title: title.to_owned(), + }) + } + + pub fn record_playlist_renamed(&self, id: i64, title: &str) -> Result<()> { + let playlist_id = self.library.ensure_playlist_sync_id(id)?; + self.record_op(SyncOpPayload::PlaylistRenamed { + playlist_id, + title: title.to_owned(), + }) + } + + pub fn record_playlist_deleted(&self, sync_id: String) -> Result<()> { + self.record_op(SyncOpPayload::PlaylistDeleted { + playlist_id: sync_id, + }) + } + + pub fn record_playlist_tracks_added(&self, playlist_id: i64, track_ids: &[i64]) -> Result<()> { + let sync_id = self.library.ensure_playlist_sync_id(playlist_id)?; + for (content_id, position) in self + .library + .playlist_track_content_positions(playlist_id, track_ids)? + { + self.record_op(SyncOpPayload::PlaylistTrackAdded { + playlist_id: sync_id.clone(), + content_id, + position, + fed: None, + })?; + } + Ok(()) + } + + pub fn record_playlist_fed_added( + &self, + playlist_id: i64, + tracks: &[(String, i64, SyncedFedTrack)], + ) -> Result<()> { + let sync_id = self.library.ensure_playlist_sync_id(playlist_id)?; + for (content_id, position, fed) in tracks { + self.record_op(SyncOpPayload::PlaylistTrackAdded { + playlist_id: sync_id.clone(), + content_id: content_id.clone(), + position: *position, + fed: Some(fed.clone()), + })?; + } + Ok(()) + } + + pub fn record_playlist_removed(&self, playlist_id: i64, ids: &[String]) -> Result<()> { + let Some(sync_id) = self.library.playlist_sync_id(playlist_id)? else { + return Ok(()); + }; + for content_id in ids { + if let Some(content_id) = music_dht::normalize_content_id(content_id) { + self.record_op(SyncOpPayload::PlaylistTrackRemoved { + playlist_id: sync_id.clone(), + content_id, + })?; + } + } + Ok(()) + } + + pub fn record_playback_command( + &self, + target_device_id: &str, + command: PlaybackCommand, + ) -> Result<()> { + self.record_op(SyncOpPayload::PlaybackCommand { + target_device_id: target_device_id.to_owned(), + command, + }) + } +} + +pub async fn serve( + mut acceptor: StreamAcceptor, + sync: Arc, + service: Arc, +) { + while let Some(stream) = acceptor.accept().await { + let sync = Arc::clone(&sync); + let service = Arc::clone(&service); + tokio::spawn(async move { + if let Err(error) = serve_one(stream, &sync, &service).await { + let _ = sync.set_meta("last_error", &format!("incoming sync: {error:#}")); + sync.notify(); + } + }); + } +} + +pub async fn sync_loop(sync: Arc, service: Arc) { + let mut interval = tokio::time::interval(SYNC_INTERVAL); + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + loop { + tokio::select! { + _ = interval.tick() => {} + () = sync.sync_requested.notified() => {} + } + match sync.sync_once(Arc::clone(&service)).await { + Ok(()) => { + let _ = sync.set_meta("last_error", ""); + } + Err(error) => { + let _ = sync.set_meta("last_error", &format!("{error:#}")); + } + } + sync.notify(); + } +} + +impl DeviceSync { + /// Synchronizes one explicitly selected device without waiting for the + /// periodic all-device pass. + pub async fn sync_target( + &self, + service: Arc, + target_device_id: &str, + ) -> Result<()> { + let device = self + .active_remote_devices()? + .into_iter() + .find(|device| device.id == target_device_id) + .with_context(|| format!("device {} is unavailable", short_id(target_device_id)))?; + let result = self.sync_device(service, &device).await; + if let Err(error) = &result { + let _ = self.set_meta( + "last_error", + &format!("{}: {error:#}", short_id(target_device_id)), + ); + } + self.notify(); + result + } + + async fn sync_once(&self, service: Arc) -> Result<()> { + let devices = self.active_remote_devices()?; + let mut last_error = None; + for device in devices { + if let Err(error) = self.sync_device(Arc::clone(&service), &device).await { + last_error = Some(error); + } + } + if let Some(error) = last_error { + return Err(error); + } + Ok(()) + } + + fn active_remote_devices(&self) -> Result> { + let own = self.ensure_identity()?.device_id; + let conn = lock(&self.conn); + let mut stmt = conn.prepare( + "SELECT device_id, endpoint_id, endpoint_ticket FROM sync_devices + WHERE trusted_at_ms IS NOT NULL AND revoked_at_ms IS NULL + AND device_id != ?1 AND endpoint_ticket != ''", + )?; + Ok(stmt + .query_map([own], |row| { + Ok(StoredDevice { + id: row.get(0)?, + endpoint_id: row.get(1)?, + ticket: row.get(2)?, + }) + })? + .collect::>>()?) + } + + async fn sync_device( + &self, + service: Arc, + device: &StoredDevice, + ) -> Result<()> { + let peer = if let Ok(peer) = device.endpoint_id.parse::() + && (service.is_connected(peer) + || service + .known_peers() + .iter() + .any(|contact| contact.peer_id == peer)) + { + peer + } else { + service + .connect(PeerTicket::from_str(&device.ticket)?) + .await? + }; + let identity = self.ensure_identity()?; + let mut stream = service + .open_stream(peer, music_dht::device_sync::SYNC_ALPN) + .await?; + let playback = lock(&self.playback).local.clone(); + write_msg( + &mut stream, + &WireMessage::Hello { + group_id: identity.group_id, + profile: self.own_profile(&service.ticket().await?.to_string())?, + devices: self.device_profiles()?, + vector: self.vector()?, + ops: self.ops_for_peer(&device.id)?, + snapshot: self.snapshot()?, + playback, + }, + ) + .await?; + finish_send(&mut stream).await?; + match read_msg(&mut stream).await? { + WireMessage::SyncResponse { + accepted: true, + devices, + vector, + ops, + snapshot, + playback, + .. + } => { + self.apply_device_profiles(&devices)?; + self.apply_snapshot(snapshot)?; + self.apply_ops(ops)?; + if let Some(playback) = playback { + self.apply_playback_snapshot(playback); + } + self.note_peer_vector(&device.id, &vector)?; + self.mark_seen(&device.id, &peer.to_string())?; + self.set_meta( + "last_sync", + &format!("{} · {}", time_label(), short_id(&device.id)), + )?; + Ok(()) + } + WireMessage::SyncResponse { + accepted: false, + error, + .. + } => anyhow::bail!(error.unwrap_or_else(|| "sync refused".into())), + _ => anyhow::bail!("unexpected sync response"), + } + } +} + +#[derive(Debug)] +struct StoredDevice { + id: String, + endpoint_id: String, + ticket: String, +} + +async fn serve_one( + mut stream: ByteStream, + sync: &Arc, + service: &Arc, +) -> Result<()> { + match read_msg(&mut stream).await? { + WireMessage::PairRequest { + invite_id, + secret, + mut profile, + group_id, + group_active_devices, + devices, + vector, + ops, + snapshot, + playback, + } => { + profile.endpoint_id = stream.peer_id.to_string(); + handle_pair_request( + stream, + sync, + service, + invite_id, + secret, + profile, + group_id, + group_active_devices, + devices, + vector, + ops, + snapshot, + playback, + ) + .await + } + WireMessage::Hello { + group_id, + mut profile, + devices, + vector, + ops, + snapshot, + playback, + } => { + profile.endpoint_id = stream.peer_id.to_string(); + handle_hello( + stream, sync, service, group_id, profile, devices, vector, ops, snapshot, playback, + ) + .await + } + _ => anyhow::bail!("unexpected first device-sync message"), + } +} + +#[allow(clippy::too_many_arguments)] +async fn handle_pair_request( + mut stream: ByteStream, + sync: &Arc, + service: &Arc, + invite_id: String, + secret: String, + profile: DeviceProfileWire, + requester_group_id: Option, + requester_group_active_devices: usize, + requester_devices: Vec, + vector: BTreeMap, + ops: Vec, + snapshot: SyncSnapshot, + playback: Option, +) -> Result<()> { + let request_id = pair_request_id(&invite_id, &profile.device_id); + if !valid_pair_request(sync, &invite_id, &secret, &request_id)? { + write_msg(&mut stream, &pair_error("invalid or expired invite", false)).await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + return Ok(()); + } + let devices_json = serde_json::to_string(&requester_devices)?; + lock(&sync.conn).execute( + "INSERT OR IGNORE INTO sync_pending_pairing + (request_id, device_id, name, client_version, endpoint_id, endpoint_ticket, + invite_id, created_at_ms, status, requester_group_id, + requester_group_active_devices, requester_group_devices_json) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 'pending', ?9, ?10, ?11)", + params![ + request_id, + profile.device_id, + profile.name, + profile.client_version, + profile.endpoint_id, + profile.endpoint_ticket, + invite_id, + now_ms(), + requester_group_id, + i64::try_from(requester_group_active_devices).unwrap_or(i64::MAX), + devices_json, + ], + )?; + sync.notify(); + let pairing = lock(&sync.conn) + .query_row( + "SELECT status, use_requester_group FROM sync_pending_pairing + WHERE request_id = ?1", + [&request_id], + |row| Ok((row.get::<_, String>(0)?, row.get::<_, i64>(1)? != 0)), + ) + .optional()?; + match pairing.as_ref().map(|(status, _)| status.as_str()) { + Some("pending") => { + write_msg(&mut stream, &pair_error("pairing pending", true)).await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + return Ok(()); + } + Some("accepted") => {} + _ => { + write_msg(&mut stream, &pair_error("pairing denied", false)).await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + return Ok(()); + } + } + let mut response_group = sync.ensure_identity()?.group_id; + if pairing.is_some_and(|(_, use_group)| use_group) + && let Some(group) = requester_group_id.filter(|group| !group.trim().is_empty()) + { + sync.set_group_id(&group)?; + response_group = group; + sync.apply_device_profiles(&requester_devices)?; + } + sync.apply_device_profile(&profile, true)?; + sync.apply_snapshot(snapshot)?; + sync.apply_ops(ops)?; + if let Some(playback) = playback { + sync.apply_playback_snapshot(playback); + } + sync.note_peer_vector(&profile.device_id, &vector)?; + lock(&sync.conn).execute( + "UPDATE sync_invites SET used_at_ms = ?2 WHERE invite_id = ?1", + params![invite_id, now_ms()], + )?; + let own_profile = sync.own_profile(&service.ticket().await?.to_string())?; + let playback = lock(&sync.playback).local.clone(); + write_msg( + &mut stream, + &WireMessage::PairResponse { + accepted: true, + pending: false, + error: None, + group_id: Some(response_group), + profile: Some(own_profile), + devices: sync.device_profiles()?, + vector: sync.vector()?, + ops: sync.ops_for_peer(&profile.device_id)?, + snapshot: sync.snapshot()?, + playback, + }, + ) + .await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + sync.set_meta("last_sync", &format!("paired · {}", time_label()))?; + sync.notify(); + Ok(()) +} + +#[allow(clippy::too_many_arguments)] +async fn handle_hello( + mut stream: ByteStream, + sync: &Arc, + service: &Arc, + group_id: String, + profile: DeviceProfileWire, + devices: Vec, + vector: BTreeMap, + ops: Vec, + snapshot: SyncSnapshot, + playback: Option, +) -> Result<()> { + if group_id != sync.ensure_identity()?.group_id || !is_trusted(sync, &profile.device_id)? { + write_msg( + &mut stream, + &WireMessage::SyncResponse { + accepted: false, + error: Some("device group mismatch or device is not trusted".into()), + devices: Vec::new(), + vector: BTreeMap::new(), + ops: Vec::new(), + snapshot: SyncSnapshot::default(), + playback: None, + }, + ) + .await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + return Ok(()); + } + sync.apply_device_profile(&profile, false)?; + sync.apply_device_profiles(&devices)?; + sync.apply_snapshot(snapshot)?; + sync.apply_ops(ops)?; + if let Some(playback) = playback { + sync.apply_playback_snapshot(playback); + } + sync.note_peer_vector(&profile.device_id, &vector)?; + sync.mark_seen(&profile.device_id, &stream.peer_id.to_string())?; + let mut profiles = sync.device_profiles()?; + profiles.push(sync.own_profile(&service.ticket().await?.to_string())?); + let playback = lock(&sync.playback).local.clone(); + write_msg( + &mut stream, + &WireMessage::SyncResponse { + accepted: true, + error: None, + devices: profiles, + vector: sync.vector()?, + ops: sync.ops_for_peer(&profile.device_id)?, + snapshot: sync.snapshot()?, + playback, + }, + ) + .await?; + finish_response(&mut stream, RESPONSE_DRAIN).await?; + sync.set_meta( + "last_sync", + &format!("{} · {}", time_label(), short_id(&profile.device_id)), + )?; + sync.notify(); + Ok(()) +} + +fn pair_error(message: &str, pending: bool) -> WireMessage { + WireMessage::PairResponse { + accepted: false, + pending, + error: Some(message.into()), + group_id: None, + profile: None, + devices: Vec::new(), + vector: BTreeMap::new(), + ops: Vec::new(), + snapshot: SyncSnapshot::default(), + playback: None, + } +} + +fn init_schema(conn: &Connection) -> Result<()> { + conn.execute_batch( + r" +PRAGMA journal_mode = WAL; +PRAGMA foreign_keys = ON; +CREATE TABLE IF NOT EXISTS sync_meta ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS sync_devices ( + device_id TEXT PRIMARY KEY, + name TEXT NOT NULL DEFAULT '', + client_version TEXT NOT NULL DEFAULT '', + protocol_version INTEGER NOT NULL DEFAULT 1, + endpoint_id TEXT NOT NULL DEFAULT '', + endpoint_ticket TEXT NOT NULL DEFAULT '', + trusted_at_ms INTEGER, + last_seen_ms INTEGER, + revoked_at_ms INTEGER, + revoked_by TEXT, + revoke_cutoff_seq INTEGER +); +CREATE TABLE IF NOT EXISTS sync_invites ( + invite_id TEXT PRIMARY KEY, + secret_hash TEXT NOT NULL, + expires_at_ms INTEGER NOT NULL, + created_at_ms INTEGER NOT NULL, + used_at_ms INTEGER +); +CREATE TABLE IF NOT EXISTS sync_pending_pairing ( + request_id TEXT PRIMARY KEY, + device_id TEXT NOT NULL, + name TEXT NOT NULL, + client_version TEXT NOT NULL, + endpoint_id TEXT NOT NULL, + endpoint_ticket TEXT NOT NULL, + invite_id TEXT NOT NULL, + created_at_ms INTEGER NOT NULL, + answered_at_ms INTEGER, + status TEXT NOT NULL, + requester_group_id TEXT, + requester_group_active_devices INTEGER NOT NULL DEFAULT 1, + requester_group_devices_json TEXT NOT NULL DEFAULT '[]', + use_requester_group INTEGER NOT NULL DEFAULT 0 +); +CREATE TABLE IF NOT EXISTS sync_ops ( + op_id TEXT PRIMARY KEY, + origin_device_id TEXT NOT NULL, + seq INTEGER NOT NULL, + kind TEXT NOT NULL, + payload_json TEXT NOT NULL, + hlc_ms INTEGER NOT NULL, + received_at_ms INTEGER NOT NULL, + tombstone INTEGER NOT NULL DEFAULT 0 +); +CREATE INDEX IF NOT EXISTS idx_sync_ops_origin_seq + ON sync_ops(origin_device_id, seq); +CREATE TABLE IF NOT EXISTS sync_vectors ( + device_id TEXT PRIMARY KEY, + max_seq INTEGER NOT NULL +); +CREATE TABLE IF NOT EXISTS sync_peer_acks ( + peer_device_id TEXT NOT NULL, + origin_device_id TEXT NOT NULL, + max_seq INTEGER NOT NULL, + updated_at_ms INTEGER NOT NULL, + PRIMARY KEY (peer_device_id, origin_device_id) +); +CREATE TABLE IF NOT EXISTS sync_state_likes ( + content_id TEXT PRIMARY KEY, + liked INTEGER NOT NULL, + hlc_ms INTEGER NOT NULL, + op_id TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS sync_state_playlists ( + playlist_id TEXT PRIMARY KEY, + title TEXT NOT NULL, + deleted INTEGER NOT NULL DEFAULT 0, + hlc_ms INTEGER NOT NULL, + op_id TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS sync_state_playlist_items ( + playlist_id TEXT NOT NULL, + content_id TEXT NOT NULL, + present INTEGER NOT NULL, + position INTEGER NOT NULL, + hlc_ms INTEGER NOT NULL, + op_id TEXT NOT NULL, + PRIMARY KEY (playlist_id, content_id) +); +CREATE TABLE IF NOT EXISTS sync_playback_applied ( + op_id TEXT PRIMARY KEY, + applied_at_ms INTEGER NOT NULL +); +", + )?; + Ok(()) +} + +fn lock(mutex: &Mutex) -> MutexGuard<'_, T> { + mutex + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner) +} + +fn get_meta(conn: &Connection, key: &str) -> Result> { + Ok(conn + .query_row("SELECT value FROM sync_meta WHERE key = ?1", [key], |row| { + row.get(0) + }) + .optional()?) +} + +fn set_meta(conn: &Connection, key: &str, value: &str) -> Result<()> { + if value.is_empty() { + conn.execute("DELETE FROM sync_meta WHERE key = ?1", [key])?; + } else { + conn.execute( + "INSERT INTO sync_meta (key, value) VALUES (?1, ?2) + ON CONFLICT(key) DO UPDATE SET value = excluded.value", + params![key, value], + )?; + } + Ok(()) +} + +fn now_ms() -> i64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map_or(0, |duration| { + i64::try_from(duration.as_millis()).unwrap_or(i64::MAX) + }) +} + +fn time_label() -> String { + let seconds = (now_ms() / 1_000).max(0); + format!( + "{:02}:{:02}:{:02} UTC", + seconds / 3_600 % 24, + seconds / 60 % 60, + seconds % 60 + ) +} + +fn short_id(value: &str) -> String { + value.chars().take(10).collect() +} + +fn pair_request_id(invite_id: &str, device_id: &str) -> String { + let digest = hash_secret(&format!("{invite_id}:{device_id}")); + format!("pair_{}", &digest[..16]) +} + +fn valid_pair_request( + sync: &DeviceSync, + invite_id: &str, + secret: &str, + request_id: &str, +) -> Result { + let conn = lock(&sync.conn); + let row = conn + .query_row( + "SELECT secret_hash, expires_at_ms, used_at_ms FROM sync_invites + WHERE invite_id = ?1", + [invite_id], + |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, i64>(1)?, + row.get::<_, Option>(2)?, + )) + }, + ) + .optional()?; + let Some((expected, expires, used)) = row else { + return Ok(false); + }; + if expires < now_ms() || expected != hash_secret(secret) { + return Ok(false); + } + if used.is_none() { + return Ok(true); + } + Ok(conn + .query_row( + "SELECT 1 FROM sync_pending_pairing + WHERE request_id = ?1 AND status = 'accepted'", + [request_id], + |row| row.get::<_, i64>(0), + ) + .optional()? + .is_some()) +} + +fn is_trusted(sync: &DeviceSync, device_id: &str) -> Result { + if device_id == sync.ensure_identity()?.device_id { + return Ok(true); + } + Ok(lock(&sync.conn) + .query_row( + "SELECT 1 FROM sync_devices WHERE device_id = ?1 + AND trusted_at_ms IS NOT NULL AND revoked_at_ms IS NULL", + [device_id], + |row| row.get::<_, i64>(0), + ) + .optional()? + .is_some()) +} + +fn payload_kind(payload: &SyncOpPayload) -> &'static str { + match payload { + SyncOpPayload::TrackLikeSet { .. } => "track_like_set", + SyncOpPayload::PlaylistCreated { .. } => "playlist_created", + SyncOpPayload::PlaylistRenamed { .. } => "playlist_renamed", + SyncOpPayload::PlaylistDeleted { .. } => "playlist_deleted", + SyncOpPayload::PlaylistTrackAdded { .. } => "playlist_track_added", + SyncOpPayload::PlaylistTrackRemoved { .. } => "playlist_track_removed", + SyncOpPayload::DeviceProfileSet { .. } => "device_profile_set", + SyncOpPayload::DeviceTrusted { .. } => "device_trusted", + SyncOpPayload::DeviceRevoked { .. } => "device_revoked", + SyncOpPayload::PlaybackCommand { .. } => "playback_command", + SyncOpPayload::ListenRecorded { .. } => "listen_recorded", + } +} + +fn to_library_fed(fed: &SyncedFedTrack) -> furumi_library::FederatedTrack { + furumi_library::FederatedTrack { + item_id: fed.item_id.clone(), + owner: fed.owner.clone(), + own: false, + title: fed.title.clone(), + artist_names: fed.artist_names.clone(), + featured_artist_names: fed.featured_artist_names.clone(), + year: fed.year, + duration_seconds: fed.duration_seconds, + content_id: Some(fed.content_id.clone()), + release_title: fed.release_title.clone(), + track_number: fed.track_number, + disc_number: fed.disc_number, + } +} + +enum PairAttempt { + Accepted, + Pending, + Denied(String), +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn pairing_request_ids_are_stable_and_scoped_to_the_device() { + assert_eq!( + pair_request_id("invite", "device"), + pair_request_id("invite", "device") + ); + assert_ne!( + pair_request_id("invite", "device-a"), + pair_request_id("invite", "device-b") + ); + } +} diff --git a/crates/backend/src/devices/store.rs b/crates/backend/src/devices/store.rs new file mode 100644 index 0000000..ccc4630 --- /dev/null +++ b/crates/backend/src/devices/store.rs @@ -0,0 +1,875 @@ +use super::*; +impl DeviceSync { + pub(super) fn ensure_identity(&self) -> Result { + let conn = lock(&self.conn); + if let (Some(device_id), Some(group_id), Some(name)) = ( + get_meta(&conn, "device_id")?, + get_meta(&conn, "group_id")?, + get_meta(&conn, "device_name")?, + ) { + return Ok(Identity { + device_id, + group_id, + name, + }); + } + let seed = random_hex(32); + let digest = hash_secret(&seed); + let device_id = format!("dev_{}", &digest[..24]); + let group_id = format!("grp_{}", &hash_secret(&device_id)[..24]); + let name = format!("Furumi on {}", std::env::consts::OS); + set_meta(&conn, "device_id", &device_id)?; + set_meta(&conn, "device_secret", &seed)?; + set_meta(&conn, "group_id", &group_id)?; + set_meta(&conn, "device_name", &name)?; + set_meta(&conn, "local_seq", "0")?; + set_meta(&conn, "last_hlc_ms", "0")?; + conn.execute( + "INSERT INTO sync_devices + (device_id, name, client_version, protocol_version, trusted_at_ms, last_seen_ms) + VALUES (?1, ?2, ?3, ?4, ?5, ?5) + ON CONFLICT(device_id) DO UPDATE SET name = excluded.name, + client_version = excluded.client_version, + protocol_version = excluded.protocol_version, + trusted_at_ms = COALESCE(sync_devices.trusted_at_ms, excluded.trusted_at_ms)", + params![ + device_id, + name, + CLIENT_VERSION, + DEVICE_SYNC_PROTOCOL_VERSION, + now_ms() + ], + )?; + Ok(Identity { + device_id, + group_id, + name, + }) + } + + pub(super) fn set_group_id(&self, group_id: &str) -> Result<()> { + let conn = lock(&self.conn); + set_meta(&conn, "group_id", group_id) + } + + pub(super) fn set_meta(&self, key: &str, value: &str) -> Result<()> { + set_meta(&lock(&self.conn), key, value) + } + + pub(super) fn own_profile(&self, ticket: &str) -> Result { + let identity = self.ensure_identity()?; + Ok(DeviceProfileWire { + device_id: identity.device_id, + name: identity.name, + client_version: CLIENT_VERSION.into(), + protocol_version: DEVICE_SYNC_PROTOCOL_VERSION, + endpoint_id: ticket_endpoint_id(ticket).unwrap_or_default(), + endpoint_ticket: ticket.into(), + revoked: false, + revoke_cutoff_seq: None, + updated_at_ms: now_ms(), + }) + } + + pub(super) fn active_device_count(&self) -> Result { + let count = lock(&self.conn).query_row( + "SELECT COUNT(*) FROM sync_devices + WHERE trusted_at_ms IS NOT NULL AND revoked_at_ms IS NULL", + [], + |row| row.get::<_, i64>(0), + )?; + Ok(usize::try_from(count.max(0)).unwrap_or(usize::MAX)) + } + + pub(super) fn status_inner(&self) -> Result { + let identity = self.ensure_identity()?; + let conn = lock(&self.conn); + let now = now_ms(); + let devices = { + let mut stmt = conn.prepare( + "SELECT device_id, name, client_version, last_seen_ms + FROM sync_devices + WHERE trusted_at_ms IS NOT NULL AND revoked_at_ms IS NULL + ORDER BY name COLLATE NOCASE, device_id", + )?; + stmt.query_map([], |row| { + let id: String = row.get(0)?; + let last_seen: Option = row.get(3)?; + Ok(DeviceRow { + is_self: id == identity.device_id, + online: id == identity.device_id + || last_seen.is_some_and(|seen| now.saturating_sub(seen) <= ONLINE_TTL_MS), + id, + name: row.get(1)?, + client_version: row.get(2)?, + revoked: false, + }) + })? + .collect::>>()? + }; + let pending = { + let mut stmt = conn.prepare( + "SELECT request_id, device_id, name, client_version, + requester_group_id, requester_group_active_devices + FROM sync_pending_pairing WHERE status = 'pending' + ORDER BY created_at_ms", + )?; + stmt.query_map([], |row| { + Ok(PendingPairing { + request_id: row.get(0)?, + device_id: row.get(1)?, + name: row.get(2)?, + client_version: row.get(3)?, + requester_group_id: row.get(4)?, + requester_group_active_devices: usize::try_from(row.get::<_, i64>(5)?.max(0)) + .unwrap_or(usize::MAX), + }) + })? + .collect::>>()? + }; + Ok(Status { + this_device_id: identity.device_id, + this_device_name: identity.name, + group_id: identity.group_id, + devices, + pending, + last_sync: get_meta(&conn, "last_sync")?, + error: get_meta(&conn, "last_error")?, + }) + } + + pub(super) fn device_profiles(&self) -> Result> { + let conn = lock(&self.conn); + let mut stmt = conn.prepare( + "SELECT device_id, name, client_version, protocol_version, endpoint_id, + endpoint_ticket, revoked_at_ms IS NOT NULL, revoke_cutoff_seq, + MAX(COALESCE(last_seen_ms, 0), COALESCE(trusted_at_ms, 0), + COALESCE(revoked_at_ms, 0)) + FROM sync_devices WHERE trusted_at_ms IS NOT NULL", + )?; + Ok(stmt + .query_map([], |row| { + Ok(DeviceProfileWire { + device_id: row.get(0)?, + name: row.get(1)?, + client_version: row.get(2)?, + protocol_version: row.get::<_, u16>(3)?, + endpoint_id: row.get(4)?, + endpoint_ticket: row.get(5)?, + revoked: row.get::<_, i64>(6)? != 0, + revoke_cutoff_seq: row.get(7)?, + updated_at_ms: row.get(8)?, + }) + })? + .collect::>>()?) + } + + pub(super) fn apply_device_profiles(&self, profiles: &[DeviceProfileWire]) -> Result<()> { + for profile in profiles { + self.apply_device_profile(profile, false)?; + } + Ok(()) + } + + pub(super) fn apply_device_profile( + &self, + profile: &DeviceProfileWire, + trusted: bool, + ) -> Result<()> { + if profile.device_id == self.ensure_identity()?.device_id { + return Ok(()); + } + let now = now_ms(); + lock(&self.conn).execute( + "INSERT INTO sync_devices + (device_id, name, client_version, protocol_version, endpoint_id, + endpoint_ticket, trusted_at_ms, last_seen_ms, revoked_at_ms, + revoke_cutoff_seq) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10) + ON CONFLICT(device_id) DO UPDATE SET + name = CASE WHEN excluded.last_seen_ms >= COALESCE(sync_devices.last_seen_ms, 0) + THEN excluded.name ELSE sync_devices.name END, + client_version = excluded.client_version, + protocol_version = excluded.protocol_version, + endpoint_id = CASE WHEN excluded.endpoint_id != '' THEN excluded.endpoint_id + ELSE sync_devices.endpoint_id END, + endpoint_ticket = CASE WHEN excluded.endpoint_ticket != '' THEN excluded.endpoint_ticket + ELSE sync_devices.endpoint_ticket END, + trusted_at_ms = COALESCE(sync_devices.trusted_at_ms, excluded.trusted_at_ms), + last_seen_ms = MAX(COALESCE(sync_devices.last_seen_ms, 0), excluded.last_seen_ms), + revoked_at_ms = CASE WHEN excluded.revoked_at_ms IS NOT NULL + THEN excluded.revoked_at_ms ELSE sync_devices.revoked_at_ms END, + revoke_cutoff_seq = COALESCE(excluded.revoke_cutoff_seq, + sync_devices.revoke_cutoff_seq)", + params![ + profile.device_id, + profile.name, + profile.client_version, + profile.protocol_version, + profile.endpoint_id, + profile.endpoint_ticket, + trusted.then_some(now), + profile.updated_at_ms.max(now), + profile.revoked.then_some(profile.updated_at_ms.max(now)), + profile.revoke_cutoff_seq, + ], + )?; + Ok(()) + } + + pub(super) fn mark_seen(&self, device_id: &str, endpoint_id: &str) -> Result<()> { + lock(&self.conn).execute( + "UPDATE sync_devices SET last_seen_ms = ?2, + endpoint_id = CASE WHEN ?3 != '' THEN ?3 ELSE endpoint_id END + WHERE device_id = ?1", + params![device_id, now_ms(), endpoint_id], + )?; + Ok(()) + } + + pub(super) fn record_op(&self, payload: SyncOpPayload) -> Result<()> { + let op = { + let conn = lock(&self.conn); + let identity = Self::ensure_identity_with_conn(&conn)?; + let seq = get_meta(&conn, "local_seq")? + .and_then(|value| value.parse::().ok()) + .unwrap_or(0) + .saturating_add(1); + let previous_hlc = get_meta(&conn, "last_hlc_ms")? + .and_then(|value| value.parse::().ok()) + .unwrap_or(0); + let hlc_ms = now_ms().max(previous_hlc.saturating_add(1)); + set_meta(&conn, "local_seq", &seq.to_string())?; + set_meta(&conn, "last_hlc_ms", &hlc_ms.to_string())?; + SyncOpWire { + op_id: format!("{}:{seq}", identity.device_id), + origin_device_id: identity.device_id, + seq, + hlc_ms, + payload, + } + }; + self.store_and_apply_op(&op)?; + self.request_sync(); + self.notify(); + Ok(()) + } + + pub(super) fn ensure_identity_with_conn(conn: &Connection) -> Result { + Ok(Identity { + device_id: get_meta(conn, "device_id")?.context("missing device id")?, + group_id: get_meta(conn, "group_id")?.context("missing device group")?, + name: get_meta(conn, "device_name")?.context("missing device name")?, + }) + } + + pub(super) fn store_and_apply_op(&self, op: &SyncOpWire) -> Result<()> { + let inserted = lock(&self.conn).execute( + "INSERT OR IGNORE INTO sync_ops + (op_id, origin_device_id, seq, kind, payload_json, hlc_ms, + received_at_ms, tombstone) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)", + params![ + op.op_id, + op.origin_device_id, + op.seq, + payload_kind(&op.payload), + serde_json::to_string(&op.payload)?, + op.hlc_ms, + now_ms(), + i64::from(op.payload.is_tombstone()), + ], + )?; + if inserted == 0 { + return Ok(()); + } + lock(&self.conn).execute( + "INSERT INTO sync_vectors (device_id, max_seq) VALUES (?1, ?2) + ON CONFLICT(device_id) DO UPDATE SET max_seq = MAX(max_seq, excluded.max_seq)", + params![op.origin_device_id, op.seq], + )?; + self.apply_op(op) + } + + pub(super) fn apply_ops(&self, ops: Vec) -> Result<()> { + for op in ops { + if self.should_accept_op(&op)? { + self.store_and_apply_op(&op)?; + } + } + self.notify(); + Ok(()) + } + + pub(super) fn should_accept_op(&self, op: &SyncOpWire) -> Result { + if op.origin_device_id == self.ensure_identity()?.device_id { + return Ok(true); + } + let conn = lock(&self.conn); + let row = conn + .query_row( + "SELECT trusted_at_ms IS NOT NULL, revoked_at_ms IS NOT NULL, + COALESCE(revoke_cutoff_seq, 0) + FROM sync_devices WHERE device_id = ?1", + [&op.origin_device_id], + |row| { + Ok(( + row.get::<_, i64>(0)? != 0, + row.get::<_, i64>(1)? != 0, + row.get::<_, i64>(2)?, + )) + }, + ) + .optional()?; + Ok(row.is_some_and(|(trusted, revoked, cutoff)| trusted && (!revoked || op.seq <= cutoff))) + } + + pub(super) fn vector(&self) -> Result> { + let conn = lock(&self.conn); + let mut stmt = conn.prepare("SELECT device_id, max_seq FROM sync_vectors")?; + Ok(stmt + .query_map([], |row| Ok((row.get(0)?, row.get(1)?)))? + .collect::>>()?) + } + + pub(super) fn ops_for_peer(&self, peer: &str) -> Result> { + let conn = lock(&self.conn); + let mut stmt = conn.prepare( + "SELECT payload_json, op_id, origin_device_id, seq, hlc_ms + FROM sync_ops o + WHERE seq > COALESCE((SELECT max_seq FROM sync_peer_acks a + WHERE a.peer_device_id = ?1 + AND a.origin_device_id = o.origin_device_id), 0) + AND (kind != 'playback_command' OR hlc_ms >= ?2) + ORDER BY received_at_ms, origin_device_id, seq LIMIT ?3", + )?; + Ok(stmt + .query_map( + params![ + peer, + now_ms().saturating_sub(PLAYBACK_COMMAND_TTL_MS), + i64::try_from(MAX_OPS_PER_BATCH).unwrap_or(i64::MAX) + ], + |row| { + let payload: String = row.get(0)?; + Ok(SyncOpWire { + op_id: row.get(1)?, + origin_device_id: row.get(2)?, + seq: row.get(3)?, + hlc_ms: row.get(4)?, + payload: serde_json::from_str(&payload).map_err(|error| { + rusqlite::Error::FromSqlConversionFailure( + 0, + rusqlite::types::Type::Text, + Box::new(error), + ) + })?, + }) + }, + )? + .collect::>>()?) + } + + pub(super) fn note_peer_vector( + &self, + peer: &str, + vector: &BTreeMap, + ) -> Result<()> { + let conn = lock(&self.conn); + for (origin, seq) in vector { + conn.execute( + "INSERT INTO sync_peer_acks + (peer_device_id, origin_device_id, max_seq, updated_at_ms) + VALUES (?1, ?2, ?3, ?4) + ON CONFLICT(peer_device_id, origin_device_id) DO UPDATE SET + max_seq = MAX(max_seq, excluded.max_seq), + updated_at_ms = excluded.updated_at_ms", + params![peer, origin, seq, now_ms()], + )?; + } + Ok(()) + } +} + +impl DeviceSync { + pub(super) fn apply_op(&self, op: &SyncOpWire) -> Result<()> { + match &op.payload { + SyncOpPayload::TrackLikeSet { + content_id, + liked, + fed, + } => self.apply_like(content_id, *liked, fed.as_ref(), op.hlc_ms, &op.op_id)?, + SyncOpPayload::PlaylistCreated { playlist_id, title } + | SyncOpPayload::PlaylistRenamed { playlist_id, title } => { + self.apply_playlist(playlist_id, title, false, op.hlc_ms, &op.op_id)?; + } + SyncOpPayload::PlaylistDeleted { playlist_id } => { + self.apply_playlist(playlist_id, "", true, op.hlc_ms, &op.op_id)?; + } + SyncOpPayload::PlaylistTrackAdded { + playlist_id, + content_id, + position, + fed, + } => self.apply_playlist_item( + playlist_id, + content_id, + true, + *position, + fed.as_ref(), + op.hlc_ms, + &op.op_id, + )?, + SyncOpPayload::PlaylistTrackRemoved { + playlist_id, + content_id, + } => self.apply_playlist_item( + playlist_id, + content_id, + false, + 0, + None, + op.hlc_ms, + &op.op_id, + )?, + SyncOpPayload::DeviceProfileSet { + name, + client_version, + endpoint_ticket, + endpoint_id, + } => self.apply_device_profile( + &DeviceProfileWire { + device_id: op.origin_device_id.clone(), + name: name.clone(), + client_version: client_version.clone(), + protocol_version: DEVICE_SYNC_PROTOCOL_VERSION, + endpoint_id: endpoint_id.clone(), + endpoint_ticket: endpoint_ticket.clone(), + revoked: false, + revoke_cutoff_seq: None, + updated_at_ms: op.hlc_ms, + }, + false, + )?, + SyncOpPayload::DeviceTrusted { target_device_id } => { + lock(&self.conn).execute( + "UPDATE sync_devices SET trusted_at_ms = MAX(COALESCE(trusted_at_ms, 0), ?2), + revoked_at_ms = CASE WHEN COALESCE(revoked_at_ms, 0) <= ?2 + THEN NULL ELSE revoked_at_ms END + WHERE device_id = ?1", + params![target_device_id, op.hlc_ms], + )?; + } + SyncOpPayload::DeviceRevoked { + target_device_id, + target_max_seq_seen, + } => { + lock(&self.conn).execute( + "UPDATE sync_devices SET revoked_at_ms = ?2, revoked_by = ?3, + revoke_cutoff_seq = ?4 WHERE device_id = ?1", + params![ + target_device_id, + op.hlc_ms, + op.origin_device_id, + target_max_seq_seen + ], + )?; + } + SyncOpPayload::PlaybackCommand { + target_device_id, + command, + } => self.apply_playback_command(target_device_id, command, &op.op_id)?, + SyncOpPayload::ListenRecorded { event } => { + self.library + .apply_listen_event(event, &op.origin_device_id)?; + } + } + Ok(()) + } + + pub(super) fn apply_like( + &self, + content_id: &str, + liked: bool, + fed: Option<&SyncedFedTrack>, + hlc_ms: i64, + op_id: &str, + ) -> Result<()> { + let Some(content_id) = music_dht::normalize_content_id(content_id) else { + return Ok(()); + }; + if !self.lww_wins("sync_state_likes", "content_id", &content_id, hlc_ms, op_id)? { + return Ok(()); + } + lock(&self.conn).execute( + "INSERT INTO sync_state_likes (content_id, liked, hlc_ms, op_id) + VALUES (?1, ?2, ?3, ?4) + ON CONFLICT(content_id) DO UPDATE SET liked = excluded.liked, + hlc_ms = excluded.hlc_ms, op_id = excluded.op_id", + params![content_id, i64::from(liked), hlc_ms, op_id], + )?; + if let Some(track_id) = self.library.track_id_by_content_id(&content_id)? { + self.library.set_synced_like(track_id, liked, hlc_ms)?; + if liked { + self.library.remove_fed_like_by_content_id(&content_id)?; + } + } else if liked { + if let Some(fed) = fed { + self.library + .upsert_synced_fed_like(&to_library_fed(fed), hlc_ms)?; + } + } else { + self.library.remove_fed_like_by_content_id(&content_id)?; + } + self.notify_library(); + Ok(()) + } + + pub(super) fn apply_playlist( + &self, + playlist_id: &str, + title: &str, + deleted: bool, + hlc_ms: i64, + op_id: &str, + ) -> Result<()> { + if !self.lww_wins( + "sync_state_playlists", + "playlist_id", + playlist_id, + hlc_ms, + op_id, + )? { + return Ok(()); + } + lock(&self.conn).execute( + "INSERT INTO sync_state_playlists + (playlist_id, title, deleted, hlc_ms, op_id) + VALUES (?1, ?2, ?3, ?4, ?5) + ON CONFLICT(playlist_id) DO UPDATE SET title = excluded.title, + deleted = excluded.deleted, hlc_ms = excluded.hlc_ms, + op_id = excluded.op_id", + params![playlist_id, title, i64::from(deleted), hlc_ms, op_id], + )?; + if deleted { + self.library.delete_playlist_by_sync_id(playlist_id)?; + } else if !title.trim().is_empty() { + self.library.upsert_synced_playlist(playlist_id, title)?; + } + self.notify_library(); + Ok(()) + } + + #[allow(clippy::too_many_arguments)] + pub(super) fn apply_playlist_item( + &self, + playlist_id: &str, + content_id: &str, + present: bool, + position: i64, + fed: Option<&SyncedFedTrack>, + hlc_ms: i64, + op_id: &str, + ) -> Result<()> { + let Some(content_id) = music_dht::normalize_content_id(content_id) else { + return Ok(()); + }; + let current = lock(&self.conn) + .query_row( + "SELECT hlc_ms, op_id FROM sync_state_playlist_items + WHERE playlist_id = ?1 AND content_id = ?2", + params![playlist_id, content_id], + |row| Ok((row.get::<_, i64>(0)?, row.get::<_, String>(1)?)), + ) + .optional()?; + if current.is_some_and(|(current_hlc, current_op)| { + (current_hlc, current_op.as_str()) >= (hlc_ms, op_id) + }) { + return Ok(()); + } + lock(&self.conn).execute( + "INSERT INTO sync_state_playlist_items + (playlist_id, content_id, present, position, hlc_ms, op_id) + VALUES (?1, ?2, ?3, ?4, ?5, ?6) + ON CONFLICT(playlist_id, content_id) DO UPDATE SET + present = excluded.present, position = excluded.position, + hlc_ms = excluded.hlc_ms, op_id = excluded.op_id", + params![ + playlist_id, + content_id, + i64::from(present), + position, + hlc_ms, + op_id + ], + )?; + if present { + self.library + .add_content_id_to_synced_playlist(playlist_id, &content_id)?; + if let Some(fed) = fed { + self.library.upsert_fed_playlist_track( + playlist_id, + &to_library_fed(fed), + position, + )?; + } else if let Some(fed) = self.library.fed_like_by_content_id(&content_id)? { + self.library + .upsert_fed_playlist_track(playlist_id, &fed, position)?; + } + } else { + self.library + .remove_content_id_from_synced_playlist(playlist_id, &content_id)?; + } + self.notify_library(); + Ok(()) + } + + pub(super) fn lww_wins( + &self, + table: &str, + key_name: &str, + key: &str, + hlc_ms: i64, + op_id: &str, + ) -> Result { + let sql = format!("SELECT hlc_ms, op_id FROM {table} WHERE {key_name} = ?1"); + let current = lock(&self.conn) + .query_row(&sql, [key], |row| { + Ok((row.get::<_, i64>(0)?, row.get::<_, String>(1)?)) + }) + .optional()?; + Ok(current.is_none_or(|(current_hlc, current_op)| { + (hlc_ms, op_id) > (current_hlc, current_op.as_str()) + })) + } + + pub(super) fn apply_playback_command( + &self, + target_device_id: &str, + command: &PlaybackCommand, + op_id: &str, + ) -> Result<()> { + if target_device_id != self.ensure_identity()?.device_id { + return Ok(()); + } + let inserted = lock(&self.conn).execute( + "INSERT OR IGNORE INTO sync_playback_applied (op_id, applied_at_ms) + VALUES (?1, ?2)", + params![op_id, now_ms()], + )?; + if inserted > 0 { + let _ = self + .events + .try_send(InternalEvent::DevicePlaybackCommand(command.clone())); + } + Ok(()) + } + + pub(super) fn apply_playback_snapshot(&self, snapshot: PlaybackSnapshot) { + if self + .ensure_identity() + .is_ok_and(|identity| identity.device_id == snapshot.device_id) + { + return; + } + let changed = { + let mut playback = lock(&self.playback); + let changed = playback + .remote + .get(&snapshot.device_id) + .is_none_or(|current| snapshot.updated_at_ms > current.updated_at_ms); + if changed { + playback + .remote + .insert(snapshot.device_id.clone(), snapshot.clone()); + } + changed + }; + if changed { + let _ = self + .events + .try_send(InternalEvent::DevicePlaybackSnapshot(snapshot)); + } + } + + #[allow( + clippy::too_many_lines, + reason = "the snapshot is one transactional projection of all synchronized entities" + )] + pub(super) fn snapshot(&self) -> Result { + let conn = lock(&self.conn); + let mut snapshot = SyncSnapshot::default(); + { + let mut stmt = + conn.prepare("SELECT content_id, liked, hlc_ms, op_id FROM sync_state_likes")?; + let rows = stmt.query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, i64>(1)? != 0, + row.get::<_, i64>(2)?, + row.get::<_, String>(3)?, + )) + })?; + for row in rows { + let (content_id, liked, hlc_ms, op_id) = row?; + if liked { + snapshot.likes.push(SnapshotLike { + content_id, + hlc_ms, + op_id, + fed: None, + }); + } else { + snapshot.unlikes.push(SnapshotLikeTombstone { + content_id, + hlc_ms, + op_id, + }); + } + } + } + let mut playlists = BTreeMap::::new(); + { + let mut stmt = conn.prepare( + "SELECT playlist_id, title, deleted, hlc_ms, op_id + FROM sync_state_playlists", + )?; + let rows = stmt.query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + row.get::<_, i64>(2)? != 0, + row.get::<_, i64>(3)?, + row.get::<_, String>(4)?, + )) + })?; + for row in rows { + let (playlist_id, title, deleted, hlc_ms, op_id) = row?; + if deleted { + snapshot.deleted_playlists.push(SnapshotPlaylistTombstone { + playlist_id, + hlc_ms, + op_id, + }); + } else { + playlists.insert( + playlist_id.clone(), + SnapshotPlaylist { + playlist_id, + title, + hlc_ms, + op_id, + items: Vec::new(), + }, + ); + } + } + } + { + let mut stmt = conn.prepare( + "SELECT playlist_id, content_id, present, position, hlc_ms, op_id + FROM sync_state_playlist_items", + )?; + let rows = stmt.query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + row.get::<_, i64>(2)? != 0, + row.get::<_, i64>(3)?, + row.get::<_, i64>(4)?, + row.get::<_, String>(5)?, + )) + })?; + for row in rows { + let (playlist_id, content_id, present, position, hlc_ms, op_id) = row?; + if present { + if let Some(playlist) = playlists.get_mut(&playlist_id) { + playlist.items.push(SnapshotPlaylistItem { + content_id, + position, + hlc_ms, + op_id, + fed: None, + }); + } + } else { + snapshot + .removed_playlist_items + .push(SnapshotPlaylistItemTombstone { + playlist_id, + content_id, + hlc_ms, + op_id, + }); + } + } + } + snapshot.playlists = playlists.into_values().collect(); + Ok(snapshot) + } + + pub(super) fn apply_snapshot(&self, snapshot: SyncSnapshot) -> Result<()> { + for like in snapshot.likes { + self.apply_like( + &like.content_id, + true, + like.fed.as_ref(), + like.hlc_ms, + &like.op_id, + )?; + } + for like in snapshot.unlikes { + self.apply_like(&like.content_id, false, None, like.hlc_ms, &like.op_id)?; + } + for playlist in snapshot.playlists { + self.apply_playlist( + &playlist.playlist_id, + &playlist.title, + false, + playlist.hlc_ms, + &playlist.op_id, + )?; + for item in playlist.items { + self.apply_playlist_item( + &playlist.playlist_id, + &item.content_id, + true, + item.position, + item.fed.as_ref(), + item.hlc_ms, + &item.op_id, + )?; + } + } + for playlist in snapshot.deleted_playlists { + self.apply_playlist( + &playlist.playlist_id, + "", + true, + playlist.hlc_ms, + &playlist.op_id, + )?; + } + for item in snapshot.removed_playlist_items { + self.apply_playlist_item( + &item.playlist_id, + &item.content_id, + false, + 0, + None, + item.hlc_ms, + &item.op_id, + )?; + } + self.notify(); + Ok(()) + } + + pub(super) fn notify(&self) { + let _ = self.events.try_send(InternalEvent::DevicesChanged); + } + + pub(super) fn notify_library(&self) { + let _ = self.events.try_send(InternalEvent::DeviceLibraryChanged); + } +} diff --git a/crates/backend/src/federation.rs b/crates/backend/src/federation.rs new file mode 100644 index 0000000..f7805cb --- /dev/null +++ b/crates/backend/src/federation.rs @@ -0,0 +1,858 @@ +//! Federation lifecycle, DHT search and catalog artwork fetching. + +use std::collections::{HashMap, HashSet}; +use std::hash::{DefaultHasher, Hash, Hasher}; +use std::path::PathBuf; +use std::sync::Arc; + +use anyhow::{Context, Result}; +use furumi_backend_api::{FederationDebugSnapshot, SearchResults, SearchStats}; +use furumi_domain::{ + Artist, ArtistKey, ArtistRef, Artwork, AudioSource, CatalogSource, ContentId, Release, + ReleaseKey, Track, TrackKey, +}; +use music_dht::catalog::{ + CATALOG_ALPN, CatalogArtist, CatalogImageHeader, CatalogRequest, CatalogResponse, +}; +use music_dht::{ + EndpointId, ItemKind, ItemSpec, LibraryItem, MusicDhtConfig, MusicDhtService, NetworkId, + RendezvousConfig, +}; +use serde::{Deserialize, Serialize}; +use tokio::io::{AsyncRead, AsyncReadExt as _}; + +pub const AUDIO_ALPN: &[u8] = b"furumi-fd/audio/1"; +pub const AUDIO_PROTOCOL_VERSION: u16 = 1; +const STREAM_BUFFER: u64 = 2 * 1024 * 1024; + +#[derive(Serialize)] +struct AudioRequest { + item_id: String, + offset: u64, + want_cover: bool, + metadata_only: bool, +} +#[derive(Deserialize)] +struct AudioHeader { + ok: bool, + #[serde(default)] + error: Option, + #[serde(default)] + mime_type: String, + #[serde(default)] + total_size: u64, + #[serde(default)] + cover_size: u64, + #[serde(default)] + artist_image_size: u64, + #[serde(default)] + metadata: Option, +} +#[derive(Clone, Default, Deserialize)] +pub struct TrackMetadata { + #[serde(default)] + pub title: String, + #[serde(default)] + pub artists: Vec, + #[serde(default)] + pub featured_artists: Vec, + #[serde(default)] + pub album_artists: Vec, + #[serde(default)] + pub release_title: String, + #[serde(default)] + pub release_type: Option, + pub year: Option, + pub track_number: Option, + pub disc_number: Option, + pub duration_seconds: Option, + pub audio_format: Option, + pub audio_bitrate: Option, + pub audio_sample_rate: Option, + pub audio_bit_depth: Option, +} +pub enum StreamEvent { + Ready(crate::streaming::GrowingFileReader, String), + Complete(PathBuf, Box>), + Failed(String), +} + +const MAX_IMAGE_BYTES: u64 = 16 * 1024 * 1024; +const IMAGE_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(4); + +pub struct Client { + service: Arc, + media_dir: PathBuf, +} + +impl Client { + pub async fn start(data_dir: PathBuf, media_dir: PathBuf, network: &str) -> Result> { + tokio::fs::create_dir_all(&data_dir).await?; + tokio::fs::create_dir_all(&media_dir).await?; + let config = MusicDhtConfig::builder() + .data_dir(data_dir) + .network_id(NetworkId::from_name(network)) + .rendezvous(RendezvousConfig::default()) + .stream_protocol(CATALOG_ALPN) + .stream_protocol(AUDIO_ALPN) + .stream_protocol(music_dht::device_sync::SYNC_ALPN_V1) + .stream_protocol(music_dht::device_sync::SYNC_ALPN_V2) + .build() + .context("invalid federation configuration")?; + let (service, mut events) = MusicDhtService::start(config) + .await + .context("starting federation node")?; + tokio::spawn(async move { while events.recv().await.is_some() {} }); + Ok(Arc::new(Self { + service: Arc::new(service), + media_dir, + })) + } + + pub fn service(&self) -> Arc { + Arc::clone(&self.service) + } + + pub async fn debug_snapshot(&self) -> FederationDebugSnapshot { + let stored_dht_records = self.service.dht_record_count().await.ok(); + let published_items = self + .service + .list_local_items() + .await + .map_or(0, |items| items.len()); + FederationDebugSnapshot { + running: true, + endpoint_id: self.service.endpoint_id().to_string(), + dht_node_id: self.service.node_id().to_string(), + connected_peers: self.service.connected_peers().len(), + known_contacts: self.service.known_peers().len(), + stored_dht_records, + published_items, + error: None, + } + } + + /// Resolves album artwork for a queue item independently of the screen + /// from which the track was enqueued. + pub async fn artwork_for_track(&self, track: &Track) -> Option { + let peer_id = match &track.audio_source { + AudioSource::Federation { peer_id, .. } if !peer_id.is_empty() => peer_id.as_str(), + _ => track.key.federation_id()?.0, + }; + let owner = peer_id.parse::().ok()?; + let artist = track + .artists + .first() + .map(|artist| artist.name.as_str()) + .or_else(|| (!track.artist.is_empty()).then_some(track.artist.as_str()))?; + if track.release.is_empty() { + return None; + } + self.cached_image( + owner, + artist, + Some(&track.release), + &format!("release-{peer_id}-{artist}-{}", track.release), + ) + .await + } + + pub async fn search(&self, query: &str) -> Result<(SearchResults, SearchStats)> { + let outcome = self.service.search_network(query).await?; + let own = self.service.endpoint_id(); + let mut results = convert_items(&outcome.network_results, own); + self.fetch_artwork(&mut results).await; + let stats = SearchStats { + tracks: results.tracks.len(), + artists: results.artists.len(), + peers_queried: outcome.queried_nodes, + duration_ms: u64::try_from(outcome.duration.as_millis()).unwrap_or(u64::MAX), + }; + Ok((results, stats)) + } + + /// Resolves a portable queue entry when another connected device only + /// knows its stable audio content id. + pub async fn track_by_content_id(&self, content_id: &str) -> Result { + let outcome = self.service.search_content_id(content_id).await?; + let own = self.service.endpoint_id(); + let items = outcome + .local_results + .into_iter() + .chain(outcome.network_results) + .collect::>(); + convert_items(&items, own) + .tracks + .into_iter() + .next() + .context("no federation peer currently publishes this track") + } + + pub async fn publish(&self, specs: Vec) -> Result<()> { + self.service.sync_library(specs).await?; + Ok(()) + } + + pub async fn artist_card(&self, name: &str) -> Result<(SearchResults, SearchStats)> { + let started = std::time::Instant::now(); + let outcome = self.service.search_network(name).await?; + let own = self.service.endpoint_id(); + let normalized = music_dht::normalize_name(name); + let owners = outcome + .network_results + .iter() + .filter(|item| { + item.owner != own + && ((item.kind == ItemKind::Artist && item.normalized_name == normalized) + || item + .artist_names + .iter() + .chain(item.featured_artist_names.iter()) + .any(|artist| music_dht::normalize_name(artist) == normalized)) + }) + .map(|item| item.owner) + .collect::>(); + let mut catalogs = Vec::new(); + for owner in owners { + if let Ok(Ok(catalog)) = tokio::time::timeout( + std::time::Duration::from_secs(5), + fetch_catalog(&self.service, owner, name), + ) + .await + { + catalogs.push((owner.to_string(), catalog)); + } + } + let mut result = card_results(name, catalogs); + self.fetch_artwork(&mut result).await; + let stats = SearchStats { + tracks: result.tracks.len(), + artists: result.artists.len(), + peers_queried: outcome.queried_nodes, + duration_ms: u64::try_from(started.elapsed().as_millis()).unwrap_or(u64::MAX), + }; + Ok((result, stats)) + } + + pub async fn stream_track( + &self, + peer: &str, + item_id: &str, + directory: &std::path::Path, + stem: &str, + events: tokio::sync::mpsc::Sender, + ) -> Result<()> { + use tokio::io::AsyncWriteExt as _; + let owner: EndpointId = peer.parse().context("invalid peer id")?; + tokio::fs::create_dir_all(directory).await?; + let mut stream = self.service.open_stream(owner, AUDIO_ALPN).await?; + let mut request = serde_json::to_vec(&AudioRequest { + item_id: item_id.into(), + offset: 0, + want_cover: false, + metadata_only: false, + })?; + request.push(b'\n'); + stream.send.write_all(&request).await?; + stream.send.finish()?; + let header: AudioHeader = serde_json::from_slice(&read_line(&mut stream.recv).await?)?; + anyhow::ensure!( + header.ok, + "{}", + header.error.unwrap_or_else(|| "peer refused audio".into()) + ); + anyhow::ensure!( + header.cover_size == 0 && header.artist_image_size == 0, + "unexpected image data in audio stream" + ); + let extension = match header.mime_type.as_str() { + "audio/mpeg" => "mp3", + "audio/flac" | "audio/x-flac" => "flac", + "audio/ogg" => "ogg", + "audio/opus" => "opus", + "audio/wav" | "audio/x-wav" => "wav", + "audio/mp4" | "audio/x-m4a" => "m4a", + "audio/aac" => "aac", + _ => "bin", + }; + let final_path = directory.join(format!("{stem}.{extension}")); + let part_path = directory.join(format!(".{stem}.{extension}.part")); + let mut file = tokio::fs::File::create(&part_path).await?; + let (reader, writer) = crate::streaming::growing_file(&part_path)?; + let mut reader = Some(reader); + let mut started = false; + let mut received = 0u64; + let threshold = header.total_size.clamp(1, STREAM_BUFFER); + let mut chunk = vec![0; 64 * 1024]; + while let Some(n) = stream.recv.read(&mut chunk).await? { + file.write_all(&chunk[..n]).await?; + received += n as u64; + writer.add_available(n as u64); + if !started + && received >= threshold + && let Some(reader) = reader.take() + { + let _ = events + .send(StreamEvent::Ready(reader, header.mime_type.clone())) + .await; + started = true; + } + } + if !started + && received > 0 + && let Some(reader) = reader.take() + { + let _ = events + .send(StreamEvent::Ready(reader, header.mime_type.clone())) + .await; + } + writer.finish(); + file.flush().await?; + drop(file); + anyhow::ensure!( + header.total_size == 0 || received == header.total_size, + "incomplete audio download: {received}/{}", + header.total_size + ); + tokio::fs::rename(&part_path, &final_path).await?; + let _ = events + .send(StreamEvent::Complete(final_path, Box::new(header.metadata))) + .await; + Ok(()) + } + + async fn fetch_artwork(&self, results: &mut SearchResults) { + for artist in &mut results.artists { + let CatalogSource::Federation { peer_id } = &artist.source else { + continue; + }; + let Ok(owner) = peer_id.parse::() else { + continue; + }; + if let Some(path) = self + .cached_image( + owner, + &artist.name, + None, + &format!("artist-{peer_id}-{}", artist.name), + ) + .await + { + artist.artwork.uri = Some(path.to_string_lossy().into_owned()); + } + } + for release in &mut results.releases { + let CatalogSource::Federation { peer_id } = &release.source else { + continue; + }; + let Some(artist) = release.artists.first() else { + continue; + }; + let Ok(owner) = peer_id.parse::() else { + continue; + }; + if let Some(path) = self + .cached_image( + owner, + &artist.name, + Some(&release.title), + &format!("release-{peer_id}-{}-{}", artist.name, release.title), + ) + .await + { + let uri = path.to_string_lossy().into_owned(); + release.artwork.uri = Some(uri.clone()); + for track in &mut release.tracks { + if track.cover_uri.is_none() { + track.cover_uri = Some(uri.clone()); + } + } + for track in &mut results.tracks { + if track.release == release.title + && track + .artists + .first() + .is_some_and(|candidate| candidate.name == artist.name) + { + track.cover_uri = Some(uri.clone()); + } + } + } + } + for track in &mut results.tracks { + if track.cover_uri.is_some() || track.release.is_empty() { + continue; + } + let AudioSource::Federation { peer_id, .. } = &track.audio_source else { + continue; + }; + let Some(artist) = track.artists.first() else { + continue; + }; + let Ok(owner) = peer_id.parse::() else { + continue; + }; + if let Some(path) = self + .cached_image( + owner, + &artist.name, + Some(&track.release), + &format!("release-{peer_id}-{}-{}", artist.name, track.release), + ) + .await + { + track.cover_uri = Some(path.to_string_lossy().into_owned()); + } + } + } + + async fn cached_image( + &self, + owner: EndpointId, + artist: &str, + release: Option<&str>, + cache_key: &str, + ) -> Option { + let mut hasher = DefaultHasher::new(); + cache_key.hash(&mut hasher); + let base = self.media_dir.join(format!("{:016x}", hasher.finish())); + for extension in ["jpg", "png", "webp", "gif", "bmp"] { + let path = base.with_extension(extension); + if path.is_file() { + return Some(path); + } + } + let fetched = tokio::time::timeout( + IMAGE_TIMEOUT, + fetch_image(&self.service, owner, artist, release), + ) + .await + .ok()? + .ok()?; + let (bytes, extension) = fetched?; + let path = base.with_extension(extension); + tokio::fs::write(&path, bytes).await.ok()?; + Some(path) + } +} + +async fn fetch_catalog( + service: &MusicDhtService, + owner: EndpointId, + artist: &str, +) -> Result { + let mut stream = service.open_stream(owner, CATALOG_ALPN).await?; + let mut request = serde_json::to_vec(&CatalogRequest { + artist: artist.into(), + ..CatalogRequest::default() + })?; + request.push(b'\n'); + stream.send.write_all(&request).await?; + stream.send.finish()?; + let mut payload = Vec::new(); + stream + .recv + .take(4 * 1024 * 1024 + 1) + .read_to_end(&mut payload) + .await?; + anyhow::ensure!( + payload.len() <= 4 * 1024 * 1024, + "catalog response is too large" + ); + let response: CatalogResponse = serde_json::from_slice(&payload)?; + anyhow::ensure!( + response.ok, + "{}", + response.error.unwrap_or_else(|| "catalog rejected".into()) + ); + response.artist.context("empty artist catalog") +} + +#[allow( + clippy::too_many_lines, + reason = "wire catalog conversion is clearest as one pass" +)] +fn card_results(name: &str, catalogs: Vec<(String, CatalogArtist)>) -> SearchResults { + let mut results = SearchResults::default(); + if let Some((peer, _)) = catalogs.first() { + results.artists.push(Artist { + key: ArtistKey::Federation { + peer_id: peer.clone(), + id: music_dht::normalize_name(name), + }, + source: CatalogSource::Federation { + peer_id: peer.clone(), + }, + name: name.into(), + artwork: Artwork::default(), + release_count: 0, + track_count: 0, + }); + } + let mut release_slots = HashMap::::new(); + for (peer, catalog) in catalogs { + let artist_key = ArtistKey::Federation { + peer_id: peer.clone(), + id: music_dht::normalize_name(name), + }; + for remote in catalog.releases { + let normalized = music_dht::normalize_name(&remote.title); + let slot = *release_slots.entry(normalized.clone()).or_insert_with(|| { + results.releases.push(Release { + key: ReleaseKey::Federation { + peer_id: peer.clone(), + id: format!("name:{normalized}"), + }, + source: CatalogSource::Federation { + peer_id: peer.clone(), + }, + title: remote.title.clone(), + artists: vec![ArtistRef { + key: artist_key.clone(), + name: name.into(), + }], + featured_artists: Vec::new(), + release_type: remote.release_type.clone(), + year: remote.year, + artwork: Artwork::default(), + tracks: Vec::new(), + }); + results.releases.len() - 1 + }); + let release = &mut results.releases[slot]; + for item in remote.tracks { + let duplicate = release.tracks.iter().any(|track| { + music_dht::normalize_name(&track.title) + == music_dht::normalize_name(&item.title) + }); + if duplicate || item.item_id.is_empty() { + continue; + } + let content_id = item + .content_id + .as_deref() + .and_then(|id| ContentId::parse(id).ok()); + let artists = artist_refs(&peer, &item.artists); + let featured = artist_refs(&peer, &item.featured_artists); + let track = Track { + key: TrackKey::federation( + peer.clone(), + item.item_id.clone(), + content_id.clone(), + ), + title: item.title, + artist: artist_line(&item.artists, &item.featured_artists), + artists, + featured_artists: featured, + release: release.title.clone(), + release_id: release.key.clone(), + duration_seconds: item.duration_seconds.unwrap_or_default(), + track_number: item + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: item.disc_number.and_then(|value| u32::try_from(value).ok()), + cover_uri: release.artwork.uri.clone(), + audio_format: None, + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::Federation { + peer_id: peer.clone(), + content_id: content_id.unwrap_or_else(|| { + ContentId::parse(format!("b3:{}", "0".repeat(64))) + .expect("valid fallback") + }), + }, + }; + release.tracks.push(track.clone()); + results.tracks.push(track); + } + } + for appearance in catalog.appears_on { + if appearance.track.item_id.is_empty() { + continue; + } + let content_id = appearance + .track + .content_id + .as_deref() + .and_then(|id| ContentId::parse(id).ok()); + let release_key = ReleaseKey::Federation { + peer_id: peer.clone(), + id: format!( + "name:{}", + music_dht::normalize_name(&appearance.release_title) + ), + }; + results.tracks.push(Track { + key: TrackKey::federation( + peer.clone(), + appearance.track.item_id.clone(), + content_id.clone(), + ), + title: appearance.track.title, + artist: artist_line( + &appearance.track.artists, + &appearance.track.featured_artists, + ), + artists: artist_refs(&peer, &appearance.track.artists), + featured_artists: artist_refs(&peer, &appearance.track.featured_artists), + release: appearance.release_title, + release_id: release_key, + duration_seconds: appearance.track.duration_seconds.unwrap_or_default(), + track_number: appearance + .track + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: appearance + .track + .disc_number + .and_then(|value| u32::try_from(value).ok()), + cover_uri: None, + audio_format: None, + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::Federation { + peer_id: peer.clone(), + content_id: content_id.unwrap_or_else(|| { + ContentId::parse(format!("b3:{}", "0".repeat(64))).expect("valid fallback") + }), + }, + }); + } + } + for release in &mut results.releases { + populate_release_contributors(release); + } + if let Some(artist) = results.artists.first_mut() { + artist.release_count = results.releases.len(); + artist.track_count = results.tracks.len(); + } + results +} + +fn populate_release_contributors(release: &mut Release) { + let mut known = release + .artists + .iter() + .chain(release.featured_artists.iter()) + .map(|artist| music_dht::normalize_name(&artist.name)) + .collect::>(); + for artist in release + .tracks + .iter() + .flat_map(|track| track.artists.iter().chain(track.featured_artists.iter())) + { + if known.insert(music_dht::normalize_name(&artist.name)) { + release.featured_artists.push(artist.clone()); + } + } +} + +fn convert_items(items: &[LibraryItem], own: EndpointId) -> SearchResults { + let mut results = SearchResults::default(); + let mut artists = HashMap::<(String, String), Artist>::new(); + let mut releases = HashSet::<(String, String)>::new(); + let mut tracks = HashSet::<(String, String)>::new(); + for item in items.iter().filter(|item| item.owner != own) { + let peer = item.owner.to_string(); + let source = CatalogSource::Federation { + peer_id: peer.clone(), + }; + let refs = artist_refs(&peer, &item.artist_names); + let featured = artist_refs(&peer, &item.featured_artist_names); + for name in item + .artist_names + .iter() + .chain(item.featured_artist_names.iter()) + { + note_artist(&mut artists, &peer, name); + } + match item.kind { + ItemKind::Artist => { + note_artist(&mut artists, &peer, &item.name); + } + ItemKind::Release => { + if releases.insert((peer.clone(), item.id.to_string())) { + results.releases.push(Release { + key: ReleaseKey::Federation { + peer_id: peer.clone(), + id: item.id.to_string(), + }, + source, + title: item.name.clone(), + artists: refs, + featured_artists: Vec::new(), + release_type: item + .release_type + .clone() + .unwrap_or_else(|| "release".into()), + year: item.year, + artwork: Artwork::default(), + tracks: Vec::new(), + }); + } + } + ItemKind::Track => { + if !tracks.insert((peer.clone(), item.id.to_string())) { + continue; + } + let Some(content_id) = item + .content_id + .as_deref() + .and_then(|value| ContentId::parse(value).ok()) + else { + continue; + }; + let release = item.release_title.clone().unwrap_or_default(); + results.tracks.push(Track { + key: TrackKey::federation( + peer.clone(), + item.id.to_string(), + Some(content_id.clone()), + ), + title: item.name.clone(), + artist: artist_line(&item.artist_names, &item.featured_artist_names), + artists: refs.clone(), + featured_artists: featured, + release: release.clone(), + release_id: ReleaseKey::Federation { + peer_id: peer.clone(), + id: format!("name:{}", music_dht::normalize_name(&release)), + }, + duration_seconds: item.duration_seconds.unwrap_or_default(), + track_number: item + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: item.disc_number.and_then(|value| u32::try_from(value).ok()), + cover_uri: None, + audio_format: None, + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::Federation { + peer_id: peer, + content_id, + }, + }); + } + } + } + results.artists = artists.into_values().collect(); + results + .artists + .sort_by(|left, right| left.name.cmp(&right.name)); + results +} + +fn note_artist(artists: &mut HashMap<(String, String), Artist>, peer: &str, name: &str) { + let normalized = music_dht::normalize_name(name); + if normalized.is_empty() { + return; + } + artists + .entry((peer.to_owned(), normalized.clone())) + .or_insert_with(|| Artist { + key: ArtistKey::Federation { + peer_id: peer.to_owned(), + id: normalized, + }, + source: CatalogSource::Federation { + peer_id: peer.to_owned(), + }, + name: name.to_owned(), + artwork: Artwork::default(), + release_count: 0, + track_count: 0, + }); +} + +fn artist_refs(peer: &str, names: &[String]) -> Vec { + names + .iter() + .map(|name| ArtistRef { + key: ArtistKey::Federation { + peer_id: peer.to_owned(), + id: music_dht::normalize_name(name), + }, + name: name.clone(), + }) + .collect() +} + +fn artist_line(main: &[String], featured: &[String]) -> String { + let mut line = main.join(", "); + if !featured.is_empty() { + if !line.is_empty() { + line.push_str(" feat. "); + } + line.push_str(&featured.join(", ")); + } + line +} + +async fn fetch_image( + service: &MusicDhtService, + owner: EndpointId, + artist: &str, + release: Option<&str>, +) -> Result, &'static str)>> { + let mut stream = service.open_stream(owner, CATALOG_ALPN).await?; + let request = CatalogRequest { + artist: artist.to_owned(), + want: Some( + if release.is_some() { + "release_cover" + } else { + "artist_image" + } + .into(), + ), + release: release.map(str::to_owned), + cursor: None, + limit: None, + }; + let mut line = serde_json::to_vec(&request)?; + line.push(b'\n'); + stream.send.write_all(&line).await?; + stream.send.finish()?; + let header: CatalogImageHeader = serde_json::from_slice(&read_line(&mut stream.recv).await?)?; + if !header.ok || header.size == 0 { + return Ok(None); + } + anyhow::ensure!( + header.size <= MAX_IMAGE_BYTES, + "federated image exceeds size limit" + ); + let image_size = + usize::try_from(header.size).context("image is too large for this platform")?; + let mut bytes = vec![0; image_size]; + stream.recv.read_exact(&mut bytes).await?; + let extension = match header.mime_type.as_str() { + "image/png" => "png", + "image/webp" => "webp", + "image/gif" => "gif", + "image/bmp" => "bmp", + _ => "jpg", + }; + Ok(Some((bytes, extension))) +} + +async fn read_line(reader: &mut (impl AsyncRead + Unpin)) -> Result> { + let mut line = Vec::new(); + loop { + let byte = reader.read_u8().await?; + if byte == b'\n' { + return Ok(line); + } + anyhow::ensure!(line.len() < 64 * 1024, "catalog header is too large"); + line.push(byte); + } +} diff --git a/crates/backend/src/lib.rs b/crates/backend/src/lib.rs new file mode 100644 index 0000000..7d4a5b4 --- /dev/null +++ b/crates/backend/src/lib.rs @@ -0,0 +1,1816 @@ +//! Backend runtime and replaceable service implementations. + +use std::collections::{HashMap, HashSet}; +use std::fmt; +use std::io; +use std::sync::mpsc as std_mpsc; +use std::thread; +use std::time::{Duration, Instant}; + +use furumi_backend_api::{ + BackendCommand, BackendSnapshot, BuildInfoSnapshot, ConnectedDeviceSnapshot, + ConnectedDevicesSnapshot, DevicePlaybackRole, DevicePresence, DeviceTrust, + FederationActivitySnapshot, FederationDebugSnapshot, FederationOperation, LibrarySnapshot, + PendingPairingSnapshot, PlaybackStatus, PlaylistSnapshot, RemoteData, RequestId, SearchResults, + SearchSnapshot, SearchStats, SendCommandError, SettingsSnapshot, VersionEntrySnapshot, +}; +use furumi_domain::{ + Artist, ArtistId, ArtistKey, ArtistRef, Artwork, AudioSource, CatalogSource, ContentId, + LocalTrackId, Release, ReleaseId, ReleaseKey, Track, TrackKey, +}; +use tokio::sync::{mpsc, watch}; +use tokio_util::sync::CancellationToken; + +mod actor_devices; +mod audio; +mod devices; +mod federation; +mod settings; +mod streaming; +mod support; + +use support::{ + apply_federated_metadata, expand_tilde, extrapolated_control_position, federation_specs, + find_catalog_track, library_snapshot, library_track, local_search_results, + merge_release_preserving_local, merge_search_results, normalize_device_name, + playback_state_acknowledges_command, portable_playback_placeholder, + remote_snapshot_has_authority, runtime_build_info, sanitize_filename, selected_track_position, + spawn_settings_worker, track_is_liked, track_to_library_fed, track_to_playback_track, + track_to_synced_fed, unix_time_ms, volume_percent, +}; + +use settings::SettingsStore; + +const COMMAND_CAPACITY: usize = 64; +const INTERNAL_CAPACITY: usize = 32; +const CONTROL_COMMAND_ACK_TIMEOUT: Duration = Duration::from_secs(12); +const CONTROL_POSITION_ACK_TOLERANCE_SECONDS: f64 = 3.0; + +#[derive(Clone)] +pub struct BackendHandle { + commands: mpsc::Sender, + snapshots: watch::Receiver, +} + +impl BackendHandle { + /// Enqueues a command without blocking the UI thread. + /// + /// # Errors + /// + /// Returns [`SendCommandError::Busy`] when the bounded queue is full and + /// [`SendCommandError::Closed`] after backend shutdown. + pub fn try_send(&self, command: BackendCommand) -> Result<(), SendCommandError> { + self.commands + .try_send(command) + .map_err(|error| match error { + mpsc::error::TrySendError::Full(_) => SendCommandError::Busy, + mpsc::error::TrySendError::Closed(_) => SendCommandError::Closed, + }) + } + + #[must_use] + pub fn subscribe(&self) -> watch::Receiver { + self.snapshots.clone() + } +} + +/// Starts the backend actor and real audio worker. +/// +/// # Errors +/// +/// Returns an I/O error when the runtime or its owner thread cannot be created. +pub fn spawn_backend() -> Result { + let project_dirs = directories::ProjectDirs::from("cy", "hexor", "Furumi") + .ok_or(BackendStartupError::DataDirectoryUnavailable)?; + let settings_path = project_dirs.data_local_dir().join("furumi-desktop.sqlite3"); + let federation_data_dir = project_dirs.data_local_dir().join("federation"); + let federation_media_dir = project_dirs.cache_dir().join("federation-media"); + let devices_db_path = project_dirs + .data_local_dir() + .join("devices") + .join("sync.sqlite3"); + let settings_store = SettingsStore::open(&settings_path)?; + let loaded_settings = settings_store.load()?; + let library_path = furumi_library::default_db_path().map_err(BackendStartupError::Library)?; + let catalog = std::sync::Arc::new( + furumi_library::Library::open(&library_path).map_err(BackendStartupError::Library)?, + ); + let loaded_library = library_snapshot(&catalog).map_err(BackendStartupError::Library)?; + let runtime = tokio::runtime::Builder::new_multi_thread() + .worker_threads(2) + .enable_io() + .enable_time() + .thread_name("furumi-backend") + .build()?; + let (command_tx, command_rx) = mpsc::channel(COMMAND_CAPACITY); + let (snapshot_tx, snapshot_rx) = watch::channel(BackendSnapshot::default()); + let (internal_tx, internal_rx) = mpsc::channel(INTERNAL_CAPACITY); + let devices = devices::DeviceSync::open( + &devices_db_path, + std::sync::Arc::clone(&catalog), + internal_tx.clone(), + ) + .map_err(BackendStartupError::Devices)?; + let audio_events = internal_tx.clone(); + let audio = audio::spawn(move |event| { + let _ = audio_events.blocking_send(InternalEvent::Audio(event)); + })?; + + thread::Builder::new() + .name("furumi-backend-runtime".into()) + .spawn(move || { + runtime.block_on(run_actor(ActorBootstrap { + command_rx, + snapshots: snapshot_tx, + settings_store, + loaded_settings, + catalog, + loaded_library, + internal_tx, + internal_rx, + audio, + federation_data_dir, + federation_media_dir, + devices, + })); + })?; + + Ok(BackendHandle { + commands: command_tx, + snapshots: snapshot_rx, + }) +} + +#[derive(Debug)] +pub enum BackendStartupError { + DataDirectoryUnavailable, + Io(io::Error), + Database(rusqlite::Error), + Library(anyhow::Error), + Devices(anyhow::Error), +} + +impl fmt::Display for BackendStartupError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::DataDirectoryUnavailable => { + formatter.write_str("application data directory is unavailable") + } + Self::Io(error) => write!(formatter, "backend runtime: {error}"), + Self::Database(error) => write!(formatter, "settings database: {error}"), + Self::Library(error) => write!(formatter, "music library: {error:#}"), + Self::Devices(error) => write!(formatter, "connected devices: {error:#}"), + } + } +} + +impl std::error::Error for BackendStartupError {} + +impl From for BackendStartupError { + fn from(error: io::Error) -> Self { + Self::Io(error) + } +} + +impl From for BackendStartupError { + fn from(error: rusqlite::Error) -> Self { + Self::Database(error) + } +} + +enum InternalEvent { + SearchFinished { + request_id: RequestId, + results: Result<(SearchResults, SearchStats), String>, + }, + DetailFinished { + request_id: RequestId, + key: ArtistKey, + name: String, + results: Result<(SearchResults, SearchStats), String>, + release: Option, + }, + FederationStarted(Result, String>), + SettingsPersisted(Result<(), String>), + Audio(audio::Event), + FederatedStreamReady { + key: TrackKey, + reader: streaming::GrowingFileReader, + mime_type: String, + }, + FederatedDownloadComplete { + key: TrackKey, + path: std::path::PathBuf, + keep: bool, + metadata: Option, + }, + FederatedDownloadFailed { + key: TrackKey, + message: String, + }, + FederatedContentResolved { + key: TrackKey, + result: Result, + }, + QueueArtworkResolved { + request_id: String, + keys: Vec, + cover_uri: Option, + }, + FederationDebugUpdated(FederationDebugSnapshot), + DevicesChanged, + DeviceLibraryChanged, + DeviceNamePublishDue(String), + DeviceNamePublished(Result<(), String>), + DeviceOperationFinished(Result), + DevicePlaybackSnapshot(music_dht::device_sync::PlaybackSnapshot), + DevicePlaybackCommand(music_dht::device_sync::PlaybackCommand), +} + +enum DeviceOperationResult { + Invite(String), + Connected(String), +} + +struct Actor { + state: BackendSnapshot, + library: LibrarySnapshot, + snapshots: watch::Sender, + internal: mpsc::Sender, + active_search: Option<(RequestId, CancellationToken)>, + active_detail: Option, + settings: std_mpsc::Sender, + catalog: std::sync::Arc, + audio: audio::Controller, + federation: Option>, + federation_data_dir: std::path::PathBuf, + federation_media_dir: std::path::PathBuf, + ephemeral_audio: Option<(TrackKey, std::path::PathBuf)>, + pending_queue_artwork: HashSet, + federation_debug_pending: bool, + devices: std::sync::Arc, + device_service: Option>, + device_role: DevicePlaybackRole, + active_device_id: String, + active_device_name: String, + control_anchor: Option, + pending_control: Option, +} + +#[derive(Debug, Clone)] +struct ControlPlaybackAnchor { + device_id: String, + state: music_dht::device_sync::PlaybackStateWire, + observed_at: Instant, +} + +#[derive(Debug, Clone)] +struct PendingControlState { + device_id: String, + state: music_dht::device_sync::PlaybackStateWire, + seek: bool, + sent_at: Instant, +} + +struct ActorBootstrap { + command_rx: mpsc::Receiver, + snapshots: watch::Sender, + settings_store: SettingsStore, + loaded_settings: SettingsSnapshot, + catalog: std::sync::Arc, + loaded_library: LibrarySnapshot, + internal_tx: mpsc::Sender, + internal_rx: mpsc::Receiver, + audio: audio::Controller, + federation_data_dir: std::path::PathBuf, + federation_media_dir: std::path::PathBuf, + devices: std::sync::Arc, +} + +struct ActorRuntime { + actor: Actor, + command_rx: mpsc::Receiver, + internal_rx: mpsc::Receiver, +} + +fn initialize_actor(bootstrap: ActorBootstrap) -> ActorRuntime { + let ActorBootstrap { + command_rx, + snapshots, + settings_store, + mut loaded_settings, + catalog, + loaded_library, + internal_tx, + internal_rx, + audio, + federation_data_dir, + federation_media_dir, + devices, + } = bootstrap; + let (settings_tx, settings_rx) = std_mpsc::channel(); + spawn_settings_worker(settings_store, settings_rx, internal_tx.clone()); + let library = loaded_library; + let (active_device_id, mut active_device_name) = devices.identity().unwrap_or_default(); + let mut settings_error = None; + let configured_device_name = if loaded_settings.device_name.trim().is_empty() { + active_device_name.clone() + } else { + normalize_device_name(&loaded_settings.device_name) + }; + if configured_device_name != active_device_name + && let Err(error) = devices.set_device_name(&configured_device_name, None) + { + settings_error = Some(format!("device name: {error:#}")); + } else if !configured_device_name.is_empty() { + active_device_name.clone_from(&configured_device_name); + } + if loaded_settings.device_name != configured_device_name { + loaded_settings.device_name = configured_device_name; + let _ = settings_tx.send(loaded_settings.clone()); + } + let initial_state = BackendSnapshot { + settings: loaded_settings, + build_info: runtime_build_info(), + settings_error, + ..BackendSnapshot::default() + }; + let mut actor = Actor { + state: initial_state, + library, + snapshots, + internal: internal_tx, + active_search: None, + active_detail: None, + settings: settings_tx, + catalog, + audio, + federation: None, + federation_data_dir, + federation_media_dir, + ephemeral_audio: None, + pending_queue_artwork: HashSet::new(), + federation_debug_pending: false, + devices, + device_service: None, + device_role: DevicePlaybackRole::Active, + active_device_id, + active_device_name, + control_anchor: None, + pending_control: None, + }; + actor.refresh_connected_devices(); + ActorRuntime { + actor, + command_rx, + internal_rx, + } +} + +async fn run_actor(bootstrap: ActorBootstrap) { + let ActorRuntime { + mut actor, + mut command_rx, + mut internal_rx, + } = initialize_actor(bootstrap); + let mut playback_tick = tokio::time::interval(Duration::from_millis(250)); + playback_tick.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + let mut federation_debug_tick = tokio::time::interval(Duration::from_secs(3)); + federation_debug_tick.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); + + loop { + tokio::select! { + command = command_rx.recv() => { + let Some(command) = command else { break }; + if matches!(command, BackendCommand::Shutdown) { + break; + } + actor.handle_command(command); + } + event = internal_rx.recv() => { + if let Some(event) = event { + actor.handle_internal(event); + } + } + _ = playback_tick.tick() => actor.tick_playback(), + _ = federation_debug_tick.tick() => actor.refresh_federation_debug(), + } + } + if let Some((_, token)) = actor.active_search.take() { + token.cancel(); + } + actor.audio.stop(); +} + +impl Actor { + fn start_federation(&mut self) { + if !self.state.settings.federation_enabled + || self.state.settings.network_id.trim().is_empty() + { + self.federation = None; + self.federation_debug_pending = false; + self.state.federation_debug = FederationDebugSnapshot::default(); + return; + } + let data_dir = self.federation_data_dir.clone(); + let media_dir = self.federation_media_dir.clone(); + let network = self.state.settings.network_id.trim().to_owned(); + let internal = self.internal.clone(); + self.state.federation_activity = FederationActivitySnapshot { + operation: FederationOperation::Idle, + pending: true, + stats: None, + error: None, + }; + self.publish(); + tokio::spawn(async move { + let result = federation::Client::start(data_dir, media_dir, &network) + .await + .map_err(|error| format!("federation: {error:#}")); + let _ = internal + .send(InternalEvent::FederationStarted(result)) + .await; + }); + } + + fn refresh_federation_debug(&mut self) { + if self.federation_debug_pending { + return; + } + let Some(client) = self.federation.clone() else { + return; + }; + self.federation_debug_pending = true; + let internal = self.internal.clone(); + tokio::spawn(async move { + let debug = client.debug_snapshot().await; + let _ = internal + .send(InternalEvent::FederationDebugUpdated(debug)) + .await; + }); + } + + fn resolve_queue_artwork(&mut self) { + let missing = self + .state + .queue + .items() + .iter() + .filter(|item| item.track.cover_uri.is_none()) + .map(|item| item.track.clone()) + .collect::>(); + let known = missing + .iter() + .filter_map(|track| { + self.known_cover_uri(track) + .map(|cover| (track.key.clone(), cover)) + }) + .collect::>(); + for (key, cover_uri) in known { + if let Some(mut track) = self + .state + .queue + .items() + .iter() + .find(|item| item.track.key.matches(&key)) + .map(|item| item.track.clone()) + { + track.cover_uri = Some(cover_uri); + self.state.queue.replace_track(&key, &track); + } + } + + let Some(client) = self.federation.clone() else { + return; + }; + let mut requests = HashMap::)>::new(); + for track in self + .state + .queue + .items() + .iter() + .filter(|item| { + item.track.cover_uri.is_none() + && matches!(item.track.audio_source, AudioSource::Federation { .. }) + }) + .map(|item| item.track.clone()) + .collect::>() + { + let Some(request_id) = Self::queue_artwork_request_id(&track) else { + continue; + }; + requests + .entry(request_id) + .and_modify(|(_, keys)| keys.push(track.key.clone())) + .or_insert_with(|| (track.clone(), vec![track.key.clone()])); + } + for (request_id, (track, keys)) in requests { + if !self.pending_queue_artwork.insert(request_id.clone()) { + continue; + } + let internal = self.internal.clone(); + let client = client.clone(); + tokio::spawn(async move { + let cover_uri = client + .artwork_for_track(&track) + .await + .map(|path| path.to_string_lossy().into_owned()); + let _ = internal + .send(InternalEvent::QueueArtworkResolved { + request_id, + keys, + cover_uri, + }) + .await; + }); + } + } + + fn queue_artwork_request_id(track: &Track) -> Option { + let peer = match &track.audio_source { + AudioSource::Federation { peer_id, .. } if !peer_id.is_empty() => peer_id.as_str(), + _ => track.key.federation_id()?.0, + }; + let artist = track + .artists + .first() + .map(|artist| artist.name.as_str()) + .or_else(|| (!track.artist.is_empty()).then_some(track.artist.as_str()))?; + (!track.release.is_empty()).then(|| { + format!( + "{peer}|{}|{}", + music_dht::normalize_name(artist), + music_dht::normalize_name(&track.release) + ) + }) + } + + fn known_cover_uri(&self, track: &Track) -> Option { + let cover_from_release = |release: &Release| { + let same_release = release.key == track.release_id + || (music_dht::normalize_name(&release.title) + == music_dht::normalize_name(&track.release) + && release.tracks.iter().any(|candidate| { + candidate.same_catalog_track(track) + || candidate + .artists + .iter() + .any(|artist| track.artists.contains(artist)) + })); + same_release + .then(|| release.artwork.uri.clone()) + .flatten() + .or_else(|| { + release + .tracks + .iter() + .find(|candidate| candidate.same_catalog_track(track)) + .and_then(|candidate| candidate.cover_uri.clone()) + }) + }; + self.library + .featured_releases + .iter() + .chain(self.state.search.results.releases.iter()) + .find_map(cover_from_release) + .or_else(|| { + let request_id = Self::queue_artwork_request_id(track)?; + self.state + .queue + .items() + .iter() + .find(|item| { + item.track.cover_uri.is_some() + && Self::queue_artwork_request_id(&item.track).as_deref() + == Some(request_id.as_str()) + }) + .and_then(|item| item.track.cover_uri.clone()) + }) + .or_else(|| { + self.library + .playlists + .iter() + .flat_map(|playlist| playlist.tracks.iter()) + .chain(self.library.recently_played.iter()) + .chain(self.state.search.results.tracks.iter()) + .find(|candidate| candidate.same_catalog_track(track)) + .and_then(|candidate| candidate.cover_uri.clone()) + }) + } + + #[allow( + clippy::too_many_lines, + reason = "central exhaustive actor command dispatcher" + )] + fn handle_command(&mut self, command: BackendCommand) { + match command { + BackendCommand::Initialize => { + if let Ok(library) = library_snapshot(&self.catalog) { + self.library = library; + } + self.state.library = RemoteData::Ready(self.library.clone()); + self.publish(); + self.start_federation(); + } + BackendCommand::TogglePlayback => match self.state.playback.status { + PlaybackStatus::Stopped => self.play_current(), + PlaybackStatus::Paused => { + self.state.playback.status = PlaybackStatus::Playing; + if self.device_role == DevicePlaybackRole::Active { + self.audio.resume(); + } else { + self.send_control_state(false); + } + self.publish(); + } + PlaybackStatus::Playing => { + self.state.playback.status = PlaybackStatus::Paused; + if self.device_role == DevicePlaybackRole::Active { + self.audio.pause(); + } else { + self.send_control_state(false); + } + self.publish(); + } + }, + BackendCommand::Play => match self.state.playback.status { + PlaybackStatus::Stopped => self.play_current(), + PlaybackStatus::Paused => { + self.state.playback.status = PlaybackStatus::Playing; + if self.device_role == DevicePlaybackRole::Active { + self.audio.resume(); + } else { + self.send_control_state(false); + } + self.publish(); + } + PlaybackStatus::Playing => {} + }, + BackendCommand::Pause => { + if self.state.playback.status == PlaybackStatus::Playing { + self.state.playback.status = PlaybackStatus::Paused; + if self.device_role == DevicePlaybackRole::Active { + self.audio.pause(); + } else { + self.send_control_state(false); + } + self.publish(); + } + } + BackendCommand::Stop => { + if self.device_role == DevicePlaybackRole::Active { + self.audio.stop(); + } + self.remove_ephemeral_audio(); + self.state.playback.status = PlaybackStatus::Stopped; + self.state.playback.position_seconds = 0.0; + self.send_control_state(true); + self.publish(); + } + BackendCommand::Seek { position_seconds } => { + self.state.playback.position_seconds = + position_seconds.clamp(0.0, self.state.playback.duration_seconds.max(0.0)); + if self.device_role == DevicePlaybackRole::Active { + self.audio.seek(Duration::from_secs_f64( + self.state.playback.position_seconds, + )); + } else { + self.send_control_state(true); + } + self.publish(); + } + BackendCommand::SetVolume { volume } => { + self.state.playback.volume = volume.clamp(0.0, 1.0); + if self.device_role == DevicePlaybackRole::Active { + self.audio.set_volume(self.state.playback.volume); + } else { + self.send_control_state(false); + } + self.publish(); + } + BackendCommand::PlayRelease { release_id, start } => { + if let Some(release) = self.release(&release_id).cloned() { + self.state.queue.replace_context(release.tracks, start); + self.resolve_queue_artwork(); + self.play_current(); + } + } + BackendCommand::PlayTrack { track } => { + if let Some(track) = self.track(&track).cloned() { + self.state.queue.replace_context(vec![track], 0); + self.resolve_queue_artwork(); + self.play_current(); + } + } + BackendCommand::PlayQueueItem { item_id } => { + if self.state.queue.select_item(item_id).is_some() { + self.play_current(); + } + } + BackendCommand::PlayContext { tracks, selected } => { + let tracks = self.resolve_tracks(&tracks); + if !tracks.is_empty() { + let start = selected_track_position(&tracks, &selected); + self.state.queue.replace_context(tracks, start); + self.resolve_queue_artwork(); + self.play_current(); + } + } + BackendCommand::AddNext { tracks } => { + let tracks = self.resolve_tracks(&tracks); + self.state.queue.add_next(tracks); + self.resolve_queue_artwork(); + self.send_control_state(false); + self.publish(); + } + BackendCommand::AddToEnd { tracks } => { + let tracks = self.resolve_tracks(&tracks); + self.state.queue.add_to_end(tracks); + self.resolve_queue_artwork(); + self.send_control_state(false); + self.publish(); + } + BackendCommand::ToggleLike { track } => self.toggle_like(&track), + BackendCommand::CreatePlaylist { title } => { + let title = title.trim(); + if title.is_empty() { + return; + } + match self.catalog.create_playlist(title) { + Ok(playlist) => { + if let Err(error) = self.devices.record_playlist_created(playlist.id, title) + { + self.state.settings_error = Some(format!("playlist sync: {error:#}")); + } + self.refresh_library(); + } + Err(error) => { + self.state.settings_error = Some(format!("create playlist: {error:#}")); + self.publish(); + } + } + } + BackendCommand::RenamePlaylist { playlist_id, title } => { + let title = title.trim(); + if title.is_empty() { + return; + } + let result = self + .catalog + .update_playlist(playlist_id, title, None) + .and_then(|()| self.devices.record_playlist_renamed(playlist_id, title)); + if let Err(error) = result { + self.state.settings_error = Some(format!("rename playlist: {error:#}")); + } + self.refresh_library(); + } + BackendCommand::DeletePlaylist { playlist_id } => { + let result = self + .catalog + .playlist_sync_id(playlist_id) + .and_then(|sync_id| { + self.catalog.delete_playlist(playlist_id)?; + if let Some(sync_id) = sync_id { + self.devices.record_playlist_deleted(sync_id)?; + } + Ok(()) + }); + if let Err(error) = result { + self.state.settings_error = Some(format!("delete playlist: {error:#}")); + } + self.refresh_library(); + } + BackendCommand::AddToPlaylist { + playlist_id, + tracks, + } => self.add_to_playlist(playlist_id, &tracks), + BackendCommand::RemoveFromPlaylist { + playlist_id, + tracks, + } => self.remove_from_playlist(playlist_id, &tracks), + BackendCommand::CreateDeviceInvite => self.create_device_invite(), + BackendCommand::ConnectDevice { invite } => self.connect_device(invite), + BackendCommand::AnswerDevicePairing { + request_id, + accept, + use_requester_group, + } => { + if let Err(error) = + self.devices + .answer_pairing(&request_id, accept, use_requester_group) + { + self.state.connected_devices.error = Some(format!("pairing: {error:#}")); + } + self.refresh_connected_devices(); + self.publish(); + } + BackendCommand::SelectPlaybackDevice { device_id } => { + self.select_playback_device(&device_id); + } + BackendCommand::Next => { + if self.state.queue.advance().is_some() { + self.play_current(); + } + } + BackendCommand::Previous => { + if self.state.playback.position_seconds > 5.0 { + self.state.playback.position_seconds = 0.0; + if self.device_role == DevicePlaybackRole::Active { + self.audio.seek(Duration::ZERO); + } else { + self.send_control_state(true); + } + self.publish(); + } else if self.state.queue.previous().is_some() { + self.play_current(); + } + } + BackendCommand::Search { request_id, query } => self.start_search(request_id, query), + BackendCommand::CancelSearch { request_id } => self.cancel_search(request_id), + BackendCommand::LoadArtist { + request_id, + key, + name, + } => self.load_detail(request_id, key, name, None), + BackendCommand::LoadRelease { + request_id, + key, + artist_key, + artist_name, + } => self.load_detail(request_id, artist_key, artist_name, Some(key)), + BackendCommand::UpdateSettings(settings) => { + let federation_changed = self.state.settings.federation_enabled + != settings.federation_enabled + || self.state.settings.network_id != settings.network_id; + let device_name_changed = self.state.settings.device_name != settings.device_name; + let pending_device_name = settings.device_name.clone(); + self.state.settings = settings.clone(); + self.state.settings_error = None; + self.publish(); + if self.settings.send(settings).is_err() { + self.state.settings_error = Some("settings storage is unavailable".into()); + self.publish(); + } + if federation_changed { + self.federation = None; + self.start_federation(); + } + if device_name_changed { + self.apply_local_device_name(&pending_device_name); + self.schedule_device_name_publish(pending_device_name); + } + } + BackendCommand::Shutdown => {} + } + } + + fn start_search(&mut self, request_id: RequestId, query: String) { + self.active_detail = None; + if let Some((_, token)) = self.active_search.take() { + token.cancel(); + } + let token = CancellationToken::new(); + self.active_search = Some((request_id, token.clone())); + let local = local_search_results(&self.catalog, &query).unwrap_or_default(); + self.state.search = SearchSnapshot { + request_id: Some(request_id), + results: local, + federation_pending: self.state.settings.federation_enabled, + stats: None, + error: None, + }; + self.state.federation_activity = FederationActivitySnapshot { + operation: FederationOperation::Search, + pending: self.state.settings.federation_enabled, + stats: None, + error: None, + }; + self.publish(); + + let federation = self.federation.clone(); + let internal = self.internal.clone(); + tokio::spawn(async move { + tokio::select! { + () = token.cancelled() => {} + () = async {} => { + let results = if let Some(federation) = federation { + federation.search(&query).await.map_err(|error| error.to_string()) + } else { + Ok((SearchResults::default(), SearchStats::default())) + }; + let _ = internal.send(InternalEvent::SearchFinished { request_id, results }).await; + } + } + }); + } + + fn cancel_search(&mut self, request_id: RequestId) { + let matches = self + .active_search + .as_ref() + .is_some_and(|(active, _)| *active == request_id); + if matches { + if let Some((_, token)) = self.active_search.take() { + token.cancel(); + } + self.state.search = SearchSnapshot::default(); + self.publish(); + } + } + + fn load_detail( + &mut self, + request_id: RequestId, + key: ArtistKey, + name: String, + release: Option, + ) { + if !self.state.settings.federation_enabled || name.trim().is_empty() { + return; + } + if let Some((_, token)) = self.active_search.take() { + token.cancel(); + self.state.search.federation_pending = false; + } + self.active_detail = Some(request_id); + self.state.federation_activity = FederationActivitySnapshot { + operation: if release.is_some() { + FederationOperation::Release + } else { + FederationOperation::Artist + }, + pending: true, + stats: None, + error: None, + }; + self.publish(); + let federation = self.federation.clone(); + let internal = self.internal.clone(); + tokio::spawn(async move { + let results = match federation { + Some(client) => client + .artist_card(&name) + .await + .map_err(|error| error.to_string()), + None => Err("federation is still starting".into()), + }; + let _ = internal + .send(InternalEvent::DetailFinished { + request_id, + key, + name, + results, + release, + }) + .await; + }); + } + + #[allow( + clippy::too_many_lines, + reason = "central exhaustive internal event dispatcher" + )] + fn handle_internal(&mut self, event: InternalEvent) { + match event { + InternalEvent::SearchFinished { + request_id, + results, + } => { + if self + .active_search + .as_ref() + .is_some_and(|(active, token)| *active == request_id && !token.is_cancelled()) + { + self.active_search = None; + self.state.search.federation_pending = false; + match results { + Ok((remote, stats)) => { + merge_search_results(&mut self.state.search.results, remote); + self.state.federation_activity.pending = false; + self.state.federation_activity.stats = Some(stats.clone()); + self.state.search.stats = Some(SearchStats { + tracks: self.state.search.results.tracks.len(), + artists: self.state.search.results.artists.len(), + ..stats + }); + } + Err(message) => { + self.state.search.error = Some(message.clone()); + self.state.federation_activity.pending = false; + self.state.federation_activity.error = Some(message); + } + } + self.publish(); + } + } + InternalEvent::DetailFinished { + request_id, + key, + name, + results, + release, + } => { + if self.active_detail == Some(request_id) { + self.active_detail = None; + match results { + Ok((mut remote, stats)) => { + let local_release_baseline = release + .as_ref() + .and_then(|selected| self.release(selected)) + .cloned(); + let selected_name = music_dht::normalize_name(&name); + for artist in &mut remote.artists { + if music_dht::normalize_name(&artist.name) == selected_name { + artist.key = key.clone(); + } + } + for item in &mut remote.releases { + for artist in &mut item.artists { + if music_dht::normalize_name(&artist.name) == selected_name { + artist.key = key.clone(); + } + } + for track in &mut item.tracks { + for artist in track + .artists + .iter_mut() + .chain(track.featured_artists.iter_mut()) + { + if music_dht::normalize_name(&artist.name) == selected_name + { + artist.key = key.clone(); + } + } + } + if let Some(selected) = &release + && music_dht::normalize_name(&item.title) + == self.release(selected).map_or(String::new(), |r| { + music_dht::normalize_name(&r.title) + }) + { + item.key = selected.clone(); + for track in &mut item.tracks { + track.release_id = selected.clone(); + } + } + } + for track in &mut remote.tracks { + for artist in track + .artists + .iter_mut() + .chain(track.featured_artists.iter_mut()) + { + if music_dht::normalize_name(&artist.name) == selected_name { + artist.key = key.clone(); + } + } + } + if let Some(local) = local_release_baseline { + if let Some(existing) = self + .state + .search + .results + .releases + .iter_mut() + .find(|candidate| candidate.key == local.key) + { + let previous = std::mem::replace(existing, local); + merge_release_preserving_local(existing, previous); + } else { + self.state.search.results.releases.push(local); + } + } + merge_search_results(&mut self.state.search.results, remote); + self.state.federation_activity.pending = false; + self.state.federation_activity.stats = Some(stats); + } + Err(message) => { + self.state.search.error = Some(message.clone()); + self.state.federation_activity.pending = false; + self.state.federation_activity.error = Some(message); + } + } + self.publish(); + } + } + InternalEvent::FederationStarted(result) => { + match result { + Ok(client) => { + let service = client.service(); + for alpn in [ + music_dht::device_sync::SYNC_ALPN_V1, + music_dht::device_sync::SYNC_ALPN_V2, + ] { + match service.stream_acceptor(alpn) { + Ok(acceptor) => { + tokio::spawn(devices::serve( + acceptor, + std::sync::Arc::clone(&self.devices), + std::sync::Arc::clone(&service), + )); + } + Err(error) => { + self.state.connected_devices.error = + Some(format!("device listener: {error}")); + } + } + } + tokio::spawn(devices::sync_loop( + std::sync::Arc::clone(&self.devices), + std::sync::Arc::clone(&service), + )); + self.device_service = Some(service); + self.publish_device_name(self.state.settings.device_name.clone()); + if let Ok(specs) = federation_specs(&self.catalog) { + let publisher = client.clone(); + tokio::spawn(async move { + let _ = publisher.publish(specs).await; + }); + } + self.federation = Some(client); + self.state.federation_activity.pending = false; + self.resolve_queue_artwork(); + self.refresh_federation_debug(); + } + Err(message) => { + self.state.settings_error = Some(message.clone()); + self.state.federation_activity.pending = false; + self.state.federation_activity.error = Some(message.clone()); + self.state.federation_debug = FederationDebugSnapshot { + error: Some(message), + ..FederationDebugSnapshot::default() + }; + } + } + self.refresh_connected_devices(); + self.publish(); + } + InternalEvent::SettingsPersisted(result) => { + self.state.settings_error = result.err(); + self.publish(); + } + InternalEvent::Audio(event) => self.handle_audio_event(event), + InternalEvent::FederatedStreamReady { + key, + reader, + mime_type, + } => { + if self + .state + .queue + .current() + .is_some_and(|item| item.track.key.matches(&key)) + { + self.audio + .play_stream(Box::new(reader), mime_type, self.state.playback.volume); + } + } + InternalEvent::FederatedDownloadComplete { + key, + path, + keep, + metadata, + } => { + if keep { + if let Err(error) = + furumi_library::import::read_file(&path).and_then(|mut import| { + apply_federated_metadata(&mut import, metadata); + furumi_library::import::upsert_track(&self.catalog, &import).map(|_| ()) + }) + { + self.state.playback_error = + Some(format!("track played but could not be imported: {error:#}")); + } else if let Ok(library) = library_snapshot(&self.catalog) { + self.library = library.clone(); + self.state.library = RemoteData::Ready(library); + self.reconcile_downloaded_tracks(&key, &path); + if let (Some(client), Ok(specs)) = + (self.federation.clone(), federation_specs(&self.catalog)) + { + tokio::spawn(async move { + let _ = client.publish(specs).await; + }); + } + } + } else if let Some((_, old)) = self.ephemeral_audio.replace((key, path)) { + let _ = std::fs::remove_file(old); + } + self.publish(); + } + InternalEvent::FederatedDownloadFailed { key, message } => { + if self + .state + .queue + .current() + .is_some_and(|item| item.track.key.matches(&key)) + { + self.state.playback.status = PlaybackStatus::Stopped; + self.state.playback_error = Some(message); + self.publish(); + } + } + InternalEvent::DevicesChanged => { + self.refresh_connected_devices(); + self.publish(); + } + InternalEvent::DeviceNamePublishDue(candidate) => { + if self.state.settings.device_name != candidate { + return; + } + let normalized = normalize_device_name(&candidate); + if self.state.settings.device_name != normalized { + self.state.settings.device_name.clone_from(&normalized); + if self.settings.send(self.state.settings.clone()).is_err() { + self.state.settings_error = Some("settings storage is unavailable".into()); + } + } + self.apply_local_device_name(&normalized); + self.publish_device_name(normalized); + self.publish(); + } + InternalEvent::DeviceNamePublished(result) => { + if let Err(message) = result { + self.state.connected_devices.error = Some(message); + } + self.refresh_connected_devices(); + self.publish(); + } + InternalEvent::FederatedContentResolved { key, result } => match result { + Ok(track) => { + let is_current = self + .state + .queue + .current() + .is_some_and(|item| item.track.key.matches(&key)); + self.state.queue.replace_track(&key, &track); + self.resolve_queue_artwork(); + if is_current { + self.play_current(); + } else { + self.publish(); + } + } + Err(message) => { + self.state.playback.status = PlaybackStatus::Stopped; + self.state.playback_error = Some(message); + self.publish(); + } + }, + InternalEvent::QueueArtworkResolved { + request_id, + keys, + cover_uri, + } => { + self.pending_queue_artwork.remove(&request_id); + if let Some(cover_uri) = cover_uri { + for key in keys { + if let Some(mut track) = self + .state + .queue + .items() + .iter() + .find(|item| item.track.key.matches(&key)) + .map(|item| item.track.clone()) + { + track.cover_uri = Some(cover_uri.clone()); + self.state.queue.replace_track(&key, &track); + } + } + self.resolve_queue_artwork(); + self.publish(); + } + } + InternalEvent::FederationDebugUpdated(debug) => { + self.federation_debug_pending = false; + if self.state.federation_debug != debug { + self.state.federation_debug = debug; + self.publish(); + } + } + InternalEvent::DeviceLibraryChanged => { + if let Ok(library) = library_snapshot(&self.catalog) { + self.library = library.clone(); + self.state.library = RemoteData::Ready(library); + self.reconcile_likes(); + } + self.refresh_connected_devices(); + self.publish(); + } + InternalEvent::DeviceOperationFinished(result) => { + self.state.connected_devices.busy = false; + match result { + Ok(DeviceOperationResult::Invite(invite)) => { + self.state.connected_devices.invite = Some(invite); + self.state.connected_devices.error = None; + } + Ok(DeviceOperationResult::Connected(message)) => { + self.state.connected_devices.invite = None; + self.state.connected_devices.last_sync = Some(message); + self.state.connected_devices.error = None; + } + Err(message) => self.state.connected_devices.error = Some(message), + } + self.refresh_connected_devices(); + self.publish(); + } + InternalEvent::DevicePlaybackSnapshot(snapshot) => { + self.apply_remote_playback_snapshot(snapshot); + } + InternalEvent::DevicePlaybackCommand(command) => { + self.apply_device_playback_command(command); + } + } + } + + fn apply_remote_playback_snapshot( + &mut self, + snapshot: music_dht::device_sync::PlaybackSnapshot, + ) { + if !remote_snapshot_has_authority( + self.device_role, + &self.active_device_id, + self.state.playback.status, + self.state.queue.items().is_empty(), + &snapshot, + ) { + return; + } + + let controls_sender = self.device_role == DevicePlaybackRole::Control; + + if controls_sender + && let Some(pending) = self + .pending_control + .as_ref() + .filter(|pending| pending.device_id == snapshot.device_id) + { + let acknowledged = playback_state_acknowledges_command( + &pending.state, + &snapshot.state, + pending.seek, + pending.sent_at.elapsed(), + ); + if !acknowledged && pending.sent_at.elapsed() < CONTROL_COMMAND_ACK_TIMEOUT { + // This snapshot was produced before the active device applied + // our latest command. Letting it through would briefly restore + // the previous track or seek position in the reactive state. + return; + } + self.pending_control = None; + } + + self.device_role = DevicePlaybackRole::Control; + self.active_device_id.clone_from(&snapshot.device_id); + self.active_device_name.clone_from(&snapshot.device_name); + self.control_anchor = Some(ControlPlaybackAnchor { + device_id: snapshot.device_id, + state: snapshot.state.clone(), + observed_at: Instant::now(), + }); + self.audio.stop(); + self.apply_device_playback_state(&snapshot.state, false, false); + self.refresh_connected_devices(); + self.publish(); + } + + fn control_position(&self) -> Option { + let (state, elapsed) = self + .pending_control + .as_ref() + .filter(|pending| pending.device_id == self.active_device_id) + .map(|pending| (&pending.state, pending.sent_at.elapsed())) + .or_else(|| { + self.control_anchor + .as_ref() + .filter(|anchor| anchor.device_id == self.active_device_id) + .map(|anchor| (&anchor.state, anchor.observed_at.elapsed())) + })?; + let position = extrapolated_control_position(state, elapsed); + Some(if self.state.playback.duration_seconds > 0.0 { + position.min(self.state.playback.duration_seconds) + } else { + position + }) + } + + fn tick_playback(&mut self) { + if matches!(self.state.playback.status, PlaybackStatus::Stopped) { + return; + } + if self.device_role == DevicePlaybackRole::Control { + if let Some(position) = self.control_position() { + if (position - self.state.playback.position_seconds).abs() < 0.01 { + return; + } + self.state.playback.position_seconds = position; + self.publish(); + } + return; + } + let position = self + .audio + .shared + .position_seconds() + .clamp(0.0, self.state.playback.duration_seconds.max(0.0)); + if (position - self.state.playback.position_seconds).abs() >= 0.01 { + self.state.playback.position_seconds = position; + self.publish(); + } + } + + fn handle_audio_event(&mut self, event: audio::Event) { + match event { + audio::Event::Started => { + self.state.playback.status = PlaybackStatus::Playing; + self.state.playback_error = None; + self.publish(); + } + audio::Event::Finished => { + self.remove_ephemeral_audio(); + if self.state.queue.advance().is_some() { + self.play_current(); + } else { + self.state.playback.status = PlaybackStatus::Stopped; + self.state.playback.position_seconds = + self.state.playback.duration_seconds.max(0.0); + self.publish(); + } + } + audio::Event::Failed(message) => { + self.state.playback.status = PlaybackStatus::Stopped; + self.state.playback_error = Some(message); + self.publish(); + } + } + } + + fn play_current(&mut self) { + self.remove_ephemeral_audio(); + let Some(track) = self.state.queue.current().map(|item| item.track.clone()) else { + self.state.playback.status = PlaybackStatus::Stopped; + self.publish(); + return; + }; + self.state.playback.position_seconds = 0.0; + self.state.playback.duration_seconds = track.duration_seconds.max(0.0); + self.state.playback_error = None; + if self.device_role == DevicePlaybackRole::Control { + self.state.playback.status = PlaybackStatus::Playing; + self.send_control_state(true); + self.publish(); + return; + } + match track.audio_source.clone() { + AudioSource::LocalFile(path) => { + self.state.playback.status = PlaybackStatus::Playing; + self.audio.play(path, self.state.playback.volume); + } + AudioSource::Federation { + peer_id, + content_id, + } => { + self.start_federated_playback(track, peer_id, content_id); + return; + } + } + self.publish(); + } + + fn start_federated_playback(&mut self, track: Track, peer_id: String, content_id: ContentId) { + let Some(client) = self.federation.clone() else { + self.state.playback_error = Some("federation is still starting".into()); + self.publish(); + return; + }; + self.audio.stop(); + self.state.playback.status = PlaybackStatus::Stopped; + if let Some((_, item_id)) = track.key.federation_id() { + self.spawn_federated_stream(client, &track, peer_id, item_id.to_owned()); + } else { + let key = track.key; + let internal = self.internal.clone(); + tokio::spawn(async move { + let result = client + .track_by_content_id(content_id.as_str()) + .await + .map_err(|error| format!("federated playback lookup failed: {error:#}")); + let _ = internal + .send(InternalEvent::FederatedContentResolved { key, result }) + .await; + }); + } + self.publish(); + } + + fn spawn_federated_stream( + &self, + client: std::sync::Arc, + track: &Track, + peer_id: String, + item_id: String, + ) { + let key = track.key.clone(); + let internal = self.internal.clone(); + let keep = self.state.settings.save_federated_on_listen; + let directory = if keep { + expand_tilde(&self.state.settings.library_path) + } else { + self.federation_media_dir.join("stream-cache") + }; + let stem = format!("fed-{}", sanitize_filename(&track.title)); + tokio::spawn(async move { + let (tx, mut rx) = mpsc::channel(4); + let forward = internal.clone(); + let event_key = key.clone(); + let relay = tokio::spawn(async move { + while let Some(event) = rx.recv().await { + let event = match event { + federation::StreamEvent::Ready(reader, mime_type) => { + InternalEvent::FederatedStreamReady { + key: event_key.clone(), + reader, + mime_type, + } + } + federation::StreamEvent::Complete(path, metadata) => { + InternalEvent::FederatedDownloadComplete { + key: event_key.clone(), + path, + keep, + metadata: *metadata, + } + } + federation::StreamEvent::Failed(message) => { + InternalEvent::FederatedDownloadFailed { + key: event_key.clone(), + message, + } + } + }; + let _ = forward.send(event).await; + } + }); + if let Err(error) = client + .stream_track(&peer_id, &item_id, &directory, &stem, tx.clone()) + .await + { + let _ = tx + .send(federation::StreamEvent::Failed(format!( + "federated playback failed: {error:#}" + ))) + .await; + } + drop(tx); + let _ = relay.await; + }); + } + + fn remove_ephemeral_audio(&mut self) { + if let Some((_, path)) = self.ephemeral_audio.take() { + let _ = std::fs::remove_file(path); + } + } + + fn reconcile_downloaded_tracks( + &mut self, + downloaded_key: &TrackKey, + downloaded_path: &std::path::Path, + ) { + let local_tracks = self + .library + .featured_releases + .iter() + .flat_map(|release| release.tracks.iter()) + .cloned() + .collect::>(); + let downloaded_local = local_tracks.iter().find(|track| { + matches!(&track.audio_source, AudioSource::LocalFile(path) if path == downloaded_path) + }).cloned(); + for local in &local_tracks { + for track in &mut self.state.search.results.tracks { + if track.key.matches(&local.key) { + *track = local.clone(); + } + } + for track in self + .state + .search + .results + .releases + .iter_mut() + .flat_map(|release| release.tracks.iter_mut()) + { + if track.key.matches(&local.key) { + *track = local.clone(); + } + } + self.state.queue.replace_matching_track(local); + } + if let Some(local) = downloaded_local { + for track in &mut self.state.search.results.tracks { + if track.key.matches(downloaded_key) { + *track = local.clone(); + } + } + for track in self + .state + .search + .results + .releases + .iter_mut() + .flat_map(|release| release.tracks.iter_mut()) + { + if track.key.matches(downloaded_key) { + *track = local.clone(); + } + } + self.state.queue.replace_track(downloaded_key, &local); + } + } + + fn release(&self, id: &ReleaseKey) -> Option<&Release> { + self.library + .featured_releases + .iter() + .chain(self.state.search.results.releases.iter()) + .find(|release| &release.key == id) + } + + fn track(&self, key: &TrackKey) -> Option<&Track> { + find_catalog_track(&self.library, &self.state.search.results, key) + } + + fn resolve_tracks(&self, keys: &[TrackKey]) -> Vec { + keys.iter() + .filter_map(|key| self.track(key).cloned()) + .collect() + } + + fn refresh_library(&mut self) { + match library_snapshot(&self.catalog) { + Ok(library) => { + self.library = library.clone(); + self.state.library = RemoteData::Ready(library); + self.reconcile_likes(); + } + Err(error) => { + self.state.settings_error = Some(format!("library: {error:#}")); + } + } + self.publish(); + } + + fn reconcile_likes(&mut self) { + let liked = self + .catalog + .liked_content_ids() + .unwrap_or_default() + .into_iter() + .chain(self.catalog.fed_like_ids().unwrap_or_default()) + .collect::>(); + for track in self.state.search.results.tracks.iter_mut().chain( + self.state + .search + .results + .releases + .iter_mut() + .flat_map(|release| release.tracks.iter_mut()), + ) { + track.liked = track_is_liked(track, &liked); + } + let replacements = self + .library + .featured_releases + .iter() + .flat_map(|release| release.tracks.iter()) + .chain( + self.library + .playlists + .iter() + .flat_map(|playlist| playlist.tracks.iter()), + ) + .cloned() + .collect::>(); + for track in replacements { + self.state.queue.replace_matching_track(&track); + } + } + + fn toggle_like(&mut self, key: &TrackKey) { + let Some(track) = self.track(key).cloned() else { + return; + }; + let Some(content_id) = track.key.content_id().map(|id| id.as_str().to_owned()) else { + self.state.settings_error = Some("This track has no stable content ID".into()); + self.publish(); + return; + }; + let result = if self + .catalog + .track_id_by_content_id(&content_id) + .ok() + .flatten() + .is_some() + { + self.catalog + .toggle_like_by_content_id(&content_id) + .map(|liked| (liked, None)) + } else if let Some(fed) = track_to_library_fed(&track) { + self.catalog + .toggle_fed_like(&fed) + .map(|liked| (liked, track_to_synced_fed(&track))) + } else { + Err(anyhow::anyhow!( + "track cannot be stored as a federated like" + )) + }; + match result { + Ok((liked, fed)) => { + if let Err(error) = self.devices.record_like(&content_id, liked, fed) { + self.state.settings_error = Some(format!("like sync: {error:#}")); + } + self.refresh_library(); + } + Err(error) => { + self.state.settings_error = Some(format!("like: {error:#}")); + self.publish(); + } + } + } + + fn add_to_playlist(&mut self, playlist_id: i64, keys: &[TrackKey]) { + let tracks = self.resolve_tracks(keys); + let local_ids = tracks + .iter() + .filter_map(|track| track.key.local_id().map(LocalTrackId::get)) + .collect::>(); + let remote = tracks + .iter() + .filter_map(track_to_library_fed) + .collect::>(); + let result = (|| -> anyhow::Result<()> { + self.catalog + .add_tracks_to_playlist(playlist_id, &local_ids)?; + self.catalog + .add_fed_tracks_to_playlist(playlist_id, &remote)?; + self.devices + .record_playlist_tracks_added(playlist_id, &local_ids)?; + let mut synced = Vec::new(); + for track in &tracks { + let Some(content_id) = track.key.content_id().map(|id| id.as_str().to_owned()) + else { + continue; + }; + let Some(fed) = track_to_synced_fed(track) else { + continue; + }; + let position = self + .catalog + .playlist_content_position(playlist_id, &content_id)? + .unwrap_or(0); + synced.push((content_id, position, fed)); + } + self.devices + .record_playlist_fed_added(playlist_id, &synced)?; + Ok(()) + })(); + if let Err(error) = result { + self.state.settings_error = Some(format!("add to playlist: {error:#}")); + } + self.refresh_library(); + } + + fn remove_from_playlist(&mut self, playlist_id: i64, keys: &[TrackKey]) { + let tracks = self.resolve_tracks(keys); + let local_ids = tracks + .iter() + .filter_map(|track| track.key.local_id().map(LocalTrackId::get)) + .collect::>(); + let content_ids = tracks + .iter() + .filter_map(|track| track.key.content_id().map(|id| id.as_str().to_owned())) + .collect::>(); + let result = (|| -> anyhow::Result<()> { + self.catalog + .remove_tracks_from_playlist(playlist_id, &local_ids)?; + self.catalog + .remove_content_ids_from_playlist(playlist_id, &content_ids)?; + self.devices + .record_playlist_removed(playlist_id, &content_ids)?; + Ok(()) + })(); + if let Err(error) = result { + self.state.settings_error = Some(format!("remove from playlist: {error:#}")); + } + self.refresh_library(); + } + + fn publish(&mut self) { + self.publish_device_playback(); + self.state.revision = self.state.revision.saturating_add(1); + self.snapshots.send_replace(self.state.clone()); + } +} + +#[cfg(test)] +mod tests; diff --git a/crates/backend/src/settings/mod.rs b/crates/backend/src/settings/mod.rs new file mode 100644 index 0000000..67e8b15 --- /dev/null +++ b/crates/backend/src/settings/mod.rs @@ -0,0 +1,153 @@ +use std::fs; +use std::path::Path; + +use furumi_backend_api::SettingsSnapshot; +use rusqlite::{Connection, OptionalExtension, params}; + +const MIGRATIONS: &[(i64, &str)] = &[ + ( + 1, + r" + CREATE TABLE app_settings ( + singleton_id INTEGER PRIMARY KEY CHECK (singleton_id = 1), + network_id TEXT NOT NULL, + library_path TEXT NOT NULL, + federation_enabled INTEGER NOT NULL CHECK (federation_enabled IN (0, 1)), + language TEXT NOT NULL + ); + INSERT INTO app_settings ( + singleton_id, network_id, library_path, federation_enabled, language + ) VALUES (1, 'furumi', '~/Music/Furumi', 1, 'English'); + ", + ), + ( + 2, + "ALTER TABLE app_settings ADD COLUMN save_federated_on_listen INTEGER NOT NULL DEFAULT 1 CHECK (save_federated_on_listen IN (0, 1));", + ), + ( + 3, + "ALTER TABLE app_settings ADD COLUMN device_name TEXT NOT NULL DEFAULT '';", + ), +]; + +pub struct SettingsStore { + connection: Connection, +} + +impl SettingsStore { + pub fn open(path: &Path) -> rusqlite::Result { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent) + .map_err(|error| rusqlite::Error::ToSqlConversionFailure(Box::new(error)))?; + } + let connection = Connection::open(path)?; + let mut store = Self { connection }; + store.migrate()?; + Ok(store) + } + + #[cfg(test)] + fn in_memory() -> rusqlite::Result { + let connection = Connection::open_in_memory()?; + let mut store = Self { connection }; + store.migrate()?; + Ok(store) + } + + pub fn load(&self) -> rusqlite::Result { + self.connection.query_row( + "SELECT network_id, library_path, federation_enabled, language, + save_federated_on_listen, device_name + FROM app_settings WHERE singleton_id = 1", + [], + |row| { + Ok(SettingsSnapshot { + network_id: row.get(0)?, + library_path: row.get(1)?, + federation_enabled: row.get::<_, i64>(2)? != 0, + language: row.get(3)?, + save_federated_on_listen: row.get::<_, i64>(4)? != 0, + device_name: row.get(5)?, + }) + }, + ) + } + + pub fn save(&self, settings: &SettingsSnapshot) -> rusqlite::Result<()> { + self.connection.execute( + "UPDATE app_settings + SET network_id = ?1, + library_path = ?2, + federation_enabled = ?3, + language = ?4, + save_federated_on_listen = ?5, + device_name = ?6 + WHERE singleton_id = 1", + params![ + settings.network_id, + settings.library_path, + i64::from(settings.federation_enabled), + settings.language, + i64::from(settings.save_federated_on_listen), + settings.device_name, + ], + )?; + Ok(()) + } + + fn migrate(&mut self) -> rusqlite::Result<()> { + self.connection.execute_batch( + "PRAGMA foreign_keys = ON; + CREATE TABLE IF NOT EXISTS schema_migrations ( + version INTEGER PRIMARY KEY, + applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + );", + )?; + + for &(version, sql) in MIGRATIONS { + let applied = self + .connection + .query_row( + "SELECT 1 FROM schema_migrations WHERE version = ?1", + [version], + |_| Ok(()), + ) + .optional()? + .is_some(); + if applied { + continue; + } + let transaction = self.connection.transaction()?; + transaction.execute_batch(sql)?; + transaction.execute( + "INSERT INTO schema_migrations (version) VALUES (?1)", + [version], + )?; + transaction.commit()?; + } + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn migration_creates_defaults_and_settings_round_trip() { + let store = SettingsStore::in_memory().unwrap(); + let mut settings = store.load().unwrap(); + assert_eq!(settings.network_id, "furumi"); + assert!(settings.federation_enabled); + assert!(settings.save_federated_on_listen); + assert!(settings.device_name.is_empty()); + + settings.network_id = "friends".into(); + settings.device_name = "Studio Mac".into(); + settings.library_path = "/music/library".into(); + settings.federation_enabled = false; + store.save(&settings).unwrap(); + + assert_eq!(store.load().unwrap(), settings); + } +} diff --git a/crates/backend/src/streaming.rs b/crates/backend/src/streaming.rs new file mode 100644 index 0000000..b9b79e8 --- /dev/null +++ b/crates/backend/src/streaming.rs @@ -0,0 +1,97 @@ +use std::fs::File; +use std::io::{self, Read, Seek, SeekFrom}; +use std::path::Path; +use std::sync::{Arc, Condvar, Mutex}; + +#[derive(Default)] +struct State { + available: u64, + complete: bool, +} +#[derive(Default)] +struct Shared { + state: Mutex, + changed: Condvar, +} +pub struct GrowingFileReader { + file: File, + pos: u64, + shared: Arc, +} +pub struct GrowingFileWriter { + shared: Arc, +} + +pub fn growing_file(path: &Path) -> io::Result<(GrowingFileReader, GrowingFileWriter)> { + let shared = Arc::new(Shared::default()); + Ok(( + GrowingFileReader { + file: File::open(path)?, + pos: 0, + shared: Arc::clone(&shared), + }, + GrowingFileWriter { shared }, + )) +} +impl GrowingFileWriter { + pub fn add_available(&self, bytes: u64) { + let mut state = self + .shared + .state + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner); + state.available = state.available.saturating_add(bytes); + self.shared.changed.notify_all(); + } + pub fn finish(&self) { + let mut state = self + .shared + .state + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner); + state.complete = true; + self.shared.changed.notify_all(); + } +} +impl Drop for GrowingFileWriter { + fn drop(&mut self) { + self.finish(); + } +} +impl Read for GrowingFileReader { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + loop { + let mut state = self + .shared + .state + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner); + while self.pos >= state.available && !state.complete { + state = self + .shared + .changed + .wait(state) + .unwrap_or_else(std::sync::PoisonError::into_inner); + } + if self.pos >= state.available { + return Ok(0); + } + let n = usize::try_from((state.available - self.pos).min(buf.len() as u64)) + .unwrap_or(buf.len()); + drop(state); + let read = self.file.read(&mut buf[..n])?; + self.pos += read as u64; + if read > 0 { + return Ok(read); + } + } + } +} +impl Seek for GrowingFileReader { + fn seek(&mut self, _: SeekFrom) -> io::Result { + Err(io::Error::new( + io::ErrorKind::Unsupported, + "federated stream is not seekable while downloading", + )) + } +} diff --git a/crates/backend/src/support.rs b/crates/backend/src/support.rs new file mode 100644 index 0000000..972f856 --- /dev/null +++ b/crates/backend/src/support.rs @@ -0,0 +1,955 @@ +use super::{ + Artist, ArtistId, ArtistKey, ArtistRef, Artwork, AudioSource, BuildInfoSnapshot, + CONTROL_POSITION_ACK_TOLERANCE_SECONDS, CatalogSource, ContentId, DevicePlaybackRole, Duration, + HashMap, HashSet, InternalEvent, LibrarySnapshot, LocalTrackId, PlaybackStatus, + PlaylistSnapshot, Release, ReleaseId, ReleaseKey, SearchResults, SettingsSnapshot, + SettingsStore, Track, TrackKey, VersionEntrySnapshot, federation, mpsc, std_mpsc, thread, +}; +pub(super) fn expand_tilde(value: &str) -> std::path::PathBuf { + if value == "~" { + directories::UserDirs::new().map_or_else(|| value.into(), |dirs| dirs.home_dir().into()) + } else if let Some(rest) = value.strip_prefix("~/") { + directories::UserDirs::new().map_or_else(|| value.into(), |dirs| dirs.home_dir().join(rest)) + } else { + value.into() + } +} + +pub(super) fn normalize_device_name(value: &str) -> String { + let value = value.trim(); + if value.is_empty() { + "furumi".into() + } else { + value.into() + } +} + +pub(super) fn selected_track_position(tracks: &[Track], selected: &TrackKey) -> usize { + tracks + .iter() + .position(|track| track.key.matches(selected)) + .unwrap_or(0) +} + +pub(super) fn runtime_build_info() -> BuildInfoSnapshot { + use music_dht::capabilities::{ + CATALOG_ID, CapabilityManifest, DEVICE_SYNC_ID, FEDERATION_NET_ID, MUSIC_DHT_ID, + RENDEZVOUS_ID, TICKET_ID, + }; + + let manifest = CapabilityManifest::frid("furumi-desktop", env!("CARGO_PKG_VERSION")); + let protocol = |name: &str, id: &str| VersionEntrySnapshot { + name: name.into(), + version: manifest + .protocols + .get(id) + .map_or_else(|| "unknown".into(), u16::to_string), + }; + BuildInfoSnapshot { + software: vec![ + VersionEntrySnapshot { + name: "furumi-desktop".into(), + version: env!("CARGO_PKG_VERSION").into(), + }, + VersionEntrySnapshot { + name: "furumi-library".into(), + version: env!("FURUMI_LIBRARY_VERSION").into(), + }, + VersionEntrySnapshot { + name: "music-dht".into(), + version: env!("FURUMI_MUSIC_DHT_VERSION").into(), + }, + VersionEntrySnapshot { + name: "federation-net".into(), + version: env!("FURUMI_FEDERATION_NET_VERSION").into(), + }, + ], + protocols: vec![ + protocol("Federation transport", FEDERATION_NET_ID), + protocol("Peer ticket", TICKET_ID), + protocol("Rendezvous", RENDEZVOUS_ID), + protocol("Music DHT", MUSIC_DHT_ID), + protocol("Catalog", CATALOG_ID), + VersionEntrySnapshot { + name: "Audio transfer".into(), + version: federation::AUDIO_PROTOCOL_VERSION.to_string(), + }, + VersionEntrySnapshot { + name: "Connected devices".into(), + version: format!( + "{} · accepts v1", + manifest + .protocols + .get(DEVICE_SYNC_ID) + .copied() + .unwrap_or_default() + ), + }, + ], + } +} + +pub(super) fn find_catalog_track<'a>( + library: &'a LibrarySnapshot, + search: &'a SearchResults, + key: &TrackKey, +) -> Option<&'a Track> { + library + .featured_releases + .iter() + .flat_map(|release| release.tracks.iter()) + .chain( + library + .playlists + .iter() + .flat_map(|playlist| playlist.tracks.iter()), + ) + .chain( + search + .releases + .iter() + .flat_map(|release| release.tracks.iter()), + ) + .chain(search.tracks.iter()) + .find(|track| track.key.matches(key)) +} + +pub(super) fn portable_playback_placeholder( + wire: &music_dht::device_sync::PlaybackTrack, + content_id: ContentId, +) -> Track { + let peer_id = "content".to_owned(); + let refs = |names: &[String]| { + names + .iter() + .map(|name| ArtistRef { + key: ArtistKey::Federation { + peer_id: peer_id.clone(), + id: format!("name:{}", music_dht::normalize_name(name)), + }, + name: name.clone(), + }) + .collect::>() + }; + Track { + key: TrackKey::remote(content_id.clone()), + title: wire.title.clone(), + artist: playback_artist_line(&wire.artist_names, &wire.featured_artist_names), + artists: refs(&wire.artist_names), + featured_artists: refs(&wire.featured_artist_names), + release: wire.release_title.clone(), + release_id: ReleaseKey::Federation { + peer_id: peer_id.clone(), + id: format!("name:{}", music_dht::normalize_name(&wire.release_title)), + }, + duration_seconds: wire.duration_seconds, + track_number: wire + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: wire.disc_number.and_then(|value| u32::try_from(value).ok()), + cover_uri: None, + audio_format: wire.audio_format.clone(), + audio_bitrate_kbps: wire + .audio_bitrate + .and_then(|value| u32::try_from(value).ok()), + audio_sample_rate_hz: wire + .audio_sample_rate + .and_then(|value| u32::try_from(value).ok()), + audio_bit_depth: wire + .audio_bit_depth + .and_then(|value| u32::try_from(value).ok()), + file_size_bytes: wire + .file_size_bytes + .and_then(|value| u64::try_from(value).ok()), + liked: false, + audio_source: AudioSource::Federation { + peer_id: String::new(), + content_id, + }, + } +} + +pub(super) fn playback_artist_line(main: &[String], featured: &[String]) -> String { + match (main.is_empty(), featured.is_empty()) { + (false, false) => format!("{} feat. {}", main.join(", "), featured.join(", ")), + (false, true) => main.join(", "), + (true, false) => format!("feat. {}", featured.join(", ")), + (true, true) => String::new(), + } +} + +pub(super) fn extrapolated_control_position( + state: &music_dht::device_sync::PlaybackStateWire, + elapsed: Duration, +) -> f64 { + let elapsed = if state.playing && !state.paused { + elapsed.as_secs_f64() + } else { + 0.0 + }; + (state.position_secs + elapsed).max(0.0) +} + +pub(super) fn remote_snapshot_has_authority( + role: DevicePlaybackRole, + active_device_id: &str, + local_status: PlaybackStatus, + local_queue_empty: bool, + snapshot: &music_dht::device_sync::PlaybackSnapshot, +) -> bool { + if !snapshot.active { + return false; + } + match role { + DevicePlaybackRole::Control => snapshot.device_id == active_device_id, + DevicePlaybackRole::Active => local_status == PlaybackStatus::Stopped && local_queue_empty, + } +} + +pub(super) fn playback_state_acknowledges_command( + expected: &music_dht::device_sync::PlaybackStateWire, + actual: &music_dht::device_sync::PlaybackStateWire, + seek: bool, + elapsed: Duration, +) -> bool { + let same_queue = expected.queue.len() == actual.queue.len() + && expected + .queue + .iter() + .zip(&actual.queue) + .all(|(expected, actual)| playback_tracks_equivalent(expected, actual)); + let same_transport = expected.queue_pos == actual.queue_pos + && expected.playing == actual.playing + && expected.paused == actual.paused + && expected.volume == actual.volume + && expected.shuffle == actual.shuffle + && expected.repeat == actual.repeat; + if !same_queue || !same_transport { + return false; + } + if !seek { + return true; + } + let expected_position = extrapolated_control_position(expected, elapsed); + (expected_position - actual.position_secs).abs() <= CONTROL_POSITION_ACK_TOLERANCE_SECONDS +} + +pub(super) fn playback_tracks_equivalent( + left: &music_dht::device_sync::PlaybackTrack, + right: &music_dht::device_sync::PlaybackTrack, +) -> bool { + let content_id = |track: &music_dht::device_sync::PlaybackTrack| { + track + .content_id + .as_deref() + .and_then(music_dht::normalize_content_id) + .or_else(|| { + track + .fed + .as_ref() + .and_then(|fed| music_dht::normalize_content_id(&fed.content_id)) + }) + }; + match (content_id(left), content_id(right)) { + (Some(left), Some(right)) => left == right, + _ => { + music_dht::normalize_name(&left.title) == music_dht::normalize_name(&right.title) + && music_dht::normalize_name(&left.release_title) + == music_dht::normalize_name(&right.release_title) + && left.track_number == right.track_number + && left.disc_number == right.disc_number + && normalized_artist_names(&left.artist_names) + == normalized_artist_names(&right.artist_names) + } + } +} + +pub(super) fn normalized_artist_names(names: &[String]) -> Vec { + names + .iter() + .map(|name| music_dht::normalize_name(name)) + .collect() +} + +pub(super) fn unix_time_ms() -> i64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .map_or(0, |duration| { + i64::try_from(duration.as_millis()).unwrap_or(i64::MAX) + }) +} + +#[allow( + clippy::cast_possible_truncation, + clippy::cast_sign_loss, + reason = "the playback volume is clamped to the wire protocol's 0..=100 range" +)] +pub(super) fn volume_percent(volume: f32) -> u8 { + (volume.clamp(0.0, 1.0) * 100.0).round() as u8 +} + +pub(super) fn track_to_synced_fed(track: &Track) -> Option { + let (owner, item_id) = track.key.federation_id()?; + let content_id = track.key.content_id()?.as_str().to_owned(); + Some(music_dht::device_sync::SyncedFedTrack { + item_id: item_id.to_owned(), + owner: owner.to_owned(), + title: track.title.clone(), + artist_names: track + .artists + .iter() + .map(|artist| artist.name.clone()) + .collect(), + featured_artist_names: track + .featured_artists + .iter() + .map(|artist| artist.name.clone()) + .collect(), + year: None, + duration_seconds: (track.duration_seconds.is_finite() && track.duration_seconds > 0.0) + .then(|| { + i64::try_from(Duration::from_secs_f64(track.duration_seconds).as_secs()) + .unwrap_or(i64::MAX) + }), + content_id, + release_title: (!track.release.is_empty()).then(|| track.release.clone()), + track_number: track + .track_number + .and_then(|value| i32::try_from(value).ok()), + disc_number: track + .disc_number + .and_then(|value| i32::try_from(value).ok()), + }) +} + +pub(super) fn track_to_library_fed(track: &Track) -> Option { + let synced = track_to_synced_fed(track)?; + Some(furumi_library::FederatedTrack { + item_id: synced.item_id, + owner: synced.owner, + own: false, + title: synced.title, + artist_names: synced.artist_names, + featured_artist_names: synced.featured_artist_names, + year: synced.year, + duration_seconds: synced.duration_seconds, + content_id: Some(synced.content_id), + release_title: synced.release_title, + track_number: synced.track_number, + disc_number: synced.disc_number, + }) +} + +pub(super) fn track_to_playback_track(track: &Track) -> music_dht::device_sync::PlaybackTrack { + let id = track.key.local_id().map_or(-1, LocalTrackId::get); + let release_id = match track.release_id { + ReleaseKey::Local(id) => id.get(), + ReleaseKey::Federation { .. } => -1, + }; + music_dht::device_sync::PlaybackTrack { + id, + title: track.title.clone(), + track_number: track + .track_number + .and_then(|value| i32::try_from(value).ok()), + disc_number: track + .disc_number + .and_then(|value| i32::try_from(value).ok()), + duration_seconds: track.duration_seconds, + artist_names: track + .artists + .iter() + .map(|artist| artist.name.clone()) + .collect(), + featured_artist_names: track + .featured_artists + .iter() + .map(|artist| artist.name.clone()) + .collect(), + release_id, + release_title: track.release.clone(), + release_year: None, + file_path: String::new(), + content_id: track.key.content_id().map(|id| id.as_str().to_owned()), + audio_format: track.audio_format.clone(), + audio_bitrate: track + .audio_bitrate_kbps + .and_then(|value| i32::try_from(value).ok()), + audio_sample_rate: track + .audio_sample_rate_hz + .and_then(|value| i32::try_from(value).ok()), + audio_bit_depth: track + .audio_bit_depth + .and_then(|value| i32::try_from(value).ok()), + file_size_bytes: track + .file_size_bytes + .and_then(|value| i64::try_from(value).ok()), + play_count: 0, + fed: track_to_synced_fed(track), + } +} + +pub(super) fn sanitize_filename(value: &str) -> String { + let clean: String = value + .chars() + .map(|c| { + if c.is_alphanumeric() || matches!(c, '-' | '_') { + c + } else { + '_' + } + }) + .collect(); + if clean.is_empty() { + "track".into() + } else { + clean + } +} + +pub(super) fn federation_specs( + library: &furumi_library::Library, +) -> anyhow::Result> { + let export = library.federation_export()?; + let mut specs = Vec::new(); + for (id, name) in export.artists { + specs.push(music_dht::ItemSpec { + local_key: format!("artist:{id}"), + kind: music_dht::ItemKind::Artist, + name, + artist_names: Vec::new(), + featured_artist_names: Vec::new(), + year: None, + release_type: None, + release_title: None, + track_number: None, + disc_number: None, + duration_seconds: None, + content_id: None, + }); + } + for release in export.releases { + specs.push(music_dht::ItemSpec { + local_key: format!("release:{}", release.id), + kind: music_dht::ItemKind::Release, + name: release.title, + artist_names: release.artist_names, + featured_artist_names: Vec::new(), + year: release.year, + release_type: Some(release.release_type), + release_title: None, + track_number: None, + disc_number: None, + duration_seconds: None, + content_id: None, + }); + } + for track in export.tracks { + specs.push(music_dht::ItemSpec { + local_key: format!("track:{}", track.id), + kind: music_dht::ItemKind::Track, + name: track.title, + artist_names: track.artist_names, + featured_artist_names: track.featured_artist_names, + year: track.year, + release_type: Some(track.release_type), + release_title: Some(track.release_title), + track_number: track.track_number, + disc_number: track.disc_number, + duration_seconds: (track.duration_seconds > 0.0).then_some(track.duration_seconds), + content_id: track.content_id, + }); + } + Ok(specs) +} + +pub(super) fn apply_federated_metadata( + import: &mut furumi_library::import::TrackImport, + metadata: Option, +) { + let Some(metadata) = metadata else { + return; + }; + if !metadata.title.trim().is_empty() { + import.title = metadata.title; + } + if !metadata.artists.is_empty() { + import.artists = metadata.artists; + } + if !metadata.featured_artists.is_empty() { + import.featured_artists = metadata.featured_artists; + } + if !metadata.album_artists.is_empty() { + import.album_artists = metadata.album_artists; + } + if !metadata.release_title.trim().is_empty() { + import.release_title = metadata.release_title; + } + import.release_type = metadata.release_type.or(import.release_type.take()); + import.year = metadata.year.or(import.year); + import.track_number = metadata.track_number.or(import.track_number); + import.disc_number = metadata.disc_number.or(import.disc_number); + import.duration_seconds = metadata.duration_seconds.unwrap_or(import.duration_seconds); + import.audio_format = metadata.audio_format.or(import.audio_format.take()); + import.audio_bitrate = metadata.audio_bitrate.or(import.audio_bitrate); + import.audio_sample_rate = metadata.audio_sample_rate.or(import.audio_sample_rate); + import.audio_bit_depth = metadata.audio_bit_depth.or(import.audio_bit_depth); +} + +pub(super) fn spawn_settings_worker( + store: SettingsStore, + receiver: std_mpsc::Receiver, + events: mpsc::Sender, +) { + let report = events.clone(); + if let Err(error) = thread::Builder::new() + .name("furumi-settings-storage".into()) + .spawn(move || { + while let Ok(mut settings) = receiver.recv() { + for newer in receiver.try_iter() { + settings = newer; + } + let result = store.save(&settings).map_err(|error| error.to_string()); + if events + .blocking_send(InternalEvent::SettingsPersisted(result)) + .is_err() + { + break; + } + } + }) + { + let _ = report.blocking_send(InternalEvent::SettingsPersisted(Err(format!( + "settings worker: {error}" + )))); + } +} + +pub(super) fn local_search_results( + catalog: &furumi_library::Library, + query: &str, +) -> anyhow::Result { + let found = catalog.search(query, 50)?; + let artists = found + .artists + .into_iter() + .map(|artist| Artist { + key: ArtistKey::local(ArtistId::new(artist.id)), + source: CatalogSource::Local, + name: artist.name, + artwork: Artwork { + uri: artist.image_path, + }, + release_count: usize::try_from(artist.release_count.max(0)).unwrap_or(usize::MAX), + track_count: usize::try_from(artist.track_count.max(0)).unwrap_or(usize::MAX), + }) + .collect(); + let mut releases = Vec::with_capacity(found.releases.len()); + for card in found.releases { + let detail = catalog.release(card.id)?; + releases.push(library_release(detail)); + } + let tracks = found + .tracks + .into_iter() + .map(|track| library_track(track, "")) + .collect(); + Ok(SearchResults { + artists, + releases, + tracks, + }) +} + +pub(super) fn merge_search_results(target: &mut SearchResults, incoming: SearchResults) { + for artist in incoming.artists { + if let Some(existing) = target + .artists + .iter_mut() + .find(|item| item.key == artist.key) + { + existing.release_count = existing.release_count.max(artist.release_count); + existing.track_count = existing.track_count.max(artist.track_count); + if existing.artwork.uri.is_none() && artist.artwork.uri.is_some() { + existing.artwork = artist.artwork; + } + } else { + target.artists.push(artist); + } + } + for mut release in incoming.releases { + populate_release_contributors(&mut release); + sort_release_tracks(&mut release.tracks); + if let Some(existing) = target + .releases + .iter_mut() + .find(|item| item.key == release.key) + { + merge_release_preserving_local(existing, release); + } else { + target.releases.push(release); + } + } + for track in incoming.tracks { + if let Some(existing) = target + .tracks + .iter_mut() + .find(|item| item.same_catalog_track(&track)) + { + if matches!(existing.audio_source, AudioSource::Federation { .. }) + && matches!(track.audio_source, AudioSource::LocalFile(_)) + { + *existing = track; + } + } else { + target.tracks.push(track); + } + } +} + +pub(super) fn merge_release_preserving_local(target: &mut Release, incoming: Release) { + if matches!(target.source, CatalogSource::Federation { .. }) + && matches!(incoming.source, CatalogSource::Local) + { + let previous = std::mem::replace(target, incoming); + merge_release_preserving_local(target, previous); + return; + } + if target.artwork.uri.is_none() && incoming.artwork.uri.is_some() { + target.artwork = incoming.artwork; + } + merge_artist_refs(&mut target.artists, incoming.artists); + merge_artist_refs(&mut target.featured_artists, incoming.featured_artists); + for track in incoming.tracks { + if let Some(current) = target + .tracks + .iter_mut() + .find(|item| tracks_match_within_release(item, &track)) + { + if matches!(current.audio_source, AudioSource::Federation { .. }) + && matches!(track.audio_source, AudioSource::LocalFile(_)) + { + *current = track; + } + } else { + target.tracks.push(track); + } + } + sort_release_tracks(&mut target.tracks); + populate_release_contributors(target); +} + +fn sort_release_tracks(tracks: &mut [Track]) { + tracks.sort_by(|left, right| { + left.disc_number + .unwrap_or(1) + .cmp(&right.disc_number.unwrap_or(1)) + .then_with(|| { + left.track_number + .unwrap_or(u32::MAX) + .cmp(&right.track_number.unwrap_or(u32::MAX)) + }) + .then_with(|| left.title.cmp(&right.title)) + }); +} + +/// Match provider records within an already identified release. Track/disc +/// position is more reliable here than optional remote descriptive metadata. +pub(super) fn tracks_match_within_release(left: &Track, right: &Track) -> bool { + if left.key.matches(&right.key) { + return true; + } + if let (Some(left_number), Some(right_number)) = (left.track_number, right.track_number) + && left_number == right_number + && left.disc_number.unwrap_or(1) == right.disc_number.unwrap_or(1) + { + return true; + } + music_dht::normalize_name(&left.title) == music_dht::normalize_name(&right.title) +} + +pub(super) fn merge_artist_refs(target: &mut Vec, incoming: Vec) { + let mut known = target + .iter() + .map(|artist| music_dht::normalize_name(&artist.name)) + .collect::>(); + target.extend( + incoming + .into_iter() + .filter(|artist| known.insert(music_dht::normalize_name(&artist.name))), + ); +} + +pub(super) fn populate_release_contributors(release: &mut Release) { + let mut known = release + .artists + .iter() + .chain(release.featured_artists.iter()) + .map(|artist| music_dht::normalize_name(&artist.name)) + .collect::>(); + for artist in release + .tracks + .iter() + .flat_map(|track| track.artists.iter().chain(track.featured_artists.iter())) + { + if known.insert(music_dht::normalize_name(&artist.name)) { + release.featured_artists.push(artist.clone()); + } + } +} + +pub(super) fn library_release(detail: furumi_library::ReleaseDetail) -> Release { + let (artists, featured_artists) = release_artist_roles(&detail); + let fallback = artists + .iter() + .map(|artist| artist.name.as_str()) + .collect::>() + .join(", "); + Release { + key: ReleaseKey::local(ReleaseId::new(detail.id)), + source: CatalogSource::Local, + title: detail.title, + artists, + featured_artists, + release_type: detail.release_type, + year: detail.year, + artwork: Artwork { + uri: detail.cover_path, + }, + tracks: detail + .tracks + .into_iter() + .map(|track| library_track(track, &fallback)) + .collect(), + } +} + +pub(super) fn library_snapshot( + catalog: &furumi_library::Library, +) -> anyhow::Result { + let liked_ids = catalog + .liked_content_ids()? + .into_iter() + .chain(catalog.fed_like_ids()?) + .collect::>(); + let artist_cards = catalog.artists( + 1, + i64::MAX, + furumi_library::LibraryFilters { + source_mode: furumi_library::LibrarySourceMode::Local, + ..furumi_library::LibraryFilters::default() + }, + )?; + let artists = artist_cards + .items + .into_iter() + .map(|artist| Artist { + key: ArtistKey::local(ArtistId::new(artist.id)), + source: CatalogSource::Local, + name: artist.name, + artwork: Artwork { + uri: artist.image_path, + }, + release_count: usize::try_from(artist.release_count.max(0)).unwrap_or(usize::MAX), + track_count: usize::try_from(artist.track_count.max(0)).unwrap_or(usize::MAX), + }) + .collect(); + let mut releases = Vec::new(); + for card in catalog.releases()? { + let detail = catalog.release(card.id)?; + let (artist_refs, featured_artist_refs) = release_artist_roles(&detail); + let artist_line = artist_refs + .iter() + .map(|artist| artist.name.as_str()) + .collect::>() + .join(", "); + let mut tracks = detail + .tracks + .into_iter() + .map(|track| library_track(track, &artist_line)) + .collect::>(); + for track in &mut tracks { + track.liked = track_is_liked(track, &liked_ids); + } + releases.push(Release { + key: ReleaseKey::local(ReleaseId::new(detail.id)), + source: CatalogSource::Local, + title: detail.title, + artists: artist_refs, + featured_artists: featured_artist_refs, + release_type: detail.release_type, + year: detail.year, + artwork: Artwork { + uri: detail.cover_path, + }, + tracks, + }); + } + let recently_played = releases + .iter() + .flat_map(|release| release.tracks.iter().cloned()) + .take(12) + .collect(); + let mut playlists = Vec::new(); + for card in catalog.playlists()? { + let detail = catalog.playlist(card.id)?; + let mut tracks = detail + .tracks + .into_iter() + .map(|track| library_track(track, "")) + .collect::>(); + for track in &mut tracks { + track.liked = track_is_liked(track, &liked_ids); + } + playlists.push(PlaylistSnapshot { + id: card.id, + title: detail.title, + is_likes: card.kind == "likes", + tracks, + }); + } + Ok(LibrarySnapshot { + artists, + featured_releases: releases, + recently_played, + playlists, + }) +} + +pub(super) fn track_is_liked(track: &Track, liked_ids: &HashSet) -> bool { + track + .key + .content_id() + .is_some_and(|id| liked_ids.contains(id.as_str())) + || track + .key + .federation_id() + .is_some_and(|(_, item)| liked_ids.contains(item)) +} + +pub(super) fn release_artist_roles( + detail: &furumi_library::ReleaseDetail, +) -> (Vec, Vec) { + let mut main_counts = HashMap::::new(); + let mut featured = HashMap::::new(); + for track in &detail.tracks { + for artist in &track.artists { + *main_counts.entry(artist.id).or_default() += 1; + } + for artist in &track.featured_artists { + featured + .entry(artist.id) + .or_insert_with(|| artist.name.clone()); + } + } + + let mut main_artists = Vec::new(); + let mut featured_artists = Vec::new(); + let mut known = HashSet::new(); + for artist in &detail.artists { + known.insert(artist.id); + let reference = ArtistRef { + key: ArtistKey::local(ArtistId::new(artist.id)), + name: artist.name.clone(), + }; + if main_counts.contains_key(&artist.id) || !featured.contains_key(&artist.id) { + main_artists.push(reference); + } else { + featured_artists.push(reference); + } + } + for track in &detail.tracks { + for artist in &track.artists { + if known.insert(artist.id) { + main_artists.push(ArtistRef { + key: ArtistKey::local(ArtistId::new(artist.id)), + name: artist.name.clone(), + }); + } + } + } + for (id, name) in featured { + if known.insert(id) { + featured_artists.push(ArtistRef { + key: ArtistKey::local(ArtistId::new(id)), + name, + }); + } + } + main_artists.sort_by(|left, right| { + let count = |artist: &ArtistRef| match artist.key { + ArtistKey::Local(id) => main_counts.get(&id.get()).copied().unwrap_or_default(), + ArtistKey::Federation { .. } => 0, + }; + count(right).cmp(&count(left)) + }); + (main_artists, featured_artists) +} + +pub(super) fn library_track(track: furumi_library::TrackItem, fallback_artist: &str) -> Track { + let content_id = track + .content_id + .as_deref() + .and_then(|content_id| ContentId::parse(content_id).ok()); + let local_id = LocalTrackId::new(track.id); + let key = content_id.map_or_else( + || TrackKey::local(local_id), + |content_id| TrackKey::new(local_id, content_id), + ); + let artists = track + .artists + .iter() + .map(|artist| ArtistRef { + key: ArtistKey::local(ArtistId::new(artist.id)), + name: artist.name.clone(), + }) + .collect::>(); + let featured_artists = track + .featured_artists + .iter() + .map(|artist| ArtistRef { + key: ArtistKey::local(ArtistId::new(artist.id)), + name: artist.name.clone(), + }) + .collect::>(); + let artist = { + let value = track.artist_line(); + if value.is_empty() { + fallback_artist.to_string() + } else { + value + } + }; + Track { + key, + title: track.title, + artist, + artists, + featured_artists, + release: track.release_title, + release_id: ReleaseKey::local(ReleaseId::new(track.release_id)), + duration_seconds: track.duration_seconds, + track_number: track + .track_number + .and_then(|value| u32::try_from(value).ok()), + disc_number: track + .disc_number + .and_then(|value| u32::try_from(value).ok()), + cover_uri: track.cover_path, + audio_format: track.audio_format, + audio_bitrate_kbps: track + .audio_bitrate + .and_then(|value| u32::try_from(value).ok()), + audio_sample_rate_hz: track + .audio_sample_rate + .and_then(|value| u32::try_from(value).ok()), + audio_bit_depth: track + .audio_bit_depth + .and_then(|value| u32::try_from(value).ok()), + file_size_bytes: track + .file_size_bytes + .and_then(|value| u64::try_from(value).ok()), + liked: false, + audio_source: AudioSource::LocalFile(track.file_path.into()), + } +} diff --git a/crates/backend/src/tests.rs b/crates/backend/src/tests.rs new file mode 100644 index 0000000..c20233a --- /dev/null +++ b/crates/backend/src/tests.rs @@ -0,0 +1,462 @@ +use super::*; + +fn merge_test_track(key: TrackKey, audio_source: AudioSource) -> Track { + Track { + key, + title: "Track".into(), + artist: "Artist".into(), + artists: vec![ArtistRef { + key: ArtistKey::local(ArtistId::new(1)), + name: "Artist".into(), + }], + featured_artists: Vec::new(), + release: "Album".into(), + release_id: ReleaseKey::local(ReleaseId::new(1)), + duration_seconds: 180.0, + track_number: Some(1), + disc_number: Some(1), + cover_uri: None, + audio_format: Some("flac".into()), + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source, + } +} + +#[test] +fn merging_search_results_deduplicates_source_keys() { + let artist = Artist { + key: ArtistKey::Federation { + peer_id: "peer".into(), + id: "artist".into(), + }, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + name: "Artist".into(), + artwork: Artwork::default(), + release_count: 0, + track_count: 0, + }; + let mut target = SearchResults { + artists: vec![artist.clone()], + ..SearchResults::default() + }; + merge_search_results( + &mut target, + SearchResults { + artists: vec![artist], + ..SearchResults::default() + }, + ); + assert_eq!(target.artists.len(), 1); +} + +#[test] +fn newly_received_release_tracks_are_sorted_by_disc_and_track_number() { + let mut fifth = merge_test_track( + TrackKey::federation("peer".into(), "five".into(), None), + AudioSource::Federation { + peer_id: "peer".into(), + content_id: ContentId::parse(format!("b3:{}", "5".repeat(64))).unwrap(), + }, + ); + fifth.title = "Los".into(); + fifth.track_number = Some(5); + let mut first = merge_test_track( + TrackKey::federation("peer".into(), "one".into(), None), + AudioSource::Federation { + peer_id: "peer".into(), + content_id: ContentId::parse(format!("b3:{}", "1".repeat(64))).unwrap(), + }, + ); + first.title = "Reise, Reise".into(); + + let mut target = SearchResults::default(); + merge_search_results( + &mut target, + SearchResults { + releases: vec![Release { + key: ReleaseKey::Federation { + peer_id: "peer".into(), + id: "reise-reise".into(), + }, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: "Reise, Reise".into(), + artists: first.artists.clone(), + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2004), + artwork: Artwork::default(), + tracks: vec![fifth, first], + }], + ..SearchResults::default() + }, + ); + + assert_eq!( + target.releases[0] + .tracks + .iter() + .map(|track| track.track_number) + .collect::>(), + vec![Some(1), Some(5)] + ); +} + +#[test] +fn selected_track_key_survives_context_filtering_and_reordering() { + let selected = TrackKey::local(LocalTrackId::new(2)); + let resolved = vec![ + merge_test_track( + TrackKey::local(LocalTrackId::new(3)), + AudioSource::LocalFile("three.flac".into()), + ), + merge_test_track(selected.clone(), AudioSource::LocalFile("two.flac".into())), + ]; + + assert_eq!(selected_track_position(&resolved, &selected), 1); +} + +#[test] +fn queue_artwork_requests_are_grouped_per_peer_and_release() { + let first_content = ContentId::parse(format!("b3:{}", "1".repeat(64))).unwrap(); + let second_content = ContentId::parse(format!("b3:{}", "2".repeat(64))).unwrap(); + let mut first = merge_test_track( + TrackKey::federation("peer".into(), "one".into(), Some(first_content.clone())), + AudioSource::Federation { + peer_id: "peer".into(), + content_id: first_content, + }, + ); + let mut second = merge_test_track( + TrackKey::federation("peer".into(), "two".into(), Some(second_content.clone())), + AudioSource::Federation { + peer_id: "peer".into(), + content_id: second_content, + }, + ); + first.title = "One".into(); + second.title = "Two".into(); + + assert_eq!( + Actor::queue_artwork_request_id(&first), + Actor::queue_artwork_request_id(&second) + ); + second.release = "Another album".into(); + assert_ne!( + Actor::queue_artwork_request_id(&first), + Actor::queue_artwork_request_id(&second) + ); +} + +#[test] +fn federated_release_enrichment_never_replaces_a_local_track() { + let release_key = ReleaseKey::local(ReleaseId::new(1)); + let artist = ArtistRef { + key: ArtistKey::local(ArtistId::new(1)), + name: "Artist".into(), + }; + let local_track = merge_test_track( + TrackKey::local(LocalTrackId::new(1)), + AudioSource::LocalFile("track.flac".into()), + ); + let mut target = SearchResults { + releases: vec![Release { + key: release_key.clone(), + source: CatalogSource::Local, + title: "Album".into(), + artists: vec![artist.clone()], + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: Artwork::default(), + tracks: vec![local_track], + }], + ..SearchResults::default() + }; + let content_id = ContentId::parse(format!("b3:{}", "a".repeat(64))).unwrap(); + let remote_track = merge_test_track( + TrackKey::federation( + "peer".into(), + "remote-item".into(), + Some(content_id.clone()), + ), + AudioSource::Federation { + peer_id: "peer".into(), + content_id, + }, + ); + + merge_search_results( + &mut target, + SearchResults { + releases: vec![Release { + key: release_key, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: "Album".into(), + artists: vec![artist], + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: Artwork::default(), + tracks: vec![remote_track], + }], + ..SearchResults::default() + }, + ); + + let tracks = &target.releases[0].tracks; + assert_eq!(tracks.len(), 1); + assert!(matches!(tracks[0].audio_source, AudioSource::LocalFile(_))); +} + +#[test] +fn incomplete_federated_metadata_cannot_shadow_local_release_metadata() { + let release_key = ReleaseKey::local(ReleaseId::new(1)); + let artist = ArtistRef { + key: ArtistKey::local(ArtistId::new(1)), + name: "Artist".into(), + }; + let mut local_track = merge_test_track( + TrackKey::local(LocalTrackId::new(1)), + AudioSource::LocalFile("track.flac".into()), + ); + local_track.cover_uri = Some("local-cover.png".into()); + local_track.audio_bitrate_kbps = Some(1_411); + let mut target = Release { + key: release_key.clone(), + source: CatalogSource::Local, + title: "Complete local album title".into(), + artists: vec![artist.clone()], + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: Artwork { + uri: Some("local-cover.png".into()), + }, + tracks: vec![local_track], + }; + let content_id = ContentId::parse(format!("b3:{}", "b".repeat(64))).unwrap(); + let mut incomplete_remote = merge_test_track( + TrackKey::federation("peer".into(), "item".into(), Some(content_id.clone())), + AudioSource::Federation { + peer_id: "peer".into(), + content_id, + }, + ); + incomplete_remote.title = String::new(); + incomplete_remote.artist = String::new(); + incomplete_remote.artists.clear(); + incomplete_remote.audio_format = None; + + merge_release_preserving_local( + &mut target, + Release { + key: release_key, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: String::new(), + artists: vec![artist], + featured_artists: Vec::new(), + release_type: String::new(), + year: None, + artwork: Artwork::default(), + tracks: vec![incomplete_remote], + }, + ); + + assert!(matches!(target.source, CatalogSource::Local)); + assert_eq!(target.title, "Complete local album title"); + assert_eq!(target.tracks.len(), 1); + assert_eq!(target.tracks[0].title, "Track"); + assert_eq!(target.tracks[0].audio_format.as_deref(), Some("flac")); + assert_eq!(target.tracks[0].audio_bitrate_kbps, Some(1_411)); + assert!(matches!( + target.tracks[0].audio_source, + AudioSource::LocalFile(_) + )); +} + +#[test] +fn queue_resolver_keeps_tracks_nested_in_a_federated_release() { + let content_id = ContentId::parse(format!("b3:{}", "c".repeat(64))).unwrap(); + let key = TrackKey::federation( + "peer".into(), + "remote-track".into(), + Some(content_id.clone()), + ); + let track = merge_test_track( + key.clone(), + AudioSource::Federation { + peer_id: "peer".into(), + content_id, + }, + ); + let search = SearchResults { + releases: vec![Release { + key: ReleaseKey::Federation { + peer_id: "peer".into(), + id: "album".into(), + }, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: "Album".into(), + artists: track.artists.clone(), + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: Artwork::default(), + tracks: vec![track], + }], + ..SearchResults::default() + }; + + let library = LibrarySnapshot::default(); + let resolved = find_catalog_track(&library, &search, &key); + + assert!(resolved.is_some()); + assert!(matches!( + resolved.unwrap().audio_source, + AudioSource::Federation { .. } + )); +} + +#[test] +fn portable_device_queue_keeps_unresolved_content_as_a_federated_placeholder() { + let content_id = ContentId::parse(format!("b3:{}", "d".repeat(64))).unwrap(); + let wire = music_dht::device_sync::PlaybackTrack { + id: 12, + title: "Portable track".into(), + track_number: Some(2), + disc_number: Some(1), + duration_seconds: 123.0, + artist_names: vec!["Artist".into()], + featured_artist_names: vec!["Guest".into()], + release_id: 4, + release_title: "Release".into(), + release_year: Some(2026), + file_path: String::new(), + content_id: Some(content_id.as_str().into()), + audio_format: Some("flac".into()), + audio_bitrate: Some(1_411), + audio_sample_rate: Some(44_100), + audio_bit_depth: Some(16), + file_size_bytes: Some(42), + play_count: 0, + fed: None, + }; + + let placeholder = portable_playback_placeholder(&wire, content_id.clone()); + + assert_eq!(placeholder.key.content_id(), Some(&content_id)); + assert_eq!(placeholder.artist, "Artist feat. Guest"); + assert!(matches!( + placeholder.audio_source, + AudioSource::Federation { ref peer_id, .. } if peer_id.is_empty() + )); +} + +fn playback_test_state(content_byte: char) -> music_dht::device_sync::PlaybackStateWire { + music_dht::device_sync::PlaybackStateWire { + queue: vec![music_dht::device_sync::PlaybackTrack { + id: 1, + title: format!("Track {content_byte}"), + track_number: Some(1), + disc_number: Some(1), + duration_seconds: 180.0, + artist_names: vec!["Artist".into()], + featured_artist_names: Vec::new(), + release_id: 1, + release_title: "Album".into(), + release_year: Some(2026), + file_path: String::new(), + content_id: Some(format!("b3:{}", content_byte.to_string().repeat(64))), + audio_format: Some("flac".into()), + audio_bitrate: None, + audio_sample_rate: None, + audio_bit_depth: None, + file_size_bytes: None, + play_count: 0, + fed: None, + }], + queue_pos: 0, + playing: true, + paused: false, + idle_since_ms: None, + position_secs: 40.0, + volume: 72, + shuffle: false, + repeat: music_dht::device_sync::PlaybackRepeat::Off, + } +} + +#[test] +fn control_device_ignores_snapshots_from_the_previous_active_device() { + let snapshot = music_dht::device_sync::PlaybackSnapshot { + device_id: "old-device".into(), + device_name: "Old".into(), + active: true, + updated_at_ms: 1, + state: playback_test_state('a'), + }; + + assert!(!remote_snapshot_has_authority( + DevicePlaybackRole::Control, + "current-device", + PlaybackStatus::Playing, + false, + &snapshot, + )); + assert!(remote_snapshot_has_authority( + DevicePlaybackRole::Control, + "old-device", + PlaybackStatus::Playing, + false, + &snapshot, + )); +} + +#[test] +fn stale_remote_state_cannot_ack_a_new_control_command() { + let expected = playback_test_state('a'); + let stale_track = playback_test_state('b'); + assert!(!playback_state_acknowledges_command( + &expected, + &stale_track, + true, + Duration::from_secs(2), + )); + + let mut acknowledged = expected.clone(); + acknowledged.position_secs = 42.0; + assert!(playback_state_acknowledges_command( + &expected, + &acknowledged, + true, + Duration::from_secs(2), + )); + + acknowledged.position_secs = 5.0; + assert!(!playback_state_acknowledges_command( + &expected, + &acknowledged, + true, + Duration::from_secs(2), + )); + assert!(playback_state_acknowledges_command( + &expected, + &acknowledged, + false, + Duration::from_secs(2), + )); +} diff --git a/crates/domain/Cargo.toml b/crates/domain/Cargo.toml new file mode 100644 index 0000000..47e03ef --- /dev/null +++ b/crates/domain/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "furumi-domain" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[lints] +workspace = true + diff --git a/crates/domain/src/lib.rs b/crates/domain/src/lib.rs new file mode 100644 index 0000000..4d657ac --- /dev/null +++ b/crates/domain/src/lib.rs @@ -0,0 +1,555 @@ +//! Pure Furumi domain types and rules. + +use std::fmt; +use std::path::PathBuf; + +macro_rules! local_id { + ($name:ident) => { + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] + pub struct $name(i64); + + impl $name { + #[must_use] + pub const fn new(value: i64) -> Self { + Self(value) + } + + #[must_use] + pub const fn get(self) -> i64 { + self.0 + } + } + }; +} + +local_id!(ArtistId); +local_id!(ReleaseId); +local_id!(LocalTrackId); + +/// Origin of catalog metadata. UI and application code render the same +/// entities regardless of which provider supplied them. +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum CatalogSource { + Local, + Federation { peer_id: String }, +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum ArtistKey { + Local(ArtistId), + Federation { peer_id: String, id: String }, +} + +impl ArtistKey { + #[must_use] + pub const fn local(id: ArtistId) -> Self { + Self::Local(id) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum ReleaseKey { + Local(ReleaseId), + Federation { peer_id: String, id: String }, +} + +impl ReleaseKey { + #[must_use] + pub const fn local(id: ReleaseId) -> Self { + Self::Local(id) + } +} + +/// Artwork resolved by a catalog provider. Federation can initially publish +/// `None`, fetch the image into its cache, and then replace the snapshot with +/// the same entity and a local URI. +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct Artwork { + pub uri: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ArtistRef { + pub key: ArtistKey, + pub name: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Artist { + pub key: ArtistKey, + pub source: CatalogSource, + pub name: String, + pub artwork: Artwork, + pub release_count: usize, + pub track_count: usize, +} + +/// Stable Frid/Furumi audio identity (`b3:<64 lowercase hex>`). +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct ContentId(String); + +impl ContentId { + /// Parses and normalizes an audio content identifier. + /// + /// # Errors + /// + /// Returns [`InvalidContentId`] unless the value is `b3:` followed by 64 + /// hexadecimal characters. + pub fn parse(value: impl Into) -> Result { + let value = value.into().to_ascii_lowercase(); + let hash = value.strip_prefix("b3:").ok_or(InvalidContentId)?; + if hash.len() != 64 || !hash.bytes().all(|byte| byte.is_ascii_hexdigit()) { + return Err(InvalidContentId); + } + Ok(Self(value)) + } + + #[must_use] + pub fn as_str(&self) -> &str { + &self.0 + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct InvalidContentId; + +impl fmt::Display for InvalidContentId { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("content ID must be b3:<64 hex characters>") + } +} + +impl std::error::Error for InvalidContentId {} + +/// A track can be known by its local database ID, stable content ID, or both. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct TrackKey { + local_id: Option, + content_id: Option, + federation_identity: Option<(String, String)>, +} + +impl TrackKey { + #[must_use] + pub const fn local(id: LocalTrackId) -> Self { + Self { + local_id: Some(id), + content_id: None, + federation_identity: None, + } + } + + #[must_use] + pub const fn new(local_id: LocalTrackId, content_id: ContentId) -> Self { + Self { + local_id: Some(local_id), + content_id: Some(content_id), + federation_identity: None, + } + } + + #[must_use] + pub const fn remote(content_id: ContentId) -> Self { + Self { + local_id: None, + content_id: Some(content_id), + federation_identity: None, + } + } + + #[must_use] + pub fn federation(peer_id: String, item_id: String, content_id: Option) -> Self { + Self { + local_id: None, + content_id, + federation_identity: Some((peer_id, item_id)), + } + } + + #[must_use] + pub const fn local_id(&self) -> Option { + self.local_id + } + + #[must_use] + pub const fn content_id(&self) -> Option<&ContentId> { + self.content_id.as_ref() + } + + #[must_use] + pub fn federation_id(&self) -> Option<(&str, &str)> { + self.federation_identity + .as_ref() + .map(|(peer, item)| (peer.as_str(), item.as_str())) + } + + #[must_use] + pub fn matches(&self, other: &Self) -> bool { + self.content_id + .as_ref() + .zip(other.content_id.as_ref()) + .is_some_and(|(left, right)| left == right) + || self + .local_id + .zip(other.local_id) + .is_some_and(|(left, right)| left == right) + || self + .federation_identity + .as_ref() + .zip(other.federation_identity.as_ref()) + .is_some_and(|(left, right)| left == right) + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Track { + pub key: TrackKey, + pub title: String, + pub artist: String, + pub artists: Vec, + pub featured_artists: Vec, + pub release: String, + pub release_id: ReleaseKey, + pub duration_seconds: f64, + pub track_number: Option, + pub disc_number: Option, + pub cover_uri: Option, + pub audio_format: Option, + pub audio_bitrate_kbps: Option, + pub audio_sample_rate_hz: Option, + pub audio_bit_depth: Option, + pub file_size_bytes: Option, + /// Whether this content is present in the listener's shared likes. + pub liked: bool, + pub audio_source: AudioSource, +} + +impl Track { + /// Returns whether two provider records describe the same logical track. + /// Stable content identity wins, with album metadata as a fallback for + /// catalogs that did not publish a content ID. + #[must_use] + pub fn same_catalog_track(&self, other: &Self) -> bool { + if self.key.matches(&other.key) { + return true; + } + if normalized_catalog_text(&self.title) != normalized_catalog_text(&other.title) { + return false; + } + let left_release = normalized_catalog_text(&self.release); + let right_release = normalized_catalog_text(&other.release); + if !left_release.is_empty() && !right_release.is_empty() && left_release != right_release { + return false; + } + if let (Some(left), Some(right)) = (self.track_number, other.track_number) { + return left == right + && self.disc_number.unwrap_or(1) == other.disc_number.unwrap_or(1); + } + self.duration_seconds > 0.0 + && other.duration_seconds > 0.0 + && (self.duration_seconds - other.duration_seconds).abs() < 2.0 + } +} + +fn normalized_catalog_text(value: &str) -> String { + value.trim().to_lowercase() +} + +/// Playback location resolved by a catalog provider. Local files go directly +/// to the audio engine; federated sources are streamed or materialized first +/// and then handed to the same engine. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum AudioSource { + LocalFile(PathBuf), + Federation { + peer_id: String, + content_id: ContentId, + }, +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Release { + pub key: ReleaseKey, + pub source: CatalogSource, + pub title: String, + pub artists: Vec, + pub featured_artists: Vec, + pub release_type: String, + pub year: Option, + pub artwork: Artwork, + pub tracks: Vec, +} + +impl Release { + #[must_use] + pub fn artist_line(&self) -> String { + self.artists + .iter() + .map(|artist| artist.name.as_str()) + .collect::>() + .join(", ") + } + + #[must_use] + pub fn is_album(&self) -> bool { + self.release_type.eq_ignore_ascii_case("album") + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct QueueItemId(u64); + +impl QueueItemId { + #[must_use] + pub const fn new(value: u64) -> Self { + Self(value) + } + + #[must_use] + pub const fn get(self) -> u64 { + self.0 + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct QueueItem { + pub id: QueueItemId, + pub track: Track, +} + +/// Logical queue shared with the other Furumi players. +/// +/// `play_next_end` is the exclusive end of the stable FIFO block created by +/// successive "play next" commands. +#[derive(Debug, Clone, Default, PartialEq)] +pub struct Queue { + items: Vec, + current: Option, + play_next_end: Option, + next_item_id: u64, +} + +impl Queue { + #[must_use] + pub fn items(&self) -> &[QueueItem] { + &self.items + } + + #[must_use] + pub const fn current_index(&self) -> Option { + self.current + } + + #[must_use] + pub fn current(&self) -> Option<&QueueItem> { + self.current.and_then(|index| self.items.get(index)) + } + + /// Selects a concrete queue occurrence without rebuilding the queue. + pub fn select_item(&mut self, id: QueueItemId) -> Option<&QueueItem> { + self.current = self.items.iter().position(|item| item.id == id); + self.play_next_end = None; + self.current() + } + + pub fn replace_context(&mut self, tracks: Vec, start: usize) { + let mut items = Vec::with_capacity(tracks.len()); + for track in tracks { + items.push(self.new_item(track)); + } + self.items = items; + self.current = (!self.items.is_empty()).then(|| start.min(self.items.len() - 1)); + self.play_next_end = None; + } + + pub fn add_to_end(&mut self, tracks: impl IntoIterator) { + let items: Vec<_> = tracks + .into_iter() + .map(|track| self.new_item(track)) + .collect(); + self.items.extend(items); + } + + pub fn add_next(&mut self, tracks: impl IntoIterator) { + let items: Vec<_> = tracks + .into_iter() + .map(|track| self.new_item(track)) + .collect(); + if items.is_empty() { + return; + } + let insertion = self.current.map_or(0, |current| { + self.play_next_end + .filter(|end| *end > current && *end <= self.items.len()) + .unwrap_or((current + 1).min(self.items.len())) + }); + let count = items.len(); + self.items.splice(insertion..insertion, items); + if self.current.is_some_and(|current| insertion <= current) { + self.current = self.current.map(|current| current + count); + } + self.play_next_end = Some(insertion + count); + } + + pub fn replace_matching_track(&mut self, replacement: &Track) { + for item in &mut self.items { + if item.track.key.matches(&replacement.key) { + item.track = replacement.clone(); + } + } + } + + pub fn replace_track(&mut self, key: &TrackKey, replacement: &Track) { + for item in &mut self.items { + if item.track.key.matches(key) { + item.track = replacement.clone(); + } + } + } + + pub fn advance(&mut self) -> Option<&QueueItem> { + let next = match self.current { + None if !self.items.is_empty() => 0, + Some(current) if current + 1 < self.items.len() => current + 1, + _ => return None, + }; + self.current = Some(next); + self.normalize_play_next_block(); + self.current() + } + + pub fn previous(&mut self) -> Option<&QueueItem> { + let previous = self.current?.saturating_sub(1); + self.current = Some(previous); + self.normalize_play_next_block(); + self.current() + } + + fn new_item(&mut self, track: Track) -> QueueItem { + self.next_item_id = self.next_item_id.saturating_add(1); + QueueItem { + id: QueueItemId::new(self.next_item_id), + track, + } + } + + fn normalize_play_next_block(&mut self) { + if self.play_next_end.is_some_and(|end| { + self.current.is_none_or(|current| end <= current) || end > self.items.len() + }) { + self.play_next_end = None; + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn track(id: i64) -> Track { + Track { + key: TrackKey::local(LocalTrackId::new(id)), + title: id.to_string(), + artist: "artist".into(), + artists: vec![ArtistRef { + key: ArtistKey::local(ArtistId::new(1)), + name: "artist".into(), + }], + featured_artists: Vec::new(), + release: "release".into(), + release_id: ReleaseKey::local(ReleaseId::new(1)), + duration_seconds: 180.0, + track_number: Some(u32::try_from(id).unwrap()), + disc_number: Some(1), + cover_uri: None, + audio_format: Some("FLAC".into()), + audio_bitrate_kbps: Some(900), + audio_sample_rate_hz: Some(44_100), + audio_bit_depth: Some(16), + file_size_bytes: None, + liked: false, + audio_source: AudioSource::LocalFile(PathBuf::from(format!("track-{id}.flac"))), + } + } + + #[test] + fn sequential_play_next_additions_form_a_fifo_block() { + let mut queue = Queue::default(); + queue.replace_context((10..=13).map(track).collect(), 0); + queue.add_next([track(1)]); + queue.add_next([track(2)]); + queue.add_next([track(3)]); + + let ids: Vec<_> = queue + .items() + .iter() + .map(|item| item.track.key.local_id().unwrap().get()) + .collect(); + assert_eq!(ids, vec![10, 1, 2, 3, 11, 12, 13]); + } + + #[test] + fn replacing_context_keeps_order_and_starts_at_selected_track() { + let mut queue = Queue::default(); + queue.replace_context((10..=13).map(track).collect(), 2); + + let ids: Vec<_> = queue + .items() + .iter() + .map(|item| item.track.key.local_id().unwrap().get()) + .collect(); + assert_eq!(ids, vec![10, 11, 12, 13]); + assert_eq!(queue.current_index(), Some(2)); + assert_eq!( + queue.current().unwrap().track.key.local_id().unwrap().get(), + 12 + ); + } + + #[test] + fn catalog_track_matching_falls_back_to_album_position() { + let local = track(1); + let content_id = ContentId::parse(format!("b3:{}", "a".repeat(64))).unwrap(); + let mut federated = local.clone(); + federated.key = TrackKey::federation( + "peer".into(), + "remote-item".into(), + Some(content_id.clone()), + ); + federated.audio_source = AudioSource::Federation { + peer_id: "peer".into(), + content_id, + }; + + assert!(local.same_catalog_track(&federated)); + + federated.track_number = Some(2); + assert!(!local.same_catalog_track(&federated)); + } + + #[test] + fn content_id_matches_furumi_wire_format() { + let id = ContentId::parse(format!("B3:{}", "A".repeat(64))).unwrap(); + assert_eq!(id.as_str(), format!("b3:{}", "a".repeat(64))); + assert!(ContentId::parse("track-1").is_err()); + } + + #[test] + fn catalog_keys_keep_local_and_federated_entities_distinct() { + let local = ReleaseKey::local(ReleaseId::new(7)); + let remote = ReleaseKey::Federation { + peer_id: "peer-a".into(), + id: "7".into(), + }; + + assert_ne!(local, remote); + + let content = ContentId::parse(format!("b3:{}", "a".repeat(64))).unwrap(); + let first = TrackKey::federation("peer-a".into(), "item-1".into(), Some(content.clone())); + let same_audio_elsewhere = + TrackKey::federation("peer-b".into(), "item-9".into(), Some(content)); + let other = TrackKey::federation("peer-a".into(), "item-2".into(), None); + assert!(first.matches(&same_audio_elsewhere)); + assert!(!first.matches(&other)); + } +} diff --git a/crates/platform-desktop/Cargo.toml b/crates/platform-desktop/Cargo.toml new file mode 100644 index 0000000..2d2616c --- /dev/null +++ b/crates/platform-desktop/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "furumi-platform-desktop" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true + +[dependencies] +rfd.workspace = true +souvlaki.workspace = true + +[target.'cfg(target_os="macos")'.dependencies] +core-foundation.workspace = true + +[target.'cfg(windows)'.dependencies] +windows-sys.workspace = true + +[lints.rust] +unsafe_code = "allow" + +[lints.clippy] +all = "warn" +pedantic = "warn" diff --git a/crates/platform-desktop/src/lib.rs b/crates/platform-desktop/src/lib.rs new file mode 100644 index 0000000..b7a86bc --- /dev/null +++ b/crates/platform-desktop/src/lib.rs @@ -0,0 +1,18 @@ +//! Narrow adapters for operating-system desktop services. + +use std::path::{Path, PathBuf}; + +mod media; +pub use media::{MediaCommand, MediaSession}; + +/// Opens the platform-native directory picker. +/// +/// The dialog is blocking and must be invoked away from the Slint event loop. +#[must_use] +pub fn choose_library_directory(initial: Option<&Path>) -> Option { + let mut dialog = rfd::FileDialog::new().set_title("Choose Furumi library folder"); + if let Some(path) = initial { + dialog = dialog.set_directory(path); + } + dialog.pick_folder() +} diff --git a/crates/platform-desktop/src/media.rs b/crates/platform-desktop/src/media.rs new file mode 100644 index 0000000..12a8f03 --- /dev/null +++ b/crates/platform-desktop/src/media.rs @@ -0,0 +1,185 @@ +//! Cross-platform OS media session backed by souvlaki. + +use std::time::{Duration, Instant}; + +use souvlaki::{ + MediaControlEvent, MediaControls, MediaMetadata, MediaPlayback, MediaPosition, PlatformConfig, +}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum MediaCommand { + Toggle, + Play, + Pause, + Next, + Previous, + Stop, +} + +pub struct MediaSession { + controls: MediaControls, + metadata: Option<(String, String, String, u64)>, + playback: Option<(bool, bool)>, + last_position_update: Option, +} + +impl MediaSession { + pub fn new(on_command: impl Fn(MediaCommand) + Send + 'static) -> Option { + let dbus_name = platform_dbus_name(); + let mut controls = MediaControls::new(PlatformConfig { + display_name: "Furumi Desktop", + dbus_name: &dbus_name, + hwnd: platform_window(), + }) + .ok()?; + controls + .attach(move |event| { + let command = match event { + MediaControlEvent::Toggle => MediaCommand::Toggle, + MediaControlEvent::Play => MediaCommand::Play, + MediaControlEvent::Pause => MediaCommand::Pause, + MediaControlEvent::Next => MediaCommand::Next, + MediaControlEvent::Previous => MediaCommand::Previous, + MediaControlEvent::Stop => MediaCommand::Stop, + _ => return, + }; + on_command(command); + }) + .ok()?; + Some(Self { + controls, + metadata: None, + playback: None, + last_position_update: None, + }) + } + + pub fn update_metadata( + &mut self, + title: &str, + artist: &str, + album: &str, + duration_seconds: f64, + ) { + let duration_ms = duration_millis(duration_seconds); + let next = ( + title.to_owned(), + artist.to_owned(), + album.to_owned(), + duration_ms, + ); + if self.metadata.as_ref() == Some(&next) { + return; + } + let _ = self.controls.set_metadata(MediaMetadata { + title: Some(title), + artist: Some(artist), + album: Some(album), + duration: (duration_ms > 0).then(|| Duration::from_millis(duration_ms)), + cover_url: None, + }); + self.metadata = Some(next); + } + + pub fn update_playback(&mut self, playing: bool, paused: bool, position_seconds: f64) { + let next = (playing, paused); + let state_changed = self.playback != Some(next); + if !state_changed + && self + .last_position_update + .is_some_and(|last| last.elapsed() < Duration::from_secs(2)) + { + return; + } + let progress = Some(MediaPosition(Duration::from_millis(duration_millis( + position_seconds, + )))); + let state = if !playing { + MediaPlayback::Stopped + } else if paused { + MediaPlayback::Paused { progress } + } else { + MediaPlayback::Playing { progress } + }; + let _ = self.controls.set_playback(state); + self.playback = Some(next); + self.last_position_update = Some(Instant::now()); + } +} + +impl Drop for MediaSession { + fn drop(&mut self) { + let _ = self.controls.detach(); + } +} + +fn duration_millis(seconds: f64) -> u64 { + if seconds.is_finite() && seconds > 0.0 { + u64::try_from(Duration::from_secs_f64(seconds).as_millis()).unwrap_or(u64::MAX) + } else { + 0 + } +} + +fn platform_dbus_name() -> String { + #[cfg(all( + unix, + not(any(target_os = "macos", target_os = "ios", target_os = "android")) + ))] + { + return format!("cy.hexor.furumi.desktop.instance{}", std::process::id()); + } + #[allow(unreachable_code)] + "cy.hexor.furumi.desktop".into() +} + +#[cfg(not(windows))] +fn platform_window() -> Option<*mut std::ffi::c_void> { + None +} + +#[cfg(windows)] +fn platform_window() -> Option<*mut std::ffi::c_void> { + use windows_sys::Win32::System::LibraryLoader::GetModuleHandleW; + use windows_sys::Win32::UI::WindowsAndMessaging::{ + CreateWindowExW, DefWindowProcW, RegisterClassW, WNDCLASSW, + }; + unsafe { + let class_name: Vec = "furumi_desktop_media\0".encode_utf16().collect(); + let instance = GetModuleHandleW(std::ptr::null()); + let mut class: WNDCLASSW = core::mem::zeroed(); + class.lpfnWndProc = Some(DefWindowProcW); + class.hInstance = instance; + class.lpszClassName = class_name.as_ptr(); + if RegisterClassW(&class) == 0 { + return None; + } + let window = CreateWindowExW( + 0, + class_name.as_ptr(), + class_name.as_ptr(), + 0, + 0, + 0, + 0, + 0, + std::ptr::null_mut(), + std::ptr::null_mut(), + instance, + std::ptr::null(), + ); + (!window.is_null()).then_some(window.cast()) + } +} + +#[cfg(test)] +mod tests { + use super::duration_millis; + + #[test] + fn invalid_media_durations_are_safe() { + assert_eq!(duration_millis(f64::NAN), 0); + assert_eq!(duration_millis(-1.0), 0); + assert_eq!(duration_millis(1.25), 1_250); + } +} diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml new file mode 100644 index 0000000..a547c26 --- /dev/null +++ b/crates/ui/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "furumi-ui" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +build = "build.rs" + +[dependencies] +furumi-application.workspace = true +furumi-backend.workspace = true +furumi-backend-api.workspace = true +furumi-domain.workspace = true +furumi-platform-desktop.workspace = true +image.workspace = true +slint.workspace = true +tokio.workspace = true + +[build-dependencies] +slint-build.workspace = true + +[lints] +workspace = true diff --git a/crates/ui/assets/add-end.svg b/crates/ui/assets/add-end.svg new file mode 100644 index 0000000..56d7105 --- /dev/null +++ b/crates/ui/assets/add-end.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/back.svg b/crates/ui/assets/back.svg new file mode 100644 index 0000000..122e6a5 --- /dev/null +++ b/crates/ui/assets/back.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/close.svg b/crates/ui/assets/close.svg new file mode 100644 index 0000000..1cd13e9 --- /dev/null +++ b/crates/ui/assets/close.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/devices.svg b/crates/ui/assets/devices.svg new file mode 100644 index 0000000..11d5a84 --- /dev/null +++ b/crates/ui/assets/devices.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/ui/assets/federation.svg b/crates/ui/assets/federation.svg new file mode 100644 index 0000000..7f184c1 --- /dev/null +++ b/crates/ui/assets/federation.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/crates/ui/assets/forward.svg b/crates/ui/assets/forward.svg new file mode 100644 index 0000000..b2416c4 --- /dev/null +++ b/crates/ui/assets/forward.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/heart.svg b/crates/ui/assets/heart.svg new file mode 100644 index 0000000..32aa403 --- /dev/null +++ b/crates/ui/assets/heart.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/home.svg b/crates/ui/assets/home.svg new file mode 100644 index 0000000..7dd773c --- /dev/null +++ b/crates/ui/assets/home.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/info.svg b/crates/ui/assets/info.svg new file mode 100644 index 0000000..d296977 --- /dev/null +++ b/crates/ui/assets/info.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/library.svg b/crates/ui/assets/library.svg new file mode 100644 index 0000000..35e5928 --- /dev/null +++ b/crates/ui/assets/library.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/logo.svg b/crates/ui/assets/logo.svg new file mode 100644 index 0000000..980eca8 --- /dev/null +++ b/crates/ui/assets/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/crates/ui/assets/more.svg b/crates/ui/assets/more.svg new file mode 100644 index 0000000..c778969 --- /dev/null +++ b/crates/ui/assets/more.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/next.svg b/crates/ui/assets/next.svg new file mode 100644 index 0000000..cefccc2 --- /dev/null +++ b/crates/ui/assets/next.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/note.svg b/crates/ui/assets/note.svg new file mode 100644 index 0000000..a72f8c2 --- /dev/null +++ b/crates/ui/assets/note.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/crates/ui/assets/pause.svg b/crates/ui/assets/pause.svg new file mode 100644 index 0000000..8572bf5 --- /dev/null +++ b/crates/ui/assets/pause.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/play-next.svg b/crates/ui/assets/play-next.svg new file mode 100644 index 0000000..a2b4cc2 --- /dev/null +++ b/crates/ui/assets/play-next.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/play.svg b/crates/ui/assets/play.svg new file mode 100644 index 0000000..bde07ae --- /dev/null +++ b/crates/ui/assets/play.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/playlist-add.svg b/crates/ui/assets/playlist-add.svg new file mode 100644 index 0000000..5c5304a --- /dev/null +++ b/crates/ui/assets/playlist-add.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/plus.svg b/crates/ui/assets/plus.svg new file mode 100644 index 0000000..6342222 --- /dev/null +++ b/crates/ui/assets/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/crates/ui/assets/previous.svg b/crates/ui/assets/previous.svg new file mode 100644 index 0000000..dfc5957 --- /dev/null +++ b/crates/ui/assets/previous.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/queue.svg b/crates/ui/assets/queue.svg new file mode 100644 index 0000000..eab0801 --- /dev/null +++ b/crates/ui/assets/queue.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/search.svg b/crates/ui/assets/search.svg new file mode 100644 index 0000000..2e7c001 --- /dev/null +++ b/crates/ui/assets/search.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/settings.svg b/crates/ui/assets/settings.svg new file mode 100644 index 0000000..332e3b1 --- /dev/null +++ b/crates/ui/assets/settings.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/share.svg b/crates/ui/assets/share.svg new file mode 100644 index 0000000..853a50a --- /dev/null +++ b/crates/ui/assets/share.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/assets/volume.svg b/crates/ui/assets/volume.svg new file mode 100644 index 0000000..caafe06 --- /dev/null +++ b/crates/ui/assets/volume.svg @@ -0,0 +1 @@ + diff --git a/crates/ui/build.rs b/crates/ui/build.rs new file mode 100644 index 0000000..e76141c --- /dev/null +++ b/crates/ui/build.rs @@ -0,0 +1,3 @@ +fn main() { + slint_build::compile("ui/app.slint").expect("failed to compile Slint UI"); +} diff --git a/crates/ui/src/lib.rs b/crates/ui/src/lib.rs new file mode 100644 index 0000000..c7cb6ea --- /dev/null +++ b/crates/ui/src/lib.rs @@ -0,0 +1,728 @@ +//! Slint presentation and the adapter to the application/backend state flow. + +use std::cell::RefCell; +use std::collections::{HashMap, HashSet}; +use std::fmt::Write as _; +use std::path::{Path, PathBuf}; +use std::rc::Rc; +use std::sync::{Arc, Mutex}; +use std::thread; + +use furumi_application::{ + AppEvent, AppState, Effect, Screen, UiAction, duration_label, reduce_action, reduce_event, +}; +use furumi_backend::BackendHandle; +use furumi_backend_api::{ + BackendCommand, DevicePlaybackRole, DevicePresence, DeviceTrust, FederationOperation, + PlaybackStatus, RemoteData, +}; +use furumi_domain::{ + Artist, ArtistKey, ArtistRef, AudioSource, CatalogSource, ContentId, LocalTrackId, QueueItemId, + Release, ReleaseKey, Track, TrackKey, +}; +use furumi_platform_desktop::{MediaCommand, MediaSession}; +use slint::{ + ComponentHandle, Image, ModelRc, Rgba8Pixel, SharedPixelBuffer, SharedString, VecModel, +}; + +slint::include_modules!(); + +mod render; +use render::{ + breadcrumb_screen, contributor_lines, find_artist_key, find_release_key, model, + parse_track_key, release_artist_credits, render, render_catalog, render_current_track, + render_playback, render_queue, render_search, render_shell, render_track_info, + selected_release, track_context, +}; +thread_local! { + /// Decoded images belong to the Slint UI thread. Keeping them here makes + /// every state projection after the first load a memory-only operation. + static ARTWORK_CACHE: RefCell>> = RefCell::new(HashMap::new()); + static MEDIA_SESSION: RefCell> = const { RefCell::new(None) }; +} + +/// Runs the desktop presentation until its main window closes. +/// +/// # Errors +/// +/// Returns a Slint platform error when the window or event loop cannot start. +pub fn run(backend: &BackendHandle) -> Result<(), slint::PlatformError> { + let window = AppWindow::new()?; + let state = Arc::new(Mutex::new(AppState::default())); + + let media_backend = backend.clone(); + MEDIA_SESSION.with_borrow_mut(|session| { + *session = MediaSession::new(move |command| { + let backend_command = match command { + MediaCommand::Toggle => BackendCommand::TogglePlayback, + MediaCommand::Play => BackendCommand::Play, + MediaCommand::Pause => BackendCommand::Pause, + MediaCommand::Next => BackendCommand::Next, + MediaCommand::Previous => BackendCommand::Previous, + MediaCommand::Stop => BackendCommand::Stop, + }; + let _ = media_backend.try_send(backend_command); + }); + }); + + bind_callbacks(&window, &state, backend); + subscribe_to_backend(&window, &state, backend); + with_state(&state, |state| render(&window, state)); + if let Err(error) = backend.try_send(BackendCommand::Initialize) { + dispatch_event( + &window, + &state, + AppEvent::CommandRejected(error.to_string()), + ); + } + + let result = window.run(); + MEDIA_SESSION.with_borrow_mut(Option::take); + let _ = backend.try_send(BackendCommand::Shutdown); + result +} + +fn bind_callbacks(window: &AppWindow, state: &Arc>, backend: &BackendHandle) { + bind_catalog_callbacks(window, state, backend); + window.on_navigate({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |target| { + let screen = match target.as_str() { + "search" => Screen::Search, + "library" => Screen::Library, + _ => Screen::Home, + }; + dispatch_action(&window, &state, &backend, UiAction::Navigate(screen)); + } + }); + window.on_toggle_queue({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::ToggleQueue) + }); + window.on_toggle_settings({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::ToggleSettings) + }); + bind_player_callbacks(window, state, backend); + window.on_search_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |query| { + dispatch_action( + &window, + &state, + &backend, + UiAction::SearchChanged(query.to_string()), + ); + } + }); + window.on_track_action({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |action, key| { + let Some(key) = parse_track_key(&key) else { + return; + }; + let action = match action.as_str() { + "like" => UiAction::ToggleLike(key), + "play-next" => UiAction::AddNext(vec![key]), + "add-end" => UiAction::AddToEnd(vec![key]), + "information" => UiAction::ShowTrackInfo(key), + "playlist" => UiAction::ShowPlaylistPicker(key), + // The remaining presentation actions terminate here until + // their backend capabilities are introduced. + _ => return, + }; + dispatch_action(&window, &state, &backend, action); + } + }); + bind_playlist_callbacks(window, state, backend); + bind_device_callbacks(window, state, backend); + bind_settings_callbacks(window, state, backend); + window.on_dismiss_error({ + let window = window.as_weak(); + let state = Arc::clone(state); + move || { + let Some(window) = window.upgrade() else { + return; + }; + with_state(&state, |state| { + let _ = reduce_action(state, UiAction::DismissError); + render(&window, state); + }); + } + }); + window.on_close_track_info({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::CloseTrackInfo) + }); +} + +fn bind_playlist_callbacks( + window: &AppWindow, + state: &Arc>, + backend: &BackendHandle, +) { + window.on_open_playlist({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |id| { + if let Ok(id) = id.parse::() { + dispatch_action( + &window, + &state, + &backend, + UiAction::Navigate(Screen::Playlist(id)), + ); + } + } + }); + window.on_create_playlist({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |title| { + dispatch_action( + &window, + &state, + &backend, + UiAction::CreatePlaylist(title.to_string()), + ); + } + }); + window.on_add_track_to_playlist({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |playlist_id| { + let Ok(playlist_id) = playlist_id.parse::() else { + return; + }; + let track = with_state(&state, |state| state.frontend.playlist_picker_track.clone()); + if let Some(track) = track { + dispatch_action( + &window, + &state, + &backend, + UiAction::AddToPlaylist { + playlist_id, + tracks: vec![track], + }, + ); + } + } + }); + window.on_close_playlist_picker({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::ClosePlaylistPicker) + }); + window.on_play_queue_item({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |id| { + if let Ok(id) = id.parse::() { + dispatch_action( + &window, + &state, + &backend, + UiAction::PlayQueueItem(QueueItemId::new(id)), + ); + } + } + }); +} + +fn bind_catalog_callbacks( + window: &AppWindow, + state: &Arc>, + backend: &BackendHandle, +) { + window.on_layout_detail_contributors({ + let window = window.as_weak(); + let state = Arc::clone(state); + move |width| { + let lines = with_state(&state, |state| { + let Some(release) = selected_release(state) else { + return Vec::new(); + }; + let preferred = match &state.frontend.screen { + Screen::Release(_, preferred) => preferred.as_ref(), + _ => None, + }; + let (_, contributors) = release_artist_credits(&release, preferred); + contributor_lines(&contributors, width) + }); + if let Some(window) = window.upgrade() { + window.set_detail_contributor_lines(model(lines)); + } + } + }); + window.on_go_back({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::Back) + }); + window.on_go_forward({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::Forward) + }); + window.on_navigate_breadcrumb({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |target| { + let screen = with_state(&state, |state| breadcrumb_screen(state, &target)); + if let Some(screen) = screen { + dispatch_action(&window, &state, &backend, UiAction::Navigate(screen)); + } + } + }); + window.on_open_artist({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |key| { + let artist = with_state(&state, |state| find_artist_key(state, &key)); + if let Some(key) = artist { + dispatch_action( + &window, + &state, + &backend, + UiAction::Navigate(Screen::Artist(key)), + ); + } + } + }); + window.on_open_release({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |key| { + let (release, preferred_artist) = with_state(&state, |state| { + let preferred_artist = match &state.frontend.screen { + Screen::Artist(key) => Some(key.clone()), + _ => None, + }; + (find_release_key(state, &key), preferred_artist) + }); + if let Some(key) = release { + dispatch_action( + &window, + &state, + &backend, + UiAction::Navigate(Screen::Release(key, preferred_artist)), + ); + } + } + }); +} + +fn bind_player_callbacks( + window: &AppWindow, + state: &Arc>, + backend: &BackendHandle, +) { + window.on_toggle_playback({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::TogglePlayback) + }); + window.on_next({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::Next) + }); + window.on_previous({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::Previous) + }); + window.on_seek({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |fraction| { + let duration = with_state(&state, |state| state.backend.playback.duration_seconds); + dispatch_action( + &window, + &state, + &backend, + UiAction::Seek(f64::from(fraction) * duration), + ); + } + }); + window.on_set_volume({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |volume| { + dispatch_action(&window, &state, &backend, UiAction::SetVolume(volume)); + } + }); + window.on_play_release({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |key| { + let release_id = with_state(&state, |state| find_release_key(state, &key)); + if let Some(release_id) = release_id { + dispatch_action( + &window, + &state, + &backend, + UiAction::PlayRelease { + release_id, + start: 0, + }, + ); + } + } + }); + window.on_play_track({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |key| { + if let Some(key) = parse_track_key(&key) { + dispatch_action(&window, &state, &backend, UiAction::PlayTrack(key)); + } + } + }); + window.on_play_track_context({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |context, selected| { + let Some(selected) = parse_track_key(&selected) else { + return; + }; + let tracks = with_state(&state, |state| track_context(state, context.as_str())); + if tracks.iter().any(|track| track.matches(&selected)) { + dispatch_action( + &window, + &state, + &backend, + UiAction::PlayContext { tracks, selected }, + ); + } + } + }); +} + +fn bind_settings_callbacks( + window: &AppWindow, + state: &Arc>, + backend: &BackendHandle, +) { + window.on_network_id_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |value| { + dispatch_action( + &window, + &state, + &backend, + UiAction::NetworkIdChanged(value.to_string()), + ); + } + }); + window.on_device_name_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |value| { + dispatch_action( + &window, + &state, + &backend, + UiAction::DeviceNameChanged(value.to_string()), + ); + } + }); + window.on_library_path_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |value| { + dispatch_action( + &window, + &state, + &backend, + UiAction::LibraryPathChanged(value.to_string()), + ); + } + }); + bind_library_picker(window, state, backend); + window.on_federation_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |enabled| { + dispatch_action( + &window, + &state, + &backend, + UiAction::FederationChanged(enabled), + ); + } + }); + window.on_save_federated_on_listen_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |enabled| { + dispatch_action( + &window, + &state, + &backend, + UiAction::SaveFederatedOnListenChanged(enabled), + ); + } + }); + window.on_language_changed({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |language| { + dispatch_action( + &window, + &state, + &backend, + UiAction::LanguageChanged(language.to_string()), + ); + } + }); +} + +fn bind_library_picker(window: &AppWindow, state: &Arc>, backend: &BackendHandle) { + window.on_choose_library_path({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || { + let initial = with_state(&state, |state| { + PathBuf::from(&state.backend.settings.library_path) + }); + let task_window = window.clone(); + let task_state = Arc::clone(&state); + let task_backend = backend.clone(); + let result = thread::Builder::new() + .name("furumi-folder-picker".into()) + .spawn(move || { + let selected = + furumi_platform_desktop::choose_library_directory(Some(&initial)); + let Some(selected) = selected else { + return; + }; + let selected = selected.to_string_lossy().into_owned(); + let _ = task_window.upgrade_in_event_loop(move |window| { + dispatch_action( + &window.as_weak(), + &task_state, + &task_backend, + UiAction::LibraryPathChanged(selected), + ); + }); + }); + if let Err(error) = result + && let Some(window) = window.upgrade() + { + dispatch_event( + &window, + &state, + AppEvent::CommandRejected(format!("folder picker: {error}")), + ); + } + } + }); +} + +fn bind_device_callbacks( + window: &AppWindow, + state: &Arc>, + backend: &BackendHandle, +) { + window.on_create_device_invite({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move || dispatch_action(&window, &state, &backend, UiAction::CreateDeviceInvite) + }); + window.on_connect_device({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |invite| { + dispatch_action( + &window, + &state, + &backend, + UiAction::ConnectDevice(invite.to_string()), + ); + } + }); + window.on_answer_pairing({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |request_id, accept, use_requester_group| { + dispatch_action( + &window, + &state, + &backend, + UiAction::AnswerDevicePairing { + request_id: request_id.to_string(), + accept, + use_requester_group, + }, + ); + } + }); + window.on_select_device({ + let window = window.as_weak(); + let state = Arc::clone(state); + let backend = backend.clone(); + move |device_id| { + dispatch_action( + &window, + &state, + &backend, + UiAction::SelectPlaybackDevice(device_id.to_string()), + ); + } + }); +} + +fn subscribe_to_backend(window: &AppWindow, state: &Arc>, backend: &BackendHandle) { + let mut snapshots = backend.subscribe(); + let bridge_window = window.as_weak(); + let bridge_state = Arc::clone(state); + let result = thread::Builder::new() + .name("furumi-ui-state-bridge".into()) + .spawn(move || { + let runtime = match tokio::runtime::Builder::new_current_thread().build() { + Ok(runtime) => runtime, + Err(error) => { + report_background_error( + &bridge_window, + bridge_state, + format!("UI state bridge: {error}"), + ); + return; + } + }; + runtime.block_on(async move { + while snapshots.changed().await.is_ok() { + let snapshot = snapshots.borrow_and_update().clone(); + let state = Arc::clone(&bridge_state); + let result = bridge_window.upgrade_in_event_loop(move |window| { + dispatch_event( + &window, + &state, + AppEvent::BackendSnapshot(Box::new(snapshot)), + ); + }); + if result.is_err() { + break; + } + } + }); + }); + if let Err(error) = result { + dispatch_event( + window, + state, + AppEvent::CommandRejected(format!("UI state bridge: {error}")), + ); + } +} + +fn report_background_error( + window: &slint::Weak, + state: Arc>, + message: String, +) { + let window = window.clone(); + let _ = window.upgrade_in_event_loop(move |window| { + dispatch_event(&window, &state, AppEvent::CommandRejected(message)); + }); +} + +fn dispatch_action( + window: &slint::Weak, + state: &Arc>, + backend: &BackendHandle, + action: UiAction, +) { + let Some(window) = window.upgrade() else { + return; + }; + let effects = with_state(state, |state| { + let effects = reduce_action(state, action); + render(&window, state); + effects + }); + for Effect::Send(command) in effects { + if let Err(error) = backend.try_send(command) { + dispatch_event(&window, state, AppEvent::CommandRejected(error.to_string())); + } + } +} + +fn dispatch_event(window: &AppWindow, state: &Arc>, event: AppEvent) { + with_state(state, |state| { + let previous = state.backend.clone(); + reduce_event(state, event); + let shell_changed = previous.federation_activity != state.backend.federation_activity + || previous.federation_debug != state.backend.federation_debug + || previous.connected_devices != state.backend.connected_devices + || previous.settings != state.backend.settings + || previous.playback_error != state.backend.playback_error + || previous.settings_error != state.backend.settings_error; + let catalog_changed = previous.library != state.backend.library + || previous.search != state.backend.search + || previous.queue != state.backend.queue; + let queue_changed = previous.queue != state.backend.queue; + if shell_changed { + render_shell(window, state); + } + if catalog_changed { + render_catalog(window, state); + render_search(window, state); + render_track_info(window, state); + } + if queue_changed { + render_queue(window, state); + render_current_track(window, state); + } + render_playback(window, state); + }); +} + +fn with_state(state: &Arc>, operation: impl FnOnce(&mut AppState) -> T) -> T { + let mut guard = state + .lock() + .unwrap_or_else(std::sync::PoisonError::into_inner); + operation(&mut guard) +} diff --git a/crates/ui/src/render.rs b/crates/ui/src/render.rs new file mode 100644 index 0000000..d4aebb5 --- /dev/null +++ b/crates/ui/src/render.rs @@ -0,0 +1,1643 @@ +use super::*; +pub(super) fn render(window: &AppWindow, state: &AppState) { + render_shell(window, state); + render_catalog(window, state); + render_search(window, state); + render_queue(window, state); + render_current_track(window, state); + render_playback(window, state); +} + +pub(super) fn render_shell(window: &AppWindow, state: &AppState) { + let strings = state.frontend.locale.strings(); + window.set_app_name(strings.app_name.into()); + window.set_home_label(strings.home.into()); + window.set_search_label(strings.search.into()); + window.set_library_label(strings.library.into()); + window.set_queue_label(strings.queue.into()); + window.set_recent_label(strings.recently_played.into()); + window.set_featured_label(strings.made_for_listening.into()); + window.set_search_placeholder(strings.search_placeholder.into()); + window.set_active_screen( + match &state.frontend.screen { + Screen::Home => "home", + Screen::Search => "search", + Screen::Library => "library", + Screen::Artist(_) => "artist", + Screen::Release(_, _) => "release", + Screen::Playlist(_) => "playlist", + } + .into(), + ); + window.set_can_go_back(!state.frontend.navigation_history.is_empty()); + window.set_can_go_forward(!state.frontend.navigation_forward.is_empty()); + window.set_breadcrumbs(model(breadcrumbs(state))); + window.set_queue_open(state.frontend.queue_open); + window.set_settings_open(state.frontend.settings_open); + window.set_playlist_picker_open(state.frontend.playlist_picker_track.is_some()); + window.set_network_id(state.backend.settings.network_id.clone().into()); + window.set_device_name(state.backend.settings.device_name.clone().into()); + window.set_library_path(state.backend.settings.library_path.clone().into()); + window.set_federation_enabled(state.backend.settings.federation_enabled); + window.set_save_federated_on_listen(state.backend.settings.save_federated_on_listen); + window.set_selected_language(state.backend.settings.language.clone().into()); + window.set_available_languages(model(vec![SharedString::from("English")])); + window.set_search_query(state.frontend.search_query.clone().into()); + render_playlist_shell(window, state); + render_device_shell(window, state); + let (network_busy, network_text) = federation_status(state); + window.set_federation_status_busy(network_busy); + window.set_federation_status_text(network_text.into()); + render_federation_debug(window, state); + render_build_info(window, state); + window.set_error_message( + state + .transient_error + .clone() + .or_else(|| state.backend.playback_error.clone()) + .or_else(|| state.backend.settings_error.clone()) + .unwrap_or_default() + .into(), + ); + render_track_info(window, state); +} + +fn render_federation_debug(window: &AppWindow, state: &AppState) { + let debug = &state.backend.federation_debug; + window.set_federation_debug_node( + if debug.running { + "Running" + } else if debug.error.is_some() { + "Error" + } else { + "Stopped" + } + .into(), + ); + window.set_federation_debug_peers( + format!( + "{} connected · {} known", + debug.connected_peers, debug.known_contacts + ) + .into(), + ); + window.set_federation_debug_dht( + debug + .stored_dht_records + .map_or_else(|| "n/a".into(), |records| format!("{records} records")) + .into(), + ); + window.set_federation_debug_published(format!("{} items", debug.published_items).into()); + window.set_federation_debug_endpoint( + federation_node_ids(&debug.endpoint_id, &debug.dht_node_id).into(), + ); +} + +fn render_build_info(window: &AppWindow, state: &AppState) { + window.set_software_versions(model( + state + .backend + .build_info + .software + .iter() + .map(|entry| VersionView { + name: entry.name.clone().into(), + version: entry.version.clone().into(), + }) + .collect(), + )); + window.set_protocol_versions(model( + state + .backend + .build_info + .protocols + .iter() + .map(|entry| VersionView { + name: entry.name.clone().into(), + version: entry.version.clone().into(), + }) + .collect(), + )); +} + +fn render_playlist_shell(window: &AppWindow, state: &AppState) { + let playlists = ready_library(state) + .map(|library| { + library + .playlists + .iter() + .map(|playlist| PlaylistView { + id: playlist.id.to_string().into(), + title: playlist.title.clone().into(), + details: format!( + "{} {}", + playlist.tracks.len(), + if playlist.tracks.len() == 1 { + "track" + } else { + "tracks" + } + ) + .into(), + is_likes: playlist.is_likes, + }) + .collect() + }) + .unwrap_or_default(); + window.set_playlists(model(playlists)); +} + +fn render_device_shell(window: &AppWindow, state: &AppState) { + let devices = &state.backend.connected_devices; + window.set_connected_devices(model( + devices + .devices + .iter() + .filter(|device| device.trust != DeviceTrust::Revoked) + .map(|device| DeviceView { + id: device.id.clone().into(), + name: device.name.clone().into(), + details: format!( + "{} · {}", + if device.presence == DevicePresence::Online { + "online" + } else { + "offline" + }, + if device.trust == DeviceTrust::Revoked { + "revoked".to_string() + } else if device.client_version.is_empty() { + "Furumi".to_string() + } else { + format!("v{}", device.client_version) + } + ) + .into(), + is_self: device.is_self, + online: device.presence == DevicePresence::Online, + active: device.is_active, + revoked: device.trust == DeviceTrust::Revoked, + }) + .collect(), + )); + window.set_pending_pairings(model( + devices + .pending_pairings + .iter() + .map(|pending| PairingView { + request_id: pending.request_id.clone().into(), + name: pending.name.clone().into(), + details: format!("Furumi {} · {}", pending.client_version, pending.device_id) + .into(), + group_conflict: pending.requester_group_id.is_some() + && pending.requester_group_active_devices > 1, + }) + .collect(), + )); + window.set_device_role_label( + match devices.role { + DevicePlaybackRole::Active => "Active device", + DevicePlaybackRole::Control => "Control device", + } + .into(), + ); + window.set_device_is_active(devices.role == DevicePlaybackRole::Active); + window.set_active_device_label(devices.active_device_name.clone().into()); + window.set_device_group_label(format!("Network · {}", devices.group_id).into()); + window.set_device_invite(devices.invite.clone().unwrap_or_default().into()); + window.set_device_busy(devices.busy); + window.set_device_status( + devices + .error + .clone() + .or_else(|| devices.last_sync.clone()) + .unwrap_or_default() + .into(), + ); +} + +pub(super) fn render_track_info(window: &AppWindow, state: &AppState) { + let track = state + .frontend + .track_info + .as_ref() + .and_then(|key| find_track(state, key)); + window.set_track_info_open(track.is_some()); + window.set_track_info_title( + track + .map_or_else(String::new, |track| track.title.clone()) + .into(), + ); + window.set_track_info_artist_links(model(track.map_or_else(Vec::new, track_artist_links))); + window.set_track_info_release( + track + .map_or_else(String::new, |track| { + let mut label = track.release.clone(); + if let Some(disc) = track.disc_number { + let _ = write!(label, " · disc {disc}"); + } + if let Some(number) = track.track_number { + let _ = write!(label, " · track {number}"); + } + label + }) + .into(), + ); + window.set_track_info_duration( + track + .map_or_else(String::new, |track| { + format!( + "{} ({:.2} s)", + duration_label(track.duration_seconds), + track.duration_seconds + ) + }) + .into(), + ); + window.set_track_info_format( + track + .and_then(|track| track.audio_format.clone()) + .unwrap_or_default() + .to_uppercase() + .into(), + ); + window.set_track_info_quality(track.map(track_quality_label).unwrap_or_default().into()); + window.set_track_info_source( + track + .map_or_else(String::new, |track| match track.audio_source { + AudioSource::LocalFile(_) => "Local library".into(), + AudioSource::Federation { .. } => "Federation".into(), + }) + .into(), + ); + window.set_track_info_content_id( + track + .and_then(|track| track.key.content_id()) + .map_or_else(String::new, |id| id.as_str().to_owned()) + .into(), + ); + window.set_track_info_path( + track + .map_or_else(String::new, |track| match &track.audio_source { + AudioSource::LocalFile(path) => path.to_string_lossy().into_owned(), + AudioSource::Federation { peer_id, .. } => format!("peer {peer_id}"), + }) + .into(), + ); + let (artwork, has_artwork) = load_artwork(track.and_then(|track| track.cover_uri.as_deref())); + window.set_track_info_artwork(artwork); + window.set_track_info_has_artwork(has_artwork); +} + +fn track_quality_label(track: &Track) -> String { + let mut fields = Vec::new(); + if let Some(bitrate) = track.audio_bitrate_kbps { + fields.push(format!("{bitrate} kbps")); + } + if let Some(rate) = track.audio_sample_rate_hz { + fields.push(format!("{:.1} kHz", f64::from(rate) / 1_000.0)); + } + if let Some(depth) = track.audio_bit_depth { + fields.push(format!("{depth} bit")); + } + if let Some(size) = track.file_size_bytes { + let whole = size / 1_048_576; + let decimal = size % 1_048_576 * 10 / 1_048_576; + fields.push(format!("{whole}.{decimal} MiB")); + } + fields.join(" · ") +} + +fn sync_media_session(state: &AppState) { + MEDIA_SESSION.with_borrow_mut(|session| { + let Some(session) = session.as_mut() else { + return; + }; + if let Some(track) = state.backend.queue.current().map(|item| &item.track) { + session.update_metadata( + &track.title, + &track.artist, + &track.release, + track.duration_seconds, + ); + } + session.update_playback( + state.backend.playback.status != PlaybackStatus::Stopped, + state.backend.playback.status == PlaybackStatus::Paused, + state.backend.playback.position_seconds, + ); + }); +} + +fn federation_status(state: &AppState) -> (bool, String) { + if !state.backend.settings.federation_enabled { + return (false, "Federation disabled".into()); + } + let activity = &state.backend.federation_activity; + let operation = match activity.operation { + FederationOperation::Idle => "Connecting to federation", + FederationOperation::Search => "Searching federation", + FederationOperation::Artist => "Loading artist", + FederationOperation::Release => "Loading release", + }; + if activity.pending { + return (true, format!("{operation}…")); + } + if let Some(error) = &activity.error { + return (false, format!("Network error · {error}")); + } + if let Some(stats) = &activity.stats { + return ( + false, + format!( + "{} tracks · {} artists · {} peers · {}", + stats.tracks, + stats.artists, + stats.peers_queried, + search_duration_label(stats.duration_ms) + ), + ); + } + (false, "Federation ready".into()) +} + +fn federation_node_ids(endpoint_id: &str, dht_node_id: &str) -> String { + fn short(value: &str) -> &str { + value.get(..12).unwrap_or(value) + } + match (endpoint_id.is_empty(), dht_node_id.is_empty()) { + (false, false) => format!("ep {} · dht {}", short(endpoint_id), short(dht_node_id)), + (false, true) => format!("ep {}", short(endpoint_id)), + (true, false) => format!("dht {}", short(dht_node_id)), + (true, true) => "n/a".into(), + } +} + +fn ready_library(state: &AppState) -> Option<&furumi_backend_api::LibrarySnapshot> { + match &state.backend.library { + RemoteData::Ready(library) => Some(library), + _ => None, + } +} + +fn find_track<'a>(state: &'a AppState, key: &TrackKey) -> Option<&'a Track> { + state + .backend + .queue + .items() + .iter() + .map(|item| &item.track) + .chain(state.backend.search.results.tracks.iter()) + .chain( + state + .backend + .search + .results + .releases + .iter() + .flat_map(|release| release.tracks.iter()), + ) + .chain( + ready_library(state) + .into_iter() + .flat_map(|library| library.featured_releases.iter()) + .flat_map(|release| release.tracks.iter()), + ) + .chain( + ready_library(state) + .into_iter() + .flat_map(|library| library.playlists.iter()) + .flat_map(|playlist| playlist.tracks.iter()), + ) + .find(|track| track.key.matches(key)) +} + +fn selected_artist(state: &AppState) -> Option<&Artist> { + let Screen::Artist(key) = &state.frontend.screen else { + return None; + }; + state + .backend + .search + .results + .artists + .iter() + .chain( + ready_library(state) + .into_iter() + .flat_map(|library| library.artists.iter()), + ) + .find(|artist| &artist.key == key) +} + +pub(super) fn selected_release(state: &AppState) -> Option { + let Screen::Release(key, _) = &state.frontend.screen else { + return None; + }; + let mut candidates = ready_library(state) + .into_iter() + .flat_map(|library| library.featured_releases.iter()) + .chain(state.backend.search.results.releases.iter()) + .filter(|release| &release.key == key) + .cloned(); + let mut selected = candidates.next()?; + for candidate in candidates { + merge_release_availability(&mut selected, candidate); + } + sort_release_tracks(&mut selected.tracks); + Some(selected) +} + +fn selected_playlist(state: &AppState) -> Option<&furumi_backend_api::PlaylistSnapshot> { + let Screen::Playlist(id) = state.frontend.screen else { + return None; + }; + ready_library(state)? + .playlists + .iter() + .find(|playlist| playlist.id == id) +} + +pub(super) fn track_context(state: &AppState, context: &str) -> Vec { + let tracks: Vec = match context { + "release" => selected_release(state).map_or_else(Vec::new, |release| release.tracks), + "search" => state.backend.search.results.tracks.clone(), + "recent" => ready_library(state) + .into_iter() + .flat_map(|library| library.recently_played.iter()) + .cloned() + .collect(), + "artist-featured" => selected_artist(state).map_or_else(Vec::new, |artist| { + ready_library(state) + .into_iter() + .flat_map(|library| library.featured_releases.iter()) + .flat_map(|release| release.tracks.iter()) + .chain(state.backend.search.results.tracks.iter()) + .filter(|track| { + track + .featured_artists + .iter() + .any(|candidate| candidate.key == artist.key) + }) + .cloned() + .collect() + }), + "playlist" => selected_playlist(state) + .into_iter() + .flat_map(|playlist| playlist.tracks.iter()) + .cloned() + .collect(), + _ => Vec::new(), + }; + tracks.into_iter().map(|track| track.key).collect() +} + +pub(super) fn breadcrumb_screen(state: &AppState, target: &SharedString) -> Option { + match target.as_str() { + "home" => Some(Screen::Home), + "search" => Some(Screen::Search), + "library" => Some(Screen::Library), + value if value.starts_with("playlist:") => value + .trim_start_matches("playlist:") + .parse::() + .ok() + .map(Screen::Playlist), + _ => find_artist_key(state, target).map(Screen::Artist), + } +} + +fn breadcrumbs(state: &AppState) -> Vec { + let crumb = |label: String, target: String, trailing: bool| BreadcrumbView { + label: if trailing { + format!("{label} › ") + } else { + label + } + .into(), + target: target.into(), + }; + match &state.frontend.screen { + Screen::Home => vec![crumb("Home".into(), String::new(), false)], + Screen::Search => vec![ + crumb("Home".into(), "home".into(), true), + crumb("Search".into(), String::new(), false), + ], + Screen::Library => vec![ + crumb("Home".into(), "home".into(), true), + crumb("Library".into(), String::new(), false), + ], + Screen::Artist(_) => vec![ + crumb("Home".into(), "home".into(), true), + crumb( + selected_artist(state) + .map_or("Artist", |artist| artist.name.as_str()) + .to_owned(), + String::new(), + false, + ), + ], + Screen::Release(_, preferred) => { + let release = selected_release(state); + let release = release.as_ref(); + let artist = preferred + .as_ref() + .and_then(|key| { + release.and_then(|release| { + release.artists.iter().find(|artist| &artist.key == key) + }) + }) + .or_else(|| release.and_then(|release| release.artists.first())); + let mut result = vec![crumb("Home".into(), "home".into(), true)]; + if let Some(artist) = artist { + result.push(crumb( + artist.name.clone(), + format_artist_key(&artist.key), + true, + )); + } + result.push(crumb( + release + .map_or("Release", |release| release.title.as_str()) + .to_owned(), + String::new(), + false, + )); + result + } + Screen::Playlist(_) => vec![ + crumb("Home".into(), "home".into(), true), + crumb( + selected_playlist(state) + .map_or("Playlist", |playlist| playlist.title.as_str()) + .to_owned(), + String::new(), + false, + ), + ], + } +} + +pub(super) fn render_catalog(window: &AppWindow, state: &AppState) { + let library = ready_library(state); + let releases = library.map_or_else(Vec::new, |library| { + library + .featured_releases + .iter() + .map(release_to_view) + .collect() + }); + window.set_releases(model(releases)); + let artists = library.map_or_else(Vec::new, |library| { + library.artists.iter().map(artist_to_view).collect() + }); + window.set_artists(model(artists)); + + let selected_artist = match &state.frontend.screen { + Screen::Artist(key) => state + .backend + .search + .results + .artists + .iter() + .chain( + library + .into_iter() + .flat_map(|library| library.artists.iter()), + ) + .find(|artist| &artist.key == key), + _ => None, + }; + let artist_releases = selected_artist.map_or_else(Vec::new, |artist| { + let releases = library + .into_iter() + .flat_map(|library| library.featured_releases.iter()) + .chain(state.backend.search.results.releases.iter()) + .filter(|release| { + release + .artists + .iter() + .any(|candidate| candidate.key == artist.key) + }) + .cloned(); + let mut releases = merge_artist_releases(releases); + sort_releases_newest_first(&mut releases); + releases + }); + window.set_artist_albums(model( + artist_releases + .iter() + .filter(|release| release.is_album()) + .map(release_to_view) + .collect(), + )); + window.set_artist_other_releases(model( + artist_releases + .iter() + .filter(|release| !release.is_album()) + .map(release_to_view) + .collect(), + )); + window.set_artist_featured_tracks(model(selected_artist.map_or_else(Vec::new, |artist| { + let tracks = library + .into_iter() + .flat_map(|library| { + library + .featured_releases + .iter() + .flat_map(|release| release.tracks.iter()) + }) + .chain(state.backend.search.results.tracks.iter()) + .filter(|track| { + track + .featured_artists + .iter() + .any(|candidate| candidate.key == artist.key) + }) + .cloned() + .collect::>(); + tracks_to_views(&tracks, state) + }))); + + render_catalog_detail(window, state, selected_artist); + + let recent = library.map_or_else(Vec::new, |library| { + tracks_to_views(&library.recently_played, state) + }); + window.set_tracks(model(recent)); + let playlist = selected_playlist(state); + window.set_playlist_title( + playlist + .map_or_else(String::new, |playlist| playlist.title.clone()) + .into(), + ); + window.set_playlist_tracks(model(playlist.map_or_else(Vec::new, |playlist| { + tracks_to_views(&playlist.tracks, state) + }))); +} + +fn render_catalog_detail(window: &AppWindow, state: &AppState, selected_artist: Option<&Artist>) { + let selected_release = selected_release(state); + let selected_release = selected_release.as_ref(); + let detail_artwork = selected_artist + .and_then(|artist| artist.artwork.uri.as_deref()) + .or_else(|| selected_release.and_then(|release| release.artwork.uri.as_deref())); + let (detail_artwork, detail_has_artwork) = load_artwork(detail_artwork); + window.set_detail_artwork(detail_artwork); + window.set_detail_has_artwork(detail_has_artwork); + window.set_detail_title( + selected_artist + .map(|artist| artist.name.as_str()) + .or_else(|| selected_release.map(|release| release.title.as_str())) + .unwrap_or_default() + .into(), + ); + let preferred_artist = match &state.frontend.screen { + Screen::Release(_, preferred) => preferred.as_ref(), + _ => None, + }; + window.set_detail_subtitle( + selected_artist + .map(|artist| { + format!( + "{} releases · {} tracks", + artist.release_count, artist.track_count + ) + }) + .unwrap_or_default() + .into(), + ); + window.set_detail_release_type( + selected_release + .map(|release| release_type_label(&release.release_type)) + .unwrap_or_default() + .into(), + ); + let (main_artists, contributors) = selected_release.map_or_else( + || (Vec::new(), Vec::new()), + |release| release_artist_credits(release, preferred_artist), + ); + window.set_detail_main_artists(model( + main_artists + .iter() + .enumerate() + .map(|(index, artist)| artist_link_view(artist, index)) + .collect(), + )); + window.set_detail_contributor_lines(model(contributor_lines(&contributors, 420.0))); + window.set_detail_tracks(model(selected_release.map_or_else(Vec::new, |release| { + release_tracks_to_views(&release.tracks, state) + }))); + window.set_detail_federation_state(selected_release.map_or(0, release_federation_state)); +} + +pub(super) fn render_queue(window: &AppWindow, state: &AppState) { + let queue = state + .backend + .queue + .items() + .iter() + .enumerate() + .map(|(index, item)| { + let (artwork, has_artwork) = load_artwork(item.track.cover_uri.as_deref()); + QueueView { + key: item.id.get().to_string().into(), + title: item.track.title.clone().into(), + artist: item.track.artist.clone().into(), + artist_key: item + .track + .artists + .first() + .map(|artist| format_artist_key(&artist.key)) + .unwrap_or_default() + .into(), + release: item.track.release.clone().into(), + release_key: format_release_key(&item.track.release_id).into(), + active: state.backend.queue.current_index() == Some(index), + artwork, + has_artwork, + } + }) + .collect(); + window.set_queue_items(model(queue)); +} + +pub(super) fn render_playback(window: &AppWindow, state: &AppState) { + sync_media_session(state); + let player = state.player_projection(); + window.set_has_track(player.has_track); + window.set_playing(player.playing); + window.set_elapsed(player.elapsed.into()); + window.set_duration(player.duration.into()); + window.set_progress(player.progress); + window.set_volume(player.volume); +} + +pub(super) fn render_current_track(window: &AppWindow, state: &AppState) { + let current = state.backend.queue.current().map(|item| &item.track); + window.set_current_title( + current + .map(|track| track.title.clone()) + .unwrap_or_default() + .into(), + ); + window.set_current_artists(model(current.map_or_else(Vec::new, track_artist_links))); + window.set_current_metadata(current.map(track_metadata_label).unwrap_or_default().into()); + window.set_current_release( + current + .map(|track| track.release.clone()) + .unwrap_or_default() + .into(), + ); + window.set_current_release_key( + current + .map(|track| format_release_key(&track.release_id)) + .unwrap_or_default() + .into(), + ); + let (current_artwork, current_has_artwork) = + load_artwork(current.and_then(|track| track.cover_uri.as_deref())); + window.set_current_artwork(current_artwork); + window.set_current_has_artwork(current_has_artwork); +} + +pub(super) fn render_search(window: &AppWindow, state: &AppState) { + let search = &state.backend.search; + window.set_search_artists(model( + search.results.artists.iter().map(artist_to_view).collect(), + )); + window.set_search_releases(model( + search + .results + .releases + .iter() + .map(release_to_view) + .collect(), + )); + window.set_search_results(model(tracks_to_views(&search.results.tracks, state))); +} + +fn search_duration_label(milliseconds: u64) -> String { + if milliseconds < 1_000 { + format!("{milliseconds} ms") + } else { + format!( + "{}.{:01} s", + milliseconds / 1_000, + milliseconds % 1_000 / 100 + ) + } +} + +fn tracks_to_views(tracks: &[Track], state: &AppState) -> Vec { + tracks_to_views_with_numbers(tracks, state, false) +} + +fn release_tracks_to_views(tracks: &[Track], state: &AppState) -> Vec { + tracks_to_views_with_numbers(tracks, state, true) +} + +fn tracks_to_views_with_numbers( + tracks: &[Track], + state: &AppState, + use_metadata_number: bool, +) -> Vec { + let current = state.backend.queue.current().map(|item| &item.track.key); + tracks + .iter() + .enumerate() + .map(|(index, track)| { + let (artwork, has_artwork) = load_artwork(track.cover_uri.as_deref()); + let artist_links = track_artist_links(track); + TrackView { + key: format_track_key(&track.key).into(), + number: track_number_label(track, index, use_metadata_number).into(), + title: track.title.clone().into(), + artists: model(artist_links), + artists_label: track_artist_label(track).into(), + artist_line_break: track_artist_line_break(track), + release: track.release.clone().into(), + release_key: format_release_key(&track.release_id).into(), + duration: duration_label(track.duration_seconds).into(), + active: current.is_some_and(|key| key.matches(&track.key)), + artwork, + has_artwork, + federated: matches!(track.audio_source, AudioSource::Federation { .. }), + liked: track.liked, + } + }) + .collect() +} + +fn track_number_label(track: &Track, index: usize, use_metadata_number: bool) -> String { + if use_metadata_number { + track + .track_number + .map_or_else(|| "—".into(), |number| number.to_string()) + } else { + (index + 1).to_string() + } +} + +fn track_artist_links(track: &Track) -> Vec { + let mut links = Vec::with_capacity(track.artists.len() + track.featured_artists.len()); + for (index, artist) in track.artists.iter().enumerate() { + links.push(ArtistLinkView { + key: format_artist_key(&artist.key).into(), + name: artist.name.clone().into(), + prefix: if index == 0 { "" } else { ", " }.into(), + }); + } + for (index, artist) in track.featured_artists.iter().enumerate() { + links.push(ArtistLinkView { + key: format_artist_key(&artist.key).into(), + name: artist.name.clone().into(), + prefix: if index == 0 { " feat. " } else { ", " }.into(), + }); + } + links +} + +fn track_artist_label(track: &Track) -> String { + let mut label = track + .artists + .iter() + .map(|artist| artist.name.as_str()) + .collect::>() + .join(", "); + if !track.featured_artists.is_empty() { + if !label.is_empty() { + label.push_str(" feat. "); + } + label.push_str( + &track + .featured_artists + .iter() + .map(|artist| artist.name.as_str()) + .collect::>() + .join(", "), + ); + } + if label.is_empty() { + track.artist.clone() + } else { + label + } +} + +fn track_artist_line_break(track: &Track) -> i32 { + let segments = track + .artists + .iter() + .map(|artist| artist.name.chars().count() + 2) + .chain( + track + .featured_artists + .iter() + .map(|artist| artist.name.chars().count() + 2), + ) + .collect::>(); + if segments.len() < 2 { + return 0; + } + + let total = segments.iter().sum::(); + let mut prefix = 0_usize; + let mut best_index = 1_usize; + let mut best_delta = usize::MAX; + for (index, width) in segments.iter().take(segments.len() - 1).enumerate() { + prefix = prefix.saturating_add(*width); + let delta = prefix.abs_diff(total.saturating_sub(prefix)); + if delta < best_delta { + best_delta = delta; + best_index = index + 1; + } + } + i32::try_from(best_index).unwrap_or(i32::MAX) +} + +fn track_metadata_label(track: &Track) -> String { + let mut parts = Vec::with_capacity(2); + if let Some(format) = track + .audio_format + .as_deref() + .filter(|value| !value.is_empty()) + { + parts.push(format.to_uppercase()); + } + if let Some(bitrate) = track.audio_bitrate_kbps { + parts.push(format!("{bitrate} kbps")); + } + parts.join(" · ") +} + +fn artist_link_view(artist: &ArtistRef, index: usize) -> ArtistLinkView { + ArtistLinkView { + key: format_artist_key(&artist.key).into(), + name: artist.name.clone().into(), + prefix: if index == 0 { "" } else { ", " }.into(), + } +} + +pub(super) fn contributor_lines(artists: &[ArtistRef], width: f32) -> Vec { + let width = width.max(220.0); + let mut lines = Vec::>::new(); + let mut current = Vec::new(); + let mut current_width = 0.0_f32; + + for (index, artist) in artists.iter().enumerate() { + // Eleven-pixel system text averages a little under seven logical + // pixels per glyph. The conservative estimate keeps every artist on + // one line while still packing short names naturally. + let has_trailing_comma = index + 1 < artists.len(); + let glyph_count = u16::try_from(artist.name.chars().count()).unwrap_or(u16::MAX); + let name_width = f32::from(glyph_count) * 7.0 + if has_trailing_comma { 3.0 } else { 0.0 }; + let separator_width = if current.is_empty() { 0.0 } else { 9.0 }; + if !current.is_empty() && current_width + separator_width + name_width > width { + lines.push(std::mem::take(&mut current)); + current_width = 0.0; + } + let prefix = if current.is_empty() { "" } else { " " }; + current.push(ArtistLinkView { + key: format_artist_key(&artist.key).into(), + name: if has_trailing_comma { + format!("{},", artist.name) + } else { + artist.name.clone() + } + .into(), + prefix: prefix.into(), + }); + current_width += (if prefix.is_empty() { 0.0 } else { 9.0 }) + name_width; + + if index + 1 == artists.len() && !current.is_empty() { + lines.push(std::mem::take(&mut current)); + } + } + + lines + .into_iter() + .map(|artists| ArtistLinkLineView { + artists: model(artists), + }) + .collect() +} + +fn artist_to_view(artist: &Artist) -> ArtistView { + let (artwork, has_artwork) = load_artwork(artist.artwork.uri.as_deref()); + ArtistView { + key: format_artist_key(&artist.key).into(), + name: artist.name.clone().into(), + details: format!( + "{} releases · {} tracks", + artist.release_count, artist.track_count + ) + .into(), + artwork, + has_artwork, + federated: matches!(artist.source, CatalogSource::Federation { .. }), + } +} + +fn release_to_view(release: &Release) -> ReleaseView { + let (artwork, has_artwork) = load_artwork(release.artwork.uri.as_deref()); + ReleaseView { + key: format_release_key(&release.key).into(), + title: release.title.clone().into(), + artist: release.artist_line().into(), + artist_key: release + .artists + .first() + .map(|artist| format_artist_key(&artist.key)) + .unwrap_or_default() + .into(), + year: release + .year + .map_or_else(String::new, |year| year.to_string()) + .into(), + release_type: release_type_label(&release.release_type).into(), + artwork, + has_artwork, + federation_state: release_federation_state(release), + } +} + +fn release_federation_state(release: &Release) -> i32 { + if release.tracks.is_empty() { + return i32::from(matches!(release.source, CatalogSource::Federation { .. })); + } + let local = release + .tracks + .iter() + .filter(|track| matches!(track.audio_source, AudioSource::LocalFile(_))) + .count(); + match local { + 0 => 1, + count if count == release.tracks.len() => 0, + _ => 2, + } +} + +fn release_type_label(release_type: &str) -> String { + let release_type = release_type.trim(); + if release_type.is_empty() { + return "Release".into(); + } + if release_type.eq_ignore_ascii_case("ep") { + return "EP".into(); + } + let mut characters = release_type.chars(); + let Some(first) = characters.next() else { + return "Release".into(); + }; + first.to_uppercase().chain(characters).collect() +} + +pub(super) fn release_artist_credits( + release: &Release, + preferred: Option<&ArtistKey>, +) -> (Vec, Vec) { + let all_artists = || { + release + .artists + .iter() + .chain(release.featured_artists.iter()) + .chain( + release + .tracks + .iter() + .flat_map(|track| track.artists.iter().chain(track.featured_artists.iter())), + ) + }; + let primary = preferred + .and_then(|preferred| all_artists().find(|artist| &artist.key == preferred)) + .or_else(|| release.artists.first()) + .or_else(|| { + release + .tracks + .iter() + .find_map(|track| track.artists.first()) + }) + .cloned(); + let mut known = HashSet::new(); + let mut main = Vec::new(); + if let Some(primary) = primary { + known.insert(artist_name_key(&primary.name)); + main.push(primary); + } + let contributors = all_artists() + .filter(|artist| known.insert(artist_name_key(&artist.name))) + .cloned() + .collect(); + (main, contributors) +} + +fn artist_name_key(name: &str) -> String { + name.trim().to_lowercase() +} + +fn merge_artist_releases(releases: impl IntoIterator) -> Vec { + let mut merged = Vec::::new(); + let mut slots = HashMap::<(String, String, Option), usize>::new(); + for release in releases { + let identity = ( + release.title.trim().to_lowercase(), + release.release_type.trim().to_lowercase(), + release.year, + ); + if let Some(index) = slots.get(&identity).copied() { + merge_release_availability(&mut merged[index], release); + } else { + slots.insert(identity, merged.len()); + merged.push(release); + } + } + merged +} + +fn sort_releases_newest_first(releases: &mut [Release]) { + releases.sort_by(|left, right| { + right + .year + .unwrap_or(i32::MIN) + .cmp(&left.year.unwrap_or(i32::MIN)) + .then_with(|| left.release_type.cmp(&right.release_type)) + .then_with(|| left.title.cmp(&right.title)) + }); +} + +fn merge_release_availability(target: &mut Release, incoming: Release) { + if matches!(target.source, CatalogSource::Federation { .. }) + && matches!(incoming.source, CatalogSource::Local) + { + let previous = std::mem::replace(target, incoming); + merge_release_availability(target, previous); + return; + } + if target.artwork.uri.is_none() && incoming.artwork.uri.is_some() { + target.artwork = incoming.artwork; + } + merge_credit_refs(&mut target.artists, incoming.artists); + merge_credit_refs(&mut target.featured_artists, incoming.featured_artists); + for track in incoming.tracks { + if let Some(existing) = target + .tracks + .iter_mut() + .find(|existing| tracks_match_within_release(existing, &track)) + { + if matches!(existing.audio_source, AudioSource::Federation { .. }) + && matches!(track.audio_source, AudioSource::LocalFile(_)) + { + *existing = track; + } + } else { + target.tracks.push(track); + } + } + sort_release_tracks(&mut target.tracks); +} + +fn sort_release_tracks(tracks: &mut [Track]) { + tracks.sort_by(|left, right| { + left.disc_number + .unwrap_or(1) + .cmp(&right.disc_number.unwrap_or(1)) + .then_with(|| { + left.track_number + .unwrap_or(u32::MAX) + .cmp(&right.track_number.unwrap_or(u32::MAX)) + }) + .then_with(|| left.title.cmp(&right.title)) + }); +} + +fn tracks_match_within_release(left: &Track, right: &Track) -> bool { + if left.key.matches(&right.key) { + return true; + } + if let (Some(left_number), Some(right_number)) = (left.track_number, right.track_number) + && left_number == right_number + && left.disc_number.unwrap_or(1) == right.disc_number.unwrap_or(1) + { + return true; + } + left.title.trim().eq_ignore_ascii_case(right.title.trim()) +} + +fn merge_credit_refs(target: &mut Vec, incoming: Vec) { + let mut known = target + .iter() + .map(|artist| artist_name_key(&artist.name)) + .collect::>(); + target.extend( + incoming + .into_iter() + .filter(|artist| known.insert(artist_name_key(&artist.name))), + ); +} + +fn load_artwork(uri: Option<&str>) -> (Image, bool) { + let Some(uri) = uri.filter(|uri| !uri.trim().is_empty()) else { + return (Image::default(), false); + }; + let path = PathBuf::from(uri.strip_prefix("file://").unwrap_or(uri)); + let cached = ARTWORK_CACHE.with(|cache| cache.borrow().get(&path).cloned()); + let image = cached.unwrap_or_else(|| { + let image = decode_artwork(&path).ok(); + ARTWORK_CACHE.with(|cache| { + cache.borrow_mut().insert(path.clone(), image.clone()); + }); + image + }); + image.map_or_else(|| (Image::default(), false), |image| (image, true)) +} + +fn decode_artwork(path: &Path) -> Result { + if path + .extension() + .and_then(|extension| extension.to_str()) + .is_some_and(|extension| extension.eq_ignore_ascii_case("webp")) + { + let bytes = std::fs::read(path).map_err(|error| error.to_string())?; + decode_webp(&bytes) + } else { + Image::load_from_path(path).map_err(|error| error.to_string()) + } +} + +fn decode_webp(bytes: &[u8]) -> Result { + let rgba = image::load_from_memory_with_format(bytes, image::ImageFormat::WebP) + .map_err(|error| error.to_string())? + .into_rgba8(); + let buffer = SharedPixelBuffer::::clone_from_slice( + rgba.as_raw(), + rgba.width(), + rgba.height(), + ); + Ok(Image::from_rgba8(buffer)) +} + +fn format_artist_key(key: &ArtistKey) -> String { + match key { + ArtistKey::Local(id) => format!("local-artist:{}", id.get()), + ArtistKey::Federation { peer_id, id } => format!("fed-artist:{peer_id}:{id}"), + } +} + +fn format_release_key(key: &ReleaseKey) -> String { + match key { + ReleaseKey::Local(id) => format!("local-release:{}", id.get()), + ReleaseKey::Federation { peer_id, id } => format!("fed-release:{peer_id}:{id}"), + } +} + +pub(super) fn find_artist_key(state: &AppState, value: &SharedString) -> Option { + let local = match &state.backend.library { + RemoteData::Ready(library) => library.artists.as_slice(), + _ => &[], + }; + local + .iter() + .chain(state.backend.search.results.artists.iter()) + .find(|artist| format_artist_key(&artist.key) == value.as_str()) + .map(|artist| artist.key.clone()) +} + +pub(super) fn find_release_key(state: &AppState, value: &SharedString) -> Option { + let local = match &state.backend.library { + RemoteData::Ready(library) => library.featured_releases.as_slice(), + _ => &[], + }; + local + .iter() + .chain(state.backend.search.results.releases.iter()) + .find(|release| format_release_key(&release.key) == value.as_str()) + .map(|release| release.key.clone()) +} + +fn format_track_key(key: &TrackKey) -> String { + if let Some(local) = key.local_id() { + format!("local:{}", local.get()) + } else if let Some((peer, item)) = key.federation_id() { + format!( + "fed-track:{peer}:{item}:{}", + key.content_id().map_or("", ContentId::as_str) + ) + } else if let Some(content) = key.content_id() { + content.as_str().to_owned() + } else { + String::new() + } +} + +pub(super) fn parse_track_key(value: &SharedString) -> Option { + if let Some(local) = value.strip_prefix("local:") { + return local + .parse::() + .ok() + .map(|id| TrackKey::local(LocalTrackId::new(id))); + } + if let Some(federated) = value.strip_prefix("fed-track:") { + let mut parts = federated.splitn(3, ':'); + let peer = parts.next()?.to_owned(); + let item = parts.next()?.to_owned(); + let content = parts + .next() + .filter(|value| !value.is_empty()) + .and_then(|value| ContentId::parse(value).ok()); + return Some(TrackKey::federation(peer, item, content)); + } + furumi_domain::ContentId::parse(value.to_string()) + .ok() + .map(TrackKey::remote) +} + +pub(super) fn model(items: Vec) -> ModelRc { + ModelRc::from(Rc::new(VecModel::from(items))) +} + +#[cfg(test)] +mod tests { + use image::ImageEncoder as _; + + use super::*; + + #[test] + fn webp_is_converted_to_a_slint_image() { + let mut encoded = Vec::new(); + image::codecs::webp::WebPEncoder::new_lossless(&mut encoded) + .write_image(&[20, 40, 60, 255], 1, 1, image::ExtendedColorType::Rgba8) + .unwrap(); + + let decoded = decode_webp(&encoded).unwrap(); + + assert_eq!(decoded.size().width, 1); + assert_eq!(decoded.size().height, 1); + } + + #[test] + fn release_credits_include_artists_found_only_on_tracks() { + let pasha = ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(1)), + name: "Паша Техник".into(), + }; + let kunteynir = ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(2)), + name: "KUNTEYNIR".into(), + }; + let metox = ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(3)), + name: "Metox".into(), + }; + let release = Release { + key: ReleaseKey::local(furumi_domain::ReleaseId::new(7)), + source: CatalogSource::Local, + title: "Порядочный".into(), + artists: vec![pasha.clone()], + featured_artists: Vec::new(), + release_type: "album".into(), + year: None, + artwork: furumi_domain::Artwork::default(), + tracks: vec![Track { + key: TrackKey::local(LocalTrackId::new(10)), + title: "12 шагов до рая".into(), + artist: "KUNTEYNIR feat. Metox".into(), + artists: vec![kunteynir], + featured_artists: vec![metox], + release: "Порядочный".into(), + release_id: ReleaseKey::local(furumi_domain::ReleaseId::new(7)), + duration_seconds: 219.0, + track_number: Some(1), + disc_number: Some(1), + cover_uri: None, + audio_format: Some("mp3".into()), + audio_bitrate_kbps: Some(320), + audio_sample_rate_hz: Some(44_100), + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::LocalFile(PathBuf::from("track.mp3")), + }], + }; + + let (main, contributors) = release_artist_credits(&release, Some(&pasha.key)); + + assert_eq!( + main.iter() + .map(|artist| artist.name.as_str()) + .collect::>(), + vec!["Паша Техник"] + ); + assert_eq!( + contributors + .iter() + .map(|artist| artist.name.as_str()) + .collect::>(), + vec!["KUNTEYNIR", "Metox"] + ); + } + + #[test] + fn artist_release_tile_reports_mixed_local_and_federated_tracks() { + let artist = ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(1)), + name: "Artist".into(), + }; + let local = Release { + key: ReleaseKey::local(furumi_domain::ReleaseId::new(7)), + source: CatalogSource::Local, + title: "Album".into(), + artists: vec![artist.clone()], + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: furumi_domain::Artwork::default(), + tracks: vec![Track { + key: TrackKey::local(LocalTrackId::new(10)), + title: "Local".into(), + artist: "Artist".into(), + artists: vec![artist.clone()], + featured_artists: Vec::new(), + release: "Album".into(), + release_id: ReleaseKey::local(furumi_domain::ReleaseId::new(7)), + duration_seconds: 100.0, + track_number: Some(1), + disc_number: Some(1), + cover_uri: None, + audio_format: Some("flac".into()), + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::LocalFile(PathBuf::from("local.flac")), + }], + }; + let content_id = ContentId::parse(format!("b3:{}", "a".repeat(64))).unwrap(); + let mut remote_track = local.tracks[0].clone(); + remote_track.key = TrackKey::federation( + "peer".into(), + "remote-track".into(), + Some(content_id.clone()), + ); + remote_track.title = "Remote".into(); + remote_track.track_number = Some(2); + remote_track.audio_source = AudioSource::Federation { + peer_id: "peer".into(), + content_id, + }; + let remote = Release { + key: ReleaseKey::Federation { + peer_id: "peer".into(), + id: "album".into(), + }, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: "Album".into(), + artists: vec![artist], + featured_artists: Vec::new(), + release_type: "album".into(), + year: Some(2026), + artwork: furumi_domain::Artwork::default(), + tracks: vec![remote_track], + }; + + let merged = merge_artist_releases([local, remote]); + + assert_eq!(merged.len(), 1); + assert!(matches!(merged[0].key, ReleaseKey::Local(_))); + assert_eq!(release_federation_state(&merged[0]), 2); + } + + #[test] + fn artist_releases_are_sorted_newest_first_with_unknown_years_last() { + let artist = ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(1)), + name: "Artist".into(), + }; + let release = |title: &str, year| Release { + key: ReleaseKey::Federation { + peer_id: "peer".into(), + id: title.into(), + }, + source: CatalogSource::Federation { + peer_id: "peer".into(), + }, + title: title.into(), + artists: vec![artist.clone()], + featured_artists: Vec::new(), + release_type: "single".into(), + year, + artwork: furumi_domain::Artwork::default(), + tracks: Vec::new(), + }; + let mut releases = vec![ + release("Old", Some(1999)), + release("Unknown", None), + release("New", Some(2026)), + ]; + + sort_releases_newest_first(&mut releases); + + assert_eq!( + releases + .iter() + .map(|release| release.title.as_str()) + .collect::>(), + vec!["New", "Old", "Unknown"] + ); + } + + #[test] + fn release_rows_use_metadata_track_numbers_instead_of_visual_positions() { + let mut track = Track { + key: TrackKey::local(LocalTrackId::new(1)), + title: "Track".into(), + artist: "Artist".into(), + artists: Vec::new(), + featured_artists: Vec::new(), + release: "Release".into(), + release_id: ReleaseKey::local(furumi_domain::ReleaseId::new(1)), + duration_seconds: 1.0, + track_number: Some(9), + disc_number: Some(1), + cover_uri: None, + audio_format: None, + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::LocalFile(PathBuf::from("track.flac")), + }; + + assert_eq!(track_number_label(&track, 0, true), "9"); + assert_eq!(track_number_label(&track, 0, false), "1"); + track.track_number = None; + assert_eq!(track_number_label(&track, 8, true), "—"); + } + + #[test] + fn full_artist_label_keeps_main_and_featured_artists() { + let mut track = Track { + key: TrackKey::local(LocalTrackId::new(1)), + title: "Track".into(), + artist: String::new(), + artists: vec![ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(1)), + name: "Main".into(), + }], + featured_artists: vec![ + ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(2)), + name: "Guest A".into(), + }, + ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(3)), + name: "Guest B".into(), + }, + ], + release: "Release".into(), + release_id: ReleaseKey::local(furumi_domain::ReleaseId::new(1)), + duration_seconds: 1.0, + track_number: None, + disc_number: None, + cover_uri: None, + audio_format: None, + audio_bitrate_kbps: None, + audio_sample_rate_hz: None, + audio_bit_depth: None, + file_size_bytes: None, + liked: false, + audio_source: AudioSource::LocalFile(PathBuf::from("track.flac")), + }; + + assert_eq!(track_artist_label(&track), "Main feat. Guest A, Guest B"); + track.artists.clear(); + assert_eq!(track_artist_label(&track), "Guest A, Guest B"); + } + + #[test] + fn contributors_wrap_into_compact_comma_separated_lines() { + use slint::Model as _; + + let artists = ["Alpha Alpha", "Beta Beta", "Gamma Gamma"] + .into_iter() + .zip(1_i64..) + .map(|(name, id)| ArtistRef { + key: ArtistKey::local(furumi_domain::ArtistId::new(id)), + name: name.into(), + }) + .collect::>(); + + let lines = contributor_lines(&artists, 80.0); + + assert_eq!(lines.len(), 2); + assert_eq!(lines[0].artists.row_count(), 2); + assert_eq!(lines[1].artists.row_count(), 1); + assert_eq!(lines[0].artists.row_data(0).unwrap().prefix, ""); + assert_eq!(lines[0].artists.row_data(0).unwrap().name, "Alpha Alpha,"); + assert_eq!(lines[0].artists.row_data(1).unwrap().prefix, " "); + assert_eq!(lines[1].artists.row_data(0).unwrap().prefix, ""); + } +} diff --git a/crates/ui/ui/app.slint b/crates/ui/ui/app.slint new file mode 100644 index 0000000..74c348b --- /dev/null +++ b/crates/ui/ui/app.slint @@ -0,0 +1,822 @@ +import { Button, CheckBox, ComboBox, LineEdit, ScrollView, Slider } from "std-widgets.slint"; +import { ArtistLinkLineView, ArtistLinkView, ArtistView, BreadcrumbView, DeviceView, PairingView, PlaylistView, QueueView, ReleaseView, TrackView, VersionView } from "models.slint"; +import { AlbumGrid, ArtistGrid, ArtistLinksRow, BuildInfoCard, DeviceRow, FederationBadge, IconButton, InfoField, LinkText, MarqueeText, NavButton, PlaylistNavButton, SearchArtistGrid, SearchField, SearchReleaseGrid, StaticArtistList, TrackInfoArtists, TrackList } from "components.slint"; + +export component AppWindow inherits Window { + title: "Furumi Desktop"; + preferred-width: 1180px; + preferred-height: 760px; + min-width: 920px; + min-height: 620px; + background: #090b10; + default-font-family: "sans-serif"; + + in property app-name: "Furumi"; + in property home-label: "Home"; + in property search-label: "Search"; + in property library-label: "Your library"; + in property queue-label: "Queue"; + in property recent-label: "Recently played"; + in property featured-label: "Made for listening"; + in property search-placeholder: "Artists, albums or tracks"; + in-out property search-query; + in property active-screen: "home"; + in property queue-open; + in property settings-open; + in property network-id; + in property device-name; + in property library-path; + in property federation-enabled; + in property save-federated-on-listen; + in property selected-language: "English"; + in property <[string]> available-languages; + in property <[ReleaseView]> releases; + in property <[ArtistView]> artists; + in property <[ReleaseView]> artist-albums; + in property <[ReleaseView]> artist-other-releases; + in property <[TrackView]> artist-featured-tracks; + in property <[TrackView]> detail-tracks; + in property detail-title; + in property detail-subtitle; + in property <[ArtistLinkView]> detail-main-artists; + in property <[ArtistLinkLineView]> detail-contributor-lines; + in property detail-release-type; + in property detail-artwork; + in property detail-has-artwork; + in property <[TrackView]> tracks; + in property <[QueueView]> queue-items; + in property <[PlaylistView]> playlists; + in property <[TrackView]> playlist-tracks; + in property playlist-title; + in property playlist-picker-open; + in property <[DeviceView]> connected-devices; + in property <[PairingView]> pending-pairings; + in property device-role-label; + in property device-is-active; + in property active-device-label; + in property device-group-label; + in property device-invite; + in property device-status; + in property device-busy; + in property <[TrackView]> search-results; + in property <[ArtistView]> search-artists; + in property <[ReleaseView]> search-releases; + in property federation-status-busy; + in property federation-status-text: "Federation ready"; + in property federation-debug-node: "Stopped"; + in property federation-debug-peers: "0 connected · 0 known"; + in property federation-debug-dht: "n/a"; + in property federation-debug-published: "0 items"; + in property federation-debug-endpoint; + in property <[VersionView]> software-versions; + in property <[VersionView]> protocol-versions; + in property <[BreadcrumbView]> breadcrumbs; + in property can-go-back; + in property can-go-forward; + in property track-info-open; + in property track-info-title; + in property <[ArtistLinkView]> track-info-artist-links; + in property track-info-release; + in property track-info-duration; + in property track-info-format; + in property track-info-quality; + in property track-info-source; + in property track-info-content-id; + in property track-info-path; + in property track-info-artwork; + in property track-info-has-artwork; + in property detail-federation-state; + in property has-track; + in property playing; + in property current-title; + in property <[ArtistLinkView]> current-artists; + in property current-metadata; + in property current-release; + in property current-release-key; + in property current-artwork; + in property current-has-artwork; + in property elapsed; + in property duration; + in property progress; + in property volume; + in property error-message; + + callback navigate(string); + callback go-back; + callback go-forward; + callback navigate-breadcrumb(string); + callback open-artist(string); + callback open-release(string); + callback layout-detail-contributors(float); + callback toggle-queue; + callback toggle-settings; + callback toggle-playback; + callback next; + callback previous; + callback seek(float); + callback set-volume(float); + callback play-release(string); + callback play-track(string); + callback play-track-context(string, string); + callback play-queue-item(string); + callback track-action(string, string); + callback open-playlist(string); + callback create-playlist(string); + callback add-track-to-playlist(string); + callback close-playlist-picker; + callback create-device-invite; + callback connect-device(string); + callback answer-pairing(string, bool, bool); + callback select-device(string); + callback search-changed(string); + callback network-id-changed(string); + callback device-name-changed(string); + callback library-path-changed(string); + callback choose-library-path; + callback federation-changed(bool); + callback save-federated-on-listen-changed(bool); + callback language-changed(string); + callback dismiss-error; + callback close-track-info; + + Rectangle { + background: #090b10; + HorizontalLayout { + x: 0px; y: 0px; width: parent.width; height: parent.height - 90px; + spacing: 0px; + sidebar := Rectangle { + width: 218px; + background: #101218; + border-color: #232630; + border-width: 0px; + VerticalLayout { + padding: 16px; + spacing: 7px; + HorizontalLayout { + height: 52px; + spacing: 11px; + Rectangle { + width: 36px; + background: transparent; + Image { source: @image-url("../assets/logo.svg"); width: 36px; height: 36px; y: (parent.height - self.height) / 2; } + } + Text { text: root.app-name; color: #f5f6fa; font-size: 18px; font-weight: 800; vertical-alignment: center; } + } + NavButton { label: root.home-label; icon-source: @image-url("../assets/home.svg"); active: root.active-screen == "home"; clicked => root.navigate("home"); } + NavButton { label: root.search-label; icon-source: @image-url("../assets/search.svg"); active: root.active-screen == "search"; clicked => root.navigate("search"); } + NavButton { label: root.library-label; icon-source: @image-url("../assets/library.svg"); active: root.active-screen == "library"; clicked => root.navigate("library"); } + Rectangle { height: 12px; background: transparent; } + HorizontalLayout { + height: 28px; + Text { horizontal-stretch: 1; text: "PLAYLISTS"; color: #656b7b; font-size: 10px; font-weight: 700; letter-spacing: 1.2px; vertical-alignment: center; } + Rectangle { + width: 28px; height: 28px; border-radius: 6px; + background: add-playlist-touch.has-hover ? #282c38 : transparent; + Image { source: @image-url("../assets/plus.svg"); width: 16px; height: 16px; x: 6px; y: 6px; } + add-playlist-touch := TouchArea { clicked => new-playlist-popup.show(); } + } + } + ScrollView { + vertical-stretch: 1; + min-height: 0px; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + spacing: 2px; + for playlist in root.playlists: PlaylistNavButton { + item: playlist; + active: root.active-screen == "playlist" && root.playlist-title == playlist.title; + clicked(id) => root.open-playlist(id); + } + } + } + NavButton { label: "Settings"; icon-source: @image-url("../assets/settings.svg"); active: root.settings-open; clicked => root.toggle-settings(); } + Rectangle { + height: 58px; border-radius: 9px; background: #171a22; + HorizontalLayout { + padding: 10px; spacing: 10px; + Rectangle { width: 34px; height: 34px; border-radius: 17px; background: #353a49; Text { text: "F"; color: #fff; font-weight: 700; horizontal-alignment: center; vertical-alignment: center; } } + VerticalLayout { alignment: center; Text { text: "Local library"; color: #e9eaf0; font-size: 12px; font-weight: 600; } Text { text: "Desktop player"; color: #777d8d; font-size: 10px; } } + } + } + + } + new-playlist-popup := PopupWindow { + x: 16px; y: 250px; width: 250px; height: 132px; + close-policy: close-on-click-outside; + Rectangle { + border-radius: 10px; background: #20242e; border-width: 1px; border-color: #3a3f4d; + VerticalLayout { + padding: 14px; spacing: 10px; + Text { text: "New playlist"; color: #f5f6fa; font-size: 14px; font-weight: 700; } + new-playlist-name := LineEdit { placeholder-text: "Playlist name"; } + Button { text: "Create"; clicked => { root.create-playlist(new-playlist-name.text); new-playlist-name.text = ""; new-playlist-popup.close(); } } + } + } + } + } + + content := Rectangle { + horizontal-stretch: 1; + background: #0c0e14; + VerticalLayout { + padding-left: 26px; + padding-right: 26px; + padding-top: 18px; + padding-bottom: 16px; + spacing: 17px; + HorizontalLayout { + height: 42px; + IconButton { enabled: root.can-go-back; icon-source: @image-url("../assets/back.svg"); clicked => root.go-back(); } + IconButton { enabled: root.can-go-forward; icon-source: @image-url("../assets/forward.svg"); clicked => root.go-forward(); } + Rectangle { horizontal-stretch: 1; background: transparent; } + SearchField { + width: 280px; + text <=> root.search-query; + placeholder-text: root.search-placeholder; + edited(value) => root.search-changed(value); + } + } + + HorizontalLayout { + height: 26px; + Rectangle { + horizontal-stretch: 1; background: transparent; clip: true; + HorizontalLayout { + spacing: 0px; + alignment: start; + for crumb in root.breadcrumbs: Text { + horizontal-stretch: 0; + text: crumb.label; + color: crumb.target == "" ? #aeb4c2 : crumb-touch.has-hover ? #f1f2f6 : #777e8f; + font-size: 13px; font-weight: crumb.target == "" ? 650 : 500; vertical-alignment: center; + crumb-touch := TouchArea { enabled: crumb.target != ""; clicked => root.navigate-breadcrumb(crumb.target); } + } + } + } + Rectangle { + height: 24px; + width: 280px; + border-radius: 12px; + background: root.federation-status-busy ? #20352f : #191d26; + border-color: root.federation-status-busy ? #3d7865 : #303541; + border-width: 1px; + HorizontalLayout { + padding-left: 10px; padding-right: 10px; spacing: 6px; + Text { text: root.federation-status-busy ? "◌" : "●"; color: root.federation-status-busy ? #55dbaa : #697080; font-size: 10px; vertical-alignment: center; } + status-label := Text { text: root.federation-status-text; color: #9da3b2; font-size: 10px; overflow: elide; vertical-alignment: center; } + } + } + } + + if root.active-screen == "home": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; + spacing: 17px; + Text { text: "Good evening"; color: #f5f6fa; font-size: 28px; font-weight: 800; } + Text { text: "Artists"; color: #f5f6fa; font-size: 18px; font-weight: 750; } + ArtistGrid { artists: root.artists; open(key) => root.open-artist(key); } + Rectangle { height: 8px; background: transparent; } + Text { text: root.recent-label; color: #f5f6fa; font-size: 18px; font-weight: 750; } + TrackList { tracks: root.tracks; play(key) => root.play-track-context("recent", key); action(action, key) => root.track-action(action, key); open-artist(key) => root.open-artist(key); open-release(key) => root.open-release(key); } + } + } + + if root.active-screen == "library": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 17px; + Text { text: root.library-label; color: #f5f6fa; font-size: 28px; font-weight: 800; } + AlbumGrid { releases: root.releases; play(key) => root.play-release(key); open(key) => root.open-release(key); open-artist(key) => root.open-artist(key); } + } + } + + if root.active-screen == "playlist": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 18px; alignment: start; + Text { height: 46px; vertical-stretch: 0; text: root.playlist-title; color: #f5f6fa; font-size: 30px; font-weight: 800; vertical-alignment: center; } + Text { height: 18px; vertical-stretch: 0; text: root.playlist-tracks.length + (root.playlist-tracks.length == 1 ? " track" : " tracks"); color: #858b9c; font-size: 12px; vertical-alignment: center; } + TrackList { tracks: root.playlist-tracks; show-artwork: true; play(key) => root.play-track-context("playlist", key); action(action, key) => root.track-action(action, key); open-artist(key) => root.open-artist(key); open-release(key) => root.open-release(key); } + } + } + + if root.active-screen == "artist": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 20px; alignment: start; + HorizontalLayout { + height: 188px; spacing: 22px; + Rectangle { + width: 188px; height: 188px; border-radius: 30px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 54px; height: 54px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if root.detail-has-artwork: Image { source: root.detail-artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + } + VerticalLayout { alignment: end; spacing: 8px; Text { text: "ARTIST"; color: #9298a8; font-size: 11px; font-weight: 700; } Text { text: root.detail-title; color: #f5f6fa; font-size: 34px; font-weight: 800; overflow: elide; } Text { text: root.detail-subtitle; color: #858b9c; font-size: 13px; } } + } + if root.artist-albums.length > 0: Text { height: 28px; vertical-stretch: 0; text: "Albums"; color: #f5f6fa; font-size: 20px; font-weight: 750; vertical-alignment: center; } + if root.artist-albums.length > 0: AlbumGrid { releases: root.artist-albums; show-artists: false; play(key) => root.play-release(key); open(key) => root.open-release(key); open-artist(key) => root.open-artist(key); } + if root.artist-other-releases.length > 0: Text { height: 28px; vertical-stretch: 0; text: "Singles, EPs and other releases"; color: #f5f6fa; font-size: 20px; font-weight: 750; vertical-alignment: center; } + if root.artist-other-releases.length > 0: AlbumGrid { releases: root.artist-other-releases; show-artists: false; show-release-types: true; play(key) => root.play-release(key); open(key) => root.open-release(key); open-artist(key) => root.open-artist(key); } + if root.artist-featured-tracks.length > 0: Text { height: 28px; vertical-stretch: 0; text: "Featured on"; color: #f5f6fa; font-size: 20px; font-weight: 750; vertical-alignment: center; } + if root.artist-featured-tracks.length > 0: TrackList { tracks: root.artist-featured-tracks; show-artwork: true; play(key) => root.play-track-context("artist-featured", key); action(action, key) => root.track-action(action, key); open-artist(key) => root.open-artist(key); open-release(key) => root.open-release(key); } + } + } + + if root.active-screen == "release": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 20px; + HorizontalLayout { + height: 188px; spacing: 22px; + Rectangle { + width: 188px; height: 188px; border-radius: 9px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 54px; height: 54px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if root.detail-has-artwork: Image { source: root.detail-artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + } + Rectangle { + horizontal-stretch: 1; + height: 188px; + background: transparent; + VerticalLayout { + x: 0px; y: 68px; width: parent.width; height: 111px; + spacing: 2px; alignment: start; + HorizontalLayout { + height: 18px; spacing: 8px; + Text { text: root.detail-release-type; color: #9298a8; font-size: 11px; font-weight: 700; vertical-alignment: center; } + if root.detail-federation-state > 0: FederationBadge { partial: root.detail-federation-state == 2; } + Rectangle { horizontal-stretch: 1; background: transparent; } + } + Text { width: parent.width; height: 43px; text: root.detail-title; color: #f5f6fa; font-size: 34px; font-weight: 800; overflow: elide; vertical-alignment: center; } + ArtistLinksRow { width: parent.width; height: 20px; artists: root.detail-main-artists; text-size: 13px; open-artist(key) => root.open-artist(key); } + } + } + } + if root.detail-contributor-lines.length > 0: StaticArtistList { + width: parent.width / 2; + lines: root.detail-contributor-lines; + heading: "Featuring"; + open-artist(key) => root.open-artist(key); + changed width => { + root.layout-detail-contributors(self.width / 1px); + } + } + TrackList { tracks: root.detail-tracks; play(key) => root.play-track-context("release", key); action(action, key) => root.track-action(action, key); open-artist(key) => root.open-artist(key); open-release(key) => root.open-release(key); } + } + } + + if root.active-screen == "search": ScrollView { + viewport-width: self.width; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 14px; alignment: start; + HorizontalLayout { + height: 34px; + Text { text: root.search-query == "" ? "Search your music" : "Results for “" + root.search-query + "”"; color: #f5f6fa; font-size: 25px; font-weight: 800; vertical-alignment: center; } + Rectangle { horizontal-stretch: 1; background: transparent; } + } + if root.search-artists.length > 0: Text { height: 24px; text: "Artists"; color: #f5f6fa; font-size: 18px; font-weight: 750; vertical-alignment: center; } + if root.search-artists.length > 0: SearchArtistGrid { artists: root.search-artists; open(key) => root.open-artist(key); } + if root.search-releases.length > 0: Text { height: 24px; text: "Releases"; color: #f5f6fa; font-size: 18px; font-weight: 750; vertical-alignment: center; } + if root.search-releases.length > 0: SearchReleaseGrid { releases: root.search-releases; open(key) => root.open-release(key); } + if root.search-results.length > 0: Text { height: 24px; text: "Tracks"; color: #f5f6fa; font-size: 18px; font-weight: 750; vertical-alignment: center; } + TrackList { tracks: root.search-results; show-artwork: true; play(key) => root.play-track-context("search", key); action(action, key) => root.track-action(action, key); open-artist(key) => root.open-artist(key); open-release(key) => root.open-release(key); } + } + } + } + } + + if root.queue-open: queue-panel := Rectangle { + width: 292px; + background: #11141b; + border-color: #252936; + border-width: 1px; + VerticalLayout { + padding: 17px; + spacing: 12px; + HorizontalLayout { + height: 34px; + Text { text: root.queue-label; color: #f5f6fa; font-size: 18px; font-weight: 750; vertical-alignment: center; } + Rectangle { horizontal-stretch: 1; background: transparent; } + IconButton { icon-source: @image-url("../assets/close.svg"); clicked => root.toggle-queue(); } + } + Text { text: "Now playing and up next"; color: #777d8d; font-size: 11px; } + VerticalLayout { + spacing: 4px; + for item in root.queue-items: Rectangle { + height: 52px; border-radius: 7px; background: item.active ? #242a35 : transparent; + TouchArea { double-clicked => root.play-queue-item(item.key); } + HorizontalLayout { + padding: 7px; spacing: 10px; + Rectangle { width: 38px; height: 38px; border-radius: 5px; background: #292d38; Image { source: @image-url("../assets/note.svg"); width: 21px; height: 21px; x: 8px; y: 8px; } if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } } + Rectangle { + width: 190px; height: parent.height; background: transparent; clip: true; + VerticalLayout { + x: 0px; y: 0px; width: parent.width; height: parent.height; alignment: center; + MarqueeText { width: parent.width; height: 18px; label: item.title; text-color: item.active ? #55dbaa : #e7e9ef; text-size: 12px; text-weight: 600; } + LinkText { width: parent.width; label: item.artist; base-color: #777d8d; text-size: 10px; height: 15px; clicked => root.open-artist(item.artist-key); } + } + } + } + } + } + Rectangle { vertical-stretch: 1; background: transparent; } + } + } + } + + player := Rectangle { + x: 0px; y: parent.height - 90px; width: parent.width; height: 90px; + background: #11131a; + border-color: #282b35; + border-width: 1px; + HorizontalLayout { + padding-left: 18px; padding-right: 18px; padding-top: 12px; padding-bottom: 10px; + spacing: 18px; + HorizontalLayout { + width: 260px; spacing: 11px; + Rectangle { + width: 54px; height: 54px; border-radius: 6px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 28px; height: 28px; x: 13px; y: 13px; } + if root.current-has-artwork: Image { source: root.current-artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + if root.current-has-artwork: TouchArea { clicked => artwork-popup.show(); } + } + VerticalLayout { + width: 195px; + alignment: center; + Text { width: 195px; text: root.current-title; color: #f3f4f8; font-size: 13px; font-weight: 650; overflow: elide; } + ArtistLinksRow { width: 195px; height: 16px; artists: root.current-artists; row-color: #818797; open-artist(key) => root.open-artist(key); } + Text { width: 195px; text: root.current-metadata; color: #656b7b; font-size: 10px; overflow: elide; vertical-alignment: center; } + } + } + VerticalLayout { + horizontal-stretch: 1; spacing: 7px; + HorizontalLayout { + alignment: center; spacing: 8px; + IconButton { icon-source: @image-url("../assets/previous.svg"); clicked => root.previous(); } + Rectangle { + width: 42px; height: 42px; border-radius: 21px; background: #f4f5f8; + if root.playing: Image { source: @image-url("../assets/pause.svg"); width: 19px; height: 19px; x: 11px; y: 11px; } + if !root.playing: Image { source: @image-url("../assets/play.svg"); width: 19px; height: 19px; x: 12px; y: 11px; } + TouchArea { clicked => root.toggle-playback(); } + } + IconButton { icon-source: @image-url("../assets/next.svg"); clicked => root.next(); } + } + HorizontalLayout { + spacing: 9px; + Text { text: root.elapsed; color: #818797; font-size: 10px; width: 34px; horizontal-alignment: right; vertical-alignment: center; } + Slider { horizontal-stretch: 1; height: 18px; minimum: 0; maximum: 1; value: root.progress; changed(value) => root.seek(value); } + Text { text: root.duration; color: #818797; font-size: 10px; width: 34px; vertical-alignment: center; } + } + } + Rectangle { + width: 238px; background: transparent; + IconButton { x: 0px; y: (parent.height - self.height) / 2; icon-source: @image-url("../assets/queue.svg"); clicked => root.toggle-queue(); } + Image { x: 48px; y: (parent.height - self.height) / 2; source: @image-url("../assets/volume.svg"); width: 18px; height: 18px; } + Slider { x: 75px; y: (parent.height - self.height) / 2; width: 100px; height: 18px; minimum: 0; maximum: 1; value: root.volume; changed(value) => root.set-volume(value); } + IconButton { + x: 190px; y: (parent.height - self.height) / 2; + icon-source: @image-url("../assets/devices.svg"); + icon-color: root.device-is-active ? #e58bd7 : transparent; + clicked => devices-popup.show(); + } + devices-popup := PopupWindow { + x: -130px; y: -474px; width: 368px; height: 464px; + close-policy: close-on-click-outside; + Rectangle { + border-radius: 12px; background: #1b1f28; border-width: 1px; border-color: #3a3f4d; + VerticalLayout { + padding: 16px; spacing: 10px; + HorizontalLayout { + height: 36px; + VerticalLayout { + Text { text: "Connected devices"; color: #f5f6fa; font-size: 17px; font-weight: 750; } + Text { text: root.device-role-label + " · " + root.active-device-label; color: #7f8797; font-size: 10px; } + } + Rectangle { horizontal-stretch: 1; background: transparent; } + IconButton { icon-source: @image-url("../assets/close.svg"); clicked => devices-popup.close(); } + } + Text { text: root.device-group-label; color: #697080; font-size: 10px; overflow: elide; } + Rectangle { height: 1px; background: #303541; } + Text { height: 16px; text: "ACTIVE DEVICE"; color: #697080; font-size: 9px; font-weight: 750; letter-spacing: 0.8px; vertical-alignment: center; } + for device in root.connected-devices: DeviceRow { + visible: device.active; + height: device.active ? 48px : 0px; + item: device; + selectable: false; + } + Text { height: 16px; text: "AVAILABLE DEVICES"; color: #697080; font-size: 9px; font-weight: 750; letter-spacing: 0.8px; vertical-alignment: center; } + ScrollView { + vertical-stretch: 1; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + spacing: 4px; + for device in root.connected-devices: DeviceRow { + visible: !device.active; + height: !device.active ? 48px : 0px; + item: device; + selectable: !device.revoked && (device.online || device.is-self); + selected(id) => root.select-device(id); + } + for pairing in root.pending-pairings: Rectangle { + height: 76px; border-radius: 7px; background: #252a35; + VerticalLayout { + padding: 8px; spacing: 5px; + Text { text: pairing.name + " wants to connect"; color: #f0f1f5; font-size: 11px; font-weight: 650; overflow: elide; } + Text { text: pairing.details; color: #7f8797; font-size: 9px; overflow: elide; } + HorizontalLayout { + spacing: 7px; + Button { text: "Accept"; clicked => root.answer-pairing(pairing.request-id, true, pairing.group-conflict); } + Button { text: "Deny"; clicked => root.answer-pairing(pairing.request-id, false, false); } + } + } + } + } + } + Rectangle { height: 1px; background: #303541; } + if root.device-invite != "": Text { text: root.device-invite; color: #9ca4b4; font-size: 9px; wrap: word-wrap; max-height: 36px; overflow: elide; } + HorizontalLayout { + spacing: 8px; + device-link := LineEdit { horizontal-stretch: 1; placeholder-text: "Paste frid://i/… invite"; } + Button { text: "Connect"; enabled: !root.device-busy && device-link.text != ""; clicked => root.connect-device(device-link.text); } + } + HorizontalLayout { + Button { text: root.device-invite == "" ? "Create invite" : "New invite"; enabled: !root.device-busy; clicked => root.create-device-invite(); } + Rectangle { horizontal-stretch: 1; background: transparent; } + Text { text: root.device-status; color: root.device-status == "" ? transparent : #8c93a3; font-size: 9px; vertical-alignment: center; overflow: elide; } + } + } + } + } + } + } + } + } + + if root.playlist-picker-open: Rectangle { + background: #05070ab8; + TouchArea { clicked => root.close-playlist-picker(); } + Rectangle { + width: 360px; height: min(430px, parent.height - 80px); + x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; + border-radius: 12px; background: #1b1f28; border-width: 1px; border-color: #3a3f4d; + TouchArea { } + VerticalLayout { + padding: 18px; spacing: 12px; + HorizontalLayout { + height: 34px; + Text { horizontal-stretch: 1; text: "Add to playlist"; color: #f5f6fa; font-size: 18px; font-weight: 750; vertical-alignment: center; } + IconButton { icon-source: @image-url("../assets/close.svg"); clicked => root.close-playlist-picker(); } + } + Rectangle { height: 1px; background: #303541; } + ScrollView { + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + spacing: 4px; + for playlist in root.playlists: Rectangle { + visible: !playlist.is-likes; + height: !playlist.is-likes ? 48px : 0px; border-radius: 7px; background: picker-touch.has-hover ? #292e3a : transparent; + VerticalLayout { + padding-left: 10px; padding-right: 10px; alignment: center; + Text { text: playlist.title; color: #e8eaf0; font-size: 12px; font-weight: 650; overflow: elide; } + Text { text: playlist.details; color: #757c8c; font-size: 10px; } + } + picker-touch := TouchArea { clicked => root.add-track-to-playlist(playlist.id); } + } + } + } + } + } + } + + if root.settings-open: Rectangle { + background: #05070ad9; + TouchArea { clicked => root.toggle-settings(); } + settings-card := Rectangle { + width: min(620px, parent.width - 48px); + height: min(650px, parent.height - 48px); + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + border-radius: 14px; + background: #171a22; + border-color: #303541; + border-width: 1px; + // Consume clicks anywhere inside the card so they do not reach the + // modal backdrop. Interactive controls below remain on top. + TouchArea { } + VerticalLayout { + padding: 24px; + spacing: 14px; + HorizontalLayout { + height: 38px; + VerticalLayout { + Text { text: "Settings"; color: #f5f6fa; font-size: 23px; font-weight: 800; } + Text { text: "Desktop player preferences"; color: #7f8595; font-size: 11px; } + } + Rectangle { horizontal-stretch: 1; background: transparent; } + IconButton { icon-source: @image-url("../assets/close.svg"); clicked => root.toggle-settings(); } + } + Rectangle { height: 1px; background: #2a2e38; } + ScrollView { + vertical-stretch: 1; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + width: parent.width; spacing: 14px; alignment: start; + VerticalLayout { + spacing: 7px; + Text { text: "Network ID"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Peers with the same value form one logical federation network."; color: #818797; font-size: 11px; } + LineEdit { + text: root.network-id; + placeholder-text: "furumi"; + edited => root.network-id-changed(self.text); + } + } + VerticalLayout { + spacing: 7px; + Text { text: "Device name"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Shown to your other players when connecting devices or transferring playback."; color: #818797; font-size: 11px; } + LineEdit { + text: root.device-name; + placeholder-text: "Furumi on this computer"; + edited => root.device-name-changed(self.text); + } + } + VerticalLayout { + spacing: 7px; + Text { text: "Library path"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Music and downloaded tracks will be stored in this directory."; color: #818797; font-size: 11px; } + HorizontalLayout { + spacing: 8px; + LineEdit { + text: root.library-path; + placeholder-text: "~/Music/Furumi"; + horizontal-stretch: 1; + edited => root.library-path-changed(self.text); + } + Button { text: "Choose…"; clicked => root.choose-library-path(); } + } + } + HorizontalLayout { + height: 52px; + VerticalLayout { + Text { text: "Federation"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Discover and play music shared by peers."; color: #818797; font-size: 11px; } + } + Rectangle { horizontal-stretch: 1; background: transparent; } + CheckBox { + text: "Enabled"; + checked: root.federation-enabled; + toggled => root.federation-changed(self.checked); + } + } + Rectangle { + min-height: 104px; max-height: 104px; vertical-stretch: 0; + border-radius: 9px; background: #11151d; border-width: 1px; border-color: #2c3240; + VerticalLayout { + padding: 11px; spacing: 6px; + HorizontalLayout { + height: 18px; + Text { horizontal-stretch: 1; text: "Federation diagnostics"; color: #dfe2ea; font-size: 11px; font-weight: 700; vertical-alignment: center; } + Text { text: root.federation-debug-node; color: root.federation-enabled ? #55dbaa : #777d8d; font-size: 10px; vertical-alignment: center; } + } + HorizontalLayout { + height: 18px; spacing: 14px; + Text { width: 250px; text: "Peers " + root.federation-debug-peers; color: #8f96a6; font-size: 10px; overflow: elide; vertical-alignment: center; } + Text { horizontal-stretch: 1; text: "DHT " + root.federation-debug-dht; color: #8f96a6; font-size: 10px; overflow: elide; vertical-alignment: center; } + } + HorizontalLayout { + height: 18px; spacing: 14px; + Text { width: 250px; text: "Published " + root.federation-debug-published; color: #8f96a6; font-size: 10px; overflow: elide; vertical-alignment: center; } + Text { horizontal-stretch: 1; text: "Endpoint " + root.federation-debug-endpoint; color: #697080; font-size: 9px; overflow: elide; vertical-alignment: center; } + } + } + } + HorizontalLayout { + height: 52px; + VerticalLayout { + Text { text: "Keep federated tracks"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Import music played from peers and make it available to the federation."; color: #818797; font-size: 11px; } + } + Rectangle { horizontal-stretch: 1; background: transparent; } + CheckBox { + text: "Enabled"; + checked: root.save-federated-on-listen; + toggled => root.save-federated-on-listen-changed(self.checked); + } + } + HorizontalLayout { + height: 52px; + VerticalLayout { + Text { text: "Language"; color: #e8eaf0; font-size: 13px; font-weight: 650; } + Text { text: "Interface language."; color: #818797; font-size: 11px; } + } + Rectangle { horizontal-stretch: 1; background: transparent; } + ComboBox { + width: 180px; + model: root.available-languages; + current-value: root.selected-language; + selected(value) => root.language-changed(value); + } + } + BuildInfoCard { + width: parent.width; + software: root.software-versions; + protocols: root.protocol-versions; + } + } + } + } + } + } + + if root.track-info-open: Rectangle { + background: #05070ad9; + TouchArea { clicked => root.close-track-info(); } + info-card := Rectangle { + width: min(680px, parent.width - 48px); + height: 430px; + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + border-radius: 12px; + background: #171a22; + border-color: #3a3f4d; + border-width: 2px; + TouchArea { } + VerticalLayout { + padding: 22px; spacing: 16px; + HorizontalLayout { + height: 38px; + Text { text: "Track information"; color: #f5f6fa; font-size: 21px; font-weight: 800; vertical-alignment: center; } + Rectangle { horizontal-stretch: 1; background: transparent; } + IconButton { icon-source: @image-url("../assets/close.svg"); clicked => root.close-track-info(); } + } + Rectangle { height: 1px; background: #2a2e38; } + HorizontalLayout { + spacing: 22px; + Rectangle { + width: 210px; height: 210px; border-radius: 8px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 56px; height: 56px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if root.track-info-has-artwork: Image { source: root.track-info-artwork; image-fit: ImageFit.contain; width: parent.width; height: parent.height; } + } + VerticalLayout { + spacing: 2px; + Text { height: 34px; text: root.track-info-title; color: #f5f6fa; font-size: 20px; font-weight: 750; overflow: elide; vertical-alignment: center; } + TrackInfoArtists { artists: root.track-info-artist-links; open-artist(key) => root.open-artist(key); } + InfoField { label: "Release"; value: root.track-info-release; } + InfoField { label: "Duration"; value: root.track-info-duration; } + InfoField { label: "Format"; value: root.track-info-format; } + InfoField { label: "Audio quality"; value: root.track-info-quality; } + InfoField { label: "Source"; value: root.track-info-source; } + } + } + InfoField { label: "Content ID"; value: root.track-info-content-id; } + InfoField { label: "File / peer"; value: root.track-info-path; } + } + } + } + + if root.error-message != "": Rectangle { + x: parent.width - self.width - 18px; + y: 18px; + width: 320px; + height: 62px; + border-radius: 9px; + background: #3b2028; + Text { text: root.error-message; color: #ffd9e0; font-size: 12px; x: 14px; width: parent.width - 48px; vertical-alignment: center; wrap: word-wrap; } + Text { text: "×"; color: #ffd9e0; x: parent.width - 30px; width: 20px; horizontal-alignment: center; vertical-alignment: center; } + TouchArea { clicked => root.dismiss-error(); } + } + + artwork-popup := PopupWindow { + x: (root.width - self.width) / 2; + y: (root.height - self.height) / 2; + width: 560px; + height: 560px; + close-policy: close-on-click-outside; + Rectangle { + width: parent.width; height: parent.height; + border-radius: 8px; + background: #171a22; + border-color: #3a3f4d; + border-width: 2px; + clip: true; + Image { x: 8px; y: 8px; source: root.current-artwork; width: parent.width - 16px; height: parent.height - 16px; image-fit: ImageFit.contain; } + } + } +} diff --git a/crates/ui/ui/components.slint b/crates/ui/ui/components.slint new file mode 100644 index 0000000..b796d2e --- /dev/null +++ b/crates/ui/ui/components.slint @@ -0,0 +1,702 @@ +import { ScrollView } from "std-widgets.slint"; +import { ArtistLinkLineView, ArtistLinkView, ArtistView, DeviceView, PlaylistView, ReleaseView, TrackView, VersionView } from "models.slint"; +export component IconButton inherits Rectangle { + in property icon-source; + in property icon-color: transparent; + in property tooltip; + in property enabled: true; + callback clicked; + width: 38px; + height: 38px; + border-radius: 19px; + opacity: root.enabled ? 1 : 0.32; + background: root.enabled && touch.has-hover ? #282c38 : transparent; + Image { source: root.icon-source; colorize: root.icon-color; width: 19px; height: 19px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + touch := TouchArea { enabled: root.enabled; clicked => root.clicked(); } +} + +export component DeviceRow inherits Rectangle { + in property item; + in property selectable: false; + callback selected(string); + height: 48px; + border-radius: 7px; + opacity: item.revoked ? 0.45 : 1; + background: item.active ? #24483d : selectable && touch.has-hover ? #292e3a : transparent; + HorizontalLayout { + padding-left: 10px; padding-right: 10px; spacing: 10px; + Rectangle { + width: 8px; background: transparent; + Rectangle { + width: 8px; height: 8px; border-radius: 4px; + y: (parent.height - self.height) / 2; + background: root.item.online ? #55dbaa : #555c6c; + } + } + VerticalLayout { + horizontal-stretch: 1; alignment: center; + Text { text: root.item.name + (root.item.is-self ? " · this device" : ""); color: #e8eaf0; font-size: 12px; font-weight: 650; overflow: elide; } + Text { text: root.item.details; color: #757c8c; font-size: 10px; overflow: elide; } + } + if root.item.active: Text { text: "ACTIVE"; color: #55dbaa; font-size: 9px; font-weight: 750; vertical-alignment: center; } + } + touch := TouchArea { enabled: root.selectable; clicked => root.selected(root.item.id); } +} + +export component FederationBadge inherits Rectangle { + in property partial: false; + width: 24px; + height: 18px; + border-radius: 5px; + background: root.partial ? @linear-gradient(90deg, #4bd4a1 0%, #4bd4a1 50%, #e1b84b 50%, #e1b84b 100%) : #4bd4a1; + Image { + source: @image-url("../assets/federation.svg"); + width: 14px; + height: 14px; + x: (parent.width - self.width) / 2; + y: (parent.height - self.height) / 2; + } +} + +export component SearchField inherits Rectangle { + in-out property text <=> input.text; + in property placeholder-text; + callback edited(string); + forward-focus: input; + height: 38px; + border-radius: 19px; + background: #1b1e27; + border-width: 1px; + border-color: input.has-focus ? #697182 : #1b1e27; + clip: true; + + TouchArea { clicked => input.focus(); } + Image { + source: @image-url("../assets/search.svg"); + x: 14px; + y: (parent.height - self.height) / 2; + width: 17px; + height: 17px; + } + input-viewport := Rectangle { + x: 41px; + y: 1px; + width: parent.width - 54px; + height: parent.height - 2px; + background: transparent; + clip: true; + if input.text == "": Text { + text: root.placeholder-text; + color: #858c9c; + font-size: 12px; + vertical-alignment: center; + overflow: elide; + } + input := TextInput { + private property cursor-margin: 2px; + width: max(parent.width, self.preferred-width); + height: parent.height; + color: #e8eaf0; + font-size: 12px; + vertical-alignment: center; + single-line: true; + input-type: search; + selection-background-color: #52617a; + selection-foreground-color: #ffffff; + edited => root.edited(self.text); + cursor-position-changed(cursor-position) => { + if cursor-position.x + self.x < cursor-margin { + self.x = -cursor-position.x + cursor-margin; + } else if cursor-position.x + self.x > parent.width - cursor-margin - self.text-cursor-width { + self.x = parent.width - cursor-position.x - cursor-margin - self.text-cursor-width; + } + } + } + } +} + +export component NavButton inherits Rectangle { + in property label; + in property icon-source; + in property active; + callback clicked; + height: 44px; + border-radius: 8px; + background: root.active ? #252936 : touch.has-hover ? #1a1d27 : transparent; + HorizontalLayout { + padding-left: 13px; + padding-right: 13px; + spacing: 12px; + Rectangle { + width: 19px; + background: transparent; + Image { source: root.icon-source; width: 19px; height: 19px; y: (parent.height - self.height) / 2; } + } + Text { text: root.label; color: root.active ? #ffffff : #b5bac8; font-size: 14px; font-weight: root.active ? 700 : 500; vertical-alignment: center; } + } + touch := TouchArea { clicked => root.clicked(); } +} + +export component PlaylistNavButton inherits Rectangle { + in property item; + in property active; + callback clicked(string); + height: 34px; + border-radius: 6px; + background: root.active ? #252936 : touch.has-hover ? #1a1d27 : transparent; + HorizontalLayout { + padding-left: 10px; padding-right: 8px; spacing: 9px; + Image { + source: root.item.is-likes ? @image-url("../assets/heart.svg") : @image-url("../assets/playlist-add.svg"); + width: 15px; height: 15px; + } + Text { horizontal-stretch: 1; text: root.item.title; color: root.active ? #f5f6fa : #a4a9b7; font-size: 12px; overflow: elide; vertical-alignment: center; } + } + touch := TouchArea { clicked => root.clicked(root.item.id); } +} + +export component MarqueeText inherits Rectangle { + in property label; + in property text-color: #858b9c; + in property text-size: 11px; + in property text-weight: 400; + private property travel: max(0px, marquee-label.preferred-width - root.width); + private property scrolling: root.travel > 1px; + // Calling animation-tick() for text that already fits keeps the whole + // window repainting for no visual reason. + private property phase: root.scrolling ? mod(animation-tick(), 10s) : 0ms; + clip: true; + background: transparent; + marquee-label := Text { + x: !root.scrolling || root.phase < 1500ms ? 0px + : root.phase < 4500ms ? -root.travel * ((root.phase - 1500ms) / 3000ms) + : root.phase < 6000ms ? -root.travel + : root.phase < 9000ms ? -root.travel * (1 - ((root.phase - 6000ms) / 3000ms)) + : 0px; + y: 0px; + width: self.preferred-width; + height: root.height; + text: root.label; + color: root.text-color; + font-size: root.text-size; + font-weight: root.text-weight; + vertical-alignment: center; + horizontal-alignment: left; + } +} + +export component LinkText inherits Rectangle { + in property label; + in property base-color: #858b9c; + in property text-size: 11px; + in property text-weight: 400; + callback clicked; + height: 17px; + horizontal-stretch: 1; + background: transparent; + MarqueeText { + x: 0px; y: 0px; width: parent.width; height: parent.height; + label: root.label; + text-color: touch.has-hover ? #f1f2f6 : root.base-color; + text-size: root.text-size; + text-weight: root.text-weight; + } + touch := TouchArea { clicked => root.clicked(); } +} + +export component InlineArtistLink inherits Text { + in property key; + in property base-color: #858b9c; + callback clicked(string); + color: touch.has-hover ? #f1f2f6 : root.base-color; + font-size: 11px; + vertical-alignment: center; + touch := TouchArea { clicked => root.clicked(root.key); } +} + +export component ArtistLinksRow inherits Rectangle { + in property <[ArtistLinkView]> artists; + in property leading-label; + in property row-color: #858b9c; + in property text-size: 11px; + in property start-index: 0; + in property end-index: artists.length; + in property animate-overflow: true; + callback open-artist(string); + height: 18px; + background: transparent; + clip: true; + private property travel: max(0px, links.preferred-width - root.width); + private property phase: root.animate-overflow && root.travel > 1px ? mod(animation-tick(), 10s) : 0ms; + links := HorizontalLayout { + x: !root.animate-overflow || root.travel <= 1px || root.phase < 1500ms ? 0px + : root.phase < 4500ms ? -root.travel * ((root.phase - 1500ms) / 3000ms) + : root.phase < 6000ms ? -root.travel + : root.phase < 9000ms ? -root.travel * (1 - ((root.phase - 6000ms) / 3000ms)) + : 0px; + y: 0px; width: max(root.width, self.preferred-width); height: root.height; + spacing: 0px; alignment: start; + if root.leading-label != "": Text { text: root.leading-label; color: root.row-color; font-size: root.text-size; vertical-alignment: center; } + for artist[index] in root.artists: HorizontalLayout { + visible: index >= root.start-index && index < root.end-index; + spacing: 0px; + if artist.prefix != "": Text { + text: index == root.start-index && artist.prefix == ", " ? "" + : index == root.start-index && artist.prefix == " feat. " ? "feat. " + : artist.prefix; + color: root.row-color; font-size: root.text-size; vertical-alignment: center; + } + InlineArtistLink { + key: artist.key; text: artist.name; base-color: root.row-color; + font-size: root.text-size; clicked(key) => root.open-artist(key); + } + } + } +} + +export component TrackArtistsCell inherits Rectangle { + in property <[ArtistLinkView]> artists; + in property label; + in property line-break; + callback open-artist(string); + clip: true; + background: transparent; + private property use-two-lines: root.line-break > 0 && measure.preferred-width > root.width * 1.85; + measure := Text { visible: false; text: root.label; font-size: 11px; } + if !root.use-two-lines: ArtistLinksRow { + width: parent.width; height: parent.height; + artists: root.artists; + open-artist(key) => root.open-artist(key); + } + if root.use-two-lines: Rectangle { + x: 0px; y: 4px; width: parent.width; height: parent.height - 8px; + background: transparent; clip: true; + ArtistLinksRow { + x: 0px; y: 0px; width: parent.width; height: parent.height / 2; + artists: root.artists; end-index: root.line-break; animate-overflow: false; + open-artist(key) => root.open-artist(key); + } + ArtistLinksRow { + x: 0px; y: parent.height / 2; width: parent.width; height: parent.height / 2; + artists: root.artists; start-index: root.line-break; animate-overflow: false; + open-artist(key) => root.open-artist(key); + } + } +} + +export component StaticArtistList inherits Rectangle { + in property <[ArtistLinkLineView]> lines; + in property heading; + callback open-artist(string); + height: (heading == "" ? 0px : 20px) + lines.length * 19px; + background: transparent; + if root.heading != "": Text { + x: 0px; y: 0px; width: parent.width; height: 18px; + text: root.heading; color: #707687; font-size: 11px; vertical-alignment: center; + } + for line[index] in root.lines: Rectangle { + x: 0px; + y: (root.heading == "" ? 0px : 20px) + index * 19px; + width: parent.width; + height: 19px; + background: transparent; + HorizontalLayout { + spacing: 0px; alignment: start; + for artist in line.artists: HorizontalLayout { + spacing: 0px; + if artist.prefix != "": Text { + text: artist.prefix; color: #858b9c; font-size: 11px; vertical-alignment: center; + } + InlineArtistLink { + key: artist.key; text: artist.name; base-color: #858b9c; + clicked(key) => root.open-artist(key); + } + } + } + } +} + +export component TrackInfoArtists inherits Rectangle { + in property <[ArtistLinkView]> artists; + callback open-artist(string); + height: min(62px, max(28px, artists.length * 20px)); + background: transparent; + Text { x: 0px; width: 112px; height: 28px; text: "Artists"; color: #707687; font-size: 11px; vertical-alignment: center; } + ScrollView { + x: 124px; width: parent.width - 124px; height: parent.height; + horizontal-scrollbar-policy: ScrollBarPolicy.always-off; + vertical-scrollbar-policy: ScrollBarPolicy.always-off; + VerticalLayout { + spacing: 0px; + for artist in root.artists: Rectangle { + height: 20px; background: transparent; + Text { + width: parent.width; height: parent.height; + text: artist.name; + color: artist-touch.has-hover ? #f1f2f6 : #dfe2ea; + font-size: 11px; overflow: elide; vertical-alignment: center; + } + artist-touch := TouchArea { clicked => root.open-artist(artist.key); } + } + } + } +} + +export component VersionRows inherits Rectangle { + in property <[VersionView]> items; + height: ceil(items.length / 2) * 21px; + background: transparent; + for item[index] in items: Rectangle { + x: mod(index, 2) * parent.width / 2; + y: floor(index / 2) * 21px; + width: parent.width / 2 - (mod(index, 2) == 0 ? 8px : 0px); + height: 21px; + background: transparent; + Text { + x: 0px; width: parent.width - 82px; height: parent.height; + text: item.name; color: #8f96a6; font-size: 10px; + overflow: elide; vertical-alignment: center; + } + Text { + x: parent.width - 78px; width: 78px; height: parent.height; + text: "v" + item.version; color: #d7dae3; font-size: 10px; + font-weight: 650; overflow: elide; horizontal-alignment: right; + vertical-alignment: center; + } + } +} + +export component BuildInfoCard inherits Rectangle { + in property <[VersionView]> software; + in property <[VersionView]> protocols; + min-height: 82px + ceil(software.length / 2) * 21px + ceil(protocols.length / 2) * 21px; + max-height: 82px + ceil(software.length / 2) * 21px + ceil(protocols.length / 2) * 21px; + vertical-stretch: 0; + border-radius: 9px; background: #11151d; border-width: 1px; border-color: #2c3240; + VerticalLayout { + padding: 11px; spacing: 5px; + Text { height: 18px; text: "Build and compatibility"; color: #dfe2ea; font-size: 11px; font-weight: 700; vertical-alignment: center; } + Text { height: 14px; text: "SOFTWARE"; color: #697080; font-size: 9px; font-weight: 750; letter-spacing: 0.7px; vertical-alignment: center; } + VersionRows { items: root.software; } + Text { height: 14px; text: "PROTOCOLS"; color: #697080; font-size: 9px; font-weight: 750; letter-spacing: 0.7px; vertical-alignment: center; } + VersionRows { items: root.protocols; } + } +} + +export component AlbumTile inherits Rectangle { + in property item; + in property show-artist: true; + in property show-release-type: false; + callback play(string); + callback open(string); + callback open-artist(string); + private property hovered: touch.has-hover || play-touch.has-hover; + width: 154px; + height: 216px; + border-radius: 10px; + background: root.hovered ? #20242e : #171a22; + touch := TouchArea { clicked => root.open(item.key); } + VerticalLayout { + padding: 11px; + spacing: 9px; + cover := Rectangle { + height: 132px; + border-radius: 7px; + clip: true; + background: #292d38; + Image { source: @image-url("../assets/note.svg"); width: 44px; height: 44px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + if item.federation-state > 0: FederationBadge { partial: item.federation-state == 2; x: parent.width - self.width - 4px; y: 4px; } + Rectangle { + x: 92px; y: 80px; width: 38px; height: 38px; + border-radius: 19px; + background: play-touch.has-hover ? #62e6b4 : #4bd4a1; + opacity: root.hovered ? 1 : 0; + Image { source: @image-url("../assets/play.svg"); width: 18px; height: 18px; x: 10px; y: 10px; } + play-touch := TouchArea { clicked => root.play(item.key); } + } + } + Text { text: item.title; color: #f4f5f8; font-size: 14px; font-weight: 700; overflow: elide; } + if root.show-artist: LinkText { label: item.artist + " · " + item.year; text-size: 12px; clicked => root.open-artist(item.artist-key); } + if !root.show-artist: Text { + height: 17px; + text: item.year + (root.show-release-type && item.release-type != "" ? " · " + item.release-type : ""); + color: #858b9c; font-size: 12px; overflow: elide; vertical-alignment: center; + } + } +} + +export component ArtistTile inherits Rectangle { + in property item; + callback open(string); + width: 154px; + height: 210px; + border-radius: 10px; + background: touch.has-hover ? #20242e : #171a22; + VerticalLayout { + padding: 11px; + spacing: 9px; + Rectangle { + height: 132px; + border-radius: 66px; + clip: true; + background: #292d38; + Image { source: @image-url("../assets/note.svg"); width: 42px; height: 42px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + } + Text { text: item.name; color: #f4f5f8; font-size: 14px; font-weight: 700; overflow: elide; } + Text { text: item.details; color: #858b9c; font-size: 11px; overflow: elide; } + } + touch := TouchArea { clicked => root.open(item.key); } +} + +export component SearchArtistTile inherits Rectangle { + in property item; + callback open(string); + width: 120px; height: 150px; border-radius: 8px; + background: touch.has-hover ? #20242e : #171a22; + VerticalLayout { + padding: 9px; spacing: 7px; + Rectangle { + height: 102px; border-radius: 10px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 32px; height: 32px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + if item.federated: FederationBadge { x: parent.width - self.width - 4px; y: 4px; } + } + Text { text: item.name; color: #f4f5f8; font-size: 12px; font-weight: 700; overflow: elide; } + } + touch := TouchArea { clicked => root.open(item.key); } +} + +export component SearchReleaseTile inherits Rectangle { + in property item; + callback open(string); + width: 120px; height: 150px; border-radius: 8px; + background: touch.has-hover ? #20242e : #171a22; + VerticalLayout { + padding: 9px; spacing: 7px; + Rectangle { + height: 102px; border-radius: 5px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 32px; height: 32px; x: (parent.width - self.width) / 2; y: (parent.height - self.height) / 2; } + if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + if item.federation-state > 0: FederationBadge { partial: item.federation-state == 2; x: parent.width - self.width - 4px; y: 4px; } + } + Text { text: item.title; color: #f4f5f8; font-size: 12px; font-weight: 700; overflow: elide; } + } + touch := TouchArea { clicked => root.open(item.key); } +} + +export component SearchArtistGrid inherits Rectangle { + in property <[ArtistView]> artists; + callback open(string); + property columns: max(1, floor((self.width + 12px) / 132px)); + height: artists.length > 0 ? ceil(artists.length / columns) * 162px - 12px : 0px; + for artist[index] in artists: SearchArtistTile { x: mod(index, root.columns) * 132px; y: floor(index / root.columns) * 162px; item: artist; open(key) => root.open(key); } +} + +export component SearchReleaseGrid inherits Rectangle { + in property <[ReleaseView]> releases; + callback open(string); + property columns: max(1, floor((self.width + 12px) / 132px)); + height: releases.length > 0 ? ceil(releases.length / columns) * 162px - 12px : 0px; + for release[index] in releases: SearchReleaseTile { x: mod(index, root.columns) * 132px; y: floor(index / root.columns) * 162px; item: release; open(key) => root.open(key); } +} + +export component TrackActionButton inherits Rectangle { + in property icon-source; + in property active: false; + callback clicked; + width: 28px; + height: 28px; + border-radius: 6px; + background: root.active ? #255845 : touch.has-hover ? #353a47 : transparent; + Image { source: root.icon-source; width: 16px; height: 16px; x: 6px; y: 6px; } + touch := TouchArea { clicked => root.clicked(); } +} + +export component TrackMenuItem inherits Rectangle { + in property icon-source; + in property label; + callback clicked; + height: 34px; + border-radius: 5px; + background: touch.has-hover ? #303541 : transparent; + HorizontalLayout { + padding-left: 9px; padding-right: 9px; spacing: 9px; + Rectangle { + width: 16px; background: transparent; + Image { source: root.icon-source; width: 16px; height: 16px; y: (parent.height - self.height) / 2; } + } + Text { text: root.label; color: #d9dce5; font-size: 11px; vertical-alignment: center; } + } + touch := TouchArea { clicked => root.clicked(); } +} + +export component InfoField inherits Rectangle { + in property label; + in property value; + height: 28px; + background: transparent; + HorizontalLayout { + spacing: 12px; + Text { width: 112px; text: root.label; color: #707687; font-size: 11px; vertical-alignment: center; } + Text { horizontal-stretch: 1; text: root.value == "" ? "—" : root.value; color: #dfe2ea; font-size: 11px; overflow: elide; vertical-alignment: center; } + } +} + +export component TrackRow inherits Rectangle { + in property item; + in property show-artwork: false; + callback play(string); + callback action(string, string); + callback open-artist(string); + callback open-release(string); + height: 48px; + border-radius: 6px; + background: item.active ? #282d3a : touch.has-hover ? #20242e : transparent; + touch := TouchArea { double-clicked => root.play(item.key); } + HorizontalLayout { + padding-left: 12px; + padding-right: 12px; + spacing: 12px; + Text { text: item.number; color: #777d8d; width: 24px; vertical-alignment: center; horizontal-alignment: center; } + if root.show-artwork: Rectangle { + width: 34px; height: 34px; border-radius: 4px; background: #292d38; clip: true; + Image { source: @image-url("../assets/note.svg"); width: 18px; height: 18px; x: 8px; y: 8px; } + if item.has-artwork: Image { source: item.artwork; image-fit: ImageFit.cover; width: parent.width; height: parent.height; } + } + Rectangle { + horizontal-stretch: 1; + height: parent.height; + background: transparent; + clip: true; + Rectangle { + x: 0px; width: parent.width * 0.40; height: parent.height; background: transparent; clip: true; + Text { + x: 0px; y: 0px; + // Keep identical text geometry for local and federated + // rows. The badge is an overlay at the trailing edge. + width: parent.width - 34px; height: parent.height; + text: item.title; + color: item.active ? #55dbaa : #f1f2f6; + font-size: 13px; font-weight: 600; overflow: elide; + horizontal-alignment: left; + vertical-alignment: center; + } + if item.federated: FederationBadge { + x: parent.width - self.width - 8px; + y: (parent.height - self.height) / 2; + } + } + Rectangle { + x: parent.width * 0.40; width: parent.width * 0.30; height: parent.height; background: transparent; clip: true; + TrackArtistsCell { + x: 0px; y: 0px; width: parent.width - 12px; height: parent.height; + artists: item.artists; label: item.artists-label; + line-break: item.artist-line-break; + open-artist(key) => root.open-artist(key); + } + } + Rectangle { + x: parent.width * 0.70; width: parent.width * 0.30; height: parent.height; background: transparent; clip: true; + LinkText { x: 0px; y: 0px; width: parent.width - 8px; height: parent.height; label: item.release; base-color: #949aaa; text-size: 12px; clicked => root.open-release(item.release-key); } + } + } + Text { text: item.duration; color: #949aaa; width: 46px; font-size: 12px; horizontal-alignment: right; vertical-alignment: center; } + Rectangle { + width: 124px; + background: transparent; + TrackActionButton { x: 0px; y: (parent.height - self.height) / 2; active: root.item.liked; icon-source: @image-url("../assets/heart.svg"); clicked => root.action("like", root.item.key); } + TrackActionButton { x: 32px; y: (parent.height - self.height) / 2; icon-source: @image-url("../assets/play-next.svg"); clicked => root.action("play-next", root.item.key); } + TrackActionButton { x: 64px; y: (parent.height - self.height) / 2; icon-source: @image-url("../assets/add-end.svg"); clicked => root.action("add-end", root.item.key); } + TrackActionButton { x: 96px; y: (parent.height - self.height) / 2; icon-source: @image-url("../assets/more.svg"); clicked => { menu.show(); } } + } + } + menu := PopupWindow { + x: root.width - self.width - 8px; + y: 42px; + width: 184px; + height: 118px; + close-policy: close-on-click-outside; + Rectangle { + border-radius: 8px; + background: #222631; + border-color: #3a3f4d; + border-width: 1px; + drop-shadow-color: #00000080; + drop-shadow-blur: 14px; + drop-shadow-offset-y: 4px; + VerticalLayout { + padding: 6px; spacing: 1px; + TrackMenuItem { icon-source: @image-url("../assets/info.svg"); label: "Track information"; clicked => { menu.close(); root.action("information", root.item.key); } } + TrackMenuItem { icon-source: @image-url("../assets/share.svg"); label: "Share"; clicked => { menu.close(); root.action("share", root.item.key); } } + TrackMenuItem { icon-source: @image-url("../assets/playlist-add.svg"); label: "Add to playlist"; clicked => { menu.close(); root.action("playlist", root.item.key); } } + } + } + } +} + +export component TrackList inherits Rectangle { + in property <[TrackView]> tracks; + in property show-artwork: false; + callback play(string); + callback action(string, string); + callback open-artist(string); + callback open-release(string); + property content-height: tracks.length > 0 ? tracks.length * 50px - 2px : 0px; + min-height: content-height; + preferred-height: content-height; + max-height: content-height; + vertical-stretch: 0; + background: transparent; + for track[index] in tracks: TrackRow { + x: 0px; y: index * 50px; width: root.width; + item: track; + show-artwork: root.show-artwork; + play(key) => root.play(key); + action(action, key) => root.action(action, key); + open-artist(key) => root.open-artist(key); + open-release(key) => root.open-release(key); + } +} + +export component AlbumGrid inherits Rectangle { + in property <[ReleaseView]> releases; + in property show-artists: true; + in property show-release-types: false; + callback play(string); + callback open(string); + callback open-artist(string); + property fitting-column-count: max(1, floor((self.width + 13px) / 167px)); + property column-count: releases.length > 0 && releases.length < fitting-column-count ? releases.length : fitting-column-count; + property column-gap: column-count > 1 ? min(25px, max(13px, (self.width - column-count * 154px) / (column-count - 1))) : 0px; + height: releases.length > 0 ? ceil(releases.length / column-count) * 229px - 13px : 0px; + background: transparent; + + for release[index] in releases: AlbumTile { + x: mod(index, root.column-count) * (154px + root.column-gap); + y: floor(index / root.column-count) * 229px; + item: release; + show-artist: root.show-artists; + show-release-type: root.show-release-types; + play(key) => root.play(key); + open(key) => root.open(key); + open-artist(key) => root.open-artist(key); + } +} + +export component ArtistGrid inherits Rectangle { + in property <[ArtistView]> artists; + callback open(string); + property fitting-column-count: max(1, floor((self.width + 13px) / 167px)); + property column-count: artists.length > 0 && artists.length < fitting-column-count ? artists.length : fitting-column-count; + property column-gap: column-count > 1 ? min(25px, max(13px, (self.width - column-count * 154px) / (column-count - 1))) : 0px; + height: artists.length > 0 ? ceil(artists.length / column-count) * 223px - 13px : 0px; + background: transparent; + for artist[index] in artists: ArtistTile { + x: mod(index, root.column-count) * (154px + root.column-gap); + y: floor(index / root.column-count) * 223px; + item: artist; + open(key) => root.open(key); + } +} diff --git a/crates/ui/ui/models.slint b/crates/ui/ui/models.slint new file mode 100644 index 0000000..7800fe7 --- /dev/null +++ b/crates/ui/ui/models.slint @@ -0,0 +1,90 @@ +export struct ReleaseView { + key: string, + title: string, + artist: string, + artist-key: string, + year: string, + release-type: string, + artwork: image, + has-artwork: bool, + federation-state: int, +} + +export struct BreadcrumbView { label: string, target: string } + +export struct ArtistView { + key: string, + name: string, + details: string, + artwork: image, + has-artwork: bool, + federated: bool, +} + +export struct ArtistLinkView { + key: string, + name: string, + prefix: string, +} + +export struct ArtistLinkLineView { + artists: [ArtistLinkView], +} + +export struct VersionView { + name: string, + version: string, +} + +export struct TrackView { + key: string, + number: string, + title: string, + artists: [ArtistLinkView], + artists-label: string, + artist-line-break: int, + release: string, + release-key: string, + duration: string, + active: bool, + artwork: image, + has-artwork: bool, + federated: bool, + liked: bool, +} + +export struct QueueView { + key: string, + title: string, + artist: string, + artist-key: string, + release: string, + release-key: string, + active: bool, + artwork: image, + has-artwork: bool, +} + +export struct PlaylistView { + id: string, + title: string, + details: string, + is-likes: bool, +} + +export struct DeviceView { + id: string, + name: string, + details: string, + is-self: bool, + online: bool, + active: bool, + revoked: bool, +} + +export struct PairingView { + request-id: string, + name: string, + details: string, + group-conflict: bool, +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..efab296 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +[toolchain] +channel = "1.97.0" +profile = "minimal" +components = ["clippy", "rustfmt"] + diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..3380770 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,2 @@ +edition = "2024" + diff --git a/screenshots/furumi-desktop.png b/screenshots/furumi-desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2e0dad01e7838c558403d6c9ec217100ec2ba0 GIT binary patch literal 1035986 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

UBg%e?enkTA(W5pW%e(sxD7o3l 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%0Aw_keE>f3y8@mP6Qre~Uyb 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 z z!ZG!Z>OlN8CKqNhNJ!TA9*k4b>}u#gD?g(P|MhXR+u!tj^Aq>#viD^QXTX^JArXjJ z83oo#St(4TF}+vevGLYH3xAl6_07*4l$<(^Q#&9t&f_Mu zx#BRvJkZ&$Hv(t26YErnk`NP8>Vb&|9*D`eeeB9T84h6OEWPYX2m%IRF5WS*W8hgB)?$y0o4h7CJgnOz1TC4M{tH$N1w3v8A z@YCW|j%;RT8#6UV*MjG@3dm&gm9w|NOeU=dTEC5lQU{OW=?46c$VQwkcP zaqAlIIhh+LBA56~*rAGL4Sa5!Tahv_N^Wk4N9Q^_xT#Uq6ldiW_B2K&Su7%x7p|wG zQTto?iVzXuY2pclDWFhMDbR-dbNNPk{r*b>T@K9k5!1}fa+S1fSk)rqTfn&Gu zvr;nO6uJt`(a#=OGd{hIp&hf9OdseEqcvDk%pwZK0C1vqH!ySJ&{LSl<|BkpXf2*- zdKwf=I^{x4Rm+Pi24b?Sd@eS%P8KQ}Tu`x6CUbuEsJwrRbd zJcq&%0I@!A`n{ZQcJ!kn&rCX)2jmyNS~t*Ozz8N4v7yp&EUXsC5Zmvc5S;gql$RD4 zttHbeV*S)YQ?}jBr(~rk)xf8?O0r!(GcYsnbCL#ZGYkU$D(ottjD+BiYit}xp10%i zU;f)E!ROhs0Lcdy;d9#dJzeoj{4p=&RC@SnPjpub;uey_fx8`OJ2d$o_^A{Ur!7v6 zjq7Dk#!Y|jp?H3>o49P)mrK`0pVY>CJw+1!Gz2#+4%r%91p_QwN%ylU$b=b*#6{U} zA4NVL>b?Vs=vkDRO~;cf8$Lh1J>1TxFS_41x7D2UvO^3&gU4cjGPQ(rH2j1#4CCxP zTh3B5)^)F#-@3}KIo`&u>3{Q33ooMczaOY8DzMT~wTcIr5_-;n%VGjH#jY8Ksf6J` z>=f*GQOt)#hs&Vz?Zdom8`D@t0VJ2OBjton_j#e0Bo20UCy!)h2J>bmX>dK;!1&b+ zPZ1G}Q;{}_({z1IN?hsPlreo0?^=E_)xA#m;ss`3YE%B5*6N=mfM(%UpdO1hjlk-u znpPZ8OlF)b^IO5RS^IZq^d$D9*O0j+CdNnFVF#!9vZ_Oe*|D=UIv^H4A#Q`3^MpwB zW&Nn1&Nx!0J#rtpTj{wDw*UWK-r{A#QJX|%6T-W~xR|ge98Tk%Ge=}OxzhSS5?&LeHW341vUSW8Sz6^btXXCi4 zeY$_WeBxclXvymp7LDX?8m?vFh3SLjN_P zvy!5!Vh~pEi}DPSTXX*I1;bMWE;7H*AUr+lnZkMa zybLwUqUz;#06jJp#9!*OC2X9371z19g2PIVI(k)8urrHxV68Mb(PzO{7S+2q^;?V4 zdHzn)FDN$UHe5`ln@vmP7nN&9w5pD4plRS{*B$l#Z7e}IbTdBBa}LBO(_S||ypRlW zz_jQzS#y?LR@NmoQIGIVw_y|LSCAAP1qoJcU`q1X6A@+0>fv#v_}=8Is@55YaLNRO z{YAe(2?CyJ0>XLn`VhkSWiGUJZT_(PXZN`;{`FO3tvsH<&hpMGbMquN z!oO(H?JVF&^yt>w*ht?9s&vy(J+{Z~f8ldIh@m(1@Iw{cSMfI#won{v6UTlVNn>O8 zlX_^L{#5O=r36IJIPEY(ONjgEUur<|fA%JOFP3Q}t?#04GNgHd>O_|0G)=SJ_T<;= zJ(4>g_I(^VF^uRmrx+kMy>ttW69>vjqYucpb#9BOt`#$24Bvu zu;QM7R5_2qD8^I8V%HfZrOj=Jv=#d1!Ha-Tk(kPZkQmBx)hI8w)YU5Q)OvKL?Mw;A z%*>C9N33bm^4;%b!`CSCUB-H{h&6>eK~7RROw3m|Fz0~)2EQJFQkcqw(BVZeDK~ew ztGIRZ+HZ+JsuFDxZADg2r0GEQd2>cv_61IRIw4j{&WSQyaoJ3W7M-po3Q;J!ZLbx3 z%IK8?YCJkLV)&OJ0m|J-3=nd7aYeJe!%e2~m*+dp)J$$#qvzN*uvo6Fl}@)2xE@*s zBN$=c4uXcJOP(Gw4Dka11OVbfzm%AV6V0O|Tqbsn5|oaW6OH1qP{;nzOKMbr8oMY& zL{rDtFf{>{Ms%b0K>NghlFmQy6T8T@16-sHIg%f-Db>0xruCSk5yNd7E2Cb<3%!D5 zGf=bE4zrsCVb1z=7lM`DQ~@E5WL3k?DZ$-$mWn$W-xm#TsCKwPVL314&oB@*_epj3 z;_#ny{~rf03^wW+x1^QE>^6zgTmG?5mI67%2K~%At?rgyo&_-s{EatPJQz+V3F992 z;Dp?Pg>E1-LYLMW6FfT6#ELa{&F(S9Cs*k2j z>`iINTV04sR_4G=^v(JgIAf^JLdR{QDTujHi5K%_yr1*yvR1I0uv>|EPFmN8TCA+=v*-gmb^-l;4tQe?Es}-P-@L-(Ji3NDLtB@%!ZpPl} z$nb+`DRXpjS+6r5-#BLCR=tFYQ0A+Y23kP6a)Cp8QiDsrsOMA*=y)wl3NM#ORVmKu zbklG%5OLrYS1r0e&M`NlcAdZ0=%lc7|MG|@CAHS7#4>gUT9yw3EmY&!WKMt2pR!y$ zR|r1*aFDVFd`1`dh|2X$au`+K)ipFWv9DbgICmXa;ks^y5ZB_QhDXqhsIfdv$_#oQ zwN@P!ukO6_i8HhxuxwIFPhMVI3UHoCMG^iAjiGT5tyJH%&VHqQjwfha_kP&7dRkj@ zvAW(e^!<}B6LtUYFv>rdXCdGqe=lO5b=|Trqghuln&tX{%;Ubtga}JsPHJ%5Gv$)8 z>v4IF6d@RjG#F;^f+YESJ=GTKRv zzqIJ9-+}MxeaRat5|w`F1MB>|vy+0*a7DMx#FO`m#Uy>C^T|og8-3<(w%HDf#oEqG z&PP4tdu(U-u^^B0OG)SbmCSz%IQzDCNhk9EUHuS{MTa!PZxrQXmmL-38cEd+j&Bl@ zDoPsoO#yVgxs=@sRHC(*X6;nA>aO3oB48^W z&|t3c1ft>-KO^2KD^*v8=U>wrH>}eHu%lk70c^QSB>`x4xBkUNLF;t4vDUo?d%Yc_#8mKp=ZTyS{x`{?kS!Ccv` zQqpyNlkQXcHKT4t&9mwM!4CKG0F1jq#h(9XJ9AV-vC?qi9sdpnRfBr9foTyzKnra$ zG^iNPxb!m#b9?#v1>pjRvG_cHRG5e4(4# zm#3;Gca_Bh92jY&XtvW&h$ts1Cm^Y44MPb&es-%!z{jb3BnPkRudp-Q4esJ|1uTi+ zVE>VF`#hHMmSD;(*Ri1?3d{AU=E~}3qz`lPL~Q2oY}EsM*nd~6%Eq_UNhdWYlv^RvRe(AJVK4W7X3!9Bje( zyzF}S_P;80O3_Lo43Z=S_^mLlh?Ss7Tr0HWEVAjh=jRU7P=g7T%1tBG6Jm1(R+q+R zO=Ias1cROE(WYq2L{uM$5UeKer%&T=S#0==PrG7MQBP7M>q~nY>9%+@qtxPyn*|&^ zjs_b^MPmBnzl;s+Cw$E)g4g3e1lfarHrRbYwVyB1vnP$NPI>WE(r8TG3$39Bd3=Ua zfbNToWZ;BsB`k8r^4z1e3gwQ=W+aA<_24fc7d)U8{zDtP{orCUeLl?g(vZNO{v0!= z9Ndyku#l@J19Eu7fQT;(hZ}~a9IaX05`nshw9*6h220XUxffdEzM}SEmv)B%nno2x zoz9noaWkT+Q9Ge7c~m{Gr*SWlid&LZ=8qX*Tih5wKZ`}KU^ktYSJl^LlW)#6&4UUW zf_9XkFKcji0fppsy~53CBq;i#QNL%Ww##}vI(imU>f*`|3RJJd2@U!CpR|l<`Reks zv%vN+p%0#0)!Heuyd#=^S)FR3x+z*~IvLUL9h<1*&aBz6lIYvHB=As9kKX%=>@jKX z9L^!FN(-}^++N~h|B|c+hgHe}{wZ}oyF(+~eEO8h$;Ysu6xc;Nc9pVNFAO1H7BnKx}8=I_yBP>o(&*D$zj&XsR3r`-#CzvtEUMT<> z1OdTSrFdp)uFlMUfoxmRFfI-uhYlN|E?&714{d;G$jfBdC{zFVis9C5$xI)lx5jII?l}L5r%R)svu60AYWF{IXhMSAT80r`efm*-; z8No>Y1$J^TfYeW^bQOYE78$+2`P55d&y_ZLUMFi|29-fL?>?zO8w8uCB*Bi#j!Nd< zTa}E8X`${P9+uDl`DY;&U>e=?WQ0Su#KuVwJj{2v^KG|vH-{Jd!vA%TQjM*$d^}Tr zS|LSRSCsu}0%}vQ_qnhBV)GPQ;{)gkZ;o-20N5hll^v@|9G5`@6Qrf3uiOZ*P8zy) z-uv(QB4!pxjB;k!Xh3|RJ9kwRC{I|z*a@*xR$YV8Soyh76=h-RuBzR6-m*4#{M|K4 zUv#-#w=^X6&{po1QYH5A>dJX@A>PT zUYFA!ME8dmO-2{l+Ee5nkjr923tkda7Mg2Dy6^9#PYb9nYfDzwtIgSNiDna<7u9gz zBlMBwXRC$lVb8mNfkA$kxE?{4rv-OUQrg=`MNI;3gyw6Gh@(LceI98}tMR>=eYNwy z>Sq4(wzV8U^nB?8Ng45|K#M(0f4#_BrqIJ)bw5&gm>hDy*}mb*xY%74WAzzd$i#1w zP}U?*UrO>=ZH6_fM3B?-b6LANCR}CZbB+W3m6J5(Pgi59^SPj?n*6s1v4J%dLz6PV zl_)zBk;J;Z_6HgeV0Hk=a_ASagO?>*ya9>!zh970gyze2uA%x$bWZ z^AS>cm}oPJ5-WhblYcTK`yK?Vqg*u1&4s-Vu^u|Kj};XBCNSkYY8X0l6IB_qZzk?)~7u4^9=$C5T{Sjg*ylt-$ak=aU;0l6W zh|+OxL8UTjz}$Bg|ET${icM};uR~hhTAu5UOrn4aE3bQLh5P6pSt}!3^S&XB;n0xI zhS3|6Z^_`|gN75z!o`?_q7~RQaKI_ zOG^6Sf*iYTB-qKoVy9ZaCnW29tE%%$r+dvP;X0(D8BHZP>qz7qT7l$72`R{KiR%7x z!Hi+ZFhCHJF_N!o{=(u~KAo?p5cJ#`)`ldcGoLX!-EayeW%TTAg>>CeY1Zq_e{f|7 z{=ejN5XNWx|EB1KPmD8ph}Wfw4{)lDD#DE=UOXK2(YO2q4A;62&?R zBl!t2l5sMQ#%Zpx^et43@K4&m>qv?J9Np4F1{pl|ZbdKVvpv^9T5AqzKP8gsdX$~| zPjvl?fPRo^V<9y`e3+UV8XFGUB2ZwZ?nCF?e8c_8ILcm`s(g*qOe#6$B!P=rQRf<+ z=WR7nRf{g#)hJE5ZQMo95C>=NzPeyNs1@{WBH7Bi*~+rVPDmicw$MCf-a%8QsH{A= z7T+{X=rKUh^7Zp=>-lRo>tl<5ZQ8qO^Ysu$gD;f+dN#AUuJQLb ze4_AZT?QAq^mZt(>^|3NV!*0{CiGr-x^^Fi<2}z8;!K={ux{(5k ziA0aVF6?=up4vBU@8a#l!avS^J7&7b%j64x7%CoL-6~T8K7!RK9bx1O-rSHj}RWx5(ctmTr_CU(Wg@T>__SC zDa{&s^*Ax_->)(vYRN8R@n3-_(G zI!9@^RaR#F_}Cks`O-Pv7VfY+*jt7o!`-{+bl}X6MsAhf#`vS=&*_^tjDnx=iGZ%; z(Qd{$}GLsu0!o>NYw(va{rLmW?tX51Z$s1ViFwWL%bW>!T;K`Av~*k@3ji$FcJ`zcabR zp68ixe+TRph@XD8Wb%7R%iwh!15daM|!VB_kA3PUqQ{#o}wlQ+RkUwhtU1o0rjQ}VdH@6kfmwZ2anP1=dQ`ubB7K?L7i1!SUAF9R=t3C=zuIR#Jn*q{TT44N zF7%4^e}q5*TN|NcbQCnlk!8wPz}08R4fijIBm9H_pt(yKzzKAF-`oeojC3|aR%kC| z!ZHZtUS9Bm1e8-?yu-r$2(l^ir~Fe08sKa2dspcX?=0g*u50S3>{Ez@u2Wf)uUYL0E~t_gVRDlSa!$6;)$B&uc+q!BPzTc zkW=%jx(;+x{_U%l?Nr&L*;vVqlfEYR#$B9e_*%uyUF^MBq@c3AwA6++Q&#T07>t`w zK>scY#_f4D-))A(|L)88c7b%kGtE2xGxB;B<_*T8_ZwcJ7RTo_Nv`jadKgzRpZ9h5 zGsW8>BdSLzB~!#9BWRJT~(MwYhMGaoy>2?38T4^{R8HIG+bxGl2J&(|ooiK(BILwPURyO9X zZxnSwACu^FzT7gWk3?9S>p=6R{=;{%`VzmaOZta7+W&>DcvXL> zzN2D|y?Gg^5DhAM3shbzzBs8RXg(q{>#izXN?Sj-T7E(z3u(~sy*t8zR*dU)DBWhu`&=rOG z5SONG!fYsDq7SDN;6S_7V~sns(2A2C2(Qz&j5d4w45-0|W1th^e%79STYe-bQSwjI znEkydXo;jiVsd;MgvKjzK=KtEWY2QTl}Wj!rm+_<^w3khNY@vH45m?fuJ$zlj9x7I zDL7o3S&683`?by+eG~SIYd_RdsFzXv%J5puQhf3-le!<1_v7QU#`uVWDJ?B!8pl*y zp*nqhN(SAI$PwQ9e!>iXN_E&l;yub7k>_CAP_0oO{ICMJV`V+6sNn^yR$bYdyJnX? zDVCKSqx4fS8Ly(RYJ*b2DQ%cnb$j%~G+qpT4V|`mW2E%bYAaN`*1%AZj6CLMc-K9A zNfI64d};eAs`GiO+_%{I+f5w( ze)x@esxVljcZ{UcxRDY)nPxJ4ExA`3SQ=%{k=2J5mMmb16W@27=PI8G*HD_kj>4U9 z782G`XdZEiwY13L6i($+SIg7i9wZu=@+3@s<{qi_$f~opvqraL1MeRO(1&fgi&A2( zt+8?=l^xyBc2}TrvO@kAgQo0uBDqoltt3}A$P7;bE|@>Xvjv-XHkK?b4A%UGU>>Et zP`wX95yE(!>uUzi2uz?|R6_f%<^gek%=-xHbc+QNf7g(OSnzt@u+n|mJHE(;zH;a( zzEVBz&vW|y_6mo#cnlh72Ay`+eg?av+-8(GG$ew_Rz9-xJwTbyuSMUnx(fD}23U=I zY1CPCRFnqzo8f7@fUfWfT*+c1chP6Rrf}idp z0%^ix_v?aNCoPFUbxpwXvVC>;-67+eAkvnN?pLtQdUN-^HYRoq7{twN4{>AFwaX;r zWOrK|PWy3{^pj+^*Thx#F-3$2R$r>({3lctj8eM%fNDLWl+R%cPecakKWmZM*k~G@ zVPpD@^$V7EuhGAR%14NlmNM7z@mvQ@EN^$1*)`CBzuo^XvsYZQyhai6f5PhSzfk%u zC!c2l_XxRM{_yv~-=B6BCE!y`9{I^jos7K7=aoxvCS&Xt$0@Mn!<$)4p(rm7q>=kB zg$OBV9C2)Wk7x1PZR{aLHr3@0S-0LZc-#hp=D9gv)<8#jnq{8bkZfAc5_q2IuWxq} zdYR5iG-w`RS38agV)cxRzx}(zwNZoAyT5)%>b5Cw!@?vLZGB2gZOPX;*`&OE& zYs9a3$w9*>Qm2Gy^0n3E-EQvS-|1vD=N_Coe8NTo8pqWb?UmY^R^8XSd zDx7Q1qtX_{+JT)g+TLdV>y2B90_ce28zA-d*yA{Lr!vMkT+K^ZOkb+3-TplE`NQvd zHT<+8>%FI-O`G;v$N$YSyla9Vu804%a$cy4(Qx|AshMAIl2%-Is+NvL4&}4tmvby) zc3-SC;?Wcak?9|>k};y8423YK+q^u-#xpcMS}Sy#t_9@NLoth+R7cOM-IfP?YzmYK z=}9iGQj2PxpL)fB3t^w=e$tmDo*iXp|A4wwupCJ4*MEH%Sio+q7(?1k%?&?0TbgI`7_O*# z-N_<)l}5`(gzIhneIbbBAm|#t9a}NYF0C)LnU0xyU3X#dDO98luV}9;hwNHuOa13(nqO*? zN_N7|G%U(&8k5LrE4or07kqn8#|qhJ=B-vIs60i=jz;wrq~j5Ctk_6X>bCYh=%YWX ztJ;Q=npjsin{8@e+y3x4HegV8@ZBhnS$7{Y6njKQ?}mIM9E0LuVHL}PT;*(uCtIa- zU-5CZG|FIp-hB}puhAf&n51@qeEfKI__&Yi?sxc~=9i*y{xeV^>3_!L4`ewTln?vE z6vUN-(J3;VhfHE-Y#b8`&=x}Ox@z&&V8wEqhf7n|XrKaAB=B6ikjgqI%fb^Y{Vhqe z-KnVR&zJRhrEzk=yOcIXXReSeU^#V#$Yo0t5R6k0(=Pq>TK*Ipyvex%V~!h|tfWAt zTab|J)HPQO&$6JnP{okMVZ=ocaW^6CRZtChi4>Dd>Zx#V$hRAh*&F(6&%w(57eFic zZPu_MRkY7Bwud!@0NZzlC1{2M9MV!wD0O!*{W*axdz8Dr?g@u!pp&Vaht_3TicJ)3mW^wtu2R~x`oD_A2Q|46g$G08jOM<>IWt8v!1nHh zBmM-N+_fwK>}PKp5v5AAsZCji;}j>NzTCD;#d=fszcwqk*ZM22uL08N)u+yDwQJYx zkDJKs6&shzM!L3<{^l*~>8=;>b837cuD(>58#N12lE0{UhB)}CHGDkYCeVa#8EoZa ze{3zwsA_e2xfLTiUC@UUDS;fiWRR5DN@%Hcp`|_Uw^PC3P5M7#Q2SB>^TcV|A1V1|q6n~yP--TPq8$xcwvaI4=EqPQ52|75@=EK0_Pn}fpMlwyS@!!)zFLeAn&Uq~F& z2J6;i-g}ug-eJ~Y1u3PwVEud|Mfl}$?-*a3#<5av3P6p@WAHoqJ=k#Z%sAxdSS?=- zwAk_t_UXS7{f;|NBvvO!&nr>8q&iizjoBVC3H6FM_)JozIg5FC zBb%>c+bkp@$qE_sPHrTa=Aq}Y*v5)GPsYt+w%6j1fQA@F4-p{HrSNu3a!e^OW*0oySlV0BAomM6@5pGE6Od%5&w3c zuvT#0%*GYsHyJEauV-$G3td7WH`)sr;{yOm5eX3R1h|Ba7YA79zAP7mmT01ZO-+YQ zb|2a*irdDgXHb$!^+`*{BU)fg>DVUHxV8PzE=&z2iG#L!f!PVO)jjvQI5TbejiX8I z%XOZ{75SyTQ7j@Y1CYu}vGhdvrFxm;OcbsO4y(7!v?zEawrz1E2M|;0s3#JjHXVjY zM~ig{T&%2`t9@wo>`}R0P$?}*0jNG0b2s|RX7ztkk~;=eJG@A%lw}SmSZ7>*Bd_3MwLHC&&r8Kqx;}kNq(oxv=;-MoFt!pyI$u z(Sm{b9C)HS%$FHKuZ($`>#Q>ggCQprR_nX?%b+duA^cH+->=L# z)2bo#LVn?UiGOn`5D+}`vstY%|!T)HI(@fDzM!v zMi~N8L&GjZWmE>dNs_?q#I2xT$IJ;OXurlGNmNzpd`QQ3IOWwO^hpnAlFt)?X$_nb zF(y)=ZZsT7BiqsAA-5c+$H4(PX{BuG8w^v9a0EYN-el8HW|Es|>l;n52gG)lF}`^{kJWq-`qQILmmX*UyKP-XJc4P% zIX{Cf+)caWkt$Rmu1(wO8B@SA(RwrT;er|85+G((2Itt*afQNGDqW9Im@9fnAjx0> zA8KRaiE*vYB<#3LK$Gil(#$U%*GFTIi}>tXyPq~^S|%JDw&k5SSCUWj;Dl?*!)o95 zoR+raETXMjr$3)~g6YDli~&=M7wK4#1=2BR^%;-3!F+*8m)oY#o6jwsNI5h!$%7#a zsTHCpM1!FMrqqXE3kAtJ)i5PxdecK_vni`m6HAq$tK*!{NlbUcv85=~cs9Q(o_uPe zAL;)n`^ur(|NYL^qT-P@hn1brfL{zBs?opkv%DfW%swfvsAbr>YgxV-HpT$UG~Z9r z%lSC%amn-e^69Sq?IO}j^YUeu^eVNX$26SqQwxqsHicS6Mc!&Wb-Vn^eI=<SzULj)v)UM^ZVMqr{wnNO)tAaeu zt`(LeJolIEuWF?RsNDbP(b@%vDumIdcXeM7wcVo9Pyen<#jR!#ewy$LD!?=48&0;tHW_YPI$=ou%Cun!_2AJpVH45!>O*vyD|kKAfy%uXBMGxN*k4=IedQoxFg|nEh9mL!A>khF50v z(fU~Rc3H3c61S*Caf$nNSzS2-QCezYi-`ETdgv&(EnrkR#|u7|g>zDG3JQfi&Qw;x zpZP7#m%t%^j@0h>^Lbpf9(xDOm)2n}u4~l&sMt%@8g1)KsL$FLwSw`=`}c%#jO9`H z22q+st47KGeQ;ghzdwG->wxNs_i0Qf);zQoFH{Ct7X>Q#CRE!VHB5rAtSqgn?+->? zJ99eEtk0ce9G2kxR*PZ&=5IHY0@4!vZ8zZF9-Y^|P%q0YRdfuL@BJu-swm>MBK2>q zFy=*tVW+Mew&6D~L~_msD(M(M9$IKSejCG92WMvW@c*mw$Uw6VGV9U3d=95O zgda=+WYi@Nyji2!D*w%d5EVYm>&__=i~R=BPPT@HtcWnv9<66lGiBj=I*EB@z5Epp zpw+L7U0{!VbXr<&#`QzWMHvOrt_xyD{KtVOXdF0k!}@UffqAiPBA$eqxpg5f`S*K; zK1L!goeBJ9xwiTVJurD*!Woq9in#Jkc$~h+L__G_rLl z1-6R(8>TxSlGO@FFO*=)rDdC40#w-y5*j$95b|whyc+m19M5z}`g7c~rf%5gJh$#k zI(=uFIW3IK*pMmZ!V&oH|LonU<%lAi5(YUvT=moJ#_kR;dz+mrsd7x4(4N>VLS8>M ziotw*2DymLd5LQt?DjU)}Fie5PF2k8kjBI$+es-pxKbv=Wi_ zs(OEzw;vWcJ!N;jB6xV6Bl0Zr1HWc^{-yKJ$9}O^Q|Dk4t#%oz^OVkAgXwi52|lFY zueSEroj_ia8aw9|&i+C0e>m}#206xsC`44RfQoEDjkKQc6)s-wS{V)pdESX+52woS zWcTdj7msz_dUTF0t5&lig3e1sk9&VBb|z*Me$QREx60~w;$_5@V*;NEo!8Om%D07I z7e^;TY2y`<_8rPb^Gtx%XYUu%_UEg&3ZI#kqj4^G%j+o%lS=){$)Hb7x7G;uf7SJC03=Bp%U56qZ@;C0#?Z$aO=r7_qQ&J_B}Fz|&vy}iq6#O{=}bG6Si_@+(AwM=cV!Zq&HDb4@bGJw zn$}>RYWmwRZ#FAYo9&z2C+em;^@D-`2hBh-zYmUi8UggLC+c_I9rxSXdmmxq0Q?}E zC~8odva;y*nqaak$XUPvoXoM%aomBTtS!t!r*jL0O#*;Uk@s1kZi%@pU0*Dr$F6`? zF4V0yyUJINUJ@niOAQSMVFV%r9FDJb~xvArfe4H2|)I3C4s@ z&%XrMXbYNv6BxT3df}6T>q~v=3}7`pDyR4)Z6)bj_J^p9BeEknCc<{1+u}GkgN*>k zLD7YFl3VVzx{eig{PpK;`0zfQ%yAZ^FJBfu z1vD=eAkf;e((ZcbF?;G$U$7-a!PcfrwsPeP>+Ly3)NbIYs=Afzh1=fV0UyX3#bZ97 z!#QWnnwnazzP`peCFsN;Ys$0Vd)5vC%+}&qE60nz{ysOSssVr%9sJ&|_ps-Ysg8M_ zLI)Wh9!2+9Vr@&?aE6+|W~HqNn3H6Iup$ml82`k2Lj(J9NIJpuA7`gb)P|<|N%h}v z$ByhnHX5>yjy~&JxyAAFkwe?aUa{TjHwiLl44gWN{&ENV{bD1e-Hn|qth>A0(qyiw zB!zT&Wi1=mkHP!ef``mWL@y5l1gF=oKnJUI4kZ)gI71yd%vJ~=I6W##a7ZmSMLlyQ z&ceOc(%40maRX+#a@)A}9;;(*etXCBteyRV-EiSg9e)R&0vAL94**{fnS3Qr0Z#!> zfyG4uMX9Dy=F3U%rRduTO1*Ro37gtGL#c}dawY*`Gl01QWK}_)yG{?|y!>Y+bWRZA zs?WimxJrvg#H;F~&?wb1ABZTh7T!je361B1Gf|; zDUuRe9pH-csMOKg<4PqV!IXWuT)Jt-K}CxpQ0iI%u-u9>^gDw+0lLCp6$QL$?P@!C z_&6T?qbO@!Pn$X?MN#RWoG{5v3iM4tqf8b9i)h0?DX-dVqzo`%jOgCHQ)o3B0pJ3T z*_(xH75gkOSt+V&t1B#dO_P0MDNM)C4?@ zQmVAj@RTnLn*suV6^VQMmRs##{>dL-aMbV2yH+Hu09i%V3Pja2wW+Defv5ss^<6JT z;R@W9k>J>|V|MVsLDC|#zZzrE`l6RWU>Rfj`uZH;Dv(#etKJ0w3kVjVx^CS%cU?FR z^{u`H>T1nVn*wlktqhO?m<0lB{n0pdOp(Byotx<+FY@EZcYs;@fQ$5@fkCr)5+ zVZBpY>s70W?wnrx!ZDohJzQfpZ{B48=b!x>``XvPWncaCzqI4DCxe?%~rnvF#w;6`mJYQTtxuK$S@QEnAOx*2BR!f?7u(rZTr7ShkI;z z#BNx*($;sZw>NiewHM!c+aCU4w-w8)ZT0dtd-%am*nd0xRV!gA&&Zf9fK>{K98;@P zwi~1SkJv+a|FIsMBK0QOc8Rn?j}X6S(L2U*L{g?EKw4d^-BNq|N7>tV2+#oiZX|Dw zw0DecXOC+?xeFeTNRPFLHxRAKlW}Y>z&0pB?)U&;d|kSUfjh z=Y=2Fg;9WKV;p&?nN;StJ^49nS-uk8xd8kkKsL~&9XQH&?c0e;jqHO?jGit1y@-P} zE_N;jat>KU&epOf#F!sw^f<-=%F36TiQ;Cn_`!XaO@iyS%&9;0Y(46oZVuxqjWd&< zHi)ccP6l&Xehfg&aqI}3WUFmw1DF&z9oibWRv=e|F$&maD4f!G_>BF+W%^PSF~@>T zVb~$)O7~dC7?l1w$2}<0cM6+95T8s1-4o-`e%)Fxv=4Hc@3J|Fr?m1i90LCtw9sPs zPxo0S8wPb{3#nX6H1IEc(N4a*)w;L6Vp&q|x|`O6#+QXj0e=5vGG*;6*V`w4?RRbc zhPBSAXA)4in!S39Y%exRnqvi01Pcm|5KQ{onrie7QvEa61P)iRkNfiF9af1hqY zA3I=sKG^Q&vFknWLq) ziWJW*c4e&3$ZP|{gLe4veg_hlRk6hh+s?_p)==BvqMe%>+iXeGavmCTw8+6*=!7+` z*!ym_?K@v%Z5nkvyf7z?AGN2z#ZkZmz!yg^U)xi_Q@~T;x~G7m7|K!pYbwhT=1^uZ zP%FAuIt4lh1rKzNOU01Kp`v`9p{sA#So0kf*B z)MUu47zOHWBf{>tpZyUas=RE~4t>mMUqDn&KJ-GUAkxl!k7&E7$&q2uz=So zK5NV}-YCLY>6+A_d~^lmDw0EBwg6e}&7*Wnc>wLzt5;&QXKx*@DRE35?oNW{Z<70n z)83TQyrGvRv9=V7S!du+a(}uv3A5_65+!W{5LkOB(>(1!3&3L3#=ua|2PuC_Ayr2D zQ4v)AD(cyn1xx|w1+Hjv3~%xfcbu|-?`K{Q9j4(KQ&coCB}xiIdDQ!|04d^D2zK74RxxSAemKfaZFPC|WC>a}np%w#Kb`DgvSP5*WO7>sB`& zrFTAl{J85&V6n!jF?M!#IzU(F1um~yLy9)QU4g+$VXb>pTRNvPsR)Q}Yio03a0f2% zkH#n<`*(ipHvj{c+MoZ$UopOIZhX2IUltGrU=tb4TAJ(ZlmFxa`>o%6+LpC915}3c z1kcKI6(?WG2(6PcJI}5ck(F;|ne%ln*g5AkP0nd=_Scy$f2_}peAacdziD}xJ)*he zopmu^PT#*8!lY#-0VGl~_Uf?-VX8-gzK1qa3v;E~?f7iDCjFjrgj-lK-eX)OA z02I(KT!D_e3uli)3uN1R9D8Q&EthKS+j_(*C4d$eE zbuP8)O7=?}Wqt$VcCBo)!+X1}svM9DWLDSKpyQ0QcIJh$aStW*Af*SLoEUZew!tq` zv@NG$g4L`X%2YGXa%8drGE5{YDxF@IBEoTLQ-$^S_FF6aPd-%+*Fl@_Mbbo$pF^|T?FPyK4Xb)@VF>6(dd8qw?6)CF(&4O}d6Hqc{%HVX92cy@OE|$jY0MWT9Upl*qJ}U`o%|qOj&e0ZV{cGmYnX+wAWtO zT%hr)QSnI`du}J-0TJACY@9o~P`?!W&YF&EF( zUNQw`S+^RUeNJ{b@xln%E2R6>l4-AX=~C+?BT@~Kzp{_j;?p{cKaKjBICsR zwVSN2x{>H%=~{Bm)pMap07i?oH7~V^@!c?f(%IxZ|12Pu@k9Ms6z~A>$0D1*$Wy>m zz*FG*qkt3_=?s;4ub1ILDBxG#>jFKcpl}x94evw*Ng23YWfUlvA{mvXkjJ<{J=K)3 zsZ>RBk_`Z1(F;&^dVeS>TJmDmUOLF84ph~(n>Mbq6#Tzz9nl)rluAf$*q(Mrn;*Wq;iKkK$xg`dHp&n4ysa+gn8z1MzF2Og-{psEq zsx50>YMa-uv+Zx~bUP76$o$-#nn@~ zE2UkO$6_)e&;bu$XMs^oXaxu@h1G$`v{_M}LU0Exkio|FpuzjH5GbH|CWXB~y64g~ zAn7LFLKysYFh+sEaxjT25}4G70f$}(H?|0FL3|^Jpyj08{AYjoyY{6o{E~aF&INBS zloSF~wSFiyvH)HIvihtv%W6~6wgOTWO{;nWL600c;?gUtZU_)-oziszXZ2DVXMwLe zrt6%+khavHiVP-U`vQtp!oJksfdhEHvj>;j5WuT`^f~NP5xxST1@tQQvjAg_OF*yM z)=NOJfNKHI8i&?xeHLIHg3zwx3;g3~PaB_j@^OqLYwUmfSAS}+zWN&U8F#d1KK zDw=oaD(442Wlg{QW$rj&?^)&S^K&Z9s;w`Q1cTykahfEeu`AQ`2yb69WCWS?6Hnd+ z|8&~_{-=LoufMU=#wUn@3@c5y=ilZj1@znUTM3}-BAdcevhviIoAWG?A>Su=18#D+9!oae82qw8}USxr{@! zQOb~Nh;>6VX^K9-``vHaeNR1R!|>wWH{NI)J2u$%*I%#~UwPH;fA}ejW0VP7rAJCTe4ecE!5;ryF4DChKAkE-njKAn)+6NJ(iPX;m#W=*D zC_2s2{;bt3sk4)OUcI5w8XDJGsdB;&y3=i{2vBg&QQF^EQP6jx`wT&?3|$v_9^t-a@1Pw*ce(?I$(p8G>mwpLJ|@smRPtp(P=Mb`&$^0+W?S>nQ`UCdee4@u0F234 znt9-WP|iz_mR&#-QJ|~S(KTC{OD<9tV3X0%7r~p9b8tK^rkz=w$03HV| zAnsEsPaQ?xD$|w#Qt_7_-CCvMvNr%iDJ^3;n_e*>D5|o^chOEfD+hOt(M2gUKFOZWDg&KFi6!f9wDN`)`|!DM+1QZ- z*cNa=7V&&p02E+CX%6yy?dn=*?aNkJ-=X)3f}OCARU3J(vlfx|JI}UZZC#!0`+ksZ z!(?Y*o@jD0_o~^`-DSI@rSXX@`ifo|XN%Gl6Mvp!U)?0-ge%0-ge%0unys2!08d!dR(RrT{9HVp*x6lk#4d(vNZ@5EM0s zbYxjeBRuj2!4nV_P*w&383#xh<`lJv^L8a=%_Mu=uy=@nRw*|r+H)W>%9_$ZDT?^$ zu@iWkr|q|Y^NaSYj9SPNOw!L*>}CXb2K4Pen1SJt=r7e{@+v^mUZh%iM*G9x{~des$;aG)FU0^XU^N771&j(X)jFVkbwkiqfUJPq z!NEZXvW97x)vo|pfvt+{?d}EX&uvfmG<^_m!?_Z zufSaa&3pImwYT4X+g%?5%mRU(ArBgafU=C_M~~uVPc-nxjT^0p2(!b74?BQ&DPH?J zu6A`_8lymBrHB?7{Bda(Uf0#tX@B6f$DZvxdS*)iI&N(k3YG#@H-JJ{D))&=3 z^L@_MuJ)z;2^{5Sw0ger$hxl*h;qT_3;7#1?PRv_0<{&M;O_XELtg9ZYPCQ8SHEXp z{fqC|x1N2;`uheQe}`B3_xVQwJ^KU@)iyNQidAc^v8mopkY2N_G>Nk-x=&-Zll$8- z&Sx?advDJN_PGZiwKkkZaRIWcT(&&H{=r^ZmFN3UASyo|{tra#32>up*A7RUcDV|9J(#p8o3Zl(!-n`j% zk_LM9idFW?%P(35PE4O>f6F1#X~*lUZ8z)JD&0$E+?pBdL;?roQJkt+3$eNL-as%PoL za_ANas`(~xNBo(0$gF@-0jI&zrCEXd1K)LxvU+hu^PJ<--J_DJ_^keupr&eDz_4_1 zfwHm}q-al$>jm)*d?rapQMs~5z*edifKGtDE?XD25Aw&*HrHsr(tm`tmpkN2Y$HN~ z`8X~c1J|S(tcEV&TJ7>*SRGZA-Atf#Ft;@#t+L|Jl%p3TA-jaej60%hy^Q`;U)k6M zc)8E69onZ~wV!6M*3KtBZzs3?#0KAg%cjPO%=i2QW#@6>chj@G9tWC=3L;wB(&)g> zH(X#q`D=w!%2-bSv>#u}B0kb3M+!yG1};IW{DDzRMm+ zst5EZ_Uf&zu{u&fi!alP>8I}sM_61a6|eBKL60_UwJrmMvLj8&~5@6|ExM zVJqXnK1lyJZ+wU>90zUR;kRAXv*(|A%sYN)ADaRm0RGsd^A~ywcnWw5TrU(raX=WW z#_L_iXemnsDXt5i1y3?9h0Y+;4R zBmb06Mgrdv(q~2yf=`f!t%=m0$eOlq-yz$$eieHe_MpI#&PC~B5T51bxOvkW=Yg(h zW?4xXh7#U4DzRWiYIGF)C<>3czvw!hNzf1-dIV(v1;ITJn844nPk$qgjkbKss z@PN*V|AHFloln!o>#&{R>ND3(w>IN#y6?FIn^EK9Khpc0N5$FAhZUyB=7iESqn`V$ zIddjx`ZT57iJ(73wX^7}u?qxlZE3JS`4_(e|FqbD`sz2W`vg3XJm<^&qkw*UJzsC& zdB5?dEg0X~r;rrRg8;DcDA9}TZ97b=<5*SFR+4J6y)0*A$!ZMVIWkL3S`#Uu??65m zVB7;A_T)20-UPtUJkRH}?LRqS%g6+w2&g1!Ec2{E5kQ%#LADtHFdZi&#kbiD_)l)S z#U?Ra-?V9+-Eq%@whSOtUTm!mwKyjowML?q>PW3C$5pyPUt`Bz0O=CCO-XwTqf-cm z5?~ZXQH$ennQY*?6>}1 zJywUaQMQdVq962HabVQqq>NrR93~=6q9yy7AR*k;Hs^-%C zw${~JJs|i1z=Bec_UzklYgcsI7;D^UW}Gz9G209f@h&-|tJnf(6=2qza^i(vm8beG zgHivS%r^g~)1n)Zet&^iZ8$L8@Wf}VZfUzUGeK*r(iW{s0rnPL>f%XFT%}iK_NAyV z=YS$9SoIv$T-3Y3)WDJ;n*;heI<>Zs%3w2)jlspc>bXleq5x2-&We!5s^CCYMb(No zT!u0}C!|-q^8#jhmb*tcf9S`pX^cGpoAsPWXW$wxadrejzZ!$q5XF;HYxo$nEhCfZ6$<8n93aoHIJ#|MjZ{hhkWFzd&o~ln-nfAn8zSgQ*n@EM6hJBF1nWJS%9Etdy z`-|0h$jMBjrl-Sf%Kg`S+OR_LLmTH(ZZ`%uC{gS*i)FG2L)9qJD+S$+QVG{ zGtna1pp=W-RmX-a`00*E6v1_1p2o^5ur=Qsl* zp7)*a%$<9u-RXk?X3z$OBv?TLVi!qKvMh;|D9KW?a*?H#V_BQs zY_f?R$4RuZ+_UR!oZUFKH;KG1kIQ4nrffg9tV+ugDUlM3giiD}Gnn3I?zH{=zB?Bf zK%^v400@%z0C(;^=X~dD=PU2~{@*f=M-DCFr=hVXrw3z-{l~?lVgVkEG6$x{;tNkb z6(`uIj-2j^QvlXE;sdugt&T0*uc03KI6XIr7eW-2_)Ovox++6Guu5LUD5Ji%nf@P& zdaQu&xaDmaqcp`cdp?)EdlVZ`{#)*WS5FU=0pM59yDYb)+ymtvDEGii>H*``HZ;{D zcrLm(7TncJR(_`nX3ba`x@T5%*2DW+Fsa>_gJ@Kn+;AE)Cu;H5RwGC!t;DSijv%rC zY100KWQ3N40J9AAUdf~Awg&CK`9l2RpFA49XoYXzzAd`2!fHTp0EtIFuz%z&7bKKA zg_gN4W5&=DZ&e!*0?@cojko2KHPi$GnH-entD-ig7R|*nW$@&qU@GOvJSZ<&*_f96a7Ya!CL3Gq2ivVB zvH)%kf|>*}Ky)vWr(m$mrh-BHjozUR^pi}SOdWYOK(x!yjv$QkUir8hdjKKEA}l*v zuW7GBA10_wsRd^?=~7d(Ka^7R)PN2RAP><}R)Hp2@qbM6x_bo~XAUc{wh zc`yFJx0L8!uyQ|8>i#0fc{NTACM`6Z?nuv)WF>lVxovuh$srv5;QQYm%}x3EcmMwP zh!?IU{qp>Lk+RB{uWS#v&dCehy8V{;;rG5brdYH8;*b6~23hx~A@;i(YXO+#SD??C z1LL{cC}24?+p!j2pcczK;wiFM46NB0Ls^9Fq-_Kos=;05D(QLo0{8(v4Ee7PtEYML z$#&Gl04_Ew0D&`D&_1<$U+jJ6$=C=0u*6>Tf%pGlEZ|DB8EY+vmI}912&kuVC7orx zCzcI+6dsjw)p!~L_SNMrO1G8pT!H{uyb{#{TF){L4ONp+CE6-bSL7q0iC`@1;QJ;3 zh~;T=@EnGn85x|8oA2p}%^L<|c4#{00UIh>S4Z2rsW>xvDB9{6!xhyrGd4{fmXcQ^ z6?=yOE!tPL!~505SWPCHmavqRb>dz-u^Pv*hHl3KtEw806%zoz>}ff9OZs^U@M{Pj z?b-3Z$P_B#5cJv<{7>g~TjKVH+v1roJ{~<-vYp-EuIw-=m-Zq(;QUcBY{N}EV&^-5 zB(eaHGk`NAjMeQe_0fS>Eyv?5V9+pQ@ieYkd$Cen0>D)vA}N8hCoD34wJo5kxhOvID_WaoIV3kQ+b} zW0Sdy0U|kAQn5TLlX!YvOsBZQ+}E;LzMf&4jx6~m&tfTW@}Ur|5i1$+Du~ZJ=NZ?2 z3t%&?0I*3%of1;b^Zd73Y3}Jdnjh4^xIZL00QIn*rdK8~m*__7K%Hj<|D^T!6yE`5 zQhoxa&6ky_hP7c0Zn!h7S;rsyYpm&qiv<>&Q2u*0^Z?^VV+P$l-*xBx@FysMwyjUr z@)fM{wXJQ@-n||V3MdWnt{py@4a5X|#Q69G>osm07$+(l`sG>%V<#i7H8 zVq^E#*s^JB+;!L8C=Goh)^FO33@;zE6Qp8dsYo%0v4sW^Rmk1)x{!u1NyZn9Mb~-9 zWpxerYZl@f#SC7zrVD==@NxMTKKepg$qO-LV%VtCORN#J^7|WY( zipF~OalCR^-yBL^9qsGk=Zul8myS$azvT|BnTO)J-Cs%a&#Pg`lG9^u7FUj7h-iZP9Z37ZfQago{3W@`r?{vHzoJb zy0OWkMSqNPTF{2A#l5vLh-I)8sua-n9~vHw-u^*cbPnRSrY{C@J8ivyrD>p~DNRR; zVxLHO)&k^a5xPj|77(&PhXOP~+H%jdkiz`q-n4)@_4GQ{p%n$nBo7JsMGHm3X)8e3Kgge{#5oC=x> z=nC|jMqu@8U;A1dIB+0=s=9#|An;kOcTFciyJ^#=ltz%(^X~5MB+S^0i%auWsA5|L zd(GE<)N3V|)B?WSiTCKYWeOPE7g{0jCK{l_%czmb(-9+p$Vz zhHnS{vi2>zd``64ikc_O;1%b^pT+m@?-yP*Uu>>&opJNRPrcanVu>&LZz}KGJk3}x z9>tbi*#2bVMFK5kJRJ9>BR#qN{JG~!ZCuVb5zf-KrKhCpn1RrJ@BM){LL+A5=YHuE z2?Q1(C?79>54gU$mfdmt>*8(icv~|2J2liBBS&_{rlE-#u7;*Z$X$Wu-q1jA)U&Q< z$9iMW;cv!b_cc-RhS$Xs@fqjlYf>nj#^Ih=Am;B}6>-^7`drt!Hl|ts7f^C_ea_`; zqmFO_O9-nQiK#nCev7Nuz&zmKb#6R%?S3LQU2_uvZ*_E{j5{)pV4k6}An41O*}dya z#4IHgPQD?=0MTZ$v&1~iM=fqRpne=r+6@;Xpdmz^6L4-_sUN0KprM zJ`>IGSv~at2IEC-iW3ox5@Eb@AT2?~T;}#@BYOi{Jgd-%kou z#kJ+-A3v}48aRJcDA;`K9dY}+-XE2?lbu01P0;h$=4d9#3^<4H&Qhj)xFM<_eUcJE z1%`kN6@*!0AkQ!c$&PgLZ%N)85J&)6K?K2=mN_@;g2FbJb!uAy+N%X| z8gH!S#XZ4tk%`cDpf~0ke|V(Wti+Gh7A=JPjTzeaHU3bpPiFoC)b@SF3Xc$Oz2SW_n z9yOp?wbT@i0JvxRoJ5ROz~cqHK?H#F6#M7s=tSJJV`psL*c~;j|CuaaoQTc4kmgX( zmRe+f#5_iJR>?L0vHCDS;E4cqySkd0>xEbiUum3UwKt^41b6eCU$^;2+MO@XP0H6> z;Hr*pV*mE0DX&2Y61&(yY~W+Z_r{qay||PiGhSBtc$M@(c{IODUSzo$^}GT2D!M+e&;pj5tEtq5NNh-va)lue*p&B_{nM$d)VJHy9*2SA15-ZYU9f^%HYZ%n4fWB zbUQsdhC6KgtbAM*J+K7$yHEyyuZnl^;+0V01m<#n3XSA42>jyxbmi_O@E762!w-Fb z{PHh;9Jk5{#$60A;jyuMV**_jz6-=^{cE|ND>xHi)lIV?fL6R(+zQ~jmg_oAaQND5 zuZ>NcHpNr86*G;$A9&z_^f4B%R>B^p)k1g(fs3x26&9LafY^2kAPWo&-uiv}?YF0o zsH!&YCU|0xbyGihjN4;deU8+Vz_K z=EdmQ=yi9zF5dI5M*ve$zJ%U?{>1(`&RQ|x%>W$FKl%AM0(3OaJ6{A{dh17if`P?8Q@s?UD5*Bou@~^WMul5= zjtriQ7MW*rJbztxTU2%6ZK8K?bgthKleklEYif&O++b$#VAQduB`UtQKi+oNwULGA zsiM45taGnlyAFV~CHjW@v8uv@6MVuV!taLMQmm<|h$Dap6?1^XxT+QiuCBxb2Fj`x z?tws99ro&ADMI|7?JmC2HuGI+Ymts@LhInSz)5J)IUs}}|-*?mYxV3Xb48q6Vea{_uK^loa zd-Rj=W@Cxhe9eyCtDxboj|u#}?asLWAATS*HT5ydn0DWoN1?%YziR}==2QLgu$Fx& z7pQQZhhN^&h&3RK<>+A)@xi;3|u*4&ZU zzi)4BzII!*a(yF8v#SVAfH_1QKXjCFmQ7Z*+i!j#uGzFR)u9S`-W=f&4jz6E;|i2o z8Ll(4qcJtXUR70qUL^z$`=_&E2IB^mU#AKAHajtnd*{g*Mb4^?fPT{Qcu{1)E_g1`ysT$*aRU3 zaR0oph(QJN%B6X{X)rPE&wOoXbarfFeUVQjln?ppMX7;(b!dcH>%63#@=@-AS3?h! z0pM4|TP(Ms+ymtvDEGic^ni?tmZcIl3Xmm)6msZpX@U4ra}Ztd841{xBZ0pn-W0?n z;H9pY1u13B1S*9_Gcp_ye6tXm8Hmmj^9Em(gw<9}rb=Q;#zw|TGO7wUP`Z(pG1HaQ zDq`^d^MCT;_>KSiI}oD#(4vJ^gy?EO82&D_^gly<;GR=GN!anm2kwm2AH{#`xnu`6NIwZIP*>v*uwWk*7dtODtl2g}_3_&G@}C znG)Uhsf6hg=ULh$gQ<{7!dlDZIf+eAAhKnk{b{?&Au)wAv6V1_T2U7OwT&ALFOZlu zU2s?7K28hZ@$s3&*m0+Pylg!n*ir(2eUrTWSLk8QZNaxYzMC}P?)jJh9`8#KcmY9Z z*&X!D`Z^R!sl4-+x4b!i;paYfS-@W#C~zuJs>@`pZ(Fgx@>?OLV6XtNK(9cnmbu;+ zoIQQ&bo$=Bc{BUV4e7T)?vW!$;>H_qjJxl?JN2J2e{Z|(wv>-~2;`ctc?d8I&aOPn z!#cV4`<(R>boQA$@4PeB_1R~iO?4>&Q08^?=+Oiu>lRwj*?YFbezY9-Z+}}}>A5ta zFX6IezK^`)Vai#GkN^Cy5EJ-h+OJo(ul)PU^nmX=xlMo5UGZ}t`-v9-f7y+ew<8ty zlC&K9WaUu=c)yEPJ!MoHNGo>UcJ)fmB#A2Q9`g{0boO>48LBma0?!zOp?a z5VLMmXWaeZ-7!5*EMC^N{xhee_nD_+zAh8HE9+u<0N$p#Ax6dqqvyn7gz}xyw5mBe z7%S_r+||u#J6s=eyx3o9M8HD>4gx$%?s9_P6salLxSX9YRBkB$Kn6r!i+R2;)|#ke4YR%Pr|@pJcME_46-4ZK7Av>)S>A)*m4^Bvx27?=Zrv99zWN*% z&)Q#>kC&wfc(2kN-M73h?)iZqA(m%Dip8n2vV6aQ?liP^bzOBFKvuAWn9kR(DbhqP z!-V&Yo3Z@Hcs$0Y=VFpE+FPi`s$B>cfCc{8Rn>U8i>${P_-3ts6UfT274Y?3C2LX_ zd2Z5AC!TpeYM?EP@&^EA@}5!FK*2S9q+@g=otA0x0_S15E`p|2fM^)VW3f&hsev5& zBH*!Uectkt;ttOj4-z`gIZ0PY=sKbt!?0LdG*)2R?EHiCPx(j@8ZT9=P1{J;i5^u7 zpzOtYqh~SO=v}gbXCajc7XP)IHjVuVJkCApirmH2m84rj;G!Gp1=ay&4-52Pl>j#R zbz`YrLm7KN{bS0G z_Z&(>lK`?8Z&A3IjfyMd`?6 zc#v|~w*+UEJ0-&m%ALhhR%_py+Fb1V=5xu@(eTg!bjoq~nlU^z073)i4xH(UhDO4z zAp>LLMN2dBb8`ejKvAh0FA>#vz^H9qmBy=dY5}EdNux=?UENIgo;eXuKlNF>Pt*`* zVIYnjIhwYj8LXR~XVc7?S?1Rm8c9R!k3(mMq7qa3?!KOwQ7H*NZCY;@tPy&RXlQ6> z0;xPgzyLP&HN={K-@^~ZZ~;$AZCx=AkUTOllIlAN?|*9Gcs#r7YcY;eRe?Rk&;!}3 zJfQa4Xl+@?yvza0cW|AFg?z_(>+J4mTL)Op?BiVw0ESP`uo;$*au2-1d*FNt#Vfoq zhk(1%s7$A&<-ovM0AhjR83?rG{*Ls{{ZFN9|&ZqpBz}yG=@(F2M1&Z4CbF5 zw?JD2ZjCQwpBR^92>@B`U|C7qSPSu}fN>F3$Sllifqt}m>@!_;F2caoz#Us(V*<&L zdfy^^4fb0N!lU_xYT8Rw6fcyIm!SvLtS-5Ie&xRdg$HSz@oj6;sDo>Bc$KcNO!G2y z_$4ZmnV8%`JAcbDfiF>~UQ{+Epz`f+e;YA>|Ls{o^rABP4v8(pwXqRbl!B%Lt)2_C zD!3F>^}24Cy(Vy~yD}|nO}lCHrs(VIOXs?L7Tgv1)y4AGty>e&n*@oZH!t^0Eqk@d z6`1u9m@VaPeY|dcwB*%FShvrnx#gByQl7e@7KGltdv}WaYh7->`R0`V@y8#>YVcIb zZ^w=usmxMb;v$g8JavDeO{H`9*Gqla=6AjG?d;otSik&#vJVRaC(-AnE~=d0i}Zj( z=q%&);kVoyKl{-i2mEbh%t~dH4p!_0MtbgVzqL0iuH*{oJ(kbX?+gDFt%Zw;is?-6 zc)D;*mF`}c!_|LYY|puRrr3;}rWWxB+2+L^i9X~JY02V$)|`}^7gNt^3H+`{9!Lt1 zzw)cU!<@#YpoCrdxS~CvP&^uO$G@R2{`A?;$L)ae8zyF>A8Vv`tbEt4Zi@02jCq-czvAf4;4n^WdB%v{_($${-ej^w%SZQF_()q(D?mW z5&qGi{#pFx7e5;}fuv1At=|y@%-pya?@G~Z*^?%SPb-yN4{e)zP{@e z%tdvyV6FS(Klq{e3aq+*@D_-h-9qT^;!t+TNDj zZyr1|8wXAhufD1QfT=CMv9B*Gw&O~4-!zuV09?4JUR=K}Zah8`e*;hTUaOGZy4yxGWz8jOypLj<8k=R;qBmNH`>|R|SL-HDF!O;tX1V(Y*a?8h+?E&AuA-&eLw=j-S_Qx7^k#(~G|1dR;RVwdTx6Cyt z{8u3}(t@=@IW`-bQAnVbujGKD z9%+;=;_%j^z^di!L?4#Ab2HJ~*9%Wl&rqG<_ranO2yPxS)MG&-2^4_@O^+Qti08gB z+5#|Kk%j*mq^;vv<4#8n1}O4Hh7IUg)0w;`4FQIqz@wj@2%B&bEvS5a|GxNUeIw@Y z6S4p3Nfa_Llt58xp70CCxJJ!4#;FHZ8z_2I0tC0>8oCA<9DT~H9UAG231a&`@wG3- zm!A9za|FebM6)SxtHMq6nz$}|d(>CAp};hO9B+nsgDM4WSCONoxdV&oCh7tJOyBK( z{yD&U+*Oy4au2+Md!P&ezk*+0x$5N}DEC0Q2QIb;67h+~pfPy0R5jj=)~RX*3hK(d zcwMGPrb1v6b`7FVres;$6iyD_o`dHFgh>aVmJZz($>+#;sJtq%rO>jH{LMo5Dl%0W z1SO`Cr;!brC!ZYY7SPPo#Zivny2jkd06f3(4fm3$GVZ_cp7`A7z5ww!8Q<8wC)ReN ziH{Ip?ZTZqx1%jT693=t{sH%KuO?#z5qS+l``6z~ye``LeGj}o_Ut|YBSnj3B&~_< zq!Mee&bsq;w?PQk$9-?OGoIbM53SmHtbb)h)vlz0FnjzgGMStTdaI!;%O!D`+(oOM z3^OcqneiJ!Q%!uWabyaS#Xw*pM3FU3OtXDu^VCc(T2Uw0JrtxSu`af4i&BBJ9GrJv$<3wi%v9dr0u3&^gTAt_QUFn5#@ioyOZ?I={wx~TEsV2EJDyY)I(h13 z0(Bj$0=G{;{d59$1#1OjwF(ws^;|%>STBT@Toa(x8dulMTIUMNnnridrWZ68==FLD zH1@Y?$Hvf<2ME>@xVV70D<^AydDiP#;dV(s>cF#s-iBMAk=$tySb@f3pK6O}bF3XNWg zCDk{GjhG#rh-Zj#TR@opp4GLHXB}Qs4L>xrz-?)WZ z86v;u0OW!vn#3A%;^a6UjtKJtZ;`L9j$iqWUyoybLs)-J#f{hDsiI*4x6q?8oo|e< z?d!+tm$<#Xg;>{>kLuRS*s_{fjDXGKqiCs)&c|kmwjpBwPQtgeFIGhtj9Crz3$=~KP^(J(j?v-JHGb*`o!C*a|R5vI?9 zjveEAA9bn5in)dQcMKrR$MUNJ5bQMjX&v<1B)pj6R;mF`YB#X&ojMj7_P+9Qg?fPT zD`41tli=@AQIMZN$%R#A30Kz}uqYwD~9Z&G69~=%HzNX1$1MSDWMuq@Cx-9OFjbC4tO5 zV+zC?)CL82>rP#BfXr3Q1wY2?l`r=hTcHBFds>eC^}aQO`&X|Bo}xOK?nzUcELj3u zIRE9%o!SD-IojpQFJGQQS}8B!Ce?^6>xN*o(vK|VdI&;kk*qyC)#n~}NtgC|)+4Xe z=|y=0`KTDK!nh%%ROT|yaY}1F_$<(m0)_e%D@D zJpDREe+(egL|LSUc*)K+_8^1?q{X`v9x0mYn_?{;c>$!Bn@mHzuHU2|`Tkr^)H51lXpyzX&~K^4u6C#$;@CrzDe+ zgkCT?vI`lkgcs0korUO=uoMKHgJF`P;;B?GK}s2vDYQ}rKGnR}%2sRI#O#n4rKEBs z76p)fMgq2p7*VaQ#M_#lK*+E)?z{Vr`0A6-#g6Sa#E#o`#1|g>Vm$ijr{ezm?}{J! zk$;#Nz!75GR8?(@4qU@zvLg_mbGUaNN2vZF+Iw{fDxM>D~3G3J%Mnn^ukRJujb+Jfi4f#-%@ zyJF+Ujmf3+``-7y1pew;S@+AXw_5qSmkF+V_*;?x`{j7lenP;9!pswJo!Vf=M z1nc@)A%~X1#;qF0D}^9zX^$+qXLkQ7T@#Qsf4>Ej1$0Xwu+Ms}x3@Rd@y&03bE>1U zgavkW`)s*_#j97ZPH};)yU&@%as;MzXKi}RN#E=}?7FFqm+Fu0@p$Cz4<(_|&-|O8 zCBB#LY%gs&m#V(6ntamyiFok7o$(8}eg0PP_kuO-g41F@lveKLai30$?=uk@jGGr< z3Rlt?W?uS~dU!dX(&;Pg`&+t8Nv8d=d@K+9G`GA|ng^x(XTM92AgDk8IM+W~0>AU^ z_hZ4h5Fh)6|HAq)1}%DF`tzSIpIw?BSitq{SOXSA0PvMd#0Jb3;>)>?WhI_sdQ^boWbWsbvG9kYEk z%EeGqMce?;I>VlDd@vWaQ$Ta%zovdJuEk=kwQ&`3PHW;FSQA$Q3jar}kVj8WM>DaC z^MH5LJf}5hZFVx+*5zaWt{&PCaJ?4AEw0bcjWdQ(?j>E`HqibN_98(#eH%^laab>L z4TdZ_secZ>Wje+kGe$tb<#pt#8cEzq`c~R~JKx`|tBQuHh4?cpAdh5eBUWQe zxkA(Sx_{`SZWsJ7hfTBdEIKp$Y#Kxe6~3b;D&qz zi{M)3iHhNZGFg2#bI1pSEy0YyFEfrZ(miD2Fi@#F$t5VO=z)xIO3p`aR;uXEZ?I zRKz4}k#ZK>Yo{ttFcz>@jw-+_r>R8HvK|mvxyCpC=D)`rA+b_rEUJ85)*h(CgIjB3 zy>AYBp0UR}UgTvh5XUx)Qjmrh8b0``0r;%N<3kqEF^d&!9U!WoJhZ-`XG2SU)aC1= zrVejL47P>>Yx+ogjN)CWr2{v{yx$fqfY*1e#oHfcI);$Z)uPC{wo~`X`RH2Pg>~*E za~VSi=2s`YhMpSw2l`XknL1=+Rmi;R0iE?|BLAc}z^*lGar- zvjJt>CfdJi-)_cyWwM~ovHxnYk?KMWVCPH!;K}G4I04v9SO*lhoIe_%B#@r=Xqm6f zusX;7PJd_U%SF~Xx}|)Sd*Bt>17!gC75UoAl`i){xd+NUaB)3Q4O8FL4DkYWHU}di zu~~=Z>@03$Dj|qUM4%d{6>t%Wd6Suku+znmjEQ)rF>ayb65%7$A*d<8p%!ix%!T=? zO`BXNL+sTgjzua7W(peA_;pEf7-qI44Xi>`O54HtgCrxo))fvzaIBF{vIBkpe@#@d|b{RP7$IhEeaJFS6Twk@qInx@g!q04erZdy~|#L zaf~XNXF=Sb@^N{4!2RR4TW^Vv{_B64Vpm=2^~$|UK=jc^A5EaFV6QQKuet&?$!1%a)< zn*9RFmZ59v&aTeX7VBDSo9*-W#44#{<|Dyz1H(|{@i-YHSyCw z^#SHj6Ysoec~$C{(ko8yn%B+Jeco~Y7+4lCCn~0xO#14D59x~UOk13v{|o1IC9hss zpYOQdlsa&^l0pe*XN^Bf_Y*Da>DjyIH48i<9VMav@|m*4^A6|iJKu31-U@o-KmF#P zBDf?TENevhxJ*633#e{yi_EsJwB0N0ULeLIOhN3f$I`bNYbQw?P^I-)M|DGo_h5Cq zG&mcBZS`@u75B(>O_3eKU1uSe;^npj*nT>T@SWI*jnGU-m_)1V5q#tBwgJ#~jImPB z_W}q~-E2i%hx_Gc;XiT+mGji6seyfgy=Td}ERO(fmE4Bw`js_Y`d|LSfymuBavWE> zJfEp;OakbpwwBoc{6y@$p)qzJnv9c2#$zi^Ag1=>t{Q9IH&)KYSIByVX4V1nuE%xr zX-J*gET9_kSywgIMs^Zj5D@pbpX-aZnQYv7``S2(J8QX-Y{!jQPmRP@++}a39e;JS zI!+uNica12!bdi!@H&T5F>R@&-&z4|hbG`lXm2z848=w*-y7N2ZsxO=K6(ORV=szR zIV`B>RkCQThRD=E=LbYqpaGnIc|IFdl)-;_*8*Yho)RnQE6FPMG&|SFE5L{ zYnfdYTLk?_xYxdzg}0vrfFTApboU}aQYCau6~NaFV+e=j$Qc|{i_rlHtQF**k;xbX ziIwk8v8(}bbir&ow>PA$cWCON%r+?Nm{06E7i~3l6$I7|brMXt7qIYaxjBb&f^||>VyFy(UA=fE zt7r1lU9_1d#qI@_-OUp&3?RulZrLQKeOkXerm0gJ+T3${uu42)A6TsHn0@X0F#%Y4 zN~5BOF}SlP;CgDiC2?-7V7;`h#f|p_O7qWu>C>!fDp6Rs@^LwOz_(n3jH(%#4MUT6 z$Qa@Ms4$>{e*)(nJMyEvBYD#$fXT%wWkrlPjVmgdFMJ#?l~s)O3-yjyu z6Vgs7nKZRGL_M9UWiJth@g}e;Cg86${*Y%g=5PT|9L^uXaT-{h@8qSY3fq=Ktg!Bo zf`6v4x1AcEu}`sP6{bf?>w5tZMj&cPH(q7=DEGiCt_R8h@GI_>l`CBCfpQO&d*I@F zK!&J=*hdn-jPQn<|Gk)2Hb&Al@U{mJGmBuNzhev zazzBeq~;v|lLjsH8N{2+PtgUkZl8?>Vi{`N3S#CcLjrFJ!c{O+EqAgZKfzCZeC0|?iD z{Wm{>5aW(m+topgwbMyx|MWAv1~-p zwTTlsDHBOr-Jp^xF^A^sT{?j0q>T9q#W^Qai10)Jd7*%7E9#Kr-ASm*Brf{lS=~X` zA^eymo=W++oISvMMkuJ|XnIMPv#2YWw*nB|wK+6L7=~-*cpQWP{q46vaS3cTFYlMEd`r)I?nhV9g4MErQ9VI$A&P`_a|4 z?x$^AslKJ}%hlKB|Dg~5Xq-HGI)3-}{@}c_FGrcL)jSo-%EuD%QT}e`RG$ ziqD?~cI`I_-xoVf?#DEKC&548%kO|`%KTo6|M5rP5vO|w;t&4#)8+YN_gs#H&dy=M zwEDK4QJ0jAB>v<806+jqL_t(!5Oy>E3w)LUq~?heT8ZZ)<>|)UG;Zw)_@R+zXmHl} z1wfb<*6?g2^mhY*RR_Eh?|%v_ropL+Sj3#L4yDnJ6<7xIvL{v{H19>h2vTtd!fLV! zi>_wC80Kazfa%tpR=Mmu2(T;aRl!5>%(-KvhOx3BfCg`rKw#?F$~s$s=bA#eUYK6Q zN(r~e&|z;v8SyJ)v++FcnQz>RJ58|EZKR(9q@Fo36c09K<1n#)d&eW1DSYiX`w7;! zOYjx>arlVEnK*{4>Q5aVi54uL9=T;(EOa$c;R-_OWTT(Bj@vdh#j!mDu_d3yJ!vfh zdjL6HKra#>xfW}*ib*_Fz|$Q>p>`FDbYOe56E~*_#}%@xNUTNX2<_TM`^PtIi^i^X zG2TX;$KgZpe1%vA$2mTZ8%|ty$_yR?oLW#hmVXO?&k5+Lfl>ustN<9$bCvfCg^8%? zUKbVYp^I36owt--j&bx_%@evO-`W`WbI?0uAg$AYyISG4!Q0;4o{9aq zSs%f5zB46p(#!{eRW0)L$~6n`tQ%<$w?ADfyG}F1uq;G5oiQ~<`UVC_1!cMJf&bVZD%Y$fBXn$QHZfWkGruLVA? zu@(6mV*TQ*oV+zwNMi(eqmU$zV_Z1KH8?Qtb~WXBZX8?_ zSF)KUoeQQJPc!#42H{ykkhn)`)jW+HY7u27*L`W$1Ztz$-~(0cXSzgplE@F$&FuydCUtyQ_p(%q$>Ko1Et_ey(Xa?HBFuE30+ht*(7V0Jeo=tS_dZs4f-yv zZRC~aBy-bw=rnQNDb7QUX((6Pfh*;s+yk$q9&i^ZALSk>_dvM^%02KZ?EyjAMhG+s zDj5-D`3fM;V%0hUQ6uG|YujYm3NfQ_Ap=vtgj*V9&*{2un-ftV>jU?lD&{1Oof@utf(wQwb%B&xFHI|ZY!yJML-%awSNk*Y*6(uX^jPyEgwLjTIp zq3w;p{?SkVHLjeeaO*S|&mTAvkLRCE%+#O#`6tmZROp^sm5ABByY|H{V*FZ;mc(l6 z{@366ecaU`w19GZ{?O5sZWcoI*MH-`C2)G0c2q(f|F=*4VG`;K${r-0K(|1yTEh~( z{*m~TwM;dpUyb!s4Z*1JCJ~GDtJ;AwfD-XqRm-#q9#j%P**=sYx3AU4^%?2&gdNi# z8TzXVcW3G>+h;O@Y8e`{RIOb&1YQ8l1NqJI9!Y`)S}hDSOhO{Qy;43dbq_3H<*@{F zmIlG4&irM}kCDVbg%nFM#>gIJ91k$YBn(f(@!=dS1{qR$#`OuAI>u_63om1xFKyAx zs{$6D@VS);s>-wH()O-QwXXbs>L>qMyb-thm-A4NaqqqNCTrTmhY!c6KJ}^S?(R+? ztHMZuS;11jJr`K@C;_TI?>*OQ>+K=nYFa;D*K*Hqfm_oG)OyYPg0Bvs5+LlkX-fH< zpU-;kbACLxPJ*|_2QC4@x_nmgX`B!SUKb?Rt@X-!n4e|%{Duu1lH!ueO!<61mEoRx zIS+_UI2hbPgrVU6RQ0&eD4;CQ50~{egH(M=7u6v$J_E-@eMf&b7T*QK#zp z#|0P8Z*GzBbpN7K;cTQ&!8_Cks#K2#4=BpRbL7{!f1>fxut* zyRUKe!h%!M@}HO51H9-efXX$u-V^QXu7Mw5eTO$#ti~FVJ%0%hcM-lqxFv!6@C#$S zWXWt}nJREzVlSxUyopb?5#c>nQ57i7E+Pc3hA+_tYXyMOq5dN=Ut5SeK+82t`55iT zN@#8-R&SjlW^FBCZ*|;$cp~bL4&&}0>tgD*p{p^Do*qwbX%}DuHh@44L3d3cRn{tT zbxUpB(Tt@oc^({^k6kCmutuE3`gT5U>deL7d?ucKx-SM#jm0%Lb;LM(%fRqb)B;M+ zv=Vm_JokasczKzwjqWB~FL&kQ)HHlh&v<S8YuX%Em)AAMZ+vcloZfee z7>A8$@M)WCEM(uOX8fDRz5QTUMYzVR5C0<6w1MGY2d+px&mLyXs%>G|jew3~)! zT1PwNcQzxaucv=LPwdzJwVUI?JHIcMdQZmI>$gO6-|9HN=kKuW!V?R_UW>~m_S+@g zY3q?n6XJ?Iu*fL;F}!L8z<4E~b)}ZUv-Hm-N?3Js^levUu`HV%7%olFmpWR?&t2F9 zjL{rm%}sB5XLMeBQ=)BL^#n&HcJ!*{ny6)*psK$O8D)4Qd0>^s<-yMYyi7uGbyjH& z$b05#Wd)0jb=|`HsYO{JgA#!t%MAI>&f&3)xTn`3yLcYOgF#|st9Z^paN@#07ZtPR z>ji%FQZ$b>UIlxk{J-Tp$MkIkhaYuRyaGiJ$C^C3U@!?1pKbk_^|I`M!2Ds`bC*=< zTSx9&?9l!n(SAM!{BD0og7&#(7TqQaOVl ztuBBU6#{U-Adts(@9DONKfa9V8j|;hFxsM?55@Uk5!z*F@FcvcG zOU3b6e4mbw0&89xUl>tnG_ZhYiozt;ty5z$J6RvI#G;)g4(>Ez%%mfX)hi!SU0;LC zXh2Wn2eY0cbYhG<78nBj_HaaLQ7^qxw5;cMy2aRKUg{=VD`n@A6J`lT3a1N8I=>xw z$g-H5jl}P5L^-4ZZ++Pj!qG6llvR;MnyVS+hjU5;3G>lYUt?oa0%L0kXJGaU2eqkTEiZ#m9OrwDZOX_;T{Z6Rl}OpK#b!h!0I^`p4sV13|pp|1BJ)~7VG+Y zigST=_vzVLym6qE>v}a^DZeJ)R0OJ1Z`cp^iE9LN+;^rSM~3ypLn_#{B+YeG(jTNC zjrW+t1>d8xl=4yTfmcos6i4^B*7wEsffu@7x>ou&x6<#G-~RqipVG4zKIi;fZCbS2PR0lJ5vtaVUh zRzaQMuL648VJZIeJmnz~Odc|X61ODbTun}%;T~BP(?LzG2mfBZlFM117KA4==m9o%D{ zd+xd9K3VWpSI(yM@VC~%CA#1HuIV0L^V~d2_bo$!*K^yZMX|2V1cB2Bp^a(WQ%Z4y zO=o&zSe-mYoGC1Qy{9{8EqncKnS#yMMF3Y9)~na7PT;TL?wU1g(sk2VzTmO0q)(kX zmE2EThmO@9>6&#mKCyeU<(BH68g&`|D0I4Y`_1vhSDp+#Ybf-+631&}{#3+I{MdW= zyfX=`O8r`Vuf;LSD`sK#J(nnn(mOBhSIg(#=i?q)Jh;F7Od2C8qf!ayf1fMQGQC&I z`}}k-80hGpwDl*VQYNl$=xVG4xU|qF3j>$pTFAY4+}SaSrOOXc5igv z{vb-8IV_|AQ>*cOB!J7OQdgFcu#1L)z*XcdH24gkf>yYImc|g3gJDsFj$ep|s_IzV zvO3xjFwc_z{Nij9&I{Ha;RT(9h-v{8ZN{?qWbaILj*rClX6Sx|-O*YT>$lX$#M*|~ z*S`>_5K4Cg0QU_8FjvcaRK%Uc;?2OjxaZ7aHF?(!t#SQLZR}@Fu?Ze*|B0#SpD08d zd%z=YRq+htXLJbVR)pa5go0TF`Dp^Yt!S^0!j^T>yk&jddTm9tbah8RAnxb)^u%YM z>5pT>v&nMnA=GJ^4dbUcF`chAp7sxNoA9=?Yn*T45{!(0$PN=$4@&n!xFD!0; z!&_t9>)#At3*XE;b<5E5PQX<;f|i7S+Yj9J)h1wbo*(|^DHIxT4GxXH30JW>6q+k| zXH{Bx^WGP+K9?s?u{Ke%%>wM|wpltguGfta1ZMQ_Tln8)S(`>LNm%bi!p+FuWtnO?~9we(g5f_We5-Lfub;8)}o ze9xwJ9B44$81a&!)za8vP`h3`FZ2)Y{3+mpqJTGwnW=FsT#4yBTeKe5P@p*e97z7R zWR5ge`OWxH3B&Po?i%S>x0NX=dvbCJoXXcIvofg)6!T6lfZJSCJr?u@l$!dIQ3$sf z_wYdMQ65P)M>~|0$=?{lrl~0(4JePw`xID1Rj75m3sCFju8RJu%Qr-Gb6bjgyg>eo z$iAvrJG7>*f#;})hjag)nVE`-u@Ul^NG_fYJvYZ-S8k}Gif*N~7^bIF__b-|it94@?a?GDA(5%Z| zL=)piW2C;mp088bK|ae9fR~y^cY5W%>F?#kQxGl-VLT3*qY4O?u0KE{I5QJ)@OE9_v%92PW zNmz-HqX0vh4$8FbTn(ClegLW%-;5{fu4L z1zYcocrk53ZoT3Um0@(hRY`25Vo$u{oAk0bK!Jf)zaRX-4`24W$b<`mmVnas_V#2A z{8xYVSH=AS;8fv?Zkq*21!x6q-G@pRyjC(X^UHv(`-*Ll$@h~4Af)%15-@C@o-4rc zT2X*d6bzJ}_r6C~p@sqv%C)XO<33`(mg~2N0I-MGJWO8#kvR{hO?3d{Gx1>E3zQ&Rww`iNsvKZ#?H~x2}tS{NeY;zxnuY zBFvmD(s<`RUp~3m9*}0=+PN|AzJ7c3VI7r&=2lQEur!K=6mnr`cPtNyU08=}O|5z+ zUjND#g8BWel#V~Z@*fap` zzz}Ycr=oJ~Oyq_}qJOA8s!yDW`gJprX|IZdZTVQZd0n(so{k$gua3IbwTy>TariWz zAaK82zi=jQz*6uCaUS#V7kT)NCHSm0kS6U70IOJ&HNbie)?k&(ck`|7(M))sDgbS* zWEGBo?c`*fI?@}NLT&sJF8Z75dSeLp(Q-)hSa)rrzO%Sf9_Va{!Wb524b|~nFCcFg z8^Pv^_~d8yCjR8cTQo^UfVp^0v|&N#PnZL9gj% zeHzdPCLBIB;uIm6rtr39j9#dns5j1U4%e~JG=;_Sm?JcmaiJOV%rWRGiW`JZ(}lFw zds_jTRDvE zuyxL0xk%xuomt9ry;s3nm(A0Od_xf%TF-X)ye*bD7qAit7SR<<&hguwLd6j`<_hX7 z4JPm8{^q(*$%%f`{+FqppB04_5KpHt4ay$M~O0tAfXES<@Ap?)(1O^VfeI3(%(LZ?+^X zA1|o~1ZtHw%>!VTfOWwqLDvGIy^4H=?~t*@80FP6zf|~ltN>Xu=NyM#m-b&|QuyxD zAKq_8LL~j>8s!LD>fukf%8M9H%=s?8!(h+yS;A|B7QW`^xNuBbh6ZrOjHPk}m)ZYx z`z-IGtOG zcBY>gzsM$4wwM?vrY;jW&m6C=ZUFerqnKMCZ78uC2e`nVsx`Fox|A35b(Xba1TRT~ zxRaCP#HuH>j~@2eyEDkb^3+W^Uz&TQm&VFeuoiiwd0{77ODkr-rPFj?1kLGFZrPuH zQZoK%!LOxudd@EMA8oQ7HOMh%?5bkc#SF`T%RO)v_dpo{zKUN?xoYJeDEC0Q2VQCq zWMIM@(TtX9G3JG?iH!ZCM&bg1rS#kqAaDUtR@qh++J3df)`g}jTF`P|Mq~~SOMoPo z2px%02vhQbiiN>~(I6ukjpQPlb6rgvXIRZYHRB}*<5tT$%=PR!mp$octunj5%VQVc9P&a;4^y zWfBj_1SPFUTu})!3ya$(0qI5hqY|c3=1``I%ZXslLCETsS^(Yry)IQK5IqmUo!r-G zaYj1?aXl=@bE*R1K>zUE5&{l#NJOw?zU3qi! z65iC1t3}4pa%6_Bdltb?KEHrP7(u_v$0g_i7&qMCCDm#A`_+2LY?hAFZ(Cbr6CHuC zjY9xfCcOd|kINJMwbAg)&`N>L&099d$3FTqxch1^u9=sioC~uwF0SsA)il@2*OtcIt=bk-#aL3k= z?kAz4o5mG5tlK*uc{mO{e=vUSKmKRx%DzWi%EwFV0lklG-n2IU?N5IoR<$=J0ah_5 zcK(&!iZDxoR&kY1VyP7cdVTp|T}x@8KhCXfEAE%lo&8=}$k~f8?ZG?gY*sqx0zX=4Ekb8lnlxwl=#dpWlSaB4e zQ;_-YcitBV4jzyH{9Au=cHLN!u>A8PdO%CX`Zep~0l=&6JtyLchSum9JQ<^akSdCv z$#lgu>##u4bwmBpJ>DM^tf2$${|JyL7)&z&Bhvsd^Q@r_0HoKi>WZeydR%#8b;SFw z2Q=QedVQSQ_2oEyVn4#)nV3hZr!X-Y2V@Z7c?KIQV;Fv@ow&UtCud^qUR>F3!+Np3 zH7c=&EVO20Lklx=vLTil>tg=^7R0UXv3dFgZl>47QVsPOo`^XB=o#EPZ@8f?+OSW| z0rU<+rmTS{8N%K4=_%qC_svHEE8zL1354nj&Ee~oM%WA3*KmuwrlUSKG-cw+=T632 z+BDMM5ViRnJlss&d-n#cBrD^aUpk0RZ$(_!-5On6*T)n4d!wZ}6FrUj*a{Ccox@5R zUS?r(EShu8vHtnfSnV#vyRmNmQ!Igp5cYR2R1?RT2}($x#8n<9-L~3HoP-D41h{z9`lfiIyDJ)=KXDNwrJVGIdO+`3t)1)Qj)(pST*@{f z11JD)N`nYQ$%6`ZLK7`7>H=L_>n2`Ycr-EfMJr(yr<>uWm&l_BWs6)}GkHu$)#z;G zapkJTUUfZISvh1B$!#lqHs#bWLEivGjgap&beVBUH|DFEd-GV1!?7bTsASA8;39X5 zZxuV_lcAsjxQ*Y?RMe}W-&)4XB(*j^t|XCi2r<@L=DT}sN=>0Efh#p|dr^UeTKg1b z$-5(0Sb#1BFiNrlG7|Vny8#`OF)u65fBQ#F*?r0_*Z9Iki%l+)uk}m-Gi@*^uyfQc zT6sm5JjC@1^sTXc<@Tkobbl?do@guPnYH$XsB~zfQabXrf3%=3T{@O@kqisKpi%w=uflp+0jQjY6tX|}xk|=% z2Kio6T3`$&Sr~Ot7PdsW@)r(SD&QY}I|3b7j5FuCV}y^gyyU*TLO1M;LM@JwGZj4t z&PF}8>TFvTC$dLzc`lEH@&$D;Z{=H#r8I`A)6mcm_0Wrw{h{&#@saa&DSbm@1743d zCRf&4AJ0tBz{8<90toD!sG!Z2>@5Q7^P@#2-f0am*n4z$y?X6x){@$oCN#q&A#|o@ zaXmjVjj}CiNvE~3#xJ%z^#N`39XQ%ON<2#{i~jcTy(PmF`rLUX&*l12;?Gi=)JMut zl?fL6GCf@WQ|^JQxChDr@KyYB%2g}(K)DCXJ@8U`K-#6jSRfKh5Ih+e2526LL^QM! zd>He_ShZ4U5?X5a8OwGKVrT+pOEOcUFX{5iEI?ICJZUwo0Na>X#?VmXRE4!KP*m#CN-QbbR=}l3UMk*j4b)q)9Y{9x&{8okAEn( zU3YC_{9j5w7xRq!Ovyd6pznr_8=?=FWQPwQPHU`!l!=Lnvlh5A?*hGE7fAJ70fl*# zTt~Y$7uRQ$df2}#!@Z|ub!+`>tFD-RP7t<~pWyTQ_3KkwpY^`^>-KqL_r{cNYO)wd z*gVb0?^4;NYf0F!TyDu~Sio5=dfRE<)=_KXzx~_4MWBjnH2`3rw@vP`3NNn2VLg8A zLm!Bzp89%x@rz$dw8oVv_tjR0LfLvOAO6t?-+?>xO^i=~oaKYpnvSA1iL{WStJ3@B zChuCRq<9o*CHJrN9CS!AZHY4Qy!3ndk>#&qIm?Bef9tzCOI}KrQl<1nO?456^X1zeis8>YR%D-^Tz=j;UOHA@FH)h)cg$+}6_t|v ztx)*KKJfPV`qTU3@h6^3ba^SS^7lpb0G*j3{$clh-xqmYHIEGU$H*e_3AsMV);C(Xf<_0c>h3<|+ZBv3$ac zc>=O@Vg_&;YvJdKi+U2iK#xtV_R+#Pl26m?&=x?_V*tNeS7ia2c3g`UC0>F~_TY+| zc54N>j&XQ1JjRXP9dQhv?v@>d8mNQ!s>{dj6VuU#XQk>Y;!2JHD&baoaby;7nRv&5 z((iwLN2~$NtpFT1j_DK@(%&H8M);bq<8|s3*2-(P?u`3yeN&9EXEoP0Ml;}ca`6eX zw{>+_^su%q;J)*98}5h`C;MXJ%yTitzMQSCiq#-!o0;@I>|@zRT?JEFCY3yBEqy!( zAJh$#*}F&`*$1oV0lhbEjHThJz{IS`^j*ZTDJNa-0p4LQR~t7y@K7{&btRtHJq3&f zdZM_#755(%zkNnP6P{gO9$H0an<hG{fG2+=I60;ua2&70>(Jt>^llDqp$ayxZ~rB7jvb;q3c zA?_ET2UF*AUpb7H!3lJ7zlYA!(s+)K$t-N1{wm^Z?lj~{`2x`9r#fpRO>N;>mGv9x z;~oSnvn0||nA(^y0dZSikEQ;pBhi0&f0Ai&%xPPxw_>zrfHS1xc`0x(r}l7A=~MDQH<T~K>q61wIQZI1N%K8rUHsFzZh-W>{ruRN~vb=Mb zz%+eRit?Xw4_v)Hu)O44y%j9itlR_T9w_%fxd$$y2Ovg_ZCD2r&QCPv01=@?8;NlR z>64fpweNCpR?;^Lo+QU)@D!Y>O;@ceXgCT98F;QlB$=7CVzPLJLy}-M&X3HI42{H4 z1_DSxG^-#Ts%;UXODb5vSwafhl;<)@IHHhHf=+mI9F0AJ*J@qdP#Z0klLai4V-=hX zk4Yud77B$pln6`iow;V75?!f&)YsTRTH#6%+g>#WZEF>v^E}L-RT3;UCdr)NJZd}- z+hXAv1R@^B)2gOUYFjp@-V#g0GDYjR+40;(-SqNMPx%UAq$KY7v5^C0Eb_t_m%E){j7~ zz^O+G@KtEx$Mw}c&W~vXd(F#qx}G-8B-URC4;_pxTec+YUh@|iHoX9@X}#vTdy3zJ zGB5zAToj$Nz#ta#t&r8|Eu zE1s=LyPVVa{KeFHDY>q!okP~DU(E8$lq}MyJm&0`Bt4ral-oZG$@!FWd{VW7@Y#crv2bxwz$Mhstwz;T>zOF{7JpqW@IyVt*8`q=! zSra|Sk3~lYcl_|6VJuq<0M;8*SVZE(II3}Z*-}v(9RSfshnC_{e^nelaw-<#*{TIt z8DCl+E&|BTvo{D{wJ+kmg2}Q7U|p$DeQGvVx94I|#iHTq_;5!<{HKA5Xaw3CgQqxg zpdwb?xjMf8`!`1WnVA?kFcfQf{#NR@uBjrvf_3toK(sX* zI%AN!c68Ll>7l`BS=A8zSRJ=A@y-xK_%V2sLHaTepEAqb`zCh8O?6%I#vN~tzT-#Y z+Us{l)z({?oA8kESJDWXwcT+8eKIpM5l=n+g*e>Y6weQ^Z^27#faw%Qn4*nGnJYb% zF#}Iq0l%Xl{&%td%H(lnJ%-047{HObn)n)kimrU;ZrU2zuL1(o4+)7pe|VJ7zC#cA zZZ_|@E4pvHD=8!E{VVAi@mvB+xG%44=p(*ZXW?yOUIl+<8Kd&tL=T0A5&P9r75<;| zd0eFGR(8_(q$mSqiN`HJyNJ@I)~q8~f2*8cUE9PEz@;l|seF2l_uqodU>0vFV}ypP zrL1}Yn>njivouE zRMV~+`mLQg(TXgiz&x9rWZu*7GsH62`&$Ng?nU_q@(A+FH#f(PZ+%yM_4j`(W>CyX zFOf3J$9LZYbbT6+X?!gqV?*|pKvq1jzn!zp zP%B6~=n8(*Xu4CGr1S$7POqf+4($-?%w^?{z7vl$2fgDwUA|^JsiO89C2;1V7FWzNeJG|UP*Q6Y ziCN=nlCjrHSO!O;b|Fz_Xih5d zKuEEurk@(a5UDbsGH4QE)=w*BnMwG|1fnKlj(irV3#F45W(Q)ofEIa?eS?sLn<|lL ziD8B4v`FJ33t}e=TN-P-=CJzJVn6~PVh;8a*zC4j!Y3pLAfbd8LuiAE3;G&y=U=r2VPg>Ph2ta$x z0tEX`8XD_kcnINA`MCHVp#K-<1%G{izM1mz+UWt;N*GLpQk5BmB(I%@Uy_#U5kjlq zkNm`sowa7YBpH8)OkCRqL$$`$&9dvX*LLpQ8IM2ycmhea02Uy1%@#EEBj{pUK~}+E z@41G1c)j#dP+=PPMV~1F#^xc|s=}23ZBI{6JonslF)%QY_5tfq5_EV?H_dzZ?oEJk z7uGeFXSwEQS*83+^(fWVeN=bRlW5$Vk8Z9NI+W@oaBLo{SFeuN*4C7l_s#Q49+tV| zwp-(a@BiWWKYsQ9N_D)_b-0r4z0_s-4zImtV|@4@y^C>y&^!qW&y|w;l2?joaQWiO z_j_)?DyD;uS&4+MOnQmOMd=-Da1>$mj21Knus z17I+N8O+LA$r+N8DDJzsS+ZnpcI>Ds<%+9Pl~fYjpXV_($;SeE;$uPD<0^eSHAw;(IKT+MUv zO|udR4uv-KC|pOq%H_*^XH?489it3nQCNWQsL%D#P|@l&^0b}NEe6MiPK2`3k|XS5 zEJ%Bd|6%lkb*|M|Khano)OQ21U3&%K;Y?FKg6^1%L>a_t3-r}vI)}btp6@G_#W=r0 zgpsah?k^Z^v;gi!Tbk7gQE%_=eX;A&cf|3p{*ezLBW&Xu+Yd+qbv-3?Msy9v3Gaw+ zN$h*_BX7V|g=2*}CTMPlVoM(0(7(Q^M_NO^NZ>2S*+qZG*y5U%3Zc*!(TSnE^OJy8 z{-!8)jHhU(55h~X@qTl3bo-@a!CU37Hpo7<(U zMCQP0Bjw31#NzBC!0#O1#q=K<*xlL|le06(G3vpr%kiP^jef2!&h|53HzPCklLo=Q zy1u5@Z!@>X5d`^d62o1cN7_4kSffFI}fgIKx<1^C) ze;A9|d2$i+4%D&vOzPFlBfP>VIZ{xIyf!D(^En@=zpKlGzPAMMN)+zvyq5<3#>=_N z?|OV=^IETQ-gNG$r1sX&HohAaxb-N|0Dy13chYE4g8~f-G$`-A@=UU6$&(f4tV|3vX#U~o4Ul`_2Zcvjb$Rf;yYAAkbpg0;UTV*dc;8%6&1Q9$qSoI-9I zbbtGv??>@O&bbQqzw(d%ejM1pFU`R}iu>HGPC-(^R6S}1W6i-U0DJcA*#xZGKEYbQ zJ+8nms4M8|zF?{!=ga!H^LCoMxoI7!tt$xxeFcUEWd(kRhlk_Hks}EJK5^ni3OT)H z%a#<9*|v0)c(Tw{rW%U--N6jcTUeJIR&734xo4NiFXq7v^`elrehhPX^xzNI^Rtb7FN~!e3guac=j3!R3He;b19%PPH6BT8<{!lqwx!S!$F7`?gZ=xWxvM{gZ9a>FS}>^f;3LtAjF2N@ z$gz{pMs@mfOn_pU0&pCjd@a2;0Z+h7LM7h;AhSG~i*L4)2cGbh_iXQvQ>XA4Mn;&e zHpS6P=Tlz80m2_YP@RiWwC-QMG803{OG|)g(}aZw)d|u91BL?Pv`6eKlp7e{nKu&C^vM+lV0Up1a1^gyJbjf>carnE1H3ax3Tzj09%-DuJ*f<7cR?9G4czKZ=n<2X*a+Z<_`EF{M-!Z4zK5?KV1zm1vYIDykA_K?RwNB z7{_B|&PhFtmG7k$wI%(F;9QnZnCiTM=PA?AX$Jk)t7*H3t&RK2Ev-8w@0+5paMKNe-e=!`h^i1!V7cQS~ ze-;q+L#foC^uSH;KV541?702G9rx8mCGT?TQy~y0*J=a(d zz1BS9%2)E)0>XYLImwr14e6VfZhXs!`M&D=sjN@3ah{*)diU!xV*OkZV~Z*}&bniU zWgAL4gJZ8Wd#pO6$E_BOFv>XsJtUR~cD@>Euut_&|E=YB?#(D{sdg zV6Hg@V=9wuTR9E0tVAeyi`eDw#2gDld!2ugGreBMl0EbOq7I>c-UAgR22y%bUo*-M zBmo3P?#BDcLQ*R}Q!UKtDptt0gxevwa#R5hS}W{%&>Umw{n6l@xn%ejP`0t&-G;Px zv;qbm+u@}1CW_rc5iP6Zsj+=u3TWZ|p%1-3ed@yU z_r2&pV*x#F1zFux6bOn6(mGfBsVfi!a_fS~~$5_gX<#y=*OC7xwGV zs8{dA_(YsIc_IP99v7gsKD~VX=y`nR%$ei?Z2R<7){EC;cinYYYNz)Up!R;Y-*4;i zBgpK>=kr>Br)OfF_FKUFfd?Ll#~**(>fh4M=Qr2!KmNzR65o5}m6)BuLoKaaZ)vk` z`J0=c>;vz8GCuObcfc#jfLy<&{-|e3+T=FmJLCs8j>&^~Smm8OSvqH7e{X#ImF=Wo z^*{B#Uf;j=?cA3xzIMnX@`5+mZhUl8!5deX6-ei9P{2d=?FKjSQE$-1`W5N>=FfLs zv8y}D!|m#xKVEm^bkj`*HrklzpNePY>vM$nPem9T)>W@99Z&DHUS9sM7QHn<1cgkF2g)hP^H z@yx}j_2k^K=$#vl)}9vfBG&LgTE=q_#V~Tu7;?xoacIG~;>&onzBtqoJLx}5X8~5b zdg8(*LVf3ZNm;NE+X2x&$Qn@D)e*HbGvw?o#v$1EHQW$S5&5T#!h4m*%`xU{fMMH^ zskY;FTWUd;LTKq_?Dui6hgUI#;`?qq#m*vU3~~Gp#E~kVw{L52iAT8qzWJrNczP_3 zV9;B7x;H9BhdO&^G7jtlpdJ_m_#TgTJSz>$d*bq3?AXy7=O&wCg7)6Ge;av4mt+5~ zu9zg`^|Q!)i%diN>AUwLdkjIJ@-pinK=fi^DUJ+3ALlQx$NLX{Jcc^9$H?5}_|xb9 zI99unInCz?a$G{8FR-TUVpJ*R&GlvuBw%1;)PSz60rJ<#nQT~9MYsYv9@h8@A2NH3TD$|mpp|n7e zuS&WqvkE>{@xnGrm1owtwo=VuKv9T2>+-w_B%8p||P-L8v(whE2iX>#T1m$j^oopQo?rnP*&|Dt)UCy4hlNC3@aE6`N+tee;(l;E85S8$;qY z@w}#Jpp%kP3Z4?aMmku|kj-{mH$9iV-X*xE`y_mtV^=;iP30VdTnSv3EbJy8iRNW> zFlPHO1nGx|)tl6HM4g4;S{wbp8Tz+yktQv|d`-+>%~nF2^!(HiehD4I3Q-NzZ3x64 zJ3kz!@#No4nm}s#NZaQqM{~z- zPS}5`OAy%pyN*G~Dj}f#U1d&PV{PZ6~~V8#31%>lioYTAo#1A@%zy zmYawi*piH53mkWxmG$-IPL1B7# z8X)Z*?SzVNXAD6@#^MU#?gVnu+}tc>SxZ-*B)_bTlj&vjYR;~uMD!_vpR#Oxwr8(V_{w;%=RqK&OVfd&N{6lhT3 zZ#o6cF>45C8Nn332~JOeCWRZ~oJ`%a;e-*E%r)yKFe&qsa(2M%Db5sN?vNqUM<%t5 zL{-Bw*KkknCw7MK5`xGI*48qj)P%LGp=t241qhHKEyzIPdb@;xpLxc@q|zQiSp_M> zPz(Ob7|NKXaEG*023n!TJib~_ng>^|Po*Y@)BUy5HUBNO@y#)WP4Aian#2%u1;ULM z#pWNDc`k5IIKmW48a|CSWlX7cX6&~NDFWVx@?CnButrxOl&pw(X2VY_09R0?_|(>8 zi?q&#z^QFAfikLwpRvs<^y-YF-n~AHR-hTvE^|wpxo^rhqD!^yfhN+3A4w6Vf+`OP zEc3sNq9-w%2$TZi8GGAAz8{{Ix>7rMW&z*ocqr8=Hoqe`cx|8eeb^e?znR0 zN}R>>*!$|SYuiRgN7HYwzj*OtYKQl-ZtqoZlXSL>=d9ay3HnZ;%r^Y9AAw>&w#Scv z@V0H+5|AvgY}?+7cd)sSJo&`q@!=1BAb$PV|KCKX&F31wucv^@*MTj)@%Ml6W6|1X zxbciXyS~)M9`82WHh()qZOl^Xuz%nM{;HeRz{6x}{;PNJ;HH}Wea*;h^O&pre|<3D{pBZH}&PjXL@AwY|L-kCr_1K^JdSSn6-^^o9p0E+Uoc8 zob}wOOjh#y{)Jb}$p3@XQNQoCS{?IGzvF>q5b*im{1W4*p{lt?oj3lnf3$XV$KiLq zpU}r!kU>_Gypjh58l9VriDmPqkD!<)KOqKwz_a89rQZRd=9ig+@enL55;{3Ywo>M7 z9CA@`(+5bGQ-SCI_V{$PFXiHq-SVlv)-cuQOv+Y@KU)?)ajWAVU& zt{7b|$1yyH5AAOyq;4_BPhE`e9le0x>*RR99HpJjabQnxOrD>LIe^!3#%Laa>ZNWx z!D#mhy7pQ-YIvT%gaUp?e^*L>u(U)@W^$Ue)QUw01RwJ0NstECY4%oWN{Nroe$RMXTVvekI33=Kr{u3b?)b@GiJrg7vt z3MhNFVzhPF+kYa>HAa|HepWZYAHW!7dfw$KeLI0AiQdT!n{me6Pr0&SBJW6GlOC6V zr?nb#DRQuKv*Y3z;lS_0vtCbLy@b~=s1Ph(alK37*OxF{XahtdiW%~4p@q<})U{4u zvK=dw?WVp1z1=BXaVz6!M@uozF(zJ_TcLefG%=-Y`KcA}4}gRnM$7{S>7DO6fi3%t zZBrFu^-kGIVL}OY8WqZ{s`F5fz)$CE;?xk5hQ_LPU-HPms|1n*L2?enH(j68b!dZM$dGkUw* z=({+j%oBNobyhuDN=>Ip18pnf+1pB(3$aXsC(rZ4f+9F(A)yp}lhDjP1hWm_liJJuOTL3dO{;-fL>Xc}lysaEGN#rC{7a}T zG8@T^(nc*S1;Gmd%092kkHo}M7me2Vl6TSsqumaWu*CDei9*?H8XGSFt9ScndXEi) zG$_D0s$$?$XxkXy4T{{10t&!C{khMObN7Lp75R}L7ZAO4=~9~OcB%Mf%@TOEZ3^*q zPg+Ant1NL{@Z)ucQ?7%*&Zm~C1F~N4=6TDz?|kYyYT0}4xhHx2dR`CR!NI}Uzkh!M zcJ&1IQ}^1nO_mebJqtjrvd4CLKR55Wd8?PT-jR`!6js{%)}PC=?pv-7atj8()mvI~ zQDXfUzx)gF^{;<}u-C)sS>Nh*-KzIj(e~+|dJp-N4<;VKce;5U%Jyx&EB)p(Fct1w zK3(HpcFbSbHm};ey?%f5xof{QcAL0tPB;1`^l+$zaUJy=AYG)@s1!sIu8s zw`?!{On=hR?AF%~^2_4#roZ&_ABk^#>!rAGailSRuA|WPJ2~Ff9S=Sh{d;#M@7^WA zq`Bqkh?8fccHu&d0xDHeBAZLM1r%s)3&y8AP@&F-ool0SA@j(i%bzQ! ztf72=7MZFBSgV(6f$>pBfxRe51TYiyw`Y$H#|H?x+|%9~eUm8H0d23)&a<;CaUP!Z zc_a$_n&N3>qC4lZJ)Jo1z z+H)3Twlm0Vt$?vZ>1by|plkv%egK>IfJ}#Y`io5o;#WKdb$DThQ`*ybj zD!0awXD-I}{XKx_fDzPj;_^ha%obxeVBS0SZ;8^0^*AwAiBstM#~3gJNJ&)yzdk&G zhsbZ-TLdVFRt54hx6tqpV?10&&TE;k#1ICxZOEd3M!w%6fcFtT<9M^pa-WmEZLx25 zHNM%;JH%+0=(bVhdDm%sH{GC#xk(UjhEU#mzkzV$nMs)2zQw3MbXOEdu5fHF8&KDG zo5o(90`!@E54|ILckZU&1Gez~{6K!@zUI$5*mEAp>46KobDT>Fc=0dI& z%FoKagi`04Im&M>X=G8uQ;_H^@Ir0yUWPa}gz-A})gvE<2qSGm83X<{Z2)NrM1n_Z zVN$Fhix>4;=YFG%pEXjo43T%c3j>H#vxF?CZ%i}Za4zPY;58wVnd|9JF%KZDQAm^b zW37?ha?S9cUbDb+{PKAjzw{}M4D>2yKqtcu^&-muWX0myDZ|sR12C_vU-04C1i%S~ z23T!P$mLusaAnTlHUOz+rmvbIrU+`M~(SNLjJOiK|bJzm+dG*}II5{>E)!u=aMnBYz@q7!Q zTm~K+E*d=!AYzgEAw?hKc7}z%^X>16iPOhpaeAEh?Yi06Zb$*>r5-HfKQbWDcTr#W z(^!GFFa&9g2~Zaq*+}`mQ=51gwsingIu&gK zlt!0iJJ{hrp1!t^>(}Y%j4sH&W-7uBEnC3}kzHw*p{m zWRZ&n#`@U!B)Q%RTh1DlqhFSqS(gF2d$$mY0*~SOITQZIv;;`FOp~#&?4PZ#4xP0PtJ=1{(KoP@qA9 z1_l0#6foaMGYq{}se)K}7!PyV<`B9CQnN6_aAS#q<68|I44euop~EEhz<}zBB6BE% zv}#>2mkJu@tVP60t%T1Zyb}!4s#b1Z1CW_QLd!%}$zOw2E%hq|DI$4)Lo#dKw@$k- zAVi=+tm3#~L+ikAlb|rnnHH}yQwk&kxaJSWsE}aE@;nQGwPX z_gbYL3QKw$`=~O2GS-Sl{!WZI&!aM5=FB!E&X8*ahvgJAC5|Fq#@Jaz);UMJsF?rW z7hz0GcD`-9459S&JGDjgOisw~CNP^i3NYd+hc8u21OF9ZR@V*L!+8PpBs?q7ajhQ0 zHfRl68NNmuP%F=)(5i(c%ru;~9@8pN*N{Lh*GwDGH<4?l17Je0FfM9rH=%&OWcbgdJbD%YfOjpMzsy`BOJ#&_PiKmOj&{d79@RtUS^(>3FvhaQS=e)F5@ z_rL%iKmfoyckaB}F6U)G0>HN0%{9PlUGw~QPOX=-UiUrj=5N7P6#;^{0?vZB2M!!a z;hYUQefsq26!!W4`|nR)zZWh5K;ZrBwcb;207F9Cw%*>}RIhcKC)mw<)ngnYj_=AP@i%|%Ph#}K zbmHF<%i|^2RlKp|7~H6?{(Y_XJVuC1@tJ?{;dtP&yW{i!$M47Ngt@OBZ@FmeY>uD% zuRcQbfVTMj|Ne!Tn7@dk61wl}seQINw%w0Y=}yW*#Q>HXQjZBl%0T{Fkz-jNoV)Tq^%taGIe(}$4lgoe-N?D@+vu)Pb=x)ihH3jl@v$rCxx_&old3(>K!Hx6yd+ezs%Nx2@*;2V$eSosNhU3c9O~~C$%XrW$Zvv|FJFmxKD(A8w zK!l9TH{BkIlm=>A)n~}ZEUAs!S*|i13 z%Vr^Ojb^26yAIf!fHLIi9`-wkaJ67KTEO4|`u4qey`P<3i08?%eHn*9$A>1p0?@#n zgefn?9M9WM|7xe58lY?BvUZcF;hD*x}$?$LizHy8k+|xvtnOLmGi)V(( z%UVi2rryN9L&49yqqD)lP9?Yge~KRDG!}%Dr$VOe3DMfF~>i>@XeWXvk zk8zQ|)n7S2%8V18HT)EbqM#?Rx}}1ED`TWYAFwX}TUUX8*`z*;E#01bXiSwA0c_1> zBcX|Lr$GQ|yrb5t0c=W?$|+6ByI=j= z^z?iz%#a`4^#X&0cGgnofEH5Nbr6Zb6f(_#zlL^pp0TGI1;sM1r}OjVjA#9tog+04 zWnAY5`UYal5bF}{SjDJm#q)Y9^Q~h=a=c(|^nLiStBffDcc0%}&1u}ywmQh``>DUj zM4&{YOg8hl<-EqvwfD>jvVOMg{bC#jz;A$q#@3*~twwXPA6UMyn9>OXS_RTbz<2=Fj|Do!dgRtia6T7u~;Vd<*C zw1Q}8J&GPyD_ESoa}`8jbX9)vC@`x$1NRiP!?srj+xFB@9w^M! znqXilzXDTOLs7sTl69aKz5=c0FxFB(F>6`~az8^-)j?}%A#*3st|g>agofRbL6#}? z&TG`K;3VJYb>~_Auv(F(`=wfK0p(=SH}(bTW%|4D0-l3WUg7?Y?M4)Uc7)bT z9g_Fc*cueLMgaxB3gcMoXU2VFyPg8h{mex_^SRH(_U%Jy?!CUiU*Ded^xnOD6EG@h zD)8Ff-JJkeK~up~0a`tN1xf{C1x`KZno$Q`T}R!VYdt0iYu)}fT(e-UA3btCW?hDs z?(6GIz^+OMf#EG%w!~9UJ(bG6_~MJHU50V?{)Z1APN4C<_uiY7a`k)HE#u-}(>#F4r|BqUrp_F_5aXB4xy`tOAL{DqLfKaVYbwW? zSBGO_3{PK%;VPQ5Wjr{1>{*nC$G>+9Ww#19cshWlR>I4Ivc<)76Y=T`C-G`RDVeyd z&278U?;FqMD}?PG+|rlY__`;$u99nX&JM%pvT5_GL3B4>dW>w4x=1i zk57L5UGclW|7Y>)u`>W7jq#IF?)twE_x4A5{6d_gKdg`|R|8N(2DbwQZzpuo-l>te zXLUZt$yeJAB=l@b|I(2{J-${82a4V z(we-k7z{B37@1Rk0HhrNfSF_-UXqbFe=2f90mLS^g#6-Kv&gqfae&Ec8!{FkP}6!_ ztS>OfFRuWg<#@lNv1`w^xaYq8(LFpIs|6I)_I1XG5<^R8TMYG(A9ZFm9xN^b>>?AP zY(LrD9;YV80k?9|LHFsyyYdW*^xwO13DBn;L|d9;ZBSX?$M;ZYi4fGen3`Xq zd?AMDsK=ifj>R2a@$zNDX-+Rj`@U_l#Cmz<*rh19Gp-27IePRGiht@S53uk&V?Z#VH2_|Wznhz)x6n!M z;bQ#7=yY7dc)W@Ap_}@Pj8AjrF4I`$Z{>FDH3V}WnL0`3+)s$iHEEeO7gPEKAp2~2 zWc3t9jPc|3g5Q#Xj>bGqef;rTNqm|5N~~?Y=nD2?0I?G=u9v=vsE@2q{m^l>trYie z?ToGDx$egJPmky|*8gSNyao-M7?;Uto_Y*jYs54jnXbJWi-1~2Ni$W%GGMv+O$FK$ zPe_XYt;#Eoqe1$ZYZjWV>9ANS)X@9yT>uBWwpp3_gJ!_nZJ{z8XIp4Ajx zOS&G$8sozEEcqRO$w+}dXNYBw$rCs>OJ0wD%iPq?dF!6!Lc!q7lh`#!jU3ndhAHQs zV72dDuU^NRWz%(xhcuSG7i&olm-!lTobxK`=!5E-xC7&xHIDW+v+k@DNkdR}W@Idi ztQAE-@D}=f3+vmsUcl5{V=b&=1EU2ah{3@f(MgDC z4Nw-*S>!{MjBnvtit?W!Jtc8u0mTq{7rY(&KkK)3WbT~iI_(onxCIb z@|k=j&EP#K=Vkp{{UD09L^nf4Cz{z_>a6o)eoGTKWh>w9X8ADDi}RbWvFzsS4CAei zGrb>AHns)@ZV?JJq={SPMKqexpg@BH4GR2aD4qn9vq~VFq{CiD$)#Z#BRng(M~NOGiFi7 zn)94Xxk6ypkXhu2Ghmo=0@`IP#+zW`YS6(=@g@hjYN#3+)SOZ!iWn_s&jjcg}H&TFsui%TaMa5WSyPg6Xx!iN; z?)bzfKYaa(w_s0UyuZIcdE^S(I`0XJ3ef8Dt5vxQGQnIwZi1%@^#Zz{^O`!?>oL!} zeoanJru@RzRbgJ$n^92Kdd=r+&R>7;-n~14v)jjE&y*7GIgazy7(>pV>^b1 z2JvqFO#HY1{Xb(YZ7>*bVViEHTRVOZ-Mu$H@v(O$p6&X!G54rxW1UY7$n_`xdiLm7 zdS96?B)`!Y|8h5mzfp-NBPDM`U55122rmymRzLwKXdpXipZA_619oXo8P$K=5s&V-@acyKD>?C)O7pD&K(2s zxlg|*{@K6yH`zJMG`2(mMn`NTMEKhPSI(b%Eyf16C)9BnK%~O_*}e?eR9T3T2}7F_ zod_E5(ZJKb#=71Ntsm=qm>orX1K7geT==CbU z=aIQ`00}1qXrH?hcOW};Z*7Y)fTHR`HAapMN7vSlSRdLE)31$S?;6y z>wR5h2m*Y9WT&R8F;oC>WqsTQZFY7MsbXd&b^_XVcbDS)EFd}nz+wdtXXLsi+Fl}j zXA}8Oi3=RL0a0A!G`y;(XGmDQO4|t?JNqERQOj(q$75`Wr2lKpFSQhd+mx5rz zk)N0ZaeQhP!w^$T3F-pMF#c0MUcQZ>rB`p6 z>&skg?&2zK7Pwia4a@LoW$IZ0SWdZhc_wKiu-0sB>GYWDTafiJ3Sqg7eR%rc(^-z~ z^wR=Bsyv!`O$~8NwD{P^nApl3(WEYd>sJXKzk(4;1;C42@l4A6=ndctD~!=9bHFmR zSO6Hid}SB_Y$=6!uBnTmf)eB0ys*mrCof%&qr+EXTYn$A4wm?&9i7}%EbVU7*Xzg@a^&H$Zx0TZ2Y;N0-5)%{hJXWO?hW-bzVN> zQFJoMuJgEk!H)p2i@JcnGN!7p3gfGpdMuuFQmjdO#QRQ+0%v59raYj3DnmIy)GWj} z*RwXLV{@$VKdo_zU!r~v@=>>B&$V{@Eg#D3Y0M2c%~+uSnA=+29!KfX_6o-~$5W+T zMITWfE@K>(BcJag;h4*K1q<@FVwl&*9DaFfA_3K_7(_9Mk~i<{+zbY=c%oxS)oK`c z!o0UOF(#O6O5_LD3!T{LF}H$e@WK+ZRt=N#Bc(y3ZKI^g zm>eVIGvi}&Vun<9$Y{_*Cm02@wmS z0wp+rD_o5HU=rrw2Vu_0KZ_8gAmSzn>oGTZC7B)MvBY5Ab?2SrW$Qt3LE(T0YW*4+ z#84xc zKJnL!AQDHE5%fQ^EKg9$?2_I|Xext`J8XW#IKuu)PY;1K3C>a0DPk%PH zk@vPP_}0(872nRkhJF^5-L`F8baZqi4_m?7ndzA{Kl@w3UBFc#Ucjji47;y_#&5x1 z*A&;iZ-4vSapcI6qzEuTlmnSL($XIlR#i;Xj}AD)^gsD-W~4iQLMMJ-oLg@@cwJ`Q|bBos1#5 zDY;zlZ@g{PdE=9Be$-1D=eG5)w57}abMty^J$m|pm)Ghn#uWK!JufAP9>JM&YSWfxTYa0faC{#c8 zk$1&!{PvgQ)uU$^@2X`Rn-q`|?*_E*TAYZHXp8YV=1q8d73J&9i|Z(gM^KPYvM%g` zr#}b?d>C)tKl7!+n-i5ejsVck?P!f>r`BVdAj?%^!!7~Fb~Ja!P`N!83Nz&Aq+UFi z$^cRAgwdR1MBdwfU$phD$MDp6bl^RCu%jjBuAGWTh8~Q?DMF_2GS4S+1q$%i&Mh%9 zJ`&sa9*C)>IUHWAQQFHo0kFEK39$Ck8A3!~iOzB@zV*GyxaYyc(Q?=Q@$SPdaq8vo zMl}b(JTnqo`v7m6XJZHfUzN;mMQI=N$i)$^UBp5lv^AUo&56@{r$@Z1IB8K)x z$BrFj^ zpy4thv(tv0TH*cf<36tfAZ{f`a|fZO*Lkjj#v~MS+%_f9f!vXEjHwAGk3HL?1TU}x zP|@JwGE(|i{%!BWPhd3Nf&7Y*HWR0>P~l(T$obHyTdpgDu>!*>Z4+{J7Al%>$q-zu zR}fXyNu{!NBze?+$}HHMOSO#~OwNJ>==uD7&3V5E^o~ z(g#||Wx597Q*0vtw(oT#B&}hhy+6`AlADvKfK(nZiS{ywHqqzr@5Qr_Ji0Tq>rMb* zy=WJv=7EG6-+C3w>rvJkY(L$I{JdE^`HAi#18wqLm*jf{Z@u2ZQj;!%B56%j7m#uy zLlbo<8qXi-D8^IFA)S=hpnWY*6fowX?l!_+)7O`|$W~Y2MGf1l(RT%2Z?%H_4y}u{ zX_dKag$c?iWh>BQ3Ehl5-{rB97@M0WjC)r!5%#*AbQ$Up)?;#UB}M?=zWU4yF+4ee z(|%jD5}Bsf(HmVmc10_>Qq_t0el^1K-nK+NO{RB&CYMjN6rhz0}}F0dw+ zkx|O@?;>kXS4%rO$(EQ!_VM{mdFDJ~sPY9;AIzeQYQX@hlbpS+xKA6(ydMlZ)4_vE1x(5%<3 z4l%3T*EVOeoimY7%ro#WrD3C9L^Gblxy~hm=jJg5=r_w#b>rOnu{y|4Woa(;+s)%{ zmXky}kE}{V>TGNc3fw9bXaK;s%A07kqd|cN1sW9iAt_*<+>UPZ0%9!Ms zmzYO^Q<+eiryLAb5n-aT0dyJ)CIO@{NtRK0ZXFewB^g5mER||1p_gmq;z-A3juLB& zhbf`UHh@)gfXGtm(ec3#{#aB9r8hD%iZw6R@-VB0R<@o3Ky`OpN1QlyGQR%JXJQr0 zb(t-#YP~*Vh-JdKFZWNuYdpbknJR@Le<#mm7*jnYQfM7`D;YY&9e?7Z?@LyaFMaO_ zp^{b-petwVvnssG$mY1NRYe2zTY>XiLm*QK6O>ixT}9ZE26~mq1Zp|hP6)IEcifRN zjI@c<(2GAX%*lHN5m%Zi@GYUVKYrpY!T`cRJ-?vzl;Oyvr54ok{4 zz@wv+S;JEujXx?ZGVkBiff@v9P~avM5R5}8Ei`fg*9oLhzyH92_}ItZdhg$Qn-sYB z?c0|CSUqCRy{q@G$Coia(u-EmR?l3)RM#05F@|M!6IfNjp`uNIR&U?4=g!7A@E%Ga zE9We)$L^jzdlKMk9RjiU-FM&BGVa&CfOnuk_x>smtW!|hwz=M(K7Bd?!qz8|%iAF@vTxt^_~?h9f=8-HpipV(5}p3QAtdH!W6gf!JH7gzDSs9GO~tM+`-66e ztMx%0!AL!%_TITY^>_PkeM@O7Y}(DXH{1}VJAJmJ+dS8DFes7h2rGMXly0d?`|n2G zDjEGvQ{H4-k8Rs~TKd>_xrI#djft zT!3~9@WQL`-Fo%NK>Pk?nb-FLlI{iMdFWbAvT{Bi-un>jVP~8?`9kdOy(6X<=c5m$bw`;nlhu*(%CP*D17}eglHMRgyJ$&aqF?q2! zmRPF>@vePoJD!TjbNe26A|}T#$J_3{E9Mz57bnJItaoc1y>dP}o6MoQC1z`j@pC)& z#T;SM&9U3DbALPpXcmjpF+}@@&z+3^-af)McgLkuM`QOc*2bC1=wF_X9oz1ReV0$i zz7jGB0QIxO{N8(iTv-^4?S~_Fwf4m5tj9JF{1Bai8*IxZ@{JnuY;?mhyW9YzL(c6Qf{-x)mYkd)K z=(Tv{zIR3iPwAS9e!Q3e@89`f<4R=$r9J>45sU<)YD0Q^BFEe@gu-7V6r8IW-*d>7 z4wTwzK2GrsLcj4Cu(VZAry6lXKg zn1Q;0@pTvV6R|s{E5(>!?v6ZpJZH{d#29=$#s|A&`#@jxw0FdyfaUyRbYlzwPMc)c zCcGnwvlX3$i4~9%x*>Zh>5~Zl3fQC9D}r-6E~r!HUOOXwuCHQ=9yMF2E@cwwig2M-|)|R3F?{HOoxH{O0ql-iRcHE)1d*+-Aael6H`Jg zQCA!2@B^K#@nB~$I+5E2sm)t#3aeH;Zw0iatAMeSZe^@&dwgdv3AM}Dr$VMvB_#oEzHIX$BxC>D-*HKm|9>A6#EBA zPqHPtT003pEsc0iK;sfR8v(--zXj=1Tl~vAwqB^4t-}C}MZo5P`yPw=KlxosG`2bg z919wr$m6=MCveo0&=7x9rYQP}gN6C7h9Ob{Y7W*Px` zdzZ8t{mUqDl?o%0y0`^%B%jsHXhWk2tT@tGHVOk(r*)>rHANyptkaij=(_UuOWL3( zIE_xZeVYV2?H7C;%l2E3*mU)9woYA=;n?jf>Zo)!NX`ow2uKGbAQdn$FkMm`-o5R} zD$~rjrhl_Bjy?O;x;jYiUm;S%(h{i*h=NxkGLpG_O#{-?ODY5Oc+JQ%>MWb_n6Dta z*_J9!CB#UIJojP*C)ua9ttUmhTO3_sj1ZZEaa6(x1L`rZSQm*z6nbUp@o0-A zrj#JDpttl@-)2-jpVxQe(B`)39Vqv?`JU?^-(CHk*Li2p)qh()U59?Jz`8{cdJi?W z1_f>j3N!%VTjDh|8quIYg8~f-{BRVIacM``XhT`Bim;-^sKTweeFZFK;APqbA!RHp zFkXU*S|iHYD<~;o>7{CpSsB801p?|YJh5P?!iV0c$_J}ltCy=e*b*xTW7h&xq@|wT zssg++XKP3@fAqyaiKDNb!0>t-WoZ)(m?5U8QCc6q>(2P_hkg>v#%g@^t6zh`N+J>M zrY+Q$7$)wE{dal}t#56s%6XY9!v!X5W9rRgEt&JfKkxDA!}rA{a$gzh=mGL9{`p@# zL)&C`VXA4bj9!z>9xat-DV&qv(7}*XS{Uk$E5MwDJQ!WBAkM|73tN#w`B(}%Wz1+sH*=csiV|JYd#5hnSpvyDPW@GAZ+?`C={erD?Q3kZ z_Ikr-Vz+F5V{1_0W)z^WBmfwpnYpO3Arvz|eFE^ezYj$#bJnf0DU=&>`T6IcPoBGi zzyiE_*7~iYLJ-yUL_k$AR#4XYS?^vqk9oZy>$!915}50C=J{12<8LkVtw--&_jm2u zmF8su+z)>6g9-4m?Dp-1C1pEt;zXj8;IkmK?GY$8U$Eb{^XaFbPTzV9TOUh83YTV` zK9?Yx-ot)dhxc`JJ@A=T+-S&jD{i0o*hl04{J(xJ&YeAPOjenhO64?952cM3? zt-Wcz_uh2Dn{ID%ij{0*OFtZoSC4EyQ7?7#?@gD<=h&}4{Y&qMf1u7y=Nv29?(4^W zy-@wTejcS7O0dpu6!?ihx_J{k#MVfY~_a{H{M7;YapG=st*V*=Z3%pK_ z_4;k|*=uLysY~Rm)7$eu&sKl_Yxk3O_4zV8DtG$kn~?)P`k|-e-~9R?#xS8hGyd<* zuld`4RvNDNcgAn@bpVj!>4Pz)A&#rYiv;8?z3w_Rc-+;`TC%Vb6A!-wk3UikEH1@?$zk#nlQv+-T~XL~ z08l$(>%^J3J2xFK67S_scsMv=ZsJM(%2l54w_ z@zRDY(1B4-VR1Ab`Sah7rn?WumCjv+ur9>T@<81G;+JCA_{BI!i0D?p+i_&R{V!Z3 zKXO;>y!2wM?YTdudb{J^?v|*$_!_y4JL6I-@+cs24G^ka#q)S!CLZa@#doLi@`7jT z#WPkF3aXf|rl~=Y5MPcf6te3i?xO;na0gjE&A@hu4*tCmvm~ogR&h`2npvG21 zOEC3Oeg{CK#xE#AhbM7d0tkUhUSuajrb`mSGz z;0Y#Ff1@#mZz_SW{IGs2@(pG@gzw%HnT{y+FZ++<8RHmwT6*WcTdv@ilw(d81oiqn zjseA5iMDdyB9`Cimvy56pD*!Gc67#x$2C~loOny;H_If07O9hpF&=n7(nf=@I^DDP z<}*77NORvnwz-znkNGt?`~8dsjU37vG5)a`l+k#PCnBqA9;_Vm@IiWo#9`i0PHuZD^Y= z@(asA%SzTz^a$+wtnGxte)!>s;!9us7FLC&coP;eD5ymy|ZL?5so&LkSmOyIHLv)%Ta?>e)>zU@iTAixhm z0mi4H1)CaPzyh1QcJGQ$e)6MCH_kWE<`&s(i@@%aPd*uY_UwsY{ncN+>ftMByL0Ex z)LwtuB$2XMHtin^7nLF0iJT?t;^9Dk!AA z_q^+_yAtS}Ciz?ERit+M$M*O3_QdBt^Qrh3|MR~>!R6w2`)(@ocJ3S`wC_8U;_P}# z)L)?A_21W*xVp#tPus>fsZ7#!ePA&;RV%!2m2v~7H4 zJJJX`1(6tyVhTxl|_-~H1z0AAIAbPq!Z)_ogSTsKk~{q zZa?VsHI6e+<_VdZN15J&;+G(+u|x-K=3QPO5A7Ae-y)v6vv@&ODoYq! z=(R_VS@~!BOK}ioFF=rno+|4HsxyF)7h)SgZqv41F-6GL`)AKa8+`a`OGor<-w{)l z`RF7qfO0|0&U<1nMy3z_r{9XmxD$((0UyKr-nw`id z&4=!f^60r}{q|R*&u64e&(d`CUO5vpk31bscN~fw-pp&{=S>Enbc`Ab^0LZ!WJ1SM z31F#)N0l-}+st@$KJ%?;nwyH!JGN)z4jH3x^hor+@@$;nvNJkQyqfYB_l=y5=B)=} z@XBjZdulX}KK{PwpP!7GXP@DEJf1)BV}zF$u&T!H)6d89b6=0X#f#B>@bTy*Ty+Ot z$z3l$8@pe7CZ<013tT%9Er0w6tepUS&8x9x*I=Bfo)1vqXc}E4yfmRc^MKc_0AUFv zK)z(nTWZ7js+*UA0QwAut!vO;&rPuK$oB#+0%GR?pfxlx_2p_G0A6iAo*C?n!pio@ z9X-LE@mCy>f5QiyGH846me_vJ+YpNZaF|1l(v^ioR$6ra6(qt4oO6OAEy%R1l*xb| zWLSV6AsLOH1w+@7|J4m7BQyZpJl7Z^ww3G58?252_$B&5a+?XcK90e~bX#*Y;hDNN zaV|!tFQRjpq~2ndDym~47AhE05H+mGfHw?m8=m|fhBR-=fMw zYvf&`OL*xu^#~|NzL=A|wC6J5j&GoCaSwrSr0|4_ofxWcX z9IzFhWiOVM({)x~ZS32ZM6n0r^YMUl@*8PaTir z=dZ*>z9ZWA?ukCqaBbn!jWMB~n(7#AFQX{wHwwIyb;hf@kHq*h07*naRE&n^G4Ivf-V+1&KNjb|_D4KfV^fD_210`r@zXOn==!8%Q# zt%1%)a|5u%vpexmoOc}RFi|0?y9O0W7sUK4-RT9?#r2eNTP*^XmhcEqZol*|L0nZ> z7`POe(|w=L?Ip&5`x+dmuS<0?Z>p2ZA^~z7ukR-2&jdbmCyhHCyY^<=WFK*jP2ciZ zX`I=PO!uUhusXLS`w;4xM#i$Cm#Ig+SBW{f8*lz**Bps#{r4PhkJDQ9IV>KGrNNO^7y1Kr=(6F>j6pNjwCpPr6q zpL;3Z|C2w4kkT8oSh+VPG}MbSrZm+HL!~fi{#^6-s+{q;ljX6(CFj%q5Ml&`4<0;_ zav>i*eiG~8i1)wuC*tk{`{H}A97WNdDa&oUOr4Ny5{^%VjuM>@HMGK^bsg( z{XAL{j%Tqh{LH6+D!%jWzepC#k3aHYymssa0PrlpuJ+OhyeMoG@MO#r zy`aAgW(q9@^IZg3_r1t0W+3)Dg0I3C?@C%CI4o0M0kxfwXeI7z_7kl&Q_h(Bvm|;a z?mfLX@9n#k(N*bc8=xFKydZg7%+D>RoGf+5)pvDUZuVUTwZ_(w-~HX+O+e|DD_7!9a@5xWSHV*OUFSkU z-lPoRI*$t?>#ZwD>tVLfqApFW++SWaNqb9(bypT=1iE?h|0mr-;# zqs-jBdv^kTT??F_^&qz1`t=sJ?azGYndA{HxU8Z>0N65?HOHmjw$r@7AN$zHlBcoP z-Kv{B#YaE#f%vz-_Ukb+I+kdCtG4w=-7a~W54`t@I6w$!jo-3Oj*ZQ)jh~x-q*L`j z^|hO>_5*BhUI_hK>a%`dx3OO(2jTDh+E)qVIir8Y!<%oq#;#ZIf2mzpi&_Y8 z493PU|2LnD$KJK|y4&1r$M(qcZNA6r%VxLF#h?D+U&MF6`U*T1Awenhdb-rx_4?~K z?}J|uLU=VEdN=t>|LadPzElQoF7al+>x6jS1vEq+vVQhvHPp|)?&|A`>xuQD4?GqB z&*#4wW8>4jkBsNLuF!3>Lr%<{9kJSP4?!ue5**^SVmKq}w+>IQ7g94IQ!{+?IzTX! zbL2r_mgrcO733Ep_9zn->A2!9Yg2@T-JXk{>B~`h>DlNT9gem3S5T;v%X4uuS}+R8 z?bsdd^owS4aF$exZzV4~Ay&74{g0xEd@z6LZE^9zNAWJq#lR7O)lu^Hj-QY5j=?CI zSNFwd<7~AMcbtAH`b+ciEZXnh*|C^-?MN&=@{TzD(A)7`o#NU*k8SVxK&;M=XL8hg zKN4eK`f}ViI}&Rb&P8otN1T1%XW}BpNkfEHANZI5B#IY@0oVvP zV66*)?NGN^MC8aNn*(?g^j$}WTyFu~Zq4MxRb*hNk9;?>P#I8$aL~CNo@2wbb)J5L ztarO^%7WYPc`(}hw;Pq)xEzMC5SH|T1m(8K9PxSjD^1WLV*VpI+ z>&y*ZH17`j!U}nL=axvTgf4&{k>-Nr?MMYH@MX5wncIBCEy&|V#!j9-CbedmGfMQI zb^xZ`7$`hWWQ*NAkDkD3UG!SoXS6SMEmV{8Qm><{snr0uMDEbtP&MEmDMv7nHxzma zLkR(|Il|-4U{o>ATriDCeFgfrms=8;H$y1+VfapY%lW1Gn1q))arP`x5O{wBJK<+{ z6IG-q`nvFrCTDq#o9Gp98Y!P>Exj{U{~Y&y`SSRmJc-#ihqCCHdIvqhZF_q6Jb%x@ z2jcSc--y+PIj+rUOAWW(CRz0U<#qFZl{Fxf#H7FZZe8=!#tF|!V7a_p4if_aT%8>< z;N7G23B1bH*a*I^(s$&QeNC%`KQ8Iz&AX;{93;>gkym|<{OIc#&E%PT3&;oN<~F== zwX{rVWn<^r78O@z^iRx-c^xp&t+7G~`sxwv`%Rv=)a#hG9rkzGigYRc+cqRGWb5bo zl#kK?Ox=g`tSLG2vpd%G#9h@$m36j2pYO(awH>f_o^?;XVg@!#4=SZ%)0e5|GUv7D zof}LmS6Mdo*-EsmyKe9tjK$=@L3>ZYOB>}m z`$4^&$Fg%?ug;Xm@tM4DV{1_0EvA6OxUn@T(4atr0u2iM4WfX|cPrkvG9y(K5;X(_ zf5Ypg93ToWiQ%GL@+O7PY=U8h)k;jDOuol6W+nqA6-KN#1I1)FVR*Ps0nQwC=B+6< zAyBZd0>SXmE6dg7AzTkPtnlJL>xI9Hqp!Y-vYXsgD5={}G`!=<$5JlZ3nMUYFlEhJ zf7@36xp{2{Lh}m?Mnk#eVb)ahBuiSDx!HxK#Bj<&X}v7NC6oKu!w%Cx>$z(y!$LQH+J=7v@pw8L=V*Yb~!wvGsVppswfrI2Bp$;>C+;4e>snw_Sb< zM(c$$Ukm!Faw)02b zCi$CAc%cuzk7y!S-8?Q{TH;36HA) zoSo9U7NwpHUAo7O?vvFf|8{k|`jhfJ+#+5Y=3`^>yjtYikBvHEi0U*^4JR0J^Sjlr zrtZ0wm>ii&;hPiBw7DG=Q|I{oHkES~6pxE@cn{XE=NXbd{F+Yi`&ILX^L47FDt*b^ zM>?e_H?J=(&G^Vi*OiNP0%$03=YgH^_~VD;_kQos5-nnD4mu^er{)FgRy`zJ>S-zQp)t4JI=iTaJJzg+uap~^XFpp-5-qE z!F%G|LyyO$E5p&>R*s%O`uEX1b|tpubmcGo6HM2CyzqjYf&~EOm6oOjlnlUL1*8@_`QaY>6U< zojKaxRxZUXAe(?0>^|KG=?S@~KnJfOH|VuiLD9W^@@$MwTqXqe{n1PNx4iVNs6P6x zID@D31fipc-}~v9A{_RfFHS{%b|xx6_LDI;U5!)4cSmK*wpa&zY5}0_nw*H~zHLz? zUvQ54I(m20e~EyE@?Q|Xz~Jj1KNr1U|1!CKdt$c#?wBEO6K&qJ2YAJ9aMCTLCVX@m2(+i;?B1_VJdHC2M$tCE1pG3yc%zB_lRDaPr7>>tzN| znjaaouxgH4zGV zn@gBq(cjSoaMKo-TJkXkC_H`fT%0}!Pqe2Ly`5czDhIIV`c?D~PK}1l9i5y3SZYrF zd==0CHd9d1K%iR63I@qb@eH)be&Up?&1Q?^3!tdiFz1Z#G4>}IXF$&6rCy6x%BdIe ze)SbKlilIzs9jmz`)EW_f;MdcOb0POc(kh+L+B~=w9F&7OC9;c)bS{n=!;ywunb_w zd?VoH8kYxw17|HKi}C}R3#U1j=bgVEV`rE(R=QX5}r}dM@j_W#f zOZ^8r@-un9+YbbG?H@WGtV8s5^mUFUfybmX<3c@O85+sJpO=IVi2gx8(y@XcRD;t3 z{Wf{V7AqJeu$rw4{@23^_*WW7b2_M5hew^;zkE%F!Ix0b&(-r^2->q*pKkQUX&Mk5!&e8tTO^trusJ z!^rKevxQ)>UbQ9C9OPN|*3iF|R?DPLAeO-N0&>_&N~4h85%f+`@_c8GPuiN^8_$*I z3)-Q>iOwfJqdH9ia`kR}ac>@)&9STO=(YY%&#?jYCS4}wyg1LX>C;orYSL4uw$tSdUDkes^l*-FI*WH8C#VF8IP~`tV~Xo>lJQRH$oKW1aDyo z^9qrKGg6>ghZ&PuQ@}_burQS+7_-M8dpL&3Me~hsJr@^IT<_VnH{IWywBFB9YBIup zYdI^gWf-KirRO2640XYVQF~&oy$uYQVq`wH4Q?T4;`aDsatgP}>>>ny>)X%A&wTdd zv2EKxoFBf(F_cCKF+NukMybYYX>DQvy>|+eBkgF5n@qb*V+lou=FswT0_QT_+?qDZ z>`|QZzL#_<^;yQY$|%d>R-l<>tY2wVrZ6#|oEOwJWROp5d6~}&!hrRcWd7M-BK(ur zXz6G^Uo9sSBT6%i2;s?EnFh$T%ea~&*<1UOq4l-2v^J-A)l2R!^BLdHn~J}6lwtOO z+jH}|?H!Hnhoyjdqs@DMyV6f<^hW^k9(wSBG>84L^!w{BKe%l$g?%=cufVGSt3d2w za>P3a8=hIvwhp-3J^^DreVua!chBNsVd!S}RZi$Z>~G5r3=AYsV}I9k4WB-JCMKIF zqqo|Ja;2OATLE7`-cL_tL1OPOxU09Y9>wPRRe4}tDr_w0H6FKpdM^tAA3uIP0m*s~ z3jpiItir@-7PtD8_PNh~Dt_{r%mc$$r8zW$2q_pH}Yh!#!l-Z;Iv-mJdsuiL!m(u9o;lw{PZV&EdKBd z-@I+dkMvk0jBEj*zU@>sx_Iv$XqVdo{w@q{16mBm(>$9tNaqJ3sIt~~h8 zm@jwY-HK<@rL!@J0)D!^lT<#f(Ka~}+s4nvk&~~);scMx66I=uJS`}`^T=uK$S0*) zQU&x6Md{^l$35iky+p3W(vFVEcM#^9oVz)^p#*?5o)s8%%qC^FM#5_Q6ep;s8AxmE zg%hzlG91fK{zQ!4^LP}#@SD-`+6yth|KS)fwZ_EIuDC+{-1Ywcr~&TA$=71(@Vn!D zUmsur_dEW4w4Xi}i(3a`?H%ul(yMK)UJo)%40tsm9c-1cQ4^TrzfK0TVIam z%V#3)9Ewx#`%uhdG_{TlGqYOirjGH& zcm)7>Wrq2(xfX+ytk&f#@19LoEPF2+nT-s^p={t{%cnJISB` zGNW7I6cg1d--3fk|4O=C#<)yWMPBA8xX?yOW9CrGDTfN43VJ!Y8r{kXyFi6~gy~*u z>HGiLd(ZB=vh+ajMZCDcMGhoLfFzi6<*r=a)j{2@V9Q$ec(j&AUY=RDXD$1Se}+H! z4`}SsSQ=}RG?FEaT57e_>R4T=E3g71KoTH85INtA=;zr7mjtU>)m5bmEE1c%xaXd; z&(8bZZ+>H`xglnUM&gzJp=1sC_(Lb~9M%c%Vig=}0pZVF5_%Tdb4x3ANocu&Aa)gc z9}mk2uza_&c<)fmkvAKsWl_)Dm%YJS)4 z*cbU-@OKiU?{gT*gfk3SOA=ibN)OQl)x{gqs^?wO4D<98a} zbS7sg0QX!242%4w%)L6l-CywNbjR;M)CSTw(oNY#j3%R=y~Gta+$&sJP^K_uJ@S^Z6qERe)RDDX1qaIHv#Nj

zpF*Tw0XSb;XGV82x(e9i*^+M8Qq z=mwsX5J+oC;+VK6k^nZfindaYG?l_u-L4lYZ<*f;gcX&tNk|IJS&OuLnK~8x*3#HD zETkRMLUSYW?i*tn`fg@=I%YWIXE|?Y5CUsy?0abk2&0%Q`DBUTMxEIlGN!^NZdSp^ z1X^+5apNC(RcI0qHkH52c$>es&cAfn);#9B^;{f|mdK}NT({Hq2z;I+uq^=oJV$@K z?(Gq{k4C_QP<%0CsoX~${}j5KLo0j*LPrMTiZNx-+*=1J6mgM>rIui_%0Ess_Mv}oNtqN=f*8U-kGs zolT45J@>YMewYyuUa?EbDkQl7lJ4Yw9qZq+V$j__0t#id(k;7ZE)(c#acfcQeXVP? z^3~1r)vH&d1E#mnwfa@StI+k4M;=M}%a+3mZp#8&?^%y|o3Wlce(X5H=EZcjWej)} zrx2X$8d^AAE<;ORVY1H_$*&;T_SvSgrSCKh4S!qq0}niq+G^c?9(?e@WG!4S)453J zK=~lQ3n%B~iQ{qd_=$MqjW-fA^e$}Tr`jaFbbR}pPbVgG3B|BGCUAt0o<0Sb4i1zs z9zh-LPKeS+ZWu3%^zgNTb(l$fW@{3k*_z6a{Z60qjV+nd8=LpN7B`cDw>52r&}KCs zs9j2_CAU|baOdR0(;VWLo6pm`UT?me3iurUh+CdMbudmG-5Y1#>SzDFr^BB^n?Ca@ z!I7m8s^1!o9W1J+n{d6#ne;XxW=h?)j0uX42r$tDjU6MnT^=vR72tpM#8T8vO-2bz zx~07cjgT0vY1Os>zK=9ZM)VXGrc;$f5$5Ifc~%IF>nZT&cUKzX0&#;6L5CDxdkJ^W zFsN1BM8MgP!T1IO)I65FHC1?afZ|esv^sPd*R}{G51ovIGovvHY`^rY|9uP$4&ow{ zm-_ZbMN?Z60a%ZW=^|c+>aGn(ZqJ@rfUeshTu&v|PP@;)8e>=r<_6Bk%+tRW)x_nk z|J(0GOZWchym}_8hprG@wI`~u9IP!gga0GcanJF;hPJqMD4XA zCC--RFMTamfA+)3z4+tUvHL*WK=^!vaaqvH6Qxr`Ke0YD9qohwlHRDUr7VQ!974$w zaplNK+|gc*c=XF5-oXg_x@-ey%LoO^mJ^x zfU=W9t!^x|pB!F`VO-kYm|Ka*32{_gi)-C$Gr*0CxQGki1*|Qr=GLP7@?wm2)WwOb z)A41_&qZjaf3>$YW_C5i1~jW1w;I~FP6631sI%S}3o*j@aGZb?lS9F+bWA*A|AN ze`GAdI$19H(EMC(C_%gy>$DjF9kSJqD zc$V-g;ScXAX4jZNC51Hh&VeQIO{we^l?xOc^Nams-Ci5(+Hb9XEy}v(SFtd76js$lEpZ`Juhv)c!-~6g}=}+ z#pT7+2O7$M6)!kns|hne4DLc9AH`YvXF2SVYJ}3dyw>PJ#Wt!)>rS57GV9BDz{|jM zd1a1;+&Mvr{LG{XXJ36ruk`NZ_!?eBVfEttBA%Bffe%wLF+Gps1%hnqU|S{_;X5vW zN0$YizARh?6~|8=-zvb*FmqIq=rVIlqm`5Nl^>Jyz4bb4bM~zKJp1+?s^bqsl$073 zLT{(-5%@eu;MS`CJX>)O)y+1~fXdcB3E&cF&Tih!^Pc-#UnyU|U*0?2|Db#C$LPP) zJJy}w9|yTnD-&QMi>X61VJ!d%NeKeD6du z#9br=)XanG0ZAf86HE~iIR%F)35r0Dz#F*`Q6V2p1(BIVNH8Y~R3%OnAc|y(0*R<5 zH!@s{eo6GzP^T8T3Mi8XFNmWA#VSN~5roWUNX#WS(|oUk972#`ZyhD99m*VKuR&%E+?_QiYhCiTcHB$%T;Ex_JrY%huPy zBzf$yN8=Cv{U0YJ@4&vkc<|Km_&@&7cjAQ?Ux{D;*0020{q6VQv8eM%oDRxJvA-Y~ z?Sw?5M5r)M;g0bY6T-)MWR}9*r!BffBFqp&N!^rD{wq=~@+g69yZo12+90?UhpuA0 zb;ToM%y2uTsn5>GD#Ws`fGljCLewlZp0RaR(5^%@FfnRCFRzKPQc*(oZMSpAGuoRW z@vMtv1w%O?_qyWI0(_Zu!KRCO2;N#;2Q@$t*AXX70q}j97(ZR%-D`;*9!;!=I@Xd7 zzIAYYrzFycqo*jblq8O}(?=Wu_U#7nssbgGv~fS;>tE#T!tu_|j`+%#pZ!8~L%dhv zs)AMFrN6cIRUoXZeqpE9zzSIv{3_7Z9kYb`4lSGLuYz5zfE5b+j?db$g7VsDo)zZv zJU5i{5ZE9fL_)I~v0%om>tzT>3JuvzG*4kH#V%z8Yw!!>9v&=Iv2Ne_>&)9O$ zo;{l^nQh1E)2EZmYWtON^iOCzTlV|W4F8ykw~rki?Zh^II$nGI^?yuJU&wdGf4e$b zvcOvId9b8o%Ab2T64uK3FS6MLem&G^`NDzjYoFE6c#z@@p3 z_@A6TEY}ZAJ{DEF`E50KNLeu(v3uXnIQ8fe_6s-`YxlO45ZldrRt#=sD(A}fjlX~u zrH$Crx08n;Zt0HLoF{9RHqo!mUw8V-TC|z_P8mM%o^O}yx>H8iPxp@YckWk{A;@0CaUU=2v1AnLs8puOv*9puo|ww>Y7837_7MLZbRXU@ygHOL4z@E zqD>RDcPZZ#ojlL)elW&f`d%y*D&lHiAsQCg&(JB=a|p=Yhf4L?<3*$zvnU@=K*&}R zBdCd|N;;}=<-OX#j+SNu4r~xFSOM_*OfhhFn)XY+wm`_8x|l)eE{wUa66bGSp)or8 zj?j0Nx1pf{YOWOpvqC-BqC!Hp1aWH-00U&CW1;GK!$T_*sK{23X^>*wvZo+d6I^#p zHG);aTFX*)0w5Qf6rqamn#q59+)9?hJZBa)+@{`2ghrHK)gIS}*5llD6y^}<)H%>3cBOQ#Pn<|BQvd5X? zw)FNYa9|#5eBZBQk7$vv5LViKiSblve+kb4Q&=*N&rZcpUq2IP&RvMAp1sj_@)2;= z#>la8+vu0>+I7h+kEE8NGwv{qlEi!QC|jW)vPi0#AO&h3Z8}O5e^dO4gGlRxXVy>YIcC9jiFJ$dDCuqMD)b0~O}fFJi`Quv50p5$CGVtgDa zrZCveZtKm~tcN&F-n(QRzhcaUWX)Oe^_Ftc>ipd!8~l3DZYQ_ta*}x88KPl1Cx6 z0%l7||M^`3P!O)CcDq6>hjm)L!Wml26M0Qo*Qq(mhWz+GCk@2wBMiu%XE|9 zCi7(1zUSOpAMNM!zW9I2wf$#%1U~%{xZmi9Pjy5+JQH9BU~Nqb1++X%0G2z z+<*WISKcq(RvrLFAY}4>vIIl2liVTz+yyV?a(PT%pd+c8!$X**wO#`5DQ9|=l>;!Y zq`j6c0%03()+?kExY5oeXyP@W->fGq=C;3E`;^*A`ANf2zz#69zvXeb?ZxdM_v{F` z4qS(ie(A}$+}|I=*9KXvw+_;Kw&R~t$7IAwXe2k!Y-?eT?s<$oBED1!h9v$W65}&} z$OzCHH6c_IF8t>fABcd2Oo`l!toSH{SLUw)Q>ldru^a`nYT9l03ct zbca@h3pNRqdZ?^k+#^-&Xo`RSFMfx-z$r8ZB?5CGNmoX%$A9{d{~@Na{#7`wt7r+U z6^No5Gy^w?dzD}Yl#P~BNi&kR2s?D84BiS1$=a`V@RLtJfG~3@&cAz}*m@0E0uRSO z{U^T}J^S{?n{SL!X+&8$3aWW8DdjGvWTALH~}Kw!hZ?uBwVJiqPXS)I#WM&Qip=( z9D;3;W`*nF~%ZVd2o?zbjvE#ffixPvF> zxW3H8Y%Olh_1RuqzoJxQa2ca&iM9QCx9NjNzH&Hw7x;$QvW|AsRSH5JD4eo3yA zCm%ma2#j6e2%P6BZSB86Tj;m--e$I6_!0-$n#AZnW_mBcrC`@Hq2l7V|EF((_iQ%n zV;1jgLiHRmILmbG2NhNBNg9d|$e1;IHNNp%PsUe%{b_JF#)NkNVxmK7u z1i0L<|LRlm|NP-!0(T$)wm!bSsC(}hb6f1l#eU#+BLX1fX*NSAXi-#44ABjk(F%+5 zEL>eIZb<}%$@?yMm;oWF{>nAaf8|s>)568mSej_U1 zeJf&YA{L(AkNa8~*5ddzxUYUYa!8)?dym8nOmb=D5>|qhM@~fTkN>}Dq~h@(hP zNEg!6L@*h?p@9%E@#0%iJ#aDRyL)4{t_3UN8?oB8H*#3@c2ItO_pvB3CRNZAE3F*} zpYZ%Nk-1G?gAOsI%&hJ{uMR|>vvc+*e;I9yW6?af6!l|+(Y|+o+<+#lfTpX48Nb0C z%^f-%D<@B-7{(0<;p%8t^XzyOiDz6oc!K$yjsuTB6a5oYadG%eT$29WQ61-txV4?c z?I&xUDWG4~(F4J?Fkg%XZY%*ub&uVE5PVu`SR2Z(0|@L_P{5)O6}swPTqB+_!bQ%> zQ6|2kqa`YF!<_)zy|+u=w@1R>E`+~@X54y9qp}AW=0y8Kc_;cc30OrZyw4mZj|jl2 zEWctX#*cqcuB;1iDzYxHhf=&}=whT>2>GE+xu>uy341IKy4HWv%&-vB-nDG4Yz5iA zs_>cVimpO!4DH?#Q=?1q+STj06US=4VmZ1|yzA}hi_?dWL>=YL;1arMKUQ$NP9ZsH zUpN&AqENo3&OCGNURbBX722`^0Bt~$zwbb0^BU^yB^L18tQiHX%k*ywTH3hT^(Yc7 zv#yrmqe!#wRbY<9Pku``iXWX_HCQVHYrtKK2y~6Ts>|FJgu#p8mPIVxbKrjk6er{d ztWaNxHagA=ODn|pEuz=~?l`HH;#3TdjYsvNQ&?r60w+Yc>Y)d}*rf~z%Y?Lyb{adr zW!mfF*~#;-=ZHKKh3C2ew&R9dsAn7mcdP6b1@X>MJANh z4ZCen2_nfHsDlN7Zj5{=^1%O6Xj^R?SVLT9-@a#?ZI|msKue{@rB~RR`k>W_&r{n| z^HU$)!}6Y1dNNE z)t`;AzwN90%NX>Ibvci8S9y+o*E#aLTu%0GxtvsF`r~`<4L=M!`MvGjd5<+j*FfXa z^{uzIueL|vvmF7?lI`?KjQ|@vFSDq3A3zIWNVx)tB5rxca9OedVqnS<9DQHkK^Qqx z#P}K_UxE(l*=>IS9F48bFrW4&=G2ud7a{o2rcCt|qNf*EDf6>2Ja{!7B!#9%+@JQr z%o>l8Vaf&SbfZ3=nPBLiq(^M)d6Ii@__GVpf3wkhU7)M7JZ&&8L``Ss&NLRbrEuKV35^j=3B1WxVF_H{1$t;G=mzdb;ChyT5VOREnKmzV0 z#F2c^Sc$ok2N|txfY5=EYCuc20nKdV@9t`?i^ukN#Qxk;oI1QGUj5!*#KJiH9wc;j z4p<1>>#JXjw%(SwI=&F&#&`m8RH(fKab)}|`4tLYwP;lUS_9lk$QSLBfHNkYNS2nY z&p-EM{QdWToR~BRclE`QW5;5e_#gXvcg4jE1M%wXZ^XC0@zr?q%sXhrRwoNd#iAnU z>rh!0)8){_uw-eGh%i7f^*%bdnqIH=Iou`XK?r+Xl(ImSn! ztO8tP2Rl)j`)CnxV5sFFEH-wK8k{1xx`lS^MWnS-<5z0WI#$3{SV{}qEk~r<$>NH7 zv$p91dWGvb+}RmJSmqR?np(dBv5=L|++ihA!j;|ql_bct{$<=4k$WSdSV4cj&RW_} zm;RU~W)HJ7)_!Ka?cmv0AwnJ^pZe)dthp(^r(DV@*Qfu-da@Q}b$N}9Aqk}q@bDTp zUgNjB4<0<2gsj3yEpD~4Rj}LA(vr?S zg{+=0TJI`o^(-`>aeuYK)rwf5tFTjHtpa0X`TBj~!i8j!>)80){O0u|oHl>?ySKMD zF-y!RUVeE74-hONDH?uL9hb zd#fbIQQ1&7`i+P^U%@Tq)W46vSyX* z*=(M;+3m^S;F>7X_3UYn2cI~}Z;;Sb+LoM~{k*;Zx1QfVuGCVlCbjccKCAaus+BU! z`_=c;E4-MkgUyVauUei;g$Md}#lb_pxPiV%pYI7so3`?zZb`U_V;o8 z+1eQBIZR&}sT!>IIjd@>aQR$l!R1{CvJTX z9D9{9UqQ*KVrOrxO$^7{zP>2cW8DZX*?{1838B=6g0|~dqt_8Z?R#&N+ABhDr$eG$BZg`ns6I;CLGt%XH-71XL2?mt5mEg=}HMzW;Ou?sw{t8yhK zsJleoCHAR(#8we?5!%P*X{MhC8;QdWEDqw%h=R1r>JqzHeSX`x}Z`>dslJ;4N^?O_eWxRfWK$LJ@<~u zv)i-UG2@pbw29L>;67*J`^|n^V=P^xX?)4(c`tuQ0X`X7E36jg%k#=|lNB)I>)h(f z-+QTA-pj1H)6!sGD3><)Pz=It=L9GBmAObs#)7zmE?2U$4A)d7g2rfgNt$)jXxjFufed?QiB5x+xz4fm598~kj_w#3x{cvG@ zK66OQb^EOVTXbNZJ~9ME_{GL~jHuz$ci>1IKlyO-wLd*Q5fccKg)#~b4jw*{ zfRadraWM`aJ|0Joo{pDa{9yu`)gUwn4@Jg&~0^I$HJ;*EPV5u4dxg zbQPj;t%-NmqoEot@I1r`_0`kfjzU`^6c->m_qOKa-Qn37npH%(ffipWA$!TKGDxJB z!Br3(%eZ8d>1M0=N{FDs)Q28CmWJ{rta}x*P9a>rbg@4!T^fjM#L^O0z4+2=@y+MI z5~ofb!+qv?;)Wpj1nEw~RvXQDWC}aIMc{7>--69Otx%M-1Fy{}L<6ZA5kaF7(v zO04mf+UVGeXey*u8`75)An2{ZXO`hd%Y)<+h_S5#xfg+4#`?JiMpdc@M#*wX!k2uT zbEcbY+2ziM2&*k}?uF6jp$G_T+}=>O#JEft1quqj*JOM!hvqBbmb;;$9(bO?ZHl;0 z68%pCU`O~~NHQ}v;sA^GVb;J8SpcuICS+ig*O|SnR#@Bh4!m`FOWD(+vkLD331@zU73IhDzf3SK5hKFvW=f?qa>Jh zef&+7X}(Cwv+lX)o{MjM;~Vka?|wH4ZWXW^kJnUo=d6|RFfruC;}yIrG*$?##jOHb zg~AGeeeSn{UIoZn4f|1`yMO=wWEm{H*FxBQ3YHx^%eE}vvpfZ#3a3rx^HUZ|`~JJ{ zz8n4h{Ye01ES$WVw&vY>|7M0eUu?}>6Y-$iVR?K0e2)?W< z-BH^OHdKifAv8&etyzy-Ny9v}@VpmmNnJ+wK>OrxjKm5;shQRtxV=0Z?Z9@G4i;CI zV)5{im|LrjvF7Jv?%Gf^{`9-iGdCFnC!damL&q{<4do>Pf*#?(adKELuFuaz1(h~k z>5sne{Ykt`jN-|MACGl}NY&Gmv9W+~l(x(xq#k+xTd~%=Ckj9MgQ)CoiQ)anqHcUL zCLVew=Eet-AVCG%RV<&RHH-tfOgvNtKf2zOW@wn7ilOR4%p7?nwQFo_78lAj$$Iwc zi6`SQYqI{G*Q4dJZ^t5GF6MZz4q9Y`Hf!~$@T?n`(HE{=#Z&frOn&(*v9h-#Dm#uL zuzNXb`dO1mi0goNE1f%{3eR5^XMP$R@UH+USOgcNmN>sECFjq-jazAqcE|B_F+3Ir zv9O*$_EemD@ad?0^Ofiyx)K}vnxfbSZB(2`QYYN3jZ4h=GW5&>o{au#xjIg>!w4f4 zmS&JoWpe3WV`ysGt!rk%yX!~Z!cvO+39iDr=w^>~K|5+mXx!yx_E=rbYRn*96?dPP z?nKE#u7glj-hpdx9o$Bm)T2vbPAzp8!KYGGBlcn~bcu>BE38=bgmB-i&?`sX;7*`6 zHSKlLRL#0+LKusJhXOQd=XyMT^`am!zd(qM`8gDt5eA8;QIF?I3CmnvL{~x=xt|qk zX<@j|{=k!b?13M$%$i!SgfE4Vb{0HpjRn$4OLDy53f;T|CHFjD%}OY2%|kEe>Y2mPrwPRqY3m~8m*5R7(|?7px{$v%J`tDkekSfWeB~-}O2=aXp;i9W zqY2M69FNCA5~4Bs!WDT4nSwaY6ISuhdGSm%j&cq`l4HCK9FkijA4B{UaF_PF^j+dO za8LY$p-qCr#7m)k-F{Obd;`XY`Lu5N6xL!&92cjOJ^(?1S(HoO3WRj|-b1l;eUSUs za(^U+oE$qYF7S1YD;P7b)0i_pD&9NdCWicGa$en2o<9}Lk#mxGM6AUs)|f-=*jJG$ zn?Jo5-~yZ&*YZpi1iLuQ?z-I3{qcxkJZ4^ zcwaOkc_?Izvss`umMe7QnM1gSaNTR?OdeV}S*nI6ZV>mI<@(%w(q*Qb^UQr|y7K$> zJ>!@1uH(Y~NbPh|DcAZO5mVY5E~o$iKmbWZK~#1>yC>cTE7vUBX?p}dml3#+NQcj6 zeBJBJc1y(Z~sAD>s}ACYf)O^D0>^IyzW14wd*HSRz|F*^zeFU` zI^+7b=lm|O*PHKbU)*s762M+2MimIinphhXBtg;(&dumtR?j?wYy z7`~1*7X(@zjP@GZJu@|jTg@}^?Qc9EXNk1~|BSxdW3(z00!)-4h(-~6V+m0_No3fu zkT?cm0UK$hHDT4=Mb_IfT4R<(p!g15x)&iQ-5(jk< z?=peZ{#C%PCkn^RvhJHC;hxs}-Q44}0BIm|{@&yxZkKcTL-OP>H|n`N#3qrf0TN^x z`Ky5V5YLbCxxrNbDT}|K`@#~-G3TeBgz&g%qoO>OHuI~MJ+YtPyJq%@B*)Eg6<>Pn1pB8sJI`+xerH&>b=J0y&(`}l zi};Wi;!y8Rx81t!higkkhdlTl@ef7tHq$MfA$wtK`^tH4{|29_<*b5n`HM*?>Ob%x zh9ZIf%}kDrjBnAOt@q1iWLPeEmCVwrS_BE3p%D}2~Pa-@&72L-=%pOBjf*8()XVt_-3D&BI6ymloPJG*1(^dnK6 zACBvkb+EH5a&Hg=d45`gDOU5%QRv&rUVoxV-p)332T=7k&OYcwBG0=cgBhteHLfs3LeTli= zunuN*9eTC$P)pRlRgC3HTobpWRD7J^Crh~Og+7hBQq*@b=Ti}jXRc@TKzXmdQQaq3bWvU!g*Yw&@aj4MpJ=_G=RvX;~~` zRVck*O@A;-PKGZfEPsXF-mjxgO;{u^0SnOEPKx4-;EXfigyZ0I6La&pfL@IA7cRzy zcg`dHu8HQyz7(B%_NFnYqu(3!C-KP`sddI6jabI4NOP4=N$Sh^WeT`lxU6|#Np@~2 zoMJC+{*%W5+kyEY8`nNrhDV^6F!>P~Eu75@O}@!nLC+jZZ0qM;=B7lS6*@C)Nr;Tz zN7VEjh{`v9l6X;0}FU&xgA2@9ZtonhB>ah@Y)eI5I+7I);v-}O@i+^(V=LkkFN z^@NdKD+ng9xRJtS^O3(or3lu5Le!K`VJnNo_q0Y{!xC71za*$e$sj|fyutd^JDuy) zpYpbh{mXht$|D$iY*6L~aqaN|56_O!0kpfRu>l2$Nd&YSrcfRwo1|M@I%&ALUS=N^ z4HsvD@TE4Wq{g`J+^1nwLW>v!d2*{*5UW9=RsR}VA|=jB%Xb}9N#d_rE|;mT3V%Hh z70{;gH|saM<1f!d*XqIzTbOumJ|y|PJeOO4r-%Hp9{%#}J~6+1wd`s3+iMy^O677h zg)4E7mouiP+kdu4;IkWnJ5ghwUG4X1O#+Mgx#_reb$|n-I(ByV5_7Q;_yquya{LfU z0=pe6g{DGtoH_F<@xb;X4DOAy@4f-U1Pee;imM2E_wL<~fc5~|G9a`dAQ#S`NkRbI z@X-?o5bx>s%Q_a(rb~<{1lcLZ1&D*%UMmm_SFiLZ;X>d3!$|;qZSXQ0-m@Gg0%-vt zKv!T6<7{zp0oQmFNvo&O0K(-#w+ReCdK&ZTx3=bSfN4StV86BSAljwNP_|~rn;L+8xaH$+zKQJ zB!{?2Yak~{GZ$o~3OFOeqbnx&eht>PA|`c9YtdM!ixymEbrEQ4M>{U(cQr?QGe{|j zV@)1c%DDY9K8VDGF>#ZHEC^N}?do-`gX=1ATL%1VY9tm;Z4&E%FshxG2`}r=evJuY zXhBFe5kI&Ct73()XNRY01BfA@M5~ij{t9l?(A1TH6A72$vbSeQo1}beB{_xyDp1KRN z|F(@r@V&tt6(L~jK=2#UqOPN#Ex1OTKr2~mvil(kUqt>LB_Yt~k*qZ>m(9wzw!&*x zo2!byoWonLxlAeTRjwp}^6cAm&XT>E%rm?pPiB+FvH6BD0R;SjQv0r*=E5 zf`40EaPyT<;bJ3pQr7{h+sCJ!`VpnkwsqPS@hbaoZ1cK>JtwI=@6!FOn)i`=ES|*P zl{j`1?t>)J{N*n{lZ2OFD590=5mxTOvyCp7fBMs(CZUM}TKl2URu{_(e~rtluvP)^ z=;&xt!10;z)c&i`Sr!U=UdqV%*0+d}$}`K+s`$r0{&6ZpxLU45MIMFFmVfQqwX|9k zIvdB=@=XeQCnqPy zEH||@Md7vAqDl==kdv+(SEF`r9GA@tv1j&rj5h9!^HT^MnHQ~4=h0Zr9X%O6S1(5G zz_|#N;p?xD#O@_R2Efo)_~hQIICLbYTf1ZAfu~{$T4~~lR^6{h9&4!%tY;T?_eJ4w zA8mwb4-HYxxlr}ynV7)?+qILA$HqHvBB&|F7y`Ia8rA{=s2kTcctL9@l`7m@hM}%^ zq#S~Qb)HXPVmS)_|8{*Ra7YKh;96MM77-3FK|8&(i~`ibhog#kisFbB@PejsEuGtU zFiOyW>ztc8&PQV{&+b1FV?0~9F~ymR5E%hj9W>4YaZM-d3s?~AO^WgE*^ht#>th+@ z2;(b}7N`hZ{p8cJvgbrxp%Jrx`bSYSIu@<(V#&Yn3FutB(Gef{p*;^XzYTGI=^|1m z#;i#Hu-L9@S&N;Viwm5e8&i5?LBRxJvM!+Odk~tOn~POq$TqcBV(GaQr?1RK{h=MP z*ta8^bBI3?J{xCpb<-99*8O)cUJEf>G32Pks@pJZ3SZYju-BLitq9dzR(vId5#Uur zQ$mF!JVf!0n^jl>PvfC$5&?Tf1D^kw|7zy2wXOoC@LU{j%Et`bV+0}R5__PY=ax4M zEse2uOtQ9A?q1}#=YLkV`v64%gssN%6`yLQEeW<$_iRf|OkkaxW8I9h2Hq((5p#MZ z`mhMs(%81^0@=Qa2^kWq5q<+?4t1jtfnaNLirCfc9r*#3JWx=YEGx0FZ>~dV3^~8d zd7P(_Rk)F!uBeMCJo^+luXo^LJkLfgvY(gXd!|0qucYh;U$cnPM3HX|dRj1gnPsod zQ(&g(gpkZrjlHWuOdb1SVPG+a1_rTkMp*p71F;unl2!!S6^V}kABMeRyBVQGw|VR= zgX877?|d*s449Ue%o};cLCuq6+{ngn{;+TCD;MdR&w0Z8@Em;3JC6BHB`z|EA7|F9 z0wu5r_OPr2=YeGbT?uc6?;>NZ+UpW9xY)fPm-$VxK0BGpOx4`Of7}YlLObqB)F{7-Im@v=eO6te&#tVTjK07!9Azej!x|+h zNARqxP48%tE)U1J_WAV5u}--}4xrUAXCUxh&z#2KPKpm$u~$>Se6bVrpvNscpQl6VUne5xWl{`c;j`C?1I0NM?D(H4?SHr_vfmfz= z@CJQT;Jb=$ljq$kMj6sf(oiZ;FhMMTaYDwFI#hJXtZy@zm-dYh9drJ9<(#HF{Bg|6 zDcvvUrETTkr<3Zd^lnE5MlZEzrIYaKuJFfqb9`F)jg zVCbXydG_76;_)Y*ivtIb#^BX{EN+Jrk|L1$s7XMj_E>-ayKxxp)l<|bKwZSWim`ij zGc7)2@{qC)0a*FB@kRVCqA&xas{g{d=<41Tk3RlPIvnO_r(mj$K!kvND_r53A}+RF2*7HCrw@uWH6+uMl^d*EQw*th2{pTuk>Zjge(@;mp|sC+WLajdEn zVvqKl3~7)QT|A3eNHoX{cK@o`r;8M0wUm(#wKyd$)SgfKHZ@5YL81IlyAei-f~5|S z#ctvw?P_j}c8L2niJ*oW;`3c^ofMKrb%S4VaFQKDfLAgF4i+6J{z!MPIB8mo)A zX|o-Qr9gaiZw%ri0$A0F7Ao<#bPu&QHXXYlc~0&OV&g!BEur~NKdMAjdD}Q=8}vOx zp+HSpOTD{yrMSKmGR+Z2YY|N6G9;Ymx?oDyt{~S#Bct&eF@Sq}x}zWWOO|cBjl(BW zFU*y&aWKkSvDRUE83KugFT~w4M5ps$J0>QkAwto3q+L^!GdzRAL>m-}i@1vD*NV7< z#OL8O)iHh|=Z%bKHQ#C`PY|p4`Z(_QiLs|^>694XG&2x##_6rY5?aK28KPR3P3u?? zSgyph-@5G=zf9J`sQ|Sc-Af?LjBOPHbH_ow0Es-Ur7f=+0Ym}K%!zT72kg{6o*W}J zG(XR@x#Ln3oF8NNx|iG=jkK?4^NC+0+#8mz;J(MM&W2kkpxNK7%QjZ5g!%I3+zpVi zfoHAc!Ra9y{=7;)?C+C1L>=DVfH>;nJ+H?Pvg z=l93;1Y_l1Pr~(f+>V|;Wo*nZUJ^DcY}Kvv4}S22BwSS(D~#77_~glx3D-Sv;6OUV z6uxSyEB>oxuGYKe)pA#6nG8S~IDYG%*)#PzIE+al^OY-CQhtTWx|>!Ith?t&9(g2L z5-Y^DOxs}G-?6c=oAoIe_9I?o64zE3?HnkiHb(K2PvTaSeebixtjIRRO*n3Q%Bg&P zx50SF?x`mpCx-IH)Q@s|@5S%5e_EU3#EJa~ls18SxueoT%w-1MHgBfio0IA-E^qz1 zHMd#r@^8wZtgSh-=ePc5*i`oWR(V^VZ=NOIkx}O#!&7KMRc2`VUdEm_*N01%RkNDW zhrV3}PE(68uM$%uL8yv?i8<<;24AV+Svri^b29#HR>CQHPj`jM02a5X z2j4G%>~5eGyDA>OF~i!yMStBgc+V;psL&?h&N*;kr@9gWXEVavo+0=%53ELE8CUx- zlobw&f9O@I58+qmg|}iQM{L4tBT@g?e;$p*^K4pPjJ}bf80^Mkm$sB>M?G|rYq+g6 z8HM63@je$~DTe^{?KAPfxfkNx1K)_&B@{(>g6$nS8AF)UU0+5ZK%1BFR^-ChB6+-y z81P5G6pcMt%ff({>0Vh}h`0Cdk2j{qqA-qIc7(~VpM5=AcT7bEbXIP?5QQ4z+H>wq zV*RMw&N&qGCq}R0xoslq5YSFfj>gE5GkB`(hdX zS6+hwguNx&7*BmIs=oX0V$Z-kaS0dCl?V&8RBp&u#T0_EGduQ0oO(Q(zyF_OAD-u0 z`W}xNXrEfFPNlJ$a-Nl~F2DE8h&MJ{?!TJOW_nP>MR zFhT*7IA0|e{w1u8XAmsU0t57>r3Labf~*DbMTQC910KnMQ3Zs%@=aFf;c3jxBv;i* zNgNCJ=6wgEUN2mXrRTDOE4_p`4xWA1D^J3+!TEA-JO}-F7RcxE6iR;;?oy7NnKfXQ zLR-C!RbwH)%3Q27KN?uqYn{nGX{wYdoorfP^Md>ptDyoSKcq9obJVKSdCS9U=*=Sc zJgbf4T8$NO>FsgaLE-m!s(=@zkwMveXW|dhXTO~f*MAQrDn?N61`X7>;Gl`Ck#z*2yxms-G? zOM6)ZDNeCMV-%+J8d!mquf_-f`6Q5KQ)O_JI)taL&vo`=9aj8ZcsuIE^UXX)W#Uo} zgZ;57RChD!ksO*9OqTaN~bM z$g;^xqaw$M+NjTZDFZn~>N9uKIyXQ4@{O7_cUJ2=*V7d!KXl84l*nssJKQ!~*U?+fJxHLEHyj zCokgy=R+No0Fs8LMl6SW(4s+u2G>BG6bS%#@7{--=fPB!2h7Oul^BN**tx4W2C&ps z6Gp`2<0f6IOkl-uruY&JE8NyKw?#Wb=e>Ogqwzv>y!Ofqzf^cDQ7n+_?>|S3eY$?Hns6s0)58+#j3z@R(CW$ny zMzxe(1u+v*6aK(&2rG4IDV(D&nW7?i-}`&q718}#T@bx}aq(yWE;)C&)e+In5zDF%2E_r~);W(u zV^h(Ob@T#m*p`^1BoI&i)Flq>;*%_vX{1P{M7-mYkaXrPX?DUKn}yj^3A3kwqDB+2 zd29@~r(&b`c&d=V{T$=}I!8wQ^c%%hwAwcUc1#iiqeG7Hw=%v7K~Zpx@_CIp{MQl{ ztd&OA+fKf_+_$`wSpq|-^HgiuSr*JN&szDt6XK^xE>|*MkK!ozP@Kj69d%P?55Hw7 zEV1{esdvUUF#ql3!SNvsiHyjxoj9A1A@Wc1+9eN^`+}`=gy^P3VjC#2GYH~d-ukn zLx+-Z*K%bbC}@@$VVznLo7Z^6w#o8+W;^_C`t9HT?PSgDvoZrBJ@^9saV%~7bI(2< zzyELk@C(%PkJnVsA@K3+k$z4g%{vTtmH(A!G7;}0^6OC5i7U+mc3 zoU946e48cs^ERvzpajTX zJ8-OrXB;4P^2>9(@&m?|M%bh6>oV4-Q&r%2CgogbzN4J#9|QA z)*ui>(4rM^p82mr2rGkp74x8Zkf2I%YJJ>jg}5&MtC$#k8n3cU9o~*mzO24F6Gapu zYat>EGZQflU8)<@n(1-k$?lBKvCGjgJ{EIL?J@h%Q!!ctPv+W{*l}h&>Nf08uS9O>N-Ujx3fwG*!ev|J37xffqaix6qMS#NJB(Z6x$C1e zOhEzosn)1myASwEIMM{6a&F8H$N8UpCyJv7;*D2dj`_iU6lU?9bo}Xf;cvbd)%&}m zm36ysX*?dlI&8eE7+24~5KUOQj>3l-nE3~khv#C?qmL4=buMne$5|qrSo5#{ij%*EJobc*u{d~&QR8mds*@9K@o+)C`qU5L5C`Z)W_52O8wXJQf|*2`z# zj2okjHMm*@O`l-gW-&%sX=o#EF?16{yuv)Kbaa9ILJ$4u@1kNq@wE}+X`!}QfuI_? zr>bEQ3(uN30G(Kk5kt%M{E#(x3LtX0La##rtfH}dNWOuxM!+x74xAf)A|f0HA;a~>+=Zoe(vj{b1i3p}fYXe% zFDmfV3oEaooFM(l8pa~l>l}2ac)MP~>fNi*`kk)lidyInym0g0;6f?Rv&f}A^E5)i zsMk`z^XyOlr@D6#W7s&K8!Rv_*oSNK@po6RVtG3odvqDH6p*Vs2ao(?oJ|9E5AWxqC(BD0{fG!F@ z5L6deP-aIFqqxMnox1_)cfTvhD72Hepuz%P*hQsm5=#{KgYxZe2e z4B@Fp7$}5t2)Jf&Jzd{`H9ccvc&Y3xR8Xr38zpYWgyBmkk@y3{k**znMk5IkwF*`+ zsp9z>?>V;&FY{$??(su`mcpnsv+!!xAqG`)*CqTaqAw*NvXhYRS6+AEnfTSAa7wWJE1B-pffIS>mZM9tv5cq_b2la^-Qk#)|E)y$>G1arIs zZ%^+HGfVSPn1lBOzpQ}pw}22><^Fnjt_>(^H zG$8oxfX=!Oom6BmrM^(U-88v=6^`pJx>jK|Wk^?v#?^M=-F$uZ(_k4yCy=&lJ|}eaAAT^b&K)`&((N^0j%B;GE3v z1wYlmDm=^zXG!Mb`WD>FhD`K%X1(J9L3SSYY)gQu1IhhboBV?1R$2M z#NE~16YqjZFXDR0cRVn((ABC|X4Wr&5-RfWZfR}Dk_^HJ04~5%bIrqJE9BvJ(tbXC z{8S=@jWIk(KU%P0{_^wRLKv(SCxG4#Z9=RJmfa4%HUMpKwJw!mBWfyODeU8 z3wg9>aqpaOS^Z4Q8G9XKZp)dftAh%s#*9=?%~Yn2ET z(yoE%IYz=!1>2RhVTFE*6l%G9eGE-i8^RhDnb&oU$a$p*BDYmX1Y(mW~b zUZ>q6gc~5Ps}Pn=Akkf?cE?HFlD$1R9WS0a8zVPnQarOJlz?g=vYJ8OPwwxIR@`j8 z-aiz7{iC;IY-S!p0EP%~f2|0zO1su*OByfASD4`#GaLy~UPG9#wM-p(Dqw;sd|L!D zuMy#R&9E*zSa*FaNVTm8`Cj1r9nQ{2SaSug`&g$( zAsiN&n`YjvBY*0_=6aQI(1KV^;39eWpKnUU-sjtd&!Tn- z>O)5k-XwlMi#k8)IuxXKcXy|cmb4}lX9ctp z|KjDsSI-*9MFFlBy5^~1k6gHLA(e9#CS`ALFIJx?QoLXV!U~9G7MZuqI8f-TFxTJK zZ5wvtLB+Z)&rjLC*)z{P6TkLrzm}b!yi;aIe9~j}S(UeIH|JVgYocAg=zaO1F-!aB z;2!1~jEi~x#dJFj^^4End&e?74Yt0w_4>W}f64DVyy|+aMic3u{Ey#EFKY<`nBGjT zOOT5M|6s1&Y{xJ5Exkfs&tJ$#QYrq~zx;3b=825`^tQ};@KAowT*@N`ma77U;p-#7M{);3lNXXeo!c9%m*j)X1T2kr1#E4 zn`OIIl*RgaU(}*p?|WY?7x8}gvtr->DOED|yLNR#3p6EM|6bldjusG-kbkTrxK;&Y z53(LBvDj0{lS4t(_|G*65v!RCBHcv&!Wcp-JQ~f6M+s}btXT8jA_MMA@_#?b|67Z~iuF16T;I#yBpS$FNkrf<@l~ikt_} zzD!)=+Q{Pub_c@E#wTmy;DwiC8hmW=I`wz;#00{}IcSFEoxL&g=<`?{gX`fDYZR;D z>(`0%3oWPDphROpcc{c56IsPqg)NJ;>E-YKSq!}N5AoIuKf>UO^Mgjd@^^n5k0I4w znO{VpHpiJnIG0J4?ABru3&m;rJ&a4_zyi2<{YJDS*uGY`7_03FN(t)Qbm^_A8h9P$ zrO}ukAB=GoZF+Ieb3Gh`&5}V=}&SiZyxc!I(wRpkPW%wG#ZJ92UeXJ}%}8j7@ixdJe_X zjd`q;XQCgvbFifo%j%J+yz(}}i~^R)dPf?^OVMDoqHJ7U-^{o$BkKqh@W9kPLY(Hd z7Tg9i_pA*frXi?fd@e3TTU7&|WyYe2E76LXMO^QKFQ(4i*r?Yhh=|qhu`$Xp%RWegoK{vUmvOI=`hc zz`-SuStM&KD4|l;8uQwOfXT2@DxEv1;{Q43%}`FLt-F(;O9F2{;Q08g?W{wolf5y4 zyIA80Ctiem0oUZqmIHpZ0lm7&bt_nZeZ@+Q6N7lEaaUX~PDeZM?qdFG;6WH(N{c~7 zpz2X9!|QBnYzEh=PxQWgD7}xNBEbHJmSVl>UU`9azOSJ+o~!X^3waA5&{ zgi7dI&vvzS#PXqv7@UNsP|PUOC3p+#)UAMUU4?q;tb*U609fl{hC36;x{nxB3@{Pi z%EOU9W1g4;6<+Lj5nMD0uNdE=JQ4fsIQky*C*Q-P%CiGG9&mwP>lm!G^2EAVDis*Ui10lEDIF;hL;sedw8lOU9c8B#y#9 zaU>Idr+}FGV%Q~V)827jlQl5o-v_n+ev=goe5z5%@c&f@({f*zT|kS^v6ZI)`}#}ADPSe zR5@??+jmUm@9a7oljMS(KC<y5(VXqHJp!Nk2y6?0Kj9%4 zNGOc(P!_OoOr#o;@OQH=awPYkT|0Iq!K}9hHaBiukC$Kg0h%zi5OzIi{1@ZZmwp5R z0Hp$GJ$U$J96R|ywBvGa{_-UNhd@W5MtL3{TL4UYz#jl`K##vQPV|}o&?8S|Ko8)w zijd`npQ5b_aze4RRq&mqwG`K`3dYrbZV<~D;-RsS5tze6R{?BV<7M^wh5*<8-Uh*d zcOqg1te}q~1TGN&SSz&lw)PmiF&g7zH)zGJGP0Vt|K1BDAX9Xp{}NU#{Vt!BR0wFr z1;~?6KNmm$`780C|KvX;gyUv^S%c{?-OPXU{`SSq5fDMBC$?@A?uwck>#;25gO*}T)pg;=XWlW+x%^3@^?@1Y6yG8*N5owy%sPFj08D3cXp zZ!Lj{0VR~t;&KT@jdsjU;zs@kR#FfSOI z5ASM;!RhM|UJ`U7xgy=h^95-FrpidngQ$v(3y+LHWra255hh6xfgY#l5>YZ#!0l4~ z2}aX*fu8ucT8k!`vn#Z>1o0(YG=oT}j2RVebY;E)XGzQACXna`#(!sfTkP4@5qoxb z#!mW`N4wH-@Kaa0f@ZR7dnv`u0um$qW(*;8SJ7%Lfw&e+i?~Buj@{%h9PEm>&RvXo zlyi2X+1!eT{ooMs#U`d=oXyo>Hv2-ri=$CGCszvM>f5)Q=qGJxmNG*tU4Z?_3v?sSBwD$g9OPs1vOQ_6xQk@nhQA$$eM)ljJ+YUX@_P5fb~9 zGnaDan8!Na)1FEzb?b61PqS_nEO&6j6INmKBI}kS$ix1z4ct#cVD1&ji+xps0sN#S z1;#LZcrPhbP|hxhz&$(}phN}2A0~lUvm zUs@Q}V-i&N(t#VauNGprgaX5E^4a@(rcw8g!@Tpg|B3V#*C?%K60E?>T!1g|qFF)4sm2(0i` z3t#goKrX@1^S2hnx@uMcJU2TR2M^%}6o!Wuyq2pKuNJ>AzW8E1{P4rcRkY>nidq4% z@2RwD-Ik}oSl7|M>$&EA+o-Tv>t9_+fBoxUPw&gH@#FJy-<*^3+-$vfx6YMq)unh} z-`+TL=Iz_)io3PVAGclNB;WYjV+lv|EY6aE%2fW&e%<-+);yjJ?m_RB?|(S>1E~Cv ziE{ZbbE*;?A**fc%ee0!n*;voMi;yWJahp;l*~|>jow>KG2E)LyswXmu|)(fFdR|( zv*1baK`m6~QK}HH)9RzH4&_7Qj+$Km^$i)0WjU)@Rn1}v+17zl92TF&MVWsnB*O5_ z!EDssU;*Kk`(z1x(@`maE35RT^5A^Rt91tX9VK3V8D6x#&XRbd@c%0ZvgQUSU#p0BBr09$!z5}t2&~b_LYu9=)CR$n%7C#j|c+-e8rKmz#b_O9t zU4wL1F?Q|gi&tybV(#pVksml04aAbIz|#8il{eYv8*%c`gHegw=lMC}s7?<=` zjxNV|em)kUiE{|&>X_Tcy(kpDI){sIT!c5~IX}VC5KQN>9IZnDJ%~V1PfXL-hz$$; zXy6Q2Y5j|EW`5i~tiWXNi3f?*n}?P){;z@ufFX-o1yrG(?w;l2`7fO&tV`ViOMfSU z6xSu*EkPq!D;Q!uGH5hOJ}1IQ&Nz#34yv^z<%z<_>cFIy^q z)U)1e_)dEgq0#&Tbg_7oLM7Ijd`}#W(I)V9X%NO_iRZ>Lm6z}+9=is?#~S6^viFam zs4k2(2KX96wROrY(a&1iuW+szuZ9hH9&mkcY#4jg*`d7%iZ}2+V05fn)>bDWJM`41 zrQ!@>`~K#IpJV-uG9i4~dG0AZ->9cubPmv#Xff;Yl$X&_$ry?;yr25+Dv>U#?|Mp z6@``Sz*2cs3g6{@y8bIs2y(1Vt~<*S_sFbkDT{k)E4img&QmpO#+cR(##Ps9m+?&& zwrM{yhtSd#%_sAwXS`s~yF?qX<||NUpwX;lLWsGRn7<0wHfvs&-|`CehNo4qeA_Bw zzZ-*B{7UZ(DhJroG|x27^~3+PrZgb1AAY=_Tv7uYk^%;G*dOT_^GO}ovQKt#mKu6( zh5Fw)cXo3eP-0-*s@+qJui zT&OWO2v8Cz)pz1n1h& z6@azu;Vj9NpM&u)u&4zwSVTBGF+N6Y$?*ix1X4p+`$0Nd65^(C1MDolJcU)I?kLn4 zwR}_gTY;;V4+5U_gg*ji8G35}8JGC-z{SwISYRf7@%9_965nDHMpH+M=PH0c^Ttb| z0Jto4whr@8jzi3B9s=b$y*~>>>!lZd5W9Q!Mq7JlYR@$N8$9##)X%K~am(6H_s$5U zb?=#%oqG@#9JJZVmpbXSf~cG67q`jHN81qcDXiF9g( zx`IYrJ?_soaII8i|5c3<8y6%`t=%Q|s4=7@6j~vaI&dGYr5zhO#$lMLprJrmSFmb- zs_D51V)yRUY+T0Lv}=IaP!R0x#0IVcVa$ohfk>Tw`&v|8fDqr=5^b&Zz?s!#DZEOY zHj0MGz}gSyTM?pt3Z~yY?$%Z>k3}BDvlNG)|Pqj9XTyBe)ot#QHaK;jSv1J{;8Lcy-AI77hciwK&8DVb86C5Dn) zWEvNV{*8!8-n1?IMmZl9OUD1{_=2KJdaB(=6nHW)Ed=CQb~?wA$)_V@QEp{!c;*M_g5%-NCzy1sAR;KPRxCk^&t zTw1>J$}7nQwRH^+4yHCJ;5GiR-{WKB(Lc~1Q&Uq(=DH$JS{(e@XP-^h$lkMU z_Gc?T{*eadF39ZIH(*7#6QTT@8*kkOE&7z20C3pYW>>#JZ@mXFrgm+4DV3Ls^N$e!mXfe{)_~dH`^z8T=?R<= z&nI17JCbF`<%`3y|0s;U%Gwwi8jaoiy5fO{j>KR5r|-l=k3ARrX`Q zUKHhCyA+EEoOKObk6@>Y{qXo#PRF&Y*W%n;7t=VaSa9&<9t1{3XwkDM-2MOTz3FpY zSDL4HfZTyh>^lhV6iMwWl~hZYr=q92-Q836blWpA9>;|LEJrx}!QpVkgujjL8Mp1| zYPYMqtGi0IX{9KN;tCQ3u_qFliQJHWo^z30BuYhBr(WgU8TEWGsc*)T%=leT@VLq7KA==G0tw%5x(L6sBQlJid<(w@mxpL^)Imr3t> za=~)$mBBf$>Nw0kp4>}>mj3pmGU)W=Sh#TE+C$kNv>&bzl^M12)Jw@QeS;b!^bKyG znQJ)(*;y_9P`ucW*P-$I5jYE8wRpE1M>C_sCOpsb%n67Yz(gn-wtcK=r$c38HhhSbd+g8uZPe|1(}!c2FLIA1d`hWdS<%lZk63m4%yPUvEI$RP{aL(dCzy@$9CZx-g<96JhQVG&YdNm zFM1hQ0m@(hgOTt7u4^-_n;l}QW>9D?lmQZqqk8jQJRZFSkb5Lt!Sh=kzGthm9FD^u zWp8~LHgG{4PT)nPz7^6puLH(qLKC;XyOp&t0GQTa!(Nwu`{B@Zc<%DsVFloC?Yn;( zZlsIADbS8P*WwzGzZpZZ`TMK&@Hz^*%{5{+<1tDPQ(b`Y0sDrqP(C5&?wKRqNiY? zp1X7%O!vW8xY9UbuBvFNOK9B;Yi;PYCbGl^&%}7B@KeTP7fx=mQRz*HsM8T}B7`ZK zp`61yitdf!JLNM3dUVxnU#C%Mcdsk4-`_=P!u@Ozr8z;%XGU6pzU{EV{(g0*9)@tc z?3!O9cD72F$B{KO((~bklgFcHptcI&lqDFIXYQ(8mY+hQXT6aCD=^|R$hpMi|c5NZEaBff;WH>18qu3Gw;8@zh{F4BPjDnMt zwkKe&z%T2Bwc{M{W6X7BNpkA_tc`e1fA^^oljC{E$GOBU2;H0^iVZqlyfyj+=I^;Je7u+VoEqIiOyUEG{Z1P>T40c`B=l@+xRK^Nj0( zd%ox8c^a%C>&@mtRgqD`uQi$H&QIw;Wgqsh<6)j!`wFrqW0uU}gpMN*X0Yk}-2-yD z7!Ug}NtgV7@Z2l0zShfr}d-4}itkn@e7|1{?MNC22LRfyMLz47;-TC$tjZ-^C>Y+URuY&33JTU#69AO8NY zlg-H;bpJ5ct{;zkj6Sy&Ab)W2?fq1r{1OmYB@WE$-!8|SZfG721Wq4adjEc2T#Fjf zzH#ms8#lm9mmUz@JaEr+8v@vX)Ayd?Woeu4)iIWK_~$_Ozyot3g1ye2-bDD=JUWo= ze}av2&1hAjOW|Tc;w~M=0Z!+qMgV?uQJY=OIJ;Hg@gfXHgV?lrv{vf~7@F)A4K|Pg zn6N3*pB)2qCGA~=A9V<~LGGtfJvCorK^cE%3wO+2m=hVWZGM+=|Gc!j7N*y;VHPdo zAwcK>+&QbMyS4_Ahs)`0ta-D5x^0BqZ8S-1xM!)8PaCEU$~ZJ2HuunabU!opXS>=C zi@4^p;%(|+?3*rxYjF&%UR+Bb$4Yo>t4{13m^k(-H5_%LEVQe3BJ^a`VoX6$N|wvV zDVU@%coQ}3Jd^2z#)asT;Z>+(f5PWPfr^@tsv{@FD|-`pqEC0RWXKf;L%K8`1|fj|#pGOg_3T2pws<%E^3rWAfYGc4#H$ly<%6rsVQFO> zmznfG!lzuP8eW+zg_n-M6yBa2C*;8U2woP$9zv#F8eQImDP_&Yx=s#+49uE+0Tmqv z80!jJ`D%1)y|YUUm4kf9=&E%o$^B&?cJUa+{0Wmup!X7UOn`ElIXJ=mQ=9u1_pdM! zD*M&({l3gpyFd+f-Mq?mMSudJroYKY5LgS@-cfdLQ^p8P4zfSoI3ri!x0bt~GMBIizj14m>ykr=FUO@AXQiU{5+Y?aw()`p`junPTnmpu2Y z&D{qNMMvFmoST0d%fZ^0bKPCb%I0`pl{cT&4V*mj66?(0$M~a&2vJJ}y2rStYC@g1 zeL$H%f+^d8VLOk|VU=|x$ZKCrllM6Nq6M`e`W@OH!C=yG`zamnIga4LJY@Ed9a{)T zj~#vD4eZglX8dtR`$-noW9kJ?waoP+uxgnK8$1Mk1$nKLAFXqHG_h`-P5b7XZ$=RL z_19ky6B85RHUd4bo4+9PM<0C@0cAm5t%U`#JiKmt!DpY*df4=Dzx{SBOF@Eesr~kP zuV4JFphD~4AN}Y@;V}#)c62rzJ2D&T zjL%N}N(U-@t;{PV8koRBx zw|_>ZQsK>CTnKk>u4Bd53hRrtuykz$g%tp+_ih1*p(qJGdG|K%akmjpjsr?SZ@u)b z7qBq46WqJM_!0Z8*MVO=yHDnT^3}cLfpR>3?bT<)-~9B~_ii7w6WgeFlmUdl6+ntX z_=$OF@;W@lT51)L585U>jKDY_-@*gkIvz`^Vd~CGSZWn;g-M)uEC_EgNG0grI^gID zCU|;%CtRxG(v{ET2>eWO98C?}`%|FwiAtX}0Mk0whHHZ;_b_kja|@&!!i!HeESFcp zwLkoExQQ~+dU-p%1rJpP2(66Hgf(J?Zc?W7nZkM9!DaxwbcL(@qt5dMEV~9rhXH>P z+_$lgAApA7-XKZ}`GFCvU$JOML4Wr2i+DXDUg)(8;eD(nwNg$2d;-S+^7f+`3>b}~ z>HvI<%63>Gz-|Ft<#D@<6=NSfU;~du>GlqNghJk02TOW*py_nDO8=Aqa*yI7dmCVU z4`8BAKli}|wTroMW2qH>aI6*n^jl-$(mTyCgv;#G0N^r|oS?M?u3%LG0J#N_w|x1X z@Lu(9nEURZg-zN#IX)6f!_(pIY$@bldlkSJ%94;^|D3)pqabwyFzN2ntuRBHWt3ji zEZm)!UJoDLy&0yf8)1BRBWz+oaCdz<^b<}f`z+uzyweEYmCgey3>VVjI6T#Im3KK{ zbd9h$=}mYe>Xn|Gg$D)H+FWP6fUkIO?%`FS#HUC&o&MTZ7@n963&)QTo0a?z+QQjy zkBZSn6lijUa*H0Im}7AI;7#zg&^Zm(k^i(t!x0st*%>VL6r>iSYW8d9M3a1 z2IyaAazZOXqdRXK>`@)YQ!8K7O1HF`i+#+m9K24Jd8iem`3t^Ezr#uZ*do)w8`#}d z6a(73(Yw|N){FHPKv1_3p2bsxp3GH-SYrNvv{l1WeV4g4#C*gn8dk)O2DPQ`9TchS z#On3krd6<@S6g5crSTkP_OV8^UZq(Pgc95?(jKBHp?tx*fgi3jzfJ(+4v?-YSZDjl z+_fgH7rjnIAc{4_9F)^gLBX|^< zUkakht!YtdgXMs2v*4R^K{-j5G{SnD$T}QvOVTR=$ywg;pZoc8!!G77WpXdNqW66E zRA}D7qmBs<=%LbrMhGfmM$j*g0l+1lZT}l4%T$z7(hJ@TVAInYT zkk&`#nvO)r;c?glPq_yU0pO?H;g4HfPXP3&^q+O_QRzSTHTI|8=Gc4o_W^A`@ysLg z?d5;?eXx7LIV<5T;c|FW<4eS!96amLD&rA&!!W6E;pnSpz?x4pe@Mi=O zTt>@UH!Ztp-B-!43dp!w14`nV28>v>3&evKycT_X)Tct7n^<*}&=TyTnOz($hH)6N zO^E6Spk@t$yw=CNGE5S>5P^FTid~Rk-AXyfT37_jcxKUlj36=BbZy;_+Us5<;u6A6 zVqV57(HcxN1$h9X4&oL9ExFD<2!%?S_RB#tecwtM+F~$O~m2h};@+hH5aHSv222T3(~Rd*S@)>F}Ks zxKo-#n;wDG)Nm>MM_i*VZ2%0=raa(%sRZbcR{P6m=fWh`Y%@9Hqaausd0`=(#H!_| zzy2V+@!R*q=ISPGpiGF;yUYi9i{UXe@Byd`Xq>vgt0}6+v;g{nKb&JS6Hnog#6Ra$ zVlKVS7;Mt_x?0xqR&aHd`E`Z4i-T8~{rmeNP(N#;6UMo>P5Oj?K_LT9BkGCXPrBa< z7!01DV9uFV`}lFkl{uzBVvcjcV}a3x?NGRY3ux*y=QYZx^Q=5%i?se07`Bdx51IVk zaK?PO&vGROaR{gQ>~OtCdKsYJ!7o{wXodU(Cffwhuk%qjnB(^n{Xfn+vMg7DstH-H zZE$}Arbr$3tMu0*YqG#OcJJXfjf$Gd{MI%0HqUZ9mZK=cLm*gdm;!5io;nTCh7qn` zp+Y;{iwxR>6^&0l**|-_)Mx!4)I-L9;mDD1tOc;+B2%svukQ#!*`r5~MiaQb-i-&o-Bo*^2QKqQ`S`(m1_7brC$`Gaqxtdh zi@$#p@OLDfJbg4=c=K|k*S6O2eSz!O^DmwWYsC6|>*p5`(C>!lu)dAfAiS;C*Q>Z; z9SrAQJO!BhF5XYp!XN$l4}%uGKmF@B!e9KmABA81>^I@H?|z%#{}3*|dxh{DMM4az zqJ;2}IFj32<#7G#jc^xQstd4j^whEF7VxM4*FS_8Uwb~%wo%EEcTodyd2Mw)%;geK z01v&$KHkhH`rE~7?|$B+HzJ=L1#^1!)$^>M&zt8rC%v@I5KW&P#WI}OnVAnZ!vcu# zBH-WNG8E1PG#~*u5(8a-shVD0}Yk>1!V$L=BZ`60@Cm;u7R!d;T;^ zqD?FUv3TNr(BYkNhdEsXxamikHV<;M2cWApUM`KL96W>6S`%8rS5y~TY zinCn!x*UDcdhxZe4L`C)Kf1Ye0K58#g`7_VgcH-cOB~2afcb^y-H;pm7M`H6Vgn2e zWfY{yx74reTfI$Fu`Y^-zMdJnDp;`E*VL)On<5W;y zU)_#8)hYIhH-3I_6)4;s25{4x8yN>Qlm|+HKxt{|<2a@1OO^m*AuytnHgkY+iaQqb zq=pr(ZedNLW%g+l(tOSY+@=WTH1dEN{jGAbUQq@BNI4T+6f=5RTzK4OR5YHt4Ffv z4TU^+akIQf%w9p(LDox63tlY*;k&hn>|j|eeB_bD-xO@+3hTHAP&LdmldJ!By+dJca}AtqawygO)Mc%3a3tOJUeMY+@UUALOtb>cf5AyM3`eQ zx`C#~Ch42(5vV25iCWsSGr*52hiTD|T006VyG7Bg$b&f^^6~<3^7ryS@?BZRiY7#$ zPTEn~2ap&&2cJdX3Zyxjj+3$v>09d>-FWl7vJiV&a9HbZGmEa%EsXSWjF}VtSkOm3 z6&OO5jft$wo@S)@^L$Q#QSmcRjaesSPO=aYc~>4a2jFwEW^zlcM(#D?Yk&JOhUB8%@-aDh zt1O^%mi3wREp=lbG9+cD51$^i$9YRH#W|~YJ?DRl&d_*6usz8$>3Btby)iLukDpTR zm0VA*CF2rD!I7ZMhtIw5v%Tm1j=ycIgKxiCB=f-^%D0m&l5%=^x*qMb*l(`A-ZXJN z#$EM(xju7v9QMG|=z&83_-XX=VHt-#@K3l0Bs?VuF1~*Oa1xl~ftTz*;cj{SrbAmu z=%itu1bL^l1jhPQg3tJ8ZQ>>w`=$)Y`rccYLTY_05{&)0seJbMbU1^%q)V3;v0xny zV`z1!hKk|H$!Xl*l|o_E7`%d$z?l$HyAV@#z{%qR^;Mjdn+ zEMQy1joCJqxtqEWhM-BIy^8lOtp0IdHkv~d7MD!}Xy{V+y#;`!3d|J*VD8o?0z(7` z5S20$g3ApE;T%kl^i&H(X9;F$9gXh!Eub&*uE7*m0YZ&gl!iGZdB7kxYWT|hMMMdK z2)?HvrpQEsEfTl5dIQW>+qffA1VJgWB@yQol*x)r5JX&Lj3nmxByn*hPXp5Hs$RIR%u1&j_A!ISD#Vz(w*xH4tgV7qMe~|=*J8xYGi!h>@2?Q*}KN&}h zxhu#%MNCN;$O`U%3J}kkbQ^)^I%8T4XJ?7^f|h;_24I4iLgxXGSDr;Uaj8GtxVsUa zIdvjTA3urkqa42f@+sW85tj%?Y)}CaK>5hRV3-_!C7f883jgWveiJTTxrsoD{(^{J zymdRQpp98#yeCE{82d5e4+HbjH)n~T}Ibn&~tEkP3mHnmLdD5072ov=>G2wey_3*C>mKJrQoy%Qd3;l5*hskK-+F~ z!#2hFHJ;=4y+g*#NKCw}zeMSgiDJn<@jz6|MiUG?^u;LrE)XQzIe`;PAKoh<^l0+ikidz;n03%$obabf?) zC$DSGI0SGzfV=bCH&?^^0JHz*zxx-=`5ovk-0-5HXbeu>a8AwvfS*1V{@?%fv+$$8 z_Ujkq7UyM^}~i zGm4!m^BvT~E-9h-I$Fwx<`SUYVmq9i%7kmoJ7xz;tHl2s-VS?M&6aQ-o~x~dRrcTs z*4hj%#YayLgboU@XA!2iaATaq^U=fz*2B>0XR#(WB+dy0-$$-q2%Q&R4H+$dvx8xl zy}dd_{M<%8jP~Ka_4v84w1(9v{FKUs%eei|5nDD_7zpLNi=jw7%*Dmq%qlFA3&pSp zf6yro5-S@>xG;np*m@`o4Tl|K*AC)7wgUfD*~0zt$RzKWtuP?fMY$U{uZ8Xm@7$qM z*j`@=x8D6t7~p?SA2oP=Mw!dlz|ZHjR|c?~wkaJ4&{55K;) z8!leMim}3Aa%cfaY|adZ75Kf0J$%WG6v9$|D4Yhcm;yl9LwUE%`lR~w z89X20!CkD}-uTw{!s3mKcuP_hPymDXF959;ZSOwR;;Rph(6SKKEIEMRD)(BRd1;!>Atti7^vJV*rVm0=tUa7*|05jz)V3@cOXHbe$9co zE;%H9Z$9!4zq-R(V@yx0=*_k0iq%B?7rfCxFPF;V@e9RB=BZ(s$OVwbGDtJ^i=>Pw{>%0D1{lw#i=)g}PaFs)e#LfC%2i*aI#Cr1_J;L*`5B|``p(~j@54l0PBzPcFCg$jFn<%7 zm#)!OevO7%R@OE#iVv z+7HSG_d#6qch1`P#{5;$B60OBuaxXQ9VJK1_IBBW>;vna97!8IH=mE^uj_5=Z9N?ZpRp%nEjvsr~i?dCumPYU>qKg-vbf{CA9a{#w$Q1jRH6pum+W| ztKkyKxG%NsT6pJ|Z-w=X*I`I-dp9`}UjN?n;rtwNYH(vVGdqe4${~al!(nK$gxfTp zhcIaisLJ#R4Ix0#QntYJ$Xh~*XOE5L!w$rs470*#2}bK<+zkbNYnzp@fq$kt+P`;k zaZ`}#zPSbCfh!lZ>}9aDLRCXo4e$DpSWMHv-cqUpA%k2*0sbp9n8K zcbu5c8S307Mhif2aW@QC*JCW?9{>U`Fm5lucp9b}2D(b_JvEtI>RLoZE3LfngHodwD22fCZl7F)+G!xn%TBfFyrHd z@#D|ZuXoCXSpRbCDE%%Q@G6W(iFvQvG*%fO=P1e%tQ%tiZ*rYe4na#8H|DSc2-7GG zFa|F&60ZF2!!#S@x6Ze&pO0~2)-vEKu8`Xq7>zlYjH@vDu5wfsaQU3LeV!uyuod8j z;PEzd#Q4O^A$A0^Lrb^qh;zv6jzq&p67$Z#PJDmg`zBkFaL9VQyEr z$CAVyAVL*0qtB0XpD1?WIM;MJ{R_+GS-!rsgXSD)4$kI1d;Z*))_+eeV;Z8{I~jRn z^cquFAob$Ki?Iqa>fRH;9UUEwaef7G-4_)&2-phbUB7-kg0KR+?w8|OhZ)Ova&j_0 zs}}p2GiPFY!QGw!z`T3zoh`%s1dq)}L4!hqUfQ0(!0Up^x_}n=RpHAtPvZE5hn^>q z>F<%pIF>*2^K;?W;;kt3{XMeyT0f$|>ijdum_u$-$r1OAc>1xOX@76@mZ^JNOHAsY z_~89~?p^p4fjck?z=;*|1%%5ML9ktDSZ@eryi6 ze`Va8uS6iX0iALC=A9@AoWcV7$dQR~{mPN>%(KUNW-|g$r_LP7eFETn z?)kYe1z;>aIDcXy3Lsy6?OEo?4Ck+t#|>zne7N-P<>+2FgB8`0Q!}jDp)h@PG#shS z;Dtt)z^U-h{`9-_BX57+1)Xjy4B=Hpx^?mT9byR++m!XZ-=c?maDRzWg`~?Lz8inV z9@!rX1?(QK+eaPtvjB*xJpXvI{m0|=c^M)(+QR zuCIlEyaW&OA~Y4epEQM0=a2cy+LeDg5PaEJ%q5K{^8w^vdzZ9-BdkH{blYYqXypy^^f2v^I z$2;;0AnyWJxr;oz94dgo@`{}>0cf4cVELaO3S(IPe)!Vaa79Hb0H_=m-(C2dEXuaV z`SxABybe%NzMcS7l-WhGx!PZ0&%ipHy;uccU3?b+lt&oD4ZH|Esdp>IeQgfGx$)T} z@FVig@CktF^3~Epd!kQ_sS+72{}PKrcy zx?66AvkOP@D8`&%teXN)WUI^CA|Wf}?^Qz9+mx>M1mjdRS6&gpVxG?cPIWsw z%olhalolEQ!nHc@FWTNOFvc3RpK~gG;Ux^XFtM(sfrB}`JOP>=8E%Dbz|?Jc{w-X< zE~9i`W1eroYuQ%!f=DyaAsxoZ7f}Kh3DPC+6SlDUK5_i)Di2$xTi*CCpgi9fy86~) zH{!hJPkUHyF>SO0=G<^zalBaM*IDDvS%G2y zN5ug5T~ZnTO$%`6QB=_2ThO%GLh+RMVy#-j7{eI9e3ToiaO1Olu`s#Ld&Pa9x~df5 z`>a?jMH!=^;M`?0)Kkm(r2m{hNqaN!Hu5+H+GLqpJaZDy$tc#>bt{1E+-*{ZMny5) z9Q_}aNSKexGHt8*yO%w9^sYx*jB$&5KrAB}71Q>{)ik}|NnZQo5%YC)sNVkC;*95< z1N1ayTYvkocYM4aUhkFTcLKnh$HVpQJ%9Lp*aKfy4;&&fUslf^=6l!!hdpq=2Y8>Z z;~FZu>AC;Dy?_7k>{EL{T4HVzYg!P(TBTnIs|{~av1CEmy9=CNv^Pggg>FyCXt*>Ge8 zSdaeOB34xnEATYL_W<#dTErUDl~4u?g*I)-;TCTYOP6n*90~b<`MvP(VJP2w=W-;% z1>3X)t?q0`g^YpW(HH}30wJ0T1p*xh_2@>oMPGjFm^CqOQa^pImUNt}%p-*_x_;ha zjGW(ooarUj&I0!fJScGK7_Rf#;=V4F&F{00`+32BkQjS@geJ-Q5Y%llzpl7GIX50J z;nAXtXXm?C!sFCX4}Pw(0n&`{IZ7V7C$px@KEwGi*Ggo96Y-cAb}>;Pq;5ZtL_y6d z(h4fyW{%alsKxWe2>vSO`Q(w5fKml{j8Px0jJK(4fyF(+1J=*B=;+gRIZB!_7CCnB zF{bft>&ZHQmc3z+`p5nx-7M)`*e|eFhgkDJ;e0vX{bU`U#1$F0WPUxWl~1CCuQm@s z$nX8ZcfQ(6e8JKmWVm}Et8SHb*?b49T(#4^E*L8)tN_6MP{kO3`z=^&dVgQNdNm3z zJ=Z!{FxPW|UDFxkcMVsz{?4KZ)hp9H1(kc(6&@)>iozb&ORt`$@0B|;G7{66j~~ZF zI;tn6_<~*Yl|Mc`H66}9b0%E7e&b*Qz|d;n`R)sh?H3jBxYPRiDvxBpS3vyd|N4*i z1=9-P`oeSHJ{jpsUwT@k?g7$u5yCTFnXjxV&VT%G{+P5aJkU&pxnqCCIYMrw(r%s1 z|0eX4@r2XRMujso;n>M}Xv_WefojpY7Z<{*XJ^P0x)T?%eS!%Pul@Y);*wUtc<#hB zc|ogc83SGP&wu=Sv`CJ9M`e`PQWVd5LfO7AzTn}g#B4rwc&N+0M89ugX3+a2c}UC7 z1OA>leI(ofY)?UlAH?H0E`~oMj;BKHG(zHEV|km$#qS_{V;W0Yfrrj+HEeRPMn`V} ze16!V&#T?==7)rp!MZUIpY(2hFHAE(Pa%kI0}hXYpj1i!zihylFlSHUB_g|tVoq@^ z)JjaMO`u`X_szdXah;3y$#0Kue30LD<~ zL`I$nhMkihX%tX12=3GHBzu6@D)KrxV%$_{`W@omZeRKp^gfgh^EHu3|rT^04j%lqLCJAltyOw1|5@C@O}C{;{_GO@BN zcq3Yx8V(a^<}KHVv5I0uzJ#SBj8_{))ZBI&CDUE_DO@@40iscUV-yb-C}@o4v1F#+ z`7y=-D@-6hXfmufx!-#Eco+h3XP5xoYVd2sR|OdB!Y_3IsRawY*`=L&wK7(*@3cPN zySnscH-NvYgpzT@*q9w{hRSmuce07Eq3U+-2O30st@2{#D$Q`rbWg zhjjepu`>ys!N#Y)cZPk>*{B6x1ZLqAB6tS~E2pi}w&1HfqwbmoXa#MBIYya#TVo;o z{q?2LN1V?=+^T1@$S1Ib&tr`)s00TN7=_XSxeX1#TPq9Tc>!V)L8oBpxQ}FgANAS~K&>A9u^}9Lh&h zg22QdZbF0UZnl7uwy{ZR9afa6=F;XIV6twMZI>JPB=vt0tM^$fEBlx`#^V*B>*M{U z9dVlXjPDwO-45~xXDl3l1iw_?uGLX6z#_PS&-5&FUXVyxhE|!eXK9+;ko)!k?JdF> zP6IYKXxA}hAnVNACD!s?1v9k4(4b8iv}p0jllFt17l9+{Yy4gT+-O}*-wDqOY;%i! zM}UoYs-T$9I)2id+*Ac#xkvPZ#<%<*nUf#S@Gcg}PEjXuXO9&3H8ilVoHxp2ND%AM z!P8rIWHPkNa+e45P&VaSai&PeDL;$Aox{P$xgA{^KdSl3kTC{MG3P!rf&E7sCe91y zdzbv$?$_ik_}WG;rff@h$pw^JVrVnwTZ}7ge#|>*D!tw*wMwC^lS1);NyE2!?|&F4 z6{eK^DO=KDK>4BkgYM6xL4+%ZH7PLcx^XeM&f;uyjdT+Of#`(=#UYg~jD6jvp0VA` zh#GrzmAYz>qIaW=iWtoA5{eGfQ#0^agf(EVSH_rP9agEs=r-FGukLr=)v8xTftVNVbi5NwU+d!eejoc||452Q!Gt-$ z6goT(d*G?|z##zqRJ;4Iu)`ksr`rPuk-2&rqba#i0`!xZ$l$I_f<%`+&_igG?}p14 zKMI>mcf;_J*)Xv%8J>G)A^hQMr=r{8fF*_LJ=DhT!qiBFsTJFXk&=KiMsC0bU;HM| zE<_VjH;5hXNjUB^Z33w>YhK@j808Td1B4JT^2Ykqy=xK1X$;VG5O;0cxF4%jvse;z zo%3HMZq%-Kwz;!wvTfV8CQP>N$+l~%$(qcaCTp^rZ0_7U@Aq@g`R)7_>v`6FU)Ne1 z)X&F{WoOq90^#d{xqZ&oq$ny&S%d8if(Msy1$5wh!uuCc)FlR2ZplRth5T6MO-si8{(XEZdf+;?pr-Kj0?(+PAIyY0opU3DU>q=bKzA>PPFi_;H(uEt;( zDv_uC1!k`^Unom-)8|?94q~kJbW&)_HiDX^j7zXE(}u4`-xez2J&6c=;EDO{66rUwTEK_g6u=se`v~8$4s3b;dvPcG zM9VNn&uYF4eR9;n6FsZ^Ln1OD!KZ$|bGr!{Sj^j|__+!PR6~_!Puq?$Jz=#EM4^$I z*at2pWb}PqN@0umN~n;=)9=BQ5alz?U#;mHHzQRrr{B+C%t2b~uv~RSXB*j`2^bu? zmI@w!pjnRVVYoIbkJFlGa&d}3L$Dj3N+iAn5~c|Z@JvJM1?ekBT?@MTr19f-wGTok zW-OL+)vJXnc-{vtV0ZK zahaTOBu83qITa2X*BpZ14AMtGbsM+VmkqZ|c0#b!p z<{}G`*Bg@YBD>%O!t=RLki0+|&I-k(NGQ%0W|56f0V2em!-klb+E8Ao)rz1CYW2K% zyEO8KRQQR(5bGqC3jRfSLq{`ki6_&=Nq9hbn#0{Ej2*qrLTK0+wJ=EyIM7&B(;JA* zxw?G25z7!YGL$_Q0KtRvfOIX3uF%0+$V3BY>R4wx_)wW#a2X_l@d^+3 zn%r?MYV?EZ%}4-2mA-O-2SZw6)Z@?Vy3UsHYZ8*5d>Kfj_N^d6J8#^b2l&gzHnl)v z?2QAH`w{2{A-Ev+M3@$b35ZTBwfU@mie1$P5$Xe6p)S> zXn=>yVAVOj*9McKa-oel0X@_Pa(Vrh@j!r(4u=OsXZlF8lYKSy+hvQ?@QhXa9}~p) zw2w(99?6g0-Z!nwwz3GJ@M{gXz!D$7z~#He;=cI5|_Mg^>pQ6rOJ@$EXaJ z`bs|@5+1i;Pn5S-)mSgkvh7Y!PrGH227RMns`7IDS(c}=|Hybm=s(Ny(Tuj~bp99h zZl=emlWU}i8YTZaMp}AyK`D!mSj=KXt0U*%Cg_4FL;d?LU!?qdq|jjuz}6f%DQLz> zTtSBw%VqXKR(fVlLO#0(>fBv#UmkCR&a!9^9%IpEZX!L<#=wu1j=fu>?-((1v)c8z zQ%4o0eyX2OdEoiPwv%--B9I^Im}rYc@06%7_5W)8ORm}wV*ZlkmF4X4c#g98dqqSw zo%c&#-H!_zFk$Tj+|3}nE+eEnZDSzJJWBeYeL^I`W4dO!P<6L@k>IpOU8^ecHz-B{ zsV`fIuTdV-qzj~Mq(+F&?M~0hZKuR&w^GT>tte$DMppq|Q(-mfx!(fLb@lSzVh`4$ z=m|YjT_6o5<@}h6RO9a&5?BYk8KL}>0Ee@M$FYcTVD-MvyFjlG$%XR9 z+@rTd0J22Qs6vY}it5|pO`+fE_ALdKm>j7kFbDG1JXw!0C0QksRW*??X(WpaCDVfK z3YUP%7^$nHd&+GJ@ap`F%`v#=G;4hzc#`j|hB!4r0VAb)aGs%L@|5U4!=3JuZSjc>R}JRvWDTJ@uL@eo<)IZ(ATB zq%F3ZTkIKkEzu9X_?^`!slp6CSf^OMTp#w#F|v840G=nP6Zg9=t$Q>FrywVRF_0Ma zey2ZXo^2G$_gP&Sfd26~#Q*@$NMJ$UF3c>*9D(owB5xdQXOYLH#n-!0JRmqyV|b$t zpF|6cf-nS|Hp~%qh_uU4_g|$3lA9Mqxy+G4kEhSqK{c}#?Yqfy=x+=2nhxXAwFLVu zvZACUCN*$b2`)?sExtn@gSw{Cm|r*aryTE28prgzNzArz+9R=g0?5tqX0a#S@Iy5= zf?{2K^CZ;ZFjfXJDgEQ%3QF(gvU=OF75nXx+1}I3yI$OVzhD(w7dYJn^{vw3yeqUckpX6>tVpdP6^`e!vd7B>15MrN)XNIQmrDok7@P*ULbIXHS#V^A;P7DS_PWVCF)FJ ziQubi$hK5(YsnJD%h&PBeyvaHqb7@}(W5g6pfmW>>3+a4MqKGIo;g=XTl*3LYC4af z`1E|Y?_;Wdk1GNf(YNK4%Ssz94`=eBQ?XB+Ol*hFUmE@NRTVrfL~fv>`u8q$hy)T8 z+Pl>pH#Ie-Tks4S)pL<0E}k$nRS2_@QETk!oz~pZU#1 z0Qs^vUfy5eA-rU#nbzNY_G`I1JEJ5pd6JinKUgw276)Tn;_cT~U4$|=^Bt7*WDqd$ z3~1A!&@ua1N@Xa@Y7%Oi2kTD^#Va81M}OhYt7izWQJT6tc8o3lB<<~TYFJ5$%~BBs zBDQH1@T!ZvIVg7yY$ghfi9Hp>?WXKj@!VniPcRUScnk&3^<5fr?WdC3(t2xpMNh5QU*#}cq1*Z|d3kLUwW=oFhY|1LY} zB6%9}5s`~Qkvp{7LipK3?+ik^ntgFYDeFrvXBLNC%7&4)Bg%884ny*|0WeaYm5o>I zb3`3q6CUGM)g1urb@iL=7-!t3VVRMcX;1|#jIdwEYl8lV9b2~avlt6R*HGnL=dYwA z0w1Z&)|R^M>MNEEv($k&QV-*RNPO@&*l?E=^UQ;bUi<6i^&?r z1AgfS;mmXR-$d6rU*L&W2|uP&X@6^iJyDbG`#1&a|Zd$BPgU5nLSw| zJ_xSg(n%p)GfO||L}qgMJa08u`kO~av8$O^v6d&kq!GX=DSNHO3NR+Uo#+AA^RZ6EgBxhGuoy6 z*93;uVbEFVpG&@5v+-+9SZ7{AMS9(-!l!7kKZ}|VGb_t+7`{br%j4I3@g0YkW^j0b z$A9h7%m3P=;3qSm|1-_6vxLZ8iXUwtXh!hcl%f*}^p}l{*d>x`K<@D~Gm%wQbIzy7 z-cMT$v=I0)^9aS{1K4sJbVW80a=v}k_tg3x)@kVGDddpXD zYq2-()QD+vRj`(lJ?#a9$g1&nt>Iu(!N1Hf1tT{H{4yIw4zpP7W2To}Rl4;EVxF`^nO%8ONw^aeH1Dz}a66h1&f=dW9hvBLzi~ZYn`t`AE{$!( z{B8KB{HCQX%ME2d!|d00!v*47ZVUGeYsb4c`aZcw0knmU&}=)7`oud%SNsA{Nfw`) z)tHm(c6ulitT~q<*PQ|0$q1UKGM)LrjrtqO!PIb)6c~tnumPy3*N80&R9D0 z?M$V_Gfj-~9e$~tn3+A+zCQQ87eIFj3Y%($kp=%iabtV58o5)kPzZjv$al#RFs@=- zMz20gCYXa9Xvz|bwp1T*PqS=hVoRz$?%zTZjf{_6PIirR_$FXjT1gu?#<~6@%=1Zk z7O@phHgGd!Nai8P@-UmBj$@reM1*w9_pFu<8XqXu5*Io%!O}-m=U)NS8T@};0PcJn zMn*9XIB5@jo7o6Eh~1BjAw65M7uEfu;JHHvvh%hX-%FXKWv`lm%Hc-sp6cq6Q%zgi zFO*A(-`7V26&Jd!NJs*~{oCHV!S6uIz#{SNFi)zpC@VCB5TaO%; zVCG0U!W2}NlHp&8z0V@N50w!0Q#<=6Ub8{yXOT=6XVL#D*GU>%PIAfpkT($2mMm2lhJr_|U?gh7`HHU`sgL;?bpjt6k3xGMb_-iD)_? z*gc|_#$O@*9bnH~QR2_Sx3S7s_K(xY4H(_rLh=YeVT~`KfSttBPRSE8N4VM6_UJ!*wW5mH1+~cJW zp2Ca3sJ36l7XOOpxZM&Mc#B`2qFiyzgqBo*TaAQ%xx4w}xCQ?R`bSiBQta3<;muUa z>v|n-K-dWy%&Sr1I?}qwMg;CF#CAjX-?!s)ssl*T%oqm5b{>9SabT;BOWpuvcVFVm zEJ-9!+yYCj61w3=f))NJYzBzQkY5D_svt2wT!2p2t|xz(|E=R<-RxJlqWY7ynBT~r zwhM(OdwZF*$72!kbQ{szH)vu#2uA8BtV-APqWoC@a7k#Mzr{vQj&jJ@N4}%t#(>Jz zs6kPvf>mrb68dea{&x+V1a5i2N3CLePXgwKl}WoIe3{)u=HTz&6n7r*Ujd8@5I#-q z-!DfIb(6HglRk_x@l1@MG!UYZ*CZtE$fZ_@VfhujYa_FFcvCGQZJZ17@BycG#r!6u zo&NFa67pM}hvJ~&-1jH+ZODE>>s&ZB+?B7woVqi5M^t=C41z%!=mx=klL`YsCY-Kt zHq{OR`Y%b%yM^a)ICAdfOwN9A*IphDF!caR#Ve}B-92>UfA{UO*W+;!{pr|LnI1{g z8uVCz-gmumj()Wwzil%8g112Eou)$Z>mFeGLtE(ABJzXS+xuLXpi$@%)$g{=|31CV zLobGwMwvHB+LVPxI0iO;P&kV;+w2O>WU?i?7=f3Wj zuvmQ_!*7*Lc^YUdF)eO+qCyD zsYCl8Qy-LH!obJ{H<1dU-LW~Cy%3$!<7->TvxAu|>nhYm0w`EVqQo<7N zjyLZFet013nmAJZQYb~3h&2`8K|t%Nd=$o|M2n$J9QVD{z;Z&%UK zAmj;M?VrlAVr784Fol)E#+x zDqm?W>oj8hJnQ0UVuEBfgrz2W8OmOQ7;81c3}7hPQqdCs#l@uw?2@%U*DpNHGb6DV* z@8R)=xtvreRn&4qWVNehRPPMei9C6CZ9BhBO}Y}j?bEJpG+G_^S88bo^Q&FHUq*!p z)wV&NN>btZkH&K5RB4`BeVz`IXjwcXhE#yTvn7kSX7P3K(CQgfgEFHdQebnG?vleJ zF_SwEo&U=K0mTIo%<2ftJjFax^`+ilBP%5#iJ%oP5>QQt?Y!}RufxxqlMb(iI@1u3 zM5v#1z0JgZ2Wwzi4oRWQCOq6K`Q)QMP|v!*le5U`>LXG^5{viB25sg#Ud<$y|3-it zi5==DUeH3~t2kVEHURdU+l=Cj^uTv{VV0iTZ%?CzpNxpO*r;^a=-xOS+D1H(tNBgN1whdM=wuw!k?)zTPu4 zV*JW^f*9*TNo$q{*fvu|*X6le^_Ed9+nIare9?r9M|rG0%)GMIG6P33`)+D{H*TJz z%fcOo6VL#YSWyKe3W*mhyyDw?OLD^~mUfL{BZi$s62F&5>~v<^HhMs~*C6a=w19W;^r=9^ zQvu4xn+n=~U?=G(1>&xn!umcCzgV`yu47bzs->ZYiR{Ty+zkv8kb=<%kUcXV74Cj} zDTzqU$Rq|dD%v<)l&Iz)oy2=;1}{`k&|k$-5V+6}Urgttv?b)BJ^$WS9in(1*^2^{ z(#4AR^}SyT>^cH-^#HS9_THIUj1etBpkhdPf47g}BqLumo+i3x$9)dc;(26pp z;_aoK)5+oLlsSuHzu*1tNL$w?GT(;$Spjz+Oe!?S8nnCo?);B#SAjCXn2ZS@L6e|B zLww4DrU`!WiIQlg{P(Ou-2j5eHqIdCMeYn+1^{ul{Aav8uMmw2Qeo)CBVnvvu@Ej~MCd4Dp6V7%}S)@Af&!6t4@@FO4*HfE_0b z1VN#6#D6v`WFGAs7zyLl>Ne2RnwDsQx8&(B`Hi)+4vd;2H?tr0n8HtM^^x19p|j{P zY1HhU$>zN${9MYtSz6*zXR9(SQuGoNeM5Y|UxJmQreV`UG8e@QI3A$GBzbl=os@%&vDtnj_|8SZHOb zZ;aA%j^vx)q#VLl`eNSN{VT*A0Kj@VE;DtcP}vF6^aUI6PF*459(K`bA>CKC*AbNt z_+9`kwOnX>!y>L4Q>{VhSKdsR6S{oNr9(yx2^2E;XrM70{V7cLWPZQsqQ*DA2b<*+ zfjue%Gt}1tIz6@DCP0~xm-*K+iF>@RAq;+L^K*a5RF+t75x?Rj2c`#FDuF>fa@*j!f$?zsyAg~q@-w@uBX-FnyVyY4LAI|@>F7E#Xw;i780 zb=9MQQ~%9@gKot3NL4!*BMaPrMNUQmYd?uyg3}xMp5B0K12Uahi#z2s3e2SC=K@QL z*_yaif88v4|0jPFL+r+f#`q7pz`5l|!q+roI03pQy0F;GUvgxmZAStbi^;G%oCz>9 zHtw$f|6e;>=~)fIkP6CPFBE0<4;u_vPe93+s892K<$S$=iIzJnWRuZmL9#N_(lIQG z^lynl$vvn*z#zh&j13}g;#Bf8S`and>P*H|fjCL8DsF$q?L5WV3iqs38)F$*qR1#Snn$;k-W3EHB z{%fZIX3Ns>I*DXWXwd~Ma~dFvhmC3M);@$i@`)K0w`Ag{co38wpazkS2XhY7(T13z zNbYxgF_#FdaC}!2AzQ*VNe+0nCioU=cLk{elpm{5{Qc~p@4d@pzs-}O+y6tC7YtXw zQ-|tc+DQdo`EeSn!DgHqR2 ztbAg3$PeyBWfAb6vYviVXEFX{8bo^31_=$MJIX~wqeOp}>F`V*5Se+_8$pC?HcJXL z`3n^9G@JW=z!dwDaRwhbmOfZH^yd5Z`c4CF1^ZAEK9kNZWJXPW>Gw?gkib9RlymZ# z1*_%0{~eA6V7a5hqsMVOOFDQl?G>mPUYkG^vHzYy!<3&`97x66-Qo&_uBw(d4z09U9Y&|Y(VH1|8oYyEPkYH`T z5@)Y$CDxy`g@#D-CJk++H+pU1&wO(=&v_^II+QsCA`PK_SL$`uhFMI>aDxpDB;hW6N~)65368O#+zo1 zz{kxQldJj}EK;Xc9?#4Kl-)$aWvHnBa6kj(+wsyvh~M_TMlOE@pm#)|8+lBR%+bDJ zrFnILd`#<6K~a>$wqL8}p5QB^0z}Zl`V;)X8VB4;PGqFjX!sAcvGK3R(9a2w@-+v= z;=Cc|6=s&>vj#}k(-ISjkwX3d4ovye!T>hfBBk|7$jX5u&HI1TB8*4ksUc50cG;d% zb{q71fjIMV2fY1me(Xo6_fs7~m zZnT42d#@P&1KPa$Wc83%2aVUng5dmXLdHOaT)Ihzb97j%Xz;S;N{wmpWFLQ{{ergv zrhD(r9C7$1WpU)$)UI{K;NQUx=cD(+$S?hK^XP15yURa3TXG^lLDkqlM&{-lp|3eb zMYOKPIeU~Ui#Htv2{A;{8-xgFe|mJ|UhF=U@P&uc`!CI^bL9azh2{HD#~21+9e=Ft zvfJwH!gK+C*}g1$S~naDK|+9QKe*X^)#5@6Cjins&L{a{Pv@pzR_pB?XdK}_5DPn+ zD*ORdl;~trH5JsA;#=hoKH?2fMV+eskbELpsDBJ}gZDjK5+HBjGx|HxmBJ+AxPFzE zdu0aJp(;k6NqM)ON_z(!X}2ST?!B(nRT43VGxWO9s`Ullg^SkIU0cypROr` z`mCcJpBoae01vnO2$CjFLapANf>MFKp?9V$n-7GMafk7s950NoS8^{t9+}>Ks>eL4 z%tRDsRLTUl(EsAoSI|(-?XayRNI%W3xk7A;xtKy>v^Ov#!aJvIFJJ!SmY<|8 z&?Vp&2*IJTC1@ez(N4p)m0xruAaU_%CY?vGBPXiBSzn}5Fhz`G!#LJyR zxy&lQOntClR!8F8LkLPFO1}qykzBnigUo?w*NKm%P3_!UOl#){#3Lh5&6C2G0+T3d zj3sK)(4jtkY|5K7u-NauUd~Fa)_N?+*wVQ4Q&bn%)GO2?%Lae1fFd2|V->tCHWpEQ z1w*($ZWezxw)NB*RcGm9-x1|Tan_E|M3QJM;YS2b8uUnCGhDKa!^K-X6b zI9qntYf{X;=s-n=`U!El1bXbhxfYr-wI9BXzO^ZL-H)P@@4N4AnG^GoBq+qT76N+Z z-p@q_Ubg)2*STqye=mM6ZhD}D_UB;DoGp-ZO`O~(MSh3D?U@yNw`J~q{3-kK+BcOO z@CPTAuGZ#lZ_V7v0(p|@($;c+%eL=7^Jk0S4mu!kO(;-z>p$-C9|&oMCW|MkBZHzT z)(>wbt}6Ei8rXp>Cr&8VdYu&C3zS`EP&G-`J*SyAb*g{=dH6Xj^#<6LX>gfy<2v$#!hj3I*U{`eq*-cbU zG&9h`OT!H;xxe01tx)+&7Vuh*Sq?eZU~-$`8Z7n|^0!eHja8tAWRYAVm8!~(bjRoi z2Ty|*+tAD=c*XO~@Mp-w0Y1=(P{Fw%n;1M-_$azA+kl-s#F6cCet~-(DCIik1BIs| zp|D(fBmJY_B5?bQaA7~XjuF=)*0WZY{zc3xto~hQp;;C{_&nVSQQMl983&BWC2Ltsu<(YYgtMXM~16|Tn1al*0vS$jSDg)%5!*|GZaF3{ zY*^`-ccg0qCIYo0pi+Ir4Z`t5FHt|Kw#>mp5}YKJuQjwkjMu6mL^FD)d?6A%E|{a%PVkSTE7OoZh>>wSrup z9CFOgooXBP@W+FZ5rGi&YC%YLKV|a9__o9Hk?VXO--jUM^$SF{m9};b>zko3!Ma^s zIN#kCJY1qht0;C%iF!MGtDglZTeG4ZSBqjh?G`URD+NrXQukM5yTqI*7^+-tbt9og z@G}SSXIE347eZPpMS*`-|Finu((m0)+iM7)Qx;UKDo14IF+pm#dPR3_j7ZTvgtE2- zQC334SG+C;K2CqZb`n^8j+nD=?}l%0*GF=A-(`OUra2+yOOpE%Gn~46L3#b5Q(j2) z)6GY@HYPnm9I+n!GjFLoffD5wHx=7;<~=a*GwxA=Prp7&XIY2)p-^^!-u1}Yr>4uy z$QFr6-g~0Dvv8=rsD&SerJB3a@ozjtwZTr!QX`el)O>&pH6R3kf8r8?;=sqG!W)&B zHPTuhR56{Q`J^1>0srh8(S7R7L5F*+{~ix^iZC%W3>WzpesUwu>vgEeE6kx_Z?|`* z-beJz2V0^g&dQeHP}AJcd6$|fPl~RlHu8^hG|js!P1IHCRM9CY@;l)^tHfCr*ulRA zq%&$hHrMfSA`0?U!wPz1p|7lTFBPNAE)RWkLJO8lwEV*Ok#6E{(FZR{sbLzlIx;0l z|7d0o*%{IMbJwQ`0r2DPYc%gJXtL2^W2C;m-pz?eQAIJ_Wl&nF*rt|;4TjE0G4ZU` z^&ViQd!`9{8FzS=tVB{JRd}+et!jW?8>vV$+=+gV+weo)#l(%&7AmK$idL&w+gmH_ zh?Hi^Fr)_n@W$8=QThupZrrjFfuAtm6lzaz)dIi{Dc={wHzk4|wO5FB|1y4OlKV`~ zLZ4W9PT3@IUhUgOVEH}@Mm>T%xz_s09&AiZfsPbFVD#>G5lcjRReo$t*rDOxL;R}h z+=^8@P>REP+xe^M%i$4;-5_w!@&u|Okp;a@QfCpeuk69~yUP`O9kKy3`HyZ|b+o3R z7yxZcuni$0vPj2jNoL|VVlFmy)AGIi=qN^0!2{igmBd4}qHI#r4^{jnf2whR%MW=#PV15{1t}DkR|g zhw${CXHDg=k{s9l*OVJ{trXo(;a?=>N3c!0)v`6uPy$=NKK=uybSRA6?QJlA1)xvM>Q&WXOk?*@G9 zQYx1?8XpX?P-r_mQQp!Cju`3rp%v;yv-V^(1_puM6=vq~rD_`xRCH-oL2@+?GT zPvFj*>3gSZbJ`!vk~mg0`j%2fpU!Z?3^6J+lGjDbEefZIe?IHw*9-NR8qkX8Owu92 z*Mg=1Y$}5YQh-*v{9v zkhXr$D%^P%*x*dawsTAAbWEPHozL_+XFsvuPvy(AfV(o)iPc}*KF(m{{8dUzq-$)P z0I0iyVPg6V3eZussKT&l-wiOsFZyR1pnz9lBtpKNdHf!TfI#}CyW4{aw!rI{eOhzhLIFCN zVGeQ0W6x zA?({+ls^3aFYh`{_`BK3uic;i*Gu&!;?_SoN#?T}6I4(m%pOm0*@V{UjU1iA?H;OU z@veaYW(FQ+bT>Tkr9b_8tEyfn5qtT`G3+n98Wo!?Tt9a=BrSgP3vMq4at?l^tB8`h zYh)J>2wj;KP?ZT*r-%xE-V3*JK*klIPVPXIn!6!9bYyh^<@WS`uA#Rj{DJBXj!km3 zXj`k@;Tm9t851t{&Q*2FDQ6@HnEe^*ioT=Frx=n6F?Q55z7(dwiWZ z;ei5R+M7z;K&@bicfe>n7O>(h)qckHNafDho!_z=-i*0*%DffMf3G3}I7jv~(C+s{ zm@t~or5mcNcZ}l0);7s2q|vqw@N|7?a5$p-eX z;RWw7H)cc3XO6dTMm!pfVO&OibZ+7!^W4~YAQx`kJuNap{(mt7O+Wg>duIUCiqchg}U?t&}y4rAR5x&sO9 zwy^iNBz;0)AU}uSB3I|NYW!U~dZ9#(5Mn1{!yN`A_+BS=f<^hp1H7Nr&D>r6**W1& z4gwYJO0_I-%2N?>5J23aSw zY>DboxcuH+mI?YRPnTmMr`YRry3Dem0{+>)P2muqRppaD^}K9JstVLbnr=DcXmS}> z-8c(wPD+)Waf~y7^V;x*OWn>Z-M*zeAuKpzzRM#KO=xC$sbHZJf|*Q*_-m60wI%Jj zU`n#GYp--JmH-!11-JQK!Dc+F{=(JBltrTO`J)jHbpwKO>imaF65gENv>)wos{i&+ z(R1JK?T~4mN8>FwEo_8ad~xigg~c79=9-zW6bwL0Hlgn}yi#!Bm4%}BQ^e0{iRvi( z04&sTmEP*Kf(SrJvQIfZaiDsLtISrTD{HKUm&5X0*>zsoRoH&=dqR4e&h!k&*@gGB z9FC*?;dg$5+vVqL=H*7)h=E2Dt&e+d#B{KjlcDd>__s-$NKUJF=NvL>N*^n$QeaK7n*bdIu6IS>hM@cZ4O*$II z=A}g!v(#JzqGv2qE4X$jQ)LUl8h2J=*f}Uaa6VhAZD&^Mw?hC3^a-4E%^_|N$52KJ z$65%YtgOe`rD@+ZYESOdWZcvl%rWr*$Mz>=I+Ry=0{;$}JI(bj4K#u2s*RzD?&bvY zJev0sh3q3{IzLzNuC`gPpr5~pTr9AC`RkYAmQ{aY`Etl1Ji>JSroZEj=N$-4a3g5z zZ-*ISVs#9mbqWbbmMWWH6xX!CGAH)Z!HnmynP={g^O{@Z;BH|4?mn?GZ^Sv-9i9^> z)ItZ+KM-&n$7%5Yk_T zNf8K*%_v~9WQIT6k6L@G7OE44Xkx6yJlSQGO|BbZ$)tl!(^yAqZ-x{xz#9I*AnR^m zJij725idt}Eb;+zqx)gScla)6S||+$-f}{MXUvITiCyef>zo8&y>U5);#DMklr=@R z#!0OmR1QTw3O8wt+;*-zFAOa6TEs;_8pbzDsvM)Cs*6{z(m&3GgWS}r$WL~8X|hBz zWGGB8F(%orl>&^OFRlCij{uPZP;cdBK|AkyBXU*ZwX@~xYKs?;c+n<{TGL%8qgvW{2 zqoWJI0FYSvZvnLpGh^h4k0)S8X~J#cjx`|Ym3Uu|Tyq(66sW1Kjp%#M?L%N-U{K@5H1YkLXzQJKo~Y9GIA#Y9N;q}- z9DK6efZWG@!u%C1J^?qJ(jpiiHD27siiN<)t#CjuszhT60c{Y>!?#iWgZ)Bvbd5Du zCLctVQTT@_)Ri%T%zs?>b_%j`Q4iEsTx$^XO_p48#;le{40#%1{^a~T>h5mnD7?}* z!g|)jjdug-%LY{afQk)Y)`*d7@HXNU@})5z2zp$sN}8o+086t$dRpsH0=If&c3nd6 z=&Lt%jYT77M&LLA)gp*^m zF>~-TLB9D~_T0e-`p6C40N9_Tb$iwy{*_>;oN+fN`^-W7X=j1rueDYG=5fVT{`CWl zHx=M4Ojx_%x2xF@pixuW-M4+Pge>>^O$P(Hq$1~Ub5dWAh9Xvt**l*R(pM$*|*`?50lC^jIvmD_Dy<1-{ev@H&XS zrDynHAcJ63TLb5JLSO%?V%2T!Lve#PHPx&F(`k;QENNsji_XVu+~BTrIui^-(z>f` z#h6xr^CV}0(QJC}tT=BPYkU{`e0uu=#&!HUmg^BJi^&MxTIS9xDRCMO

Gcus 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:R9*S|83Ys^pEXm#>w-eW-kX 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 =2op0tlN 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

06aJThS;Q|-{V)voO^oL3lZsVX~ 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

(rO@)~Dd) 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

#fxSU)2^+zt{K~eq{XIotk=V{DeNO88nOq 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 z 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

k(3zJsq`X=v1Lp!{$mjf{+iN0VvfN~G2^(moK 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%0D-ezI|tFe2f(IXwqHxaKF-e4vbVjXJ2qyXyDNY< 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%0Di#x#`?z8 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≶}+v4+g&A4a2JLyS{q2@{XLzz&Y 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 literal 0 HcmV?d00001 diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..ebe445c --- /dev/null +++ b/shell.nix @@ -0,0 +1,38 @@ +{ pkgs ? import {} }: + +pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + rustup + pkg-config + cmake + clang + mold + ]; + + buildInputs = with pkgs; [ + fontconfig + freetype + libxkbcommon + wayland + vulkan-loader + xorg.libX11 + xorg.libXcursor + xorg.libXi + xorg.libXrandr + ]; + + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath (with pkgs; [ + fontconfig + freetype + libxkbcommon + wayland + vulkan-loader + xorg.libX11 + xorg.libXcursor + xorg.libXi + xorg.libXrandr + ]); + + RUST_BACKTRACE = "1"; +} + diff --git a/vendor/block/Cargo.toml b/vendor/block/Cargo.toml new file mode 100644 index 0000000..d2abc29 --- /dev/null +++ b/vendor/block/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "block" +version = "0.1.6" +authors = ["Steven Sheldon"] + +description = "Rust interface for Apple's C language extension of blocks." +keywords = ["blocks", "osx", "ios", "objective-c"] +readme = "README.md" +repository = "http://github.com/SSheldon/rust-block" +documentation = "http://ssheldon.github.io/rust-objc/block/" +license = "MIT" + +exclude = [ + ".gitignore", + ".travis.yml", + "travis_install.sh", + "travis_test.sh", + "tests-ios/**", +] + +[dev-dependencies.objc_test_utils] +version = "0.0" +path = "test_utils" + diff --git a/vendor/block/src/lib.rs b/vendor/block/src/lib.rs new file mode 100644 index 0000000..0328cd1 --- /dev/null +++ b/vendor/block/src/lib.rs @@ -0,0 +1,400 @@ +/*! +A Rust interface for Objective-C blocks. + +For more information on the specifics of the block implementation, see +Clang's documentation: http://clang.llvm.org/docs/Block-ABI-Apple.html + +# Invoking blocks + +The `Block` struct is used for invoking blocks from Objective-C. For example, +consider this Objective-C function: + +``` objc +int32_t sum(int32_t (^block)(int32_t, int32_t)) { + return block(5, 8); +} +``` + +We could write it in Rust as the following: + +``` +# use block::Block; +unsafe fn sum(block: &Block<(i32, i32), i32>) -> i32 { + block.call((5, 8)) +} +``` + +Note the extra parentheses in the `call` method, since the arguments must be +passed as a tuple. + +# Creating blocks + +Creating a block to pass to Objective-C can be done with the `ConcreteBlock` +struct. For example, to create a block that adds two `i32`s, we could write: + +``` +# use block::ConcreteBlock; +let block = ConcreteBlock::new(|a: i32, b: i32| a + b); +let block = block.copy(); +assert!(unsafe { block.call((5, 8)) } == 13); +``` + +It is important to copy your block to the heap (with the `copy` method) before +passing it to Objective-C; this is because our `ConcreteBlock` is only meant +to be copied once, and we can enforce this in Rust, but if Objective-C code +were to copy it twice we could have a double free. +*/ + +#[cfg(test)] +mod test_utils; + +use std::marker::PhantomData; +use std::mem; +use std::ops::{Deref, DerefMut}; +use std::os::raw::{c_int, c_ulong, c_void}; +use std::ptr; + +#[repr(C)] +struct Class { + _private: [u8; 0], +} + +#[cfg_attr(any(target_os = "macos", target_os = "ios"), + link(name = "System", kind = "dylib"))] +#[cfg_attr(not(any(target_os = "macos", target_os = "ios")), + link(name = "BlocksRuntime", kind = "dylib"))] +extern "C" { + static _NSConcreteStackBlock: Class; + + fn _Block_copy(block: *const c_void) -> *mut c_void; + fn _Block_release(block: *const c_void); +} + +/// Types that may be used as the arguments to an Objective-C block. +pub trait BlockArguments: Sized { + /// Calls the given `Block` with self as the arguments. + /// + /// Unsafe because `block` must point to a valid `Block` and this invokes + /// foreign code whose safety the compiler cannot verify. + unsafe fn call_block(self, block: *mut Block) -> R; +} + +macro_rules! block_args_impl { + ($($a:ident : $t:ident),*) => ( + impl<$($t),*> BlockArguments for ($($t,)*) { + unsafe fn call_block(self, block: *mut Block) -> R { + let invoke: unsafe extern "C" fn(*mut Block $(, $t)*) -> R = { + let base = block as *mut BlockBase; + mem::transmute((*base).invoke) + }; + let ($($a,)*) = self; + invoke(block $(, $a)*) + } + } + ); +} + +block_args_impl!(); +block_args_impl!(a: A); +block_args_impl!(a: A, b: B); +block_args_impl!(a: A, b: B, c: C); +block_args_impl!(a: A, b: B, c: C, d: D); +block_args_impl!(a: A, b: B, c: C, d: D, e: E); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K); +block_args_impl!(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L); + +#[repr(C)] +struct BlockBase { + isa: *const Class, + flags: c_int, + _reserved: c_int, + invoke: unsafe extern "C" fn(*mut Block, ...) -> R, +} + +/// An Objective-C block that takes arguments of `A` when called and +/// returns a value of `R`. +#[repr(C)] +pub struct Block { + _base: PhantomData>, +} + +impl Block where A: BlockArguments { + /// Call self with the given arguments. + /// + /// Unsafe because this invokes foreign code that the caller must verify + /// doesn't violate any of Rust's safety rules. For example, if this block + /// is shared with multiple references, the caller must ensure that calling + /// it will not cause a data race. + pub unsafe fn call(&self, args: A) -> R { + args.call_block(self as *const _ as *mut _) + } +} + +/// A reference-counted Objective-C block. +pub struct RcBlock { + ptr: *mut Block, +} + +impl RcBlock { + /// Construct an `RcBlock` for the given block without copying it. + /// The caller must ensure the block has a +1 reference count. + /// + /// Unsafe because `ptr` must point to a valid `Block` and must have a +1 + /// reference count or it will be overreleased when the `RcBlock` is + /// dropped. + pub unsafe fn new(ptr: *mut Block) -> Self { + RcBlock { ptr: ptr } + } + + /// Constructs an `RcBlock` by copying the given block. + /// + /// Unsafe because `ptr` must point to a valid `Block`. + pub unsafe fn copy(ptr: *mut Block) -> Self { + let ptr = _Block_copy(ptr as *const c_void) as *mut Block; + RcBlock { ptr: ptr } + } +} + +impl Clone for RcBlock { + fn clone(&self) -> RcBlock { + unsafe { + RcBlock::copy(self.ptr) + } + } +} + +impl Deref for RcBlock { + type Target = Block; + + fn deref(&self) -> &Block { + unsafe { &*self.ptr } + } +} + +impl Drop for RcBlock { + fn drop(&mut self) { + unsafe { + _Block_release(self.ptr as *const c_void); + } + } +} + +/// Types that may be converted into a `ConcreteBlock`. +pub trait IntoConcreteBlock: Sized where A: BlockArguments { + /// The return type of the resulting `ConcreteBlock`. + type Ret; + + /// Consumes self to create a `ConcreteBlock`. + fn into_concrete_block(self) -> ConcreteBlock; +} + +macro_rules! concrete_block_impl { + ($f:ident) => ( + concrete_block_impl!($f,); + ); + ($f:ident, $($a:ident : $t:ident),*) => ( + impl<$($t,)* R, X> IntoConcreteBlock<($($t,)*)> for X + where X: Fn($($t,)*) -> R { + type Ret = R; + + fn into_concrete_block(self) -> ConcreteBlock<($($t,)*), R, X> { + unsafe extern "C" fn $f<$($t,)* R, X>( + block_ptr: *mut ConcreteBlock<($($t,)*), R, X> + $(, $a: $t)*) -> R + where X: Fn($($t,)*) -> R { + let block = &*block_ptr; + (block.closure)($($a),*) + } + + let f: unsafe extern "C" fn(*mut ConcreteBlock<($($t,)*), R, X> $(, $a: $t)*) -> R = $f; + unsafe { + ConcreteBlock::with_invoke(mem::transmute(f), self) + } + } + } + ); +} + +concrete_block_impl!(concrete_block_invoke_args0); +concrete_block_impl!(concrete_block_invoke_args1, a: A); +concrete_block_impl!(concrete_block_invoke_args2, a: A, b: B); +concrete_block_impl!(concrete_block_invoke_args3, a: A, b: B, c: C); +concrete_block_impl!(concrete_block_invoke_args4, a: A, b: B, c: C, d: D); +concrete_block_impl!(concrete_block_invoke_args5, a: A, b: B, c: C, d: D, e: E); +concrete_block_impl!(concrete_block_invoke_args6, a: A, b: B, c: C, d: D, e: E, f: F); +concrete_block_impl!(concrete_block_invoke_args7, a: A, b: B, c: C, d: D, e: E, f: F, g: G); +concrete_block_impl!(concrete_block_invoke_args8, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H); +concrete_block_impl!(concrete_block_invoke_args9, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I); +concrete_block_impl!(concrete_block_invoke_args10, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J); +concrete_block_impl!(concrete_block_invoke_args11, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K); +concrete_block_impl!(concrete_block_invoke_args12, a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I, j: J, k: K, l: L); + +/// An Objective-C block whose size is known at compile time and may be +/// constructed on the stack. +#[repr(C)] +pub struct ConcreteBlock { + base: BlockBase, + descriptor: Box>>, + closure: F, +} + +impl ConcreteBlock + where A: BlockArguments, F: IntoConcreteBlock { + /// Constructs a `ConcreteBlock` with the given closure. + /// When the block is called, it will return the value that results from + /// calling the closure. + pub fn new(closure: F) -> Self { + closure.into_concrete_block() + } +} + +impl ConcreteBlock { + /// Constructs a `ConcreteBlock` with the given invoke function and closure. + /// Unsafe because the caller must ensure the invoke function takes the + /// correct arguments. + unsafe fn with_invoke(invoke: unsafe extern "C" fn(*mut Self, ...) -> R, + closure: F) -> Self { + ConcreteBlock { + base: BlockBase { + isa: &_NSConcreteStackBlock, + // 1 << 25 = BLOCK_HAS_COPY_DISPOSE + flags: 1 << 25, + _reserved: 0, + invoke: mem::transmute(invoke), + }, + descriptor: Box::new(BlockDescriptor::new()), + closure: closure, + } + } +} + +impl ConcreteBlock where F: 'static { + /// Copy self onto the heap as an `RcBlock`. + pub fn copy(self) -> RcBlock { + unsafe { + let mut block = self; + let copied = RcBlock::copy(&mut *block); + // At this point, our copy helper has been run so the block will + // be moved to the heap and we can forget the original block + // because the heap block will drop in our dispose helper. + mem::forget(block); + copied + } + } +} + +impl Clone for ConcreteBlock where F: Clone { + fn clone(&self) -> Self { + unsafe { + ConcreteBlock::with_invoke(mem::transmute(self.base.invoke), + self.closure.clone()) + } + } +} + +impl Deref for ConcreteBlock { + type Target = Block; + + fn deref(&self) -> &Block { + unsafe { &*(&self.base as *const _ as *const Block) } + } +} + +impl DerefMut for ConcreteBlock { + fn deref_mut(&mut self) -> &mut Block { + unsafe { &mut *(&mut self.base as *mut _ as *mut Block) } + } +} + +unsafe extern "C" fn block_context_dispose(block: &mut B) { + // Read the block onto the stack and let it drop + ptr::read(block); +} + +unsafe extern "C" fn block_context_copy(_dst: &mut B, _src: &B) { + // The runtime memmoves the src block into the dst block, nothing to do +} + +#[repr(C)] +struct BlockDescriptor { + _reserved: c_ulong, + block_size: c_ulong, + copy_helper: unsafe extern "C" fn(&mut B, &B), + dispose_helper: unsafe extern "C" fn(&mut B), +} + +impl BlockDescriptor { + fn new() -> BlockDescriptor { + BlockDescriptor { + _reserved: 0, + block_size: mem::size_of::() as c_ulong, + copy_helper: block_context_copy::, + dispose_helper: block_context_dispose::, + } + } +} + +#[cfg(test)] +mod tests { + use test_utils::*; + use super::{ConcreteBlock, RcBlock}; + + #[test] + fn test_call_block() { + let block = get_int_block_with(13); + unsafe { + assert!(block.call(()) == 13); + } + } + + #[test] + fn test_call_block_args() { + let block = get_add_block_with(13); + unsafe { + assert!(block.call((2,)) == 15); + } + } + + #[test] + fn test_create_block() { + let block = ConcreteBlock::new(|| 13); + let result = invoke_int_block(&block); + assert!(result == 13); + } + + #[test] + fn test_create_block_args() { + let block = ConcreteBlock::new(|a: i32| a + 5); + let result = invoke_add_block(&block, 6); + assert!(result == 11); + } + + #[test] + fn test_concrete_block_copy() { + let s = "Hello!".to_string(); + let expected_len = s.len() as i32; + let block = ConcreteBlock::new(move || s.len() as i32); + assert!(invoke_int_block(&block) == expected_len); + + let copied = block.copy(); + assert!(invoke_int_block(&copied) == expected_len); + } + + #[test] + fn test_concrete_block_stack_copy() { + fn make_block() -> RcBlock<(), i32> { + let x = 7; + let block = ConcreteBlock::new(move || x); + block.copy() + } + + let block = make_block(); + assert!(invoke_int_block(&block) == 7); + } +} +