CEAKJ2ZOSH3EFDL6RLQU5MYFAC4RMDKSITCTYFUAJNCZZ6TPBWXAC # cargo-vet imports lock[[publisher.aho-corasick]]version = "1.1.3"when = "2024-03-20"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.anstream]]version = "0.6.15"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.anstyle]]version = "1.0.8"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.anstyle-parse]]version = "0.2.5"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.anstyle-query]]version = "1.1.1"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.anstyle-wincon]]version = "3.0.4"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.anyhow]]version = "1.0.86"when = "2024-05-18"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.async-std]]version = "1.12.0"when = "2022-06-18"user-id = 4333user-login = "joshtriplett"user-name = "Josh Triplett"[[publisher.async-trait]]version = "0.1.81"when = "2024-07-07"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.backtrace]]version = "0.3.73"when = "2024-06-12"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.bumpalo]]version = "3.16.0"when = "2024-04-08"user-id = 696user-login = "fitzgen"user-name = "Nick Fitzgerald"[[publisher.by_address]]version = "1.2.1"when = "2024-03-27"user-id = 2017user-login = "mbrubeck"user-name = "Matt Brubeck"[[publisher.byteorder]]version = "1.5.0"when = "2023-10-06"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.bytes]]version = "1.7.1"when = "2024-08-01"user-id = 6741user-login = "Darksonn"user-name = "Alice Ryhl"[[publisher.clap]]version = "4.5.16"when = "2024-08-15"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.clap_derive]]version = "4.5.13"when = "2024-07-31"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.clap_lex]]version = "0.7.2"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.colorchoice]]version = "1.0.2"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.core-foundation]]version = "0.9.3"when = "2022-02-07"user-id = 5946user-login = "jrmuizel"user-name = "Jeff Muizelaar"[[publisher.core-graphics-types]]version = "0.1.1"when = "2020-09-15"user-id = 2396user-login = "jdm"user-name = "Josh Matthews"[[publisher.core-text]]version = "19.2.0"when = "2021-02-14"user-id = 5946user-login = "jrmuizel"user-name = "Jeff Muizelaar"[[publisher.csv]]version = "1.3.0"when = "2023-10-03"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.csv-core]]version = "0.1.11"when = "2023-10-03"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.encoding_rs]]version = "0.8.34"when = "2024-04-10"user-id = 4484user-login = "hsivonen"user-name = "Henri Sivonen"[[publisher.etagere]]version = "0.2.13"when = "2024-06-17"user-id = 1281user-login = "nical"user-name = "Nicolas Silva"[[publisher.euclid]]version = "0.22.10"when = "2024-05-21"user-id = 1281user-login = "nical"user-name = "Nicolas Silva"[[publisher.h2]]version = "0.4.5"when = "2024-05-17"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.hashbrown]]version = "0.14.5"when = "2024-04-28"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.http]]version = "1.1.0"when = "2024-03-04"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.http-body-util]]version = "0.1.2"when = "2024-06-10"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.httparse]]version = "1.9.4"when = "2024-06-17"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.hyper]]version = "1.4.1"when = "2024-07-09"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.hyper-tls]]version = "0.6.0"when = "2023-11-27"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.hyper-util]]version = "0.1.7"when = "2024-08-06"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.indexmap]]version = "2.4.0"when = "2024-08-13"user-id = 539user-login = "cuviper"user-name = "Josh Stone"[[publisher.io-lifetimes]]version = "1.0.11"when = "2023-05-24"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.is_terminal_polyfill]]version = "1.70.1"when = "2024-07-25"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.jobserver]]version = "0.1.25"when = "2022-09-23"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.js-sys]]version = "0.3.70"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.libm]]version = "0.2.8"when = "2023-10-06"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.linux-raw-sys]]version = "0.3.8"when = "2023-05-19"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.linux-raw-sys]]version = "0.4.14"when = "2024-05-17"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.linux-raw-sys]]version = "0.6.5"when = "2024-08-16"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.lock_api]]version = "0.4.12"when = "2024-04-25"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.memchr]]version = "2.7.4"when = "2024-06-14"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.mime]]version = "0.3.17"when = "2023-03-20"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.new_debug_unreachable]]version = "1.0.6"when = "2024-03-15"user-id = 2017user-login = "mbrubeck"user-name = "Matt Brubeck"[[publisher.num_cpus]]version = "1.16.0"when = "2023-06-29"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.parking_lot]]version = "0.11.2"when = "2021-08-27"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.parking_lot]]version = "0.12.3"when = "2024-05-24"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.parking_lot_core]]version = "0.8.6"when = "2022-12-12"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.parking_lot_core]]version = "0.9.10"when = "2024-04-25"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.paste]]version = "1.0.15"when = "2024-05-07"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.phf]]version = "0.11.2"when = "2023-06-24"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_codegen]]version = "0.11.2"when = "2023-06-24"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_generator]]version = "0.10.0"when = "2021-08-10"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_generator]]version = "0.11.2"when = "2023-06-24"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_macros]]version = "0.11.2"when = "2023-06-24"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_shared]]version = "0.10.0"when = "2021-08-10"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.phf_shared]]version = "0.11.2"when = "2023-06-24"user-id = 51017user-login = "JohnTitor"user-name = "Yuki Okushi"[[publisher.presser]]version = "0.3.1"when = "2022-10-16"user-id = 52553user-login = "embark-studios"[[publisher.regex]]version = "1.10.6"when = "2024-08-02"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.regex-automata]]version = "0.4.7"when = "2024-06-09"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.regex-syntax]]version = "0.8.4"when = "2024-06-09"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.reqwest]]version = "0.12.5"when = "2024-06-17"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.rustix]]version = "0.37.27"when = "2023-10-26"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.rustix]]version = "0.38.34"when = "2024-04-22"user-id = 6825user-login = "sunfishcode"user-name = "Dan Gohman"[[publisher.ryu]]version = "1.0.18"when = "2024-05-07"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.same-file]]version = "1.0.6"when = "2020-01-11"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.scoped-tls]]version = "1.0.1"when = "2022-10-31"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.scopeguard]]version = "1.2.0"when = "2023-07-17"user-id = 2915user-login = "Amanieu"user-name = "Amanieu d'Antras"[[publisher.serde]]version = "1.0.208"when = "2024-08-15"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.serde_derive]]version = "1.0.208"when = "2024-08-15"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.serde_json]]version = "1.0.125"when = "2024-08-15"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.serde_repr]]version = "0.1.19"when = "2024-04-08"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.slab]]version = "0.4.9"when = "2023-08-22"user-id = 6741user-login = "Darksonn"user-name = "Alice Ryhl"[[publisher.smallvec]]version = "1.13.2"when = "2024-03-20"user-id = 2017user-login = "mbrubeck"user-name = "Matt Brubeck"[[publisher.syn]]version = "1.0.109"when = "2023-02-24"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.syn]]version = "2.0.75"when = "2024-08-17"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.termcolor]]version = "1.4.1"when = "2024-01-10"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.thiserror]]version = "1.0.63"when = "2024-07-17"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.thiserror-impl]]version = "1.0.63"when = "2024-07-17"user-id = 3618user-login = "dtolnay"user-name = "David Tolnay"[[publisher.tokio]]version = "1.39.3"when = "2024-08-17"user-id = 6741user-login = "Darksonn"user-name = "Alice Ryhl"[[publisher.tokio-util]]version = "0.7.11"when = "2024-05-04"user-id = 6741user-login = "Darksonn"user-name = "Alice Ryhl"[[publisher.toml_datetime]]version = "0.6.8"when = "2024-07-30"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.toml_edit]]version = "0.21.1"when = "2024-01-31"user-id = 6743user-login = "epage"user-name = "Ed Page"[[publisher.try-lock]]version = "0.2.5"when = "2023-12-07"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.unicode-normalization]]version = "0.1.23"when = "2024-02-20"user-id = 1139user-login = "Manishearth"user-name = "Manish Goregaokar"[[publisher.unicode-segmentation]]version = "1.11.0"when = "2024-02-07"user-id = 1139user-login = "Manishearth"user-name = "Manish Goregaokar"[[publisher.unicode-xid]]version = "0.2.4"when = "2022-09-15"user-id = 1139user-login = "Manishearth"user-name = "Manish Goregaokar"[[publisher.walkdir]]version = "2.5.0"when = "2024-03-01"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.want]]version = "0.3.1"when = "2023-06-14"user-id = 359user-login = "seanmonstar"user-name = "Sean McArthur"[[publisher.wasi]]version = "0.11.0+wasi-snapshot-preview1"when = "2022-01-19"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen]]version = "0.2.93"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen-backend]]version = "0.2.93"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen-futures]]version = "0.4.43"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen-macro]]version = "0.2.93"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen-macro-support]]version = "0.2.93"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.wasm-bindgen-shared]]version = "0.2.93"when = "2024-08-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.web-sys]]version = "0.3.67"when = "2024-01-12"user-id = 1user-login = "alexcrichton"user-name = "Alex Crichton"[[publisher.winapi-util]]version = "0.1.9"when = "2024-08-02"user-id = 189user-login = "BurntSushi"user-name = "Andrew Gallant"[[publisher.windows]]version = "0.52.0"when = "2023-11-15"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-core]]version = "0.52.0"when = "2023-11-15"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-sys]]version = "0.45.0"when = "2023-01-21"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-sys]]version = "0.48.0"when = "2023-03-31"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-sys]]version = "0.52.0"when = "2023-11-15"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-sys]]version = "0.59.0"when = "2024-07-30"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-targets]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-targets]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows-targets]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_gnullvm]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_gnullvm]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_gnullvm]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_msvc]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_msvc]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_aarch64_msvc]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_gnu]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_gnu]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_gnu]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_gnullvm]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_msvc]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_msvc]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_i686_msvc]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnu]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnu]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnu]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnullvm]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnullvm]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_gnullvm]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_msvc]]version = "0.42.2"when = "2023-03-13"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_msvc]]version = "0.48.5"when = "2023-08-18"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.windows_x86_64_msvc]]version = "0.52.6"when = "2024-07-03"user-id = 64539user-login = "kennykerr"user-name = "Kenny Kerr"[[publisher.winnow]]version = "0.5.40"when = "2024-02-12"user-id = 6743user-login = "epage"user-name = "Ed Page"[[audits.bytecode-alliance.wildcard-audits.bumpalo]]who = "Nick Fitzgerald <fitzgen@gmail.com>"criteria = "safe-to-deploy"user-id = 696 # Nick Fitzgerald (fitzgen)start = "2019-03-16"end = "2025-07-30"[[audits.bytecode-alliance.audits.base64]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.21.0"notes = "This crate has no dependencies, no build.rs, and contains no unsafe code."[[audits.bytecode-alliance.audits.base64]]who = "Andrew Brown <andrew.brown@intel.com>"criteria = "safe-to-deploy"delta = "0.21.3 -> 0.22.1"[[audits.bytecode-alliance.audits.block-buffer]]who = "Benjamin Bouvier <public@benj.me>"criteria = "safe-to-deploy"delta = "0.9.0 -> 0.10.2"[[audits.bytecode-alliance.audits.codespan-reporting]]who = "Jamey Sharp <jsharp@fastly.com>"criteria = "safe-to-deploy"version = "0.11.1"notes = "This library uses `forbid(unsafe_code)` and has no filesystem or network I/O."[[audits.bytecode-alliance.audits.crypto-common]]who = "Benjamin Bouvier <public@benj.me>"criteria = "safe-to-deploy"version = "0.1.3"[[audits.bytecode-alliance.audits.errno]]who = "Dan Gohman <dev@sunfishcode.online>"criteria = "safe-to-deploy"version = "0.3.0"notes = "This crate uses libc and windows-sys APIs to get and set the raw OS error value."[[audits.bytecode-alliance.audits.errno]]who = "Dan Gohman <dev@sunfishcode.online>"criteria = "safe-to-deploy"delta = "0.3.0 -> 0.3.1"notes = "Just a dependency version bump and a bug fix for redox"[[audits.bytecode-alliance.audits.fastrand]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "2.0.0 -> 2.0.1"notes = """This update had a few doc updates but no otherwise-substantial source codeupdates."""[[audits.bytecode-alliance.audits.foreign-types]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.2"notes = "This crate defined a macro-rules which creates wrappers working with FFI types. The implementation of this crate appears to be safe, but each use of this macro would need to be vetted for correctness as well."[[audits.bytecode-alliance.audits.foreign-types-shared]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.1.1"[[audits.bytecode-alliance.audits.futures-channel]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.27"notes = "build.rs is just detecting the target and setting cfg. unsafety is for implementing a concurrency primitives using atomics and unsafecell, and is not obviously incorrect (this is the sort of thing I wouldn't certify as correct without formal methods)"[[audits.bytecode-alliance.audits.futures-core]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.27"notes = "Unsafe used to implement a concurrency primitive AtomicWaker. Well-commented and not obviously incorrect. Like my other audits of these concurrency primitives inside the futures family, I couldn't certify that it is correct without formal methods, but that is out of scope for this vetting."[[audits.bytecode-alliance.audits.futures-executor]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.27"notes = "Unsafe used to implement the unpark mutex, which is well commented and not obviously incorrect. Like with futures-channel I wouldn't be able to certify it as correct without formal methods."[[audits.bytecode-alliance.audits.futures-io]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.27"[[audits.bytecode-alliance.audits.heck]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "0.4.1 -> 0.5.0"notes = "Minor changes for a `no_std` upgrade but otherwise everything looks as expected."[[audits.bytecode-alliance.audits.http-body]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "1.0.0-rc.2"[[audits.bytecode-alliance.audits.http-body]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "1.0.0-rc.2 -> 1.0.0"notes = "Only minor changes made for a stable release."[[audits.bytecode-alliance.audits.iana-time-zone-haiku]]who = "Dan Gohman <dev@sunfishcode.online>"criteria = "safe-to-deploy"version = "0.1.2"[[audits.bytecode-alliance.audits.idna]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"version = "0.3.0"notes = """This is a crate without unsafe code or usage of the standard library. The largesize of this crate comes from the large generated unicode tables file. Thiscrate is broadly used throughout the ecosystem and does not contain anythingsuspicious."""[[audits.bytecode-alliance.audits.jobserver]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "0.1.25 -> 0.1.32"[[audits.bytecode-alliance.audits.num-traits]]who = "Andrew Brown <andrew.brown@intel.com>"criteria = "safe-to-deploy"version = "0.2.19"notes = "As advertised: a numeric library. The only `unsafe` is from some float-to-int conversions, which seems expected."[[audits.bytecode-alliance.audits.openssl-probe]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.1.5"notes = "IO is only checking for the existence of paths in the filesystem"[[audits.bytecode-alliance.audits.percent-encoding]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"version = "2.2.0"notes = """This crate is a single-file crate that does what it says on the tin. There area few `unsafe` blocks related to utf-8 validation which are locally verifiableas correct and otherwise this crate is good to go."""[[audits.bytecode-alliance.audits.pin-utils]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.1.0"[[audits.bytecode-alliance.audits.pkg-config]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.25"notes = "This crate shells out to the pkg-config executable, but it appears to sanitize inputs reasonably."[[audits.bytecode-alliance.audits.pkg-config]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "0.3.26 -> 0.3.29"notes = """No `unsafe` additions or anything outside of the purview of the crate in thischange."""[[audits.bytecode-alliance.audits.rustc-demangle]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"version = "0.1.21"notes = "I am the author of this crate."[[audits.bytecode-alliance.audits.rustc-demangle]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"delta = "0.1.21 -> 0.1.24"[[audits.bytecode-alliance.audits.semver]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "1.0.17"notes = "plenty of unsafe pointer and vec tricks, but in well-structured and commented code that appears to be correct"[[audits.bytecode-alliance.audits.tinyvec_macros]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"version = "0.1.0"notes = """This is a trivial crate which only contains a singular macro definition which isintended to multiplex across the internal representation of a tinyvec,presumably. This trivially doesn't contain anything bad."""[[audits.bytecode-alliance.audits.tokio-native-tls]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.3.1"notes = "unsafety is used for smuggling std::task::Context as a raw pointer. Lifetime and type safety appears to be taken care of correctly."[[audits.bytecode-alliance.audits.unicode-bidi]]who = "Alex Crichton <alex@alexcrichton.com>"criteria = "safe-to-deploy"version = "0.3.8"notes = """This crate has no unsafe code and does not use `std::*`. Skimming the crate itdoes not attempt to out of the bounds of what it's already supposed to be doing."""[[audits.bytecode-alliance.audits.vcpkg]]who = "Pat Hickey <phickey@fastly.com>"criteria = "safe-to-deploy"version = "0.2.15"notes = "no build.rs, no macros, no unsafe. It reads the filesystem and makes copies of DLLs into OUT_DIR."[[audits.embark-studios.wildcard-audits.presser]]who = "Gray Olson <opensource@embark-studios.com>"criteria = "safe-to-deploy"user-id = 52553 # embark-studiosstart = "2021-01-01"end = "2024-05-23"notes = """Small crate with no dependencies and no ambient capabilities. The safe interface of the crateis gated behind unsafe implementation of a core trait, and care must be taken to ensure thatthe relevant invariants are guaranteed when doing so. Maintained by the Ark team at Embarkand used in production."""[[audits.embark-studios.audits.cfg_aliases]]who = "Johan Andersson <opensource@embark-studios.com>"criteria = "safe-to-deploy"version = "0.1.1"notes = "No unsafe usage or ambient capabilities"[[audits.embark-studios.audits.idna]]who = "Johan Andersson <opensource@embark-studios.com>"criteria = "safe-to-deploy"delta = "0.3.0 -> 0.4.0"notes = "No unsafe usage or ambient capabilities"[[audits.embark-studios.audits.jni]]who = "Robert Bragg <opensource@embark-studios.com>"criteria = "safe-to-deploy"version = "0.21.1"notes = """Aims to provide a safe JNI (Java Native Interface) API over theunsafe `jni_sys` crate.This is a very general FFI abstraction for Java VMs with a lot of unsafe codethroughout the API. There are almost certainly some edge cases with its designthat could lead to unsound behaviour but it should still be considerably saferthan working with JNI directly.A lot of the unsafe usage relates to quite-simple use of `from_raw` APIs toconstruct or cast wrapper types (around JNI pointers) which are fairlystraight-forward to verify/trust in context.Some unsafe code has good `// # Safety` documentation (this has been enforced fornewer code) but a lot of unsafe code doesn't document invariants that arebeing relied on.The design depends on non-trivial named lifetimes across many APIs to associateJava local references with JNI stack frames.The crate is not very actively maintained and was practically unmaintained forover a year before the 0.20 release.Robert Bragg who now works at Embark Studios became the maintainer of thiscrate in October 2022.In the process of working on the `jni` crate since becoming maintainer it'sworth noting that I came across multiple APIs that I found needed to bere-worked to address safety issues, including ensuring that APIs that are notimplemented safely are correctly declared as `unsafe`.There has been a focus on improving safety in the last two release.The jni crate has been used in production with the Signal messaging applicationfor over two years:https://github.com/signalapp/libsignal/blob/main/rust/bridge/jni/Cargo.toml# Some Notable Open Issues- https://github.com/jni-rs/jni-rs/issues/422 - questions soundness of linkingmultiple versions of jni crate into an application, considering the useof (separately scoped) thread-local-storage to track thread attachments- https://github.com/jni-rs/jni-rs/issues/405 - discusses the ease with whichcode may expose the JVM to invalid booleans with undefined behaviour"""[[audits.embark-studios.audits.ndk-context]]who = "Johan Andersson <opensource@embark-studios.com>"criteria = "safe-to-deploy"version = "0.1.1"notes = "Tiny crate that initializes Android with FFI, looks sane. No other ambient capabilities"[[audits.embark-studios.audits.tap]]who = "Johan Andersson <opensource@embark-studios.com>"criteria = "safe-to-deploy"version = "1.0.1"notes = "No unsafe usage or ambient capabilities"[[audits.google.audits.adler]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.2"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits (except in comments and in the `README.md` file).Note that some additional, internal notes about an older version of this cratecan be found at go/image-crate-chromium-security-review.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.ash]]who = "David Koloski <dkoloski@google.com>"criteria = "safe-to-deploy"version = "0.37.0+1.3.209"notes = "Reviewed on https://fxrev.dev/694269"aggregated-from = "https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/third_party/rust_crates/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.autocfg]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.1.0"notes = """Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'``, `'\bnet\b'``, `'\bunsafe\b'``and there were no hits except for reasonable, client-controlled usage of`std::fs` in `AutoCfg::with_dir`.This crate has been added to Chromium inhttps://source.chromium.org/chromium/chromium/src/+/591a0f30c5eac93b6a3d981c2714ffa4db28dbcbThe CL description contains a link to a Google-internal document with audit details."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.autocfg]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.1.0 -> 1.2.0"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'``, `'\bnet\b'``, `'\bunsafe\b'``and nothing changed from the baseline audit of 1.1.0. Skimmed through the1.1.0 => 1.2.0 delta and everything seemed okay.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.bitflags]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.3.2"notes = """Security review of earlier versions of the crate can be found at(Google-internal, sorry): go/image-crate-chromium-security-reviewThe crate exposes a function marked as `unsafe`, but doesn't use any`unsafe` blocks (except for tests of the single `unsafe` function). Ithink this justifies marking this crate as `ub-risk-1`.Additional review comments can be found at https://crrev.com/c/4723145/31"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.bitflags]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "2.4.2"notes = """Audit notes:* I've checked for any discussion in Google-internal cl/546819168 (where auditof version 2.3.3 happened)* `src/lib.rs` contains `#![cfg_attr(not(test), forbid(unsafe_code))]`* There are 2 cases of `unsafe` in `src/external.rs` but they seem to becorrect in a straightforward way - they just propagate the marker trait'simpl (e.g. `impl bytemuck::Pod`) from the inner to the outer type* Additional discussion and/or notes may be found in https://crrev.com/c/5238056"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.bitflags]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "2.4.2 -> 2.5.0"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.bitflags]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "2.5.0 -> 2.6.0"notes = "The changes from the previous version are negligible and thus it retains the same properties."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.cfg-if]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "1.0.0"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.clap_builder]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "4.5.15"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.color_quant]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "1.1.0"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.crc32fast]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.4.2"notes = """Security review of earlier versions of the crate can be found at(Google-internal, sorry): go/image-crate-chromium-security-reviewAudit comments for 1.4.2 can be found at https://crrev.com/c/4723145."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.dirs-next]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "2.0.0"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.equivalent]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "1.0.1"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.fastrand]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "1.9.0"notes = """`does-not-implement-crypto` is certified because this crate explicitly saysthat the RNG here is not cryptographically secure."""aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.fdeflate]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.3.4"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits.Note that some additional, internal notes about an older version of this cratecan be found at go/image-crate-chromium-security-review.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.flate2]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.30"notes = '''WARNING: This certification is a result of a **partial** audit. The`any_zlib` code has **not** been audited. Ability to track partialaudits is tracked in https://github.com/mozilla/cargo-vet/issues/380Chromium does use the `any_zlib` feature(s). Accidentally depending onthis feature in the future is prevented using the `ban_features` featureof `gnrt` - see:https://crrev.com/c/4723145/31/third_party/rust/chromium_crates_io/gnrt_config.tomlSecurity review of earlier versions of the crate can be found at(Google-internal, sorry): go/image-crate-chromium-security-reviewI grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`.All `unsafe` in `flate2` is gated behind `#[cfg(feature = "any_zlib")]`:* The code under `src/ffi/...` will not be used because the `mod c`declaration in `src/ffi/mod.rs` depends on the `any_zlib` config* 7 uses of `unsafe` in `src/mem.rs` also all depend on the`any_zlib` config:- 2 in `fn set_dictionary` (under `impl Compress`)- 2 in `fn set_level` (under `impl Compress`)- 3 in `fn set_dictionary` (under `impl Decompress`)All hits of `'\bfs\b'` are in comments, or example code, or test code(but not in product code).There were no hits of `-i cipher`, `-i crypto`, `'\bnet\b'`.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.flate2]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.30 -> 1.0.31"notes = """Only benign changes:* Comment-only changes in `.rs` files* Also changing dependency version in `Cargo.toml`, but this is for `any_zlib`feature which is not used in Chromium (i.e. this is a *partial* audit - seethe previous audit notes for 1.0.30)"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.font-types]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.5.2"notes = """Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were nohits except for 3 `unsafe impl bytemuck::SomeTrait for ...`. Each `impl` had areasonable safety comment and there were no actual `unsafe` blocks, so I thinkthis can be treated as `ub-risk-1`. Additional `unsafe` review comments can befound in https://crrev.com/c/5445719.For overall `safe-to-deploy` and `does-not-implement-crypto` I am mostlyrelying on certification by the Chromium engineers who work on the library(mostly drott@chromium.org)."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.font-types]]who = "danakj <danakj@chromium.org>"criteria = "safe-to-deploy"delta = "0.5.2 -> 0.5.3"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.font-types]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "0.5.3 -> 0.5.4"notes = """The delta just adds `impl From<GlyphId> for u32` - no impact on `unsafe impl`selsewhere."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.font-types]]who = "danakj@chromium.org"criteria = "safe-to-deploy"delta = "0.5.4 -> 0.5.5"notes = "No unsafe changes."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.font-types]]who = "Dominik Röttsches <drott@chromium.org>"criteria = "safe-to-deploy"delta = "0.5.5 -> 0.6.0"notes = "This change comprises changes to understand larger GlyphId and compatibility with older Mac TrueType fonts. No unsafe code is introduced."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.futures]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "0.3.28"notes = """`futures` has no logic other than tests - it simply `pub use`s things fromother crates."""aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.heck]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.4.1"notes = """Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'``, `'\bnet\b'``, `'\bunsafe\b'``and there were no hits.`heck` (version `0.3.3`) has been added to Chromium inhttps://source.chromium.org/chromium/chromium/src/+/28841c33c77833cc30b286f9ae24c97e7a8f4057"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.itoa]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.10"notes = '''I grepped for \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits.There are a few places where `unsafe` is used. Unsafe review notes can be foundin https://crrev.com/c/5350697.Version 1.0.1 of this crate has been added to Chromium inhttps://crrev.com/c/3321896.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.itoa]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.10 -> 1.0.11"notes = """Straightforward diff between 1.0.10 and 1.0.11 - only 3 commits:* Bumping up the version* A touch up of comments* And my own PR to make `unsafe` blocks more granular:https://github.com/dtolnay/itoa/pull/42"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.lazy_static]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.4.0"notes = '''I grepped for \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits.There are two places where `unsafe` is used. Unsafe review notes can be foundin https://crrev.com/c/5347418.This crate has been added to Chromium in https://crrev.com/c/3321895.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.lazy_static]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.4.0 -> 1.5.0"notes = "Unsafe review notes: https://crrev.com/c/5650836"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.miniz_oxide]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.7.4"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits, except for some mentions of "unsafe" in the `README.md`and in a comment in `src/deflate/core.rs`. The comment discusses whether afunction should be treated as unsafe, but there is no actual `unsafe` code, sothe crate meets the `ub-risk-0` criteria.Note that some additional, internal notes about an older version of this cratecan be found at go/image-crate-chromium-security-review.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.openssl-macros]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "0.1.0"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.openssl-macros]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"delta = "0.1.0 -> 0.1.1"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.pin-project-lite]]who = "David Koloski <dkoloski@google.com>"criteria = "safe-to-deploy"version = "0.2.9"notes = "Reviewed on https://fxrev.dev/824504"aggregated-from = "https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/third_party/rust_crates/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.pin-project-lite]]who = "David Koloski <dkoloski@google.com>"criteria = "safe-to-deploy"delta = "0.2.9 -> 0.2.13"notes = "Audited at https://fxrev.dev/946396"aggregated-from = "https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/third_party/rust_crates/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.png]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.17.13"notes = '''Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits except for reasonable, client-controlled usage of`std::fs::File` in tests in `src/encoder.rs`, tests in `src/decoder/stream.rs`,and in some example code.Note that some additional, internal notes about an older version of this cratecan be found at go/image-crate-chromium-security-review.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro-error-attr]]who = "George Burgess IV <gbiv@google.com>"criteria = "safe-to-deploy"version = "1.0.4"aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/refs/heads/main/cargo-vet/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.78"notes = """Grepped for \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits(except for a benign \"fs\" hit in a doc comment)Notes from the `unsafe` review can be found in https://crrev.com/c/5385745."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.78 -> 1.0.79"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.79 -> 1.0.80"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Dustin J. Mitchell <djmitche@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.80 -> 1.0.81"notes = "Comment changes only"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "danakj <danakj@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.81 -> 1.0.82"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Dustin J. Mitchell <djmitche@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.82 -> 1.0.83"notes = "Substantive change is replacing String with Box<str>, saving memory."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.83 -> 1.0.84"notes = "Only doc comment changes in `src/lib.rs`."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "danakj@chromium.org"criteria = "safe-to-deploy"delta = "1.0.84 -> 1.0.85"notes = "Test-only changes."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.proc-macro2]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.85 -> 1.0.86"notes = """Comment-only changes in `build.rs`.Reordering of `Cargo.toml` entries.Just bumping up the version number in `lib.rs`.Config-related changes in `test_size.rs`."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.quote]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.35"notes = """Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits(except for benign \"net\" hit in tests and \"fs\" hit in README.md)"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.quote]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "1.0.35 -> 1.0.36"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.read-fonts]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.19.0"notes = """Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits(except for a benign \"fs\" hit in a comment).For overall `safe-to-deploy` and `does-not-implement-crypto` I am mostlyrelying on certification by the Chromium engineers who work on the library(mostly drott@chromium.org)."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.read-fonts]]who = "danakj <danakj@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.0 -> 0.19.1"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.read-fonts]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.1 -> 0.19.2"notes = """The delta is a bug fix in `src/tables/cmap.rs`.No new `unsafe` - still `ub-risk-0`."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.read-fonts]]who = "danakj@chromium.org"criteria = "safe-to-deploy"delta = "0.19.2 -> 0.19.3"notes = "No unsafe."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.read-fonts]]who = "Dominik Röttsches <drott@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.3 -> 0.20.0"notes = """Contains changes for:* Adding IntSet, SparseBitSet* Support for VARC* Improved AAT support* Fuzzer overflow fixes, and avoiding timeouts in CMAP* Closure computations for subsetting of COLR* large glyphId support."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.simd-adler32]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.3.7"notes = """Security review of earlier versions of the crate can be found at(Google-internal, sorry): go/image-crate-chromium-security-reviewAudit comments for 1.3.2 can be found at https://crrev.com/c/4723145."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.skrifa]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "0.19.0"notes = """Grepped for \"unsafe\", \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits(except for benign \"fs\" hit in `skrifa-0.19.0/src/color/traversal_tests/mod.rs`).For overall `safe-to-deploy` and `does-not-implement-crypto` I am mostlyrelying on certification by the Chromium engineers who work on the library(mostly drott@chromium.org)."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.skrifa]]who = "Dustin J. Mitchell <djmitche@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.0 -> 0.19.1"notes = "Crate has `forbid_unsafe` and no unsafe code. Changes all appear font-related and safe."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.skrifa]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.1 -> 0.19.2"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.skrifa]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.2 -> 0.19.3"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.skrifa]]who = "Dominik Röttsches <drott@chromium.org>"criteria = "safe-to-deploy"delta = "0.19.3 -> 0.20.0"notes = "Contains mainly preparatory autohint changes and data tables."aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.static_assertions]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.1.0"notes = """Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'`, `'\bnet\b'`, `'\bunsafe\b'`and there were no hits except for one `unsafe`.The lambda where `unsafe` is used is never invoked (e.g. the `unsafe` codenever runs) and is only introduced for some compile-time checks. Additionalunsafe review comments can be found in https://crrev.com/c/5353376.This crate has been added to Chromium in https://crrev.com/c/3736562. The CLdescription contains a link to a document with an additional security review."""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.tinyvec]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.6.0"notes = """Grepped for `-i cipher`, `-i crypto`, `'\bfs\b'``, `'\bnet\b'``, `'\bunsafe\b'``and there were no hits except for some \"unsafe\" appearing in comments:```src/arrayvec.rs: // Note: This shouldn't use A::CAPACITY, because unsafe code can't rely onsrc/lib.rs://! All of this is done with no `unsafe` code within the crate. Technically thesrc/lib.rs://! `Vec` type from the standard library uses `unsafe` internally, but *thissrc/lib.rs://! crate* introduces no new `unsafe` code into your project.src/array.rs:/// Just a reminder: this trait is 100% safe, which means that `unsafe` code```This crate has been added to Chromium inhttps://source.chromium.org/chromium/chromium/src/+/24773c33e1b7a1b5069b9399fd034375995f290b"""aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.tinyvec]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "1.6.0 -> 1.6.1"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.tinyvec]]who = "Adrian Taylor <adetaylor@chromium.org>"criteria = "safe-to-deploy"delta = "1.6.1 -> 1.7.0"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.tinyvec]]who = "Dustin J. Mitchell <djmitche@chromium.org>"criteria = "safe-to-deploy"delta = "1.7.0 -> 1.8.0"aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.google.audits.unicode-ident]]who = "Lukasz Anforowicz <lukasza@chromium.org>"criteria = "safe-to-deploy"version = "1.0.12"notes = '''I grepped for \"crypt\", \"cipher\", \"fs\", \"net\" - there were no hits.All two functions from the public API of this crate use `unsafe` to avoid boundchecks for an array access. Cross-module analysis shows that the offsets canbe statically proven to be within array bounds. More details can be found inthe unsafe review CL at https://crrev.com/c/5350386.This crate has been added to Chromium in https://crrev.com/c/3891618.'''aggregated-from = "https://chromium.googlesource.com/chromium/src/+/main/third_party/rust/chromium_crates_io/supply-chain/audits.toml?format=TEXT"[[audits.isrg.audits.base64]]who = "Tim Geoghegan <timg@letsencrypt.org>"criteria = "safe-to-deploy"delta = "0.21.0 -> 0.21.1"[[audits.isrg.audits.base64]]who = "Brandon Pitman <bran@bran.land>"criteria = "safe-to-deploy"delta = "0.21.1 -> 0.21.2"[[audits.isrg.audits.base64]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"delta = "0.21.2 -> 0.21.3"[[audits.isrg.audits.block-buffer]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"version = "0.9.0"[[audits.isrg.audits.crunchy]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"version = "0.2.2"[[audits.isrg.audits.rand_chacha]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"version = "0.3.1"[[audits.isrg.audits.rand_core]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"version = "0.6.3"[[audits.isrg.audits.subtle]]who = "David Cook <dcook@divviup.org>"criteria = "safe-to-deploy"delta = "2.5.0 -> 2.6.1"[[audits.mozilla.wildcard-audits.core-foundation]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"user-id = 5946 # Jeff Muizelaar (jrmuizel)start = "2019-03-29"end = "2023-05-04"renew = falsenotes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.core-graphics-types]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"user-id = 2396 # Josh Matthews (jdm)start = "2020-07-20"end = "2023-05-04"renew = falsenotes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.core-text]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"user-id = 5946 # Jeff Muizelaar (jrmuizel)start = "2021-02-14"end = "2023-05-04"renew = falsenotes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.encoding_rs]]who = "Henri Sivonen <hsivonen@hsivonen.fi>"criteria = "safe-to-deploy"user-id = 4484 # Henri Sivonen (hsivonen)start = "2019-02-26"end = "2024-08-28"notes = "I, Henri Sivonen, wrote encoding_rs for Gecko and have reviewed contributions by others. There are two caveats to the certification: 1) The crate does things that are documented to be UB but that do not appear to actually be UB due to integer types differing from the general rule; https://github.com/hsivonen/encoding_rs/issues/79 . 2) It would be prudent to re-review the code that reinterprets buffers of integers as SIMD vectors; see https://github.com/hsivonen/encoding_rs/issues/87 ."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.etagere]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"user-id = 1281 # Nicolas Silva (nical)start = "2020-11-12"end = "2025-06-01"notes = "I am the author of this crate."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.euclid]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"user-id = 1281 # Nicolas Silva (nical)start = "2019-03-14"end = "2025-04-25"notes = "I wrote most of the commits in the euclid reprository and review every change that is not produced by me."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.unicode-normalization]]who = "Manish Goregaokar <manishsmail@gmail.com>"criteria = "safe-to-deploy"user-id = 1139 # Manish Goregaokar (Manishearth)start = "2019-11-06"end = "2024-05-03"notes = "All code written or reviewed by Manish"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.unicode-segmentation]]who = "Manish Goregaokar <manishsmail@gmail.com>"criteria = "safe-to-deploy"user-id = 1139 # Manish Goregaokar (Manishearth)start = "2019-05-15"end = "2024-05-03"notes = "All code written or reviewed by Manish"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.wildcard-audits.unicode-xid]]who = "Manish Goregaokar <manishsmail@gmail.com>"criteria = "safe-to-deploy"user-id = 1139 # Manish Goregaokar (Manishearth)start = "2019-07-25"end = "2024-05-03"notes = "All code written or reviewed by Manish"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.android_system_properties]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"version = "0.1.2"notes = "I wrote this crate, reviewed by jimb. It is mostly a Rust port of some C++ code we already ship."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.android_system_properties]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.1.2 -> 0.1.4"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.android_system_properties]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.1.4 -> 0.1.5"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.ash]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.37.0+1.3.209 -> 0.37.1+1.3.235"notes = """Nicolas Silva, Jim Blandy, and Teodor Tanasoaia audited ash masterbranch commits from e43e9c0c to 6bd82768 inclusive."""aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.ash]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.37.1+1.3.235 -> 0.37.2+1.3.238"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.ash]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.37.2+1.3.238 -> 0.37.3+1.3.251"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.bit-set]]who = "Aria Beingessner <a.beingessner@gmail.com>"criteria = "safe-to-deploy"version = "0.5.2"notes = "Another crate I own via contain-rs that is ancient and maintenance mode, no known issues."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.bit-set]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.5.2 -> 0.5.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.bit-vec]]who = "Aria Beingessner <a.beingessner@gmail.com>"criteria = "safe-to-deploy"version = "0.6.3"notes = "Another crate I own via contain-rs that is ancient and in maintenance mode but otherwise perfectly fine."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.block-buffer]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.10.2 -> 0.10.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.core-foundation]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.9.3 -> 0.9.4"notes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.core-graphics-types]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.1.1 -> 0.1.2"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.core-graphics-types]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.1.2 -> 0.1.3"notes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.core-text]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "19.2.0 -> 20.0.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.core-text]]who = "Jonathan Kew <jfkthame@gmail.com>"criteria = "safe-to-deploy"delta = "20.0.0 -> 20.1.0"notes = """The bulk of the 20.0.0 -> 20.1.0 changes were purely cosmetic clippy and rustfmt changes.The only substantive change was the addition of wrappers to expose two additional Core Text APIs,the variants of CTFontCreateWithName and CTFontCreateWithFontDescriptor that accept a CTFontOptionsparameter. These are directly parallel to the existing versions without CTFontOptions, and do notintroduce any new forms of risk."""aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.crypto-common]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.1.3 -> 0.1.6"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.dwrote]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "0.11.0"notes = "All code written or reviewed by Mozilla staff."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.errno]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.1 -> 0.3.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.fastrand]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "1.9.0 -> 2.0.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.fastrand]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "2.0.1 -> 2.1.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.fnv]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "1.0.7"notes = "Simple hasher implementation with no unsafe code."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.foreign-types]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.3.2 -> 0.5.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.foreign-types-macros]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"version = "0.2.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.foreign-types-shared]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.1.1 -> 0.3.1"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.form_urlencoded]]who = "Valentin Gosu <valentin.gosu@gmail.com>"criteria = "safe-to-deploy"version = "1.2.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.form_urlencoded]]who = "Valentin Gosu <valentin.gosu@gmail.com>"criteria = "safe-to-deploy"delta = "1.2.0 -> 1.2.1"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.futures-channel]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.27 -> 0.3.28"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.futures-core]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.27 -> 0.3.28"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.futures-executor]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.27 -> 0.3.28"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.futures-io]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.27 -> 0.3.28"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.gpu-allocator]]who = "Erich Gubler <erichdongubler@gmail.com>"criteria = "safe-to-deploy"version = "0.25.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.hashbrown]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"version = "0.12.3"notes = "This version is used in rust's libstd, so effectively we're already trusting it"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.hex]]who = "Simon Friedberger <simon@mozilla.com>"criteria = "safe-to-deploy"version = "0.4.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.idna]]who = "Valentin Gosu <valentin.gosu@gmail.com>"criteria = "safe-to-deploy"delta = "0.4.0 -> 0.5.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.malloc_buf]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "0.0.6"notes = """Very small crate for managing malloc-ed buffers, primarily for use in the objc crate.There is an edge-case condition that passes slice::from_raw_parts(0x1, 0) which I'mnot entirely certain is technically sound, but in either case I am reasonably confidentit's not exploitable."""aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.memmap2]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.8.0 -> 0.9.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.metal]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"version = "0.23.1"notes = "This audit treats Dzmitry Malyshau (kvark) as a trusted reviewer."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.metal]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.23.1 -> 0.24.0"notes = "This audit treats Dzmitry Malyshau (kvark) as a trusted reviewer."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.metal]]who = "Teodor Tanasoaia <ttanasoaia@mozilla.com>"criteria = "safe-to-deploy"delta = "0.24.0 -> 0.25.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.metal]]who = "Erich Gubler <egubler@mozilla.com>"criteria = "safe-to-deploy"delta = "0.25.0 -> 0.26.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.metal]]who = "Nicolas Silva <nical@fastmail.com>, Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.26.0 -> 0.27.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Dzmitry Malyshau <kvark@fastmail.com>"criteria = "safe-to-deploy"version = "0.8.0"notes = """This crate, up through the indicated version, was written or reviewedby Dzmitry Malyshau while he was a Mozilla employee. Dzmitry leftMozilla at the beginning of February 2022. This audit statement wascollected by Jim Blandy, a Mozilla employee, over email in July 2022:Dzmitry was shown, and agreed to, the 'safe-to-deploy' text."""aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.8.0 -> 0.9.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.9.0 -> 0.10.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.10.0 -> 0.11.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.11.0 -> 0.12.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.12.0 -> 0.13.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.13.0 -> 0.14.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.naga]]who = "Erich Gubler <erichdongubler@gmail.com>"criteria = "safe-to-deploy"delta = "0.14.0 -> 0.19.2"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.percent-encoding]]who = "Valentin Gosu <valentin.gosu@gmail.com>"criteria = "safe-to-deploy"delta = "2.2.0 -> 2.3.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.percent-encoding]]who = "Valentin Gosu <valentin.gosu@gmail.com>"criteria = "safe-to-deploy"delta = "2.3.0 -> 2.3.1"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.phf_generator]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.10.0 -> 0.11.2"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.phf_shared]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.10.0 -> 0.11.2"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.pin-project-lite]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.2.13 -> 0.2.14"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.pkg-config]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.3.25 -> 0.3.26"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.precomputed-hash]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "0.1.1"notes = "This is a trivial crate."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.rand_core]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.6.3 -> 0.6.4"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.range-alloc]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "0.1.2"notes = "Dzmitry authored this crate while he was staff at Mozilla."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.range-alloc]]who = "Mike Hommey <mh+mozilla@glandium.org>"criteria = "safe-to-deploy"delta = "0.1.2 -> 0.1.3"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.redox_syscall]]who = "Jan-Erik Rediger <jrediger@mozilla.com>"criteria = "safe-to-deploy"delta = "0.2.16 -> 0.3.5"aggregated-from = "https://raw.githubusercontent.com/mozilla/glean/main/supply-chain/audits.toml"[[audits.mozilla.audits.rustc-hash]]who = "Bobby Holley <bobbyholley@gmail.com>"criteria = "safe-to-deploy"version = "1.1.0"notes = "Straightforward crate with no unsafe code, does what it says on the tin."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.subtle]]who = "Simon Friedberger <simon@mozilla.com>"criteria = "safe-to-deploy"version = "2.5.0"notes = "The goal is to provide some constant-time correctness for cryptographic implementations. The approach is reasonable, it is known to be insufficient but this is pointed out in the documentation."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.unicode-bidi]]who = "Makoto Kato <m_kato@ga2.so-net.ne.jp>"criteria = "safe-to-deploy"delta = "0.3.8 -> 0.3.13"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.unicode-bidi]]who = "Jonathan Kew <jkew@mozilla.com>"criteria = "safe-to-deploy"delta = "0.3.13 -> 0.3.14"notes = "I am the author of the bulk of the upstream changes in this version, and also checked the remaining post-0.3.13 changes."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.unicode-bidi]]who = "Jonathan Kew <jfkthame@gmail.com>"criteria = "safe-to-deploy"delta = "0.3.14 -> 0.3.15"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.unicode-linebreak]]who = "Jan-Erik Rediger <jrediger@mozilla.com>"criteria = "safe-to-deploy"version = "0.1.5"aggregated-from = "https://raw.githubusercontent.com/mozilla/glean/main/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Dzmitry Malyshau <kvark@fastmail.com>"criteria = "safe-to-deploy"version = "0.12.0"notes = """This crate, up through the indicated version, was written or reviewedby Dzmitry Malyshau while he was a Mozilla employee. Dzmitry leftMozilla at the beginning of February 2022. This audit statement wascollected by Jim Blandy, a Mozilla employee, over email in July 2022:Dzmitry was shown, and agreed to, the 'safe-to-deploy' text."""aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Jim Blandy <jimb@mozilla.com>"criteria = "safe-to-deploy"delta = "0.12.0 -> 0.13.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Jim Blandy <jimb@red-bean.com>"criteria = "safe-to-deploy"delta = "0.13.0 -> 0.14.0"notes = "Audit by Erich Gubler, Jim Blandy, Nicolas Silva, and Teodor Tanasoaia."aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.14.0 -> 0.15.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.15.0 -> 0.16.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.16.0 -> 0.17.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Nicolas Silva <nical@fastmail.com>"criteria = "safe-to-deploy"delta = "0.17.0 -> 0.18.0"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.mozilla.audits.wgpu-types]]who = "Erich Gubler <erichdongubler@gmail.com>"criteria = "safe-to-deploy"delta = "0.18.0 -> 0.19.2"aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml"[[audits.zcash.audits.autocfg]]who = "Daira-Emma Hopwood <daira@jacaranda.org>"criteria = "safe-to-deploy"delta = "1.2.0 -> 1.3.0"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.base64]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.21.3 -> 0.21.4"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.base64]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.21.4 -> 0.21.5"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.base64]]who = "Daira-Emma Hopwood <daira@jacaranda.org>"criteria = "safe-to-deploy"delta = "0.21.5 -> 0.21.7"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.block-buffer]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.10.3 -> 0.10.4"notes = "Adds panics to prevent a block size of zero from causing unsoundness."aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.errno]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.3 -> 0.3.8"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.errno]]who = "Daira-Emma Hopwood <daira@jacaranda.org>"criteria = "safe-to-deploy"delta = "0.3.8 -> 0.3.9"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.futures]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.28 -> 0.3.30"notes = "Only sub-crate updates and corresponding changes to tests."aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.futures-channel]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.28 -> 0.3.29"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.futures-channel]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.29 -> 0.3.30"notes = "Removes `build.rs` now that it can rely on the `target_has_atomic` attribute."aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.futures-core]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.28 -> 0.3.29"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.futures-core]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.29 -> 0.3.30"notes = "Removes `build.rs` now that it can rely on the `target_has_atomic` attribute."aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.futures-executor]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.28 -> 0.3.30"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.futures-io]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.3.28 -> 0.3.30"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.http-body]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "1.0.0 -> 1.0.1"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.memmap2]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "0.9.3 -> 0.9.4"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.pkg-config]]who = "Daira-Emma Hopwood <daira@jacaranda.org>"criteria = "safe-to-deploy"delta = "0.3.29 -> 0.3.30"aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.rustc_version]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"version = "0.4.0"notes = """Most of the crate is code to parse and validate the output of `rustc -vV`. The caller canchoose which `rustc` to use, or can use `rustc_version::{version, version_meta}` which willtry `$RUSTC` followed by `rustc`.If an adversary can arbitrarily set the `$RUSTC` environment variable then this crate willexecute arbitrary code. But when this crate is used within a build script, `$RUSTC` shouldbe set correctly by `cargo`."""aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.semver]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "1.0.17 -> 1.0.18"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.semver]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "1.0.18 -> 1.0.19"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.semver]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "1.0.19 -> 1.0.20"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.semver]]who = "Daira-Emma Hopwood <daira@jacaranda.org>"criteria = "safe-to-deploy"delta = "1.0.20 -> 1.0.22"aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"[[audits.zcash.audits.semver]]who = "Jack Grigg <jack@electriccoin.co>"criteria = "safe-to-deploy"delta = "1.0.22 -> 1.0.23"notes = """`build.rs` change is to enable checking for expected `#[cfg]` names if compilingwith Rust 1.80 or later."""aggregated-from = "https://raw.githubusercontent.com/zcash/librustzcash/main/supply-chain/audits.toml"[[audits.zcash.audits.tinyvec_macros]]who = "Jack Grigg <jack@z.cash>"criteria = "safe-to-deploy"delta = "0.1.0 -> 0.1.1"notes = "Adds `#![forbid(unsafe_code)]` and license files."aggregated-from = "https://raw.githubusercontent.com/zcash/zcash/master/qa/supply-chain/audits.toml"
# cargo-vet config file[cargo-vet]version = "0.9"[imports.bytecode-alliance]url = "https://raw.githubusercontent.com/bytecodealliance/wasmtime/main/supply-chain/audits.toml"[imports.embark-studios]url = "https://raw.githubusercontent.com/EmbarkStudios/rust-ecosystem/main/audits.toml"[imports.google]url = "https://raw.githubusercontent.com/google/supply-chain/main/audits.toml"[imports.isrg]url = "https://raw.githubusercontent.com/divviup/libprio-rs/main/supply-chain/audits.toml"[imports.mozilla]url = "https://raw.githubusercontent.com/mozilla/supply-chain/main/audits.toml"[imports.zcash]url = "https://raw.githubusercontent.com/zcash/rust-ecosystem/main/supply-chain/audits.toml"[policy.financial-accounts]audit-as-crates-io = true[[exemptions.ab_glyph]]version = "0.2.28"criteria = "safe-to-deploy"[[exemptions.ab_glyph_rasterizer]]version = "0.1.8"criteria = "safe-to-deploy"[[exemptions.addr2line]]version = "0.22.0"criteria = "safe-to-deploy"[[exemptions.ahash]]version = "0.7.8"criteria = "safe-to-deploy"[[exemptions.ahash]]version = "0.8.11"criteria = "safe-to-deploy"[[exemptions.allocator-api2]]version = "0.2.18"criteria = "safe-to-deploy"[[exemptions.android-activity]]version = "0.5.2"criteria = "safe-to-deploy"[[exemptions.android-properties]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.android-tzdata]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.approx]]version = "0.5.1"criteria = "safe-to-deploy"[[exemptions.arrayref]]version = "0.3.8"criteria = "safe-to-deploy"[[exemptions.arrayvec]]version = "0.7.6"criteria = "safe-to-deploy"[[exemptions.as-raw-xcb-connection]]version = "1.0.1"criteria = "safe-to-deploy"[[exemptions.ashpd]]version = "0.8.1"criteria = "safe-to-deploy"[[exemptions.async-broadcast]]version = "0.7.1"criteria = "safe-to-deploy"[[exemptions.async-channel]]version = "1.9.0"criteria = "safe-to-deploy"[[exemptions.async-channel]]version = "2.3.1"criteria = "safe-to-deploy"[[exemptions.async-executor]]version = "1.13.0"criteria = "safe-to-deploy"[[exemptions.async-global-executor]]version = "2.4.1"criteria = "safe-to-deploy"[[exemptions.async-io]]version = "1.13.0"criteria = "safe-to-deploy"[[exemptions.async-io]]version = "2.3.4"criteria = "safe-to-deploy"[[exemptions.async-lock]]version = "2.8.0"criteria = "safe-to-deploy"[[exemptions.async-lock]]version = "3.4.0"criteria = "safe-to-deploy"[[exemptions.async-process]]version = "1.8.1"criteria = "safe-to-deploy"[[exemptions.async-process]]version = "2.2.4"criteria = "safe-to-deploy"[[exemptions.async-recursion]]version = "1.1.1"criteria = "safe-to-deploy"[[exemptions.async-signal]]version = "0.2.10"criteria = "safe-to-deploy"[[exemptions.async-task]]version = "4.7.1"criteria = "safe-to-deploy"[[exemptions.atomic-waker]]version = "1.1.2"criteria = "safe-to-deploy"[[exemptions.bitvec]]version = "1.0.1"criteria = "safe-to-deploy"[[exemptions.block]]version = "0.1.6"criteria = "safe-to-deploy"[[exemptions.block-sys]]version = "0.2.1"criteria = "safe-to-deploy"[[exemptions.block2]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.block2]]version = "0.5.1"criteria = "safe-to-deploy"[[exemptions.blocking]]version = "1.6.1"criteria = "safe-to-deploy"[[exemptions.borsh]]version = "1.5.1"criteria = "safe-to-deploy"[[exemptions.borsh-derive]]version = "1.5.1"criteria = "safe-to-deploy"[[exemptions.bytecheck]]version = "0.6.12"criteria = "safe-to-deploy"[[exemptions.bytecheck_derive]]version = "0.6.12"criteria = "safe-to-deploy"[[exemptions.bytemuck]]version = "1.17.0"criteria = "safe-to-deploy"[[exemptions.bytemuck_derive]]version = "1.7.1"criteria = "safe-to-deploy"[[exemptions.calloop]]version = "0.12.4"criteria = "safe-to-deploy"[[exemptions.calloop]]version = "0.13.0"criteria = "safe-to-deploy"[[exemptions.calloop-wayland-source]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.calloop-wayland-source]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.cc]]version = "1.1.13"criteria = "safe-to-deploy"[[exemptions.cesu8]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.cfg_aliases]]version = "0.2.1"criteria = "safe-to-deploy"[[exemptions.chrono]]version = "0.4.38"criteria = "safe-to-deploy"[[exemptions.clipboard-win]]version = "5.4.0"criteria = "safe-to-deploy"[[exemptions.clipboard_macos]]version = "0.1.0"criteria = "safe-to-deploy"[[exemptions.clipboard_wayland]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.clipboard_x11]]version = "0.4.2"criteria = "safe-to-deploy"[[exemptions.com]]version = "0.6.0"criteria = "safe-to-deploy"[[exemptions.com_macros]]version = "0.6.0"criteria = "safe-to-deploy"[[exemptions.com_macros_support]]version = "0.6.0"criteria = "safe-to-deploy"[[exemptions.combine]]version = "4.6.7"criteria = "safe-to-deploy"[[exemptions.concurrent-queue]]version = "2.5.0"criteria = "safe-to-deploy"[[exemptions.core-foundation-sys]]version = "0.8.7"criteria = "safe-to-deploy"[[exemptions.core-graphics]]version = "0.23.2"criteria = "safe-to-deploy"[[exemptions.cosmic-text]]version = "0.10.0"criteria = "safe-to-deploy"[[exemptions.cpufeatures]]version = "0.2.13"criteria = "safe-to-deploy"[[exemptions.crossbeam-utils]]version = "0.8.20"criteria = "safe-to-deploy"[[exemptions.cstr]]version = "0.2.12"criteria = "safe-to-deploy"[[exemptions.ctor-lite]]version = "0.1.0"criteria = "safe-to-deploy"[[exemptions.cursor-icon]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.d3d12]]version = "0.19.0"criteria = "safe-to-deploy"[[exemptions.digest]]version = "0.10.7"criteria = "safe-to-deploy"[[exemptions.dirs-sys-next]]version = "0.1.2"criteria = "safe-to-deploy"[[exemptions.dispatch]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.dlib]]version = "0.5.2"criteria = "safe-to-deploy"[[exemptions.downcast-rs]]version = "1.2.1"criteria = "safe-to-deploy"[[exemptions.drm]]version = "0.12.0"criteria = "safe-to-deploy"[[exemptions.drm-ffi]]version = "0.8.0"criteria = "safe-to-deploy"[[exemptions.drm-fourcc]]version = "2.2.0"criteria = "safe-to-deploy"[[exemptions.drm-sys]]version = "0.7.0"criteria = "safe-to-deploy"[[exemptions.endi]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.enumflags2]]version = "0.7.10"criteria = "safe-to-deploy"[[exemptions.enumflags2_derive]]version = "0.7.10"criteria = "safe-to-deploy"[[exemptions.error-code]]version = "3.2.0"criteria = "safe-to-deploy"[[exemptions.event-listener]]version = "2.5.3"criteria = "safe-to-deploy"[[exemptions.event-listener]]version = "3.1.0"criteria = "safe-to-deploy"[[exemptions.event-listener]]version = "5.3.1"criteria = "safe-to-deploy"[[exemptions.event-listener-strategy]]version = "0.5.2"criteria = "safe-to-deploy"[[exemptions.fast-srgb8]]version = "1.0.0"criteria = "safe-to-deploy"[[exemptions.financial-accounts]]version = "0.2.0-dev"criteria = "safe-to-deploy"[[exemptions.float-ord]]version = "0.3.2"criteria = "safe-to-deploy"[[exemptions.float_next_after]]version = "1.0.0"criteria = "safe-to-deploy"[[exemptions.font-kit]]version = "0.13.2"criteria = "safe-to-deploy"[[exemptions.fontconfig-parser]]version = "0.5.7"criteria = "safe-to-deploy"[[exemptions.fontdb]]version = "0.15.0"criteria = "safe-to-deploy"[[exemptions.freetype-sys]]version = "0.20.1"criteria = "safe-to-deploy"[[exemptions.funty]]version = "2.0.0"criteria = "safe-to-deploy"[[exemptions.futf]]version = "0.1.5"criteria = "safe-to-deploy"[[exemptions.futures-lite]]version = "1.13.0"criteria = "safe-to-deploy"[[exemptions.futures-lite]]version = "2.3.0"criteria = "safe-to-deploy"[[exemptions.futures-macro]]version = "0.3.30"criteria = "safe-to-deploy"[[exemptions.futures-sink]]version = "0.3.30"criteria = "safe-to-deploy"[[exemptions.futures-task]]version = "0.3.30"criteria = "safe-to-deploy"[[exemptions.futures-util]]version = "0.3.30"criteria = "safe-to-deploy"[[exemptions.generic-array]]version = "0.14.7"criteria = "safe-to-deploy"[[exemptions.gethostname]]version = "0.4.3"criteria = "safe-to-deploy"[[exemptions.getrandom]]version = "0.2.15"criteria = "safe-to-deploy"[[exemptions.gif]]version = "0.12.0"criteria = "safe-to-deploy"[[exemptions.gimli]]version = "0.29.0"criteria = "safe-to-deploy"[[exemptions.gl_generator]]version = "0.14.0"criteria = "safe-to-deploy"[[exemptions.glam]]version = "0.25.0"criteria = "safe-to-deploy"[[exemptions.gloo-timers]]version = "0.2.6"criteria = "safe-to-deploy"[[exemptions.glow]]version = "0.13.1"criteria = "safe-to-deploy"[[exemptions.glutin_wgl_sys]]version = "0.5.0"criteria = "safe-to-deploy"[[exemptions.glyphon]]version = "0.5.0"criteria = "safe-to-deploy"[[exemptions.gpu-alloc]]version = "0.6.0"criteria = "safe-to-deploy"[[exemptions.gpu-alloc-types]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.gpu-descriptor]]version = "0.2.4"criteria = "safe-to-deploy"[[exemptions.gpu-descriptor-types]]version = "0.1.2"criteria = "safe-to-deploy"[[exemptions.guillotiere]]version = "0.6.2"criteria = "safe-to-deploy"[[exemptions.half]]version = "2.4.1"criteria = "safe-to-deploy"[[exemptions.hassle-rs]]version = "0.11.0"criteria = "safe-to-deploy"[[exemptions.hermit-abi]]version = "0.3.9"criteria = "safe-to-deploy"[[exemptions.hermit-abi]]version = "0.4.0"criteria = "safe-to-deploy"[[exemptions.hexf-parse]]version = "0.2.1"criteria = "safe-to-deploy"[[exemptions.home]]version = "0.5.9"criteria = "safe-to-deploy"[[exemptions.html5ever]]version = "0.27.0"criteria = "safe-to-deploy"[[exemptions.hyper-rustls]]version = "0.27.2"criteria = "safe-to-deploy"[[exemptions.iana-time-zone]]version = "0.1.60"criteria = "safe-to-deploy"[[exemptions.iced]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_core]]version = "0.12.3"criteria = "safe-to-deploy"[[exemptions.iced_futures]]version = "0.12.0"criteria = "safe-to-deploy"[[exemptions.iced_graphics]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_renderer]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_runtime]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_style]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_tiny_skia]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_wgpu]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.iced_widget]]version = "0.12.3"criteria = "safe-to-deploy"[[exemptions.iced_winit]]version = "0.12.2"criteria = "safe-to-deploy"[[exemptions.icrate]]version = "0.0.4"criteria = "safe-to-deploy"[[exemptions.image]]version = "0.24.9"criteria = "safe-to-deploy"[[exemptions.instant]]version = "0.1.13"criteria = "safe-to-deploy"[[exemptions.ipnet]]version = "2.9.0"criteria = "safe-to-deploy"[[exemptions.jni-sys]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.jpeg-decoder]]version = "0.3.1"criteria = "safe-to-deploy"[[exemptions.khronos-egl]]version = "6.0.0"criteria = "safe-to-deploy"[[exemptions.khronos_api]]version = "3.1.0"criteria = "safe-to-deploy"[[exemptions.kurbo]]version = "0.10.4"criteria = "safe-to-deploy"[[exemptions.kv-log-macro]]version = "1.0.7"criteria = "safe-to-deploy"[[exemptions.libc]]version = "0.2.157"criteria = "safe-to-deploy"[[exemptions.libloading]]version = "0.7.4"criteria = "safe-to-deploy"[[exemptions.libloading]]version = "0.8.5"criteria = "safe-to-deploy"[[exemptions.libredox]]version = "0.0.2"criteria = "safe-to-deploy"[[exemptions.libredox]]version = "0.1.3"criteria = "safe-to-deploy"[[exemptions.log]]version = "0.4.22"criteria = "safe-to-deploy"[[exemptions.lru]]version = "0.12.4"criteria = "safe-to-deploy"[[exemptions.lyon]]version = "1.0.1"criteria = "safe-to-deploy"[[exemptions.lyon_algorithms]]version = "1.0.4"criteria = "safe-to-deploy"[[exemptions.lyon_geom]]version = "1.0.5"criteria = "safe-to-deploy"[[exemptions.lyon_path]]version = "1.0.5"criteria = "safe-to-deploy"[[exemptions.lyon_tessellation]]version = "1.0.15"criteria = "safe-to-deploy"[[exemptions.mac]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.markup5ever]]version = "0.12.1"criteria = "safe-to-deploy"[[exemptions.markup5ever_rcdom]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.memmap2]]version = "0.8.0"criteria = "safe-to-deploy"[[exemptions.memoffset]]version = "0.9.1"criteria = "safe-to-deploy"[[exemptions.mio]]version = "1.0.2"criteria = "safe-to-deploy"[[exemptions.native-tls]]version = "0.2.12"criteria = "safe-to-deploy"[[exemptions.ndk]]version = "0.8.0"criteria = "safe-to-deploy"[[exemptions.ndk-sys]]version = "0.5.0+25.2.9519653"criteria = "safe-to-deploy"[[exemptions.nix]]version = "0.29.0"criteria = "safe-to-deploy"[[exemptions.num_enum]]version = "0.7.3"criteria = "safe-to-deploy"[[exemptions.num_enum_derive]]version = "0.7.3"criteria = "safe-to-deploy"[[exemptions.objc]]version = "0.2.7"criteria = "safe-to-deploy"[[exemptions.objc-foundation]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.objc-sys]]version = "0.3.5"criteria = "safe-to-deploy"[[exemptions.objc2]]version = "0.4.1"criteria = "safe-to-deploy"[[exemptions.objc2]]version = "0.5.2"criteria = "safe-to-deploy"[[exemptions.objc2-app-kit]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc2-core-data]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc2-core-image]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc2-encode]]version = "3.0.0"criteria = "safe-to-deploy"[[exemptions.objc2-encode]]version = "4.0.3"criteria = "safe-to-deploy"[[exemptions.objc2-foundation]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc2-metal]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc2-quartz-core]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.objc_exception]]version = "0.1.2"criteria = "safe-to-deploy"[[exemptions.objc_id]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.object]]version = "0.36.3"criteria = "safe-to-deploy"[[exemptions.once_cell]]version = "1.19.0"criteria = "safe-to-deploy"[[exemptions.openssl]]version = "0.10.66"criteria = "safe-to-deploy"[[exemptions.openssl-sys]]version = "0.9.103"criteria = "safe-to-deploy"[[exemptions.orbclient]]version = "0.3.47"criteria = "safe-to-deploy"[[exemptions.ordered-stream]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.owned_ttf_parser]]version = "0.24.0"criteria = "safe-to-deploy"[[exemptions.palette]]version = "0.7.6"criteria = "safe-to-deploy"[[exemptions.palette_derive]]version = "0.7.6"criteria = "safe-to-deploy"[[exemptions.parking]]version = "2.2.0"criteria = "safe-to-deploy"[[exemptions.pathfinder_geometry]]version = "0.5.1"criteria = "safe-to-deploy"[[exemptions.pathfinder_simd]]version = "0.5.4"criteria = "safe-to-deploy"[[exemptions.pin-project]]version = "1.1.5"criteria = "safe-to-deploy"[[exemptions.pin-project-internal]]version = "1.1.5"criteria = "safe-to-deploy"[[exemptions.piper]]version = "0.2.4"criteria = "safe-to-deploy"[[exemptions.plotters]]version = "0.3.6"criteria = "safe-to-deploy"[[exemptions.plotters-backend]]version = "0.3.6"criteria = "safe-to-deploy"[[exemptions.plotters-bitmap]]version = "0.3.6"criteria = "safe-to-deploy"[[exemptions.plotters-iced]]version = "0.10.0"criteria = "safe-to-deploy"[[exemptions.plotters-svg]]version = "0.3.6"criteria = "safe-to-deploy"[[exemptions.polling]]version = "2.8.0"criteria = "safe-to-deploy"[[exemptions.polling]]version = "3.7.3"criteria = "safe-to-deploy"[[exemptions.pollster]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.ppv-lite86]]version = "0.2.20"criteria = "safe-to-deploy"[[exemptions.proc-macro-crate]]version = "3.1.0"criteria = "safe-to-deploy"[[exemptions.proc-macro-error]]version = "1.0.4"criteria = "safe-to-deploy"[[exemptions.profiling]]version = "1.0.15"criteria = "safe-to-deploy"[[exemptions.ptr_meta]]version = "0.1.4"criteria = "safe-to-deploy"[[exemptions.ptr_meta_derive]]version = "0.1.4"criteria = "safe-to-deploy"[[exemptions.quick-xml]]version = "0.34.0"criteria = "safe-to-deploy"[[exemptions.radium]]version = "0.7.0"criteria = "safe-to-deploy"[[exemptions.rand]]version = "0.8.5"criteria = "safe-to-deploy"[[exemptions.rangemap]]version = "1.5.1"criteria = "safe-to-deploy"[[exemptions.raw-window-handle]]version = "0.6.2"criteria = "safe-to-deploy"[[exemptions.redox_syscall]]version = "0.2.16"criteria = "safe-to-deploy"[[exemptions.redox_syscall]]version = "0.4.1"criteria = "safe-to-deploy"[[exemptions.redox_syscall]]version = "0.5.3"criteria = "safe-to-deploy"[[exemptions.redox_users]]version = "0.4.5"criteria = "safe-to-deploy"[[exemptions.rend]]version = "0.4.2"criteria = "safe-to-deploy"[[exemptions.renderdoc-sys]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.rfd]]version = "0.14.1"criteria = "safe-to-deploy"[[exemptions.ring]]version = "0.17.8"criteria = "safe-to-deploy"[[exemptions.rkyv]]version = "0.7.44"criteria = "safe-to-deploy"[[exemptions.rkyv_derive]]version = "0.7.44"criteria = "safe-to-deploy"[[exemptions.ron]]version = "0.8.1"criteria = "safe-to-deploy"[[exemptions.roxmltree]]version = "0.20.0"criteria = "safe-to-deploy"[[exemptions.rust_decimal]]version = "1.35.0"criteria = "safe-to-deploy"[[exemptions.rust_decimal_macros]]version = "1.35.0"criteria = "safe-to-deploy"[[exemptions.rustls]]version = "0.23.12"criteria = "safe-to-deploy"[[exemptions.rustls-pemfile]]version = "2.1.3"criteria = "safe-to-deploy"[[exemptions.rustls-pki-types]]version = "1.8.0"criteria = "safe-to-deploy"[[exemptions.rustls-webpki]]version = "0.102.6"criteria = "safe-to-deploy"[[exemptions.rustybuzz]]version = "0.11.0"criteria = "safe-to-deploy"[[exemptions.schannel]]version = "0.1.23"criteria = "safe-to-deploy"[[exemptions.sctk-adwaita]]version = "0.8.3"criteria = "safe-to-deploy"[[exemptions.seahash]]version = "4.1.0"criteria = "safe-to-deploy"[[exemptions.security-framework]]version = "2.11.1"criteria = "safe-to-deploy"[[exemptions.security-framework-sys]]version = "2.11.1"criteria = "safe-to-deploy"[[exemptions.self_cell]]version = "1.0.4"criteria = "safe-to-deploy"[[exemptions.serde_urlencoded]]version = "0.7.1"criteria = "safe-to-deploy"[[exemptions.sha1]]version = "0.10.6"criteria = "safe-to-deploy"[[exemptions.shlex]]version = "1.3.0"criteria = "safe-to-deploy"[[exemptions.signal-hook-registry]]version = "1.4.2"criteria = "safe-to-deploy"[[exemptions.simdutf8]]version = "0.1.4"criteria = "safe-to-deploy"[[exemptions.siphasher]]version = "0.3.11"criteria = "safe-to-deploy"[[exemptions.slotmap]]version = "1.0.7"criteria = "safe-to-deploy"[[exemptions.smithay-client-toolkit]]version = "0.18.1"criteria = "safe-to-deploy"[[exemptions.smithay-client-toolkit]]version = "0.19.2"criteria = "safe-to-deploy"[[exemptions.smithay-clipboard]]version = "0.7.2"criteria = "safe-to-deploy"[[exemptions.smol_str]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.socket2]]version = "0.4.10"criteria = "safe-to-deploy"[[exemptions.socket2]]version = "0.5.7"criteria = "safe-to-deploy"[[exemptions.softbuffer]]version = "0.4.5"criteria = "safe-to-deploy"[[exemptions.spin]]version = "0.9.8"criteria = "safe-to-deploy"[[exemptions.spirv]]version = "0.3.0+sdk-1.3.268.0"criteria = "safe-to-deploy"[[exemptions.strict-num]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.string_cache]]version = "0.8.7"criteria = "safe-to-deploy"[[exemptions.string_cache_codegen]]version = "0.5.2"criteria = "safe-to-deploy"[[exemptions.strsim]]version = "0.11.1"criteria = "safe-to-deploy"[[exemptions.svg_fmt]]version = "0.4.3"criteria = "safe-to-deploy"[[exemptions.swash]]version = "0.1.18"criteria = "safe-to-deploy"[[exemptions.syn_derive]]version = "0.1.8"criteria = "safe-to-deploy"[[exemptions.sync_wrapper]]version = "1.0.1"criteria = "safe-to-deploy"[[exemptions.sys-locale]]version = "0.3.1"criteria = "safe-to-deploy"[[exemptions.system-configuration]]version = "0.5.1"criteria = "safe-to-deploy"[[exemptions.system-configuration-sys]]version = "0.5.0"criteria = "safe-to-deploy"[[exemptions.tempfile]]version = "3.12.0"criteria = "safe-to-deploy"[[exemptions.tendril]]version = "0.4.3"criteria = "safe-to-deploy"[[exemptions.thousands]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.tiny-skia]]version = "0.11.4"criteria = "safe-to-deploy"[[exemptions.tiny-skia-path]]version = "0.11.4"criteria = "safe-to-deploy"[[exemptions.tiny-xlib]]version = "0.2.3"criteria = "safe-to-deploy"[[exemptions.tokio-rustls]]version = "0.26.0"criteria = "safe-to-deploy"[[exemptions.tower]]version = "0.4.13"criteria = "safe-to-deploy"[[exemptions.tower-layer]]version = "0.3.3"criteria = "safe-to-deploy"[[exemptions.tower-service]]version = "0.3.3"criteria = "safe-to-deploy"[[exemptions.tracing]]version = "0.1.40"criteria = "safe-to-deploy"[[exemptions.tracing-attributes]]version = "0.1.27"criteria = "safe-to-deploy"[[exemptions.tracing-core]]version = "0.1.32"criteria = "safe-to-deploy"[[exemptions.ttf-parser]]version = "0.19.2"criteria = "safe-to-deploy"[[exemptions.ttf-parser]]version = "0.20.0"criteria = "safe-to-deploy"[[exemptions.ttf-parser]]version = "0.24.1"criteria = "safe-to-deploy"[[exemptions.typenum]]version = "1.17.0"criteria = "safe-to-deploy"[[exemptions.uds_windows]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.unicode-bidi-mirroring]]version = "0.1.0"criteria = "safe-to-deploy"[[exemptions.unicode-ccc]]version = "0.1.2"criteria = "safe-to-deploy"[[exemptions.unicode-properties]]version = "0.1.1"criteria = "safe-to-deploy"[[exemptions.unicode-script]]version = "0.5.6"criteria = "safe-to-deploy"[[exemptions.unicode-width]]version = "0.1.13"criteria = "safe-to-deploy"[[exemptions.untrusted]]version = "0.9.0"criteria = "safe-to-deploy"[[exemptions.url]]version = "2.5.2"criteria = "safe-to-deploy"[[exemptions.urlencoding]]version = "2.1.3"criteria = "safe-to-deploy"[[exemptions.utf-8]]version = "0.7.6"criteria = "safe-to-deploy"[[exemptions.utf8parse]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.uuid]]version = "1.10.0"criteria = "safe-to-deploy"[[exemptions.value-bag]]version = "1.9.0"criteria = "safe-to-deploy"[[exemptions.version_check]]version = "0.9.5"criteria = "safe-to-deploy"[[exemptions.waker-fn]]version = "1.2.0"criteria = "safe-to-deploy"[[exemptions.wasm-timer]]version = "0.2.5"criteria = "safe-to-deploy"[[exemptions.wayland-backend]]version = "0.3.6"criteria = "safe-to-deploy"[[exemptions.wayland-client]]version = "0.31.5"criteria = "safe-to-deploy"[[exemptions.wayland-csd-frame]]version = "0.3.0"criteria = "safe-to-deploy"[[exemptions.wayland-cursor]]version = "0.31.5"criteria = "safe-to-deploy"[[exemptions.wayland-protocols]]version = "0.31.2"criteria = "safe-to-deploy"[[exemptions.wayland-protocols]]version = "0.32.3"criteria = "safe-to-deploy"[[exemptions.wayland-protocols-plasma]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.wayland-protocols-wlr]]version = "0.2.0"criteria = "safe-to-deploy"[[exemptions.wayland-protocols-wlr]]version = "0.3.3"criteria = "safe-to-deploy"[[exemptions.wayland-scanner]]version = "0.31.4"criteria = "safe-to-deploy"[[exemptions.wayland-sys]]version = "0.31.4"criteria = "safe-to-deploy"[[exemptions.web-time]]version = "0.2.4"criteria = "safe-to-deploy"[[exemptions.weezl]]version = "0.1.8"criteria = "safe-to-deploy"[[exemptions.wgpu]]version = "0.19.4"criteria = "safe-to-deploy"[[exemptions.wgpu-core]]version = "0.19.4"criteria = "safe-to-deploy"[[exemptions.wgpu-hal]]version = "0.19.5"criteria = "safe-to-deploy"[[exemptions.widestring]]version = "1.1.0"criteria = "safe-to-deploy"[[exemptions.winapi]]version = "0.3.9"criteria = "safe-to-deploy"[[exemptions.winapi-i686-pc-windows-gnu]]version = "0.4.0"criteria = "safe-to-deploy"[[exemptions.winapi-x86_64-pc-windows-gnu]]version = "0.4.0"criteria = "safe-to-deploy"[[exemptions.window_clipboard]]version = "0.4.1"criteria = "safe-to-deploy"[[exemptions.winit]]version = "0.29.15"criteria = "safe-to-deploy"[[exemptions.winreg]]version = "0.52.0"criteria = "safe-to-deploy"[[exemptions.wio]]version = "0.2.2"criteria = "safe-to-deploy"[[exemptions.wyz]]version = "0.5.1"criteria = "safe-to-deploy"[[exemptions.x11-dl]]version = "2.21.0"criteria = "safe-to-deploy"[[exemptions.x11rb]]version = "0.13.1"criteria = "safe-to-deploy"[[exemptions.x11rb-protocol]]version = "0.13.1"criteria = "safe-to-deploy"[[exemptions.xcursor]]version = "0.3.8"criteria = "safe-to-deploy"[[exemptions.xdg-home]]version = "1.3.0"criteria = "safe-to-deploy"[[exemptions.xkbcommon-dl]]version = "0.4.2"criteria = "safe-to-deploy"[[exemptions.xkeysym]]version = "0.2.1"criteria = "safe-to-deploy"[[exemptions.xml-rs]]version = "0.8.21"criteria = "safe-to-deploy"[[exemptions.xml5ever]]version = "0.18.1"criteria = "safe-to-deploy"[[exemptions.xxhash-rust]]version = "0.8.12"criteria = "safe-to-deploy"[[exemptions.yazi]]version = "0.1.6"criteria = "safe-to-deploy"[[exemptions.yeslogic-fontconfig-sys]]version = "5.0.0"criteria = "safe-to-deploy"[[exemptions.zbus]]version = "4.4.0"criteria = "safe-to-deploy"[[exemptions.zbus_macros]]version = "4.4.0"criteria = "safe-to-deploy"[[exemptions.zbus_names]]version = "3.0.0"criteria = "safe-to-deploy"[[exemptions.zeno]]version = "0.2.3"criteria = "safe-to-deploy"[[exemptions.zerocopy]]version = "0.7.35"criteria = "safe-to-deploy"[[exemptions.zerocopy-derive]]version = "0.7.35"criteria = "safe-to-deploy"[[exemptions.zeroize]]version = "1.8.1"criteria = "safe-to-deploy"[[exemptions.zvariant]]version = "4.2.0"criteria = "safe-to-deploy"[[exemptions.zvariant_derive]]version = "4.2.0"criteria = "safe-to-deploy"[[exemptions.zvariant_utils]]version = "2.1.0"criteria = "safe-to-deploy"
# cargo-vet audits file[audits][[trusted.aho-corasick]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-03-28"end = "2025-08-22"[[trusted.anstream]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-03-16"end = "2025-08-22"[[trusted.anstyle]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2022-05-18"end = "2025-08-22"[[trusted.anstyle-parse]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-03-08"end = "2025-08-22"[[trusted.anstyle-query]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-04-13"end = "2025-08-22"[[trusted.anstyle-wincon]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-03-08"end = "2025-08-22"[[trusted.anyhow]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-10-05"end = "2025-08-22"[[trusted.async-std]]criteria = "safe-to-deploy"user-id = 4333 # Josh Triplett (joshtriplett)start = "2022-06-18"end = "2025-08-22"[[trusted.async-trait]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-07-23"end = "2025-08-22"[[trusted.backtrace]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2023-06-29"end = "2025-08-22"[[trusted.by_address]]criteria = "safe-to-deploy"user-id = 2017 # Matt Brubeck (mbrubeck)start = "2019-04-22"end = "2025-08-22"[[trusted.byteorder]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-06-09"end = "2025-08-22"[[trusted.bytes]]criteria = "safe-to-deploy"user-id = 6741 # Alice Ryhl (Darksonn)start = "2021-01-11"end = "2025-08-22"[[trusted.cc]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2024-02-20"end = "2025-08-22"[[trusted.clap]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2021-12-08"end = "2025-08-22"[[trusted.clap_derive]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2021-12-08"end = "2025-08-22"[[trusted.clap_lex]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2022-04-15"end = "2025-08-22"[[trusted.colorchoice]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-04-13"end = "2025-08-22"[[trusted.csv]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-04-05"end = "2025-08-22"[[trusted.csv-core]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-06-26"end = "2025-08-22"[[trusted.h2]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-03-13"end = "2025-08-22"[[trusted.hashbrown]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2019-04-02"end = "2025-08-22"[[trusted.http]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-04-05"end = "2025-08-22"[[trusted.http-body-util]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2022-10-25"end = "2025-08-22"[[trusted.httparse]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-07-03"end = "2025-08-22"[[trusted.hyper]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-03-01"end = "2025-08-22"[[trusted.hyper-tls]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-03-19"end = "2025-08-22"[[trusted.hyper-util]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2022-01-15"end = "2025-08-22"[[trusted.indexmap]]criteria = "safe-to-deploy"user-id = 539 # Josh Stone (cuviper)start = "2020-01-15"end = "2025-08-22"[[trusted.io-lifetimes]]criteria = "safe-to-deploy"user-id = 6825 # Dan Gohman (sunfishcode)start = "2021-06-12"end = "2025-08-22"[[trusted.is_terminal_polyfill]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2024-05-02"end = "2025-08-22"[[trusted.jobserver]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-15"end = "2025-08-22"[[trusted.js-sys]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.libc]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2020-03-17"end = "2025-08-22"[[trusted.libm]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2022-02-06"end = "2025-08-22"[[trusted.linux-raw-sys]]criteria = "safe-to-deploy"user-id = 6825 # Dan Gohman (sunfishcode)start = "2021-06-12"end = "2025-08-22"[[trusted.lock_api]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2019-05-04"end = "2025-08-22"[[trusted.memchr]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-07-07"end = "2025-08-22"[[trusted.mime]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-09-09"end = "2025-08-22"[[trusted.mio]]criteria = "safe-to-deploy"user-id = 10start = "2019-05-15"end = "2025-08-22"[[trusted.new_debug_unreachable]]criteria = "safe-to-deploy"user-id = 2017 # Matt Brubeck (mbrubeck)start = "2019-02-26"end = "2025-08-22"[[trusted.num_cpus]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-06-10"end = "2025-08-22"[[trusted.parking_lot]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2019-05-04"end = "2025-08-22"[[trusted.parking_lot_core]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2019-05-04"end = "2025-08-22"[[trusted.paste]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-03-19"end = "2025-08-22"[[trusted.phf]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2021-06-17"end = "2025-08-22"[[trusted.phf_codegen]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2021-06-17"end = "2025-08-22"[[trusted.phf_generator]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2021-06-17"end = "2025-08-22"[[trusted.phf_macros]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2021-06-17"end = "2025-08-22"[[trusted.phf_shared]]criteria = "safe-to-deploy"user-id = 51017 # Yuki Okushi (JohnTitor)start = "2021-06-17"end = "2025-08-22"[[trusted.regex]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-02-27"end = "2025-08-22"[[trusted.regex-automata]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-02-25"end = "2025-08-22"[[trusted.regex-syntax]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-03-30"end = "2025-08-22"[[trusted.reqwest]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-03-04"end = "2025-08-22"[[trusted.rustix]]criteria = "safe-to-deploy"user-id = 6825 # Dan Gohman (sunfishcode)start = "2021-10-29"end = "2025-08-22"[[trusted.ryu]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-05-02"end = "2025-08-22"[[trusted.same-file]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-07-16"end = "2025-08-22"[[trusted.scoped-tls]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-02-26"end = "2025-08-22"[[trusted.scopeguard]]criteria = "safe-to-deploy"user-id = 2915 # Amanieu d'Antras (Amanieu)start = "2020-02-16"end = "2025-08-22"[[trusted.serde]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-03-01"end = "2025-08-22"[[trusted.serde_derive]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-03-01"end = "2025-08-22"[[trusted.serde_json]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-02-28"end = "2025-08-22"[[trusted.serde_repr]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-04-26"end = "2025-08-22"[[trusted.slab]]criteria = "safe-to-deploy"user-id = 6741 # Alice Ryhl (Darksonn)start = "2021-10-13"end = "2025-08-22"[[trusted.smallvec]]criteria = "safe-to-deploy"user-id = 2017 # Matt Brubeck (mbrubeck)start = "2019-10-28"end = "2025-08-22"[[trusted.socket2]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-05-06"end = "2025-08-22"[[trusted.syn]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-03-01"end = "2025-08-22"[[trusted.termcolor]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-06-04"end = "2025-08-22"[[trusted.thiserror]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-10-09"end = "2025-08-22"[[trusted.thiserror-impl]]criteria = "safe-to-deploy"user-id = 3618 # David Tolnay (dtolnay)start = "2019-10-09"end = "2025-08-22"[[trusted.tokio]]criteria = "safe-to-deploy"user-id = 6741 # Alice Ryhl (Darksonn)start = "2020-12-25"end = "2025-08-22"[[trusted.tokio-util]]criteria = "safe-to-deploy"user-id = 6741 # Alice Ryhl (Darksonn)start = "2021-01-12"end = "2025-08-22"[[trusted.toml_datetime]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2022-10-21"end = "2025-08-22"[[trusted.toml_edit]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2021-09-13"end = "2025-08-22"[[trusted.tower]]criteria = "safe-to-deploy"user-id = 10start = "2019-04-27"end = "2025-08-22"[[trusted.tower-layer]]criteria = "safe-to-deploy"user-id = 10start = "2019-04-27"end = "2025-08-22"[[trusted.try-lock]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2020-07-10"end = "2025-08-22"[[trusted.unicode-width]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-08-19"end = "2025-08-22"[[trusted.walkdir]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2019-06-09"end = "2025-08-22"[[trusted.want]]criteria = "safe-to-deploy"user-id = 359 # Sean McArthur (seanmonstar)start = "2019-03-19"end = "2025-08-22"[[trusted.wasi]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2020-06-03"end = "2025-08-22"[[trusted.wasm-bindgen]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.wasm-bindgen-backend]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.wasm-bindgen-futures]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.wasm-bindgen-macro]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.wasm-bindgen-macro-support]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.wasm-bindgen-shared]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.web-sys]]criteria = "safe-to-deploy"user-id = 1 # Alex Crichton (alexcrichton)start = "2019-03-04"end = "2025-08-22"[[trusted.winapi-util]]criteria = "safe-to-deploy"user-id = 189 # Andrew Gallant (BurntSushi)start = "2020-01-11"end = "2025-08-22"[[trusted.windows]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-01-15"end = "2025-08-22"[[trusted.windows-core]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-11-15"end = "2025-08-22"[[trusted.windows-sys]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-11-15"end = "2025-08-22"[[trusted.windows-targets]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2022-09-09"end = "2025-08-22"[[trusted.windows_aarch64_gnullvm]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2022-09-01"end = "2025-08-22"[[trusted.windows_aarch64_msvc]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-11-05"end = "2025-08-22"[[trusted.windows_i686_gnu]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-10-28"end = "2025-08-22"[[trusted.windows_i686_gnullvm]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2024-04-02"end = "2025-08-22"[[trusted.windows_i686_msvc]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-10-27"end = "2025-08-22"[[trusted.windows_x86_64_gnu]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-10-28"end = "2025-08-22"[[trusted.windows_x86_64_gnullvm]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2022-09-01"end = "2025-08-22"[[trusted.windows_x86_64_msvc]]criteria = "safe-to-deploy"user-id = 64539 # Kenny Kerr (kennykerr)start = "2021-10-27"end = "2025-08-22"[[trusted.winnow]]criteria = "safe-to-deploy"user-id = 6743 # Ed Page (epage)start = "2023-02-22"end = "2025-08-22"
/// The financial-accounts application.pub mod app;
use std::io::Write;use clap::{CommandFactory, Parser};use financial_accounts::app::{App, command_line::Args};use iced::window;use image::ImageFormat;const MONEY: &[u8] = include_bytes!("financial-accounts_256x256.png");fn main() -> anyhow::Result<()> {let args = Args::parse();if args.man {let mut buffer: Vec<u8> = Vec::default();let cmd = Args::command().name("financial-accounts").long_version(None);let man = clap_mangen::Man::new(cmd).date("2025-12-30");man.render(&mut buffer)?;write!(buffer, "{COPYRIGHT}")?;std::fs::write("financial-accounts.1", buffer)?;return Ok(());}iced::application(App::default, App::update, App::view).title("Financial Accounts").window(window::Settings {icon: Some(iced::window::icon::from_file_data(MONEY,Some(ImageFormat::Png),)?),..window::Settings::default()}).theme(App::theme).run()?;Ok(())}pub const COPYRIGHT: &str = r#".SH COPYRIGHTCopyright (c) 2023-2025 David Lawrence CampbellThe MIT License:Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice (including the nextparagraph) shall be included in all copies or substantial portions of theSoftware.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.ORThe Apache-2.0 license:Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License."#;
use std::fmt;use reqwest::Client;use rust_decimal::Decimal;use serde::{Deserialize, Serialize};use yahoo_finance_api::YahooConnector;use super::account::transactions::Price;#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)]pub struct StockPlus {// currency: USDpub description: String,pub symbol: String,}impl Price for StockPlus {async fn get_price(&self, _client: &Client) -> anyhow::Result<Decimal> {let provider = YahooConnector::new()?;let response = provider.get_latest_quotes(&self.symbol, "1d").await?;let quote = response.last_quote()?;Ok(quote.close)}}impl fmt::Display for StockPlus {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {write!(f, "{} in United States Dollar", self.description)}}
/*SOLARIZED HEX 16/8 TERMCOL XTERM/HEX L*A*B RGB HSB--------- ------- ---- ------- ----------- ---------- ----------- -----------base03 #002b36 8/4 brblack 234 #1c1c1c 15 -12 -12 0 43 54 193 100 21base02 #073642 0/4 black 235 #262626 20 -12 -12 7 54 66 192 90 26base01 #586e75 10/7 brgreen 240 #585858 45 -07 -07 88 110 117 194 25 46base00 #657b83 11/7 bryellow 241 #626262 50 -07 -07 101 123 131 195 23 51base0 #839496 12/6 brblue 244 #808080 60 -06 -03 131 148 150 186 13 59base1 #93a1a1 14/4 brcyan 245 #8a8a8a 65 -05 -02 147 161 161 180 9 63base2 #eee8d5 7/7 white 254 #e4e4e4 92 -00 10 238 232 213 44 11 93base3 #fdf6e3 15/7 brwhite 230 #ffffd7 97 00 10 253 246 227 44 10 99yellow #b58900 3/3 yellow 136 #af8700 60 10 65 181 137 0 45 100 71orange #cb4b16 9/3 brred 166 #d75f00 50 50 55 203 75 22 18 89 80red #dc322f 1/1 red 160 #d70000 50 65 45 220 50 47 1 79 86magenta #d33682 5/5 magenta 125 #af005f 50 65 -05 211 54 130 331 74 83violet #6c71c4 13/5 brmagenta 61 #5f5faf 50 15 -45 108 113 196 237 45 77blue #268bd2 4/4 blue 33 #0087ff 55 -10 -45 38 139 210 205 82 82cyan #2aa198 6/6 cyan 37 #00afaf 60 -35 -05 42 161 152 175 74 63green #859900 2/2 green 64 #5f8700 60 -20 65 133 153 0 68 100 60*/use iced::Color;#[must_use]pub fn base03() -> Color {Color::from_rgb8(0, 43, 54)}#[must_use]pub fn base02() -> Color {Color::from_rgb8(7, 54, 66)}#[must_use]pub fn base01() -> Color {Color::from_rgb8(88, 110, 117)}#[must_use]pub fn base00() -> Color {Color::from_rgb8(101, 123, 131)}#[must_use]pub fn base0() -> Color {Color::from_rgb8(131, 148, 150)}#[must_use]pub fn base1() -> Color {Color::from_rgb8(147, 161, 161)}#[must_use]pub fn base2() -> Color {Color::from_rgb8(238, 232, 213)}#[must_use]pub fn base3() -> Color {Color::from_rgb8(253, 246, 227)}#[must_use]pub fn yellow() -> Color {Color::from_rgb8(181, 137, 0)}#[must_use]pub fn orange() -> Color {Color::from_rgb8(203, 75, 22)}#[must_use]pub fn red() -> Color {Color::from_rgb8(220, 50, 47)}#[must_use]pub fn magenta() -> Color {Color::from_rgb8(211, 54, 130)}#[must_use]pub fn violet() -> Color {Color::from_rgb8(108, 113, 196)}#[must_use]pub fn blue() -> Color {Color::from_rgb8(38, 139, 210)}#[must_use]pub fn cyan() -> Color {Color::from_rgb8(42, 161, 152)}#[must_use]pub fn green() -> Color {Color::from_rgb8(133, 153, 0)}pub mod plot {use plotters::style::RGBAColor;#[must_use]pub const fn base03() -> RGBAColor {RGBAColor(0, 43, 54, 1.0)}#[must_use]pub const fn base02() -> RGBAColor {RGBAColor(7, 54, 66, 1.0)}#[must_use]pub const fn base01() -> RGBAColor {RGBAColor(88, 110, 117, 1.0)}#[must_use]pub const fn base00() -> RGBAColor {RGBAColor(101, 123, 131, 1.0)}#[must_use]pub const fn base0() -> RGBAColor {RGBAColor(131, 148, 150, 1.0)}#[must_use]pub const fn base1() -> RGBAColor {RGBAColor(147, 161, 161, 1.0)}#[must_use]pub const fn base2() -> RGBAColor {RGBAColor(238, 232, 213, 1.0)}#[must_use]pub const fn base3() -> RGBAColor {RGBAColor(253, 246, 227, 1.0)}#[must_use]pub const fn yellow() -> RGBAColor {RGBAColor(181, 137, 0, 1.0)}#[must_use]pub const fn orange() -> RGBAColor {RGBAColor(203, 75, 22, 1.0)}#[must_use]pub const fn red() -> RGBAColor {RGBAColor(220, 50, 47, 1.0)}#[must_use]pub const fn magenta() -> RGBAColor {RGBAColor(211, 54, 130, 1.0)}#[must_use]pub const fn violet() -> RGBAColor {RGBAColor(108, 113, 196, 1.0)}#[must_use]pub const fn blue() -> RGBAColor {RGBAColor(38, 139, 210, 1.0)}#[must_use]pub const fn cyan() -> RGBAColor {RGBAColor(42, 161, 152, 1.0)}#[must_use]pub const fn green() -> RGBAColor {RGBAColor(133, 153, 0, 1.0)}}
#[derive(Clone, Debug, Default)]pub enum Screen {#[default]Accounts,Account(usize),AccountSecondary(usize),Configuration,}
use std::fmt;use serde::{Deserialize, Serialize};use super::{crypto::Crypto, metal::Metal, stocks::StockPlus};#[derive(Debug, Clone, Deserialize, Eq, PartialEq, Serialize)]pub enum Currency {Crypto(Crypto),Fiat(Fiat),Metal(Metal),StockPlus(StockPlus),}impl fmt::Display for Currency {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {match self {Self::Crypto(crypto) => write!(f, "Crypto: {crypto}"),Self::Fiat(fiat) => write!(f, "{fiat}"),Self::Metal(metal) => write!(f, "Metal: {metal}"),Self::StockPlus(stock_plus) => write!(f, "Stock Plus: {stock_plus}"),}}}// Supported by https://www.goldapi.io/ .#[derive(Debug, Clone, Deserialize, Hash, PartialEq, Eq, Serialize)]pub enum Fiat {Usd,Aud,Gbp,Eur,Cad,Chf,Jpy,Krw,Inr,Cny,Zar,Thb,Sgd,Hkd,// Btc, // Bitcoin - clearly not a fiat currency.Czk,Pln,Myr,Rub,Aed,Kwd,Egp,Omr,Sar,Mxn,Jod,}impl Fiat {pub fn all() -> Vec<Self> {vec![Fiat::Usd,Fiat::Aud,Fiat::Gbp,Fiat::Eur,Fiat::Cad,Fiat::Chf,Fiat::Jpy,Fiat::Krw,Fiat::Inr,Fiat::Cny,Fiat::Zar,Fiat::Thb,Fiat::Sgd,Fiat::Hkd,Fiat::Czk,Fiat::Pln,Fiat::Myr,Fiat::Rub,Fiat::Aed,Fiat::Kwd,Fiat::Egp,Fiat::Omr,Fiat::Sar,Fiat::Mxn,Fiat::Jod,]}pub fn all_minus_existing(existing: &Vec<Self>) -> Vec<Self> {let fiats = Self::all();let mut fiats_new = Vec::new();'next: for fiat_1 in fiats {for fiat_2 in existing {if fiat_1 == *fiat_2 {continue 'next;}}fiats_new.push(fiat_1);}fiats_new}pub fn symbol(&self) -> String {match self {Self::Usd => "USD".to_string(),Self::Aud => "AUD".to_string(),Self::Gbp => "GBP".to_string(),Self::Eur => "EUR".to_string(),Self::Cad => "CAD".to_string(),Self::Chf => "CHF".to_string(),Self::Jpy => "JPY".to_string(),Self::Krw => "KRW".to_string(),Self::Inr => "INR".to_string(),Self::Cny => "CNY".to_string(),Self::Zar => "ZAR".to_string(),Self::Thb => "THB".to_string(),Self::Sgd => "SGD".to_string(),Self::Hkd => "HKD".to_string(),Self::Czk => "CZK".to_string(),Self::Pln => "PLN".to_string(),Self::Myr => "MYR".to_string(),Self::Rub => "RUB".to_string(),Self::Aed => "AED".to_string(),Self::Kwd => "KWD".to_string(),Self::Egp => "EGP".to_string(),Self::Omr => "OMR".to_string(),Self::Sar => "SAR".to_string(),Self::Mxn => "MXN".to_string(),Self::Jod => "JOD".to_string(),}}}impl fmt::Display for Fiat {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {match self {Self::Usd => write!(f, "United States Dollar"),Self::Aud => write!(f, "Australian Dollar"),Self::Gbp => write!(f, "British Pound"),Self::Eur => write!(f, "European Euro"),Self::Cad => write!(f, "Canadian Dollar"),Self::Chf => write!(f, "Swiss Franc"),Self::Jpy => write!(f, "Japanese Yen"),Self::Krw => write!(f, "South Korean Won"),Self::Inr => write!(f, "Indian Rupee"),Self::Cny => write!(f, "Chinese/Yuan Renminbi"),Self::Zar => write!(f, "South African Rand"),Self::Thb => write!(f, "Thai Baht"),Self::Sgd => write!(f, "Singapore Dollar"),Self::Hkd => write!(f, "Hong Kong Dollar"),Self::Czk => write!(f, "Czech Krona"),Self::Pln => write!(f, "Polish Złoty"),Self::Myr => write!(f, "Malaysian Ringgit"),Self::Rub => write!(f, "Russian Ruble"),Self::Aed => write!(f, "U.A.E. Dirham"),Self::Kwd => write!(f, "Kuwaiti Dinar"),Self::Egp => write!(f, "Egyptian Pound"),Self::Omr => write!(f, "Omani Rial"),Self::Sar => write!(f, "Saudi Rial"),Self::Mxn => write!(f, "Mexican Peso"),Self::Jod => write!(f, "Jordanian Dinar"),}}}
mod account;mod accounts;mod chart;pub mod command_line;mod crypto;mod import_boa;mod message;mod metal;mod money;mod screen;pub mod solarized;mod stocks;use std::{cmp::Ordering, fs, mem::take, path::PathBuf, str::FromStr, sync::Arc};use account::{transaction::Transaction, transactions::Transactions};use accounts::Group;use anyhow::Context;use chart::Chart;use chrono::Utc;use crypto::Crypto;use iced::{Alignment, Element, Length, Pixels, Task, Theme,widget::{self, Button, Checkbox, Column, ProgressBar, Row, Scrollable, button, column,combo_box::{ComboBox, State},row,text::IntoFragment,text_input,},};use metal::Metal;use money::{Currency, Fiat};use plotters_iced2::ChartWidget;use rust_decimal::Decimal;use rust_decimal_macros::dec;use serde::Deserialize;use stocks::StockPlus;use thousands::Separable;use crate::app::{account::Account, accounts::Accounts, message::Message, screen::Screen};const BOA_URL: &str = "https://secure.bankofamerica.com/myaccounts/brain/redirect.go?target=portfolio&portfolio_page=transactions&request_locale=en-us&source=overview&fsd=y";const INVESTOR_360_URL: &str = "https://my.investor360.com/nce/Holdings";const TITLE_FILE_PICKER: &str = "Financial Accounts";const LAST_DATE_SCALE: u32 = 4;const EDGE_PADDING: usize = 4;const PADDING: u16 = 1;const CHECKBOX_SPACING: f32 = 12.5;const COLUMN_SPACING: f32 = 0.3;const ROW_SPACING: Pixels = Pixels(5.0);const TEXT_SIZE: Pixels = Pixels(24.0);/// The financial-accounts application.#[derive(Debug)]pub struct App {accounts: Accounts,file: Option<File>,account_name: String,crypto_currency: Option<Fiat>,crypto_currency_selector: State<Fiat>,crypto_description: String,crypto_symbol: String,fiat: Option<Fiat>,fiat_selector: State<Fiat>,metal_currency: Option<Fiat>,metal_currency_selector: State<Fiat>,metal_description: String,metal_symbol: String,progress_bar: Option<f32>,stock_plus_description: String,stock_plus_symbol: String,currency: Option<Currency>,currency_selector: State<Currency>,duration: Duration,project_months: Option<u16>,screen: Screen,errors: Option<Arc<Vec<anyhow::Error>>>,}impl App {fn add_crypto(&mut self) {if let Some(fiat) = &self.crypto_currency {self.accounts.crypto.push(Crypto {currency: fiat.clone(),description: self.crypto_description.clone(),symbol: self.crypto_symbol.clone(),});self.currency_selector = State::new(self.accounts.get_currencies());self.save();}}fn add_fiat(&mut self) {if let Some(fiat) = &self.fiat {self.accounts.fiats.push(fiat.clone());self.fiat_selector = State::new(Fiat::all_minus_existing(&self.accounts.fiats));self.currency_selector = State::new(self.accounts.get_currencies());self.save();}}fn add_group(&mut self) {let members = (0..).zip(self.accounts.inner.iter()).filter_map(|(index, account)| {if account.check_box { Some(index) } else { None }},).collect();let group = Group {name: self.account_name.clone(),members,};self.accounts.groups.push(group);self.save();}fn add_metal(&mut self) {if let Some(fiat) = &self.metal_currency {self.accounts.metals.push(Metal {currency: fiat.clone(),description: self.metal_description.clone(),symbol: self.metal_symbol.clone(),});self.currency_selector = State::new(self.accounts.get_currencies());self.save();}}fn add_stock_plus(&mut self) {self.accounts.stocks_plus.push(StockPlus {description: self.stock_plus_description.clone(),symbol: self.stock_plus_symbol.clone(),});self.currency_selector = State::new(self.accounts.get_currencies());self.save();}fn config(&self) -> Scrollable<'_, Message> {let mut crypto_current = Column::new();for crypto in &self.accounts.crypto {let crypto = format!("{crypto:?}");crypto_current = crypto_current.push(text_cell(crypto));}let add_crypto = row![button_cell(button("Add Crypto").on_press(Message::AddCrypto)),ComboBox::new(&self.crypto_currency_selector,"fiats",self.crypto_currency.as_ref(),|fiat| { Message::UpdateCryptoCurrency(fiat) }),text_cell("Description:"),text_input("Description", &self.crypto_description).on_input(Message::UpdateCryptoDescription).on_paste(Message::UpdateCryptoDescription),text_cell("Symbol:"),text_input("Symbol", &self.crypto_symbol).on_input(Message::UpdateCryptoSymbol).on_paste(Message::UpdateCryptoSymbol)];let mut fiats_current = Column::new();for fiat in &self.accounts.fiats {fiats_current = fiats_current.push(text_cell(fiat.to_string()));}let add_fiat = row![button_cell(button("Add Fiat").on_press(Message::AddFiat)),ComboBox::new(&self.fiat_selector, "fiats", self.fiat.as_ref(), |fiat| {Message::UpdateFiat(fiat)}),];let mut metals_current = Column::new();for metal in &self.accounts.metals {let metal = format!("{metal:?}");metals_current = metals_current.push(text_cell(metal));}let add_metal = row![button_cell(button("Add Metal").on_press(Message::AddMetal)),ComboBox::new(&self.metal_currency_selector,"fiats",self.metal_currency.as_ref(),|fiat| { Message::UpdateMetalCurrency(fiat) }),text_cell("Description:"),text_input("Description", &self.metal_description).on_input(Message::UpdateMetalDescription).on_paste(Message::UpdateMetalDescription),text_cell("Symbol:"),text_input("Symbol", &self.metal_symbol).on_input(Message::UpdateMetalSymbol).on_paste(Message::UpdateMetalSymbol),];let mut stock_plus_current = Column::new();for stock_plus in &self.accounts.stocks_plus {let stock_plus = format!("{stock_plus:?}");stock_plus_current = stock_plus_current.push(text_cell(stock_plus));}let add_stock_plus = row![button_cell(button("Add Stock Plus").on_press(Message::AddStockPlus)),text_cell("Description:"),text_input("Description", &self.stock_plus_description).on_input(Message::UpdateStockPlusDescription).on_paste(Message::UpdateStockPlusDescription),text_cell("Symbol:"),text_input("Symbol", &self.stock_plus_symbol).on_input(Message::UpdateStockPlusSymbol).on_paste(Message::UpdateStockPlusSymbol),];let mut column_errors = Column::new();if let Some(errors) = &self.errors {for error in errors.iter() {column_errors = column_errors.push(text_cell_red(error.to_string()));}}let cols = column![crypto_current,add_crypto,fiats_current,add_fiat,metals_current,add_metal,stock_plus_current,add_stock_plus,column_errors,button_cell(button("Back").on_press(Message::Back)),];Scrollable::new(cols)}fn display_error(&mut self, error: anyhow::Error) {match self.errors {Some(ref mut errors) => {let errors = Arc::get_mut(errors).unwrap();errors.push(error);}None => self.errors = Some(Arc::new(vec![error])),}}fn load_file(&mut self) {let result = rfd::FileDialog::new().set_title(TITLE_FILE_PICKER).add_filter("ron", &["ron"]).pick_file().context("You must choose a file name for your configuration file.");match result {Ok(file_path) => match Accounts::load(take(&mut self.file), file_path) {Ok((accounts, file)) => {self.accounts = accounts;self.file = Some(file);}Err(error) => self.display_error(error),},Err(error) => self.display_error(error),}}fn open_url(&mut self, url: &str) {if let Err(error) = webbrowser::open(url) {self.display_error(error.into());}}fn save_file(&mut self) {let result = rfd::FileDialog::new().set_title(TITLE_FILE_PICKER).add_filter("ron", &["ron"]).save_file().context("You must choose a file name for your configuration file.");match result {Ok(file_path) => match self.accounts.save_dialogue(take(&mut self.file), file_path) {Ok(file) => self.file = Some(file),Err(error) => self.display_error(error),},Err(error) => self.display_error(error),}}fn save(&mut self) {match self.accounts.save(take(&mut self.file)) {Ok(file) => self.file = Some(file),Err(error) => self.display_error(error),}}fn new(accounts: Accounts, file: Option<File>) -> Self {let currencies = accounts.get_currencies();Self {fiat_selector: State::new(Fiat::all_minus_existing(&accounts.fiats)),accounts,file,account_name: String::new(),crypto_currency: None,crypto_currency_selector: State::new(Fiat::all()),crypto_description: String::new(),crypto_symbol: String::new(),fiat: None,metal_currency: None,metal_currency_selector: State::new(Fiat::all()),metal_description: String::new(),metal_symbol: String::new(),progress_bar: None,stock_plus_description: String::new(),stock_plus_symbol: String::new(),currency: None,currency_selector: State::new(currencies),duration: Duration::default(),project_months: None,screen: Screen::Accounts,errors: None,}}fn change_project_months(&mut self, months: &str) {if months.is_empty() {self.project_months = None;} else if let Ok(months) = months.parse() {self.project_months = Some(months);}}fn check_account_name(&mut self, name: &str) -> anyhow::Result<()> {for account in &self.accounts.inner {if name == account.name {return Err(anyhow::Error::msg("Duplicate name!"));}}Ok(())}fn delete(&mut self, i: usize) {match self.screen {Screen::Accounts => {self.accounts.inner.remove(i);for group in &mut self.accounts.groups {group.remove(i);}}Screen::Account(j) => {self.accounts[j].txs_1st.txs.remove(i);}Screen::AccountSecondary(j) => {self.accounts[j].txs_2nd.as_mut().unwrap().txs.remove(i);}Screen::Configuration => panic!("Nothing to delete!"),}self.save();}fn delete_group(&mut self, i: usize) {self.accounts.groups.remove(i);self.save();}fn import_investor_360(&mut self, file_xls: &PathBuf) -> anyhow::Result<()> {let file_csv = file_xls.file_stem().unwrap();let mut file_csv = PathBuf::from_str(file_csv.to_str().unwrap())?;file_csv.set_extension("csv");if fs::exists(&file_csv)? {return Err(anyhow::Error::msg(format!("\"{}\" already exists!",&file_csv.display())));}std::process::Command::new("libreoffice").arg("--convert-to").arg("csv").arg(file_xls).status().context(r#"Couldn't execute "libreoffice --convert-to csv", you must install libreoffice."#,)?;for investor_360_record in csv::Reader::from_path(&file_csv)?.deserialize() {let investor_360_record: Investor360 = investor_360_record?;// Skip some junk records.if investor_360_record.symbol.is_empty() {continue;}let balance = investor_360_record.quantity.unwrap();let mut tx = Transaction {amount: dec!(0),balance,comment: investor_360_record.description.clone(),date: Utc::now(),};let name = format!("Investor 360: {}", &investor_360_record.symbol);let mut name_matches = false;for account in &mut self.accounts.inner {if account.name == name {if investor_360_record.price.unwrap() == dec!(1) {tx.amount = balance - account.txs_1st.txs.last().unwrap().balance;account.txs_1st.txs.push(tx.clone());} else {tx.amount = balance- account.txs_2nd.as_ref().unwrap().txs.last().unwrap().balance;account.txs_2nd.as_mut().unwrap().txs.push(tx.clone());}name_matches = true;break;}}if !name_matches {tx.amount = balance;let txs = vec![tx];if investor_360_record.price.unwrap() == dec!(1) {let currency = Fiat::Usd;let transactions = Transactions {currency: currency.clone(),txs,};let mut account = Account::new(name, Currency::Fiat(currency));account.txs_1st = transactions;self.accounts.inner.push(account);} else {let stock = StockPlus {description: investor_360_record.description,symbol: investor_360_record.symbol,};let currency = Currency::StockPlus(stock);let transactions = Transactions {currency: currency.clone(),txs,};let mut account = Account::new(name, currency);account.txs_2nd = Some(transactions);self.accounts.inner.push(account);}}}fs::remove_file(&file_csv)?;Ok(())}#[rustfmt::skip]fn display_groups(&self) -> GroupColumnDisplay<'_> {let mut a_ = column![text_cell(""), text_cell("Group")];let mut b_ = column![text_cell(""), text_cell("")].align_x(Alignment::End);let mut c_ = column![text_cell(""), text_cell("")].align_x(Alignment::End);let mut d_ = column![text_cell(""), text_cell("")].align_x(Alignment::End);let mut e_ = column![text_cell(""), text_cell("")].align_x(Alignment::End);let mut f_ = column![text_cell(""), text_cell("")];for (index, group) in self.accounts.groups.iter().enumerate() {a_ = a_.push(text_cell(&group.name));let mut sum_before_last_week = dec!(0);let mut sum_last_week = dec!(0);let mut sum_before_last_month = dec!(0);let mut sum_last_month = dec!(0);let mut sum_before_last_year = dec!(0);let mut sum_last_year = dec!(0);let mut balance = dec!(0);for index in &group.members {let (before_last_week, last_week) = self.accounts.inner[*index].sum_last_week();let (before_last_month, last_month) = self.accounts.inner[*index].sum_last_month();let (before_last_year, last_year) = self.accounts.inner[*index].sum_last_year();sum_before_last_week += before_last_week;sum_last_week += last_week;sum_before_last_month += before_last_month;sum_last_month += last_month;sum_before_last_year += before_last_year;sum_last_year += last_year;balance += self.accounts.inner[*index].balance_1st();}sum_last_week = div_0_ok(sum_last_week, sum_before_last_week);sum_last_month = div_0_ok(sum_last_month, sum_before_last_month);sum_last_year = div_0_ok(sum_last_year, sum_before_last_year);sum_last_week.rescale(LAST_DATE_SCALE);sum_last_month.rescale(LAST_DATE_SCALE);sum_last_year.rescale(LAST_DATE_SCALE);balance.rescale(2);b_ = b_.push(number_cell(sum_last_week));c_ = c_.push(number_cell(sum_last_month));d_ = d_.push(number_cell(sum_last_year));e_ = e_.push(number_cell(balance));f_ = f_.push(button_cell(button("Delete").on_press(Message::DeleteGroup(index))));}GroupColumnDisplay { a: a_, b: b_, c: c_, d: d_, e: e_, f: f_}}fn display_totals(&self, currency: &Fiat) -> TotalsColumnDisplay<'_> {let (before_last_week, mut last_week) = self.accounts.total_for_last_week(currency);let (before_last_month, mut last_month) = self.accounts.total_for_last_month(currency);let (before_last_year, mut last_year) = self.accounts.total_for_last_year(currency);let mut balance = self.accounts.balance(currency);last_week = div_0_ok(last_week, before_last_week);last_month = div_0_ok(last_month, before_last_month);last_year = div_0_ok(last_year, before_last_year);last_week.rescale(LAST_DATE_SCALE);last_month.rescale(LAST_DATE_SCALE);last_year.rescale(LAST_DATE_SCALE);balance.rescale(2);let a_ = column![text_cell(format!("{currency} Total:"))];let b_ = column![number_cell(last_week)];let c_ = column![number_cell(last_month)];let d_ = column![number_cell(last_year)];let e_ = column![number_cell(balance)];let f_ = column![text_cell("")];TotalsColumnDisplay {a: a_,b: b_,c: c_,d: d_,e: e_,f: f_,}}#[rustfmt::skip]fn rows(&self) -> Row<'_, Message> {let mut col_0 = column![text_cell(" Account "), text_cell("")];let mut col_1 = column![button_cell(button("Week").on_press(Message::ChartWeek)), text_cell("")].align_x(Alignment::End);let mut col_2 = column![button_cell(button("Month").on_press(Message::ChartMonth)), text_cell("")].align_x(Alignment::End);let mut col_3 = column![button_cell(button("Year").on_press(Message::ChartYear)), text_cell("")].align_x(Alignment::End);let mut col_4 = column![button_cell(button("Balance").on_press(Message::ChartAll)), text_cell("")].align_x(Alignment::End);let mut col_5 = column![text_cell("Price"), text_cell("")].align_x(Alignment::End);let mut col_6 = column![text_cell("Quantity"), text_cell("")].align_x(Alignment::End);let mut col_7 = column![Checkbox::new(false), Checkbox::new(false)].spacing(CHECKBOX_SPACING);let mut col_8 = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);let mut col_9 = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);let mut col_a = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);let mut col_b = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);let mut col_c = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);let mut col_d = column![text_cell(""), text_cell("")].spacing(COLUMN_SPACING);for (i, account) in self.accounts.inner.iter().enumerate() {let (before_last_week, mut last_week) = account.sum_last_week();let (before_last_month, mut last_month) = account.sum_last_month();let (before_last_year, mut last_year) = account.sum_last_year();let mut value = account.balance_1st();let mut quantity = text_cell("");let mut price = text_cell("");if let Some(mut quantity_) = account.balance_2nd() {let mut price_ = value / quantity_;quantity_.rescale(8);price_.rescale(2);quantity = number_cell(quantity_);price = number_cell(price_);}last_week = div_0_ok(last_week, before_last_week);last_month = div_0_ok(last_month, before_last_month);last_year = div_0_ok(last_year, before_last_year);last_week.rescale(LAST_DATE_SCALE);last_month.rescale(LAST_DATE_SCALE);last_year.rescale(LAST_DATE_SCALE);value.rescale(2);col_0 = col_0.push(text_cell(&account.name));col_1 = col_1.push(number_cell(last_week));col_2 = col_2.push(number_cell(last_month));col_3 = col_3.push(number_cell(last_year));col_4 = col_4.push(number_cell(value));col_5 = col_5.push(price);col_6 = col_6.push(quantity);col_7 = col_7.push(Checkbox::new(self.accounts[i].check_box).on_toggle(move |b| Message::Checkbox((i, b))));col_8 = col_8.push(button_cell(button("Tx").on_press(Message::SelectAccount(i))));let mut txs_2nd = button("Tx 2nd");if let Some(account) = &account.txs_2nd&& account.has_txs_2nd() {txs_2nd = txs_2nd.on_press(Message::SelectAccountSecondary(i));}col_9 = col_9.push(button_cell(txs_2nd));let mut update_name = button("Update Name");if !self.account_name.is_empty() {update_name = update_name.on_press(Message::UpdateAccountName(i));}col_a = col_a.push(button_cell(update_name));let mut import_boa = button("Import BoA");if account.txs_2nd.is_none() {import_boa = import_boa.on_press(Message::ImportBoa(i));}col_b = col_b.push(button_cell(import_boa));let mut get_price = button("Get Price");if account.txs_2nd.is_some() {get_price = get_price.on_press(Message::GetPrice(i));}col_c = col_c.push(button_cell(get_price));col_d = col_d.push(button_cell(button("Delete").on_press(Message::Delete(i))));}for currency in self.accounts.currencies() {let totals_display = self.display_totals(¤cy);col_0 = col_0.push(totals_display.a);col_1 = col_1.push(totals_display.b);col_2 = col_2.push(totals_display.c);col_3 = col_3.push(totals_display.d);col_4 = col_4.push(totals_display.e);col_d = col_d.push(totals_display.f);}let group_display = self.display_groups();col_0 = col_0.push(group_display.a);col_1 = col_1.push(group_display.b);col_2 = col_2.push(group_display.c);col_3 = col_3.push(group_display.d);col_4 = col_4.push(group_display.e);col_d = col_d.push(group_display.f);row![col_0, col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_a, col_b, col_c, col_d]}#[rustfmt::skip]fn list_accounts(&self) -> Scrollable<'_, Message> {let mut charts = Column::new();for currency in self.accounts.currencies() {let chart = Chart {txs: self.accounts.all_accounts_txs_1st(currency),duration: self.duration.clone(),};let chart = ChartWidget::new(chart).height(Length::Fixed(400.0));charts = charts.push(chart);}let rows = self.rows();let mut column_errors = Column::new();if let Some(errors) = &self.errors {for error in errors.iter() {column_errors = column_errors.push(text_cell_red(error.to_string()));}}let name = text_input("Name", &self.account_name).on_input(Message::ChangeAccountName).on_paste(Message::ChangeAccountName);let currency = ComboBox::new(&self.currency_selector, "Currency", self.currency.as_ref(), Message::UpdateCurrency);let mut add = button("Add");if !self.account_name.is_empty() && self.currency.is_some() {add = add.on_press(Message::SubmitAccount);}let mut add_group = button("Add Group");if !self.account_name.is_empty() {add_group = add_group.on_press(Message::AddGroup);}let mut all_prices = row![button_cell(button("Get All Prices").on_press(Message::GetPriceAll))];if let Some(progress) = self.progress_bar {all_prices = all_prices.push(ProgressBar::<Theme>::new(0.0..=100.0, progress));}all_prices = all_prices.push(widget::text(" ".repeat(EDGE_PADDING)));let cols = column![charts,rows.spacing(ROW_SPACING),column_errors,text_cell(""),row![widget::text("Account").size(TEXT_SIZE),name,currency,add,add_group,widget::text(" ".repeat(EDGE_PADDING)),].padding(PADDING).spacing(ROW_SPACING),all_prices,row![button_cell(button("Open BoA URL").on_press(Message::OpenBoaUrl)),button_cell(button("Open Investor 360 URL").on_press(Message::OpenInvestor360Url)),button_cell(button("Import Investor 360").on_press(Message::ImportInvestor360)),].padding(PADDING),row![button_cell(button("Exit").on_press(Message::Exit)),button_cell(button("Load").on_press(Message::FileLoad)),button_cell(button("Save As").on_press(Message::FileSaveAs)),button_cell(button("Configuration").on_press(Message::Configuration)),]];Scrollable::new(cols)}fn select_account(&mut self, message: account::Message) {if let Some(account) = match self.screen {Screen::Accounts | Screen::Configuration => None,Screen::Account(account) | Screen::AccountSecondary(account) => Some(account),} && self.accounts[account].update(&self.screen, message){self.save();}}fn insert_new_account(&mut self, new_account: Account) {if self.accounts.inner.is_empty() {self.accounts.inner.push(new_account);return;}for (i, account) in self.accounts.inner.iter().enumerate() {if account.name > new_account.name {self.accounts.inner.insert(i, new_account);for group in &mut self.accounts.groups {for index in &mut group.members {if *index > i {*index += 1;}}}return;}}self.accounts.inner.push(new_account);}fn remove_account(&mut self, index: usize) -> Account {for group in &mut self.accounts.groups {group.members.remove(index);}self.accounts.inner.remove(index)}fn submit_account(&mut self) {let name = self.account_name.trim().to_string();if let Err(error) = self.check_account_name(&name) {self.display_error(error);return;}let new_account = Account::new(name, self.currency.clone().unwrap());self.insert_new_account(new_account);self.save();}pub fn theme(&self) -> Theme {Theme::SolarizedDark}fn update_account_name(&mut self, i: usize) {let name = self.account_name.trim().to_string();if let Err(error) = self.check_account_name(&name) {self.display_error(error);return;}let mut account = self.remove_account(i);account.name = self.account_name.trim().to_string();// add the new groupself.insert_new_account(account);self.save();}pub fn update(&mut self, message: Message) -> Task<Message> {self.errors = None;match message {Message::AddCrypto => self.add_crypto(),Message::AddFiat => self.add_fiat(),Message::AddGroup => self.add_group(),Message::AddMetal => self.add_metal(),Message::AddStockPlus => self.add_stock_plus(),Message::Account(message) => self.select_account(message),Message::Back => self.screen = Screen::Accounts,Message::ChangeAccountName(name) => self.account_name = name,Message::ChangeProjectMonths(months) => self.change_project_months(&months),Message::ChartWeek => self.duration = Duration::Week,Message::ChartMonth => self.duration = Duration::Month,Message::ChartYear => self.duration = Duration::Year,Message::ChartAll => self.duration = Duration::All,Message::Checkbox((i, b)) => self.accounts[i].check_box = b,Message::Configuration => self.screen = Screen::Configuration,Message::Delete(i) => self.delete(i),Message::DeleteGroup(i) => self.delete_group(i),Message::FileLoad => self.load_file(),Message::FileSaveAs => self.save_file(),Message::GetPrice(i) => {let account = &mut self.accounts[i];match futures::executor::block_on(account.submit_price_as_transaction()) {Ok(tx) => {account.txs_1st.txs.push(tx);account.txs_1st.sort();self.save();}Err(error) => {self.display_error(error);}}}Message::GetPriceAll => {let errors = futures::executor::block_on(self.accounts.get_all_prices());if !errors.is_empty() {self.errors = Some(Arc::new(errors));}self.save();}Message::ImportBoa(i) => {let account = &mut self.accounts[i];if let Some(file_path) = rfd::FileDialog::new().set_title(TITLE_FILE_PICKER).add_filter("csv", &["csv"]).pick_file(){if let Err(error) = account.import_boa(file_path) {self.display_error(error);} else {self.save();}self.screen = Screen::Accounts;}}Message::ImportInvestor360 => {if let Some(file_path) = rfd::FileDialog::new().set_title(TITLE_FILE_PICKER).add_filter("xls", &["xls"]).pick_file(){if let Err(error) = self.import_investor_360(&file_path) {self.display_error(error);} else {self.accounts.sort();self.save();}}}Message::OpenBoaUrl => self.open_url(BOA_URL),Message::OpenInvestor360Url => self.open_url(INVESTOR_360_URL),Message::UpdateAccountName(i) => self.update_account_name(i),Message::UpdateCurrency(currency) => self.currency = Some(currency),Message::UpdateCryptoCurrency(fiat) => self.crypto_currency = Some(fiat),Message::UpdateCryptoDescription(description) => self.crypto_description = description,Message::UpdateCryptoSymbol(symbol) => self.crypto_symbol = symbol,Message::UpdateFiat(fiat) => self.fiat = Some(fiat),Message::UpdateMetalCurrency(fiat) => self.metal_currency = Some(fiat),Message::UpdateMetalDescription(description) => self.metal_description = description,Message::UpdateMetalSymbol(symbol) => self.metal_symbol = symbol,Message::UpdateStockPlusDescription(description) => {self.stock_plus_description = description;}Message::UpdateStockPlusSymbol(symbol) => self.stock_plus_symbol = symbol,Message::SelectAccount(i) => self.screen = Screen::Account(i),Message::SelectAccountSecondary(i) => self.screen = Screen::AccountSecondary(i),Message::SubmitAccount => self.submit_account(),Message::Exit => {return iced::exit();}}Task::none()}pub fn view(&self) -> Element<'_, Message> {match self.screen {Screen::Accounts => self.list_accounts().into(),Screen::Account(i) => self.accounts[i].list_transactions().into(),Screen::AccountSecondary(i) => self.accounts[i].list_transactions_2nd().into(),Screen::Configuration => self.config().into(),}}}impl Default for App {fn default() -> Self {match command_line::get_configuration_file() {command_line::File::Load(file_path) => {let file_path_ = file_path.clone();let (accounts, file) = Accounts::load(None, file_path).unwrap_or_else(|err| {panic!("error loading {}: {}", &file_path_.display(), err)});Self::new(accounts, Some(file))}command_line::File::New(file_path) => {let accounts = Accounts::new();let file_path_ = file_path.clone();let file = accounts.save_first(file_path).unwrap_or_else(|error| {panic!("error creating {}: {}", &file_path_.display(), error)});Self::new(accounts, Some(file))}command_line::File::None => Self::new(Accounts::new(), None),}}}struct GroupColumnDisplay<'a> {a: Column<'a, Message>,b: Column<'a, Message>,c: Column<'a, Message>,d: Column<'a, Message>,e: Column<'a, Message>,f: Column<'a, Message>,}struct TotalsColumnDisplay<'a> {a: Column<'a, Message>,b: Column<'a, Message>,c: Column<'a, Message>,d: Column<'a, Message>,e: Column<'a, Message>,f: Column<'a, Message>,}fn div_0_ok(dividend: Decimal, divisor: Decimal) -> Decimal {if divisor.is_zero() {dec!(0)} else {dividend / divisor}}fn some_or_empty<T: ToString>(value: Option<&T>) -> String {value.map_or_else(String::new, ToString::to_string)}fn set_amount(amount: &mut Option<Decimal>, string: &str) {if string.is_empty() {*amount = None;} else if let Ok(amount_) = string.parse() {*amount = Some(amount_);}}fn button_cell(button: Button<Message>) -> Row<Message> {row![button].padding(PADDING)}fn number_cell<'a>(num: Decimal) -> Row<'a, Message> {let text = match num.cmp(&dec!(0)) {Ordering::Greater => widget::text(num.separate_with_commas()).color(solarized::green()),Ordering::Less => widget::text(num.separate_with_commas()).color(solarized::red()),Ordering::Equal => widget::text(num.separate_with_commas()),};row![text.size(TEXT_SIZE)].padding(PADDING)}fn text_cell<'a>(s: impl ToString + IntoFragment<'a>) -> Row<'a, Message> {row![widget::text(s).size(TEXT_SIZE)].padding(PADDING)}fn text_cell_red<'a>(s: impl ToString + IntoFragment<'a>) -> Row<'a, Message> {row![widget::text(s).color(solarized::red()).size(TEXT_SIZE)].padding(PADDING)}#[derive(Clone, Debug, Default)]enum Duration {Week,Month,Year,#[default]All,}#[derive(Debug)]struct File {path: PathBuf,inner: fs::File,}#[derive(Debug, Deserialize)]struct Investor360 {#[serde(rename = "Description")]description: String,#[serde(rename = "Symbol")]symbol: String,#[serde(rename = "Quantity")]quantity: Option<Decimal>,#[serde(rename = "Price ($)")]price: Option<Decimal>,#[serde(rename = "Value ($)")]_value: Option<Decimal>,#[serde(rename = "Assets (%)")]_assets: Option<Decimal>,}
use std::{fmt::{self, Display},fs,};use anyhow::Context;use chrono::{DateTime, Utc, serde::ts_seconds};use dirs::config_local_dir;use reqwest::Client;use reqwest::Url;use rust_decimal::Decimal;use serde::{Deserialize, Serialize};use super::{Fiat, account::transactions::Price};const LOCATION_ACCESS_TOKEN: &str = "goldapi.io.txt";#[derive(Debug, Clone, Deserialize, PartialEq, Eq, Serialize)]pub struct Metal {pub currency: Fiat,pub description: String,pub symbol: String,}impl fmt::Display for Metal {fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {write!(f, "{} in {}", self.description, self.currency)}}impl Price for Metal {async fn get_price(&self, client: &Client) -> anyhow::Result<Decimal> {let mut access_token = String::new();if let Some(dir) = config_local_dir() {let path = dir.join(LOCATION_ACCESS_TOKEN);let error_msg = format!("{} doesn't exist", path.display());access_token = fs::read_to_string(&path).context(error_msg)?;} else {Err(anyhow::Error::msg("config local cannot be found"))?;}let access_token = access_token.trim();let url = Url::parse(&format!("https://www.goldapi.io/api/{}/{}",self.symbol,self.currency.symbol()))?;let response = client.get(url).header("x-access-token", access_token).send().await?;let string = response.text().await?;// let string = _TESTING_RESPONSE;let metals: Prices = serde_json::from_str(&string)?;Ok(metals.price)}}const _TESTING_RESPONSE: &str = r#"{"timestamp":1719978277,"metal":"XAU","currency":"USD","exchange":"FOREXCOM","symbol":"FOREXCOM:XAUUSD","prev_close_price":2329.645,"open_price":2329.645,"low_price":2326.925,"high_price":2332.235,"open_time":1719964800,"price":2330.825,"ch":1.18,"chp":0.05,"ask":2331.14,"bid":2330.52,"price_gram_24k":74.9378,"price_gram_22k":68.693,"price_gram_21k":65.5705,"price_gram_20k":62.4481,"price_gram_18k":56.2033,"price_gram_16k":49.9585,"price_gram_14k":43.7137,"price_gram_10k":31.2241}"#;#[derive(Clone, Debug, Serialize, Deserialize)]pub struct Prices {#[serde(with = "ts_seconds")]pub timestamp: DateTime<Utc>,pub metal: String,pub currency: String,pub exchange: String,pub symbol: String,pub prev_close_price: Decimal,pub open_price: Decimal,pub low_price: Decimal,pub high_price: Decimal,#[serde(with = "ts_seconds")]pub open_time: DateTime<Utc>,pub price: Decimal,pub ch: Decimal,pub chp: Decimal,pub ask: Decimal,pub bid: Decimal,pub price_gram_24k: Decimal,pub price_gram_22k: Decimal,pub price_gram_21k: Decimal,pub price_gram_20k: Decimal,pub price_gram_18k: Decimal,pub price_gram_16k: Decimal,pub price_gram_14k: Decimal,pub price_gram_10k: Decimal,}impl Display for Prices {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {writeln!(f, "timestamp: {}", self.timestamp)?;writeln!(f, "metal: {}", self.metal)?;writeln!(f, "currency: {}", self.currency)?;writeln!(f, "exchange: {}", self.exchange)?;writeln!(f, "symbol: {}", self.symbol)?;writeln!(f, "prev_close_price: {}", self.prev_close_price)?;writeln!(f, "open_price: {}", self.open_price)?;writeln!(f, "low_price: {}", self.low_price)?;writeln!(f, "high_price: {}", self.high_price)?;writeln!(f, "open_time: {}", self.open_time)?;writeln!(f, "price: {}", self.price)?;writeln!(f, "ch: {}", self.ch)?;writeln!(f, "chp: {}", self.chp)?;writeln!(f, "ask: {}", self.ask)?;writeln!(f, "bid: {}", self.bid)?;writeln!(f, "price_per_gram_24k: {}", self.price_gram_24k)?;writeln!(f, "price_per_gram_22k: {}", self.price_gram_22k)?;writeln!(f, "price_per_gram_21k: {}", self.price_gram_21k)?;writeln!(f, "price_per_gram_20k: {}", self.price_gram_20k)?;writeln!(f, "price_per_gram_18k: {}", self.price_gram_18k)?;writeln!(f, "price_per_gram_16k: {}", self.price_gram_16k)?;writeln!(f, "price_per_gram_14k: {}", self.price_gram_14k)?;writeln!(f, "price_per_gram_10k: {}", self.price_gram_10k)}}
use super::{account,money::{Currency, Fiat},};#[derive(Clone, Debug)]pub enum Message {AddCrypto,AddFiat,AddGroup,AddMetal,AddStockPlus,Account(account::Message),Back,ChartWeek,ChartMonth,ChartYear,ChartAll,ChangeAccountName(String),ChangeProjectMonths(String),Checkbox((usize, bool)),Configuration,Delete(usize),DeleteGroup(usize),FileLoad,FileSaveAs,GetPrice(usize),GetPriceAll,ImportBoa(usize),ImportInvestor360,OpenBoaUrl,OpenInvestor360Url,UpdateAccountName(usize),UpdateCurrency(Currency),UpdateCryptoCurrency(Fiat),UpdateCryptoDescription(String),UpdateCryptoSymbol(String),UpdateFiat(Fiat),UpdateMetalCurrency(Fiat),UpdateMetalDescription(String),UpdateMetalSymbol(String),UpdateStockPlusDescription(String),UpdateStockPlusSymbol(String),SelectAccount(usize),SelectAccountSecondary(usize),SubmitAccount,Exit,}
use std::path::PathBuf;use chrono::NaiveDateTime;use regex::Regex;use rust_decimal::Decimal;use rust_decimal_macros::dec;use serde::Deserialize;use super::{account::{transaction::Transaction, transactions::Transactions},money::Fiat,};#[derive(Debug, Deserialize)]struct BoaRecord {#[serde(rename = "Status")]_status: String,#[serde(rename = "Date")]date: String,#[serde(rename = "Original Description")]original_description: String,#[serde(rename = "Split Type")]_split_type: String,#[serde(rename = "Category")]_category: String,#[serde(rename = "Currency")]_currency: String,#[serde(rename = "Amount")]amount: String,#[serde(rename = "User Description")]_user_description: String,#[serde(rename = "Memo")]_memo: String,#[serde(rename = "Classification")]_classification: String,#[serde(rename = "Account Name")]account_name: String,#[serde(rename = "Simple Description")]_simple_description: String,}pub fn import_boa(file_path: PathBuf) -> anyhow::Result<Transactions<Fiat>> {let mut records = Vec::new();let name_formal = Regex::new(r" - .+ - .+")?;let white_space = Regex::new(r"\s+")?;for boa_record in csv::Reader::from_path(file_path)?.deserialize() {let mut boa_record: BoaRecord = boa_record?;// We don't get the time of day, so can't tell what day it really is in UTC.boa_record.date.push_str(" 00:00:00");let name = Regex::replace(&name_formal, &boa_record.account_name, "").into_owned();let description =Regex::replace_all(&white_space, &boa_record.original_description, " ").into_owned();let comment = format!("{name}: {description}");let record = Transaction {amount: boa_record.amount.replace(',', "").parse::<Decimal>()?,balance: dec!(0),comment,date: NaiveDateTime::parse_from_str(&boa_record.date, "%m/%d/%Y %H:%M:%S")?.and_utc(),};records.push(record);}let mut txs = Transactions::new(Fiat::Usd);txs.txs = records;Ok(txs)}
use std::{error::Error, fmt::Display, str::FromStr};use chrono::{DateTime, Utc};use reqwest::Client;use reqwest::Url;use rust_decimal::Decimal;use serde::Deserialize;use serde::Serialize;use serde_json::Value;use super::account::transactions::Price;use super::money::Fiat;const URL_KRAKEN_OHLC: &str = "https://api.kraken.com/0/public/OHLC";#[derive(Clone, Debug)]pub struct Ohlc {pub name: String,pub date_time: DateTime<Utc>,pub open: Decimal,pub high: Decimal,pub low: Decimal,pub close: Decimal,pub volume_weighted_average_price: Decimal,pub volume: Decimal,pub count: i64,}impl Ohlc {pub fn from_value(value: &Value) -> anyhow::Result<Self> {let mut errors = Vec::new();for error in value["error"].as_array().unwrap() {errors.push(error.as_str().unwrap().to_string());}if !errors.is_empty() {return Err(CryptoErrors { errors })?;}let mut result = &value["result"];let name = result.as_object().unwrap().keys().next().unwrap().clone();result = &result[&name][0];Ok(Self {date_time: DateTime::from_timestamp(result[0].as_i64().unwrap(), 0).unwrap(),open: Decimal::from_str(result[1].as_str().unwrap()).unwrap(),high: Decimal::from_str(result[2].as_str().unwrap()).unwrap(),low: Decimal::from_str(result[3].as_str().unwrap()).unwrap(),close: Decimal::from_str(result[4].as_str().unwrap()).unwrap(),volume_weighted_average_price: Decimal::from_str(result[5].as_str().unwrap()).unwrap(),volume: Decimal::from_str(result[6].as_str().unwrap()).unwrap(),count: result[7].as_i64().unwrap(),name,})}}impl Display for Ohlc {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {writeln!(f, "name: {}", self.name)?;writeln!(f, "date_time: {}", self.date_time)?;writeln!(f, "open: {}", self.open)?;writeln!(f, "high: {}", self.high)?;writeln!(f, "low: {}", self.low)?;writeln!(f, "close: {}", self.close)?;writeln!(f,"volume_weighted_average_price: {}",self.volume_weighted_average_price)?;writeln!(f, "volume: {}", self.volume)?;writeln!(f, "count: {}", self.count)}}#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]pub struct Crypto {pub currency: Fiat,pub description: String,pub symbol: String,}impl Price for Crypto {async fn get_price(&self, client: &Client) -> anyhow::Result<Decimal> {let pair = format!("{}{}", self.symbol, self.currency.symbol());let url = Url::parse_with_params(URL_KRAKEN_OHLC,&[("pair", pair.as_str()),// A day.("interval", "1440"),("since", &Utc::now().timestamp().to_string()),],)?;let response = client.get(url).send().await?;let string = response.text().await?;let value: Value = serde_json::from_str(&string)?;let crypto = Ohlc::from_value(&value)?;Ok(crypto.close)}}impl Display for Crypto {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {write!(f, "{} in {}", self.description, self.currency)}}#[derive(Debug)]struct CryptoErrors {errors: Vec<String>,}impl Display for CryptoErrors {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {writeln!(f, "{:#?}", self.errors)}}impl Error for CryptoErrors {}
use std::path::PathBuf;use clap::Parser;#[derive(Parser, Debug)]#[command(version, about)]pub struct Args {/// Load FILE#[arg(long, value_name = "FILE", exclusive = true)]pub load: Option<String>,/// Create a new FILE#[arg(long, value_name = "FILE", exclusive = true)]pub new: Option<String>,/// Build the manpage#[arg(long)]pub man: bool,}#[derive(Debug)]pub enum File {Load(PathBuf),New(PathBuf),None,}#[must_use]pub fn get_configuration_file() -> File {let args = Args::parse();if let Some(arg) = args.load {File::Load(PathBuf::from(arg))} else if let Some(arg) = args.new {File::New(PathBuf::from(arg))} else {File::None}}
use std::fmt::Display;use plotters::{series::AreaSeries,style::{Color, FontTransform, IntoFont, ShapeStyle, TextStyle},};use rust_decimal::prelude::ToPrimitive;use crate::app::message::Message;use super::{Duration, account::transactions::Transactions, solarized};pub struct Chart<T: Clone + Display> {pub txs: Transactions<T>,pub duration: Duration,}impl<T: Clone + Display> plotters_iced2::Chart<Message> for Chart<T> {type State = ();fn build_chart<DB: plotters::prelude::DrawingBackend>(&self,_state: &Self::State,mut chart: plotters::prelude::ChartBuilder<DB>,) {let txs = match self.duration {Duration::Week => self.txs.last_week(),Duration::Month => self.txs.last_month(),Duration::Year => self.txs.last_year(),Duration::All => self.txs.clone(),};if let (Some(Some(min_balance)), Some(Some(max_balance)), Some(min_date), Some(max_date)) = (txs.min_balance().map(|min| min.to_f32()),txs.max_balance().map(|max| max.to_f32()),txs.min_date(),txs.max_date(),) {let mut chart = chart.caption(format!("Total in {}", self.txs.currency),TextStyle::from(("sans-serif", 20).into_font()),).x_label_area_size(28).y_label_area_size(28).margin_top(20).margin_bottom(30).margin_left(60).margin_right(60).build_cartesian_2d(min_date..max_date, min_balance..max_balance).expect("failed to build chart");chart.configure_mesh().bold_line_style(solarized::plot::base0()).light_line_style(solarized::plot::base1().mix(0.25)).axis_style(ShapeStyle::from(solarized::plot::base0()).stroke_width(1)).x_labels(10).x_label_style(("sans-serif", 15).into_font().color(&solarized::plot::base0()),).x_label_formatter(&|y| y.format("%Y-%m-%d %Z").to_string()).y_labels(10).y_label_style(("sans-serif", 15).into_font().color(&solarized::plot::base0()).transform(FontTransform::Rotate90),).y_label_formatter(&thousands::Separable::separate_with_underscores).draw().expect("failed to draw chart mesh");chart.draw_series(AreaSeries::new(txs.txs.iter().map(|tx| (tx.date, tx.balance.to_f32().unwrap())),0.0,solarized::plot::blue(),).border_style(ShapeStyle::from(solarized::plot::blue()).stroke_width(2)),).expect("failed to draw chart data");}}}
use anyhow::Context;use ron::ser::PrettyConfig;use rust_decimal::Decimal;use rust_decimal_macros::dec;use serde::{Deserialize, Serialize};use std::collections::HashSet;use std::fs::{self, OpenOptions};use std::io::{Read, Write};use std::ops::{Index, IndexMut};use std::path::PathBuf;use crate::app::account::Account;use super::File;use super::account::transactions::Transactions;use super::crypto::Crypto;use super::metal::Metal;use super::money::{Currency, Fiat};use super::stocks::StockPlus;#[derive(Debug, Default, Deserialize, Serialize)]pub struct Accounts {#[serde(rename = "accounts")]pub inner: Vec<Account>,pub groups: Vec<Group>,pub crypto: Vec<Crypto>,pub fiats: Vec<Fiat>,pub metals: Vec<Metal>,pub stocks_plus: Vec<StockPlus>,}impl Accounts {pub fn currencies(&self) -> HashSet<Fiat> {let mut currencies = HashSet::new();for account in &self.inner {currencies.insert(account.txs_1st.currency.clone());}currencies}pub fn sort(&mut self) {self.inner.sort_by_key(|account| account.name.clone());}pub fn all_accounts_txs_1st(&self, currency: Fiat) -> Transactions<Fiat> {let mut transactions = Transactions::new(currency);for account in &self.inner {if account.txs_1st.currency == transactions.currency {for tx in &account.txs_1st.txs {transactions.txs.push(tx.clone());}}}transactions.sort();let mut balance = dec!(0);for tx in &mut transactions.txs {balance += tx.amount;tx.balance = balance;}transactions}#[must_use]pub async fn get_all_prices(&mut self) -> Vec<anyhow::Error> {let mut tasks = Vec::new();let mut indexes = Vec::new();for (index, account) in self.inner.iter().enumerate() {if account.txs_2nd.is_some() {indexes.push(index);tasks.push(account.submit_price_as_transaction());}}let results = futures::future::join_all(tasks).await;let mut errors = Vec::new();for (index, result) in indexes.into_iter().zip(results) {let account = &mut self.inner[index];match result {Ok(tx) => {account.txs_1st.txs.push(tx);account.txs_1st.sort();}Err(error) => {errors.push(error);}}}errors}pub fn get_currencies(&self) -> Vec<Currency> {let mut currencies = Vec::new();for crypto in &self.crypto {currencies.push(Currency::Crypto(crypto.clone()));}for fiat in &self.fiats {currencies.push(Currency::Fiat(fiat.clone()));}for metal in &self.metals {currencies.push(Currency::Metal(metal.clone()));}for stock_plus in &self.stocks_plus {currencies.push(Currency::StockPlus(stock_plus.clone()));}currencies}pub fn new() -> Self {Self {inner: Vec::new(),groups: Vec::new(),crypto: Vec::new(),fiats: Vec::new(),metals: Vec::new(),stocks_plus: Vec::new(),}}pub fn balance(&self, currency: &Fiat) -> Decimal {let mut balance = dec!(0);for account in &self.inner {if account.txs_1st.currency == *currency {balance += account.balance_1st();}}balance}pub fn total_for_last_week(&self, currency: &Fiat) -> (Decimal, Decimal) {let mut previous_total = dec!(0);let mut total = dec!(0);for account in &self.inner {if account.txs_1st.currency == *currency {let (previous_sum, sum) = account.sum_last_week();previous_total += previous_sum;total += sum;}}(previous_total, total)}pub fn total_for_last_month(&self, currency: &Fiat) -> (Decimal, Decimal) {let mut previous_total = dec!(0);let mut total = dec!(0);for account in &self.inner {if account.txs_1st.currency == *currency {let (previous_sum, sum) = account.sum_last_month();previous_total += previous_sum;total += sum;}}(previous_total, total)}pub fn total_for_last_year(&self, currency: &Fiat) -> (Decimal, Decimal) {let mut previous_total = dec!(0);let mut total = dec!(0);for account in &self.inner {if account.txs_1st.currency == *currency {let (previous_sum, sum) = account.sum_last_year();previous_total += previous_sum;total += sum;}}(previous_total, total)}pub fn to_string(&self) -> anyhow::Result<String> {let pretty_config = PrettyConfig::new();let string = ron::ser::to_string_pretty(self, pretty_config)?;Ok(string)}pub fn save_dialogue(&self,old_file: Option<File>,file_path: PathBuf,) -> anyhow::Result<File> {if let Some(old_file) = old_file {old_file.inner.unlock()?;}if fs::exists(&file_path)? {let file = fs::File::open(&file_path)?;file.try_lock()?;file.unlock()?;}let mut file = fs::File::create(&file_path)?;file.try_lock()?;file.write_all(self.to_string()?.as_bytes())?;Ok(File {path: file_path,inner: file,})}pub fn save_first(&self, file_path: PathBuf) -> anyhow::Result<File> {let mut file = OpenOptions::new().write(true).create_new(true).open(&file_path)?;file.try_lock()?;file.write_all(self.to_string()?.as_bytes())?;Ok(File {path: file_path,inner: file,})}pub fn save(&self, old_file: Option<File>) -> anyhow::Result<File> {let old_file = old_file.context("Cannot save because file is None!")?;let file_path = old_file.path;let mut file = fs::File::create(&file_path)?;old_file.inner.unlock()?;file.try_lock()?;file.write_all(self.to_string()?.as_bytes())?;Ok(File {path: file_path,inner: file,})}pub fn load(old_file: Option<File>, file_path: PathBuf) -> anyhow::Result<(Self, File)> {if let Some(old_file) = old_file {old_file.inner.unlock()?;}let mut file = fs::File::open(&file_path)?;file.try_lock()?;let mut buf = String::new();file.read_to_string(&mut buf)?;let accounts = ron::from_str(&buf)?;Ok((accounts,File {path: file_path,inner: file,},))}}impl Index<usize> for Accounts {type Output = Account;fn index(&self, i: usize) -> &Self::Output {&self.inner[i]}}impl IndexMut<usize> for Accounts {fn index_mut(&mut self, i: usize) -> &mut Self::Output {&mut self.inner[i]}}#[derive(Clone, Debug, Deserialize, Serialize)]pub struct Group {pub name: String,pub members: Vec<usize>,}impl Group {fn remove_inner(&mut self, index: usize) -> Option<usize> {for (remove, i) in &mut self.members.iter().enumerate() {if index == *i {return Some(remove);}}None}pub fn remove(&mut self, index: usize) -> Option<usize> {for i in &mut self.members.iter_mut() {if *i > index {*i -= 1;}}if let Some(index) = self.remove_inner(index) {return Some(self.members.remove(index));}None}}
use std::fmt::Display;use anyhow::Error;use chrono::{DateTime, Months, TimeDelta, Utc};use reqwest::Client;use rust_decimal::Decimal;use rust_decimal_macros::dec;use serde::{Deserialize, Serialize};use crate::app::{Fiat, money::Currency};use super::transaction::Transaction;pub trait Price {async fn get_price(&self, client: &Client) -> anyhow::Result<Decimal>;}impl Price for Transactions<Currency> {async fn get_price(&self, client: &Client) -> anyhow::Result<Decimal> {match &self.currency {Currency::Crypto(crypto) => crypto.get_price(client).await,Currency::Fiat(_) => panic!("You can't hold a fiat currency as a secondary currency!"),Currency::Metal(metal) => metal.get_price(client).await,Currency::StockPlus(stock_plus) => stock_plus.get_price(client).await,}}}pub trait PriceAsTransaction: Price {async fn get_price_as_transaction(&self) -> anyhow::Result<Transaction>;}impl PriceAsTransaction for Transactions<Currency> {async fn get_price_as_transaction(&self) -> anyhow::Result<Transaction> {let client = Client::builder().user_agent("Mozilla/5.0 (compatible; financial-accounts/0.2-dev; +https://github.com/dcampbell24/financial-accounts)").build()?;let price = self.get_price(&client).await?;let count = self.count();match &self.currency {Currency::Crypto(_) | Currency::Metal(_) | Currency::StockPlus(_) => Ok(Transaction {amount: dec!(0),balance: count * price,date: Utc::now(),comment: String::new(),}),Currency::Fiat(_) => unreachable!("You can't have a fiat price_as_transaction!"),}}}#[derive(Clone, Debug, Deserialize, Serialize)]pub struct Transactions<T: Clone + Display> {pub currency: T,pub txs: Vec<Transaction>,}impl<T: Clone + Display> Transactions<T> {pub const fn new(currency: T) -> Self {Self {currency,txs: Vec::new(),}}pub fn balance(&self) -> Decimal {self.txs.last().map_or_else(|| dec!(0), |tx| tx.balance)}pub fn balance_to_amount(&mut self, mut new_tx: Transaction) -> Transaction {new_tx.amount = new_tx.balance;let mut previous_tx = None;for tx in &mut self.txs {if tx.date <= new_tx.date {previous_tx = Some(tx);}}if let Some(tx) = previous_tx {new_tx.amount = new_tx.balance - tx.balance;}for tx in &mut self.txs {if tx.date > new_tx.date {tx.amount = tx.balance - new_tx.balance;break;}}new_tx}fn count(&self) -> Decimal {self.txs.iter().map(|tx| tx.amount).sum()}pub fn date_most_recent(&self, date: &DateTime<Utc>) -> anyhow::Result<()> {for tx in &self.txs {if &tx.date > date {return Err(Error::msg("The date is not the most recent!"));}}Ok(())}pub fn filter_month(&mut self, filter_date: Option<DateTime<Utc>>) {if let Some(date) = filter_date {let mut filtered_tx = Vec::new();for tx in &self.txs {if tx.date >= date && tx.date < date.checked_add_months(Months::new(1)).unwrap() {filtered_tx.push(tx.clone());}}self.txs = filtered_tx;}}pub fn last_week(&self) -> Transactions<T> {let last_week = Utc::now() - TimeDelta::weeks(1);let mut txs = Vec::new();for tx in &self.txs {if tx.date >= last_week {txs.push(tx.clone());}}Transactions {txs,currency: self.currency.clone(),}}pub fn last_month(&self) -> Transactions<T> {let last_week = Utc::now() - TimeDelta::days(30);let mut txs = Vec::new();for tx in &self.txs {if tx.date >= last_week {txs.push(tx.clone());}}Transactions {txs,currency: self.currency.clone(),}}pub fn last_year(&self) -> Transactions<T> {let last_week = Utc::now() - TimeDelta::days(365);let mut txs = Vec::new();for tx in &self.txs {if tx.date >= last_week {txs.push(tx.clone());}}Transactions {txs,currency: self.currency.clone(),}}pub fn max_balance(&self) -> Option<Decimal> {self.txs.iter().map(|tx| tx.balance).max()}pub fn min_balance(&self) -> Option<Decimal> {self.txs.iter().map(|tx| tx.balance).min()}pub fn max_date(&self) -> Option<DateTime<Utc>> {self.txs.iter().map(|tx| tx.date).max()}pub fn min_date(&self) -> Option<DateTime<Utc>> {self.txs.iter().map(|tx| tx.date).min()}pub fn sort(&mut self) {self.txs.sort_by_key(|tx| tx.date);}pub fn total(&self) -> Decimal {self.txs.iter().map(|d| d.amount).sum()}}impl Transactions<Currency> {pub const fn has_txs_2nd(&self) -> bool {match self.currency {Currency::Crypto(_) | Currency::Metal(_) | Currency::StockPlus(_) => true,Currency::Fiat(_) => false,}}}impl Transactions<Fiat> {pub fn remove_duplicates(&mut self, txs: &Transactions<Fiat>) {let mut txs_new = Vec::new();'outer: for tx in &self.txs {for tx_2nd in &txs.txs {if tx.date == tx_2nd.date&& tx.amount == tx_2nd.amount&& tx.comment == tx_2nd.comment{continue 'outer;}}txs_new.push(tx.clone());}self.txs = txs_new;}}
use chrono::{DateTime, Utc, serde::ts_seconds};use rust_decimal::Decimal;use serde::{Deserialize, Serialize};#[derive(Clone, Debug, Deserialize, Serialize)]pub struct Transaction {pub amount: Decimal,pub balance: Decimal,pub comment: String,#[serde(with = "ts_seconds")]pub date: DateTime<Utc>,}#[derive(Clone, Debug)]pub struct ToSubmit {pub amount: Option<Decimal>,pub balance: Option<Decimal>,pub comment: String,pub date: String,}impl ToSubmit {pub const fn new() -> Self {Self {amount: None,balance: None,comment: String::new(),date: String::new(),}}pub fn submit_commit(&self) -> String {self.comment.trim().to_string()}}impl Default for ToSubmit {fn default() -> Self {Self::new()}}
pub mod transaction;pub mod transactions;use std::{error::Error, fmt::Display, path::PathBuf, string::ToString};use chrono::{DateTime, NaiveDate, ParseError, TimeDelta, TimeZone, Utc};use iced::{Length,widget::{Button, Row, Scrollable, TextInput, button, column, row, text, text_input},};use plotters_iced2::ChartWidget;use rust_decimal::Decimal;use rust_decimal_macros::dec;use serde::{Deserialize, Serialize};use transactions::{PriceAsTransaction, Transactions};use crate::app::{self, EDGE_PADDING, PADDING, account::transaction::Transaction};use super::{Duration, ROW_SPACING, button_cell,chart::Chart,import_boa::import_boa,money::{Currency, Fiat},number_cell,screen::Screen,set_amount, some_or_empty, text_cell,};#[derive(Debug, Deserialize, Serialize)]pub struct Account {#[serde(skip)]pub check_box: bool,#[serde(skip)]pub duration: Duration,pub name: String,#[serde(skip)]pub tx: transaction::ToSubmit,#[serde(rename = "transactions")]pub txs_1st: Transactions<Fiat>,#[serde(rename = "transactions_secondary")]pub txs_2nd: Option<Transactions<Currency>>,#[serde(skip)]pub filter_date: Option<DateTime<Utc>>,#[serde(skip)]pub filter_date_year: Option<i32>,#[serde(skip)]pub filter_date_month: Option<u32>,#[serde(skip)]pub error: Option<String>,}impl Account {pub fn new(name: String, currency: Currency) -> Self {let (txs_1st, txs_2nd) = match ¤cy {Currency::StockPlus(_) => (Transactions::new(Fiat::Usd),Some(Transactions::new(currency)),),Currency::Crypto(crypto) => (Transactions::new(crypto.currency.clone()),Some(Transactions::new(currency)),),Currency::Metal(metal) => (Transactions::new(metal.currency.clone()),Some(Transactions::new(currency)),),Currency::Fiat(currency) => (Transactions::new(currency.clone()), None),};Self {check_box: false,duration: Duration::default(),name,tx: transaction::ToSubmit::new(),txs_1st,txs_2nd,filter_date: None,filter_date_year: None,filter_date_month: None,error: None,}}pub fn balance_1st(&self) -> Decimal {self.txs_1st.balance()}pub fn balance_2nd(&self) -> Option<Decimal> {self.txs_2nd.as_ref().map(transactions::Transactions::balance)}fn clear_date(&mut self) {self.filter_date_year = None;self.filter_date_month = None;self.filter_date = None;}fn get_quantity(&self, date: DateTime<Utc>) -> Option<Transaction> {if let Some(txs) = &self.txs_2nd {if txs.txs.is_empty() {return None;}if txs.txs.len() == 1 {let tx = txs.txs.first().unwrap();return if tx.date <= date {Some(tx.clone())} else {None};}for window in txs.txs.windows(2) {if window[1].date > date {return Some(window[0].clone());}}let tx = txs.txs.last().unwrap();if tx.date <= date {return Some(tx.clone());}None} else {None}}pub fn import_boa(&mut self, file_path: PathBuf) -> anyhow::Result<()> {let mut boa = import_boa(file_path)?;boa.remove_duplicates(&self.txs_1st);boa.sort();if let Some(tx_1st) = self.txs_1st.txs.last() {if let Some(tx_add) = boa.txs.first() {if tx_1st.date > tx_add.date {return Err(anyhow::Error::msg("The starting date of the first transaction you want to add is not greater than the end date of the old transactions.",));}} else {return Ok(());}}let mut balance = self.txs_1st.balance();for mut tx in boa.txs {balance += tx.amount;tx.balance = balance;self.txs_1st.txs.push(tx);}self.tx = transaction::ToSubmit::new();Ok(())}fn input(&self) -> Row<'_, super::Message> {row![balance_view(self.tx.balance.as_ref()),amount_view(self.tx.amount.as_ref()),date_view(&self.tx.date),comment_view(&self.tx.comment),add_view(self.tx.amount.as_ref(), self.tx.balance.as_ref()),text(" ".repeat(EDGE_PADDING)),].padding(PADDING).spacing(ROW_SPACING)}fn filter_date(&self) -> Row<'_, super::Message> {let year = text_input("Year", &some_or_empty(self.filter_date_year.as_ref())).on_input(|string| app::Message::Account(Message::ChangeFilterDateYear(string)));let month = text_input("Month", &some_or_empty(self.filter_date_month.as_ref())).on_input(|string| app::Message::Account(Message::ChangeFilterDateMonth(string)));let mut filter_button = button("Filter");if self.submit_filter_date().is_some() {filter_button =filter_button.on_press(app::Message::Account(Message::SubmitFilterDate));}let clear_button = button("Clear").on_press(app::Message::Account(Message::ClearDate));row![year,month,filter_button,clear_button,text(" ".repeat(EDGE_PADDING)),].padding(PADDING).spacing(ROW_SPACING)}pub fn list_transactions_2nd(&self) -> Scrollable<'_, app::Message> {let mut txs_struct = self.txs_2nd.as_ref().unwrap().clone();txs_struct.filter_month(self.filter_date);let chart = Chart {txs: txs_struct.clone(),duration: self.duration.clone(),};let chart = ChartWidget::new(chart).height(Length::Fixed(400.0));let mut col_1 = column![text_cell("Balance")].align_x(iced::Alignment::End);let mut col_2 = column![text_cell("Δ")].align_x(iced::Alignment::End);let mut col_3 = column![text_cell("Date")];let mut col_4 = column![text_cell("Comment")];let mut col_5 = column![text_cell("")];for (i, tx) in txs_struct.txs.iter().enumerate() {let mut balance = tx.balance;let mut amount = tx.amount;balance.rescale(10);amount.rescale(10);col_1 = col_1.push(number_cell(balance));col_2 = col_2.push(number_cell(amount));col_3 = col_3.push(text_cell(tx.date.format("%Y-%m-%d").to_string()));col_4 = col_4.push(text_cell(tx.comment.clone()));col_5 = col_5.push(button_cell(button("Delete").on_press(app::Message::Delete(i)),));}let rows = row![col_1, col_2, col_3, col_4, col_5];let error = self.error.as_ref().map_or_else(|| row![], |error| row![text_cell(error)]);let col = column![text_cell(txs_struct.currency.to_string()),chart,change_duration(),rows.spacing(ROW_SPACING),row![text_cell("balance: "),number_cell(self.balance_2nd().unwrap()),text_cell("total: "),number_cell(self.total_2nd())],self.input(),self.filter_date(),error,back_exit_view(),];Scrollable::new(col)}fn rows(&self, txs_1st: &Transactions<Fiat>) -> Row<'_, super::Message> {let mut col_1 = column![text_cell("Balance")].align_x(iced::Alignment::End);let mut col_2 = column![text_cell("Δ")].align_x(iced::Alignment::End);let mut col_3 = column![text_cell("Price")].align_x(iced::Alignment::End);let mut col_3b = column![text_cell("Δ")].align_x(iced::Alignment::End);let mut col_4 = column![text_cell("Quantity")].align_x(iced::Alignment::End);let mut col_4b = column![text_cell("Δ")].align_x(iced::Alignment::End);let mut col_5 = column![text_cell("Date")];let mut col_6 = column![text_cell("Comment")];let mut col_7 = column![text_cell("")];let mut quantity = dec!(0);let mut price = dec!(0);for (i, tx) in txs_1st.txs.iter().enumerate() {let mut balance = tx.balance;let mut amount = tx.amount;if let Some(tx_quantity) = self.get_quantity(tx.date) {let mut quantity_new = tx_quantity.balance;let mut price_new = balance / quantity_new;let mut quantity_diff = quantity_new - quantity;let mut price_diff = price_new - price;quantity = quantity_new;price = price_new;price_new.rescale(2);price_diff.rescale(2);quantity_new.rescale(8);quantity_diff.rescale(8);col_3 = col_3.push(number_cell(price_new));col_3b = col_3b.push(number_cell(price_diff));col_4 = col_4.push(number_cell(quantity_new));col_4b = col_4b.push(number_cell(quantity_diff));} else {col_3 = col_3.push(text_cell(""));col_3b = col_3b.push(text_cell(""));col_4 = col_4.push(text_cell(""));col_4b = col_4b.push(text_cell(""));}balance.rescale(2);amount.rescale(2);col_1 = col_1.push(number_cell(balance));col_2 = col_2.push(number_cell(amount));col_5 = col_5.push(text_cell(tx.date.format("%Y-%m-%d").to_string()));col_6 = col_6.push(text_cell(tx.comment.clone()));col_7 = col_7.push(button_cell(button("Delete").on_press(app::Message::Delete(i)),));}let rows = if self.txs_2nd.is_some() {row![col_1, col_2, col_3, col_3b, col_4, col_4b, col_5, col_6, col_7]} else {row![col_1, col_2, col_5, col_6, col_7]};rows.spacing(ROW_SPACING)}pub fn list_transactions(&self) -> Scrollable<'_, app::Message> {let mut txs_1st = self.txs_1st.clone();txs_1st.filter_month(self.filter_date);let chart = Chart {txs: txs_1st.clone(),duration: self.duration.clone(),};let chart: ChartWidget<_, _, _, _> = ChartWidget::new(chart).height(Length::Fixed(400.0));let error = self.error.as_ref().map_or_else(|| row![], |error| row![text_cell(error)]);let name = if let Some(txs_2nd) = &self.txs_2nd {txs_2nd.currency.to_string()} else {self.txs_1st.currency.to_string()};let col = column![text_cell(name),chart,change_duration(),self.rows(&txs_1st),row![text_cell("balance: "),number_cell(txs_1st.balance()),text_cell("total: "),number_cell(txs_1st.total()),].spacing(ROW_SPACING),self.input(),self.filter_date(),error,back_exit_view(),];Scrollable::new(col)}fn parse_date(&self) -> Result<DateTime<Utc>, ParseDateError> {if self.tx.date.is_empty() {Ok(Utc::now())} else {match NaiveDate::parse_from_str(&self.tx.date, "%Y-%m-%d") {Ok(naive_date) => Ok(naive_date.and_hms_opt(0, 0, 0).unwrap().and_utc()),Err(error) => Err(ParseDateError { error }),}}}fn submit_filter_date(&self) -> Option<DateTime<Utc>> {let year = self.filter_date_year?;let month = self.filter_date_month?;Some(TimeZone::with_ymd_and_hms(&Utc, year, month, 1, 0, 0, 0).unwrap())}fn submit_balance_1st(&mut self) -> anyhow::Result<Transaction> {let balance = self.tx.balance.unwrap();let date = self.parse_date()?;let tx = Transaction {amount: dec!(0),balance,comment: self.tx.submit_commit(),date,};Ok(self.txs_1st.balance_to_amount(tx))}fn submit_balance_2nd(&mut self) -> anyhow::Result<Transaction> {let balance = self.tx.balance.unwrap();let date = self.parse_date()?;let tx = Transaction {amount: dec!(0),balance,comment: self.tx.submit_commit(),date,};Ok(self.txs_2nd.as_mut().unwrap().balance_to_amount(tx))}pub async fn submit_price_as_transaction(&self) -> anyhow::Result<Transaction> {let mut tx = self.txs_2nd.as_ref().unwrap().get_price_as_transaction().await?;tx.amount = tx.balance - self.balance_1st();Ok(tx)}fn submit_tx_1st(&self) -> anyhow::Result<Transaction> {let amount = self.tx.amount.unwrap();let date = self.parse_date()?;self.txs_1st.date_most_recent(&date)?;Ok(Transaction {amount,balance: self.balance_1st() + amount,comment: self.tx.submit_commit(),date,})}fn submit_tx_2nd(&self) -> anyhow::Result<Transaction> {let amount = self.tx.amount.unwrap();let date = self.parse_date()?;self.txs_2nd.as_ref().unwrap().date_most_recent(&date)?;Ok(Transaction {amount,balance: self.balance_2nd().unwrap() + amount,comment: self.tx.submit_commit(),date,})}pub fn total_2nd(&self) -> Decimal {self.txs_2nd.as_ref().unwrap().total()}pub fn sum_last_week(&self) -> (Decimal, Decimal) {let last_week = Utc::now() - TimeDelta::weeks(1);let mut previous_amount = dec!(0);let mut amount = dec!(0);for tx in &self.txs_1st.txs {if tx.date >= last_week {amount += tx.amount;} else {previous_amount += tx.amount;}}(previous_amount, amount)}pub fn sum_last_month(&self) -> (Decimal, Decimal) {let last_month = Utc::now() - TimeDelta::days(30);let mut amount = dec!(0);let mut previous_amount = dec!(0);for tx in &self.txs_1st.txs {if tx.date >= last_month {amount += tx.amount;} else {previous_amount += tx.amount;}}(previous_amount, amount)}pub fn sum_last_year(&self) -> (Decimal, Decimal) {let last_year = Utc::now() - TimeDelta::days(365);let mut amount = dec!(0);let mut previous_amount = dec!(0);for tx in &self.txs_1st.txs {if tx.date >= last_year {amount += tx.amount;} else {previous_amount += tx.amount;}}(previous_amount, amount)}fn display_error(&mut self, result: anyhow::Result<Transaction>) -> Option<Transaction> {match result {Ok(tx) => Some(tx),Err(error) => {self.error = Some(error.to_string());None}}}pub fn update(&mut self, screen: &Screen, message: Message) -> bool {self.error = None;match message {Message::ChangeBalance(balance) => {set_amount(&mut self.tx.balance, &balance);}Message::ChangeComment(comment) => self.tx.comment = comment,Message::ChangeDate(date) => self.tx.date = date,Message::ChangeFilterDateMonth(date) => {if date.is_empty() {self.filter_date_month = None;}if let Ok(date) = date.parse()&& (1..13).contains(&date){self.filter_date_month = Some(date);}}Message::ChangeFilterDateYear(date) => {if date.is_empty() {self.filter_date_year = None;}if let Ok(date) = date.parse()&& (0..3_000).contains(&date){self.filter_date_year = Some(date);}}Message::ChangeTx(tx) => set_amount(&mut self.tx.amount, &tx),Message::ChartWeek => self.duration = Duration::Week,Message::ChartMonth => self.duration = Duration::Month,Message::ChartYear => self.duration = Duration::Year,Message::ChartAll => self.duration = Duration::All,Message::ClearDate => self.clear_date(),Message::SubmitBalance => match screen {Screen::Account(_) => {let result = self.submit_balance_1st();if let Some(tx) = self.display_error(result) {self.txs_1st.txs.push(tx);self.txs_1st.sort();self.tx = transaction::ToSubmit::new();return true;}}Screen::AccountSecondary(_) => {let result = self.submit_balance_2nd();if let Some(tx) = self.display_error(result) {self.txs_2nd.as_mut().unwrap().txs.push(tx);self.txs_2nd.as_mut().unwrap().sort();self.tx = transaction::ToSubmit::new();return true;}}Screen::Accounts | Screen::Configuration => {panic!("You can't submit a balance here!");}},Message::SubmitFilterDate => {self.filter_date = self.submit_filter_date();}Message::SubmitTx => match screen {Screen::Account(_) => {if let Some(tx) = self.display_error(self.submit_tx_1st()) {self.txs_1st.txs.push(tx);self.txs_1st.sort();self.tx = transaction::ToSubmit::new();return true;}}Screen::AccountSecondary(_) => {if let Some(tx) = self.display_error(self.submit_tx_2nd()) {self.txs_2nd.as_mut().unwrap().txs.push(tx);self.txs_2nd.as_mut().unwrap().sort();self.tx = transaction::ToSubmit::new();return true;}}Screen::Accounts | Screen::Configuration => {panic!("You can't submit a transaction here!")}},}false}}fn amount_view(amount: Option<&Decimal>) -> TextInput<'_, app::Message> {text_input("Amount", &some_or_empty(amount)).on_input(|string| app::Message::Account(Message::ChangeTx(string)))}fn balance_view(balance: Option<&Decimal>) -> TextInput<'_, app::Message> {text_input("Balance", &some_or_empty(balance)).on_input(|string| app::Message::Account(Message::ChangeBalance(string)))}fn date_view(date: &str) -> TextInput<'_, app::Message> {text_input("Date YYYY-MM-DD (empty for today)", date).on_input(|string| app::Message::Account(Message::ChangeDate(string)))}fn comment_view(comment: &str) -> TextInput<'_, app::Message> {text_input("Comment", comment).on_input(|string| app::Message::Account(Message::ChangeComment(string))).on_paste(|string| app::Message::Account(Message::ChangeComment(string)))}fn add_view<'a>(amount: Option<&Decimal>, balance: Option<&Decimal>) -> Button<'a, app::Message> {let mut add = button("Add");match (amount, balance) {(Some(_amount), None) => add = add.on_press(app::Message::Account(Message::SubmitTx)),(None, Some(_balance)) => {add = add.on_press(app::Message::Account(Message::SubmitBalance));}(None, None) | (Some(_), Some(_)) => {}}add}fn back_exit_view<'a>() -> Row<'a, app::Message> {row![button("Back").on_press(app::Message::Back),button("Exit").on_press(app::Message::Exit),].spacing(ROW_SPACING)}fn change_duration<'a>() -> Row<'a, app::Message> {let col_1 = button("Week").on_press(app::Message::Account(Message::ChartWeek));let col_2 = button("Month").on_press(app::Message::Account(Message::ChartMonth));let col_3 = button("Year").on_press(app::Message::Account(Message::ChartYear));let col_4 = button("All").on_press(app::Message::Account(Message::ChartAll));row![col_1, col_2, col_3, col_4].spacing(ROW_SPACING)}#[derive(Clone, Debug)]pub struct ParseDateError {error: ParseError,}impl Display for ParseDateError {fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {writeln!(f, "Parse Date error: {}", self.error)}}impl Error for ParseDateError {}#[derive(Clone, Debug)]pub enum Message {ChangeBalance(String),ChangeComment(String),ChangeDate(String),ChangeFilterDateMonth(String),ChangeFilterDateYear(String),ChangeTx(String),ChartWeek,ChartMonth,ChartYear,ChartAll,ClearDate,SubmitBalance,SubmitFilterDate,SubmitTx,}
[toolchain]channel = "stable"
(accounts: [],groups: [],// Supports all the crypto on api.kraken.com .crypto: [(currency: Usd,description: "Bitcoin",symbol: "XBT",),(currency: Usd,description: "Ethereum",symbol: "ETH",),(currency: Usd,description: "Gnosis",symbol: "GNO",),],// Supports all the fiats on www.goldapi.io .fiats: [Usd,// Aud,// Gbp,Eur,// Cad,// Chf,// Jpy,// Krw,// Inr,// Cny,// Zar,// Thb,// Sgd,// Hkd,// Czk,// Pln,// Myr,// Rub,// Aed,// Kwd,// Egp,// Omr,// Sar,// Mxn,// Jod,],// Supports all the metals on www.goldapi.io .metals: [(currency: Usd,description: "Gold Troy Oz",symbol: "XAU",),(currency: Usd,description: "Silver Troy Oz",symbol: "XAG",),(currency: Eur,description: "Silver Troy Oz",symbol: "XAG",),],// Supports everything on finance.yahoo.com .// All equities are in Usd.stocks_plus: [(// Mutual Fund:description: "Invesco Charter A",symbol: "CHTRX",),(description: "CHEVRON CORP",symbol: "CVX",),(description: "CISCO SYSTEMS INC COM",symbol: "CSCO",),(description: "DISNEY (WALT) CO COM STK",symbol: "DIS",),(description: "JOHNSON AND JOHNSON COM",symbol: "JNJ",),(description: "KINDER MORGAN INC. DEL",symbol: "KMI",),(description: "TEXAS INSTRUMENTS",symbol: "TXN",),(description: "WEBSTER FINL CP PV $0.01",symbol: "WBS",),],)
[Desktop Entry]Name=Financial AccountsComment=Personal FinanceExec=financial-accountsIcon=financial-accountsType=ApplicationStartupNotify=trueCategories=Office;FinanceKeywords=Finance
fin-stat (0.1.0-1) unstable; urgency=medium* Initial Release. Closes: #1059593* This is my first Debian package.-- David Campbell <dcampbell24@gmail.com> Wed, 27 Dec 2023 20:00:00 -0500
#! /bin/shcargo build --release./target/release/financial-accounts --mangzip --no-name --best financial-accounts.1PACKAGE=$(cargo deb)rm financial-accounts.1.gzecho $PACKAGElintian -EviIL +pedantic $PACKAGE
{"version": "0.2","language": "en","words": ["brblack","brblue","brcyan","brgreen","brmagenta","brred","brwhite","bryellow","chrono","clippy","FOLDERID","FOREXCOM","goldapi","Ohlc","rcdom","Renminbi","reqwest","rustfmt","TERMCOL","webbrowser","XAUUSD","Złoty"]}
# financial-accounts[![github]][github-link] [![crates-io]][crates-io-link] [![docs-rs]][docs-rs-link][github]: https://img.shields.io/badge/github-8da0cb?logo=github[github-link]: https://github.com/dcampbell24/financial-accounts[crates-io]: https://img.shields.io/badge/crates.io-fc8d62?logo=rust[crates-io-link]: https://crates.io/crates/financial-accounts[docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?logo=docs.rs[docs-rs-link]: https://docs.rs/financial-accountsAn application for tracking your personal finances.To get the price of metals a service from goldapi.io is used and it requires atoken (free for 100 requests per month). The token is stored in a file named"goldapi.io.txt" stored in your config local directory.| Platform | Value | Example || -------- | --------------------------------- | ---------------------------------------- || Linux | $XDG_CONFIG_HOME or $HOME/.config | /home/alice/.config || macOS | $HOME/Library/Application Support | /Users/Alice/Library/Application Support || Windows | {FOLDERID_LocalAppData} | C:\Users\Alice\AppData\Local |You can import Bank of America transactions via Import BoA.You can import Investor 360 via Import Investor 360.Via Tx 2nd you can get the price of metals, stocks plus, and crypto. Tx 2ndbecomes active when you select one of these currencies. Tx is the currencyTx 2nd is traded in. When you select "Get Price" Tx is populated with thequantity of Tx 2nd you hold times the current price.On Tx and 2nd Tx you can limit transactions displayed by month.Because there are many crypto, fiat, metals and stocks to choose from, youselect which ones you want in your config file. An example of a config isshown in demo-ledger.ron, located under `/usr/share/doc/financial-accounts/`if this was installed as a Debian package. All the allowed fiat currencies areshown.
.PHONY: enable-git-hooksenable-git-hooks:git config --local core.hooksPath .githooks/.PHONY: install-auditinstall-audit:cargo install cargo-audit.PHONY: install-msrvinstall-msrv:cargo install cargo-msrv.PHONY: install-vetinstall-vet:cargo install cargo-vet
The MIT License (MIT)Copyright (c) 2024 David Lawrence CampbellPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice (including the nextparagraph) shall be included in all copies or substantial portions of theSoftware.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
Apache LicenseVersion 2.0, January 2004http://www.apache.org/licenses/TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION1. Definitions."License" shall mean the terms and conditions for use, reproduction,and distribution as defined by Sections 1 through 9 of this document."Licensor" shall mean the copyright owner or entity authorized bythe copyright owner that is granting the License."Legal Entity" shall mean the union of the acting entity and allother entities that control, are controlled by, or are under commoncontrol with that entity. For the purposes of this definition,"control" means (i) the power, direct or indirect, to cause thedirection or management of such entity, whether by contract orotherwise, or (ii) ownership of fifty percent (50%) or more of theoutstanding shares, or (iii) beneficial ownership of such entity."You" (or "Your") shall mean an individual or Legal Entityexercising permissions granted by this License."Source" form shall mean the preferred form for making modifications,including but not limited to software source code, documentationsource, and configuration files."Object" form shall mean any form resulting from mechanicaltransformation or translation of a Source form, including butnot limited to compiled object code, generated documentation,and conversions to other media types."Work" shall mean the work of authorship, whether in Source orObject form, made available under the License, as indicated by acopyright notice that is included in or attached to the work(an example is provided in the Appendix below)."Derivative Works" shall mean any work, whether in Source or Objectform, that is based on (or derived from) the Work and for which theeditorial revisions, annotations, elaborations, or other modificationsrepresent, as a whole, an original work of authorship. For the purposesof this License, Derivative Works shall not include works that remainseparable from, or merely link (or bind by name) to the interfaces of,the Work and Derivative Works thereof."Contribution" shall mean any work of authorship, includingthe original version of the Work and any modifications or additionsto that Work or Derivative Works thereof, that is intentionallysubmitted to Licensor for inclusion in the Work by the copyright owneror by an individual or Legal Entity authorized to submit on behalf ofthe copyright owner. For the purposes of this definition, "submitted"means any form of electronic, verbal, or written communication sentto the Licensor or its representatives, including but not limited tocommunication on electronic mailing lists, source code control systems,and issue tracking systems that are managed by, or on behalf of, theLicensor for the purpose of discussing and improving the Work, butexcluding communication that is conspicuously marked or otherwisedesignated in writing by the copyright owner as "Not a Contribution.""Contributor" shall mean Licensor and any individual or Legal Entityon behalf of whom a Contribution has been received by Licensor andsubsequently incorporated within the Work.2. Grant of Copyright License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocablecopyright license to reproduce, prepare Derivative Works of,publicly display, publicly perform, sublicense, and distribute theWork and such Derivative Works in Source or Object form.3. Grant of Patent License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocable(except as stated in this section) patent license to make, have made,use, offer to sell, sell, import, and otherwise transfer the Work,where such license applies only to those patent claims licensableby such Contributor that are necessarily infringed by theirContribution(s) alone or by combination of their Contribution(s)with the Work to which such Contribution(s) was submitted. If Youinstitute patent litigation against any entity (including across-claim or counterclaim in a lawsuit) alleging that the Workor a Contribution incorporated within the Work constitutes director contributory patent infringement, then any patent licensesgranted to You under this License for that Work shall terminateas of the date such litigation is filed.4. Redistribution. You may reproduce and distribute copies of theWork or Derivative Works thereof in any medium, with or withoutmodifications, and in Source or Object form, provided that Youmeet the following conditions:(a) You must give any other recipients of the Work orDerivative Works a copy of this License; and(b) You must cause any modified files to carry prominent noticesstating that You changed the files; and(c) You must retain, in the Source form of any Derivative Worksthat You distribute, all copyright, patent, trademark, andattribution notices from the Source form of the Work,excluding those notices that do not pertain to any part ofthe Derivative Works; and(d) If the Work includes a "NOTICE" text file as part of itsdistribution, then any Derivative Works that You distribute mustinclude a readable copy of the attribution notices containedwithin such NOTICE file, excluding those notices that do notpertain to any part of the Derivative Works, in at least oneof the following places: within a NOTICE text file distributedas part of the Derivative Works; within the Source form ordocumentation, if provided along with the Derivative Works; or,within a display generated by the Derivative Works, if andwherever such third-party notices normally appear. The contentsof the NOTICE file are for informational purposes only anddo not modify the License. You may add Your own attributionnotices within Derivative Works that You distribute, alongsideor as an addendum to the NOTICE text from the Work, providedthat such additional attribution notices cannot be construedas modifying the License.You may add Your own copyright statement to Your modifications andmay provide additional or different license terms and conditionsfor use, reproduction, or distribution of Your modifications, orfor any such Derivative Works as a whole, provided Your use,reproduction, and distribution of the Work otherwise complies withthe conditions stated in this License.5. Submission of Contributions. Unless You explicitly state otherwise,any Contribution intentionally submitted for inclusion in the Workby You to the Licensor shall be under the terms and conditions ofthis License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modifythe terms of any separate license agreement you may have executedwith Licensor regarding such Contributions.6. Trademarks. This License does not grant permission to use the tradenames, trademarks, service marks, or product names of the Licensor,except as required for reasonable and customary use in describing theorigin of the Work and reproducing the content of the NOTICE file.7. Disclaimer of Warranty. Unless required by applicable law oragreed to in writing, Licensor provides the Work (and eachContributor provides its Contributions) on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied, including, without limitation, any warranties or conditionsof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR APARTICULAR PURPOSE. You are solely responsible for determining theappropriateness of using or redistributing the Work and assume anyrisks associated with Your exercise of permissions under this License.8. Limitation of Liability. In no event and under no legal theory,whether in tort (including negligence), contract, or otherwise,unless required by applicable law (such as deliberate and grosslynegligent acts) or agreed to in writing, shall any Contributor beliable to You for damages, including any direct, indirect, special,incidental, or consequential damages of any character arising as aresult of this License or out of the use or inability to use theWork (including but not limited to damages for loss of goodwill,work stoppage, computer failure or malfunction, or any and allother commercial damages or losses), even if such Contributorhas been advised of the possibility of such damages.9. Accepting Warranty or Additional Liability. While redistributingthe Work or Derivative Works thereof, You may choose to offer,and charge a fee for, acceptance of support, warranty, indemnity,or other liability obligations and/or rights consistent with thisLicense. However, in accepting such obligations, You may act onlyon Your own behalf and on Your sole responsibility, not on behalfof any other Contributor, and only if You agree to indemnify,defend, and hold each Contributor harmless for any liabilityincurred by, or claims asserted against, such Contributor by reasonof your accepting any such warranty or additional liability.END OF TERMS AND CONDITIONSAPPENDIX: How to apply the Apache License to your work.To apply the Apache License to your work, attach the followingboilerplate notice, with the fields enclosed by brackets "[]"replaced with your own identifying information. (Don't includethe brackets!) The text should be enclosed in the appropriatecomment syntax for the file format. We also recommend that afile or class name and description of purpose be included on thesame "printed page" as the copyright notice for easieridentification within third-party archives.Copyright 2024 David Lawrence CampbellLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
[package]name = "financial-accounts"description = "Application for tracking your finances"version = "0.4.1"edition = "2024"rust-version = "1.89"license = "MIT OR Apache-2.0"keywords = ["finance"]categories = ["finance"]# homepage = ""documentation = "https://docs.rs/financial-accounts"repository = "https://github.com/dcampbell24/financial-accounts"readme = "README.md"include = ["src/**/*", "LICENSE-*", "README.md", "CHANGELOG.md"][dependencies]anyhow = "1"chrono = { version = "0.4", features = ["serde"] }clap = { version = "4", features = ["derive"] }clap_lex = "0.7"clap_mangen = "0.2"csv = "1"dirs = "6"futures = "0.3"iced = { version = "0.14", features = ["canvas", "image", "tokio"] }image = { version = "0.25", features = ["png"], default-features = false }plotters = "0.3"plotters-iced2 = "0.14"regex = "1"reqwest = "0.13"rfd = { version = "0.17", default-features = false, features = ["xdg-portal"] }ron = "0.12"rust_decimal = "1"rust_decimal_macros = "1"serde = { version = "1", features = ["derive"] }serde_json = "1"thousands = "0.2"webbrowser = "1"yahoo_finance_api = { version = "4", features = ["decimal"] }[lints.clippy]cargo = "warn"pedantic = "warn"multiple_crate_versions = { level = "allow", priority = 1 }[package.metadata.deb]copyright = "2024 David Lawrence Campbell"maintainer = "David Campbell <dcampbell24@gmail.com>"assets = [["target/release/financial-accounts", "usr/bin/", "755"],["demo-ledger.ron", "usr/share/doc/financial-accounts/", "644"],["financial-accounts.1.gz", "usr/share/man/man1/", "644"],["debian/financial-accounts.desktop", "usr/share/applications/", "644"],["icons/financial-accounts_16x16.png", "usr/share/icons/hicolor/16x16/apps/financial-accounts.png", "644"],["icons/financial-accounts_22x22.png", "usr/share/icons/hicolor/22x22/apps/financial-accounts.png", "644"],["icons/financial-accounts_24x24.png", "usr/share/icons/hicolor/24x24/apps/financial-accounts.png", "644"],["icons/financial-accounts_32x32.png", "usr/share/icons/hicolor/32x32/apps/financial-accounts.png", "644"],["icons/financial-accounts_42x42.png", "usr/share/icons/hicolor/42x42/apps/financial-accounts.png", "644"],["icons/financial-accounts_64x64.png", "usr/share/icons/hicolor/64x64/apps/financial-accounts.png", "644"],["icons/financial-accounts_128x128.png", "usr/share/icons/hicolor/128x128/apps/financial-accounts.png", "644"],]changelog = "debian/changelog"depends = "$auto, xdg-desktop-portal-kde (>= 5.27.5-2) | xdg-desktop-portal-gtk (>= 1.14.1-1) | xdg-desktop-portal-gnome (>= 43.1-2)"section = "misc"
# This file is automatically @generated by Cargo.# It is not intended for manual editing.version = 4[[package]]name = "ab_glyph"version = "0.2.32"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2"dependencies = ["ab_glyph_rasterizer","owned_ttf_parser",][[package]]name = "ab_glyph_rasterizer"version = "0.1.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618"[[package]]name = "adler2"version = "2.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"[[package]]name = "ahash"version = "0.7.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"dependencies = ["getrandom 0.2.17","once_cell","version_check",][[package]]name = "ahash"version = "0.8.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"dependencies = ["cfg-if","getrandom 0.3.4","once_cell","version_check","zerocopy",][[package]]name = "aho-corasick"version = "1.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"dependencies = ["memchr",][[package]]name = "aligned"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685"dependencies = ["as-slice",][[package]]name = "aligned-vec"version = "0.6.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b"dependencies = ["equator",][[package]]name = "android-activity"version = "0.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046"dependencies = ["android-properties","bitflags 2.10.0","cc","cesu8","jni","jni-sys","libc","log","ndk","ndk-context","ndk-sys","num_enum","thiserror 1.0.69",][[package]]name = "android-build"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8cac4c64175d504608cf239756339c07f6384a476f97f20a7043f92920b0b8fd"dependencies = ["windows-sys 0.52.0",][[package]]name = "android-properties"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"[[package]]name = "android_system_properties"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"dependencies = ["libc",][[package]]name = "anstream"version = "0.6.21"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"dependencies = ["anstyle","anstyle-parse","anstyle-query","anstyle-wincon","colorchoice","is_terminal_polyfill","utf8parse",][[package]]name = "anstyle"version = "1.0.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"[[package]]name = "anstyle-parse"version = "0.2.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"dependencies = ["utf8parse",][[package]]name = "anstyle-query"version = "1.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"dependencies = ["windows-sys 0.61.2",][[package]]name = "anstyle-wincon"version = "3.0.11"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"dependencies = ["anstyle","once_cell_polyfill","windows-sys 0.61.2",][[package]]name = "anyhow"version = "1.0.100"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"[[package]]name = "arbitrary"version = "1.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1"[[package]]name = "arg_enum_proc_macro"version = "0.3.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "arrayref"version = "0.3.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"[[package]]name = "arrayvec"version = "0.7.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"[[package]]name = "as-raw-xcb-connection"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"[[package]]name = "as-slice"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516"dependencies = ["stable_deref_trait",][[package]]name = "ash"version = "0.38.0+1.3.281"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f"dependencies = ["libloading",][[package]]name = "async-broadcast"version = "0.7.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"dependencies = ["event-listener","event-listener-strategy","futures-core","pin-project-lite",][[package]]name = "async-channel"version = "2.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"dependencies = ["concurrent-queue","event-listener-strategy","futures-core","pin-project-lite",][[package]]name = "async-executor"version = "1.13.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8"dependencies = ["async-task","concurrent-queue","fastrand","futures-lite","pin-project-lite","slab",][[package]]name = "async-io"version = "2.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"dependencies = ["autocfg","cfg-if","concurrent-queue","futures-io","futures-lite","parking","polling","rustix 1.1.3","slab","windows-sys 0.61.2",][[package]]name = "async-lock"version = "3.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"dependencies = ["event-listener","event-listener-strategy","pin-project-lite",][[package]]name = "async-process"version = "2.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"dependencies = ["async-channel","async-io","async-lock","async-signal","async-task","blocking","cfg-if","event-listener","futures-lite","rustix 1.1.3",][[package]]name = "async-recursion"version = "1.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "async-signal"version = "0.2.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c"dependencies = ["async-io","async-lock","atomic-waker","cfg-if","futures-core","futures-io","rustix 1.1.3","signal-hook-registry","slab","windows-sys 0.61.2",][[package]]name = "async-task"version = "4.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"[[package]]name = "async-trait"version = "0.1.89"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "atomic-waker"version = "1.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"[[package]]name = "autocfg"version = "1.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"[[package]]name = "av-scenechange"version = "0.14.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394"dependencies = ["aligned","anyhow","arg_enum_proc_macro","arrayvec","log","num-rational","num-traits","pastey","rayon","thiserror 2.0.18","v_frame","y4m",][[package]]name = "av1-grain"version = "0.2.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8"dependencies = ["anyhow","arrayvec","log","nom","num-rational","v_frame",][[package]]name = "avif-serialize"version = "0.8.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"dependencies = ["arrayvec",][[package]]name = "aws-lc-rs"version = "1.15.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256"dependencies = ["aws-lc-sys","zeroize",][[package]]name = "aws-lc-sys"version = "0.37.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a"dependencies = ["cc","cmake","dunce","fs_extra",][[package]]name = "base64"version = "0.22.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"[[package]]name = "bit-set"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"dependencies = ["bit-vec",][[package]]name = "bit-vec"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"[[package]]name = "bit_field"version = "0.10.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6"[[package]]name = "bitflags"version = "1.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"[[package]]name = "bitflags"version = "2.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"dependencies = ["serde_core",][[package]]name = "bitstream-io"version = "4.9.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757"dependencies = ["core2",][[package]]name = "bitvec"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"dependencies = ["funty","radium","tap","wyz",][[package]]name = "block"version = "0.1.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"[[package]]name = "block2"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"dependencies = ["objc2 0.5.2",][[package]]name = "block2"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"dependencies = ["objc2 0.6.3",][[package]]name = "blocking"version = "1.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"dependencies = ["async-channel","async-task","futures-io","futures-lite","piper",][[package]]name = "borsh"version = "1.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f"dependencies = ["borsh-derive","cfg_aliases",][[package]]name = "borsh-derive"version = "1.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c"dependencies = ["once_cell","proc-macro-crate","proc-macro2","quote","syn 2.0.114",][[package]]name = "built"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64"[[package]]name = "bumpalo"version = "3.19.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"[[package]]name = "bytecheck"version = "0.6.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"dependencies = ["bytecheck_derive","ptr_meta","simdutf8",][[package]]name = "bytecheck_derive"version = "0.6.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"dependencies = ["proc-macro2","quote","syn 1.0.109",][[package]]name = "bytemuck"version = "1.25.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"dependencies = ["bytemuck_derive",][[package]]name = "bytemuck_derive"version = "1.10.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "byteorder"version = "1.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"[[package]]name = "byteorder-lite"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"[[package]]name = "bytes"version = "1.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"[[package]]name = "calloop"version = "0.13.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec"dependencies = ["bitflags 2.10.0","log","polling","rustix 0.38.44","slab","thiserror 1.0.69",][[package]]name = "calloop"version = "0.14.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e"dependencies = ["bitflags 2.10.0","polling","rustix 1.1.3","slab","tracing",][[package]]name = "calloop-wayland-source"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20"dependencies = ["calloop 0.13.0","rustix 0.38.44","wayland-backend","wayland-client",][[package]]name = "calloop-wayland-source"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"dependencies = ["calloop 0.14.3","rustix 1.1.3","wayland-backend","wayland-client",][[package]]name = "cc"version = "1.2.55"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29"dependencies = ["find-msvc-tools","jobserver","libc","shlex",][[package]]name = "cesu8"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"[[package]]name = "cfg-if"version = "1.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"[[package]]name = "cfg_aliases"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"[[package]]name = "chrono"version = "0.4.43"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"dependencies = ["iana-time-zone","js-sys","num-traits","serde","wasm-bindgen","windows-link",][[package]]name = "clap"version = "4.5.56"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a75ca66430e33a14957acc24c5077b503e7d374151b2b4b3a10c83b4ceb4be0e"dependencies = ["clap_builder","clap_derive",][[package]]name = "clap_builder"version = "4.5.56"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "793207c7fa6300a0608d1080b858e5fdbe713cdc1c8db9fb17777d8a13e63df0"dependencies = ["anstream","anstyle","clap_lex","strsim",][[package]]name = "clap_derive"version = "4.5.55"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5"dependencies = ["heck","proc-macro2","quote","syn 2.0.114",][[package]]name = "clap_lex"version = "0.7.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"[[package]]name = "clap_mangen"version = "0.2.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "439ea63a92086df93893164221ad4f24142086d535b3a0957b9b9bea2dc86301"dependencies = ["clap","roff",][[package]]name = "clipboard-win"version = "5.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"dependencies = ["error-code",][[package]]name = "clipboard_macos"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f"dependencies = ["objc2 0.5.2","objc2-app-kit 0.2.2","objc2-foundation 0.2.2",][[package]]name = "clipboard_wayland"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c685738887cb37b8"dependencies = ["smithay-clipboard",][[package]]name = "clipboard_x11"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bd63e33452ffdafd39924c4f05a5dd1e94db646c779c6bd59148a3d95fff5ad4"dependencies = ["thiserror 2.0.18","x11rb",][[package]]name = "cmake"version = "0.1.57"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d"dependencies = ["cc",][[package]]name = "codespan-reporting"version = "0.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"dependencies = ["serde","termcolor","unicode-width",][[package]]name = "color_quant"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"[[package]]name = "colorchoice"version = "1.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"[[package]]name = "combine"version = "4.6.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"dependencies = ["bytes","memchr",][[package]]name = "concurrent-queue"version = "2.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"dependencies = ["crossbeam-utils",][[package]]name = "cookie"version = "0.18.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"dependencies = ["percent-encoding","time","version_check",][[package]]name = "cookie_store"version = "0.22.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f"dependencies = ["cookie","document-features","idna","log","publicsuffix","serde","serde_derive","serde_json","time","url",][[package]]name = "core-foundation"version = "0.9.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"dependencies = ["core-foundation-sys","libc",][[package]]name = "core-foundation"version = "0.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"dependencies = ["core-foundation-sys","libc",][[package]]name = "core-foundation-sys"version = "0.8.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"[[package]]name = "core-graphics"version = "0.23.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"dependencies = ["bitflags 1.3.2","core-foundation 0.9.4","core-graphics-types 0.1.3","foreign-types","libc",][[package]]name = "core-graphics-types"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"dependencies = ["bitflags 1.3.2","core-foundation 0.9.4","libc",][[package]]name = "core-graphics-types"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"dependencies = ["bitflags 2.10.0","core-foundation 0.10.1","libc",][[package]]name = "core-text"version = "20.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5"dependencies = ["core-foundation 0.9.4","core-graphics","foreign-types","libc",][[package]]name = "core2"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505"dependencies = ["memchr",][[package]]name = "core_maths"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30"dependencies = ["libm",][[package]]name = "cosmic-text"version = "0.15.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737"dependencies = ["bitflags 2.10.0","fontdb","harfrust","linebender_resource_handle","log","rangemap","rustc-hash 1.1.0","self_cell","skrifa","smol_str","swash","sys-locale","unicode-bidi","unicode-linebreak","unicode-script","unicode-segmentation",][[package]]name = "crc32fast"version = "1.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"dependencies = ["cfg-if",][[package]]name = "crossbeam-deque"version = "0.8.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"dependencies = ["crossbeam-epoch","crossbeam-utils",][[package]]name = "crossbeam-epoch"version = "0.9.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"dependencies = ["crossbeam-utils",][[package]]name = "crossbeam-utils"version = "0.8.21"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"[[package]]name = "crunchy"version = "0.2.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"[[package]]name = "cryoglyph"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "08bc795bdbccdbd461736fb163930a009da6597b226d6f6fce33e7a8eb6ec519"dependencies = ["cosmic-text","etagere","lru","rustc-hash 2.1.1","wgpu",][[package]]name = "csv"version = "1.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938"dependencies = ["csv-core","itoa","ryu","serde_core",][[package]]name = "csv-core"version = "0.1.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782"dependencies = ["memchr",][[package]]name = "ctor-lite"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b29fccfdaeb0f9bd90da5759b1d0eaa2f6cfcfe90960124cfc83141ed4e111fd"[[package]]name = "cursor-icon"version = "1.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"[[package]]name = "deranged"version = "0.5.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"dependencies = ["powerfmt",][[package]]name = "dirs"version = "6.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"dependencies = ["dirs-sys",][[package]]name = "dirs-sys"version = "0.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"dependencies = ["libc","option-ext","redox_users","windows-sys 0.61.2",][[package]]name = "dispatch"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"[[package]]name = "dispatch2"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"dependencies = ["bitflags 2.10.0","block2 0.6.2","libc","objc2 0.6.3",][[package]]name = "displaydoc"version = "0.2.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "dlib"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"dependencies = ["libloading",][[package]]name = "document-features"version = "0.2.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"dependencies = ["litrs",][[package]]name = "downcast-rs"version = "1.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"[[package]]name = "dpi"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"[[package]]name = "dunce"version = "1.0.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"[[package]]name = "dwrote"version = "0.11.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02"dependencies = ["lazy_static","libc","winapi","wio",][[package]]name = "either"version = "1.15.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"[[package]]name = "encoding_rs"version = "0.8.35"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"dependencies = ["cfg-if",][[package]]name = "endi"version = "1.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"[[package]]name = "enumflags2"version = "0.7.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"dependencies = ["enumflags2_derive","serde",][[package]]name = "enumflags2_derive"version = "0.7.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "equator"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc"dependencies = ["equator-macro",][[package]]name = "equator-macro"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "equivalent"version = "1.0.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"[[package]]name = "errno"version = "0.3.14"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"dependencies = ["libc","windows-sys 0.61.2",][[package]]name = "error-code"version = "3.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"[[package]]name = "etagere"version = "0.2.15"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342"dependencies = ["euclid","svg_fmt",][[package]]name = "euclid"version = "0.22.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "df61bf483e837f88d5c2291dcf55c67be7e676b3a51acc48db3a7b163b91ed63"dependencies = ["num-traits",][[package]]name = "event-listener"version = "5.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"dependencies = ["concurrent-queue","parking","pin-project-lite",][[package]]name = "event-listener-strategy"version = "0.5.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"dependencies = ["event-listener","pin-project-lite",][[package]]name = "exr"version = "1.74.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be"dependencies = ["bit_field","half","lebe","miniz_oxide","rayon-core","smallvec","zune-inflate",][[package]]name = "fastrand"version = "2.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"[[package]]name = "fax"version = "0.2.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab"dependencies = ["fax_derive",][[package]]name = "fax_derive"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "fdeflate"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"dependencies = ["simd-adler32",][[package]]name = "financial-accounts"version = "0.4.1"dependencies = ["anyhow","chrono","clap","clap_lex","clap_mangen","csv","dirs","futures","iced","image 0.25.9","plotters","plotters-iced2","regex","reqwest 0.13.1","rfd","ron","rust_decimal","rust_decimal_macros","serde","serde_json","thousands","webbrowser","yahoo_finance_api",][[package]]name = "find-msvc-tools"version = "0.1.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"[[package]]name = "flate2"version = "1.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369"dependencies = ["crc32fast","miniz_oxide",][[package]]name = "float-ord"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d"[[package]]name = "float_next_after"version = "1.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8"[[package]]name = "fnv"version = "1.0.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"[[package]]name = "foldhash"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"[[package]]name = "foldhash"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"[[package]]name = "font-kit"version = "0.14.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2c7e611d49285d4c4b2e1727b72cf05353558885cc5252f93707b845dfcaf3d3"dependencies = ["bitflags 2.10.0","byteorder","core-foundation 0.9.4","core-graphics","core-text","dirs","dwrote","float-ord","freetype-sys","lazy_static","libc","log","pathfinder_geometry","pathfinder_simd","walkdir","winapi","yeslogic-fontconfig-sys",][[package]]name = "font-types"version = "0.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5"dependencies = ["bytemuck",][[package]]name = "fontconfig-parser"version = "0.5.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646"dependencies = ["roxmltree",][[package]]name = "fontdb"version = "0.23.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"dependencies = ["fontconfig-parser","log","memmap2","slotmap","tinyvec","ttf-parser 0.25.1",][[package]]name = "foreign-types"version = "0.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"dependencies = ["foreign-types-macros","foreign-types-shared",][[package]]name = "foreign-types-macros"version = "0.2.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "foreign-types-shared"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"[[package]]name = "form_urlencoded"version = "1.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"dependencies = ["percent-encoding",][[package]]name = "freetype-sys"version = "0.20.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134"dependencies = ["cc","libc","pkg-config",][[package]]name = "fs_extra"version = "1.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"[[package]]name = "funty"version = "2.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"[[package]]name = "futures"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"dependencies = ["futures-channel","futures-core","futures-executor","futures-io","futures-sink","futures-task","futures-util",][[package]]name = "futures-channel"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"dependencies = ["futures-core","futures-sink",][[package]]name = "futures-core"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"[[package]]name = "futures-executor"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"dependencies = ["futures-core","futures-task","futures-util","num_cpus",][[package]]name = "futures-io"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"[[package]]name = "futures-lite"version = "2.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"dependencies = ["fastrand","futures-core","futures-io","parking","pin-project-lite",][[package]]name = "futures-macro"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "futures-sink"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"[[package]]name = "futures-task"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"[[package]]name = "futures-util"version = "0.3.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"dependencies = ["futures-channel","futures-core","futures-io","futures-macro","futures-sink","futures-task","memchr","pin-project-lite","pin-utils","slab",][[package]]name = "gethostname"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"dependencies = ["rustix 1.1.3","windows-link",][[package]]name = "getrandom"version = "0.2.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"dependencies = ["cfg-if","js-sys","libc","wasi","wasm-bindgen",][[package]]name = "getrandom"version = "0.3.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"dependencies = ["cfg-if","js-sys","libc","r-efi","wasip2","wasm-bindgen",][[package]]name = "gif"version = "0.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"dependencies = ["color_quant","weezl",][[package]]name = "gif"version = "0.14.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e"dependencies = ["color_quant","weezl",][[package]]name = "gl_generator"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"dependencies = ["khronos_api","log","xml-rs",][[package]]name = "glam"version = "0.25.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3"[[package]]name = "glow"version = "0.16.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08"dependencies = ["js-sys","slotmap","wasm-bindgen","web-sys",][[package]]name = "glutin_wgl_sys"version = "0.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e"dependencies = ["gl_generator",][[package]]name = "gpu-alloc"version = "0.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171"dependencies = ["bitflags 2.10.0","gpu-alloc-types",][[package]]name = "gpu-alloc-types"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4"dependencies = ["bitflags 2.10.0",][[package]]name = "gpu-allocator"version = "0.27.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd"dependencies = ["log","presser","thiserror 1.0.69","windows 0.58.0",][[package]]name = "gpu-descriptor"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca"dependencies = ["bitflags 2.10.0","gpu-descriptor-types","hashbrown 0.15.5",][[package]]name = "gpu-descriptor-types"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91"dependencies = ["bitflags 2.10.0",][[package]]name = "guillotiere"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782"dependencies = ["euclid","svg_fmt",][[package]]name = "h2"version = "0.4.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"dependencies = ["atomic-waker","bytes","fnv","futures-core","futures-sink","http","indexmap","slab","tokio","tokio-util","tracing",][[package]]name = "half"version = "2.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"dependencies = ["cfg-if","crunchy","num-traits","zerocopy",][[package]]name = "harfrust"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8"dependencies = ["bitflags 2.10.0","bytemuck","core_maths","read-fonts","smallvec",][[package]]name = "hashbrown"version = "0.12.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"dependencies = ["ahash 0.7.8",][[package]]name = "hashbrown"version = "0.15.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"dependencies = ["foldhash 0.1.5",][[package]]name = "hashbrown"version = "0.16.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"dependencies = ["foldhash 0.2.0",][[package]]name = "heck"version = "0.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"[[package]]name = "hermit-abi"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"[[package]]name = "hex"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"[[package]]name = "hexf-parse"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"[[package]]name = "http"version = "1.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a"dependencies = ["bytes","itoa",][[package]]name = "http-body"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"dependencies = ["bytes","http",][[package]]name = "http-body-util"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"dependencies = ["bytes","futures-core","http","http-body","pin-project-lite",][[package]]name = "httparse"version = "1.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"[[package]]name = "hyper"version = "1.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"dependencies = ["atomic-waker","bytes","futures-channel","futures-core","h2","http","http-body","httparse","itoa","pin-project-lite","pin-utils","smallvec","tokio","want",][[package]]name = "hyper-rustls"version = "0.27.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58"dependencies = ["http","hyper","hyper-util","rustls","rustls-pki-types","tokio","tokio-rustls","tower-service","webpki-roots",][[package]]name = "hyper-util"version = "0.1.19"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f"dependencies = ["base64","bytes","futures-channel","futures-core","futures-util","http","http-body","hyper","ipnet","libc","percent-encoding","pin-project-lite","socket2","system-configuration","tokio","tower-service","tracing","windows-registry",][[package]]name = "iana-time-zone"version = "0.1.65"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"dependencies = ["android_system_properties","core-foundation-sys","iana-time-zone-haiku","js-sys","log","wasm-bindgen","windows-core 0.62.2",][[package]]name = "iana-time-zone-haiku"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"dependencies = ["cc",][[package]]name = "iced"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "000e01026c93ba643f8357a3db3ada0e6555265a377f6f9291c472f6dd701fb3"dependencies = ["iced_core","iced_debug","iced_futures","iced_renderer","iced_runtime","iced_widget","iced_winit","image 0.25.9","thiserror 2.0.18",][[package]]name = "iced_core"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "91ab1937d699403e7e69252ae743a902bcee9f4ab2052cc4c9a46fcf34729d85"dependencies = ["bitflags 2.10.0","bytes","glam","lilt","log","num-traits","rustc-hash 2.1.1","smol_str","thiserror 2.0.18","web-time",][[package]]name = "iced_debug"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "25035ab0215a620e53f4103e36fc4e59a1fb2817e4bfc38a30ad27b4202ea0be"dependencies = ["iced_core","iced_futures","log",][[package]]name = "iced_futures"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8c0c85ccad42dfbec7293c36c018af0ea0dbcc52d137a4a9a0b0f6822a3fdf0a"dependencies = ["futures","iced_core","log","rustc-hash 2.1.1","tokio","wasm-bindgen-futures","wasmtimer",][[package]]name = "iced_graphics"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "234ca1c2cec4155055f68fa5fad1b5242c496ac8238d80a259bca382fb44a102"dependencies = ["bitflags 2.10.0","bytemuck","cosmic-text","half","iced_core","iced_futures","image 0.25.9","kamadak-exif","log","lyon_path","raw-window-handle","rustc-hash 2.1.1","thiserror 2.0.18","unicode-segmentation",][[package]]name = "iced_program"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6dfafec2947cda688d8eb00dac337ba11aa60f9ef6335aed343e189d26e4a673"dependencies = ["iced_graphics","iced_runtime",][[package]]name = "iced_renderer"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "250cc0802408e8c077986ec56c7d07c65f423ee658a4b9fd795a1f2aae5dac05"dependencies = ["iced_graphics","iced_tiny_skia","iced_wgpu","log","thiserror 2.0.18",][[package]]name = "iced_runtime"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d1889b819ce4c06674183242e336c8d49465665441396914dc07cc86f44fa8d4"dependencies = ["bytes","iced_core","iced_futures","raw-window-handle","thiserror 2.0.18",][[package]]name = "iced_tiny_skia"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fe0acf8b75a3bc914aff5f2329fdffc1b36eeaea29dda0e4bd232f1c62e9cc3d"dependencies = ["bytemuck","cosmic-text","iced_debug","iced_graphics","kurbo","log","rustc-hash 2.1.1","softbuffer","tiny-skia",][[package]]name = "iced_wgpu"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ff144a999b0ca0f8a10257934500060240825c42e950ec0ebee9c8ae30561c13"dependencies = ["bitflags 2.10.0","bytemuck","cryoglyph","futures","glam","guillotiere","iced_debug","iced_graphics","log","lyon","rustc-hash 2.1.1","thiserror 2.0.18","wgpu",][[package]]name = "iced_widget"version = "0.14.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b1596afa0d3109c2618e8bc12bae6c11d3064df8f95c42dfce570397dbe957ab"dependencies = ["iced_renderer","log","num-traits","rustc-hash 2.1.1","thiserror 2.0.18","unicode-segmentation",][[package]]name = "iced_winit"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8b7dbedc47562d1de3b9707d939f678b88c382004b7ab5a18f7a7dd723162d75"dependencies = ["iced_debug","iced_program","log","mundy","rustc-hash 2.1.1","thiserror 2.0.18","tracing","wasm-bindgen-futures","web-sys","window_clipboard","winit",][[package]]name = "icu_collections"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"dependencies = ["displaydoc","potential_utf","yoke","zerofrom","zerovec",][[package]]name = "icu_locale_core"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"dependencies = ["displaydoc","litemap","tinystr","writeable","zerovec",][[package]]name = "icu_normalizer"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"dependencies = ["icu_collections","icu_normalizer_data","icu_properties","icu_provider","smallvec","zerovec",][[package]]name = "icu_normalizer_data"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"[[package]]name = "icu_properties"version = "2.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"dependencies = ["icu_collections","icu_locale_core","icu_properties_data","icu_provider","zerotrie","zerovec",][[package]]name = "icu_properties_data"version = "2.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"[[package]]name = "icu_provider"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"dependencies = ["displaydoc","icu_locale_core","writeable","yoke","zerofrom","zerotrie","zerovec",][[package]]name = "idna"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"dependencies = ["idna_adapter","smallvec","utf8_iter",][[package]]name = "idna_adapter"version = "1.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"dependencies = ["icu_normalizer","icu_properties",][[package]]name = "image"version = "0.24.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d"dependencies = ["bytemuck","byteorder","color_quant","jpeg-decoder","num-traits","png 0.17.16",][[package]]name = "image"version = "0.25.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a"dependencies = ["bytemuck","byteorder-lite","color_quant","exr","gif 0.14.1","image-webp","moxcms","num-traits","png 0.18.0","qoi","ravif","rayon","rgb","tiff","zune-core 0.5.1","zune-jpeg 0.5.12",][[package]]name = "image-webp"version = "0.2.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"dependencies = ["byteorder-lite","quick-error",][[package]]name = "imgref"version = "1.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8"[[package]]name = "indexmap"version = "2.13.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"dependencies = ["equivalent","hashbrown 0.16.1",][[package]]name = "interpolate_name"version = "0.2.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "ipnet"version = "2.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"[[package]]name = "iri-string"version = "0.7.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a"dependencies = ["memchr","serde",][[package]]name = "is_terminal_polyfill"version = "1.70.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"[[package]]name = "itertools"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"dependencies = ["either",][[package]]name = "itoa"version = "1.0.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"[[package]]name = "jni"version = "0.21.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"dependencies = ["cesu8","cfg-if","combine","jni-sys","log","thiserror 1.0.69","walkdir","windows-sys 0.45.0",][[package]]name = "jni-sys"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"[[package]]name = "jobserver"version = "0.1.34"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"dependencies = ["getrandom 0.3.4","libc",][[package]]name = "jpeg-decoder"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07"[[package]]name = "js-sys"version = "0.3.85"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"dependencies = ["once_cell","wasm-bindgen",][[package]]name = "kamadak-exif"version = "0.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837"dependencies = ["mutate_once",][[package]]name = "khronos-egl"version = "6.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"dependencies = ["libc","libloading","pkg-config",][[package]]name = "khronos_api"version = "3.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"[[package]]name = "kurbo"version = "0.10.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd1bc63440"dependencies = ["arrayvec","smallvec",][[package]]name = "lazy_static"version = "1.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"[[package]]name = "lebe"version = "0.5.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8"[[package]]name = "libc"version = "0.2.180"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"[[package]]name = "libfuzzer-sys"version = "0.4.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404"dependencies = ["arbitrary","cc",][[package]]name = "libloading"version = "0.8.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"dependencies = ["cfg-if","windows-link",][[package]]name = "libm"version = "0.2.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"[[package]]name = "libredox"version = "0.1.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"dependencies = ["bitflags 2.10.0","libc","redox_syscall 0.7.0",][[package]]name = "lilt"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f67562e5eff6b20553fa9be1c503356768420994e28f67e3eafe6f41910e57ad"dependencies = ["web-time",][[package]]name = "linebender_resource_handle"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4"[[package]]name = "linux-raw-sys"version = "0.4.15"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"[[package]]name = "linux-raw-sys"version = "0.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"[[package]]name = "litemap"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"[[package]]name = "litrs"version = "1.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"[[package]]name = "lock_api"version = "0.4.14"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"dependencies = ["scopeguard",][[package]]name = "log"version = "0.4.29"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"[[package]]name = "loop9"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062"dependencies = ["imgref",][[package]]name = "lru"version = "0.16.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a1dc47f592c06f33f8e3aea9591776ec7c9f9e4124778ff8a3c3b87159f7e593"[[package]]name = "lru-slab"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"[[package]]name = "lyon"version = "1.0.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352"dependencies = ["lyon_algorithms","lyon_tessellation",][[package]]name = "lyon_algorithms"version = "1.0.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647"dependencies = ["lyon_path","num-traits",][[package]]name = "lyon_geom"version = "1.0.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906021b2343"dependencies = ["arrayvec","euclid","num-traits",][[package]]name = "lyon_path"version = "1.0.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb"dependencies = ["lyon_geom","num-traits",][[package]]name = "lyon_tessellation"version = "1.0.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353"dependencies = ["float_next_after","lyon_path","num-traits",][[package]]name = "malloc_buf"version = "0.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"dependencies = ["libc",][[package]]name = "maybe-rayon"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519"dependencies = ["cfg-if","rayon",][[package]]name = "memchr"version = "2.7.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"[[package]]name = "memmap2"version = "0.9.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490"dependencies = ["libc",][[package]]name = "memoffset"version = "0.9.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"dependencies = ["autocfg",][[package]]name = "metal"version = "0.32.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605"dependencies = ["bitflags 2.10.0","block","core-graphics-types 0.2.0","foreign-types","log","objc","paste",][[package]]name = "mime"version = "0.3.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"[[package]]name = "miniz_oxide"version = "0.8.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"dependencies = ["adler2","simd-adler32",][[package]]name = "mio"version = "1.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"dependencies = ["libc","wasi","windows-sys 0.61.2",][[package]]name = "moxcms"version = "0.7.11"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97"dependencies = ["num-traits","pxfm",][[package]]name = "mundy"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "523813c9e194ec43693805214eb112551f99382115b67f38600d724a692e7e8b"dependencies = ["android-build","async-io","cfg-if","dispatch","futures-channel","futures-lite","jni","ndk-context","objc2 0.6.3","objc2-app-kit 0.3.2","objc2-foundation 0.3.2","pin-project-lite","wasm-bindgen","wasm-bindgen-futures","web-sys","windows 0.62.2","zbus",][[package]]name = "mutate_once"version = "0.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af"[[package]]name = "naga"version = "27.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8"dependencies = ["arrayvec","bit-set","bitflags 2.10.0","cfg-if","cfg_aliases","codespan-reporting","half","hashbrown 0.16.1","hexf-parse","indexmap","libm","log","num-traits","once_cell","rustc-hash 1.1.0","spirv","thiserror 2.0.18","unicode-ident",][[package]]name = "ndk"version = "0.9.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"dependencies = ["bitflags 2.10.0","jni-sys","log","ndk-sys","num_enum","raw-window-handle","thiserror 1.0.69",][[package]]name = "ndk-context"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"[[package]]name = "ndk-sys"version = "0.6.0+11769913"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"dependencies = ["jni-sys",][[package]]name = "new_debug_unreachable"version = "1.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"[[package]]name = "nom"version = "8.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"dependencies = ["memchr",][[package]]name = "noop_proc_macro"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"[[package]]name = "num-bigint"version = "0.4.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"dependencies = ["num-integer","num-traits",][[package]]name = "num-conv"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"[[package]]name = "num-derive"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "num-integer"version = "0.1.46"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"dependencies = ["num-traits",][[package]]name = "num-rational"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"dependencies = ["num-bigint","num-integer","num-traits",][[package]]name = "num-traits"version = "0.2.19"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"dependencies = ["autocfg","libm",][[package]]name = "num_cpus"version = "1.17.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"dependencies = ["hermit-abi","libc",][[package]]name = "num_enum"version = "0.7.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c"dependencies = ["num_enum_derive","rustversion",][[package]]name = "num_enum_derive"version = "0.7.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7"dependencies = ["proc-macro-crate","proc-macro2","quote","syn 2.0.114",][[package]]name = "objc"version = "0.2.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"dependencies = ["malloc_buf",][[package]]name = "objc-sys"version = "0.3.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"[[package]]name = "objc2"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"dependencies = ["objc-sys","objc2-encode",][[package]]name = "objc2"version = "0.6.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"dependencies = ["objc2-encode",][[package]]name = "objc2-app-kit"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"dependencies = ["bitflags 2.10.0","block2 0.5.1","libc","objc2 0.5.2","objc2-core-data 0.2.2","objc2-core-image 0.2.2","objc2-foundation 0.2.2","objc2-quartz-core 0.2.2",][[package]]name = "objc2-app-kit"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"dependencies = ["bitflags 2.10.0","block2 0.6.2","libc","objc2 0.6.3","objc2-cloud-kit 0.3.2","objc2-core-data 0.3.2","objc2-core-foundation","objc2-core-graphics","objc2-core-image 0.3.2","objc2-core-text","objc2-core-video","objc2-foundation 0.3.2","objc2-quartz-core 0.3.2",][[package]]name = "objc2-cloud-kit"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-core-location","objc2-foundation 0.2.2",][[package]]name = "objc2-cloud-kit"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-foundation 0.3.2",][[package]]name = "objc2-contacts"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"dependencies = ["block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2",][[package]]name = "objc2-core-data"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2",][[package]]name = "objc2-core-data"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-foundation 0.3.2",][[package]]name = "objc2-core-foundation"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"dependencies = ["bitflags 2.10.0","dispatch2","objc2 0.6.3",][[package]]name = "objc2-core-graphics"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"dependencies = ["bitflags 2.10.0","dispatch2","objc2 0.6.3","objc2-core-foundation","objc2-io-surface",][[package]]name = "objc2-core-image"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"dependencies = ["block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2","objc2-metal",][[package]]name = "objc2-core-image"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"dependencies = ["objc2 0.6.3","objc2-foundation 0.3.2",][[package]]name = "objc2-core-location"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"dependencies = ["block2 0.5.1","objc2 0.5.2","objc2-contacts","objc2-foundation 0.2.2",][[package]]name = "objc2-core-text"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-core-foundation","objc2-core-graphics",][[package]]name = "objc2-core-video"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-core-foundation","objc2-core-graphics","objc2-io-surface",][[package]]name = "objc2-encode"version = "4.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"[[package]]name = "objc2-foundation"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"dependencies = ["bitflags 2.10.0","block2 0.5.1","dispatch","libc","objc2 0.5.2",][[package]]name = "objc2-foundation"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"dependencies = ["bitflags 2.10.0","block2 0.6.2","libc","objc2 0.6.3","objc2-core-foundation",][[package]]name = "objc2-io-surface"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-core-foundation",][[package]]name = "objc2-link-presentation"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"dependencies = ["block2 0.5.1","objc2 0.5.2","objc2-app-kit 0.2.2","objc2-foundation 0.2.2",][[package]]name = "objc2-metal"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2",][[package]]name = "objc2-quartz-core"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2","objc2-metal",][[package]]name = "objc2-quartz-core"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"dependencies = ["bitflags 2.10.0","objc2 0.6.3","objc2-core-foundation","objc2-foundation 0.3.2",][[package]]name = "objc2-symbols"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"dependencies = ["objc2 0.5.2","objc2-foundation 0.2.2",][[package]]name = "objc2-ui-kit"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-cloud-kit 0.2.2","objc2-core-data 0.2.2","objc2-core-image 0.2.2","objc2-core-location","objc2-foundation 0.2.2","objc2-link-presentation","objc2-quartz-core 0.2.2","objc2-symbols","objc2-uniform-type-identifiers","objc2-user-notifications",][[package]]name = "objc2-uniform-type-identifiers"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"dependencies = ["block2 0.5.1","objc2 0.5.2","objc2-foundation 0.2.2",][[package]]name = "objc2-user-notifications"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"dependencies = ["bitflags 2.10.0","block2 0.5.1","objc2 0.5.2","objc2-core-location","objc2-foundation 0.2.2",][[package]]name = "once_cell"version = "1.21.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"[[package]]name = "once_cell_polyfill"version = "1.70.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"[[package]]name = "openssl-probe"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe"[[package]]name = "option-ext"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"[[package]]name = "orbclient"version = "0.3.50"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd"dependencies = ["libc","libredox",][[package]]name = "ordered-float"version = "5.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d"dependencies = ["num-traits",][[package]]name = "ordered-stream"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50"dependencies = ["futures-core","pin-project-lite",][[package]]name = "owned_ttf_parser"version = "0.25.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b"dependencies = ["ttf-parser 0.25.1",][[package]]name = "parking"version = "2.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"[[package]]name = "parking_lot"version = "0.12.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"dependencies = ["lock_api","parking_lot_core",][[package]]name = "parking_lot_core"version = "0.9.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"dependencies = ["cfg-if","libc","redox_syscall 0.5.18","smallvec","windows-link",][[package]]name = "paste"version = "1.0.15"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"[[package]]name = "pastey"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec"[[package]]name = "pathfinder_geometry"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3"dependencies = ["log","pathfinder_simd",][[package]]name = "pathfinder_simd"version = "0.5.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bf9027960355bf3afff9841918474a81a5f972ac6d226d518060bba758b5ad57"dependencies = ["rustc_version",][[package]]name = "percent-encoding"version = "2.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"[[package]]name = "pin-project"version = "1.1.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a"dependencies = ["pin-project-internal",][[package]]name = "pin-project-internal"version = "1.1.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "pin-project-lite"version = "0.2.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"[[package]]name = "pin-utils"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"[[package]]name = "piper"version = "0.2.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066"dependencies = ["atomic-waker","fastrand","futures-io",][[package]]name = "pkg-config"version = "0.3.32"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"[[package]]name = "plotters"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"dependencies = ["chrono","font-kit","image 0.24.9","lazy_static","num-traits","pathfinder_geometry","plotters-backend","plotters-bitmap","plotters-svg","ttf-parser 0.20.0","wasm-bindgen","web-sys",][[package]]name = "plotters-backend"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"[[package]]name = "plotters-bitmap"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405"dependencies = ["gif 0.12.0","image 0.24.9","plotters-backend",][[package]]name = "plotters-iced2"version = "0.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5b1039c8645f00d8a217cefe8ad37f3a8b268a51f7de5eff429b78920ad1a9ea"dependencies = ["iced_graphics","iced_widget","once_cell","plotters","plotters-backend",][[package]]name = "plotters-svg"version = "0.3.7"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"dependencies = ["plotters-backend",][[package]]name = "png"version = "0.17.16"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526"dependencies = ["bitflags 1.3.2","crc32fast","fdeflate","flate2","miniz_oxide",][[package]]name = "png"version = "0.18.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0"dependencies = ["bitflags 2.10.0","crc32fast","fdeflate","flate2","miniz_oxide",][[package]]name = "polling"version = "3.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"dependencies = ["cfg-if","concurrent-queue","hermit-abi","pin-project-lite","rustix 1.1.3","windows-sys 0.61.2",][[package]]name = "pollster"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"[[package]]name = "portable-atomic"version = "1.13.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"[[package]]name = "portable-atomic-util"version = "0.2.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5"dependencies = ["portable-atomic",][[package]]name = "potential_utf"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"dependencies = ["zerovec",][[package]]name = "powerfmt"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"[[package]]name = "ppv-lite86"version = "0.2.21"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"dependencies = ["zerocopy",][[package]]name = "presser"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa"[[package]]name = "proc-macro-crate"version = "3.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"dependencies = ["toml_edit",][[package]]name = "proc-macro2"version = "1.0.106"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"dependencies = ["unicode-ident",][[package]]name = "profiling"version = "1.0.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"dependencies = ["profiling-procmacros",][[package]]name = "profiling-procmacros"version = "1.0.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"dependencies = ["quote","syn 2.0.114",][[package]]name = "psl-types"version = "2.0.11"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"[[package]]name = "ptr_meta"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"dependencies = ["ptr_meta_derive",][[package]]name = "ptr_meta_derive"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"dependencies = ["proc-macro2","quote","syn 1.0.109",][[package]]name = "publicsuffix"version = "2.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf"dependencies = ["idna","psl-types",][[package]]name = "pxfm"version = "0.1.27"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8"dependencies = ["num-traits",][[package]]name = "qoi"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"dependencies = ["bytemuck",][[package]]name = "quick-error"version = "2.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"[[package]]name = "quick-xml"version = "0.38.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"dependencies = ["memchr",][[package]]name = "quinn"version = "0.11.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20"dependencies = ["bytes","cfg_aliases","pin-project-lite","quinn-proto","quinn-udp","rustc-hash 2.1.1","rustls","socket2","thiserror 2.0.18","tokio","tracing","web-time",][[package]]name = "quinn-proto"version = "0.11.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31"dependencies = ["aws-lc-rs","bytes","getrandom 0.3.4","lru-slab","rand 0.9.2","ring","rustc-hash 2.1.1","rustls","rustls-pki-types","slab","thiserror 2.0.18","tinyvec","tracing","web-time",][[package]]name = "quinn-udp"version = "0.5.14"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd"dependencies = ["cfg_aliases","libc","once_cell","socket2","tracing","windows-sys 0.60.2",][[package]]name = "quote"version = "1.0.44"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4"dependencies = ["proc-macro2",][[package]]name = "r-efi"version = "5.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"[[package]]name = "radium"version = "0.7.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"[[package]]name = "rand"version = "0.8.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"dependencies = ["libc","rand_chacha 0.3.1","rand_core 0.6.4",][[package]]name = "rand"version = "0.9.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"dependencies = ["rand_chacha 0.9.0","rand_core 0.9.5",][[package]]name = "rand_chacha"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"dependencies = ["ppv-lite86","rand_core 0.6.4",][[package]]name = "rand_chacha"version = "0.9.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"dependencies = ["ppv-lite86","rand_core 0.9.5",][[package]]name = "rand_core"version = "0.6.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"dependencies = ["getrandom 0.2.17",][[package]]name = "rand_core"version = "0.9.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c"dependencies = ["getrandom 0.3.4",][[package]]name = "range-alloc"version = "0.1.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde"[[package]]name = "rangemap"version = "1.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68"[[package]]name = "rav1e"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b"dependencies = ["aligned-vec","arbitrary","arg_enum_proc_macro","arrayvec","av-scenechange","av1-grain","bitstream-io","built","cfg-if","interpolate_name","itertools","libc","libfuzzer-sys","log","maybe-rayon","new_debug_unreachable","noop_proc_macro","num-derive","num-traits","paste","profiling","rand 0.9.2","rand_chacha 0.9.0","simd_helpers","thiserror 2.0.18","v_frame","wasm-bindgen",][[package]]name = "ravif"version = "0.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285"dependencies = ["avif-serialize","imgref","loop9","quick-error","rav1e","rayon","rgb",][[package]]name = "raw-window-handle"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"[[package]]name = "rayon"version = "1.11.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"dependencies = ["either","rayon-core",][[package]]name = "rayon-core"version = "1.13.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"dependencies = ["crossbeam-deque","crossbeam-utils",][[package]]name = "read-fonts"version = "0.35.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358"dependencies = ["bytemuck","core_maths","font-types",][[package]]name = "redox_syscall"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"dependencies = ["bitflags 1.3.2",][[package]]name = "redox_syscall"version = "0.5.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"dependencies = ["bitflags 2.10.0",][[package]]name = "redox_syscall"version = "0.7.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27"dependencies = ["bitflags 2.10.0",][[package]]name = "redox_users"version = "0.5.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"dependencies = ["getrandom 0.2.17","libredox","thiserror 2.0.18",][[package]]name = "regex"version = "1.12.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"dependencies = ["aho-corasick","memchr","regex-automata","regex-syntax",][[package]]name = "regex-automata"version = "0.4.13"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"dependencies = ["aho-corasick","memchr","regex-syntax",][[package]]name = "regex-syntax"version = "0.8.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"[[package]]name = "rend"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"dependencies = ["bytecheck",][[package]]name = "renderdoc-sys"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"[[package]]name = "reqwest"version = "0.12.28"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147"dependencies = ["base64","bytes","cookie","cookie_store","futures-core","http","http-body","http-body-util","hyper","hyper-rustls","hyper-util","js-sys","log","percent-encoding","pin-project-lite","quinn","rustls","rustls-pki-types","serde","serde_json","serde_urlencoded","sync_wrapper","tokio","tokio-rustls","tower","tower-http","tower-service","url","wasm-bindgen","wasm-bindgen-futures","web-sys","webpki-roots",][[package]]name = "reqwest"version = "0.13.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62"dependencies = ["base64","bytes","encoding_rs","futures-core","h2","http","http-body","http-body-util","hyper","hyper-rustls","hyper-util","js-sys","log","mime","percent-encoding","pin-project-lite","quinn","rustls","rustls-pki-types","rustls-platform-verifier","sync_wrapper","tokio","tokio-rustls","tower","tower-http","tower-service","url","wasm-bindgen","wasm-bindgen-futures","web-sys",][[package]]name = "rfd"version = "0.17.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220"dependencies = ["block2 0.6.2","dispatch2","js-sys","libc","log","objc2 0.6.3","objc2-app-kit 0.3.2","objc2-core-foundation","objc2-foundation 0.3.2","percent-encoding","pollster","raw-window-handle","wasm-bindgen","wasm-bindgen-futures","web-sys","windows-sys 0.61.2",][[package]]name = "rgb"version = "0.8.52"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"[[package]]name = "ring"version = "0.17.14"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"dependencies = ["cc","cfg-if","getrandom 0.2.17","libc","untrusted","windows-sys 0.52.0",][[package]]name = "rkyv"version = "0.7.46"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1"dependencies = ["bitvec","bytecheck","bytes","hashbrown 0.12.3","ptr_meta","rend","rkyv_derive","seahash","tinyvec","uuid",][[package]]name = "rkyv_derive"version = "0.7.46"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5"dependencies = ["proc-macro2","quote","syn 1.0.109",][[package]]name = "roff"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3"[[package]]name = "ron"version = "0.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32"dependencies = ["bitflags 2.10.0","once_cell","serde","serde_derive","typeid","unicode-ident",][[package]]name = "roxmltree"version = "0.20.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"[[package]]name = "rust_decimal"version = "1.40.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0"dependencies = ["arrayvec","borsh","bytes","num-traits","rand 0.8.5","rkyv","serde","serde_json",][[package]]name = "rust_decimal_macros"version = "1.40.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "74a5a6f027e892c7a035c6fddb50435a1fbf5a734ffc0c2a9fed4d0221440519"dependencies = ["quote","syn 2.0.114",][[package]]name = "rustc-hash"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"[[package]]name = "rustc-hash"version = "2.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"[[package]]name = "rustc_version"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"dependencies = ["semver",][[package]]name = "rustix"version = "0.38.44"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"dependencies = ["bitflags 2.10.0","errno","libc","linux-raw-sys 0.4.15","windows-sys 0.59.0",][[package]]name = "rustix"version = "1.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"dependencies = ["bitflags 2.10.0","errno","libc","linux-raw-sys 0.11.0","windows-sys 0.61.2",][[package]]name = "rustls"version = "0.23.36"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b"dependencies = ["aws-lc-rs","once_cell","ring","rustls-pki-types","rustls-webpki","subtle","zeroize",][[package]]name = "rustls-native-certs"version = "0.8.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"dependencies = ["openssl-probe","rustls-pki-types","schannel","security-framework",][[package]]name = "rustls-pki-types"version = "1.14.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"dependencies = ["web-time","zeroize",][[package]]name = "rustls-platform-verifier"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784"dependencies = ["core-foundation 0.10.1","core-foundation-sys","jni","log","once_cell","rustls","rustls-native-certs","rustls-platform-verifier-android","rustls-webpki","security-framework","security-framework-sys","webpki-root-certs","windows-sys 0.61.2",][[package]]name = "rustls-platform-verifier-android"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"[[package]]name = "rustls-webpki"version = "0.103.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53"dependencies = ["aws-lc-rs","ring","rustls-pki-types","untrusted",][[package]]name = "rustversion"version = "1.0.22"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"[[package]]name = "ryu"version = "1.0.22"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"[[package]]name = "same-file"version = "1.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"dependencies = ["winapi-util",][[package]]name = "schannel"version = "0.1.28"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"dependencies = ["windows-sys 0.61.2",][[package]]name = "scoped-tls"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"[[package]]name = "scopeguard"version = "1.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"[[package]]name = "sctk-adwaita"version = "0.10.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec"dependencies = ["ab_glyph","log","memmap2","smithay-client-toolkit 0.19.2","tiny-skia",][[package]]name = "seahash"version = "4.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"[[package]]name = "security-framework"version = "3.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef"dependencies = ["bitflags 2.10.0","core-foundation 0.10.1","core-foundation-sys","libc","security-framework-sys",][[package]]name = "security-framework-sys"version = "2.15.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"dependencies = ["core-foundation-sys","libc",][[package]]name = "self_cell"version = "1.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89"[[package]]name = "semver"version = "1.0.27"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"[[package]]name = "serde"version = "1.0.228"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"dependencies = ["serde_core","serde_derive",][[package]]name = "serde_core"version = "1.0.228"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"dependencies = ["serde_derive",][[package]]name = "serde_derive"version = "1.0.228"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "serde_json"version = "1.0.149"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"dependencies = ["itoa","memchr","serde","serde_core","zmij",][[package]]name = "serde_repr"version = "0.1.20"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "serde_urlencoded"version = "0.7.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"dependencies = ["form_urlencoded","itoa","ryu","serde",][[package]]name = "shlex"version = "1.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"[[package]]name = "signal-hook-registry"version = "1.4.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"dependencies = ["errno","libc",][[package]]name = "simd-adler32"version = "0.3.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"[[package]]name = "simd_helpers"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6"dependencies = ["quote",][[package]]name = "simdutf8"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"[[package]]name = "skrifa"version = "0.37.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841"dependencies = ["bytemuck","read-fonts",][[package]]name = "slab"version = "0.4.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"[[package]]name = "slotmap"version = "1.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"dependencies = ["version_check",][[package]]name = "smallvec"version = "1.15.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"[[package]]name = "smithay-client-toolkit"version = "0.19.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016"dependencies = ["bitflags 2.10.0","calloop 0.13.0","calloop-wayland-source 0.3.0","cursor-icon","libc","log","memmap2","rustix 0.38.44","thiserror 1.0.69","wayland-backend","wayland-client","wayland-csd-frame","wayland-cursor","wayland-protocols","wayland-protocols-wlr","wayland-scanner","xkeysym",][[package]]name = "smithay-client-toolkit"version = "0.20.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"dependencies = ["bitflags 2.10.0","calloop 0.14.3","calloop-wayland-source 0.4.1","cursor-icon","libc","log","memmap2","rustix 1.1.3","thiserror 2.0.18","wayland-backend","wayland-client","wayland-csd-frame","wayland-cursor","wayland-protocols","wayland-protocols-experimental","wayland-protocols-misc","wayland-protocols-wlr","wayland-scanner","xkeysym",][[package]]name = "smithay-clipboard"version = "0.7.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"dependencies = ["libc","smithay-client-toolkit 0.20.0","wayland-backend",][[package]]name = "smol_str"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"dependencies = ["serde",][[package]]name = "socket2"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0"dependencies = ["libc","windows-sys 0.60.2",][[package]]name = "softbuffer"version = "0.4.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"dependencies = ["as-raw-xcb-connection","bytemuck","fastrand","js-sys","memmap2","ndk","objc2 0.6.3","objc2-core-foundation","objc2-core-graphics","objc2-foundation 0.3.2","objc2-quartz-core 0.3.2","raw-window-handle","redox_syscall 0.5.18","rustix 1.1.3","tiny-xlib","tracing","wasm-bindgen","wayland-backend","wayland-client","wayland-sys","web-sys","windows-sys 0.61.2","x11rb",][[package]]name = "spirv"version = "0.3.0+sdk-1.3.268.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844"dependencies = ["bitflags 2.10.0",][[package]]name = "stable_deref_trait"version = "1.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"[[package]]name = "static_assertions"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"[[package]]name = "strict-num"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"[[package]]name = "strsim"version = "0.11.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"[[package]]name = "subtle"version = "2.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"[[package]]name = "svg_fmt"version = "0.4.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb"[[package]]name = "swash"version = "0.2.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a"dependencies = ["skrifa","yazi","zeno",][[package]]name = "syn"version = "1.0.109"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"dependencies = ["proc-macro2","quote","unicode-ident",][[package]]name = "syn"version = "2.0.114"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"dependencies = ["proc-macro2","quote","unicode-ident",][[package]]name = "sync_wrapper"version = "1.0.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"dependencies = ["futures-core",][[package]]name = "synstructure"version = "0.13.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "sys-locale"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"dependencies = ["libc",][[package]]name = "system-configuration"version = "0.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"dependencies = ["bitflags 2.10.0","core-foundation 0.9.4","system-configuration-sys",][[package]]name = "system-configuration-sys"version = "0.6.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"dependencies = ["core-foundation-sys","libc",][[package]]name = "tap"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"[[package]]name = "tempfile"version = "3.24.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"dependencies = ["fastrand","getrandom 0.3.4","once_cell","rustix 1.1.3","windows-sys 0.61.2",][[package]]name = "termcolor"version = "1.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"dependencies = ["winapi-util",][[package]]name = "thiserror"version = "1.0.69"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"dependencies = ["thiserror-impl 1.0.69",][[package]]name = "thiserror"version = "2.0.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"dependencies = ["thiserror-impl 2.0.18",][[package]]name = "thiserror-impl"version = "1.0.69"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "thiserror-impl"version = "2.0.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "thousands"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820"[[package]]name = "tiff"version = "0.10.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f"dependencies = ["fax","flate2","half","quick-error","weezl","zune-jpeg 0.4.21",][[package]]name = "time"version = "0.3.46"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5"dependencies = ["deranged","itoa","num-conv","powerfmt","serde_core","time-core","time-macros",][[package]]name = "time-core"version = "0.1.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"[[package]]name = "time-macros"version = "0.2.26"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4"dependencies = ["num-conv","time-core",][[package]]name = "tiny-skia"version = "0.11.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab"dependencies = ["arrayref","arrayvec","bytemuck","cfg-if","log","tiny-skia-path",][[package]]name = "tiny-skia-path"version = "0.11.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93"dependencies = ["arrayref","bytemuck","strict-num",][[package]]name = "tiny-xlib"version = "0.2.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e"dependencies = ["as-raw-xcb-connection","ctor-lite","libloading","pkg-config","tracing",][[package]]name = "tinystr"version = "0.8.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"dependencies = ["displaydoc","zerovec",][[package]]name = "tinyvec"version = "1.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"dependencies = ["tinyvec_macros",][[package]]name = "tinyvec_macros"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"[[package]]name = "tokio"version = "1.49.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86"dependencies = ["bytes","libc","mio","pin-project-lite","socket2","windows-sys 0.61.2",][[package]]name = "tokio-rustls"version = "0.26.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61"dependencies = ["rustls","tokio",][[package]]name = "tokio-util"version = "0.7.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098"dependencies = ["bytes","futures-core","futures-sink","pin-project-lite","tokio",][[package]]name = "toml_datetime"version = "0.7.5+spec-1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"dependencies = ["serde_core",][[package]]name = "toml_edit"version = "0.23.10+spec-1.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269"dependencies = ["indexmap","toml_datetime","toml_parser","winnow",][[package]]name = "toml_parser"version = "1.0.6+spec-1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"dependencies = ["winnow",][[package]]name = "tower"version = "0.5.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"dependencies = ["futures-core","futures-util","pin-project-lite","sync_wrapper","tokio","tower-layer","tower-service",][[package]]name = "tower-http"version = "0.6.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"dependencies = ["bitflags 2.10.0","bytes","futures-util","http","http-body","iri-string","pin-project-lite","tower","tower-layer","tower-service",][[package]]name = "tower-layer"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"[[package]]name = "tower-service"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"[[package]]name = "tracing"version = "0.1.44"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"dependencies = ["log","pin-project-lite","tracing-attributes","tracing-core",][[package]]name = "tracing-attributes"version = "0.1.31"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "tracing-core"version = "0.1.36"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"dependencies = ["once_cell",][[package]]name = "try-lock"version = "0.2.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"[[package]]name = "ttf-parser"version = "0.20.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"[[package]]name = "ttf-parser"version = "0.25.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31"dependencies = ["core_maths",][[package]]name = "typeid"version = "1.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"[[package]]name = "uds_windows"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9"dependencies = ["memoffset","tempfile","winapi",][[package]]name = "unicode-bidi"version = "0.3.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"[[package]]name = "unicode-ident"version = "1.0.22"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"[[package]]name = "unicode-linebreak"version = "0.1.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"[[package]]name = "unicode-script"version = "0.5.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee"[[package]]name = "unicode-segmentation"version = "1.12.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"[[package]]name = "unicode-width"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"[[package]]name = "untrusted"version = "0.9.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"[[package]]name = "url"version = "2.5.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"dependencies = ["form_urlencoded","idna","percent-encoding","serde",][[package]]name = "utf8_iter"version = "1.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"[[package]]name = "utf8parse"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"[[package]]name = "uuid"version = "1.20.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f"dependencies = ["js-sys","serde_core","wasm-bindgen",][[package]]name = "v_frame"version = "0.3.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2"dependencies = ["aligned-vec","num-traits","wasm-bindgen",][[package]]name = "version_check"version = "0.9.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"[[package]]name = "walkdir"version = "2.5.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"dependencies = ["same-file","winapi-util",][[package]]name = "want"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"dependencies = ["try-lock",][[package]]name = "wasi"version = "0.11.1+wasi-snapshot-preview1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"[[package]]name = "wasip2"version = "1.0.2+wasi-0.2.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"dependencies = ["wit-bindgen",][[package]]name = "wasm-bindgen"version = "0.2.108"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"dependencies = ["cfg-if","once_cell","rustversion","wasm-bindgen-macro","wasm-bindgen-shared",][[package]]name = "wasm-bindgen-futures"version = "0.4.58"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f"dependencies = ["cfg-if","futures-util","js-sys","once_cell","wasm-bindgen","web-sys",][[package]]name = "wasm-bindgen-macro"version = "0.2.108"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"dependencies = ["quote","wasm-bindgen-macro-support",][[package]]name = "wasm-bindgen-macro-support"version = "0.2.108"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"dependencies = ["bumpalo","proc-macro2","quote","syn 2.0.114","wasm-bindgen-shared",][[package]]name = "wasm-bindgen-shared"version = "0.2.108"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"dependencies = ["unicode-ident",][[package]]name = "wasmtimer"version = "0.4.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b"dependencies = ["futures","js-sys","parking_lot","pin-utils","slab","wasm-bindgen",][[package]]name = "wayland-backend"version = "0.3.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"dependencies = ["cc","downcast-rs","rustix 1.1.3","scoped-tls","smallvec","wayland-sys",][[package]]name = "wayland-client"version = "0.31.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"dependencies = ["bitflags 2.10.0","rustix 1.1.3","wayland-backend","wayland-scanner",][[package]]name = "wayland-csd-frame"version = "0.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"dependencies = ["bitflags 2.10.0","cursor-icon","wayland-backend",][[package]]name = "wayland-cursor"version = "0.31.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5864c4b5b6064b06b1e8b74ead4a98a6c45a285fe7a0e784d24735f011fdb078"dependencies = ["rustix 1.1.3","wayland-client","xcursor",][[package]]name = "wayland-protocols"version = "0.32.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"dependencies = ["bitflags 2.10.0","wayland-backend","wayland-client","wayland-scanner",][[package]]name = "wayland-protocols-experimental"version = "20250721.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"dependencies = ["bitflags 2.10.0","wayland-backend","wayland-client","wayland-protocols","wayland-scanner",][[package]]name = "wayland-protocols-misc"version = "0.3.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "791c58fdeec5406aa37169dd815327d1e47f334219b523444bc26d70ceb4c34e"dependencies = ["bitflags 2.10.0","wayland-backend","wayland-client","wayland-protocols","wayland-scanner",][[package]]name = "wayland-protocols-plasma"version = "0.3.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "aa98634619300a535a9a97f338aed9a5ff1e01a461943e8346ff4ae26007306b"dependencies = ["bitflags 2.10.0","wayland-backend","wayland-client","wayland-protocols","wayland-scanner",][[package]]name = "wayland-protocols-wlr"version = "0.3.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e9597cdf02cf0c34cd5823786dce6b5ae8598f05c2daf5621b6e178d4f7345f3"dependencies = ["bitflags 2.10.0","wayland-backend","wayland-client","wayland-protocols","wayland-scanner",][[package]]name = "wayland-scanner"version = "0.31.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"dependencies = ["proc-macro2","quick-xml","quote",][[package]]name = "wayland-sys"version = "0.31.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"dependencies = ["dlib","log","once_cell","pkg-config",][[package]]name = "web-sys"version = "0.3.85"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598"dependencies = ["js-sys","wasm-bindgen",][[package]]name = "web-time"version = "1.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"dependencies = ["js-sys","wasm-bindgen",][[package]]name = "webbrowser"version = "1.0.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97"dependencies = ["core-foundation 0.10.1","jni","log","ndk-context","objc2 0.6.3","objc2-foundation 0.3.2","url","web-sys",][[package]]name = "webpki-root-certs"version = "1.0.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc"dependencies = ["rustls-pki-types",][[package]]name = "webpki-roots"version = "1.0.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c"dependencies = ["rustls-pki-types",][[package]]name = "weezl"version = "0.1.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"[[package]]name = "wgpu"version = "27.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77"dependencies = ["arrayvec","bitflags 2.10.0","cfg-if","cfg_aliases","document-features","hashbrown 0.16.1","js-sys","log","naga","parking_lot","portable-atomic","profiling","raw-window-handle","smallvec","static_assertions","wasm-bindgen","wasm-bindgen-futures","web-sys","wgpu-core","wgpu-hal","wgpu-types",][[package]]name = "wgpu-core"version = "27.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7"dependencies = ["arrayvec","bit-set","bit-vec","bitflags 2.10.0","bytemuck","cfg_aliases","document-features","hashbrown 0.16.1","indexmap","log","naga","once_cell","parking_lot","portable-atomic","profiling","raw-window-handle","rustc-hash 1.1.0","smallvec","thiserror 2.0.18","wgpu-core-deps-apple","wgpu-core-deps-emscripten","wgpu-core-deps-windows-linux-android","wgpu-hal","wgpu-types",][[package]]name = "wgpu-core-deps-apple"version = "27.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233"dependencies = ["wgpu-hal",][[package]]name = "wgpu-core-deps-emscripten"version = "27.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5"dependencies = ["wgpu-hal",][[package]]name = "wgpu-core-deps-windows-linux-android"version = "27.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3"dependencies = ["wgpu-hal",][[package]]name = "wgpu-hal"version = "27.0.4"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce"dependencies = ["android_system_properties","arrayvec","ash","bit-set","bitflags 2.10.0","block","bytemuck","cfg-if","cfg_aliases","core-graphics-types 0.2.0","glow","glutin_wgl_sys","gpu-alloc","gpu-allocator","gpu-descriptor","hashbrown 0.16.1","js-sys","khronos-egl","libc","libloading","log","metal","naga","ndk-sys","objc","once_cell","ordered-float","parking_lot","portable-atomic","portable-atomic-util","profiling","range-alloc","raw-window-handle","renderdoc-sys","smallvec","thiserror 2.0.18","wasm-bindgen","web-sys","wgpu-types","windows 0.58.0","windows-core 0.58.0",][[package]]name = "wgpu-types"version = "27.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb"dependencies = ["bitflags 2.10.0","bytemuck","js-sys","log","thiserror 2.0.18","web-sys",][[package]]name = "winapi"version = "0.3.9"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"dependencies = ["winapi-i686-pc-windows-gnu","winapi-x86_64-pc-windows-gnu",][[package]]name = "winapi-i686-pc-windows-gnu"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"[[package]]name = "winapi-util"version = "0.1.11"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"dependencies = ["windows-sys 0.61.2",][[package]]name = "winapi-x86_64-pc-windows-gnu"version = "0.4.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"[[package]]name = "window_clipboard"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d5654226305eaf2dde8853fb482861d28e5dcecbbd40cb88e8393d94bb80d733"dependencies = ["clipboard-win","clipboard_macos","clipboard_wayland","clipboard_x11","raw-window-handle","thiserror 2.0.18",][[package]]name = "windows"version = "0.58.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6"dependencies = ["windows-core 0.58.0","windows-targets 0.52.6",][[package]]name = "windows"version = "0.62.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"dependencies = ["windows-collections","windows-core 0.62.2","windows-future","windows-numerics",][[package]]name = "windows-collections"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"dependencies = ["windows-core 0.62.2",][[package]]name = "windows-core"version = "0.58.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99"dependencies = ["windows-implement 0.58.0","windows-interface 0.58.0","windows-result 0.2.0","windows-strings 0.1.0","windows-targets 0.52.6",][[package]]name = "windows-core"version = "0.62.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"dependencies = ["windows-implement 0.60.2","windows-interface 0.59.3","windows-link","windows-result 0.4.1","windows-strings 0.5.1",][[package]]name = "windows-future"version = "0.3.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"dependencies = ["windows-core 0.62.2","windows-link","windows-threading",][[package]]name = "windows-implement"version = "0.58.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "windows-implement"version = "0.60.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "windows-interface"version = "0.58.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "windows-interface"version = "0.59.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "windows-link"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"[[package]]name = "windows-numerics"version = "0.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"dependencies = ["windows-core 0.62.2","windows-link",][[package]]name = "windows-registry"version = "0.6.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720"dependencies = ["windows-link","windows-result 0.4.1","windows-strings 0.5.1",][[package]]name = "windows-result"version = "0.2.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"dependencies = ["windows-targets 0.52.6",][[package]]name = "windows-result"version = "0.4.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"dependencies = ["windows-link",][[package]]name = "windows-strings"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"dependencies = ["windows-result 0.2.0","windows-targets 0.52.6",][[package]]name = "windows-strings"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"dependencies = ["windows-link",][[package]]name = "windows-sys"version = "0.45.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"dependencies = ["windows-targets 0.42.2",][[package]]name = "windows-sys"version = "0.52.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"dependencies = ["windows-targets 0.52.6",][[package]]name = "windows-sys"version = "0.59.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"dependencies = ["windows-targets 0.52.6",][[package]]name = "windows-sys"version = "0.60.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"dependencies = ["windows-targets 0.53.5",][[package]]name = "windows-sys"version = "0.61.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"dependencies = ["windows-link",][[package]]name = "windows-targets"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"dependencies = ["windows_aarch64_gnullvm 0.42.2","windows_aarch64_msvc 0.42.2","windows_i686_gnu 0.42.2","windows_i686_msvc 0.42.2","windows_x86_64_gnu 0.42.2","windows_x86_64_gnullvm 0.42.2","windows_x86_64_msvc 0.42.2",][[package]]name = "windows-targets"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"dependencies = ["windows_aarch64_gnullvm 0.52.6","windows_aarch64_msvc 0.52.6","windows_i686_gnu 0.52.6","windows_i686_gnullvm 0.52.6","windows_i686_msvc 0.52.6","windows_x86_64_gnu 0.52.6","windows_x86_64_gnullvm 0.52.6","windows_x86_64_msvc 0.52.6",][[package]]name = "windows-targets"version = "0.53.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"dependencies = ["windows-link","windows_aarch64_gnullvm 0.53.1","windows_aarch64_msvc 0.53.1","windows_i686_gnu 0.53.1","windows_i686_gnullvm 0.53.1","windows_i686_msvc 0.53.1","windows_x86_64_gnu 0.53.1","windows_x86_64_gnullvm 0.53.1","windows_x86_64_msvc 0.53.1",][[package]]name = "windows-threading"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"dependencies = ["windows-link",][[package]]name = "windows_aarch64_gnullvm"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"[[package]]name = "windows_aarch64_gnullvm"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"[[package]]name = "windows_aarch64_gnullvm"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"[[package]]name = "windows_aarch64_msvc"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"[[package]]name = "windows_aarch64_msvc"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"[[package]]name = "windows_aarch64_msvc"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"[[package]]name = "windows_i686_gnu"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"[[package]]name = "windows_i686_gnu"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"[[package]]name = "windows_i686_gnu"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"[[package]]name = "windows_i686_gnullvm"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"[[package]]name = "windows_i686_gnullvm"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"[[package]]name = "windows_i686_msvc"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"[[package]]name = "windows_i686_msvc"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"[[package]]name = "windows_i686_msvc"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"[[package]]name = "windows_x86_64_gnu"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"[[package]]name = "windows_x86_64_gnu"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"[[package]]name = "windows_x86_64_gnu"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"[[package]]name = "windows_x86_64_gnullvm"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"[[package]]name = "windows_x86_64_gnullvm"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"[[package]]name = "windows_x86_64_gnullvm"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"[[package]]name = "windows_x86_64_msvc"version = "0.42.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"[[package]]name = "windows_x86_64_msvc"version = "0.52.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"[[package]]name = "windows_x86_64_msvc"version = "0.53.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"[[package]]name = "winit"version = "0.30.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732"dependencies = ["ahash 0.8.12","android-activity","atomic-waker","bitflags 2.10.0","block2 0.5.1","bytemuck","calloop 0.13.0","cfg_aliases","concurrent-queue","core-foundation 0.9.4","core-graphics","cursor-icon","dpi","js-sys","libc","memmap2","ndk","objc2 0.5.2","objc2-app-kit 0.2.2","objc2-foundation 0.2.2","objc2-ui-kit","orbclient","percent-encoding","pin-project","raw-window-handle","redox_syscall 0.4.1","rustix 0.38.44","sctk-adwaita","smithay-client-toolkit 0.19.2","smol_str","tracing","unicode-segmentation","wasm-bindgen","wasm-bindgen-futures","wayland-backend","wayland-client","wayland-protocols","wayland-protocols-plasma","web-sys","web-time","windows-sys 0.52.0","x11-dl","x11rb","xkbcommon-dl",][[package]]name = "winnow"version = "0.7.14"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829"dependencies = ["memchr",][[package]]name = "wio"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"dependencies = ["winapi",][[package]]name = "wit-bindgen"version = "0.51.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"[[package]]name = "writeable"version = "0.6.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"[[package]]name = "wyz"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"dependencies = ["tap",][[package]]name = "x11-dl"version = "2.21.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"dependencies = ["libc","once_cell","pkg-config",][[package]]name = "x11rb"version = "0.13.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"dependencies = ["as-raw-xcb-connection","gethostname","libc","libloading","once_cell","rustix 1.1.3","x11rb-protocol",][[package]]name = "x11rb-protocol"version = "0.13.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"[[package]]name = "xcursor"version = "0.3.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b"[[package]]name = "xkbcommon-dl"version = "0.4.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"dependencies = ["bitflags 2.10.0","dlib","log","once_cell","xkeysym",][[package]]name = "xkeysym"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"[[package]]name = "xml-rs"version = "0.8.28"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"[[package]]name = "y4m"version = "0.8.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448"[[package]]name = "yahoo_finance_api"version = "4.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "fc75c0aef2fb5095c7fb103dc2aaec2d0bdeed8c4a34b2cd504f083e29f6f128"dependencies = ["reqwest 0.12.28","rust_decimal","serde","serde_json","thiserror 1.0.69","time",][[package]]name = "yazi"version = "0.2.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5"[[package]]name = "yeslogic-fontconfig-sys"version = "6.0.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd"dependencies = ["dlib","once_cell","pkg-config",][[package]]name = "yoke"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"dependencies = ["stable_deref_trait","yoke-derive","zerofrom",][[package]]name = "yoke-derive"version = "0.8.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"dependencies = ["proc-macro2","quote","syn 2.0.114","synstructure",][[package]]name = "zbus"version = "5.13.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1"dependencies = ["async-broadcast","async-executor","async-io","async-lock","async-process","async-recursion","async-task","async-trait","blocking","enumflags2","event-listener","futures-core","futures-lite","hex","libc","ordered-stream","rustix 1.1.3","serde","serde_repr","tracing","uds_windows","uuid","windows-sys 0.61.2","winnow","zbus_macros","zbus_names","zvariant",][[package]]name = "zbus_macros"version = "5.13.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1"dependencies = ["proc-macro-crate","proc-macro2","quote","syn 2.0.114","zbus_names","zvariant","zvariant_utils",][[package]]name = "zbus_names"version = "4.3.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f"dependencies = ["serde","winnow","zvariant",][[package]]name = "zeno"version = "0.3.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"[[package]]name = "zerocopy"version = "0.8.37"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7456cf00f0685ad319c5b1693f291a650eaf345e941d082fc4e03df8a03996ac"dependencies = ["zerocopy-derive",][[package]]name = "zerocopy-derive"version = "0.8.37"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1328722bbf2115db7e19d69ebcc15e795719e2d66b60827c6a69a117365e37a0"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "zerofrom"version = "0.1.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"dependencies = ["zerofrom-derive",][[package]]name = "zerofrom-derive"version = "0.1.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"dependencies = ["proc-macro2","quote","syn 2.0.114","synstructure",][[package]]name = "zeroize"version = "1.8.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"[[package]]name = "zerotrie"version = "0.2.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"dependencies = ["displaydoc","yoke","zerofrom",][[package]]name = "zerovec"version = "0.11.5"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"dependencies = ["yoke","zerofrom","zerovec-derive",][[package]]name = "zerovec-derive"version = "0.11.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"dependencies = ["proc-macro2","quote","syn 2.0.114",][[package]]name = "zmij"version = "1.0.19"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"[[package]]name = "zune-core"version = "0.4.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"[[package]]name = "zune-core"version = "0.5.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"[[package]]name = "zune-inflate"version = "0.2.54"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"dependencies = ["simd-adler32",][[package]]name = "zune-jpeg"version = "0.4.21"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"dependencies = ["zune-core 0.4.12",][[package]]name = "zune-jpeg"version = "0.5.12"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe"dependencies = ["zune-core 0.5.1",][[package]]name = "zvariant"version = "5.9.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4"dependencies = ["endi","enumflags2","serde","winnow","zvariant_derive","zvariant_utils",][[package]]name = "zvariant_derive"version = "5.9.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c"dependencies = ["proc-macro-crate","proc-macro2","quote","syn 2.0.114","zvariant_utils",][[package]]name = "zvariant_utils"version = "3.3.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9"dependencies = ["proc-macro2","quote","serde","syn 2.0.114","winnow",]
# Code of ConductI generally agree with and follow the [Rust Code of Conduct](https://www.rust-lang.org/conduct.html).
# ChangelogAll notable changes to this project will be documented in this file.The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).## Unreleased## [0.4.1]## Changed- Don't set the window size to INFINITE, so the program runs on macOS.## [0.4.0]## Changed- cargo update- Updated iced, rfd, and ron.### Removed- fs4 dependency.## [0.3.0] 2024-11-21### Added- License files.- The demo ledger to the debian package.- A copyright date.### Changed- Updated iced to version 0.13.- Only look in config local for goldapi.io.txt file.- Moved debian files into own folder.- Display fraction changed instead of dollar amount.### Removed- The links in the debian extended-description.## [0.2.0] - 2024-10-12### Changed- Breaking change: remove the checked up to date.- Breaking change: remove monthly logic.- Make shortcuts to the URLs you open for imports.- Support pasting into text boxes.- Lock the configuration file while in use.- Breaking Change: add groups.- Breaking Change: get rid of the old crypto.- Make crypto configurable.- Add configuration screen.- Add buttons: Load, Save, Check Monthly.- Use rfd.- Breaking change: Remove support for houses.- Breaking change: get rid of Stock in favor of StockPlus.- Breaking change: rename mutual_funds to stocks_plus.- Add import_investor_360().- Update boa_import to the new way BoA imports work.- Turn on clippy::{all, nursery, pedantic, cargo} and fix most lints.- Add houses and make them configurable via the configuration file.- Add mutual funds and make them configurable via the configuration file.- Add fiat currencies and make them configurable via the configuration file.- Make metals and stocks configurable via the configuration file.- Change the configuration file format to RON.- [Add stocks](https://github.com/dcampbell24/financial-accounts/commit/e54732e3819d0ca843567259dabb04b194a7f1bc).- [Move the account messages to MessageAccount](https://github.com/dcampbell24/financial-accounts/commit/56f6705caaea2fa07bb0331116c47adaa69880f4).- [Display ParseDateError](https://github.com/dcampbell24/financial-accounts/commit/3627d92a30ea5ac1d86298b04e254e61513f4d4d).- [Trim when you add a string not modify it](https://github.com/dcampbell24/financial-accounts/commit/cbc5b5ba4bfad7f497b097c17bed567936f08d91).- [Sort the accounts when you change a name](https://github.com/dcampbell24/financial-accounts/commit/351a52a8111137d8a2c99749b451a78cb91a7611).- [Get rid of Txs2nd](https://github.com/dcampbell24/financial-accounts/commit/ae7a0bfe86fec03acc177f2912afe9c872359b8c).- [Switch from markdown to djot for the man page](https://github.com/dcampbell24/financial-accounts/commit/66929e72e6c5bd0bbc0c2f447295fb02e5bf4a3b).- [Chart filtered transactions](https://github.com/dcampbell24/financial-accounts/commit/dad92faaa4b339aa0be7bf202d34d9768911fb06).- [Change ticker module to crypto module](https://github.com/dcampbell24/financial-accounts/commit/b555d6a38dfea71f4ea7a66d93232b5e1f8263db).## [0.1.3] - 2024-07-12### Added- First release![0.4.0]: https://crates.io/crates/financial-accounts/0.4.0[0.3.0]: https://crates.io/crates/financial-accounts/0.3.0[0.2.0]: https://crates.io/crates/financial-accounts/0.2.0[0.1.3]: https://crates.io/crates/financial-accounts/0.1.3
{"rust-analyzer.linkedProjects": ["./Cargo.toml"]}
{"default": true,"line-length": false,"no-duplicate-heading": false}
.git.DS_Store
/target/data.pijul
#!/bin/bash -eexport RUSTFLAGS='-D warnings'cargo fmt --all --checkcargo clippy --all-targets --all-featurescargo test --all-targets --all-features