From 1a1aee11952dcf19f85e67f09091833856d983f4 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Fri, 17 May 2024 12:00:37 -0500 Subject: [PATCH] Database time --- Cargo.lock | 1742 ++++++++++++++++- Cargo.toml | 8 +- src/cli.rs | 61 +- src/cli/prelude.rs | 3 + src/cli/run.rs | 52 + src/main.rs | 8 +- src/observe.rs | 2 +- src/router.rs | 239 ++- src/state.rs | 24 +- src/style.css | 63 + src/templates.rs | 115 -- src/templates/page.jinja.html | 21 - src/templates/pages/about.jinja.html | 7 - src/templates/pages/index.jinja.html | 7 - static/font/iosevkalyteweb-bold.subset.woff2 | Bin 0 -> 22560 bytes .../iosevkalyteweb-bolditalic.subset.woff2 | Bin 0 -> 24668 bytes .../font/iosevkalyteweb-italic.subset.woff2 | Bin 0 -> 24040 bytes .../font/iosevkalyteweb-regular.subset.woff2 | Bin 0 -> 22576 bytes tailwind.config.js | 60 +- 19 files changed, 2006 insertions(+), 406 deletions(-) create mode 100644 src/cli/prelude.rs create mode 100644 src/cli/run.rs delete mode 100644 src/templates.rs delete mode 100644 src/templates/page.jinja.html delete mode 100644 src/templates/pages/about.jinja.html delete mode 100644 src/templates/pages/index.jinja.html create mode 100644 static/font/iosevkalyteweb-bold.subset.woff2 create mode 100644 static/font/iosevkalyteweb-bolditalic.subset.woff2 create mode 100644 static/font/iosevkalyteweb-italic.subset.woff2 create mode 100644 static/font/iosevkalyteweb-regular.subset.woff2 diff --git a/Cargo.lock b/Cargo.lock index dd61458..5994e8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,30 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -26,6 +50,33 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "0.6.14" @@ -75,6 +126,34 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + [[package]] name = "async-trait" version = "0.1.80" @@ -83,7 +162,16 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", ] [[package]] @@ -157,7 +245,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -181,6 +269,23 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bigdecimal" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -196,6 +301,18 @@ dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -205,6 +322,64 @@ dependencies = [ "generic-array", ] +[[package]] +name = "borsh" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.64", + "syn_derive", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.6.0" @@ -213,9 +388,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.96" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" [[package]] name = "cfg-if" @@ -223,6 +398,25 @@ 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.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.5", +] + [[package]] name = "clap" version = "4.5.4" @@ -254,7 +448,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -316,6 +510,12 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const-random" version = "0.1.18" @@ -345,6 +545,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpufeatures" version = "0.2.12" @@ -354,6 +560,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crossbeam-channel" version = "0.5.12" @@ -363,6 +584,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.19" @@ -385,6 +615,38 @@ dependencies = [ "typenum", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -392,7 +654,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -404,12 +668,54 @@ dependencies = [ "const-random", ] +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" +dependencies = [ + "serde", +] + [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "eyre" version = "0.6.12" @@ -420,6 +726,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + [[package]] name = "filetime" version = "0.2.23" @@ -432,6 +744,23 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -456,6 +785,12 @@ dependencies = [ "libc", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.30" @@ -498,6 +833,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.30" @@ -512,7 +858,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -572,6 +918,15 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.13.2" @@ -583,12 +938,28 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "heck" @@ -602,6 +973,39 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "1.1.0" @@ -638,9 +1042,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce4ef31cda248bbdb6e6820603b82dfcd9e833db65a43e997a0ccec777d11fe" +checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" [[package]] name = "httparse" @@ -689,6 +1093,39 @@ dependencies = [ "tokio", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indenter" version = "0.3.3" @@ -705,6 +1142,17 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "inherent" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + [[package]] name = "inotify" version = "0.9.6" @@ -731,12 +1179,30 @@ version = "1.70.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "json5" version = "0.4.1" @@ -773,12 +1239,32 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" -version = "0.2.154" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] [[package]] name = "linked-hash-map" @@ -786,6 +1272,12 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "lock_api" version = "0.4.12" @@ -811,9 +1303,11 @@ dependencies = [ "color-eyre", "config", "futures", - "minijinja", + "maud", "notify", "pathdiff", + "redact", + "sea-orm", "serde", "thiserror", "tokio", @@ -839,18 +1333,44 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maud" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df518b75016b4289cdddffa1b01f2122f4a49802c93191f3133f6dc2472ebcaa" +dependencies = [ + "itoa", + "maud_macros", +] + +[[package]] +name = "maud_macros" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa453238ec218da0af6b11fc5978d3b5c3a45ed97b722391a2a11f3306274e18" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "memchr" version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" -[[package]] -name = "memo-map" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374c335b2df19e62d4cb323103473cbc6510980253119180de862d89184f6a83" - [[package]] name = "mime" version = "0.3.17" @@ -867,17 +1387,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minijinja" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7165d0e94806d52ad5295e4b54a95176d831814840bc067298ca647e1c956338" -dependencies = [ - "memo-map", - "self_cell", - "serde", -] - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -944,6 +1453,69 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -969,6 +1541,15 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-multimap" version = "0.6.0" @@ -979,6 +1560,30 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "ouroboros" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.64", +] + [[package]] name = "overload" version = "0.1.1" @@ -1014,12 +1619,27 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1057,7 +1677,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -1088,7 +1708,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -1104,14 +1724,106 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "proc-macro2" -version = "1.0.81" +name = "pkcs1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quote" version = "1.0.36" @@ -1121,6 +1833,51 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redact" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0020ec469b096d56edb1ed0f0f141d957863302170f8d9c4bfda1a12969e5969" +dependencies = [ + "serde", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1183,6 +1940,59 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "ron" version = "0.8.1" @@ -1195,6 +2005,26 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-ini" version = "0.19.0" @@ -1206,22 +2036,81 @@ dependencies = [ ] [[package]] -name = "rustc-demangle" -version = "0.1.23" +name = "rust_decimal" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -1239,36 +2128,134 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "self_cell" -version = "1.0.4" +name = "sct" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d369a96f978623eb3dc28807c4852d6cc617fed53da5d3c400feff1ef34a714a" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sea-bae" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +dependencies = [ + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "sea-orm" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8814e37dc25de54398ee62228323657520b7f29713b8e238649385dbe473ee0" +dependencies = [ + "async-stream", + "async-trait", + "bigdecimal", + "chrono", + "futures", + "log", + "ouroboros", + "rust_decimal", + "sea-orm-macros", + "sea-query", + "sea-query-binder", + "serde", + "serde_json", + "sqlx", + "strum", + "thiserror", + "time", + "tracing", + "url", + "uuid", +] + +[[package]] +name = "sea-orm-macros" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "sea-bae", + "syn 2.0.64", + "unicode-ident", +] + +[[package]] +name = "sea-query" +version = "0.30.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" +dependencies = [ + "bigdecimal", + "chrono", + "derivative", + "inherent", + "ordered-float", + "rust_decimal", + "serde_json", + "time", + "uuid", +] + +[[package]] +name = "sea-query-binder" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" +dependencies = [ + "bigdecimal", + "chrono", + "rust_decimal", + "sea-query", + "serde_json", + "sqlx", + "time", + "uuid", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.201" +version = "1.0.202" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -1287,9 +2274,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" dependencies = [ "serde", ] @@ -1306,6 +2293,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1335,6 +2333,22 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "slab" version = "0.4.9" @@ -1360,6 +2374,275 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +dependencies = [ + "itertools", + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +dependencies = [ + "ahash 0.8.11", + "atoi", + "bigdecimal", + "byteorder", + "bytes", + "chrono", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rust_decimal", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", + "uuid", + "webpki-roots", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +dependencies = [ + "dotenvy", + "either", + "heck 0.4.1", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +dependencies = [ + "atoi", + "base64", + "bigdecimal", + "bitflags 2.5.0", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "rust_decimal", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +dependencies = [ + "atoi", + "base64", + "bigdecimal", + "bitflags 2.5.0", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "num-bigint", + "once_cell", + "rand", + "rust_decimal", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "time", + "tracing", + "uuid", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "time", + "tracing", + "url", + "urlencoding", + "uuid", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stringprep" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +dependencies = [ + "finl_unicode", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1367,16 +2650,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "syn" -version = "2.0.60" +name = "strum" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad3dee41f36859875573074334c200d1add8e4a87bb37113ebd31d926b7b11f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.64", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -1390,23 +2708,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] -name = "thiserror" -version = "1.0.60" +name = "tap" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.60" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -1419,6 +2755,37 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -1428,6 +2795,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.37.0" @@ -1455,14 +2837,25 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", ] [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", @@ -1473,36 +2866,47 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.13", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.12" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.8", ] [[package]] @@ -1592,7 +2996,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.64", ] [[package]] @@ -1665,30 +3069,89 @@ dependencies = [ "version_check", ] +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" @@ -1711,6 +3174,82 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.64", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "whoami" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +dependencies = [ + "redox_syscall 0.4.1", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1742,6 +3281,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1883,13 +3431,31 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winnow" -version = "0.6.7" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yaml-rust" version = "0.4.5" @@ -1898,3 +3464,29 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] + +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.64", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml index f1e342c..9ddaf01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,8 +11,8 @@ opt-level = 3 [profile.release] strip = true -opt-level = "z" -lto = true +opt-level = "s" +lto = "fat" codegen-units = 1 panic = "abort" @@ -24,9 +24,11 @@ clap = { version = "4.5.4", features = ["derive", "env"] } color-eyre = "0.6.3" config = "0.14.0" futures = "0.3.30" -minijinja = { version = "2.0.1", features = ["loader"] } +maud = "0.26.0" notify = "6.1.1" pathdiff = "0.2.1" +redact = { version = "0.1.10", features = ["serde"] } +sea-orm = { version = "0.12.15", features = ["sqlx-postgres", "runtime-tokio-rustls", "debug-print"] } serde = "1.0.201" thiserror = "1.0.60" tokio = { version = "1.37.0", features = ["full"] } diff --git a/src/cli.rs b/src/cli.rs index dd51b89..2f22314 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,10 +1,9 @@ -use crate::{observe, prelude::*, router::NewRouterError}; -use prelude::*; -use thiserror::Error; +pub mod prelude; -mod prelude { - pub use clap::{Args, Parser, Subcommand}; -} +mod run; + +use crate::{observe, prelude::*}; +use prelude::*; /// Web application for managing lyrics and live displays #[derive(Parser)] @@ -21,61 +20,23 @@ pub struct Cli { #[derive(Subcommand)] enum Commands { /// Run the web application server - Run(Run), -} - -/// Doc comment -#[derive(Args)] -struct Run { - /// Whether or not to watch certain resource files for changes and reload accordingly - #[arg(short, long, default_value = None)] - pub watch: bool, - - /// The address to bind to - you almost certainly want to use :: or 0.0.0.0 instead of the default - #[arg(short = 'H', long, default_value = "::1")] - pub host: String, - - /// The port to bind to - #[arg(short, long, default_value = "3000")] - pub port: u16, -} - -#[derive(Error, Debug)] -pub enum RunError { - #[error("router error: {0}")] - Router(#[from] NewRouterError), - - #[error("io error: {0}")] - Io(#[from] std::io::Error), -} - -impl Run { - pub async fn run(&self) -> Result<(), RunError> { - let (router, _watchers) = crate::router::router(self.watch).await?; - Ok( - crate::webserver::webserver(router, self.watch, Some(&self.host), Some(self.port)) - .await?, - ) - } -} - -pub fn cli() -> Cli { - Cli::parse() + Run(run::Run), } #[derive(Error, Debug)] pub enum ExecError { #[error("run error: {0}")] - Run(#[from] RunError), + Run(#[from] run::RunError), #[error("{0}")] Eyre(#[from] color_eyre::Report), } impl Cli { - pub async fn exec(self) -> Result<(), ExecError> { - observe::setup_logging(&self.log_env_filter)?; - match self.command { + pub async fn exec() -> Result<(), ExecError> { + let cli = Cli::parse(); + observe::setup_logging(&cli.log_env_filter)?; + match cli.command { Commands::Run(args) => Ok(args.run().await?), } } diff --git a/src/cli/prelude.rs b/src/cli/prelude.rs new file mode 100644 index 0000000..2e5016e --- /dev/null +++ b/src/cli/prelude.rs @@ -0,0 +1,3 @@ +#![allow(unused_imports)] +pub use clap::{Args, Parser, Subcommand}; +pub use thiserror::Error; diff --git a/src/cli/run.rs b/src/cli/run.rs new file mode 100644 index 0000000..fe5e4ad --- /dev/null +++ b/src/cli/run.rs @@ -0,0 +1,52 @@ +use super::prelude::*; +use crate::{ + router::NewRouterError, + state::{NewStateError, State}, +}; + +/// Doc comment +#[derive(Args)] +pub struct Run { + /// Whether or not to watch certain resource files for changes and reload accordingly + #[arg(short, long, default_value = None)] + pub watch: bool, + + /// The address to bind to - you almost certainly want to use :: or 0.0.0.0 instead of the default + #[arg(short = 'H', long, default_value = "::1")] + pub host: String, + + /// The port to bind to + #[arg(short, long, default_value = "3000")] + pub port: u16, + + /// The database connection string to use + #[arg( + short, + long, + default_value = "postgresql://lyrs?host=/var/run/postgresql" + )] + pub database_connection_string: String, +} + +#[derive(Error, Debug)] +pub enum RunError { + #[error("router error: {0}")] + Router(#[from] NewRouterError), + + #[error("io error: {0}")] + Io(#[from] std::io::Error), + + #[error("new state error: {0}")] + State(#[from] NewStateError), +} + +impl Run { + pub async fn run(&self) -> Result<(), RunError> { + let app_state = State::try_new(&self.database_connection_string).await?; + let (router, _watchers) = crate::router::router(app_state, self.watch).await?; + Ok( + crate::webserver::webserver(router, self.watch, Some(&self.host), Some(self.port)) + .await?, + ) + } +} diff --git a/src/main.rs b/src/main.rs index 9b470ee..c78ecfb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,3 @@ -use crate::prelude::*; - mod cli; mod file_watcher; mod observe; @@ -8,10 +6,12 @@ mod router; mod state; mod static_files; mod tailwind; -mod templates; mod webserver; +use crate::prelude::*; +use cli::Cli; + #[tokio::main] async fn main() -> AnonResult<()> { - Ok(cli::cli().exec().await?) + Ok(Cli::exec().await?) } diff --git a/src/observe.rs b/src/observe.rs index e2e66ff..d759829 100644 --- a/src/observe.rs +++ b/src/observe.rs @@ -17,7 +17,7 @@ pub fn setup_logging(env_filter: &str) -> Result<(), color_eyre::Report> { )) .parse_lossy(env_filter); - info!("{filter}"); + info!(%filter); Ok(()) } diff --git a/src/router.rs b/src/router.rs index b1812a9..b315750 100644 --- a/src/router.rs +++ b/src/router.rs @@ -1,5 +1,3 @@ -use std::time::Duration; - use crate::{ file_watcher::FileWatcher, prelude::*, @@ -7,34 +5,26 @@ use crate::{ static_files, }; use axum::{ - body::Bytes, - extract::{MatchedPath, State}, - http::{HeaderMap, Request, Response, StatusCode}, + http::StatusCode, response::{Html, IntoResponse}, - routing::get, - Router, + routing::{get, post}, + Form, Router, }; -use minijinja::context; -use tower_http::{classify::ServerErrorsFailureClass, trace::TraceLayer}; -use tower_livereload::LiveReloadLayer; - +use maud::{html, Markup, PreEscaped, DOCTYPE}; +use redact::Secret; +use serde::Deserialize; use thiserror::Error; -use tracing::{info_span, Span}; +use tower_http::trace::TraceLayer; +use tower_livereload::LiveReloadLayer; #[derive(Error, Debug)] pub enum NewRouterError { - #[error("new state error: {0}")] - State(#[from] NewStateError), - #[error("watcher error: {0}")] Watcher(#[from] notify::Error), } #[derive(Error, Debug)] -pub enum ReqError { - #[error("template error: {0}")] - Template(#[from] minijinja::Error), -} +pub enum ReqError {} impl IntoResponse for ReqError { fn into_response(self) -> axum::http::Response { @@ -51,10 +41,9 @@ impl IntoResponse for ReqError { pub type ReqResult = Result; pub async fn router( + state: AppState, with_watchers: bool, ) -> Result<(Router, Vec>), NewRouterError> { - let state = AppState::try_new().await?; - let live_reload_layer: Option = if with_watchers { Some(LiveReloadLayer::new()) } else { @@ -69,86 +58,174 @@ pub async fn router( } }; - let template_file_watcher = state.clone().templates.start_watcher(orl()).await?; let (static_file_service, static_file_watcher) = static_files::router(orl())?; let mut result = Router::new() .route("/", get(index)) .route("/about", get(about)) + .route("/login", get(login)) + .route("/login", post(authenticate)) + .route("/register", get(register)) + .route("/register", post(create_user)) .nest_service("/static", static_file_service) - // `TraceLayer` is provided by tower-http so you have to add that as a dependency. - // It provides good defaults but is also very customizable. - // - // See https://docs.rs/tower-http/0.1.1/tower_http/trace/index.html for more details. - // - // If you want to customize the behavior using closures here is how. - .layer( - TraceLayer::new_for_http() - .make_span_with(|request: &Request<_>| { - // Log the matched route's path (with placeholders not filled in). - // Use request.uri() or OriginalUri if you want the real path. - let matched_path = request - .extensions() - .get::() - .map(MatchedPath::as_str); - - info_span!( - "http_request", - method = ?request.method(), - matched_path, - some_other_field = tracing::field::Empty, - ) - }) - .on_request(|_request: &Request<_>, _span: &Span| { - // You can use `_span.record("some_other_field", value)` in one of these - // closures to attach a value to the initially empty field in the info_span - // created above. - }) - .on_response(|response: &Response<_>, latency: Duration, _span: &Span| { - trace!("on_response: {response:?} in {latency:?}"); - }) - .on_body_chunk(|_chunk: &Bytes, _latency: Duration, _span: &Span| { - // ... - }) - .on_eos( - |_trailers: Option<&HeaderMap>, _stream_duration: Duration, _span: &Span| { - // ... - }, - ) - .on_failure( - |error: ServerErrorsFailureClass, latency: Duration, _span: &Span| { - error!("on_failure: {error:?} in {latency:?}"); - // ... - }, - ), - ) + .layer(TraceLayer::new_for_http()) .with_state(state.clone()); if let Some(lr) = live_reload_layer { result = result.clone().layer(lr); } - let watchers = vec![template_file_watcher, static_file_watcher]; + let watchers = vec![static_file_watcher]; Ok((result, watchers)) } -#[instrument(skip(state))] -async fn index(State(state): State) -> ReqResult> { +fn stylesheet(url: &str) -> Markup { + html! { + link rel="stylesheet" type="text/css" href=(url); + } +} + +fn head(page_title: &str) -> Markup { + html! { + (DOCTYPE) + meta charset="utf-8" {} + meta name="viewport" content="width=device-width, initial-scale=1" {} + title { (page_title) " - lyrs" } + (stylesheet("/static/style.css")); + + script src="https://unpkg.com/htmx.org@1.9.12" integrity="sha384-ujb1lZYygJmzgSwoxRggbCHcjc0rB2XoQrxeTUQyRjrOnlCoYta87iKBWq3EsdM2" crossorigin="anonymous" defer {} + + } +} + +fn foot() -> Markup { + html! { + footer class="p-2 border-t-2 border-surface0 flex overflow-x-scroll" { + section { + (PreEscaped("© 2024 ")) + a .underline.text-mauve href="https://lyte.dev" { "lytedev" } + } + section .ml-auto {("Made with ❤️")} + } + } +} + +fn page(title: &str, content: Markup) -> ReqResult> { Ok(Html( - state - .templates - .render("pages/index.jinja.html", context!()) - .await?, + html! { + (head(title)) + body .bg-bg.text-text.min-h-lvh.flex.flex-col.font-sans { + header class="drop-shadow border-b-2 border-surface0 bg-blue-500 flex overflow-x-scroll" { + a class="flex p-2 text-3xl font-mono text-mauve opacity-80 hover:bg-mauve hover:text-bg" href="/" { "lyrs" } + nav class="flex flex-1 justify-start" { + a class="flex items-center p-2 hover:bg-mauve hover:text-bg" href="/login" { "Login" } + a class="flex items-center p-2 hover:bg-mauve hover:text-bg" href="/register" { "Register" } + } + } + main class="flex flex-col flex-1 relative overflow-x-scroll bg-mantle" { + (content) + } + } + (foot()) + }.into_string() )) } -#[instrument(skip(state))] -async fn about(State(state): State) -> ReqResult> { +async fn index() -> ReqResult> { + page("index", html! { "Index" }) +} + +async fn about() -> ReqResult> { + page("index", html! { "About" }) +} + +fn center_hero_form(title: &str, content: Markup, subform: Markup) -> Markup { + html! { + section class="hero grow" { + form class="flex flex-col gap-2 w-full max-w-sm" method="post" { + header { + h1 class="pb-2 text-center text-xl" { (title) } + } + (content) + input class="bg-mauve" value="Submit" type="submit"; + } + (subform) + } + } +} + +fn labelled_input(label: &str, input: Markup) -> Markup { + html! { + label class="flex flex-col" { + (label) + (input) + } + } +} + +async fn login() -> ReqResult> { + let form = html! { + (labelled_input("Username", html!{ + input class="input" type="text" name="username" autocomplete="username" required; + })) + (labelled_input("Password", html!{ + input class="input" type="password" name="password" autocomplete="current-password" required; + })) + }; + let subaction = html! { + small class="mt-4" { + "Need an account? " + a href="/register" {"Get one"} + "." + } + }; + page("login", center_hero_form("Login", form, subaction)) +} + +async fn register() -> ReqResult> { + let form = html! { + (labelled_input("Username", html!{ + input class="input" type="text" name="username" required; + })) + (labelled_input("Password", html!{ + input class="input" type="password" name="password" autocomplete="new-password" required; + })) + }; + let subaction = html! { + small class="mt-4" { + "Already have an account? " + a href="/login" {"Login"} + "." + } + }; + page("login", center_hero_form("Register", form, subaction)) +} + +#[derive(Deserialize, Debug)] +struct Creds { + username: String, + password: Secret, +} + +#[instrument] +async fn authenticate(Form(creds): Form) -> ReqResult> { + info!("login attempt"); Ok(Html( - state - .templates - .render("pages/about.jinja.html", context!()) - .await?, + html! { + "no" + } + .into_string(), + )) +} + +#[instrument] +async fn create_user(Form(creds): Form) -> ReqResult> { + info!("registration attempt"); + Ok(Html( + html! { + "no" + } + .into_string(), )) } diff --git a/src/state.rs b/src/state.rs index 55e660a..f1d2170 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,26 +1,22 @@ -use crate::{ - prelude::*, - templates::{TemplateLoadError, Templates}, -}; -use std::sync::Arc; +use crate::prelude::*; +use sea_orm::{Database, DatabaseConnection}; +use thiserror::Error; #[derive(Clone)] pub struct State { - pub templates: Arc, + db: DatabaseConnection, } impl State { - pub async fn try_new() -> Result { - let templates = Arc::new(Templates::try_load("src/templates").await?); - - Ok(Self { templates }) + pub async fn try_new(database_connection_string: &str) -> Result { + Ok(Self { + db: Database::connect(database_connection_string).await?, + }) } } -use thiserror::Error; - #[derive(Error, Debug)] pub enum NewStateError { - #[error("template load error: {0}")] - TemplateLoad(#[from] TemplateLoadError), + #[error("database error: {0}")] + Database(#[from] sea_orm::DbErr), } diff --git a/src/style.css b/src/style.css index e86027e..07be6c3 100644 --- a/src/style.css +++ b/src/style.css @@ -1,7 +1,64 @@ @tailwind base; + +@layer base { + + main a[href] { + @apply text-mauve underline; + } + + input { + @apply opacity-80 hover:opacity-100 p-2 border-2 bg-bg border-surface2 rounded; + } + + button, + input[type=submit] { + @apply opacity-80 hover:opacity-100 p-2 border-0 rounded cursor-pointer text-bg; + } + + .hero { + @apply flex flex-col p-2 justify-center items-center relative; + } + + .card { + @apply flex flex-col drop-shadow-xl border-2 border-surface2 rounded p-2 gap-2; + } +} + @tailwind components; @tailwind utilities; +@font-face { + font-family: iosevkalyte; + font-style: normal; + font-weight: 400; + src: local("Iosevka"), url("/static/font/iosevkalyteweb-regular.subset.woff2"); + font-display: swap; +} + +@font-face { + font-family: iosevkalyte; + font-style: italic; + font-weight: 400; + src: local("Iosevka"), url("/static/font/iosevkalyteweb-italic.subset.woff2"); + font-display: swap; +} + +@font-face { + font-family: iosevkalyte; + font-style: normal; + font-weight: 400; + src: local("Iosevka"), url("/static/font/iosevkalyteweb-bold.subset.woff2"); + font-display: swap; +} + +@font-face { + font-family: iosevkalyte; + font-style: italic; + font-weight: 700; + src: local("Iosevka"), url("/static/font/iosevkalyteweb-bolditalic.subset.woff2"); + font-display: swap; +} + :root { /* Catppuccin Mocha */ --Rosewater: #f5e0dc; @@ -62,4 +119,10 @@ --Mantle: #e6e9ef; --Crust: #dce0e8; } +} + +:autofill, +:-webkit-autofill { + filter: none !important; + background-color: #f00 !important; } \ No newline at end of file diff --git a/src/templates.rs b/src/templates.rs deleted file mode 100644 index 6b3c1d7..0000000 --- a/src/templates.rs +++ /dev/null @@ -1,115 +0,0 @@ -use crate::{file_watcher::prelude::*, prelude::*}; -use minijinja::Environment; -use pathdiff::diff_paths; -use std::{ - path::{Path, PathBuf}, - sync::Arc, -}; -use thiserror::Error; -use tokio::sync::Mutex; -use tower_livereload::Reloader; - -#[derive(Error, Debug)] -pub enum TemplateLoadError { - #[error("template error: {0}")] - Minijinja(#[from] minijinja::Error), - - #[error("io error: {0}")] - Io(#[from] std::io::Error), -} - -#[derive(Clone, Debug)] -pub struct Templates { - env: Arc>>, - dir: PathBuf, -} - -impl Templates { - pub fn for_dir>(dir: P) -> Self { - let env = Arc::new(Mutex::new(Environment::new())); - Self { - env, - dir: dir.into(), - } - } - - pub async fn try_load>(dir: P) -> Result { - let result = Self::for_dir(dir); - result.load_env().await?; - Ok(result) - } - - pub async fn start_watcher( - self: Arc, - reloader: Option, - ) -> Result, notify::Error> { - if let Some(rl) = reloader { - Ok(Some(self.watch(rl).await?)) - } else { - Ok(None) - } - } - - async fn watch(self: Arc, reloader: Reloader) -> Result { - let watcher = file_watcher(self.dir.clone(), move |ev| { - futures::executor::block_on(async { - if ev.kind.is_create() || ev.kind.is_modify() { - for p in ev.paths { - let _ = self.load_template(&p).await; - } - reloader.reload(); - } - }); - })?; - Ok(watcher) - } - - #[instrument(skip(self, p))] - pub async fn load_template

(&self, p: P) -> Result<(), TemplateLoadError> - where - P: AsRef + Copy, - { - let p = p.as_ref(); - if p.is_dir() { - return Ok(()); - } - let filename: String = diff_paths(p, "src/templates") - .unwrap() - .to_string_lossy() - .into_owned(); - if [".bck", ".tmp"].iter().any(|s| filename.ends_with(s)) { - debug!("skipping temporary file"); - return Ok(()); - } - info!(filename); - Ok(self - .env - .lock() - .await - .add_template_owned(filename, std::fs::read_to_string(p)?)?) - } - - #[instrument(skip(self))] - pub async fn load_env(&self) -> Result<(), TemplateLoadError> { - for d in walkdir::WalkDir::new(&self.dir) { - match d { - Ok(d) => self.load_template(d.path()).await?, - Err(_) => todo!(), - } - } - Ok(()) - } - - pub async fn render( - &self, - template_name: &str, - context: S, - ) -> Result { - Ok(self - .env - .lock() - .await - .get_template(template_name)? - .render(context)?) - } -} diff --git a/src/templates/page.jinja.html b/src/templates/page.jinja.html deleted file mode 100644 index 94db782..0000000 --- a/src/templates/page.jinja.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Sup - - - - - - Page Template -

- {% block body %}{% endblock %} - - - diff --git a/src/templates/pages/about.jinja.html b/src/templates/pages/about.jinja.html deleted file mode 100644 index 268f7f8..0000000 --- a/src/templates/pages/about.jinja.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "page.jinja.html" %} -{% block body %} -

About

-

- Welcome to my awesome about page! -

-{% endblock %} diff --git a/src/templates/pages/index.jinja.html b/src/templates/pages/index.jinja.html deleted file mode 100644 index 7fb9dbe..0000000 --- a/src/templates/pages/index.jinja.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "page.jinja.html" %} -{% block body %} -

Index

-

- Welcome to my awesome index! -

-{% endblock %} diff --git a/static/font/iosevkalyteweb-bold.subset.woff2 b/static/font/iosevkalyteweb-bold.subset.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e86804770a598c02ab7ed914a821f792671faf58 GIT binary patch literal 22560 zcmV)HK)t_rPew8T0RR9109YUZ5dZ)H0T18+09U>M5DGm200000000000000000000 z0000Qb{ilZ&mab10D&wBfk+9Q3=s$lgN`hMF3=4=500bZfgJuUH41rb~ zp7k|sn|2So9e8D?{{$Dv&5Px3sSX(l`pI;gyg+w2IJc@grs)4aC&4FU{Ia?e3 zHKm+T6&awpbw`cCZgIQCt%;J+!f2^c8>zzRBTCSXXcZ|*DGMyZDr^K31S9c)2uL-eD~K|9?MA_qp)i`}(Q|tS(gpgMnqME2O26S|M2pn}%MR zR0n1w4>KPn!*o?4BhC;4gh0fJ$(nGYFWr}4G==-rTt1@?7JyPB38-F4q5{m#-c$q7 zcIp6+g(*n-p>j@`Mk; zf3#WtC(YP*|9Oru;f}CEs_s_c^@M!h0I*a>YE1#;I#-m*&}n{KlmZuIqU1Eytg&pY z$Gap%EfC-Ui$VWunMvpE-@cyNP|`S#>X1s%A@kj~Gdlte*y>O3^!2q`b0MvQQ(A|F z@{S}|&Gw#C#Lg%pQ`yMOfVg-9ETrOBW+u!48WCcmV%hB6_lHDO6vAN~R({A!%pQ$U z=>PxwsnzzrFDa2q4RTd=wUQc$8(odbz}|6S7?!NX^8NeX|L?#5B}@8p%9d;=GNesO zmt+M@-6gb4aRE}QhDeTsE^-0zZU|@vNX{VaX1AO(%U*0&vs%s>_-{_M|J}c%kf>HT znG)z4CZ>uXe(e9|R>5oE9e$4(W{4$=qK(Ils7vTywHv!D83EGAvv+rMEKTM$qV!;$Q_#^VWy^gd?H?A`!qcz(_h)(ZYM z1I#i9%(DZSj~{+AlL^R2r#Vt1{2yyt^G zna8Jmb|mNig&z=QQmCkDXz4`Ii)3JAVrJ1rl&-A0i54SPoOlUr64@n5c8?U@IrQMv zQ>uHV>BZ$f>3VbPqpyDY8(^S8JThd;k}XFrA^;+R2@(+yjkC=$*P;%$74~>P_m*r~ zbw_2r%4wAuRYTPlHD|RuxHw#ox`+B8z8U{nW2>RBv4wDpR7H7+)FTIwOUM|FM+>H< z(@JSOXwT?8x-C7Bo=NYce`f?UKB7F-1C3(|SdZAN*i)QL&S}mou9Tb2?cw3j4DeR) z9)_FGvxTn)~Q`9IW*|QPO@=+f>^_J6v0#y*?dCXVcfoljM7J&x;g zL0m9XHG%5U%`Q&xkWRK*kB{Y?i<|{-yAwT!X-N_XbHwyc!H|OKk}N?YNJ?2&%4$k( zj0}J=U;uS2#y3Yv=!~(m zUF6DF2^z6d3Ea;Ne#>$iyVIPsC+j&30Z+lY{n)V-vvqbFPX~=Y-YHrxzpf^&j!lwe z4a{X~hpaNI{MhNqoN<2{rUiSzCf7Y8+AV@noE!mM+#3OmF@iX!kds0nh^gvHZZ|`= z;CNWXlIt`_f~U8Y((ESSjre5oJ<;a2kFZnyuE^^^J{d((du*qgy?R3;JC!BQJ`LkMD zx~;45j2^Q4Tj#qo92%ceUW>WB^2WrSE4EEGY9dARyQ}Q7+g|$|aKuKX_t$^*%@05Q zHcz=VN7J7b@gwm=o%v9$83-NeYnTXm;CY%d+C&sWXU=()pQ{rK`u$m-=s z(q`N{3rKD~!4rRsH#Rx5TQ)d-f@A$D1p|0d#Q|Pc29nb8D4ehE#ojBNuisDGWi+WY zmA)|D|8_VNC0GTjvCBz==0}60M?W6jcW0HF_MKILKvc;Bq$x8Y_^t2syfg3oR{eR$ zZ7^o10mb#=N(d@X6)=7!aP-h|JE9^E2Ucdn0BhXBFAVZyK3=2O8ihwk-@{ACe*i)V zHQr(KR~Wf+yZplTP8>N3d*<5Odb9q^8((;5L}lT&FK9wI%SX2O{L(zGqaiSIt-!+A zl^g@hF6l!f>o%JQa=z0WzPfo$QRdc-OiSUn%~F$t4ms?IqmH@asy_W&JoZsC@`9rR zuTZsCw5?tF7$FxEO+@3d%9oEtFSpj@RLV-Fnt7R@vyfl1IKO5gzh#Lm%@Xk&61m7aWa)^*6E}^4?OYS zpHXM)=mwaiB;?~ZB?;*xDT_%#5ivm)63YS-GM}XMl7c)E1X)Tf%Sgy_lCpvn3?@mC zLx|;25^@+R7)}a7jv$sJNyt$ozULqn zqOSey(v=8#!bg77Zj)nfh0Ir@J-Xc)C5{^Xu}wg4c034P#d?z>IwDZPXZusFsY-Ze zE$u29=7My!6gA(`zj76(YRkAH^sgP-6?5=lS+55Ux9$srg0SE#`l?ZVwEq)c+Pwoj zgoo(FUp0XHIy_a`aBkLJS#1=&OmE$F$1L$oZQP>-Vt}^ExLJYiKrOQFsD`xrRAAm) zX1BL)C5X7UZEx3=(+7Z`ZjLR=XeIZ)TbC0~I_<1(=k>VYQUW@MLhp@!%wR((_^)m4 zr`!LvnL&R{-tyzldwXRYfoEo@(~NDzi9sGtc_rbo7h+6Y<;9)QPWLH5gWV+IjMH(P z80f#2f~ue@psH2XsH#;}s!%wY;i7M-n^%Np(9t6w^AW_iwkF*WJrkBe4;QUy{G88 zD-R2T3^%jd&d3r9s|`p&i1AOWV}uo#0aG@d0#!87A_96u!r&#E-Br*NZcF_vzu>&8 z_LZ>U9o_NcSip2wjo=OIFWyL_CHD{66iiQI7TVHZuYETqk1JPir#%x&U$&uC9-H!( zg*I(isCl3mGd<~#26D_z5I0?Yi7WvVbxtAgXKp59^;L(VBp1p&>&`F)?nAbXT*Iv9 zcWR$l^~z1kCOCz}R0voWzlH|P(54G5p?*3jL7>dPTaLeREr^A2ioPxU?@INhkuYe- zW!4j~)ne@iJJq+!^Dv?EG-#ephr5*!1cgLd@_w(SSzGLUtU%BKOv3-5fg$Wr8hWhO-H!uU@X@-&Ge4%UY+d#3k>b;gT8 zRn!W8Uxr0yVB=gy?E%$Lo|IG0=yh=}6H&3;-*YO?EN5{RWFd=Q64ZCnRRMFl#w<#T z)7{I|n(P_x0aaMWHd%6arwWCT&K7XSh~?TT(Flv^_J(x>DkQ6eS`O5}m@(Z~ZEE`v|<=4-Qs8%eiEP|I|VwEgaKVC)pquFqt zigFmlbxD`V(-oJ0xY;Y3(1^x*_%zl|?AIQxa(s&i11=W^!VMg`R~Gg?(Gs@79&84&F-*byp1g;q~88jMoy zEY{Op3EbZ@d+Z_m0=q1?(@wG?uvM^f<(1z^6(c$X>9>aL3Yj)A(?J1_I6xNelVk>4 z&53=Rtj}S7jX z>Vpq;7?wYq?Nr=;ZadTQ+~Mn9GjcbJqF3ao5%6SNHJHWf9jk@)wpQ(QKpwGata)l0 zmS)KBug|S0lQC+jsoQue6l*dW677#{mQbL9lI*tIlM{glNY$y6Yzmwv#Wvf>;=uP> zp;asSDR58Gw%SVG3G5VOi!J1_!2QJP&_Nml_YtQ}8yOO~uXOF&i6?Nnm3G)cQUc#c zVY}_b5GbBpl`4;Gfn#M@Z#_8>IF64>m1I@mXo1Rb^@*`B~>XI~Pm5^N_ z!GT?z=kA1JvO$UlM(O6E%Q~__(gvDc;OV5*WP?}+n)L8;S`pfsMiTh#B1?$=YihAl zjT#o(iEM&yH){yD?s!L2=Z6wXCQP^pk))QwBwHn`M2YL?IBTzOP~3SC^W??*zAV<( ztWN3iA`(ewTO(6xo%1mpe8b{p2NAatR6f18%x0rt1Nr5)G8YXv)vDC0#lxpfhaP<} zl)xeu>@2ZXg(l55+GMi^yX*}TyWpO47tV82X7|dG)oRqLv*Cs*%^M?$YnR3 zYxRMenI>GdXrzhty>?DSmRj{HUwluhr(0rblMy#cYLiv8X!_rUggXgNb9kF!T z#M$*0SZJwv9@jSi7wF{T=cnh-eGeP&h?OQf+HQw!uKVL}EGr?yz5DvlIO|+Yjo!T3 zx@b{_3X%>wr;bM3se73{hazR^=fK#YV%a~_+Q`|5S5c8)S;afxleSL z=k>;r9Sw4MV}D*x_4PG*>-ZQC8e^e6nXP-FBS2l@{PEnmM-EbZqM^=DHlE!1|9Eqp zd%rh+oL1c_Ow!^rlfLO6LCD5J7<7-o{Wlj--%i_3oxxb_ox;Fs>OQCJ-sEU&!QYj6N zo$(#ZOfRXE>H9nI)5Mh=A7PX{9Jl?kmLjJVf=ZK~1@(fCKv64jUky6&|00$9Sw_60 z{ZXIh(OXKOyZj!@IoHx=M}vrQakVs(RN@$q9Yb?A?%3zpw^MQZ>3 z$3E|@2$kFRVavoF^`ch6xZ;I09~OO4c30Dao>m3I&)`x$>jcEMLZnE>!9J=xWXGkh%hk+)3`nH) za|x#6GmngHyKiJ~L&)eDdaY8g5SP<;Br||K6;R4%=KAYTB`*CmYTGgeD}8!4 zX!syh#~xCZX&o{HYB7(uit*u%W*{d$Qi;<-=KII3fT@gl-1E#@hdxu*F=?rTL%1lP zPt(EFl_}?(10Y|Sj5)vV`M1A%pgg6Bj6(H*l0qme0xF7xs-mE#Xs9a&8j6Lc;-IB? z>m!K!Q)t4MJs-C>WUsf-Y3#;Kpe#0jdN<{u`TK>nF-5nx^A0ke-7-|{LkDfF!JrF+ z9t`?07{Fi%gAokIFj$9?sbdRRX|b@K9#{@&CAM0h8r;pTkd5pBHT-N8f=`uQ07Eop zyTk=qvKNmqjrFj{Z`yNe^)cXP<8C2qKI!|HYNfSbKP6x~4uE%tw;o~&CVAA^OnOra zvgbtc6aa8>O&0P2pV<1TG67aFG{1?spy~8^G(~e`rRJT@{Yr?FMDiAf2jQccp z;a)5l>{?@)w$0a{J)`sW2Qv(C@>W^*aU@1yHcq5&|0VTXW=B0%w8=YsT%jwU`;a?k zYx47=MGIW*3*f>lOuYym`P5!9#7<_K6-}ejhC2grDTZQr2A$)ZB7=oj9Ul$p*@#9K zNs;qAEcb?DU(jHXy3two3N4yeRX^<(3UFD4h1)^h zX;2uT9H1&YQ8CqkYK;Nv0sc3Hr-&$D(lpfS4A3^H&OrpahI*X=`UdZTP6{IoqSzQ9 z2~fkG$j2z4abtiUlbS+vRa7dtWiQrPRaeoCDKlG>we@pThYbL#cN-CL zkBCT)5#f21^4y@F7m4KKNWT_PHUSXPU2h!7nj8-(0`v=0re2eiXM_PfGs=&7#h4*L zSv&Z1UtCNeQZXr-5H1ljR!j(w6Wa0^TR<8zxd?MN97u%l!Ib>xBmRfZFA5g8l}x^9 z)Y9B7C}lZs1!ytCXA}fX6XRGKmUITS>%Gz1>!FHz`3ia`ABeqbaiX}kv8hbiR_!*~ zUp?9KcAKFTf;~TCEch|Fnw(7kj0I~!xf~Tmu`dlz)t=yqC)hpvIdfI3B97bN)9aEHsw`EQ(5FvaWYh^lLx5CO8atiWOz`J zd;RI(@Z-Q`Yg1$Lrn`r)$oxaJg)b|>j?$wgK*Ic7I)^kWJ4=0mLZ?y%MzUK%2yC4(#KYCU@K0j(% zm;q$QKw`Z~HWI(`{eGAuTBMX3MhNEo{B9VO-_B2hu(UWQhB;$ufD}3fXMegL1Sx4; z56A)(lpu4f^ytLD!WU;JF!T3Lr{%pa62m?;PGzQ94x7pTVV0B>Du(0%2?Lq|(8_`8 zaLm5&{}a3oMpO31Jbnq~fI8HSj2OA>WQwQ=Bv-QSpQ z@Nx{UKmHAzUer|d-dNhsZ4TAe@Y^|{G~b9@po$U?yG3qHQ8=+tCZ^>|mO`8F+m5Ad z70ZeMlhjP6dV@Xcv!2Vv8-{AxZ0#1Io}hw>;3sOmSc(s3UQOd_%3hEdDX|eEy?5b} zLM1Qd=5Z$Y-)Cx&xZlaxr{k4@|bC7s|Q|Kk+brU7T{;rm~|&(058 zI*7it^z$RbE2GF#o2~^QJ;w}@(o0HJqyS9Q&GOw99td$zp_4itQ7)GTnLm+O>tR$? zb1V-?tenIxgj8VRuGoGcvK!}hlQnZTgvaSTgDk%$If)QhsBi6If4bX)>>S=~? zyH80K?O38KR1ciO@*9ufLu4^IQv> zZReMn8c`1nqc5t+2W1nCy;qBJ)WA4V%!%C;HHlwR$<8BhVyAp0S`{2mWOGvky+l&8 zC>Pwu;bJO?h|&>{e|lui{%_8VAmOEhfQqP+e#pi=L zmP<*=0OIrIU>hpfb5fSQUO;#E<#DS5?pYz;C z*?NSZyM2jYc*~3f%#p|NXHR^W0!k5R7f2X;1WC&0Q4e5V#%c!58fDDQ|ho1=gy(EpweWhV_bP~K4!k>Fpe)c4xO^(- z8qf9-ik@yvFfp)9o*$IOHoFif1htbKmZg@t+Dyl$#=Xm`j@lU(vBY%5{<2p#i5|1z z%3?B4Ue`hu`G$2XcrbVO4-G;utz#cW-}OYVS*C~#f9_8q)GNqflJV%&3JLlH6yk7Y z){@h5_24BYC9ZgWZshExHoS;Q-P-$!=A7LLw`>ENNDS1>8V5bL5_$bD137gXOR9hZ zMr!O<@1_)j@#q2$cDWt~G*q7tQUcaLlaj&uS%rV@k?~2ruV5!zWEI3sWmRT$A=so3 zbTjsl_Gz(F-IA(!B7xeeq*9esVm!<|K4y>7q;aknS3Zu?2S^(dfGsg+J%OE*0y>n% zd^p3N9?(L|W~MFuaHs4T?38=4bGQRL2h*|?2P&PiUsX4<;z)5GQZ^eD-&mKFOzBYA zIQa9EEoJS2&(;K}mb1;m5|s&iRX+)VY!83FRLAOZHdhgu3&SKzJnWkrCth3Q;~*-g z$u;mJ*vW`(^p$w`kupN}DMCaiFNMN%d|+MVilqs!DJ+B>P*o~ra8zm7#P*)!&{9;y zqQ)}R*g#s)~hRZ=&sE_L)lFO2GBNfZvh!gg*Me=M7GBmrgv1ra>E7x=;y4XOm zLb8Ouo_UJa1gw3^T_X|dY;>R8@XUEYBV&kIohWCw?=zfKmYgU^BudsCxGnS%_W1RM zSaX)g)^IvF=G-ocP?*PYLcdO2qLWaWaw=$Ec5z}H1TE1nHI)j_F}q|Mk{v!Fakow+ zBcvlbkV6homfK6S6rs*I2Hm9c_@eJVz0M#O?#R?!sUJ(364x#owe}8S>7~|TRDPN> z__VR}l8|Yq`R_>P!GTotn-#-kDV9=IM5SOf;Q)mI+D1}x8PrYW@RRRI*>SYcWfSeG zeY^LN;qbhmbWDc-IqoHJjmpq{ZF5ofvwY zXT76XknFg+i3^jJizP71sIL6rDZfc&39$vz{{^a`aIltLQF#De{w6o<^LuXx0+`}Y|K5~WmicG5G z0x_~9fV(1IR&CMSmhK!G3)H8D6_ww<WjDEci?FHL5=^qP!#2LdaNnRq2YR)9EyQ zB0o3EOE#|fF`F2Tcu^xMs8MQ(mG8Q}bvx&|y$-Kxm>YRhyqNNjX6ao`v(s$HrIV6F z`L*;CN`K~1@R4)Iqq2+kFYXP;eY|NNj3D?#fjcCw>Tz_kxdY;d#DQYw$0tDFhd7n3 z5GgF<4hhfT_uh3opWGyGn<#dsOVoj@=v2YyX;5KtvEUPj>v0E`6%N(s9@IbHOs8_# zMc%z^gwE;@my8U-e77H5@%-+?Eh>%c-rUc>$S@qXx9C?_X-AAwN{gS+vce9f3c?CbXyLVMDRU(#P{HW}u z9$?tI;HVt6*nV3vw}D7!IcFFjO->q?{H=EN9}>BGuOPLE)2}UcZTi|+-FvOAwd+@t zI2VLiTW4m=a_KXDg)iL$%J|Lf_W-L1eza<{xo^AAf^|J4WLutw0?%_Ji$^G1=y@;r zA|8>qw|S5c$e2d~ui*jmH$*xN$7$I37PTWD#m(Q&5$Elg{q*^Uc& z>;Hz)w=-bygaF-xCqI9Ed-G$DdG6Que-Fn`gXk%C$JS*VU-de~;Imz0UT#RL7mHD_ zBF=r_{Bzs`&ffE7k0*gHvp-gny=chuFoW+DTmPfZ_iEkNO006L;$vn%dmU^o#%T;%fHAXmriFv&C#_I*Z=ahG$#N;*)}5+#}laU?Y=3X_Wn? zP~OUplR*%agUTR!xzObr4n-LQZbj`Vy>>3Kb0{%QM1)yY9WdNkg>oNS)p=h!s#u~q zoVVhSPjCfC%vm24_9u$NiTV>3v_5`DD}sIgtYF6w_q&c(FCvO*`Ag#vnul9HA|@`X z9(CPsg4GX-v0=4g%rIc_V}A9|Pl0&Q5YN)Rc_`Sgr(10fCsXIVvGweH_IgY<7s+Nv z&dEq6@3~Y~4B{G_hveISSP+7^1%5qnUaYIh)%rojAPg6EPq zwEx%JXcdY^ej^2Ls$@}MR#hpiPxaPzzr(?==R8w9V_=+RVr=-kE>^!x@qHN6%}>2E ziA{cXH{_12Cy4Y!Hf=bA@mcK8rMX=g0{fcThy_8Kp+ZG>>d}a1X!ZxC5aV^d{AL)z z7xE(vzrF0@X=Ck^DPeQ(+i=d0Jh!}!Om15~N6u7as7bQY zYW4ICZBkZ3iSGv+xEESIFWKqnO2$g+N=Ra5d(}C%NLtdVrbE5V-bA}N@QA(gBN~HADJNVkpKX#qI zLAJhfU%HUK#r^-LFG+cwrcBTUhr*$PF5wrPGjcg~?*%67;qTkPAwCkC#* zP~z5par=pj3PvsVL$FC?GYlYd5CCE)S1ubd6yAH-TW>6fozE^0w0#?XwT*0n2|%FF z%f%9bIT0N&Ab=bJ(UYs)hqo_o4%0jMHwz{PkMP<2BZCtKH~GRC6AJx)%99`pn-cUS zrCOTo)BDmeK}m&Y~!ADOg5W=58gysH*t31eVu+7x7zGH6~2DZAf9ht{9P zr^T}ASnSJCH`eWM)+iYpyopDXA(cKqU~bo$(ic z{+dH4L~h15_tH{mk6pJQj$d(7`pz&Yr-mOmlB}(V&^&@tk<>u!@=Z=iaI!{(_uLbf z{@1pf4^d?m1z&mLXJ>7x6r29f6ymnPy+liDtVCtiH7d(lsgmZV!)&Y$=vQZwpFhuN z#ZClzz|6*inEszA1^yCN(;Wb&@%v;WMcX}L|ijeJ_})9z#7Fx{ev`U9Re3%~2nbdkG2MkxbYl@L^^HIQNi zxtL3^JboS){ZYwi4UYMv&SVc$S2OGB8G{C5KF`WPe-FJz>snhQp7k zDM)LW7f4XG@)j8ioou_WFgw9qsauaxP#0)QrufCku`^P&u@77G;45Ckc7P@#u;NgcoLr(vb zbMnCgi9!FGnfhEg;}+g4F{f|x+`IlovS~$eho9`I#9%rtxx^Z2X~m7!Dyixz8mWt; zB0bjVVvXpFj!LTaMpJ|FRu7IYE#Ht?MT5P*tR7khuS;HsCkNb7S09c)nshSmp*rqi z+{wib(+$NOu6$a4r!C%G&td#}EYFJVFu`=mW|98&BoF@Vj}(b^82e72;nWhO@%dbC ze!P@W%b{U3QuosFIw6T9tQ%k2P4X-@vLETHjbT~F$_WBZV`B_4W+g7_KoEWLe3ijBq2M8~^qnrX%$`R5%5cZca~ob>;N zR(Tvwo+YQ)?yF%sBN`6cCEpbUM-xzkl)dHz5vD^tWYx1mNF)l=&RZQKE-$vu8uyj4 z&FCW~eDBo^1>~zzMI^m`wA=DGPT0O&R(FyG0-ziO0N?H+A(iU9Y7fG65bWJsuw>Zx z5)(ZcMZ3vjS;g|MuaEPPeL`WNSqd{91zWaMJHPNf#$=yb8}iym{0rv{cSUTTVk(F? zi_Z{Ar`OIB$+BCo#>Va(&$69dMW)|MFfKVuw~CMB+vfoQ*DjP$v1A`a^11zLbo};Z zvS**foZ1_4d05<6?BFLmy5*?M&!IR-ifnOxOiQ6bd05`4e6$5?fi$g}j5Jna)<1Dl zGKE@Xvtc<5ElTOus#Tz+iL&Hf*JF96x-c|s`FJdtcgYcII32W4l`2Yo@y)6}R%5DZOx4Gi zzJ*jRyc^^~c4;z>(~Y0DqN#(PNGt8Qd!Bpl@kb?*o?Oou4Hm1biB9sfQ zS;;Xx7iPpfq%}8OipD|gi{M2E%y`KNW~V8>5^wZ5RdSrY&9aX7B$THgOMlwb=sZRK#m^nQ^JW%ddJ^qKrLo-1XRS*e7L(SVzFh z0kr~@fTtO{gSjupY$RAQGb>`np-OqN0yA;|SxDT&=-c$Twv0E=SVW_OL5r;r%$2O4 z-vI^D&ea}+hAejYTf4wqwib!Gfc~Fw#6=ym{EHLbuM&2hV#%qe>l~@HK*fFpIfv0B zN)ZeWHXiod1jCsofS0mhTtWd5IS2x1N2Jv`CW;z$>qT|2SpB_Og@+#f`^{yaSr;-F z=5KiZ2li^9&?fD8SkV^6anrvzSN)t$;j|&}WHUQv_klusY_?>377pE!z#${mD|g?{FTr z&A>*GQQhUmKkYBV2f=|%|5paqm~4RIOO~qp8^r&@Ny)fp@g_Eq*t;&dNUAC=M$ytp z+I1F+Y8;?ROHiglswyo?UbmM60P)Smp})hKC!sXutujLh4&pwiP@Z#xV8~FmRXL5Y z6mbu%M2JpBH$4uMNQXUc7C8}-%0PGVMmr|v+IvDc)0XihJHO_dKgTgy+g>@fGr2!6 zOLPEaV2A%nmSD;85iR=7kUo4mT>%+wwSWlDdqo6Z!Skt>CvR!n_pN~)-k3YO2Tojw%WS|{UVTs$U zxX?TGX-so8|Ao#kkEQOlNHdYsSGJsGKVY_=0JHWuwOdjqD31n z#1*C=#NoC{g%G56h-|)-uyK}5Z#>aU0|DR=0npBL>+5~xp-kGl=CBV@EZa>^v-Ypj z=<`4{CNvO_J`K&2Un`ybj;ZcY>_D4U75CYxSL+9BFqRq%GYqYd|G-AgpkY7@s{3i@ z!6p#n07D& zwY5bv4$|PDD?;fsOul?Vl@fwE?QTI%ONi>}ax(HGIFHT4{HYMyQgC|aHUH#xbimeP z=wh-uHSN$@Dstv<8WoA?J%dos_C&-68D}9*1v+3JCf`Jd(#)^2`xX5no$UfW!nv<8 z;l0Nodwau?%(Kd`O=e7T=NX;Mzq~01;|}jHvy<`O z8mD%;K#1#96BeF&*2}nU`o7E0nCIR#9*^VKByTbnH()FuYaVmQA$xGfh5c%riO*1Q z?VmPQ&)hhe>lzvMnZ@0U{RRsty^2oR%S7irG#;hHnT=S+Ic-B2x@QPxK$2EmL?pOd zJ*~Z&A}ZiMVm>G(Uv1Q9jC6=}^4YxLab2z8l{-WEYStF085wu~t#_i$V7}werPX_U z9t&iH$_(43QmLHF8^0qF{pe@ggRMAj$~S~jylSJ0u@y_UwQ(D?F_U_0*0Md|Vx(@a zAYy%f81jv?=au%^iZ4 zQcR%0xeQQ}*#jQ#v#y7D&g)xhMm{kNeFp=wPDIAcbtgiess9*Cw1E-qz|GhX`lj^!scMs-qF4o*%4En@St2B}BTg#pTL1On9#tKIBFlLa|Z=l?% z7=8;ZPl`o27JjOBQ3Sgxh)PgEv!vjp)Izy*&I6JeW91eH#+Z@%kxm$621>zM(w(CU zl~V{d)epOi7kXm33&j?;c74QY2s_zjY~4{nU5)bWq2(y|S?~mwekD-A+k=+BKlXhh zg$RAmtx?ohH}f!FQ&oNO1}>pgO0EP*j-4Y6#z?0l38?f)O9|W!#r0K9O*?I_u2 zIa&B=@F?q7WkRNeR0RS6Xtnw3fRSK-JXqfdl}WWKC1R38(;&b- zxw4oUq&`dK(jPBG1H*3ku3d>Rm!9vNnCN|g!(cBd5+{deTACH|<3i5wvGOz#br(3> z*b6!U4K!_=R3j9K1$pmigvX(U+x8&qh$FJW|l&+2{REjC+eQ-^Zh_ z&~0#Uk7PJIBlUAvrewa`o6aB^;{MOEmkF;}=(8h~Kvz8(mw2Yu?cmMpc*UBnfW2*|0kNFKgng=O@`dy{CYv4_8h z;YC$VFx*^a1XGN5QT1DttXVdscA`wgBJY-}HZ*{-UY7|xK86;7PJN0-wHjOAFtN*g zxp`h9iK8)9vrYF;1FoUt=?o9-57LL6$SS zBe)pb_9(Bo2HSIASqUliCgPK$>6fH=NbXrNQtc{vy<)w!op_qwR4lA^5|Hl}b}N!z z=f(T5zBt){HF$Dl>Y(QkPXX4eE!NiJjCX`8ruyIeoFk)GvUwtku1k0Shu{B~FDZ-h z-=i0yr;I5J&ME#E&{BVPS+^h(Qu|wH64_~@gG6qh@F$a;-nBdbcI1_AwdGQCD2LU@ zQa%PzI7n_Fo8!8i#-;>)Oc_%@Ov#~gy$>|87efL2d>~EFK3`2u-#$-G$Y);wVHT=U z2_q7t#@a}vwy`K8F-)b#XU-8xGQSPyBJZeq@GXmE1WC5I1?N%UA-V8v^CYSSs#Xbu z-a%n1Es*d1F8h*MjW6?k3iRln(17>yqG ztHY)>@RXYknxY*bO@G9cgsc&I6bN_)*YyvB0;!WWnqnhYck@}5t}^cM;syTgpfP%V zw@gGbbm$%n@T!GX0cD=cAd#Hkwv)U`gDab8H=k1!)0$tDrh}L#Oe!bC_P2sp(n8=6 zN%gX6hlC)IN)7?f*?2gCAU;$~AiUc*P_1$}M2Z}*IUY%Z!j)?i3MA3vUgWKj0#-_U zpfQ4(NZXXdh;OMzD=b&@Eev`~3{!TL!U{-y#f7XG+1VLZ03l8xKJgPf^a&tR=lW7x zfbmX5N8!-NP;l$dfD>{*S_`#+_zIX1GL-61)C9nq0)Xtrl&c@4Z2vX9&LW_R$&oDYI99pVZSfi<0$}llG3b){f z{vjnpt8$UndFp9hb|PBGW|Vi_FsU=oXk#k*-Ah=c)rb7fo*jKtDVb$7Y8_q5YL~U^5xlirm%8!2HT85|44+4mk#8b{ zH@X5m6(NJl7Y)8C4EXL_kV(bj6L^W(IPnc}L1zAEkaR_`UV_g!ZjfFjs1tH(jfFlN zzRi^pk6QnFq-l)+FB5gTbudHJHzWp80tUdXRo!#L5ed?yJMEaGI_y%orQnea&>NRS%$rddXw%K7<+RuW@z^eOy=?}0}KUY~KN1g(! ztx?>R9BTtde>}=SoP4MD@xUhdR067?T&)cnG}&mgty*Q+Zl^XKF4iUckq`cgm8qze zm7G5QFM9ZMoIu&i@1i<6UQB)c&1F{%BD;Tnd<6t|fpcxG>L?64WWDk>@} zDk>@}3>h*60000001U%048t(Sj2WYpQcCF@$edb&Q!odRE3Y{m<;Q~_5b^rsXU0#@c z9_wF!vfv&7(bpB0&UBUOv16%_jwNsBZs~QdZ%OJ}VS3)=u6y!+UiVJ+3t9xKt2G;! z?;k5Bc|HG)ex6D_!|u7tB3rP!qx*Ww`=|nSZd>2HEfL}JOg9kW;k+)rm$yQ?Atx-4 zEI2L4@<@ccS6bX(PL+ILd=4RsT=(fxcd3gKb#m+5SJb|J%k|h=t3B^D+OgDa8X3CPJD-o= zuFR+1-rVQSTx`EHlW4M0N1nRSv#2rF+rGWoilLE3PFwQ4TXtWBa%15jlec-s9G)FF z9~+nF#Of@)XbvK7`R1V?!Y@a@7#4_QzVvW+Hgwo)6bj8(d|ESA(74= zS^4=^(YHkTdLlceXvb(eJY+n4eOQ|+myGwc04{i)Mac71?wo0qElQWDr|Z2By!=ZQ zgXg2Q`;`sZ!`FxPTV-P8X#rgDI*X9YnYnPLJ6=Wj5;dl3zm>s#=;@eq#wo_j$1nVA za}eX%x}yrqB^rk~L_W(Y_!bY@!`FvZQ@Lckrv-4q>nuV(!cgOx?vpAs$E#ND?b5vO zX`a{lk%Tw~_(4EFK=6YAKL|O$42DI@acyx2%VlZ-OUd&TIx94CSJ}+&2Fc>*BFXkzq!N_rJqYpusl+Usp z1`v6(CyY$*oOQ=wxLWK$y>Ky5V=8Lg=Kn$X@V71)IUqT0- zuVLH!uaUa2IfuMu>tTPE^S<93+hiVfcWvXfV_>mf3PAhu$`XimDld^RnTH?UWr=&g zJjo;Bn8h-_o)sYXh9?aq20wR?dkT%TPZ%l}dZNzz@U_ofy!FGqBT6>v5-XAkROk^! z1)I1%FLw&rI!op?cs6SHINfb16eo?#zX9GCA?QHd3 z#(A>0(CCO)|!jrwo~n^x7b;TWLPaS8m^FRAzWK> z@J#@>QPmf^^DV4cyIX*;E@GAplZ~TOp0;D7}{FUB!7o0U*P^?smqK-VZ=+dy1V!KJb$4s)h{BMowpU~2Bd3& z^kQkI84E=?!>ZK;xV9eLhxZ8LI2*=066rDkvm9Z=fEfGD+1YrSOFM{2}zHWd;$s2 zjNL5&*%{?cZ&N!`RIr!C>^v`NvbTDKz=JfoKU|wl3S;d+W^jzzoF~t1z4E`Lxp(0* zN^ESQYtXlUFx77rn*tgmvJL2l$m2ec9yl!3VpB{Iw}YQ@YDJvRz%-%kU43OMA~ahD)SCN zROdP0+Alm4oVr{g(#E*STx�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 H1uFmmsXWZ3 literal 0 HcmV?d00001 diff --git a/static/font/iosevkalyteweb-bolditalic.subset.woff2 b/static/font/iosevkalyteweb-bolditalic.subset.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..95939df872d25d73e1416832072c2b63bc94eea7 GIT binary patch literal 24668 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 Xd_7qTdK^6=@u4x!)NjHdgM}IZM4CPL literal 0 HcmV?d00001 diff --git a/tailwind.config.js b/tailwind.config.js index fdc6d81..bb4db8d 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,35 +1,39 @@ /** @type {import('tailwindcss').Config} */ module.exports = { content: ["./src/**/*"], theme: { - colors: { - rosewater: "var(--Rosewater)", - flamingo: "var(--Flamingo)", - pink: "var(--Pink)", - mauve: "var(--Mauve)", - red: "var(--Red)", - maroon: "var(--Maroon)", - peach: "var(--Peach)", - yellow: "var(--Yellow)", - green: "var(--Green)", - teal: "var(--Teal)", - sky: "var(--Sky)", - sapphire: "var(--Sapphire)", - blue: "var(--Blue)", - lavender: "var(--Lavender)", - text: "var(--Text)", - subtext1: "var(--Subtext1)", - subtext0: "var(--Subtext0)", - overlay2: "var(--Overlay2)", - overlay1: "var(--Overlay1)", - overlay0: "var(--Overlay0)", - surface2: "var(--Surface2)", - surface1: "var(--Surface1)", - surface0: "var(--Surface0)", - base: "var(--Base)", - mantle: "var(--Mantle)", - crust: "var(--Crust)", - }, extend: { + fontFamily: { + sans: ['ui-sans-serif', 'system-ui', 'sans-serif', "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"], + mono: ['iosevkalyte', 'ui-monospace', 'monospace'], + }, + colors: { + rosewater: "var(--Rosewater)", + flamingo: "var(--Flamingo)", + pink: "var(--Pink)", + mauve: "var(--Mauve)", + red: "var(--Red)", + maroon: "var(--Maroon)", + peach: "var(--Peach)", + yellow: "var(--Yellow)", + green: "var(--Green)", + teal: "var(--Teal)", + sky: "var(--Sky)", + sapphire: "var(--Sapphire)", + blue: "var(--Blue)", + lavender: "var(--Lavender)", + text: "var(--Text)", + subtext1: "var(--Subtext1)", + subtext0: "var(--Subtext0)", + overlay2: "var(--Overlay2)", + overlay1: "var(--Overlay1)", + overlay0: "var(--Overlay0)", + surface2: "var(--Surface2)", + surface1: "var(--Surface1)", + surface0: "var(--Surface0)", + bg: "var(--Base)", + mantle: "var(--Mantle)", + crust: "var(--Crust)", + }, }, }, plugins: [],