* [meta-virtualization][PATCH] Add Eclipse Ankaios container orchestrator recipe
@ 2026-07-08 12:11 kaloyan.rusev
2026-07-21 2:40 ` Bruce Ashfield
2026-08-06 10:56 ` [meta-virtualization][PATCH v2] " kaloyan.rusev
0 siblings, 2 replies; 5+ messages in thread
From: kaloyan.rusev @ 2026-07-08 12:11 UTC (permalink / raw)
To: meta-virtualization; +Cc: Kaloyan Rusev
From: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
Eclipse Ankaios (https://eclipse-ankaios.github.io/ankaios/latest/) is a lightweight workload orchestrator for embedded and automotive systems (part of the Eclipse SDV initiative). It manages OCI containers across one or more nodes through a central server and per-node agents, providing a declarative desired-state model with a small resource footprint. Workloads are described in a manifest and reconciled by the server, while the CLI is used to apply state and inspect the cluster.
The recipe splits the output into ank-server, ank-agent and ank (CLI) packages, with a meta package pulling them together, and ship default configuration plus systemd units and sysvinit scripts gated on the corresponding DISTRO_FEATURES.
Thanks a lot for your time!
Signed-off-by: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
---
recipes-containers/ankaios/ankaios-crates.inc | 740 ++++++++++++++++++
recipes-containers/ankaios/ankaios_git.bb | 110 +++
recipes-containers/ankaios/files/ank-agent | 95 +++
.../ankaios/files/ank-agent.conf | 49 ++
.../ankaios/files/ank-agent.service | 10 +
recipes-containers/ankaios/files/ank-server | 95 +++
.../ankaios/files/ank-server.conf | 40 +
.../ankaios/files/ank-server.service | 10 +
recipes-containers/ankaios/files/ank.conf | 54 ++
recipes-containers/ankaios/files/state.yaml | 13 +
10 files changed, 1216 insertions(+)
create mode 100644 recipes-containers/ankaios/ankaios-crates.inc
create mode 100644 recipes-containers/ankaios/ankaios_git.bb
create mode 100644 recipes-containers/ankaios/files/ank-agent
create mode 100644 recipes-containers/ankaios/files/ank-agent.conf
create mode 100644 recipes-containers/ankaios/files/ank-agent.service
create mode 100644 recipes-containers/ankaios/files/ank-server
create mode 100644 recipes-containers/ankaios/files/ank-server.conf
create mode 100644 recipes-containers/ankaios/files/ank-server.service
create mode 100644 recipes-containers/ankaios/files/ank.conf
create mode 100644 recipes-containers/ankaios/files/state.yaml
diff --git a/recipes-containers/ankaios/ankaios-crates.inc b/recipes-containers/ankaios/ankaios-crates.inc
new file mode 100644
index 00000000..cffef0ce
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios-crates.inc
@@ -0,0 +1,740 @@
+# Autogenerated with 'bitbake -c update_crates ankaios'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/ahash/0.8.12 \
+ crate://crates.io/aho-corasick/1.1.4 \
+ crate://crates.io/allocator-api2/0.2.21 \
+ crate://crates.io/android_system_properties/0.1.5 \
+ crate://crates.io/anstream/1.0.0 \
+ crate://crates.io/anstyle/1.0.14 \
+ crate://crates.io/anstyle-parse/1.0.0 \
+ crate://crates.io/anstyle-query/1.1.5 \
+ crate://crates.io/anstyle-wincon/3.0.11 \
+ crate://crates.io/anyhow/1.0.102 \
+ crate://crates.io/asn1-rs/0.7.1 \
+ crate://crates.io/asn1-rs-derive/0.6.0 \
+ crate://crates.io/asn1-rs-impl/0.2.0 \
+ crate://crates.io/async-trait/0.1.89 \
+ crate://crates.io/atomic-waker/1.1.2 \
+ crate://crates.io/autocfg/1.5.0 \
+ crate://crates.io/axum/0.8.9 \
+ crate://crates.io/axum-core/0.5.6 \
+ crate://crates.io/base64/0.22.1 \
+ crate://crates.io/bit-set/0.8.0 \
+ crate://crates.io/bit-vec/0.8.0 \
+ crate://crates.io/bitflags/2.11.1 \
+ crate://crates.io/block-buffer/0.10.4 \
+ crate://crates.io/borrow-or-share/0.2.4 \
+ crate://crates.io/bumpalo/3.20.2 \
+ crate://crates.io/bytecount/0.6.9 \
+ crate://crates.io/bytes/1.11.1 \
+ crate://crates.io/cc/1.2.61 \
+ crate://crates.io/cfg-if/1.0.4 \
+ crate://crates.io/cfg_aliases/0.2.1 \
+ crate://crates.io/chacha20/0.10.0 \
+ crate://crates.io/chrono/0.4.44 \
+ crate://crates.io/clap/4.6.1 \
+ crate://crates.io/clap_builder/4.6.0 \
+ crate://crates.io/clap_complete/4.6.2 \
+ crate://crates.io/clap_derive/4.6.1 \
+ crate://crates.io/clap_lex/1.1.0 \
+ crate://crates.io/colorchoice/1.0.5 \
+ crate://crates.io/convert_case/0.10.0 \
+ crate://crates.io/core-foundation-sys/0.8.7 \
+ crate://crates.io/cpufeatures/0.2.17 \
+ crate://crates.io/cpufeatures/0.3.0 \
+ crate://crates.io/crossterm/0.29.0 \
+ crate://crates.io/crossterm_winapi/0.9.1 \
+ crate://crates.io/crypto-common/0.1.7 \
+ crate://crates.io/darling/0.20.11 \
+ crate://crates.io/darling_core/0.20.11 \
+ crate://crates.io/darling_macro/0.20.11 \
+ crate://crates.io/data-encoding/2.11.0 \
+ crate://crates.io/der-parser/10.0.0 \
+ crate://crates.io/deranged/0.5.8 \
+ crate://crates.io/derive_builder/0.20.2 \
+ crate://crates.io/derive_builder_core/0.20.2 \
+ crate://crates.io/derive_builder_macro/0.20.2 \
+ crate://crates.io/derive_more/2.1.1 \
+ crate://crates.io/derive_more-impl/2.1.1 \
+ crate://crates.io/difflib/0.4.0 \
+ crate://crates.io/digest/0.10.7 \
+ crate://crates.io/displaydoc/0.2.5 \
+ crate://crates.io/document-features/0.2.12 \
+ crate://crates.io/downcast/0.11.0 \
+ crate://crates.io/dyn-clone/1.0.20 \
+ crate://crates.io/either/1.15.0 \
+ crate://crates.io/email_address/0.2.9 \
+ crate://crates.io/env/1.0.1 \
+ crate://crates.io/env_filter/1.0.1 \
+ crate://crates.io/env_logger/0.11.10 \
+ crate://crates.io/equivalent/1.0.2 \
+ crate://crates.io/errno/0.3.14 \
+ crate://crates.io/fancy-regex/0.17.0 \
+ crate://crates.io/fastrand/2.4.1 \
+ crate://crates.io/find-msvc-tools/0.1.9 \
+ crate://crates.io/fixedbitset/0.5.7 \
+ crate://crates.io/float-cmp/0.9.0 \
+ crate://crates.io/fluent-uri/0.4.1 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/foldhash/0.1.5 \
+ crate://crates.io/foldhash/0.2.0 \
+ crate://crates.io/fraction/0.15.4 \
+ crate://crates.io/fragile/2.1.0 \
+ crate://crates.io/futures-channel/0.3.32 \
+ crate://crates.io/futures-core/0.3.32 \
+ crate://crates.io/futures-macro/0.3.32 \
+ crate://crates.io/futures-sink/0.3.32 \
+ crate://crates.io/futures-task/0.3.32 \
+ crate://crates.io/futures-util/0.3.32 \
+ crate://crates.io/generic-array/0.14.7 \
+ crate://crates.io/getrandom/0.2.17 \
+ crate://crates.io/getrandom/0.3.4 \
+ crate://crates.io/getrandom/0.4.2 \
+ crate://crates.io/h2/0.4.13 \
+ crate://crates.io/handlebars/6.4.0 \
+ crate://crates.io/hashbrown/0.15.5 \
+ crate://crates.io/hashbrown/0.16.1 \
+ crate://crates.io/hashbrown/0.17.0 \
+ crate://crates.io/heck/0.4.1 \
+ crate://crates.io/heck/0.5.0 \
+ crate://crates.io/hex/0.4.3 \
+ crate://crates.io/http/1.4.0 \
+ crate://crates.io/http-body/1.0.1 \
+ crate://crates.io/http-body-util/0.1.3 \
+ crate://crates.io/httparse/1.10.1 \
+ crate://crates.io/httpdate/1.0.3 \
+ crate://crates.io/hyper/1.9.0 \
+ crate://crates.io/hyper-timeout/0.5.2 \
+ crate://crates.io/hyper-util/0.1.20 \
+ crate://crates.io/iana-time-zone/0.1.65 \
+ crate://crates.io/iana-time-zone-haiku/0.1.2 \
+ crate://crates.io/icu_collections/2.2.0 \
+ crate://crates.io/icu_locale_core/2.2.0 \
+ crate://crates.io/icu_normalizer/2.2.0 \
+ crate://crates.io/icu_normalizer_data/2.2.0 \
+ crate://crates.io/icu_properties/2.2.0 \
+ crate://crates.io/icu_properties_data/2.2.0 \
+ crate://crates.io/icu_provider/2.2.0 \
+ crate://crates.io/id-arena/2.3.0 \
+ crate://crates.io/ident_case/1.0.1 \
+ crate://crates.io/idna/1.1.0 \
+ crate://crates.io/idna_adapter/1.2.1 \
+ crate://crates.io/indexmap/2.14.0 \
+ crate://crates.io/is_executable/1.0.5 \
+ crate://crates.io/is_terminal_polyfill/1.70.2 \
+ crate://crates.io/itertools/0.10.5 \
+ crate://crates.io/itertools/0.14.0 \
+ crate://crates.io/itoa/1.0.18 \
+ crate://crates.io/jiff/0.2.24 \
+ crate://crates.io/jiff-static/0.2.24 \
+ crate://crates.io/js-sys/0.3.95 \
+ crate://crates.io/jsonschema/0.44.1 \
+ crate://crates.io/lazy_static/1.5.0 \
+ crate://crates.io/leb128fmt/0.1.0 \
+ crate://crates.io/libc/0.2.186 \
+ crate://crates.io/linux-raw-sys/0.12.1 \
+ crate://crates.io/litemap/0.8.2 \
+ crate://crates.io/litrs/1.0.0 \
+ crate://crates.io/lock_api/0.4.14 \
+ crate://crates.io/log/0.4.29 \
+ crate://crates.io/matchit/0.8.4 \
+ crate://crates.io/memchr/2.8.0 \
+ crate://crates.io/mime/0.3.17 \
+ crate://crates.io/minimal-lexical/0.2.1 \
+ crate://crates.io/mio/1.2.0 \
+ crate://crates.io/mockall/0.11.4 \
+ crate://crates.io/mockall_derive/0.11.4 \
+ crate://crates.io/mockall_double/0.3.1 \
+ crate://crates.io/multimap/0.10.1 \
+ crate://crates.io/nix/0.31.2 \
+ crate://crates.io/nom/7.1.3 \
+ crate://crates.io/normalize-line-endings/0.3.0 \
+ crate://crates.io/ntapi/0.4.3 \
+ crate://crates.io/num/0.4.3 \
+ crate://crates.io/num-bigint/0.4.6 \
+ crate://crates.io/num-cmp/0.1.0 \
+ crate://crates.io/num-complex/0.4.6 \
+ crate://crates.io/num-conv/0.2.1 \
+ crate://crates.io/num-integer/0.1.46 \
+ crate://crates.io/num-iter/0.1.45 \
+ crate://crates.io/num-modular/0.6.1 \
+ crate://crates.io/num-order/1.2.0 \
+ crate://crates.io/num-rational/0.4.2 \
+ crate://crates.io/num-traits/0.2.19 \
+ crate://crates.io/num_threads/0.1.7 \
+ crate://crates.io/objc2-core-foundation/0.3.2 \
+ crate://crates.io/objc2-io-kit/0.3.2 \
+ crate://crates.io/oid-registry/0.8.1 \
+ crate://crates.io/once_cell/1.21.4 \
+ crate://crates.io/once_cell_polyfill/1.70.2 \
+ crate://crates.io/outref/0.5.2 \
+ crate://crates.io/papergrid/0.13.0 \
+ crate://crates.io/parking_lot/0.12.5 \
+ crate://crates.io/parking_lot_core/0.9.12 \
+ crate://crates.io/percent-encoding/2.3.2 \
+ crate://crates.io/pest/2.8.6 \
+ crate://crates.io/pest_derive/2.8.6 \
+ crate://crates.io/pest_generator/2.8.6 \
+ crate://crates.io/pest_meta/2.8.6 \
+ crate://crates.io/petgraph/0.8.3 \
+ crate://crates.io/pin-project/1.1.11 \
+ crate://crates.io/pin-project-internal/1.1.11 \
+ crate://crates.io/pin-project-lite/0.2.17 \
+ crate://crates.io/portable-atomic/1.13.1 \
+ crate://crates.io/portable-atomic-util/0.2.7 \
+ crate://crates.io/potential_utf/0.1.5 \
+ crate://crates.io/powerfmt/0.2.0 \
+ crate://crates.io/ppv-lite86/0.2.21 \
+ crate://crates.io/predicates/2.1.5 \
+ crate://crates.io/predicates-core/1.0.10 \
+ crate://crates.io/predicates-tree/1.0.13 \
+ crate://crates.io/prettyplease/0.2.37 \
+ crate://crates.io/proc-macro-error-attr2/2.0.0 \
+ crate://crates.io/proc-macro-error2/2.0.1 \
+ crate://crates.io/proc-macro2/1.0.106 \
+ crate://crates.io/prost/0.14.3 \
+ crate://crates.io/prost-build/0.14.3 \
+ crate://crates.io/prost-derive/0.14.3 \
+ crate://crates.io/prost-types/0.14.3 \
+ crate://crates.io/pulldown-cmark/0.13.3 \
+ crate://crates.io/pulldown-cmark-to-cmark/22.0.0 \
+ crate://crates.io/quote/1.0.45 \
+ crate://crates.io/r-efi/5.3.0 \
+ crate://crates.io/r-efi/6.0.0 \
+ crate://crates.io/rand/0.9.4 \
+ crate://crates.io/rand/0.10.1 \
+ crate://crates.io/rand_chacha/0.9.0 \
+ crate://crates.io/rand_core/0.9.5 \
+ crate://crates.io/rand_core/0.10.1 \
+ crate://crates.io/redox_syscall/0.5.18 \
+ crate://crates.io/ref-cast/1.0.25 \
+ crate://crates.io/ref-cast-impl/1.0.25 \
+ crate://crates.io/referencing/0.44.1 \
+ crate://crates.io/regex/1.12.3 \
+ crate://crates.io/regex-automata/0.4.14 \
+ crate://crates.io/regex-syntax/0.8.10 \
+ crate://crates.io/ring/0.17.14 \
+ crate://crates.io/rustc_version/0.4.1 \
+ crate://crates.io/rusticata-macros/4.1.0 \
+ crate://crates.io/rustix/1.1.4 \
+ crate://crates.io/rustls/0.23.39 \
+ crate://crates.io/rustls-pki-types/1.14.1 \
+ crate://crates.io/rustls-webpki/0.103.13 \
+ crate://crates.io/rustversion/1.0.22 \
+ crate://crates.io/ryu/1.0.23 \
+ crate://crates.io/schemars/1.2.1 \
+ crate://crates.io/schemars_derive/1.2.1 \
+ crate://crates.io/scopeguard/1.2.0 \
+ crate://crates.io/semver/1.0.28 \
+ crate://crates.io/serde/1.0.228 \
+ crate://crates.io/serde_core/1.0.228 \
+ crate://crates.io/serde_derive/1.0.228 \
+ crate://crates.io/serde_derive_internals/0.29.1 \
+ crate://crates.io/serde_json/1.0.149 \
+ crate://crates.io/serde_spanned/1.1.1 \
+ crate://crates.io/serde_yaml/0.9.34+deprecated \
+ crate://crates.io/sha2/0.10.9 \
+ crate://crates.io/sha256/1.6.0 \
+ crate://crates.io/shlex/1.3.0 \
+ crate://crates.io/signal-hook/0.3.18 \
+ crate://crates.io/signal-hook-mio/0.2.5 \
+ crate://crates.io/signal-hook-registry/1.4.8 \
+ crate://crates.io/slab/0.4.12 \
+ crate://crates.io/smallvec/1.15.1 \
+ crate://crates.io/socket2/0.6.3 \
+ crate://crates.io/stable_deref_trait/1.2.1 \
+ crate://crates.io/strsim/0.11.1 \
+ crate://crates.io/subtle/2.6.1 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/syn/2.0.117 \
+ crate://crates.io/sync_wrapper/1.0.2 \
+ crate://crates.io/synstructure/0.13.2 \
+ crate://crates.io/sysinfo/0.38.4 \
+ crate://crates.io/tabled/0.17.0 \
+ crate://crates.io/tabled_derive/0.9.0 \
+ crate://crates.io/tempfile/3.27.0 \
+ crate://crates.io/termtree/0.5.1 \
+ crate://crates.io/thiserror/1.0.69 \
+ crate://crates.io/thiserror/2.0.18 \
+ crate://crates.io/thiserror-impl/1.0.69 \
+ crate://crates.io/thiserror-impl/2.0.18 \
+ crate://crates.io/time/0.3.47 \
+ crate://crates.io/time-core/0.1.8 \
+ crate://crates.io/time-macros/0.2.27 \
+ crate://crates.io/tinystr/0.8.3 \
+ crate://crates.io/tokio/1.52.1 \
+ crate://crates.io/tokio-macros/2.7.0 \
+ crate://crates.io/tokio-rustls/0.26.4 \
+ crate://crates.io/tokio-stream/0.1.18 \
+ crate://crates.io/tokio-util/0.7.18 \
+ crate://crates.io/toml/0.9.12+spec-1.1.0 \
+ crate://crates.io/toml_datetime/0.7.5+spec-1.1.0 \
+ crate://crates.io/toml_parser/1.1.2+spec-1.1.0 \
+ crate://crates.io/toml_writer/1.1.1+spec-1.1.0 \
+ crate://crates.io/tonic/0.14.5 \
+ crate://crates.io/tonic-build/0.14.5 \
+ crate://crates.io/tonic-prost/0.14.5 \
+ crate://crates.io/tonic-prost-build/0.14.5 \
+ crate://crates.io/tower/0.5.3 \
+ crate://crates.io/tower-layer/0.3.3 \
+ crate://crates.io/tower-service/0.3.3 \
+ crate://crates.io/tracing/0.1.44 \
+ crate://crates.io/tracing-attributes/0.1.31 \
+ crate://crates.io/tracing-core/0.1.36 \
+ crate://crates.io/try-lock/0.2.5 \
+ crate://crates.io/typenum/1.20.0 \
+ crate://crates.io/ucd-trie/0.1.7 \
+ crate://crates.io/umask/2.1.0 \
+ crate://crates.io/unicase/2.9.0 \
+ crate://crates.io/unicode-general-category/1.1.0 \
+ crate://crates.io/unicode-ident/1.0.24 \
+ crate://crates.io/unicode-segmentation/1.13.2 \
+ crate://crates.io/unicode-width/0.2.2 \
+ crate://crates.io/unicode-xid/0.2.6 \
+ crate://crates.io/unsafe-libyaml/0.2.11 \
+ crate://crates.io/untrusted/0.9.0 \
+ crate://crates.io/utf8_iter/1.0.4 \
+ crate://crates.io/utf8parse/0.2.2 \
+ crate://crates.io/uuid/1.23.1 \
+ crate://crates.io/uuid-simd/0.8.0 \
+ crate://crates.io/version_check/0.9.5 \
+ crate://crates.io/vsimd/0.8.0 \
+ crate://crates.io/want/0.3.1 \
+ crate://crates.io/wasi/0.11.1+wasi-snapshot-preview1 \
+ crate://crates.io/wasip2/1.0.3+wasi-0.2.9 \
+ crate://crates.io/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06 \
+ crate://crates.io/wasm-bindgen/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro-support/0.2.118 \
+ crate://crates.io/wasm-bindgen-shared/0.2.118 \
+ crate://crates.io/wasm-encoder/0.244.0 \
+ crate://crates.io/wasm-metadata/0.244.0 \
+ crate://crates.io/wasmparser/0.244.0 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows/0.62.2 \
+ crate://crates.io/windows-collections/0.3.2 \
+ crate://crates.io/windows-core/0.62.2 \
+ crate://crates.io/windows-future/0.3.2 \
+ crate://crates.io/windows-implement/0.60.2 \
+ crate://crates.io/windows-interface/0.59.3 \
+ crate://crates.io/windows-link/0.2.1 \
+ crate://crates.io/windows-numerics/0.3.1 \
+ crate://crates.io/windows-result/0.4.1 \
+ crate://crates.io/windows-strings/0.5.1 \
+ crate://crates.io/windows-sys/0.52.0 \
+ crate://crates.io/windows-sys/0.60.2 \
+ crate://crates.io/windows-sys/0.61.2 \
+ crate://crates.io/windows-targets/0.52.6 \
+ crate://crates.io/windows-targets/0.53.5 \
+ crate://crates.io/windows-threading/0.2.1 \
+ crate://crates.io/windows_aarch64_gnullvm/0.52.6 \
+ crate://crates.io/windows_aarch64_gnullvm/0.53.1 \
+ crate://crates.io/windows_aarch64_msvc/0.52.6 \
+ crate://crates.io/windows_aarch64_msvc/0.53.1 \
+ crate://crates.io/windows_i686_gnu/0.52.6 \
+ crate://crates.io/windows_i686_gnu/0.53.1 \
+ crate://crates.io/windows_i686_gnullvm/0.52.6 \
+ crate://crates.io/windows_i686_gnullvm/0.53.1 \
+ crate://crates.io/windows_i686_msvc/0.52.6 \
+ crate://crates.io/windows_i686_msvc/0.53.1 \
+ crate://crates.io/windows_x86_64_gnu/0.52.6 \
+ crate://crates.io/windows_x86_64_gnu/0.53.1 \
+ crate://crates.io/windows_x86_64_gnullvm/0.52.6 \
+ crate://crates.io/windows_x86_64_gnullvm/0.53.1 \
+ crate://crates.io/windows_x86_64_msvc/0.52.6 \
+ crate://crates.io/windows_x86_64_msvc/0.53.1 \
+ crate://crates.io/winnow/0.7.15 \
+ crate://crates.io/winnow/1.0.2 \
+ crate://crates.io/wit-bindgen/0.51.0 \
+ crate://crates.io/wit-bindgen/0.57.1 \
+ crate://crates.io/wit-bindgen-core/0.51.0 \
+ crate://crates.io/wit-bindgen-rust/0.51.0 \
+ crate://crates.io/wit-bindgen-rust-macro/0.51.0 \
+ crate://crates.io/wit-component/0.244.0 \
+ crate://crates.io/wit-parser/0.244.0 \
+ crate://crates.io/writeable/0.6.3 \
+ crate://crates.io/x509-parser/0.18.1 \
+ crate://crates.io/yoke/0.8.2 \
+ crate://crates.io/yoke-derive/0.8.2 \
+ crate://crates.io/zerocopy/0.8.48 \
+ crate://crates.io/zerocopy-derive/0.8.48 \
+ crate://crates.io/zerofrom/0.1.7 \
+ crate://crates.io/zerofrom-derive/0.1.7 \
+ crate://crates.io/zeroize/1.8.2 \
+ crate://crates.io/zerotrie/0.2.4 \
+ crate://crates.io/zerovec/0.11.6 \
+ crate://crates.io/zerovec-derive/0.11.3 \
+ crate://crates.io/zmij/1.0.21 \
+"
+
+SRC_URI[ahash-0.8.12.sha256sum] = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+SRC_URI[aho-corasick-1.1.4.sha256sum] = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+SRC_URI[allocator-api2-0.2.21.sha256sum] = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+SRC_URI[android_system_properties-0.1.5.sha256sum] = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+SRC_URI[anstream-1.0.0.sha256sum] = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
+SRC_URI[anstyle-1.0.14.sha256sum] = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
+SRC_URI[anstyle-parse-1.0.0.sha256sum] = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
+SRC_URI[anstyle-query-1.1.5.sha256sum] = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+SRC_URI[anstyle-wincon-3.0.11.sha256sum] = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+SRC_URI[anyhow-1.0.102.sha256sum] = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
+SRC_URI[asn1-rs-0.7.1.sha256sum] = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60"
+SRC_URI[asn1-rs-derive-0.6.0.sha256sum] = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
+SRC_URI[asn1-rs-impl-0.2.0.sha256sum] = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
+SRC_URI[async-trait-0.1.89.sha256sum] = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+SRC_URI[atomic-waker-1.1.2.sha256sum] = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+SRC_URI[autocfg-1.5.0.sha256sum] = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+SRC_URI[axum-0.8.9.sha256sum] = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
+SRC_URI[axum-core-0.5.6.sha256sum] = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
+SRC_URI[base64-0.22.1.sha256sum] = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+SRC_URI[bit-set-0.8.0.sha256sum] = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+SRC_URI[bit-vec-0.8.0.sha256sum] = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+SRC_URI[bitflags-2.11.1.sha256sum] = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
+SRC_URI[block-buffer-0.10.4.sha256sum] = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+SRC_URI[borrow-or-share-0.2.4.sha256sum] = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
+SRC_URI[bumpalo-3.20.2.sha256sum] = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
+SRC_URI[bytecount-0.6.9.sha256sum] = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
+SRC_URI[bytes-1.11.1.sha256sum] = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
+SRC_URI[cc-1.2.61.sha256sum] = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
+SRC_URI[cfg-if-1.0.4.sha256sum] = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+SRC_URI[cfg_aliases-0.2.1.sha256sum] = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+SRC_URI[chacha20-0.10.0.sha256sum] = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
+SRC_URI[chrono-0.4.44.sha256sum] = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
+SRC_URI[clap-4.6.1.sha256sum] = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
+SRC_URI[clap_builder-4.6.0.sha256sum] = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
+SRC_URI[clap_complete-4.6.2.sha256sum] = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb"
+SRC_URI[clap_derive-4.6.1.sha256sum] = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
+SRC_URI[clap_lex-1.1.0.sha256sum] = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
+SRC_URI[colorchoice-1.0.5.sha256sum] = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+SRC_URI[convert_case-0.10.0.sha256sum] = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+SRC_URI[core-foundation-sys-0.8.7.sha256sum] = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+SRC_URI[cpufeatures-0.2.17.sha256sum] = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+SRC_URI[cpufeatures-0.3.0.sha256sum] = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
+SRC_URI[crossterm-0.29.0.sha256sum] = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+SRC_URI[crossterm_winapi-0.9.1.sha256sum] = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+SRC_URI[crypto-common-0.1.7.sha256sum] = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+SRC_URI[darling-0.20.11.sha256sum] = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+SRC_URI[darling_core-0.20.11.sha256sum] = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+SRC_URI[darling_macro-0.20.11.sha256sum] = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+SRC_URI[data-encoding-2.11.0.sha256sum] = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
+SRC_URI[der-parser-10.0.0.sha256sum] = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6"
+SRC_URI[deranged-0.5.8.sha256sum] = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
+SRC_URI[derive_builder-0.20.2.sha256sum] = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
+SRC_URI[derive_builder_core-0.20.2.sha256sum] = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
+SRC_URI[derive_builder_macro-0.20.2.sha256sum] = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
+SRC_URI[derive_more-2.1.1.sha256sum] = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+SRC_URI[derive_more-impl-2.1.1.sha256sum] = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+SRC_URI[difflib-0.4.0.sha256sum] = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+SRC_URI[digest-0.10.7.sha256sum] = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+SRC_URI[displaydoc-0.2.5.sha256sum] = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+SRC_URI[document-features-0.2.12.sha256sum] = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+SRC_URI[downcast-0.11.0.sha256sum] = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
+SRC_URI[dyn-clone-1.0.20.sha256sum] = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+SRC_URI[either-1.15.0.sha256sum] = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+SRC_URI[email_address-0.2.9.sha256sum] = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
+SRC_URI[env-1.0.1.sha256sum] = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d"
+SRC_URI[env_filter-1.0.1.sha256sum] = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
+SRC_URI[env_logger-0.11.10.sha256sum] = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
+SRC_URI[equivalent-1.0.2.sha256sum] = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+SRC_URI[errno-0.3.14.sha256sum] = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+SRC_URI[fancy-regex-0.17.0.sha256sum] = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8"
+SRC_URI[fastrand-2.4.1.sha256sum] = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
+SRC_URI[find-msvc-tools-0.1.9.sha256sum] = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+SRC_URI[fixedbitset-0.5.7.sha256sum] = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
+SRC_URI[float-cmp-0.9.0.sha256sum] = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+SRC_URI[fluent-uri-0.4.1.sha256sum] = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[foldhash-0.1.5.sha256sum] = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+SRC_URI[foldhash-0.2.0.sha256sum] = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+SRC_URI[fraction-0.15.4.sha256sum] = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872"
+SRC_URI[fragile-2.1.0.sha256sum] = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9"
+SRC_URI[futures-channel-0.3.32.sha256sum] = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
+SRC_URI[futures-core-0.3.32.sha256sum] = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
+SRC_URI[futures-macro-0.3.32.sha256sum] = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
+SRC_URI[futures-sink-0.3.32.sha256sum] = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
+SRC_URI[futures-task-0.3.32.sha256sum] = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
+SRC_URI[futures-util-0.3.32.sha256sum] = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
+SRC_URI[generic-array-0.14.7.sha256sum] = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+SRC_URI[getrandom-0.2.17.sha256sum] = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+SRC_URI[getrandom-0.3.4.sha256sum] = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+SRC_URI[getrandom-0.4.2.sha256sum] = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+SRC_URI[h2-0.4.13.sha256sum] = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
+SRC_URI[handlebars-6.4.0.sha256sum] = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e"
+SRC_URI[hashbrown-0.15.5.sha256sum] = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+SRC_URI[hashbrown-0.16.1.sha256sum] = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+SRC_URI[hashbrown-0.17.0.sha256sum] = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+SRC_URI[hex-0.4.3.sha256sum] = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+SRC_URI[http-1.4.0.sha256sum] = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
+SRC_URI[http-body-1.0.1.sha256sum] = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+SRC_URI[http-body-util-0.1.3.sha256sum] = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+SRC_URI[httparse-1.10.1.sha256sum] = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+SRC_URI[httpdate-1.0.3.sha256sum] = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+SRC_URI[hyper-1.9.0.sha256sum] = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
+SRC_URI[hyper-timeout-0.5.2.sha256sum] = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
+SRC_URI[hyper-util-0.1.20.sha256sum] = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+SRC_URI[iana-time-zone-0.1.65.sha256sum] = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+SRC_URI[iana-time-zone-haiku-0.1.2.sha256sum] = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+SRC_URI[icu_collections-2.2.0.sha256sum] = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
+SRC_URI[icu_locale_core-2.2.0.sha256sum] = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
+SRC_URI[icu_normalizer-2.2.0.sha256sum] = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
+SRC_URI[icu_normalizer_data-2.2.0.sha256sum] = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
+SRC_URI[icu_properties-2.2.0.sha256sum] = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
+SRC_URI[icu_properties_data-2.2.0.sha256sum] = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
+SRC_URI[icu_provider-2.2.0.sha256sum] = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
+SRC_URI[id-arena-2.3.0.sha256sum] = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+SRC_URI[ident_case-1.0.1.sha256sum] = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+SRC_URI[idna-1.1.0.sha256sum] = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+SRC_URI[idna_adapter-1.2.1.sha256sum] = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+SRC_URI[indexmap-2.14.0.sha256sum] = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
+SRC_URI[is_executable-1.0.5.sha256sum] = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4"
+SRC_URI[is_terminal_polyfill-1.70.2.sha256sum] = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+SRC_URI[itertools-0.10.5.sha256sum] = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+SRC_URI[itertools-0.14.0.sha256sum] = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+SRC_URI[itoa-1.0.18.sha256sum] = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+SRC_URI[jiff-0.2.24.sha256sum] = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d"
+SRC_URI[jiff-static-0.2.24.sha256sum] = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7"
+SRC_URI[js-sys-0.3.95.sha256sum] = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
+SRC_URI[jsonschema-0.44.1.sha256sum] = "f98b64a413c93a1b413dfbaf973b78d271648b9cae50b10302ad88af78991672"
+SRC_URI[lazy_static-1.5.0.sha256sum] = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+SRC_URI[leb128fmt-0.1.0.sha256sum] = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+SRC_URI[libc-0.2.186.sha256sum] = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+SRC_URI[linux-raw-sys-0.12.1.sha256sum] = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+SRC_URI[litemap-0.8.2.sha256sum] = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
+SRC_URI[litrs-1.0.0.sha256sum] = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
+SRC_URI[lock_api-0.4.14.sha256sum] = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+SRC_URI[log-0.4.29.sha256sum] = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+SRC_URI[matchit-0.8.4.sha256sum] = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
+SRC_URI[memchr-2.8.0.sha256sum] = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+SRC_URI[mime-0.3.17.sha256sum] = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+SRC_URI[mio-1.2.0.sha256sum] = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
+SRC_URI[mockall-0.11.4.sha256sum] = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96"
+SRC_URI[mockall_derive-0.11.4.sha256sum] = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
+SRC_URI[mockall_double-0.3.1.sha256sum] = "f1ca96e5ac35256ae3e13536edd39b172b88f41615e1d7b653c8ad24524113e8"
+SRC_URI[multimap-0.10.1.sha256sum] = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
+SRC_URI[nix-0.31.2.sha256sum] = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3"
+SRC_URI[nom-7.1.3.sha256sum] = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+SRC_URI[normalize-line-endings-0.3.0.sha256sum] = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+SRC_URI[ntapi-0.4.3.sha256sum] = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae"
+SRC_URI[num-0.4.3.sha256sum] = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
+SRC_URI[num-bigint-0.4.6.sha256sum] = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+SRC_URI[num-cmp-0.1.0.sha256sum] = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa"
+SRC_URI[num-complex-0.4.6.sha256sum] = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+SRC_URI[num-conv-0.2.1.sha256sum] = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
+SRC_URI[num-integer-0.1.46.sha256sum] = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+SRC_URI[num-iter-0.1.45.sha256sum] = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
+SRC_URI[num-modular-0.6.1.sha256sum] = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f"
+SRC_URI[num-order-1.2.0.sha256sum] = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6"
+SRC_URI[num-rational-0.4.2.sha256sum] = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+SRC_URI[num-traits-0.2.19.sha256sum] = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+SRC_URI[num_threads-0.1.7.sha256sum] = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+SRC_URI[objc2-core-foundation-0.3.2.sha256sum] = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+SRC_URI[objc2-io-kit-0.3.2.sha256sum] = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15"
+SRC_URI[oid-registry-0.8.1.sha256sum] = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7"
+SRC_URI[once_cell-1.21.4.sha256sum] = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+SRC_URI[once_cell_polyfill-1.70.2.sha256sum] = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+SRC_URI[outref-0.5.2.sha256sum] = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
+SRC_URI[papergrid-0.13.0.sha256sum] = "d2b0f8def1f117e13c895f3eda65a7b5650688da29d6ad04635f61bc7b92eebd"
+SRC_URI[parking_lot-0.12.5.sha256sum] = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+SRC_URI[parking_lot_core-0.9.12.sha256sum] = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+SRC_URI[percent-encoding-2.3.2.sha256sum] = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+SRC_URI[pest-2.8.6.sha256sum] = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
+SRC_URI[pest_derive-2.8.6.sha256sum] = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
+SRC_URI[pest_generator-2.8.6.sha256sum] = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
+SRC_URI[pest_meta-2.8.6.sha256sum] = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
+SRC_URI[petgraph-0.8.3.sha256sum] = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
+SRC_URI[pin-project-1.1.11.sha256sum] = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517"
+SRC_URI[pin-project-internal-1.1.11.sha256sum] = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6"
+SRC_URI[pin-project-lite-0.2.17.sha256sum] = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
+SRC_URI[portable-atomic-1.13.1.sha256sum] = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+SRC_URI[portable-atomic-util-0.2.7.sha256sum] = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
+SRC_URI[potential_utf-0.1.5.sha256sum] = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
+SRC_URI[powerfmt-0.2.0.sha256sum] = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+SRC_URI[ppv-lite86-0.2.21.sha256sum] = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+SRC_URI[predicates-2.1.5.sha256sum] = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
+SRC_URI[predicates-core-1.0.10.sha256sum] = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144"
+SRC_URI[predicates-tree-1.0.13.sha256sum] = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2"
+SRC_URI[prettyplease-0.2.37.sha256sum] = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+SRC_URI[proc-macro-error-attr2-2.0.0.sha256sum] = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
+SRC_URI[proc-macro-error2-2.0.1.sha256sum] = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
+SRC_URI[proc-macro2-1.0.106.sha256sum] = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+SRC_URI[prost-0.14.3.sha256sum] = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
+SRC_URI[prost-build-0.14.3.sha256sum] = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7"
+SRC_URI[prost-derive-0.14.3.sha256sum] = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
+SRC_URI[prost-types-0.14.3.sha256sum] = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7"
+SRC_URI[pulldown-cmark-0.13.3.sha256sum] = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad"
+SRC_URI[pulldown-cmark-to-cmark-22.0.0.sha256sum] = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90"
+SRC_URI[quote-1.0.45.sha256sum] = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+SRC_URI[r-efi-5.3.0.sha256sum] = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+SRC_URI[r-efi-6.0.0.sha256sum] = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+SRC_URI[rand-0.9.4.sha256sum] = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
+SRC_URI[rand-0.10.1.sha256sum] = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
+SRC_URI[rand_chacha-0.9.0.sha256sum] = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+SRC_URI[rand_core-0.9.5.sha256sum] = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
+SRC_URI[rand_core-0.10.1.sha256sum] = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
+SRC_URI[redox_syscall-0.5.18.sha256sum] = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+SRC_URI[ref-cast-1.0.25.sha256sum] = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+SRC_URI[ref-cast-impl-1.0.25.sha256sum] = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+SRC_URI[referencing-0.44.1.sha256sum] = "22952642836711d7a730d23a4dfb0d732e75a85e4c4f5704266d9c8fac278ff1"
+SRC_URI[regex-1.12.3.sha256sum] = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
+SRC_URI[regex-automata-0.4.14.sha256sum] = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
+SRC_URI[regex-syntax-0.8.10.sha256sum] = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
+SRC_URI[ring-0.17.14.sha256sum] = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+SRC_URI[rustc_version-0.4.1.sha256sum] = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+SRC_URI[rusticata-macros-4.1.0.sha256sum] = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
+SRC_URI[rustix-1.1.4.sha256sum] = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+SRC_URI[rustls-0.23.39.sha256sum] = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e"
+SRC_URI[rustls-pki-types-1.14.1.sha256sum] = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
+SRC_URI[rustls-webpki-0.103.13.sha256sum] = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
+SRC_URI[rustversion-1.0.22.sha256sum] = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+SRC_URI[ryu-1.0.23.sha256sum] = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
+SRC_URI[schemars-1.2.1.sha256sum] = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
+SRC_URI[schemars_derive-1.2.1.sha256sum] = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f"
+SRC_URI[scopeguard-1.2.0.sha256sum] = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+SRC_URI[semver-1.0.28.sha256sum] = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
+SRC_URI[serde-1.0.228.sha256sum] = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+SRC_URI[serde_core-1.0.228.sha256sum] = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+SRC_URI[serde_derive-1.0.228.sha256sum] = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+SRC_URI[serde_derive_internals-0.29.1.sha256sum] = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+SRC_URI[serde_json-1.0.149.sha256sum] = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+SRC_URI[serde_spanned-1.1.1.sha256sum] = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
+SRC_URI[serde_yaml-0.9.34+deprecated.sha256sum] = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
+SRC_URI[sha2-0.10.9.sha256sum] = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+SRC_URI[sha256-1.6.0.sha256sum] = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6"
+SRC_URI[shlex-1.3.0.sha256sum] = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+SRC_URI[signal-hook-0.3.18.sha256sum] = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+SRC_URI[signal-hook-mio-0.2.5.sha256sum] = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+SRC_URI[signal-hook-registry-1.4.8.sha256sum] = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+SRC_URI[slab-0.4.12.sha256sum] = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
+SRC_URI[smallvec-1.15.1.sha256sum] = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+SRC_URI[socket2-0.6.3.sha256sum] = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
+SRC_URI[stable_deref_trait-1.2.1.sha256sum] = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+SRC_URI[strsim-0.11.1.sha256sum] = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+SRC_URI[subtle-2.6.1.sha256sum] = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[syn-2.0.117.sha256sum] = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+SRC_URI[sync_wrapper-1.0.2.sha256sum] = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+SRC_URI[synstructure-0.13.2.sha256sum] = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+SRC_URI[sysinfo-0.38.4.sha256sum] = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f"
+SRC_URI[tabled-0.17.0.sha256sum] = "c6709222f3973137427ce50559cd564dc187a95b9cfe01613d2f4e93610e510a"
+SRC_URI[tabled_derive-0.9.0.sha256sum] = "931be476627d4c54070a1f3a9739ccbfec9b36b39815106a20cce2243bbcefe1"
+SRC_URI[tempfile-3.27.0.sha256sum] = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
+SRC_URI[termtree-0.5.1.sha256sum] = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
+SRC_URI[thiserror-1.0.69.sha256sum] = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+SRC_URI[thiserror-2.0.18.sha256sum] = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+SRC_URI[thiserror-impl-1.0.69.sha256sum] = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+SRC_URI[thiserror-impl-2.0.18.sha256sum] = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+SRC_URI[time-0.3.47.sha256sum] = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
+SRC_URI[time-core-0.1.8.sha256sum] = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
+SRC_URI[time-macros-0.2.27.sha256sum] = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
+SRC_URI[tinystr-0.8.3.sha256sum] = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
+SRC_URI[tokio-1.52.1.sha256sum] = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"
+SRC_URI[tokio-macros-2.7.0.sha256sum] = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
+SRC_URI[tokio-rustls-0.26.4.sha256sum] = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
+SRC_URI[tokio-stream-0.1.18.sha256sum] = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
+SRC_URI[tokio-util-0.7.18.sha256sum] = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
+SRC_URI[toml-0.9.12+spec-1.1.0.sha256sum] = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+SRC_URI[toml_datetime-0.7.5+spec-1.1.0.sha256sum] = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+SRC_URI[toml_parser-1.1.2+spec-1.1.0.sha256sum] = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+SRC_URI[toml_writer-1.1.1+spec-1.1.0.sha256sum] = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
+SRC_URI[tonic-0.14.5.sha256sum] = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"
+SRC_URI[tonic-build-0.14.5.sha256sum] = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734"
+SRC_URI[tonic-prost-0.14.5.sha256sum] = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309"
+SRC_URI[tonic-prost-build-0.14.5.sha256sum] = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a"
+SRC_URI[tower-0.5.3.sha256sum] = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+SRC_URI[tower-layer-0.3.3.sha256sum] = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+SRC_URI[tower-service-0.3.3.sha256sum] = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+SRC_URI[tracing-0.1.44.sha256sum] = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+SRC_URI[tracing-attributes-0.1.31.sha256sum] = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+SRC_URI[tracing-core-0.1.36.sha256sum] = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+SRC_URI[try-lock-0.2.5.sha256sum] = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+SRC_URI[typenum-1.20.0.sha256sum] = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
+SRC_URI[ucd-trie-0.1.7.sha256sum] = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
+SRC_URI[umask-2.1.0.sha256sum] = "ec9a46c2549e35c054e0ffe281a3a6ec0007793db4df106604d37ed3f4d73d1c"
+SRC_URI[unicase-2.9.0.sha256sum] = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
+SRC_URI[unicode-general-category-1.1.0.sha256sum] = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
+SRC_URI[unicode-ident-1.0.24.sha256sum] = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+SRC_URI[unicode-segmentation-1.13.2.sha256sum] = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
+SRC_URI[unicode-width-0.2.2.sha256sum] = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+SRC_URI[unicode-xid-0.2.6.sha256sum] = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+SRC_URI[unsafe-libyaml-0.2.11.sha256sum] = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
+SRC_URI[untrusted-0.9.0.sha256sum] = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+SRC_URI[utf8_iter-1.0.4.sha256sum] = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+SRC_URI[utf8parse-0.2.2.sha256sum] = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+SRC_URI[uuid-1.23.1.sha256sum] = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
+SRC_URI[uuid-simd-0.8.0.sha256sum] = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
+SRC_URI[version_check-0.9.5.sha256sum] = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+SRC_URI[vsimd-0.8.0.sha256sum] = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+SRC_URI[want-0.3.1.sha256sum] = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+SRC_URI[wasi-0.11.1+wasi-snapshot-preview1.sha256sum] = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+SRC_URI[wasip2-1.0.3+wasi-0.2.9.sha256sum] = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
+SRC_URI[wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.sha256sum] = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
+SRC_URI[wasm-bindgen-0.2.118.sha256sum] = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
+SRC_URI[wasm-bindgen-macro-0.2.118.sha256sum] = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
+SRC_URI[wasm-bindgen-macro-support-0.2.118.sha256sum] = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
+SRC_URI[wasm-bindgen-shared-0.2.118.sha256sum] = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
+SRC_URI[wasm-encoder-0.244.0.sha256sum] = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+SRC_URI[wasm-metadata-0.244.0.sha256sum] = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+SRC_URI[wasmparser-0.244.0.sha256sum] = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-0.62.2.sha256sum] = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
+SRC_URI[windows-collections-0.3.2.sha256sum] = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
+SRC_URI[windows-core-0.62.2.sha256sum] = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+SRC_URI[windows-future-0.3.2.sha256sum] = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
+SRC_URI[windows-implement-0.60.2.sha256sum] = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+SRC_URI[windows-interface-0.59.3.sha256sum] = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+SRC_URI[windows-link-0.2.1.sha256sum] = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+SRC_URI[windows-numerics-0.3.1.sha256sum] = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
+SRC_URI[windows-result-0.4.1.sha256sum] = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+SRC_URI[windows-strings-0.5.1.sha256sum] = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+SRC_URI[windows-sys-0.60.2.sha256sum] = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+SRC_URI[windows-sys-0.61.2.sha256sum] = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+SRC_URI[windows-targets-0.52.6.sha256sum] = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+SRC_URI[windows-targets-0.53.5.sha256sum] = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+SRC_URI[windows-threading-0.2.1.sha256sum] = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
+SRC_URI[windows_aarch64_gnullvm-0.52.6.sha256sum] = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+SRC_URI[windows_aarch64_gnullvm-0.53.1.sha256sum] = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+SRC_URI[windows_aarch64_msvc-0.52.6.sha256sum] = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+SRC_URI[windows_aarch64_msvc-0.53.1.sha256sum] = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+SRC_URI[windows_i686_gnu-0.52.6.sha256sum] = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+SRC_URI[windows_i686_gnu-0.53.1.sha256sum] = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+SRC_URI[windows_i686_gnullvm-0.52.6.sha256sum] = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+SRC_URI[windows_i686_gnullvm-0.53.1.sha256sum] = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+SRC_URI[windows_i686_msvc-0.52.6.sha256sum] = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+SRC_URI[windows_i686_msvc-0.53.1.sha256sum] = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+SRC_URI[windows_x86_64_gnu-0.52.6.sha256sum] = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+SRC_URI[windows_x86_64_gnu-0.53.1.sha256sum] = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+SRC_URI[windows_x86_64_gnullvm-0.52.6.sha256sum] = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+SRC_URI[windows_x86_64_gnullvm-0.53.1.sha256sum] = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+SRC_URI[windows_x86_64_msvc-0.52.6.sha256sum] = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+SRC_URI[windows_x86_64_msvc-0.53.1.sha256sum] = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+SRC_URI[winnow-0.7.15.sha256sum] = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
+SRC_URI[winnow-1.0.2.sha256sum] = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
+SRC_URI[wit-bindgen-0.51.0.sha256sum] = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+SRC_URI[wit-bindgen-0.57.1.sha256sum] = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+SRC_URI[wit-bindgen-core-0.51.0.sha256sum] = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+SRC_URI[wit-bindgen-rust-0.51.0.sha256sum] = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+SRC_URI[wit-bindgen-rust-macro-0.51.0.sha256sum] = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+SRC_URI[wit-component-0.244.0.sha256sum] = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+SRC_URI[wit-parser-0.244.0.sha256sum] = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+SRC_URI[writeable-0.6.3.sha256sum] = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
+SRC_URI[x509-parser-0.18.1.sha256sum] = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202"
+SRC_URI[yoke-0.8.2.sha256sum] = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
+SRC_URI[yoke-derive-0.8.2.sha256sum] = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
+SRC_URI[zerocopy-0.8.48.sha256sum] = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
+SRC_URI[zerocopy-derive-0.8.48.sha256sum] = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
+SRC_URI[zerofrom-0.1.7.sha256sum] = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
+SRC_URI[zerofrom-derive-0.1.7.sha256sum] = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
+SRC_URI[zeroize-1.8.2.sha256sum] = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
+SRC_URI[zerotrie-0.2.4.sha256sum] = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
+SRC_URI[zerovec-0.11.6.sha256sum] = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
+SRC_URI[zerovec-derive-0.11.3.sha256sum] = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
+SRC_URI[zmij-1.0.21.sha256sum] = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/recipes-containers/ankaios/ankaios_git.bb b/recipes-containers/ankaios/ankaios_git.bb
new file mode 100644
index 00000000..38b19d5e
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios_git.bb
@@ -0,0 +1,110 @@
+SUMMARY = "Eclipse Ankaios: Lightweight container orchestrator for embedded Linux"
+DESCRIPTION = "Eclipse Ankaios is a lightweight container runtime for embedded Linux systems. This recipe builds Ankaios from source using vendored Rust crates."
+HOMEPAGE = "https://eclipse-ankaios.github.io/ankaios/latest/"
+BUGTRACKER = "https://github.com/eclipse-ankaios/ankaios/issues"
+
+SECTION = "base"
+
+CVE_PRODUCT = "eclipse:ankaios"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+# Build dependencies
+DEPENDS += "protobuf-native"
+
+PV = "1.0.1"
+
+SRC_URI = "\
+ git://github.com/eclipse-ankaios/ankaios.git;protocol=https;branch=release-1.0 \
+ file://state.yaml \
+ file://ank.conf \
+ file://ank-server.conf \
+ file://ank-agent.conf \
+ file://ank-server.service \
+ file://ank-agent.service \
+ file://ank-server;subdir=init-scripts \
+ file://ank-agent;subdir=init-scripts \
+"
+
+# v1.0.1 tag commit
+SRCREV = "cde70616706b58fd03e4de3f7423addaffa58720"
+
+require ${BPN}-crates.inc
+
+# Add "cargo-update-recipe-crates" to generate the crates.inc file automatically
+inherit cargo systemd update-rc.d
+
+# Package split:
+# - ank-server: server binary + server config + systemd unit
+# - ank-agent: agent binary + agent config + systemd unit
+# - ank: CLI binary ("ank")
+# - ankaios (${PN}): meta package pulling server+agent+cli
+PACKAGE_BEFORE_PN = "ank ank-agent ank-server"
+
+ALLOW_EMPTY:${PN} = "1"
+
+FILES:ank += "${bindir}/ank \
+ ${sysconfdir}/ankaios/ank.conf \
+"
+
+FILES:ank-agent += "\
+ ${bindir}/ank-agent \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-agent.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-agent', '', d)} \
+ ${sysconfdir}/ankaios/ank-agent.conf \
+"
+
+FILES:ank-server += "\
+ ${bindir}/ank-server \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-server.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-server', '', d)} \
+ ${sysconfdir}/ankaios/state.yaml \
+ ${sysconfdir}/ankaios/ank-server.conf \
+"
+
+RDEPENDS:${PN} = "ank ank-agent ank-server"
+
+CONFFILES:ank = "${sysconfdir}/ankaios/ank.conf"
+CONFFILES:ank-server = "${sysconfdir}/ankaios/state.yaml ${sysconfdir}/ankaios/ank-server.conf"
+CONFFILES:ank-agent = "${sysconfdir}/ankaios/ank-agent.conf"
+
+# Install/enable systemd units when systemd is enabled
+SYSTEMD_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'ank-server ank-agent', '', d)}"
+SYSTEMD_SERVICE:ank-server = "ank-server.service"
+SYSTEMD_SERVICE:ank-agent = "ank-agent.service"
+SYSTEMD_AUTO_ENABLE = "enable"
+
+INITSCRIPT_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'ank-server ank-agent', '', d)}"
+INITSCRIPT_NAME:ank-server = "ank-server"
+INITSCRIPT_PARAMS:ank-server = "start 70 2 3 4 5 . stop 30 0 1 6 ."
+INITSCRIPT_NAME:ank-agent = "ank-agent"
+INITSCRIPT_PARAMS:ank-agent = "start 71 2 3 4 5 . stop 29 0 1 6 ."
+
+do_install() {
+ # Install binaries
+ install -d ${D}${bindir}
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-server ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-agent ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank ${D}${bindir}/
+
+ # Install configuration directory
+ install -d ${D}${sysconfdir}/ankaios
+ install -m 0644 ${UNPACKDIR}/state.yaml ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-server.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-agent.conf ${D}${sysconfdir}/ankaios/
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${UNPACKDIR}/ank-server.service ${D}${systemd_system_unitdir}/
+ install -m 0644 ${UNPACKDIR}/ank-agent.service ${D}${systemd_system_unitdir}/
+ fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-server ${D}${sysconfdir}/init.d/ank-server
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-agent ${D}${sysconfdir}/init.d/ank-agent
+ fi
+
+}
diff --git a/recipes-containers/ankaios/files/ank-agent b/recipes-containers/ankaios/files/ank-agent
new file mode 100644
index 00000000..b01b9046
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent
@@ -0,0 +1,95 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-agent
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios agent
+### END INIT INFO
+
+set -e
+
+NAME="ank-agent"
+DAEMON="/usr/bin/ank-agent"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-agent.conf b/recipes-containers/ankaios/files/ank-agent.conf
new file mode 100644
index 00000000..fb91d4ab
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.conf
@@ -0,0 +1,49 @@
+# This is the configuration file for an Ankaios agent.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The name to use for the registration with the server.
+# Every agent has to register with a unique name.
+# Agent name shall contain only regular upper and lowercase characters
+# (a-z and A-Z), numbers and the symbols "-" and "_".
+name = 'agent_A'
+
+# The server url.
+# server_url = 'https://127.0.0.1:25551'
+
+# An existing path where to manage the fifo files.
+# The default path is '/tmp/ankaios/'.
+# run_folder = '/tmp/ankaios/'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the agent shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to agent certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-agent.pem'
+
+# The path to agent key pem file.
+# key_pem = '/etc/ankaios/certs/ank-agent-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent key pem file.
+# You can either provide key_pem or key_pem_content, but not both
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-agent.service b/recipes-containers/ankaios/files/ank-agent.service
new file mode 100644
index 00000000..6bce3590
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios agent
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-agent
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank-server b/recipes-containers/ankaios/files/ank-server
new file mode 100644
index 00000000..1d241cf5
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server
@@ -0,0 +1,95 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-server
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios server
+### END INIT INFO
+
+set -e
+
+NAME="ank-server"
+DAEMON="/usr/bin/ank-server"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-server.conf b/recipes-containers/ankaios/files/ank-server.conf
new file mode 100644
index 00000000..a7d3b5e8
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.conf
@@ -0,0 +1,40 @@
+# This is the configuration file for an Ankaios server.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The path to the startup configuration manifest file.
+# By default, no startup configuration manifest is used.
+startup_manifest = '/etc/ankaios/state.yaml'
+
+# The address, including the port, to which the server should listen.
+# address = '127.0.0.1:25551'
+
+# The flag to disable TLS communication between
+# the Ankaios server, agents and the ank CLI.
+# If set to 'true' and the certificates are not provided, then the server shall not use TLS.
+insecure = true
+
+# The path to ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+# The path to server certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-server.pem'
+# The path to server key pem file.
+# key_pem = '/etc/ankaios/certs/ank-server-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-server.service b/recipes-containers/ankaios/files/ank-server.service
new file mode 100644
index 00000000..97ae3d5b
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios server
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-server
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank.conf b/recipes-containers/ankaios/files/ank.conf
new file mode 100644
index 00000000..ec925131
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank.conf
@@ -0,0 +1,54 @@
+# This is the configuration file for the ank CLI.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The timeout in milliseconds to wait for a response from the ank-server.
+# response_timeout = 3000 # milliseconds
+
+# The flag to enable verbose output.
+# verbose = false
+
+# The flag to disable all output.
+# quiet = false
+
+# The flag that enables waiting for workloads to be created/deleted.
+# no_wait = false
+
+[default]
+# The URL to Ankaios server.
+# If started in insecure mode then the HTTP protocol shall be used,
+# otherwise the HTTPS protocol shall be used.
+# server_url = 'https://127.0.0.1:25551'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the CLI shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to CLI certificate pem file.
+# crt_pem = '/home/ankaios/.config/ankaios/ank.pem'
+
+# The path to CLI key pem file.
+# key_pem = '/home/ankaios/.config/ankaios/ank-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/state.yaml b/recipes-containers/ankaios/files/state.yaml
new file mode 100644
index 00000000..29953970
--- /dev/null
+++ b/recipes-containers/ankaios/files/state.yaml
@@ -0,0 +1,13 @@
+# Per default no workload is started. Adapt the file according to your needs.
+apiVersion: v1
+workloads:
+# nginx:
+# runtime: podman
+# agent: agent_A
+# restartPolicy: NEVER
+# tags:
+# owner: Ankaios team
+# runtimeConfig: |
+# image: docker.io/nginx:latest
+# commandOptions: ["-p", "8081:80"]
+
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [meta-virtualization][PATCH] Add Eclipse Ankaios container orchestrator recipe
2026-07-08 12:11 [meta-virtualization][PATCH] Add Eclipse Ankaios container orchestrator recipe kaloyan.rusev
@ 2026-07-21 2:40 ` Bruce Ashfield
2026-08-06 10:56 ` [meta-virtualization][PATCH v2] " kaloyan.rusev
1 sibling, 0 replies; 5+ messages in thread
From: Bruce Ashfield @ 2026-07-21 2:40 UTC (permalink / raw)
To: kaloyan.rusev, meta-virtualization
Hi Kaloyan,
Thanks for the Ankaios recipe. Reviewed against the meta-virt layer
conventions and against what we generally ask for when a new orchestrator
lands. Overall content is good: sensible package split (ank / ank-agent /
ank-server + meta), correct FILES/CONFFILES gating on the systemd vs
sysvinit DISTRO_FEATURES, LIC_FILES_CHKSUM points at the in-source
LICENSE (not a template), SRCREV pinned to the v1.0.1 tag. No blocking
issues on the mechanics.
There are three structural asks and a handful of polish notes below.
Structural — please address in a v2
-----------------------------------
1. Missing COMPATIBLE_HOST and no container-runtime coupling in RDEPENDS
Convention in the layer for anything that orchestrates containers:
set COMPATIBLE_HOST to exclude architectures we can't build for
(the k3s/cri-o pattern is "^(?!(qemu)?mips).*"), and RDEPEND on
the actual runtime the agent invokes. Right now the meta-package
ships binaries with no runtime, so `apt install ankaios` on the
target gives you the tools but no way to start a workload.
Ankaios' upstream docs mention podman + Kata Containers as the
supported runtimes. Which one the recipe should require (or
RRECOMMEND) is a decision for the recipe. Whichever you pick will
also bring the seccomp DISTRO_FEATURE requirement transitively —
Ankaios itself doesn't use seccomp (nothing in the 740-crate list
references libseccomp/seccompiler/apparmor), so there's no need to
set REQUIRED_DISTRO_FEATURES = "seccomp" on ankaios directly.
2. Testability in QEMU — required for maintenance in this layer
For meta-virt to accept and maintain a new recipe, we need to be
able to boot it in QEMU and exercise the primary use case
end-to-end. Not a synthetic build-only test. Something like the
crosvm-image-minimal + README-crosvm.md pattern we merged recently:
* A minimal image recipe that lands ankaios + the chosen runtime
+ a small default state.yaml exercising a hello-world workload
* A README alongside the recipe describing the QEMU boot invocation,
the expected `ank get workloads` output, and how to tear down.
* MACHINE = "qemux86-64" as the reference target.
The current recipe is a component-only recipe with no test image
and no how-to-boot documentation. We can't accept that as-is
because the moment upstream breaks something we won't have a
reproducer.
3. License audit for the 740 vendored crates
The recipe declares LICENSE = "Apache-2.0" — that's the upstream
Ankaios project's own license, but with 740 vendored Rust crates
the actual license mix is almost certainly wider (MIT/BSD/ISC
commonly show up in the Rust ecosystem). Please run a real audit
this round rather than deferring — one of:
* `cargo license` or `cargo-deny` against the Cargo.lock,
aggregate the SPDX identifiers, expand LICENSE to the union.
* Or the `oe-go-mod-fetcher` license-scan machinery we use for
Go recipes has a Rust-side equivalent; check if any of your
tooling can consume Cargo.lock.
I've been sweeping this cleanup across the layer's other Rust
recipes (crosvm, netavark, aardvark-dns, podlet, fuse-overlayfs)
as a follow-up, but it's easier for you to do it once upfront than
for us to do it later without knowledge of the vendored graph.
Polish (fold into v2 or address per your judgment)
--------------------------------------------------
* `SECTION = "base"` is unusual for an orchestrator — other recipes
in the layer use `console/utils`, `virtualization/tools`, or
leave it unset.
* Recipe comment says "Add cargo-update-recipe-crates to generate
the crates.inc file automatically" but the inherit line only has
`cargo systemd update-rc.d`. Add cargo-update-recipe-crates so
`bitbake -c update_crates ankaios` works for future maintenance.
* Systemd units are minimalist: no reference to the /etc/ankaios/
config file that the recipe installs, no Restart=on-failure. If
ank-server/ank-agent default to reading /etc/ankaios/*.conf, the
unit should either ExecStart with the path or you should confirm
the default location matches. Otherwise the config file is
orphaned.
* SYSTEMD_AUTO_ENABLE = "enable" is global to the recipe. Cleaner
per-package (SYSTEMD_AUTO_ENABLE:ank-server = "enable", etc.) so
a downstream can toggle one without the other.
* The sysvinit scripts source /etc/default/${NAME} but no template
is installed. A one-line stub with RUST_LOG=info commented out
would spare users from having to create the file from scratch.
I'll hold the recipe until v2 with the structural items addressed.
Happy to review a v2 when you send it.
Bruce
^ permalink raw reply [flat|nested] 5+ messages in thread
* [meta-virtualization][PATCH v2] Add Eclipse Ankaios container orchestrator recipe
2026-07-08 12:11 [meta-virtualization][PATCH] Add Eclipse Ankaios container orchestrator recipe kaloyan.rusev
2026-07-21 2:40 ` Bruce Ashfield
@ 2026-08-06 10:56 ` kaloyan.rusev
2026-08-07 6:59 ` [meta-virtualization][PATCH v3] " kaloyan.rusev
1 sibling, 1 reply; 5+ messages in thread
From: kaloyan.rusev @ 2026-08-06 10:56 UTC (permalink / raw)
To: meta-virtualization; +Cc: Kaloyan Rusev
From: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
Eclipse Ankaios (https://eclipse-ankaios.github.io/ankaios/latest/) is a lightweight workload orchestrator for embedded and automotive systems (part of the Eclipse SDV initiative). It manages OCI containers across one or more nodes through a central server and per-node agents, providing a declarative desired-state model with a small resource footprint. Workloads are described in a manifest and reconciled by the server, while the CLI is used to apply state and inspect the cluster.
The recipe splits the output into ank-server, ank-agent and ank (CLI) packages, with a meta package pulling them together, and ship default configuration plus systemd units and sysvinit scripts gated on the corresponding DISTRO_FEATURES.
Additionally a minimal example image is provided to preproduce and end-to-end workflow.
Signed-off-by: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
---
Hi Bruce,
thanks a lot for your review, really appreciate it!
Also sorry for the delay. By Murphy's law, your reply ended in my spam folder, unlike the others emails from the mailing list :D
I prepared the requested changes as a v2 patch and added a changelog below.
Best regards and thanks again,
Kaloyan
v1->v2:
- COMPATIBLE_HOST: restrict to "^(?!mips).*" as container orchestration
is not supported on MIPS.
Runtime coupling: RRECOMMENDS:ank-agent = "podman containerd nerdctl"
so an installed agent has a runtime to launch workloads with.
REQUIRED_DISTRO_FEATURES = "seccomp" is intentionally not set on the
recipe (Ankaios has no libseccomp/seccompiler/apparmor in its crate
graph); seccomp comes in transitively via podman.
- Add ankaios-image-minimal + README-ankaios.md: a bootable single-node
qemux86-64 reference image (ankaios + podman + a hello-world state.yaml)
that runs one workload end-to-end, with documented boot/verify/
teardown steps. Requires the systemd, virtualization and seccomp
DISTRO_FEATURES via features_check (systemd makes the image more user
friendly as it mounts cgroups and sets up DNS out of the box).
- LICENSE: expand from Apache-2.0 to the audited union of the vendored
crate licenses
"Apache-2.0 & MIT & BSD-3-Clause & ISC & Unicode-3.0 & Zlib & MIT-0 &
OpenSSL", derived from the upstream deny.toml (release-1.0) allow list
and exceptions, cross-checked against ankaios-crates.inc
(ring -> OpenSSL, foldhash -> Zlib, borrow-or-share -> MIT-0,
unicode-ident -> Unicode-3.0).
- SECTION changed to virtualization/tools.
- Updated comment regarding cargo-update-recipe-crates.
- systemd units: pass the config explicitly
(ExecStart ... -x /etc/ankaios/ank-{server,agent}.conf)
- Split the recipe-global SYSTEMD_AUTO_ENABLE into per-package
SYSTEMD_AUTO_ENABLE:ank-server / :ank-agent so downstreams can toggle
one service independently.
- sysvinit parity: install /etc/default/ank-{server,agent} stubs (sourced
by the init scripts; RUST_LOG/LOGFILE documented but commented out) and
pass -x /etc/ankaios/ank-{server,agent}.conf from the init scripts too,
so systemd and sysvinit behave the same.
recipes-containers/ankaios/ankaios-crates.inc | 740 ++++++++++++++++++
recipes-containers/ankaios/ankaios_git.bb | 135 ++++
recipes-containers/ankaios/files/ank-agent | 96 +++
.../ankaios/files/ank-agent.conf | 49 ++
.../ankaios/files/ank-agent.default | 8 +
.../ankaios/files/ank-agent.service | 10 +
recipes-containers/ankaios/files/ank-server | 96 +++
.../ankaios/files/ank-server.conf | 40 +
.../ankaios/files/ank-server.default | 8 +
.../ankaios/files/ank-server.service | 10 +
recipes-containers/ankaios/files/ank.conf | 54 ++
recipes-containers/ankaios/files/state.yaml | 12 +
recipes-extended/images/README-ankaios.md | 96 +++
.../images/ankaios-image-minimal.bb | 39 +
.../images/ankaios-image-minimal/state.yaml | 11 +
15 files changed, 1404 insertions(+)
create mode 100644 recipes-containers/ankaios/ankaios-crates.inc
create mode 100644 recipes-containers/ankaios/ankaios_git.bb
create mode 100644 recipes-containers/ankaios/files/ank-agent
create mode 100644 recipes-containers/ankaios/files/ank-agent.conf
create mode 100644 recipes-containers/ankaios/files/ank-agent.default
create mode 100644 recipes-containers/ankaios/files/ank-agent.service
create mode 100644 recipes-containers/ankaios/files/ank-server
create mode 100644 recipes-containers/ankaios/files/ank-server.conf
create mode 100644 recipes-containers/ankaios/files/ank-server.default
create mode 100644 recipes-containers/ankaios/files/ank-server.service
create mode 100644 recipes-containers/ankaios/files/ank.conf
create mode 100644 recipes-containers/ankaios/files/state.yaml
create mode 100644 recipes-extended/images/README-ankaios.md
create mode 100644 recipes-extended/images/ankaios-image-minimal.bb
create mode 100644 recipes-extended/images/ankaios-image-minimal/state.yaml
diff --git a/recipes-containers/ankaios/ankaios-crates.inc b/recipes-containers/ankaios/ankaios-crates.inc
new file mode 100644
index 00000000..cffef0ce
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios-crates.inc
@@ -0,0 +1,740 @@
+# Autogenerated with 'bitbake -c update_crates ankaios'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/ahash/0.8.12 \
+ crate://crates.io/aho-corasick/1.1.4 \
+ crate://crates.io/allocator-api2/0.2.21 \
+ crate://crates.io/android_system_properties/0.1.5 \
+ crate://crates.io/anstream/1.0.0 \
+ crate://crates.io/anstyle/1.0.14 \
+ crate://crates.io/anstyle-parse/1.0.0 \
+ crate://crates.io/anstyle-query/1.1.5 \
+ crate://crates.io/anstyle-wincon/3.0.11 \
+ crate://crates.io/anyhow/1.0.102 \
+ crate://crates.io/asn1-rs/0.7.1 \
+ crate://crates.io/asn1-rs-derive/0.6.0 \
+ crate://crates.io/asn1-rs-impl/0.2.0 \
+ crate://crates.io/async-trait/0.1.89 \
+ crate://crates.io/atomic-waker/1.1.2 \
+ crate://crates.io/autocfg/1.5.0 \
+ crate://crates.io/axum/0.8.9 \
+ crate://crates.io/axum-core/0.5.6 \
+ crate://crates.io/base64/0.22.1 \
+ crate://crates.io/bit-set/0.8.0 \
+ crate://crates.io/bit-vec/0.8.0 \
+ crate://crates.io/bitflags/2.11.1 \
+ crate://crates.io/block-buffer/0.10.4 \
+ crate://crates.io/borrow-or-share/0.2.4 \
+ crate://crates.io/bumpalo/3.20.2 \
+ crate://crates.io/bytecount/0.6.9 \
+ crate://crates.io/bytes/1.11.1 \
+ crate://crates.io/cc/1.2.61 \
+ crate://crates.io/cfg-if/1.0.4 \
+ crate://crates.io/cfg_aliases/0.2.1 \
+ crate://crates.io/chacha20/0.10.0 \
+ crate://crates.io/chrono/0.4.44 \
+ crate://crates.io/clap/4.6.1 \
+ crate://crates.io/clap_builder/4.6.0 \
+ crate://crates.io/clap_complete/4.6.2 \
+ crate://crates.io/clap_derive/4.6.1 \
+ crate://crates.io/clap_lex/1.1.0 \
+ crate://crates.io/colorchoice/1.0.5 \
+ crate://crates.io/convert_case/0.10.0 \
+ crate://crates.io/core-foundation-sys/0.8.7 \
+ crate://crates.io/cpufeatures/0.2.17 \
+ crate://crates.io/cpufeatures/0.3.0 \
+ crate://crates.io/crossterm/0.29.0 \
+ crate://crates.io/crossterm_winapi/0.9.1 \
+ crate://crates.io/crypto-common/0.1.7 \
+ crate://crates.io/darling/0.20.11 \
+ crate://crates.io/darling_core/0.20.11 \
+ crate://crates.io/darling_macro/0.20.11 \
+ crate://crates.io/data-encoding/2.11.0 \
+ crate://crates.io/der-parser/10.0.0 \
+ crate://crates.io/deranged/0.5.8 \
+ crate://crates.io/derive_builder/0.20.2 \
+ crate://crates.io/derive_builder_core/0.20.2 \
+ crate://crates.io/derive_builder_macro/0.20.2 \
+ crate://crates.io/derive_more/2.1.1 \
+ crate://crates.io/derive_more-impl/2.1.1 \
+ crate://crates.io/difflib/0.4.0 \
+ crate://crates.io/digest/0.10.7 \
+ crate://crates.io/displaydoc/0.2.5 \
+ crate://crates.io/document-features/0.2.12 \
+ crate://crates.io/downcast/0.11.0 \
+ crate://crates.io/dyn-clone/1.0.20 \
+ crate://crates.io/either/1.15.0 \
+ crate://crates.io/email_address/0.2.9 \
+ crate://crates.io/env/1.0.1 \
+ crate://crates.io/env_filter/1.0.1 \
+ crate://crates.io/env_logger/0.11.10 \
+ crate://crates.io/equivalent/1.0.2 \
+ crate://crates.io/errno/0.3.14 \
+ crate://crates.io/fancy-regex/0.17.0 \
+ crate://crates.io/fastrand/2.4.1 \
+ crate://crates.io/find-msvc-tools/0.1.9 \
+ crate://crates.io/fixedbitset/0.5.7 \
+ crate://crates.io/float-cmp/0.9.0 \
+ crate://crates.io/fluent-uri/0.4.1 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/foldhash/0.1.5 \
+ crate://crates.io/foldhash/0.2.0 \
+ crate://crates.io/fraction/0.15.4 \
+ crate://crates.io/fragile/2.1.0 \
+ crate://crates.io/futures-channel/0.3.32 \
+ crate://crates.io/futures-core/0.3.32 \
+ crate://crates.io/futures-macro/0.3.32 \
+ crate://crates.io/futures-sink/0.3.32 \
+ crate://crates.io/futures-task/0.3.32 \
+ crate://crates.io/futures-util/0.3.32 \
+ crate://crates.io/generic-array/0.14.7 \
+ crate://crates.io/getrandom/0.2.17 \
+ crate://crates.io/getrandom/0.3.4 \
+ crate://crates.io/getrandom/0.4.2 \
+ crate://crates.io/h2/0.4.13 \
+ crate://crates.io/handlebars/6.4.0 \
+ crate://crates.io/hashbrown/0.15.5 \
+ crate://crates.io/hashbrown/0.16.1 \
+ crate://crates.io/hashbrown/0.17.0 \
+ crate://crates.io/heck/0.4.1 \
+ crate://crates.io/heck/0.5.0 \
+ crate://crates.io/hex/0.4.3 \
+ crate://crates.io/http/1.4.0 \
+ crate://crates.io/http-body/1.0.1 \
+ crate://crates.io/http-body-util/0.1.3 \
+ crate://crates.io/httparse/1.10.1 \
+ crate://crates.io/httpdate/1.0.3 \
+ crate://crates.io/hyper/1.9.0 \
+ crate://crates.io/hyper-timeout/0.5.2 \
+ crate://crates.io/hyper-util/0.1.20 \
+ crate://crates.io/iana-time-zone/0.1.65 \
+ crate://crates.io/iana-time-zone-haiku/0.1.2 \
+ crate://crates.io/icu_collections/2.2.0 \
+ crate://crates.io/icu_locale_core/2.2.0 \
+ crate://crates.io/icu_normalizer/2.2.0 \
+ crate://crates.io/icu_normalizer_data/2.2.0 \
+ crate://crates.io/icu_properties/2.2.0 \
+ crate://crates.io/icu_properties_data/2.2.0 \
+ crate://crates.io/icu_provider/2.2.0 \
+ crate://crates.io/id-arena/2.3.0 \
+ crate://crates.io/ident_case/1.0.1 \
+ crate://crates.io/idna/1.1.0 \
+ crate://crates.io/idna_adapter/1.2.1 \
+ crate://crates.io/indexmap/2.14.0 \
+ crate://crates.io/is_executable/1.0.5 \
+ crate://crates.io/is_terminal_polyfill/1.70.2 \
+ crate://crates.io/itertools/0.10.5 \
+ crate://crates.io/itertools/0.14.0 \
+ crate://crates.io/itoa/1.0.18 \
+ crate://crates.io/jiff/0.2.24 \
+ crate://crates.io/jiff-static/0.2.24 \
+ crate://crates.io/js-sys/0.3.95 \
+ crate://crates.io/jsonschema/0.44.1 \
+ crate://crates.io/lazy_static/1.5.0 \
+ crate://crates.io/leb128fmt/0.1.0 \
+ crate://crates.io/libc/0.2.186 \
+ crate://crates.io/linux-raw-sys/0.12.1 \
+ crate://crates.io/litemap/0.8.2 \
+ crate://crates.io/litrs/1.0.0 \
+ crate://crates.io/lock_api/0.4.14 \
+ crate://crates.io/log/0.4.29 \
+ crate://crates.io/matchit/0.8.4 \
+ crate://crates.io/memchr/2.8.0 \
+ crate://crates.io/mime/0.3.17 \
+ crate://crates.io/minimal-lexical/0.2.1 \
+ crate://crates.io/mio/1.2.0 \
+ crate://crates.io/mockall/0.11.4 \
+ crate://crates.io/mockall_derive/0.11.4 \
+ crate://crates.io/mockall_double/0.3.1 \
+ crate://crates.io/multimap/0.10.1 \
+ crate://crates.io/nix/0.31.2 \
+ crate://crates.io/nom/7.1.3 \
+ crate://crates.io/normalize-line-endings/0.3.0 \
+ crate://crates.io/ntapi/0.4.3 \
+ crate://crates.io/num/0.4.3 \
+ crate://crates.io/num-bigint/0.4.6 \
+ crate://crates.io/num-cmp/0.1.0 \
+ crate://crates.io/num-complex/0.4.6 \
+ crate://crates.io/num-conv/0.2.1 \
+ crate://crates.io/num-integer/0.1.46 \
+ crate://crates.io/num-iter/0.1.45 \
+ crate://crates.io/num-modular/0.6.1 \
+ crate://crates.io/num-order/1.2.0 \
+ crate://crates.io/num-rational/0.4.2 \
+ crate://crates.io/num-traits/0.2.19 \
+ crate://crates.io/num_threads/0.1.7 \
+ crate://crates.io/objc2-core-foundation/0.3.2 \
+ crate://crates.io/objc2-io-kit/0.3.2 \
+ crate://crates.io/oid-registry/0.8.1 \
+ crate://crates.io/once_cell/1.21.4 \
+ crate://crates.io/once_cell_polyfill/1.70.2 \
+ crate://crates.io/outref/0.5.2 \
+ crate://crates.io/papergrid/0.13.0 \
+ crate://crates.io/parking_lot/0.12.5 \
+ crate://crates.io/parking_lot_core/0.9.12 \
+ crate://crates.io/percent-encoding/2.3.2 \
+ crate://crates.io/pest/2.8.6 \
+ crate://crates.io/pest_derive/2.8.6 \
+ crate://crates.io/pest_generator/2.8.6 \
+ crate://crates.io/pest_meta/2.8.6 \
+ crate://crates.io/petgraph/0.8.3 \
+ crate://crates.io/pin-project/1.1.11 \
+ crate://crates.io/pin-project-internal/1.1.11 \
+ crate://crates.io/pin-project-lite/0.2.17 \
+ crate://crates.io/portable-atomic/1.13.1 \
+ crate://crates.io/portable-atomic-util/0.2.7 \
+ crate://crates.io/potential_utf/0.1.5 \
+ crate://crates.io/powerfmt/0.2.0 \
+ crate://crates.io/ppv-lite86/0.2.21 \
+ crate://crates.io/predicates/2.1.5 \
+ crate://crates.io/predicates-core/1.0.10 \
+ crate://crates.io/predicates-tree/1.0.13 \
+ crate://crates.io/prettyplease/0.2.37 \
+ crate://crates.io/proc-macro-error-attr2/2.0.0 \
+ crate://crates.io/proc-macro-error2/2.0.1 \
+ crate://crates.io/proc-macro2/1.0.106 \
+ crate://crates.io/prost/0.14.3 \
+ crate://crates.io/prost-build/0.14.3 \
+ crate://crates.io/prost-derive/0.14.3 \
+ crate://crates.io/prost-types/0.14.3 \
+ crate://crates.io/pulldown-cmark/0.13.3 \
+ crate://crates.io/pulldown-cmark-to-cmark/22.0.0 \
+ crate://crates.io/quote/1.0.45 \
+ crate://crates.io/r-efi/5.3.0 \
+ crate://crates.io/r-efi/6.0.0 \
+ crate://crates.io/rand/0.9.4 \
+ crate://crates.io/rand/0.10.1 \
+ crate://crates.io/rand_chacha/0.9.0 \
+ crate://crates.io/rand_core/0.9.5 \
+ crate://crates.io/rand_core/0.10.1 \
+ crate://crates.io/redox_syscall/0.5.18 \
+ crate://crates.io/ref-cast/1.0.25 \
+ crate://crates.io/ref-cast-impl/1.0.25 \
+ crate://crates.io/referencing/0.44.1 \
+ crate://crates.io/regex/1.12.3 \
+ crate://crates.io/regex-automata/0.4.14 \
+ crate://crates.io/regex-syntax/0.8.10 \
+ crate://crates.io/ring/0.17.14 \
+ crate://crates.io/rustc_version/0.4.1 \
+ crate://crates.io/rusticata-macros/4.1.0 \
+ crate://crates.io/rustix/1.1.4 \
+ crate://crates.io/rustls/0.23.39 \
+ crate://crates.io/rustls-pki-types/1.14.1 \
+ crate://crates.io/rustls-webpki/0.103.13 \
+ crate://crates.io/rustversion/1.0.22 \
+ crate://crates.io/ryu/1.0.23 \
+ crate://crates.io/schemars/1.2.1 \
+ crate://crates.io/schemars_derive/1.2.1 \
+ crate://crates.io/scopeguard/1.2.0 \
+ crate://crates.io/semver/1.0.28 \
+ crate://crates.io/serde/1.0.228 \
+ crate://crates.io/serde_core/1.0.228 \
+ crate://crates.io/serde_derive/1.0.228 \
+ crate://crates.io/serde_derive_internals/0.29.1 \
+ crate://crates.io/serde_json/1.0.149 \
+ crate://crates.io/serde_spanned/1.1.1 \
+ crate://crates.io/serde_yaml/0.9.34+deprecated \
+ crate://crates.io/sha2/0.10.9 \
+ crate://crates.io/sha256/1.6.0 \
+ crate://crates.io/shlex/1.3.0 \
+ crate://crates.io/signal-hook/0.3.18 \
+ crate://crates.io/signal-hook-mio/0.2.5 \
+ crate://crates.io/signal-hook-registry/1.4.8 \
+ crate://crates.io/slab/0.4.12 \
+ crate://crates.io/smallvec/1.15.1 \
+ crate://crates.io/socket2/0.6.3 \
+ crate://crates.io/stable_deref_trait/1.2.1 \
+ crate://crates.io/strsim/0.11.1 \
+ crate://crates.io/subtle/2.6.1 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/syn/2.0.117 \
+ crate://crates.io/sync_wrapper/1.0.2 \
+ crate://crates.io/synstructure/0.13.2 \
+ crate://crates.io/sysinfo/0.38.4 \
+ crate://crates.io/tabled/0.17.0 \
+ crate://crates.io/tabled_derive/0.9.0 \
+ crate://crates.io/tempfile/3.27.0 \
+ crate://crates.io/termtree/0.5.1 \
+ crate://crates.io/thiserror/1.0.69 \
+ crate://crates.io/thiserror/2.0.18 \
+ crate://crates.io/thiserror-impl/1.0.69 \
+ crate://crates.io/thiserror-impl/2.0.18 \
+ crate://crates.io/time/0.3.47 \
+ crate://crates.io/time-core/0.1.8 \
+ crate://crates.io/time-macros/0.2.27 \
+ crate://crates.io/tinystr/0.8.3 \
+ crate://crates.io/tokio/1.52.1 \
+ crate://crates.io/tokio-macros/2.7.0 \
+ crate://crates.io/tokio-rustls/0.26.4 \
+ crate://crates.io/tokio-stream/0.1.18 \
+ crate://crates.io/tokio-util/0.7.18 \
+ crate://crates.io/toml/0.9.12+spec-1.1.0 \
+ crate://crates.io/toml_datetime/0.7.5+spec-1.1.0 \
+ crate://crates.io/toml_parser/1.1.2+spec-1.1.0 \
+ crate://crates.io/toml_writer/1.1.1+spec-1.1.0 \
+ crate://crates.io/tonic/0.14.5 \
+ crate://crates.io/tonic-build/0.14.5 \
+ crate://crates.io/tonic-prost/0.14.5 \
+ crate://crates.io/tonic-prost-build/0.14.5 \
+ crate://crates.io/tower/0.5.3 \
+ crate://crates.io/tower-layer/0.3.3 \
+ crate://crates.io/tower-service/0.3.3 \
+ crate://crates.io/tracing/0.1.44 \
+ crate://crates.io/tracing-attributes/0.1.31 \
+ crate://crates.io/tracing-core/0.1.36 \
+ crate://crates.io/try-lock/0.2.5 \
+ crate://crates.io/typenum/1.20.0 \
+ crate://crates.io/ucd-trie/0.1.7 \
+ crate://crates.io/umask/2.1.0 \
+ crate://crates.io/unicase/2.9.0 \
+ crate://crates.io/unicode-general-category/1.1.0 \
+ crate://crates.io/unicode-ident/1.0.24 \
+ crate://crates.io/unicode-segmentation/1.13.2 \
+ crate://crates.io/unicode-width/0.2.2 \
+ crate://crates.io/unicode-xid/0.2.6 \
+ crate://crates.io/unsafe-libyaml/0.2.11 \
+ crate://crates.io/untrusted/0.9.0 \
+ crate://crates.io/utf8_iter/1.0.4 \
+ crate://crates.io/utf8parse/0.2.2 \
+ crate://crates.io/uuid/1.23.1 \
+ crate://crates.io/uuid-simd/0.8.0 \
+ crate://crates.io/version_check/0.9.5 \
+ crate://crates.io/vsimd/0.8.0 \
+ crate://crates.io/want/0.3.1 \
+ crate://crates.io/wasi/0.11.1+wasi-snapshot-preview1 \
+ crate://crates.io/wasip2/1.0.3+wasi-0.2.9 \
+ crate://crates.io/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06 \
+ crate://crates.io/wasm-bindgen/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro-support/0.2.118 \
+ crate://crates.io/wasm-bindgen-shared/0.2.118 \
+ crate://crates.io/wasm-encoder/0.244.0 \
+ crate://crates.io/wasm-metadata/0.244.0 \
+ crate://crates.io/wasmparser/0.244.0 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows/0.62.2 \
+ crate://crates.io/windows-collections/0.3.2 \
+ crate://crates.io/windows-core/0.62.2 \
+ crate://crates.io/windows-future/0.3.2 \
+ crate://crates.io/windows-implement/0.60.2 \
+ crate://crates.io/windows-interface/0.59.3 \
+ crate://crates.io/windows-link/0.2.1 \
+ crate://crates.io/windows-numerics/0.3.1 \
+ crate://crates.io/windows-result/0.4.1 \
+ crate://crates.io/windows-strings/0.5.1 \
+ crate://crates.io/windows-sys/0.52.0 \
+ crate://crates.io/windows-sys/0.60.2 \
+ crate://crates.io/windows-sys/0.61.2 \
+ crate://crates.io/windows-targets/0.52.6 \
+ crate://crates.io/windows-targets/0.53.5 \
+ crate://crates.io/windows-threading/0.2.1 \
+ crate://crates.io/windows_aarch64_gnullvm/0.52.6 \
+ crate://crates.io/windows_aarch64_gnullvm/0.53.1 \
+ crate://crates.io/windows_aarch64_msvc/0.52.6 \
+ crate://crates.io/windows_aarch64_msvc/0.53.1 \
+ crate://crates.io/windows_i686_gnu/0.52.6 \
+ crate://crates.io/windows_i686_gnu/0.53.1 \
+ crate://crates.io/windows_i686_gnullvm/0.52.6 \
+ crate://crates.io/windows_i686_gnullvm/0.53.1 \
+ crate://crates.io/windows_i686_msvc/0.52.6 \
+ crate://crates.io/windows_i686_msvc/0.53.1 \
+ crate://crates.io/windows_x86_64_gnu/0.52.6 \
+ crate://crates.io/windows_x86_64_gnu/0.53.1 \
+ crate://crates.io/windows_x86_64_gnullvm/0.52.6 \
+ crate://crates.io/windows_x86_64_gnullvm/0.53.1 \
+ crate://crates.io/windows_x86_64_msvc/0.52.6 \
+ crate://crates.io/windows_x86_64_msvc/0.53.1 \
+ crate://crates.io/winnow/0.7.15 \
+ crate://crates.io/winnow/1.0.2 \
+ crate://crates.io/wit-bindgen/0.51.0 \
+ crate://crates.io/wit-bindgen/0.57.1 \
+ crate://crates.io/wit-bindgen-core/0.51.0 \
+ crate://crates.io/wit-bindgen-rust/0.51.0 \
+ crate://crates.io/wit-bindgen-rust-macro/0.51.0 \
+ crate://crates.io/wit-component/0.244.0 \
+ crate://crates.io/wit-parser/0.244.0 \
+ crate://crates.io/writeable/0.6.3 \
+ crate://crates.io/x509-parser/0.18.1 \
+ crate://crates.io/yoke/0.8.2 \
+ crate://crates.io/yoke-derive/0.8.2 \
+ crate://crates.io/zerocopy/0.8.48 \
+ crate://crates.io/zerocopy-derive/0.8.48 \
+ crate://crates.io/zerofrom/0.1.7 \
+ crate://crates.io/zerofrom-derive/0.1.7 \
+ crate://crates.io/zeroize/1.8.2 \
+ crate://crates.io/zerotrie/0.2.4 \
+ crate://crates.io/zerovec/0.11.6 \
+ crate://crates.io/zerovec-derive/0.11.3 \
+ crate://crates.io/zmij/1.0.21 \
+"
+
+SRC_URI[ahash-0.8.12.sha256sum] = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+SRC_URI[aho-corasick-1.1.4.sha256sum] = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+SRC_URI[allocator-api2-0.2.21.sha256sum] = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+SRC_URI[android_system_properties-0.1.5.sha256sum] = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+SRC_URI[anstream-1.0.0.sha256sum] = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
+SRC_URI[anstyle-1.0.14.sha256sum] = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
+SRC_URI[anstyle-parse-1.0.0.sha256sum] = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
+SRC_URI[anstyle-query-1.1.5.sha256sum] = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+SRC_URI[anstyle-wincon-3.0.11.sha256sum] = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+SRC_URI[anyhow-1.0.102.sha256sum] = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
+SRC_URI[asn1-rs-0.7.1.sha256sum] = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60"
+SRC_URI[asn1-rs-derive-0.6.0.sha256sum] = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
+SRC_URI[asn1-rs-impl-0.2.0.sha256sum] = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
+SRC_URI[async-trait-0.1.89.sha256sum] = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+SRC_URI[atomic-waker-1.1.2.sha256sum] = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+SRC_URI[autocfg-1.5.0.sha256sum] = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+SRC_URI[axum-0.8.9.sha256sum] = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
+SRC_URI[axum-core-0.5.6.sha256sum] = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
+SRC_URI[base64-0.22.1.sha256sum] = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+SRC_URI[bit-set-0.8.0.sha256sum] = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+SRC_URI[bit-vec-0.8.0.sha256sum] = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+SRC_URI[bitflags-2.11.1.sha256sum] = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
+SRC_URI[block-buffer-0.10.4.sha256sum] = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+SRC_URI[borrow-or-share-0.2.4.sha256sum] = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
+SRC_URI[bumpalo-3.20.2.sha256sum] = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
+SRC_URI[bytecount-0.6.9.sha256sum] = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
+SRC_URI[bytes-1.11.1.sha256sum] = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
+SRC_URI[cc-1.2.61.sha256sum] = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
+SRC_URI[cfg-if-1.0.4.sha256sum] = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+SRC_URI[cfg_aliases-0.2.1.sha256sum] = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+SRC_URI[chacha20-0.10.0.sha256sum] = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
+SRC_URI[chrono-0.4.44.sha256sum] = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
+SRC_URI[clap-4.6.1.sha256sum] = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
+SRC_URI[clap_builder-4.6.0.sha256sum] = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
+SRC_URI[clap_complete-4.6.2.sha256sum] = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb"
+SRC_URI[clap_derive-4.6.1.sha256sum] = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
+SRC_URI[clap_lex-1.1.0.sha256sum] = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
+SRC_URI[colorchoice-1.0.5.sha256sum] = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+SRC_URI[convert_case-0.10.0.sha256sum] = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+SRC_URI[core-foundation-sys-0.8.7.sha256sum] = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+SRC_URI[cpufeatures-0.2.17.sha256sum] = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+SRC_URI[cpufeatures-0.3.0.sha256sum] = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
+SRC_URI[crossterm-0.29.0.sha256sum] = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+SRC_URI[crossterm_winapi-0.9.1.sha256sum] = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+SRC_URI[crypto-common-0.1.7.sha256sum] = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+SRC_URI[darling-0.20.11.sha256sum] = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+SRC_URI[darling_core-0.20.11.sha256sum] = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+SRC_URI[darling_macro-0.20.11.sha256sum] = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+SRC_URI[data-encoding-2.11.0.sha256sum] = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
+SRC_URI[der-parser-10.0.0.sha256sum] = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6"
+SRC_URI[deranged-0.5.8.sha256sum] = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
+SRC_URI[derive_builder-0.20.2.sha256sum] = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
+SRC_URI[derive_builder_core-0.20.2.sha256sum] = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
+SRC_URI[derive_builder_macro-0.20.2.sha256sum] = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
+SRC_URI[derive_more-2.1.1.sha256sum] = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+SRC_URI[derive_more-impl-2.1.1.sha256sum] = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+SRC_URI[difflib-0.4.0.sha256sum] = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+SRC_URI[digest-0.10.7.sha256sum] = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+SRC_URI[displaydoc-0.2.5.sha256sum] = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+SRC_URI[document-features-0.2.12.sha256sum] = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+SRC_URI[downcast-0.11.0.sha256sum] = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
+SRC_URI[dyn-clone-1.0.20.sha256sum] = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+SRC_URI[either-1.15.0.sha256sum] = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+SRC_URI[email_address-0.2.9.sha256sum] = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
+SRC_URI[env-1.0.1.sha256sum] = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d"
+SRC_URI[env_filter-1.0.1.sha256sum] = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
+SRC_URI[env_logger-0.11.10.sha256sum] = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
+SRC_URI[equivalent-1.0.2.sha256sum] = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+SRC_URI[errno-0.3.14.sha256sum] = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+SRC_URI[fancy-regex-0.17.0.sha256sum] = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8"
+SRC_URI[fastrand-2.4.1.sha256sum] = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
+SRC_URI[find-msvc-tools-0.1.9.sha256sum] = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+SRC_URI[fixedbitset-0.5.7.sha256sum] = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
+SRC_URI[float-cmp-0.9.0.sha256sum] = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+SRC_URI[fluent-uri-0.4.1.sha256sum] = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[foldhash-0.1.5.sha256sum] = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+SRC_URI[foldhash-0.2.0.sha256sum] = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+SRC_URI[fraction-0.15.4.sha256sum] = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872"
+SRC_URI[fragile-2.1.0.sha256sum] = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9"
+SRC_URI[futures-channel-0.3.32.sha256sum] = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
+SRC_URI[futures-core-0.3.32.sha256sum] = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
+SRC_URI[futures-macro-0.3.32.sha256sum] = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
+SRC_URI[futures-sink-0.3.32.sha256sum] = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
+SRC_URI[futures-task-0.3.32.sha256sum] = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
+SRC_URI[futures-util-0.3.32.sha256sum] = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
+SRC_URI[generic-array-0.14.7.sha256sum] = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+SRC_URI[getrandom-0.2.17.sha256sum] = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+SRC_URI[getrandom-0.3.4.sha256sum] = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+SRC_URI[getrandom-0.4.2.sha256sum] = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+SRC_URI[h2-0.4.13.sha256sum] = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
+SRC_URI[handlebars-6.4.0.sha256sum] = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e"
+SRC_URI[hashbrown-0.15.5.sha256sum] = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+SRC_URI[hashbrown-0.16.1.sha256sum] = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+SRC_URI[hashbrown-0.17.0.sha256sum] = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+SRC_URI[hex-0.4.3.sha256sum] = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+SRC_URI[http-1.4.0.sha256sum] = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
+SRC_URI[http-body-1.0.1.sha256sum] = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+SRC_URI[http-body-util-0.1.3.sha256sum] = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+SRC_URI[httparse-1.10.1.sha256sum] = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+SRC_URI[httpdate-1.0.3.sha256sum] = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+SRC_URI[hyper-1.9.0.sha256sum] = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
+SRC_URI[hyper-timeout-0.5.2.sha256sum] = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
+SRC_URI[hyper-util-0.1.20.sha256sum] = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+SRC_URI[iana-time-zone-0.1.65.sha256sum] = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+SRC_URI[iana-time-zone-haiku-0.1.2.sha256sum] = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+SRC_URI[icu_collections-2.2.0.sha256sum] = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
+SRC_URI[icu_locale_core-2.2.0.sha256sum] = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
+SRC_URI[icu_normalizer-2.2.0.sha256sum] = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
+SRC_URI[icu_normalizer_data-2.2.0.sha256sum] = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
+SRC_URI[icu_properties-2.2.0.sha256sum] = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
+SRC_URI[icu_properties_data-2.2.0.sha256sum] = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
+SRC_URI[icu_provider-2.2.0.sha256sum] = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
+SRC_URI[id-arena-2.3.0.sha256sum] = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+SRC_URI[ident_case-1.0.1.sha256sum] = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+SRC_URI[idna-1.1.0.sha256sum] = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+SRC_URI[idna_adapter-1.2.1.sha256sum] = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+SRC_URI[indexmap-2.14.0.sha256sum] = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
+SRC_URI[is_executable-1.0.5.sha256sum] = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4"
+SRC_URI[is_terminal_polyfill-1.70.2.sha256sum] = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+SRC_URI[itertools-0.10.5.sha256sum] = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+SRC_URI[itertools-0.14.0.sha256sum] = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+SRC_URI[itoa-1.0.18.sha256sum] = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+SRC_URI[jiff-0.2.24.sha256sum] = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d"
+SRC_URI[jiff-static-0.2.24.sha256sum] = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7"
+SRC_URI[js-sys-0.3.95.sha256sum] = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
+SRC_URI[jsonschema-0.44.1.sha256sum] = "f98b64a413c93a1b413dfbaf973b78d271648b9cae50b10302ad88af78991672"
+SRC_URI[lazy_static-1.5.0.sha256sum] = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+SRC_URI[leb128fmt-0.1.0.sha256sum] = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+SRC_URI[libc-0.2.186.sha256sum] = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+SRC_URI[linux-raw-sys-0.12.1.sha256sum] = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+SRC_URI[litemap-0.8.2.sha256sum] = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
+SRC_URI[litrs-1.0.0.sha256sum] = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
+SRC_URI[lock_api-0.4.14.sha256sum] = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+SRC_URI[log-0.4.29.sha256sum] = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+SRC_URI[matchit-0.8.4.sha256sum] = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
+SRC_URI[memchr-2.8.0.sha256sum] = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+SRC_URI[mime-0.3.17.sha256sum] = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+SRC_URI[mio-1.2.0.sha256sum] = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
+SRC_URI[mockall-0.11.4.sha256sum] = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96"
+SRC_URI[mockall_derive-0.11.4.sha256sum] = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
+SRC_URI[mockall_double-0.3.1.sha256sum] = "f1ca96e5ac35256ae3e13536edd39b172b88f41615e1d7b653c8ad24524113e8"
+SRC_URI[multimap-0.10.1.sha256sum] = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
+SRC_URI[nix-0.31.2.sha256sum] = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3"
+SRC_URI[nom-7.1.3.sha256sum] = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+SRC_URI[normalize-line-endings-0.3.0.sha256sum] = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+SRC_URI[ntapi-0.4.3.sha256sum] = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae"
+SRC_URI[num-0.4.3.sha256sum] = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
+SRC_URI[num-bigint-0.4.6.sha256sum] = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+SRC_URI[num-cmp-0.1.0.sha256sum] = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa"
+SRC_URI[num-complex-0.4.6.sha256sum] = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+SRC_URI[num-conv-0.2.1.sha256sum] = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
+SRC_URI[num-integer-0.1.46.sha256sum] = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+SRC_URI[num-iter-0.1.45.sha256sum] = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
+SRC_URI[num-modular-0.6.1.sha256sum] = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f"
+SRC_URI[num-order-1.2.0.sha256sum] = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6"
+SRC_URI[num-rational-0.4.2.sha256sum] = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+SRC_URI[num-traits-0.2.19.sha256sum] = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+SRC_URI[num_threads-0.1.7.sha256sum] = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+SRC_URI[objc2-core-foundation-0.3.2.sha256sum] = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+SRC_URI[objc2-io-kit-0.3.2.sha256sum] = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15"
+SRC_URI[oid-registry-0.8.1.sha256sum] = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7"
+SRC_URI[once_cell-1.21.4.sha256sum] = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+SRC_URI[once_cell_polyfill-1.70.2.sha256sum] = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+SRC_URI[outref-0.5.2.sha256sum] = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
+SRC_URI[papergrid-0.13.0.sha256sum] = "d2b0f8def1f117e13c895f3eda65a7b5650688da29d6ad04635f61bc7b92eebd"
+SRC_URI[parking_lot-0.12.5.sha256sum] = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+SRC_URI[parking_lot_core-0.9.12.sha256sum] = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+SRC_URI[percent-encoding-2.3.2.sha256sum] = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+SRC_URI[pest-2.8.6.sha256sum] = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
+SRC_URI[pest_derive-2.8.6.sha256sum] = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
+SRC_URI[pest_generator-2.8.6.sha256sum] = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
+SRC_URI[pest_meta-2.8.6.sha256sum] = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
+SRC_URI[petgraph-0.8.3.sha256sum] = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
+SRC_URI[pin-project-1.1.11.sha256sum] = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517"
+SRC_URI[pin-project-internal-1.1.11.sha256sum] = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6"
+SRC_URI[pin-project-lite-0.2.17.sha256sum] = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
+SRC_URI[portable-atomic-1.13.1.sha256sum] = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+SRC_URI[portable-atomic-util-0.2.7.sha256sum] = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
+SRC_URI[potential_utf-0.1.5.sha256sum] = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
+SRC_URI[powerfmt-0.2.0.sha256sum] = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+SRC_URI[ppv-lite86-0.2.21.sha256sum] = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+SRC_URI[predicates-2.1.5.sha256sum] = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
+SRC_URI[predicates-core-1.0.10.sha256sum] = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144"
+SRC_URI[predicates-tree-1.0.13.sha256sum] = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2"
+SRC_URI[prettyplease-0.2.37.sha256sum] = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+SRC_URI[proc-macro-error-attr2-2.0.0.sha256sum] = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
+SRC_URI[proc-macro-error2-2.0.1.sha256sum] = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
+SRC_URI[proc-macro2-1.0.106.sha256sum] = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+SRC_URI[prost-0.14.3.sha256sum] = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
+SRC_URI[prost-build-0.14.3.sha256sum] = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7"
+SRC_URI[prost-derive-0.14.3.sha256sum] = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
+SRC_URI[prost-types-0.14.3.sha256sum] = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7"
+SRC_URI[pulldown-cmark-0.13.3.sha256sum] = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad"
+SRC_URI[pulldown-cmark-to-cmark-22.0.0.sha256sum] = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90"
+SRC_URI[quote-1.0.45.sha256sum] = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+SRC_URI[r-efi-5.3.0.sha256sum] = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+SRC_URI[r-efi-6.0.0.sha256sum] = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+SRC_URI[rand-0.9.4.sha256sum] = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
+SRC_URI[rand-0.10.1.sha256sum] = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
+SRC_URI[rand_chacha-0.9.0.sha256sum] = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+SRC_URI[rand_core-0.9.5.sha256sum] = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
+SRC_URI[rand_core-0.10.1.sha256sum] = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
+SRC_URI[redox_syscall-0.5.18.sha256sum] = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+SRC_URI[ref-cast-1.0.25.sha256sum] = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+SRC_URI[ref-cast-impl-1.0.25.sha256sum] = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+SRC_URI[referencing-0.44.1.sha256sum] = "22952642836711d7a730d23a4dfb0d732e75a85e4c4f5704266d9c8fac278ff1"
+SRC_URI[regex-1.12.3.sha256sum] = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
+SRC_URI[regex-automata-0.4.14.sha256sum] = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
+SRC_URI[regex-syntax-0.8.10.sha256sum] = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
+SRC_URI[ring-0.17.14.sha256sum] = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+SRC_URI[rustc_version-0.4.1.sha256sum] = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+SRC_URI[rusticata-macros-4.1.0.sha256sum] = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
+SRC_URI[rustix-1.1.4.sha256sum] = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+SRC_URI[rustls-0.23.39.sha256sum] = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e"
+SRC_URI[rustls-pki-types-1.14.1.sha256sum] = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
+SRC_URI[rustls-webpki-0.103.13.sha256sum] = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
+SRC_URI[rustversion-1.0.22.sha256sum] = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+SRC_URI[ryu-1.0.23.sha256sum] = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
+SRC_URI[schemars-1.2.1.sha256sum] = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
+SRC_URI[schemars_derive-1.2.1.sha256sum] = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f"
+SRC_URI[scopeguard-1.2.0.sha256sum] = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+SRC_URI[semver-1.0.28.sha256sum] = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
+SRC_URI[serde-1.0.228.sha256sum] = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+SRC_URI[serde_core-1.0.228.sha256sum] = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+SRC_URI[serde_derive-1.0.228.sha256sum] = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+SRC_URI[serde_derive_internals-0.29.1.sha256sum] = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+SRC_URI[serde_json-1.0.149.sha256sum] = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+SRC_URI[serde_spanned-1.1.1.sha256sum] = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
+SRC_URI[serde_yaml-0.9.34+deprecated.sha256sum] = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
+SRC_URI[sha2-0.10.9.sha256sum] = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+SRC_URI[sha256-1.6.0.sha256sum] = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6"
+SRC_URI[shlex-1.3.0.sha256sum] = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+SRC_URI[signal-hook-0.3.18.sha256sum] = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+SRC_URI[signal-hook-mio-0.2.5.sha256sum] = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+SRC_URI[signal-hook-registry-1.4.8.sha256sum] = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+SRC_URI[slab-0.4.12.sha256sum] = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
+SRC_URI[smallvec-1.15.1.sha256sum] = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+SRC_URI[socket2-0.6.3.sha256sum] = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
+SRC_URI[stable_deref_trait-1.2.1.sha256sum] = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+SRC_URI[strsim-0.11.1.sha256sum] = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+SRC_URI[subtle-2.6.1.sha256sum] = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[syn-2.0.117.sha256sum] = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+SRC_URI[sync_wrapper-1.0.2.sha256sum] = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+SRC_URI[synstructure-0.13.2.sha256sum] = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+SRC_URI[sysinfo-0.38.4.sha256sum] = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f"
+SRC_URI[tabled-0.17.0.sha256sum] = "c6709222f3973137427ce50559cd564dc187a95b9cfe01613d2f4e93610e510a"
+SRC_URI[tabled_derive-0.9.0.sha256sum] = "931be476627d4c54070a1f3a9739ccbfec9b36b39815106a20cce2243bbcefe1"
+SRC_URI[tempfile-3.27.0.sha256sum] = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
+SRC_URI[termtree-0.5.1.sha256sum] = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
+SRC_URI[thiserror-1.0.69.sha256sum] = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+SRC_URI[thiserror-2.0.18.sha256sum] = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+SRC_URI[thiserror-impl-1.0.69.sha256sum] = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+SRC_URI[thiserror-impl-2.0.18.sha256sum] = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+SRC_URI[time-0.3.47.sha256sum] = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
+SRC_URI[time-core-0.1.8.sha256sum] = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
+SRC_URI[time-macros-0.2.27.sha256sum] = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
+SRC_URI[tinystr-0.8.3.sha256sum] = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
+SRC_URI[tokio-1.52.1.sha256sum] = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"
+SRC_URI[tokio-macros-2.7.0.sha256sum] = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
+SRC_URI[tokio-rustls-0.26.4.sha256sum] = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
+SRC_URI[tokio-stream-0.1.18.sha256sum] = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
+SRC_URI[tokio-util-0.7.18.sha256sum] = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
+SRC_URI[toml-0.9.12+spec-1.1.0.sha256sum] = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+SRC_URI[toml_datetime-0.7.5+spec-1.1.0.sha256sum] = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+SRC_URI[toml_parser-1.1.2+spec-1.1.0.sha256sum] = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+SRC_URI[toml_writer-1.1.1+spec-1.1.0.sha256sum] = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
+SRC_URI[tonic-0.14.5.sha256sum] = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"
+SRC_URI[tonic-build-0.14.5.sha256sum] = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734"
+SRC_URI[tonic-prost-0.14.5.sha256sum] = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309"
+SRC_URI[tonic-prost-build-0.14.5.sha256sum] = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a"
+SRC_URI[tower-0.5.3.sha256sum] = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+SRC_URI[tower-layer-0.3.3.sha256sum] = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+SRC_URI[tower-service-0.3.3.sha256sum] = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+SRC_URI[tracing-0.1.44.sha256sum] = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+SRC_URI[tracing-attributes-0.1.31.sha256sum] = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+SRC_URI[tracing-core-0.1.36.sha256sum] = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+SRC_URI[try-lock-0.2.5.sha256sum] = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+SRC_URI[typenum-1.20.0.sha256sum] = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
+SRC_URI[ucd-trie-0.1.7.sha256sum] = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
+SRC_URI[umask-2.1.0.sha256sum] = "ec9a46c2549e35c054e0ffe281a3a6ec0007793db4df106604d37ed3f4d73d1c"
+SRC_URI[unicase-2.9.0.sha256sum] = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
+SRC_URI[unicode-general-category-1.1.0.sha256sum] = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
+SRC_URI[unicode-ident-1.0.24.sha256sum] = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+SRC_URI[unicode-segmentation-1.13.2.sha256sum] = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
+SRC_URI[unicode-width-0.2.2.sha256sum] = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+SRC_URI[unicode-xid-0.2.6.sha256sum] = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+SRC_URI[unsafe-libyaml-0.2.11.sha256sum] = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
+SRC_URI[untrusted-0.9.0.sha256sum] = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+SRC_URI[utf8_iter-1.0.4.sha256sum] = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+SRC_URI[utf8parse-0.2.2.sha256sum] = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+SRC_URI[uuid-1.23.1.sha256sum] = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
+SRC_URI[uuid-simd-0.8.0.sha256sum] = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
+SRC_URI[version_check-0.9.5.sha256sum] = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+SRC_URI[vsimd-0.8.0.sha256sum] = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+SRC_URI[want-0.3.1.sha256sum] = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+SRC_URI[wasi-0.11.1+wasi-snapshot-preview1.sha256sum] = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+SRC_URI[wasip2-1.0.3+wasi-0.2.9.sha256sum] = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
+SRC_URI[wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.sha256sum] = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
+SRC_URI[wasm-bindgen-0.2.118.sha256sum] = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
+SRC_URI[wasm-bindgen-macro-0.2.118.sha256sum] = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
+SRC_URI[wasm-bindgen-macro-support-0.2.118.sha256sum] = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
+SRC_URI[wasm-bindgen-shared-0.2.118.sha256sum] = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
+SRC_URI[wasm-encoder-0.244.0.sha256sum] = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+SRC_URI[wasm-metadata-0.244.0.sha256sum] = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+SRC_URI[wasmparser-0.244.0.sha256sum] = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-0.62.2.sha256sum] = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
+SRC_URI[windows-collections-0.3.2.sha256sum] = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
+SRC_URI[windows-core-0.62.2.sha256sum] = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+SRC_URI[windows-future-0.3.2.sha256sum] = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
+SRC_URI[windows-implement-0.60.2.sha256sum] = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+SRC_URI[windows-interface-0.59.3.sha256sum] = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+SRC_URI[windows-link-0.2.1.sha256sum] = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+SRC_URI[windows-numerics-0.3.1.sha256sum] = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
+SRC_URI[windows-result-0.4.1.sha256sum] = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+SRC_URI[windows-strings-0.5.1.sha256sum] = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+SRC_URI[windows-sys-0.60.2.sha256sum] = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+SRC_URI[windows-sys-0.61.2.sha256sum] = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+SRC_URI[windows-targets-0.52.6.sha256sum] = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+SRC_URI[windows-targets-0.53.5.sha256sum] = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+SRC_URI[windows-threading-0.2.1.sha256sum] = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
+SRC_URI[windows_aarch64_gnullvm-0.52.6.sha256sum] = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+SRC_URI[windows_aarch64_gnullvm-0.53.1.sha256sum] = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+SRC_URI[windows_aarch64_msvc-0.52.6.sha256sum] = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+SRC_URI[windows_aarch64_msvc-0.53.1.sha256sum] = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+SRC_URI[windows_i686_gnu-0.52.6.sha256sum] = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+SRC_URI[windows_i686_gnu-0.53.1.sha256sum] = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+SRC_URI[windows_i686_gnullvm-0.52.6.sha256sum] = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+SRC_URI[windows_i686_gnullvm-0.53.1.sha256sum] = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+SRC_URI[windows_i686_msvc-0.52.6.sha256sum] = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+SRC_URI[windows_i686_msvc-0.53.1.sha256sum] = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+SRC_URI[windows_x86_64_gnu-0.52.6.sha256sum] = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+SRC_URI[windows_x86_64_gnu-0.53.1.sha256sum] = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+SRC_URI[windows_x86_64_gnullvm-0.52.6.sha256sum] = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+SRC_URI[windows_x86_64_gnullvm-0.53.1.sha256sum] = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+SRC_URI[windows_x86_64_msvc-0.52.6.sha256sum] = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+SRC_URI[windows_x86_64_msvc-0.53.1.sha256sum] = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+SRC_URI[winnow-0.7.15.sha256sum] = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
+SRC_URI[winnow-1.0.2.sha256sum] = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
+SRC_URI[wit-bindgen-0.51.0.sha256sum] = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+SRC_URI[wit-bindgen-0.57.1.sha256sum] = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+SRC_URI[wit-bindgen-core-0.51.0.sha256sum] = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+SRC_URI[wit-bindgen-rust-0.51.0.sha256sum] = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+SRC_URI[wit-bindgen-rust-macro-0.51.0.sha256sum] = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+SRC_URI[wit-component-0.244.0.sha256sum] = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+SRC_URI[wit-parser-0.244.0.sha256sum] = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+SRC_URI[writeable-0.6.3.sha256sum] = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
+SRC_URI[x509-parser-0.18.1.sha256sum] = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202"
+SRC_URI[yoke-0.8.2.sha256sum] = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
+SRC_URI[yoke-derive-0.8.2.sha256sum] = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
+SRC_URI[zerocopy-0.8.48.sha256sum] = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
+SRC_URI[zerocopy-derive-0.8.48.sha256sum] = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
+SRC_URI[zerofrom-0.1.7.sha256sum] = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
+SRC_URI[zerofrom-derive-0.1.7.sha256sum] = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
+SRC_URI[zeroize-1.8.2.sha256sum] = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
+SRC_URI[zerotrie-0.2.4.sha256sum] = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
+SRC_URI[zerovec-0.11.6.sha256sum] = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
+SRC_URI[zerovec-derive-0.11.3.sha256sum] = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
+SRC_URI[zmij-1.0.21.sha256sum] = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/recipes-containers/ankaios/ankaios_git.bb b/recipes-containers/ankaios/ankaios_git.bb
new file mode 100644
index 00000000..49b83c8f
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios_git.bb
@@ -0,0 +1,135 @@
+SUMMARY = "Eclipse Ankaios: Lightweight container orchestrator for embedded Linux"
+DESCRIPTION = "Eclipse Ankaios is a lightweight container runtime for embedded Linux systems. This recipe builds Ankaios from source using vendored Rust crates."
+HOMEPAGE = "https://eclipse-ankaios.github.io/ankaios/latest/"
+BUGTRACKER = "https://github.com/eclipse-ankaios/ankaios/issues"
+
+SECTION = "virtualization/tools"
+
+CVE_PRODUCT = "eclipse:ankaios"
+
+# Ankaios itself is Apache-2.0; the rest is the license union of the >700 vendored
+# crates, derived from upstream deny.toml (release-1.0) and verified against
+# ankaios-crates.inc (ring->OpenSSL, foldhash->Zlib, borrow-or-share->MIT-0,
+# unicode-ident->Unicode-3.0).
+LICENSE = "Apache-2.0 & MIT & BSD-3-Clause & ISC & Unicode-3.0 & Zlib & MIT-0 & OpenSSL"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+# Container runtime stack is not supported on MIPS
+COMPATIBLE_HOST = "^(?!mips).*"
+
+
+# Build dependencies
+DEPENDS += "protobuf-native"
+
+PV = "1.0.1"
+
+SRC_URI = "\
+ git://github.com/eclipse-ankaios/ankaios.git;protocol=https;branch=release-1.0 \
+ file://state.yaml \
+ file://ank.conf \
+ file://ank-server.conf \
+ file://ank-agent.conf \
+ file://ank-server.service \
+ file://ank-agent.service \
+ file://ank-server;subdir=init-scripts \
+ file://ank-agent;subdir=init-scripts \
+ file://ank-server.default \
+ file://ank-agent.default \
+"
+
+# v1.0.1 tag commit
+# When bumping SRCREV, re-diff upstream deny.toml and re-check LICENSE against the crate graph.
+SRCREV = "cde70616706b58fd03e4de3f7423addaffa58720"
+
+require ${BPN}-crates.inc
+
+# Add cargo-update-recipe-crates so `bitbake -c update_crates ankaios` works for future maintenance
+inherit cargo systemd update-rc.d
+
+# Package split:
+# - ank-server: server binary + server config + systemd unit
+# - ank-agent: agent binary + agent config + systemd unit
+# - ank: CLI binary ("ank")
+# - ankaios (${PN}): meta package pulling server+agent+cli
+PACKAGE_BEFORE_PN = "ank ank-agent ank-server"
+
+ALLOW_EMPTY:${PN} = "1"
+
+FILES:ank += "${bindir}/ank \
+ ${sysconfdir}/ankaios/ank.conf \
+"
+
+FILES:ank-agent += "\
+ ${bindir}/ank-agent \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-agent.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-agent', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-agent', '', d)} \
+ ${sysconfdir}/ankaios/ank-agent.conf \
+"
+
+FILES:ank-server += "\
+ ${bindir}/ank-server \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-server.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-server', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-server', '', d)} \
+ ${sysconfdir}/ankaios/state.yaml \
+ ${sysconfdir}/ankaios/ank-server.conf \
+"
+
+RDEPENDS:${PN} = "ank ank-agent ank-server"
+
+# The agent shells out to a container runtime to launch workloads
+# Ankaios does not require the following to start, but running workloads requires Podman and/or containerd + nertdctl.
+RRECOMMENDS:ank-agent += "podman \
+ containerd \
+ nerdctl \
+ "
+
+CONFFILES:ank = "${sysconfdir}/ankaios/ank.conf"
+CONFFILES:ank-server = "${sysconfdir}/ankaios/state.yaml ${sysconfdir}/ankaios/ank-server.conf ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-server', '', d)}"
+CONFFILES:ank-agent = "${sysconfdir}/ankaios/ank-agent.conf ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-agent', '', d)}"
+
+# Install/enable systemd units when systemd is enabled
+SYSTEMD_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'ank-server ank-agent', '', d)}"
+SYSTEMD_SERVICE:ank-server = "ank-server.service"
+SYSTEMD_SERVICE:ank-agent = "ank-agent.service"
+SYSTEMD_AUTO_ENABLE:ank-server = "enable"
+SYSTEMD_AUTO_ENABLE:ank-agent = "enable"
+
+INITSCRIPT_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'ank-server ank-agent', '', d)}"
+INITSCRIPT_NAME:ank-server = "ank-server"
+INITSCRIPT_PARAMS:ank-server = "start 70 2 3 4 5 . stop 30 0 1 6 ."
+INITSCRIPT_NAME:ank-agent = "ank-agent"
+INITSCRIPT_PARAMS:ank-agent = "start 71 2 3 4 5 . stop 29 0 1 6 ."
+
+do_install() {
+ # Install binaries
+ install -d ${D}${bindir}
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-server ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-agent ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank ${D}${bindir}/
+
+ # Install configuration directory
+ install -d ${D}${sysconfdir}/ankaios
+ install -m 0644 ${UNPACKDIR}/state.yaml ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-server.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-agent.conf ${D}${sysconfdir}/ankaios/
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${UNPACKDIR}/ank-server.service ${D}${systemd_system_unitdir}/
+ install -m 0644 ${UNPACKDIR}/ank-agent.service ${D}${systemd_system_unitdir}/
+ fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-server ${D}${sysconfdir}/init.d/ank-server
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-agent ${D}${sysconfdir}/init.d/ank-agent
+
+ install -d ${D}${sysconfdir}/default
+ install -m 0644 ${UNPACKDIR}/ank-server.default ${D}${sysconfdir}/default/ank-server
+ install -m 0644 ${UNPACKDIR}/ank-agent.default ${D}${sysconfdir}/default/ank-agent
+ fi
+
+}
diff --git a/recipes-containers/ankaios/files/ank-agent b/recipes-containers/ankaios/files/ank-agent
new file mode 100644
index 00000000..05b32d72
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent
@@ -0,0 +1,96 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-agent
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios agent
+### END INIT INFO
+
+set -e
+
+NAME="ank-agent"
+DAEMON="/usr/bin/ank-agent"
+CONFIG="/etc/ankaios/ank-agent.conf"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" -x \"$CONFIG\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-agent.conf b/recipes-containers/ankaios/files/ank-agent.conf
new file mode 100644
index 00000000..fb91d4ab
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.conf
@@ -0,0 +1,49 @@
+# This is the configuration file for an Ankaios agent.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The name to use for the registration with the server.
+# Every agent has to register with a unique name.
+# Agent name shall contain only regular upper and lowercase characters
+# (a-z and A-Z), numbers and the symbols "-" and "_".
+name = 'agent_A'
+
+# The server url.
+# server_url = 'https://127.0.0.1:25551'
+
+# An existing path where to manage the fifo files.
+# The default path is '/tmp/ankaios/'.
+# run_folder = '/tmp/ankaios/'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the agent shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to agent certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-agent.pem'
+
+# The path to agent key pem file.
+# key_pem = '/etc/ankaios/certs/ank-agent-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent key pem file.
+# You can either provide key_pem or key_pem_content, but not both
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-agent.default b/recipes-containers/ankaios/files/ank-agent.default
new file mode 100644
index 00000000..501afab9
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.default
@@ -0,0 +1,8 @@
+# Environment overrides for the ank-agent sysvinit service.
+# Sourced by /etc/init.d/ank-agent. Uncomment and adjust as needed.
+
+# Log level for the Ankaios agent (error, warn, info, debug, trace).
+#RUST_LOG=info
+
+# Log file written by the init script.
+#LOGFILE=/var/log/ank-agent.log
diff --git a/recipes-containers/ankaios/files/ank-agent.service b/recipes-containers/ankaios/files/ank-agent.service
new file mode 100644
index 00000000..e14551df
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios agent
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-agent -x /etc/ankaios/ank-agent.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank-server b/recipes-containers/ankaios/files/ank-server
new file mode 100644
index 00000000..3d4a0f19
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server
@@ -0,0 +1,96 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-server
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios server
+### END INIT INFO
+
+set -e
+
+NAME="ank-server"
+DAEMON="/usr/bin/ank-server"
+CONFIG="/etc/ankaios/ank-server.conf"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" -x \"$CONFIG\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-server.conf b/recipes-containers/ankaios/files/ank-server.conf
new file mode 100644
index 00000000..a7d3b5e8
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.conf
@@ -0,0 +1,40 @@
+# This is the configuration file for an Ankaios server.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The path to the startup configuration manifest file.
+# By default, no startup configuration manifest is used.
+startup_manifest = '/etc/ankaios/state.yaml'
+
+# The address, including the port, to which the server should listen.
+# address = '127.0.0.1:25551'
+
+# The flag to disable TLS communication between
+# the Ankaios server, agents and the ank CLI.
+# If set to 'true' and the certificates are not provided, then the server shall not use TLS.
+insecure = true
+
+# The path to ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+# The path to server certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-server.pem'
+# The path to server key pem file.
+# key_pem = '/etc/ankaios/certs/ank-server-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-server.default b/recipes-containers/ankaios/files/ank-server.default
new file mode 100644
index 00000000..a16f3c92
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.default
@@ -0,0 +1,8 @@
+# Environment overrides for the ank-server sysvinit service.
+# Sourced by /etc/init.d/ank-server. Uncomment and adjust as needed.
+
+# Log level for the Ankaios server (error, warn, info, debug, trace).
+#RUST_LOG=info
+
+# Log file written by the init script.
+#LOGFILE=/var/log/ank-server.log
diff --git a/recipes-containers/ankaios/files/ank-server.service b/recipes-containers/ankaios/files/ank-server.service
new file mode 100644
index 00000000..425920d5
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios server
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-server -x /etc/ankaios/ank-server.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank.conf b/recipes-containers/ankaios/files/ank.conf
new file mode 100644
index 00000000..ec925131
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank.conf
@@ -0,0 +1,54 @@
+# This is the configuration file for the ank CLI.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The timeout in milliseconds to wait for a response from the ank-server.
+# response_timeout = 3000 # milliseconds
+
+# The flag to enable verbose output.
+# verbose = false
+
+# The flag to disable all output.
+# quiet = false
+
+# The flag that enables waiting for workloads to be created/deleted.
+# no_wait = false
+
+[default]
+# The URL to Ankaios server.
+# If started in insecure mode then the HTTP protocol shall be used,
+# otherwise the HTTPS protocol shall be used.
+# server_url = 'https://127.0.0.1:25551'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the CLI shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to CLI certificate pem file.
+# crt_pem = '/home/ankaios/.config/ankaios/ank.pem'
+
+# The path to CLI key pem file.
+# key_pem = '/home/ankaios/.config/ankaios/ank-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/state.yaml b/recipes-containers/ankaios/files/state.yaml
new file mode 100644
index 00000000..3ed730a8
--- /dev/null
+++ b/recipes-containers/ankaios/files/state.yaml
@@ -0,0 +1,12 @@
+# Per default no workload is started. Adapt the file according to your needs.
+apiVersion: v1
+workloads:
+# nginx:
+# runtime: podman
+# agent: agent_A
+# restartPolicy: NEVER
+# tags:
+# owner: Ankaios team
+# runtimeConfig: |
+# image: docker.io/nginx:latest
+# commandOptions: ["-p", "8081:80"]
diff --git a/recipes-extended/images/README-ankaios.md b/recipes-extended/images/README-ankaios.md
new file mode 100644
index 00000000..4260a673
--- /dev/null
+++ b/recipes-extended/images/README-ankaios.md
@@ -0,0 +1,96 @@
+# Booting and testing Ankaios in QEMU
+
+`ankaios-image-minimal` is a small reference image used to exercise Eclipse
+Ankaios end-to-end. It boots a single QEMU node running the Ankaios **server**
+and **agent** with the **podman** runtime, and starts one hello-ankaios
+workload from `/etc/ankaios/state.yaml`.
+
+Reference target: **`MACHINE = "qemux86-64"`**.
+
+## Prerequisites
+
+Because the image pulls in `podman`, the following layers and distro settings
+must be present in your build configuration (they live outside this layer):
+
+* Layers: `meta-openembedded` (`meta-oe`, `meta-python`, `meta-networking`) and
+ `meta-virtualization`, in addition to `openembedded-core` and `meta-ankaios`.
+* systemd as the init manager, in your distro or `local.conf`:
+
+ ```bitbake
+ INIT_MANAGER = "systemd"
+ ```
+
+* Distro features:
+
+ ```bitbake
+ DISTRO_FEATURES:append = " virtualization seccomp"
+ ```
+
+`podman` requires the `seccomp` distro feature; the Ankaios recipes themselves
+do not. systemd is required (enforced via `REQUIRED_DISTRO_FEATURES`) because it
+mounts cgroups and configures DNS out of the box; with sysvinit you have to do
+both manually before podman can run a workload.
+
+## Build
+
+```shell
+MACHINE=qemux86-64 bitbake ankaios-image-minimal
+```
+
+## Boot
+
+```shell
+runqemu qemux86-64 ankaios-image-minimal nographic slirp
+```
+
+* `nographic` keeps everything on the serial console.
+* `slirp` gives the guest outbound networking so podman can pull
+ `docker.io/alpine:latest` on first start.
+
+Log in as `root` on the serial console with no password. The image sets
+`allow-empty-password empty-root-password allow-root-login`, so this is a
+debug/test image and not suitable for production use.
+
+## Verify the workload
+
+The server auto-starts from `/etc/ankaios/state.yaml`, the agent registers as
+`agent_A`, and podman pulls and runs the `hello-ankaios` workload. Query the state
+with the `ank` CLI:
+
+```shell
+ank get workloads
+```
+
+Expected output (the pull may take a few seconds on first boot, during which
+the state passes through `Pending(...)`):
+
+```
+ WORKLOAD NAME AGENT RUNTIME EXECUTION STATE ADDITIONAL INFO
+ hello-ankaios agent_A podman Running(Ok)
+```
+
+You can cross-check at the runtime level:
+
+```shell
+podman ps
+```
+
+which should list the running `hello-ankaios` container.
+
+## Tear down
+
+Stop the workload by deleting it through Ankaios (the agent tells podman to
+remove the container):
+
+```shell
+ank delete workload hello-ankaios
+```
+
+`ank get workloads` should then show no workloads, and `podman ps` no
+containers. To shut the whole node down, power off the guest:
+
+```shell
+poweroff
+```
+
+or terminate QEMU from the host with `Ctrl-a x` (in `nographic` mode).
diff --git a/recipes-extended/images/ankaios-image-minimal.bb b/recipes-extended/images/ankaios-image-minimal.bb
new file mode 100644
index 00000000..4ea142a9
--- /dev/null
+++ b/recipes-extended/images/ankaios-image-minimal.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Minimal image to boot and test Eclipse Ankaios end-to-end in QEMU"
+DESCRIPTION = "A small reference image that lands the Ankaios server, agent and \
+ank CLI together with the podman runtime and a state.yaml manifest. \
+boots on qemux86-64 and starts a demo workload so the orchestrator can be \
+exercised end-to-end. See README-ankaios.md for the boot/verify/teardown steps."
+
+LICENSE = "Apache-2.0"
+
+inherit core-image features_check
+
+# Podman needs virtualization + seccomp; systemd is required because it mounts
+# cgroups and sets up DNS out of the box, which the sysvinit path does not.
+REQUIRED_DISTRO_FEATURES ?= "virtualization seccomp systemd"
+
+# Reference target documented in README-ankaios.md
+COMPATIBLE_MACHINE = "qemux86-64"
+
+# Debug/test image: passwordless root login on the serial console
+IMAGE_FEATURES += "allow-empty-password empty-root-password allow-root-login"
+
+# ankaios pulls server + agent + ank CLI; podman is the workload runtime the
+# agent shells out to for the hello-world state.yaml below.
+IMAGE_INSTALL:append = " ankaios podman"
+
+# Headroom (1 GB) for the workload container image podman pulls at runtime
+IMAGE_ROOTFS_EXTRA_SPACE = "1000000"
+
+# Capture the in-layer path at parse time (only valid during parsing, hence
+# ':='), and track it so do_rootfs reruns when state.yaml changes.
+STATE_YAML_SRC := "${THISDIR}/${PN}/state.yaml"
+do_rootfs[file-checksums] += "${STATE_YAML_SRC}:True"
+
+# Override the (empty) default state.yaml shipped by ank-server with one that
+# defines the hello-ankaios workload.
+ROOTFS_POSTPROCESS_COMMAND += "install_ankaios_test_state;"
+install_ankaios_test_state() {
+ install -d ${IMAGE_ROOTFS}${sysconfdir}/ankaios
+ install -m 0644 ${STATE_YAML_SRC} ${IMAGE_ROOTFS}${sysconfdir}/ankaios/state.yaml
+}
diff --git a/recipes-extended/images/ankaios-image-minimal/state.yaml b/recipes-extended/images/ankaios-image-minimal/state.yaml
new file mode 100644
index 00000000..89fe43b5
--- /dev/null
+++ b/recipes-extended/images/ankaios-image-minimal/state.yaml
@@ -0,0 +1,11 @@
+# Example startup state for the ankaios-image-minimal test image.
+# Starts a single long-running "hello-ankaios" workload under podman so the
+# orchestrator can be exercised end-to-end (see README-ankaios.md).
+apiVersion: v1
+workloads:
+ hello-ankaios:
+ runtime: podman
+ agent: agent_A
+ runtimeConfig: |
+ image: docker.io/alpine:latest
+ commandArgs: [ "sh", "-c", "trap 'echo; exit' SIGINT SIGTERM; while true; do echo 'Hello Ankaios!'; sleep 1; done" ]
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [meta-virtualization][PATCH v3] Add Eclipse Ankaios container orchestrator recipe
2026-08-06 10:56 ` [meta-virtualization][PATCH v2] " kaloyan.rusev
@ 2026-08-07 6:59 ` kaloyan.rusev
2026-08-07 18:31 ` Bruce Ashfield
0 siblings, 1 reply; 5+ messages in thread
From: kaloyan.rusev @ 2026-08-07 6:59 UTC (permalink / raw)
To: meta-virtualization; +Cc: Kaloyan Rusev
From: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
Eclipse Ankaios (https://eclipse-ankaios.github.io/ankaios/latest/) is a lightweight workload orchestrator for embedded and automotive systems (part of the Eclipse SDV initiative). It manages OCI containers across one or more nodes through a central server and per-node agents, providing a declarative desired-state model with a small resource footprint. Workloads are described in a manifest and reconciled by the server, while the CLI is used to apply state and inspect the cluster.
The recipe splits the output into ank-server, ank-agent and ank (CLI) packages, with a meta package pulling them together, and ship default configuration plus systemd units and sysvinit scripts gated on the corresponding DISTRO_FEATURES.
Additionally a minimal example image is provided to preproduce and end-to-end workflow.
Signed-off-by: Kaloyan Rusev <kaloyan.rusev@elektrobit.com>
---
Hi Bruce,
I went through the recipes again and found some small issues. Here is a v3 version of the patch.
A description of the changes since v2 can be found below.
I also forgot to say that I'll be on vacation for a couple of weeks, so I'll take care of possible findings afterwards.
Thanks a lot for youtr time!
Best regards
Kaloyan
v2->v3:
recipes-containers/ankaios/ankaios_git.bb
- COMPATIBLE_HOST tightened from "^(?!mips).*" to "^(?!(qemu)?mips).*"
so qemumips/qemumips64 are also excluded (matches k3s/cri-o).
- DESCRIPTION reworded from "container runtime" to
"container/workload orchestrator"
- PV set to "1.0.1+git" to match the layer's _git recipe convention.
- Minors: dropped a stray blank line, fixed typos (nerdctl).
recipes-extended/images/README-ankaios.md
- Removed a stray "meta-ankaios" layer from the prerequisites (leftover
from the downstream layer); only openembedded-core, meta-openembedded
and meta-virtualization are needed.
- Added qemuparams="-m 2048" to the runqemu boot line so podman has
enough RAM to pull/run the demo workload.
recipes-extended/images/ankaios-image-minimal.bb
- Fixed a broken DESCRIPTION line continuation (trailing space after '\')
and reworded to "It boots on qemux86-64 ...".
recipes-containers/ankaios/ankaios-crates.inc | 740 ++++++++++++++++++
recipes-containers/ankaios/ankaios_git.bb | 134 ++++
recipes-containers/ankaios/files/ank-agent | 96 +++
.../ankaios/files/ank-agent.conf | 49 ++
.../ankaios/files/ank-agent.default | 8 +
.../ankaios/files/ank-agent.service | 10 +
recipes-containers/ankaios/files/ank-server | 96 +++
.../ankaios/files/ank-server.conf | 40 +
.../ankaios/files/ank-server.default | 8 +
.../ankaios/files/ank-server.service | 10 +
recipes-containers/ankaios/files/ank.conf | 54 ++
recipes-containers/ankaios/files/state.yaml | 12 +
recipes-extended/images/README-ankaios.md | 96 +++
.../images/ankaios-image-minimal.bb | 39 +
.../images/ankaios-image-minimal/state.yaml | 11 +
15 files changed, 1403 insertions(+)
create mode 100644 recipes-containers/ankaios/ankaios-crates.inc
create mode 100644 recipes-containers/ankaios/ankaios_git.bb
create mode 100644 recipes-containers/ankaios/files/ank-agent
create mode 100644 recipes-containers/ankaios/files/ank-agent.conf
create mode 100644 recipes-containers/ankaios/files/ank-agent.default
create mode 100644 recipes-containers/ankaios/files/ank-agent.service
create mode 100644 recipes-containers/ankaios/files/ank-server
create mode 100644 recipes-containers/ankaios/files/ank-server.conf
create mode 100644 recipes-containers/ankaios/files/ank-server.default
create mode 100644 recipes-containers/ankaios/files/ank-server.service
create mode 100644 recipes-containers/ankaios/files/ank.conf
create mode 100644 recipes-containers/ankaios/files/state.yaml
create mode 100644 recipes-extended/images/README-ankaios.md
create mode 100644 recipes-extended/images/ankaios-image-minimal.bb
create mode 100644 recipes-extended/images/ankaios-image-minimal/state.yaml
diff --git a/recipes-containers/ankaios/ankaios-crates.inc b/recipes-containers/ankaios/ankaios-crates.inc
new file mode 100644
index 00000000..cffef0ce
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios-crates.inc
@@ -0,0 +1,740 @@
+# Autogenerated with 'bitbake -c update_crates ankaios'
+
+# from Cargo.lock
+SRC_URI += " \
+ crate://crates.io/ahash/0.8.12 \
+ crate://crates.io/aho-corasick/1.1.4 \
+ crate://crates.io/allocator-api2/0.2.21 \
+ crate://crates.io/android_system_properties/0.1.5 \
+ crate://crates.io/anstream/1.0.0 \
+ crate://crates.io/anstyle/1.0.14 \
+ crate://crates.io/anstyle-parse/1.0.0 \
+ crate://crates.io/anstyle-query/1.1.5 \
+ crate://crates.io/anstyle-wincon/3.0.11 \
+ crate://crates.io/anyhow/1.0.102 \
+ crate://crates.io/asn1-rs/0.7.1 \
+ crate://crates.io/asn1-rs-derive/0.6.0 \
+ crate://crates.io/asn1-rs-impl/0.2.0 \
+ crate://crates.io/async-trait/0.1.89 \
+ crate://crates.io/atomic-waker/1.1.2 \
+ crate://crates.io/autocfg/1.5.0 \
+ crate://crates.io/axum/0.8.9 \
+ crate://crates.io/axum-core/0.5.6 \
+ crate://crates.io/base64/0.22.1 \
+ crate://crates.io/bit-set/0.8.0 \
+ crate://crates.io/bit-vec/0.8.0 \
+ crate://crates.io/bitflags/2.11.1 \
+ crate://crates.io/block-buffer/0.10.4 \
+ crate://crates.io/borrow-or-share/0.2.4 \
+ crate://crates.io/bumpalo/3.20.2 \
+ crate://crates.io/bytecount/0.6.9 \
+ crate://crates.io/bytes/1.11.1 \
+ crate://crates.io/cc/1.2.61 \
+ crate://crates.io/cfg-if/1.0.4 \
+ crate://crates.io/cfg_aliases/0.2.1 \
+ crate://crates.io/chacha20/0.10.0 \
+ crate://crates.io/chrono/0.4.44 \
+ crate://crates.io/clap/4.6.1 \
+ crate://crates.io/clap_builder/4.6.0 \
+ crate://crates.io/clap_complete/4.6.2 \
+ crate://crates.io/clap_derive/4.6.1 \
+ crate://crates.io/clap_lex/1.1.0 \
+ crate://crates.io/colorchoice/1.0.5 \
+ crate://crates.io/convert_case/0.10.0 \
+ crate://crates.io/core-foundation-sys/0.8.7 \
+ crate://crates.io/cpufeatures/0.2.17 \
+ crate://crates.io/cpufeatures/0.3.0 \
+ crate://crates.io/crossterm/0.29.0 \
+ crate://crates.io/crossterm_winapi/0.9.1 \
+ crate://crates.io/crypto-common/0.1.7 \
+ crate://crates.io/darling/0.20.11 \
+ crate://crates.io/darling_core/0.20.11 \
+ crate://crates.io/darling_macro/0.20.11 \
+ crate://crates.io/data-encoding/2.11.0 \
+ crate://crates.io/der-parser/10.0.0 \
+ crate://crates.io/deranged/0.5.8 \
+ crate://crates.io/derive_builder/0.20.2 \
+ crate://crates.io/derive_builder_core/0.20.2 \
+ crate://crates.io/derive_builder_macro/0.20.2 \
+ crate://crates.io/derive_more/2.1.1 \
+ crate://crates.io/derive_more-impl/2.1.1 \
+ crate://crates.io/difflib/0.4.0 \
+ crate://crates.io/digest/0.10.7 \
+ crate://crates.io/displaydoc/0.2.5 \
+ crate://crates.io/document-features/0.2.12 \
+ crate://crates.io/downcast/0.11.0 \
+ crate://crates.io/dyn-clone/1.0.20 \
+ crate://crates.io/either/1.15.0 \
+ crate://crates.io/email_address/0.2.9 \
+ crate://crates.io/env/1.0.1 \
+ crate://crates.io/env_filter/1.0.1 \
+ crate://crates.io/env_logger/0.11.10 \
+ crate://crates.io/equivalent/1.0.2 \
+ crate://crates.io/errno/0.3.14 \
+ crate://crates.io/fancy-regex/0.17.0 \
+ crate://crates.io/fastrand/2.4.1 \
+ crate://crates.io/find-msvc-tools/0.1.9 \
+ crate://crates.io/fixedbitset/0.5.7 \
+ crate://crates.io/float-cmp/0.9.0 \
+ crate://crates.io/fluent-uri/0.4.1 \
+ crate://crates.io/fnv/1.0.7 \
+ crate://crates.io/foldhash/0.1.5 \
+ crate://crates.io/foldhash/0.2.0 \
+ crate://crates.io/fraction/0.15.4 \
+ crate://crates.io/fragile/2.1.0 \
+ crate://crates.io/futures-channel/0.3.32 \
+ crate://crates.io/futures-core/0.3.32 \
+ crate://crates.io/futures-macro/0.3.32 \
+ crate://crates.io/futures-sink/0.3.32 \
+ crate://crates.io/futures-task/0.3.32 \
+ crate://crates.io/futures-util/0.3.32 \
+ crate://crates.io/generic-array/0.14.7 \
+ crate://crates.io/getrandom/0.2.17 \
+ crate://crates.io/getrandom/0.3.4 \
+ crate://crates.io/getrandom/0.4.2 \
+ crate://crates.io/h2/0.4.13 \
+ crate://crates.io/handlebars/6.4.0 \
+ crate://crates.io/hashbrown/0.15.5 \
+ crate://crates.io/hashbrown/0.16.1 \
+ crate://crates.io/hashbrown/0.17.0 \
+ crate://crates.io/heck/0.4.1 \
+ crate://crates.io/heck/0.5.0 \
+ crate://crates.io/hex/0.4.3 \
+ crate://crates.io/http/1.4.0 \
+ crate://crates.io/http-body/1.0.1 \
+ crate://crates.io/http-body-util/0.1.3 \
+ crate://crates.io/httparse/1.10.1 \
+ crate://crates.io/httpdate/1.0.3 \
+ crate://crates.io/hyper/1.9.0 \
+ crate://crates.io/hyper-timeout/0.5.2 \
+ crate://crates.io/hyper-util/0.1.20 \
+ crate://crates.io/iana-time-zone/0.1.65 \
+ crate://crates.io/iana-time-zone-haiku/0.1.2 \
+ crate://crates.io/icu_collections/2.2.0 \
+ crate://crates.io/icu_locale_core/2.2.0 \
+ crate://crates.io/icu_normalizer/2.2.0 \
+ crate://crates.io/icu_normalizer_data/2.2.0 \
+ crate://crates.io/icu_properties/2.2.0 \
+ crate://crates.io/icu_properties_data/2.2.0 \
+ crate://crates.io/icu_provider/2.2.0 \
+ crate://crates.io/id-arena/2.3.0 \
+ crate://crates.io/ident_case/1.0.1 \
+ crate://crates.io/idna/1.1.0 \
+ crate://crates.io/idna_adapter/1.2.1 \
+ crate://crates.io/indexmap/2.14.0 \
+ crate://crates.io/is_executable/1.0.5 \
+ crate://crates.io/is_terminal_polyfill/1.70.2 \
+ crate://crates.io/itertools/0.10.5 \
+ crate://crates.io/itertools/0.14.0 \
+ crate://crates.io/itoa/1.0.18 \
+ crate://crates.io/jiff/0.2.24 \
+ crate://crates.io/jiff-static/0.2.24 \
+ crate://crates.io/js-sys/0.3.95 \
+ crate://crates.io/jsonschema/0.44.1 \
+ crate://crates.io/lazy_static/1.5.0 \
+ crate://crates.io/leb128fmt/0.1.0 \
+ crate://crates.io/libc/0.2.186 \
+ crate://crates.io/linux-raw-sys/0.12.1 \
+ crate://crates.io/litemap/0.8.2 \
+ crate://crates.io/litrs/1.0.0 \
+ crate://crates.io/lock_api/0.4.14 \
+ crate://crates.io/log/0.4.29 \
+ crate://crates.io/matchit/0.8.4 \
+ crate://crates.io/memchr/2.8.0 \
+ crate://crates.io/mime/0.3.17 \
+ crate://crates.io/minimal-lexical/0.2.1 \
+ crate://crates.io/mio/1.2.0 \
+ crate://crates.io/mockall/0.11.4 \
+ crate://crates.io/mockall_derive/0.11.4 \
+ crate://crates.io/mockall_double/0.3.1 \
+ crate://crates.io/multimap/0.10.1 \
+ crate://crates.io/nix/0.31.2 \
+ crate://crates.io/nom/7.1.3 \
+ crate://crates.io/normalize-line-endings/0.3.0 \
+ crate://crates.io/ntapi/0.4.3 \
+ crate://crates.io/num/0.4.3 \
+ crate://crates.io/num-bigint/0.4.6 \
+ crate://crates.io/num-cmp/0.1.0 \
+ crate://crates.io/num-complex/0.4.6 \
+ crate://crates.io/num-conv/0.2.1 \
+ crate://crates.io/num-integer/0.1.46 \
+ crate://crates.io/num-iter/0.1.45 \
+ crate://crates.io/num-modular/0.6.1 \
+ crate://crates.io/num-order/1.2.0 \
+ crate://crates.io/num-rational/0.4.2 \
+ crate://crates.io/num-traits/0.2.19 \
+ crate://crates.io/num_threads/0.1.7 \
+ crate://crates.io/objc2-core-foundation/0.3.2 \
+ crate://crates.io/objc2-io-kit/0.3.2 \
+ crate://crates.io/oid-registry/0.8.1 \
+ crate://crates.io/once_cell/1.21.4 \
+ crate://crates.io/once_cell_polyfill/1.70.2 \
+ crate://crates.io/outref/0.5.2 \
+ crate://crates.io/papergrid/0.13.0 \
+ crate://crates.io/parking_lot/0.12.5 \
+ crate://crates.io/parking_lot_core/0.9.12 \
+ crate://crates.io/percent-encoding/2.3.2 \
+ crate://crates.io/pest/2.8.6 \
+ crate://crates.io/pest_derive/2.8.6 \
+ crate://crates.io/pest_generator/2.8.6 \
+ crate://crates.io/pest_meta/2.8.6 \
+ crate://crates.io/petgraph/0.8.3 \
+ crate://crates.io/pin-project/1.1.11 \
+ crate://crates.io/pin-project-internal/1.1.11 \
+ crate://crates.io/pin-project-lite/0.2.17 \
+ crate://crates.io/portable-atomic/1.13.1 \
+ crate://crates.io/portable-atomic-util/0.2.7 \
+ crate://crates.io/potential_utf/0.1.5 \
+ crate://crates.io/powerfmt/0.2.0 \
+ crate://crates.io/ppv-lite86/0.2.21 \
+ crate://crates.io/predicates/2.1.5 \
+ crate://crates.io/predicates-core/1.0.10 \
+ crate://crates.io/predicates-tree/1.0.13 \
+ crate://crates.io/prettyplease/0.2.37 \
+ crate://crates.io/proc-macro-error-attr2/2.0.0 \
+ crate://crates.io/proc-macro-error2/2.0.1 \
+ crate://crates.io/proc-macro2/1.0.106 \
+ crate://crates.io/prost/0.14.3 \
+ crate://crates.io/prost-build/0.14.3 \
+ crate://crates.io/prost-derive/0.14.3 \
+ crate://crates.io/prost-types/0.14.3 \
+ crate://crates.io/pulldown-cmark/0.13.3 \
+ crate://crates.io/pulldown-cmark-to-cmark/22.0.0 \
+ crate://crates.io/quote/1.0.45 \
+ crate://crates.io/r-efi/5.3.0 \
+ crate://crates.io/r-efi/6.0.0 \
+ crate://crates.io/rand/0.9.4 \
+ crate://crates.io/rand/0.10.1 \
+ crate://crates.io/rand_chacha/0.9.0 \
+ crate://crates.io/rand_core/0.9.5 \
+ crate://crates.io/rand_core/0.10.1 \
+ crate://crates.io/redox_syscall/0.5.18 \
+ crate://crates.io/ref-cast/1.0.25 \
+ crate://crates.io/ref-cast-impl/1.0.25 \
+ crate://crates.io/referencing/0.44.1 \
+ crate://crates.io/regex/1.12.3 \
+ crate://crates.io/regex-automata/0.4.14 \
+ crate://crates.io/regex-syntax/0.8.10 \
+ crate://crates.io/ring/0.17.14 \
+ crate://crates.io/rustc_version/0.4.1 \
+ crate://crates.io/rusticata-macros/4.1.0 \
+ crate://crates.io/rustix/1.1.4 \
+ crate://crates.io/rustls/0.23.39 \
+ crate://crates.io/rustls-pki-types/1.14.1 \
+ crate://crates.io/rustls-webpki/0.103.13 \
+ crate://crates.io/rustversion/1.0.22 \
+ crate://crates.io/ryu/1.0.23 \
+ crate://crates.io/schemars/1.2.1 \
+ crate://crates.io/schemars_derive/1.2.1 \
+ crate://crates.io/scopeguard/1.2.0 \
+ crate://crates.io/semver/1.0.28 \
+ crate://crates.io/serde/1.0.228 \
+ crate://crates.io/serde_core/1.0.228 \
+ crate://crates.io/serde_derive/1.0.228 \
+ crate://crates.io/serde_derive_internals/0.29.1 \
+ crate://crates.io/serde_json/1.0.149 \
+ crate://crates.io/serde_spanned/1.1.1 \
+ crate://crates.io/serde_yaml/0.9.34+deprecated \
+ crate://crates.io/sha2/0.10.9 \
+ crate://crates.io/sha256/1.6.0 \
+ crate://crates.io/shlex/1.3.0 \
+ crate://crates.io/signal-hook/0.3.18 \
+ crate://crates.io/signal-hook-mio/0.2.5 \
+ crate://crates.io/signal-hook-registry/1.4.8 \
+ crate://crates.io/slab/0.4.12 \
+ crate://crates.io/smallvec/1.15.1 \
+ crate://crates.io/socket2/0.6.3 \
+ crate://crates.io/stable_deref_trait/1.2.1 \
+ crate://crates.io/strsim/0.11.1 \
+ crate://crates.io/subtle/2.6.1 \
+ crate://crates.io/syn/1.0.109 \
+ crate://crates.io/syn/2.0.117 \
+ crate://crates.io/sync_wrapper/1.0.2 \
+ crate://crates.io/synstructure/0.13.2 \
+ crate://crates.io/sysinfo/0.38.4 \
+ crate://crates.io/tabled/0.17.0 \
+ crate://crates.io/tabled_derive/0.9.0 \
+ crate://crates.io/tempfile/3.27.0 \
+ crate://crates.io/termtree/0.5.1 \
+ crate://crates.io/thiserror/1.0.69 \
+ crate://crates.io/thiserror/2.0.18 \
+ crate://crates.io/thiserror-impl/1.0.69 \
+ crate://crates.io/thiserror-impl/2.0.18 \
+ crate://crates.io/time/0.3.47 \
+ crate://crates.io/time-core/0.1.8 \
+ crate://crates.io/time-macros/0.2.27 \
+ crate://crates.io/tinystr/0.8.3 \
+ crate://crates.io/tokio/1.52.1 \
+ crate://crates.io/tokio-macros/2.7.0 \
+ crate://crates.io/tokio-rustls/0.26.4 \
+ crate://crates.io/tokio-stream/0.1.18 \
+ crate://crates.io/tokio-util/0.7.18 \
+ crate://crates.io/toml/0.9.12+spec-1.1.0 \
+ crate://crates.io/toml_datetime/0.7.5+spec-1.1.0 \
+ crate://crates.io/toml_parser/1.1.2+spec-1.1.0 \
+ crate://crates.io/toml_writer/1.1.1+spec-1.1.0 \
+ crate://crates.io/tonic/0.14.5 \
+ crate://crates.io/tonic-build/0.14.5 \
+ crate://crates.io/tonic-prost/0.14.5 \
+ crate://crates.io/tonic-prost-build/0.14.5 \
+ crate://crates.io/tower/0.5.3 \
+ crate://crates.io/tower-layer/0.3.3 \
+ crate://crates.io/tower-service/0.3.3 \
+ crate://crates.io/tracing/0.1.44 \
+ crate://crates.io/tracing-attributes/0.1.31 \
+ crate://crates.io/tracing-core/0.1.36 \
+ crate://crates.io/try-lock/0.2.5 \
+ crate://crates.io/typenum/1.20.0 \
+ crate://crates.io/ucd-trie/0.1.7 \
+ crate://crates.io/umask/2.1.0 \
+ crate://crates.io/unicase/2.9.0 \
+ crate://crates.io/unicode-general-category/1.1.0 \
+ crate://crates.io/unicode-ident/1.0.24 \
+ crate://crates.io/unicode-segmentation/1.13.2 \
+ crate://crates.io/unicode-width/0.2.2 \
+ crate://crates.io/unicode-xid/0.2.6 \
+ crate://crates.io/unsafe-libyaml/0.2.11 \
+ crate://crates.io/untrusted/0.9.0 \
+ crate://crates.io/utf8_iter/1.0.4 \
+ crate://crates.io/utf8parse/0.2.2 \
+ crate://crates.io/uuid/1.23.1 \
+ crate://crates.io/uuid-simd/0.8.0 \
+ crate://crates.io/version_check/0.9.5 \
+ crate://crates.io/vsimd/0.8.0 \
+ crate://crates.io/want/0.3.1 \
+ crate://crates.io/wasi/0.11.1+wasi-snapshot-preview1 \
+ crate://crates.io/wasip2/1.0.3+wasi-0.2.9 \
+ crate://crates.io/wasip3/0.4.0+wasi-0.3.0-rc-2026-01-06 \
+ crate://crates.io/wasm-bindgen/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro/0.2.118 \
+ crate://crates.io/wasm-bindgen-macro-support/0.2.118 \
+ crate://crates.io/wasm-bindgen-shared/0.2.118 \
+ crate://crates.io/wasm-encoder/0.244.0 \
+ crate://crates.io/wasm-metadata/0.244.0 \
+ crate://crates.io/wasmparser/0.244.0 \
+ crate://crates.io/winapi/0.3.9 \
+ crate://crates.io/winapi-i686-pc-windows-gnu/0.4.0 \
+ crate://crates.io/winapi-x86_64-pc-windows-gnu/0.4.0 \
+ crate://crates.io/windows/0.62.2 \
+ crate://crates.io/windows-collections/0.3.2 \
+ crate://crates.io/windows-core/0.62.2 \
+ crate://crates.io/windows-future/0.3.2 \
+ crate://crates.io/windows-implement/0.60.2 \
+ crate://crates.io/windows-interface/0.59.3 \
+ crate://crates.io/windows-link/0.2.1 \
+ crate://crates.io/windows-numerics/0.3.1 \
+ crate://crates.io/windows-result/0.4.1 \
+ crate://crates.io/windows-strings/0.5.1 \
+ crate://crates.io/windows-sys/0.52.0 \
+ crate://crates.io/windows-sys/0.60.2 \
+ crate://crates.io/windows-sys/0.61.2 \
+ crate://crates.io/windows-targets/0.52.6 \
+ crate://crates.io/windows-targets/0.53.5 \
+ crate://crates.io/windows-threading/0.2.1 \
+ crate://crates.io/windows_aarch64_gnullvm/0.52.6 \
+ crate://crates.io/windows_aarch64_gnullvm/0.53.1 \
+ crate://crates.io/windows_aarch64_msvc/0.52.6 \
+ crate://crates.io/windows_aarch64_msvc/0.53.1 \
+ crate://crates.io/windows_i686_gnu/0.52.6 \
+ crate://crates.io/windows_i686_gnu/0.53.1 \
+ crate://crates.io/windows_i686_gnullvm/0.52.6 \
+ crate://crates.io/windows_i686_gnullvm/0.53.1 \
+ crate://crates.io/windows_i686_msvc/0.52.6 \
+ crate://crates.io/windows_i686_msvc/0.53.1 \
+ crate://crates.io/windows_x86_64_gnu/0.52.6 \
+ crate://crates.io/windows_x86_64_gnu/0.53.1 \
+ crate://crates.io/windows_x86_64_gnullvm/0.52.6 \
+ crate://crates.io/windows_x86_64_gnullvm/0.53.1 \
+ crate://crates.io/windows_x86_64_msvc/0.52.6 \
+ crate://crates.io/windows_x86_64_msvc/0.53.1 \
+ crate://crates.io/winnow/0.7.15 \
+ crate://crates.io/winnow/1.0.2 \
+ crate://crates.io/wit-bindgen/0.51.0 \
+ crate://crates.io/wit-bindgen/0.57.1 \
+ crate://crates.io/wit-bindgen-core/0.51.0 \
+ crate://crates.io/wit-bindgen-rust/0.51.0 \
+ crate://crates.io/wit-bindgen-rust-macro/0.51.0 \
+ crate://crates.io/wit-component/0.244.0 \
+ crate://crates.io/wit-parser/0.244.0 \
+ crate://crates.io/writeable/0.6.3 \
+ crate://crates.io/x509-parser/0.18.1 \
+ crate://crates.io/yoke/0.8.2 \
+ crate://crates.io/yoke-derive/0.8.2 \
+ crate://crates.io/zerocopy/0.8.48 \
+ crate://crates.io/zerocopy-derive/0.8.48 \
+ crate://crates.io/zerofrom/0.1.7 \
+ crate://crates.io/zerofrom-derive/0.1.7 \
+ crate://crates.io/zeroize/1.8.2 \
+ crate://crates.io/zerotrie/0.2.4 \
+ crate://crates.io/zerovec/0.11.6 \
+ crate://crates.io/zerovec-derive/0.11.3 \
+ crate://crates.io/zmij/1.0.21 \
+"
+
+SRC_URI[ahash-0.8.12.sha256sum] = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+SRC_URI[aho-corasick-1.1.4.sha256sum] = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+SRC_URI[allocator-api2-0.2.21.sha256sum] = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+SRC_URI[android_system_properties-0.1.5.sha256sum] = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+SRC_URI[anstream-1.0.0.sha256sum] = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d"
+SRC_URI[anstyle-1.0.14.sha256sum] = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
+SRC_URI[anstyle-parse-1.0.0.sha256sum] = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e"
+SRC_URI[anstyle-query-1.1.5.sha256sum] = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+SRC_URI[anstyle-wincon-3.0.11.sha256sum] = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+SRC_URI[anyhow-1.0.102.sha256sum] = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
+SRC_URI[asn1-rs-0.7.1.sha256sum] = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60"
+SRC_URI[asn1-rs-derive-0.6.0.sha256sum] = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
+SRC_URI[asn1-rs-impl-0.2.0.sha256sum] = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
+SRC_URI[async-trait-0.1.89.sha256sum] = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+SRC_URI[atomic-waker-1.1.2.sha256sum] = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+SRC_URI[autocfg-1.5.0.sha256sum] = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+SRC_URI[axum-0.8.9.sha256sum] = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
+SRC_URI[axum-core-0.5.6.sha256sum] = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
+SRC_URI[base64-0.22.1.sha256sum] = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
+SRC_URI[bit-set-0.8.0.sha256sum] = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+SRC_URI[bit-vec-0.8.0.sha256sum] = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+SRC_URI[bitflags-2.11.1.sha256sum] = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
+SRC_URI[block-buffer-0.10.4.sha256sum] = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+SRC_URI[borrow-or-share-0.2.4.sha256sum] = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
+SRC_URI[bumpalo-3.20.2.sha256sum] = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb"
+SRC_URI[bytecount-0.6.9.sha256sum] = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
+SRC_URI[bytes-1.11.1.sha256sum] = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
+SRC_URI[cc-1.2.61.sha256sum] = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
+SRC_URI[cfg-if-1.0.4.sha256sum] = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+SRC_URI[cfg_aliases-0.2.1.sha256sum] = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+SRC_URI[chacha20-0.10.0.sha256sum] = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
+SRC_URI[chrono-0.4.44.sha256sum] = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
+SRC_URI[clap-4.6.1.sha256sum] = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
+SRC_URI[clap_builder-4.6.0.sha256sum] = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
+SRC_URI[clap_complete-4.6.2.sha256sum] = "3ff7a1dccbdd8b078c2bdebff47e404615151534d5043da397ec50286816f9cb"
+SRC_URI[clap_derive-4.6.1.sha256sum] = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
+SRC_URI[clap_lex-1.1.0.sha256sum] = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
+SRC_URI[colorchoice-1.0.5.sha256sum] = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
+SRC_URI[convert_case-0.10.0.sha256sum] = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"
+SRC_URI[core-foundation-sys-0.8.7.sha256sum] = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+SRC_URI[cpufeatures-0.2.17.sha256sum] = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+SRC_URI[cpufeatures-0.3.0.sha256sum] = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"
+SRC_URI[crossterm-0.29.0.sha256sum] = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+SRC_URI[crossterm_winapi-0.9.1.sha256sum] = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+SRC_URI[crypto-common-0.1.7.sha256sum] = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+SRC_URI[darling-0.20.11.sha256sum] = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+SRC_URI[darling_core-0.20.11.sha256sum] = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+SRC_URI[darling_macro-0.20.11.sha256sum] = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+SRC_URI[data-encoding-2.11.0.sha256sum] = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
+SRC_URI[der-parser-10.0.0.sha256sum] = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6"
+SRC_URI[deranged-0.5.8.sha256sum] = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
+SRC_URI[derive_builder-0.20.2.sha256sum] = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
+SRC_URI[derive_builder_core-0.20.2.sha256sum] = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
+SRC_URI[derive_builder_macro-0.20.2.sha256sum] = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
+SRC_URI[derive_more-2.1.1.sha256sum] = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+SRC_URI[derive_more-impl-2.1.1.sha256sum] = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+SRC_URI[difflib-0.4.0.sha256sum] = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+SRC_URI[digest-0.10.7.sha256sum] = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+SRC_URI[displaydoc-0.2.5.sha256sum] = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+SRC_URI[document-features-0.2.12.sha256sum] = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
+SRC_URI[downcast-0.11.0.sha256sum] = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1"
+SRC_URI[dyn-clone-1.0.20.sha256sum] = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+SRC_URI[either-1.15.0.sha256sum] = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+SRC_URI[email_address-0.2.9.sha256sum] = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
+SRC_URI[env-1.0.1.sha256sum] = "bc95de49ad098572c02d3fbf368c9a020bfff5ae78483685b77f51d8a7e9486d"
+SRC_URI[env_filter-1.0.1.sha256sum] = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
+SRC_URI[env_logger-0.11.10.sha256sum] = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a"
+SRC_URI[equivalent-1.0.2.sha256sum] = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+SRC_URI[errno-0.3.14.sha256sum] = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+SRC_URI[fancy-regex-0.17.0.sha256sum] = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8"
+SRC_URI[fastrand-2.4.1.sha256sum] = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"
+SRC_URI[find-msvc-tools-0.1.9.sha256sum] = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
+SRC_URI[fixedbitset-0.5.7.sha256sum] = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
+SRC_URI[float-cmp-0.9.0.sha256sum] = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+SRC_URI[fluent-uri-0.4.1.sha256sum] = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e"
+SRC_URI[fnv-1.0.7.sha256sum] = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+SRC_URI[foldhash-0.1.5.sha256sum] = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+SRC_URI[foldhash-0.2.0.sha256sum] = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+SRC_URI[fraction-0.15.4.sha256sum] = "e076045bb43dac435333ed5f04caf35c7463631d0dae2deb2638d94dd0a5b872"
+SRC_URI[fragile-2.1.0.sha256sum] = "8878864ba14bb86e818a412bfd6f18f9eabd4ec0f008a28e8f7eb61db532fcf9"
+SRC_URI[futures-channel-0.3.32.sha256sum] = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
+SRC_URI[futures-core-0.3.32.sha256sum] = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
+SRC_URI[futures-macro-0.3.32.sha256sum] = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
+SRC_URI[futures-sink-0.3.32.sha256sum] = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
+SRC_URI[futures-task-0.3.32.sha256sum] = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
+SRC_URI[futures-util-0.3.32.sha256sum] = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
+SRC_URI[generic-array-0.14.7.sha256sum] = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+SRC_URI[getrandom-0.2.17.sha256sum] = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
+SRC_URI[getrandom-0.3.4.sha256sum] = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+SRC_URI[getrandom-0.4.2.sha256sum] = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
+SRC_URI[h2-0.4.13.sha256sum] = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
+SRC_URI[handlebars-6.4.0.sha256sum] = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e"
+SRC_URI[hashbrown-0.15.5.sha256sum] = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
+SRC_URI[hashbrown-0.16.1.sha256sum] = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+SRC_URI[hashbrown-0.17.0.sha256sum] = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
+SRC_URI[heck-0.4.1.sha256sum] = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+SRC_URI[heck-0.5.0.sha256sum] = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+SRC_URI[hex-0.4.3.sha256sum] = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+SRC_URI[http-1.4.0.sha256sum] = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"
+SRC_URI[http-body-1.0.1.sha256sum] = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+SRC_URI[http-body-util-0.1.3.sha256sum] = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+SRC_URI[httparse-1.10.1.sha256sum] = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+SRC_URI[httpdate-1.0.3.sha256sum] = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+SRC_URI[hyper-1.9.0.sha256sum] = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca"
+SRC_URI[hyper-timeout-0.5.2.sha256sum] = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
+SRC_URI[hyper-util-0.1.20.sha256sum] = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+SRC_URI[iana-time-zone-0.1.65.sha256sum] = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+SRC_URI[iana-time-zone-haiku-0.1.2.sha256sum] = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+SRC_URI[icu_collections-2.2.0.sha256sum] = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
+SRC_URI[icu_locale_core-2.2.0.sha256sum] = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
+SRC_URI[icu_normalizer-2.2.0.sha256sum] = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
+SRC_URI[icu_normalizer_data-2.2.0.sha256sum] = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
+SRC_URI[icu_properties-2.2.0.sha256sum] = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
+SRC_URI[icu_properties_data-2.2.0.sha256sum] = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
+SRC_URI[icu_provider-2.2.0.sha256sum] = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
+SRC_URI[id-arena-2.3.0.sha256sum] = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
+SRC_URI[ident_case-1.0.1.sha256sum] = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+SRC_URI[idna-1.1.0.sha256sum] = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+SRC_URI[idna_adapter-1.2.1.sha256sum] = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+SRC_URI[indexmap-2.14.0.sha256sum] = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
+SRC_URI[is_executable-1.0.5.sha256sum] = "baabb8b4867b26294d818bf3f651a454b6901431711abb96e296245888d6e8c4"
+SRC_URI[is_terminal_polyfill-1.70.2.sha256sum] = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+SRC_URI[itertools-0.10.5.sha256sum] = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+SRC_URI[itertools-0.14.0.sha256sum] = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+SRC_URI[itoa-1.0.18.sha256sum] = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+SRC_URI[jiff-0.2.24.sha256sum] = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d"
+SRC_URI[jiff-static-0.2.24.sha256sum] = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7"
+SRC_URI[js-sys-0.3.95.sha256sum] = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca"
+SRC_URI[jsonschema-0.44.1.sha256sum] = "f98b64a413c93a1b413dfbaf973b78d271648b9cae50b10302ad88af78991672"
+SRC_URI[lazy_static-1.5.0.sha256sum] = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+SRC_URI[leb128fmt-0.1.0.sha256sum] = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
+SRC_URI[libc-0.2.186.sha256sum] = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
+SRC_URI[linux-raw-sys-0.12.1.sha256sum] = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
+SRC_URI[litemap-0.8.2.sha256sum] = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
+SRC_URI[litrs-1.0.0.sha256sum] = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
+SRC_URI[lock_api-0.4.14.sha256sum] = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+SRC_URI[log-0.4.29.sha256sum] = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+SRC_URI[matchit-0.8.4.sha256sum] = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
+SRC_URI[memchr-2.8.0.sha256sum] = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+SRC_URI[mime-0.3.17.sha256sum] = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+SRC_URI[minimal-lexical-0.2.1.sha256sum] = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+SRC_URI[mio-1.2.0.sha256sum] = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
+SRC_URI[mockall-0.11.4.sha256sum] = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96"
+SRC_URI[mockall_derive-0.11.4.sha256sum] = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
+SRC_URI[mockall_double-0.3.1.sha256sum] = "f1ca96e5ac35256ae3e13536edd39b172b88f41615e1d7b653c8ad24524113e8"
+SRC_URI[multimap-0.10.1.sha256sum] = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
+SRC_URI[nix-0.31.2.sha256sum] = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3"
+SRC_URI[nom-7.1.3.sha256sum] = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+SRC_URI[normalize-line-endings-0.3.0.sha256sum] = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+SRC_URI[ntapi-0.4.3.sha256sum] = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae"
+SRC_URI[num-0.4.3.sha256sum] = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
+SRC_URI[num-bigint-0.4.6.sha256sum] = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+SRC_URI[num-cmp-0.1.0.sha256sum] = "63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa"
+SRC_URI[num-complex-0.4.6.sha256sum] = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
+SRC_URI[num-conv-0.2.1.sha256sum] = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967"
+SRC_URI[num-integer-0.1.46.sha256sum] = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+SRC_URI[num-iter-0.1.45.sha256sum] = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
+SRC_URI[num-modular-0.6.1.sha256sum] = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f"
+SRC_URI[num-order-1.2.0.sha256sum] = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6"
+SRC_URI[num-rational-0.4.2.sha256sum] = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
+SRC_URI[num-traits-0.2.19.sha256sum] = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+SRC_URI[num_threads-0.1.7.sha256sum] = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
+SRC_URI[objc2-core-foundation-0.3.2.sha256sum] = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+SRC_URI[objc2-io-kit-0.3.2.sha256sum] = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15"
+SRC_URI[oid-registry-0.8.1.sha256sum] = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7"
+SRC_URI[once_cell-1.21.4.sha256sum] = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+SRC_URI[once_cell_polyfill-1.70.2.sha256sum] = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+SRC_URI[outref-0.5.2.sha256sum] = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
+SRC_URI[papergrid-0.13.0.sha256sum] = "d2b0f8def1f117e13c895f3eda65a7b5650688da29d6ad04635f61bc7b92eebd"
+SRC_URI[parking_lot-0.12.5.sha256sum] = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+SRC_URI[parking_lot_core-0.9.12.sha256sum] = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+SRC_URI[percent-encoding-2.3.2.sha256sum] = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+SRC_URI[pest-2.8.6.sha256sum] = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662"
+SRC_URI[pest_derive-2.8.6.sha256sum] = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77"
+SRC_URI[pest_generator-2.8.6.sha256sum] = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f"
+SRC_URI[pest_meta-2.8.6.sha256sum] = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220"
+SRC_URI[petgraph-0.8.3.sha256sum] = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
+SRC_URI[pin-project-1.1.11.sha256sum] = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517"
+SRC_URI[pin-project-internal-1.1.11.sha256sum] = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6"
+SRC_URI[pin-project-lite-0.2.17.sha256sum] = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
+SRC_URI[portable-atomic-1.13.1.sha256sum] = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
+SRC_URI[portable-atomic-util-0.2.7.sha256sum] = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
+SRC_URI[potential_utf-0.1.5.sha256sum] = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
+SRC_URI[powerfmt-0.2.0.sha256sum] = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+SRC_URI[ppv-lite86-0.2.21.sha256sum] = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
+SRC_URI[predicates-2.1.5.sha256sum] = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
+SRC_URI[predicates-core-1.0.10.sha256sum] = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144"
+SRC_URI[predicates-tree-1.0.13.sha256sum] = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2"
+SRC_URI[prettyplease-0.2.37.sha256sum] = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
+SRC_URI[proc-macro-error-attr2-2.0.0.sha256sum] = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5"
+SRC_URI[proc-macro-error2-2.0.1.sha256sum] = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802"
+SRC_URI[proc-macro2-1.0.106.sha256sum] = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+SRC_URI[prost-0.14.3.sha256sum] = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
+SRC_URI[prost-build-0.14.3.sha256sum] = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7"
+SRC_URI[prost-derive-0.14.3.sha256sum] = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
+SRC_URI[prost-types-0.14.3.sha256sum] = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7"
+SRC_URI[pulldown-cmark-0.13.3.sha256sum] = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad"
+SRC_URI[pulldown-cmark-to-cmark-22.0.0.sha256sum] = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90"
+SRC_URI[quote-1.0.45.sha256sum] = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+SRC_URI[r-efi-5.3.0.sha256sum] = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+SRC_URI[r-efi-6.0.0.sha256sum] = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+SRC_URI[rand-0.9.4.sha256sum] = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
+SRC_URI[rand-0.10.1.sha256sum] = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
+SRC_URI[rand_chacha-0.9.0.sha256sum] = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
+SRC_URI[rand_core-0.9.5.sha256sum] = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"
+SRC_URI[rand_core-0.10.1.sha256sum] = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
+SRC_URI[redox_syscall-0.5.18.sha256sum] = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+SRC_URI[ref-cast-1.0.25.sha256sum] = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
+SRC_URI[ref-cast-impl-1.0.25.sha256sum] = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
+SRC_URI[referencing-0.44.1.sha256sum] = "22952642836711d7a730d23a4dfb0d732e75a85e4c4f5704266d9c8fac278ff1"
+SRC_URI[regex-1.12.3.sha256sum] = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
+SRC_URI[regex-automata-0.4.14.sha256sum] = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
+SRC_URI[regex-syntax-0.8.10.sha256sum] = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
+SRC_URI[ring-0.17.14.sha256sum] = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+SRC_URI[rustc_version-0.4.1.sha256sum] = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+SRC_URI[rusticata-macros-4.1.0.sha256sum] = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632"
+SRC_URI[rustix-1.1.4.sha256sum] = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
+SRC_URI[rustls-0.23.39.sha256sum] = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e"
+SRC_URI[rustls-pki-types-1.14.1.sha256sum] = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
+SRC_URI[rustls-webpki-0.103.13.sha256sum] = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
+SRC_URI[rustversion-1.0.22.sha256sum] = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+SRC_URI[ryu-1.0.23.sha256sum] = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
+SRC_URI[schemars-1.2.1.sha256sum] = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc"
+SRC_URI[schemars_derive-1.2.1.sha256sum] = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f"
+SRC_URI[scopeguard-1.2.0.sha256sum] = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+SRC_URI[semver-1.0.28.sha256sum] = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
+SRC_URI[serde-1.0.228.sha256sum] = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+SRC_URI[serde_core-1.0.228.sha256sum] = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+SRC_URI[serde_derive-1.0.228.sha256sum] = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+SRC_URI[serde_derive_internals-0.29.1.sha256sum] = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+SRC_URI[serde_json-1.0.149.sha256sum] = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+SRC_URI[serde_spanned-1.1.1.sha256sum] = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
+SRC_URI[serde_yaml-0.9.34+deprecated.sha256sum] = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
+SRC_URI[sha2-0.10.9.sha256sum] = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+SRC_URI[sha256-1.6.0.sha256sum] = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6"
+SRC_URI[shlex-1.3.0.sha256sum] = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+SRC_URI[signal-hook-0.3.18.sha256sum] = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
+SRC_URI[signal-hook-mio-0.2.5.sha256sum] = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
+SRC_URI[signal-hook-registry-1.4.8.sha256sum] = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+SRC_URI[slab-0.4.12.sha256sum] = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
+SRC_URI[smallvec-1.15.1.sha256sum] = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+SRC_URI[socket2-0.6.3.sha256sum] = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
+SRC_URI[stable_deref_trait-1.2.1.sha256sum] = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+SRC_URI[strsim-0.11.1.sha256sum] = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+SRC_URI[subtle-2.6.1.sha256sum] = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+SRC_URI[syn-1.0.109.sha256sum] = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+SRC_URI[syn-2.0.117.sha256sum] = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+SRC_URI[sync_wrapper-1.0.2.sha256sum] = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+SRC_URI[synstructure-0.13.2.sha256sum] = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+SRC_URI[sysinfo-0.38.4.sha256sum] = "92ab6a2f8bfe508deb3c6406578252e491d299cbbf3bc0529ecc3313aee4a52f"
+SRC_URI[tabled-0.17.0.sha256sum] = "c6709222f3973137427ce50559cd564dc187a95b9cfe01613d2f4e93610e510a"
+SRC_URI[tabled_derive-0.9.0.sha256sum] = "931be476627d4c54070a1f3a9739ccbfec9b36b39815106a20cce2243bbcefe1"
+SRC_URI[tempfile-3.27.0.sha256sum] = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
+SRC_URI[termtree-0.5.1.sha256sum] = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
+SRC_URI[thiserror-1.0.69.sha256sum] = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+SRC_URI[thiserror-2.0.18.sha256sum] = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+SRC_URI[thiserror-impl-1.0.69.sha256sum] = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+SRC_URI[thiserror-impl-2.0.18.sha256sum] = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+SRC_URI[time-0.3.47.sha256sum] = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
+SRC_URI[time-core-0.1.8.sha256sum] = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
+SRC_URI[time-macros-0.2.27.sha256sum] = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
+SRC_URI[tinystr-0.8.3.sha256sum] = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
+SRC_URI[tokio-1.52.1.sha256sum] = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6"
+SRC_URI[tokio-macros-2.7.0.sha256sum] = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
+SRC_URI[tokio-rustls-0.26.4.sha256sum] = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"
+SRC_URI[tokio-stream-0.1.18.sha256sum] = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70"
+SRC_URI[tokio-util-0.7.18.sha256sum] = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"
+SRC_URI[toml-0.9.12+spec-1.1.0.sha256sum] = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+SRC_URI[toml_datetime-0.7.5+spec-1.1.0.sha256sum] = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+SRC_URI[toml_parser-1.1.2+spec-1.1.0.sha256sum] = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+SRC_URI[toml_writer-1.1.1+spec-1.1.0.sha256sum] = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
+SRC_URI[tonic-0.14.5.sha256sum] = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec"
+SRC_URI[tonic-build-0.14.5.sha256sum] = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734"
+SRC_URI[tonic-prost-0.14.5.sha256sum] = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309"
+SRC_URI[tonic-prost-build-0.14.5.sha256sum] = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a"
+SRC_URI[tower-0.5.3.sha256sum] = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+SRC_URI[tower-layer-0.3.3.sha256sum] = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+SRC_URI[tower-service-0.3.3.sha256sum] = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+SRC_URI[tracing-0.1.44.sha256sum] = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+SRC_URI[tracing-attributes-0.1.31.sha256sum] = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+SRC_URI[tracing-core-0.1.36.sha256sum] = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+SRC_URI[try-lock-0.2.5.sha256sum] = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+SRC_URI[typenum-1.20.0.sha256sum] = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de"
+SRC_URI[ucd-trie-0.1.7.sha256sum] = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
+SRC_URI[umask-2.1.0.sha256sum] = "ec9a46c2549e35c054e0ffe281a3a6ec0007793db4df106604d37ed3f4d73d1c"
+SRC_URI[unicase-2.9.0.sha256sum] = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
+SRC_URI[unicode-general-category-1.1.0.sha256sum] = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
+SRC_URI[unicode-ident-1.0.24.sha256sum] = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+SRC_URI[unicode-segmentation-1.13.2.sha256sum] = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
+SRC_URI[unicode-width-0.2.2.sha256sum] = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+SRC_URI[unicode-xid-0.2.6.sha256sum] = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
+SRC_URI[unsafe-libyaml-0.2.11.sha256sum] = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
+SRC_URI[untrusted-0.9.0.sha256sum] = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+SRC_URI[utf8_iter-1.0.4.sha256sum] = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+SRC_URI[utf8parse-0.2.2.sha256sum] = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+SRC_URI[uuid-1.23.1.sha256sum] = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
+SRC_URI[uuid-simd-0.8.0.sha256sum] = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
+SRC_URI[version_check-0.9.5.sha256sum] = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+SRC_URI[vsimd-0.8.0.sha256sum] = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+SRC_URI[want-0.3.1.sha256sum] = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+SRC_URI[wasi-0.11.1+wasi-snapshot-preview1.sha256sum] = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+SRC_URI[wasip2-1.0.3+wasi-0.2.9.sha256sum] = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
+SRC_URI[wasip3-0.4.0+wasi-0.3.0-rc-2026-01-06.sha256sum] = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
+SRC_URI[wasm-bindgen-0.2.118.sha256sum] = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89"
+SRC_URI[wasm-bindgen-macro-0.2.118.sha256sum] = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed"
+SRC_URI[wasm-bindgen-macro-support-0.2.118.sha256sum] = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904"
+SRC_URI[wasm-bindgen-shared-0.2.118.sha256sum] = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129"
+SRC_URI[wasm-encoder-0.244.0.sha256sum] = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
+SRC_URI[wasm-metadata-0.244.0.sha256sum] = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
+SRC_URI[wasmparser-0.244.0.sha256sum] = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
+SRC_URI[winapi-0.3.9.sha256sum] = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+SRC_URI[winapi-i686-pc-windows-gnu-0.4.0.sha256sum] = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+SRC_URI[winapi-x86_64-pc-windows-gnu-0.4.0.sha256sum] = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+SRC_URI[windows-0.62.2.sha256sum] = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
+SRC_URI[windows-collections-0.3.2.sha256sum] = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
+SRC_URI[windows-core-0.62.2.sha256sum] = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+SRC_URI[windows-future-0.3.2.sha256sum] = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
+SRC_URI[windows-implement-0.60.2.sha256sum] = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+SRC_URI[windows-interface-0.59.3.sha256sum] = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+SRC_URI[windows-link-0.2.1.sha256sum] = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+SRC_URI[windows-numerics-0.3.1.sha256sum] = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
+SRC_URI[windows-result-0.4.1.sha256sum] = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+SRC_URI[windows-strings-0.5.1.sha256sum] = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+SRC_URI[windows-sys-0.52.0.sha256sum] = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+SRC_URI[windows-sys-0.60.2.sha256sum] = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+SRC_URI[windows-sys-0.61.2.sha256sum] = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+SRC_URI[windows-targets-0.52.6.sha256sum] = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+SRC_URI[windows-targets-0.53.5.sha256sum] = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+SRC_URI[windows-threading-0.2.1.sha256sum] = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
+SRC_URI[windows_aarch64_gnullvm-0.52.6.sha256sum] = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+SRC_URI[windows_aarch64_gnullvm-0.53.1.sha256sum] = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+SRC_URI[windows_aarch64_msvc-0.52.6.sha256sum] = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+SRC_URI[windows_aarch64_msvc-0.53.1.sha256sum] = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+SRC_URI[windows_i686_gnu-0.52.6.sha256sum] = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+SRC_URI[windows_i686_gnu-0.53.1.sha256sum] = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+SRC_URI[windows_i686_gnullvm-0.52.6.sha256sum] = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+SRC_URI[windows_i686_gnullvm-0.53.1.sha256sum] = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+SRC_URI[windows_i686_msvc-0.52.6.sha256sum] = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+SRC_URI[windows_i686_msvc-0.53.1.sha256sum] = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+SRC_URI[windows_x86_64_gnu-0.52.6.sha256sum] = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+SRC_URI[windows_x86_64_gnu-0.53.1.sha256sum] = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+SRC_URI[windows_x86_64_gnullvm-0.52.6.sha256sum] = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+SRC_URI[windows_x86_64_gnullvm-0.53.1.sha256sum] = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+SRC_URI[windows_x86_64_msvc-0.52.6.sha256sum] = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+SRC_URI[windows_x86_64_msvc-0.53.1.sha256sum] = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+SRC_URI[winnow-0.7.15.sha256sum] = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
+SRC_URI[winnow-1.0.2.sha256sum] = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
+SRC_URI[wit-bindgen-0.51.0.sha256sum] = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
+SRC_URI[wit-bindgen-0.57.1.sha256sum] = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+SRC_URI[wit-bindgen-core-0.51.0.sha256sum] = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
+SRC_URI[wit-bindgen-rust-0.51.0.sha256sum] = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
+SRC_URI[wit-bindgen-rust-macro-0.51.0.sha256sum] = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
+SRC_URI[wit-component-0.244.0.sha256sum] = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
+SRC_URI[wit-parser-0.244.0.sha256sum] = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
+SRC_URI[writeable-0.6.3.sha256sum] = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
+SRC_URI[x509-parser-0.18.1.sha256sum] = "d43b0f71ce057da06bc0851b23ee24f3f86190b07203dd8f567d0b706a185202"
+SRC_URI[yoke-0.8.2.sha256sum] = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
+SRC_URI[yoke-derive-0.8.2.sha256sum] = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
+SRC_URI[zerocopy-0.8.48.sha256sum] = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9"
+SRC_URI[zerocopy-derive-0.8.48.sha256sum] = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4"
+SRC_URI[zerofrom-0.1.7.sha256sum] = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
+SRC_URI[zerofrom-derive-0.1.7.sha256sum] = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
+SRC_URI[zeroize-1.8.2.sha256sum] = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
+SRC_URI[zerotrie-0.2.4.sha256sum] = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
+SRC_URI[zerovec-0.11.6.sha256sum] = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
+SRC_URI[zerovec-derive-0.11.3.sha256sum] = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
+SRC_URI[zmij-1.0.21.sha256sum] = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/recipes-containers/ankaios/ankaios_git.bb b/recipes-containers/ankaios/ankaios_git.bb
new file mode 100644
index 00000000..5db0019e
--- /dev/null
+++ b/recipes-containers/ankaios/ankaios_git.bb
@@ -0,0 +1,134 @@
+SUMMARY = "Eclipse Ankaios: Lightweight container orchestrator for embedded Linux"
+DESCRIPTION = "Eclipse Ankaios is a lightweight container/workload orchestrator for embedded Linux systems. This recipe builds Ankaios from source using vendored Rust crates."
+HOMEPAGE = "https://eclipse-ankaios.github.io/ankaios/latest/"
+BUGTRACKER = "https://github.com/eclipse-ankaios/ankaios/issues"
+
+SECTION = "virtualization/tools"
+
+CVE_PRODUCT = "eclipse:ankaios"
+
+# Ankaios itself is Apache-2.0; the rest is the license union of the >700 vendored
+# crates, derived from upstream deny.toml (release-1.0) and verified against
+# ankaios-crates.inc (ring->OpenSSL, foldhash->Zlib, borrow-or-share->MIT-0,
+# unicode-ident->Unicode-3.0).
+LICENSE = "Apache-2.0 & MIT & BSD-3-Clause & ISC & Unicode-3.0 & Zlib & MIT-0 & OpenSSL"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+# Container runtime stack is not supported on MIPS
+COMPATIBLE_HOST = "^(?!(qemu)?mips).*"
+
+# Build dependencies
+DEPENDS += "protobuf-native"
+
+PV = "1.0.1+git"
+
+SRC_URI = "\
+ git://github.com/eclipse-ankaios/ankaios.git;protocol=https;branch=release-1.0 \
+ file://state.yaml \
+ file://ank.conf \
+ file://ank-server.conf \
+ file://ank-agent.conf \
+ file://ank-server.service \
+ file://ank-agent.service \
+ file://ank-server;subdir=init-scripts \
+ file://ank-agent;subdir=init-scripts \
+ file://ank-server.default \
+ file://ank-agent.default \
+"
+
+# v1.0.1 tag commit
+# When bumping SRCREV, re-diff upstream deny.toml and re-check LICENSE against the crate graph.
+SRCREV = "cde70616706b58fd03e4de3f7423addaffa58720"
+
+require ${BPN}-crates.inc
+
+# Add cargo-update-recipe-crates so `bitbake -c update_crates ankaios` works for future maintenance
+inherit cargo systemd update-rc.d
+
+# Package split:
+# - ank-server: server binary + server config + systemd unit
+# - ank-agent: agent binary + agent config + systemd unit
+# - ank: CLI binary ("ank")
+# - ankaios (${PN}): meta package pulling server+agent+cli
+PACKAGE_BEFORE_PN = "ank ank-agent ank-server"
+
+ALLOW_EMPTY:${PN} = "1"
+
+FILES:ank += "${bindir}/ank \
+ ${sysconfdir}/ankaios/ank.conf \
+"
+
+FILES:ank-agent += "\
+ ${bindir}/ank-agent \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-agent.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-agent', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-agent', '', d)} \
+ ${sysconfdir}/ankaios/ank-agent.conf \
+"
+
+FILES:ank-server += "\
+ ${bindir}/ank-server \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/ank-server.service', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/init.d/ank-server', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-server', '', d)} \
+ ${sysconfdir}/ankaios/state.yaml \
+ ${sysconfdir}/ankaios/ank-server.conf \
+"
+
+RDEPENDS:${PN} = "ank ank-agent ank-server"
+
+# The agent shells out to a container runtime to launch workloads
+# Ankaios does not require the following to start, but running workloads requires Podman and/or containerd + nerdctl.
+RRECOMMENDS:ank-agent += "podman \
+ containerd \
+ nerdctl \
+ "
+
+CONFFILES:ank = "${sysconfdir}/ankaios/ank.conf"
+CONFFILES:ank-server = "${sysconfdir}/ankaios/state.yaml ${sysconfdir}/ankaios/ank-server.conf ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-server', '', d)}"
+CONFFILES:ank-agent = "${sysconfdir}/ankaios/ank-agent.conf ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', '${sysconfdir}/default/ank-agent', '', d)}"
+
+# Install/enable systemd units when systemd is enabled
+SYSTEMD_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'ank-server ank-agent', '', d)}"
+SYSTEMD_SERVICE:ank-server = "ank-server.service"
+SYSTEMD_SERVICE:ank-agent = "ank-agent.service"
+SYSTEMD_AUTO_ENABLE:ank-server = "enable"
+SYSTEMD_AUTO_ENABLE:ank-agent = "enable"
+
+INITSCRIPT_PACKAGES = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'ank-server ank-agent', '', d)}"
+INITSCRIPT_NAME:ank-server = "ank-server"
+INITSCRIPT_PARAMS:ank-server = "start 70 2 3 4 5 . stop 30 0 1 6 ."
+INITSCRIPT_NAME:ank-agent = "ank-agent"
+INITSCRIPT_PARAMS:ank-agent = "start 71 2 3 4 5 . stop 29 0 1 6 ."
+
+do_install() {
+ # Install binaries
+ install -d ${D}${bindir}
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-server ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank-agent ${D}${bindir}/
+ install -m 0755 ${B}/target/${CARGO_TARGET_SUBDIR}/ank ${D}${bindir}/
+
+ # Install configuration directory
+ install -d ${D}${sysconfdir}/ankaios
+ install -m 0644 ${UNPACKDIR}/state.yaml ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-server.conf ${D}${sysconfdir}/ankaios/
+ install -m 0644 ${UNPACKDIR}/ank-agent.conf ${D}${sysconfdir}/ankaios/
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${UNPACKDIR}/ank-server.service ${D}${systemd_system_unitdir}/
+ install -m 0644 ${UNPACKDIR}/ank-agent.service ${D}${systemd_system_unitdir}/
+ fi
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-server ${D}${sysconfdir}/init.d/ank-server
+ install -m 0755 ${UNPACKDIR}/init-scripts/ank-agent ${D}${sysconfdir}/init.d/ank-agent
+
+ install -d ${D}${sysconfdir}/default
+ install -m 0644 ${UNPACKDIR}/ank-server.default ${D}${sysconfdir}/default/ank-server
+ install -m 0644 ${UNPACKDIR}/ank-agent.default ${D}${sysconfdir}/default/ank-agent
+ fi
+
+}
diff --git a/recipes-containers/ankaios/files/ank-agent b/recipes-containers/ankaios/files/ank-agent
new file mode 100644
index 00000000..05b32d72
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent
@@ -0,0 +1,96 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-agent
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios agent
+### END INIT INFO
+
+set -e
+
+NAME="ank-agent"
+DAEMON="/usr/bin/ank-agent"
+CONFIG="/etc/ankaios/ank-agent.conf"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" -x \"$CONFIG\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-agent.conf b/recipes-containers/ankaios/files/ank-agent.conf
new file mode 100644
index 00000000..fb91d4ab
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.conf
@@ -0,0 +1,49 @@
+# This is the configuration file for an Ankaios agent.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The name to use for the registration with the server.
+# Every agent has to register with a unique name.
+# Agent name shall contain only regular upper and lowercase characters
+# (a-z and A-Z), numbers and the symbols "-" and "_".
+name = 'agent_A'
+
+# The server url.
+# server_url = 'https://127.0.0.1:25551'
+
+# An existing path where to manage the fifo files.
+# The default path is '/tmp/ankaios/'.
+# run_folder = '/tmp/ankaios/'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the agent shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to agent certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-agent.pem'
+
+# The path to agent key pem file.
+# key_pem = '/etc/ankaios/certs/ank-agent-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the agent key pem file.
+# You can either provide key_pem or key_pem_content, but not both
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-agent.default b/recipes-containers/ankaios/files/ank-agent.default
new file mode 100644
index 00000000..501afab9
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.default
@@ -0,0 +1,8 @@
+# Environment overrides for the ank-agent sysvinit service.
+# Sourced by /etc/init.d/ank-agent. Uncomment and adjust as needed.
+
+# Log level for the Ankaios agent (error, warn, info, debug, trace).
+#RUST_LOG=info
+
+# Log file written by the init script.
+#LOGFILE=/var/log/ank-agent.log
diff --git a/recipes-containers/ankaios/files/ank-agent.service b/recipes-containers/ankaios/files/ank-agent.service
new file mode 100644
index 00000000..e14551df
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-agent.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios agent
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-agent -x /etc/ankaios/ank-agent.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank-server b/recipes-containers/ankaios/files/ank-server
new file mode 100644
index 00000000..3d4a0f19
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server
@@ -0,0 +1,96 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ank-server
+# Required-Start: $remote_fs $network $syslog
+# Required-Stop: $remote_fs $network $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: Ankaios server
+### END INIT INFO
+
+set -e
+
+NAME="ank-server"
+DAEMON="/usr/bin/ank-server"
+CONFIG="/etc/ankaios/ank-server.conf"
+PIDFILE="/run/${NAME}.pid"
+
+[ -r "/etc/default/${NAME}" ] && . "/etc/default/${NAME}"
+
+RUST_LOG="${RUST_LOG:-info}"
+LOGFILE="${LOGFILE:-/var/log/${NAME}.log}"
+
+is_running() {
+ [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null
+}
+
+do_start() {
+ if [ ! -x "$DAEMON" ]; then
+ echo "$DAEMON not installed"
+ return 5
+ fi
+
+ if is_running; then
+ echo "$NAME already running"
+ return 0
+ fi
+
+ export RUST_LOG
+ mkdir -p "$(dirname "$PIDFILE")" "$(dirname "$LOGFILE")"
+
+ start-stop-daemon -S -b -m -p "$PIDFILE" -x /bin/sh -- -c "exec \"$DAEMON\" -x \"$CONFIG\" >>\"$LOGFILE\" 2>&1"
+}
+
+do_stop() {
+ if ! [ -f "$PIDFILE" ]; then
+ return 0
+ fi
+
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s TERM || true
+
+ for _i in 1 2 3 4 5; do
+ if is_running; then
+ sleep 1
+ else
+ break
+ fi
+ done
+
+ if is_running; then
+ start-stop-daemon -K -p "$PIDFILE" -x "$DAEMON" -s KILL || true
+ fi
+
+ rm -f "$PIDFILE"
+}
+
+do_status() {
+ if is_running; then
+ echo "$NAME running"
+ return 0
+ fi
+
+ echo "$NAME not running"
+ return 3
+}
+
+case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ restart|force-reload)
+ do_stop
+ do_start
+ ;;
+ status)
+ do_status
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|status}"
+ exit 2
+ ;;
+esac
+
+exit 0
diff --git a/recipes-containers/ankaios/files/ank-server.conf b/recipes-containers/ankaios/files/ank-server.conf
new file mode 100644
index 00000000..a7d3b5e8
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.conf
@@ -0,0 +1,40 @@
+# This is the configuration file for an Ankaios server.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The path to the startup configuration manifest file.
+# By default, no startup configuration manifest is used.
+startup_manifest = '/etc/ankaios/state.yaml'
+
+# The address, including the port, to which the server should listen.
+# address = '127.0.0.1:25551'
+
+# The flag to disable TLS communication between
+# the Ankaios server, agents and the ank CLI.
+# If set to 'true' and the certificates are not provided, then the server shall not use TLS.
+insecure = true
+
+# The path to ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+# The path to server certificate pem file.
+# crt_pem = '/etc/ankaios/certs/ank-server.pem'
+# The path to server key pem file.
+# key_pem = '/etc/ankaios/certs/ank-server-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+# The content of the server key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/ank-server.default b/recipes-containers/ankaios/files/ank-server.default
new file mode 100644
index 00000000..a16f3c92
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.default
@@ -0,0 +1,8 @@
+# Environment overrides for the ank-server sysvinit service.
+# Sourced by /etc/init.d/ank-server. Uncomment and adjust as needed.
+
+# Log level for the Ankaios server (error, warn, info, debug, trace).
+#RUST_LOG=info
+
+# Log file written by the init script.
+#LOGFILE=/var/log/ank-server.log
diff --git a/recipes-containers/ankaios/files/ank-server.service b/recipes-containers/ankaios/files/ank-server.service
new file mode 100644
index 00000000..425920d5
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank-server.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Ankaios server
+After=network.target
+
+[Service]
+Environment="RUST_LOG=info"
+ExecStart=/usr/bin/ank-server -x /etc/ankaios/ank-server.conf
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-containers/ankaios/files/ank.conf b/recipes-containers/ankaios/files/ank.conf
new file mode 100644
index 00000000..ec925131
--- /dev/null
+++ b/recipes-containers/ankaios/files/ank.conf
@@ -0,0 +1,54 @@
+# This is the configuration file for the ank CLI.
+# This configuration file is formatted in the TOML language.
+
+# The format version of the configuration file to ensure compatibility.
+version = 'v1'
+
+# The timeout in milliseconds to wait for a response from the ank-server.
+# response_timeout = 3000 # milliseconds
+
+# The flag to enable verbose output.
+# verbose = false
+
+# The flag to disable all output.
+# quiet = false
+
+# The flag that enables waiting for workloads to be created/deleted.
+# no_wait = false
+
+[default]
+# The URL to Ankaios server.
+# If started in insecure mode then the HTTP protocol shall be used,
+# otherwise the HTTPS protocol shall be used.
+# server_url = 'https://127.0.0.1:25551'
+
+# The flag to disable TLS communication with the server.
+# If set to 'true', then the CLI shall not use TLS.
+insecure = true
+
+# The path to the ca certificate pem file.
+# ca_pem = '/etc/ankaios/certs/ca.pem'
+
+# The path to CLI certificate pem file.
+# crt_pem = '/home/ankaios/.config/ankaios/ank.pem'
+
+# The path to CLI key pem file.
+# key_pem = '/home/ankaios/.config/ankaios/ank-key.pem'
+
+# The content of the ca certificate pem file.
+# You can either provide ca_pem or ca_pem_content, but not both.
+# ca_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI certificate pem file.
+# You can either provide crt_pem or crt_pem_content, but not both.
+# crt_pem_content = '''-----BEGIN CERTIFICATE-----
+# ...
+# -----END CERTIFICATE-----'''
+
+# The content of the CLI key pem file.
+# You can either provide key_pem or key_pem_content, but not both.
+# key_pem_content = '''-----BEGIN PRIVATE KEY-----
+# ...
+# -----END PRIVATE KEY-----'''
diff --git a/recipes-containers/ankaios/files/state.yaml b/recipes-containers/ankaios/files/state.yaml
new file mode 100644
index 00000000..3ed730a8
--- /dev/null
+++ b/recipes-containers/ankaios/files/state.yaml
@@ -0,0 +1,12 @@
+# Per default no workload is started. Adapt the file according to your needs.
+apiVersion: v1
+workloads:
+# nginx:
+# runtime: podman
+# agent: agent_A
+# restartPolicy: NEVER
+# tags:
+# owner: Ankaios team
+# runtimeConfig: |
+# image: docker.io/nginx:latest
+# commandOptions: ["-p", "8081:80"]
diff --git a/recipes-extended/images/README-ankaios.md b/recipes-extended/images/README-ankaios.md
new file mode 100644
index 00000000..de8a05e6
--- /dev/null
+++ b/recipes-extended/images/README-ankaios.md
@@ -0,0 +1,96 @@
+# Booting and testing Ankaios in QEMU
+
+`ankaios-image-minimal` is a small reference image used to exercise Eclipse
+Ankaios end-to-end. It boots a single QEMU node running the Ankaios **server**
+and **agent** with the **podman** runtime, and starts one hello-ankaios
+workload from `/etc/ankaios/state.yaml`.
+
+Reference target: **`MACHINE = "qemux86-64"`**.
+
+## Prerequisites
+
+Because the image pulls in `podman`, the following layers and distro settings
+must be present in your build configuration (they live outside this layer):
+
+* Layers: `meta-openembedded` (`meta-oe`, `meta-python`, `meta-networking`) and
+ `meta-virtualization`, in addition to `openembedded-core`.
+* systemd as the init manager, in your distro or `local.conf`:
+
+ ```bitbake
+ INIT_MANAGER = "systemd"
+ ```
+
+* Distro features:
+
+ ```bitbake
+ DISTRO_FEATURES:append = " virtualization seccomp"
+ ```
+
+`podman` requires the `seccomp` distro feature; the Ankaios recipes themselves
+do not. systemd is required (enforced via `REQUIRED_DISTRO_FEATURES`) because it
+mounts cgroups and configures DNS out of the box; with sysvinit you have to do
+both manually before podman can run a workload.
+
+## Build
+
+```shell
+MACHINE=qemux86-64 bitbake ankaios-image-minimal
+```
+
+## Boot
+
+```shell
+runqemu qemux86-64 ankaios-image-minimal nographic slirp qemuparams="-m 2048"
+```
+
+* `nographic` keeps everything on the serial console.
+* `slirp` gives the guest outbound networking so podman can pull
+ `docker.io/alpine:latest` on first start.
+
+Log in as `root` on the serial console with no password. The image sets
+`allow-empty-password empty-root-password allow-root-login`, so this is a
+debug/test image and not suitable for production use.
+
+## Verify the workload
+
+The server auto-starts from `/etc/ankaios/state.yaml`, the agent registers as
+`agent_A`, and podman pulls and runs the `hello-ankaios` workload. Query the state
+with the `ank` CLI:
+
+```shell
+ank get workloads
+```
+
+Expected output (the pull may take a few seconds on first boot, during which
+the state passes through `Pending(...)`):
+
+```
+ WORKLOAD NAME AGENT RUNTIME EXECUTION STATE ADDITIONAL INFO
+ hello-ankaios agent_A podman Running(Ok)
+```
+
+You can cross-check at the runtime level:
+
+```shell
+podman ps
+```
+
+which should list the running `hello-ankaios` container.
+
+## Tear down
+
+Stop the workload by deleting it through Ankaios (the agent tells podman to
+remove the container):
+
+```shell
+ank delete workload hello-ankaios
+```
+
+`ank get workloads` should then show no workloads, and `podman ps` no
+containers. To shut the whole node down, power off the guest:
+
+```shell
+poweroff
+```
+
+or terminate QEMU from the host with `Ctrl-a x` (in `nographic` mode).
diff --git a/recipes-extended/images/ankaios-image-minimal.bb b/recipes-extended/images/ankaios-image-minimal.bb
new file mode 100644
index 00000000..91cae890
--- /dev/null
+++ b/recipes-extended/images/ankaios-image-minimal.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Minimal image to boot and test Eclipse Ankaios end-to-end in QEMU"
+DESCRIPTION = "A small reference image that lands the Ankaios server, agent and \
+ank CLI together with the podman runtime and a state.yaml manifest. \
+It boots on qemux86-64 and starts a demo workload so the orchestrator can be \
+exercised end-to-end. See README-ankaios.md for the boot/verify/teardown steps."
+
+LICENSE = "Apache-2.0"
+
+inherit core-image features_check
+
+# Podman needs virtualization + seccomp; systemd is required because it mounts
+# cgroups and sets up DNS out of the box, which the sysvinit path does not.
+REQUIRED_DISTRO_FEATURES ?= "virtualization seccomp systemd"
+
+# Reference target documented in README-ankaios.md
+COMPATIBLE_MACHINE = "qemux86-64"
+
+# Debug/test image: passwordless root login on the serial console
+IMAGE_FEATURES += "allow-empty-password empty-root-password allow-root-login"
+
+# ankaios pulls server + agent + ank CLI; podman is the workload runtime the
+# agent shells out to for the hello-world state.yaml below.
+IMAGE_INSTALL:append = " ankaios podman"
+
+# Headroom (1 GB) for the workload container image podman pulls at runtime
+IMAGE_ROOTFS_EXTRA_SPACE = "1000000"
+
+# Capture the in-layer path at parse time (only valid during parsing, hence
+# ':='), and track it so do_rootfs reruns when state.yaml changes.
+STATE_YAML_SRC := "${THISDIR}/${PN}/state.yaml"
+do_rootfs[file-checksums] += "${STATE_YAML_SRC}:True"
+
+# Override the (empty) default state.yaml shipped by ank-server with one that
+# defines the hello-ankaios workload.
+ROOTFS_POSTPROCESS_COMMAND += "install_ankaios_test_state;"
+install_ankaios_test_state() {
+ install -d ${IMAGE_ROOTFS}${sysconfdir}/ankaios
+ install -m 0644 ${STATE_YAML_SRC} ${IMAGE_ROOTFS}${sysconfdir}/ankaios/state.yaml
+}
diff --git a/recipes-extended/images/ankaios-image-minimal/state.yaml b/recipes-extended/images/ankaios-image-minimal/state.yaml
new file mode 100644
index 00000000..89fe43b5
--- /dev/null
+++ b/recipes-extended/images/ankaios-image-minimal/state.yaml
@@ -0,0 +1,11 @@
+# Example startup state for the ankaios-image-minimal test image.
+# Starts a single long-running "hello-ankaios" workload under podman so the
+# orchestrator can be exercised end-to-end (see README-ankaios.md).
+apiVersion: v1
+workloads:
+ hello-ankaios:
+ runtime: podman
+ agent: agent_A
+ runtimeConfig: |
+ image: docker.io/alpine:latest
+ commandArgs: [ "sh", "-c", "trap 'echo; exit' SIGINT SIGTERM; while true; do echo 'Hello Ankaios!'; sleep 1; done" ]
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [meta-virtualization][PATCH v3] Add Eclipse Ankaios container orchestrator recipe
2026-08-07 6:59 ` [meta-virtualization][PATCH v3] " kaloyan.rusev
@ 2026-08-07 18:31 ` Bruce Ashfield
0 siblings, 0 replies; 5+ messages in thread
From: Bruce Ashfield @ 2026-08-07 18:31 UTC (permalink / raw)
To: meta-virtualization
Thanks Kaloyan, and enjoy the vacation.
The v2->v3 changes address what I had, and the license comment
referencing deny.toml with the specific crate mappings
(ring / foldhash / borrow-or-share / unicode-ident) is exactly the
audit I was looking for.
The end-to-end test image + README is a nice add too -- it makes this
actually reviewable in a QEMU boot rather than just parsing cleanly.
Two things I'd like fixed before I take it. Neither is urgent; happy
to hold until you're back.
1. LICENSE uses the old bitbake-style '&' separator:
LICENSE = "Apache-2.0 & MIT & BSD-3-Clause & ISC & Unicode-3.0 & Zlib & MIT-0 & OpenSSL"
OE-core now emits a "LICENSE is using an old syntax" warning for
that form -- it wants SPDX-2 with 'AND' / 'OR', alphabetized, no
commas. We just did a layer-wide sweep for exactly this warning, so
a brand new recipe on '&' would go straight back into the same
pile. Suggested:
LICENSE = "Apache-2.0 AND BSD-3-Clause AND ISC AND MIT AND MIT-0 AND OpenSSL AND Unicode-3.0 AND Zlib"
MIT-0 might need special handling if oe-core's COMMON_LICENSE_DIR
doesn't ship it
2. The inherit line and the comment above it disagree. The comment
says:
# Add cargo-update-recipe-crates so `bitbake -c update_crates
# ankaios` works for future maintenance
but the actual inherit is:
inherit cargo systemd update-rc.d
cargo-update-recipe-crates isn't there, so `bitbake -c
update_crates ankaios` won't actually work. Presumably you meant:
inherit cargo cargo-update-recipe-crates systemd update-rc.d
That was the intent I was checking for -- future SRCREV bumps
should be a `bitbake ankaios -c update_crates` away rather than a
hand rebuild of ankaios-crates.inc.
Small style thing (not a blocker): `require ${BPN}-crates.inc` sits
above `inherit cargo`. Usually `inherit cargo` goes first and the
require comes after. Doesn't break anything the way you have it, but
it's what most cargo recipes in the layer look like.
I'll wait for v4.
Bruce
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-07 18:31 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-08 12:11 [meta-virtualization][PATCH] Add Eclipse Ankaios container orchestrator recipe kaloyan.rusev
2026-07-21 2:40 ` Bruce Ashfield
2026-08-06 10:56 ` [meta-virtualization][PATCH v2] " kaloyan.rusev
2026-08-07 6:59 ` [meta-virtualization][PATCH v3] " kaloyan.rusev
2026-08-07 18:31 ` Bruce Ashfield
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.