From 6f90e4bf68472b28134818ecb10aca90172abcd2 Mon Sep 17 00:00:00 2001 From: Fiery Imp Date: Wed, 23 Apr 2025 16:34:35 -0400 Subject: [PATCH] Rust WIP --- .gitignore | 1 + rust/Cargo.lock | 4795 ++++++++++++++++++++++++++ rust/Cargo.toml | 31 + rust/assets/installerico.ico | Bin 0 -> 224725 bytes rust/src/app.rs | 246 ++ rust/src/installer/downloader.rs | 242 ++ rust/src/installer/extractor.rs | 190 + rust/src/installer/mod.rs | 5 + rust/src/installer/shortcut.rs | 64 + rust/src/installer/validator.rs | 19 + rust/src/main.rs | 51 + rust/src/ui/download_progress.rs | 23 + rust/src/ui/game_selection.rs | 38 + rust/src/ui/installation_progress.rs | 22 + rust/src/ui/mod.rs | 4 + rust/src/ui/path_selection.rs | 105 + rust/src/util/mod.rs | 1 + rust/src/util/platform.rs | 280 ++ 18 files changed, 6117 insertions(+) create mode 100644 rust/Cargo.lock create mode 100644 rust/Cargo.toml create mode 100644 rust/assets/installerico.ico create mode 100644 rust/src/app.rs create mode 100644 rust/src/installer/downloader.rs create mode 100644 rust/src/installer/extractor.rs create mode 100644 rust/src/installer/mod.rs create mode 100644 rust/src/installer/shortcut.rs create mode 100644 rust/src/installer/validator.rs create mode 100644 rust/src/main.rs create mode 100644 rust/src/ui/download_progress.rs create mode 100644 rust/src/ui/game_selection.rs create mode 100644 rust/src/ui/installation_progress.rs create mode 100644 rust/src/ui/mod.rs create mode 100644 rust/src/ui/path_selection.rs create mode 100644 rust/src/util/mod.rs create mode 100644 rust/src/util/platform.rs diff --git a/.gitignore b/.gitignore index 4714fb6..b9a2e3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ SinfarInstaller-v30.exe win32_8181.7z sinfar_all_files_v30.7z +rust/target diff --git a/rust/Cargo.lock b/rust/Cargo.lock new file mode 100644 index 0000000..5c12e31 --- /dev/null +++ b/rust/Cargo.lock @@ -0,0 +1,4795 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76eb1adf08c5bcaa8490b9851fd53cca27fa9880076f178ea9d29f05196728a8" + +[[package]] +name = "accesskit_consumer" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04bb4d9e4772fe0d47df57d0d5dbe5d85dd05e2f37ae1ddb6b105e76be58fb00" +dependencies = [ + "accesskit", +] + +[[package]] +name = "accesskit_macos" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134d0acf6acb667c89d3332999b1a5df4edbc8d6113910f392ebb73f2b03bb56" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2 0.3.0-beta.3.patch-leaks.3", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e084cb5168790c0c112626175412dc5ad127083441a8248ae49ddf6725519e83" +dependencies = [ + "accesskit", + "accesskit_consumer", + "async-channel 1.9.0", + "atspi", + "futures-lite 1.13.0", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eac0a7f2d7cd7a93b938af401d3d8e8b7094217989a7c25c55a953023436e31" +dependencies = [ + "accesskit", + "accesskit_consumer", + "arrayvec", + "once_cell", + "paste", + "windows", +] + +[[package]] +name = "accesskit_winit" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "825d23acee1bd6d25cbaa3ca6ed6e73faf24122a774ec33d52c5c86c6ab423c0" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "winit", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arboard" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" +dependencies = [ + "clipboard-win", + "log", + "objc2 0.6.1", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "percent-encoding", + "x11rb", +] + +[[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 = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.28", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling 3.7.4", + "rustix 0.38.44", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.44", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io 2.4.0", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.44", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[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.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "674e7a3376837b2e7d12d34d58ac47073c491dc3bf6f71a7adaf687d4d817faa" +dependencies = [ + "async-recursion", + "async-trait", + "atspi-macros", + "enumflags2", + "futures-lite 1.13.0", + "serde", + "tracing", + "zbus", + "zbus_names", +] + +[[package]] +name = "atspi-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb4870a32c0eaa17e35bca0e6b16020635157121fb7d45593d242c295bc768" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "calloop" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +dependencies = [ + "bitflags 1.3.2", + "log", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", +] + +[[package]] +name = "cc" +version = "1.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +dependencies = [ + "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-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[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-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "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", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[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.9.0", + "objc2 0.6.1", +] + +[[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.100", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.6", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "ecolor" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf4e52dbbb615cfd30cf5a5265335c217b5fd8d669593cea74a517d9c605af" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "eframe" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d9efede6c8905d3fc51a5ec9a506d4da4011bbcae0253d0304580fe40af3f5" +dependencies = [ + "bytemuck", + "cocoa", + "egui", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "image", + "js-sys", + "log", + "objc", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "static_assertions", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winapi", + "winit", +] + +[[package]] +name = "egui" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd69fed5fcf4fbb8225b24e80ea6193b61e17a625db105ef0c4d71dde6eb8b7" +dependencies = [ + "accesskit", + "ahash", + "epaint", + "log", + "nohash-hasher", +] + +[[package]] +name = "egui-winit" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c15479a96d9fadccf5dac690bdc6373b97b8e1c0dd28367058f25a5298da0195" +dependencies = [ + "accesskit_winit", + "arboard", + "egui", + "log", + "raw-window-handle", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6726c08798822280038bbad2e32f4fc3cbed800cd51c6e34e99cd2d60cc1bc" +dependencies = [ + "bytemuck", + "egui", + "glow", + "log", + "memoffset 0.6.5", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "emath" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ef2b29de53074e575c18b694167ccbe6e5191f7b25fe65175a0d905a32eeec0" +dependencies = [ + "bytemuck", +] + +[[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 = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "epaint" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58067b840d009143934d91d8dcb8ded054d8301d7c11a517ace0a99bb1e1595e" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "log", + "nohash-hasher", + "parking_lot", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +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 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "filetime_creation" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d273b12293b73b44ab8a525e161f74ebe2f38dd50c33ce7f538a4ccf9077383" +dependencies = [ + "cfg-if", + "filetime", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[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 = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "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.100", +] + +[[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-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[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 = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glow" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.30.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc93b03242719b8ad39fb26ed2b01737144ce7bd4bfc7adadcef806596760fe" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading 0.7.4", + "objc2 0.3.0-beta.3.patch-leaks.3", + "once_cell", + "raw-window-handle", + "wayland-sys 0.30.1", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af784eb26c5a68ec85391268e074f0aa618c096eadb5d6330b0911cf34fe57c5" +dependencies = [ + "gl_generator", + "windows-sys 0.45.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hermit-abi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "humantime" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.9", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +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", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi 0.5.0", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[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", + "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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.2", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", + "redox_syscall 0.5.11", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + +[[package]] +name = "lzma-rust" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baab2bbbd7d75a144d671e9ff79270e903957d92fb7386fd39034c709bd2661" +dependencies = [ + "byteorder", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[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.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nt-time" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e567788c00c02d8f3d554fa7c0335b08517ae3b4de6a2a4d8afa84d969a510b" +dependencies = [ + "chrono", + "time", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[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-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +dependencies = [ + "objc2-encode 4.1.0", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-graphics", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + +[[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.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[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.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.11", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[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 2.3.0", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[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 = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", +] + +[[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 0.8.24", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.50.0", +] + +[[package]] +name = "rfd" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9e7b57df6e8472152674607f6cc68aa14a748a3157a857a94f516e11aeacc2" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.37.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d7e18c1b6" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[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.100", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[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 = "sevenz-rust" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233a1e86d0c5f6c8c29808a563f1e504ca0497368251ce59dc013807f43a4659" +dependencies = [ + "bit-set", + "byteorder", + "crc", + "filetime_creation", + "js-sys", + "lzma-rust", + "nt-time", + "sha2", + "wasm-bindgen", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "sinfar-installer" +version = "0.1.0" +dependencies = [ + "anyhow", + "dirs", + "eframe", + "env_logger", + "futures-util", + "image", + "log", + "once_cell", + "reqwest", + "rfd", + "serde", + "serde_json", + "sevenz-rust", + "tokio", + "winapi", + "winreg 0.51.0", + "zip", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags 1.3.2", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.24.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit", + "wayland-client", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[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 = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand 2.3.0", + "getrandom 0.3.2", + "once_cell", + "rustix 1.0.5", + "windows-sys 0.59.0", +] + +[[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", +] + +[[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.100", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.44.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.3", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.9", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.24", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.6", +] + +[[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.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +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.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "wayland-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +dependencies = [ + "dlib", + "lazy_static", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" +dependencies = [ + "core-foundation", + "home", + "jni", + "log", + "ndk-context", + "objc", + "raw-window-handle", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-implement" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics", + "dispatch", + "instant", + "libc", + "log", + "mio 0.8.11", + "ndk", + "objc2 0.3.0-beta.3.patch-leaks.3", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "sctk-adwaita", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-commons", + "wayland-protocols", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winreg" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "gethostname", + "rustix 0.38.44", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xml-rs" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[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.100", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zip" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "deflate64", + "flate2", + "getrandom 0.3.2", + "hmac", + "indexmap", + "lzma-rs", + "memchr", + "pbkdf2", + "sha1", + "time", + "xz2", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zopfli" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] + +[[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 = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 0000000..37a7bff --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "sinfar-installer" +version = "0.1.0" +edition = "2021" +authors = ["Your Name"] +description = "Sinfar installer application" + +[dependencies] +eframe = "0.23.0" +rfd = "0.12.0" # For file dialogs +reqwest = { version = "0.11", features = ["blocking", "json", "stream"] } +tokio = { version = "1", features = ["full"] } +futures-util = "0.3" +sevenz-rust = "0.5.0" # For 7z extraction +dirs = "5.0" # For finding common directories +anyhow = "1.0" # Error handling +log = "0.4" +env_logger = "0.10" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +once_cell = "1.18" # For lazy statics +image = "0.24" # For icon handling +zip = "2.6.1" + +# Add this to handle Windows-specific dependencies +[target.'cfg(windows)'.dependencies] +winreg = "0.51" # For Windows registry access +winapi = { version = "0.3.9", features = ["winuser", "windef", "commdlg", "shellapi"] } + +[target.'cfg(unix)'.dependencies] +# Linux-specific dependencies if needed \ No newline at end of file diff --git a/rust/assets/installerico.ico b/rust/assets/installerico.ico new file mode 100644 index 0000000000000000000000000000000000000000..e990e88dffd160c7654444106f15bb0735a1c4da GIT binary patch literal 224725 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 P00000NkvXXu0mjfh>, + pub error: Option, +} + +pub struct SinfarInstallerApp<> { + pub state: InstallerState, + pub game_type: Option, + pub install_path: Option, + pub ee_exe_path: Option, + pub download_progress: f32, + pub extraction_progress: f32, + pub download_error: Option, + pub install_error: Option, + pub download_state: std::sync::Arc>, + pub eframe_ctx: Option, + pub runtime: Arc +} + +impl SinfarInstallerApp<> { + pub fn new(cc: &eframe::CreationContext<>, runtime: Arc) -> Self { + Self { + state: InstallerState::GameSelection, + game_type: Some(GameType::Diamond), + install_path: None, + ee_exe_path: None, + download_progress: 0.0, + extraction_progress: 0.0, + download_error: None, + install_error: None, + download_state: std::sync::Arc::new(std::sync::Mutex::new(DownloadState::default())), + eframe_ctx: None, + runtime, // Store the runtime + } + } + + fn next_state(&mut self) { + self.state = match self.state { + InstallerState::GameSelection => InstallerState::PathSelection, + InstallerState::PathSelection => InstallerState::Download, + InstallerState::Download => InstallerState::Installing, + InstallerState::Installing => InstallerState::Complete, + InstallerState::Complete => return, + }; + } + + fn previous_state(&mut self) { + self.state = match self.state { + InstallerState::GameSelection => return, + InstallerState::PathSelection => InstallerState::GameSelection, + InstallerState::Download => InstallerState::PathSelection, + InstallerState::Installing => return, // Can't go back during installation + InstallerState::Complete => return, + }; + } +} + +impl<> eframe::App for SinfarInstallerApp<> { + fn update(&mut self, ctx: &egui::Context, _frame: &mut Frame) { + self.eframe_ctx = Some(ctx.clone()); + + if self.state == InstallerState::Download { + if let Ok(state) = self.download_state.lock() { + self.download_progress = state.progress; + + // if state.completed { + // if let Some(files) = &state.files { + // // Store the files for installation + // //self.next_state(); // Proceed to installation + // //self.start_installation(); + // } + // } + + if let Some(error) = &state.error { + self.download_error = Some(error.clone()); + } + } + } + + egui::CentralPanel::default().show(ctx, |ui| { + ui.vertical_centered(|ui| { + ui.heading("Sinfar NWN Custom Content Installer"); + ui.add_space(10.0); + + match self.state { + InstallerState::GameSelection => { + game_selection::render(ui, self); + }, + InstallerState::PathSelection => { + path_selection::render(ui, self); + }, + InstallerState::Download => { + download_progress::render(ui, self); + }, + InstallerState::Installing => { + installation_progress::render(ui, self); + }, + InstallerState::Complete => { + ui.label("Installation complete!"); + ui.label("Launch the game from the desktop shortcut to start playing."); + + if ui.button("Close").clicked() { + std::process::exit(0); + } + }, + } + }); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::RIGHT), |ui| { + ui.horizontal(|ui| { + + let can_continue = match self.state { + InstallerState::GameSelection => self.game_type.is_some(), + InstallerState::PathSelection => { + match self.game_type { + Some(GameType::Diamond) => validator::validate_diamond_path(self.install_path.as_ref().unwrap()), + Some(GameType::EnhancedEdition) =>{ + validator::validate_ee_path(self.install_path.as_ref().unwrap()) && + validator::validate_ee_exe_path(self.ee_exe_path.as_ref().unwrap()) + }, + None => false, + } + }, + _ => true, + }; + + if self.state != InstallerState::Installing && self.state != InstallerState::Complete { + if ui.add_enabled(can_continue, egui::Button::new("Next")).clicked() { + self.next_state(); + if self.state == InstallerState::Download { + self.start_download(); + } else if self.state == InstallerState::Installing { + self.start_installation(); + } + } + + if self.state != InstallerState::GameSelection { + if ui.button("Back").clicked() { + self.previous_state(); + } + } + } + }); + }); + }); + } +} + +// Implementation of key installer functions +impl SinfarInstallerApp<> { + pub fn start_download(&mut self) { + + // let temp_dir = std::env::temp_dir().join("sinfar_installer"); + // println!("{}", temp_dir.display()) + + // Reset progress and errors + self.download_progress = 0.0; + self.download_error = None; + + // Initialize download state + let download_state = std::sync::Arc::new(std::sync::Mutex::new(DownloadState::default())); + self.download_state = download_state.clone(); + + // Clone the game type for the async closure + let game_type = self.game_type.clone().unwrap(); + + // Create a context handle for requesting UI updates + let ctx = eframe::egui::Context::clone(self.eframe_ctx.as_ref().unwrap()); + let repaint_ctx_progress = ctx.clone(); + let repaint_ctx_complete = ctx.clone(); + + // Spawn the download task + self.runtime.spawn(async move { + // Create a download manager with progress callback + let progress_state = download_state.clone(); + + let manager = DownloadManager::new(move |progress, _file| { + // Update progress through shared state + if let Ok(mut state) = progress_state.lock() { + state.progress = progress; + repaint_ctx_progress.request_repaint(); + } + }); + + // Start the download process + match manager.download_all_files(&game_type).await { + Ok(files) => { + // Mark download as complete with the files + if let Ok(mut state) = download_state.lock() { + state.completed = true; + state.files = Some(files); + repaint_ctx_complete.request_repaint(); + } + } + Err(e) => { + // Record the error + if let Ok(mut state) = download_state.lock() { + state.error = Some(format!("Download failed: {}", e)); + ctx.request_repaint(); + } + } + } + }); + } + + pub fn start_installation(&mut self) { + + + // This would be spawned in a separate thread + //let game_type = self.game_type.clone().unwrap(); + //let install_path = self.install_path.clone().unwrap(); + //let ee_exe_path = self.ee_exe_path.clone(); + + // Implementation with sevenz-rust would go here + // Update self.extraction_progress as files are extracted + } +} \ No newline at end of file diff --git a/rust/src/installer/downloader.rs b/rust/src/installer/downloader.rs new file mode 100644 index 0000000..0458aaf --- /dev/null +++ b/rust/src/installer/downloader.rs @@ -0,0 +1,242 @@ +// src/installer/downloader.rs +use anyhow::{Result, Context, anyhow}; +use reqwest::Client; +use tokio::io::AsyncWriteExt; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::time::Duration; +use futures_util::StreamExt; +use tokio::sync::Mutex; +use std::fs::metadata; +use reqwest::header::{HeaderMap, HeaderValue, RANGE, USER_AGENT}; +use log::{info, warn, error}; +use tokio::fs::File; +use crate::app::{GameType}; + +pub struct DownloadManager { + client: Client, + progress_callback: Arc>>, + temp_dir: PathBuf, +} + +impl DownloadManager { + pub fn new(progress_callback: F) -> Self + where + F: Fn(f32, &str) + Send + Sync + 'static + { + let client = Client::builder() + .timeout(Duration::from_secs(1800)) + .build() + .unwrap_or_default(); + + let temp_dir = std::env::temp_dir().join("sinfar_installer"); + println!("Files will be downloaded to: {}", temp_dir.display()); + // Ensure temp directory exists + if !temp_dir.exists() { + if let Err(e) = std::fs::create_dir_all(&temp_dir) { + warn!("Failed to create temp directory: {}", e); + } + } + + Self { + client, + progress_callback: Arc::new(Mutex::new(Box::new(progress_callback))), + temp_dir, + } + } + + /// Downloads a file with resume capability and progress tracking + pub async fn download_file(&self, url: &str, output_path: &Path) -> Result<()> { + info!("Starting download of {} to {}", url, output_path.display()); + + // Create parent directories if they don't exist + if let Some(parent) = output_path.parent() { + if !parent.exists() { + tokio::fs::create_dir_all(parent).await?; + } + } + + // Check if we can resume a previous download + let mut headers = HeaderMap::new(); + headers.insert(USER_AGENT, HeaderValue::from_static("Sinfar NWN Installer")); + + let mut downloaded_size: u64 = 0; + + if output_path.exists() { + if let Ok(metadata) = tokio::fs::metadata(output_path).await { + downloaded_size = metadata.len(); + if downloaded_size > 0 { + info!("Resuming download from byte {}", downloaded_size); + headers.insert(RANGE, HeaderValue::from_str(&format!("bytes={}-", downloaded_size))?); + } + } + } + + let response = self.client.get(url) + .headers(headers) + .send() + .await + .context("Failed to send HTTP request")?; + + // Check if the server supports resuming + let can_resume = response.status().is_success() && response.status().as_u16() == 206; + let status = response.status(); + + if !status.is_success() { + return Err(anyhow!("Server returned error status: {}", status)); + } + + // Get total file size + let content_length = if can_resume { + if let Some(content_range) = response.headers().get("content-range") { + let range_str = content_range.to_str().unwrap_or(""); + if let Some(size_part) = range_str.split('/').nth(1) { + size_part.parse::().unwrap_or(0) + } else { + response.content_length().unwrap_or(0) + downloaded_size + } + } else { + response.content_length().unwrap_or(0) + downloaded_size + } + } else { + response.content_length().unwrap_or(0) + }; + + info!("Download size: {} bytes", content_length); + + // Open file in appropriate mode (append if resuming, create/truncate if starting fresh) + let mut file = if can_resume && downloaded_size > 0 { + info!("Opening file for append"); + tokio::fs::OpenOptions::new() + .write(true) + .append(true) + .open(output_path) + .await? + } else { + info!("Creating new file"); + downloaded_size = 0; + tokio::fs::File::create(output_path).await? + }; + + // Stream the response + let mut stream = response.bytes_stream(); + let progress_callback = self.progress_callback.clone(); + let filename = output_path.file_name() + .and_then(|f| f.to_str()) + .unwrap_or("file"); + + let mut last_update = std::time::Instant::now(); + + while let Some(chunk_result) = stream.next().await { + let chunk = chunk_result?; + file.write_all(&chunk).await?; + + downloaded_size += chunk.len() as u64; + + // Only update progress every 100ms to avoid overwhelming the UI + let now = std::time::Instant::now(); + if now.duration_since(last_update) > Duration::from_millis(100) || content_length == downloaded_size { + if content_length > 0 { + let progress = downloaded_size as f32 / content_length as f32; + let callback = progress_callback.lock().await; + callback(progress, filename); + } + last_update = now; + } + } + + info!("Download completed: {}", output_path.display()); + Ok(()) + } + + /// Downloads all required files for the installation + pub async fn download_all_files(&self, game_type: &GameType) -> Result> { + let mut downloaded_files = Vec::new(); + + // Always download the content files + let content_zip_path = self.temp_dir.join("sinfar_all_files_v30.7z"); + + // Check if file already exists and is of expected size + if !self.file_exists_with_size(&content_zip_path, 100_000_000) { + // File doesn't exist or is too small, download it + self.download_file( + "https://sinfar.net/haks/sinfar_all_files_v30.7z", + &content_zip_path + ).await?; + } else { + // File exists, update progress to 100% + let callback = self.progress_callback.lock().await; + callback(1.0, "sinfar_all_files_v30.7z"); + } + + downloaded_files.push(content_zip_path); + + // Download version-specific files + if *game_type == GameType::Diamond { + let launcher_path = self.temp_dir.join("sinfarx.exe"); + + if !self.file_exists_with_size(&launcher_path, 10_000) { + self.download_file( + "https://nwn.sinfar.net/files/sinfarx.exe", + &launcher_path + ).await?; + } else { + let callback = self.progress_callback.lock().await; + callback(1.0, "sinfarx.exe"); + } + + downloaded_files.push(launcher_path); + } else if *game_type == GameType::EnhancedEdition { + // For EE, download the appropriate launcher for the platform + #[cfg(windows)] + { + let launcher_zip_path = self.temp_dir.join("sinfarLauncher.zip"); + + if !self.file_exists_with_size(&launcher_zip_path, 10_000) { + self.download_file( + "https://nwn.sinfar.net/files/sinfarx/8181/win32_8181.zip", + &launcher_zip_path + ).await?; + } else { + let callback = self.progress_callback.lock().await; + callback(1.0, "sinfarLauncher.zip"); + } + + downloaded_files.push(launcher_zip_path); + } + + #[cfg(unix)] + { + let launcher_zip_path = self.temp_dir.join("sinfarLauncher.zip"); + + if !self.file_exists_with_size(&launcher_zip_path, 10_000) { + self.download_file( + "https://nwn.sinfar.net/files/sinfarx/8181/linux_8181.zip", + &launcher_zip_path + ).await?; + } else { + let callback = self.progress_callback.lock().await; + callback(1.0, "sinfarLauncher.zip"); + } + + downloaded_files.push(launcher_zip_path); + } + } + + Ok(downloaded_files) + } + + /// Check if a file exists and meets a minimum size requirement + fn file_exists_with_size(&self, path: &Path, min_size: u64) -> bool { + if let Ok(meta) = metadata(path) { + meta.is_file() && meta.len() >= min_size + } else { + false + } + } + + /// Get the path to the temporary directory + pub fn get_temp_dir(&self) -> &Path { + &self.temp_dir + } +} \ No newline at end of file diff --git a/rust/src/installer/extractor.rs b/rust/src/installer/extractor.rs new file mode 100644 index 0000000..5275ccd --- /dev/null +++ b/rust/src/installer/extractor.rs @@ -0,0 +1,190 @@ +// src/installer/extractor.rs +use anyhow::{Result, Context}; +use sevenz_rust::{Archive, BlockDecoder, decompress}; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use tokio::sync::Mutex; +use log::{info, warn, error}; +use std::fs; +use std::io::{Read, Write}; +use std::collections::HashMap; + +pub struct ExtractionManager { + progress_callback: Arc>>, +} + +impl ExtractionManager { + pub fn new(progress_callback: F) -> Self + where + F: Fn(f32, &str) + Send + Sync + 'static + { + Self { + progress_callback: Arc::new(Mutex::new(Box::new(progress_callback))), + } + } + + /// Extract a 7z archive with progress reporting + pub async fn extract_7z(&self, archive_path: &Path, output_dir: &Path) -> Result<()> { + info!("Extracting 7z archive: {} -> {}", archive_path.display(), output_dir.display()); + + // Make sure the output directory exists + if !output_dir.exists() { + tokio::fs::create_dir_all(output_dir).await?; + } + + // Get file size for progress calculation + let file_size = fs::metadata(archive_path)?.len(); + + // We'll handle extraction in a blocking task since sevenz-rust is synchronous + let archive_path = archive_path.to_path_buf(); + let output_dir = output_dir.to_path_buf(); + let progress_callback = self.progress_callback.clone(); + + tokio::task::spawn_blocking(move || -> Result<()> { + let archive_file = fs::File::open(&archive_path)?; + let out = fs::create_dir_all(&output_dir)?; + + // decompress takes a Read + Seek and a destination directory + decompress(&archive_file, &output_dir)?; + + // Call progress update with 100% after decompression + let filename = archive_path.file_name() + .and_then(|f| f.to_str()) + .unwrap_or("archive"); + + let progress_callback_clone = progress_callback.clone(); + tokio::runtime::Handle::current().block_on(async move { + let callback = progress_callback_clone.lock().await; + callback(1.0, filename); // 100% done + }); + + Ok(()) + }).await??; + + Ok(()) + } + + /// Extract a ZIP archive with progress reporting + pub async fn extract_zip(&self, archive_path: &Path, output_dir: &Path) -> Result<()> { + info!("Extracting ZIP archive: {} -> {}", archive_path.display(), output_dir.display()); + + // Make sure the output directory exists + if !output_dir.exists() { + tokio::fs::create_dir_all(output_dir).await?; + } + + // We'll handle extraction in a blocking task since the zip crate is synchronous + let archive_path = archive_path.to_path_buf(); + let output_dir = output_dir.to_path_buf(); + let progress_callback = self.progress_callback.clone(); + + tokio::task::spawn_blocking(move || -> Result<()> { + let file = fs::File::open(&archive_path)?; + let mut archive = zip::ZipArchive::new(file)?; + + let total_entries = archive.len(); + info!("ZIP archive contains {} entries", total_entries); + + for i in 0..total_entries { + let mut file = archive.by_index(i)?; + let outpath = match file.enclosed_name() { + Some(path) => output_dir.join(path), + None => continue, + }; + + // Update progress + let progress = (i + 1) as f32 / total_entries as f32; + let filename = outpath.file_name() + .and_then(|f| f.to_str()) + .unwrap_or("unknown"); + + if (*file.name()).ends_with('/') { + fs::create_dir_all(&outpath)?; + } else { + if let Some(p) = outpath.parent() { + if !p.exists() { + fs::create_dir_all(p)?; + } + } + let mut outfile = fs::File::create(&outpath)?; + std::io::copy(&mut file, &mut outfile)?; + } + + // Fix file permissions on Unix + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + if let Some(mode) = file.unix_mode() { + fs::set_permissions(&outpath, fs::Permissions::from_mode(mode))?; + } + } + + // Update progress on the tokio runtime + let progress_callback_clone = progress_callback.clone(); + tokio::runtime::Handle::current().block_on(async move { + let callback = progress_callback_clone.lock().await; + callback(progress, filename); + }); + } + + info!("ZIP extraction completed successfully"); + Ok(()) + }).await??; + + Ok(()) + } + + /// Handles extraction of all downloaded files to their appropriate locations + pub async fn install_all_files( + &self, + downloaded_files: &[PathBuf], + install_path: &Path, + game_type: &str, + ee_exe_path: Option<&Path> + ) -> Result<()> { + // Find and extract the main content files + let content_archive = downloaded_files.iter() + .find(|p| p.file_name().map_or(false, |f| f.to_str().unwrap_or("").contains("sinfar_all_files"))) + .context("Content archive not found in downloaded files")?; + + // Extract main content + self.extract_7z(content_archive, install_path).await?; + + // Handle game-specific files + if game_type.to_lowercase() == "diamond" { + // For Diamond, find and copy the launcher + let launcher = downloaded_files.iter() + .find(|p| p.file_name().map_or(false, |f| f.to_str().unwrap_or("").contains("sinfarx.exe"))) + .context("Launcher executable not found in downloaded files")?; + + // Copy launcher to install directory + let target_path = install_path.join("sinfarx.exe"); + tokio::fs::copy(launcher, &target_path).await?; + + } else if game_type.to_lowercase() == "enhancededition" || game_type.to_lowercase() == "ee" { + // For EE, find the launcher zip + let launcher_zip = downloaded_files.iter() + .find(|p| p.file_name().map_or(false, |f| f.to_str().unwrap_or("").contains("sinfarLauncher.zip"))) + .context("Launcher ZIP not found in downloaded files")?; + + // Extract to the EE executable directory + if let Some(ee_path) = ee_exe_path { + // Create the bin/win32_8181 directory if it doesn't exist (Windows) + // or bin/linux_8181 directory (Linux) + #[cfg(windows)] + let extract_dir = ee_path.join("bin").join("win32_8181"); + + #[cfg(unix)] + let extract_dir = ee_path.join("bin").join("linux_8181"); + + // Extract the launcher + self.extract_zip(launcher_zip, &extract_dir).await?; + } else { + return Err(anyhow::anyhow!("EE executable path is required for EE installation")); + } + } + + info!("All files installed successfully"); + Ok(()) + } +} \ No newline at end of file diff --git a/rust/src/installer/mod.rs b/rust/src/installer/mod.rs new file mode 100644 index 0000000..cd7efc6 --- /dev/null +++ b/rust/src/installer/mod.rs @@ -0,0 +1,5 @@ +pub mod downloader; +pub mod downloaderv2; +pub mod extractor; +pub mod validator; +pub mod shortcut; \ No newline at end of file diff --git a/rust/src/installer/shortcut.rs b/rust/src/installer/shortcut.rs new file mode 100644 index 0000000..fa65534 --- /dev/null +++ b/rust/src/installer/shortcut.rs @@ -0,0 +1,64 @@ +pub mod shortcut { + use std::path::{Path, PathBuf}; + use std::io::Write; + use anyhow::Result; + + pub fn create_shortcut( + target_path: &Path, + shortcut_name: &str, + icon_path: Option<&Path>, + ) -> Result<()> { + #[cfg(windows)] + { + use std::os::windows::process::CommandExt; + use std::process::Command; + + let desktop_path = dirs::desktop_dir().unwrap_or_else(|| PathBuf::from(".")); + let shortcut_path = desktop_path.join(format!("{}.lnk", shortcut_name)); + + let powershell_command = format!( + "$s = (New-Object -ComObject WScript.Shell).CreateShortcut('{}'); $s.TargetPath = '{}'; {}; $s.Save()", + shortcut_path.to_string_lossy(), + target_path.to_string_lossy(), + if let Some(icon) = icon_path { + format!("$s.IconLocation = '{}'", icon.to_string_lossy()) + } else { + String::new() + } + ); + + Command::new("powershell") + .args(["-Command", &powershell_command]) + .creation_flags(0x08000000) // CREATE_NO_WINDOW + .output()?; + } + + #[cfg(unix)] + { + let desktop_path = dirs::desktop_dir().unwrap_or_else(|| PathBuf::from(".")); + let shortcut_path = desktop_path.join(format!("{}.desktop", shortcut_name)); + + let mut desktop_file = std::fs::File::create(shortcut_path)?; + + writeln!(desktop_file, "[Desktop Entry]")?; + writeln!(desktop_file, "Type=Application")?; + writeln!(desktop_file, "Name={}", shortcut_name)?; + writeln!(desktop_file, "Exec={}", target_path.to_string_lossy())?; + if let Some(icon) = icon_path { + writeln!(desktop_file, "Icon={}", icon.to_string_lossy())?; + } + writeln!(desktop_file, "Terminal=false")?; + + // Make the .desktop file executable + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mut perms = std::fs::metadata(&shortcut_path)?.permissions(); + perms.set_mode(0o755); + std::fs::set_permissions(&shortcut_path, perms)?; + } + } + + Ok(()) + } +} \ No newline at end of file diff --git a/rust/src/installer/validator.rs b/rust/src/installer/validator.rs new file mode 100644 index 0000000..aac86d2 --- /dev/null +++ b/rust/src/installer/validator.rs @@ -0,0 +1,19 @@ +pub mod validator { + use std::path::Path; + + pub fn validate_diamond_path(path: &Path) -> bool { + path.join("tlk").exists() && path.join("hak").exists() + } + + pub fn validate_ee_path(path: &Path) -> bool { + path.join("tlk").exists() && path.join("hak").exists() + } + + pub fn validate_ee_exe_path(path: &Path) -> bool { + #[cfg(windows)] + return path.join("bin").join("win32").exists(); + + #[cfg(unix)] + return path.join("bin").join("linux-x86").exists() || path.join("bin").join("linux-x86_64").exists(); + } +} \ No newline at end of file diff --git a/rust/src/main.rs b/rust/src/main.rs new file mode 100644 index 0000000..49d0b47 --- /dev/null +++ b/rust/src/main.rs @@ -0,0 +1,51 @@ +use eframe::{NativeOptions, run_native, App}; +use log::info; +use tokio::runtime::Runtime; +use std::sync::Arc; +use eframe::IconData; + +mod app; +mod ui; +mod installer; +//mod util; + +fn main() { + env_logger::init(); + info!("Starting Sinfar NWN Custom Content Installer"); + + let rt = Runtime::new().expect("Failed to create Tokio runtime"); + let rt = Arc::new(rt); + + let options = NativeOptions { + initial_window_size: Some(eframe::egui::vec2(600.0, 400.0)), + resizable: false, + icon_data: load_icon(), + ..Default::default() + }; + + let app_rt = rt.clone(); + run_native( + "Sinfar NWN Custom Content Installer", + options, + Box::new(move |cc| Box::new(app::SinfarInstallerApp::new(cc, app_rt.clone()))), + ).expect("Failed to start application"); +} + +fn load_icon() -> Option { + #[cfg(feature = "embed_icon")] + { + let icon_bytes = include_bytes!("../assets/installerico.ico"); + // Convert ico to rgba data + match image::load_from_memory(icon_bytes) { + Ok(image) => { + let image_rgba = image.to_rgba8(); + let (width, height) = image_rgba.dimensions(); + let rgba = image_rgba.into_raw(); + Some(eframe::IconData { rgba, width, height }) + }, + Err(_) => None, + } + } + #[cfg(not(feature = "embed_icon"))] + None +} \ No newline at end of file diff --git a/rust/src/ui/download_progress.rs b/rust/src/ui/download_progress.rs new file mode 100644 index 0000000..3597244 --- /dev/null +++ b/rust/src/ui/download_progress.rs @@ -0,0 +1,23 @@ +pub mod download_progress { + use eframe::egui::{Ui, ProgressBar}; + use crate::app::SinfarInstallerApp; + + pub fn render(ui: &mut Ui, app: &mut SinfarInstallerApp) { + ui.heading("Downloading Sinfar Custom Content"); + ui.add_space(10.0); + + ui.horizontal(|ui| { + ui.label("Downloading:"); + ui.add(ProgressBar::new(app.download_progress).show_percentage()); + }); + + if let Some(error) = &app.download_error { + ui.colored_label(eframe::egui::Color32::RED, format!("Error: {}", error)); + if ui.button("Retry").clicked() { + app.download_error = None; + app.download_progress = 0.0; + app.start_download(); + } + } + } +} \ No newline at end of file diff --git a/rust/src/ui/game_selection.rs b/rust/src/ui/game_selection.rs new file mode 100644 index 0000000..5744d78 --- /dev/null +++ b/rust/src/ui/game_selection.rs @@ -0,0 +1,38 @@ +pub mod game_selection { + use eframe::egui::Ui; + use crate::app::{SinfarInstallerApp, GameType}; + use std::sync::Once; + + static INIT: Once = Once::new(); + + pub fn render(ui: &mut Ui, app: &mut SinfarInstallerApp) { + INIT.call_once(|| { + print_selected_game_type(&app.game_type); + }); + + ui.heading("Select your game's version:"); + ui.add_space(10.0); + + ui.vertical(|ui| { + if ui.radio_value(&mut app.game_type, Some(GameType::Diamond), "Neverwinter Nights Diamond Edition").clicked() { + // Handle selection + print_selected_game_type(&app.game_type); + } + + if ui.radio_value(&mut app.game_type, Some(GameType::EnhancedEdition), "Neverwinter Nights: Enhanced Edition").clicked() { + // Handle selection + print_selected_game_type(&app.game_type); + } + }); + } + + fn print_selected_game_type(game_type: &Option){ + match game_type { + Some(game_type_ref) => match game_type_ref { + GameType::Diamond => println!("Diamond Edition selected"), + GameType::EnhancedEdition => println!("Enhanced Edition selected"), + }, + None => println!("No game selected. (If you see this.. you fucked up.)"), + } + } +} \ No newline at end of file diff --git a/rust/src/ui/installation_progress.rs b/rust/src/ui/installation_progress.rs new file mode 100644 index 0000000..9d512ce --- /dev/null +++ b/rust/src/ui/installation_progress.rs @@ -0,0 +1,22 @@ +pub mod installation_progress { + use eframe::egui::{Ui, ProgressBar}; + use crate::app::SinfarInstallerApp; + + pub fn render(ui: &mut Ui, app: &mut SinfarInstallerApp) { + ui.heading("Installing Sinfar Custom Content"); + ui.add_space(10.0); + + ui.horizontal(|ui| { + ui.label("Extracting files:"); + ui.add(ProgressBar::new(app.extraction_progress).show_percentage()); + }); + + if let Some(error) = &app.install_error { + ui.colored_label(eframe::egui::Color32::RED, error); + if ui.button("Retry").clicked() { + app.install_error = None; + app.start_installation(); + } + } + } +} \ No newline at end of file diff --git a/rust/src/ui/mod.rs b/rust/src/ui/mod.rs new file mode 100644 index 0000000..2c4beb7 --- /dev/null +++ b/rust/src/ui/mod.rs @@ -0,0 +1,4 @@ +pub mod game_selection; +pub mod path_selection; +pub mod download_progress; +pub mod installation_progress; \ No newline at end of file diff --git a/rust/src/ui/path_selection.rs b/rust/src/ui/path_selection.rs new file mode 100644 index 0000000..04951e3 --- /dev/null +++ b/rust/src/ui/path_selection.rs @@ -0,0 +1,105 @@ +pub mod path_selection { + use eframe::egui::{Ui, TextEdit}; + use crate::app::{SinfarInstallerApp, GameType}; + use crate::installer::validator::*; + + use rfd::FileDialog; + use std::path::PathBuf; + + pub fn render(ui: &mut Ui, app: &mut SinfarInstallerApp) { + ui.heading("Select installation paths"); + ui.add_space(10.0); + + // Set default paths if not set + if app.install_path.is_none() { + app.install_path = Some(default_install_path(&app.game_type.clone().unwrap_or(GameType::Diamond))); + } + + if app.game_type == Some(GameType::EnhancedEdition) && app.ee_exe_path.is_none() { + app.ee_exe_path = Some(default_ee_exe_path()); + } + + ui.label("Please select your Neverwinter Nights install folder:"); + + ui.horizontal(|ui| { + let mut path_str = app.install_path.clone().unwrap_or_default().to_string_lossy().to_string(); + let response = ui.add(TextEdit::singleline(&mut path_str).desired_width(ui.available_width() - 80.0)); + if response.changed() { + app.install_path = Some(PathBuf::from(path_str)); + } + + if ui.button("Browse...").clicked() { + if let Some(path) = FileDialog::new() + .set_title("Select Neverwinter Nights Folder") + .set_directory(app.install_path.clone().unwrap_or_default()) + .pick_folder() { + app.install_path = Some(path); + } + } + }); + + let is_content_path_valid = match &app.game_type { + Some(GameType::Diamond) => validator::validate_diamond_path(app.install_path.as_ref().unwrap()), + Some(GameType::EnhancedEdition) => validator::validate_ee_path(app.install_path.as_ref().unwrap()), + None => false, + }; + + if !is_content_path_valid { + ui.colored_label(eframe::egui::Color32::RED, "Invalid path: The selected folder must contain both 'tlk' and 'hak' subfolders."); + } + + // Only show EE path selection if EE is selected + if app.game_type == Some(GameType::EnhancedEdition) { + ui.add_space(10.0); + ui.label("Select the location of the nwn executable for Enhanced Edition:"); + + ui.horizontal(|ui| { + let mut ee_path_str = app.ee_exe_path.clone().unwrap_or_default().to_string_lossy().to_string(); + let response = ui.add(TextEdit::singleline(&mut ee_path_str).desired_width(ui.available_width() - 80.0)); + if response.changed() { + app.ee_exe_path = Some(PathBuf::from(ee_path_str)); + } + + if ui.button("Browse...").clicked() { + if let Some(path) = FileDialog::new() + .set_title("Select Neverwinter Nights executable location") + .set_directory(app.ee_exe_path.clone().unwrap_or_default()) + .pick_folder() { + app.ee_exe_path = Some(path); + } + } + }); + + if !validator::validate_ee_exe_path(app.ee_exe_path.as_ref().unwrap()) { + ui.colored_label(eframe::egui::Color32::RED, "Invalid path: Neverwinter Night EE not detected."); + } + } + } + + fn default_install_path(game_type: &GameType) -> PathBuf { + match game_type { + GameType::Diamond => { + #[cfg(windows)] + return PathBuf::from("C:\\Program Files (x86)\\GOG Galaxy\\Games\\NWN Diamond"); + + #[cfg(unix)] + return PathBuf::from("/home").join(whoami::username()).join(".local/share/NWN Diamond"); + }, + GameType::EnhancedEdition => { + #[cfg(windows)] + return PathBuf::from(dirs::document_dir().unwrap_or_default()).join("Neverwinter Nights"); + + #[cfg(unix)] + return PathBuf::from("/home").join(whoami::username()).join(".local/share/Neverwinter Nights"); + }, + } + } + + fn default_ee_exe_path() -> PathBuf { + #[cfg(windows)] + return PathBuf::from("C:\\Program Files (x86)\\GOG Galaxy\\Games\\Neverwinter Nights Enhanced Edition"); + + #[cfg(unix)] + return PathBuf::from("/home").join(whoami::username()).join(".local/share/Steam/steamapps/common/Neverwinter Nights"); + } +} \ No newline at end of file diff --git a/rust/src/util/mod.rs b/rust/src/util/mod.rs new file mode 100644 index 0000000..7ddff28 --- /dev/null +++ b/rust/src/util/mod.rs @@ -0,0 +1 @@ +pub mod platform; \ No newline at end of file diff --git a/rust/src/util/platform.rs b/rust/src/util/platform.rs new file mode 100644 index 0000000..15cdbf2 --- /dev/null +++ b/rust/src/util/platform.rs @@ -0,0 +1,280 @@ +// src/util/platform.rs +use std::path::{Path, PathBuf}; +use anyhow::Result; + +/// Platform-agnostic function to get the user's documents directory +pub fn get_documents_dir() -> Option { + dirs::document_dir() +} + +/// Get the default installation directory for NWN based on platform +pub fn get_default_nwn_dir(is_ee: bool) -> PathBuf { + if is_ee { + #[cfg(windows)] + { + if let Some(docs) = get_documents_dir() { + return docs.join("Neverwinter Nights"); + } else { + return PathBuf::from("C:\\Users\\Public\\Documents\\Neverwinter Nights"); + } + } + + #[cfg(unix)] + { + if let Some(home) = dirs::home_dir() { + return home.join(".local/share/Neverwinter Nights"); + } else { + return PathBuf::from("/home").join(whoami::username()).join(".local/share/Neverwinter Nights"); + } + } + } else { + // Diamond Edition + #[cfg(windows)] + { + // Try common installation paths for GOG and Steam + let gog_path = PathBuf::from("C:\\Program Files (x86)\\GOG Galaxy\\Games\\NWN Diamond"); + if gog_path.exists() { + return gog_path; + } + + let steam_path = PathBuf::from("C:\\Program Files (x86)\\Steam\\steamapps\\common\\NWN Diamond"); + if steam_path.exists() { + return steam_path; + } + + // Default to GOG path even if it doesn't exist + return gog_path; + } + + #[cfg(unix)] + { + if let Some(home) = dirs::home_dir() { + // Check common Linux installation locations + let steam_path = home.join(".steam/steam/steamapps/common/NWN Diamond"); + if steam_path.exists() { + return steam_path; + } + + let gog_path = home.join("GOG Games/NWN Diamond"); + if gog_path.exists() { + return gog_path; + } + + return home.join(".local/share/NWN Diamond"); + } else { + return PathBuf::from("/home").join(whoami::username()).join(".local/share/NWN Diamond"); + } + } + } +} + +/// Get the executable name with the correct extension based on platform +pub fn get_executable_name(base_name: &str) -> String { + #[cfg(windows)] + return format!("{}.exe", base_name); + + #[cfg(unix)] + return base_name.to_string(); +} + +/// Check if we need elevated permissions for a path +pub fn needs_elevation(path: &Path) -> bool { + #[cfg(windows)] + { + // Common paths that typically need elevation on Windows + path.to_string_lossy().to_lowercase().contains("program files") || + path.to_string_lossy().to_lowercase().contains("programfiles") || + path.to_string_lossy().to_lowercase().contains("\\windows\\") + } + + #[cfg(unix)] + { + // Common paths that typically need elevation on Linux + path.to_string_lossy().starts_with("/usr") || + path.to_string_lossy().starts_with("/opt") || + path.to_string_lossy().starts_with("/bin") || + path.to_string_lossy().starts_with("/sbin") + } +} + +/// Request elevated permissions +pub fn request_elevation() -> Result { + #[cfg(windows)] + { + use std::process::Command; + use std::env; + + let executable = env::current_exe()?; + + // Don't try to re-elevate if we're already elevated + if is_elevated()? { + return Ok(true); + } + + // Use the Windows ShellExecute to prompt for elevation + let result = Command::new("powershell") + .args(&[ + "-Command", + &format!("Start-Process -FilePath '{}' -Verb RunAs", executable.to_string_lossy()), + ]) + .output()?; + + // If the command executed successfully, exit the current non-elevated process + if result.status.success() { + std::process::exit(0); + } + + Ok(false) + } + + #[cfg(unix)] + { + use std::process::Command; + use std::env; + + let executable = env::current_exe()?; + + // Don't try to re-elevate if we're already elevated + if is_elevated()? { + return Ok(true); + } + + // Try pkexec first (GNOME/KDE) + if Command::new("which").arg("pkexec").output()?.status.success() { + let _ = Command::new("pkexec") + .arg(executable) + .spawn()?; + std::process::exit(0); + } + + // Try gksudo next (older GNOME) + if Command::new("which").arg("gksudo").output()?.status.success() { + let _ = Command::new("gksudo") + .arg("--") + .arg(executable) + .spawn()?; + std::process::exit(0); + } + + // Try kdesudo (KDE) + if Command::new("which").arg("kdesudo").output()?.status.success() { + let _ = Command::new("kdesudo") + .arg("--") + .arg(executable) + .spawn()?; + std::process::exit(0); + } + + // Fallback to terminal-based sudo + if Command::new("which").arg("sudo").output()?.status.success() { + let _ = Command::new("sudo") + .arg(executable) + .spawn()?; + std::process::exit(0); + } + + Ok(false) + } +} + +/// Check if the current process has elevated permissions +pub fn is_elevated() -> Result { + #[cfg(windows)] + { + use std::process::Command; + + // This command succeeds only if the process has admin privileges + let output = Command::new("net") + .args(&["session"]) + .output()?; + + Ok(output.status.success()) + } + + #[cfg(unix)] + { + // On Unix-like systems, check if we're root (uid 0) + Ok(unsafe { libc::geteuid() == 0 }) + } +} + +/// Create a desktop shortcut in a platform-specific way +pub fn create_desktop_shortcut( + target: &Path, + name: &str, + icon: Option<&Path>, + description: Option<&str> +) -> Result<()> { + #[cfg(windows)] + { + use std::process::Command; + + let desktop = if let Some(desktop_dir) = dirs::desktop_dir() { + desktop_dir + } else { + return Err(anyhow::anyhow!("Could not find desktop directory")); + }; + + let shortcut_path = desktop.join(format!("{}.lnk", name)); + + // Create Windows shortcut using PowerShell + let mut ps_cmd = String::from("$ws = New-Object -ComObject WScript.Shell; "); + ps_cmd.push_str(&format!("$s = $ws.CreateShortcut('{}'); ", shortcut_path.to_string_lossy())); + ps_cmd.push_str(&format!("$s.TargetPath = '{}'; ", target.to_string_lossy())); + + if let Some(icon_path) = icon { + ps_cmd.push_str(&format!("$s.IconLocation = '{}'; ", icon_path.to_string_lossy())); + } + + if let Some(desc) = description { + ps_cmd.push_str(&format!("$s.Description = '{}'; ", desc)); + } + + ps_cmd.push_str("$s.Save()"); + + Command::new("powershell") + .args(&["-Command", &ps_cmd]) + .output()?; + + Ok(()) + } + + #[cfg(unix)] + { + use std::fs::File; + use std::io::Write; + + let desktop = if let Some(desktop_dir) = dirs::desktop_dir() { + desktop_dir + } else { + return Err(anyhow::anyhow!("Could not find desktop directory")); + }; + + let shortcut_path = desktop.join(format!("{}.desktop", name)); + + let mut file = File::create(&shortcut_path)?; + + writeln!(file, "[Desktop Entry]")?; + writeln!(file, "Type=Application")?; + writeln!(file, "Name={}", name)?; + writeln!(file, "Exec={}", target.to_string_lossy())?; + + if let Some(icon_path) = icon { + writeln!(file, "Icon={}", icon_path.to_string_lossy())?; + } + + if let Some(desc) = description { + writeln!(file, "Comment={}", desc)?; + } + + writeln!(file, "Terminal=false")?; + + // Make executable + use std::os::unix::fs::PermissionsExt; + let mut perms = std::fs::metadata(&shortcut_path)?.permissions(); + perms.set_mode(0o755); // rwxr-xr-x + std::fs::set_permissions(&shortcut_path, perms)?; + + Ok(()) + } +} \ No newline at end of file