summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.cargo/config.toml2
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock3583
-rw-r--r--Cargo.toml25
-rw-r--r--src/downloader.rs589
-rw-r--r--src/gui.rs369
-rw-r--r--src/main.rs102
7 files changed, 4671 insertions, 0 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml
new file mode 100644
index 0000000..ae2c9b8
--- /dev/null
+++ b/.cargo/config.toml
@@ -0,0 +1,2 @@
1[env]
2RUST_MIN_STACK = "67108864"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2f7896d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
target/
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..f8635e3
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,3583 @@
1# This file is automatically @generated by Cargo.
2# It is not intended for manual editing.
3version = 4
4
5[[package]]
6name = "accesskit"
7version = "0.24.1"
8source = "registry+https://github.com/rust-lang/crates.io-index"
9checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320"
10dependencies = [
11 "uuid",
12]
13
14[[package]]
15name = "adler2"
16version = "2.0.1"
17source = "registry+https://github.com/rust-lang/crates.io-index"
18checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
19
20[[package]]
21name = "ahash"
22version = "0.8.12"
23source = "registry+https://github.com/rust-lang/crates.io-index"
24checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
25dependencies = [
26 "cfg-if",
27 "once_cell",
28 "version_check",
29 "zerocopy",
30]
31
32[[package]]
33name = "aho-corasick"
34version = "1.1.4"
35source = "registry+https://github.com/rust-lang/crates.io-index"
36checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
37dependencies = [
38 "memchr",
39]
40
41[[package]]
42name = "android-activity"
43version = "0.6.1"
44source = "registry+https://github.com/rust-lang/crates.io-index"
45checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd"
46dependencies = [
47 "android-properties",
48 "bitflags 2.13.0",
49 "cc",
50 "jni",
51 "libc",
52 "log",
53 "ndk",
54 "ndk-context",
55 "ndk-sys",
56 "num_enum",
57 "thiserror 2.0.18",
58]
59
60[[package]]
61name = "android-properties"
62version = "0.2.2"
63source = "registry+https://github.com/rust-lang/crates.io-index"
64checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04"
65
66[[package]]
67name = "anyhow"
68version = "1.0.103"
69source = "registry+https://github.com/rust-lang/crates.io-index"
70checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
71
72[[package]]
73name = "arboard"
74version = "3.6.1"
75source = "registry+https://github.com/rust-lang/crates.io-index"
76checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf"
77dependencies = [
78 "clipboard-win",
79 "image",
80 "log",
81 "objc2 0.6.4",
82 "objc2-app-kit 0.3.2",
83 "objc2-core-foundation",
84 "objc2-core-graphics",
85 "objc2-foundation 0.3.2",
86 "parking_lot",
87 "percent-encoding",
88 "windows-sys 0.59.0",
89 "x11rb",
90]
91
92[[package]]
93name = "arrayvec"
94version = "0.7.7"
95source = "registry+https://github.com/rust-lang/crates.io-index"
96checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe"
97
98[[package]]
99name = "as-raw-xcb-connection"
100version = "1.0.1"
101source = "registry+https://github.com/rust-lang/crates.io-index"
102checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b"
103
104[[package]]
105name = "atk-sys"
106version = "0.18.2"
107source = "registry+https://github.com/rust-lang/crates.io-index"
108checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
109dependencies = [
110 "glib-sys",
111 "gobject-sys",
112 "libc",
113 "system-deps",
114]
115
116[[package]]
117name = "atomic-waker"
118version = "1.1.2"
119source = "registry+https://github.com/rust-lang/crates.io-index"
120checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
121
122[[package]]
123name = "autocfg"
124version = "1.5.1"
125source = "registry+https://github.com/rust-lang/crates.io-index"
126checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
127
128[[package]]
129name = "base64"
130version = "0.22.1"
131source = "registry+https://github.com/rust-lang/crates.io-index"
132checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
133
134[[package]]
135name = "bit-set"
136version = "0.9.1"
137source = "registry+https://github.com/rust-lang/crates.io-index"
138checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd"
139dependencies = [
140 "bit-vec",
141]
142
143[[package]]
144name = "bit-vec"
145version = "0.9.1"
146source = "registry+https://github.com/rust-lang/crates.io-index"
147checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51"
148
149[[package]]
150name = "bitflags"
151version = "1.3.2"
152source = "registry+https://github.com/rust-lang/crates.io-index"
153checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
154
155[[package]]
156name = "bitflags"
157version = "2.13.0"
158source = "registry+https://github.com/rust-lang/crates.io-index"
159checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
160
161[[package]]
162name = "block2"
163version = "0.5.1"
164source = "registry+https://github.com/rust-lang/crates.io-index"
165checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
166dependencies = [
167 "objc2 0.5.2",
168]
169
170[[package]]
171name = "block2"
172version = "0.6.2"
173source = "registry+https://github.com/rust-lang/crates.io-index"
174checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
175dependencies = [
176 "objc2 0.6.4",
177]
178
179[[package]]
180name = "bumpalo"
181version = "3.20.3"
182source = "registry+https://github.com/rust-lang/crates.io-index"
183checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
184
185[[package]]
186name = "bytemuck"
187version = "1.25.0"
188source = "registry+https://github.com/rust-lang/crates.io-index"
189checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
190dependencies = [
191 "bytemuck_derive",
192]
193
194[[package]]
195name = "bytemuck_derive"
196version = "1.10.2"
197source = "registry+https://github.com/rust-lang/crates.io-index"
198checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
199dependencies = [
200 "proc-macro2",
201 "quote",
202 "syn",
203]
204
205[[package]]
206name = "byteorder-lite"
207version = "0.1.0"
208source = "registry+https://github.com/rust-lang/crates.io-index"
209checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
210
211[[package]]
212name = "bytes"
213version = "1.12.0"
214source = "registry+https://github.com/rust-lang/crates.io-index"
215checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
216
217[[package]]
218name = "cairo-sys-rs"
219version = "0.18.2"
220source = "registry+https://github.com/rust-lang/crates.io-index"
221checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
222dependencies = [
223 "libc",
224 "system-deps",
225]
226
227[[package]]
228name = "calloop"
229version = "0.13.0"
230source = "registry+https://github.com/rust-lang/crates.io-index"
231checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec"
232dependencies = [
233 "bitflags 2.13.0",
234 "log",
235 "polling",
236 "rustix 0.38.44",
237 "slab",
238 "thiserror 1.0.69",
239]
240
241[[package]]
242name = "calloop"
243version = "0.14.4"
244source = "registry+https://github.com/rust-lang/crates.io-index"
245checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7"
246dependencies = [
247 "bitflags 2.13.0",
248 "polling",
249 "rustix 1.1.4",
250 "slab",
251 "tracing",
252]
253
254[[package]]
255name = "calloop-wayland-source"
256version = "0.4.1"
257source = "registry+https://github.com/rust-lang/crates.io-index"
258checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa"
259dependencies = [
260 "calloop 0.14.4",
261 "rustix 1.1.4",
262 "wayland-backend",
263 "wayland-client",
264]
265
266[[package]]
267name = "cc"
268version = "1.2.65"
269source = "registry+https://github.com/rust-lang/crates.io-index"
270checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"
271dependencies = [
272 "find-msvc-tools",
273 "jobserver",
274 "libc",
275 "shlex",
276]
277
278[[package]]
279name = "cfg-expr"
280version = "0.15.8"
281source = "registry+https://github.com/rust-lang/crates.io-index"
282checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
283dependencies = [
284 "smallvec",
285 "target-lexicon",
286]
287
288[[package]]
289name = "cfg-if"
290version = "1.0.4"
291source = "registry+https://github.com/rust-lang/crates.io-index"
292checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
293
294[[package]]
295name = "cfg_aliases"
296version = "0.2.1"
297source = "registry+https://github.com/rust-lang/crates.io-index"
298checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
299
300[[package]]
301name = "cgl"
302version = "0.3.2"
303source = "registry+https://github.com/rust-lang/crates.io-index"
304checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff"
305dependencies = [
306 "libc",
307]
308
309[[package]]
310name = "clipboard-win"
311version = "5.4.1"
312source = "registry+https://github.com/rust-lang/crates.io-index"
313checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4"
314dependencies = [
315 "error-code",
316]
317
318[[package]]
319name = "codespan-reporting"
320version = "0.13.1"
321source = "registry+https://github.com/rust-lang/crates.io-index"
322checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681"
323dependencies = [
324 "unicode-width",
325]
326
327[[package]]
328name = "color"
329version = "0.3.3"
330source = "registry+https://github.com/rust-lang/crates.io-index"
331checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf"
332dependencies = [
333 "bytemuck",
334]
335
336[[package]]
337name = "combine"
338version = "4.6.7"
339source = "registry+https://github.com/rust-lang/crates.io-index"
340checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
341dependencies = [
342 "bytes",
343 "memchr",
344]
345
346[[package]]
347name = "concurrent-queue"
348version = "2.5.0"
349source = "registry+https://github.com/rust-lang/crates.io-index"
350checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
351dependencies = [
352 "crossbeam-utils",
353]
354
355[[package]]
356name = "core-foundation"
357version = "0.9.4"
358source = "registry+https://github.com/rust-lang/crates.io-index"
359checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
360dependencies = [
361 "core-foundation-sys",
362 "libc",
363]
364
365[[package]]
366name = "core-foundation"
367version = "0.10.1"
368source = "registry+https://github.com/rust-lang/crates.io-index"
369checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
370dependencies = [
371 "core-foundation-sys",
372 "libc",
373]
374
375[[package]]
376name = "core-foundation-sys"
377version = "0.8.7"
378source = "registry+https://github.com/rust-lang/crates.io-index"
379checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
380
381[[package]]
382name = "core-graphics"
383version = "0.23.2"
384source = "registry+https://github.com/rust-lang/crates.io-index"
385checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"
386dependencies = [
387 "bitflags 1.3.2",
388 "core-foundation 0.9.4",
389 "core-graphics-types",
390 "foreign-types",
391 "libc",
392]
393
394[[package]]
395name = "core-graphics-types"
396version = "0.1.3"
397source = "registry+https://github.com/rust-lang/crates.io-index"
398checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"
399dependencies = [
400 "bitflags 1.3.2",
401 "core-foundation 0.9.4",
402 "libc",
403]
404
405[[package]]
406name = "crc32fast"
407version = "1.5.0"
408source = "registry+https://github.com/rust-lang/crates.io-index"
409checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
410dependencies = [
411 "cfg-if",
412]
413
414[[package]]
415name = "crossbeam-utils"
416version = "0.8.21"
417source = "registry+https://github.com/rust-lang/crates.io-index"
418checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
419
420[[package]]
421name = "crunchy"
422version = "0.2.4"
423source = "registry+https://github.com/rust-lang/crates.io-index"
424checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
425
426[[package]]
427name = "cursor-icon"
428version = "1.2.0"
429source = "registry+https://github.com/rust-lang/crates.io-index"
430checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f"
431
432[[package]]
433name = "dispatch"
434version = "0.2.0"
435source = "registry+https://github.com/rust-lang/crates.io-index"
436checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
437
438[[package]]
439name = "dispatch2"
440version = "0.3.1"
441source = "registry+https://github.com/rust-lang/crates.io-index"
442checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
443dependencies = [
444 "bitflags 2.13.0",
445 "block2 0.6.2",
446 "libc",
447 "objc2 0.6.4",
448]
449
450[[package]]
451name = "displaydoc"
452version = "0.2.6"
453source = "registry+https://github.com/rust-lang/crates.io-index"
454checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
455dependencies = [
456 "proc-macro2",
457 "quote",
458 "syn",
459]
460
461[[package]]
462name = "dlib"
463version = "0.5.3"
464source = "registry+https://github.com/rust-lang/crates.io-index"
465checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"
466dependencies = [
467 "libloading",
468]
469
470[[package]]
471name = "document-features"
472version = "0.2.12"
473source = "registry+https://github.com/rust-lang/crates.io-index"
474checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
475dependencies = [
476 "litrs",
477]
478
479[[package]]
480name = "downcast-rs"
481version = "1.2.1"
482source = "registry+https://github.com/rust-lang/crates.io-index"
483checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
484
485[[package]]
486name = "dpi"
487version = "0.1.2"
488source = "registry+https://github.com/rust-lang/crates.io-index"
489checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
490
491[[package]]
492name = "ecolor"
493version = "0.35.0"
494source = "registry+https://github.com/rust-lang/crates.io-index"
495checksum = "6758be723a3f298bbfda4db75748bc2ba0abafe096b6383c7c32da264764fbc3"
496dependencies = [
497 "bytemuck",
498 "emath",
499]
500
501[[package]]
502name = "eframe"
503version = "0.35.0"
504source = "registry+https://github.com/rust-lang/crates.io-index"
505checksum = "8dc8234e2f681b2afd2b2e8c332fa614de2fddbdcb28d0acf5c420449682ea90"
506dependencies = [
507 "ahash",
508 "bytemuck",
509 "document-features",
510 "egui",
511 "egui-wgpu",
512 "egui-winit",
513 "egui_glow",
514 "glow",
515 "glutin",
516 "glutin-winit",
517 "image",
518 "js-sys",
519 "log",
520 "objc2 0.6.4",
521 "objc2-app-kit 0.3.2",
522 "objc2-foundation 0.3.2",
523 "parking_lot",
524 "percent-encoding",
525 "profiling",
526 "raw-window-handle",
527 "static_assertions",
528 "wasm-bindgen",
529 "wasm-bindgen-futures",
530 "web-sys",
531 "web-time",
532 "windows-sys 0.61.2",
533 "winit",
534]
535
536[[package]]
537name = "egui"
538version = "0.35.0"
539source = "registry+https://github.com/rust-lang/crates.io-index"
540checksum = "2796c98d50b79631281d516343a6f6e93c0666462ca36e2c93b39f25d7793325"
541dependencies = [
542 "accesskit",
543 "ahash",
544 "bitflags 2.13.0",
545 "emath",
546 "epaint",
547 "itertools",
548 "log",
549 "nohash-hasher",
550 "profiling",
551 "smallvec",
552 "unicode-segmentation",
553]
554
555[[package]]
556name = "egui-wgpu"
557version = "0.35.0"
558source = "registry+https://github.com/rust-lang/crates.io-index"
559checksum = "d2e6cfac0725563555fa4f91e9f799b9d7c6c5dd831fca6abc8234afc64b7a34"
560dependencies = [
561 "ahash",
562 "bytemuck",
563 "document-features",
564 "egui",
565 "epaint",
566 "log",
567 "profiling",
568 "thiserror 2.0.18",
569 "type-map",
570 "web-time",
571 "wgpu",
572 "winit",
573]
574
575[[package]]
576name = "egui-winit"
577version = "0.35.0"
578source = "registry+https://github.com/rust-lang/crates.io-index"
579checksum = "9ea6bf3608db949588b95b8b341ee358d0c3f95cf4dc3f53d8d76717edee87db"
580dependencies = [
581 "arboard",
582 "bytemuck",
583 "egui",
584 "log",
585 "objc2 0.6.4",
586 "objc2-foundation 0.3.2",
587 "objc2-ui-kit 0.3.2",
588 "profiling",
589 "raw-window-handle",
590 "smithay-clipboard",
591 "web-time",
592 "webbrowser",
593 "winit",
594]
595
596[[package]]
597name = "egui_glow"
598version = "0.35.0"
599source = "registry+https://github.com/rust-lang/crates.io-index"
600checksum = "52274b9bfb8d8e252cd0f00c9f6214f360d75a0962baa77a2d62ddb002fe99d4"
601dependencies = [
602 "bytemuck",
603 "egui",
604 "glow",
605 "log",
606 "memoffset",
607 "profiling",
608 "winit",
609]
610
611[[package]]
612name = "either"
613version = "1.16.0"
614source = "registry+https://github.com/rust-lang/crates.io-index"
615checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"
616
617[[package]]
618name = "emath"
619version = "0.35.0"
620source = "registry+https://github.com/rust-lang/crates.io-index"
621checksum = "cd4ec073c9898516584d8c6cfdcee95b530b3d941cd5031ef4050aa36812308b"
622dependencies = [
623 "bytemuck",
624]
625
626[[package]]
627name = "epaint"
628version = "0.35.0"
629source = "registry+https://github.com/rust-lang/crates.io-index"
630checksum = "4e60a8888b51da911df23918fd7301359b1d43a406a0ff3b8863af093dd7fc6c"
631dependencies = [
632 "ahash",
633 "bytemuck",
634 "ecolor",
635 "emath",
636 "epaint_default_fonts",
637 "font-types",
638 "harfrust",
639 "log",
640 "nohash-hasher",
641 "parking_lot",
642 "profiling",
643 "self_cell",
644 "skrifa",
645 "smallvec",
646 "unicode-general-category",
647 "unicode-segmentation",
648 "vello_cpu",
649]
650
651[[package]]
652name = "epaint_default_fonts"
653version = "0.35.0"
654source = "registry+https://github.com/rust-lang/crates.io-index"
655checksum = "13ee4e1f553a3584c301f3a56ff1a775f1384781396cea301c8d952e9b93f560"
656
657[[package]]
658name = "equivalent"
659version = "1.0.2"
660source = "registry+https://github.com/rust-lang/crates.io-index"
661checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
662
663[[package]]
664name = "errno"
665version = "0.3.14"
666source = "registry+https://github.com/rust-lang/crates.io-index"
667checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
668dependencies = [
669 "libc",
670 "windows-sys 0.61.2",
671]
672
673[[package]]
674name = "error-code"
675version = "3.3.2"
676source = "registry+https://github.com/rust-lang/crates.io-index"
677checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59"
678
679[[package]]
680name = "euclid"
681version = "0.22.14"
682source = "registry+https://github.com/rust-lang/crates.io-index"
683checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06"
684dependencies = [
685 "num-traits",
686]
687
688[[package]]
689name = "factorio-mod-downloader"
690version = "0.1.0"
691dependencies = [
692 "anyhow",
693 "eframe",
694 "egui",
695 "regex",
696 "rfd",
697 "serde",
698 "serde_json",
699 "ureq",
700]
701
702[[package]]
703name = "fax"
704version = "0.2.7"
705source = "registry+https://github.com/rust-lang/crates.io-index"
706checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a"
707
708[[package]]
709name = "fdeflate"
710version = "0.3.7"
711source = "registry+https://github.com/rust-lang/crates.io-index"
712checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
713dependencies = [
714 "simd-adler32",
715]
716
717[[package]]
718name = "fearless_simd"
719version = "0.4.1"
720source = "registry+https://github.com/rust-lang/crates.io-index"
721checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693"
722
723[[package]]
724name = "find-msvc-tools"
725version = "0.1.9"
726source = "registry+https://github.com/rust-lang/crates.io-index"
727checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
728
729[[package]]
730name = "flate2"
731version = "1.1.9"
732source = "registry+https://github.com/rust-lang/crates.io-index"
733checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
734dependencies = [
735 "crc32fast",
736 "miniz_oxide",
737]
738
739[[package]]
740name = "foldhash"
741version = "0.2.0"
742source = "registry+https://github.com/rust-lang/crates.io-index"
743checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
744
745[[package]]
746name = "font-types"
747version = "0.11.3"
748source = "registry+https://github.com/rust-lang/crates.io-index"
749checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7"
750dependencies = [
751 "bytemuck",
752]
753
754[[package]]
755name = "foreign-types"
756version = "0.5.0"
757source = "registry+https://github.com/rust-lang/crates.io-index"
758checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
759dependencies = [
760 "foreign-types-macros",
761 "foreign-types-shared",
762]
763
764[[package]]
765name = "foreign-types-macros"
766version = "0.2.3"
767source = "registry+https://github.com/rust-lang/crates.io-index"
768checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
769dependencies = [
770 "proc-macro2",
771 "quote",
772 "syn",
773]
774
775[[package]]
776name = "foreign-types-shared"
777version = "0.3.1"
778source = "registry+https://github.com/rust-lang/crates.io-index"
779checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
780
781[[package]]
782name = "form_urlencoded"
783version = "1.2.2"
784source = "registry+https://github.com/rust-lang/crates.io-index"
785checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
786dependencies = [
787 "percent-encoding",
788]
789
790[[package]]
791name = "futures-core"
792version = "0.3.32"
793source = "registry+https://github.com/rust-lang/crates.io-index"
794checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
795
796[[package]]
797name = "futures-task"
798version = "0.3.32"
799source = "registry+https://github.com/rust-lang/crates.io-index"
800checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
801
802[[package]]
803name = "futures-util"
804version = "0.3.32"
805source = "registry+https://github.com/rust-lang/crates.io-index"
806checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
807dependencies = [
808 "futures-core",
809 "futures-task",
810 "pin-project-lite",
811 "slab",
812]
813
814[[package]]
815name = "gdk-pixbuf-sys"
816version = "0.18.0"
817source = "registry+https://github.com/rust-lang/crates.io-index"
818checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
819dependencies = [
820 "gio-sys",
821 "glib-sys",
822 "gobject-sys",
823 "libc",
824 "system-deps",
825]
826
827[[package]]
828name = "gdk-sys"
829version = "0.18.2"
830source = "registry+https://github.com/rust-lang/crates.io-index"
831checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
832dependencies = [
833 "cairo-sys-rs",
834 "gdk-pixbuf-sys",
835 "gio-sys",
836 "glib-sys",
837 "gobject-sys",
838 "libc",
839 "pango-sys",
840 "pkg-config",
841 "system-deps",
842]
843
844[[package]]
845name = "gethostname"
846version = "1.1.0"
847source = "registry+https://github.com/rust-lang/crates.io-index"
848checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8"
849dependencies = [
850 "rustix 1.1.4",
851 "windows-link",
852]
853
854[[package]]
855name = "getrandom"
856version = "0.2.17"
857source = "registry+https://github.com/rust-lang/crates.io-index"
858checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
859dependencies = [
860 "cfg-if",
861 "libc",
862 "wasi",
863]
864
865[[package]]
866name = "getrandom"
867version = "0.3.4"
868source = "registry+https://github.com/rust-lang/crates.io-index"
869checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
870dependencies = [
871 "cfg-if",
872 "libc",
873 "r-efi",
874 "wasip2",
875]
876
877[[package]]
878name = "gio-sys"
879version = "0.18.1"
880source = "registry+https://github.com/rust-lang/crates.io-index"
881checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
882dependencies = [
883 "glib-sys",
884 "gobject-sys",
885 "libc",
886 "system-deps",
887 "winapi",
888]
889
890[[package]]
891name = "gl_generator"
892version = "0.14.0"
893source = "registry+https://github.com/rust-lang/crates.io-index"
894checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
895dependencies = [
896 "khronos_api",
897 "log",
898 "xml-rs",
899]
900
901[[package]]
902name = "glib-sys"
903version = "0.18.1"
904source = "registry+https://github.com/rust-lang/crates.io-index"
905checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
906dependencies = [
907 "libc",
908 "system-deps",
909]
910
911[[package]]
912name = "glifo"
913version = "0.1.1"
914source = "registry+https://github.com/rust-lang/crates.io-index"
915checksum = "d99fc21d493812643aae86d53b7bbd02f376434a90317e8a790bc209fdd6605e"
916dependencies = [
917 "bytemuck",
918 "foldhash",
919 "hashbrown 0.17.1",
920 "log",
921 "peniko",
922 "skrifa",
923 "smallvec",
924 "vello_common",
925]
926
927[[package]]
928name = "glow"
929version = "0.17.0"
930source = "registry+https://github.com/rust-lang/crates.io-index"
931checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5"
932dependencies = [
933 "js-sys",
934 "slotmap",
935 "wasm-bindgen",
936 "web-sys",
937]
938
939[[package]]
940name = "glutin"
941version = "0.32.3"
942source = "registry+https://github.com/rust-lang/crates.io-index"
943checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325"
944dependencies = [
945 "bitflags 2.13.0",
946 "cfg_aliases",
947 "cgl",
948 "dispatch2",
949 "glutin_egl_sys",
950 "glutin_glx_sys",
951 "glutin_wgl_sys",
952 "libloading",
953 "objc2 0.6.4",
954 "objc2-app-kit 0.3.2",
955 "objc2-core-foundation",
956 "objc2-foundation 0.3.2",
957 "once_cell",
958 "raw-window-handle",
959 "windows-sys 0.52.0",
960 "x11-dl",
961]
962
963[[package]]
964name = "glutin-winit"
965version = "0.5.0"
966source = "registry+https://github.com/rust-lang/crates.io-index"
967checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f"
968dependencies = [
969 "cfg_aliases",
970 "glutin",
971 "raw-window-handle",
972 "winit",
973]
974
975[[package]]
976name = "glutin_egl_sys"
977version = "0.7.1"
978source = "registry+https://github.com/rust-lang/crates.io-index"
979checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2"
980dependencies = [
981 "gl_generator",
982 "windows-sys 0.52.0",
983]
984
985[[package]]
986name = "glutin_glx_sys"
987version = "0.6.1"
988source = "registry+https://github.com/rust-lang/crates.io-index"
989checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185"
990dependencies = [
991 "gl_generator",
992 "x11-dl",
993]
994
995[[package]]
996name = "glutin_wgl_sys"
997version = "0.6.1"
998source = "registry+https://github.com/rust-lang/crates.io-index"
999checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e"
1000dependencies = [
1001 "gl_generator",
1002]
1003
1004[[package]]
1005name = "gobject-sys"
1006version = "0.18.0"
1007source = "registry+https://github.com/rust-lang/crates.io-index"
1008checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
1009dependencies = [
1010 "glib-sys",
1011 "libc",
1012 "system-deps",
1013]
1014
1015[[package]]
1016name = "gtk-sys"
1017version = "0.18.2"
1018source = "registry+https://github.com/rust-lang/crates.io-index"
1019checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
1020dependencies = [
1021 "atk-sys",
1022 "cairo-sys-rs",
1023 "gdk-pixbuf-sys",
1024 "gdk-sys",
1025 "gio-sys",
1026 "glib-sys",
1027 "gobject-sys",
1028 "libc",
1029 "pango-sys",
1030 "system-deps",
1031]
1032
1033[[package]]
1034name = "guillotiere"
1035version = "0.7.0"
1036source = "registry+https://github.com/rust-lang/crates.io-index"
1037checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab"
1038dependencies = [
1039 "euclid",
1040]
1041
1042[[package]]
1043name = "half"
1044version = "2.7.1"
1045source = "registry+https://github.com/rust-lang/crates.io-index"
1046checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
1047dependencies = [
1048 "cfg-if",
1049 "crunchy",
1050 "num-traits",
1051 "zerocopy",
1052]
1053
1054[[package]]
1055name = "harfrust"
1056version = "0.7.0"
1057source = "registry+https://github.com/rust-lang/crates.io-index"
1058checksum = "0431e8e389aa0f1e72bb9d1c2db8957a1a7a3580e8ed97db819c14837aac9b3e"
1059dependencies = [
1060 "bitflags 2.13.0",
1061 "bytemuck",
1062 "read-fonts",
1063 "smallvec",
1064]
1065
1066[[package]]
1067name = "hashbrown"
1068version = "0.16.1"
1069source = "registry+https://github.com/rust-lang/crates.io-index"
1070checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
1071dependencies = [
1072 "foldhash",
1073]
1074
1075[[package]]
1076name = "hashbrown"
1077version = "0.17.1"
1078source = "registry+https://github.com/rust-lang/crates.io-index"
1079checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
1080dependencies = [
1081 "foldhash",
1082]
1083
1084[[package]]
1085name = "heck"
1086version = "0.5.0"
1087source = "registry+https://github.com/rust-lang/crates.io-index"
1088checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
1089
1090[[package]]
1091name = "hermit-abi"
1092version = "0.5.2"
1093source = "registry+https://github.com/rust-lang/crates.io-index"
1094checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
1095
1096[[package]]
1097name = "hexf-parse"
1098version = "0.2.1"
1099source = "registry+https://github.com/rust-lang/crates.io-index"
1100checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
1101
1102[[package]]
1103name = "http"
1104version = "1.4.2"
1105source = "registry+https://github.com/rust-lang/crates.io-index"
1106checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
1107dependencies = [
1108 "bytes",
1109 "itoa",
1110]
1111
1112[[package]]
1113name = "httparse"
1114version = "1.10.1"
1115source = "registry+https://github.com/rust-lang/crates.io-index"
1116checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
1117
1118[[package]]
1119name = "icu_collections"
1120version = "2.2.0"
1121source = "registry+https://github.com/rust-lang/crates.io-index"
1122checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
1123dependencies = [
1124 "displaydoc",
1125 "potential_utf",
1126 "utf8_iter",
1127 "yoke",
1128 "zerofrom",
1129 "zerovec",
1130]
1131
1132[[package]]
1133name = "icu_locale_core"
1134version = "2.2.0"
1135source = "registry+https://github.com/rust-lang/crates.io-index"
1136checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
1137dependencies = [
1138 "displaydoc",
1139 "litemap",
1140 "tinystr",
1141 "writeable",
1142 "zerovec",
1143]
1144
1145[[package]]
1146name = "icu_normalizer"
1147version = "2.2.0"
1148source = "registry+https://github.com/rust-lang/crates.io-index"
1149checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
1150dependencies = [
1151 "icu_collections",
1152 "icu_normalizer_data",
1153 "icu_properties",
1154 "icu_provider",
1155 "smallvec",
1156 "zerovec",
1157]
1158
1159[[package]]
1160name = "icu_normalizer_data"
1161version = "2.2.0"
1162source = "registry+https://github.com/rust-lang/crates.io-index"
1163checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
1164
1165[[package]]
1166name = "icu_properties"
1167version = "2.2.0"
1168source = "registry+https://github.com/rust-lang/crates.io-index"
1169checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
1170dependencies = [
1171 "icu_collections",
1172 "icu_locale_core",
1173 "icu_properties_data",
1174 "icu_provider",
1175 "zerotrie",
1176 "zerovec",
1177]
1178
1179[[package]]
1180name = "icu_properties_data"
1181version = "2.2.0"
1182source = "registry+https://github.com/rust-lang/crates.io-index"
1183checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
1184
1185[[package]]
1186name = "icu_provider"
1187version = "2.2.0"
1188source = "registry+https://github.com/rust-lang/crates.io-index"
1189checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
1190dependencies = [
1191 "displaydoc",
1192 "icu_locale_core",
1193 "writeable",
1194 "yoke",
1195 "zerofrom",
1196 "zerotrie",
1197 "zerovec",
1198]
1199
1200[[package]]
1201name = "idna"
1202version = "1.1.0"
1203source = "registry+https://github.com/rust-lang/crates.io-index"
1204checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
1205dependencies = [
1206 "idna_adapter",
1207 "smallvec",
1208 "utf8_iter",
1209]
1210
1211[[package]]
1212name = "idna_adapter"
1213version = "1.2.2"
1214source = "registry+https://github.com/rust-lang/crates.io-index"
1215checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
1216dependencies = [
1217 "icu_normalizer",
1218 "icu_properties",
1219]
1220
1221[[package]]
1222name = "image"
1223version = "0.25.10"
1224source = "registry+https://github.com/rust-lang/crates.io-index"
1225checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
1226dependencies = [
1227 "bytemuck",
1228 "byteorder-lite",
1229 "moxcms",
1230 "num-traits",
1231 "png",
1232 "tiff",
1233]
1234
1235[[package]]
1236name = "indexmap"
1237version = "2.14.0"
1238source = "registry+https://github.com/rust-lang/crates.io-index"
1239checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
1240dependencies = [
1241 "equivalent",
1242 "hashbrown 0.17.1",
1243]
1244
1245[[package]]
1246name = "itertools"
1247version = "0.14.0"
1248source = "registry+https://github.com/rust-lang/crates.io-index"
1249checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
1250dependencies = [
1251 "either",
1252]
1253
1254[[package]]
1255name = "itoa"
1256version = "1.0.18"
1257source = "registry+https://github.com/rust-lang/crates.io-index"
1258checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
1259
1260[[package]]
1261name = "jni"
1262version = "0.22.4"
1263source = "registry+https://github.com/rust-lang/crates.io-index"
1264checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"
1265dependencies = [
1266 "cfg-if",
1267 "combine",
1268 "jni-macros",
1269 "jni-sys 0.4.1",
1270 "log",
1271 "simd_cesu8",
1272 "thiserror 2.0.18",
1273 "walkdir",
1274 "windows-link",
1275]
1276
1277[[package]]
1278name = "jni-macros"
1279version = "0.22.4"
1280source = "registry+https://github.com/rust-lang/crates.io-index"
1281checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"
1282dependencies = [
1283 "proc-macro2",
1284 "quote",
1285 "rustc_version",
1286 "simd_cesu8",
1287 "syn",
1288]
1289
1290[[package]]
1291name = "jni-sys"
1292version = "0.3.1"
1293source = "registry+https://github.com/rust-lang/crates.io-index"
1294checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
1295dependencies = [
1296 "jni-sys 0.4.1",
1297]
1298
1299[[package]]
1300name = "jni-sys"
1301version = "0.4.1"
1302source = "registry+https://github.com/rust-lang/crates.io-index"
1303checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
1304dependencies = [
1305 "jni-sys-macros",
1306]
1307
1308[[package]]
1309name = "jni-sys-macros"
1310version = "0.4.1"
1311source = "registry+https://github.com/rust-lang/crates.io-index"
1312checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
1313dependencies = [
1314 "quote",
1315 "syn",
1316]
1317
1318[[package]]
1319name = "jobserver"
1320version = "0.1.34"
1321source = "registry+https://github.com/rust-lang/crates.io-index"
1322checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
1323dependencies = [
1324 "getrandom 0.3.4",
1325 "libc",
1326]
1327
1328[[package]]
1329name = "js-sys"
1330version = "0.3.103"
1331source = "registry+https://github.com/rust-lang/crates.io-index"
1332checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
1333dependencies = [
1334 "cfg-if",
1335 "futures-util",
1336 "wasm-bindgen",
1337]
1338
1339[[package]]
1340name = "khronos_api"
1341version = "3.1.0"
1342source = "registry+https://github.com/rust-lang/crates.io-index"
1343checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
1344
1345[[package]]
1346name = "kurbo"
1347version = "0.13.1"
1348source = "registry+https://github.com/rust-lang/crates.io-index"
1349checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2"
1350dependencies = [
1351 "arrayvec",
1352 "euclid",
1353 "polycool",
1354 "smallvec",
1355]
1356
1357[[package]]
1358name = "libc"
1359version = "0.2.186"
1360source = "registry+https://github.com/rust-lang/crates.io-index"
1361checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
1362
1363[[package]]
1364name = "libloading"
1365version = "0.8.9"
1366source = "registry+https://github.com/rust-lang/crates.io-index"
1367checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
1368dependencies = [
1369 "cfg-if",
1370 "windows-link",
1371]
1372
1373[[package]]
1374name = "libm"
1375version = "0.2.16"
1376source = "registry+https://github.com/rust-lang/crates.io-index"
1377checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
1378
1379[[package]]
1380name = "libredox"
1381version = "0.1.17"
1382source = "registry+https://github.com/rust-lang/crates.io-index"
1383checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3"
1384dependencies = [
1385 "bitflags 2.13.0",
1386 "libc",
1387 "plain",
1388 "redox_syscall 0.8.1",
1389]
1390
1391[[package]]
1392name = "linebender_resource_handle"
1393version = "0.1.1"
1394source = "registry+https://github.com/rust-lang/crates.io-index"
1395checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4"
1396
1397[[package]]
1398name = "linux-raw-sys"
1399version = "0.4.15"
1400source = "registry+https://github.com/rust-lang/crates.io-index"
1401checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
1402
1403[[package]]
1404name = "linux-raw-sys"
1405version = "0.12.1"
1406source = "registry+https://github.com/rust-lang/crates.io-index"
1407checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
1408
1409[[package]]
1410name = "litemap"
1411version = "0.8.2"
1412source = "registry+https://github.com/rust-lang/crates.io-index"
1413checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
1414
1415[[package]]
1416name = "litrs"
1417version = "1.0.0"
1418source = "registry+https://github.com/rust-lang/crates.io-index"
1419checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
1420
1421[[package]]
1422name = "lock_api"
1423version = "0.4.14"
1424source = "registry+https://github.com/rust-lang/crates.io-index"
1425checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
1426dependencies = [
1427 "scopeguard",
1428]
1429
1430[[package]]
1431name = "log"
1432version = "0.4.33"
1433source = "registry+https://github.com/rust-lang/crates.io-index"
1434checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
1435
1436[[package]]
1437name = "memchr"
1438version = "2.8.2"
1439source = "registry+https://github.com/rust-lang/crates.io-index"
1440checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
1441
1442[[package]]
1443name = "memmap2"
1444version = "0.9.11"
1445source = "registry+https://github.com/rust-lang/crates.io-index"
1446checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0"
1447dependencies = [
1448 "libc",
1449]
1450
1451[[package]]
1452name = "memoffset"
1453version = "0.9.1"
1454source = "registry+https://github.com/rust-lang/crates.io-index"
1455checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
1456dependencies = [
1457 "autocfg",
1458]
1459
1460[[package]]
1461name = "miniz_oxide"
1462version = "0.8.9"
1463source = "registry+https://github.com/rust-lang/crates.io-index"
1464checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
1465dependencies = [
1466 "adler2",
1467 "simd-adler32",
1468]
1469
1470[[package]]
1471name = "moxcms"
1472version = "0.8.1"
1473source = "registry+https://github.com/rust-lang/crates.io-index"
1474checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"
1475dependencies = [
1476 "num-traits",
1477 "pxfm",
1478]
1479
1480[[package]]
1481name = "naga"
1482version = "29.0.3"
1483source = "registry+https://github.com/rust-lang/crates.io-index"
1484checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079"
1485dependencies = [
1486 "arrayvec",
1487 "bit-set",
1488 "bitflags 2.13.0",
1489 "cfg-if",
1490 "cfg_aliases",
1491 "codespan-reporting",
1492 "half",
1493 "hashbrown 0.16.1",
1494 "hexf-parse",
1495 "indexmap",
1496 "libm",
1497 "log",
1498 "num-traits",
1499 "once_cell",
1500 "rustc-hash 1.1.0",
1501 "thiserror 2.0.18",
1502 "unicode-ident",
1503]
1504
1505[[package]]
1506name = "ndk"
1507version = "0.9.0"
1508source = "registry+https://github.com/rust-lang/crates.io-index"
1509checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
1510dependencies = [
1511 "bitflags 2.13.0",
1512 "jni-sys 0.3.1",
1513 "log",
1514 "ndk-sys",
1515 "num_enum",
1516 "raw-window-handle",
1517 "thiserror 1.0.69",
1518]
1519
1520[[package]]
1521name = "ndk-context"
1522version = "0.1.1"
1523source = "registry+https://github.com/rust-lang/crates.io-index"
1524checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
1525
1526[[package]]
1527name = "ndk-sys"
1528version = "0.6.0+11769913"
1529source = "registry+https://github.com/rust-lang/crates.io-index"
1530checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
1531dependencies = [
1532 "jni-sys 0.3.1",
1533]
1534
1535[[package]]
1536name = "nohash-hasher"
1537version = "0.2.0"
1538source = "registry+https://github.com/rust-lang/crates.io-index"
1539checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451"
1540
1541[[package]]
1542name = "num-traits"
1543version = "0.2.19"
1544source = "registry+https://github.com/rust-lang/crates.io-index"
1545checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1546dependencies = [
1547 "autocfg",
1548 "libm",
1549]
1550
1551[[package]]
1552name = "num_enum"
1553version = "0.7.6"
1554source = "registry+https://github.com/rust-lang/crates.io-index"
1555checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
1556dependencies = [
1557 "num_enum_derive",
1558 "rustversion",
1559]
1560
1561[[package]]
1562name = "num_enum_derive"
1563version = "0.7.6"
1564source = "registry+https://github.com/rust-lang/crates.io-index"
1565checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
1566dependencies = [
1567 "proc-macro-crate",
1568 "proc-macro2",
1569 "quote",
1570 "syn",
1571]
1572
1573[[package]]
1574name = "objc-sys"
1575version = "0.3.5"
1576source = "registry+https://github.com/rust-lang/crates.io-index"
1577checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
1578
1579[[package]]
1580name = "objc2"
1581version = "0.5.2"
1582source = "registry+https://github.com/rust-lang/crates.io-index"
1583checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
1584dependencies = [
1585 "objc-sys",
1586 "objc2-encode",
1587]
1588
1589[[package]]
1590name = "objc2"
1591version = "0.6.4"
1592source = "registry+https://github.com/rust-lang/crates.io-index"
1593checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"
1594dependencies = [
1595 "objc2-encode",
1596]
1597
1598[[package]]
1599name = "objc2-app-kit"
1600version = "0.2.2"
1601source = "registry+https://github.com/rust-lang/crates.io-index"
1602checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
1603dependencies = [
1604 "bitflags 2.13.0",
1605 "block2 0.5.1",
1606 "libc",
1607 "objc2 0.5.2",
1608 "objc2-core-data",
1609 "objc2-core-image",
1610 "objc2-foundation 0.2.2",
1611 "objc2-quartz-core",
1612]
1613
1614[[package]]
1615name = "objc2-app-kit"
1616version = "0.3.2"
1617source = "registry+https://github.com/rust-lang/crates.io-index"
1618checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
1619dependencies = [
1620 "bitflags 2.13.0",
1621 "block2 0.6.2",
1622 "objc2 0.6.4",
1623 "objc2-core-foundation",
1624 "objc2-core-graphics",
1625 "objc2-foundation 0.3.2",
1626]
1627
1628[[package]]
1629name = "objc2-cloud-kit"
1630version = "0.2.2"
1631source = "registry+https://github.com/rust-lang/crates.io-index"
1632checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009"
1633dependencies = [
1634 "bitflags 2.13.0",
1635 "block2 0.5.1",
1636 "objc2 0.5.2",
1637 "objc2-core-location",
1638 "objc2-foundation 0.2.2",
1639]
1640
1641[[package]]
1642name = "objc2-contacts"
1643version = "0.2.2"
1644source = "registry+https://github.com/rust-lang/crates.io-index"
1645checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889"
1646dependencies = [
1647 "block2 0.5.1",
1648 "objc2 0.5.2",
1649 "objc2-foundation 0.2.2",
1650]
1651
1652[[package]]
1653name = "objc2-core-data"
1654version = "0.2.2"
1655source = "registry+https://github.com/rust-lang/crates.io-index"
1656checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
1657dependencies = [
1658 "bitflags 2.13.0",
1659 "block2 0.5.1",
1660 "objc2 0.5.2",
1661 "objc2-foundation 0.2.2",
1662]
1663
1664[[package]]
1665name = "objc2-core-foundation"
1666version = "0.3.2"
1667source = "registry+https://github.com/rust-lang/crates.io-index"
1668checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
1669dependencies = [
1670 "bitflags 2.13.0",
1671 "dispatch2",
1672 "objc2 0.6.4",
1673]
1674
1675[[package]]
1676name = "objc2-core-graphics"
1677version = "0.3.2"
1678source = "registry+https://github.com/rust-lang/crates.io-index"
1679checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
1680dependencies = [
1681 "bitflags 2.13.0",
1682 "dispatch2",
1683 "objc2 0.6.4",
1684 "objc2-core-foundation",
1685 "objc2-io-surface",
1686]
1687
1688[[package]]
1689name = "objc2-core-image"
1690version = "0.2.2"
1691source = "registry+https://github.com/rust-lang/crates.io-index"
1692checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
1693dependencies = [
1694 "block2 0.5.1",
1695 "objc2 0.5.2",
1696 "objc2-foundation 0.2.2",
1697 "objc2-metal",
1698]
1699
1700[[package]]
1701name = "objc2-core-location"
1702version = "0.2.2"
1703source = "registry+https://github.com/rust-lang/crates.io-index"
1704checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781"
1705dependencies = [
1706 "block2 0.5.1",
1707 "objc2 0.5.2",
1708 "objc2-contacts",
1709 "objc2-foundation 0.2.2",
1710]
1711
1712[[package]]
1713name = "objc2-encode"
1714version = "4.1.0"
1715source = "registry+https://github.com/rust-lang/crates.io-index"
1716checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
1717
1718[[package]]
1719name = "objc2-foundation"
1720version = "0.2.2"
1721source = "registry+https://github.com/rust-lang/crates.io-index"
1722checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
1723dependencies = [
1724 "bitflags 2.13.0",
1725 "block2 0.5.1",
1726 "dispatch",
1727 "libc",
1728 "objc2 0.5.2",
1729]
1730
1731[[package]]
1732name = "objc2-foundation"
1733version = "0.3.2"
1734source = "registry+https://github.com/rust-lang/crates.io-index"
1735checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
1736dependencies = [
1737 "bitflags 2.13.0",
1738 "block2 0.6.2",
1739 "objc2 0.6.4",
1740 "objc2-core-foundation",
1741]
1742
1743[[package]]
1744name = "objc2-io-surface"
1745version = "0.3.2"
1746source = "registry+https://github.com/rust-lang/crates.io-index"
1747checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
1748dependencies = [
1749 "bitflags 2.13.0",
1750 "objc2 0.6.4",
1751 "objc2-core-foundation",
1752]
1753
1754[[package]]
1755name = "objc2-link-presentation"
1756version = "0.2.2"
1757source = "registry+https://github.com/rust-lang/crates.io-index"
1758checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
1759dependencies = [
1760 "block2 0.5.1",
1761 "objc2 0.5.2",
1762 "objc2-app-kit 0.2.2",
1763 "objc2-foundation 0.2.2",
1764]
1765
1766[[package]]
1767name = "objc2-metal"
1768version = "0.2.2"
1769source = "registry+https://github.com/rust-lang/crates.io-index"
1770checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
1771dependencies = [
1772 "bitflags 2.13.0",
1773 "block2 0.5.1",
1774 "objc2 0.5.2",
1775 "objc2-foundation 0.2.2",
1776]
1777
1778[[package]]
1779name = "objc2-quartz-core"
1780version = "0.2.2"
1781source = "registry+https://github.com/rust-lang/crates.io-index"
1782checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
1783dependencies = [
1784 "bitflags 2.13.0",
1785 "block2 0.5.1",
1786 "objc2 0.5.2",
1787 "objc2-foundation 0.2.2",
1788 "objc2-metal",
1789]
1790
1791[[package]]
1792name = "objc2-symbols"
1793version = "0.2.2"
1794source = "registry+https://github.com/rust-lang/crates.io-index"
1795checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc"
1796dependencies = [
1797 "objc2 0.5.2",
1798 "objc2-foundation 0.2.2",
1799]
1800
1801[[package]]
1802name = "objc2-ui-kit"
1803version = "0.2.2"
1804source = "registry+https://github.com/rust-lang/crates.io-index"
1805checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f"
1806dependencies = [
1807 "bitflags 2.13.0",
1808 "block2 0.5.1",
1809 "objc2 0.5.2",
1810 "objc2-cloud-kit",
1811 "objc2-core-data",
1812 "objc2-core-image",
1813 "objc2-core-location",
1814 "objc2-foundation 0.2.2",
1815 "objc2-link-presentation",
1816 "objc2-quartz-core",
1817 "objc2-symbols",
1818 "objc2-uniform-type-identifiers",
1819 "objc2-user-notifications",
1820]
1821
1822[[package]]
1823name = "objc2-ui-kit"
1824version = "0.3.2"
1825source = "registry+https://github.com/rust-lang/crates.io-index"
1826checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
1827dependencies = [
1828 "bitflags 2.13.0",
1829 "objc2 0.6.4",
1830 "objc2-core-foundation",
1831 "objc2-foundation 0.3.2",
1832]
1833
1834[[package]]
1835name = "objc2-uniform-type-identifiers"
1836version = "0.2.2"
1837source = "registry+https://github.com/rust-lang/crates.io-index"
1838checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe"
1839dependencies = [
1840 "block2 0.5.1",
1841 "objc2 0.5.2",
1842 "objc2-foundation 0.2.2",
1843]
1844
1845[[package]]
1846name = "objc2-user-notifications"
1847version = "0.2.2"
1848source = "registry+https://github.com/rust-lang/crates.io-index"
1849checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3"
1850dependencies = [
1851 "bitflags 2.13.0",
1852 "block2 0.5.1",
1853 "objc2 0.5.2",
1854 "objc2-core-location",
1855 "objc2-foundation 0.2.2",
1856]
1857
1858[[package]]
1859name = "once_cell"
1860version = "1.21.4"
1861source = "registry+https://github.com/rust-lang/crates.io-index"
1862checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
1863
1864[[package]]
1865name = "orbclient"
1866version = "0.3.55"
1867source = "registry+https://github.com/rust-lang/crates.io-index"
1868checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747"
1869dependencies = [
1870 "libc",
1871 "libredox",
1872]
1873
1874[[package]]
1875name = "pango-sys"
1876version = "0.18.0"
1877source = "registry+https://github.com/rust-lang/crates.io-index"
1878checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
1879dependencies = [
1880 "glib-sys",
1881 "gobject-sys",
1882 "libc",
1883 "system-deps",
1884]
1885
1886[[package]]
1887name = "parking_lot"
1888version = "0.12.5"
1889source = "registry+https://github.com/rust-lang/crates.io-index"
1890checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
1891dependencies = [
1892 "lock_api",
1893 "parking_lot_core",
1894]
1895
1896[[package]]
1897name = "parking_lot_core"
1898version = "0.9.12"
1899source = "registry+https://github.com/rust-lang/crates.io-index"
1900checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
1901dependencies = [
1902 "cfg-if",
1903 "libc",
1904 "redox_syscall 0.5.18",
1905 "smallvec",
1906 "windows-link",
1907]
1908
1909[[package]]
1910name = "peniko"
1911version = "0.6.1"
1912source = "registry+https://github.com/rust-lang/crates.io-index"
1913checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6"
1914dependencies = [
1915 "bytemuck",
1916 "color",
1917 "kurbo",
1918 "linebender_resource_handle",
1919 "smallvec",
1920]
1921
1922[[package]]
1923name = "percent-encoding"
1924version = "2.3.2"
1925source = "registry+https://github.com/rust-lang/crates.io-index"
1926checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
1927
1928[[package]]
1929name = "pin-project"
1930version = "1.1.13"
1931source = "registry+https://github.com/rust-lang/crates.io-index"
1932checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924"
1933dependencies = [
1934 "pin-project-internal",
1935]
1936
1937[[package]]
1938name = "pin-project-internal"
1939version = "1.1.13"
1940source = "registry+https://github.com/rust-lang/crates.io-index"
1941checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b"
1942dependencies = [
1943 "proc-macro2",
1944 "quote",
1945 "syn",
1946]
1947
1948[[package]]
1949name = "pin-project-lite"
1950version = "0.2.17"
1951source = "registry+https://github.com/rust-lang/crates.io-index"
1952checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
1953
1954[[package]]
1955name = "pkg-config"
1956version = "0.3.33"
1957source = "registry+https://github.com/rust-lang/crates.io-index"
1958checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e"
1959
1960[[package]]
1961name = "plain"
1962version = "0.2.3"
1963source = "registry+https://github.com/rust-lang/crates.io-index"
1964checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
1965
1966[[package]]
1967name = "png"
1968version = "0.18.1"
1969source = "registry+https://github.com/rust-lang/crates.io-index"
1970checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
1971dependencies = [
1972 "bitflags 2.13.0",
1973 "crc32fast",
1974 "fdeflate",
1975 "flate2",
1976 "miniz_oxide",
1977]
1978
1979[[package]]
1980name = "polling"
1981version = "3.11.0"
1982source = "registry+https://github.com/rust-lang/crates.io-index"
1983checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
1984dependencies = [
1985 "cfg-if",
1986 "concurrent-queue",
1987 "hermit-abi",
1988 "pin-project-lite",
1989 "rustix 1.1.4",
1990 "windows-sys 0.61.2",
1991]
1992
1993[[package]]
1994name = "pollster"
1995version = "0.4.0"
1996source = "registry+https://github.com/rust-lang/crates.io-index"
1997checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
1998
1999[[package]]
2000name = "polycool"
2001version = "0.4.0"
2002source = "registry+https://github.com/rust-lang/crates.io-index"
2003checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6"
2004dependencies = [
2005 "arrayvec",
2006]
2007
2008[[package]]
2009name = "portable-atomic"
2010version = "1.13.1"
2011source = "registry+https://github.com/rust-lang/crates.io-index"
2012checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
2013
2014[[package]]
2015name = "portable-atomic-util"
2016version = "0.2.7"
2017source = "registry+https://github.com/rust-lang/crates.io-index"
2018checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618"
2019dependencies = [
2020 "portable-atomic",
2021]
2022
2023[[package]]
2024name = "potential_utf"
2025version = "0.1.5"
2026source = "registry+https://github.com/rust-lang/crates.io-index"
2027checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
2028dependencies = [
2029 "zerovec",
2030]
2031
2032[[package]]
2033name = "proc-macro-crate"
2034version = "3.5.0"
2035source = "registry+https://github.com/rust-lang/crates.io-index"
2036checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
2037dependencies = [
2038 "toml_edit 0.25.12+spec-1.1.0",
2039]
2040
2041[[package]]
2042name = "proc-macro2"
2043version = "1.0.106"
2044source = "registry+https://github.com/rust-lang/crates.io-index"
2045checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
2046dependencies = [
2047 "unicode-ident",
2048]
2049
2050[[package]]
2051name = "profiling"
2052version = "1.0.18"
2053source = "registry+https://github.com/rust-lang/crates.io-index"
2054checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5"
2055
2056[[package]]
2057name = "pxfm"
2058version = "0.1.29"
2059source = "registry+https://github.com/rust-lang/crates.io-index"
2060checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f"
2061
2062[[package]]
2063name = "quick-error"
2064version = "2.0.1"
2065source = "registry+https://github.com/rust-lang/crates.io-index"
2066checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
2067
2068[[package]]
2069name = "quick-xml"
2070version = "0.39.4"
2071source = "registry+https://github.com/rust-lang/crates.io-index"
2072checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e"
2073dependencies = [
2074 "memchr",
2075]
2076
2077[[package]]
2078name = "quote"
2079version = "1.0.46"
2080source = "registry+https://github.com/rust-lang/crates.io-index"
2081checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
2082dependencies = [
2083 "proc-macro2",
2084]
2085
2086[[package]]
2087name = "r-efi"
2088version = "5.3.0"
2089source = "registry+https://github.com/rust-lang/crates.io-index"
2090checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
2091
2092[[package]]
2093name = "raw-window-handle"
2094version = "0.6.2"
2095source = "registry+https://github.com/rust-lang/crates.io-index"
2096checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
2097
2098[[package]]
2099name = "read-fonts"
2100version = "0.39.2"
2101source = "registry+https://github.com/rust-lang/crates.io-index"
2102checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81"
2103dependencies = [
2104 "bytemuck",
2105 "font-types",
2106]
2107
2108[[package]]
2109name = "redox_syscall"
2110version = "0.4.1"
2111source = "registry+https://github.com/rust-lang/crates.io-index"
2112checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
2113dependencies = [
2114 "bitflags 1.3.2",
2115]
2116
2117[[package]]
2118name = "redox_syscall"
2119version = "0.5.18"
2120source = "registry+https://github.com/rust-lang/crates.io-index"
2121checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
2122dependencies = [
2123 "bitflags 2.13.0",
2124]
2125
2126[[package]]
2127name = "redox_syscall"
2128version = "0.8.1"
2129source = "registry+https://github.com/rust-lang/crates.io-index"
2130checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7"
2131dependencies = [
2132 "bitflags 2.13.0",
2133]
2134
2135[[package]]
2136name = "regex"
2137version = "1.12.4"
2138source = "registry+https://github.com/rust-lang/crates.io-index"
2139checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
2140dependencies = [
2141 "aho-corasick",
2142 "memchr",
2143 "regex-automata",
2144 "regex-syntax",
2145]
2146
2147[[package]]
2148name = "regex-automata"
2149version = "0.4.14"
2150source = "registry+https://github.com/rust-lang/crates.io-index"
2151checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
2152dependencies = [
2153 "aho-corasick",
2154 "memchr",
2155 "regex-syntax",
2156]
2157
2158[[package]]
2159name = "regex-syntax"
2160version = "0.8.11"
2161source = "registry+https://github.com/rust-lang/crates.io-index"
2162checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
2163
2164[[package]]
2165name = "renderdoc-sys"
2166version = "1.1.0"
2167source = "registry+https://github.com/rust-lang/crates.io-index"
2168checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
2169
2170[[package]]
2171name = "rfd"
2172version = "0.15.4"
2173source = "registry+https://github.com/rust-lang/crates.io-index"
2174checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed"
2175dependencies = [
2176 "block2 0.6.2",
2177 "dispatch2",
2178 "glib-sys",
2179 "gobject-sys",
2180 "gtk-sys",
2181 "js-sys",
2182 "log",
2183 "objc2 0.6.4",
2184 "objc2-app-kit 0.3.2",
2185 "objc2-core-foundation",
2186 "objc2-foundation 0.3.2",
2187 "pollster",
2188 "raw-window-handle",
2189 "wasm-bindgen",
2190 "wasm-bindgen-futures",
2191 "web-sys",
2192 "windows-sys 0.59.0",
2193]
2194
2195[[package]]
2196name = "ring"
2197version = "0.17.14"
2198source = "registry+https://github.com/rust-lang/crates.io-index"
2199checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
2200dependencies = [
2201 "cc",
2202 "cfg-if",
2203 "getrandom 0.2.17",
2204 "libc",
2205 "untrusted",
2206 "windows-sys 0.52.0",
2207]
2208
2209[[package]]
2210name = "rustc-hash"
2211version = "1.1.0"
2212source = "registry+https://github.com/rust-lang/crates.io-index"
2213checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
2214
2215[[package]]
2216name = "rustc-hash"
2217version = "2.1.2"
2218source = "registry+https://github.com/rust-lang/crates.io-index"
2219checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
2220
2221[[package]]
2222name = "rustc_version"
2223version = "0.4.1"
2224source = "registry+https://github.com/rust-lang/crates.io-index"
2225checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
2226dependencies = [
2227 "semver",
2228]
2229
2230[[package]]
2231name = "rustix"
2232version = "0.38.44"
2233source = "registry+https://github.com/rust-lang/crates.io-index"
2234checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
2235dependencies = [
2236 "bitflags 2.13.0",
2237 "errno",
2238 "libc",
2239 "linux-raw-sys 0.4.15",
2240 "windows-sys 0.59.0",
2241]
2242
2243[[package]]
2244name = "rustix"
2245version = "1.1.4"
2246source = "registry+https://github.com/rust-lang/crates.io-index"
2247checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190"
2248dependencies = [
2249 "bitflags 2.13.0",
2250 "errno",
2251 "libc",
2252 "linux-raw-sys 0.12.1",
2253 "windows-sys 0.61.2",
2254]
2255
2256[[package]]
2257name = "rustls"
2258version = "0.23.41"
2259source = "registry+https://github.com/rust-lang/crates.io-index"
2260checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f"
2261dependencies = [
2262 "log",
2263 "once_cell",
2264 "ring",
2265 "rustls-pki-types",
2266 "rustls-webpki",
2267 "subtle",
2268 "zeroize",
2269]
2270
2271[[package]]
2272name = "rustls-pki-types"
2273version = "1.14.1"
2274source = "registry+https://github.com/rust-lang/crates.io-index"
2275checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
2276dependencies = [
2277 "zeroize",
2278]
2279
2280[[package]]
2281name = "rustls-webpki"
2282version = "0.103.13"
2283source = "registry+https://github.com/rust-lang/crates.io-index"
2284checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
2285dependencies = [
2286 "ring",
2287 "rustls-pki-types",
2288 "untrusted",
2289]
2290
2291[[package]]
2292name = "rustversion"
2293version = "1.0.22"
2294source = "registry+https://github.com/rust-lang/crates.io-index"
2295checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
2296
2297[[package]]
2298name = "same-file"
2299version = "1.0.6"
2300source = "registry+https://github.com/rust-lang/crates.io-index"
2301checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
2302dependencies = [
2303 "winapi-util",
2304]
2305
2306[[package]]
2307name = "scoped-tls"
2308version = "1.0.1"
2309source = "registry+https://github.com/rust-lang/crates.io-index"
2310checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
2311
2312[[package]]
2313name = "scopeguard"
2314version = "1.2.0"
2315source = "registry+https://github.com/rust-lang/crates.io-index"
2316checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
2317
2318[[package]]
2319name = "self_cell"
2320version = "1.2.2"
2321source = "registry+https://github.com/rust-lang/crates.io-index"
2322checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89"
2323
2324[[package]]
2325name = "semver"
2326version = "1.0.28"
2327source = "registry+https://github.com/rust-lang/crates.io-index"
2328checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
2329
2330[[package]]
2331name = "serde"
2332version = "1.0.228"
2333source = "registry+https://github.com/rust-lang/crates.io-index"
2334checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
2335dependencies = [
2336 "serde_core",
2337 "serde_derive",
2338]
2339
2340[[package]]
2341name = "serde_core"
2342version = "1.0.228"
2343source = "registry+https://github.com/rust-lang/crates.io-index"
2344checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
2345dependencies = [
2346 "serde_derive",
2347]
2348
2349[[package]]
2350name = "serde_derive"
2351version = "1.0.228"
2352source = "registry+https://github.com/rust-lang/crates.io-index"
2353checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
2354dependencies = [
2355 "proc-macro2",
2356 "quote",
2357 "syn",
2358]
2359
2360[[package]]
2361name = "serde_json"
2362version = "1.0.150"
2363source = "registry+https://github.com/rust-lang/crates.io-index"
2364checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
2365dependencies = [
2366 "itoa",
2367 "memchr",
2368 "serde",
2369 "serde_core",
2370 "zmij",
2371]
2372
2373[[package]]
2374name = "serde_spanned"
2375version = "0.6.9"
2376source = "registry+https://github.com/rust-lang/crates.io-index"
2377checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
2378dependencies = [
2379 "serde",
2380]
2381
2382[[package]]
2383name = "shlex"
2384version = "2.0.1"
2385source = "registry+https://github.com/rust-lang/crates.io-index"
2386checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
2387
2388[[package]]
2389name = "simd-adler32"
2390version = "0.3.9"
2391source = "registry+https://github.com/rust-lang/crates.io-index"
2392checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
2393
2394[[package]]
2395name = "simd_cesu8"
2396version = "1.1.1"
2397source = "registry+https://github.com/rust-lang/crates.io-index"
2398checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33"
2399dependencies = [
2400 "rustc_version",
2401 "simdutf8",
2402]
2403
2404[[package]]
2405name = "simdutf8"
2406version = "0.1.5"
2407source = "registry+https://github.com/rust-lang/crates.io-index"
2408checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
2409
2410[[package]]
2411name = "skrifa"
2412version = "0.42.1"
2413source = "registry+https://github.com/rust-lang/crates.io-index"
2414checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564"
2415dependencies = [
2416 "bytemuck",
2417 "read-fonts",
2418]
2419
2420[[package]]
2421name = "slab"
2422version = "0.4.12"
2423source = "registry+https://github.com/rust-lang/crates.io-index"
2424checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
2425
2426[[package]]
2427name = "slotmap"
2428version = "1.1.1"
2429source = "registry+https://github.com/rust-lang/crates.io-index"
2430checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038"
2431dependencies = [
2432 "version_check",
2433]
2434
2435[[package]]
2436name = "smallvec"
2437version = "1.15.2"
2438source = "registry+https://github.com/rust-lang/crates.io-index"
2439checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
2440
2441[[package]]
2442name = "smithay-client-toolkit"
2443version = "0.20.0"
2444source = "registry+https://github.com/rust-lang/crates.io-index"
2445checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0"
2446dependencies = [
2447 "bitflags 2.13.0",
2448 "calloop 0.14.4",
2449 "calloop-wayland-source",
2450 "cursor-icon",
2451 "libc",
2452 "log",
2453 "memmap2",
2454 "rustix 1.1.4",
2455 "thiserror 2.0.18",
2456 "wayland-backend",
2457 "wayland-client",
2458 "wayland-csd-frame",
2459 "wayland-cursor",
2460 "wayland-protocols",
2461 "wayland-protocols-experimental",
2462 "wayland-protocols-misc",
2463 "wayland-protocols-wlr",
2464 "wayland-scanner",
2465 "xkeysym",
2466]
2467
2468[[package]]
2469name = "smithay-clipboard"
2470version = "0.7.3"
2471source = "registry+https://github.com/rust-lang/crates.io-index"
2472checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226"
2473dependencies = [
2474 "libc",
2475 "smithay-client-toolkit",
2476 "wayland-backend",
2477]
2478
2479[[package]]
2480name = "smol_str"
2481version = "0.2.2"
2482source = "registry+https://github.com/rust-lang/crates.io-index"
2483checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead"
2484dependencies = [
2485 "serde",
2486]
2487
2488[[package]]
2489name = "stable_deref_trait"
2490version = "1.2.1"
2491source = "registry+https://github.com/rust-lang/crates.io-index"
2492checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
2493
2494[[package]]
2495name = "static_assertions"
2496version = "1.1.0"
2497source = "registry+https://github.com/rust-lang/crates.io-index"
2498checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
2499
2500[[package]]
2501name = "subtle"
2502version = "2.6.1"
2503source = "registry+https://github.com/rust-lang/crates.io-index"
2504checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
2505
2506[[package]]
2507name = "syn"
2508version = "2.0.118"
2509source = "registry+https://github.com/rust-lang/crates.io-index"
2510checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
2511dependencies = [
2512 "proc-macro2",
2513 "quote",
2514 "unicode-ident",
2515]
2516
2517[[package]]
2518name = "synstructure"
2519version = "0.13.2"
2520source = "registry+https://github.com/rust-lang/crates.io-index"
2521checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
2522dependencies = [
2523 "proc-macro2",
2524 "quote",
2525 "syn",
2526]
2527
2528[[package]]
2529name = "system-deps"
2530version = "6.2.2"
2531source = "registry+https://github.com/rust-lang/crates.io-index"
2532checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
2533dependencies = [
2534 "cfg-expr",
2535 "heck",
2536 "pkg-config",
2537 "toml",
2538 "version-compare",
2539]
2540
2541[[package]]
2542name = "target-lexicon"
2543version = "0.12.16"
2544source = "registry+https://github.com/rust-lang/crates.io-index"
2545checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
2546
2547[[package]]
2548name = "thiserror"
2549version = "1.0.69"
2550source = "registry+https://github.com/rust-lang/crates.io-index"
2551checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
2552dependencies = [
2553 "thiserror-impl 1.0.69",
2554]
2555
2556[[package]]
2557name = "thiserror"
2558version = "2.0.18"
2559source = "registry+https://github.com/rust-lang/crates.io-index"
2560checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
2561dependencies = [
2562 "thiserror-impl 2.0.18",
2563]
2564
2565[[package]]
2566name = "thiserror-impl"
2567version = "1.0.69"
2568source = "registry+https://github.com/rust-lang/crates.io-index"
2569checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
2570dependencies = [
2571 "proc-macro2",
2572 "quote",
2573 "syn",
2574]
2575
2576[[package]]
2577name = "thiserror-impl"
2578version = "2.0.18"
2579source = "registry+https://github.com/rust-lang/crates.io-index"
2580checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
2581dependencies = [
2582 "proc-macro2",
2583 "quote",
2584 "syn",
2585]
2586
2587[[package]]
2588name = "tiff"
2589version = "0.11.3"
2590source = "registry+https://github.com/rust-lang/crates.io-index"
2591checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52"
2592dependencies = [
2593 "fax",
2594 "flate2",
2595 "half",
2596 "quick-error",
2597 "weezl",
2598 "zune-jpeg",
2599]
2600
2601[[package]]
2602name = "tinystr"
2603version = "0.8.3"
2604source = "registry+https://github.com/rust-lang/crates.io-index"
2605checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
2606dependencies = [
2607 "displaydoc",
2608 "zerovec",
2609]
2610
2611[[package]]
2612name = "toml"
2613version = "0.8.23"
2614source = "registry+https://github.com/rust-lang/crates.io-index"
2615checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
2616dependencies = [
2617 "serde",
2618 "serde_spanned",
2619 "toml_datetime 0.6.11",
2620 "toml_edit 0.22.27",
2621]
2622
2623[[package]]
2624name = "toml_datetime"
2625version = "0.6.11"
2626source = "registry+https://github.com/rust-lang/crates.io-index"
2627checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
2628dependencies = [
2629 "serde",
2630]
2631
2632[[package]]
2633name = "toml_datetime"
2634version = "1.1.1+spec-1.1.0"
2635source = "registry+https://github.com/rust-lang/crates.io-index"
2636checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
2637dependencies = [
2638 "serde_core",
2639]
2640
2641[[package]]
2642name = "toml_edit"
2643version = "0.22.27"
2644source = "registry+https://github.com/rust-lang/crates.io-index"
2645checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
2646dependencies = [
2647 "indexmap",
2648 "serde",
2649 "serde_spanned",
2650 "toml_datetime 0.6.11",
2651 "winnow 0.7.15",
2652]
2653
2654[[package]]
2655name = "toml_edit"
2656version = "0.25.12+spec-1.1.0"
2657source = "registry+https://github.com/rust-lang/crates.io-index"
2658checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
2659dependencies = [
2660 "indexmap",
2661 "toml_datetime 1.1.1+spec-1.1.0",
2662 "toml_parser",
2663 "winnow 1.0.3",
2664]
2665
2666[[package]]
2667name = "toml_parser"
2668version = "1.1.2+spec-1.1.0"
2669source = "registry+https://github.com/rust-lang/crates.io-index"
2670checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
2671dependencies = [
2672 "winnow 1.0.3",
2673]
2674
2675[[package]]
2676name = "tracing"
2677version = "0.1.44"
2678source = "registry+https://github.com/rust-lang/crates.io-index"
2679checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
2680dependencies = [
2681 "log",
2682 "pin-project-lite",
2683 "tracing-core",
2684]
2685
2686[[package]]
2687name = "tracing-core"
2688version = "0.1.36"
2689source = "registry+https://github.com/rust-lang/crates.io-index"
2690checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
2691
2692[[package]]
2693name = "type-map"
2694version = "0.5.1"
2695source = "registry+https://github.com/rust-lang/crates.io-index"
2696checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90"
2697dependencies = [
2698 "rustc-hash 2.1.2",
2699]
2700
2701[[package]]
2702name = "unicode-general-category"
2703version = "1.1.0"
2704source = "registry+https://github.com/rust-lang/crates.io-index"
2705checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f"
2706
2707[[package]]
2708name = "unicode-ident"
2709version = "1.0.24"
2710source = "registry+https://github.com/rust-lang/crates.io-index"
2711checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
2712
2713[[package]]
2714name = "unicode-segmentation"
2715version = "1.13.3"
2716source = "registry+https://github.com/rust-lang/crates.io-index"
2717checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
2718
2719[[package]]
2720name = "unicode-width"
2721version = "0.2.2"
2722source = "registry+https://github.com/rust-lang/crates.io-index"
2723checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
2724
2725[[package]]
2726name = "untrusted"
2727version = "0.9.0"
2728source = "registry+https://github.com/rust-lang/crates.io-index"
2729checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2730
2731[[package]]
2732name = "ureq"
2733version = "3.3.0"
2734source = "registry+https://github.com/rust-lang/crates.io-index"
2735checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0"
2736dependencies = [
2737 "base64",
2738 "flate2",
2739 "log",
2740 "percent-encoding",
2741 "rustls",
2742 "rustls-pki-types",
2743 "ureq-proto",
2744 "utf8-zero",
2745 "webpki-roots",
2746]
2747
2748[[package]]
2749name = "ureq-proto"
2750version = "0.6.0"
2751source = "registry+https://github.com/rust-lang/crates.io-index"
2752checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c"
2753dependencies = [
2754 "base64",
2755 "http",
2756 "httparse",
2757 "log",
2758]
2759
2760[[package]]
2761name = "url"
2762version = "2.5.8"
2763source = "registry+https://github.com/rust-lang/crates.io-index"
2764checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
2765dependencies = [
2766 "form_urlencoded",
2767 "idna",
2768 "percent-encoding",
2769 "serde",
2770]
2771
2772[[package]]
2773name = "utf8-zero"
2774version = "0.8.1"
2775source = "registry+https://github.com/rust-lang/crates.io-index"
2776checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e"
2777
2778[[package]]
2779name = "utf8_iter"
2780version = "1.0.4"
2781source = "registry+https://github.com/rust-lang/crates.io-index"
2782checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2783
2784[[package]]
2785name = "uuid"
2786version = "1.23.4"
2787source = "registry+https://github.com/rust-lang/crates.io-index"
2788checksum = "bf80a72845275afea99e7f2b434723d3bc7e38470fcd1c7ed39a599c73319a53"
2789
2790[[package]]
2791name = "vello_common"
2792version = "0.0.9"
2793source = "registry+https://github.com/rust-lang/crates.io-index"
2794checksum = "19d672facaa2d697285a786cd9d44d614cd2ce54cdc022504bf339f8fff3b750"
2795dependencies = [
2796 "bytemuck",
2797 "fearless_simd",
2798 "guillotiere",
2799 "hashbrown 0.17.1",
2800 "log",
2801 "peniko",
2802 "smallvec",
2803 "thiserror 2.0.18",
2804]
2805
2806[[package]]
2807name = "vello_cpu"
2808version = "0.0.9"
2809source = "registry+https://github.com/rust-lang/crates.io-index"
2810checksum = "588691169aed86b5c8fb487266afee01323234e6fd0a3f2aaec0eaa8e4007f23"
2811dependencies = [
2812 "bytemuck",
2813 "glifo",
2814 "hashbrown 0.17.1",
2815 "vello_common",
2816]
2817
2818[[package]]
2819name = "version-compare"
2820version = "0.2.1"
2821source = "registry+https://github.com/rust-lang/crates.io-index"
2822checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
2823
2824[[package]]
2825name = "version_check"
2826version = "0.9.5"
2827source = "registry+https://github.com/rust-lang/crates.io-index"
2828checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2829
2830[[package]]
2831name = "walkdir"
2832version = "2.5.0"
2833source = "registry+https://github.com/rust-lang/crates.io-index"
2834checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
2835dependencies = [
2836 "same-file",
2837 "winapi-util",
2838]
2839
2840[[package]]
2841name = "wasi"
2842version = "0.11.1+wasi-snapshot-preview1"
2843source = "registry+https://github.com/rust-lang/crates.io-index"
2844checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
2845
2846[[package]]
2847name = "wasip2"
2848version = "1.0.4+wasi-0.2.12"
2849source = "registry+https://github.com/rust-lang/crates.io-index"
2850checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
2851dependencies = [
2852 "wit-bindgen",
2853]
2854
2855[[package]]
2856name = "wasm-bindgen"
2857version = "0.2.126"
2858source = "registry+https://github.com/rust-lang/crates.io-index"
2859checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
2860dependencies = [
2861 "cfg-if",
2862 "once_cell",
2863 "rustversion",
2864 "wasm-bindgen-macro",
2865 "wasm-bindgen-shared",
2866]
2867
2868[[package]]
2869name = "wasm-bindgen-futures"
2870version = "0.4.76"
2871source = "registry+https://github.com/rust-lang/crates.io-index"
2872checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d"
2873dependencies = [
2874 "js-sys",
2875 "wasm-bindgen",
2876]
2877
2878[[package]]
2879name = "wasm-bindgen-macro"
2880version = "0.2.126"
2881source = "registry+https://github.com/rust-lang/crates.io-index"
2882checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
2883dependencies = [
2884 "quote",
2885 "wasm-bindgen-macro-support",
2886]
2887
2888[[package]]
2889name = "wasm-bindgen-macro-support"
2890version = "0.2.126"
2891source = "registry+https://github.com/rust-lang/crates.io-index"
2892checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
2893dependencies = [
2894 "bumpalo",
2895 "proc-macro2",
2896 "quote",
2897 "syn",
2898 "wasm-bindgen-shared",
2899]
2900
2901[[package]]
2902name = "wasm-bindgen-shared"
2903version = "0.2.126"
2904source = "registry+https://github.com/rust-lang/crates.io-index"
2905checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
2906dependencies = [
2907 "unicode-ident",
2908]
2909
2910[[package]]
2911name = "wayland-backend"
2912version = "0.3.15"
2913source = "registry+https://github.com/rust-lang/crates.io-index"
2914checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d"
2915dependencies = [
2916 "cc",
2917 "downcast-rs",
2918 "rustix 1.1.4",
2919 "scoped-tls",
2920 "smallvec",
2921 "wayland-sys",
2922]
2923
2924[[package]]
2925name = "wayland-client"
2926version = "0.31.14"
2927source = "registry+https://github.com/rust-lang/crates.io-index"
2928checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144"
2929dependencies = [
2930 "bitflags 2.13.0",
2931 "rustix 1.1.4",
2932 "wayland-backend",
2933 "wayland-scanner",
2934]
2935
2936[[package]]
2937name = "wayland-csd-frame"
2938version = "0.3.0"
2939source = "registry+https://github.com/rust-lang/crates.io-index"
2940checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
2941dependencies = [
2942 "bitflags 2.13.0",
2943 "cursor-icon",
2944 "wayland-backend",
2945]
2946
2947[[package]]
2948name = "wayland-cursor"
2949version = "0.31.14"
2950source = "registry+https://github.com/rust-lang/crates.io-index"
2951checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d"
2952dependencies = [
2953 "rustix 1.1.4",
2954 "wayland-client",
2955 "xcursor",
2956]
2957
2958[[package]]
2959name = "wayland-protocols"
2960version = "0.32.13"
2961source = "registry+https://github.com/rust-lang/crates.io-index"
2962checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6"
2963dependencies = [
2964 "bitflags 2.13.0",
2965 "wayland-backend",
2966 "wayland-client",
2967 "wayland-scanner",
2968]
2969
2970[[package]]
2971name = "wayland-protocols-experimental"
2972version = "20250721.0.1"
2973source = "registry+https://github.com/rust-lang/crates.io-index"
2974checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1"
2975dependencies = [
2976 "bitflags 2.13.0",
2977 "wayland-backend",
2978 "wayland-client",
2979 "wayland-protocols",
2980 "wayland-scanner",
2981]
2982
2983[[package]]
2984name = "wayland-protocols-misc"
2985version = "0.3.12"
2986source = "registry+https://github.com/rust-lang/crates.io-index"
2987checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8"
2988dependencies = [
2989 "bitflags 2.13.0",
2990 "wayland-backend",
2991 "wayland-client",
2992 "wayland-protocols",
2993 "wayland-scanner",
2994]
2995
2996[[package]]
2997name = "wayland-protocols-wlr"
2998version = "0.3.12"
2999source = "registry+https://github.com/rust-lang/crates.io-index"
3000checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234"
3001dependencies = [
3002 "bitflags 2.13.0",
3003 "wayland-backend",
3004 "wayland-client",
3005 "wayland-protocols",
3006 "wayland-scanner",
3007]
3008
3009[[package]]
3010name = "wayland-scanner"
3011version = "0.31.10"
3012source = "registry+https://github.com/rust-lang/crates.io-index"
3013checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a"
3014dependencies = [
3015 "proc-macro2",
3016 "quick-xml",
3017 "quote",
3018]
3019
3020[[package]]
3021name = "wayland-sys"
3022version = "0.31.11"
3023source = "registry+https://github.com/rust-lang/crates.io-index"
3024checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be"
3025dependencies = [
3026 "dlib",
3027 "log",
3028 "once_cell",
3029 "pkg-config",
3030]
3031
3032[[package]]
3033name = "web-sys"
3034version = "0.3.103"
3035source = "registry+https://github.com/rust-lang/crates.io-index"
3036checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141"
3037dependencies = [
3038 "js-sys",
3039 "wasm-bindgen",
3040]
3041
3042[[package]]
3043name = "web-time"
3044version = "1.1.0"
3045source = "registry+https://github.com/rust-lang/crates.io-index"
3046checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
3047dependencies = [
3048 "js-sys",
3049 "wasm-bindgen",
3050]
3051
3052[[package]]
3053name = "webbrowser"
3054version = "1.2.1"
3055source = "registry+https://github.com/rust-lang/crates.io-index"
3056checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72"
3057dependencies = [
3058 "core-foundation 0.10.1",
3059 "jni",
3060 "log",
3061 "ndk-context",
3062 "objc2 0.6.4",
3063 "objc2-foundation 0.3.2",
3064 "url",
3065 "web-sys",
3066]
3067
3068[[package]]
3069name = "webpki-roots"
3070version = "1.0.8"
3071source = "registry+https://github.com/rust-lang/crates.io-index"
3072checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf"
3073dependencies = [
3074 "rustls-pki-types",
3075]
3076
3077[[package]]
3078name = "weezl"
3079version = "0.1.12"
3080source = "registry+https://github.com/rust-lang/crates.io-index"
3081checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
3082
3083[[package]]
3084name = "wgpu"
3085version = "29.0.3"
3086source = "registry+https://github.com/rust-lang/crates.io-index"
3087checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250"
3088dependencies = [
3089 "arrayvec",
3090 "bitflags 2.13.0",
3091 "bytemuck",
3092 "cfg-if",
3093 "cfg_aliases",
3094 "document-features",
3095 "hashbrown 0.16.1",
3096 "js-sys",
3097 "log",
3098 "portable-atomic",
3099 "profiling",
3100 "raw-window-handle",
3101 "smallvec",
3102 "static_assertions",
3103 "wasm-bindgen",
3104 "wasm-bindgen-futures",
3105 "web-sys",
3106 "wgpu-core",
3107 "wgpu-hal",
3108 "wgpu-types",
3109]
3110
3111[[package]]
3112name = "wgpu-core"
3113version = "29.0.3"
3114source = "registry+https://github.com/rust-lang/crates.io-index"
3115checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7"
3116dependencies = [
3117 "arrayvec",
3118 "bit-set",
3119 "bit-vec",
3120 "bitflags 2.13.0",
3121 "bytemuck",
3122 "cfg_aliases",
3123 "document-features",
3124 "hashbrown 0.16.1",
3125 "indexmap",
3126 "log",
3127 "naga",
3128 "once_cell",
3129 "parking_lot",
3130 "portable-atomic",
3131 "profiling",
3132 "raw-window-handle",
3133 "rustc-hash 1.1.0",
3134 "smallvec",
3135 "thiserror 2.0.18",
3136 "wgpu-core-deps-windows-linux-android",
3137 "wgpu-hal",
3138 "wgpu-naga-bridge",
3139 "wgpu-types",
3140]
3141
3142[[package]]
3143name = "wgpu-core-deps-windows-linux-android"
3144version = "29.0.3"
3145source = "registry+https://github.com/rust-lang/crates.io-index"
3146checksum = "1bfb01076d0aa08b0ba9bd741e178b5cc440f5abe99d9581323a4c8b5d1a1916"
3147dependencies = [
3148 "wgpu-hal",
3149]
3150
3151[[package]]
3152name = "wgpu-hal"
3153version = "29.0.3"
3154source = "registry+https://github.com/rust-lang/crates.io-index"
3155checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f"
3156dependencies = [
3157 "bitflags 2.13.0",
3158 "cfg-if",
3159 "cfg_aliases",
3160 "libloading",
3161 "log",
3162 "naga",
3163 "portable-atomic",
3164 "portable-atomic-util",
3165 "raw-window-handle",
3166 "renderdoc-sys",
3167 "thiserror 2.0.18",
3168 "wgpu-naga-bridge",
3169 "wgpu-types",
3170]
3171
3172[[package]]
3173name = "wgpu-naga-bridge"
3174version = "29.0.3"
3175source = "registry+https://github.com/rust-lang/crates.io-index"
3176checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02"
3177dependencies = [
3178 "naga",
3179 "wgpu-types",
3180]
3181
3182[[package]]
3183name = "wgpu-types"
3184version = "29.0.3"
3185source = "registry+https://github.com/rust-lang/crates.io-index"
3186checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639"
3187dependencies = [
3188 "bitflags 2.13.0",
3189 "bytemuck",
3190 "js-sys",
3191 "log",
3192 "raw-window-handle",
3193 "web-sys",
3194]
3195
3196[[package]]
3197name = "winapi"
3198version = "0.3.9"
3199source = "registry+https://github.com/rust-lang/crates.io-index"
3200checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
3201dependencies = [
3202 "winapi-i686-pc-windows-gnu",
3203 "winapi-x86_64-pc-windows-gnu",
3204]
3205
3206[[package]]
3207name = "winapi-i686-pc-windows-gnu"
3208version = "0.4.0"
3209source = "registry+https://github.com/rust-lang/crates.io-index"
3210checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
3211
3212[[package]]
3213name = "winapi-util"
3214version = "0.1.11"
3215source = "registry+https://github.com/rust-lang/crates.io-index"
3216checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
3217dependencies = [
3218 "windows-sys 0.61.2",
3219]
3220
3221[[package]]
3222name = "winapi-x86_64-pc-windows-gnu"
3223version = "0.4.0"
3224source = "registry+https://github.com/rust-lang/crates.io-index"
3225checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
3226
3227[[package]]
3228name = "windows-link"
3229version = "0.2.1"
3230source = "registry+https://github.com/rust-lang/crates.io-index"
3231checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
3232
3233[[package]]
3234name = "windows-sys"
3235version = "0.52.0"
3236source = "registry+https://github.com/rust-lang/crates.io-index"
3237checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
3238dependencies = [
3239 "windows-targets",
3240]
3241
3242[[package]]
3243name = "windows-sys"
3244version = "0.59.0"
3245source = "registry+https://github.com/rust-lang/crates.io-index"
3246checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
3247dependencies = [
3248 "windows-targets",
3249]
3250
3251[[package]]
3252name = "windows-sys"
3253version = "0.61.2"
3254source = "registry+https://github.com/rust-lang/crates.io-index"
3255checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
3256dependencies = [
3257 "windows-link",
3258]
3259
3260[[package]]
3261name = "windows-targets"
3262version = "0.52.6"
3263source = "registry+https://github.com/rust-lang/crates.io-index"
3264checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
3265dependencies = [
3266 "windows_aarch64_gnullvm",
3267 "windows_aarch64_msvc",
3268 "windows_i686_gnu",
3269 "windows_i686_gnullvm",
3270 "windows_i686_msvc",
3271 "windows_x86_64_gnu",
3272 "windows_x86_64_gnullvm",
3273 "windows_x86_64_msvc",
3274]
3275
3276[[package]]
3277name = "windows_aarch64_gnullvm"
3278version = "0.52.6"
3279source = "registry+https://github.com/rust-lang/crates.io-index"
3280checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
3281
3282[[package]]
3283name = "windows_aarch64_msvc"
3284version = "0.52.6"
3285source = "registry+https://github.com/rust-lang/crates.io-index"
3286checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
3287
3288[[package]]
3289name = "windows_i686_gnu"
3290version = "0.52.6"
3291source = "registry+https://github.com/rust-lang/crates.io-index"
3292checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
3293
3294[[package]]
3295name = "windows_i686_gnullvm"
3296version = "0.52.6"
3297source = "registry+https://github.com/rust-lang/crates.io-index"
3298checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
3299
3300[[package]]
3301name = "windows_i686_msvc"
3302version = "0.52.6"
3303source = "registry+https://github.com/rust-lang/crates.io-index"
3304checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
3305
3306[[package]]
3307name = "windows_x86_64_gnu"
3308version = "0.52.6"
3309source = "registry+https://github.com/rust-lang/crates.io-index"
3310checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
3311
3312[[package]]
3313name = "windows_x86_64_gnullvm"
3314version = "0.52.6"
3315source = "registry+https://github.com/rust-lang/crates.io-index"
3316checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
3317
3318[[package]]
3319name = "windows_x86_64_msvc"
3320version = "0.52.6"
3321source = "registry+https://github.com/rust-lang/crates.io-index"
3322checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
3323
3324[[package]]
3325name = "winit"
3326version = "0.30.13"
3327source = "registry+https://github.com/rust-lang/crates.io-index"
3328checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d"
3329dependencies = [
3330 "android-activity",
3331 "atomic-waker",
3332 "bitflags 2.13.0",
3333 "block2 0.5.1",
3334 "bytemuck",
3335 "calloop 0.13.0",
3336 "cfg_aliases",
3337 "concurrent-queue",
3338 "core-foundation 0.9.4",
3339 "core-graphics",
3340 "cursor-icon",
3341 "dpi",
3342 "js-sys",
3343 "libc",
3344 "ndk",
3345 "objc2 0.5.2",
3346 "objc2-app-kit 0.2.2",
3347 "objc2-foundation 0.2.2",
3348 "objc2-ui-kit 0.2.2",
3349 "orbclient",
3350 "percent-encoding",
3351 "pin-project",
3352 "raw-window-handle",
3353 "redox_syscall 0.4.1",
3354 "rustix 0.38.44",
3355 "smol_str",
3356 "tracing",
3357 "unicode-segmentation",
3358 "wasm-bindgen",
3359 "wasm-bindgen-futures",
3360 "web-sys",
3361 "web-time",
3362 "windows-sys 0.52.0",
3363 "x11-dl",
3364 "x11rb",
3365 "xkbcommon-dl",
3366]
3367
3368[[package]]
3369name = "winnow"
3370version = "0.7.15"
3371source = "registry+https://github.com/rust-lang/crates.io-index"
3372checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
3373dependencies = [
3374 "memchr",
3375]
3376
3377[[package]]
3378name = "winnow"
3379version = "1.0.3"
3380source = "registry+https://github.com/rust-lang/crates.io-index"
3381checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
3382dependencies = [
3383 "memchr",
3384]
3385
3386[[package]]
3387name = "wit-bindgen"
3388version = "0.57.1"
3389source = "registry+https://github.com/rust-lang/crates.io-index"
3390checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
3391
3392[[package]]
3393name = "writeable"
3394version = "0.6.3"
3395source = "registry+https://github.com/rust-lang/crates.io-index"
3396checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
3397
3398[[package]]
3399name = "x11-dl"
3400version = "2.21.0"
3401source = "registry+https://github.com/rust-lang/crates.io-index"
3402checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
3403dependencies = [
3404 "libc",
3405 "once_cell",
3406 "pkg-config",
3407]
3408
3409[[package]]
3410name = "x11rb"
3411version = "0.13.2"
3412source = "registry+https://github.com/rust-lang/crates.io-index"
3413checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414"
3414dependencies = [
3415 "as-raw-xcb-connection",
3416 "gethostname",
3417 "libc",
3418 "libloading",
3419 "once_cell",
3420 "rustix 1.1.4",
3421 "x11rb-protocol",
3422]
3423
3424[[package]]
3425name = "x11rb-protocol"
3426version = "0.13.2"
3427source = "registry+https://github.com/rust-lang/crates.io-index"
3428checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd"
3429
3430[[package]]
3431name = "xcursor"
3432version = "0.3.10"
3433source = "registry+https://github.com/rust-lang/crates.io-index"
3434checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b"
3435
3436[[package]]
3437name = "xkbcommon-dl"
3438version = "0.4.2"
3439source = "registry+https://github.com/rust-lang/crates.io-index"
3440checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5"
3441dependencies = [
3442 "bitflags 2.13.0",
3443 "dlib",
3444 "log",
3445 "once_cell",
3446 "xkeysym",
3447]
3448
3449[[package]]
3450name = "xkeysym"
3451version = "0.2.1"
3452source = "registry+https://github.com/rust-lang/crates.io-index"
3453checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
3454
3455[[package]]
3456name = "xml-rs"
3457version = "0.8.28"
3458source = "registry+https://github.com/rust-lang/crates.io-index"
3459checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"
3460
3461[[package]]
3462name = "yoke"
3463version = "0.8.3"
3464source = "registry+https://github.com/rust-lang/crates.io-index"
3465checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
3466dependencies = [
3467 "stable_deref_trait",
3468 "yoke-derive",
3469 "zerofrom",
3470]
3471
3472[[package]]
3473name = "yoke-derive"
3474version = "0.8.2"
3475source = "registry+https://github.com/rust-lang/crates.io-index"
3476checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
3477dependencies = [
3478 "proc-macro2",
3479 "quote",
3480 "syn",
3481 "synstructure",
3482]
3483
3484[[package]]
3485name = "zerocopy"
3486version = "0.8.52"
3487source = "registry+https://github.com/rust-lang/crates.io-index"
3488checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
3489dependencies = [
3490 "zerocopy-derive",
3491]
3492
3493[[package]]
3494name = "zerocopy-derive"
3495version = "0.8.52"
3496source = "registry+https://github.com/rust-lang/crates.io-index"
3497checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
3498dependencies = [
3499 "proc-macro2",
3500 "quote",
3501 "syn",
3502]
3503
3504[[package]]
3505name = "zerofrom"
3506version = "0.1.8"
3507source = "registry+https://github.com/rust-lang/crates.io-index"
3508checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
3509dependencies = [
3510 "zerofrom-derive",
3511]
3512
3513[[package]]
3514name = "zerofrom-derive"
3515version = "0.1.7"
3516source = "registry+https://github.com/rust-lang/crates.io-index"
3517checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
3518dependencies = [
3519 "proc-macro2",
3520 "quote",
3521 "syn",
3522 "synstructure",
3523]
3524
3525[[package]]
3526name = "zeroize"
3527version = "1.9.0"
3528source = "registry+https://github.com/rust-lang/crates.io-index"
3529checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
3530
3531[[package]]
3532name = "zerotrie"
3533version = "0.2.4"
3534source = "registry+https://github.com/rust-lang/crates.io-index"
3535checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
3536dependencies = [
3537 "displaydoc",
3538 "yoke",
3539 "zerofrom",
3540]
3541
3542[[package]]
3543name = "zerovec"
3544version = "0.11.6"
3545source = "registry+https://github.com/rust-lang/crates.io-index"
3546checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
3547dependencies = [
3548 "yoke",
3549 "zerofrom",
3550 "zerovec-derive",
3551]
3552
3553[[package]]
3554name = "zerovec-derive"
3555version = "0.11.3"
3556source = "registry+https://github.com/rust-lang/crates.io-index"
3557checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
3558dependencies = [
3559 "proc-macro2",
3560 "quote",
3561 "syn",
3562]
3563
3564[[package]]
3565name = "zmij"
3566version = "1.0.21"
3567source = "registry+https://github.com/rust-lang/crates.io-index"
3568checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
3569
3570[[package]]
3571name = "zune-core"
3572version = "0.5.1"
3573source = "registry+https://github.com/rust-lang/crates.io-index"
3574checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9"
3575
3576[[package]]
3577name = "zune-jpeg"
3578version = "0.5.15"
3579source = "registry+https://github.com/rust-lang/crates.io-index"
3580checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296"
3581dependencies = [
3582 "zune-core",
3583]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..ac616e9
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,25 @@
1[package]
2name = "factorio-mod-downloader"
3version = "0.1.0"
4edition = "2021"
5
6[features]
7default = ["gui"]
8gui = ["eframe", "egui", "rfd"]
9
10[dependencies]
11ureq = { version = "3", default-features = false, features = ["rustls", "gzip"] }
12serde = { version = "1", features = ["derive"] }
13serde_json = "1"
14regex = { version = "1", default-features = false, features = ["std"] }
15anyhow = "1"
16eframe = { version = "0.35", default-features = false, features = ["glow", "x11", "default_fonts"], optional = true}
17egui = { version = "0.35", optional = true }
18rfd = { version = "0.15", default-features = false, features = ["pollster", "gtk3"], optional = true }
19
20[profile.release]
21opt-level = "s"
22lto = true
23strip = true
24codegen-units = 1
25panic = "abort"
diff --git a/src/downloader.rs b/src/downloader.rs
new file mode 100644
index 0000000..6d92166
--- /dev/null
+++ b/src/downloader.rs
@@ -0,0 +1,589 @@
1use std::collections::HashSet;
2use std::fs;
3use std::io::{Read, Write};
4use std::path::Path;
5
6use anyhow::{bail, Context, Result};
7use regex::Regex;
8use serde::Deserialize;
9
10// ---------------------------------------------------------------------------
11// Public event type for GUI progress reporting
12// ---------------------------------------------------------------------------
13
14#[cfg(feature = "gui")]
15use std::sync::mpsc;
16
17#[cfg(feature = "gui")]
18#[derive(Debug, Clone)]
19pub enum Event {
20 Log(String),
21 DownloadStart { name: String, total_bytes: u64 },
22 DownloadProgress { name: String, bytes: u64 },
23 DownloadComplete { name: String },
24 DownloadError { name: String, error: String },
25 Finished { success: bool, message: String },
26}
27
28// ---------------------------------------------------------------------------
29// API response types
30// ---------------------------------------------------------------------------
31
32#[derive(Deserialize)]
33pub struct ModInfo {
34 pub releases: Vec<Release>,
35}
36
37#[derive(Deserialize, Clone)]
38pub struct Release {
39 pub version: String,
40 pub info_json: Option<InfoJson>,
41}
42
43#[derive(Deserialize, Clone)]
44pub struct InfoJson {
45 #[serde(default)]
46 pub dependencies: Vec<String>,
47}
48
49// ---------------------------------------------------------------------------
50// Dependency model
51// ---------------------------------------------------------------------------
52
53#[derive(Debug, Clone, PartialEq)]
54pub enum DepType {
55 Base,
56 Required,
57 Optional,
58 Incompatible,
59}
60
61#[derive(Debug, Clone)]
62pub struct Dependency {
63 pub dep_type: DepType,
64 pub name: String,
65}
66
67// ---------------------------------------------------------------------------
68// Constants
69// ---------------------------------------------------------------------------
70
71pub const MODINFO_API: &str = "https://re146.dev/factorio/mods/modinfo";
72pub const DOWNLOAD_BASE: &str = "https://mods-storage.re146.dev";
73
74fn dep_regex() -> &'static Regex {
75 static RE: std::sync::LazyLock<Regex> = std::sync::LazyLock::new(|| {
76 Regex::new(
77 r"(?i)^((?:)|(?:\?)|(?:\(\?\))|(?:!)|(?:~))(?:\s?)([%\w\s-]+)(?:\s{0,})(?:((?:=>)|(?:==)|(?:=)|(?:<=)|(?:>=)|(?:<)|(?:>)|(?:))(?:\s{0,})((\d+\.\d+\.\d+)|(\d+\.\d+)))?$",
78 )
79 .unwrap()
80 });
81 &RE
82}
83
84// ---------------------------------------------------------------------------
85// Mod name extraction
86// ---------------------------------------------------------------------------
87
88pub fn extract_mod_name(url_or_name: &str) -> Result<String> {
89 let re = Regex::new(r"(?i)^https?://mods\.factorio\.com/mod/([^\s/#?]{1,})").unwrap();
90 if let Some(caps) = re.captures(url_or_name) {
91 return Ok(caps[1].to_string());
92 }
93
94 let re2 =
95 Regex::new(r"(?i)^https?://mods\.factorio\.com/mods/([^\s/]{1,})/([^\s/#?]{1,})").unwrap();
96 if let Some(caps) = re2.captures(url_or_name) {
97 return Ok(caps[2].to_string());
98 }
99
100 if !url_or_name.contains('/') && !url_or_name.starts_with("http") {
101 return Ok(url_or_name.to_string());
102 }
103
104 bail!("Could not extract mod name from: {url_or_name}")
105}
106
107// ---------------------------------------------------------------------------
108// API helpers
109// ---------------------------------------------------------------------------
110
111pub fn fetch_modinfo(mod_name: &str) -> Result<ModInfo> {
112 let url = format!("{MODINFO_API}?id={mod_name}");
113 let resp = ureq::get(&url)
114 .header("Accept", "application/json")
115 .call()
116 .with_context(|| format!("Failed to fetch mod info for {mod_name}"))?;
117
118 if resp.status().as_u16() == 404 {
119 bail!("Mod '{mod_name}' not found on the portal");
120 }
121
122 let body_text = resp
123 .into_body()
124 .read_to_string()
125 .with_context(|| format!("Failed to read response body for {mod_name}"))?;
126
127 let modinfo: ModInfo = serde_json::from_str(&body_text)
128 .with_context(|| format!("Failed to parse mod info JSON for {mod_name}"))?;
129
130 if modinfo.releases.is_empty() {
131 bail!("No releases found for '{mod_name}'");
132 }
133
134 Ok(modinfo)
135}
136
137/// Fetch available versions for a mod. Returns (version, display_label) pairs.
138#[cfg(feature = "gui")]
139pub fn fetch_versions(mod_name: &str) -> Result<Vec<(String, String)>> {
140 let modinfo = fetch_modinfo(mod_name)?;
141 let total = modinfo.releases.len();
142
143 let mut versions: Vec<(String, String)> = modinfo
144 .releases
145 .iter()
146 .enumerate()
147 .filter_map(|(i, r)| {
148 let v = r.version.clone();
149 if v.is_empty() {
150 return None;
151 }
152 let is_latest = i == total - 1;
153 let factorio_ver = r
154 .info_json
155 .as_ref()
156 .and_then(|j| j.dependencies.first())
157 .and_then(|d| {
158 parse_dependency_string(d).and_then(|dep| {
159 if dep.dep_type == DepType::Base && !dep.name.is_empty() {
160 Some(dep.name)
161 } else {
162 None
163 }
164 })
165 })
166 .unwrap_or_default();
167
168 let mut label = v.clone();
169 if is_latest {
170 label.push_str(" (latest)");
171 }
172 if !factorio_ver.is_empty() {
173 label.push_str(&format!(" for {}", factorio_ver));
174 }
175 Some((v, label))
176 })
177 .collect();
178
179 versions.reverse();
180 Ok(versions)
181}
182
183pub fn find_release<'a>(modinfo: &'a ModInfo, target_version: Option<&str>) -> Option<&'a Release> {
184 match target_version {
185 Some(v) => modinfo.releases.iter().find(|r| r.version == v),
186 None => modinfo.releases.last(),
187 }
188}
189
190// ---------------------------------------------------------------------------
191// Dependency parsing
192// ---------------------------------------------------------------------------
193
194pub fn parse_dependency_string(input: &str) -> Option<Dependency> {
195 let re = dep_regex();
196 let caps = re.captures(input)?;
197
198 let name = caps[2].trim().to_string();
199
200 if name.eq_ignore_ascii_case("base") {
201 return Some(Dependency {
202 dep_type: DepType::Base,
203 name: "base".into(),
204 });
205 }
206
207 let dep_type = match &caps[1] {
208 "?" | "(?)" => DepType::Optional,
209 "!" => DepType::Incompatible,
210 _ => DepType::Required,
211 };
212
213 Some(Dependency {
214 dep_type,
215 name: name.trim().to_string(),
216 })
217}
218
219pub fn parse_dependencies(deps: &[String]) -> (Vec<Dependency>, Vec<Dependency>, Vec<Dependency>) {
220 let mut required = Vec::new();
221 let mut optional = Vec::new();
222 let mut incompatible = Vec::new();
223
224 for dep_str in deps.iter().rev() {
225 if let Some(dep) = parse_dependency_string(dep_str) {
226 match dep.dep_type {
227 DepType::Base => {}
228 DepType::Required => required.push(dep),
229 DepType::Optional => optional.push(dep),
230 DepType::Incompatible => incompatible.push(dep),
231 }
232 }
233 }
234
235 (required, optional, incompatible)
236}
237
238// ---------------------------------------------------------------------------
239// GUI download (channel-based)
240// ---------------------------------------------------------------------------
241
242#[cfg(feature = "gui")]
243fn gui_download_file(
244 url: &str,
245 file_path: &Path,
246 display_name: &str,
247 tx: &mpsc::Sender<Event>,
248) -> Result<()> {
249 let resp = ureq::get(url)
250 .call()
251 .with_context(|| format!("Failed to download {display_name}"))?;
252
253 let status = resp.status().as_u16();
254 if status == 404 {
255 bail!("File not found on storage: {display_name}");
256 }
257 if !(200..300).contains(&status) {
258 bail!("HTTP {status} while downloading {display_name}");
259 }
260
261 let total_size: u64 = resp
262 .headers()
263 .get("content-length")
264 .and_then(|v| v.to_str().ok())
265 .and_then(|v| v.parse().ok())
266 .unwrap_or(0);
267
268 let _ = tx.send(Event::DownloadStart {
269 name: display_name.to_string(),
270 total_bytes: total_size,
271 });
272
273 let mut reader = resp.into_body().into_reader();
274 let mut file = fs::File::create(file_path)
275 .with_context(|| format!("Failed to create file {}", file_path.display()))?;
276
277 let mut buf = [0u8; 256 * 1024];
278 let mut downloaded: u64 = 0;
279 loop {
280 let n = reader
281 .read(&mut buf)
282 .with_context(|| format!("Read error while downloading {display_name}"))?;
283 if n == 0 {
284 break;
285 }
286 file.write_all(&buf[..n])
287 .with_context(|| format!("Write error for {}", file_path.display()))?;
288 downloaded += n as u64;
289 let _ = tx.send(Event::DownloadProgress {
290 name: display_name.to_string(),
291 bytes: downloaded,
292 });
293 }
294
295 let _ = tx.send(Event::DownloadComplete {
296 name: display_name.to_string(),
297 });
298 Ok(())
299}
300
301#[cfg(feature = "gui")]
302fn gui_download_mod_with_deps(
303 mod_name: &str,
304 output: &Path,
305 target_version: Option<&str>,
306 include_optional: bool,
307 downloaded: &mut HashSet<String>,
308 analyzed: &mut HashSet<String>,
309 tx: &mpsc::Sender<Event>,
310) -> Result<()> {
311 if analyzed.contains(mod_name) {
312 return Ok(());
313 }
314
315 if mod_name == "space-age" {
316 let _ = tx.send(Event::Log(format!(
317 "Skipping reserved dependency '{mod_name}'"
318 )));
319 return Ok(());
320 }
321
322 let modinfo = fetch_modinfo(mod_name)?;
323
324 let release = find_release(&modinfo, target_version)
325 .with_context(|| format!("Version not found for '{mod_name}'"))?;
326
327 let version = &release.version;
328 let _ = tx.send(Event::Log(format!("Processing: {mod_name} v{version}")));
329 analyzed.insert(mod_name.to_string());
330
331 let file_name = format!("{mod_name}_{version}.zip");
332 let file_path = output.join(&file_name);
333
334 if !file_path.exists() {
335 fs::create_dir_all(output)?;
336 let download_url = format!("{DOWNLOAD_BASE}/{mod_name}/{version}.zip");
337
338 if let Err(e) = gui_download_file(&download_url, &file_path, &file_name, tx) {
339 let _ = tx.send(Event::DownloadError {
340 name: file_name.clone(),
341 error: e.to_string(),
342 });
343 return Err(e);
344 }
345 downloaded.insert(mod_name.to_string());
346 } else {
347 let _ = tx.send(Event::Log(format!("Already downloaded: {file_name}")));
348 }
349
350 if let Some(info_json) = &release.info_json {
351 let (required, optional, _incompatible) = parse_dependencies(&info_json.dependencies);
352
353 let mut deps = required;
354 if include_optional {
355 deps.extend(optional);
356 }
357
358 for dep in &deps {
359 if dep.name == "base" || downloaded.contains(&dep.name) || analyzed.contains(&dep.name)
360 {
361 continue;
362 }
363 let _ = tx.send(Event::Log(format!("-> Fetching dependency: {}", dep.name)));
364 if let Err(e) = gui_download_mod_with_deps(
365 &dep.name,
366 output,
367 None,
368 include_optional,
369 downloaded,
370 analyzed,
371 tx,
372 ) {
373 let _ = tx.send(Event::Log(format!(
374 "Error processing dependency {}: {}",
375 dep.name, e
376 )));
377 }
378 }
379 }
380
381 Ok(())
382}
383
384/// Entry point for GUI downloads. Runs the full pipeline and sends events via the channel.
385#[cfg(feature = "gui")]
386pub fn run_gui_download(
387 mod_url: &str,
388 output: &Path,
389 target_version: Option<String>,
390 include_optional: bool,
391 tx: mpsc::Sender<Event>,
392) {
393 let result = (|| -> Result<()> {
394 let mod_name = extract_mod_name(mod_url)?;
395 let _ = tx.send(Event::Log(format!("Starting download: {mod_name}")));
396
397 let mut downloaded = HashSet::new();
398 let mut analyzed = HashSet::new();
399
400 gui_download_mod_with_deps(
401 &mod_name,
402 output,
403 target_version.as_deref(),
404 include_optional,
405 &mut downloaded,
406 &mut analyzed,
407 &tx,
408 )?;
409
410 Ok(())
411 })();
412
413 match result {
414 Ok(()) => {
415 let _ = tx.send(Event::Finished {
416 success: true,
417 message: "All mods downloaded successfully.".into(),
418 });
419 }
420 Err(e) => {
421 let _ = tx.send(Event::Finished {
422 success: false,
423 message: format!("Download failed: {e}"),
424 });
425 }
426 }
427}
428
429// ---------------------------------------------------------------------------
430// CLI download (prints progress to stdout)
431// ---------------------------------------------------------------------------
432
433#[cfg(not(feature = "gui"))]
434fn cli_download_file(url: &str, file_path: &Path, display_name: &str) -> Result<()> {
435 let resp = ureq::get(url)
436 .call()
437 .with_context(|| format!("Failed to download {display_name}"))?;
438
439 let status = resp.status().as_u16();
440 if status == 404 {
441 bail!("File not found on storage: {display_name}");
442 }
443 if !(200..300).contains(&status) {
444 bail!("HTTP {status} while downloading {display_name}");
445 }
446
447 let total_size: u64 = resp
448 .headers()
449 .get("content-length")
450 .and_then(|v| v.to_str().ok())
451 .and_then(|v| v.parse().ok())
452 .unwrap_or(0);
453
454 println!(
455 " Downloading: {display_name} ({:.1} MB)",
456 total_size as f64 / 1_048_576.0
457 );
458
459 let mut reader = resp.into_body().into_reader();
460 let mut file = fs::File::create(file_path)
461 .with_context(|| format!("Failed to create file {}", file_path.display()))?;
462
463 let mut buf = [0u8; 256 * 1024];
464 let mut downloaded: u64 = 0;
465 let mut last_pct: u32 = 0;
466 loop {
467 let n = reader
468 .read(&mut buf)
469 .with_context(|| format!("Read error while downloading {display_name}"))?;
470 if n == 0 {
471 break;
472 }
473 file.write_all(&buf[..n])
474 .with_context(|| format!("Write error for {}", file_path.display()))?;
475 downloaded += n as u64;
476
477 if total_size > 0 {
478 let pct = (downloaded * 100 / total_size) as u32;
479 if pct / 10 != last_pct / 10 {
480 last_pct = pct;
481 print!("\r {} {}%", display_name, pct);
482 let _ = std::io::Write::flush(&mut std::io::stdout());
483 }
484 }
485 }
486 println!("\r {} Done.", display_name);
487 Ok(())
488}
489
490#[cfg(not(feature = "gui"))]
491fn cli_download_mod_with_deps(
492 mod_name: &str,
493 output: &Path,
494 target_version: Option<&str>,
495 include_optional: bool,
496 downloaded: &mut HashSet<String>,
497 analyzed: &mut HashSet<String>,
498) -> Result<()> {
499 if analyzed.contains(mod_name) {
500 return Ok(());
501 }
502
503 if mod_name == "space-age" {
504 println!("Skipping reserved dependency '{mod_name}'");
505 return Ok(());
506 }
507
508 let modinfo = fetch_modinfo(mod_name)?;
509
510 let release = find_release(&modinfo, target_version)
511 .with_context(|| format!("Version not found for '{mod_name}'"))?;
512
513 let version = &release.version;
514 println!("Processing: {mod_name} v{version}");
515 analyzed.insert(mod_name.to_string());
516
517 let file_name = format!("{mod_name}_{version}.zip");
518 let file_path = output.join(&file_name);
519
520 if !file_path.exists() {
521 fs::create_dir_all(output)?;
522 let download_url = format!("{DOWNLOAD_BASE}/{mod_name}/{version}.zip");
523
524 if let Err(e) = cli_download_file(&download_url, &file_path, &file_name) {
525 eprintln!("Error downloading {file_name}: {e}");
526 return Err(e);
527 }
528 downloaded.insert(mod_name.to_string());
529 } else {
530 println!("Already downloaded: {file_name}");
531 }
532
533 if let Some(info_json) = &release.info_json {
534 let (required, optional, _incompatible) = parse_dependencies(&info_json.dependencies);
535
536 let mut deps = required;
537 if include_optional {
538 deps.extend(optional);
539 }
540
541 for dep in &deps {
542 if dep.name == "base" || downloaded.contains(&dep.name) || analyzed.contains(&dep.name)
543 {
544 continue;
545 }
546 println!("-> Fetching dependency: {}", dep.name);
547 if let Err(e) = cli_download_mod_with_deps(
548 &dep.name,
549 output,
550 None,
551 include_optional,
552 downloaded,
553 analyzed,
554 ) {
555 eprintln!("Error processing dependency {}: {}", dep.name, e);
556 }
557 }
558 }
559
560 Ok(())
561}
562
563/// Entry point for CLI downloads. Prints progress to stdout.
564#[cfg(not(feature = "gui"))]
565pub fn run_cli_download(
566 mod_url: &str,
567 output: &Path,
568 target_version: Option<&str>,
569 include_optional: bool,
570) -> Result<()> {
571 let mod_name = extract_mod_name(mod_url)?;
572 println!("Starting download: {mod_name}");
573 println!("Output directory: {}", output.display());
574
575 let mut downloaded = HashSet::new();
576 let mut analyzed = HashSet::new();
577
578 cli_download_mod_with_deps(
579 &mod_name,
580 output,
581 target_version,
582 include_optional,
583 &mut downloaded,
584 &mut analyzed,
585 )?;
586
587 println!("\nAll mods downloaded successfully.");
588 Ok(())
589}
diff --git a/src/gui.rs b/src/gui.rs
new file mode 100644
index 0000000..5fe1092
--- /dev/null
+++ b/src/gui.rs
@@ -0,0 +1,369 @@
1use std::path::PathBuf;
2use std::sync::mpsc;
3use std::sync::mpsc::TryRecvError;
4use std::sync::{Arc, Mutex};
5use std::thread;
6
7use egui::{Color32, ProgressBar, ScrollArea, TextEdit};
8use rfd::FileDialog;
9
10use crate::downloader::{self, Event};
11
12pub struct App {
13 mod_url: String,
14 output_path: String,
15 target_version: String,
16 include_optional: bool,
17
18 versions: Vec<(String, String)>,
19 loading_versions: bool,
20 version_handle: Option<Arc<Mutex<Option<Vec<(String, String)>>>>>,
21
22 downloading: bool,
23 finished: bool,
24
25 downloads: Vec<DownloadState>,
26 log_entries: Vec<LogEntry>,
27
28 receiver: Option<mpsc::Receiver<Event>>,
29}
30
31struct DownloadState {
32 name: String,
33 total_bytes: u64,
34 downloaded_bytes: u64,
35 complete: bool,
36 error: Option<String>,
37}
38
39struct LogEntry {
40 text: String,
41 is_error: bool,
42}
43
44impl App {
45 pub fn new() -> Self {
46 Self {
47 mod_url: String::new(),
48 output_path: std::env::current_dir()
49 .map(|p| p.display().to_string())
50 .unwrap_or_default(),
51 target_version: String::new(),
52 include_optional: false,
53 versions: Vec::new(),
54 loading_versions: false,
55 version_handle: None,
56 downloading: false,
57 finished: false,
58 downloads: Vec::new(),
59 log_entries: Vec::new(),
60 receiver: None,
61 }
62 }
63
64 fn log(&mut self, text: String, is_error: bool) {
65 self.log_entries.push(LogEntry { text, is_error });
66 if self.log_entries.len() > 500 {
67 self.log_entries.remove(0);
68 }
69 }
70
71 fn find_or_create_download(&mut self, name: &str) -> &mut DownloadState {
72 if let Some(pos) = self.downloads.iter().position(|d| d.name == name) {
73 &mut self.downloads[pos]
74 } else {
75 self.downloads.push(DownloadState {
76 name: name.to_string(),
77 total_bytes: 0,
78 downloaded_bytes: 0,
79 complete: false,
80 error: None,
81 });
82 self.downloads.last_mut().unwrap()
83 }
84 }
85
86 fn poll_events(&mut self) {
87 let mut events = Vec::new();
88 if let Some(ref rx) = self.receiver {
89 loop {
90 match rx.try_recv() {
91 Ok(event) => events.push(event),
92 Err(TryRecvError::Empty) => break,
93 Err(TryRecvError::Disconnected) => {
94 self.downloading = false;
95 self.receiver = None;
96 break;
97 }
98 }
99 }
100 }
101 for event in events {
102 self.handle_event(event);
103 }
104 }
105
106 fn handle_event(&mut self, event: Event) {
107 match event {
108 Event::Log(text) => self.log(text, false),
109 Event::DownloadStart { name, total_bytes } => {
110 self.log(format!("Downloading: {name}"), false);
111 let dl = self.find_or_create_download(&name);
112 dl.total_bytes = total_bytes;
113 dl.downloaded_bytes = 0;
114 dl.complete = false;
115 dl.error = None;
116 }
117 Event::DownloadProgress { name, bytes } => {
118 let dl = self.find_or_create_download(&name);
119 dl.downloaded_bytes = bytes;
120 }
121 Event::DownloadComplete { name } => {
122 let dl = self.find_or_create_download(&name);
123 dl.complete = true;
124 dl.downloaded_bytes = dl.total_bytes;
125 self.log(format!("Downloaded: {name}"), false);
126 }
127 Event::DownloadError { name, error } => {
128 let dl = self.find_or_create_download(&name);
129 dl.error = Some(error.clone());
130 self.log(format!("Error: {name} - {error}"), true);
131 }
132 Event::Finished { success, message } => {
133 self.log(message.clone(), !success);
134 self.downloading = false;
135 self.finished = true;
136 self.receiver = None;
137 }
138 }
139 }
140
141 fn start_download(&mut self) {
142 let mod_url = self.mod_url.trim().to_string();
143 if mod_url.is_empty() {
144 return;
145 }
146
147 let output = PathBuf::from(&self.output_path);
148 let target_version = if self.target_version.trim().is_empty() {
149 None
150 } else {
151 Some(self.target_version.trim().to_string())
152 };
153 let include_optional = self.include_optional;
154
155 let (tx, rx) = mpsc::channel();
156 self.receiver = Some(rx);
157 self.downloading = true;
158 self.finished = false;
159 self.downloads.clear();
160 self.log_entries.clear();
161
162 self.log("Starting download...".into(), false);
163
164 thread::spawn(move || {
165 downloader::run_gui_download(&mod_url, &output, target_version, include_optional, tx);
166 });
167 }
168
169 fn load_versions(&mut self) {
170 let mod_url = self.mod_url.trim().to_string();
171 if mod_url.is_empty() {
172 return;
173 }
174
175 self.loading_versions = true;
176 let result: Arc<Mutex<Option<Vec<(String, String)>>>> = Arc::new(Mutex::new(None));
177 self.version_handle = Some(result.clone());
178
179 thread::spawn(move || {
180 let name = downloader::extract_mod_name(&mod_url);
181 let versions = match name {
182 Ok(name) => downloader::fetch_versions(&name).ok().unwrap_or_default(),
183 Err(_) => Vec::new(),
184 };
185 *result.lock().unwrap() = Some(versions);
186 });
187 }
188
189 fn browse_output(&mut self) {
190 if let Some(path) = FileDialog::new().pick_folder() {
191 self.output_path = path.display().to_string();
192 }
193 }
194}
195
196impl eframe::App for App {
197 fn logic(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
198 self.poll_events();
199
200 // Check version loading result
201 if self.loading_versions {
202 let result = if let Some(ref handle) = self.version_handle {
203 handle.lock().ok().and_then(|mut g| g.take())
204 } else {
205 None
206 };
207 if let Some(versions) = result {
208 self.versions = versions;
209 self.loading_versions = false;
210 self.version_handle = None;
211 }
212 }
213
214 if self.downloading {
215 ctx.request_repaint();
216 }
217 }
218
219 fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
220 ui.heading("Factorio Mod Downloader");
221 ui.separator();
222
223 // ── Input section ──
224 ui.horizontal(|ui| {
225 ui.label("Mod URL:");
226 ui.add_sized(
227 [ui.available_width() - 10.0, 20.0],
228 TextEdit::singleline(&mut self.mod_url)
229 .hint_text("https://mods.factorio.com/mod/... or mod name"),
230 );
231 });
232
233 ui.horizontal(|ui| {
234 ui.label("Output:");
235 ui.add_sized(
236 [ui.available_width() - 80.0, 20.0],
237 TextEdit::singleline(&mut self.output_path).hint_text("Download directory"),
238 );
239 if ui.button("Browse").clicked() {
240 self.browse_output();
241 }
242 });
243
244 ui.horizontal(|ui| {
245 ui.label("Version:");
246 let version_enabled = !self.downloading && !self.versions.is_empty();
247 ui.add_enabled_ui(version_enabled, |ui| {
248 egui::ComboBox::from_id_salt("version_combo")
249 .width(200.0)
250 .selected_text(if self.target_version.is_empty() {
251 "Latest"
252 } else {
253 &self.target_version
254 })
255 .show_ui(ui, |ui| {
256 if ui.selectable_label(false, "Latest").clicked() {
257 self.target_version.clear();
258 }
259 for (ver, label) in &self.versions {
260 if ui.selectable_label(self.target_version == *ver, label).clicked() {
261 self.target_version = ver.clone();
262 }
263 }
264 });
265 });
266
267 if ui
268 .add_enabled(
269 !self.downloading && !self.loading_versions,
270 egui::Button::new(if self.loading_versions {
271 "Loading..."
272 } else {
273 "Load Versions"
274 }),
275 )
276 .clicked()
277 {
278 self.load_versions();
279 }
280
281 ui.checkbox(&mut self.include_optional, "Include optional deps");
282 });
283
284 ui.add_space(8.0);
285
286 // ── Download button ──
287 let can_download = !self.downloading
288 && !self.mod_url.trim().is_empty()
289 && !self.output_path.is_empty();
290
291 if ui
292 .add_enabled(
293 can_download,
294 egui::Button::new(if self.downloading {
295 "Downloading..."
296 } else if self.finished {
297 "Download Again"
298 } else {
299 "Start Download"
300 }),
301 )
302 .clicked()
303 {
304 self.start_download();
305 }
306
307 ui.add_space(8.0);
308
309 // ── Progress section ──
310 if !self.downloads.is_empty() {
311 egui::CollapsingHeader::new("Downloads")
312 .default_open(true)
313 .show(ui, |ui| {
314 for dl in &self.downloads {
315 let percentage = if dl.total_bytes > 0 {
316 dl.downloaded_bytes as f32 / dl.total_bytes as f32
317 } else {
318 0.0
319 };
320
321 ui.horizontal(|ui| {
322 let status = if dl.complete {
323 "[OK]"
324 } else if dl.error.is_some() {
325 "[ERR]"
326 } else {
327 "[>>]"
328 };
329 ui.label(format!("{status} {}", dl.name));
330
331 if let Some(ref err) = dl.error {
332 ui.colored_label(Color32::RED, format!("Error: {err}"));
333 } else if dl.total_bytes > 0 {
334 ui.label(format!(
335 "{:.1} / {:.1} MB",
336 dl.downloaded_bytes as f64 / 1_048_576.0,
337 dl.total_bytes as f64 / 1_048_576.0
338 ));
339 }
340 });
341
342 let bar =
343 ProgressBar::new(percentage).desired_width(ui.available_width());
344 ui.add(bar);
345 }
346 });
347 }
348
349 ui.add_space(8.0);
350
351 // ── Log section ──
352 egui::CollapsingHeader::new("Log")
353 .default_open(true)
354 .show(ui, |ui| {
355 ScrollArea::vertical()
356 .max_height(300.0)
357 .stick_to_bottom(true)
358 .show(ui, |ui| {
359 for entry in &self.log_entries {
360 if entry.is_error {
361 ui.colored_label(Color32::RED, &entry.text);
362 } else {
363 ui.label(&entry.text);
364 }
365 }
366 });
367 });
368 }
369}
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..78f17f8
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,102 @@
1mod downloader;
2
3#[cfg(feature = "gui")]
4mod gui;
5
6// ---------------------------------------------------------------------------
7// GUI entry point (when the "gui" feature is enabled)
8// ---------------------------------------------------------------------------
9#[cfg(feature = "gui")]
10fn main() -> eframe::Result<()> {
11 let options = eframe::NativeOptions {
12 viewport: egui::ViewportBuilder::default()
13 .with_inner_size([800.0, 650.0])
14 .with_min_inner_size([600.0, 400.0]),
15 ..Default::default()
16 };
17
18 eframe::run_native(
19 "Factorio Mod Downloader",
20 options,
21 Box::new(|_cc| Ok(Box::new(gui::App::new()))),
22 )
23}
24
25// ---------------------------------------------------------------------------
26// CLI entry point (when the "gui" feature is disabled)
27// ---------------------------------------------------------------------------
28#[cfg(not(feature = "gui"))]
29fn main() {
30 let args: Vec<String> = std::env::args().collect();
31
32 if args.len() < 2 {
33 eprintln!("Factorio Mod Downloader (CLI)");
34 eprintln!();
35 eprintln!(
36 "Usage: {} <mod_url_or_name> [output_directory] [options]",
37 args[0]
38 );
39 eprintln!();
40 eprintln!("Options:");
41 eprintln!(" --version <VER> Download a specific version instead of latest");
42 eprintln!(" --include-optional Also download optional dependencies");
43 eprintln!();
44 eprintln!("Examples:");
45 eprintln!(" {} my-cool-mod", args[0]);
46 eprintln!(
47 " {} https://mods.factorio.com/mod/my-cool-mod ./mods",
48 args[0]
49 );
50 eprintln!(
51 " {} my-cool-mod ./mods --version 2.1.0 --include-optional",
52 args[0]
53 );
54 std::process::exit(1);
55 }
56
57 let mod_url = &args[1];
58
59 let output = if args.len() >= 3 && !args[2].starts_with("--") {
60 std::path::PathBuf::from(&args[2])
61 } else {
62 std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."))
63 };
64
65 let mut target_version: Option<&str> = None;
66 let mut include_optional = false;
67
68 let mut i = if args.len() >= 3 && !args[2].starts_with("--") {
69 3
70 } else {
71 2
72 };
73 while i < args.len() {
74 match args[i].as_str() {
75 "--version" => {
76 if i + 1 < args.len() {
77 target_version = Some(&args[i + 1]);
78 i += 1;
79 } else {
80 eprintln!("Error: --version requires a value");
81 std::process::exit(1);
82 }
83 }
84 "--include-optional" => {
85 include_optional = true;
86 }
87 other => {
88 eprintln!("Unknown option: {other}");
89 std::process::exit(1);
90 }
91 }
92 i += 1;
93 }
94
95 match downloader::run_cli_download(mod_url, &output, target_version, include_optional) {
96 Ok(()) => {}
97 Err(e) => {
98 eprintln!("Error: {:#}", e);
99 std::process::exit(1);
100 }
101 }
102}