diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..3550a30f2 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 6d7c71f2a..7b52eb89f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,13 +2,13 @@ node_modules/ .svelte-kit/ theseus_gui/build/ +theseus_gui/generated/ WixTools +.direnv/ +.DS_Store +.pnpm-debug.log [#]*[#] # TEMPORARY: ignore my test instance and metadata -theseus_cli/launcher theseus_cli/foo -.DS_Store -.pnpm-debug.log -generated/ \ No newline at end of file diff --git a/.idea/theseus.iml b/.idea/theseus.iml index b768ce958..34569b047 100644 --- a/.idea/theseus.iml +++ b/.idea/theseus.iml @@ -47,6 +47,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index e58d7bb90..a72f459ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -23,6 +32,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -34,15 +58,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.55" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" +checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" [[package]] name = "argh" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f023c76cd7975f9969f8e29f0e461decbdc7f51048ce43427107a3d192f1c9bf" +checksum = "a7e7e4aa7e40747e023c0761dafcb42333a9517575bbf1241747f68dd3177a62" dependencies = [ "argh_derive", "argh_shared", @@ -50,9 +74,9 @@ dependencies = [ [[package]] name = "argh_derive" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ad219abc0c06ca788aface2e3a1970587e3413ab70acd20e54b6ec524c1f8f" +checksum = "69f2bd7ff6ed6414f4e5521bd509bae46454bbd513801767ced3f21a751ab4bc" dependencies = [ "argh_shared", "heck 0.3.3", @@ -63,132 +87,24 @@ dependencies = [ [[package]] name = "argh_shared" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38de00daab4eac7d753e97697066238d67ce9d7e2d823ab4f72fe14af29f3f33" +checksum = "47253b98986dafc7a3e1cf3259194f1f47ac61abb57a57f46ec09e48d004ecda" [[package]] -name = "arrayref" -version = "0.3.6" +name = "async-tungstenite" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "ashpd" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7915e26e0786f91768d23de32afafa4ee5e2ea76be21c0ecd8e14441543c1655" +checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" dependencies = [ - "enumflags2", - "futures", - "rand 0.8.4", - "serde", - "serde_repr", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90622698a1218e0b2fb846c97b5f19a0831f6baddee73d9454156365ccfa473b" -dependencies = [ - "easy-parallel", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", - "slab", -] - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", + "futures-io", + "futures-util", "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-lock" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-recursion" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d78656ba01f1b93024b7c3a0467f1608e4be67d725749fdcd7d2c7678fd7a2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-task" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" - -[[package]] -name = "async-trait" -version = "0.1.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "native-tls", + "pin-project-lite", + "tokio", + "tokio-native-tls", + "tungstenite", ] [[package]] @@ -209,17 +125,17 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "attohttpc" -version = "0.18.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69e13a99a7e6e070bb114f7ff381e58c7ccc188630121fc4c2fe4bcf24cd072" +checksum = "262c3f7f5d61249d8c00e5546e2685cd15ebeeb1bc0f3cc5449350a1cb07319e" dependencies = [ "flate2", "http", @@ -235,9 +151,24 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] [[package]] name = "base64" @@ -247,79 +178,63 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bincode" -version = "1.3.3" +version = "2.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" dependencies = [ + "bincode_derive", "serde", ] +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "cc", - "cfg-if", - "constant_time_eq", - "digest 0.10.3", - "rayon", -] - [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" dependencies = [ - "generic-array 0.14.5", + "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.5" +name = "brotli" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ - "byte-tools", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -333,15 +248,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] -name = "byte-tools" -version = "0.3.1" +name = "bytemuck" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" +checksum = "c53dfa917ec274df8ed3c572698f381a24eef2efba9492d797301b72b6db408a" [[package]] name = "byteorder" @@ -376,17 +291,11 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - [[package]] name = "cairo-rs" -version = "0.15.6" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b14c80d8d1a02fa6d914b9d1afeeca9bc34257f8300d9696e1e331ae114223" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" dependencies = [ "bitflags", "cairo-sys-rs", @@ -401,16 +310,16 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "cargo_toml" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e270ef0cd868745878982f7ce470aa898d0d4bb248af67f0cf66f54617913ef" +checksum = "5809dd3e6444651fd1cdd3dbec71eca438c439a0fcc8081674a14da0afe50185" dependencies = [ "serde", "serde_derive", @@ -419,30 +328,27 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" dependencies = [ "jobserver", ] [[package]] -name = "cfb" -version = "0.4.0" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" -dependencies = [ - "byteorder", - "uuid", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cfg-expr" -version = "0.8.1" +name = "cfb" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" dependencies = [ - "smallvec", + "byteorder", + "uuid 0.8.2", ] [[package]] @@ -456,9 +362,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.10.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295b6eb918a60a25fec0b23a5e633e74fddbaf7bb04411e65a10c366aca4b5cd" +checksum = "0aacacf4d96c24b2ad6eb8ee6df040e4f27b0d0b39a5710c30091baa830485db" dependencies = [ "smallvec", ] @@ -469,12 +375,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "chrono" version = "0.4.19" @@ -485,7 +385,7 @@ dependencies = [ "num-integer", "num-traits", "serde", - "time", + "time 0.1.44", "winapi", ] @@ -521,12 +421,46 @@ dependencies = [ ] [[package]] -name = "concurrent-queue" -version = "1.2.2" +name = "color-eyre" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" dependencies = [ - "cache-padded", + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a604e93b79d1808327a6fca85a6f2d69de66461e7620f5a4cbf5fb4d1d7c948" +dependencies = [ + "bytes", + "memchr", ] [[package]] @@ -544,32 +478,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "const_format" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bc6cd49b0ec407b680c3e380182b6ac63b73991cb7602de350352fc309b614" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "convert_case" version = "0.4.0" @@ -578,9 +486,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -619,73 +527,63 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.2.2" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3825b1e8580894917dc4468cb634a1b4e9745fddc854edad72d9c04644c0319f" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" dependencies = [ "cfg-if", "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - [[package]] name = "crossbeam-epoch" -version = "0.9.7" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" +checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", "memoffset", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" dependencies = [ "cfg-if", - "lazy_static", + "once_cell", ] [[package]] name = "crypto-common" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +checksum = "2ccfd8c0ee4cce11e45b3fd6f9d5e69e0cc62912aa6a0cb1bf4617b0eba5a12f" dependencies = [ - "generic-array 0.14.5", + "generic-array", "typenum", ] @@ -718,9 +616,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote", "syn", @@ -734,10 +632,11 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "daedalus" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71fa5e7862c4cf3c86f6250f0254875838304eb3ee6aca95df2057fb3870805" +checksum = "af1949fc56475cb37470a1abb5a113e6f70d48fbcc0c2c315a11b24040f81062" dependencies = [ + "bincode", "bytes", "chrono", "reqwest", @@ -750,72 +649,48 @@ dependencies = [ [[package]] name = "darling" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" -dependencies = [ - "darling_core 0.13.1", - "darling_macro 0.13.1", + "darling_core", + "darling_macro", ] [[package]] name = "darling_core" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.9.3", - "syn", -] - -[[package]] -name = "darling_core" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", + "strsim", "syn", ] [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.10.2", + "darling_core", "quote", "syn", ] [[package]] -name = "darling_macro" -version = "0.13.1" +name = "dbus" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +checksum = "6f8bcdd56d2e5c4ed26a529c5a9029f5db8290d433497506f958eae3be148eb6" dependencies = [ - "darling_core 0.13.1", - "quote", - "syn", + "libc", + "libdbus-sys", + "winapi", ] [[package]] @@ -830,23 +705,11 @@ dependencies = [ [[package]] name = "deflate" -version = "0.8.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" dependencies = [ "adler32", - "byteorder", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn", ] [[package]] @@ -864,9 +727,9 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d6b4fabcd9e97e1df1ae15395ac7e49fb144946a0d453959dc2696273b9da" +checksum = "d8c8ae48e400addc32a8710c8d62d55cb84249a7d58ac4cd959daecfbaddc545" dependencies = [ "console", "tempfile", @@ -875,18 +738,9 @@ dependencies = [ [[package]] name = "diff" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" @@ -894,20 +748,8 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", ] [[package]] @@ -936,7 +778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -947,7 +789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -973,16 +815,17 @@ dependencies = [ ] [[package]] -name = "easy-parallel" -version = "3.2.0" +name = "embed-resource" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6907e25393cdcc1f4f3f513d9aac1e840eb1cc341a0fccb01171f7d14d10b946" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" +dependencies = [ + "cc", + "rustc_version 0.4.0", + "toml", + "vswhom", + "winreg", +] [[package]] name = "embed_plist" @@ -998,56 +841,23 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.29" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] -[[package]] -name = "enumflags2" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "event-listener" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" - [[package]] name = "eyre" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9289ed2c0440a6536e65119725cf91fc2c6b5e513bfd2e36e1134d7cca6ca12f" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" dependencies = [ "indenter", "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fastrand" version = "1.7.0" @@ -1069,26 +879,24 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", - "winapi", + "redox_syscall", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if", "crc32fast", - "libc", - "miniz_oxide 0.4.4", + "miniz_oxide", ] [[package]] @@ -1123,10 +931,14 @@ dependencies = [ ] [[package]] -name = "fs_extra" -version = "1.2.0" +name = "fs2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] [[package]] name = "futf" @@ -1140,9 +952,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -1155,9 +967,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -1165,15 +977,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -1182,9 +994,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-lite" @@ -1203,9 +1015,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89f17b21645bc4ed773c69af9c9a0effd4a3f1a3876eadd453469f8854e7fdd" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", @@ -1214,21 +1026,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.18" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -1269,9 +1081,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8750501d75f318c2ec0314701bc8403901303210def80bafd13f6b6059a3f45" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -1282,13 +1094,13 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" dependencies = [ - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] @@ -1301,9 +1113,9 @@ checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "pango-sys", "pkg-config", @@ -1317,7 +1129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" dependencies = [ "gdk-sys", - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", "x11", @@ -1336,15 +1148,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.5" @@ -1368,26 +1171,32 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] -name = "gio" -version = "0.15.6" +name = "gimli" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96efd8a1c00d890f6b45671916e165b5e43ccec61957d443aff6d7e44f62d348" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", - "gio-sys 0.15.6", + "gio-sys", "glib", "libc", "once_cell", @@ -1396,25 +1205,12 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" dependencies = [ - "glib-sys 0.14.0", - "gobject-sys 0.14.0", - "libc", - "system-deps 3.2.0", - "winapi", -] - -[[package]] -name = "gio-sys" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0fa5052773f5a56b8ae47dab09d040f5d9ce1311f4f99006e16e9a08269296" -dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", "winapi", @@ -1422,9 +1218,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.6" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa570813c504bdf7539a9400180c2dd4b789a819556fb86da7226d7d1b037b49" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" dependencies = [ "bitflags", "futures-channel", @@ -1432,8 +1228,8 @@ dependencies = [ "futures-executor", "futures-task", "glib-macros", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "once_cell", "smallvec", @@ -1442,13 +1238,13 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.6" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41bfd8d227dead0829ac142454e97531b93f576d0805d779c42bfd799c65c572" +checksum = "25a68131a662b04931e71891fb14aaf65ee4b44d08e8abc10f49e77418c86c64" dependencies = [ "anyhow", "heck 0.4.0", - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -1457,19 +1253,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" -dependencies = [ - "libc", - "system-deps 3.2.0", -] - -[[package]] -name = "glib-sys" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4366377bd56697de8aaee24e673c575d2694d72e7756324ded2b0428829a7b8" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", "system-deps 6.0.2", @@ -1483,9 +1269,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -1496,31 +1282,20 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.14.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ - "glib-sys 0.14.0", - "libc", - "system-deps 3.2.0", -] - -[[package]] -name = "gobject-sys" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6859463843c20cf3837e3a9069b6ab2051aeeadf4c899d33344f4aea83189a" -dependencies = [ - "glib-sys 0.15.6", + "glib-sys", "libc", "system-deps 6.0.2", ] [[package]] name = "gtk" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d1326b36af927fe46ae2f89a8fec38c6f0d279ebc5ef07ffeeabb70300bfc" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" dependencies = [ "atk", "bitflags", @@ -1549,9 +1324,9 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "pango-sys", "system-deps 6.0.2", @@ -1564,7 +1339,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24f518afe90c23fba585b2d7697856f9e6a7bbc62f65588035e66f6afb01a2e9" dependencies = [ "anyhow", - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", @@ -1573,9 +1348,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.7" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -1592,9 +1367,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" [[package]] name = "heck" @@ -1620,17 +1395,11 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "html5ever" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" dependencies = [ "log", "mac", @@ -1642,20 +1411,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.6" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 1.0.1", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -1670,9 +1439,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.5.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" @@ -1682,9 +1451,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.15" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ "bytes", "futures-channel", @@ -1695,7 +1464,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 0.4.8", + "itoa 1.0.2", "pin-project-lite", "socket2", "tokio", @@ -1762,6 +1531,20 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "image" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-iter", + "num-rational", + "num-traits", +] + [[package]] name = "indenter" version = "0.3.3" @@ -1770,9 +1553,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", @@ -1780,9 +1563,9 @@ dependencies = [ [[package]] name = "infer" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" dependencies = [ "cfb", ] @@ -1807,18 +1590,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" - -[[package]] -name = "itertools" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" -dependencies = [ - "either", -] +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" @@ -1828,9 +1602,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "javascriptcore-rs" @@ -1849,12 +1623,40 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 5.0.0", ] +[[package]] +name = "jni" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -1872,9 +1674,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" dependencies = [ "wasm-bindgen", ] @@ -1890,17 +1692,6 @@ dependencies = [ "treediff", ] -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - [[package]] name = "kuchiki" version = "0.8.1" @@ -1921,33 +1712,52 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.119" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" + +[[package]] +name = "libdbus-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c185b5b7ad900923ef3a8ff594083d4d9b5aea80bb4f32b8342363138c0d456b" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "loom" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", "generator", @@ -1966,14 +1776,15 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.3.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +checksum = "fff231a88fe2e9985f9d159a2f02986fe46daa0f6af976a0d934be4870cc9d02" dependencies = [ "cc", - "chrono", - "dirs 1.0.5", + "dirs-next", "objc-foundation", + "objc_id", + "time 0.3.11", ] [[package]] @@ -1985,12 +1796,6 @@ dependencies = [ "libc", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - [[package]] name = "markup5ever" version = "0.10.1" @@ -2022,9 +1827,9 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -2043,50 +1848,30 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "miniz_oxide" -version = "0.3.7" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.8.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -2102,9 +1887,9 @@ dependencies = [ [[package]] name = "ndk" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" dependencies = [ "bitflags", "jni-sys", @@ -2115,15 +1900,15 @@ dependencies = [ [[package]] name = "ndk-context" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-glue" -version = "0.4.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1454575120e3265d2442222299c711ace58ba417532ee4f0fc71b860016b93" +checksum = "0d0c4a7b83860226e6b4183edac21851f05d5a51756e97a1144b7f5a6b63e65f" dependencies = [ "lazy_static", "libc", @@ -2136,12 +1921,12 @@ dependencies = [ [[package]] name = "ndk-macro" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" dependencies = [ - "darling 0.10.2", - "proc-macro-crate 0.1.5", + "darling", + "proc-macro-crate", "proc-macro2", "quote", "syn", @@ -2149,9 +1934,12 @@ dependencies = [ [[package]] name = "ndk-sys" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] [[package]] name = "new_debug_unreachable" @@ -2159,19 +1947,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nix" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" -dependencies = [ - "bitflags", - "cc", - "cfg-if", - "libc", - "memoffset", -] - [[package]] name = "nodrop" version = "0.1.14" @@ -2180,32 +1955,20 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "notify-rust" -version = "4.5.6" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367e1355a950d3e758e414f3ca1b3981a57a2aa1fa3338eb0059f5b230b6ffa4" +checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4" dependencies = [ + "dbus", "mac-notification-sys", - "serde", "winrt-notification", - "zbus", - "zvariant", - "zvariant_derive", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -2213,9 +1976,20 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-integer", @@ -2224,18 +1998,18 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -2243,25 +2017,34 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720d3ea1055e4e4574c0c0b0f8c3fd4f24c4cdaf465948206dea090b57b526ad" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d992b768490d7fe0d8586d9b5745f6c49f557da6d81dc982b1d167ad4edbb21" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ - "proc-macro-crate 1.1.2", + "proc-macro-crate", "proc-macro2", "quote", "syn", ] +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -2302,52 +2085,67 @@ dependencies = [ ] [[package]] -name = "once_cell" -version = "1.9.0" +name = "object" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "once_cell" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" [[package]] name = "open" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a82915836ef43159bb6a3c64d884c42329ccd0b8afdca737cf1e3dd701709dc" +checksum = "360bcc8316bf6363aa3954c3ccc4de8add167b087e0259190a043c9514f910fe" dependencies = [ "pathdiff", - "winapi", + "windows-sys", ] [[package]] name = "openssl" -version = "0.10.38" +version = "0.10.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" dependencies = [ "bitflags", "cfg-if", "foreign-types", "libc", "once_cell", + "openssl-macros", "openssl-sys", ] [[package]] -name = "openssl-probe" -version = "0.1.4" +name = "openssl-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.71" +version = "0.9.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df13d165e607909b363a4757a6f133f8a818a74e9d3a98d09c6128e15fa4c73" +checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" dependencies = [ "autocfg", "cc", @@ -2356,21 +2154,11 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "ordered-stream" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44630c059eacfd6e08bdaa51b1db2ce33119caa4ddc1235e923109aa5f25ccb1" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "os_info" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023df84d545ef479cf67fd2f4459a613585c9db4852c2fad12ab70587859d340" +checksum = "0eca3ecae1481e12c3d9379ec541b238a16f0b75c9a409942daa8ec20dbfdb62" dependencies = [ "log", "serde", @@ -2379,9 +2167,9 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3492ebca331b895fe23ed427dce2013d9b2e00c45964f12040b0db38b8ab27" +checksum = "2c92f2b54f081d635c77e7120862d48db8e91f7f21cef23ab1b4fe9971c59f55" dependencies = [ "libc", "winapi", @@ -2397,10 +2185,16 @@ dependencies = [ ] [[package]] -name = "pango" -version = "0.15.6" +name = "owo-colors" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c7420fc01a390ec200da7395b64d705f5d82fe03e5d0708aee422c46538be7" +checksum = "decf7381921fea4dcb2549c5667eda59b3ec297ab7e2b5fc33eac69d2e7da87b" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" dependencies = [ "bitflags", "glib", @@ -2411,12 +2205,12 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "libc", "system-deps 6.0.2", ] @@ -2432,9 +2226,9 @@ dependencies = [ [[package]] name = "paris" -version = "1.5.11" +version = "1.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69d19a208bba8b94bd27d4b7a06ad153cddc6b88cb2149a668e23ce7bdb67d5" +checksum = "2eaf2319cd71dd9ff38c72bebde61b9ea657134abcf26ae4205f54f772a32810" [[package]] name = "parking" @@ -2455,12 +2249,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.1", + "parking_lot_core 0.9.3", ] [[package]] @@ -2472,29 +2266,29 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "winapi", ] [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "windows-sys", ] [[package]] -name = "path-clean" -version = "0.1.0" +name = "paste" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "pathdiff" @@ -2517,40 +2311,6 @@ dependencies = [ "ucd-trie", ] -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - [[package]] name = "phf" version = "0.8.0" @@ -2600,7 +2360,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" dependencies = [ "phf_shared 0.10.0", - "rand 0.8.4", + "rand 0.8.5", ] [[package]] @@ -2650,10 +2410,30 @@ dependencies = [ ] [[package]] -name = "pin-project-lite" -version = "0.2.7" +name = "pin-project" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -2663,9 +2443,23 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.22" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "plist" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" +dependencies = [ + "base64", + "indexmap", + "line-wrap", + "serde", + "time 0.3.11", + "xml-rs", +] [[package]] name = "png" @@ -2681,40 +2475,21 @@ dependencies = [ [[package]] name = "png" -version = "0.16.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", - "deflate 0.8.6", - "miniz_oxide 0.3.7", + "deflate 1.0.0", + "miniz_oxide", ] -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "precomputed-hash" @@ -2724,9 +2499,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "pretty_assertions" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c038cb5319b9c704bf9c227c261d275bfec0ad438118a2787ce47944fb228b" +checksum = "c89f989ac94207d048d92db058e4f6ec7342b0971fc58d1271ca148b799b3563" dependencies = [ "ansi_term", "ctor", @@ -2736,18 +2511,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "0.1.5" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dada8c9981fcf32929c3c0f0cd796a9284aca335565227ed88c83babb1d43dc" +checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" dependencies = [ "thiserror", "toml", @@ -2785,18 +2551,18 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.32" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43" +checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.10" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" dependencies = [ "proc-macro2", ] @@ -2811,20 +2577,19 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", "rand_pcg", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -2862,7 +2627,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", ] [[package]] @@ -2874,15 +2639,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rand_pcg" version = "0.2.1" @@ -2894,79 +2650,38 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" dependencies = [ "cty", ] -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "redox_users" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" -dependencies = [ - "getrandom 0.2.3", - "redox_syscall 0.2.10", + "getrandom 0.2.7", + "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -2984,9 +2699,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "remove_dir_all" @@ -2999,15 +2714,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.6" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d2927ca2f685faf0fc620ac4834690d29e7abb153add10f5812eef20b5e280" +checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", @@ -3025,6 +2741,7 @@ dependencies = [ "serde_urlencoded", "tokio", "tokio-native-tls", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -3034,15 +2751,15 @@ dependencies = [ [[package]] name = "rfd" -version = "0.7.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aaf1d71ccd44689f7c2c72da1117fd8db71f72a76fe9b5c5dbb17ab903007e0" +checksum = "f121348fd3b9035ed11be1f028e8944263c30641f8c5deacf57a4320782fb402" dependencies = [ - "ashpd", "block", "dispatch", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "embed-resource", + "glib-sys", + "gobject-sys", "gtk-sys", "js-sys", "lazy_static", @@ -3050,25 +2767,18 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "pollster", "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.30.0", + "windows 0.37.0", ] [[package]] -name = "rust-argon2" -version = "0.8.3" +name = "rustc-demangle" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" @@ -3085,20 +2795,26 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.6", + "semver 1.0.12", ] [[package]] name = "rustversion" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "24c8ad4f0c00e1eb5bc7614d236a7f1300e3dbd76b68cac8e06fb00b015ad8d8" [[package]] name = "ryu" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9613b5a66ab9ba26415184cfc41156594925a9cf3a2057e57f31ff145f6568" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "same-file" @@ -3111,12 +2827,12 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi", + "windows-sys", ] [[package]] @@ -3133,9 +2849,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -3146,9 +2862,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -3185,9 +2901,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "a2333e6df6d6598f2b1974829f853c2b4c5f4a6e503c10af918081aa6f8564e1" +dependencies = [ + "serde", +] [[package]] name = "semver-parser" @@ -3200,18 +2919,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" dependencies = [ "proc-macro2", "quote", @@ -3220,20 +2939,20 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.72" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" +checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" dependencies = [ "proc-macro2", "quote", @@ -3242,34 +2961,33 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.8", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_with" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1e6ec4d8950e5b1e894eac0d360742f3b1407a6078a604a731c4b3f49cefbc" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" dependencies = [ - "rustversion", "serde", "serde_with_macros", ] [[package]] name = "serde_with_macros" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ - "darling 0.13.1", + "darling", "proc-macro2", "quote", "syn", @@ -3309,21 +3027,29 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.8.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] name = "sha1" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" [[package]] name = "sha2" @@ -3333,7 +3059,7 @@ checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] @@ -3366,21 +3092,38 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "sled" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935" +dependencies = [ + "crc32fast", + "crossbeam-epoch", + "crossbeam-utils", + "fs2", + "fxhash", + "libc", + "log", + "parking_lot 0.11.2", + "zstd", +] [[package]] name = "smallvec" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "socket2" @@ -3393,15 +3136,29 @@ dependencies = [ ] [[package]] -name = "soup2-sys" -version = "0.1.0" +name = "soup2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f056675eda9a7417163e5f742bb119e8e1d385edd2ada8f7031a7230a3ec10a" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" dependencies = [ "bitflags", - "gio-sys 0.14.0", - "glib-sys 0.14.0", - "gobject-sys 0.14.0", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", "system-deps 5.0.0", ] @@ -3414,28 +3171,22 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "state" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" dependencies = [ "loom", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "string_cache" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ - "lazy_static", "new_debug_unreachable", - "parking_lot 0.11.2", + "once_cell", + "parking_lot 0.12.1", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3443,53 +3194,29 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro2", "quote", ] -[[package]] -name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "strum" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" - [[package]] name = "strum" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7ac893c7d471c8a21f31cfe213ec4f6d9afeed25537c772e08ef3f005f8729e" dependencies = [ - "strum_macros 0.22.0", -] - -[[package]] -name = "strum_macros" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" -dependencies = [ - "heck 0.3.3", - "proc-macro2", - "quote", - "syn", + "strum_macros", ] [[package]] @@ -3504,21 +3231,15 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" -version = "1.0.82" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -3531,24 +3252,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" -dependencies = [ - "anyhow", - "cfg-expr 0.8.1", - "heck 0.3.3", - "itertools", - "pkg-config", - "strum 0.21.0", - "strum_macros 0.21.1", - "thiserror", - "toml", - "version-compare 0.0.11", -] - [[package]] name = "system-deps" version = "5.0.0" @@ -3568,7 +3271,7 @@ version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a45a1c4c9015217e12347f2a411b57ce2c4fc543913b14b6fe40483328e709" dependencies = [ - "cfg-expr 0.10.1", + "cfg-expr 0.10.3", "heck 0.4.0", "pkg-config", "toml", @@ -3598,9 +3301,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.6.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3b3bbc9151bce45db3cf9ccb808730c8df8786d0223f34591f6e5890503939" +checksum = "a71c32c2fa7bba46b01becf9cf470f6a781573af7e376c5e317a313ecce27545" dependencies = [ "bitflags", "cairo-rs", @@ -3616,39 +3319,32 @@ dependencies = [ "gdkx11-sys", "gio", "glib", - "glib-sys 0.15.6", + "glib-sys", "gtk", + "image", "instant", + "jni 0.19.0", "lazy_static", "libc", "log", "ndk", - "ndk-glue", + "ndk-context", "ndk-sys", "objc", + "once_cell", "parking_lot 0.11.2", + "paste", + "png 0.17.5", "raw-window-handle", "scopeguard", "serde", - "tao-core-video-sys", "unicode-segmentation", - "windows 0.30.0", - "windows_macros", + "uuid 0.8.2", + "windows 0.37.0", + "windows-implement", "x11-dl", ] -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - [[package]] name = "tar" version = "0.4.38" @@ -3662,16 +3358,14 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-rc.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0c4a4ffd1f9b02cc3e974ce902f8132fb3d08ec6cce4ca193f97d921f5bce4" +checksum = "827f61bd3dd40276694be5c7ffc40d65b94ab00d9f8c1a4a4db07f2cdc306c83" dependencies = [ "anyhow", "attohttpc", - "bincode", - "cfg_aliases", + "cocoa", "dirs-next", - "either", "embed_plist", "flate2", "futures", @@ -3679,19 +3373,21 @@ dependencies = [ "glib", "glob", "gtk", + "heck 0.4.0", "http", "ignore", "notify-rust", + "objc", "once_cell", "open", "os_info", "os_pipe", "percent-encoding", - "rand 0.8.4", + "rand 0.8.5", "raw-window-handle", "regex", "rfd", - "semver 1.0.6", + "semver 1.0.12", "serde", "serde_json", "serde_repr", @@ -3707,18 +3403,23 @@ dependencies = [ "thiserror", "tokio", "url", - "uuid", - "zip", + "uuid 1.1.2", + "webkit2gtk", + "webview2-com", + "windows 0.37.0", ] [[package]] name = "tauri-build" -version = "1.0.0-rc.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855e47d8cfb2219fc14d2eed2c09bfb35f9ecd71a40ca2084aeeee2d23e0b60d" +checksum = "acafb1c515c5d14234a294461bd43c723639a84891a45f6a250fd3441ad2e8ed" dependencies = [ "anyhow", "cargo_toml", + "heck 0.4.0", + "json-patch", + "semver 1.0.12", "serde_json", "tauri-utils", "winres", @@ -3726,30 +3427,35 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.0.0-rc.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef4656d174ba982198266da0c016573fe6c7c760e4290f05c8c384fe180007e" +checksum = "16d62a3c8790d6cba686cea6e3f7f569d12c662c3274c2d165a4fd33e3871b72" dependencies = [ "base64", - "blake3", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.5", "proc-macro2", "quote", "regex", + "semver 1.0.12", "serde", "serde_json", "sha2", "tauri-utils", "thiserror", - "uuid", + "time 0.3.11", + "uuid 1.1.2", "walkdir", - "zstd", ] [[package]] name = "tauri-macros" -version = "1.0.0-rc.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0993f5a867e321d26200b2d6394cdf482bd6cc5a0e4691bcabf811544f51cd4" +checksum = "7296fa17996629f43081e1c66d554703900187ed900c5bf46f97f0bcfb069278" dependencies = [ "heck 0.4.0", "proc-macro2", @@ -3761,85 +3467,90 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.3.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851cd65e2c9df4dd70a4f9e115fb2441ac89f1c80df79de0c15a448b4acd7768" +checksum = "4e4cff3b4d9469727fa2107c4b3d2eda110df1ba45103fb420178e536362fae4" dependencies = [ "gtk", "http", "http-range", "infer", + "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror", - "uuid", + "uuid 1.1.2", "webview2-com", - "windows 0.30.0", + "windows 0.37.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.3.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0184f95e065fb80afadf53f0a5f87a75af2da774d0524fe8cb2976fbec4a0bf2" +checksum = "3fa8c4edaf01d8b556e7172c844b1b4dd3399adcd1a606bd520fc3e65f698546" dependencies = [ + "cocoa", "gtk", - "ico", - "infer", - "png 0.16.8", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", "tauri-runtime", "tauri-utils", - "uuid", + "uuid 1.1.2", + "webkit2gtk", "webview2-com", - "windows 0.30.0", + "windows 0.37.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.0.0-rc.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad38ad698838886bf22ecb91c4b3d1ce178fdff7901ac7bff370103a4f51e59" +checksum = "12ff4b68d9faeb57c9c727bf58c9c9768d2b67d8e84e62ce6146e7859a2e9c6b" dependencies = [ + "brotli", "ctor", "glob", "heck 0.4.0", "html5ever", "json-patch", "kuchiki", + "memchr", "phf 0.10.1", "proc-macro2", "quote", + "semver 1.0.12", "serde", "serde_json", "serde_with", - "serialize-to-javascript", "thiserror", "url", "walkdir", - "zstd", + "windows 0.37.0", ] [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand 0.8.4", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] [[package]] name = "tendril" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" dependencies = [ "futf", "mac", @@ -3861,31 +3572,30 @@ name = "theseus" version = "0.1.0" dependencies = [ "argh", - "async-trait", + "async-tungstenite", + "bincode", "bytes", "chrono", - "const_format", "daedalus", - "dirs 4.0.0", - "fs_extra", + "dirs", "futures", - "json5", - "lazy_static", "log", "once_cell", - "path-clean", "pretty_assertions", "regex", "reqwest", "serde", "serde_json", "sha1", + "sled", "sys-info", "thiserror", "tokio", - "uuid", + "tracing", + "tracing-error", + "url", + "uuid 1.1.2", "zip", - "zip-extensions", ] [[package]] @@ -3893,9 +3603,10 @@ name = "theseus_cli" version = "0.1.0" dependencies = [ "argh", + "color-eyre", "daedalus", "dialoguer", - "dirs 4.0.0", + "dirs", "eyre", "futures", "paris", @@ -3903,7 +3614,13 @@ dependencies = [ "theseus", "tokio", "tokio-stream", - "uuid", + "tracing", + "tracing-error", + "tracing-futures", + "tracing-subscriber", + "url", + "uuid 1.1.2", + "webbrowser", ] [[package]] @@ -3924,18 +3641,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ "proc-macro2", "quote", @@ -3953,19 +3670,31 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] [[package]] -name = "tinyvec" -version = "1.5.1" +name = "time" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" +dependencies = [ + "itoa 1.0.2", + "libc", + "num_threads", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -3978,17 +3707,18 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.17.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" dependencies = [ + "autocfg", "bytes", "libc", "memchr", "mio", "num_cpus", "once_cell", - "parking_lot 0.12.0", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3998,9 +3728,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -4019,9 +3749,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" dependencies = [ "futures-core", "pin-project-lite", @@ -4030,38 +3760,38 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", ] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if", "pin-project-lite", @@ -4071,9 +3801,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" dependencies = [ "proc-macro2", "quote", @@ -4082,18 +3812,39 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" dependencies = [ - "lazy_static", + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", ] [[package]] name = "tracing-log" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ "lazy_static", "log", @@ -4102,13 +3853,13 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.7" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" +checksum = "3a713421342a5a666b7577783721d3117f1b69a393df803ee17bb73b1e122a59" dependencies = [ "ansi_term", - "lazy_static", "matchers", + "once_cell", "regex", "sharded-slab", "smallvec", @@ -4134,37 +3885,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "typenum" -version = "1.14.0" +name = "tungstenite" +version = "0.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "native-tls", + "rand 0.8.5", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "89570599c4fe5585de2b388aab47e99f7fa4e9238a1399f707a02e356058141c" [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" @@ -4172,12 +3949,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "url" version = "2.2.2" @@ -4203,10 +3974,25 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.3", + "getrandom 0.2.7", +] + +[[package]] +name = "uuid" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" +dependencies = [ + "getrandom 0.2.7", "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vcpkg" version = "0.2.15" @@ -4231,6 +4017,32 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "waker-fn" version = "1.1.0" @@ -4266,15 +4078,21 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4282,9 +4100,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" dependencies = [ "bumpalo", "lazy_static", @@ -4297,9 +4115,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" dependencies = [ "cfg-if", "js-sys", @@ -4309,9 +4127,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4319,9 +4137,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" dependencies = [ "proc-macro2", "quote", @@ -4332,83 +4150,98 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "webkit2gtk" -version = "0.17.1" +name = "webbrowser" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cbd39499e917de9dad36eb11c09f665eb984d432638ae7971feed98eb96df88" +checksum = "fc6a3cffdb686fbb24d9fb8f03a213803277ed2300f11026a3afe1f108dc021b" +dependencies = [ + "jni 0.19.0", + "ndk-glue", + "url", + "web-sys", + "widestring", + "winapi", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29952969fb5e10fe834a52eb29ad0814ccdfd8387159b0933edf1344a1c9cdcc" dependencies = [ "bitflags", "cairo-rs", "gdk", "gdk-sys", "gio", - "gio-sys 0.15.6", + "gio-sys", "glib", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys", + "gobject-sys", "gtk", "gtk-sys", "javascriptcore-rs", "libc", "once_cell", + "soup2", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcce6f1e0fc7715d651dba29875741509f5fc12f4e2976907272a74405f2b01" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" dependencies = [ "atk-sys", "bitflags", "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys", + "glib-sys", + "gobject-sys", "gtk-sys", "javascriptcore-rs-sys", "libc", "pango-sys", "pkg-config", "soup2-sys", - "system-deps 5.0.0", + "system-deps 6.0.2", ] [[package]] name = "webview2-com" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8e90ac2d9ce39cdb70017aaec641be09fbdd702b7b332b9896d053eb469524" +checksum = "a489a9420acabb3c2ed0434b6f71f6b56b9485ec32665a28dec1ee186d716e0f" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.30.0", - "windows_macros", + "windows 0.37.0", + "windows-implement", ] [[package]] name = "webview2-com-macros" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515c6c82fcee93f6edaacc72c8e233dbe4ff3ca569dce1901dfc36c404a3e99" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" dependencies = [ "proc-macro2", "quote", @@ -4417,32 +4250,29 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92160310b3322397e4ff8a8285a7429d73a07a68fda44ee80879605b93e53f76" +checksum = "0258c53ee9adc0a4f8ba1c8c317588f7a58c7048a55b621d469ba75ab3709ca1" dependencies = [ "regex", "serde", "serde_json", "thiserror", - "windows 0.30.0", + "windows 0.37.0", "windows-bindgen", ] [[package]] -name = "wepoll-ffi" -version = "0.1.2" +name = "widestring" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" [[package]] name = "wildmatch" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c48bd20df7e4ced539c12f570f937c6b4884928a87fee70a479d72f031d4e0" +checksum = "ee583bdc5ff1cf9db20e9db5bb3ff4c3089a8f6b8b31aff265c9aba85812db86" [[package]] name = "winapi" @@ -4489,61 +4319,74 @@ dependencies = [ [[package]] name = "windows" -version = "0.30.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b749ebd2304aa012c5992d11a25d07b406bdbe5f79d371cb7a918ce501a19eb0" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" dependencies = [ - "windows_aarch64_msvc 0.30.0", - "windows_i686_gnu 0.30.0", - "windows_i686_msvc 0.30.0", - "windows_x86_64_gnu 0.30.0", - "windows_x86_64_msvc 0.30.0", + "windows-implement", + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", ] [[package]] name = "windows-bindgen" -version = "0.30.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944c545fcae9dd66488308f8b69aa3ba34f53714416ecfcdcbbfa4b6821e27c6" +checksum = "0bed7be31ade0af08fec9b5343e9edcc005d22b1f11859b8a59b24797f5858e8" dependencies = [ - "windows_quote", - "windows_reader", + "windows-metadata", + "windows-tokens", ] +[[package]] +name = "windows-implement" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a1062e555f7d9d66fd1130ed4f7c6ec41a47529ee0850cd0e926d95b26bb14" +dependencies = [ + "syn", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f33f2b90a6664e369c41ab5ff262d06f048fc9685d9bf8a0e99a47750bb0463" + [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows_aarch64_msvc 0.32.0", - "windows_i686_gnu 0.32.0", - "windows_i686_msvc 0.32.0", - "windows_x86_64_gnu 0.32.0", - "windows_x86_64_msvc 0.32.0", + "windows_aarch64_msvc 0.36.1", + "windows_i686_gnu 0.36.1", + "windows_i686_msvc 0.36.1", + "windows_x86_64_gnu 0.36.1", + "windows_x86_64_msvc 0.36.1", ] [[package]] -name = "windows_aarch64_msvc" -version = "0.30.0" +name = "windows-tokens" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" +checksum = "3263d25f1170419995b78ff10c06b949e8a986c35c208dc24333c64753a87169" [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] -name = "windows_gen" -version = "0.30.0" +name = "windows_aarch64_msvc" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30dff4d91d22520628bb94b66f2bb313cb16a09a515a32320a84a1b449bc94c0" -dependencies = [ - "windows_quote", - "windows_reader", -] +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" [[package]] name = "windows_i686_gnu" @@ -4553,15 +4396,15 @@ checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" [[package]] name = "windows_i686_gnu" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" [[package]] name = "windows_i686_msvc" @@ -4571,39 +4414,15 @@ checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" [[package]] name = "windows_i686_msvc" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" - -[[package]] -name = "windows_macros" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ae44ab917e9005fe710d99d52d227ca0164b10a09be90649142cc3fab825d3" -dependencies = [ - "syn", - "windows_gen", - "windows_quote", - "windows_reader", -] - -[[package]] -name = "windows_quote" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f02c51a77e6248c1206aaa920802c32d50a05205e229b118d7f3afd3036667" - -[[package]] -name = "windows_reader" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44e6df0da993cda589c5ac852272fbb2a0ead67a031a017dd3eac11528a2d72" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" [[package]] name = "windows_x86_64_gnu" @@ -4613,15 +4432,15 @@ checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" [[package]] name = "windows_x86_64_gnu" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" [[package]] name = "windows_x86_64_msvc" @@ -4631,21 +4450,21 @@ checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" [[package]] name = "windows_x86_64_msvc" -version = "0.30.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] @@ -4665,17 +4484,18 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "007a0353840b23e0c6dc73e5b962ff58ed7f6bc9ceff3ce7fe6fbad8d496edf4" dependencies = [ - "strum 0.22.0", + "strum", "windows 0.24.0", "xml-rs", ] [[package]] name = "wry" -version = "0.13.2" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620bfe8ed3cde9310f32a69ffc654dfd8dae4ac5a0e08d6fbf0205a996fc7f0f" +checksum = "ce19dddbd3ce01dc8f14eb6d4c8f914123bf8379aaa838f6da4f981ff7104a3f" dependencies = [ + "block", "cocoa", "core-graphics", "gdk", @@ -4683,6 +4503,7 @@ dependencies = [ "glib", "gtk", "http", + "jni 0.18.0", "libc", "log", "objc", @@ -4690,15 +4511,14 @@ dependencies = [ "once_cell", "serde", "serde_json", - "sys-info", "tao", "thiserror", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.30.0", - "windows_macros", + "windows 0.37.0", + "windows-implement", ] [[package]] @@ -4724,9 +4544,9 @@ dependencies = [ [[package]] name = "xattr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" dependencies = [ "libc", ] @@ -4737,72 +4557,11 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" -[[package]] -name = "zbus" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb86f3d4592e26a48b2719742aec94f8ae6238ebde20d98183ee185d1275e9a" -dependencies = [ - "async-broadcast", - "async-channel", - "async-executor", - "async-io", - "async-lock", - "async-recursion", - "async-task", - "async-trait", - "byteorder", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "lazy_static", - "nix", - "once_cell", - "ordered-stream", - "rand 0.8.4", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "winapi", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36823cc10fddc3c6b19f048903262dacaf8274170e9a255784bdd8b4570a8040" -dependencies = [ - "proc-macro-crate 1.1.2", - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "zbus_names" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45dfcdcf87b71dad505d30cc27b1b7b88a64b6d1c435648f48f9dbc1fdc4b7e1" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - [[package]] name = "zeroize" -version = "1.5.4" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" +checksum = "20b578acffd8516a6c3f2a1bdefc1ec37e547bb4e0fb8b6b01a4cafc886b4442" [[package]] name = "zip" @@ -4815,32 +4574,23 @@ dependencies = [ "crc32fast", "flate2", "thiserror", - "time", -] - -[[package]] -name = "zip-extensions" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c3c977bc3434ce2d4bcea8ad3c644672de0f2c402b72b9171ca80a8885d14" -dependencies = [ - "zip", + "time 0.1.44", ] [[package]] name = "zstd" -version = "0.10.0+zstd.1.5.2" +version = "0.9.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" +checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.4+zstd.1.5.2" +version = "4.1.3+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" +checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" dependencies = [ "libc", "zstd-sys", @@ -4848,36 +4598,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "1.6.3+zstd.1.5.2" +version = "1.6.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" +checksum = "2daf2f248d9ea44454bfcb2516534e8b8ad2fc91bf818a1885495fc42bc8ac9f" dependencies = [ "cc", "libc", ] - -[[package]] -name = "zvariant" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ea5dc38b2058fae6a5b79009388143dadce1e91c26a67f984a0fc0381c8033" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2cecc5a61c2a053f7f653a24cd15b3b0195d7f7ddb5042c837fb32e161fb7a" -dependencies = [ - "proc-macro-crate 1.1.2", - "proc-macro2", - "quote", - "syn", -] diff --git a/flake.lock b/flake.lock index 70fbe9249..9df5a0b4f 100644 --- a/flake.lock +++ b/flake.lock @@ -8,11 +8,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1646893503, - "narHash": "sha256-N4Wn8FUXUC1h1DkL8X9I7VMvIv0fLLLjeJX3uFyzvRQ=", + "lastModified": 1655706580, + "narHash": "sha256-7DshIT1Ya5W9NAW7UdnYCHsGmXfOXJZCEHbbB/cCX7g=", "owner": "nix-community", "repo": "fenix", - "rev": "aad7f0a3e44ecfc9e2c5f1a45387d193c1c51aa6", + "rev": "d895003d8e03ac2fc8ffe2aa898299cbef1a7048", "type": "github" }, "original": { @@ -28,11 +28,11 @@ ] }, "locked": { - "lastModified": 1639947939, - "narHash": "sha256-pGsM8haJadVP80GFq4xhnSpNitYNQpaXk4cnA796Cso=", + "lastModified": 1655042882, + "narHash": "sha256-9BX8Fuez5YJlN7cdPO63InoyBy7dm3VlJkkmTt6fS1A=", "owner": "nix-community", "repo": "naersk", - "rev": "2fc8ce9d3c025d59fee349c1f80be9785049d653", + "rev": "cddffb5aa211f50c4b8750adbec0bbbdfb26bb9f", "type": "github" }, "original": { @@ -43,11 +43,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1646497237, - "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=", + "lastModified": 1655624069, + "narHash": "sha256-7g1zwTdp35GMTERnSzZMWJ7PG3QdDE8VOX3WsnOkAtM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026", + "rev": "0d68d7c857fe301d49cdcd56130e0beea4ecd5aa", "type": "github" }, "original": { @@ -68,15 +68,15 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1646862342, - "narHash": "sha256-zXd3qsIcQFDFMB6p8bSpkOKjTuBTvYuM4GkPYxEfQdA=", - "owner": "rust-analyzer", + "lastModified": 1655654433, + "narHash": "sha256-auHQ0XPCiaTPSn+R3Yu4J7oZ5Zq/FS5/Da1ivvdYb/Y=", + "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "5b51cb835a356cf79cba00cf5c65d51cadeea7f1", + "rev": "427061da19723f2206fe4dcb175c9c43b9a6193d", "type": "github" }, "original": { - "owner": "rust-analyzer", + "owner": "rust-lang", "ref": "nightly", "repo": "rust-analyzer", "type": "github" @@ -84,11 +84,11 @@ }, "utils": { "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 746b13631..703964f1a 100644 --- a/flake.nix +++ b/flake.nix @@ -14,7 +14,7 @@ }; }; - outputs = inputs: + outputs = inputs@{self, ...}: inputs.utils.lib.eachDefaultSystem (system: let pkgs = import inputs.nixpkgs { inherit system; }; fenix = inputs.fenix.packages.${system}; @@ -32,13 +32,14 @@ deps = with pkgs; { global = [ - openssl pkg-config + openssl pkg-config gcc ]; gui = [ - gtk4 gdk-pixbuf atk webkitgtk + gtk4 gdk-pixbuf atk webkitgtk dbus ]; shell = [ - toolchain fenix.default.clippy git + (with fenix; combine [toolchain default.clippy complete.rust-src rust-analyzer]) + git jdk17 jdk8 ]; }; @@ -53,8 +54,13 @@ }; apps = { - theseus-cli = utils.mkApp { - drv = inputs.self.packages.${system}.theseus-cli; + cli = utils.mkApp { + drv = self.packages.${system}.theseus-cli; + }; + cli-dev = utils.mkApp { + drv = self.packages.${system}.theseus-cli.overrideAttrs (old: old // { + release = false; + }); }; }; diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 69a7fa416..000000000 --- a/shell.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ pkgs ? import {} }: - -pkgs.mkShell { - buildInputs = with pkgs; [ - rustc cargo clippy openssl pkg-config - gtk4 gdk-pixbuf atk webkitgtk - ]; -} diff --git a/theseus/Cargo.toml b/theseus/Cargo.toml index c8b5413b3..b87e99c4f 100644 --- a/theseus/Cargo.toml +++ b/theseus/Cargo.toml @@ -7,42 +7,35 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -thiserror = "1.0" -async-trait = "0.1.51" - -daedalus = "0.1.12" - -reqwest = { version = "0.11", features = ["json"] } +bytes = "1" +bincode = { version = "2.0.0-rc.1", features = ["serde"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -json5 = "0.4.1" -chrono = { version = "0.4", features = ["serde"] } -uuid = { version = "0.8", features = ["serde", "v4"] } -bytes = "1" -zip = "0.5" -zip-extensions = "0.6" sha1 = { version = "0.6.0", features = ["std"]} -path-clean = "0.1.0" -fs_extra = "1.2.0" +sled = { version = "0.34.7", features = ["compression"] } +url = "2.2" +uuid = { version = "1.1", features = ["serde", "v4"] } +zip = "0.5" + +chrono = { version = "0.4.19", features = ["serde"] } +daedalus = { version = "0.1.16", features = ["bincode"] } dirs = "4.0" - -regex = "1.5" - -tokio = { version = "1", features = ["full"] } -futures = "0.3" - -sys-info = "0.9.0" - +# TODO: possibly replace with tracing to have structured logging log = "0.4.14" -const_format = "0.2.22" +regex = "1.5" +sys-info = "0.9.0" +thiserror = "1.0" +tracing = "0.1" +tracing-error = "0.2" + +async-tungstenite = { version = "0.17", features = ["tokio-runtime", "tokio-native-tls"] } +futures = "0.3" once_cell = "1.9.0" -lazy_static = "1.4" +reqwest = { version = "0.11", features = ["json"] } +tokio = { version = "1", features = ["full"] } [dev-dependencies] argh = "0.1.6" pretty_assertions = "1.1.0" -[[example]] -name = "download-pack" - [features] diff --git a/theseus/examples/download-pack.rs b/theseus/examples/download-pack.rs deleted file mode 100644 index 50cba5307..000000000 --- a/theseus/examples/download-pack.rs +++ /dev/null @@ -1,55 +0,0 @@ -use std::{path::PathBuf, time::Instant}; - -use argh::FromArgs; -use theseus::modpack::{fetch_modpack, pack::ModpackSide}; - -#[derive(FromArgs)] -/// Simple modpack download -struct ModpackDownloader { - /// where to download to - #[argh(positional)] - url: String, - - /// where to put the resulting pack - #[argh(option, short = 'o')] - output: Option, - - /// the sha1 hash, if you want it checked - #[argh(option, short = 'c')] - hash: Option, - - /// use verbose logging - #[argh(switch, short = 'v')] - verbose: bool, -} - -// Simple logging helper -fn debug(msg: &str, verbose: bool) { - if verbose { - println!("{}", msg); - } -} - -#[tokio::main] -pub async fn main() { - let args = argh::from_env::(); - let dest = args.output.unwrap_or(PathBuf::from("./pack-download/")); - - debug( - &format!( - "Downloading pack {} to {}", - args.url, - dest.to_str().unwrap_or("?") - ), - args.verbose, - ); - - let start = Instant::now(); - fetch_modpack(&args.url, args.hash.as_deref(), &dest, ModpackSide::Client) - .await - .unwrap(); - let end = start.elapsed(); - - println!("Download completed in {} seconds", end.as_secs_f32()); - debug("Done!", args.verbose); -} diff --git a/theseus/src/api/auth.rs b/theseus/src/api/auth.rs new file mode 100644 index 000000000..8e9951824 --- /dev/null +++ b/theseus/src/api/auth.rs @@ -0,0 +1,100 @@ +//! Authentication flow interface +use crate::{launcher::auth as inner, State}; +use futures::prelude::*; +use tokio::sync::oneshot; + +pub use inner::Credentials; + +/// Authenticate a user with Hydra +/// To run this, you need to first spawn this function as a task, then +/// open a browser to the given URL and finally wait on the spawned future +/// with the ability to cancel in case the browser is closed before finishing +#[tracing::instrument] +pub async fn authenticate( + browser_url: oneshot::Sender, +) -> crate::Result { + let mut flow = inner::HydraAuthFlow::new().await?; + let state = State::get().await?; + let mut users = state.users.write().await; + + let url = flow.prepare_login_url().await?; + browser_url.send(url).map_err(|url| { + crate::ErrorKind::OtherError(format!( + "Error sending browser url to parent: {url}" + )) + })?; + + let credentials = flow.extract_credentials().await?; + users.insert(&credentials)?; + + if state.settings.read().await.default_user.is_none() { + let mut settings = state.settings.write().await; + settings.default_user = Some(credentials.id); + } + + Ok(credentials) +} + +/// Refresh some credentials using Hydra, if needed +#[tracing::instrument] +pub async fn refresh( + user: uuid::Uuid, + update_name: bool, +) -> crate::Result { + let state = State::get().await?; + let mut users = state.users.write().await; + + futures::future::ready(users.get(user)?.ok_or_else(|| { + crate::ErrorKind::OtherError(format!( + "Tried to refresh nonexistent user with ID {user}" + )) + .as_error() + })) + .and_then(|mut credentials| async move { + if chrono::offset::Utc::now() > credentials.expires { + inner::refresh_credentials(&mut credentials).await?; + if update_name { + inner::refresh_username(&mut credentials).await?; + } + } + users.insert(&credentials)?; + Ok(credentials) + }) + .await +} + +/// Remove a user account from the database +#[tracing::instrument] +pub async fn remove_user(user: uuid::Uuid) -> crate::Result<()> { + let state = State::get().await?; + let mut users = state.users.write().await; + + if state.settings.read().await.default_user == Some(user) { + let mut settings = state.settings.write().await; + settings.default_user = users + .0 + .first()? + .map(|it| uuid::Uuid::from_slice(&it.0)) + .transpose()?; + } + + users.remove(user)?; + Ok(()) +} + +/// Check if a user exists in Theseus +#[tracing::instrument] +pub async fn has_user(user: uuid::Uuid) -> crate::Result { + let state = State::get().await?; + let users = state.users.read().await; + + Ok(users.contains(user)?) +} + +/// Get a copy of the list of all user credentials +#[tracing::instrument] +pub async fn users() -> crate::Result> { + let state = State::get().await?; + let users = state.users.read().await; + users.iter().collect() +} diff --git a/theseus/src/api/mod.rs b/theseus/src/api/mod.rs new file mode 100644 index 000000000..0d572b3b5 --- /dev/null +++ b/theseus/src/api/mod.rs @@ -0,0 +1,19 @@ +//! API for interacting with Theseus +pub mod auth; +pub mod profile; + +pub mod data { + pub use crate::state::{ + DirectoryInfo, Hooks, JavaSettings, MemorySettings, ModLoader, + ProfileMetadata, Settings, WindowSize, + }; +} + +pub mod prelude { + pub use crate::{ + auth::{self, Credentials}, + data::*, + profile::{self, Profile}, + State, + }; +} diff --git a/theseus/src/api/profile.rs b/theseus/src/api/profile.rs new file mode 100644 index 000000000..68f059e08 --- /dev/null +++ b/theseus/src/api/profile.rs @@ -0,0 +1,243 @@ +//! Theseus profile management interface +pub use crate::{ + state::{JavaSettings, Profile}, + State, +}; +use daedalus as d; +use std::{ + future::Future, + path::{Path, PathBuf}, +}; +use tokio::process::{Child, Command}; + +/// Add a profile to the in-memory state +#[tracing::instrument] +pub async fn add(profile: Profile) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.insert(profile)?; + + Ok(()) +} + +/// Add a path as a profile in-memory +#[tracing::instrument] +pub async fn add_path(path: &Path) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.insert_from(path).await?; + + Ok(()) +} + +/// Remove a profile +#[tracing::instrument] +pub async fn remove(path: &Path) -> crate::Result<()> { + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + profiles.remove(path)?; + + Ok(()) +} + +/// Get a profile by path, +#[tracing::instrument] +pub async fn get(path: &Path) -> crate::Result> { + let state = State::get().await?; + let profiles = state.profiles.read().await; + + profiles.0.get(path).map_or(Ok(None), |prof| match prof { + Some(prof) => Ok(Some(prof.clone())), + None => Err(crate::ErrorKind::UnloadedProfileError( + path.display().to_string(), + ) + .as_error()), + }) +} + +/// Check if a profile is already managed by Theseus +#[tracing::instrument] +pub async fn is_managed(profile: &Path) -> crate::Result { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles.0.contains_key(profile)) +} + +/// Check if a profile is loaded +#[tracing::instrument] +pub async fn is_loaded(profile: &Path) -> crate::Result { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles + .0 + .get(profile) + .map(Option::as_ref) + .flatten() + .is_some()) +} + +/// Edit a profile using a given asynchronous closure +pub async fn edit( + path: &Path, + action: impl Fn(&mut Profile) -> Fut, +) -> crate::Result<()> +where + Fut: Future>, +{ + let state = State::get().await?; + let mut profiles = state.profiles.write().await; + + match profiles.0.get_mut(path) { + Some(&mut Some(ref mut profile)) => action(profile).await, + Some(&mut None) => Err(crate::ErrorKind::UnloadedProfileError( + path.display().to_string(), + ) + .as_error()), + None => Err(crate::ErrorKind::UnmanagedProfileError( + path.display().to_string(), + ) + .as_error()), + } +} + +/// Get a copy of the profile set +#[tracing::instrument] +pub async fn list( +) -> crate::Result>> { + let state = State::get().await?; + let profiles = state.profiles.read().await; + Ok(profiles.0.clone()) +} + +/// Run Minecraft using a profile +#[tracing::instrument(skip_all)] +pub async fn run( + path: &Path, + credentials: &crate::auth::Credentials, +) -> crate::Result { + let state = State::get().await.unwrap(); + let settings = state.settings.read().await; + let profile = get(path).await?.ok_or_else(|| { + crate::ErrorKind::OtherError(format!( + "Tried to run a nonexistent or unloaded profile at path {}!", + path.display() + )) + })?; + + let version = state + .metadata + .minecraft + .versions + .iter() + .find(|it| it.id == profile.metadata.game_version.as_ref()) + .ok_or_else(|| { + crate::ErrorKind::LauncherError(format!( + "Invalid or unknown Minecraft version: {}", + profile.metadata.game_version + )) + })?; + let version_info = d::minecraft::fetch_version_info(version).await?; + + let ref pre_launch_hooks = + profile.hooks.as_ref().unwrap_or(&settings.hooks).pre_launch; + for hook in pre_launch_hooks.iter() { + // TODO: hook parameters + let mut cmd = hook.split(' '); + let result = Command::new(cmd.next().unwrap()) + .args(&cmd.collect::>()) + .current_dir(path) + .spawn()? + .wait() + .await?; + + if !result.success() { + return Err(crate::ErrorKind::LauncherError(format!( + "Non-zero exit code for pre-launch hook: {}", + result.code().unwrap_or(-1) + )) + .as_error()); + } + } + + let java_install = match profile.java { + Some(JavaSettings { + install: Some(ref install), + .. + }) => install, + _ => if version_info + .java_version + .as_ref() + .filter(|it| it.major_version >= 16) + .is_some() + { + settings.java_17_path.as_ref() + } else { + settings.java_8_path.as_ref() + } + .ok_or_else(|| { + crate::ErrorKind::LauncherError(format!( + "No Java installed for version {}", + version_info.java_version.map_or(8, |it| it.major_version), + )) + })?, + }; + + if !java_install.exists() { + return Err(crate::ErrorKind::LauncherError(format!( + "Could not find Java install: {}", + java_install.display() + )) + .as_error()); + } + + let ref java_args = profile + .java + .as_ref() + .and_then(|it| it.extra_arguments.as_ref()) + .unwrap_or(&settings.custom_java_args); + + let wrapper = profile + .hooks + .as_ref() + .map_or(&settings.hooks.wrapper, |it| &it.wrapper); + + let ref memory = profile.memory.unwrap_or(settings.memory); + let ref resolution = profile.resolution.unwrap_or(settings.game_resolution); + + crate::launcher::launch_minecraft( + &profile.metadata.game_version, + &profile.metadata.loader_version, + &profile.path, + &java_install, + &java_args, + &wrapper, + memory, + resolution, + credentials, + ) + .await +} + +#[tracing::instrument] +pub async fn kill(running: &mut Child) -> crate::Result<()> { + running.kill().await?; + wait_for(running).await +} + +#[tracing::instrument] +pub async fn wait_for(running: &mut Child) -> crate::Result<()> { + let result = running.wait().await.map_err(|err| { + crate::ErrorKind::LauncherError(format!( + "Error running minecraft: {err}" + )) + })?; + + match result.success() { + false => Err(crate::ErrorKind::LauncherError(format!( + "Minecraft exited with non-zero code {}", + result.code().unwrap_or(-1) + )) + .as_error()), + true => Ok(()), + } +} diff --git a/theseus/src/config.rs b/theseus/src/config.rs new file mode 100644 index 000000000..eedbec89f --- /dev/null +++ b/theseus/src/config.rs @@ -0,0 +1,22 @@ +//! Configuration structs + +use once_cell::sync::Lazy; +use std::time; + +pub static BINCODE_CONFIG: Lazy = + Lazy::new(|| { + bincode::config::standard() + .with_little_endian() + .with_no_limit() + }); + +pub static REQWEST_CLIENT: Lazy = Lazy::new(|| { + reqwest::Client::builder() + .tcp_keepalive(Some(time::Duration::from_secs(10))) + .build() + .unwrap() +}); + +pub fn sled_config() -> sled::Config { + sled::Config::default().use_compression(true) +} diff --git a/theseus/src/data/meta.rs b/theseus/src/data/meta.rs deleted file mode 100644 index 3aa3f7252..000000000 --- a/theseus/src/data/meta.rs +++ /dev/null @@ -1,107 +0,0 @@ -use crate::{data::DataError, LAUNCHER_WORK_DIR}; -use once_cell::sync; -use serde::{Deserialize, Serialize}; -use tokio::sync::{RwLock, RwLockReadGuard}; - -const META_FILE: &str = "meta.json"; -const META_URL: &str = "https://meta.modrinth.com/gamedata"; - -static METADATA: sync::OnceCell> = sync::OnceCell::new(); - -#[derive(Clone, Serialize, Deserialize, Debug)] -pub struct Metadata { - pub minecraft: daedalus::minecraft::VersionManifest, - pub forge: daedalus::modded::Manifest, - pub fabric: daedalus::modded::Manifest, -} - -impl Metadata { - pub async fn init() -> Result<(), DataError> { - let meta_path = LAUNCHER_WORK_DIR.join(META_FILE); - - if meta_path.exists() { - let meta_data = tokio::fs::read_to_string(meta_path) - .await - .ok() - .and_then(|it| serde_json::from_str::(&it).ok()); - - if let Some(metadata) = meta_data { - METADATA.get_or_init(|| RwLock::new(metadata)); - } - } - - let future = async { - for attempt in 0..=3 { - let res = async { - let new = Self::fetch().await?; - - std::fs::write( - LAUNCHER_WORK_DIR.join(META_FILE), - &serde_json::to_string(&new)?, - )?; - - if let Some(metadata) = METADATA.get() { - *metadata.write().await = new; - } else { - METADATA.get_or_init(|| RwLock::new(new)); - } - - Ok::<(), DataError>(()) - } - .await; - - match res { - Ok(_) => { - break; - } - Err(_) if attempt <= 3 => continue, - Err(err) => { - log::warn!("Unable to fetch launcher metadata: {}", err) - } - }; - } - }; - - if METADATA.get().is_some() { - tokio::task::spawn(future); - } else { - future.await; - } - - Ok(()) - } - - pub async fn fetch() -> Result { - let (game, forge, fabric) = futures::future::join3( - daedalus::minecraft::fetch_version_manifest(Some(&format!( - "{}/minecraft/v0/manifest.json", - META_URL - ))), - daedalus::modded::fetch_manifest(&format!( - "{}/forge/v0/manifest.json", - META_URL - )), - daedalus::modded::fetch_manifest(&format!( - "{}/fabric/v0/manifest.json", - META_URL - )), - ) - .await; - - Ok(Self { - minecraft: game?, - forge: forge?, - fabric: fabric?, - }) - } - - pub async fn get<'a>() -> Result, DataError> { - let res = METADATA - .get() - .ok_or_else(|| DataError::InitializedError("metadata".to_string()))? - .read() - .await; - - Ok(res) - } -} diff --git a/theseus/src/data/mod.rs b/theseus/src/data/mod.rs deleted file mode 100644 index fb307d8a5..000000000 --- a/theseus/src/data/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::io; - -pub use meta::Metadata; -pub use profiles::{Profile, Profiles}; -pub use settings::Settings; - -mod meta; -pub mod profiles; -mod settings; - -#[derive(thiserror::Error, Debug)] -pub enum DataError { - #[error("I/O error while reading data: {0}")] - IOError(#[from] io::Error), - - #[error("Daedalus error: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Data format error: {0}")] - FormatError(String), - - #[error("Attempted to access {0} without initializing it!")] - InitializedError(String), - - #[error("Error while serializing/deserializing data")] - SerdeError(#[from] serde_json::Error), -} diff --git a/theseus/src/data/profiles.rs b/theseus/src/data/profiles.rs deleted file mode 100644 index 5f9639200..000000000 --- a/theseus/src/data/profiles.rs +++ /dev/null @@ -1,502 +0,0 @@ -use super::DataError; -use crate::launcher::ModLoader; -use daedalus::modded::LoaderVersion; -use futures::*; -use once_cell::sync::OnceCell; -use serde::{Deserialize, Serialize}; -use std::{ - collections::{HashMap, HashSet}, - path::{Path, PathBuf}, - sync::Arc, -}; -use tokio::{ - fs, - process::{Child, Command}, - sync::{Mutex, RwLock, RwLockReadGuard}, -}; - -static PROFILES: OnceCell> = OnceCell::new(); -pub const PROFILE_JSON_PATH: &str = "profile.json"; - -#[derive(Debug)] -pub struct Profiles(pub HashMap); - -// TODO: possibly add defaults to some of these values -pub const CURRENT_FORMAT_VERSION: u32 = 1; -pub const SUPPORTED_ICON_FORMATS: &[&'static str] = &[ - "bmp", "gif", "jpeg", "jpg", "jpe", "png", "svg", "svgz", "webp", "rgb", - "mp4", -]; - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct Profile { - #[serde(skip)] - pub path: PathBuf, - pub metadata: Metadata, - #[serde(skip_serializing_if = "Option::is_none")] - pub java: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub memory: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub resolution: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub hooks: Option, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct Metadata { - pub name: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub icon: Option, - pub game_version: String, - #[serde(default)] - pub loader: ModLoader, - #[serde(skip_serializing_if = "Option::is_none")] - pub loader_version: Option, - pub format_version: u32, -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct JavaSettings { - #[serde(skip_serializing_if = "Option::is_none")] - pub install: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub extra_arguments: Option>, -} - -#[derive(Serialize, Deserialize, Clone, Copy, Debug)] -pub struct MemorySettings { - #[serde(skip_serializing_if = "Option::is_none")] - pub minimum: Option, - pub maximum: u32, -} - -impl Default for MemorySettings { - fn default() -> Self { - Self { - minimum: None, - maximum: 2048, - } - } -} - -#[derive(Serialize, Deserialize, Clone, Copy, Debug)] -pub struct WindowSize(pub u16, pub u16); - -impl Default for WindowSize { - fn default() -> Self { - Self(854, 480) - } -} - -#[derive(Serialize, Deserialize, Clone, Debug)] -pub struct ProfileHooks { - #[serde(skip_serializing_if = "HashSet::is_empty", default)] - pub pre_launch: HashSet, - #[serde(skip_serializing_if = "Option::is_none")] - pub wrapper: Option, - #[serde(skip_serializing_if = "HashSet::is_empty", default)] - pub post_exit: HashSet, -} - -impl Default for ProfileHooks { - fn default() -> Self { - Self { - pre_launch: HashSet::::new(), - wrapper: None, - post_exit: HashSet::::new(), - } - } -} - -impl Profile { - pub async fn new( - name: String, - version: String, - path: PathBuf, - ) -> Result { - if name.trim().is_empty() { - return Err(DataError::FormatError(String::from( - "Empty name for instance!", - ))); - } - - Ok(Self { - path: path.canonicalize()?, - metadata: Metadata { - name, - icon: None, - game_version: version, - loader: ModLoader::Vanilla, - loader_version: None, - format_version: CURRENT_FORMAT_VERSION, - }, - java: None, - memory: None, - resolution: None, - hooks: None, - }) - } - - pub async fn run( - &self, - credentials: &crate::launcher::Credentials, - ) -> Result { - use crate::launcher::LauncherError; - let (settings, version_info) = tokio::try_join! { - super::Settings::get(), - super::Metadata::get() - .and_then(|manifest| async move { - let version = manifest - .minecraft - .versions - .iter() - .find(|it| it.id == self.metadata.game_version.as_ref()) - .ok_or_else(|| DataError::FormatError(format!( - "invalid or unknown version: {}", - self.metadata.game_version - )))?; - - Ok(daedalus::minecraft::fetch_version_info(version) - .await?) - }) - }?; - - let ref pre_launch_hooks = - self.hooks.as_ref().unwrap_or(&settings.hooks).pre_launch; - for hook in pre_launch_hooks.iter() { - // TODO: hook parameters - let mut cmd = hook.split(' '); - let result = Command::new(cmd.next().unwrap()) - .args(&cmd.collect::>()) - .current_dir(&self.path) - .spawn()? - .wait() - .await?; - - if !result.success() { - return Err(LauncherError::ExitError( - result.code().unwrap_or(-1), - )); - } - } - - let java_install = match self.java { - Some(JavaSettings { - install: Some(ref install), - .. - }) => install, - _ => if version_info - .java_version - .as_ref() - .filter(|it| it.major_version >= 16) - .is_some() - { - settings.java_17_path.as_ref() - } else { - settings.java_8_path.as_ref() - } - .ok_or_else(|| { - LauncherError::JavaError(format!( - "No Java installed for version {}", - version_info.java_version.map_or(8, |it| it.major_version), - )) - })?, - }; - - if !java_install.exists() { - return Err(LauncherError::JavaError(format!( - "Could not find java install: {}", - java_install.display() - ))); - } - - let java_args = &self - .java - .as_ref() - .and_then(|it| it.extra_arguments.as_ref()) - .unwrap_or(&settings.custom_java_args); - - let wrapper = self - .hooks - .as_ref() - .map_or(&settings.hooks.wrapper, |it| &it.wrapper); - - let ref memory = self.memory.unwrap_or(settings.memory); - let ref resolution = - self.resolution.unwrap_or(settings.game_resolution); - - crate::launcher::launch_minecraft( - &self.metadata.game_version, - &self.metadata.loader_version, - &self.path, - &java_install, - &java_args, - &wrapper, - memory, - resolution, - credentials, - ) - .await - } - - pub async fn kill( - &self, - running: &mut Child, - ) -> Result<(), crate::launcher::LauncherError> { - running.kill().await?; - self.wait_for(running).await - } - - pub async fn wait_for( - &self, - running: &mut Child, - ) -> Result<(), crate::launcher::LauncherError> { - let result = running.wait().await.map_err(|err| { - crate::launcher::LauncherError::ProcessError { - inner: err, - process: String::from("minecraft"), - } - })?; - - match result.success() { - false => Err(crate::launcher::LauncherError::ExitError( - result.code().unwrap_or(-1), - )), - true => Ok(()), - } - } - - // TODO: deduplicate these builder methods - // They are flat like this in order to allow builder-style usage - pub fn with_name(&mut self, name: String) -> &mut Self { - self.metadata.name = name; - self - } - - pub async fn with_icon( - &mut self, - icon: &Path, - ) -> Result<&mut Self, DataError> { - let ext = icon - .extension() - .and_then(std::ffi::OsStr::to_str) - .unwrap_or(""); - - if SUPPORTED_ICON_FORMATS.contains(&ext) { - let file_name = format!("icon.{ext}"); - fs::copy(icon, &self.path.join(&file_name)).await?; - self.metadata.icon = - Some(Path::new(&format!("./{file_name}")).to_owned()); - - Ok(self) - } else { - Err(DataError::FormatError(format!( - "Unsupported image type: {ext}" - ))) - } - } - - pub fn with_game_version(&mut self, version: String) -> &mut Self { - self.metadata.game_version = version; - self - } - - pub fn with_loader( - &mut self, - loader: ModLoader, - version: Option, - ) -> &mut Self { - self.metadata.loader = loader; - self.metadata.loader_version = version; - self - } - - pub fn with_java_settings( - &mut self, - settings: Option, - ) -> &mut Self { - self.java = settings; - self - } - - pub fn with_memory( - &mut self, - settings: Option, - ) -> &mut Self { - self.memory = settings; - self - } - - pub fn with_resolution( - &mut self, - resolution: Option, - ) -> &mut Self { - self.resolution = resolution; - self - } - - pub fn with_hooks(&mut self, hooks: Option) -> &mut Self { - self.hooks = hooks; - self - } -} - -impl Profiles { - pub async fn init() -> Result<(), DataError> { - let settings = super::Settings::get().await?; - let profiles = Arc::new(Mutex::new(HashMap::new())); - - let futures = settings.profiles.clone().into_iter().map(|path| async { - let profiles = Arc::clone(&profiles); - tokio::spawn(async move { - // TODO: handle missing profiles - let mut profiles = profiles.lock().await; - let profile = Self::read_profile_from_dir(path.clone()).await?; - - profiles.insert(path, profile); - Ok(()) as Result<_, DataError> - }) - .await - .unwrap() - }); - futures::future::try_join_all(futures).await?; - - PROFILES.get_or_init(|| { - RwLock::new(Profiles( - Arc::try_unwrap(profiles).unwrap().into_inner(), - )) - }); - Ok(()) - } - - pub async fn insert(profile: Profile) -> Result<(), DataError> { - let mut profiles = PROFILES - .get() - .ok_or_else(|| { - DataError::InitializedError(String::from("profiles")) - })? - .write() - .await; - - super::Settings::get_mut() - .await? - .profiles - .insert(profile.path.clone()); - profiles.0.insert(profile.path.clone(), profile); - Ok(()) - } - - pub async fn insert_from(path: PathBuf) -> Result<(), DataError> { - Self::read_profile_from_dir(path) - .and_then(Self::insert) - .await - } - - pub async fn remove(path: &Path) -> Result, DataError> { - let path = path.canonicalize()?; - let mut profiles = PROFILES.get().unwrap().write().await; - super::Settings::get_mut().await?.profiles.remove(&path); - Ok(profiles.0.remove(&path)) - } - - pub async fn save() -> Result<(), DataError> { - let profiles = Self::get().await?; - - let futures = profiles.0.clone().into_iter().map(|(path, profile)| { - tokio::spawn(async move { - let json = tokio::task::spawn_blocking(move || { - serde_json::to_vec_pretty(&profile) - }) - .await - .unwrap()?; - - let profile_json_path = path.join(PROFILE_JSON_PATH); - fs::write(profile_json_path, json).await?; - Ok(()) as Result<(), DataError> - }) - }); - futures::future::try_join_all(futures) - .await - .unwrap() - .into_iter() - .collect::>()?; - - Ok(()) - } - - pub async fn get<'a>() -> Result, DataError> { - Ok(PROFILES - .get() - .ok_or_else(|| DataError::InitializedError("profiles".to_string()))? - .read() - .await) - } - - async fn read_profile_from_dir( - path: PathBuf, - ) -> Result { - let json = fs::read(path.join(PROFILE_JSON_PATH)).await?; - let mut profile = serde_json::from_slice::(&json)?; - profile.path = path.clone(); - Ok(profile) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use pretty_assertions::{assert_eq, assert_str_eq}; - - #[test] - fn profile_test() -> Result<(), serde_json::Error> { - let profile = Profile { - path: PathBuf::from("/tmp/nunya/beeswax"), - metadata: Metadata { - name: String::from("Example Pack"), - icon: None, - game_version: String::from("1.18.2"), - loader: ModLoader::Vanilla, - loader_version: None, - format_version: CURRENT_FORMAT_VERSION, - }, - java: JavaSettings { - install: PathBuf::from("/usr/bin/java"), - extra_arguments: Vec::new(), - }, - memory: MemorySettings { - minimum: None, - maximum: 8192, - }, - resolution: WindowSize(1920, 1080), - hooks: ProfileHooks { - pre_launch: HashSet::new(), - wrapper: None, - post_exit: HashSet::new(), - }, - }; - let json = serde_json::json!({ - "path": "/tmp/nunya/beeswax", - "metadata": { - "name": "Example Pack", - "game_version": "1.18.2", - "format_version": 1u32, - }, - "java": { - "install": "/usr/bin/java", - }, - "memory": { - "maximum": 8192u32, - }, - "resolution": (1920u16, 1080u16), - "hooks": {}, - }); - - assert_eq!(serde_json::to_value(profile.clone())?, json.clone()); - assert_str_eq!( - format!("{:?}", serde_json::from_value::(json)?), - format!("{:?}", profile), - ); - Ok(()) - } -} diff --git a/theseus/src/data/settings.rs b/theseus/src/data/settings.rs deleted file mode 100644 index 1c33697b6..000000000 --- a/theseus/src/data/settings.rs +++ /dev/null @@ -1,124 +0,0 @@ -use super::profiles::*; -use std::{collections::HashSet, path::PathBuf}; - -use crate::{data::DataError, LAUNCHER_WORK_DIR}; -use once_cell::sync; -use serde::{Deserialize, Serialize}; -use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; - -const SETTINGS_FILE: &str = "settings.json"; -const ICONS_PATH: &str = "icons"; -const METADATA_DIR: &str = "meta"; -const SETTINGS_PATH_ENV: &str = "THESEUS_CONFIG_DIR"; - -static SETTINGS: sync::OnceCell> = sync::OnceCell::new(); -pub const FORMAT_VERSION: u32 = 1; - -#[derive(Clone, Serialize, Deserialize, Debug)] -#[serde(default)] -pub struct Settings { - pub memory: MemorySettings, - pub game_resolution: WindowSize, - pub custom_java_args: Vec, - pub java_8_path: Option, - pub java_17_path: Option, - pub hooks: ProfileHooks, - pub icon_path: PathBuf, - pub metadata_dir: PathBuf, - pub profiles: HashSet, - pub max_concurrent_downloads: usize, - pub version: u32, -} - -impl Default for Settings { - fn default() -> Self { - Self { - memory: MemorySettings::default(), - game_resolution: WindowSize::default(), - custom_java_args: Vec::new(), - java_8_path: None, - java_17_path: None, - hooks: ProfileHooks::default(), - icon_path: LAUNCHER_WORK_DIR.join(ICONS_PATH), - metadata_dir: LAUNCHER_WORK_DIR.join(METADATA_DIR), - profiles: HashSet::new(), - max_concurrent_downloads: 32, - version: FORMAT_VERSION, - } - } -} - -impl Settings { - pub async fn init() -> Result<(), DataError> { - let settings_path = std::env::var_os(SETTINGS_PATH_ENV) - .map_or(LAUNCHER_WORK_DIR.join(SETTINGS_FILE), PathBuf::from); - - if settings_path.exists() { - let settings_data = tokio::fs::read_to_string(settings_path) - .await - .map(|x| serde_json::from_str::(&x).ok()) - .ok() - .flatten(); - - if let Some(settings) = settings_data { - SETTINGS.get_or_init(|| RwLock::new(settings)); - } - } - - if SETTINGS.get().is_none() { - let new = Self::default(); - - tokio::fs::write( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - &serde_json::to_string(&new)?, - ) - .await?; - - SETTINGS.get_or_init(|| RwLock::new(new)); - } - - Ok(()) - } - - pub async fn load() -> Result<(), DataError> { - let new = serde_json::from_str::(&std::fs::read_to_string( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - )?)?; - - let mut write = SETTINGS - .get() - .ok_or_else(|| DataError::InitializedError("settings".to_string()))? - .write() - .await; - - *write = new; - - Ok(()) - } - - pub async fn save() -> Result<(), DataError> { - let settings = Self::get().await?; - - std::fs::write( - LAUNCHER_WORK_DIR.join(SETTINGS_FILE), - &serde_json::to_string_pretty(&*settings)?, - )?; - - Ok(()) - } - - pub async fn get<'a>() -> Result, DataError> { - Ok(Self::get_or_uninit::<'a>()?.read().await) - } - - pub async fn get_mut<'a>() -> Result, DataError> - { - Ok(Self::get_or_uninit::<'a>()?.write().await) - } - - fn get_or_uninit<'a>() -> Result<&'a RwLock, DataError> { - SETTINGS - .get() - .ok_or_else(|| DataError::InitializedError("settings".to_string())) - } -} diff --git a/theseus/src/error.rs b/theseus/src/error.rs new file mode 100644 index 000000000..f97822f0b --- /dev/null +++ b/theseus/src/error.rs @@ -0,0 +1,103 @@ +//! Theseus error type +use tracing_error::InstrumentError; + +#[derive(thiserror::Error, Debug)] +pub enum ErrorKind { + #[error("Filesystem error: {0}")] + FSError(String), + + #[error("Serialization error (JSON): {0}")] + JSONError(#[from] serde_json::Error), + + #[error("Error parsing UUID: {0}")] + UUIDError(#[from] uuid::Error), + + #[error("Serialization error (Bincode): {0}")] + EncodeError(#[from] bincode::error::EncodeError), + + #[error("Deserialization error (Bincode): {0}")] + DecodeError(#[from] bincode::error::DecodeError), + + #[error("Error parsing URL: {0}")] + URLError(#[from] url::ParseError), + + #[error("Database error: {0}")] + DBError(#[from] sled::Error), + + #[error("Unable to read {0} from any source")] + NoValueFor(String), + + #[error("Metadata error: {0}")] + MetadataError(#[from] daedalus::Error), + + #[error("Minecraft authentication error: {0}")] + HydraError(String), + + #[error("I/O error: {0}")] + IOError(#[from] std::io::Error), + + #[error("Error launching Minecraft: {0}")] + LauncherError(String), + + #[error("Error fetching URL: {0}")] + FetchError(#[from] reqwest::Error), + + #[error("Websocket error: {0}")] + WSError(#[from] async_tungstenite::tungstenite::Error), + + #[error("Websocket closed before {0} could be received!")] + WSClosedError(String), + + #[error("Incorrect Sha1 hash for download: {0} != {1}")] + HashError(String, String), + + #[error("Paths stored in the database need to be valid UTF-8: {0}")] + UTFError(std::path::PathBuf), + + #[error("Invalid input: {0}")] + InputError(String), + + #[error( + "Tried to access unloaded profile {0}, loading it probably failed" + )] + UnloadedProfileError(String), + + #[error("Profile {0} is not managed by Theseus!")] + UnmanagedProfileError(String), + + #[error("Error: {0}")] + OtherError(String), +} + +#[derive(Debug)] +pub struct Error { + source: tracing_error::TracedError, +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.source.source() + } +} + +impl std::fmt::Display for Error { + fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(fmt, "{}", self.source) + } +} + +impl> From for Error { + fn from(source: E) -> Self { + Self { + source: Into::::into(source).in_current_span(), + } + } +} + +impl ErrorKind { + pub fn as_error(self) -> Error { + self.into() + } +} + +pub type Result = core::result::Result; diff --git a/theseus/src/launcher/args.rs b/theseus/src/launcher/args.rs index 1a444d540..20d9becaf 100644 --- a/theseus/src/launcher/args.rs +++ b/theseus/src/launcher/args.rs @@ -1,32 +1,29 @@ -use crate::data::profiles::*; -use crate::launcher::auth::provider::Credentials; -use crate::launcher::rules::parse_rules; -use crate::launcher::LauncherError; -use daedalus::get_path_from_artifact; -use daedalus::minecraft::{Argument, ArgumentValue, Library, Os, VersionType}; -use daedalus::modded::SidedDataEntry; -use std::collections::HashMap; +//! Minecraft CLI argument logic +// TODO: Rafactor this section +use super::{auth::Credentials, parse_rule}; +use crate::{ + state::{MemorySettings, WindowSize}, + util::platform::classpath_separator, +}; +use daedalus::{ + get_path_from_artifact, + minecraft::{Argument, ArgumentValue, Library, VersionType}, + modded::SidedDataEntry, +}; use std::io::{BufRead, BufReader}; -use std::path::Path; +use std::{collections::HashMap, path::Path}; use uuid::Uuid; -fn get_cp_separator() -> &'static str { - match super::download::get_os() { - Os::Osx | Os::Linux | Os::Unknown => ":", - Os::Windows => ";", - } -} - pub fn get_class_paths( libraries_path: &Path, libraries: &[Library], client_path: &Path, -) -> Result { - let mut class_paths = libraries +) -> crate::Result { + let mut cps = libraries .iter() .filter_map(|library| { if let Some(rules) = &library.rules { - if !super::rules::parse_rules(rules.as_slice()) { + if !rules.iter().all(parse_rule) { return None; } } @@ -39,56 +36,50 @@ pub fn get_class_paths( }) .collect::, _>>()?; - class_paths.push( - crate::util::absolute_path(&client_path) + cps.push( + client_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified class path {} does not exist", client_path.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_string(), ); - Ok(class_paths.join(get_cp_separator())) + Ok(cps.join(classpath_separator())) } pub fn get_class_paths_jar>( libraries_path: &Path, libraries: &[T], -) -> Result { - let class_paths = libraries +) -> crate::Result { + let cps = libraries .iter() .map(|library| get_lib_path(libraries_path, library.as_ref())) .collect::, _>>()?; - Ok(class_paths.join(get_cp_separator())) + Ok(cps.join(classpath_separator())) } -pub fn get_lib_path(libraries_path: &Path, lib: &str) -> Result { +pub fn get_lib_path(libraries_path: &Path, lib: &str) -> crate::Result { let mut path = libraries_path.to_path_buf(); path.push(get_path_from_artifact(lib.as_ref())?); - let path = crate::util::absolute_path(&path).map_err(|_| { - LauncherError::InvalidInput(format!( + let path = &path.canonicalize().map_err(|_| { + crate::ErrorKind::LauncherError(format!( "Library file at path {} does not exist", path.to_string_lossy() )) + .as_error() })?; - /*if !path.exists() { - if let Some(parent) = &path.parent() { - std::fs::create_dir_all(parent)?; - } - - std::fs::File::create(&path)?; - }*/ - Ok(path.to_string_lossy().to_string()) } - pub fn get_jvm_arguments( arguments: Option<&[Argument]>, natives_path: &Path, @@ -97,7 +88,7 @@ pub fn get_jvm_arguments( version_name: &str, memory: MemorySettings, custom_args: Vec, -) -> Result, LauncherError> { +) -> crate::Result> { let mut parsed_arguments = Vec::new(); if let Some(args) = arguments { @@ -113,11 +104,13 @@ pub fn get_jvm_arguments( } else { parsed_arguments.push(format!( "-Djava.library.path={}", - &crate::util::absolute_path(natives_path) - .map_err(|_| LauncherError::InvalidInput(format!( + &natives_path + .canonicalize() + .map_err(|_| crate::ErrorKind::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() - )))? + )) + .as_error())? .to_string_lossy() .to_string() )); @@ -144,33 +137,37 @@ fn parse_jvm_argument( libraries_path: &Path, class_paths: &str, version_name: &str, -) -> Result { +) -> crate::Result { argument.retain(|c| !c.is_whitespace()); Ok(argument .replace( "${natives_directory}", - &crate::util::absolute_path(natives_path) + &natives_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified natives path {} does not exist", natives_path.to_string_lossy() )) + .as_error() })? .to_string_lossy(), ) .replace( "${library_directory}", - &crate::util::absolute_path(libraries_path) + &libraries_path + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified libraries path {} does not exist", libraries_path.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_string(), ) - .replace("${classpath_separator}", get_cp_separator()) + .replace("${classpath_separator}", classpath_separator()) .replace("${launcher_name}", "theseus") .replace("${launcher_version}", env!("CARGO_PKG_VERSION")) .replace("${version_name}", version_name) @@ -188,7 +185,7 @@ pub fn get_minecraft_arguments( assets_directory: &Path, version_type: &VersionType, resolution: WindowSize, -) -> Result, LauncherError> { +) -> crate::Result> { if let Some(arguments) = arguments { let mut parsed_arguments = Vec::new(); @@ -242,48 +239,54 @@ fn parse_minecraft_argument( assets_directory: &Path, version_type: &VersionType, resolution: WindowSize, -) -> Result { +) -> crate::Result { Ok(argument .replace("${auth_access_token}", access_token) .replace("${auth_session}", access_token) .replace("${auth_player_name}", username) - .replace("${auth_uuid}", &uuid.to_hyphenated().to_string()) + .replace("${auth_uuid}", &uuid.hyphenated().to_string()) .replace("${user_properties}", "{}") .replace("${user_type}", "mojang") .replace("${version_name}", version) .replace("${assets_index_name}", asset_index_name) .replace( "${game_directory}", - &crate::util::absolute_path(game_directory) + &game_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified game directory {} does not exist", game_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), ) .replace( "${assets_root}", - &crate::util::absolute_path(assets_directory) + &assets_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), ) .replace( "${game_assets}", - &crate::util::absolute_path(assets_directory) + &assets_directory + .canonicalize() .map_err(|_| { - LauncherError::InvalidInput(format!( + crate::ErrorKind::LauncherError(format!( "Specified assets directory {} does not exist", assets_directory.to_string_lossy() )) + .as_error() })? .to_string_lossy() .to_owned(), @@ -297,9 +300,9 @@ fn parse_arguments( arguments: &[Argument], parsed_arguments: &mut Vec, parse_function: F, -) -> Result<(), LauncherError> +) -> crate::Result<()> where - F: Fn(&str) -> Result, + F: Fn(&str) -> crate::Result, { for argument in arguments { match argument { @@ -311,7 +314,7 @@ where } } Argument::Ruled { rules, value } => { - if parse_rules(rules.as_slice()) { + if rules.iter().all(parse_rule) { match value { ArgumentValue::Single(arg) => { parsed_arguments.push(parse_function(arg)?); @@ -334,7 +337,7 @@ pub fn get_processor_arguments>( libraries_path: &Path, arguments: &[T], data: &HashMap, -) -> Result, LauncherError> { +) -> crate::Result> { let mut new_arguments = Vec::new(); for argument in arguments { @@ -342,7 +345,10 @@ pub fn get_processor_arguments>( if argument.as_ref().starts_with('{') { if let Some(entry) = data.get(trimmed_arg) { new_arguments.push(if entry.client.starts_with('[') { - get_lib_path(libraries_path, &entry.client[1..entry.client.len() - 1])? + get_lib_path( + libraries_path, + &entry.client[1..entry.client.len() - 1], + )? } else { entry.client.clone() }) @@ -357,15 +363,25 @@ pub fn get_processor_arguments>( Ok(new_arguments) } -pub async fn get_processor_main_class(path: String) -> Result, LauncherError> { +pub async fn get_processor_main_class( + path: String, +) -> crate::Result> { Ok(tokio::task::spawn_blocking(move || { let zipfile = std::fs::File::open(&path)?; let mut archive = zip::ZipArchive::new(zipfile).map_err(|_| { - LauncherError::ProcessorError(format!("Cannot read processor at {}", path)) + crate::ErrorKind::LauncherError(format!( + "Cannot read processor at {}", + path + )) + .as_error() })?; let file = archive.by_name("META-INF/MANIFEST.MF").map_err(|_| { - LauncherError::ProcessorError(format!("Cannot read processor manifest at {}", path)) + crate::ErrorKind::LauncherError(format!( + "Cannot read processor manifest at {}", + path + )) + .as_error() })?; let reader = BufReader::new(file); @@ -381,7 +397,8 @@ pub async fn get_processor_main_class(path: String) -> Result, La } } - Ok::, LauncherError>(None) + Ok::, crate::Error>(None) }) - .await??) + .await + .unwrap()?) } diff --git a/theseus/src/launcher/auth.rs b/theseus/src/launcher/auth.rs index 909eb5d27..b12d1d428 100644 --- a/theseus/src/launcher/auth.rs +++ b/theseus/src/launcher/auth.rs @@ -1,205 +1,168 @@ -pub mod api { - use serde::{Deserialize, Serialize}; - use uuid::Uuid; +//! Authentication flow based on Hydra +use async_tungstenite as ws; +use bincode::{Decode, Encode}; +use chrono::{prelude::*, Duration}; +use futures::prelude::*; +use once_cell::sync::*; +use serde::Deserialize; +use url::Url; - #[derive(Debug, Serialize, Deserialize)] - pub struct GameProfile { - pub id: Uuid, - pub name: String, - } +pub const HYDRA_URL: Lazy = + Lazy::new(|| Url::parse("https://hydra.modrinth.com").unwrap()); - #[derive(Debug, Deserialize)] - pub struct UserProperty { - pub name: String, - pub value: String, - } - - #[derive(Debug, Deserialize)] - pub struct User { - pub id: String, - pub username: String, - pub properties: Option>, - } - - #[derive(Debug, Deserialize)] - #[serde(rename_all = "camelCase")] - pub struct AuthenticateResponse { - pub user: Option, - pub client_token: Uuid, - pub access_token: String, - pub available_profiles: Vec, - pub selected_profile: Option, - } - - pub async fn login( - username: &str, - password: &str, - request_user: bool, - ) -> Result { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/authenticate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "agent": { - "name": "Minecraft", - "version": 1 - }, - "username": username, - "password": password, - "clientToken": Uuid::new_v4(), - "requestUser": request_user - } - ) - .to_string(), - ) - .send() - .await? - .json() - .await - } - - pub async fn sign_out(username: &str, password: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/signout") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "username": username, - "password": password - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - pub async fn validate(access_token: &str, client_token: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/validate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - pub async fn invalidate(access_token: &str, client_token: &str) -> Result<(), reqwest::Error> { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/invalidate") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token - } - ) - .to_string(), - ) - .send() - .await?; - - Ok(()) - } - - #[derive(Debug, Deserialize)] - #[serde(rename_all = "camelCase")] - pub struct RefreshResponse { - pub user: Option, - pub client_token: Uuid, - pub access_token: String, - pub selected_profile: Option, - } - - pub async fn refresh( - access_token: &str, - client_token: &str, - selected_profile: &GameProfile, - request_user: bool, - ) -> Result { - let client = reqwest::Client::new(); - - client - .post("https://authserver.mojang.com/refresh") - .header(reqwest::header::CONTENT_TYPE, "application/json") - .body( - serde_json::json!( - { - "accessToken": access_token, - "clientToken": client_token, - "selectedProfile": { - "id": selected_profile.id, - "name": selected_profile.name, - }, - "requestUser": request_user, - } - ) - .to_string(), - ) - .send() - .await? - .json() - .await - } +// Socket messages +#[derive(Deserialize)] +struct ErrorJSON { + error: String, } -pub mod provider { - use crate::launcher::auth::api::login; - use crate::launcher::LauncherError; - use uuid::Uuid; - - #[derive(Debug)] - /// The credentials of a user - pub struct Credentials { - /// The user UUID the credentials belong to - pub id: Uuid, - /// The username of the user - pub username: String, - /// The access token associated with the credentials - pub access_token: String, - } - - impl Credentials { - /// Gets a credentials instance from a user's login - pub async fn from_login(username: &str, password: &str) -> Result { - let login = - login(username, password, true) - .await - .map_err(|err| LauncherError::FetchError { - inner: err, - item: "authentication credentials".to_string(), - })?; - - let profile = login.selected_profile.unwrap(); - - Ok(Credentials { - id: profile.id, - username: profile.name, - access_token: login.access_token, - }) +impl ErrorJSON { + pub fn unwrap<'a, T: Deserialize<'a>>(data: &'a [u8]) -> crate::Result { + if let Ok(err) = serde_json::from_slice::(data) { + Err(crate::ErrorKind::HydraError(err.error).as_error()) + } else { + Ok(serde_json::from_slice::(data)?) } } } + +#[derive(Deserialize)] +struct LoginCodeJSON { + login_code: String, +} + +#[derive(Deserialize)] +struct TokenJSON { + token: String, + refresh_token: String, + expires_after: u32, +} + +#[derive(Deserialize)] +struct ProfileInfoJSON { + id: uuid::Uuid, + name: String, +} + +// Login information +#[derive(Encode, Decode)] +pub struct Credentials { + #[bincode(with_serde)] + pub id: uuid::Uuid, + pub username: String, + pub access_token: String, + pub refresh_token: String, + #[bincode(with_serde)] + pub expires: DateTime, + _ctor_scope: std::marker::PhantomData<()>, +} + +// Implementation +pub struct HydraAuthFlow { + socket: ws::WebSocketStream, +} + +impl HydraAuthFlow { + pub async fn new() -> crate::Result { + let sock_url = wrap_ref_builder!( + it = HYDRA_URL => + { it.set_scheme("wss").ok() } + ); + let (socket, _) = ws::tokio::connect_async(sock_url.clone()).await?; + Ok(Self { socket }) + } + + pub async fn prepare_login_url(&mut self) -> crate::Result { + let code_resp = self + .socket + .try_next() + .await? + .ok_or( + crate::ErrorKind::WSClosedError(String::from( + "login socket ID", + )) + .as_error(), + )? + .into_data(); + let code = ErrorJSON::unwrap::(&code_resp)?; + Ok(wrap_ref_builder!( + it = HYDRA_URL.join("login")? => + { it.query_pairs_mut().append_pair("id", &code.login_code); } + )) + } + + pub async fn extract_credentials(&mut self) -> crate::Result { + // Minecraft bearer token + let token_resp = self + .socket + .try_next() + .await? + .ok_or( + crate::ErrorKind::WSClosedError(String::from( + "login socket ID", + )) + .as_error(), + )? + .into_data(); + let token = ErrorJSON::unwrap::(&token_resp)?; + let expires = + Utc::now() + Duration::seconds(token.expires_after.into()); + + // Get account credentials + let info = fetch_info(&token.token).await?; + + // Return structure from response + Ok(Credentials { + username: info.name, + id: info.id, + refresh_token: token.refresh_token, + access_token: token.token, + expires, + _ctor_scope: std::marker::PhantomData, + }) + } +} + +pub async fn refresh_credentials( + credentials: &mut Credentials, +) -> crate::Result<()> { + let resp = crate::config::REQWEST_CLIENT + .post(HYDRA_URL.join("/refresh")?) + .json( + &serde_json::json!({ "refresh_token": credentials.refresh_token }), + ) + .send() + .await? + .error_for_status()? + .json::() + .await?; + + credentials.access_token = resp.token; + credentials.refresh_token = resp.refresh_token; + credentials.expires = + Utc::now() + Duration::seconds(resp.expires_after.into()); + + Ok(()) +} + +pub async fn refresh_username( + credentials: &mut Credentials, +) -> crate::Result<()> { + let info = fetch_info(&credentials.access_token).await?; + credentials.username = info.name; + Ok(()) +} + +// Helpers +async fn fetch_info(token: &str) -> crate::Result { + let url = + Url::parse("https://api.minecraftservices.com/minecraft/profile")?; + Ok(crate::config::REQWEST_CLIENT + .get(url) + .header(reqwest::header::AUTHORIZATION, format!("Bearer {token}")) + .send() + .await? + .error_for_status()? + .json::() + .await?) +} diff --git a/theseus/src/launcher/download.rs b/theseus/src/launcher/download.rs index 0e0794e3c..af9a8d2e5 100644 --- a/theseus/src/launcher/download.rs +++ b/theseus/src/launcher/download.rs @@ -1,362 +1,286 @@ +//! Downloader for Minecraft data + use crate::{ - data::{DataError, Settings}, - launcher::LauncherError, + state::State, + util::{fetch::*, platform::OsExt}, }; -use daedalus::get_path_from_artifact; -use daedalus::minecraft::{ - fetch_assets_index, fetch_version_info, Asset, AssetsIndex, DownloadType, - Library, Os, Version, VersionInfo, -}; -use daedalus::modded::{ - fetch_partial_version, merge_partial_version, LoaderVersion, -}; -use futures::future; -use std::path::Path; -use std::time::Duration; -use tokio::{ - fs::File, - io::AsyncWriteExt, - sync::{OnceCell, Semaphore}, +use daedalus::{ + self as d, + minecraft::{ + Asset, AssetsIndex, Library, Os, Version as GameVersion, + VersionInfo as GameVersionInfo, + }, + modded::LoaderVersion, }; +use futures::prelude::*; +use tokio::{fs, sync::OnceCell}; -static DOWNLOADS_SEMAPHORE: OnceCell = OnceCell::const_new(); +#[tracing::instrument(skip_all)] +pub async fn download_minecraft( + st: &State, + version: &GameVersionInfo, +) -> crate::Result<()> { + log::info!("Downloading Minecraft version {}", version.id); + let assets_index = download_assets_index(st, version).await?; -pub async fn init() -> Result<(), DataError> { - DOWNLOADS_SEMAPHORE - .get_or_try_init(|| async { - let settings = Settings::get().await?; - Ok::<_, DataError>(Semaphore::new( - settings.max_concurrent_downloads, - )) - }) - .await?; + tokio::try_join! { + download_client(st, version), + download_assets(st, version.assets == "legacy", &assets_index), + download_libraries(st, version.libraries.as_slice(), &version.id) + }?; + log::info!("Done downloading Minecraft!"); Ok(()) } +#[tracing::instrument(skip_all, fields(version = version.id.as_str(), loader = ?loader))] pub async fn download_version_info( - client_path: &Path, - version: &Version, - loader_version: Option<&LoaderVersion>, -) -> Result { - let id = match loader_version { - Some(x) => &x.id, - None => &version.id, - }; + st: &State, + version: &GameVersion, + loader: Option<&LoaderVersion>, +) -> crate::Result { + let version_id = loader.map_or(&version.id, |it| &it.id); + log::debug!("Loading version info for Minecraft {version_id}"); + let path = st + .directories + .version_dir(version_id) + .join(format!("{version_id}.json")); - let mut path = client_path.join(id); - path.push(&format!("{id}.json")); - - if path.exists() { - let contents = std::fs::read_to_string(path)?; - Ok(serde_json::from_str(&contents)?) + let res = if path.exists() { + fs::read(path) + .err_into::() + .await + .and_then(|ref it| Ok(serde_json::from_slice(it)?)) } else { - let mut info = fetch_version_info(version).await?; + log::info!("Downloading version info for version {}", &version.id); + let mut info = d::minecraft::fetch_version_info(version).await?; - if let Some(loader_version) = loader_version { - let partial = fetch_partial_version(&loader_version.url).await?; - info = merge_partial_version(partial, info); - info.id = loader_version.id.clone(); + if let Some(loader) = loader { + let partial = d::modded::fetch_partial_version(&loader.url).await?; + info = d::modded::merge_partial_version(partial, info); + info.id = loader.id.clone(); } - let info_s = serde_json::to_string(&info)?; - save_file(&path, &bytes::Bytes::from(info_s)).await?; + let permit = st.io_semaphore.acquire().await.unwrap(); + write(&path, &serde_json::to_vec(&info)?, &permit).await?; Ok(info) - } + }?; + + log::debug!("Loaded version info for Minecraft {version_id}"); + Ok(res) } +#[tracing::instrument(skip_all)] pub async fn download_client( - client_path: &Path, - version_info: &VersionInfo, -) -> Result<(), LauncherError> { - let version = &version_info.id; + st: &State, + version_info: &GameVersionInfo, +) -> crate::Result<()> { + let ref version = version_info.id; + log::debug!("Locating client for version {version}"); let client_download = version_info .downloads - .get(&DownloadType::Client) - .ok_or_else(|| { - LauncherError::InvalidInput(format!( - "Version {version} does not have any client downloads" + .get(&d::minecraft::DownloadType::Client) + .ok_or( + crate::ErrorKind::LauncherError(format!( + "No client downloads exist for version {version}" )) - })?; + .as_error(), + )?; + let path = st + .directories + .version_dir(version) + .join(format!("{version}.jar")); - let mut path = client_path.join(version); - path.push(&format!("{version}.jar")); - - save_and_download_file( - &path, - &client_download.url, - Some(&client_download.sha1), - ) - .await?; - Ok(()) -} - -pub async fn download_assets_index( - assets_path: &Path, - version: &VersionInfo, -) -> Result { - let path = - assets_path.join(format!("indexes/{}.json", &version.asset_index.id)); - - if path.exists() { - let content = std::fs::read_to_string(path)?; - Ok(serde_json::from_str(&content)?) - } else { - let index = fetch_assets_index(version).await?; - - save_file(&path, &bytes::Bytes::from(serde_json::to_string(&index)?)) - .await?; - - Ok(index) - } -} - -pub async fn download_assets( - assets_path: &Path, - legacy_path: Option<&Path>, - index: &AssetsIndex, -) -> Result<(), LauncherError> { - future::join_all(index.objects.iter().map(|(name, asset)| { - download_asset(assets_path, legacy_path, name, asset) - })) - .await - .into_iter() - .collect::, LauncherError>>()?; - - Ok(()) -} - -async fn download_asset( - assets_path: &Path, - legacy_path: Option<&Path>, - name: &str, - asset: &Asset, -) -> Result<(), LauncherError> { - let hash = &asset.hash; - let sub_hash = &hash[..2]; - - let mut resource_path = assets_path.join("objects"); - resource_path.push(sub_hash); - resource_path.push(hash); - - let url = - format!("https://resources.download.minecraft.net/{sub_hash}/{hash}"); - - let resource = - save_and_download_file(&resource_path, &url, Some(hash)).await?; - - if let Some(legacy_path) = legacy_path { - let resource_path = legacy_path - .join(name.replace('/', &std::path::MAIN_SEPARATOR.to_string())); - save_file(resource_path.as_path(), &resource).await?; - } - - Ok(()) -} - -pub async fn download_libraries( - libraries_path: &Path, - natives_path: &Path, - libraries: &[Library], -) -> Result<(), LauncherError> { - future::join_all(libraries.iter().map(|library| { - download_library(libraries_path, natives_path, library) - })) - .await - .into_iter() - .collect::, LauncherError>>()?; - - Ok(()) -} - -async fn download_library( - libraries_path: &Path, - natives_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - if let Some(rules) = &library.rules { - if !super::rules::parse_rules(rules) { - return Ok(()); - } - } - - future::try_join( - download_library_jar(libraries_path, library), - download_native(natives_path, library), - ) - .await?; - - Ok(()) -} - -async fn download_library_jar( - libraries_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - let artifact_path = get_path_from_artifact(&library.name)?; - let path = libraries_path.join(&artifact_path); - - if let Some(downloads) = &library.downloads { - if let Some(library) = &downloads.artifact { - save_and_download_file(&path, &library.url, Some(&library.sha1)) + if !path.exists() { + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = + fetch(&client_download.url, Some(&client_download.sha1), &permit) .await?; - } + write(&path, &bytes, &permit).await?; + log::info!("Fetched client version {version}"); + } + + log::debug!("Client loaded for version {version}!"); + Ok(()) +} + +#[tracing::instrument(skip_all)] +pub async fn download_assets_index( + st: &State, + version: &GameVersionInfo, +) -> crate::Result { + log::debug!("Loading assets index"); + let path = st + .directories + .assets_index_dir() + .join(format!("{}.json", &version.asset_index.id)); + + let res = if path.exists() { + fs::read(path) + .err_into::() + .await + .and_then(|ref it| Ok(serde_json::from_slice(it)?)) } else { - let url = format!( - "{}{artifact_path}", - library - .url - .as_deref() - .unwrap_or("https://libraries.minecraft.net/"), - ); - save_and_download_file(&path, &url, None).await?; - } + let index = d::minecraft::fetch_assets_index(version).await?; + let permit = st.io_semaphore.acquire().await.unwrap(); + write(&path, &serde_json::to_vec(&index)?, &permit).await?; + log::info!("Fetched assets index"); + Ok(index) + }?; + log::debug!("Assets index successfully loaded!"); + Ok(res) +} + +#[tracing::instrument(skip(st, index))] +pub async fn download_assets( + st: &State, + with_legacy: bool, + index: &AssetsIndex, +) -> crate::Result<()> { + log::debug!("Loading assets"); + + stream::iter(index.objects.iter()) + .map(Ok::<(&String, &Asset), crate::Error>) + .try_for_each_concurrent(None, |(name, asset)| async move { + let ref hash = asset.hash; + let resource_path = st.directories.object_dir(hash); + let url = format!( + "https://resources.download.minecraft.net/{sub_hash}/{hash}", + sub_hash = &hash[..2] + ); + + let fetch_cell = OnceCell::::new(); + tokio::try_join! { + async { + if !resource_path.exists() { + let permit = st.io_semaphore.acquire().await.unwrap(); + let resource = fetch_cell + .get_or_try_init(|| fetch(&url, Some(hash), &permit)) + .await?; + write(&resource_path, &resource, &permit).await?; + log::info!("Fetched asset with hash {hash}"); + } + Ok::<_, crate::Error>(()) + }, + async { + if with_legacy { + let permit = st.io_semaphore.acquire().await.unwrap(); + let resource = fetch_cell + .get_or_try_init(|| fetch(&url, Some(hash), &permit)) + .await?; + let resource_path = st.directories.legacy_assets_dir().join( + name.replace('/', &String::from(std::path::MAIN_SEPARATOR)) + ); + write(&resource_path, &resource, &permit).await?; + log::info!("Fetched legacy asset with hash {hash}"); + } + Ok::<_, crate::Error>(()) + }, + }?; + + log::debug!("Loaded asset with hash {hash}"); + Ok(()) + }).await?; + + log::debug!("Done loading assets!"); Ok(()) } -async fn download_native( - natives_path: &Path, - library: &Library, -) -> Result<(), LauncherError> { - use daedalus::minecraft::LibraryDownload; - use std::collections::HashMap; +#[tracing::instrument(skip(st, libraries))] +pub async fn download_libraries( + st: &State, + libraries: &[Library], + version: &str, +) -> crate::Result<()> { + log::debug!("Loading libraries"); - // Try blocks in stable Rust when? - let optional_cascade = - || -> Option<(&String, &HashMap)> { - let os_key = library.natives.as_ref()?.get(&get_os())?; - let classifiers = - library.downloads.as_ref()?.classifiers.as_ref()?; - Some((os_key, classifiers)) - }; + tokio::try_join! { + fs::create_dir_all(st.directories.libraries_dir()), + fs::create_dir_all(st.directories.version_natives_dir(version)) + }?; - if let Some((os_key, classifiers)) = optional_cascade() { - #[cfg(target_pointer_width = "64")] - let parsed_key = os_key.replace("${arch}", "64"); - #[cfg(target_pointer_width = "32")] - let parsed_key = os_key.replace("${arch}", "32"); + stream::iter(libraries.iter()) + .map(Ok::<&Library, crate::Error>) + .try_for_each_concurrent(None, |library| async move { + if let Some(rules) = &library.rules { + if !rules.iter().all(super::parse_rule) { + return Ok(()); + } + } + tokio::try_join! { + async { + let artifact_path = d::get_path_from_artifact(&library.name)?; + let path = st.directories.libraries_dir().join(&artifact_path); - if let Some(native) = classifiers.get(&parsed_key) { - let file = download_file(&native.url, Some(&native.sha1)).await?; + match library.downloads { + _ if path.exists() => Ok(()), + Some(d::minecraft::LibraryDownloads { + artifact: Some(ref artifact), + .. + }) => { + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = fetch(&artifact.url, Some(&artifact.sha1), &permit) + .await?; + write(&path, &bytes, &permit).await?; + log::info!("Fetched library {}", &library.name); + Ok::<_, crate::Error>(()) + } + None => { + let url = [ + library + .url + .as_deref() + .unwrap_or("https://libraries.minecraft.net"), + &artifact_path + ].concat(); - let reader = std::io::Cursor::new(&file); + let permit = st.io_semaphore.acquire().await.unwrap(); + let bytes = fetch(&url, None, &permit).await?; + write(&path, &bytes, &permit).await?; + log::info!("Fetched library {}", &library.name); + Ok::<_, crate::Error>(()) + } + _ => Ok(()) + } + }, + async { + // HACK: pseudo try block using or else + if let Some((os_key, classifiers)) = None.or_else(|| Some(( + library + .natives + .as_ref()? + .get(&Os::native())?, + library + .downloads + .as_ref()? + .classifiers + .as_ref()? + ))) { + let parsed_key = os_key.replace( + "${arch}", + crate::util::platform::ARCH_WIDTH, + ); - let mut archive = zip::ZipArchive::new(reader).unwrap(); - archive.extract(natives_path).unwrap(); - } - } - Ok(()) -} - -async fn save_and_download_file( - path: &Path, - url: &str, - sha1: Option<&str>, -) -> Result { - match std::fs::read(path) { - Ok(bytes) => Ok(bytes::Bytes::from(bytes)), - Err(_) => { - let file = download_file(url, sha1).await?; - save_file(path, &file).await?; - Ok(file) - } - } -} - -async fn save_file(path: &Path, bytes: &bytes::Bytes) -> std::io::Result<()> { - let _save_permit = DOWNLOADS_SEMAPHORE - .get() - .expect("File operation semaphore not initialized!") - .acquire() - .await - .unwrap(); - if let Some(parent) = path.parent() { - tokio::fs::create_dir_all(parent).await?; - } - - let mut file = File::create(path).await?; - file.write_all(bytes).await?; - Ok(()) -} - -pub fn get_os() -> Os { - match std::env::consts::OS { - "windows" => Os::Windows, - "macos" => Os::Osx, - "linux" => Os::Linux, - _ => Os::Unknown, - } -} - -pub async fn download_file( - url: &str, - sha1: Option<&str>, -) -> Result { - let _download_permit = DOWNLOADS_SEMAPHORE - .get() - .expect("File operation semaphore not initialized!") - .acquire() - .await - .unwrap(); - - let client = reqwest::Client::builder() - .tcp_keepalive(Some(Duration::from_secs(10))) - .build() - .map_err(|err| LauncherError::FetchError { - inner: err, - item: url.to_string(), - })?; - - for attempt in 1..=4 { - let result = client.get(url).send().await; - - match result { - Ok(x) => { - let bytes = x.bytes().await; - - if let Ok(bytes) = bytes { - if let Some(sha1) = sha1 { - if &get_hash(bytes.clone()).await? != sha1 { - if attempt <= 3 { - continue; - } else { - return Err(LauncherError::ChecksumFailure { - hash: sha1.to_string(), - url: url.to_string(), - tries: attempt, - }); - } + if let Some(native) = classifiers.get(&parsed_key) { + let permit = st.io_semaphore.acquire().await.unwrap(); + let data = fetch(&native.url, Some(&native.sha1), &permit).await?; + let reader = std::io::Cursor::new(&data); + let mut archive = zip::ZipArchive::new(reader).unwrap(); + archive.extract(&st.directories.version_natives_dir(version)).unwrap(); + log::info!("Fetched native {}", &library.name); } } - return Ok(bytes); - } else if attempt <= 3 { - continue; - } else if let Err(err) = bytes { - return Err(LauncherError::FetchError { - inner: err, - item: url.to_string(), - }); + Ok(()) } - } - Err(_) if attempt <= 3 => continue, - Err(err) => { - return Err(LauncherError::FetchError { - inner: err, - item: url.to_string(), - }) - } + }?; + + log::debug!("Loaded library {}", library.name); + Ok(()) } - } - unreachable!() -} + ).await?; -/// Computes a checksum of the input bytes -async fn get_hash(bytes: bytes::Bytes) -> Result { - let hash = - tokio::task::spawn_blocking(|| sha1::Sha1::from(bytes).hexdigest()) - .await?; - - Ok(hash) + log::debug!("Done loading libraries!"); + Ok(()) } diff --git a/theseus/src/launcher/mod.rs b/theseus/src/launcher/mod.rs index 2d54c5339..21ede9cfb 100644 --- a/theseus/src/launcher/mod.rs +++ b/theseus/src/launcher/mod.rs @@ -1,328 +1,214 @@ -use daedalus::minecraft::{ArgumentType, VersionInfo}; -use daedalus::modded::LoaderVersion; -use serde::{Deserialize, Serialize}; +//! Logic for launching Minecraft +use crate::state as st; +use daedalus as d; use std::{path::Path, process::Stdio}; -use thiserror::Error; use tokio::process::{Child, Command}; -pub use crate::launcher::auth::provider::Credentials; - mod args; + pub mod auth; + mod download; -mod rules; -pub(crate) use download::init as init_download_semaphore; +#[tracing::instrument] +pub fn parse_rule(rule: &d::minecraft::Rule) -> bool { + use d::minecraft::{Rule, RuleAction}; -#[derive(Error, Debug)] -pub enum LauncherError { - #[error("Failed to validate file checksum at url {url} with hash {hash} after {tries} tries")] - ChecksumFailure { - hash: String, - url: String, - tries: u32, - }, + let res = match rule { + Rule { + os: Some(ref os), .. + } => crate::util::platform::os_rule(os), + Rule { + features: Some(ref features), + .. + } => features.has_demo_resolution.unwrap_or(false), + _ => true, + }; - #[error("Failed to run processor: {0}")] - ProcessorError(String), - - #[error("Invalid input: {0}")] - InvalidInput(String), - - #[error("Error while managing asynchronous tasks")] - TaskError(#[from] tokio::task::JoinError), - - #[error("Error while reading/writing to the disk: {0}")] - IoError(#[from] std::io::Error), - - #[error("Error while spawning child process {process}")] - ProcessError { - inner: std::io::Error, - process: String, - }, - - #[error("Error while deserializing JSON")] - SerdeError(#[from] serde_json::Error), - - #[error("Unable to fetch {item}")] - FetchError { inner: reqwest::Error, item: String }, - - #[error("{0}")] - ParseError(String), - - #[error("Error while fetching metadata: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Error while reading metadata: {0}")] - MetaError(#[from] crate::data::DataError), - - #[error("Java error: {0}")] - JavaError(String), - - #[error("Command exited with non-zero exit code: {0}")] - ExitError(i32), -} - -// TODO: this probably should be in crate::data -#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)] -#[serde(rename_all = "lowercase")] -pub enum ModLoader { - Vanilla, - Forge, - Fabric, -} - -impl Default for ModLoader { - fn default() -> Self { - ModLoader::Vanilla + match rule.action { + RuleAction::Allow => res, + RuleAction::Disallow => !res, } } -impl std::fmt::Display for ModLoader { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let repr = match self { - &Self::Vanilla => "Vanilla", - &Self::Forge => "Forge", - &Self::Fabric => "Fabric", - }; - - f.write_str(repr) +macro_rules! processor_rules { + ($dest:expr; $($name:literal : client => $client:expr, server => $server:expr;)+) => { + $(std::collections::HashMap::insert( + $dest, + String::from($name), + daedalus::modded::SidedDataEntry { + client: String::from($client), + server: String::from($server), + }, + );)+ } } +#[tracing::instrument(skip_all, fields(path = ?instance_path))] pub async fn launch_minecraft( game_version: &str, - loader_version: &Option, - root_dir: &Path, - java: &Path, - java_args: &Vec, + loader_version: &Option, + instance_path: &Path, + java_install: &Path, + java_args: &[String], wrapper: &Option, - memory: &crate::data::profiles::MemorySettings, - resolution: &crate::data::profiles::WindowSize, - credentials: &Credentials, -) -> Result { - let (metadata, settings) = futures::try_join! { - crate::data::Metadata::get(), - crate::data::Settings::get(), - }?; - let root_dir = root_dir.canonicalize()?; - let metadata_dir = &settings.metadata_dir; + memory: &st::MemorySettings, + resolution: &st::WindowSize, + credentials: &auth::Credentials, +) -> crate::Result { + let state = st::State::get().await?; + let instance_path = instance_path.canonicalize()?; - let ( - versions_path, - libraries_path, - assets_path, - legacy_assets_path, - natives_path, - ) = ( - metadata_dir.join("versions"), - metadata_dir.join("libraries"), - metadata_dir.join("assets"), - metadata_dir.join("resources"), - metadata_dir.join("natives"), - ); - - let version = metadata + let version = state + .metadata .minecraft .versions .iter() .find(|it| it.id == game_version) - .ok_or_else(|| { - LauncherError::InvalidInput(format!( - "Invalid game version: {game_version}", - )) - })?; + .ok_or(crate::ErrorKind::LauncherError(format!( + "Invalid game version: {game_version}" + )))?; let version_jar = loader_version .as_ref() .map_or(version.id.clone(), |it| it.id.clone()); - let mut version = download::download_version_info( - &versions_path, - version, + let mut version_info = download::download_version_info( + &state, + &version, loader_version.as_ref(), ) .await?; - let client_path = versions_path - .join(&version.id) - .join(format!("{}.jar", &version_jar)); - let version_natives_path = natives_path.join(&version.id); + let client_path = state + .directories + .version_dir(&version.id) + .join(format!("{version_jar}.jar")); - download_minecraft( - &version, - &versions_path, - &assets_path, - &legacy_assets_path, - &libraries_path, - &version_natives_path, - ) - .await?; + download::download_minecraft(&state, &version_info).await?; + st::State::sync().await?; - if let Some(processors) = &version.processors { - if let Some(ref mut data) = version.data { - data.insert( - "SIDE".to_string(), - daedalus::modded::SidedDataEntry { - client: "client".to_string(), - server: "".to_string(), - }, - ); - data.insert( - "MINECRAFT_JAR".to_string(), - daedalus::modded::SidedDataEntry { - client: client_path.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); - data.insert( - "MINECRAFT_VERSION".to_string(), - daedalus::modded::SidedDataEntry { - client: game_version.to_string(), - server: "".to_string(), - }, - ); - data.insert( - "ROOT".to_string(), - daedalus::modded::SidedDataEntry { - client: root_dir.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); - data.insert( - "LIBRARY_DIR".to_string(), - daedalus::modded::SidedDataEntry { - client: libraries_path.to_string_lossy().to_string(), - server: "".to_string(), - }, - ); + if let Some(processors) = &version_info.processors { + if let Some(ref mut data) = version_info.data { + processor_rules! { + data; + "SIDE": + client => "client", + server => ""; + "MINECRAFT_JAR" : + client => client_path.to_string_lossy(), + server => ""; + "MINECRAFT_VERSION": + client => game_version, + server => ""; + "ROOT": + client => instance_path.to_string_lossy(), + server => ""; + "LIBRARY_DIR": + client => state.directories.libraries_dir().to_string_lossy(), + server => ""; + } for processor in processors { if let Some(sides) = &processor.sides { - if !sides.contains(&"client".to_string()) { + if !sides.contains(&String::from("client")) { continue; } } - let mut cp = processor.classpath.clone(); - cp.push(processor.jar.clone()); + let cp = wrap_ref_builder!(cp = processor.classpath.clone() => { + cp.push(processor.jar.clone()) + }); let child = Command::new("java") .arg("-cp") - .arg(args::get_class_paths_jar(&libraries_path, &cp)?) + .arg(args::get_class_paths_jar( + &state.directories.libraries_dir(), + &cp, + )?) .arg( args::get_processor_main_class(args::get_lib_path( - &libraries_path, + &state.directories.libraries_dir(), &processor.jar, )?) .await? .ok_or_else(|| { - LauncherError::ProcessorError(format!( + crate::ErrorKind::LauncherError(format!( "Could not find processor main class for {}", processor.jar )) })?, ) .args(args::get_processor_arguments( - &libraries_path, + &state.directories.libraries_dir(), &processor.args, data, )?) .output() .await - .map_err(|err| LauncherError::ProcessError { - inner: err, - process: "java".to_string(), + .map_err(|err| { + crate::ErrorKind::LauncherError(format!( + "Error running processor: {err}", + )) })?; if !child.status.success() { - return Err(LauncherError::ProcessorError( - String::from_utf8_lossy(&child.stderr).to_string(), - )); + return Err(crate::ErrorKind::LauncherError(format!( + "Processor error: {}", + String::from_utf8_lossy(&child.stderr) + )) + .as_error()); } } } } - let arguments = version.arguments.clone().unwrap_or_default(); + let args = version_info.arguments.clone().unwrap_or_default(); let mut command = match wrapper { Some(hook) => { - let mut cmd = Command::new(hook); - cmd.arg(java); - cmd + wrap_ref_builder!(it = Command::new(hook) => {it.arg(java_install)}) } - None => Command::new(java.to_string_lossy().to_string()), + None => Command::new(String::from(java_install.to_string_lossy())), }; command .args(args::get_jvm_arguments( - arguments.get(&ArgumentType::Jvm).map(|x| x.as_slice()), - &version_natives_path, - &libraries_path, + args.get(&d::minecraft::ArgumentType::Jvm) + .map(|x| x.as_slice()), + &state.directories.version_natives_dir(&version.id), + &state.directories.libraries_dir(), &args::get_class_paths( - &libraries_path, - version.libraries.as_slice(), + &state.directories.libraries_dir(), + version_info.libraries.as_slice(), &client_path, )?, &version_jar, *memory, - java_args.clone(), + Vec::from(java_args), )?) - .arg(version.main_class.clone()) + .arg(version_info.main_class.clone()) .args(args::get_minecraft_arguments( - arguments.get(&ArgumentType::Game).map(|x| x.as_slice()), - version.minecraft_arguments.as_deref(), + args.get(&d::minecraft::ArgumentType::Game) + .map(|x| x.as_slice()), + version_info.minecraft_arguments.as_deref(), credentials, &version.id, - &version.asset_index.id, - &root_dir, - &assets_path, + &version_info.asset_index.id, + &instance_path, + &state.directories.assets_dir(), &version.type_, *resolution, )?) - .current_dir(root_dir.clone()) + .current_dir(instance_path.clone()) .stdout(Stdio::inherit()) .stderr(Stdio::inherit()); - command.spawn().map_err(|err| LauncherError::ProcessError { - inner: err, - process: format!("minecraft-{} @ {}", &version.id, root_dir.display()), + command.spawn().map_err(|err| { + crate::ErrorKind::LauncherError(format!( + "Error running Minecraft (minecraft-{} @ {}): {err}", + &version.id, + instance_path.display() + )) + .as_error() }) } - -pub async fn download_minecraft( - version: &VersionInfo, - versions_dir: &Path, - assets_dir: &Path, - legacy_assets_dir: &Path, - libraries_dir: &Path, - natives_dir: &Path, -) -> Result<(), LauncherError> { - let assets_index = - download::download_assets_index(assets_dir, version).await?; - - let (a, b, c) = futures::future::join3( - download::download_client(versions_dir, version), - download::download_assets( - assets_dir, - if version.assets == "legacy" { - Some(legacy_assets_dir) - } else { - None - }, - &assets_index, - ), - download::download_libraries( - libraries_dir, - natives_dir, - version.libraries.as_slice(), - ), - ) - .await; - - a?; - b?; - c?; - - Ok(()) -} diff --git a/theseus/src/launcher/rules.rs b/theseus/src/launcher/rules.rs deleted file mode 100644 index de4f588ca..000000000 --- a/theseus/src/launcher/rules.rs +++ /dev/null @@ -1,55 +0,0 @@ -use crate::launcher::download::get_os; -use daedalus::minecraft::{OsRule, Rule, RuleAction}; -use regex::Regex; - -pub fn parse_rules(rules: &[Rule]) -> bool { - rules.iter().all(|x| parse_rule(x)) -} - -pub fn parse_rule(rule: &Rule) -> bool { - let result = if let Some(os) = &rule.os { - parse_os_rule(os) - } else if let Some(features) = &rule.features { - features.has_demo_resolution.unwrap_or(false) - } else { - true - }; - - match rule.action { - RuleAction::Allow => result, - RuleAction::Disallow => !result, - } -} - -pub fn parse_os_rule(rule: &OsRule) -> bool { - if let Some(arch) = &rule.arch { - match arch.as_str() { - "x86" => { - #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))] - return false; - } - "arm" => { - #[cfg(not(target_arch = "arm"))] - return false; - } - _ => {} - } - } - - if let Some(name) = &rule.name { - if &get_os() != name { - return false; - } - } - if let Some(version) = &rule.version { - let regex = Regex::new(version.as_str()); - - if let Ok(regex) = regex { - if !regex.is_match(&sys_info::os_release().unwrap_or_default()) { - return false; - } - } - } - - true -} diff --git a/theseus/src/lib.rs b/theseus/src/lib.rs index 7b4265d5b..337eab2fb 100644 --- a/theseus/src/lib.rs +++ b/theseus/src/lib.rs @@ -1,57 +1,21 @@ -//! # Theseus -//! -//! Theseus is a library which provides utilities for launching minecraft, creating Modrinth mod packs, -//! and launching Modrinth mod packs +/*! +# Theseus -#![warn(unused_import_braces, missing_debug_implementations)] +Theseus is a library which provides utilities for launching minecraft, creating Modrinth mod packs, +and launching Modrinth mod packs +*/ +#![warn(unused_import_braces)] +#![deny(unused_must_use)] -// TODO: make non-hardcoded -lazy_static::lazy_static! { - static ref LAUNCHER_WORK_DIR: std::path::PathBuf = dirs::config_dir().expect("Could not find config dir").join("theseus"); -} - -pub mod data; -pub mod launcher; -pub mod modpack; +#[macro_use] mod util; -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("Launcher error: {0}")] - LauncherError(#[from] launcher::LauncherError), +mod api; +mod config; +mod error; +mod launcher; +mod state; - #[error("Modpack error: {0}")] - ModpackError(#[from] modpack::ModpackError), - - #[error("Data error: {0}")] - DaedalusError(#[from] data::DataError), -} - -pub async fn init() -> Result<(), Error> { - tokio::fs::create_dir_all(LAUNCHER_WORK_DIR.as_path()) - .await - .expect("Unable to create launcher root directory!"); - - use crate::data::*; - Metadata::init().await?; - - Settings::init().await?; - - tokio::try_join! { - launcher::init_download_semaphore(), - Profiles::init(), - }?; - - Ok(()) -} - -pub async fn save() -> Result<(), Error> { - use crate::data::*; - - tokio::try_join! { - Settings::save(), - Profiles::save(), - }?; - - Ok(()) -} +pub use api::*; +pub use error::*; +pub use state::State; diff --git a/theseus/src/modpack/manifest.rs b/theseus/src/modpack/manifest.rs deleted file mode 100644 index 85e6c16c3..000000000 --- a/theseus/src/modpack/manifest.rs +++ /dev/null @@ -1,446 +0,0 @@ -use std::path::PathBuf; - -use std::convert::TryFrom; - -use crate::launcher::ModLoader; - -use super::pack::ModpackGame; -use super::{pack, ModpackError, ModpackResult}; -use serde::{Deserialize, Serialize}; - -pub const DEFAULT_FORMAT_VERSION: u32 = 1; -const MODRINTH_GAMEDATA_URL: &str = "https://staging-cdn.modrinth.com/gamedata"; - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct Manifest { - pub format_version: u32, - pub game: String, - pub version_id: String, - pub name: String, - pub summary: Option, - pub files: Vec, - pub dependencies: ManifestDeps, -} - -impl TryFrom for pack::Modpack { - type Error = ModpackError; - - fn try_from(manifest: Manifest) -> Result { - let files = manifest - .files - .into_iter() - .map(pack::ModpackFile::try_from) - .collect::>()?; - - Ok(Self { - name: manifest.name, - version: manifest.version_id, - summary: manifest.summary, - game: ModpackGame::from(manifest.dependencies), - files, - }) - } -} - -fn get_loader_version(loader: ModLoader, version: &str) -> ModpackResult { - let source = match loader { - ModLoader::Vanilla => Err(ModpackError::VersionError(String::from( - "Attempted to get mod loader version of Vanilla", - ))), - ModLoader::Forge => Ok(format!("{MODRINTH_GAMEDATA_URL}/forge/v0/manifest.json")), - ModLoader::Fabric => Ok(format!("{MODRINTH_GAMEDATA_URL}/fabric/v0/manifest.json")), - }?; - let manifest = futures::executor::block_on(daedalus::modded::fetch_manifest(&source))?; - - let version = manifest - .game_versions - .iter() - .find(|&it| it.id == version) - .map(|x| x.loaders.first()) - .flatten() - .ok_or_else(|| { - ModpackError::VersionError(format!( - "No versions of modloader {loader:?} exist for Minecraft {version}", - )) - })?; - Ok(version.id.clone()) -} - -impl TryFrom for Manifest { - type Error = ModpackError; - - fn try_from(pack: pack::Modpack) -> Result { - let pack::Modpack { - game, - version, - name, - summary, - files, - } = pack; - - let game_name = match &game { - ModpackGame::Minecraft(..) => "minecraft".into(), - }; - - let files: Vec<_> = files.into_iter().map(ManifestFile::from).collect(); - - Ok(Manifest { - format_version: DEFAULT_FORMAT_VERSION, - game: game_name, - version_id: version, - name, - summary, - files, - dependencies: ManifestDeps::try_from(game)?, - }) - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "camelCase")] -pub struct ManifestFile { - pub path: PathBuf, - pub hashes: Option, - #[serde(default)] - pub env: ManifestEnvs, - pub downloads: Vec, -} - -impl TryFrom for pack::ModpackFile { - type Error = ModpackError; - - fn try_from(file: ManifestFile) -> Result { - Ok(Self { - path: file.path, - hashes: file.hashes.map(pack::ModpackFileHashes::from), - env: pack::ModpackEnv::try_from(file.env)?, - downloads: file.downloads.into_iter().collect(), - }) - } -} - -impl From for ManifestFile { - fn from(file: pack::ModpackFile) -> Self { - Self { - path: file.path, - hashes: file.hashes.map(ManifestHashes::from), - env: file.env.into(), - downloads: file.downloads.into_iter().collect(), - } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -pub struct ManifestHashes { - pub sha1: String, -} - -impl From for pack::ModpackFileHashes { - fn from(hashes: ManifestHashes) -> Self { - Self { sha1: hashes.sha1 } - } -} - -impl From for ManifestHashes { - fn from(hashes: pack::ModpackFileHashes) -> Self { - Self { sha1: hashes.sha1 } - } -} - -#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq)] -pub struct ManifestEnvs { - pub client: ManifestEnv, - pub server: ManifestEnv, -} - -impl Default for ManifestEnvs { - fn default() -> Self { - Self { - client: ManifestEnv::Optional, - server: ManifestEnv::Optional, - } - } -} - -#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq)] -#[serde(rename_all = "lowercase")] -pub enum ManifestEnv { - Required, - Optional, - Unsupported, -} - -impl TryFrom for pack::ModpackEnv { - type Error = ModpackError; - - fn try_from(envs: ManifestEnvs) -> Result { - use ManifestEnv::*; - - match (envs.client, envs.server) { - (Required, Unsupported) => Ok(Self::ClientOnly), - (Unsupported, Required) => Ok(Self::ServerOnly), - (Optional, Optional) => Ok(Self::Both), - _ => Err(ModpackError::FormatError(format!( - "Invalid environment specification: {:?}", - envs - ))), - } - } -} - -impl From for ManifestEnvs { - fn from(envs: pack::ModpackEnv) -> Self { - use super::pack::ModpackEnv::*; - - let (client, server) = match envs { - ClientOnly => (ManifestEnv::Required, ManifestEnv::Unsupported), - ServerOnly => (ManifestEnv::Unsupported, ManifestEnv::Required), - Both => (ManifestEnv::Optional, ManifestEnv::Optional), - }; - - Self { client, server } - } -} - -#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[serde(untagged)] -pub enum ManifestDeps { - MinecraftFabric { - minecraft: String, - #[serde(rename = "fabric-loader")] - fabric_loader: String, - }, - MinecraftForge { - minecraft: String, - forge: String, - }, - MinecraftVanilla { - minecraft: String, - }, -} - -impl From for pack::ModpackGame { - fn from(deps: ManifestDeps) -> Self { - use ManifestDeps::*; - - match deps { - MinecraftVanilla { minecraft } => Self::Minecraft(minecraft, ModLoader::Vanilla), - MinecraftFabric { minecraft, .. } => Self::Minecraft(minecraft, ModLoader::Fabric), - MinecraftForge { minecraft, .. } => Self::Minecraft(minecraft, ModLoader::Forge), - } - } -} - -impl TryFrom for ManifestDeps { - type Error = ModpackError; - - fn try_from(game: pack::ModpackGame) -> Result { - use super::pack::ModpackGame::*; - Ok(match game { - Minecraft(minecraft, ModLoader::Vanilla) => Self::MinecraftVanilla { minecraft }, - Minecraft(minecraft, ModLoader::Fabric) => Self::MinecraftFabric { - fabric_loader: get_loader_version(ModLoader::Fabric, &minecraft)?, - minecraft, - }, - Minecraft(minecraft, ModLoader::Forge) => Self::MinecraftForge { - forge: get_loader_version(ModLoader::Fabric, &minecraft)?, - minecraft, - }, - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parse_simple() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [], - "dependencies": { - "minecraft": "1.17.1" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![], - dependencies: ManifestDeps::MinecraftVanilla { - minecraft: "1.17.1".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_forge() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "forge": "37.0.110" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs::default(), - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftForge { - minecraft: "1.17.1".into(), - forge: "37.0.110".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_fabric() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "fabric-loader": "0.9.0" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: None, - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs::default(), - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftFabric { - minecraft: "1.17.1".into(), - fabric_loader: "0.9.0".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } - - #[test] - fn parse_complete() -> ModpackResult<()> { - const PACK_JSON: &'static str = r#" - { - "formatVersion": 1, - "game": "minecraft", - "versionId": "deadbeef", - "name": "Example Pack", - "summary": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", - "files": [ - { - "path": "mods/testmod.jar", - "hashes": { - "sha1": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" - }, - "env": { - "client": "required", - "server": "unsupported" - }, - "downloads": [ - "https://example.com/testmod.jar" - ] - } - ], - "dependencies": { - "minecraft": "1.17.1", - "forge": "37.0.110" - } - } - "#; - let expected_manifest = Manifest { - format_version: 1, - game: "minecraft".into(), - version_id: "deadbeef".into(), - name: "Example Pack".into(), - summary: Some("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.".into()), - files: vec![ManifestFile { - path: "mods/testmod.jar".into(), - hashes: Some(ManifestHashes { - sha1: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(), - }), - env: ManifestEnvs { - client: ManifestEnv::Required, - server: ManifestEnv::Unsupported, - }, - downloads: vec!["https://example.com/testmod.jar".into()], - }], - dependencies: ManifestDeps::MinecraftForge { - minecraft: "1.17.1".into(), - forge: "37.0.110".into(), - }, - }; - let manifest: Manifest = serde_json::from_str(PACK_JSON).expect("Error parsing pack JSON"); - - assert_eq!(expected_manifest, manifest); - Ok(()) - } -} diff --git a/theseus/src/modpack/mod.rs b/theseus/src/modpack/mod.rs deleted file mode 100644 index c9655d34a..000000000 --- a/theseus/src/modpack/mod.rs +++ /dev/null @@ -1,194 +0,0 @@ -//! Provides utilties for downloading and parsing modpacks - -use daedalus::download_file; -use fs_extra::dir::CopyOptions; -use std::{convert::TryFrom, env, io, path::Path}; -use tokio::{fs, try_join}; -use uuid::Uuid; -use zip::ZipArchive; -use zip_extensions::ZipWriterExtensions; - -use self::{ - manifest::Manifest, - pack::{Modpack, ModpackGame}, -}; - -pub mod manifest; -pub mod modrinth_api; -pub mod pack; - -pub const COMPILED_PATH: &str = "compiled/"; -pub const COMPILED_ZIP: &str = "compiled.mrpack"; -pub const MANIFEST_PATH: &str = "modrinth.index.json"; -pub const OVERRIDES_PATH: &str = "overrides/"; -pub const PACK_JSON5_PATH: &str = "modpack.json5"; -const PACK_GITIGNORE: &'static str = const_format::formatcp!( - r#" -{COMPILED_PATH} -{COMPILED_ZIP} -"# -); - -#[derive(thiserror::Error, Debug)] -pub enum ModpackError { - #[error("I/O error while reading modpack: {0}")] - IOError(#[from] io::Error), - - #[error("I/O error while reading modpack: {0}")] - FSExtraError(#[from] fs_extra::error::Error), - - #[error("Error extracting archive: {0}")] - ZipError(#[from] zip::result::ZipError), - - #[error("Invalid modpack format: {0}")] - FormatError(String), - - #[error("Invalid output directory: {0}")] - InvalidDirectory(String), - - #[error("Error parsing manifest: {0}")] - ManifestError(String), - - #[error("Daedalus error: {0}")] - DaedalusError(#[from] daedalus::Error), - - #[error("Error parsing json: {0}")] - JsonError(#[from] serde_json::Error), - - #[error("Error parsing json5: {0}")] - Json5Error(#[from] json5::Error), - - #[error("Error joining futures: {0}")] - JoinError(#[from] tokio::task::JoinError), - - #[error("Versioning Error: {0}")] - VersionError(String), - - #[error("Error downloading file: {0}")] - FetchError(#[from] reqwest::Error), - - #[error("Invalid modpack source: {0} (set the WHITELISTED_MODPACK_DOMAINS environment variable to override)")] - SourceWhitelistError(String), -} - -type ModpackResult = Result; - -/// Realise a modpack from a given URL -pub async fn fetch_modpack( - url: &str, - sha1: Option<&str>, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - let bytes = download_file(url, sha1).await?; - let mut archive = ZipArchive::new(io::Cursor::new(&bytes as &[u8]))?; - realise_modpack_zip(&mut archive, dest, side).await -} - -/// Realise a given modpack from a zip archive -pub async fn realise_modpack_zip( - archive: &mut ZipArchive, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - let mut tmp = env::temp_dir(); - tmp.push(format!("theseus-{}/", Uuid::new_v4())); - archive.extract(&tmp)?; - realise_modpack(&tmp, dest, side).await -} - -/// Realise a given modpack into an instance -pub async fn realise_modpack( - dir: &Path, - dest: &Path, - side: pack::ModpackSide, -) -> ModpackResult<()> { - if dest.is_file() { - return Err(ModpackError::InvalidDirectory(String::from( - "Output is not a directory", - ))); - } - if std::fs::read_dir(dest).map_or(false, |it| it.count() != 0) { - return Err(ModpackError::InvalidDirectory(String::from( - "Output directory is non-empty", - ))); - } - if !dest.exists() { - fs::create_dir_all(dest).await?; - } - - // Copy overrides - let overrides = dir.join(OVERRIDES_PATH); - if overrides.is_dir() { - fs_extra::dir::copy(overrides, dest, &CopyOptions::new())?; - } - - // Parse manifest - // NOTE: I'm using standard files here, since Serde does not support async readers - let manifest_path = Some(dir.join(MANIFEST_PATH)) - .filter(|it| it.is_file()) - .ok_or_else(|| { - ModpackError::ManifestError(String::from("Manifest missing or is not a file")) - })?; - let manifest_file = std::fs::File::open(manifest_path)?; - let reader = io::BufReader::new(manifest_file); - - let manifest: Manifest = serde_json::from_reader(reader)?; - let modpack = Modpack::try_from(manifest)?; - - // Realise modpack - modpack.download_files(dest, side).await?; - Ok(()) -} - -pub fn to_pack_json5(pack: &Modpack) -> ModpackResult { - let json5 = json5::to_string(pack)?; - Ok(format!("// This modpack is managed using Theseus. It can be edited using either a Theseus-compatible launcher or manually.\n{json5}")) -} - -pub async fn create_modpack( - name: &str, - game: ModpackGame, - summary: Option<&str>, -) -> ModpackResult<()> { - let output_dir = Path::new("./").join(name); - let pack = Modpack::new(game, "0.1.0", name, summary); - - try_join!( - fs::create_dir(&output_dir), - fs::create_dir(output_dir.join(OVERRIDES_PATH)), - fs::write(output_dir.join(".gitignore"), PACK_GITIGNORE), - fs::write(output_dir.join(PACK_JSON5_PATH), to_pack_json5(&pack)?), - )?; - - Ok(()) -} - -pub async fn compile_modpack(dir: &Path) -> ModpackResult<()> { - let result_dir = dir.join(COMPILED_PATH); - let pack: Modpack = json5::from_str(&fs::read_to_string(dir.join(PACK_JSON5_PATH)).await?)?; - - fs::create_dir(&result_dir).await?; - if dir.join(OVERRIDES_PATH).exists() { - fs_extra::dir::copy( - dir.join(OVERRIDES_PATH), - result_dir.join(OVERRIDES_PATH), - &CopyOptions::new(), - )?; - } - let manifest = Manifest::try_from(pack)?; - fs::write( - result_dir.join(MANIFEST_PATH), - serde_json::to_string(&manifest)?, - ) - .await?; - - let result_zip = fs::File::create(dir.join(COMPILED_ZIP)) - .await? - .into_std() - .await; - let mut zip = zip::ZipWriter::new(&result_zip); - zip.create_from_directory(&result_dir)?; - - Ok(()) -} diff --git a/theseus/src/modpack/modrinth_api.rs b/theseus/src/modpack/modrinth_api.rs deleted file mode 100644 index 17013c649..000000000 --- a/theseus/src/modpack/modrinth_api.rs +++ /dev/null @@ -1,180 +0,0 @@ -use std::{collections::HashSet, convert::TryFrom, path::PathBuf}; - -use crate::launcher::ModLoader; - -use super::{ - manifest::{ManifestEnvs, ManifestHashes}, - pack::{ModpackEnv, ModpackFile, ModpackFileHashes, ModpackGame}, - ModpackError, ModpackResult, -}; -use async_trait::async_trait; -use bytes::Bytes; -use futures::future::try_join_all; -use serde::Deserialize; -use tokio::try_join; - -#[async_trait] -pub trait ModrinthAPI { - async fn get_latest_version( - &self, - project: &str, - channel: &str, - game: &ModpackGame, - ) -> ModpackResult>; - async fn get_version( - &self, - version: &str, - ) -> ModpackResult>; -} - -#[derive(Debug)] -pub struct ModrinthV1(pub String); - -#[derive(Debug, Deserialize)] -struct ModrinthV1Project { - title: String, - client_side: String, - server_side: String, -} - -#[derive(Debug, Deserialize)] -struct ModrinthV1ProjectVersion { - dependencies: HashSet, - game_versions: HashSet, - version_type: String, - files: Vec, - loaders: HashSet, -} - -#[derive(Clone, Debug, Deserialize)] -struct ModrinthV1ProjectVersionFile { - hashes: ManifestHashes, - url: String, - filename: String, -} - -impl From for ModpackFile { - fn from(file: ModrinthV1ProjectVersionFile) -> Self { - Self { - hashes: Some(ModpackFileHashes::from(file.hashes)), - downloads: HashSet::from([file.url]), - path: PathBuf::from(file.filename), - // WARNING: Since the sidedness of version 1 API requests is unknown, the environment is - // set here as both. - env: ModpackEnv::Both, - } - } -} - -#[async_trait] -impl ModrinthAPI for ModrinthV1 { - async fn get_latest_version( - &self, - project: &str, - channel: &str, - game: &ModpackGame, - ) -> ModpackResult> { - let domain = &self.0; - // Fetch metadata - let (project_json, versions_json): (Bytes, Bytes) = try_join!( - try_get_json(format!("{domain}/api/v1/mod/{project}")), - try_get_json(format!("{domain}/api/v1/mod/{project}/version")), - )?; - - let (mut project_deserializer, mut versions_deserializer) = ( - serde_json::Deserializer::from_slice(&project_json), - serde_json::Deserializer::from_slice(&versions_json), - ); - - let (project, versions) = ( - ModrinthV1Project::deserialize(&mut project_deserializer)?, - Vec::deserialize(&mut versions_deserializer)?, - ); - - let (game_version, loader) = match game { - ModpackGame::Minecraft(_, ModLoader::Vanilla) => Err(ModpackError::VersionError( - String::from("Modrinth V1 does not support vanilla projects"), - )), - ModpackGame::Minecraft(ref version, ref loader) => Ok((version, loader)), - // This guard is here for when Modrinth does support other games. - #[allow(unreachable_patterns)] - _ => Err(ModpackError::VersionError(String::from( - "Attempted to use Modrinth API V1 to install a non-Minecraft project!", - ))), - }?; - - let version: ModrinthV1ProjectVersion = versions - .into_iter() - .find(|it: &ModrinthV1ProjectVersion| { - let loader_str = match loader { - ModLoader::Fabric => "fabric", - ModLoader::Forge => "forge", - ModLoader::Vanilla => unreachable!(), - }; - it.version_type == channel - && it.game_versions.contains(game_version) - && it.loaders.contains(loader_str) - }) - .ok_or_else(|| { - ModpackError::VersionError(format!( - "Unable to find compatible version of mod {}", - project.title - )) - })?; - - // Project fields - let envs = ModpackEnv::try_from(ManifestEnvs { - client: serde_json::from_str(&project.client_side)?, - server: serde_json::from_str(&project.server_side)?, - })?; - - // Conversions - let files = version - .files - .iter() - .cloned() - .map(ModpackFile::from) - .collect::>(); - - let dep_futures = - version.dependencies.iter().map(|it| self.get_version(it)); - let deps = try_join_all(dep_futures) - .await? - .into_iter() - .flatten() - .collect::>(); - - Ok(files - .into_iter() - .chain(deps.into_iter()) - .map(|mut it| { - it.env = envs; - it - }) - .collect()) - } - - async fn get_version( - &self, - version: &str, - ) -> ModpackResult> { - let domain = &self.0; - let version_json = - try_get_json(format!("{domain}/api/v1/version/{version}")).await?; - let mut version_deserializer = - serde_json::Deserializer::from_slice(&version_json); - let version = - ModrinthV1ProjectVersion::deserialize(&mut version_deserializer)?; - - Ok(version - .files - .into_iter() - .map(ModpackFile::from) - .collect::>()) - } -} - -// Helpers -async fn try_get_json(url: String) -> ModpackResult { - Ok(reqwest::get(url).await?.error_for_status()?.bytes().await?) -} diff --git a/theseus/src/modpack/pack.rs b/theseus/src/modpack/pack.rs deleted file mode 100644 index 2209f9a38..000000000 --- a/theseus/src/modpack/pack.rs +++ /dev/null @@ -1,277 +0,0 @@ -use daedalus::download_file_mirrors; -use futures::future; -use serde::{Deserialize, Serialize}; -use std::{ - collections::HashSet, - hash::Hash, - iter::FromIterator, - path::{Path, PathBuf}, -}; -use tokio::fs; - -use super::{ - modrinth_api::{self, ModrinthV1}, - ModpackError, ModpackResult, -}; -use crate::launcher::ModLoader; - -pub const MODRINTH_DEFAULT_MODPACK_DOMAINS: &[&str] = &[ - "cdn.modrinth.com", - "edge.forgecdn.net", - "github.com", - "raw.githubusercontent.com", -]; -pub const MODRINTH_MODPACK_DOMAIN_WHITELIST_VAR: &str = "WHITELISTED_MODPACK_DOMAINS"; - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct Modpack { - pub game: ModpackGame, - pub version: String, - pub name: String, - pub summary: Option, - pub files: HashSet, -} - -impl Modpack { - pub fn new(game: ModpackGame, version: &str, name: &str, summary: Option<&str>) -> Self { - Self { - game, - version: String::from(version), - name: String::from(name), - summary: summary.map(String::from), - files: HashSet::new(), - } - } - - /// Download a modpack's files for a given side to a given destination - /// Assumes the destination exists and is a directory - pub async fn download_files(&self, dest: &Path, side: ModpackSide) -> ModpackResult<()> { - let handles = self.files.iter().cloned().map(move |file| { - let (dest, side) = (dest.to_owned(), side); - tokio::spawn(async move { file.fetch(&dest, side).await }) - }); - future::try_join_all(handles) - .await? - .into_iter() - .collect::>()?; - - // TODO Integrate instance format to save other metadata - Ok(()) - } - - pub async fn add_project( - &mut self, - project: &str, - base_path: &Path, - source: Option<&dyn modrinth_api::ModrinthAPI>, - channel: Option<&str>, - ) -> ModpackResult<()> { - let default_api = ModrinthV1(String::from("https://api.modrinth.com")); - let channel = channel.unwrap_or("release"); - let source = source.unwrap_or(&default_api); - - let files = source - .get_latest_version(project, channel, &self.game) - .await? - .into_iter() - .map(|mut it: ModpackFile| { - it.path = base_path.join(it.path); - it - }); - - self.files.extend(files); - Ok(()) - } - - pub async fn add_version( - &mut self, - version: &str, - base_path: &Path, - source: Option<&dyn modrinth_api::ModrinthAPI>, - ) -> ModpackResult<()> { - let default_api = ModrinthV1(String::from("https://api.modrinth.com")); - let source = source.unwrap_or(&default_api); - - let files = source - .get_version(version) - .await? - .into_iter() - .map(|mut it: ModpackFile| { - it.path = base_path.join(it.path); - it - }); - - self.files.extend(files); - Ok(()) - } - - pub async fn add_file( - &mut self, - source: reqwest::Url, - dest: &Path, - hashes: Option, - env: Option, - ) -> ModpackResult<()> { - let whitelisted_domains = std::env::var(MODRINTH_MODPACK_DOMAIN_WHITELIST_VAR) - .map(|it| serde_json::from_str::>(&it).ok().unwrap()) - .unwrap_or_else(|_| { - MODRINTH_DEFAULT_MODPACK_DOMAINS - .iter() - .cloned() - .map(String::from) - .collect::>() - }); - - if !whitelisted_domains - .iter() - .any(|it| it == source.host_str().unwrap()) - { - return Err(ModpackError::SourceWhitelistError(String::from( - source.host_str().unwrap(), - ))); - } - - let file = ModpackFile { - path: PathBuf::from(dest), - hashes, - env: env.unwrap_or(ModpackEnv::Both), - downloads: HashSet::from_iter([String::from(source)].iter().cloned()), - }; - - self.files.insert(file); - Ok(()) - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -#[non_exhaustive] -pub enum ModpackGame { - // TODO: Currently, the launcher does not support specifying mod loader versions, so I just - // store the loader here. - Minecraft(String, ModLoader), -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct ModpackFile { - pub path: PathBuf, - pub hashes: Option, - pub env: ModpackEnv, - pub downloads: HashSet, -} - -#[allow(clippy::derive_hash_xor_eq)] -impl Hash for ModpackFile { - fn hash(&self, state: &mut H) { - if let Some(ref hashes) = self.hashes { - hashes.sha1.hash(state); - } - self.path.hash(state); - } -} - -impl ModpackFile { - pub async fn fetch(&self, dest: &Path, side: ModpackSide) -> ModpackResult<()> { - if !self.env.supports(side) { - return Ok(()); - } - - let output = dest.join(&self.path); - - // HACK: Since Daedalus appends a file name to all mirrors and the manifest supplies full - // URLs, I'm supplying it with an empty string to avoid reinventing the wheel. - let bytes = download_file_mirrors( - "", - self.downloads - .iter() - .map(|it| it.as_str()) - .collect::>() - .as_slice(), - self.hashes.as_ref().map(|it| it.sha1.as_str()), - ) - .await?; - fs::create_dir_all(output.parent().unwrap()).await?; - fs::write(output, bytes).await?; - Ok(()) - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum ModpackEnv { - ClientOnly, - ServerOnly, - Both, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum ModpackSide { - Client, - Server, -} - -impl ModpackEnv { - pub fn supports(&self, side: ModpackSide) -> bool { - match self { - Self::ClientOnly => side == ModpackSide::Client, - Self::ServerOnly => side == ModpackSide::Server, - Self::Both => true, - } - } -} - -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)] -pub struct ModpackFileHashes { - pub sha1: String, -} - -#[cfg(test)] -mod tests { - use std::{ - collections::HashSet, - path::{Path, PathBuf}, - }; - - use super::*; - use crate::launcher::ModLoader; - - #[tokio::test] - async fn add_version() -> ModpackResult<()> { - const TEST_VERSION: &'static str = "TpnSObJ7"; - let mut test_pack = Modpack::new( - ModpackGame::Minecraft(String::from("1.16.5"), ModLoader::Fabric), - "0.1.0", - "Example Modpack", - None, - ); - test_pack - .add_version(TEST_VERSION, Path::new("mods/"), None) - .await?; - - assert_eq!( - test_pack, - Modpack { - game: ModpackGame::Minecraft(String::from("1.16.5"), ModLoader::Fabric), - version: String::from("0.1.0"), - name: String::from("Example Modpack"), - summary: None, - files: { - let mut files = HashSet::new(); - files.insert(ModpackFile { - path: PathBuf::from("mods/gravestones-v1.9.jar"), - hashes: Some(ModpackFileHashes { - sha1: String::from("3f0f6d523d218460310b345be03ab3f1d294e04d"), - }), - env: ModpackEnv::Both, - downloads: { - let mut downloads = HashSet::new(); - downloads.insert(String::from("https://cdn.modrinth.com/data/ssUbhMkL/versions/v1.9/gravestones-v1.9.jar")); - downloads - } - }); - files - }, - }, - ); - Ok(()) - } -} diff --git a/theseus/src/state/dirs.rs b/theseus/src/state/dirs.rs new file mode 100644 index 000000000..37a572392 --- /dev/null +++ b/theseus/src/state/dirs.rs @@ -0,0 +1,130 @@ +//! Theseus directory information +use std::path::PathBuf; +use tokio::fs; + +#[derive(Debug)] +pub struct DirectoryInfo { + pub config_dir: PathBuf, + pub working_dir: PathBuf, +} + +impl DirectoryInfo { + /// Get all paths needed for Theseus to operate properly + #[tracing::instrument] + pub async fn init() -> crate::Result { + // Working directory + let working_dir = std::env::current_dir().map_err(|err| { + crate::ErrorKind::FSError(format!( + "Could not open working directory: {err}" + )) + })?; + + // Config directory + let config_dir = Self::env_path("THESEUS_CONFIG_DIR") + .or_else(|| Some(dirs::config_dir()?.join("theseus"))) + .ok_or(crate::ErrorKind::FSError( + "Could not find valid config dir".to_string(), + ))?; + + fs::create_dir_all(&config_dir).await.map_err(|err| { + crate::ErrorKind::FSError(format!( + "Error creating Theseus config directory: {err}" + )) + })?; + + Ok(Self { + config_dir, + working_dir, + }) + } + + /// Get the Minecraft instance metadata directory + #[inline] + pub fn metadata_dir(&self) -> PathBuf { + self.config_dir.join("meta") + } + + /// Get the Minecraft versions metadata directory + #[inline] + pub fn versions_dir(&self) -> PathBuf { + self.metadata_dir().join("versions") + } + + /// Get the metadata directory for a given version + #[inline] + pub fn version_dir(&self, version: &str) -> PathBuf { + self.versions_dir().join(version) + } + + /// Get the Minecraft libraries metadata directory + #[inline] + pub fn libraries_dir(&self) -> PathBuf { + self.metadata_dir().join("libraries") + } + + /// Get the Minecraft assets metadata directory + #[inline] + pub fn assets_dir(&self) -> PathBuf { + self.metadata_dir().join("assets") + } + + /// Get the assets index directory + #[inline] + pub fn assets_index_dir(&self) -> PathBuf { + self.assets_dir().join("indexes") + } + + /// Get the assets objects directory + #[inline] + pub fn objects_dir(&self) -> PathBuf { + self.assets_dir().join("objects") + } + + /// Get the directory for a specific object + #[inline] + pub fn object_dir(&self, hash: &str) -> PathBuf { + self.objects_dir().join(&hash[..2]).join(hash) + } + + /// Get the Minecraft legacy assets metadata directory + #[inline] + pub fn legacy_assets_dir(&self) -> PathBuf { + self.metadata_dir().join("resources") + } + + /// Get the Minecraft legacy assets metadata directory + #[inline] + pub fn natives_dir(&self) -> PathBuf { + self.metadata_dir().join("natives") + } + + /// Get the natives directory for a version of Minecraft + #[inline] + pub fn version_natives_dir(&self, version: &str) -> PathBuf { + self.natives_dir().join(version) + } + + /// Get the directory containing instance icons + #[inline] + pub fn icon_dir(&self) -> PathBuf { + self.config_dir.join("icons") + } + + /// Get the file containing the global database + #[inline] + pub fn database_file(&self) -> PathBuf { + self.config_dir.join("data.bin") + } + + /// Get the settings file for Theseus + #[inline] + pub fn settings_file(&self) -> PathBuf { + self.config_dir.join("settings.json") + } + + /// Get path from environment variable + #[inline] + fn env_path(name: &str) -> Option { + std::env::var_os(name).map(PathBuf::from) + } +} diff --git a/theseus/src/state/metadata.rs b/theseus/src/state/metadata.rs new file mode 100644 index 000000000..76f9713db --- /dev/null +++ b/theseus/src/state/metadata.rs @@ -0,0 +1,95 @@ +//! Theseus metadata +use crate::config::BINCODE_CONFIG; +use bincode::{Decode, Encode}; +use daedalus::{ + minecraft::{fetch_version_manifest, VersionManifest as MinecraftManifest}, + modded::{ + fetch_manifest as fetch_loader_manifest, Manifest as LoaderManifest, + }, +}; +use futures::prelude::*; +use std::collections::LinkedList; + +const METADATA_URL: &str = "https://meta.modrinth.com/gamedata"; +const METADATA_DB_FIELD: &[u8] = b"metadata"; + +// TODO: store as subtree in database +#[derive(Encode, Decode, Debug)] +pub struct Metadata { + pub minecraft: MinecraftManifest, + pub forge: LoaderManifest, + pub fabric: LoaderManifest, +} + +impl Metadata { + fn get_manifest(name: &str) -> String { + format!("{METADATA_URL}/{name}/v0/manifest.json") + } + + async fn fetch() -> crate::Result { + let (minecraft, forge, fabric) = tokio::try_join! { + async { + let url = Self::get_manifest("minecraft"); + fetch_version_manifest(Some(&url)).await + }, + async { + let url = Self::get_manifest("forge"); + fetch_loader_manifest(&url).await + }, + async { + let url = Self::get_manifest("fabric"); + fetch_loader_manifest(&url).await + } + }?; + + Ok(Self { + minecraft, + forge, + fabric, + }) + } + + #[tracing::instrument(skip_all)] + pub async fn init(db: &sled::Db) -> crate::Result { + let mut metadata = None; + + if let Some(ref meta_bin) = db.get(METADATA_DB_FIELD)? { + match bincode::decode_from_slice::( + &meta_bin, + *BINCODE_CONFIG, + ) { + Ok((meta, _)) => metadata = Some(meta), + Err(err) => { + log::warn!("Could not read launcher metadata: {err}") + } + } + } + + let mut fetch_futures = LinkedList::new(); + for _ in 0..3 { + fetch_futures.push_back(Self::fetch().boxed()); + } + + match future::select_ok(fetch_futures).await { + Ok(meta) => metadata = Some(meta.0), + Err(err) => log::warn!("Unable to fetch launcher metadata: {err}"), + } + + if let Some(meta) = metadata { + db.insert( + METADATA_DB_FIELD, + sled::IVec::from(bincode::encode_to_vec( + &meta, + *BINCODE_CONFIG, + )?), + )?; + db.flush_async().await?; + Ok(meta) + } else { + Err( + crate::ErrorKind::NoValueFor(String::from("launcher metadata")) + .as_error(), + ) + } + } +} diff --git a/theseus/src/state/mod.rs b/theseus/src/state/mod.rs new file mode 100644 index 000000000..169f69f79 --- /dev/null +++ b/theseus/src/state/mod.rs @@ -0,0 +1,130 @@ +//! Theseus state management system +use crate::config::sled_config; +use std::sync::Arc; +use tokio::sync::{Mutex, OnceCell, RwLock, Semaphore}; + +// Submodules +mod dirs; +pub use self::dirs::*; + +mod metadata; +pub use self::metadata::*; + +mod profiles; +pub use self::profiles::*; + +mod settings; +pub use self::settings::*; + +mod users; +pub use self::users::*; + +// Global state +static LAUNCHER_STATE: OnceCell> = OnceCell::const_new(); +pub struct State { + /// Database, used to store some information + pub(self) database: sled::Db, + /// Information on the location of files used in the launcher + pub directories: DirectoryInfo, + /// Semaphore used to limit concurrent I/O and avoid errors + pub io_semaphore: Semaphore, + /// Launcher metadata + pub metadata: Metadata, + // TODO: settings API + /// Launcher configuration + pub settings: RwLock, + /// Launcher profile metadata + pub(crate) profiles: RwLock, + /// Launcher user account info + pub(crate) users: RwLock, +} + +impl State { + #[tracing::instrument] + /// Get the current launcher state, initializing it if needed + pub async fn get() -> crate::Result> { + LAUNCHER_STATE + .get_or_try_init(|| { + async { + // Directories + let directories = DirectoryInfo::init().await?; + + // Database + // TODO: make database versioned + let database = sled_config() + .path(directories.database_file()) + .open()?; + + // Settings + let settings = + Settings::init(&directories.settings_file()).await?; + + // Launcher data + let (metadata, profiles) = tokio::try_join! { + Metadata::init(&database), + Profiles::init(&database), + }?; + let users = Users::init(&database)?; + + // Loose initializations + let io_semaphore = + Semaphore::new(settings.max_concurrent_downloads); + + Ok(Arc::new(Self { + database, + directories, + io_semaphore, + metadata, + settings: RwLock::new(settings), + profiles: RwLock::new(profiles), + users: RwLock::new(users), + })) + } + }) + .await + .map(Arc::clone) + } + + #[tracing::instrument] + /// Synchronize in-memory state with persistent state + pub async fn sync() -> crate::Result<()> { + let state = Self::get().await?; + let batch = Arc::new(Mutex::new(sled::Batch::default())); + + let sync_settings = async { + let state = Arc::clone(&state); + + tokio::spawn(async move { + let reader = state.settings.read().await; + reader.sync(&state.directories.settings_file()).await?; + Ok::<_, crate::Error>(()) + }) + .await + .unwrap() + }; + + let sync_profiles = async { + let state = Arc::clone(&state); + let batch = Arc::clone(&batch); + + tokio::spawn(async move { + let profiles = state.profiles.read().await; + let mut batch = batch.lock().await; + + profiles.sync(&mut batch).await?; + Ok::<_, crate::Error>(()) + }) + .await + .unwrap() + }; + + tokio::try_join!(sync_settings, sync_profiles)?; + + state + .database + .apply_batch(Arc::try_unwrap(batch).unwrap().into_inner())?; + state.database.flush_async().await?; + + Ok(()) + } +} diff --git a/theseus/src/state/profiles.rs b/theseus/src/state/profiles.rs new file mode 100644 index 000000000..36e8390d3 --- /dev/null +++ b/theseus/src/state/profiles.rs @@ -0,0 +1,357 @@ +use super::settings::{Hooks, MemorySettings, WindowSize}; +use crate::config::BINCODE_CONFIG; +use daedalus::modded::LoaderVersion; +use futures::prelude::*; +use serde::{Deserialize, Serialize}; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; +use tokio::fs; + +const PROFILE_JSON_PATH: &str = "profile.json"; +const PROFILE_SUBTREE: &[u8] = b"profiles"; + +pub(crate) struct Profiles(pub HashMap>); + +// TODO: possibly add defaults to some of these values +pub const CURRENT_FORMAT_VERSION: u32 = 1; +pub const SUPPORTED_ICON_FORMATS: &[&'static str] = &[ + "bmp", "gif", "jpeg", "jpg", "jpe", "png", "svg", "svgz", "webp", "rgb", + "mp4", +]; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct Profile { + #[serde(skip)] + pub path: PathBuf, + pub metadata: ProfileMetadata, + #[serde(skip_serializing_if = "Option::is_none")] + pub java: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub memory: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub resolution: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub hooks: Option, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct ProfileMetadata { + pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub icon: Option, + pub game_version: String, + #[serde(default)] + pub loader: ModLoader, + #[serde(skip_serializing_if = "Option::is_none")] + pub loader_version: Option, + pub format_version: u32, +} + +// TODO: Quilt? +#[derive(Debug, Eq, PartialEq, Clone, Copy, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] +pub enum ModLoader { + Vanilla, + Forge, + Fabric, +} + +impl Default for ModLoader { + fn default() -> Self { + ModLoader::Vanilla + } +} + +impl std::fmt::Display for ModLoader { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(match self { + &Self::Vanilla => "Vanilla", + &Self::Forge => "Forge", + &Self::Fabric => "Fabric", + }) + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct JavaSettings { + #[serde(skip_serializing_if = "Option::is_none")] + pub install: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub extra_arguments: Option>, +} + +impl Profile { + #[tracing::instrument] + pub async fn new( + name: String, + version: String, + path: PathBuf, + ) -> crate::Result { + if name.trim().is_empty() { + return Err(crate::ErrorKind::InputError(String::from( + "Empty name for instance!", + )) + .into()); + } + + Ok(Self { + path: path.canonicalize()?, + metadata: ProfileMetadata { + name, + icon: None, + game_version: version, + loader: ModLoader::Vanilla, + loader_version: None, + format_version: CURRENT_FORMAT_VERSION, + }, + java: None, + memory: None, + resolution: None, + hooks: None, + }) + } + + // TODO: deduplicate these builder methods + // They are flat like this in order to allow builder-style usage + #[tracing::instrument] + pub fn with_name(&mut self, name: String) -> &mut Self { + self.metadata.name = name; + self + } + + #[tracing::instrument] + pub async fn with_icon<'a>( + &'a mut self, + icon: &'a Path, + ) -> crate::Result<&'a mut Self> { + let ext = icon + .extension() + .and_then(std::ffi::OsStr::to_str) + .unwrap_or(""); + + if SUPPORTED_ICON_FORMATS.contains(&ext) { + let file_name = format!("icon.{ext}"); + fs::copy(icon, &self.path.join(&file_name)).await?; + self.metadata.icon = + Some(Path::new(&format!("./{file_name}")).to_owned()); + + Ok(self) + } else { + Err(crate::ErrorKind::InputError(format!( + "Unsupported image type: {ext}" + )) + .into()) + } + } + + #[tracing::instrument] + pub fn with_game_version(&mut self, version: String) -> &mut Self { + self.metadata.game_version = version; + self + } + + #[tracing::instrument] + pub fn with_loader( + &mut self, + loader: ModLoader, + version: Option, + ) -> &mut Self { + self.metadata.loader = loader; + self.metadata.loader_version = version; + self + } + + #[tracing::instrument] + pub fn with_java_settings( + &mut self, + settings: Option, + ) -> &mut Self { + self.java = settings; + self + } + + #[tracing::instrument] + pub fn with_memory( + &mut self, + settings: Option, + ) -> &mut Self { + self.memory = settings; + self + } + + #[tracing::instrument] + pub fn with_resolution( + &mut self, + resolution: Option, + ) -> &mut Self { + self.resolution = resolution; + self + } + + #[tracing::instrument] + pub fn with_hooks(&mut self, hooks: Option) -> &mut Self { + self.hooks = hooks; + self + } +} + +impl Profiles { + #[tracing::instrument(skip(db))] + pub async fn init(db: &sled::Db) -> crate::Result { + let profile_db = db.get(PROFILE_SUBTREE)?.map_or( + Ok(Default::default()), + |bytes| { + bincode::decode_from_slice::, _>( + &bytes, + *BINCODE_CONFIG, + ) + .map(|it| it.0) + }, + )?; + + let profiles = stream::iter(profile_db.iter()) + .then(|it| async move { + let path = PathBuf::from(it); + let prof = match Self::read_profile_from_dir(&path).await { + Ok(prof) => Some(prof), + Err(err) => { + log::warn!("Error loading profile: {err}. Skipping..."); + None + } + }; + (path, prof) + }) + .collect::>>() + .await; + + Ok(Self(profiles)) + } + + #[tracing::instrument(skip(self))] + pub fn insert(&mut self, profile: Profile) -> crate::Result<&Self> { + self.0.insert( + profile + .path + .canonicalize()? + .to_str() + .ok_or( + crate::ErrorKind::UTFError(profile.path.clone()).as_error(), + )? + .into(), + Some(profile), + ); + Ok(self) + } + + #[tracing::instrument(skip(self))] + pub async fn insert_from<'a>( + &'a mut self, + path: &'a Path, + ) -> crate::Result<&Self> { + self.insert(Self::read_profile_from_dir(&path.canonicalize()?).await?) + } + + #[tracing::instrument(skip(self))] + pub fn remove(&mut self, path: &Path) -> crate::Result<&Self> { + let path = PathBuf::from(path.canonicalize()?.to_str().unwrap()); + self.0.remove(&path); + Ok(self) + } + + #[tracing::instrument(skip_all)] + pub async fn sync<'a>( + &'a self, + batch: &'a mut sled::Batch, + ) -> crate::Result<&Self> { + stream::iter(self.0.iter()) + .map(Ok::<_, crate::Error>) + .try_for_each_concurrent(None, |(path, profile)| async move { + let json = serde_json::to_vec_pretty(&profile)?; + + let json_path = + Path::new(path.to_str().unwrap()).join(PROFILE_JSON_PATH); + + fs::write(json_path, json).await?; + Ok::<_, crate::Error>(()) + }) + .await?; + + batch.insert( + PROFILE_SUBTREE, + bincode::encode_to_vec( + self.0.keys().collect::>(), + *BINCODE_CONFIG, + )?, + ); + Ok(self) + } + + async fn read_profile_from_dir(path: &Path) -> crate::Result { + let json = fs::read(path.join(PROFILE_JSON_PATH)).await?; + let mut profile = serde_json::from_slice::(&json)?; + profile.path = PathBuf::from(path); + Ok(profile) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use pretty_assertions::{assert_eq, assert_str_eq}; + use std::collections::HashSet; + + #[test] + fn profile_test() -> Result<(), serde_json::Error> { + let profile = Profile { + path: PathBuf::new(), + metadata: ProfileMetadata { + name: String::from("Example Pack"), + icon: None, + game_version: String::from("1.18.2"), + loader: ModLoader::Vanilla, + loader_version: None, + format_version: CURRENT_FORMAT_VERSION, + }, + java: Some(JavaSettings { + install: Some(PathBuf::from("/usr/bin/java")), + extra_arguments: Some(Vec::new()), + }), + memory: Some(MemorySettings { + minimum: None, + maximum: 8192, + }), + resolution: Some(WindowSize(1920, 1080)), + hooks: Some(Hooks { + pre_launch: HashSet::new(), + wrapper: None, + post_exit: HashSet::new(), + }), + }; + let json = serde_json::json!({ + "metadata": { + "name": "Example Pack", + "game_version": "1.18.2", + "format_version": 1u32, + "loader": "vanilla", + }, + "java": { + "extra_arguments": [], + "install": "/usr/bin/java", + }, + "memory": { + "maximum": 8192u32, + }, + "resolution": (1920u16, 1080u16), + "hooks": {}, + }); + + assert_eq!(serde_json::to_value(profile.clone())?, json.clone()); + assert_str_eq!( + format!("{:?}", serde_json::from_value::(json)?), + format!("{:?}", profile), + ); + Ok(()) + } +} diff --git a/theseus/src/state/settings.rs b/theseus/src/state/settings.rs new file mode 100644 index 000000000..563998d11 --- /dev/null +++ b/theseus/src/state/settings.rs @@ -0,0 +1,125 @@ +//! Theseus settings file +use serde::{Deserialize, Serialize}; +use std::{ + collections::HashSet, + path::{Path, PathBuf}, +}; +use tokio::fs; + +// TODO: convert to semver? +const CURRENT_FORMAT_VERSION: u32 = 1; + +// Types +/// Global Theseus settings +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Settings { + pub memory: MemorySettings, + pub game_resolution: WindowSize, + pub custom_java_args: Vec, + pub java_8_path: Option, + pub java_17_path: Option, + pub default_user: Option, + pub hooks: Hooks, + pub max_concurrent_downloads: usize, + pub version: u32, +} + +impl Default for Settings { + fn default() -> Self { + Self { + memory: MemorySettings::default(), + game_resolution: WindowSize::default(), + custom_java_args: Vec::new(), + java_8_path: None, + java_17_path: None, + default_user: None, + hooks: Hooks::default(), + max_concurrent_downloads: 64, + version: CURRENT_FORMAT_VERSION, + } + } +} + +impl Settings { + #[tracing::instrument] + pub async fn init(file: &Path) -> crate::Result { + if file.exists() { + fs::read(&file) + .await + .map_err(|err| { + crate::ErrorKind::FSError(format!( + "Error reading settings file: {err}" + )) + .as_error() + }) + .and_then(|it| { + serde_json::from_slice::(&it) + .map_err(crate::Error::from) + }) + } else { + Ok(Settings::default()) + } + } + + #[tracing::instrument(skip(self))] + pub async fn sync(&self, to: &Path) -> crate::Result<()> { + fs::write(to, serde_json::to_vec_pretty(self)?) + .await + .map_err(|err| { + crate::ErrorKind::FSError(format!( + "Error saving settings to file: {err}" + )) + .as_error() + }) + } +} + +/// Minecraft memory settings +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +pub struct MemorySettings { + #[serde(skip_serializing_if = "Option::is_none")] + pub minimum: Option, + pub maximum: u32, +} + +impl Default for MemorySettings { + fn default() -> Self { + Self { + minimum: None, + maximum: 2048, + } + } +} + +/// Game window size +#[derive(Serialize, Deserialize, Debug, Clone, Copy)] +pub struct WindowSize(pub u16, pub u16); + +impl Default for WindowSize { + fn default() -> Self { + Self(854, 480) + } +} + +/// Game initialization hooks +#[derive(Serialize, Deserialize, Debug, Clone)] +#[serde(default)] +pub struct Hooks { + #[serde(skip_serializing_if = "HashSet::is_empty")] + pub pre_launch: HashSet, + #[serde(skip_serializing_if = "Option::is_none")] + pub wrapper: Option, + #[serde(skip_serializing_if = "HashSet::is_empty")] + pub post_exit: HashSet, +} + +impl Default for Hooks { + fn default() -> Self { + Self { + pre_launch: HashSet::::new(), + wrapper: None, + post_exit: HashSet::::new(), + } + } +} diff --git a/theseus/src/state/users.rs b/theseus/src/state/users.rs new file mode 100644 index 000000000..84d49ffe5 --- /dev/null +++ b/theseus/src/state/users.rs @@ -0,0 +1,79 @@ +//! User login info +use crate::{auth::Credentials, config::BINCODE_CONFIG}; + +const USER_DB_TREE: &[u8] = b"users"; + +/// The set of users stored in the launcher +#[derive(Clone)] +pub(crate) struct Users(pub(crate) sled::Tree); + +impl Users { + #[tracing::instrument(skip(db))] + pub fn init(db: &sled::Db) -> crate::Result { + Ok(Self(db.open_tree(USER_DB_TREE)?)) + } + + #[tracing::instrument(skip_all)] + pub fn insert( + &mut self, + credentials: &Credentials, + ) -> crate::Result<&Self> { + let id = credentials.id.as_bytes(); + self.0.insert( + id, + bincode::encode_to_vec(credentials, *BINCODE_CONFIG)?, + )?; + Ok(self) + } + + #[tracing::instrument(skip(self))] + pub fn contains(&self, id: uuid::Uuid) -> crate::Result { + Ok(self.0.contains_key(id.as_bytes())?) + } + + #[tracing::instrument(skip(self))] + pub fn get(&self, id: uuid::Uuid) -> crate::Result> { + self.0.get(id.as_bytes())?.map_or(Ok(None), |prof| { + bincode::decode_from_slice(&prof, *BINCODE_CONFIG) + .map_err(crate::Error::from) + .map(|it| Some(it.0)) + }) + } + + #[tracing::instrument(skip(self))] + pub fn remove(&mut self, id: uuid::Uuid) -> crate::Result<&Self> { + self.0.remove(id.as_bytes())?; + Ok(self) + } + + pub fn iter(&self) -> UserIter { + UserIter(self.0.iter().values(), false) + } +} + +alias_trait! { + pub UserInnerIter: Iterator>, Send, Sync +} + +/// An iterator over the set of users +#[derive(Debug)] +pub struct UserIter(I, bool); + +impl Iterator for UserIter { + type Item = crate::Result; + + #[tracing::instrument(skip(self))] + fn next(&mut self) -> Option { + if self.1 { + return None; + } + + let it = self.0.next()?; + let res = it.map_err(crate::Error::from).and_then(|it| { + Ok(bincode::decode_from_slice(&it, *BINCODE_CONFIG)?.0) + }); + + self.1 = res.is_err(); + Some(res) + } +} diff --git a/theseus/src/util.rs b/theseus/src/util.rs deleted file mode 100644 index 62633378a..000000000 --- a/theseus/src/util.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::path::{Path, PathBuf}; -use std::{env, io}; - -use path_clean::PathClean; - -// https://stackoverflow.com/a/54817755 -pub fn absolute_path(path: impl AsRef) -> io::Result { - let path = path.as_ref(); - - let absolute_path = if path.is_absolute() { - path.to_path_buf() - } else { - env::current_dir()?.join(path) - } - .clean(); - - Ok(absolute_path) -} diff --git a/theseus/src/util/fetch.rs b/theseus/src/util/fetch.rs new file mode 100644 index 000000000..eea15f705 --- /dev/null +++ b/theseus/src/util/fetch.rs @@ -0,0 +1,96 @@ +//! Functions for fetching infromation from the Internet +use crate::config::REQWEST_CLIENT; +use futures::prelude::*; +use std::{collections::LinkedList, convert::TryInto, path::Path, sync::Arc}; +use tokio::{ + fs::{self, File}, + io::AsyncWriteExt, + sync::{Semaphore, SemaphorePermit}, +}; + +const FETCH_ATTEMPTS: usize = 3; + +#[tracing::instrument(skip(_permit))] +pub async fn fetch<'a>( + url: &str, + sha1: Option<&str>, + _permit: &SemaphorePermit<'a>, +) -> crate::Result { + let mut attempts = LinkedList::new(); + for _ in 0..FETCH_ATTEMPTS { + attempts.push_back( + async { + let content = REQWEST_CLIENT.get(url).send().await?; + let bytes = content.bytes().await?; + + if let Some(hash) = sha1 { + let actual_hash = sha1_async(bytes.clone()).await; + if actual_hash != hash { + return Err(crate::ErrorKind::HashError( + actual_hash, + String::from(hash), + ) + .into()); + } + } + + Ok(bytes) + } + .boxed(), + ) + } + + log::debug!("Done downloading URL {url}"); + future::select_ok(attempts).map_ok(|it| it.0).await +} + +// This is implemented, as it will be useful in porting modpacks +// For now, allow it to be dead code +#[allow(dead_code)] +#[tracing::instrument(skip(sem))] +pub async fn fetch_mirrors( + urls: &[&str], + sha1: Option<&str>, + permits: u32, + sem: &Semaphore, +) -> crate::Result { + let _permits = sem.acquire_many(permits).await.unwrap(); + let sem = Arc::new(Semaphore::new(permits.try_into().unwrap())); + + future::select_ok(urls.into_iter().map(|url| { + let sha1 = sha1.map(String::from); + let url = String::from(*url); + let sem = Arc::clone(&sem); + + tokio::spawn(async move { + let permit = sem.acquire().await.unwrap(); + fetch(&url, sha1.as_deref(), &permit).await + }) + .map(Result::unwrap) + .boxed() + })) + .await + .map(|it| it.0) +} + +#[tracing::instrument(skip(bytes, _permit))] +pub async fn write<'a>( + path: &Path, + bytes: &[u8], + _permit: &SemaphorePermit<'a>, +) -> crate::Result<()> { + if let Some(parent) = path.parent() { + fs::create_dir_all(parent).await?; + } + + let mut file = File::create(path).await?; + log::debug!("Done writing file {}", path.display()); + file.write_all(bytes).await?; + Ok(()) +} + +async fn sha1_async(bytes: bytes::Bytes) -> String { + tokio::task::spawn_blocking(move || sha1::Sha1::from(bytes).hexdigest()) + .await + .unwrap() +} diff --git a/theseus/src/util/mod.rs b/theseus/src/util/mod.rs new file mode 100644 index 000000000..a0ac4cddb --- /dev/null +++ b/theseus/src/util/mod.rs @@ -0,0 +1,23 @@ +//! Theseus utility functions +pub mod fetch; +pub mod platform; + +/// Wrap a builder which uses a mut reference into one which outputs an owned value +macro_rules! wrap_ref_builder { + ($id:ident = $init:expr => $transform:block) => {{ + let mut it = $init; + { + let $id = &mut it; + $transform; + } + it + }}; +} + +/// Alias a trait, used to avoid needing nightly features +macro_rules! alias_trait { + ($scope:vis $name:ident : $bound:path $(, $bounds:path)*) => { + $scope trait $name: $bound $(+ $bounds)* {} + impl $name for T {} + } +} diff --git a/theseus/src/util/platform.rs b/theseus/src/util/platform.rs new file mode 100644 index 000000000..b403d8844 --- /dev/null +++ b/theseus/src/util/platform.rs @@ -0,0 +1,60 @@ +//! Platform-related code +use daedalus::minecraft::{Os, OsRule}; +use regex::Regex; + +// OS detection +pub trait OsExt { + /// Get the OS of the current system + fn native() -> Self; +} + +impl OsExt for Os { + fn native() -> Self { + match std::env::consts::OS { + "windows" => Self::Windows, + "macos" => Self::Osx, + "linux" => Self::Linux, + _ => Self::Unknown, + } + } +} + +// Bit width +#[cfg(target_pointer_width = "64")] +pub const ARCH_WIDTH: &str = "64"; + +#[cfg(target_pointer_width = "32")] +pub const ARCH_WIDTH: &str = "32"; + +// Platform rule handling +pub fn os_rule(rule: &OsRule) -> bool { + let mut rule_match = true; + + if let Some(ref arch) = rule.arch { + rule_match &= match arch.as_str() { + "x86" => cfg!(any(target_arch = "x86", target_arch = "x86_64")), + "arm" => cfg!(target_arch = "arm"), + _ => true, + }; + } + + if let Some(name) = &rule.name { + rule_match &= &Os::native() == name; + } + + if let Some(version) = &rule.version { + if let Ok(regex) = Regex::new(version.as_str()) { + rule_match &= + regex.is_match(&sys_info::os_release().unwrap_or_default()); + } + } + + rule_match +} + +pub fn classpath_separator() -> &'static str { + match Os::native() { + Os::Osx | Os::Linux | Os::Unknown => ":", + Os::Windows => ";", + } +} diff --git a/theseus_cli/Cargo.toml b/theseus_cli/Cargo.toml index e0ee01dba..149288044 100644 --- a/theseus_cli/Cargo.toml +++ b/theseus_cli/Cargo.toml @@ -8,14 +8,23 @@ edition = "2018" [dependencies] theseus = { path = "../theseus" } -daedalus = "0.1.12" +daedalus = {version = "0.1.15", features = ["bincode"]} tokio = { version = "1", features = ["full"] } tokio-stream = { version = "0.1", features = ["fs"] } futures = "0.3" argh = "0.1" paris = { version = "1.5", features = ["macros", "no_logger"] } dialoguer = "0.10" -eyre = "0.6" tabled = "0.5" dirs = "4.0" -uuid = {version = "0.8", features = ["v4", "serde"]} \ No newline at end of file +uuid = {version = "1.1", features = ["v4", "serde"]} +url = "2.2" + +color-eyre = "0.6" +eyre = "0.6" +tracing = "0.1" +tracing-error = "0.2" +tracing-futures = "0.2" +tracing-subscriber = {version = "0.3", features = ["env-filter"]} + +webbrowser = "0.7" \ No newline at end of file diff --git a/theseus_cli/src/main.rs b/theseus_cli/src/main.rs index 580631805..ff868b4b4 100644 --- a/theseus_cli/src/main.rs +++ b/theseus_cli/src/main.rs @@ -1,24 +1,52 @@ use eyre::Result; use futures::TryFutureExt; use paris::*; +use tracing_error::ErrorLayer; +use tracing_futures::WithSubscriber; +use tracing_subscriber::prelude::*; +use tracing_subscriber::{fmt, EnvFilter}; -mod subcommands; +#[macro_use] mod util; -#[derive(argh::FromArgs)] +mod subcommands; + +#[derive(argh::FromArgs, Debug)] /// The official Modrinth CLI pub struct Args { #[argh(subcommand)] - pub subcommand: subcommands::SubCommand, + pub subcommand: subcommands::Subcommand, } -#[tokio::main] -async fn main() -> Result<()> { +#[tracing::instrument] +fn main() -> Result<()> { let args = argh::from_env::(); - theseus::init().await?; - args.dispatch() - .inspect_err(|_| error!("An error has occurred!\n")) - .and_then(|_| async { Ok(theseus::save().await?) }) - .await + color_eyre::install()?; + let filter = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info"))?; + + let format = fmt::layer() + .without_time() + .with_writer(std::io::stderr) + .with_target(false) + .compact(); + + tracing_subscriber::registry() + .with(format) + .with(filter) + .with(ErrorLayer::default()) + .init(); + + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()? + .block_on( + async move { + args.dispatch() + .inspect_err(|_| error!("An error has occurred!\n")) + .await + } + .with_current_subscriber(), + ) } diff --git a/theseus_cli/src/subcommands/mod.rs b/theseus_cli/src/subcommands/mod.rs index 573e20f6d..04cc48080 100644 --- a/theseus_cli/src/subcommands/mod.rs +++ b/theseus_cli/src/subcommands/mod.rs @@ -1,17 +1,20 @@ use eyre::Result; mod profile; +mod user; -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand)] -pub enum SubCommand { +pub enum Subcommand { Profile(profile::ProfileCommand), + User(user::UserCommand), } impl crate::Args { pub async fn dispatch(&self) -> Result<()> { - match self.subcommand { - SubCommand::Profile(ref cmd) => cmd.dispatch(self).await, - } + dispatch!(self.subcommand, (self) => { + Subcommand::Profile, + Subcommand::User + }) } } diff --git a/theseus_cli/src/subcommands/profile.rs b/theseus_cli/src/subcommands/profile.rs index 3aacbc4b5..859749bb3 100644 --- a/theseus_cli/src/subcommands/profile.rs +++ b/theseus_cli/src/subcommands/profile.rs @@ -1,29 +1,26 @@ //! Profile management subcommand use crate::util::{ - confirm_async, prompt_async, select_async, table_path_display, + confirm_async, prompt_async, select_async, table, table_path_display, }; use daedalus::modded::LoaderVersion; use eyre::{ensure, Result}; +use futures::prelude::*; use paris::*; use std::path::{Path, PathBuf}; -use tabled::{Table, Tabled}; -use theseus::{ - data::{profiles::PROFILE_JSON_PATH, Metadata, Profile, Profiles}, - launcher::ModLoader, -}; +use tabled::Tabled; +use theseus::prelude::*; use tokio::fs; -use tokio_stream::{wrappers::ReadDirStream, StreamExt}; -use uuid::Uuid; +use tokio_stream::wrappers::ReadDirStream; -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "profile")] -/// profile management +/// manage Minecraft instances pub struct ProfileCommand { #[argh(subcommand)] action: ProfileSubcommand, } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand)] pub enum ProfileSubcommand { Add(ProfileAdd), @@ -33,7 +30,7 @@ pub enum ProfileSubcommand { Run(ProfileRun), } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "add")] /// add a new profile to Theseus pub struct ProfileAdd { @@ -54,23 +51,26 @@ impl ProfileAdd { ); let profile = self.profile.canonicalize()?; - let json_path = profile.join(PROFILE_JSON_PATH); + let json_path = profile.join("profile.json"); + ensure!( json_path.exists(), "Profile json does not exist. Perhaps you wanted `profile init` or `profile fetch`?" ); ensure!( - Profiles::get().await.unwrap().0.get(&profile).is_none(), + !profile::is_managed(&profile).await?, "Profile already managed by Theseus. If the contents of the profile are invalid or missing, the profile can be regenerated using `profile init` or `profile fetch`" ); - Profiles::insert_from(profile).await?; + + profile::add_path(&profile).await?; + State::sync().await?; success!("Profile added!"); Ok(()) } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] #[argh(subcommand, name = "init")] /// create a new profile and manage it with Theseus pub struct ProfileInit { @@ -106,13 +106,15 @@ impl ProfileInit { _largs: &ProfileCommand, ) -> Result<()> { // TODO: validate inputs from args early + let state = State::get().await?; + if self.path.exists() { ensure!( self.path.is_dir(), "Attempted to create profile in something other than a folder!" ); ensure!( - !self.path.join(PROFILE_JSON_PATH).exists(), + !self.path.join("profile.json").exists(), "Profile already exists! Perhaps you want `profile add` instead?" ); if ReadDirStream::new(fs::read_dir(&self.path).await?) @@ -138,8 +140,6 @@ impl ProfileInit { &self.path.canonicalize()?.display() ); - let metadata = Metadata::get().await?; - // TODO: abstract default prompting let name = match &self.name { Some(name) => name.clone(), @@ -157,7 +157,7 @@ impl ProfileInit { let game_version = match &self.game_version { Some(version) => version.clone(), None => { - let default = &metadata.minecraft.latest.release; + let default = &state.metadata.minecraft.latest.release; prompt_async( String::from("Game version"), @@ -206,8 +206,8 @@ impl ProfileInit { }; let loader_data = match loader { - ModLoader::Forge => &metadata.forge, - ModLoader::Fabric => &metadata.fabric, + ModLoader::Forge => &state.metadata.forge, + ModLoader::Fabric => &state.metadata.fabric, _ => eyre::bail!("Could not get manifest for loader {loader}. This is a bug in the CLI!"), }; @@ -238,8 +238,6 @@ impl ProfileInit { .map(PathBuf::from), }; - // We don't really care if the profile already is managed, as getting this far means that the user probably wanted to re-create a profile - drop(metadata); let mut profile = Profile::new(name, game_version, self.path.clone()).await?; @@ -251,8 +249,8 @@ impl ProfileInit { profile.with_loader(loader, Some(loader_version)); } - Profiles::insert(profile).await?; - Profiles::save().await?; + profile::add(profile).await?; + State::sync().await?; success!( "Successfully created instance, it is now available to use with Theseus!" @@ -261,7 +259,7 @@ impl ProfileInit { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// list all managed profiles #[argh(subcommand, name = "list")] pub struct ProfileList {} @@ -294,25 +292,43 @@ impl<'a> From<&'a Profile> for ProfileRow<'a> { } } +impl<'a> From<&'a Path> for ProfileRow<'a> { + fn from(it: &'a Path) -> Self { + Self { + name: "?", + path: it, + game_version: "?", + loader: &ModLoader::Vanilla, + loader_version: "?", + } + } +} + impl ProfileList { pub async fn run( &self, _args: &crate::Args, _largs: &ProfileCommand, ) -> Result<()> { - let profiles = Profiles::get().await?; - let profiles = profiles.0.values().map(ProfileRow::from); + let profiles = profile::list().await?; + let rows = profiles.iter().map(|(path, prof)| { + prof.as_ref().map_or_else( + || ProfileRow::from(path.as_path()), + ProfileRow::from, + ) + }); - let table = Table::new(profiles).with(tabled::Style::psql()).with( + let table = table(rows).with( tabled::Modify::new(tabled::Column(1..=1)) .with(tabled::MaxWidth::wrapping(40)), ); println!("{table}"); + Ok(()) } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// unmanage a profile #[argh(subcommand, name = "remove")] pub struct ProfileRemove { @@ -329,10 +345,13 @@ impl ProfileRemove { ) -> Result<()> { let profile = self.profile.canonicalize()?; info!("Removing profile {} from Theseus", self.profile.display()); + if confirm_async(String::from("Do you wish to continue"), true).await? { - if Profiles::remove(&profile).await?.is_none() { + if !profile::is_managed(&profile).await? { warn!("Profile was not managed by Theseus!"); } else { + profile::remove(&profile).await?; + State::sync().await?; success!("Profile removed!"); } } else { @@ -343,7 +362,7 @@ impl ProfileRemove { } } -#[derive(argh::FromArgs)] +#[derive(argh::FromArgs, Debug)] /// run a profile #[argh(subcommand, name = "run")] pub struct ProfileRun { @@ -351,18 +370,9 @@ pub struct ProfileRun { /// the profile to run profile: PathBuf, - // TODO: auth - #[argh(option, short = 't')] - /// the Minecraft token to use for player login. Should be replaced by auth when that is a thing. - token: String, - - #[argh(option, short = 'n')] - /// the uername to use for running the game - name: String, - - #[argh(option, short = 'i')] - /// the account id to use for running the game - id: Uuid, + #[argh(option)] + /// the user to authenticate with + user: Option, } impl ProfileRun { @@ -372,24 +382,28 @@ impl ProfileRun { _largs: &ProfileCommand, ) -> Result<()> { info!("Starting profile at path {}...", self.profile.display()); - let ref profiles = Profiles::get().await?.0; let path = self.profile.canonicalize()?; - let profile = profiles - .get(&path) - .ok_or( - eyre::eyre!( - "Profile not managed by Theseus (if it exists, try using `profile add` first!)" - ) - )?; - let credentials = theseus::launcher::Credentials { - id: self.id.clone(), - username: self.name.clone(), - access_token: self.token.clone(), - }; + ensure!( + profile::is_managed(&path).await?, + "Profile not managed by Theseus (if it exists, try using `profile add` first!)", + ); - let mut proc = profile.run(&credentials).await?; - profile.wait_for(&mut proc).await?; + let id = future::ready(self.user.ok_or(())) + .or_else(|_| async move { + let state = State::get().await?; + let settings = state.settings.read().await; + + settings.default_user + .ok_or(eyre::eyre!( + "Could not find any users, please add one using the `user add` command." + )) + }) + .await?; + let credentials = auth::refresh(id, false).await?; + + let mut proc = profile::run(&path, &credentials).await?; + profile::wait_for(&mut proc).await?; success!("Process exited successfully!"); Ok(()) @@ -397,14 +411,14 @@ impl ProfileRun { } impl ProfileCommand { - pub async fn dispatch(&self, args: &crate::Args) -> Result<()> { - match &self.action { - ProfileSubcommand::Add(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Init(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::List(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Remove(ref cmd) => cmd.run(args, self).await, - ProfileSubcommand::Run(ref cmd) => cmd.run(args, self).await, - } + pub async fn run(&self, args: &crate::Args) -> Result<()> { + dispatch!(&self.action, (args, self) => { + ProfileSubcommand::Add, + ProfileSubcommand::Init, + ProfileSubcommand::List, + ProfileSubcommand::Remove, + ProfileSubcommand::Run + }) } } diff --git a/theseus_cli/src/subcommands/user.rs b/theseus_cli/src/subcommands/user.rs new file mode 100644 index 000000000..36c813c94 --- /dev/null +++ b/theseus_cli/src/subcommands/user.rs @@ -0,0 +1,178 @@ +//! User management subcommand +use crate::util::{confirm_async, table}; +use eyre::Result; +use paris::*; +use tabled::Tabled; +use theseus::prelude::*; +use tokio::sync::oneshot; + +#[derive(argh::FromArgs, Debug)] +#[argh(subcommand, name = "user")] +/// manage Minecraft accounts +pub struct UserCommand { + #[argh(subcommand)] + action: UserSubcommand, +} + +#[derive(argh::FromArgs, Debug)] +#[argh(subcommand)] +pub enum UserSubcommand { + Add(UserAdd), + List(UserList), + Remove(UserRemove), + SetDefault(UserDefault), +} + +#[derive(argh::FromArgs, Debug)] +/// add a new user to Theseus +#[argh(subcommand, name = "add")] +pub struct UserAdd { + #[argh(option)] + /// the browser to authenticate using + browser: Option, +} + +impl UserAdd { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Adding new user account to Theseus"); + info!("A browser window will now open, follow the login flow there."); + + let (tx, rx) = oneshot::channel::(); + let flow = tokio::spawn(auth::authenticate(tx)); + + let url = rx.await?; + match self.browser { + Some(browser) => webbrowser::open_browser(browser, url.as_str()), + None => webbrowser::open(url.as_str()), + }?; + + let credentials = flow.await??; + State::sync().await?; + success!("Logged in user {}.", credentials.username); + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// list all known users +#[argh(subcommand, name = "list")] +pub struct UserList {} + +#[derive(Tabled)] +struct UserRow<'a> { + username: &'a str, + id: uuid::Uuid, + default: bool, +} + +impl<'a> UserRow<'a> { + pub fn from( + credentials: &'a Credentials, + default: Option, + ) -> Self { + Self { + username: &credentials.username, + id: credentials.id, + default: Some(credentials.id) == default, + } + } +} + +impl UserList { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + let state = State::get().await?; + let default = state.settings.read().await.default_user; + + let users = auth::users().await?; + let rows = users.iter().map(|user| UserRow::from(user, default)); + + let table = table(rows); + println!("{table}"); + + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// remove a user +#[argh(subcommand, name = "remove")] +pub struct UserRemove { + /// the user to remove + #[argh(positional)] + user: uuid::Uuid, +} + +impl UserRemove { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Removing user {}", self.user.as_hyphenated()); + + if confirm_async(String::from("Do you wish to continue"), true).await? { + if !auth::has_user(self.user).await? { + warn!("Profile was not managed by Theseus!"); + } else { + auth::remove_user(self.user).await?; + State::sync().await?; + success!("User removed!"); + } + } else { + error!("Aborted!"); + } + + Ok(()) + } +} + +#[derive(argh::FromArgs, Debug)] +/// set the default user +#[argh(subcommand, name = "set-default")] +pub struct UserDefault { + /// the user to set as default + #[argh(positional)] + user: uuid::Uuid, +} + +impl UserDefault { + pub async fn run( + &self, + _args: &crate::Args, + _largs: &UserCommand, + ) -> Result<()> { + info!("Setting user {} as default", self.user.as_hyphenated()); + + // TODO: settings API + let state: std::sync::Arc = State::get().await?; + let mut settings = state.settings.write().await; + + if settings.default_user == Some(self.user) { + warn!("User is already the default!"); + } else { + settings.default_user = Some(self.user); + success!("User set as default!"); + } + + Ok(()) + } +} + +impl UserCommand { + pub async fn run(&self, args: &crate::Args) -> Result<()> { + dispatch!(&self.action, (args, self) => { + UserSubcommand::Add, + UserSubcommand::List, + UserSubcommand::Remove, + UserSubcommand::SetDefault + }) + } +} diff --git a/theseus_cli/src/util.rs b/theseus_cli/src/util.rs index b40391cd7..6fc27af08 100644 --- a/theseus_cli/src/util.rs +++ b/theseus_cli/src/util.rs @@ -1,6 +1,7 @@ use dialoguer::{Confirm, Input, Select}; use eyre::Result; use std::{borrow::Cow, path::Path}; +use tabled::{Table, Tabled}; // TODO: make primarily async to avoid copies @@ -56,7 +57,11 @@ pub async fn confirm_async(prompt: String, default: bool) -> Result { tokio::task::spawn_blocking(move || confirm(&prompt, default)).await? } -// Table display helpers +// Table helpers +pub fn table(rows: impl IntoIterator) -> Table { + Table::new(rows).with(tabled::Style::psql()) +} + pub fn table_path_display(path: &Path) -> String { let mut res = path.display().to_string(); @@ -67,6 +72,20 @@ pub fn table_path_display(path: &Path) -> String { res } +// Dispatch macros +macro_rules! dispatch { + ($on:expr, $args:tt => {$($option:path),+}) => { + match $on { + $($option (ref cmd) => dispatch!(@apply cmd => $args)),+ + } + }; + + (@apply $cmd:expr => ($($args:expr),*)) => {{ + use tracing_futures::WithSubscriber; + $cmd.run($($args),*).with_current_subscriber().await + }}; +} + // Internal helpers fn print_prompt(prompt: &str) { println!( diff --git a/theseus_gui/locales/en.json b/theseus_gui/locales/en.json deleted file mode 100644 index a0a665f82..000000000 --- a/theseus_gui/locales/en.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "pages": { - "description": "Description", - "gallery": "Gallery", - "changelog": "Changelog", - "versions": "Versions", - "settings": "Settings", - "reports": "Reports", - "moderation": "Moderation", - "notifications": "Notifications", - "about": "About", - "following": "Following", - "all": "All" - }, - "generic": { - "labels": { - "license": "License", - "project_id": "Project ID", - "project_status": "Project status" - }, - "actions": { - "edit": "Edit", - "follow": "Follow", - "unfollow": "Unfollow", - "report": "Report", - "new_project": "New project", - "download": "Download", - "save": "Save", - "cancel": "Cancel", - "discard": "Discard changes" - }, - "external": { - "github_profile": "GitHub profile", - "discord": "Discord", - "github": "GitHub", - "issues": "Issues", - "source": "Source", - "wiki": "Wiki", - "patreon": "Patreon", - "paypal": "PayPal", - "buy_me_a_coffee": "Buy Me a Coffee", - "github_sponsors": "GitHub Sponsors", - "donate": "Donate", - "kofi": "Ko-Fi" - }, - "environments": { - "label": "Environment", - "server_side": "Server side", - "client_side": "Client side", - "values": { - "required": "Required", - "unsupported": "Unsupported", - "optional": "Optional", - "unknown": "Unknown" - } - }, - "byline": "by {author}" - }, - "project": { - "types": { - "mod": { - "singular": "Mod", - "plural": "Mods", - "search": "Search mods..." - }, - "modpack": { - "singular": "Modpack", - "plural": "Modpacks", - "search": "Search modpacks..." - } - }, - "sidebar_headings": { - "external_resources": "External resources", - "featured_versions": "Featured versions", - "project_members": "Project members", - "technical_information": "Technical information" - } - }, - "status": { - "approved": "Approved", - "rejected": "Rejected", - "draft": "Draft", - "unlisted": "Unlisted", - "processing": "Under review", - "unknown": "Unknown" - }, - "release_channels": { - "release": "Release", - "beta": "Beta", - "alpha": "Alpha" - }, - "roles": { - "developer": "Developer", - "admin": "Admin", - "moderator": "Moderator" - }, - "stats": { - "joined": "Joined {ago}", - "notified": "Notified {ago}", - "downloads": "{downloads, plural, one {1 download} other {# downloads}}", - "followers_of_projects": "{followers, plural, one {1 follower of projects} other {# followers of projects}}", - "followers": "{followers, plural, one {1 follower} other {# followers}}", - "user_id": "User ID: {id}", - "created": "Created {ago}", - "updated": "Updated {ago}" - }, - "tags": { - "technology": "Technology", - "adventure": "Adventure", - "magic": "Magic", - "utility": "Utility", - "decoration": "Decoration", - "library": "Library", - "cursed": "Cursed", - "worldgen": "World generation", - "storage": "Storage", - "food": "Food", - "equipment": "Equipment", - "miscellaneous": "Miscellaneous", - "optimization": "Optimization", - "fabric": "Fabric", - "quilt": "Quilt", - "forge": "Forge", - "server": "Server", - "client": "Client", - "good": "Good", - "trash": "Trash", - "misc": "Miscellaneous" - } -} diff --git a/theseus_gui/package.json b/theseus_gui/package.json index 1d541a10e..5ac527eb3 100644 --- a/theseus_gui/package.json +++ b/theseus_gui/package.json @@ -1,21 +1,19 @@ { "scripts": { "dev": "tauri dev", - "dev:web": "svelte-kit dev", - "kill:web": "kill-port 3000", + "dev:web": "vite", + "kill:web": "kill-port 5173", "tauri": "tauri", "build": "tauri build", - "build:web": "svelte-kit build", + "build:web": "vite build", "test": "cargo ../test --manifest-path ./src-tauri/Cargo.toml", "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. src", - "check": "cargo check --manifest-path src-tauri/Cargo.toml && svelte-check --tsconfig ./tsconfig.json", - "generate": "node ./scripts/generate.js", - "postinstall": "pnpm generate" + "check": "cargo check --manifest-path src-tauri/Cargo.toml && svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { "@sveltejs/adapter-static": "next", "@sveltejs/kit": "next", - "@tauri-apps/cli": "^1.0.0-rc.5", + "@tauri-apps/cli": "^1.0.4", "@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/parser": "^5.10.1", "eslint": "^7.32.0", @@ -27,8 +25,10 @@ "prettier-plugin-svelte": "^2.5.0", "svelte": "^3.48.0", "svelte-check": "^2.2.6", + "svelte-intl-precompile": "^0.11.1", "tslib": "^2.3.1", - "typescript": "~4.5.4" + "typescript": "~4.5.4", + "vite": "^3.0.0" }, "type": "module", "dependencies": { @@ -38,10 +38,10 @@ "@iconify-json/heroicons-outline": "^1.1.1", "@iconify-json/heroicons-solid": "^1.1.1", "@iconify-json/lucide": "^1.1.5", - "@tauri-apps/api": "^1.0.0-rc.1", - "omorphia": "0.0.19", - "svelte-intl-precompile": "^0.9.2", - "svrollbar": "^0.10.4", - "unplugin-icons": "^0.13.2" + "@tauri-apps/api": "^1.0.2", + "omorphia": "0.0.67", + "svrollbar": "^0.12.0", + "unplugin-icons": "^0.14.7", + "highlight.js": "11.5.1" } } diff --git a/theseus_gui/pnpm-lock.yaml b/theseus_gui/pnpm-lock.yaml index cd529ca6e..4cb9495e2 100644 --- a/theseus_gui/pnpm-lock.yaml +++ b/theseus_gui/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: '@babel/core': ^7.17.10 @@ -9,56 +9,60 @@ specifiers: '@iconify-json/lucide': ^1.1.5 '@sveltejs/adapter-static': next '@sveltejs/kit': next - '@tauri-apps/api': ^1.0.0-rc.1 - '@tauri-apps/cli': ^1.0.0-rc.5 + '@tauri-apps/api': ^1.0.2 + '@tauri-apps/cli': ^1.0.4 '@typescript-eslint/eslint-plugin': ^5.10.1 '@typescript-eslint/parser': ^5.10.1 eslint: ^7.32.0 eslint-config-prettier: ^8.3.0 eslint-plugin-svelte3: ^3.2.1 + highlight.js: 11.5.1 kill-port-process: ^3.0.1 node-fetch: ^3.2.4 - omorphia: 0.0.19 + omorphia: 0.0.67 prettier: ^2.5.1 prettier-plugin-svelte: ^2.5.0 svelte: ^3.48.0 svelte-check: ^2.2.6 - svelte-intl-precompile: ^0.9.2 - svrollbar: ^0.10.4 + svelte-intl-precompile: ^0.11.1 + svrollbar: ^0.12.0 tslib: ^2.3.1 typescript: ~4.5.4 - unplugin-icons: ^0.13.2 + unplugin-icons: ^0.14.7 + vite: ^3.0.0 dependencies: - '@babel/core': 7.17.10 - '@fontsource/inter': 4.5.4 - '@iconify-json/carbon': 1.1.1 - '@iconify-json/heroicons-outline': 1.1.1 - '@iconify-json/heroicons-solid': 1.1.1 - '@iconify-json/lucide': 1.1.5 - '@tauri-apps/api': 1.0.0-rc.1 - omorphia: 0.0.19_svelte@3.48.0 - svelte-intl-precompile: 0.9.2_svelte@3.48.0 - svrollbar: 0.10.4 - unplugin-icons: 0.13.2 + '@babel/core': 7.18.9 + '@fontsource/inter': 4.5.11 + '@iconify-json/carbon': 1.1.7 + '@iconify-json/heroicons-outline': 1.1.2 + '@iconify-json/heroicons-solid': 1.1.2 + '@iconify-json/lucide': 1.1.38 + '@tauri-apps/api': 1.0.2 + highlight.js: 11.5.1 + omorphia: 0.0.67_svelte@3.49.0+vite@3.0.4 + svrollbar: 0.12.0 + unplugin-icons: 0.14.8_vite@3.0.4 devDependencies: - '@sveltejs/adapter-static': 1.0.0-next.29 - '@sveltejs/kit': 1.0.0-next.326_svelte@3.48.0 - '@tauri-apps/cli': 1.0.0-rc.5 - '@typescript-eslint/eslint-plugin': 5.12.1_78ba2542c270c83b2a80bb1c125195b6 - '@typescript-eslint/parser': 5.12.1_eslint@7.32.0+typescript@4.5.5 + '@sveltejs/adapter-static': 1.0.0-next.38 + '@sveltejs/kit': 1.0.0-next.402_svelte@3.49.0+vite@3.0.4 + '@tauri-apps/cli': 1.0.5 + '@typescript-eslint/eslint-plugin': 5.31.0_4jrpqvszkjcwtaspamifhp3x7e + '@typescript-eslint/parser': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca eslint: 7.32.0 - eslint-config-prettier: 8.4.0_eslint@7.32.0 - eslint-plugin-svelte3: 3.4.0_eslint@7.32.0+svelte@3.48.0 - kill-port-process: 3.0.1 - node-fetch: 3.2.4 - prettier: 2.5.1 - prettier-plugin-svelte: 2.6.0_prettier@2.5.1+svelte@3.48.0 - svelte: 3.48.0 - svelte-check: 2.4.5_c41d0477867e5b4ada3cfb73a51f73fe - tslib: 2.3.1 + eslint-config-prettier: 8.5.0_eslint@7.32.0 + eslint-plugin-svelte3: 3.4.1_k4rvtr32uzrs6rwp57u73ssa6q + kill-port-process: 3.1.0 + node-fetch: 3.2.10 + prettier: 2.7.1 + prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi + svelte: 3.49.0 + svelte-check: 2.8.0_jm7k62256lskgsykp6r2fix7f4 + svelte-intl-precompile: 0.11.1_svelte@3.49.0 + tslib: 2.4.0 typescript: 4.5.5 + vite: 3.0.4 packages: @@ -67,8 +71,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.10 - dev: false + '@jridgewell/trace-mapping': 0.3.14 /@antfu/install-pkg/0.1.0: resolution: {integrity: sha512-VaIJd3d1o7irZfK1U0nvBsHMyjkuyMP3HKYVV53z8DKyulkHKmjhhtccXO51WSPeeSHIeoJEoNOKavYpS7jkZw==} @@ -77,312 +80,328 @@ packages: find-up: 5.0.0 dev: false - /@antfu/utils/0.3.0: - resolution: {integrity: sha512-UU8TLr/EoXdg7OjMp0h9oDoIAVr+Z/oW9cpOxQQyrsz6Qzd2ms/1CdWx8fl2OQdFpxGmq5Vc4TwfLHId6nAZjA==} - dependencies: - '@types/throttle-debounce': 2.1.0 - dev: false - - /@antfu/utils/0.5.0: - resolution: {integrity: sha512-MrAQ/MrPSxbh1bBrmwJjORfJymw4IqSHFBXqvxaga3ZdDM+/zokYF8DjyJpSjY2QmpmgQrajDUBJOWrYeARfzA==} + /@antfu/utils/0.5.2: + resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} dev: false /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.16.10 + '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.16.10 - dev: false + '@babel/highlight': 7.18.6 - /@babel/compat-data/7.17.10: - resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} + /@babel/compat-data/7.18.8: + resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} engines: {node: '>=6.9.0'} - dev: false - /@babel/core/7.17.10: - resolution: {integrity: sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==} + /@babel/core/7.18.9: + resolution: {integrity: sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 - '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 - '@babel/helper-module-transforms': 7.17.7 - '@babel/helpers': 7.17.9 - '@babel/parser': 7.17.10 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.18.9 + '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9 + '@babel/helper-module-transforms': 7.18.9 + '@babel/helpers': 7.18.9 + '@babel/parser': 7.18.9 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 convert-source-map: 1.8.0 - debug: 4.3.3 + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.1 semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/generator/7.17.10: - resolution: {integrity: sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg==} + /@babel/generator/7.18.9: + resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - '@jridgewell/gen-mapping': 0.1.1 + '@babel/types': 7.18.9 + '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 - dev: false - /@babel/helper-compilation-targets/7.17.10_@babel+core@7.17.10: - resolution: {integrity: sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==} + /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.9: + resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.17.10 - '@babel/core': 7.17.10 - '@babel/helper-validator-option': 7.16.7 - browserslist: 4.20.3 + '@babel/compat-data': 7.18.8 + '@babel/core': 7.18.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.3 semver: 6.3.0 - dev: false - /@babel/helper-environment-visitor/7.16.7: - resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name/7.18.9: + resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - dev: false + '@babel/template': 7.18.6 + '@babel/types': 7.18.9 - /@babel/helper-function-name/7.17.9: - resolution: {integrity: sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==} + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/types': 7.17.10 - dev: false + '@babel/types': 7.18.9 - /@babel/helper-hoist-variables/7.16.7: - resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - dev: false + '@babel/types': 7.18.9 - /@babel/helper-module-imports/7.16.7: - resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} + /@babel/helper-module-transforms/7.18.9: + resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - dev: false - - /@babel/helper-module-transforms/7.17.7: - resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-simple-access': 7.17.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/helper-validator-identifier': 7.16.7 - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.18.6 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 transitivePeerDependencies: - supports-color - dev: false - /@babel/helper-plugin-utils/7.16.7: - resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} + /@babel/helper-plugin-utils/7.18.9: + resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} engines: {node: '>=6.9.0'} - dev: false + dev: true - /@babel/helper-simple-access/7.17.7: - resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} + /@babel/helper-simple-access/7.18.6: + resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - dev: false + '@babel/types': 7.18.9 - /@babel/helper-split-export-declaration/7.16.7: - resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.17.10 - dev: false + '@babel/types': 7.18.9 - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} + /@babel/helper-validator-identifier/7.18.6: + resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.16.7: - resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} - dev: false - /@babel/helpers/7.17.9: - resolution: {integrity: sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==} + /@babel/helpers/7.18.9: + resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 - '@babel/types': 7.17.10 + '@babel/template': 7.18.6 + '@babel/traverse': 7.18.9 + '@babel/types': 7.18.9 transitivePeerDependencies: - supports-color - dev: false - /@babel/highlight/7.16.10: - resolution: {integrity: sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==} + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-validator-identifier': 7.18.6 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser/7.17.10: - resolution: {integrity: sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==} + /@babel/parser/7.18.9: + resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} engines: {node: '>=6.0.0'} hasBin: true - dev: false + dependencies: + '@babel/types': 7.18.9 - /@babel/template/7.16.7: - resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} + /@babel/runtime/7.18.9: + resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 + regenerator-runtime: 0.13.9 dev: false - /@babel/traverse/7.17.10: - resolution: {integrity: sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw==} + /@babel/template/7.18.6: + resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 - '@babel/helper-environment-visitor': 7.16.7 - '@babel/helper-function-name': 7.17.9 - '@babel/helper-hoist-variables': 7.16.7 - '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.10 - '@babel/types': 7.17.10 - debug: 4.3.3 + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.18.9 + '@babel/types': 7.18.9 + + /@babel/traverse/7.18.9: + resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.18.9 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.18.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.18.9 + '@babel/types': 7.18.9 + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/types/7.17.10: - resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} + /@babel/types/7.18.9: + resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.16.7 + '@babel/helper-validator-identifier': 7.18.6 to-fast-properties: 2.0.0 - dev: false - /@csstools/postcss-color-function/1.1.0_postcss@8.4.12: - resolution: {integrity: sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==} + /@csstools/postcss-cascade-layers/1.0.5_postcss@8.4.14: + resolution: {integrity: sha512-Id/9wBT7FkgFzdEpiEWrsVd4ltDxN0rI0QS0SChbeQiSuux3z21SJCRLu6h2cvCEUmaRi+VD0mHFj+GJD4GFnw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-font-format-keywords/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-hwb-function/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-ic-unit/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /@csstools/postcss-is-pseudo-class/2.0.2_postcss@8.4.12: - resolution: {integrity: sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.4 - dependencies: - postcss: 8.4.12 + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /@csstools/postcss-normalize-display-values/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==} + /@csstools/postcss-color-function/1.1.1_postcss@8.4.14: + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.3 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-oklab-function/1.1.0_postcss@8.4.12: - resolution: {integrity: sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==} + /@csstools/postcss-font-format-keywords/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.12: + /@csstools/postcss-hwb-function/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-ic-unit/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-is-pseudo-class/2.0.7_postcss@8.4.14: + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: false + + /@csstools/postcss-normalize-display-values/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-oklab-function/1.1.1_postcss@8.4.14: + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-progressive-custom-properties/1.3.0_postcss@8.4.14: resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-stepped-value-functions/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==} + /@csstools/postcss-stepped-value-functions/1.0.1_postcss@8.4.14: + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.3 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /@csstools/postcss-unset-value/1.0.0_postcss@8.4.12: - resolution: {integrity: sha512-T5ZyNSw9G0x0UDFiXV40a7VjKw2b+l4G+S0sctKqxhx8cg9QtMUAGwJBVU9mHPDPoZEmwm0tEoukjl4zb9MU7Q==} + /@csstools/postcss-trigonometric-functions/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-unset-value/1.0.2_postcss@8.4.14: + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.3 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 + dev: false + + /@csstools/selector-specificity/2.0.2_444rcjjorr3kpoqtvoodsr46pu: + resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + postcss-selector-parser: ^6.0.10 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 dev: false /@eslint/eslintrc/0.4.3: @@ -390,9 +409,9 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.3 + debug: 4.3.4 espree: 7.3.1 - globals: 13.12.1 + globals: 13.17.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -402,44 +421,44 @@ packages: - supports-color dev: true - /@fontsource/inter/4.5.4: - resolution: {integrity: sha512-D0icTFpt9bWvB/OEXMztYf0bhUQZoDIYpsco5C7GVfxgKDRl8Jdn3N2aHHQqwjgRUUvRuyMv8HrRM8Hrt4U52w==} + /@fontsource/inter/4.5.11: + resolution: {integrity: sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==} dev: false - /@formatjs/ecma402-abstract/1.11.4: - resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} + /@formatjs/ecma402-abstract/1.11.8: + resolution: {integrity: sha512-fgLqyWlwmTEuqV/TSLEL/t9JOmHNLFvCdgzXB0jc2w+WOItPCOJ1T0eyN6fQBQKRPfSqqNlu+kWj7ijcOVTVVQ==} dependencies: - '@formatjs/intl-localematcher': 0.2.25 - tslib: 2.3.1 - dev: false + '@formatjs/intl-localematcher': 0.2.28 + tslib: 2.4.0 + dev: true - /@formatjs/icu-messageformat-parser/2.1.0: - resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} + /@formatjs/icu-messageformat-parser/2.1.4: + resolution: {integrity: sha512-3PqMvKWV1oyok0BuiXUAHIaotdhdTJw6OICqCZbfUgKT+ZRwRWO4IlCgvXJeCITaKS5p+PY0XXKjf/vUyIpWjQ==} dependencies: - '@formatjs/ecma402-abstract': 1.11.4 - '@formatjs/icu-skeleton-parser': 1.3.6 - tslib: 2.3.1 - dev: false + '@formatjs/ecma402-abstract': 1.11.8 + '@formatjs/icu-skeleton-parser': 1.3.10 + tslib: 2.4.0 + dev: true - /@formatjs/icu-skeleton-parser/1.3.6: - resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} + /@formatjs/icu-skeleton-parser/1.3.10: + resolution: {integrity: sha512-kXJmtLDqFF5aLTf8IxdJXnhrIX1Qb4Qp3a9jqRecGDYfzOa9hMhi9U0nKyhrJJ4cXxBzptcgb+LWkyeHL6nlBQ==} dependencies: - '@formatjs/ecma402-abstract': 1.11.4 - tslib: 2.3.1 - dev: false + '@formatjs/ecma402-abstract': 1.11.8 + tslib: 2.4.0 + dev: true - /@formatjs/intl-localematcher/0.2.25: - resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} + /@formatjs/intl-localematcher/0.2.28: + resolution: {integrity: sha512-FLsc6Gifs1np/8HnCn/7Q+lHMmenrD5fuDhRT82yj0gi9O19kfaFwjQUw1gZsyILuRyT93GuzdifHj7TKRhBcw==} dependencies: - tslib: 2.3.1 - dev: false + tslib: 2.4.0 + dev: true /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.3 + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -449,91 +468,465 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@iconify-json/carbon/1.1.1: - resolution: {integrity: sha512-ClOYc+82CKlDAKH1tfDTJTzNz4oHhYD04ALA5uemw9PdWXg05yIJb9bxWjSz4UgdUbH5N/yd8s9hNPI3h6jnlg==} - dependencies: - '@iconify/types': 1.0.12 - dev: false - - /@iconify-json/fa-regular/1.1.1: - resolution: {integrity: sha512-KFMX9DurKhOUpKqGlYRqlnCbcieEKo35961pnyf7NqUvHefBk1PZCU/kKbM2ib3piy8cn3V7RGvmZKq/INKGAA==} - dependencies: - '@iconify/types': 1.0.12 - dev: false - - /@iconify-json/heroicons-outline/1.1.1: - resolution: {integrity: sha512-Jy/aFbNQdszRxzhBvHB2AVu/IeMcK/YG3qJVf3XeqvBvhcPq/rWFEmo7jshzBclR/wbt9ylcBEUY1qRFcCXS9Q==} - dependencies: - '@iconify/types': 1.0.12 - dev: false - - /@iconify-json/heroicons-solid/1.1.1: - resolution: {integrity: sha512-yTq+PjF543FEp37gqLLQLMGBhZXaHJOY8wLPsWyQZzIDJ9h773ofvp32fgMh9YlgQT4MaeDH2VULvFBBCRmJgQ==} - dependencies: - '@iconify/types': 1.0.12 - dev: false - - /@iconify-json/lucide/1.1.21: - resolution: {integrity: sha512-kvVhoUjku7bnRgWd5FaVTGHJx4KQsDtfey7hQbR30Zr7Nipkx41y3bhnjwsWthpItVAS/VoR7t8NtcghedY3Pg==} + /@iconify-json/carbon/1.1.7: + resolution: {integrity: sha512-QULSpNWKaX4auIbjITDynfALdJYvOOy/xZb+aLOqCgvpBcmbz5tbqvow4r25FWtVsi4FHVpNQ8vyJZXsD1Hlxg==} dependencies: '@iconify/types': 1.1.0 dev: false - /@iconify-json/lucide/1.1.5: - resolution: {integrity: sha512-FOyVw5sdRyDpgR2wVxBxycAOSjVZPlZFaw5umn87JjdXB+L6MIab53Pnz7e/ub79jJTtofHZJ6OBAZ67Cw3Lzg==} + /@iconify-json/fa-regular/1.1.2: + resolution: {integrity: sha512-sC6bRUcdLru0hDOTIosTgElBEMCnpvJkwGmGz/9TCrmb3ALoXjhu/ZzzXpBdQnnwtmqASPLdSpeWxcfwgHquCQ==} dependencies: - '@iconify/types': 1.0.12 + '@iconify/types': 1.1.0 dev: false - /@iconify/types/1.0.12: - resolution: {integrity: sha512-6er6wSGF3hgc1JEZqiGpg21CTCjHBYOUwqLmb2Idzkjiw6ogalGP0ZMLVutCzah+0WB4yP+Zd2oVPN8jvJ+Ftg==} + /@iconify-json/heroicons-outline/1.1.2: + resolution: {integrity: sha512-XsOWcUhdvu3eNURW40hlC2Wrc0cSNWwD+p+UeX57h/qwwDzibIMLeBuqhz9d1FjxHeiM86WQUc4QFB1SK2BGVw==} + dependencies: + '@iconify/types': 1.1.0 + dev: false + + /@iconify-json/heroicons-solid/1.1.2: + resolution: {integrity: sha512-hSh732CWFsi34qRfx3JO3UNFf7sg7xkzOUG9j9u1w+gcAOLVUWzpyums/H1KycuLphsHuuWZ9fpNq3HwMXCsuQ==} + dependencies: + '@iconify/types': 1.1.0 + dev: false + + /@iconify-json/lucide/1.1.38: + resolution: {integrity: sha512-0sDKnWign8yc3ndWczI4QliSMUi/AUngwlufprDJlR7feXILzpEfp5yyYlfPRE7gQrup6ey8dMX1vDaT8bet/g==} + dependencies: + '@iconify/types': 1.1.0 + dev: false + + /@iconify-json/simple-icons/1.1.20: + resolution: {integrity: sha512-IP5yZAoRU82fR5szwbBLnECWgY4JuZDgqEEXzioaOFygqZRP8Ku9ONgPK/qe2vwsUB6RWM5jTm0S4KHtMiTOEQ==} + dependencies: + '@iconify/types': 1.1.0 dev: false /@iconify/types/1.1.0: resolution: {integrity: sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==} dev: false - /@iconify/utils/1.0.23: - resolution: {integrity: sha512-Ktdmpe4mkMXQAnnDUz3s6s5aY/BeVPwHC1d5IhG1bgrWVNWFQNUj8cQPMbHpNCSD9MRC5yGxm9/PGPpOWGJLAg==} + /@iconify/utils/1.0.33: + resolution: {integrity: sha512-vGeAqo7aGPxOQmGdVoXFUOuyN+0V7Lcrx2EvaiRjxUD1x6Om0Tvq2bdm7E24l2Pz++4S0mWMCVFXe/17EtKImQ==} dependencies: '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.3.0 - '@iconify/types': 1.0.12 - debug: 4.3.3 + '@antfu/utils': 0.5.2 + '@iconify/types': 1.1.0 + debug: 4.3.4 kolorist: 1.5.1 - local-pkg: 0.4.1 + local-pkg: 0.4.2 transitivePeerDependencies: - supports-color dev: false + /@jimp/bmp/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + bmp-js: 0.1.0 + dev: false + + /@jimp/core/0.16.1: + resolution: {integrity: sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/utils': 0.16.1 + any-base: 1.1.0 + buffer: 5.7.1 + exif-parser: 0.1.12 + file-type: 9.0.0 + load-bmfont: 1.4.1 + mkdirp: 0.5.6 + phin: 2.9.3 + pixelmatch: 4.0.2 + tinycolor2: 1.4.2 + dev: false + + /@jimp/custom/0.16.1: + resolution: {integrity: sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/core': 0.16.1 + dev: false + + /@jimp/gif/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + gifwrap: 0.9.4 + omggif: 1.0.10 + dev: false + + /@jimp/jpeg/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + jpeg-js: 0.4.2 + dev: false + + /@jimp/plugin-blit/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-blur/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-circle/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-color/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + tinycolor2: 1.4.2 + dev: false + + /@jimp/plugin-contain/0.16.1_hdurtz6n4amigqqh6fpopmgoni: + resolution: {integrity: sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-cover/0.16.1_huj753jw6x6ymgmn4r5xrmstcq: + resolution: {integrity: sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + '@jimp/plugin-scale': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-crop/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-displace/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-dither/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-fisheye/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-flip/0.16.1_ebpr3hwfcslp7e7vflcwddbwma: + resolution: {integrity: sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-rotate': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-rotate': 0.16.1_g72lzg55x5a4ao4td3uebcztme + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-gaussian/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-invert/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-mask/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-normalize/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-print/0.16.1_kgi3mefd5odb2o5kccttl2e6zq: + resolution: {integrity: sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + load-bmfont: 1.4.1 + dev: false + + /@jimp/plugin-resize/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-rotate/0.16.1_g72lzg55x5a4ao4td3uebcztme: + resolution: {integrity: sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blit': '>=0.3.5' + '@jimp/plugin-crop': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-scale/0.16.1_yobdog5u6yhkf7jbdico3cvr4i: + resolution: {integrity: sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-shadow/0.16.1_qjkavnenl6bwqbeu6ngq3leqp4: + resolution: {integrity: sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-blur': '>=0.3.5' + '@jimp/plugin-resize': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blur': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugin-threshold/0.16.1_5qgih43agfe2q6apq4cf7aqzei: + resolution: {integrity: sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + '@jimp/plugin-color': '>=0.8.0' + '@jimp/plugin-resize': '>=0.8.0' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-color': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/utils': 0.16.1 + dev: false + + /@jimp/plugins/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugin-blit': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-blur': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-circle': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-color': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-contain': 0.16.1_hdurtz6n4amigqqh6fpopmgoni + '@jimp/plugin-cover': 0.16.1_huj753jw6x6ymgmn4r5xrmstcq + '@jimp/plugin-crop': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-displace': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-dither': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-fisheye': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-flip': 0.16.1_ebpr3hwfcslp7e7vflcwddbwma + '@jimp/plugin-gaussian': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-invert': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-mask': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-normalize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-print': 0.16.1_kgi3mefd5odb2o5kccttl2e6zq + '@jimp/plugin-resize': 0.16.1_@jimp+custom@0.16.1 + '@jimp/plugin-rotate': 0.16.1_g72lzg55x5a4ao4td3uebcztme + '@jimp/plugin-scale': 0.16.1_yobdog5u6yhkf7jbdico3cvr4i + '@jimp/plugin-shadow': 0.16.1_qjkavnenl6bwqbeu6ngq3leqp4 + '@jimp/plugin-threshold': 0.16.1_5qgih43agfe2q6apq4cf7aqzei + timm: 1.7.1 + dev: false + + /@jimp/png/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/utils': 0.16.1 + pngjs: 3.4.0 + dev: false + + /@jimp/tiff/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + utif: 2.0.1 + dev: false + + /@jimp/types/0.16.1_@jimp+custom@0.16.1: + resolution: {integrity: sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==} + peerDependencies: + '@jimp/custom': '>=0.3.5' + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/bmp': 0.16.1_@jimp+custom@0.16.1 + '@jimp/custom': 0.16.1 + '@jimp/gif': 0.16.1_@jimp+custom@0.16.1 + '@jimp/jpeg': 0.16.1_@jimp+custom@0.16.1 + '@jimp/png': 0.16.1_@jimp+custom@0.16.1 + '@jimp/tiff': 0.16.1_@jimp+custom@0.16.1 + timm: 1.7.1 + dev: false + + /@jimp/utils/0.16.1: + resolution: {integrity: sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==} + dependencies: + '@babel/runtime': 7.18.9 + regenerator-runtime: 0.13.9 + dev: false + /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.1 - '@jridgewell/sourcemap-codec': 1.4.13 - dev: false + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 - /@jridgewell/resolve-uri/3.0.7: - resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/set-array/1.1.1: - resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec/1.4.13: - resolution: {integrity: sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==} - dev: false - - /@jridgewell/trace-mapping/0.3.10: - resolution: {integrity: sha512-Q0YbBd6OTsXm8Y21+YUSDXupHnodNC2M4O18jtd3iwJ3+vMZNdKGols0a9G6JOK0dcJ3IdUUHoh908ZI6qhk8Q==} dependencies: - '@jridgewell/resolve-uri': 3.0.7 - '@jridgewell/sourcemap-codec': 1.4.13 - dev: false + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.14 + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -553,80 +946,78 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.13.0 - /@poppanator/sveltekit-svg/0.3.2_svelte@3.48.0: - resolution: {integrity: sha512-SAnp0frw2T3sPjgYEXtXUSXYGHmppJO0k1ZF/3mzW4wUOygK1N1qvLI16cPQbnnO1xx1XL72W5d85ZXzwJ2zNg==} + /@poppanator/sveltekit-svg/0.3.4_svelte@3.49.0: + resolution: {integrity: sha512-LehMKn91Ds82bHOWoQVhd2GuICk8IFrIGotgP3jBaxcYyxHLznkun9IgdWMZCpRsiaSbmKrW1HZ81p/UlfM/JA==} peerDependencies: svelte: 3.x dependencies: - svelte: 3.48.0 + svelte: 3.49.0 svgo: 2.8.0 dev: false - /@rollup/pluginutils/4.1.2: - resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} + /@rollup/pluginutils/4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 dev: true - /@sveltejs/adapter-static/1.0.0-next.29: - resolution: {integrity: sha512-0hjGnfT3BRyoHnzJ2w0/xL+xICRpKneDTm45ZzggiRrc0r71WJfF6toGeg8N4QUQnj8EJ3Itm453gsS1kt7VUQ==} + /@sveltejs/adapter-static/1.0.0-next.38: + resolution: {integrity: sha512-O1b264K62E3OrUnsFxMjKn3CUJF50fxGcW0rWk8fa5kjzskPsSyTxS3jnWNryFaVJ3oSUtx57m4qFW43S1910Q==} dependencies: tiny-glob: 0.2.9 dev: true - /@sveltejs/kit/1.0.0-next.326_svelte@3.48.0: - resolution: {integrity: sha512-prJqmXZ2H1wmFfnMw7wDujfbkcA8vuubuqUkpVVmXhfh2+SEzQscPTNwxoE5EJxb5sywtLWEvYx3hv1gPS4Lvg==} - engines: {node: '>=14.13'} + /@sveltejs/kit/1.0.0-next.402_svelte@3.49.0+vite@3.0.4: + resolution: {integrity: sha512-F0Mm+bTGOnl+vWKab5uwXsY+5YypC/uveGE0wKyYSE9a/pFQD20WwrvRKePGhUCepiHc7S82jxVZRwjCsToaNQ==} + engines: {node: '>=16.9'} hasBin: true + requiresBuild: true peerDependencies: svelte: ^3.44.0 + vite: ^3.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 1.0.0-next.37_svelte@3.48.0+vite@2.9.1 + '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.4 chokidar: 3.5.3 sade: 1.8.1 - svelte: 3.48.0 - vite: 2.9.1 + svelte: 3.49.0 + vite: 3.0.4 transitivePeerDependencies: - diff-match-patch - - less - - sass - - stylus - supports-color dev: true - /@sveltejs/vite-plugin-svelte/1.0.0-next.37_svelte@3.48.0+vite@2.9.1: - resolution: {integrity: sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==} - engines: {node: ^14.13.1 || >= 16} + /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.4: + resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==} + engines: {node: ^14.18.0 || >= 16} peerDependencies: diff-match-patch: ^1.0.5 svelte: ^3.44.0 - vite: ^2.7.0 + vite: ^3.0.0 peerDependenciesMeta: diff-match-patch: optional: true dependencies: - '@rollup/pluginutils': 4.1.2 - debug: 4.3.3 - kleur: 4.1.4 - magic-string: 0.25.7 - svelte: 3.48.0 - svelte-hmr: 0.14.9_svelte@3.48.0 - vite: 2.9.1 + '@rollup/pluginutils': 4.2.1 + debug: 4.3.4 + deepmerge: 4.2.2 + kleur: 4.1.5 + magic-string: 0.26.2 + svelte: 3.49.0 + svelte-hmr: 0.14.12_svelte@3.49.0 + vite: 3.0.4 transitivePeerDependencies: - supports-color dev: true - /@tauri-apps/api/1.0.0-rc.1: - resolution: {integrity: sha512-VBUOmfT8ea02JB/Qr+FHeaLnug5BRA7ro2pX47q0GZCbZsU9b+iPnOXl0ShJwT0melR7B6iamyhDwkHStMVfQA==} - engines: {node: '>= 12.13.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - dependencies: - type-fest: 2.11.2 + /@tauri-apps/api/1.0.2: + resolution: {integrity: sha512-yuNW0oeJ1/ZA7wNF1KgxhHrSu5viPVzY/UgUczzN5ptLM8dH15Juy5rEGkoHfeXGju90Y/l22hi3BtIrp/za+w==} + engines: {node: '>= 12.22.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} dev: false - /@tauri-apps/cli-darwin-arm64/1.0.0-rc.5: - resolution: {integrity: sha512-X+3EIAUGfoL8uE6PBADZC8FcUISe4JPQCxXgaVv6ehoZGoCh/pFJF7AvBGTQxbnvngqM7Xce4Lmh63Io2/5ggw==} + /@tauri-apps/cli-darwin-arm64/1.0.5: + resolution: {integrity: sha512-oxpFb9ZeMiC3xPUJ9NsXWCnnwFSVkPbJUvDKpc9IaoDIUpsMTV72W4P0Nh0uQRbyhx4modPpstt7+ONypNVYNg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -634,8 +1025,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-darwin-x64/1.0.0-rc.5: - resolution: {integrity: sha512-fEpgOdAvKdq9C5/yip8RnwP1VS+nRrtKdzzplu4jY6njDVH/Vom8mg+EfXkCY5RveCaoskJMFgUvt10IGeZHBA==} + /@tauri-apps/cli-darwin-x64/1.0.5: + resolution: {integrity: sha512-hRNYC6L9edz2dEqK33tssPylF2ti6x6udidBlGWc5GSoeEb/05qKMEA1MESQYKBG+4q+wjJvACA2vvz6AfgJ3Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -643,8 +1034,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm-gnueabihf/1.0.0-rc.5: - resolution: {integrity: sha512-V7sWSBrpLyvkQxpkHIM8JltYqQhiTpThySDjO8POtrTqkRwM5BXORcCYhxTAKCedecfYK/RNUJ6Q0t7+3jS6DQ==} + /@tauri-apps/cli-linux-arm-gnueabihf/1.0.5: + resolution: {integrity: sha512-hc/Jp3TtFpxB8XVkLEwWy7MNcUBlS8rNCafQBUt4KSElXB+/oGo50jPO+wd5GSMSOR59UCzH08v11P0b+sAa/w==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -652,8 +1043,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-gnu/1.0.0-rc.5: - resolution: {integrity: sha512-HhM+2FInxtUAI/41LF4fDEzmhLQUq6DOoo7fLN94vgWlhsPyWZoDGP9pA043XbO86+4OX5JZUW1SnTVXMwEaMA==} + /@tauri-apps/cli-linux-arm64-gnu/1.0.5: + resolution: {integrity: sha512-btFlkD2PG+yzJBZzWeJmyCy8ZV+iys2Jl66Fs4g9lSi3KrBDnyfQ26RpGZb2pRfkkcVP8/x1WSfByO+Rj+PTBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -661,8 +1052,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-arm64-musl/1.0.0-rc.5: - resolution: {integrity: sha512-DhHdKOhf3+peA/sM0c9CpxK89cp8GVwOB5osFW55fxBZbD0mJFeL2SzjkgfGFqFu6Ci/ZiibQGfEp8XTC8OsYA==} + /@tauri-apps/cli-linux-arm64-musl/1.0.5: + resolution: {integrity: sha512-p5JFdWab2AWhfgAZW/mgOLu+YiIJXKV0NdATGmdiBgQCMmz1k/FM8iOFApCgGbo3/zkR58cJ7Z7hyWmQ07M6Pw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -670,8 +1061,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-gnu/1.0.0-rc.5: - resolution: {integrity: sha512-pZzsOHRGG/mdcn7fF/yOIOdeVzGxZUtZqvlGSd90ZM9Ps3//uYGCBHoNTbeSwp/V6+D0KVDaSCbm9lYlHoXcdA==} + /@tauri-apps/cli-linux-x64-gnu/1.0.5: + resolution: {integrity: sha512-fOXR635AXxwSO7MCfBhMLnGpcg1H83XGw9ocuyg4jjvtE8QoYPwC4ksfb5lLhDVMui9iIKY93NAK3EkQiSGGmQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -679,8 +1070,8 @@ packages: dev: true optional: true - /@tauri-apps/cli-linux-x64-musl/1.0.0-rc.5: - resolution: {integrity: sha512-COwWCbOhEjBlzGRGTa0ESO4/AiC0cBZ2UEPExRn++S+kWSPJ2vsyMdCLu3hiMy1ABSIRcQ4Vc68M1iVkLhOHHw==} + /@tauri-apps/cli-linux-x64-musl/1.0.5: + resolution: {integrity: sha512-8be4zJVkuMs427JqONhFx5Ia5zWsQ5tbZXd80C3dHNL+5/3VIOK6nGQ0iijyZSLXiE9JKEH2jp1EHB+1TVJRcw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -688,8 +1079,17 @@ packages: dev: true optional: true - /@tauri-apps/cli-win32-x64-msvc/1.0.0-rc.5: - resolution: {integrity: sha512-zzizUmPWvnWjj+IUCk36kVjS9j1Bg5JmnwOW5QdX26+a64q5vocmVimCgrfZ5STw3sDFXE++S55ghpzhhH5o+g==} + /@tauri-apps/cli-win32-ia32-msvc/1.0.5: + resolution: {integrity: sha512-WpnIfzS1e4InGhvd1IDSKC3w6kbI5c6oJgMmtkMTBlhjhiZXhZmQF4XA784A5Y13pzsbXnbNJKOp8DuPVkoTRQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tauri-apps/cli-win32-x64-msvc/1.0.5: + resolution: {integrity: sha512-8iEhVD3X4LZfrlxEPOV+mAj4QrJrEqKTICiJnwmgjvhYQOOsNHzg5kca7pcBbqcgorQOBydLpfGJtxWRusVPaw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -697,19 +1097,20 @@ packages: dev: true optional: true - /@tauri-apps/cli/1.0.0-rc.5: - resolution: {integrity: sha512-Q3D0R5YdZRA5EcL206hwwKCyXpet2mRDcfaRTU/IXwF73bS4AMja+JdAGfO2cyHuSvXd+b//Cgbei2zCG8M6hw==} + /@tauri-apps/cli/1.0.5: + resolution: {integrity: sha512-vbY+MwK+xN65x0R/o16UQPxBtJl8pmzVzC0TZKokZfmeOkomoqOEOinSwznAMeyR1ZMJW+fXVgJCPvGsRQ0LGg==} engines: {node: '>= 10'} hasBin: true optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.0.0-rc.5 - '@tauri-apps/cli-darwin-x64': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm64-gnu': 1.0.0-rc.5 - '@tauri-apps/cli-linux-arm64-musl': 1.0.0-rc.5 - '@tauri-apps/cli-linux-x64-gnu': 1.0.0-rc.5 - '@tauri-apps/cli-linux-x64-musl': 1.0.0-rc.5 - '@tauri-apps/cli-win32-x64-msvc': 1.0.0-rc.5 + '@tauri-apps/cli-darwin-arm64': 1.0.5 + '@tauri-apps/cli-darwin-x64': 1.0.5 + '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.5 + '@tauri-apps/cli-linux-arm64-gnu': 1.0.5 + '@tauri-apps/cli-linux-arm64-musl': 1.0.5 + '@tauri-apps/cli-linux-x64-gnu': 1.0.5 + '@tauri-apps/cli-linux-x64-musl': 1.0.5 + '@tauri-apps/cli-win32-ia32-msvc': 1.0.5 + '@tauri-apps/cli-win32-x64-msvc': 1.0.5 dev: true /@trysound/sax/0.2.0: @@ -717,14 +1118,22 @@ packages: engines: {node: '>=10.13.0'} dev: false - /@types/json-schema/7.0.9: - resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + /@types/json-schema/7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/17.0.19: - resolution: {integrity: sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==} + /@types/node/16.9.1: + resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} + dev: false + + /@types/node/18.6.3: + resolution: {integrity: sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==} dev: true + /@types/offscreencanvas/2019.7.0: + resolution: {integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==} + dev: false + /@types/pug/2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true @@ -732,15 +1141,11 @@ packages: /@types/sass/1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: - '@types/node': 17.0.19 + '@types/node': 18.6.3 dev: true - /@types/throttle-debounce/2.1.0: - resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} - dev: false - - /@typescript-eslint/eslint-plugin/5.12.1_78ba2542c270c83b2a80bb1c125195b6: - resolution: {integrity: sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==} + /@typescript-eslint/eslint-plugin/5.31.0_4jrpqvszkjcwtaspamifhp3x7e: + resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -750,24 +1155,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.12.1_eslint@7.32.0+typescript@4.5.5 - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/type-utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - '@typescript-eslint/utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/parser': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/type-utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + '@typescript-eslint/utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + debug: 4.3.4 eslint: 7.32.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 - semver: 7.3.5 + semver: 7.3.7 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-6LuVUbe7oSdHxUWoX/m40Ni8gsZMKCi31rlawBHt7VtW15iHzjbpj2WLiToG2758KjtCCiLRKZqfrOdl3cNKuw==} + /@typescript-eslint/parser/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -776,26 +1181,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/typescript-estree': 5.12.1_typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.5.5 + debug: 4.3.4 eslint: 7.32.0 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.12.1: - resolution: {integrity: sha512-J0Wrh5xS6XNkd4TkOosxdpObzlYfXjAFIm9QxYLCPOcHVv1FyyFCPom66uIh8uBr0sZCrtS+n19tzufhwab8ZQ==} + /@typescript-eslint/scope-manager/5.31.0: + resolution: {integrity: sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/visitor-keys': 5.12.1 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 dev: true - /@typescript-eslint/type-utils/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-Gh8feEhsNLeCz6aYqynh61Vsdy+tiNNkQtc+bN3IvQvRqHkXGUhYkUi+ePKzP0Mb42se7FDb+y2SypTbpbR/Sg==} + /@typescript-eslint/type-utils/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -804,8 +1209,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.12.1_eslint@7.32.0+typescript@4.5.5 - debug: 4.3.3 + '@typescript-eslint/utils': 5.31.0_sgaiclxgc5mltnpgmg7py4v6ca + debug: 4.3.4 eslint: 7.32.0 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 @@ -813,13 +1218,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.12.1: - resolution: {integrity: sha512-hfcbq4qVOHV1YRdhkDldhV9NpmmAu2vp6wuFODL71Y0Ixak+FLeEU4rnPxgmZMnGreGEghlEucs9UZn5KOfHJA==} + /@typescript-eslint/types/5.31.0: + resolution: {integrity: sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.12.1_typescript@4.5.5: - resolution: {integrity: sha512-ahOdkIY9Mgbza7L9sIi205Pe1inCkZWAHE1TV1bpxlU4RZNPtXaDZfiiFWcL9jdxvW1hDYZJXrFm+vlMkXRbBw==} + /@typescript-eslint/typescript-estree/5.31.0_typescript@4.5.5: + resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -827,28 +1232,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/visitor-keys': 5.12.1 - debug: 4.3.3 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/visitor-keys': 5.31.0 + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.5 + semver: 7.3.7 tsutils: 3.21.0_typescript@4.5.5 typescript: 4.5.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.12.1_eslint@7.32.0+typescript@4.5.5: - resolution: {integrity: sha512-Qq9FIuU0EVEsi8fS6pG+uurbhNTtoYr4fq8tKjBupsK5Bgbk2I32UGm0Sh+WOyjOPgo/5URbxxSNV6HYsxV4MQ==} + /@typescript-eslint/utils/5.31.0_sgaiclxgc5mltnpgmg7py4v6ca: + resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.12.1 - '@typescript-eslint/types': 5.12.1 - '@typescript-eslint/typescript-estree': 5.12.1_typescript@4.5.5 + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.31.0 + '@typescript-eslint/types': 5.31.0 + '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.5.5 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.32.0 @@ -857,11 +1262,11 @@ packages: - typescript dev: true - /@typescript-eslint/visitor-keys/5.12.1: - resolution: {integrity: sha512-l1KSLfupuwrXx6wc0AuOmC7Ko5g14ZOQ86wJJqRbdLbXLK02pK/DPiDDqCc7BqqiiA04/eAA6ayL0bgOrAkH7A==} + /@typescript-eslint/visitor-keys/5.31.0: + resolution: {integrity: sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.12.1 + '@typescript-eslint/types': 5.31.0 eslint-visitor-keys: 3.3.0 dev: true @@ -879,6 +1284,12 @@ packages: hasBin: true dev: true + /acorn/8.8.0: + resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -888,8 +1299,8 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.10.0: - resolution: {integrity: sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==} + /ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -897,25 +1308,14 @@ packages: uri-js: 4.4.1 dev: true - /ansi-colors/4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-regex/2.1.1: - resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} - engines: {node: '>=0.10.0'} - dev: false - /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true - - /ansi-styles/2.2.1: - resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} - engines: {node: '>=0.10.0'} - dev: false /ansi-styles/3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -930,6 +1330,10 @@ packages: color-convert: 2.0.1 dev: true + /any-base/1.1.0: + resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} + dev: false + /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -945,10 +1349,9 @@ packages: /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false /array-union/1.0.2: - resolution: {integrity: sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=} + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} dependencies: array-uniq: 1.0.3 @@ -960,12 +1363,12 @@ packages: dev: true /array-uniq/1.0.3: - resolution: {integrity: sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=} + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: false /assignment/2.0.0: - resolution: {integrity: sha1-/9F7Ib9dayLnd7mJaBqBVFaj3T4=} + resolution: {integrity: sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==} dev: false /astral-regex/2.0.0: @@ -973,41 +1376,57 @@ packages: engines: {node: '>=8'} dev: true - /autoprefixer/10.4.7_postcss@8.4.12: - resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} + /autoprefixer/10.4.8_postcss@8.4.14: + resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.20.3 - caniuse-lite: 1.0.30001338 + browserslist: 4.21.3 + caniuse-lite: 1.0.30001373 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /babel-plugin-precompile-intl/0.3.0: - resolution: {integrity: sha512-pEMIrYu7U/1pvjX6Wgw5jsYPRNx4TLKy47woBpEJjAFoVMoToRzpxS/cQRq3A7Bz8CN8cbKknCnnNOJrkdEscA==} + /babel-plugin-precompile-intl/0.5.1: + resolution: {integrity: sha512-ki0llx5xZT1jQeLUIILVlAaaJQl/Jk+YTCXQZXoqjdwdUeAd2FTAOUWOYKk0W4KC+ONGFqtYfKmyjZkm5hlhpw==} dependencies: - '@babel/core': 7.17.10 - '@babel/helper-plugin-utils': 7.16.7 - '@formatjs/icu-messageformat-parser': 2.1.0 + '@babel/core': 7.18.9 + '@babel/helper-plugin-utils': 7.18.9 + '@formatjs/icu-messageformat-parser': 2.1.4 transitivePeerDependencies: - supports-color - dev: false + dev: true /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /bmp-js/0.1.0: + resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} + dev: false + /boolbase/1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: false /brace-expansion/1.1.11: @@ -1022,22 +1441,32 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist/4.20.3: - resolution: {integrity: sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==} + /browserslist/4.21.3: + resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001338 - electron-to-chromium: 1.4.137 - escalade: 3.1.1 - node-releases: 2.0.4 - picocolors: 1.0.0 - dev: false + caniuse-lite: 1.0.30001373 + electron-to-chromium: 1.4.206 + node-releases: 2.0.6 + update-browserslist-db: 1.0.5_browserslist@4.21.3 /buffer-crc32/0.2.13: - resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true + /buffer-equal/0.0.1: + resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} + engines: {node: '>=0.4.0'} + dev: false + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1046,26 +1475,14 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.20.3 - caniuse-lite: 1.0.30001338 + browserslist: 4.21.3 + caniuse-lite: 1.0.30001373 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite/1.0.30001338: - resolution: {integrity: sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==} - dev: false - - /chalk/1.1.3: - resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false + /caniuse-lite/1.0.30001373: + resolution: {integrity: sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==} /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1097,6 +1514,17 @@ packages: optionalDependencies: fsevents: 2.3.2 + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /cli-progress/3.11.2: + resolution: {integrity: sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==} + engines: {node: '>=4'} + dependencies: + string-width: 4.2.3 + dev: false + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1107,14 +1535,27 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name/1.1.3: - resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true + + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color/4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false /colord/2.9.2: resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==} @@ -1126,16 +1567,15 @@ packages: dev: false /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 - dev: false /cross-spawn/5.1.0: - resolution: {integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=} + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 @@ -1150,45 +1590,45 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /css-blank-pseudo/3.0.3_postcss@8.4.12: + /css-blank-pseudo/3.0.3_postcss@8.4.14: resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /css-declaration-sorter/6.2.2_postcss@8.4.12: - resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} + /css-declaration-sorter/6.3.0_postcss@8.4.14: + resolution: {integrity: sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /css-has-pseudo/3.0.4_postcss@8.4.12: + /css-has-pseudo/3.0.4_postcss@8.4.14: resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /css-prefers-color-scheme/6.0.3_postcss@8.4.12: + /css-prefers-color-scheme/6.0.3_postcss@8.4.14: resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false /css-select/4.3.0: @@ -1198,7 +1638,7 @@ packages: css-what: 6.1.0 domhandler: 4.3.1 domutils: 2.8.0 - nth-check: 2.0.1 + nth-check: 2.1.1 dev: false /css-tree/1.1.3: @@ -1214,8 +1654,8 @@ packages: engines: {node: '>= 6'} dev: false - /cssdb/6.6.1: - resolution: {integrity: sha512-0/nZEYfp8SFEzJkMud8NxZJsGfD7RHDJti6GRBLZptIwAzco6RTx1KgwFl4mGWsYS0ZNbCrsY9QryhQ4ldF3Mg==} + /cssdb/6.6.3: + resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==} dev: false /cssesc/3.0.0: @@ -1224,62 +1664,62 @@ packages: hasBin: true dev: false - /cssnano-preset-default/5.2.7_postcss@8.4.12: - resolution: {integrity: sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==} + /cssnano-preset-default/5.2.12_postcss@8.4.14: + resolution: {integrity: sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.2.2_postcss@8.4.12 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 - postcss-calc: 8.2.4_postcss@8.4.12 - postcss-colormin: 5.3.0_postcss@8.4.12 - postcss-convert-values: 5.1.0_postcss@8.4.12 - postcss-discard-comments: 5.1.1_postcss@8.4.12 - postcss-discard-duplicates: 5.1.0_postcss@8.4.12 - postcss-discard-empty: 5.1.1_postcss@8.4.12 - postcss-discard-overridden: 5.1.0_postcss@8.4.12 - postcss-merge-longhand: 5.1.4_postcss@8.4.12 - postcss-merge-rules: 5.1.1_postcss@8.4.12 - postcss-minify-font-values: 5.1.0_postcss@8.4.12 - postcss-minify-gradients: 5.1.1_postcss@8.4.12 - postcss-minify-params: 5.1.2_postcss@8.4.12 - postcss-minify-selectors: 5.2.0_postcss@8.4.12 - postcss-normalize-charset: 5.1.0_postcss@8.4.12 - postcss-normalize-display-values: 5.1.0_postcss@8.4.12 - postcss-normalize-positions: 5.1.0_postcss@8.4.12 - postcss-normalize-repeat-style: 5.1.0_postcss@8.4.12 - postcss-normalize-string: 5.1.0_postcss@8.4.12 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.12 - postcss-normalize-unicode: 5.1.0_postcss@8.4.12 - postcss-normalize-url: 5.1.0_postcss@8.4.12 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.12 - postcss-ordered-values: 5.1.1_postcss@8.4.12 - postcss-reduce-initial: 5.1.0_postcss@8.4.12 - postcss-reduce-transforms: 5.1.0_postcss@8.4.12 - postcss-svgo: 5.1.0_postcss@8.4.12 - postcss-unique-selectors: 5.1.1_postcss@8.4.12 + css-declaration-sorter: 6.3.0_postcss@8.4.14 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 + postcss-calc: 8.2.4_postcss@8.4.14 + postcss-colormin: 5.3.0_postcss@8.4.14 + postcss-convert-values: 5.1.2_postcss@8.4.14 + postcss-discard-comments: 5.1.2_postcss@8.4.14 + postcss-discard-duplicates: 5.1.0_postcss@8.4.14 + postcss-discard-empty: 5.1.1_postcss@8.4.14 + postcss-discard-overridden: 5.1.0_postcss@8.4.14 + postcss-merge-longhand: 5.1.6_postcss@8.4.14 + postcss-merge-rules: 5.1.2_postcss@8.4.14 + postcss-minify-font-values: 5.1.0_postcss@8.4.14 + postcss-minify-gradients: 5.1.1_postcss@8.4.14 + postcss-minify-params: 5.1.3_postcss@8.4.14 + postcss-minify-selectors: 5.2.1_postcss@8.4.14 + postcss-normalize-charset: 5.1.0_postcss@8.4.14 + postcss-normalize-display-values: 5.1.0_postcss@8.4.14 + postcss-normalize-positions: 5.1.1_postcss@8.4.14 + postcss-normalize-repeat-style: 5.1.1_postcss@8.4.14 + postcss-normalize-string: 5.1.0_postcss@8.4.14 + postcss-normalize-timing-functions: 5.1.0_postcss@8.4.14 + postcss-normalize-unicode: 5.1.0_postcss@8.4.14 + postcss-normalize-url: 5.1.0_postcss@8.4.14 + postcss-normalize-whitespace: 5.1.1_postcss@8.4.14 + postcss-ordered-values: 5.1.3_postcss@8.4.14 + postcss-reduce-initial: 5.1.0_postcss@8.4.14 + postcss-reduce-transforms: 5.1.0_postcss@8.4.14 + postcss-svgo: 5.1.0_postcss@8.4.14 + postcss-unique-selectors: 5.1.1_postcss@8.4.14 dev: false - /cssnano-utils/3.1.0_postcss@8.4.12: + /cssnano-utils/3.1.0_postcss@8.4.14: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /cssnano/5.1.7_postcss@8.4.12: - resolution: {integrity: sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==} + /cssnano/5.1.12_postcss@8.4.14: + resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.7_postcss@8.4.12 - lilconfig: 2.0.5 - postcss: 8.4.12 + cssnano-preset-default: 5.2.12_postcss@8.4.14 + lilconfig: 2.0.6 + postcss: 8.4.14 yaml: 1.10.2 dev: false @@ -1295,8 +1735,8 @@ packages: engines: {node: '>= 12'} dev: true - /debug/4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1306,15 +1746,37 @@ packages: dependencies: ms: 2.1.2 + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: false + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1337,6 +1799,10 @@ packages: entities: 2.2.0 dev: false + /dom-walk/0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + dev: false + /domelementtype/2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false @@ -1356,19 +1822,23 @@ packages: domhandler: 4.3.1 dev: false - /electron-to-chromium/1.4.137: - resolution: {integrity: sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==} - dev: false + /electron-to-chromium/1.4.206: + resolution: {integrity: sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==} /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 dev: true /entities/2.2.0: @@ -1376,224 +1846,202 @@ packages: dev: false /es6-promise/3.3.1: - resolution: {integrity: sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=} + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true - /esbuild-android-64/0.14.30: - resolution: {integrity: sha512-vdJ7t8A8msPfKpYUGUV/KaTQRiZ0vDa2XSTlzXVkGGVHLKPeb85PBUtYJcEgw3htW3IdX5i1t1IMdQCwJJgNAg==} + /esbuild-android-64/0.14.51: + resolution: {integrity: sha512-6FOuKTHnC86dtrKDmdSj2CkcKF8PnqkaIXqvgydqfJmqBazCPdw+relrMlhGjkvVdiiGV70rpdnyFmA65ekBCQ==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-android-arm64/0.14.30: - resolution: {integrity: sha512-BdgGfxeA5hBQNErLr7BWJUA8xjflEfyaARICy8e0OJYNSAwDbEzOf8LyiKWSrDcgV129mWhi3VpbNQvOIDEHcg==} + /esbuild-android-arm64/0.14.51: + resolution: {integrity: sha512-vBtp//5VVkZWmYYvHsqBRCMMi1MzKuMIn5XDScmnykMTu9+TD9v0NMEDqQxvtFToeYmojdo5UCV2vzMQWJcJ4A==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true - /esbuild-darwin-64/0.14.30: - resolution: {integrity: sha512-VRaOXMMrsG5n53pl4qFZQdXy2+E0NoLP/QH3aDUI0+bQP+ZHDmbINKcDy2IX7GVFI9kqPS18iJNAs5a6/G2LZg==} + /esbuild-darwin-64/0.14.51: + resolution: {integrity: sha512-YFmXPIOvuagDcwCejMRtCDjgPfnDu+bNeh5FU2Ryi68ADDVlWEpbtpAbrtf/lvFTWPexbgyKgzppNgsmLPr8PA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-darwin-arm64/0.14.30: - resolution: {integrity: sha512-qDez+fHMOrO9Oc9qjt/x+sy09RJVh62kik5tVybKRLmezeV4qczM9/sAYY57YN0aWLdHbcCj2YqJUWYJNsgKnw==} + /esbuild-darwin-arm64/0.14.51: + resolution: {integrity: sha512-juYD0QnSKwAMfzwKdIF6YbueXzS6N7y4GXPDeDkApz/1RzlT42mvX9jgNmyOlWKN7YzQAYbcUEJmZJYQGdf2ow==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-64/0.14.30: - resolution: {integrity: sha512-mec1jENcImVVagddZlGWsdAUwBnzR5cgnhzCxv+9fSMxKbx1uZYLLUAnLPp8m/i934zrumR1xGjJ5VoWdPlI2w==} + /esbuild-freebsd-64/0.14.51: + resolution: {integrity: sha512-cLEI/aXjb6vo5O2Y8rvVSQ7smgLldwYY5xMxqh/dQGfWO+R1NJOFsiax3IS4Ng300SVp7Gz3czxT6d6qf2cw0g==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-freebsd-arm64/0.14.30: - resolution: {integrity: sha512-cpjbTs6Iok/AfeB0JgTzyUJTMStC1SQULmany5nHx6S4GTkSgaAHuJzZO0GcVWqghI4e0YL/bjXAhN5Mn6feNw==} + /esbuild-freebsd-arm64/0.14.51: + resolution: {integrity: sha512-TcWVw/rCL2F+jUgRkgLa3qltd5gzKjIMGhkVybkjk6PJadYInPtgtUBp1/hG+mxyigaT7ib+od1Xb84b+L+1Mg==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true - /esbuild-linux-32/0.14.30: - resolution: {integrity: sha512-liIONVT4F2kZmOMwtwASqZ8WkIjb5HHBR9HUffdHiuotSTF3CyZO+EJf+Og+SYYuuVIvt0qHNSFjBA/iSESteQ==} + /esbuild-linux-32/0.14.51: + resolution: {integrity: sha512-RFqpyC5ChyWrjx8Xj2K0EC1aN0A37H6OJfmUXIASEqJoHcntuV3j2Efr9RNmUhMfNE6yEj2VpYuDteZLGDMr0w==} engines: {node: '>=12'} cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-64/0.14.30: - resolution: {integrity: sha512-LUnpzoMpRqFON5En4qEj6NWiyH6a1K+Y2qYNKrCy5qPTjDoG/EWeqMz69n8Uv7pRuvDKl3FNGJ1dufTrA5i0sw==} + /esbuild-linux-64/0.14.51: + resolution: {integrity: sha512-dxjhrqo5i7Rq6DXwz5v+MEHVs9VNFItJmHBe1CxROWNf4miOGoQhqSG8StStbDkQ1Mtobg6ng+4fwByOhoQoeA==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm/0.14.30: - resolution: {integrity: sha512-97T+bbXnpqf7mfIG49UR7ZSJFGgvc22byn74qw3Kx2GDCBSQoVFjyWuKOHGXp8nXk3XYrdFF+mQ8yQ7aNsgQvg==} + /esbuild-linux-arm/0.14.51: + resolution: {integrity: sha512-LsJynDxYF6Neg7ZC7748yweCDD+N8ByCv22/7IAZglIEniEkqdF4HCaa49JNDLw1UQGlYuhOB8ZT/MmcSWzcWg==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-arm64/0.14.30: - resolution: {integrity: sha512-DHZHn6FK5q/KL0fpNT/0jE38Nnyk2rXxKE9WENi95EXtqfOLPgE8tzjTZQNgpr61R95QX4ymQU26ni3IZk8buQ==} + /esbuild-linux-arm64/0.14.51: + resolution: {integrity: sha512-D9rFxGutoqQX3xJPxqd6o+kvYKeIbM0ifW2y0bgKk5HPgQQOo2k9/2Vpto3ybGYaFPCE5qTGtqQta9PoP6ZEzw==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-mips64le/0.14.30: - resolution: {integrity: sha512-fLUzTFZ7uknC0aPTk7/lM7NmaG/9ZqE3SaHEphcaM009SZK/mDOvZugWi1ss6WGNhk13dUrhkfHcc4FSb9hYhg==} + /esbuild-linux-mips64le/0.14.51: + resolution: {integrity: sha512-vS54wQjy4IinLSlb5EIlLoln8buh1yDgliP4CuEHumrPk4PvvP4kTRIG4SzMXm6t19N0rIfT4bNdAxzJLg2k6A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-ppc64le/0.14.30: - resolution: {integrity: sha512-2Oudm2WEfj0dNU9bzIl5L/LrsMEmHWsOsYgJJqu8fDyUDgER+J1d33qz3cUdjsJk7gAENayIxDSpsuCszx0w3A==} + /esbuild-linux-ppc64le/0.14.51: + resolution: {integrity: sha512-xcdd62Y3VfGoyphNP/aIV9LP+RzFw5M5Z7ja+zdpQHHvokJM7d0rlDRMN+iSSwvUymQkqZO+G/xjb4/75du8BQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-riscv64/0.14.30: - resolution: {integrity: sha512-RPMucPW47rV4t2jlelaE948iCRtbZf5RhifxSwzlpM1Mqdyu99MMNK0w4jFreGTmLN+oGomxIOxD6n+2E/XqHw==} + /esbuild-linux-riscv64/0.14.51: + resolution: {integrity: sha512-syXHGak9wkAnFz0gMmRBoy44JV0rp4kVCEA36P5MCeZcxFq8+fllBC2t6sKI23w3qd8Vwo9pTADCgjTSf3L3rA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-linux-s390x/0.14.30: - resolution: {integrity: sha512-OZ68r7ok6qO7hdwrwQn2p5jbIRRcUcVaAykB7e0uCA0ODwfeGunILM6phJtq2Oz4dlEEFvd+tSuma3paQKwt+A==} + /esbuild-linux-s390x/0.14.51: + resolution: {integrity: sha512-kFAJY3dv+Wq8o28K/C7xkZk/X34rgTwhknSsElIqoEo8armCOjMJ6NsMxm48KaWY2h2RUYGtQmr+RGuUPKBhyw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true - /esbuild-netbsd-64/0.14.30: - resolution: {integrity: sha512-iyejQUKn0TzpPkufq8pSCxOg9NheycQbMbPCmjefTe9wYuUlBt1TcHvdoJnYbQzsAhAh1BNq+s0ycRsIJFZzaQ==} + /esbuild-netbsd-64/0.14.51: + resolution: {integrity: sha512-ZZBI7qrR1FevdPBVHz/1GSk1x5GDL/iy42Zy8+neEm/HA7ma+hH/bwPEjeHXKWUDvM36CZpSL/fn1/y9/Hb+1A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true - /esbuild-openbsd-64/0.14.30: - resolution: {integrity: sha512-UyK1MTMcy4j5fH260fsE1o6MVgWNhb62eCK2yCKCRazZv8Nqdc2WiP9ygjWidmEdCDS+A6MuVp9ozk9uoQtQpA==} + /esbuild-openbsd-64/0.14.51: + resolution: {integrity: sha512-7R1/p39M+LSVQVgDVlcY1KKm6kFKjERSX1lipMG51NPcspJD1tmiZSmmBXoY5jhHIu6JL1QkFDTx94gMYK6vfA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true - /esbuild-sunos-64/0.14.30: - resolution: {integrity: sha512-aQRtRTNKHB4YuG+xXATe5AoRTNY48IJg5vjE8ElxfmjO9+KdX7MHFkTLhlKevCD6rNANtB3qOlSIeAiXTwHNqw==} + /esbuild-sunos-64/0.14.51: + resolution: {integrity: sha512-HoHaCswHxLEYN8eBTtyO0bFEWvA3Kdb++hSQ/lLG7TyKF69TeSG0RNoBRAs45x/oCeWaTDntEZlYwAfQlhEtJA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true - /esbuild-windows-32/0.14.30: - resolution: {integrity: sha512-9/fb1tPtpacMqxAXp3fGHowUDg/l9dVch5hKmCLEZC6PdGljh6h372zMdJwYfH0Bd5CCPT0Wx95uycBLJiqpXA==} + /esbuild-windows-32/0.14.51: + resolution: {integrity: sha512-4rtwSAM35A07CBt1/X8RWieDj3ZUHQqUOaEo5ZBs69rt5WAFjP4aqCIobdqOy4FdhYw1yF8Z0xFBTyc9lgPtEg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-64/0.14.30: - resolution: {integrity: sha512-DHgITeUhPAnN9I5O6QBa1GVyPOhiYCn4S4TtQr7sO4+X0LNyqnlmA1M0qmGkUdDC1QQfjI8uQ4G/whdWb2pWIQ==} + /esbuild-windows-64/0.14.51: + resolution: {integrity: sha512-HoN/5HGRXJpWODprGCgKbdMvrC3A2gqvzewu2eECRw2sYxOUoh2TV1tS+G7bHNapPGI79woQJGV6pFH7GH7qnA==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild-windows-arm64/0.14.30: - resolution: {integrity: sha512-F1kLyQH7zSgjh5eLxogGZN7C9+KNs9m+s7Q6WZoMmCWT/6j998zlaoECHyM8izJRRfsvw2eZlEa1jO6/IOU1AQ==} + /esbuild-windows-arm64/0.14.51: + resolution: {integrity: sha512-JQDqPjuOH7o+BsKMSddMfmVJXrnYZxXDHsoLHc0xgmAZkOOCflRmC43q31pk79F9xuyWY45jDBPolb5ZgGOf9g==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true - /esbuild/0.14.30: - resolution: {integrity: sha512-wCecQSBkIjp2xjuXY+wcXS/PpOQo9rFh4NAKPh4Pm9f3fuLcnxkR0rDzA+mYP88FtXIUcXUyYmaIgfrzRl55jA==} + /esbuild/0.14.51: + resolution: {integrity: sha512-+CvnDitD7Q5sT7F+FM65sWkF8wJRf+j9fPcprxYV4j+ohmzVj2W7caUqH2s5kCaCJAfcAICjSlKhDCcvDpU7nw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.30 - esbuild-android-arm64: 0.14.30 - esbuild-darwin-64: 0.14.30 - esbuild-darwin-arm64: 0.14.30 - esbuild-freebsd-64: 0.14.30 - esbuild-freebsd-arm64: 0.14.30 - esbuild-linux-32: 0.14.30 - esbuild-linux-64: 0.14.30 - esbuild-linux-arm: 0.14.30 - esbuild-linux-arm64: 0.14.30 - esbuild-linux-mips64le: 0.14.30 - esbuild-linux-ppc64le: 0.14.30 - esbuild-linux-riscv64: 0.14.30 - esbuild-linux-s390x: 0.14.30 - esbuild-netbsd-64: 0.14.30 - esbuild-openbsd-64: 0.14.30 - esbuild-sunos-64: 0.14.30 - esbuild-windows-32: 0.14.30 - esbuild-windows-64: 0.14.30 - esbuild-windows-arm64: 0.14.30 - dev: true + esbuild-android-64: 0.14.51 + esbuild-android-arm64: 0.14.51 + esbuild-darwin-64: 0.14.51 + esbuild-darwin-arm64: 0.14.51 + esbuild-freebsd-64: 0.14.51 + esbuild-freebsd-arm64: 0.14.51 + esbuild-linux-32: 0.14.51 + esbuild-linux-64: 0.14.51 + esbuild-linux-arm: 0.14.51 + esbuild-linux-arm64: 0.14.51 + esbuild-linux-mips64le: 0.14.51 + esbuild-linux-ppc64le: 0.14.51 + esbuild-linux-riscv64: 0.14.51 + esbuild-linux-s390x: 0.14.51 + esbuild-netbsd-64: 0.14.51 + esbuild-openbsd-64: 0.14.51 + esbuild-sunos-64: 0.14.51 + esbuild-windows-32: 0.14.51 + esbuild-windows-64: 0.14.51 + esbuild-windows-arm64: 0.14.51 /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} /escape-string-regexp/4.0.0: @@ -1601,8 +2049,8 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier/8.4.0_eslint@7.32.0: - resolution: {integrity: sha512-CFotdUcMY18nGRo5KGsnNxpznzhkopOcOo0InID+sgQssPrzjvsyKZPvOgymTFeHrFuC3Tzdf2YndhXtULK9Iw==} + /eslint-config-prettier/8.5.0_eslint@7.32.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1610,15 +2058,15 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-svelte3/3.4.0_eslint@7.32.0+svelte@3.48.0: - resolution: {integrity: sha512-MIQUTuRv3o7LyQ+360qOc9mLT35j1I5YzHr04g/UDcvJTpg0X/kHWELY99ve869Rp/9wjqD7I26Aq5H8OH5RIg==} + /eslint-plugin-svelte3/3.4.1_k4rvtr32uzrs6rwp57u73ssa6q: + resolution: {integrity: sha512-7p59WG8qV8L6wLdl4d/c3mdjkgVglQCdv5XOTk/iNPBKXuuV+Q0eFP5Wa6iJd/G2M1qR3BkLPEzaANOqKAZczw==} engines: {node: '>=10'} peerDependencies: eslint: '>=6.0.0' svelte: ^3.2.0 dependencies: eslint: 7.32.0 - svelte: 3.48.0 + svelte: 3.49.0 dev: true /eslint-scope/5.1.1: @@ -1672,7 +2120,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.3 + debug: 4.3.4 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -1686,7 +2134,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.12.1 + globals: 13.17.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -1700,7 +2148,7 @@ packages: optionator: 0.9.1 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.5 + semver: 7.3.7 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.0 @@ -1786,6 +2234,33 @@ packages: strip-final-newline: 2.0.0 dev: false + /exif-parser/0.1.12: + resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} + dev: false + + /expand-template/2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /fast-average-color-node/2.4.0: + resolution: {integrity: sha512-Vxh2JQWwHETAuIQM966/ULLprPIe78UrvyV+AUYJxyj4nBHwl4QYG6Ym77ZPDO4mYExVk0axKmU5EGXv7uAlaw==} + engines: {node: '>= 12'} + dependencies: + fast-average-color: 9.1.1 + node-fetch: 2.6.7 + sharp: 0.30.7 + transitivePeerDependencies: + - encoding + dev: false + + /fast-average-color/9.1.1: + resolution: {integrity: sha512-PJizLBcGb/jqUzrH66385te4+GcOK7wcUiCDvBUszdpzc/pvV1kwifvvsFygV3mS+7qwnWmK9/BrZniaOOC9ag==} + engines: {node: '>= 12'} + dependencies: + '@types/offscreencanvas': 2019.7.0 + dev: false + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -1798,14 +2273,14 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.5 /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true /fast-levenshtein/2.0.6: - resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true /fast-sort/2.2.0: @@ -1817,8 +2292,8 @@ packages: dependencies: reusify: 1.0.4 - /fetch-blob/3.1.5: - resolution: {integrity: sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==} + /fetch-blob/3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} dependencies: node-domexception: 1.0.0 @@ -1832,6 +2307,11 @@ packages: flat-cache: 3.0.4 dev: true + /file-type/9.0.0: + resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} + engines: {node: '>=6'} + dev: false + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1850,27 +2330,31 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.5 + flatted: 3.2.6 rimraf: 3.0.2 dev: true - /flatted/3.2.5: - resolution: {integrity: sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==} + /flatted/3.2.6: + resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} dev: true /formdata-polyfill/4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} dependencies: - fetch-blob: 3.1.5 + fetch-blob: 3.2.0 dev: true /fraction.js/4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} @@ -1883,16 +2367,15 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} /functional-red-black-tree/1.0.1: - resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: false /get-stream/3.0.0: - resolution: {integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=} + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} dev: true @@ -1902,17 +2385,28 @@ packages: dev: false /get-them-args/1.3.2: - resolution: {integrity: sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=} + resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} dev: true + /gifwrap/0.9.4: + resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} + dependencies: + image-q: 4.0.0 + omggif: 1.0.10 + dev: false + + /github-from-package/0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob/7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1921,13 +2415,19 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /global/4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + dependencies: + min-document: 2.19.0 + process: 0.11.10 + dev: false + /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: false - /globals/13.12.1: - resolution: {integrity: sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==} + /globals/13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -1935,7 +2435,6 @@ packages: /globalyzer/0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -1950,11 +2449,11 @@ packages: dev: true /globby/6.1.0: - resolution: {integrity: sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=} + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} engines: {node: '>=0.10.0'} dependencies: array-union: 1.0.2 - glob: 7.2.0 + glob: 7.2.3 object-assign: 4.1.1 pify: 2.3.0 pinkie-promise: 2.0.1 @@ -1962,26 +2461,13 @@ packages: /globrex/0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /graceful-fs/4.2.9: - resolution: {integrity: sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==} - dev: true - - /has-ansi/2.0.0: - resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - - /has-flag/1.0.0: - resolution: {integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=} - engines: {node: '>=0.10.0'} - dev: false - /has-flag/3.0.0: - resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} /has-flag/4.0.0: @@ -1996,7 +2482,7 @@ packages: function-bind: 1.1.1 /he/0.5.0: - resolution: {integrity: sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI=} + resolution: {integrity: sha512-DoufbNNOFzwRPy8uecq+j+VCPQ+JyDelHTmSgygrA5TsR8Cbw4Qcir5sGtWiusB4BdT89nmlaVDhSJOqC/33vw==} hasBin: true dev: false @@ -2010,6 +2496,10 @@ packages: engines: {node: '>=10.17.0'} dev: false + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} @@ -2020,6 +2510,12 @@ packages: engines: {node: '>= 4'} dev: true + /image-q/4.0.0: + resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==} + dependencies: + '@types/node': 16.9.1 + dev: false + /import-fresh/3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -2029,12 +2525,12 @@ packages: dev: true /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -2042,32 +2538,43 @@ packages: /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + /insane/2.6.2: - resolution: {integrity: sha1-wqtouz4AarRRVg0bRGkXMpwKgSA=} + resolution: {integrity: sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==} dependencies: assignment: 2.0.0 he: 0.5.0 dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-core-module/2.8.1: - resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true + + /is-function/1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + dev: false /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -2080,7 +2587,7 @@ packages: engines: {node: '>=0.12.0'} /is-stream/1.1.0: - resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: true @@ -2090,10 +2597,20 @@ packages: dev: false /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /js-base64/2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + /jimp/0.16.1: + resolution: {integrity: sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==} + dependencies: + '@babel/runtime': 7.18.9 + '@jimp/custom': 0.16.1 + '@jimp/plugins': 0.16.1_@jimp+custom@0.16.1 + '@jimp/types': 0.16.1_@jimp+custom@0.16.1 + regenerator-runtime: 0.13.9 + dev: false + + /jpeg-js/0.4.2: + resolution: {integrity: sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==} dev: false /js-tokens/4.0.0: @@ -2112,13 +2629,11 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: false /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: false /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2129,17 +2644,16 @@ packages: dev: true /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true /json5/2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dev: false - /kill-port-process/3.0.1: - resolution: {integrity: sha512-WAmjirZm4sL6Ooprf3AOQuwGHa83jMwsGPRl3qwbOswzP7OzUGI/Z76n/1gVfe2RUJXZmgo5Bf0VFLID0mk0hQ==} + /kill-port-process/3.1.0: + resolution: {integrity: sha512-sVODd2xDGzN3OaLGhHcJPiaRwWK0QZc+bD5YQTo3Xgh1AUg1AZgDYDeqRI6ILg4AhWrmSpupGwQEFK1G0Sy2fw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -2147,8 +2661,8 @@ packages: pid-from-port: 1.1.3 dev: true - /kleur/4.1.4: - resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==} + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true @@ -2164,13 +2678,26 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: false - /local-pkg/0.4.1: - resolution: {integrity: sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw==} + /load-bmfont/1.4.1: + resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==} + dependencies: + buffer-equal: 0.0.1 + mime: 1.6.0 + parse-bmfont-ascii: 1.0.6 + parse-bmfont-binary: 1.0.6 + parse-bmfont-xml: 1.1.4 + phin: 2.9.3 + xhr: 2.6.0 + xtend: 4.0.2 + dev: false + + /local-pkg/0.4.2: + resolution: {integrity: sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==} engines: {node: '>=14'} dev: false @@ -2182,7 +2709,7 @@ packages: dev: false /lodash.memoize/4.1.2: - resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: false /lodash.merge/4.6.2: @@ -2190,11 +2717,11 @@ packages: dev: true /lodash.truncate/4.4.2: - resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true /lodash.uniq/4.5.0: - resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: false /lodash/4.17.21: @@ -2213,16 +2740,22 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true - /magic-string/0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + /magic-string/0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 dev: true - /marked/4.0.15: - resolution: {integrity: sha512-esX5lPdTfG4p8LDkv+obbRCyOKzB+820ZZyMOXJZygZBHrH9b3xXR64X4kT3sPe9Nx8qQXbmcz6kFSMt4Nfk6Q==} + /magic-string/0.26.2: + resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /marked/4.0.18: + resolution: {integrity: sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw==} engines: {node: '>= 12'} hasBin: true dev: false @@ -2239,18 +2772,41 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromatch/4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mime/3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: false + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /min-document/2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + dependencies: + dom-walk: 0.1.2 + dev: false + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2261,16 +2817,18 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimist/1.2.5: - resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - dev: true + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - /mkdirp/0.5.5: - resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: - minimist: 1.2.5 - dev: true + minimist: 1.2.6 /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -2280,39 +2838,65 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /nanoid/3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /napi-build-utils/1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare/1.4.0: - resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /node-abi/3.22.0: + resolution: {integrity: sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.7 + dev: false + + /node-addon-api/5.0.0: + resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==} + dev: false + /node-domexception/1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} dev: true - /node-fetch/3.2.4: - resolution: {integrity: sha512-WvYJRN7mMyOLurFR2YpysQGuwYrJN+qrrpHjJDuKMcSPdfFccRUla/kng2mz6HWSBxJcqPbvatS6Gb4RhOzCJw==} + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch/3.2.10: + resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: data-uri-to-buffer: 4.0.0 - fetch-blob: 3.1.5 + fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 dev: true - /node-releases/2.0.4: - resolution: {integrity: sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==} - dev: false + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} /normalize-range/0.1.2: - resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} dev: false @@ -2322,7 +2906,7 @@ packages: dev: false /npm-run-path/2.0.2: - resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 @@ -2335,49 +2919,59 @@ packages: path-key: 3.1.1 dev: false - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: false /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: false - /omorphia/0.0.19_svelte@3.48.0: - resolution: {integrity: sha512-RhMkSRIEwadsQFOh4FPMKwRAepjZuEMrNQU4XYvWbYXLj3GRhhYcLqJMvE6VC8Um62GHhennY+VuBdpU3Q4Kcw==} + /omggif/1.0.10: + resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + dev: false + + /omorphia/0.0.67_svelte@3.49.0+vite@3.0.4: + resolution: {integrity: sha512-2MOdJ9OYaA2XuPMpca132tPTs7uU4tYTXhpJLOQmrEPgXxOQa1oDPu9BD0edndfFxJK2uCIOhciLf3NpT7kJoA==} + engines: {node: '>=16.5.0'} dependencies: - '@iconify-json/carbon': 1.1.1 - '@iconify-json/fa-regular': 1.1.1 - '@iconify-json/heroicons-outline': 1.1.1 - '@iconify-json/heroicons-solid': 1.1.1 - '@iconify-json/lucide': 1.1.21 - '@poppanator/sveltekit-svg': 0.3.2_svelte@3.48.0 - autoprefixer: 10.4.7_postcss@8.4.12 - cssnano: 5.1.7_postcss@8.4.12 + '@iconify-json/carbon': 1.1.7 + '@iconify-json/fa-regular': 1.1.2 + '@iconify-json/heroicons-outline': 1.1.2 + '@iconify-json/heroicons-solid': 1.1.2 + '@iconify-json/lucide': 1.1.38 + '@iconify-json/simple-icons': 1.1.20 + '@poppanator/sveltekit-svg': 0.3.4_svelte@3.49.0 + cli-progress: 3.11.2 + cssnano: 5.1.12_postcss@8.4.14 + fast-average-color-node: 2.4.0 highlight.js: 11.5.1 insane: 2.6.2 - marked: 4.0.15 - postcss: 8.4.12 - postcss-easy-import: 4.0.0_postcss@8.4.12 - postcss-extend-rule: 4.0.0_postcss@8.4.12 - postcss-import: 14.1.0_postcss@8.4.12 - postcss-import-ext-glob: 2.0.1_postcss@8.4.12 - postcss-load-config: 3.1.4_postcss@8.4.12 - postcss-nested: 5.0.6_postcss@8.4.12 - postcss-preset-env: 7.5.0_postcss@8.4.12 - postcss-pxtorem: 6.0.0_postcss@8.4.12 - postcss-strip-inline-comments: 0.1.5 + jimp: 0.16.1 + marked: 4.0.18 + openapi-typescript: 5.4.1 + postcss: 8.4.14 + postcss-easy-import: 4.0.0_postcss@8.4.14 + postcss-extend-rule: 4.0.0_postcss@8.4.14 + postcss-import: 14.1.0_postcss@8.4.14 + postcss-import-ext-glob: 2.0.1_postcss@8.4.14 + postcss-load-config: 3.1.4_postcss@8.4.14 + postcss-nested: 5.0.6_postcss@8.4.14 + postcss-preset-env: 7.7.2_postcss@8.4.14 + postcss-pxtorem: 6.0.0_postcss@8.4.14 sanitize.css: 13.0.0 - svelte-tiny-virtual-list: 2.0.3 + svelte-tiny-virtual-list: 2.0.5 svelte-use-click-outside: 1.0.0 throttle-debounce: 3.0.1 - unplugin-icons: 0.13.4 + undici: 5.8.0 + unplugin-icons: 0.14.8_vite@3.0.4 transitivePeerDependencies: - '@svgr/core' - '@vue/compiler-sfc' + - encoding - esbuild - rollup - supports-color @@ -2390,7 +2984,7 @@ packages: dev: false /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 @@ -2401,6 +2995,19 @@ packages: mimic-fn: 2.1.0 dev: false + /openapi-typescript/5.4.1: + resolution: {integrity: sha512-AGB2QiZPz4rE7zIwV3dRHtoUC/CWHhUjuzGXvtmMQN2AFV8xCTLKcZUHLcdPQmt/83i22nRE7+TxXOXkK+gf4Q==} + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + js-yaml: 4.1.0 + mime: 3.0.0 + prettier: 2.7.1 + tiny-glob: 0.2.9 + undici: 5.8.0 + yargs-parser: 21.0.1 + dev: false + /optionator/0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} @@ -2414,7 +3021,7 @@ packages: dev: true /p-finally/1.0.0: - resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: true @@ -2432,6 +3039,10 @@ packages: p-limit: 3.1.0 dev: false + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2439,17 +3050,36 @@ packages: callsites: 3.1.0 dev: true + /parse-bmfont-ascii/1.0.6: + resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} + dev: false + + /parse-bmfont-binary/1.0.6: + resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} + dev: false + + /parse-bmfont-xml/1.1.4: + resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==} + dependencies: + xml-parse-from-string: 1.0.1 + xml2js: 0.4.23 + dev: false + + /parse-headers/2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + dev: false + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: false /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} /path-key/2.0.1: - resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: true @@ -2463,13 +3093,17 @@ packages: /path-starts-with/2.0.0: resolution: {integrity: sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==} engines: {node: '>=8'} - dev: false + dev: true /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true + /phin/2.9.3: + resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} + dev: false + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -2485,196 +3119,211 @@ packages: dev: true /pify/2.3.0: - resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=} + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: false /pify/3.0.0: - resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: false /pinkie-promise/2.0.1: - resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: false /pinkie/2.0.4: - resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: false - /postcss-attribute-case-insensitive/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==} - peerDependencies: - postcss: ^8.0.2 + /pixelmatch/4.0.2: + resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} + hasBin: true dependencies: - postcss: 8.4.12 + pngjs: 3.4.0 + dev: false + + /pngjs/3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + dev: false + + /postcss-attribute-case-insensitive/5.0.2_postcss@8.4.14: + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-calc/8.2.4_postcss@8.4.12: + /postcss-calc/8.2.4_postcss@8.4.14: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 dev: false - /postcss-clamp/4.1.0_postcss@8.4.12: + /postcss-clamp/4.1.0_postcss@8.4.14: resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-functional-notation/4.2.2_postcss@8.4.12: - resolution: {integrity: sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==} + /postcss-color-functional-notation/4.2.4_postcss@8.4.14: + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-color-hex-alpha/8.0.4_postcss@8.4.14: + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-hex-alpha/8.0.3_postcss@8.4.12: - resolution: {integrity: sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==} + /postcss-color-rebeccapurple/7.1.1_postcss@8.4.14: + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-color-rebeccapurple/7.0.2_postcss@8.4.12: - resolution: {integrity: sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.3 - dependencies: - postcss: 8.4.12 - postcss-value-parser: 4.2.0 - dev: false - - /postcss-colormin/5.3.0_postcss@8.4.12: + /postcss-colormin/5.3.0_postcss@8.4.14: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 + browserslist: 4.21.3 caniuse-api: 3.0.0 colord: 2.9.2 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==} + /postcss-convert-values/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + browserslist: 4.21.3 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-media/8.0.0_postcss@8.4.12: - resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} - engines: {node: '>=10.0.0'} + /postcss-custom-media/8.0.2_postcss@8.4.14: + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 dev: false - /postcss-custom-properties/12.1.7_postcss@8.4.12: - resolution: {integrity: sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==} + /postcss-custom-properties/12.1.8_postcss@8.4.14: + resolution: {integrity: sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-custom-selectors/6.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==} - engines: {node: '>=10.0.0'} - peerDependencies: - postcss: ^8.1.2 - dependencies: - postcss: 8.4.12 - postcss-selector-parser: 6.0.10 - dev: false - - /postcss-dir-pseudo-class/6.0.4_postcss@8.4.12: - resolution: {integrity: sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==} + /postcss-custom-selectors/6.0.3_postcss@8.4.14: + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-discard-comments/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} + /postcss-dir-pseudo-class/6.0.5_postcss@8.4.14: + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: ^8.2 + dependencies: + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 + dev: false + + /postcss-discard-comments/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-duplicates/5.1.0_postcss@8.4.12: + /postcss-discard-duplicates/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-empty/5.1.1_postcss@8.4.12: + /postcss-discard-empty/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-discard-overridden/5.1.0_postcss@8.4.12: + /postcss-discard-overridden/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-double-position-gradients/3.1.1_postcss@8.4.12: - resolution: {integrity: sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==} + /postcss-double-position-gradients/3.1.2_postcss@8.4.14: + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-easy-import/4.0.0_postcss@8.4.12: + /postcss-easy-import/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-Nq5/zsnyMyzz1D7Y7TC1hawNLWQLlh4eJnsM9zlxtc8mAeY8edlvSO1UGs1hyQvNvzK3OJ1bgLjsuyTijyvBEQ==} engines: {node: '>=10.0.0'} peerDependencies: @@ -2685,121 +3334,121 @@ packages: lodash: 4.17.21 object-assign: 4.1.1 pify: 3.0.0 - postcss: 8.4.12 - postcss-import: 14.1.0_postcss@8.4.12 - resolve: 1.22.0 + postcss: 8.4.14 + postcss-import: 14.1.0_postcss@8.4.14 + resolve: 1.22.1 dev: false - /postcss-env-function/4.0.6_postcss@8.4.12: + /postcss-env-function/4.0.6_postcss@8.4.14: resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-extend-rule/4.0.0_postcss@8.4.12: + /postcss-extend-rule/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-3gjPWUDNYjkRjtcpoN8ppZRXG8vyAk4mYdkYOETacCkCLVguW5IpCXCO31cDk8SW2/rx0RogWcXm1Zu/EayDVg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4.6 dependencies: - postcss: 8.4.12 - postcss-nesting: 10.1.4_postcss@8.4.12 + postcss: 8.4.14 + postcss-nesting: 10.1.10_postcss@8.4.14 dev: false - /postcss-focus-visible/6.0.4_postcss@8.4.12: + /postcss-focus-visible/6.0.4_postcss@8.4.14: resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-focus-within/5.0.4_postcss@8.4.12: + /postcss-focus-within/5.0.4_postcss@8.4.14: resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-font-variant/5.0.0_postcss@8.4.12: + /postcss-font-variant/5.0.0_postcss@8.4.14: resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-gap-properties/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==} + /postcss-gap-properties/3.0.5_postcss@8.4.14: + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-image-set-function/4.0.6_postcss@8.4.12: - resolution: {integrity: sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==} + /postcss-image-set-function/4.0.7_postcss@8.4.14: + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-import-ext-glob/2.0.1_postcss@8.4.12: + /postcss-import-ext-glob/2.0.1_postcss@8.4.14: resolution: {integrity: sha512-cCvzsZBPuhLCOAfkPeBnJ31uz5azlAjNb5Aug1f2nlomgZK+WD7Uwfrk+epFU9PI20rsMAineDUK4Ty+jEQHcg==} peerDependencies: postcss: ^8.2.0 dependencies: fast-glob: 3.2.11 fast-sort: 2.2.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-import/14.1.0_postcss@8.4.12: + /postcss-import/14.1.0_postcss@8.4.14: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.0 + resolve: 1.22.1 dev: false - /postcss-initial/4.0.1_postcss@8.4.12: + /postcss-initial/4.0.1_postcss@8.4.14: resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-lab-function/4.2.0_postcss@8.4.12: - resolution: {integrity: sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==} + /postcss-lab-function/4.2.1_postcss@8.4.14: + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - postcss: 8.4.12 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-load-config/3.1.4_postcss@8.4.12: + /postcss-load-config/3.1.4_postcss@8.4.14: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -2811,205 +3460,206 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.5 - postcss: 8.4.12 + lilconfig: 2.0.6 + postcss: 8.4.14 yaml: 1.10.2 dev: false - /postcss-logical/5.0.4_postcss@8.4.12: + /postcss-logical/5.0.4_postcss@8.4.14: resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-media-minmax/5.0.0_postcss@8.4.12: + /postcss-media-minmax/5.0.0_postcss@8.4.14: resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-merge-longhand/5.1.4_postcss@8.4.12: - resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} + /postcss-merge-longhand/5.1.6_postcss@8.4.14: + resolution: {integrity: sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 - stylehacks: 5.1.0_postcss@8.4.12 + stylehacks: 5.1.0_postcss@8.4.14 dev: false - /postcss-merge-rules/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==} + /postcss-merge-rules/5.1.2_postcss@8.4.14: + resolution: {integrity: sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 + browserslist: 4.21.3 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-minify-font-values/5.1.0_postcss@8.4.12: + /postcss-minify-font-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients/5.1.1_postcss@8.4.12: + /postcss-minify-gradients/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.2 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params/5.1.2_postcss@8.4.12: - resolution: {integrity: sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==} + /postcss-minify-params/5.1.3_postcss@8.4.14: + resolution: {integrity: sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + browserslist: 4.21.3 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors/5.2.0_postcss@8.4.12: - resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} + /postcss-minify-selectors/5.2.1_postcss@8.4.14: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-nested/5.0.6_postcss@8.4.12: + /postcss-nested/5.0.6_postcss@8.4.14: resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-nesting/10.1.4_postcss@8.4.12: - resolution: {integrity: sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==} + /postcss-nesting/10.1.10_postcss@8.4.14: + resolution: {integrity: sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + '@csstools/selector-specificity': 2.0.2_444rcjjorr3kpoqtvoodsr46pu + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-normalize-charset/5.1.0_postcss@8.4.12: + /postcss-normalize-charset/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-normalize-display-values/5.1.0_postcss@8.4.12: + /postcss-normalize-display-values/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==} + /postcss-normalize-positions/5.1.1_postcss@8.4.14: + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style/5.1.0_postcss@8.4.12: - resolution: {integrity: sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==} + /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14: + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string/5.1.0_postcss@8.4.12: + /postcss-normalize-string/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.12: + /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode/5.1.0_postcss@8.4.12: + /postcss-normalize-unicode/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 - postcss: 8.4.12 + browserslist: 4.21.3 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url/5.1.0_postcss@8.4.12: + /postcss-normalize-url/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace/5.1.1_postcss@8.4.12: + /postcss-normalize-whitespace/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false @@ -3018,152 +3668,156 @@ packages: engines: {node: ^12 || ^14 || >=16} dev: false - /postcss-ordered-values/5.1.1_postcss@8.4.12: - resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} + /postcss-ordered-values/5.1.3_postcss@8.4.14: + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0_postcss@8.4.12 - postcss: 8.4.12 + cssnano-utils: 3.1.0_postcss@8.4.14 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-overflow-shorthand/3.0.3_postcss@8.4.12: - resolution: {integrity: sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==} + /postcss-overflow-shorthand/3.0.4_postcss@8.4.14: + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 dev: false - /postcss-page-break/3.0.4_postcss@8.4.12: + /postcss-page-break/3.0.4_postcss@8.4.14: resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-place/7.0.4_postcss@8.4.12: - resolution: {integrity: sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==} + /postcss-place/7.0.5_postcss@8.4.14: + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-preset-env/7.5.0_postcss@8.4.12: - resolution: {integrity: sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==} + /postcss-preset-env/7.7.2_postcss@8.4.14: + resolution: {integrity: sha512-1q0ih7EDsZmCb/FMDRvosna7Gsbdx8CvYO5hYT120hcp2ZAuOHpSzibujZ4JpIUcAC02PG6b+eftxqjTFh5BNA==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - '@csstools/postcss-color-function': 1.1.0_postcss@8.4.12 - '@csstools/postcss-font-format-keywords': 1.0.0_postcss@8.4.12 - '@csstools/postcss-hwb-function': 1.0.0_postcss@8.4.12 - '@csstools/postcss-ic-unit': 1.0.0_postcss@8.4.12 - '@csstools/postcss-is-pseudo-class': 2.0.2_postcss@8.4.12 - '@csstools/postcss-normalize-display-values': 1.0.0_postcss@8.4.12 - '@csstools/postcss-oklab-function': 1.1.0_postcss@8.4.12 - '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.12 - '@csstools/postcss-stepped-value-functions': 1.0.0_postcss@8.4.12 - '@csstools/postcss-unset-value': 1.0.0_postcss@8.4.12 - autoprefixer: 10.4.7_postcss@8.4.12 - browserslist: 4.20.3 - css-blank-pseudo: 3.0.3_postcss@8.4.12 - css-has-pseudo: 3.0.4_postcss@8.4.12 - css-prefers-color-scheme: 6.0.3_postcss@8.4.12 - cssdb: 6.6.1 - postcss: 8.4.12 - postcss-attribute-case-insensitive: 5.0.0_postcss@8.4.12 - postcss-clamp: 4.1.0_postcss@8.4.12 - postcss-color-functional-notation: 4.2.2_postcss@8.4.12 - postcss-color-hex-alpha: 8.0.3_postcss@8.4.12 - postcss-color-rebeccapurple: 7.0.2_postcss@8.4.12 - postcss-custom-media: 8.0.0_postcss@8.4.12 - postcss-custom-properties: 12.1.7_postcss@8.4.12 - postcss-custom-selectors: 6.0.0_postcss@8.4.12 - postcss-dir-pseudo-class: 6.0.4_postcss@8.4.12 - postcss-double-position-gradients: 3.1.1_postcss@8.4.12 - postcss-env-function: 4.0.6_postcss@8.4.12 - postcss-focus-visible: 6.0.4_postcss@8.4.12 - postcss-focus-within: 5.0.4_postcss@8.4.12 - postcss-font-variant: 5.0.0_postcss@8.4.12 - postcss-gap-properties: 3.0.3_postcss@8.4.12 - postcss-image-set-function: 4.0.6_postcss@8.4.12 - postcss-initial: 4.0.1_postcss@8.4.12 - postcss-lab-function: 4.2.0_postcss@8.4.12 - postcss-logical: 5.0.4_postcss@8.4.12 - postcss-media-minmax: 5.0.0_postcss@8.4.12 - postcss-nesting: 10.1.4_postcss@8.4.12 + '@csstools/postcss-cascade-layers': 1.0.5_postcss@8.4.14 + '@csstools/postcss-color-function': 1.1.1_postcss@8.4.14 + '@csstools/postcss-font-format-keywords': 1.0.1_postcss@8.4.14 + '@csstools/postcss-hwb-function': 1.0.2_postcss@8.4.14 + '@csstools/postcss-ic-unit': 1.0.1_postcss@8.4.14 + '@csstools/postcss-is-pseudo-class': 2.0.7_postcss@8.4.14 + '@csstools/postcss-normalize-display-values': 1.0.1_postcss@8.4.14 + '@csstools/postcss-oklab-function': 1.1.1_postcss@8.4.14 + '@csstools/postcss-progressive-custom-properties': 1.3.0_postcss@8.4.14 + '@csstools/postcss-stepped-value-functions': 1.0.1_postcss@8.4.14 + '@csstools/postcss-trigonometric-functions': 1.0.2_postcss@8.4.14 + '@csstools/postcss-unset-value': 1.0.2_postcss@8.4.14 + autoprefixer: 10.4.8_postcss@8.4.14 + browserslist: 4.21.3 + css-blank-pseudo: 3.0.3_postcss@8.4.14 + css-has-pseudo: 3.0.4_postcss@8.4.14 + css-prefers-color-scheme: 6.0.3_postcss@8.4.14 + cssdb: 6.6.3 + postcss: 8.4.14 + postcss-attribute-case-insensitive: 5.0.2_postcss@8.4.14 + postcss-clamp: 4.1.0_postcss@8.4.14 + postcss-color-functional-notation: 4.2.4_postcss@8.4.14 + postcss-color-hex-alpha: 8.0.4_postcss@8.4.14 + postcss-color-rebeccapurple: 7.1.1_postcss@8.4.14 + postcss-custom-media: 8.0.2_postcss@8.4.14 + postcss-custom-properties: 12.1.8_postcss@8.4.14 + postcss-custom-selectors: 6.0.3_postcss@8.4.14 + postcss-dir-pseudo-class: 6.0.5_postcss@8.4.14 + postcss-double-position-gradients: 3.1.2_postcss@8.4.14 + postcss-env-function: 4.0.6_postcss@8.4.14 + postcss-focus-visible: 6.0.4_postcss@8.4.14 + postcss-focus-within: 5.0.4_postcss@8.4.14 + postcss-font-variant: 5.0.0_postcss@8.4.14 + postcss-gap-properties: 3.0.5_postcss@8.4.14 + postcss-image-set-function: 4.0.7_postcss@8.4.14 + postcss-initial: 4.0.1_postcss@8.4.14 + postcss-lab-function: 4.2.1_postcss@8.4.14 + postcss-logical: 5.0.4_postcss@8.4.14 + postcss-media-minmax: 5.0.0_postcss@8.4.14 + postcss-nesting: 10.1.10_postcss@8.4.14 postcss-opacity-percentage: 1.1.2 - postcss-overflow-shorthand: 3.0.3_postcss@8.4.12 - postcss-page-break: 3.0.4_postcss@8.4.12 - postcss-place: 7.0.4_postcss@8.4.12 - postcss-pseudo-class-any-link: 7.1.3_postcss@8.4.12 - postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.12 - postcss-selector-not: 5.0.0_postcss@8.4.12 + postcss-overflow-shorthand: 3.0.4_postcss@8.4.14 + postcss-page-break: 3.0.4_postcss@8.4.14 + postcss-place: 7.0.5_postcss@8.4.14 + postcss-pseudo-class-any-link: 7.1.6_postcss@8.4.14 + postcss-replace-overflow-wrap: 4.0.0_postcss@8.4.14 + postcss-selector-not: 6.0.1_postcss@8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-pseudo-class-any-link/7.1.3_postcss@8.4.12: - resolution: {integrity: sha512-I9Yp1VV2r8xFwg/JrnAlPCcKmutv6f6Ig6/CHFPqGJiDgYXM9C+0kgLfK4KOXbKNw+63QYl4agRUB0Wi9ftUIg==} + /postcss-pseudo-class-any-link/7.1.6_postcss@8.4.14: + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.4 + postcss: ^8.2 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /postcss-pxtorem/6.0.0_postcss@8.4.12: + /postcss-pxtorem/6.0.0_postcss@8.4.14: resolution: {integrity: sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-reduce-initial/5.1.0_postcss@8.4.12: + /postcss-reduce-initial/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 + browserslist: 4.21.3 caniuse-api: 3.0.0 - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-reduce-transforms/5.1.0_postcss@8.4.12: + /postcss-reduce-transforms/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: false - /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.12: + /postcss-replace-overflow-wrap/4.0.0_postcss@8.4.14: resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 dev: false - /postcss-selector-not/5.0.0_postcss@8.4.12: - resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==} + /postcss-selector-not/6.0.1_postcss@8.4.14: + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.2 dependencies: - balanced-match: 1.0.2 - postcss: 8.4.12 + postcss: 8.4.14 + postcss-selector-parser: 6.0.10 dev: false /postcss-selector-parser/6.0.10: @@ -3174,30 +3828,24 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-strip-inline-comments/0.1.5: - resolution: {integrity: sha1-f/a83BTmM+1M36AguuPt2tT4S5A=} - dependencies: - postcss: 5.2.18 - dev: false - - /postcss-svgo/5.1.0_postcss@8.4.12: + /postcss-svgo/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false - /postcss-unique-selectors/5.1.1_postcss@8.4.12: + /postcss-unique-selectors/5.1.1_postcss@8.4.14: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.12 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false @@ -3205,52 +3853,65 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss/5.2.18: - resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} - engines: {node: '>=0.12'} - dependencies: - chalk: 1.1.3 - js-base64: 2.6.4 - source-map: 0.5.7 - supports-color: 3.2.3 - dev: false - - /postcss/8.4.12: - resolution: {integrity: sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==} + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.1 + nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 - /precompile-intl-runtime/0.5.1_svelte@3.48.0: - resolution: {integrity: sha512-/08faNpx76Ui9sxO2H/bGhKmWNcl8AMzUvH5kesAEbiUg9WTDZcxAd26bYxGuDz9eHBFTUuHCtc+x5k+UqQyLg==} + /prebuild-install/7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.6 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.22.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /precompile-intl-runtime/0.7.0_svelte@3.49.0: + resolution: {integrity: sha512-Zics5Ia/YAb8zE+hkFnkOdJBfdJ1mrCY++pvenIyz6y9lVh0Gz/SW4tQ1TBcn8eFMPRqURqMVUot6dp09PZYOA==} peerDependencies: svelte: ^3.37.0 dependencies: - svelte: 3.48.0 - dev: false + svelte: 3.49.0 + dev: true /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte/2.6.0_prettier@2.5.1+svelte@3.48.0: - resolution: {integrity: sha512-NPSRf6Y5rufRlBleok/pqg4+1FyGsL0zYhkYP6hnueeL1J/uCm3OfOZPsLX4zqD9VAdcXfyEL2PYqGv8ZoOSfA==} + /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi: + resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 dependencies: - prettier: 2.5.1 - svelte: 3.48.0 + prettier: 2.7.1 + svelte: 3.49.0 dev: true - /prettier/2.5.1: - resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} + /prettier/2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true - dev: true + + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} @@ -3258,9 +3919,16 @@ packages: dev: true /pseudomap/1.0.2: - resolution: {integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=} + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -3269,18 +3937,41 @@ packages: /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.6 + strip-json-comments: 2.0.1 + dev: false + /read-cache/1.0.0: - resolution: {integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=} + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: false + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: false + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -3296,11 +3987,11 @@ packages: engines: {node: '>=4'} dev: true - /resolve/1.22.0: - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.8.1 + is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -3312,23 +4003,22 @@ packages: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 dev: true /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 dev: true - /rollup/2.67.3: - resolution: {integrity: sha512-G/x1vUwbGtP6O5ZM8/sWr8+p7YfZhI18pPqMRtMYMWSbHjKZ/ajHGiM+GWNTlWyOR0EHIdT8LHU+Z4ciIZ1oBw==} + /rollup/2.77.2: + resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3344,14 +4034,17 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false /sander/0.5.1: - resolution: {integrity: sha1-dB4kXiMfB8r7b98PEzrfohalAq0=} + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: es6-promise: 3.3.1 - graceful-fs: 4.2.9 - mkdirp: 0.5.5 + graceful-fs: 4.2.10 + mkdirp: 0.5.6 rimraf: 2.7.1 dev: true @@ -3359,21 +4052,38 @@ packages: resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} dev: false + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - dev: false - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - dev: true + + /sharp/0.30.7: + resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} + engines: {node: '>=12.13.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.1 + node-addon-api: 5.0.0 + prebuild-install: 7.1.1 + semver: 7.3.7 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false /shebang-command/1.2.0: - resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 @@ -3386,7 +4096,7 @@ packages: shebang-regex: 3.0.0 /shebang-regex/1.0.0: - resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: true @@ -3397,6 +4107,24 @@ packages: /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get/4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3412,11 +4140,11 @@ packages: dev: true /sorcery/0.10.0: - resolution: {integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc=} + resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} hasBin: true dependencies: buffer-crc32: 0.2.13 - minimist: 1.2.5 + minimist: 1.2.6 sander: 0.5.1 sourcemap-codec: 1.4.8 dev: true @@ -3425,31 +4153,22 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} - engines: {node: '>=0.10.0'} - dev: false - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: false - /source-map/0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: true - /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true /sprintf-js/1.0.3: - resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true /stable/0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' dev: false /string-width/4.2.3: @@ -3459,13 +4178,11 @@ packages: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: true - /strip-ansi/3.0.1: - resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=} - engines: {node: '>=0.10.0'} + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: - ansi-regex: 2.1.1 + safe-buffer: 5.2.1 dev: false /strip-ansi/6.0.1: @@ -3473,15 +4190,14 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-bom/5.0.0: resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} engines: {node: '>=12'} - dev: false + dev: true /strip-eof/1.0.0: - resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: true @@ -3497,34 +4213,27 @@ packages: min-indent: 1.0.1 dev: true + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /stylehacks/5.1.0_postcss@8.4.12: + /stylehacks/5.1.0_postcss@8.4.14: resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.20.3 - postcss: 8.4.12 + browserslist: 4.21.3 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: false - /supports-color/2.0.0: - resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=} - engines: {node: '>=0.8.0'} - dev: false - - /supports-color/3.2.3: - resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=} - engines: {node: '>=0.8.0'} - dependencies: - has-flag: 1.0.0 - dev: false - /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3542,21 +4251,20 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check/2.4.5_c41d0477867e5b4ada3cfb73a51f73fe: - resolution: {integrity: sha512-nRft8BbG2wcxyCdHDZ7X43xLcvDzua3xLwq6wzHGcAF3ka3Jyhv2rvgq0+SF9NwHLMefp9C2XkM6etzsxK/cMQ==} + /svelte-check/2.8.0_jm7k62256lskgsykp6r2fix7f4: + resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==} hasBin: true peerDependencies: svelte: ^3.24.0 dependencies: + '@jridgewell/trace-mapping': 0.3.14 chokidar: 3.5.3 fast-glob: 3.2.11 import-fresh: 3.3.0 - minimist: 1.2.5 picocolors: 1.0.0 sade: 1.8.1 - source-map: 0.7.3 - svelte: 3.48.0 - svelte-preprocess: 4.10.3_48f50bbfe234019669ab66f0654069eb + svelte: 3.49.0 + svelte-preprocess: 4.10.7_3efltl5pc3dgiobctbl4ejtqrm typescript: 4.5.5 transitivePeerDependencies: - '@babel/core' @@ -3571,30 +4279,31 @@ packages: - sugarss dev: true - /svelte-hmr/0.14.9_svelte@3.48.0: - resolution: {integrity: sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==} + /svelte-hmr/0.14.12_svelte@3.49.0: + resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: '>=3.19.0' dependencies: - svelte: 3.48.0 + svelte: 3.49.0 dev: true - /svelte-intl-precompile/0.9.2_svelte@3.48.0: - resolution: {integrity: sha512-WvKI975WqlUB5g45d3mmViqHKwFe63UReFMLp4Hhd5Ow1YluvRe/zIAZ0lCMq28MjMa33oQvQic3OqGVGWhZdQ==} + /svelte-intl-precompile/0.11.1_svelte@3.49.0: + resolution: {integrity: sha512-P91cUUtaTkCjZiQBlcfPDaS0U9yTJSXTKsqK83bq2iLSvPFkb/JHNMPwEG+aph11CY6Y4GcZI1rsB905GG7tmw==} dependencies: - babel-plugin-precompile-intl: 0.3.0 + babel-plugin-precompile-intl: 0.5.1 js-yaml: 4.1.0 json5: 2.2.1 path-starts-with: 2.0.0 - precompile-intl-runtime: 0.5.1_svelte@3.48.0 + precompile-intl-runtime: 0.7.0_svelte@3.49.0 strip-bom: 5.0.0 transitivePeerDependencies: - supports-color - svelte - dev: false + dev: true - /svelte-preprocess/4.10.3_48f50bbfe234019669ab66f0654069eb: - resolution: {integrity: sha512-ttw17lJfb/dx2ZJT9sesaXT5l7mPQ9Apx1H496Kli3Hkk7orIRGpOw6rCPkRNzr6ueVPqb4vzodS5x7sBFhKHw==} + /svelte-preprocess/4.10.7_3efltl5pc3dgiobctbl4ejtqrm: + resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true peerDependencies: @@ -3603,7 +4312,7 @@ packages: less: ^3.11.3 || ^4.0.0 node-sass: '*' postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 pug: ^3.0.0 sass: ^1.26.8 stylus: ^0.55.0 @@ -3634,29 +4343,28 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.10 + '@babel/core': 7.18.9 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 - magic-string: 0.25.7 + magic-string: 0.25.9 sorcery: 0.10.0 strip-indent: 3.0.0 - svelte: 3.48.0 + svelte: 3.49.0 typescript: 4.5.5 dev: true - /svelte-tiny-virtual-list/2.0.3: - resolution: {integrity: sha512-f2V8xlB+5bnsQ2w02MqQvD/vTUrVr1QLacbDU8DNVNby/YMKX8b8IOft//eJId9Wv3ATaiIpnFpRD5ojt9MYtw==} + /svelte-tiny-virtual-list/2.0.5: + resolution: {integrity: sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==} dev: false /svelte-use-click-outside/1.0.0: resolution: {integrity: sha512-tOWeMPxeIoW9RshS0WbogRhdYdbxcJV0ebkzSh1lwR7Ihl0hSZMmB4YyCHHoXJK4xcbxCCFh0AnQ1vkzGZfLVQ==} dev: false - /svelte/3.48.0: - resolution: {integrity: sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==} + /svelte/3.49.0: + resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==} engines: {node: '>= 8'} - dev: true /svgo/2.8.0: resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} @@ -3672,23 +4380,43 @@ packages: stable: 0.1.8 dev: false - /svrollbar/0.10.4: - resolution: {integrity: sha512-+DsnE0CoduoQ8TN6Zfzwgvo363QaBCUVsLVrkn2BAqJ3i7DHZmsblVSjfZojgIDrmCNuQK19zazvRXLWaXB3vA==} + /svrollbar/0.12.0: + resolution: {integrity: sha512-okH0sz8bGtw+tgOfN1mpEtbveifxROcE3mbUMBJ1RQz8Q+1rVr+nVG7EAJ9b0G80cGDu7dskjAWuzj3iru0k5g==} dev: false /table/6.8.0: resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.10.0 + ajv: 8.11.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 dev: true + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + /text-table/0.2.0: - resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true /throttle-debounce/3.0.1: @@ -3696,17 +4424,23 @@ packages: engines: {node: '>=10'} dev: false + /timm/1.7.1: + resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} + dev: false + /tiny-glob/0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: globalyzer: 0.1.0 globrex: 0.1.2 - dev: true + + /tinycolor2/1.4.2: + resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} + dev: false /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: false /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3714,12 +4448,17 @@ packages: dependencies: is-number: 7.0.0 + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.3.1: - resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + /tslib/2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: true /tsutils/3.21.0_typescript@4.5.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -3731,6 +4470,12 @@ packages: typescript: 4.5.5 dev: true + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3743,19 +4488,19 @@ packages: engines: {node: '>=10'} dev: true - /type-fest/2.11.2: - resolution: {integrity: sha512-reW2Y2Mpn0QNA/5fvtm5doROLwDPu2zOm5RtY7xQQS05Q7xgC8MOZ3yPNaP9m/s/sNjjFQtHo7VCNqYW2iI+Ig==} - engines: {node: '>=12.20'} - dev: false - /typescript/4.5.5: resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /unplugin-icons/0.13.2: - resolution: {integrity: sha512-Dwfn5DkKrp/BpZV0R/2wgU39j+kjkeuIQ54PmJ9LhXNpNAS+Huf6Fl/PUmUrlWOvMAz0uPo3y/5lQKZUBjBkBQ==} + /undici/5.8.0: + resolution: {integrity: sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==} + engines: {node: '>=12.18'} + dev: false + + /unplugin-icons/0.14.8_vite@3.0.4: + resolution: {integrity: sha512-YxLC0Uxec+ayl8ju3CXmRX4Jg7IF8Tu2cRyq/okXwMK6fM140SPae332ByTlul1E/I7I0PXYSVVn8SlGunM/2g==} peerDependencies: '@svgr/core': '>=5.5.0' '@vue/compiler-sfc': ^3.0.2 @@ -3772,12 +4517,12 @@ packages: optional: true dependencies: '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.5.0 - '@iconify/utils': 1.0.23 - debug: 4.3.3 + '@antfu/utils': 0.5.2 + '@iconify/utils': 1.0.33 + debug: 4.3.4 kolorist: 1.5.1 - local-pkg: 0.4.1 - unplugin: 0.3.3 + local-pkg: 0.4.2 + unplugin: 0.8.0_vite@3.0.4 transitivePeerDependencies: - esbuild - rollup @@ -3786,64 +4531,12 @@ packages: - webpack dev: false - /unplugin-icons/0.13.4: - resolution: {integrity: sha512-gyp5H4WADnXEE1uk8+NW6gnnALOlSpU8M5GwzNCYbUgjM4QudjcFbacHKuuqETk4VeSJyzM9Z2ufbuZFMuxvuQ==} - peerDependencies: - '@svgr/core': '>=5.5.0' - '@vue/compiler-sfc': ^3.0.2 - vue-template-compiler: ^2.6.12 - vue-template-es2015-compiler: ^1.9.0 - peerDependenciesMeta: - '@svgr/core': - optional: true - '@vue/compiler-sfc': - optional: true - vue-template-compiler: - optional: true - vue-template-es2015-compiler: - optional: true - dependencies: - '@antfu/install-pkg': 0.1.0 - '@antfu/utils': 0.5.0 - '@iconify/utils': 1.0.23 - debug: 4.3.3 - kolorist: 1.5.1 - local-pkg: 0.4.1 - unplugin: 0.4.0 - transitivePeerDependencies: - - esbuild - - rollup - - supports-color - - vite - - webpack - dev: false - - /unplugin/0.3.3: - resolution: {integrity: sha512-WjZWpUqqcYPQ/efR00Zm2m1+J1LitwoZ4uhHV4VdZ+IpW0Nh/qnDYtVf+nLhozXdGxslMPecOshVR7NiWFl4gA==} + /unplugin/0.8.0_vite@3.0.4: + resolution: {integrity: sha512-OzOkJ9XOPlD1Cph6qy/p4i/KSUbs76GToXjH/STHpfo6D7y+EqpfAL6G6HaoOw5QLkt9+KWwcxYUmPFkDf1upQ==} peerDependencies: esbuild: '>=0.13' rollup: ^2.50.0 - vite: ^2.3.0 - webpack: 4 || 5 - peerDependenciesMeta: - esbuild: - optional: true - rollup: - optional: true - vite: - optional: true - webpack: - optional: true - dependencies: - webpack-virtual-modules: 0.4.3 - dev: false - - /unplugin/0.4.0: - resolution: {integrity: sha512-4ScITEmzlz1iZW3tkz+3L1V5k/xMQ6kjgm4lEXKxH0ozd8/OUWfiSA7RMRyrawsvq/t50JIzPpp1UyuSL/AXkA==} - peerDependencies: - esbuild: '>=0.13' - rollup: ^2.50.0 - vite: ^2.3.0 + vite: ^2.3.0 || ^3.0.0-0 webpack: 4 || 5 peerDependenciesMeta: esbuild: @@ -3855,32 +4548,52 @@ packages: webpack: optional: true dependencies: + acorn: 8.8.0 chokidar: 3.5.3 - webpack-virtual-modules: 0.4.3 + vite: 3.0.4 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.4.4 dev: false + /update-browserslist-db/1.0.5_browserslist@4.21.3: + resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.3 + escalade: 3.1.1 + picocolors: 1.0.0 + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true + /utif/2.0.1: + resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} + dependencies: + pako: 1.0.11 + dev: false + /util-deprecate/1.0.2: - resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite/2.9.1: - resolution: {integrity: sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==} - engines: {node: '>=12.2.0'} + /vite/3.0.4: + resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==} + engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: less: '*' sass: '*' stylus: '*' + terser: ^5.4.0 peerDependenciesMeta: less: optional: true @@ -3888,22 +4601,39 @@ packages: optional: true stylus: optional: true + terser: + optional: true dependencies: - esbuild: 0.14.30 - postcss: 8.4.12 - resolve: 1.22.0 - rollup: 2.67.3 + esbuild: 0.14.51 + postcss: 8.4.14 + resolve: 1.22.1 + rollup: 2.77.2 optionalDependencies: fsevents: 2.3.2 - dev: true /web-streams-polyfill/3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} dev: true - /webpack-virtual-modules/0.4.3: - resolution: {integrity: sha512-5NUqC2JquIL2pBAAo/VfBP6KuGkHIZQXW/lNKupLPfhViwh8wNsu0BObtl09yuKZszeEUfbXz8xhrHvSG16Nqw==} + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webpack-sources/3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: false + + /webpack-virtual-modules/0.4.4: + resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 dev: false /which/1.3.1: @@ -3926,21 +4656,56 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /xhr/2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + dev: false + + /xml-parse-from-string/1.0.1: + resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} + dev: false + + /xml2js/0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false /yallist/2.1.2: - resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: false + /yargs-parser/21.0.1: + resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + engines: {node: '>=12'} + dev: false + /yocto-queue/0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} diff --git a/theseus_gui/postcss.config.cjs b/theseus_gui/postcss.config.cjs index af2bac4cd..1c456ce2c 100644 --- a/theseus_gui/postcss.config.cjs +++ b/theseus_gui/postcss.config.cjs @@ -1 +1 @@ -module.exports = require('omorphia/config/postcss.config.cjs') \ No newline at end of file +module.exports = require('omorphia/config/postcss.cjs') \ No newline at end of file diff --git a/theseus_gui/scripts/generate.js b/theseus_gui/scripts/generate.js deleted file mode 100644 index b51f0b368..000000000 --- a/theseus_gui/scripts/generate.js +++ /dev/null @@ -1,56 +0,0 @@ -import fetch from 'node-fetch'; -import { promises as fs } from 'fs'; - -const API_URL = - process.env.VITE_API_URL || process.env?.NODE_ENV === 'development' - ? 'https://staging-api.modrinth.com/v2/' - : 'https://api.modrinth.com/v2/'; -const GENERATED_PATH = './generated/'; - -(async () => { - /* GAME VERSIONS */ - - // Fetch data - let gameVersions = await (await fetch(API_URL + 'tag/game_version')).json(); - - // Write JSON file - await fs.writeFile(GENERATED_PATH + 'gameVersions.json', JSON.stringify(gameVersions)); - - console.log('Generated gameVersions.json'); - - /* TAGS */ - - // Fetch data - let [categories, loaders, licenses, donationPlatforms] = await Promise.all([ - await (await fetch(API_URL + 'tag/category')).json(), - await (await fetch(API_URL + 'tag/loader')).json(), - await (await fetch(API_URL + 'tag/license')).json(), - await (await fetch(API_URL + 'tag/donation_platform')).json(), - ]); - - // Create single object with icons - let tagIcons = { - ...categories.reduce((a, v) => ({ ...a, [v.name]: v.icon }), {}), - ...loaders.reduce((a, v) => ({ ...a, [v.name]: v.icon }), {}), - }; - - // Add icon class - tagIcons = Object.fromEntries(Object.entries(tagIcons).map(([k, v]) => [k, v.replace(' rest); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - loaders = loaders.map(({ icon, ...rest }) => rest); - - // Set project types - const projectTypes = ['mod', 'modpack']; - - // Write JSON file - await fs.writeFile( - GENERATED_PATH + 'tags.json', - JSON.stringify({ categories, loaders, projectTypes, licenses, donationPlatforms, tagIcons }) - ); - - console.log('Generated tags.json'); -})(); diff --git a/theseus_gui/src-tauri/Cargo.toml b/theseus_gui/src-tauri/Cargo.toml index b9b5e1155..077c58f66 100644 --- a/theseus_gui/src-tauri/Cargo.toml +++ b/theseus_gui/src-tauri/Cargo.toml @@ -8,12 +8,12 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.0.0-rc.3", features = [] } +tauri-build = { version = "1.0.4", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.0.0-rc.3", features = ["api-all"] } +tauri = { version = "1.0.4", features = ["api-all"] } [features] # by default Tauri runs in production mode diff --git a/theseus_gui/src-tauri/src/main.rs b/theseus_gui/src-tauri/src/main.rs index 508d67703..191c53683 100644 --- a/theseus_gui/src-tauri/src/main.rs +++ b/theseus_gui/src-tauri/src/main.rs @@ -9,12 +9,12 @@ use tauri::{ }; fn main() { - let ctx = tauri::generate_context!(); + let ctx = tauri::generate_context!(); // Run `pnpm build:web` (builds the web app) to get rid of the error. tauri::Builder::default() .invoke_handler(tauri::generate_handler![]) - .create_window("main", WindowUrl::default(), |win, webview| { - let win = win + .setup(|app| { + let _win = WindowBuilder::new(app, "main", WindowUrl::default()) .title("Modrinth") .resizable(true) .decorations(true) @@ -22,15 +22,16 @@ fn main() { .inner_size(800.0, 550.0) .min_inner_size(400.0, 200.0) .skip_taskbar(false) - .fullscreen(false); - return (win, webview); + .fullscreen(false) + .build()?; + Ok(()) }) .menu(Menu::with_items([ #[cfg(target_os = "macos")] MenuEntry::Submenu(Submenu::new( &ctx.package_info().name, Menu::with_items([ - MenuItem::About(ctx.package_info().name.clone()).into(), + // MenuItem::About(ctx.package_info().name.clone()).into(), MenuItem::Separator.into(), MenuItem::Services.into(), MenuItem::Separator.into(), diff --git a/theseus_gui/src-tauri/tauri.conf.json b/theseus_gui/src-tauri/tauri.conf.json index 271576c42..5b1f987fb 100644 --- a/theseus_gui/src-tauri/tauri.conf.json +++ b/theseus_gui/src-tauri/tauri.conf.json @@ -4,7 +4,7 @@ }, "build": { "distDir": "../build", - "devPath": "http://localhost:3000", + "devPath": "http://localhost:5173", "beforeDevCommand": "pnpm dev:web", "beforeBuildCommand": "pnpm run build:web" }, @@ -32,13 +32,11 @@ "shortDescription": "", "longDescription": "", "deb": { - "depends": [], - "useBootstrapper": false + "depends": [] }, "macOS": { "frameworks": [], "minimumSystemVersion": "", - "useBootstrapper": false, "exceptionDomain": "", "signingIdentity": null, "providerShortName": null, diff --git a/theseus_gui/src/app.d.ts b/theseus_gui/src/app.d.ts index 7090ee710..f5cdcd668 100644 --- a/theseus_gui/src/app.d.ts +++ b/theseus_gui/src/app.d.ts @@ -3,11 +3,11 @@ // See https://kit.svelte.dev/docs/typescript // for information about these interfaces declare namespace App { - interface Locals {} + interface Locals {} - interface Platform {} + interface Platform {} - interface Session {} + interface Session {} - interface Stuff {} + interface Stuff {} } diff --git a/theseus_gui/src/app.html b/theseus_gui/src/app.html index c681abb47..3510174a7 100644 --- a/theseus_gui/src/app.html +++ b/theseus_gui/src/app.html @@ -1,11 +1,14 @@ - - - - %svelte.head% - - - %svelte.body% - + + + + + + + %sveltekit.head% + + + %sveltekit.body% + diff --git a/theseus_gui/src/components/CardRow.svelte b/theseus_gui/src/components/CardRow.svelte index f46fb33a2..ffec75d1a 100644 --- a/theseus_gui/src/components/CardRow.svelte +++ b/theseus_gui/src/components/CardRow.svelte @@ -1,54 +1,53 @@
-
{title}
-
- -
+
{title}
+
+ +
- \ No newline at end of file + + &__items { + display: flex; + grid-gap: 1rem; + align-items: flex-start; + overflow-x: auto; + padding: 0 1rem; + + /* Hide scrollbar */ + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } + } + + &:nth-of-type(even) { + background-color: hsla(0, 0%, 0%, 0.2); + } + } + diff --git a/theseus_gui/src/components/GlobalSettings.svelte b/theseus_gui/src/components/GlobalSettings.svelte index c7b4633f1..514af9196 100644 --- a/theseus_gui/src/components/GlobalSettings.svelte +++ b/theseus_gui/src/components/GlobalSettings.svelte @@ -1,58 +1,58 @@
- - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - -
- - - -
-
- - - - - - - - - -
+ + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + +
+ + + +
+
+ + + + + + + + + +
diff --git a/theseus_gui/src/components/TitledSection.svelte b/theseus_gui/src/components/TitledSection.svelte index be2873e10..c6cde6ab8 100644 --- a/theseus_gui/src/components/TitledSection.svelte +++ b/theseus_gui/src/components/TitledSection.svelte @@ -1,49 +1,49 @@
-
- {#if toggleable}{title} - {:else}{title} - {/if} -
-
- {#if !toggleable || enabled}{/if} -
+
+ {#if toggleable}{title} + {:else}{title} + {/if} +
+
+ {#if !toggleable || enabled}{/if} +
diff --git a/theseus_gui/src/components/VerticalNav.svelte b/theseus_gui/src/components/VerticalNav.svelte index e8423d778..ec447fa3e 100644 --- a/theseus_gui/src/components/VerticalNav.svelte +++ b/theseus_gui/src/components/VerticalNav.svelte @@ -1,36 +1,39 @@
- {#each items as item (item.href)} - - - {item.label} - - {/each} + {#each items as item (item.href)} + + + {item.label} + + {/each}
diff --git a/theseus_gui/src/components/WindowSettings.svelte b/theseus_gui/src/components/WindowSettings.svelte index ac8d68695..fdef7ba00 100644 --- a/theseus_gui/src/components/WindowSettings.svelte +++ b/theseus_gui/src/components/WindowSettings.svelte @@ -1,14 +1,14 @@
- - - - - - + + + + + +
\ No newline at end of file + :global(.v-thumb) { + margin: 4px auto 4px auto !important; + } + diff --git a/theseus_gui/src/layout/Sidebar.svelte b/theseus_gui/src/layout/Sidebar.svelte index c4233fa9d..bb5aceffb 100644 --- a/theseus_gui/src/layout/Sidebar.svelte +++ b/theseus_gui/src/layout/Sidebar.svelte @@ -1,102 +1,132 @@ diff --git a/theseus_gui/src/routes/library/instance/[id]/settings.svelte b/theseus_gui/src/routes/library/instance/[id]/settings.svelte index 4710733f9..760a0e5be 100644 --- a/theseus_gui/src/routes/library/instance/[id]/settings.svelte +++ b/theseus_gui/src/routes/library/instance/[id]/settings.svelte @@ -1,43 +1,45 @@ - - export let overrideGlobalSettings = false +
- - - + + +
diff --git a/theseus_gui/src/routes/settings.svelte b/theseus_gui/src/routes/settings.svelte index 5a0593720..2b724380e 100644 --- a/theseus_gui/src/routes/settings.svelte +++ b/theseus_gui/src/routes/settings.svelte @@ -1,14 +1,12 @@
- +