From 97a918b952ffb0513d860a1077063840177f1665 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Thu, 18 Apr 2024 04:51:12 +0000 Subject: [PATCH] Split prpc to a seprate repo --- Cargo.lock | 317 +++++++----- Cargo.toml | 2 - crates/phactory/Cargo.toml | 2 +- crates/phactory/api/Cargo.toml | 6 +- crates/phactory/api/src/crypto.rs | 6 +- crates/phala-types/Cargo.toml | 2 +- crates/prpc-build/Cargo.toml | 18 - crates/prpc-build/src/client.rs | 107 ----- crates/prpc-build/src/lib.rs | 292 ----------- crates/prpc-build/src/prost.rs | 447 ----------------- .../prpc-build/src/protos_codec_extension.rs | 453 ------------------ crates/prpc-build/src/server.rs | 290 ----------- crates/prpc/Cargo.toml | 16 - crates/prpc/src/lib.rs | 125 ----- crates/rustfmt-snippet/Cargo.toml | 2 - crates/rustfmt-snippet/src/lib.rs | 12 +- e2e/contracts/check_system/sideprog.wasm | Bin 2172302 -> 2189266 bytes standalone/pruntime/Cargo.lock | 248 +++++----- 18 files changed, 350 insertions(+), 1995 deletions(-) delete mode 100644 crates/prpc-build/Cargo.toml delete mode 100644 crates/prpc-build/src/client.rs delete mode 100644 crates/prpc-build/src/lib.rs delete mode 100644 crates/prpc-build/src/prost.rs delete mode 100644 crates/prpc-build/src/protos_codec_extension.rs delete mode 100644 crates/prpc-build/src/server.rs delete mode 100644 crates/prpc/Cargo.toml delete mode 100644 crates/prpc/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6ad425e680..78c012e396 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -531,7 +531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" dependencies = [ "include_dir", - "itertools", + "itertools 0.10.3", "proc-macro-error", "proc-macro2", "quote", @@ -630,7 +630,7 @@ dependencies = [ "ark-std", "derivative", "hashbrown 0.13.2", - "itertools", + "itertools 0.10.3", "num-traits", "rayon", "zeroize", @@ -698,7 +698,7 @@ dependencies = [ "ark-std", "derivative", "digest 0.10.7", - "itertools", + "itertools 0.10.3", "num-bigint 0.4.3", "num-traits", "paste", @@ -1115,7 +1115,7 @@ checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -1254,7 +1254,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -1425,7 +1425,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -2151,7 +2151,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -2641,7 +2641,7 @@ dependencies = [ "cranelift-codegen 0.95.1", "cranelift-entity 0.95.1", "cranelift-frontend 0.95.1", - "itertools", + "itertools 0.10.3", "log", "smallvec", "wasmparser 0.102.0", @@ -2700,7 +2700,7 @@ dependencies = [ "clap 3.2.23", "criterion-plot", "futures", - "itertools", + "itertools 0.10.3", "lazy_static", "num-traits", "oorandom", @@ -2722,7 +2722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.3", ] [[package]] @@ -2961,7 +2961,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3076,7 +3076,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3109,7 +3109,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core 0.20.1", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3240,7 +3240,7 @@ checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3345,7 +3345,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics 0.10.0", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3537,7 +3537,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.55", + "syn 2.0.59", "termcolor", "toml 0.8.2", "walkdir", @@ -3799,7 +3799,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -3839,7 +3839,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4080,7 +4080,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "syn 2.0.55", + "syn 2.0.59", "toml 0.7.3", "walkdir", ] @@ -4098,7 +4098,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4124,7 +4124,7 @@ dependencies = [ "serde", "serde_json", "strum 0.25.0", - "syn 2.0.55", + "syn 2.0.59", "tempfile", "thiserror", "tiny-keccak", @@ -4284,7 +4284,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4617,7 +4617,7 @@ dependencies = [ "frame-system", "gethostname", "handlebars", - "itertools", + "itertools 0.10.3", "lazy_static", "linked-hash-map", "log", @@ -4658,7 +4658,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4792,13 +4792,13 @@ dependencies = [ "derive-syn-parse", "expander", "frame-support-procedural-tools", - "itertools", + "itertools 0.10.3", "macro_magic", "proc-macro-warning", "proc-macro2", "quote", "sp-core-hashing 9.0.0", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4810,7 +4810,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -4820,7 +4820,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -5048,7 +5048,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -5495,6 +5495,12 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -6062,14 +6068,14 @@ dependencies = [ "impl-serde", "ink_ir", "ink_primitives", - "itertools", + "itertools 0.10.3", "log", "parity-scale-codec", "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -6123,10 +6129,10 @@ checksum = "5b529c941518e8f450395fab9fe8ebba0a7acbb18778fc7e0a87f6248286ec72" dependencies = [ "blake2 0.10.6", "either", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -6141,7 +6147,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "synstructure 0.13.0", ] @@ -6360,6 +6366,15 @@ dependencies = [ "either", ] +[[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.9" @@ -6678,7 +6693,7 @@ dependencies = [ "diff", "ena", "is-terminal", - "itertools", + "itertools 0.10.3", "lalrpop-util", "petgraph", "regex", @@ -7437,7 +7452,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -7451,7 +7466,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -7462,7 +7477,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -7473,7 +7488,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -7908,6 +7923,12 @@ name = "multimap" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" dependencies = [ "serde", ] @@ -8310,7 +8331,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -8439,7 +8460,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -8718,7 +8739,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -9251,7 +9272,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -9810,7 +9831,7 @@ dependencies = [ "phala-node-runtime", "phala-trie-storage", "phala-types", - "prost 0.11.8", + "prost 0.12.4", "prpc", "prpc-build", "reqwest", @@ -10444,7 +10465,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -10483,7 +10504,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -10606,7 +10627,7 @@ dependencies = [ "proc-macro2", "quote", "rustfmt-snippet 0.1.0", - "syn 2.0.55", + "syn 2.0.59", "unzip3", ] @@ -10830,7 +10851,7 @@ dependencies = [ "polkavm-common", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -10840,7 +10861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ "polkavm-derive-impl", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -10971,7 +10992,7 @@ checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" dependencies = [ "difflib", "float-cmp", - "itertools", + "itertools 0.10.3", "normalize-line-endings", "predicates-core", "regex", @@ -10985,7 +11006,7 @@ checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ "anstyle", "difflib", - "itertools", + "itertools 0.10.3", "predicates-core", ] @@ -11034,7 +11055,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" dependencies = [ "proc-macro2", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -11117,14 +11138,14 @@ checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -11150,7 +11171,7 @@ checksum = "606c4ba35817e2922a308af55ad51bab3645b59eae5c570d4a6cf07e36bd493b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "version_check", "yansi 0.5.1", ] @@ -11236,6 +11257,16 @@ dependencies = [ "prost-derive 0.11.8", ] +[[package]] +name = "prost" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +dependencies = [ + "bytes", + "prost-derive 0.12.4", +] + [[package]] name = "prost-build" version = "0.9.0" @@ -11244,10 +11275,10 @@ checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" dependencies = [ "bytes", "heck 0.3.3", - "itertools", + "itertools 0.10.3", "lazy_static", "log", - "multimap", + "multimap 0.8.3", "petgraph", "prost 0.9.0", "prost-types 0.9.0", @@ -11264,10 +11295,10 @@ checksum = "2c828f93f5ca4826f97fedcbd3f9a536c16b12cff3dbbb4a007f932bbad95b12" dependencies = [ "bytes", "heck 0.4.1", - "itertools", + "itertools 0.10.3", "lazy_static", "log", - "multimap", + "multimap 0.8.3", "petgraph", "prettyplease 0.1.21", "prost 0.11.8", @@ -11278,6 +11309,27 @@ dependencies = [ "which", ] +[[package]] +name = "prost-build" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.12.1", + "log", + "multimap 0.10.0", + "once_cell", + "petgraph", + "prettyplease 0.2.9", + "prost 0.12.4", + "prost-types 0.12.4", + "regex", + "syn 2.0.59", + "tempfile", +] + [[package]] name = "prost-derive" version = "0.9.0" @@ -11285,7 +11337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", "syn 1.0.109", @@ -11298,12 +11350,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.59", +] + [[package]] name = "prost-types" version = "0.9.0" @@ -11323,34 +11388,61 @@ dependencies = [ "prost 0.11.8", ] +[[package]] +name = "prost-types" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" +dependencies = [ + "prost 0.12.4", +] + [[package]] name = "prpc" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ac203d10cfaff379693bbb2b5c2ca58813463b879adc055c8df610ab827550" dependencies = [ "anyhow", "async-trait", "derive_more", + "hex", + "hex_fmt", "parity-scale-codec", - "prost 0.11.8", + "prost 0.12.4", + "prpc-serde-bytes", + "serde", "serde_json", ] [[package]] name = "prpc-build" version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d38aa9ef7bdf72bb2f4c3f4b790198beb68054e3213dcdbebfd323fb0141e8" dependencies = [ "either", - "heck 0.4.1", - "itertools", + "heck 0.5.0", + "itertools 0.12.1", "log", - "multimap", + "multimap 0.10.0", "proc-macro2", - "prost 0.11.8", - "prost-build 0.11.8", + "prost 0.12.4", + "prost-build 0.12.4", "prost-build 0.9.0", - "prost-types 0.11.8", + "prost-types 0.12.4", "quote", - "syn 1.0.109", + "syn 2.0.59", +] + +[[package]] +name = "prpc-serde-bytes" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac0855066edbf6bdcb42beb02cd9063d12d8d6d44b9a0c2f15a30e6ddd11f5" +dependencies = [ + "proc-macro2", + "syn 2.0.59", ] [[package]] @@ -12164,7 +12256,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn 2.0.55", + "syn 2.0.59", "unicode-xid", "version_check", ] @@ -12328,7 +12420,6 @@ name = "rustfmt-snippet" version = "0.1.1" dependencies = [ "proc-macro2", - "tempfile", ] [[package]] @@ -12687,7 +12778,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -12701,7 +12792,7 @@ dependencies = [ "clap 4.4.12", "fdlimit", "futures", - "itertools", + "itertools 0.10.3", "libp2p-identity", "log", "names", @@ -13597,7 +13688,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -14137,7 +14228,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -14638,7 +14729,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c792fe9fae2a2f716846f214ca10d5a1e21133e0bf36cef34bcc4a852467b21" dependencies = [ - "itertools", + "itertools 0.10.3", "lalrpop", "lalrpop-util", "phf 0.11.2", @@ -14678,7 +14769,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -14867,7 +14958,7 @@ dependencies = [ "hash-db", "hash256-std-hasher", "impl-serde", - "itertools", + "itertools 0.10.3", "libsecp256k1", "log", "merlin 2.0.1", @@ -14976,13 +15067,13 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "quote", "sp-core-hashing 9.0.0", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "sp-crypto-ec-utils" version = "0.10.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -15015,7 +15106,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -15026,17 +15117,17 @@ checksum = "50535e1a5708d3ba5c1195b59ebefac61cc8679c2c24716b87a86e8b7ed2e4a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -15065,7 +15156,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.25.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "environmental", "parity-scale-codec", @@ -15284,7 +15375,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "24.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -15310,7 +15401,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -15323,20 +15414,20 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] name = "sp-runtime-interface-proc-macro" version = "17.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "Inflector", "expander", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -15427,7 +15518,7 @@ checksum = "54c78c5a66682568cc7b153603c5d01a2cc8f5c221c7b1e921517a0eef18ae05" [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" [[package]] name = "sp-storage" @@ -15459,7 +15550,7 @@ dependencies = [ [[package]] name = "sp-storage" version = "19.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "impl-serde", "parity-scale-codec", @@ -15509,12 +15600,12 @@ dependencies = [ [[package]] name = "sp-tracing" version = "16.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ "parity-scale-codec", "tracing", "tracing-core", - "tracing-subscriber 0.2.25", + "tracing-subscriber 0.3.18", ] [[package]] @@ -15591,7 +15682,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -15624,13 +15715,11 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "20.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk#cc1e6ac301ea88e3cb3253a84e4c6aa28f2d8f87" +source = "git+https://github.com/paritytech/polkadot-sdk#76719da221d33117aadf6b7b9cc74e4fbeb25b34" dependencies = [ - "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "wasmtime", ] [[package]] @@ -15697,7 +15786,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" dependencies = [ - "itertools", + "itertools 0.10.3", "nom", "unicode_categories", ] @@ -16089,7 +16178,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -16355,7 +16444,7 @@ dependencies = [ "quote", "scale-info", "subxt-metadata", - "syn 2.0.55", + "syn 2.0.59", "thiserror", "tokio", ] @@ -16367,7 +16456,7 @@ dependencies = [ "darling 0.20.1", "proc-macro-error", "subxt-codegen", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -16414,9 +16503,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.55" +version = "2.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" dependencies = [ "proc-macro2", "quote", @@ -16449,7 +16538,7 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "unicode-xid", ] @@ -16630,7 +16719,7 @@ checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -16804,7 +16893,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -17085,7 +17174,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] @@ -17903,7 +17992,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "wasm-bindgen-shared", ] @@ -17960,7 +18049,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -18132,7 +18221,7 @@ dependencies = [ "byteorder", "cc", "inkwell", - "itertools", + "itertools 0.10.3", "lazy_static", "libc", "object 0.28.4", @@ -19362,7 +19451,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.55", + "syn 2.0.59", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a60de0d4ad..72837534e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,8 +53,6 @@ members = [ "crates/phala-node-rpc-ext", "crates/phala-types", "crates/phala-git-revision", - "crates/prpc", - "crates/prpc-build", "crates/phactory", "crates/phactory/api", "crates/phactory/pal", diff --git a/crates/phactory/Cargo.toml b/crates/phactory/Cargo.toml index 301515844d..d12abca236 100644 --- a/crates/phactory/Cargo.toml +++ b/crates/phactory/Cargo.toml @@ -26,7 +26,7 @@ phala-mq = { path = "../phala-mq" } phala-serde-more = { path = "../phala-serde-more" } phala-crypto = { path = "../phala-crypto", features = ["getrandom", "stream"] } -prpc = { path = "../prpc" } +prpc = { version = "0.1" } pink-loader = { path = "../pink/loader" } pink-chain-extension = { path = "../pink/chain-extension" } pink = { path = "../pink/pink" } diff --git a/crates/phactory/api/Cargo.toml b/crates/phactory/api/Cargo.toml index 49b876597a..020cf15278 100644 --- a/crates/phactory/api/Cargo.toml +++ b/crates/phactory/api/Cargo.toml @@ -10,11 +10,11 @@ scale-info = { version = "2.10.0", default-features = false, features = ["derive serde = { version = "1", features = ["derive"], default-features = false } base64 = { version = "0.13" } derive_more = { version = "0.99.17" } -prost = "0.11.8" +prost = "0.12.4" phala-trie-storage = { path = "../../../crates/phala-trie-storage", default-features = false, features = ["serde"] } phala-types = { path = "../../../crates/phala-types", default-features = false, features = ["enable_serde", "sgx"] } -prpc = { path = "../../../crates/prpc", default-features = false } +prpc = { version = "0.1", default-features = false } phala-crypto = { path = "../../../crates/phala-crypto" } chain = { path = "../../../standalone/runtime", default-features = false, package = "phala-node-runtime" } @@ -42,7 +42,7 @@ hex = "0.4.3" type-info-stringify = { path = "../../type-info-stringify" } [build-dependencies] -prpc-build = { path = "../../../crates/prpc-build" } +prpc-build = "0.1" tera = { version = "1.12.1" } tempdir = { version = "0.3.7" } diff --git a/crates/phactory/api/src/crypto.rs b/crates/phactory/api/src/crypto.rs index 5518e6c678..d61bc271e3 100644 --- a/crates/phactory/api/src/crypto.rs +++ b/crates/phactory/api/src/crypto.rs @@ -78,9 +78,9 @@ impl Signature { if max_depth == 0 { return Err(SignatureVerifyError::TooLongCertificateChain); } - let sig_type = match SignatureType::from_i32(self.signature_type) { - Some(val) => val, - None => { + let sig_type = match SignatureType::try_from(self.signature_type) { + Ok(val) => val, + Err(_) => { return Err(SignatureVerifyError::InvalidSignatureType); } }; diff --git a/crates/phala-types/Cargo.toml b/crates/phala-types/Cargo.toml index bc557de644..8a5897740c 100644 --- a/crates/phala-types/Cargo.toml +++ b/crates/phala-types/Cargo.toml @@ -12,7 +12,7 @@ scale-info = { version = "2.10.0", default-features = false, features = ["derive sp-core = { git = "https://github.com/paritytech/polkadot-sdk.git", branch = "release-polkadot-v1.5.0", default-features = false } phala-mq = { path = "../../crates/phala-mq", default-features = false } -prpc = { path = "../../crates/prpc", default-features = false } +prpc = { version = "0.1", default-features = false } pink-types = { path = "../pink/pink-types", default-features = false } sgx-attestation = { path = "../sgx-attestation", default-features = false, optional = true } diff --git a/crates/prpc-build/Cargo.toml b/crates/prpc-build/Cargo.toml deleted file mode 100644 index 242ca9c2aa..0000000000 --- a/crates/prpc-build/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "prpc-build" -version = "0.1.0" -edition = "2018" - -[dependencies] -protoc = { version = "0.9", package = "prost-build" } -prost-build = { version = "0.11.8" } -syn = "1.0.98" -quote = "1.0" -proc-macro2 = "1.0" -prost-types = "0.11.8" -prost = "0.11.8" -itertools = "0.10.1" -either = "1.6.1" -multimap = "0.8.3" -heck = "0.4.0" -log = "0.4.14" diff --git a/crates/prpc-build/src/client.rs b/crates/prpc-build/src/client.rs deleted file mode 100644 index cd865385e4..0000000000 --- a/crates/prpc-build/src/client.rs +++ /dev/null @@ -1,107 +0,0 @@ -use super::{Attributes, Method, Service}; -use crate::{generate_doc_comments, naive_snake_case}; -use proc_macro2::TokenStream; -use quote::{format_ident, quote}; - -/// Generate service for client. -/// -/// This takes some `Service` and will generate a `TokenStream` that contains -/// a public module with the generated client. -pub fn generate( - service: &T, - emit_package: bool, - proto_path: &str, - compile_well_known_types: bool, - attributes: &Attributes, -) -> TokenStream { - let service_ident = quote::format_ident!("{}Client", service.name()); - let client_mod = quote::format_ident!("{}_client", naive_snake_case(service.name())); - let methods = generate_methods(service, emit_package, proto_path, compile_well_known_types); - - let service_doc = generate_doc_comments(service.comment()); - - let package = if emit_package { service.package() } else { "" }; - let path = format!( - "{}{}{}", - package, - if package.is_empty() { "" } else { "." }, - service.identifier() - ); - - let mod_attributes = attributes.for_mod(package); - let struct_attributes = attributes.for_struct(&path); - - quote! { - /// Generated client implementations. - #(#mod_attributes)* - pub mod #client_mod { - #service_doc - #(#struct_attributes)* - #[derive(Debug)] - pub struct #service_ident { - pub client: Client, - } - - impl #service_ident - where - Client: prpc::client::RequestClient - { - pub fn new(client: Client) -> Self { - Self { client } - } - - #methods - } - } - } -} - -fn generate_methods( - service: &T, - emit_package: bool, - proto_path: &str, - compile_well_known_types: bool, -) -> TokenStream { - let mut stream = TokenStream::new(); - for method in service.methods() { - let path = crate::join_path( - emit_package, - service.package(), - service.identifier(), - method.identifier(), - ); - - stream.extend(generate_doc_comments(method.comment())); - - let method = match (method.client_streaming(), method.server_streaming()) { - (false, false) => generate_unary(method, proto_path, compile_well_known_types, path), - _ => { - panic!("Only unary method supported"); - } - }; - - stream.extend(method); - } - - stream -} - -fn generate_unary( - method: &T, - proto_path: &str, - compile_well_known_types: bool, - path: String, -) -> TokenStream { - let ident = format_ident!("{}", method.name()); - let (request, response) = method.request_response_name(proto_path, compile_well_known_types); - - quote! { - pub async fn #ident( - &self, - request: #request, - ) -> Result<#response, prpc::client::Error> { - let response = self.client.request(#path, prpc::codec::encode_message_to_vec(&request)).await?; - Ok(prpc::Message::decode(&response[..])?) - } - } -} diff --git a/crates/prpc-build/src/lib.rs b/crates/prpc-build/src/lib.rs deleted file mode 100644 index ea825e0b1b..0000000000 --- a/crates/prpc-build/src/lib.rs +++ /dev/null @@ -1,292 +0,0 @@ -#![recursion_limit = "256"] - -use proc_macro2::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream}; -use quote::TokenStreamExt; -mod prost; - -pub use crate::prost::{compile_protos, configure, Builder}; - -use std::io::{self, Write}; -use std::process::Command; - -/// Service code generation for client -pub mod client; -/// Service code generation for Server -pub mod server; - -mod protos_codec_extension; - -/// Service generation trait. -/// -/// This trait can be implemented and consumed -/// by `client::generate` and `server::generate` -/// to allow any codegen module to generate service -/// abstractions. -pub trait Service { - /// Comment type. - type Comment: AsRef; - - /// Method type. - type Method: Method; - - /// Name of service. - fn name(&self) -> &str; - /// Package name of service. - fn package(&self) -> &str; - /// Identifier used to generate type name. - fn identifier(&self) -> &str; - /// Methods provided by service. - fn methods(&self) -> &[Self::Method]; - /// Get comments about this item. - fn comment(&self) -> &[Self::Comment]; -} - -/// Method generation trait. -/// -/// Each service contains a set of generic -/// `Methods`'s that will be used by codegen -/// to generate abstraction implementations for -/// the provided methods. -pub trait Method { - /// Comment type. - type Comment: AsRef; - - /// Name of method. - fn name(&self) -> &str; - /// Identifier used to generate type name. - fn identifier(&self) -> &str; - /// Method is streamed by client. - fn client_streaming(&self) -> bool; - /// Method is streamed by server. - fn server_streaming(&self) -> bool; - /// Get comments about this item. - fn comment(&self) -> &[Self::Comment]; - /// Type name of request and response. - fn request_response_name( - &self, - proto_path: &str, - compile_well_known_types: bool, - ) -> (TokenStream, TokenStream); -} - -/// Attributes that will be added to `mod` and `struct` items. -#[derive(Debug, Default, Clone)] -pub struct Attributes { - /// `mod` attributes. - module: Vec<(String, String)>, - /// `struct` attributes. - structure: Vec<(String, String)>, -} - -impl Attributes { - fn for_mod(&self, name: &str) -> Vec { - generate_attributes(name, &self.module) - } - - fn for_struct(&self, name: &str) -> Vec { - generate_attributes(name, &self.structure) - } - - /// Add an attribute that will be added to `mod` items matching the given pattern. - /// - /// # Examples - /// - /// ``` - /// # use prpc_build::*; - /// let mut attributes = Attributes::default(); - /// attributes.push_mod("my.proto.package", r#"#[cfg(feature = "server")]"#); - /// ``` - pub fn push_mod(&mut self, pattern: impl Into, attr: impl Into) { - self.module.push((pattern.into(), attr.into())); - } - - /// Add an attribute that will be added to `struct` items matching the given pattern. - /// - /// # Examples - /// - /// ``` - /// # use prpc_build::*; - /// let mut attributes = Attributes::default(); - /// attributes.push_struct("EchoService", "#[derive(PartialEq)]"); - /// ``` - pub fn push_struct(&mut self, pattern: impl Into, attr: impl Into) { - self.structure.push((pattern.into(), attr.into())); - } -} - -// Generates attributes given a list of (`pattern`, `attribute`) pairs. If `pattern` matches `name`, `attribute` will be included. -fn generate_attributes<'a>( - name: &str, - attrs: impl IntoIterator, -) -> Vec { - attrs - .into_iter() - .filter(|(matcher, _)| match_name(matcher, name)) - .flat_map(|(_, attr)| { - // attributes cannot be parsed directly, so we pretend they're on a struct - syn::parse_str::(&format!("{attr}\nstruct fake;")) - .unwrap() - .attrs - }) - .collect::>() -} - -/// Format files under the out_dir with rustfmt -pub fn fmt(out_dir: &str) { - let dir = std::fs::read_dir(out_dir).unwrap(); - - for entry in dir { - let file = entry.unwrap().file_name().into_string().unwrap(); - if !file.ends_with(".rs") { - continue; - } - let result = - Command::new(std::env::var("RUSTFMT").unwrap_or_else(|_| "rustfmt".to_owned())) - .arg("--emit") - .arg("files") - .arg("--edition") - .arg("2018") - .arg(format!("{out_dir}/{file}")) - .output(); - - match result { - Err(e) => { - eprintln!("error running rustfmt: {e:?}"); - // exit(1) - } - Ok(output) => { - if !output.status.success() { - io::stdout().write_all(&output.stdout).unwrap(); - io::stderr().write_all(&output.stderr).unwrap(); - //exit(output.status.code().unwrap_or(1)) - } - } - } - } -} - -// Generate a singular line of a doc comment -fn generate_doc_comment>(comment: S) -> TokenStream { - let mut doc_stream = TokenStream::new(); - - doc_stream.append(Ident::new("doc", Span::call_site())); - doc_stream.append(Punct::new('=', Spacing::Alone)); - doc_stream.append(Literal::string(comment.as_ref())); - - let group = Group::new(Delimiter::Bracket, doc_stream); - - let mut stream = TokenStream::new(); - stream.append(Punct::new('#', Spacing::Alone)); - stream.append(group); - stream -} - -// Generate a larger doc comment composed of many lines of doc comments -fn generate_doc_comments>(comments: &[T]) -> TokenStream { - let mut stream = TokenStream::new(); - - for comment in comments { - stream.extend(generate_doc_comment(comment)); - } - - stream -} - -// Checks whether a path pattern matches a given path. -pub(crate) fn match_name(pattern: &str, path: &str) -> bool { - if pattern.is_empty() { - false - } else if pattern == "." || pattern == path { - true - } else { - let pattern_segments = pattern.split('.').collect::>(); - let path_segments = path.split('.').collect::>(); - - if &pattern[..1] == "." { - // prefix match - if pattern_segments.len() > path_segments.len() { - false - } else { - pattern_segments[..] == path_segments[..pattern_segments.len()] - } - // suffix match - } else if pattern_segments.len() > path_segments.len() { - false - } else { - pattern_segments[..] == path_segments[path_segments.len() - pattern_segments.len()..] - } - } -} - -fn naive_snake_case(name: &str) -> String { - let mut s = String::new(); - let mut it = name.chars().peekable(); - - while let Some(x) = it.next() { - s.push(x.to_ascii_lowercase()); - if let Some(y) = it.peek() { - if y.is_uppercase() { - s.push('_'); - } - } - } - - s -} - -fn join_path(emit_package: bool, package: &str, service: &str, method: &str) -> String { - let mut path = String::new(); - if emit_package { - path += package; - } - - if !path.is_empty() { - path += "."; - } - - path += service; - - if !method.is_empty() { - path += "."; - path += method; - } - path -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_match_name() { - assert!(match_name(".", ".my.protos")); - assert!(match_name(".", ".protos")); - - assert!(match_name(".my", ".my")); - assert!(match_name(".my", ".my.protos")); - assert!(match_name(".my.protos.Service", ".my.protos.Service")); - - assert!(match_name("Service", ".my.protos.Service")); - - assert!(!match_name(".m", ".my.protos")); - assert!(!match_name(".p", ".protos")); - - assert!(!match_name(".my", ".myy")); - assert!(!match_name(".protos", ".my.protos")); - assert!(!match_name(".Service", ".my.protos.Service")); - - assert!(!match_name("service", ".my.protos.Service")); - } - - #[test] - fn test_snake_case() { - for case in &[ - ("Service", "service"), - ("ThatHasALongName", "that_has_a_long_name"), - ("greeter", "greeter"), - ("ABCServiceX", "a_b_c_service_x"), - ] { - assert_eq!(naive_snake_case(case.0), case.1) - } - } -} diff --git a/crates/prpc-build/src/prost.rs b/crates/prpc-build/src/prost.rs deleted file mode 100644 index 8d7c8b0fc7..0000000000 --- a/crates/prpc-build/src/prost.rs +++ /dev/null @@ -1,447 +0,0 @@ -use super::{client, server, Attributes}; -use proc_macro2::TokenStream; -use prost_build::{Config, Method, Service}; -use quote::ToTokens; -use std::ffi::OsString; -use std::io; -use std::path::{Path, PathBuf}; - -/// Configure `prpc-build` code generation. -/// -/// Use [`compile_protos`] instead if you don't need to tweak anything. -pub fn configure() -> Builder { - Builder { - build_client: true, - build_server: true, - out_dir: None, - extern_path: Vec::new(), - field_attributes: Vec::new(), - type_attributes: Vec::new(), - server_attributes: Attributes::default(), - client_attributes: Attributes::default(), - proto_path: "super".to_string(), - compile_well_known_types: false, - format: true, - emit_package: true, - protoc_args: Vec::new(), - file_descriptor_set_path: None, - mod_prefix: Default::default(), - type_prefix: Default::default(), - } -} - -/// Simple `.proto` compiling. Use [`configure`] instead if you need more options. -/// -/// The include directory will be the parent folder of the specified path. -/// The package name will be the filename without the extension. -pub fn compile_protos(proto: impl AsRef) -> io::Result<()> { - let proto_path: &Path = proto.as_ref(); - - // directory the main .proto file resides in - let proto_dir = proto_path - .parent() - .expect("proto file should reside in a directory"); - - self::configure().compile(&[proto_path], &[proto_dir])?; - - Ok(()) -} - -impl crate::Service for Service { - type Method = Method; - type Comment = String; - - fn name(&self) -> &str { - &self.name - } - - fn package(&self) -> &str { - &self.package - } - - fn identifier(&self) -> &str { - &self.proto_name - } - - fn comment(&self) -> &[Self::Comment] { - &self.comments.leading[..] - } - - fn methods(&self) -> &[Self::Method] { - &self.methods[..] - } -} - -impl crate::Method for Method { - type Comment = String; - - fn name(&self) -> &str { - &self.name - } - - fn identifier(&self) -> &str { - &self.proto_name - } - - fn client_streaming(&self) -> bool { - self.client_streaming - } - - fn server_streaming(&self) -> bool { - self.server_streaming - } - - fn comment(&self) -> &[Self::Comment] { - &self.comments.leading[..] - } - - fn request_response_name( - &self, - proto_path: &str, - compile_well_known_types: bool, - ) -> (TokenStream, TokenStream) { - let request = if (is_google_type(&self.input_proto_type) && !compile_well_known_types) - || self.input_type.starts_with("::") - { - self.input_type.parse::().unwrap() - } else if self.input_type.starts_with("crate::") { - syn::parse_str::(&self.input_type) - .unwrap() - .to_token_stream() - } else { - syn::parse_str::(&format!("{proto_path}::{}", self.input_type)) - .unwrap() - .to_token_stream() - }; - - let response = if (is_google_type(&self.output_proto_type) && !compile_well_known_types) - || self.output_type.starts_with("::") - { - self.output_type.parse::().unwrap() - } else if self.output_type.starts_with("crate::") { - syn::parse_str::(&self.output_type) - .unwrap() - .to_token_stream() - } else { - syn::parse_str::(&format!("{proto_path}::{}", self.output_type)) - .unwrap() - .to_token_stream() - }; - - (request, response) - } -} - -fn is_google_type(ty: &str) -> bool { - ty.starts_with(".google.protobuf") -} - -struct ServiceGenerator { - builder: Builder, - clients: TokenStream, - servers: TokenStream, -} - -impl ServiceGenerator { - fn new(builder: Builder) -> Self { - ServiceGenerator { - builder, - clients: TokenStream::default(), - servers: TokenStream::default(), - } - } -} - -impl prost_build::ServiceGenerator for ServiceGenerator { - fn generate(&mut self, service: prost_build::Service, _buf: &mut String) { - if self.builder.build_server { - let server = server::generate( - &service, - self.builder.emit_package, - &self.builder.proto_path, - self.builder.compile_well_known_types, - &self.builder.server_attributes, - ); - self.servers.extend(server); - } - - if self.builder.build_client { - let client = client::generate( - &service, - self.builder.emit_package, - &self.builder.proto_path, - self.builder.compile_well_known_types, - &self.builder.client_attributes, - ); - self.clients.extend(client); - } - } - - fn finalize(&mut self, buf: &mut String) { - if self.builder.build_client && !self.clients.is_empty() { - let code = format!("{}", self.clients); - buf.push_str(&code); - - self.clients = TokenStream::default(); - } - - if self.builder.build_server && !self.servers.is_empty() { - let code = format!("{}", self.servers); - buf.push_str(&code); - - self.servers = TokenStream::default(); - } - } -} - -/// Service generator builder. -#[derive(Debug, Clone)] -pub struct Builder { - pub(crate) build_client: bool, - pub(crate) build_server: bool, - pub(crate) extern_path: Vec<(String, String)>, - pub(crate) field_attributes: Vec<(String, String)>, - pub(crate) type_attributes: Vec<(String, String)>, - pub(crate) server_attributes: Attributes, - pub(crate) client_attributes: Attributes, - pub(crate) proto_path: String, - pub(crate) emit_package: bool, - pub(crate) compile_well_known_types: bool, - pub(crate) protoc_args: Vec, - - mod_prefix: String, - type_prefix: String, - file_descriptor_set_path: Option, - out_dir: Option, - format: bool, -} - -impl Builder { - /// Enable or disable client code generation. - pub fn build_client(mut self, enable: bool) -> Self { - self.build_client = enable; - self - } - - /// Enable or disable server code generation. - pub fn build_server(mut self, enable: bool) -> Self { - self.build_server = enable; - self - } - - /// Enable the output to be formated by rustfmt. - pub fn format(mut self, run: bool) -> Self { - self.format = run; - self - } - - /// Module prefix of the generated code. - pub fn mod_prefix(mut self, prefix: impl Into) -> Self { - self.mod_prefix = prefix.into(); - self - } - - /// Type prefix of the scale codec anotation in the proto file. - pub fn type_prefix(mut self, prefix: impl Into) -> Self { - self.type_prefix = prefix.into(); - self - } - - /// Set the output directory to generate code to. - /// - /// Defaults to the `OUT_DIR` environment variable. - pub fn out_dir(mut self, out_dir: impl AsRef) -> Self { - self.out_dir = Some(out_dir.as_ref().to_path_buf()); - self - } - - /// Declare externally provided Protobuf package or type. - /// - /// Passed directly to `prost_build::Config.extern_path`. - /// Note that both the Protobuf path and the rust package paths should both be fully qualified. - /// i.e. Protobuf paths should start with "." and rust paths should start with "::" - pub fn extern_path(mut self, proto_path: impl AsRef, rust_path: impl AsRef) -> Self { - self.extern_path.push(( - proto_path.as_ref().to_string(), - rust_path.as_ref().to_string(), - )); - self - } - - /// Add additional attribute to matched messages, enums, and one-offs. - /// - /// Passed directly to `prost_build::Config.field_attribute`. - pub fn field_attribute, A: AsRef>(mut self, path: P, attribute: A) -> Self { - self.field_attributes - .push((path.as_ref().to_string(), attribute.as_ref().to_string())); - self - } - - /// Add additional attribute to matched messages, enums, and one-offs. - /// - /// Passed directly to `prost_build::Config.type_attribute`. - pub fn type_attribute, A: AsRef>(mut self, path: P, attribute: A) -> Self { - self.type_attributes - .push((path.as_ref().to_string(), attribute.as_ref().to_string())); - self - } - - /// Add additional attribute to matched server `mod`s. Matches on the package name. - pub fn server_mod_attribute, A: AsRef>( - mut self, - path: P, - attribute: A, - ) -> Self { - self.server_attributes - .push_mod(path.as_ref().to_string(), attribute.as_ref().to_string()); - self - } - - /// Add additional attribute to matched service servers. Matches on the service name. - pub fn server_attribute, A: AsRef>(mut self, path: P, attribute: A) -> Self { - self.server_attributes - .push_struct(path.as_ref().to_string(), attribute.as_ref().to_string()); - self - } - - /// Add additional attribute to matched client `mod`s. Matches on the package name. - pub fn client_mod_attribute, A: AsRef>( - mut self, - path: P, - attribute: A, - ) -> Self { - self.client_attributes - .push_mod(path.as_ref().to_string(), attribute.as_ref().to_string()); - self - } - - /// Add additional attribute to matched service clients. Matches on the service name. - pub fn client_attribute, A: AsRef>(mut self, path: P, attribute: A) -> Self { - self.client_attributes - .push_struct(path.as_ref().to_string(), attribute.as_ref().to_string()); - self - } - - /// Set the path to where to search for the Request/Response proto structs - /// live relative to the module where you call `include_proto!`. - /// - /// This defaults to `super` since we will generate code in a module. - pub fn proto_path(mut self, proto_path: impl AsRef) -> Self { - self.proto_path = proto_path.as_ref().to_string(); - self - } - - /// Configure Prost `protoc_args` build arguments. - /// - /// Note: Enabling `--experimental_allow_proto3_optional` requires protobuf >= 3.12. - pub fn protoc_arg>(mut self, arg: A) -> Self { - self.protoc_args.push(arg.as_ref().into()); - self - } - - /// Emits RPC endpoints with no attached package. Effectively ignores protofile package declaration from rpc context. - /// - /// This effectively sets prost's exported package to an empty string. - pub fn disable_package_emission(mut self) -> Self { - self.emit_package = false; - self - } - - /// Enable or disable directing Prost to compile well-known protobuf types instead - /// of using the already-compiled versions available in the `prost-types` crate. - /// - /// This defaults to `false`. - pub fn compile_well_known_types(mut self, compile_well_known_types: bool) -> Self { - self.compile_well_known_types = compile_well_known_types; - self - } - - /// When set, the `FileDescriptorSet` generated by `protoc` is written to the provided - /// filesystem path. - /// - /// This option can be used in conjunction with the [`include_bytes!`] macro and the types in - /// the `prost-types` crate for implementing reflection capabilities, among other things. - pub fn file_descriptor_set_path(mut self, path: impl Into) -> Self { - self.file_descriptor_set_path = Some(path.into()); - self - } - - /// Compile the .proto files and execute code generation. - pub fn compile( - self, - protos: &[impl AsRef], - includes: &[impl AsRef], - ) -> io::Result<()> { - self.compile_with_config(Config::new(), protos, includes) - } - - /// Compile the .proto files and execute code generation using a - /// custom `prost_build::Config`. - pub fn compile_with_config( - self, - mut config: Config, - protos: &[impl AsRef], - includes: &[impl AsRef], - ) -> io::Result<()> { - let out_dir = if let Some(out_dir) = self.out_dir.as_ref() { - out_dir.clone() - } else { - PathBuf::from(std::env::var("OUT_DIR").unwrap()) - }; - - let format = self.format; - - config.out_dir(out_dir.clone()); - for (proto_path, rust_path) in self.extern_path.iter() { - config.extern_path(proto_path, rust_path); - } - for (prost_path, attr) in self.field_attributes.iter() { - config.field_attribute(prost_path, attr); - } - for (prost_path, attr) in self.type_attributes.iter() { - config.type_attribute(prost_path, attr); - } - if self.compile_well_known_types { - config.compile_well_known_types(); - } - - for arg in self.protoc_args.iter() { - config.protoc_arg(arg); - } - - let file_descriptor_set_path = - if let Some(file_descriptor_set_path) = &self.file_descriptor_set_path { - file_descriptor_set_path.clone() - } else { - out_dir.join("file_descriptor_set.bin") - }; - config.file_descriptor_set_path(file_descriptor_set_path.clone()); - - let mod_prefix = self.mod_prefix.clone(); - let type_prefix = self.type_prefix.clone(); - - config.service_generator(Box::new(ServiceGenerator::new(self))); - - if std::env::var("PROTOC").is_err() { - std::env::set_var("PROTOC", protoc::protoc()); - } - config.compile_protos(protos, includes)?; - - let patch_file = out_dir.join("protos_codec_extensions.rs"); - - crate::protos_codec_extension::extend_types( - &file_descriptor_set_path, - patch_file, - &mod_prefix, - &type_prefix, - ); - - { - if format { - super::fmt(out_dir.to_str().expect("Expected utf8 out_dir")); - } - } - - Ok(()) - } -} diff --git a/crates/prpc-build/src/protos_codec_extension.rs b/crates/prpc-build/src/protos_codec_extension.rs deleted file mode 100644 index 2ebe3765f0..0000000000 --- a/crates/prpc-build/src/protos_codec_extension.rs +++ /dev/null @@ -1,453 +0,0 @@ -use either::Either; -use heck::{ToSnakeCase, ToUpperCamelCase}; -use itertools::Itertools; -use log::debug; -use multimap::MultiMap; -use prost_types::field_descriptor_proto::{Label, Type}; -use prost_types::source_code_info::Location; -use prost_types::{ - DescriptorProto, FieldDescriptorProto, FileDescriptorProto, FileDescriptorSet, SourceCodeInfo, -}; -use std::collections::HashMap; - -#[derive(PartialEq)] -enum Syntax { - Proto2, - Proto3, -} - -pub struct CodeGenerator<'a> { - package: String, - source_info: SourceCodeInfo, - syntax: Syntax, - depth: u8, - path: Vec, - buf: &'a mut String, - mod_path: Vec, - mod_prefix: String, - type_prefix: String, -} - -impl<'a> CodeGenerator<'a> { - pub fn generate( - file: FileDescriptorProto, - buf: &mut String, - mod_prefix: impl Into, - type_prefix: impl Into, - ) { - let mut source_info = file - .source_code_info - .expect("no source code info in request"); - source_info.location.retain(|location| { - let len = location.path.len(); - len > 0 && len % 2 == 0 - }); - source_info - .location - .sort_by_key(|location| location.path.clone()); - - let syntax = match file.syntax.as_deref() { - None | Some("proto2") => Syntax::Proto2, - Some("proto3") => Syntax::Proto3, - Some(s) => panic!("unknown syntax: {}", s), - }; - - let mut code_gen = CodeGenerator { - package: file.package.unwrap(), - source_info, - syntax, - depth: 0, - path: Vec::new(), - buf, - mod_path: vec![], - mod_prefix: mod_prefix.into(), - type_prefix: type_prefix.into(), - }; - - debug!( - "file: {:?}, package: {:?}", - file.name.as_ref().unwrap(), - code_gen.package - ); - - code_gen.path.push(4); - for (idx, message) in file.message_type.into_iter().enumerate() { - code_gen.path.push(idx as i32); - code_gen.append_message(message); - code_gen.path.pop(); - } - code_gen.path.pop(); - } - - fn append_message(&mut self, message: DescriptorProto) { - debug!(" message: {:?}", message.name()); - - let mut impl_buf = String::new(); - if self.append_message_impl(message.clone(), &mut impl_buf) { - self.buf.push_str(&impl_buf); - } - - let message_name = message.name().to_string(); - let fq_message_name = format!(".{}.{}", self.package, message.name()); - - // Split the nested message types into a vector of normal nested message types, and a map - // of the map field entry types. The path index of the nested message types is preserved so - // that comments can be retrieved. - type NestedTypes = Vec<(DescriptorProto, usize)>; - type MapTypes = HashMap; - let (nested_types, _): (NestedTypes, MapTypes) = message - .nested_type - .into_iter() - .enumerate() - .partition_map(|(idx, nested_type)| { - if nested_type - .options - .as_ref() - .and_then(|options| options.map_entry) - .unwrap_or(false) - { - let key = nested_type.field[0].clone(); - let value = nested_type.field[1].clone(); - assert_eq!("key", key.name()); - assert_eq!("value", value.name()); - - let name = format!("{}.{}", &fq_message_name, nested_type.name()); - Either::Right((name, (key, value))) - } else { - Either::Left((nested_type, idx)) - } - }); - if !nested_types.is_empty() { - self.push_mod(&message_name); - self.path.push(3); - for (nested_type, idx) in nested_types { - self.path.push(idx as i32); - self.append_message(nested_type); - self.path.pop(); - } - self.path.pop(); - self.pop_mod(); - } - } - - fn append_field(&mut self, field: FieldDescriptorProto, buf: &mut String) -> bool { - let optional = self.optional(&field); - let ty = self.resolve_decoded_type(&field); - - debug!(" field: {:?}, type: {:?}", field.name(), ty,); - - if let Some((name, _type_path)) = self.codec_decoration() { - match name.as_str() { - "scale" => { - buf.push_str(&format!( - "pub fn decode_{}(&self) -> Result<{}, ScaleDecodeError> {{\n", - self.typed_field_name(&field), - ty - )); - if optional { - buf.push_str(&format!( - "self.{}.as_ref().map(|v| Decode::decode(&mut &v[..])).transpose()", - field.name() - )); - } else { - buf.push_str(&format!("Decode::decode(&mut &self.{}[..])", field.name())); - } - buf.push_str("\n}\n"); - return true; - } - _ => { - panic!("Unknown codec {}", name); - } - } - } - false - } - - fn append_message_impl(&mut self, message: DescriptorProto, buf: &mut String) -> bool { - let message_name = message.name().to_string(); - // Split the fields into a vector of the normal fields, and oneof fields. - // Path indexes are preserved so that comments can be retrieved. - type Fields = Vec<(FieldDescriptorProto, usize)>; - type OneofFields = MultiMap; - let (fields, _): (Fields, OneofFields) = message - .field - .into_iter() - .enumerate() - .partition_map(|(idx, field)| { - if field.proto3_optional.unwrap_or(false) { - Either::Left((field, idx)) - } else if let Some(oneof_index) = field.oneof_index { - Either::Right((oneof_index, (field, idx))) - } else { - Either::Left((field, idx)) - } - }); - - buf.push_str("impl "); - let mut msg_path = self.mod_path.clone(); - msg_path.push(to_upper_camel(&message_name)); - let msg_path = self.mod_prefix.clone() + &msg_path.join("::"); - buf.push_str(&msg_path); - buf.push_str(" {\n"); - - self.path.push(2); - let mut n_fields = 0; - for (field, idx) in fields.clone() { - self.path.push(idx as i32); - if self.append_field(field, buf) { - n_fields += 1; - } - self.path.pop(); - } - self.path.pop(); - - if n_fields > 0 { - buf.push_str("pub fn new(\n"); - self.path.push(2); - for (field, idx) in fields.clone() { - self.path.push(idx as i32); - buf.push_str(&format!( - "{}: {},\n", - self.typed_field_name(&field), - self.resolve_decoded_type(&field) - )); - self.path.pop(); - } - self.path.pop(); - buf.push_str(") -> Self {\n"); - buf.push_str(" Self{\n"); - self.path.push(2); - for (field, idx) in fields { - self.path.push(idx as i32); - if self.codec_decoration().is_some() { - if self.optional(&field) { - buf.push_str(&format!( - "{}: {}.map(|x| x.encode()),\n", - field.name(), - self.typed_field_name(&field), - )); - } else { - buf.push_str(&format!( - "{}: {}.encode(),\n", - field.name(), - self.typed_field_name(&field) - )); - } - } else { - buf.push_str(&format!("{},\n", field.name())); - } - self.path.pop(); - } - self.path.pop(); - buf.push_str(" }\n"); - buf.push_str("}\n"); - } - - buf.push_str("\n}\n"); - n_fields > 0 - } - - fn location(&self) -> &Location { - let idx = self - .source_info - .location - .binary_search_by_key(&&self.path[..], |location| &location.path[..]) - .unwrap(); - - &self.source_info.location[idx] - } - - fn find_comment(&self, predicate: impl Fn(&str) -> Option) -> Option { - let comments = self.location().leading_comments(); - comments - .split('\n') - .find_map(|line| predicate(line.trim_start())) - } - - fn codec_decoration(&self) -> Option<(String, String)> { - self.find_comment(|line| { - let parts: Vec<_> = line.split_whitespace().collect(); - match parts[..] { - ["@codec", name, type_path] => Some((name.to_owned(), type_path.to_owned())), - _ => None, - } - }) - } - - fn boxed_decoration(&self) -> bool { - self.find_comment(|line| { - if line.starts_with("@boxed") { - Some(()) - } else { - None - } - }) - .is_some() - } - - fn push_mod(&mut self, module: &str) { - self.mod_path.push(to_snake(module)); - self.depth += 1; - } - - fn pop_mod(&mut self) { - self.depth -= 1; - self.mod_path.pop(); - } - - fn optional(&self, field: &FieldDescriptorProto) -> bool { - if field.proto3_optional.unwrap_or(false) { - return true; - } - - if field.label() != Label::Optional { - return false; - } - - match field.r#type() { - Type::Message => true, - _ => self.syntax == Syntax::Proto2, - } - } - - fn typed_field_name<'f>(&self, field: &'f FieldDescriptorProto) -> &'f str { - let encode_prefix = "encoded_"; - let field_name = field.name(); - if self.codec_decoration().is_some() - && field_name.starts_with(encode_prefix) - && field_name.len() > encode_prefix.len() - { - &field_name[encode_prefix.len()..] - } else { - field_name - } - } - - fn resolve_decoded_type(&self, field: &FieldDescriptorProto) -> String { - if let Some((_name, type_path)) = self.codec_decoration() { - let type_path = self.type_prefix.clone() + type_path.as_str(); - if self.optional(field) { - return format!("Option<{type_path}>"); - } else { - return type_path; - } - } - self.resolve_type(field) - } - - fn resolve_type(&self, field: &FieldDescriptorProto) -> String { - let ty = match field.r#type() { - Type::Float => String::from("f32"), - Type::Double => String::from("f64"), - Type::Uint32 | Type::Fixed32 => String::from("u32"), - Type::Uint64 | Type::Fixed64 => String::from("u64"), - Type::Int32 | Type::Sfixed32 | Type::Sint32 | Type::Enum => String::from("i32"), - Type::Int64 | Type::Sfixed64 | Type::Sint64 => String::from("i64"), - Type::Bool => String::from("bool"), - Type::String => String::from("::prost::alloc::string::String"), - Type::Bytes => String::from("::prost::alloc::vec::Vec"), - Type::Group | Type::Message => self.resolve_ident(field.type_name()), - }; - let ty = if self.boxed_decoration() { - format!("::prost::alloc::boxed::Box<{ty}>") - } else { - ty - }; - if self.optional(field) { - format!("Option<{ty}>") - } else if field.label() == Label::Repeated { - format!("::prost::alloc::vec::Vec<{ty}>") - } else { - ty - } - } - - fn resolve_ident(&self, pb_ident: &str) -> String { - // protoc should always give fully qualified identifiers. - assert_eq!(".", &pb_ident[..1]); - - let mut local_path = self.package.split('.').peekable(); - - let mut ident_path = pb_ident[1..].split('.'); - let ident_type = ident_path.next_back().unwrap(); - let mut ident_path = ident_path.peekable(); - - // Skip path elements in common. - while local_path.peek().is_some() && local_path.peek() == ident_path.peek() { - local_path.next(); - ident_path.next(); - } - - local_path - .map(|_| "super".to_string()) - .chain(ident_path.map(to_snake)) - .chain(std::iter::once(to_upper_camel(ident_type))) - .join("::") - } -} - -/// Converts a `camelCase` or `SCREAMING_SNAKE_CASE` identifier to a `lower_snake` case Rust field -/// identifier. -pub fn to_snake(s: &str) -> String { - let mut ident = s.to_snake_case(); - - // Use a raw identifier if the identifier matches a Rust keyword: - // https://doc.rust-lang.org/reference/keywords.html. - match ident.as_str() { - // 2015 strict keywords. - | "as" | "break" | "const" | "continue" | "else" | "enum" | "false" - | "fn" | "for" | "if" | "impl" | "in" | "let" | "loop" | "match" | "mod" | "move" | "mut" - | "pub" | "ref" | "return" | "static" | "struct" | "trait" | "true" - | "type" | "unsafe" | "use" | "where" | "while" - // 2018 strict keywords. - | "dyn" - // 2015 reserved keywords. - | "abstract" | "become" | "box" | "do" | "final" | "macro" | "override" | "priv" | "typeof" - | "unsized" | "virtual" | "yield" - // 2018 reserved keywords. - | "async" | "await" | "try" => ident.insert_str(0, "r#"), - // the following keywords are not supported as raw identifiers and are therefore suffixed with an underscore. - "self" | "super" | "extern" | "crate" => ident += "_", - _ => (), - } - ident -} - -/// Converts a `snake_case` identifier to an `UpperCamel` case Rust type identifier. -pub fn to_upper_camel(s: &str) -> String { - let mut ident = s.to_upper_camel_case(); - - // Suffix an underscore for the `Self` Rust keyword as it is not allowed as raw identifier. - if ident == "Self" { - ident += "_"; - } - ident -} - -pub fn extend_types( - file_descriptor_set_path: impl AsRef, - out_file: impl AsRef, - mod_prefix: &str, - type_prefix: &str, -) { - use prost::Message; - let buf = std::fs::read(file_descriptor_set_path).unwrap(); - let file_descriptor_set = FileDescriptorSet::decode(&*buf).unwrap(); - let mut buf = String::new(); - buf.push_str( - r#" - #![allow(clippy::too_many_arguments)] - - use ::prpc::codec::scale::{Encode, Decode, Error as ScaleDecodeError}; - use ::alloc::vec::Vec; - use ::alloc::string::String; - "#, - ); - if !mod_prefix.is_empty() { - buf.push_str(&format!("use {mod_prefix}*;\n")); - } - for file in file_descriptor_set.file { - CodeGenerator::generate(file, &mut buf, mod_prefix, type_prefix); - } - std::fs::write(out_file, buf).unwrap(); -} diff --git a/crates/prpc-build/src/server.rs b/crates/prpc-build/src/server.rs deleted file mode 100644 index 1125682be0..0000000000 --- a/crates/prpc-build/src/server.rs +++ /dev/null @@ -1,290 +0,0 @@ -use super::{Attributes, Method, Service}; -use crate::{generate_doc_comment, generate_doc_comments, naive_snake_case}; -use proc_macro2::{Span, TokenStream}; -use quote::quote; -use syn::{Ident, Lit, LitStr}; - -/// Generate service for Server. -/// -/// This takes some `Service` and will generate a `TokenStream` that contains -/// a public module containing the server service and handler trait. -pub fn generate( - service: &T, - emit_package: bool, - proto_path: &str, - compile_well_known_types: bool, - attributes: &Attributes, -) -> TokenStream { - let methods = generate_methods( - service, - proto_path, - emit_package, - compile_well_known_types, - false, - ); - let json_methods = generate_methods( - service, - proto_path, - emit_package, - compile_well_known_types, - true, - ); - - let server_service = quote::format_ident!("{}Server", service.name()); - let server_trait = quote::format_ident!("{}", service.name()); - let server_mod = quote::format_ident!("{}_server", naive_snake_case(service.name())); - let supported_methods = generate_supported_methods(service, emit_package); - let method_enum = generate_methods_enum(service, emit_package); - let generated_trait = generate_trait( - service, - proto_path, - compile_well_known_types, - server_trait.clone(), - ); - let service_doc = generate_doc_comments(service.comment()); - let package = if emit_package { service.package() } else { "" }; - let path = crate::join_path(emit_package, service.package(), service.identifier(), ""); - let mod_attributes = attributes.for_mod(package); - let struct_attributes = attributes.for_struct(&path); - - quote! { - /// Generated server implementations. - #(#mod_attributes)* - pub mod #server_mod { - use alloc::vec::Vec; - use alloc::boxed::Box; - - #method_enum - - #supported_methods - - #generated_trait - - #service_doc - #(#struct_attributes)* - #[derive(Debug)] - pub struct #server_service { - inner: T, - } - - impl #server_service { - pub fn new(inner: T) -> Self { - Self { - inner, - } - } - - pub async fn dispatch_request(&mut self, path: &str, data: impl AsRef<[u8]>) -> Result, prpc::server::Error> { - #![allow(clippy::let_unit_value)] - match path { - #methods - _ => Err(prpc::server::Error::NotFound), - } - } - - pub async fn dispatch_json_request(&mut self, path: &str, data: impl AsRef<[u8]>) -> Result, prpc::server::Error> { - #![allow(clippy::let_unit_value)] - match path { - #json_methods - _ => Err(prpc::server::Error::NotFound), - } - } - } - } - } -} - -fn generate_trait( - service: &T, - proto_path: &str, - compile_well_known_types: bool, - server_trait: Ident, -) -> TokenStream { - let methods = generate_trait_methods(service, proto_path, compile_well_known_types); - let trait_doc = generate_doc_comment(format!( - "Generated trait containing RPC methods that should be implemented for use with {}Server.", - service.name() - )); - - quote! { - #trait_doc - #[async_trait::async_trait] - pub trait #server_trait { - #methods - } - } -} - -fn generate_trait_methods( - service: &T, - proto_path: &str, - compile_well_known_types: bool, -) -> TokenStream { - let mut stream = TokenStream::new(); - - for method in service.methods() { - let name = quote::format_ident!("{}", method.name()); - - let (req_message, res_message) = - method.request_response_name(proto_path, compile_well_known_types); - - let method_doc = generate_doc_comments(method.comment()); - - let method = match (method.client_streaming(), method.server_streaming()) { - (false, false) => { - quote! { - #method_doc - async fn #name(&mut self, request: #req_message) - -> Result<#res_message, prpc::server::Error>; - } - } - _ => { - panic!("Streaming RPC not supported"); - } - }; - - stream.extend(method); - } - - stream -} - -fn generate_supported_methods(service: &T, emit_package: bool) -> TokenStream { - let mut all_methods = TokenStream::new(); - for method in service.methods() { - let path = crate::join_path( - emit_package, - service.package(), - service.identifier(), - method.identifier(), - ); - - let method_path = Lit::Str(LitStr::new(&path, Span::call_site())); - all_methods.extend(quote! { - #method_path, - }); - } - - quote! { - pub fn supported_methods() - -> &'static [&'static str] { - &[ - #all_methods - ] - } - } -} - -fn generate_methods_enum(service: &T, emit_package: bool) -> TokenStream { - let mut paths = vec![]; - let mut variants = vec![]; - for method in service.methods() { - let path = crate::join_path( - emit_package, - service.package(), - service.identifier(), - method.identifier(), - ); - - let variant = Ident::new(method.identifier(), Span::call_site()); - variants.push(variant); - - let method_path = Lit::Str(LitStr::new(&path, Span::call_site())); - paths.push(method_path); - } - - let enum_name = Ident::new( - &format!("{}Method", service.identifier()), - Span::call_site(), - ); - quote! { - pub enum #enum_name { - #(#variants,)* - } - - impl #enum_name { - #[allow(clippy::should_implement_trait)] - pub fn from_str(path: &str) -> Option { - match path { - #(#paths => Some(Self::#variants),)* - _ => None, - } - } - } - } -} - -fn generate_methods( - service: &T, - proto_path: &str, - emit_package: bool, - compile_well_known_types: bool, - json: bool, -) -> TokenStream { - let mut stream = TokenStream::new(); - - for method in service.methods() { - let path = crate::join_path( - emit_package, - service.package(), - service.identifier(), - method.identifier(), - ); - let method_path = Lit::Str(LitStr::new(&path, Span::call_site())); - let method_ident = quote::format_ident!("{}", method.name()); - let server_trait = quote::format_ident!("{}", service.name()); - - let method_stream = match (method.client_streaming(), method.server_streaming()) { - (false, false) => generate_unary( - method, - proto_path, - compile_well_known_types, - method_ident, - server_trait, - json, - ), - _ => { - panic!("Streaming RPC not supported"); - } - }; - - let method = quote! { - #method_path => { - #method_stream - } - }; - stream.extend(method); - } - - stream -} - -fn generate_unary( - method: &T, - proto_path: &str, - compile_well_known_types: bool, - method_ident: Ident, - _server_trait: Ident, - json: bool, -) -> TokenStream { - let (request, _response) = method.request_response_name(proto_path, compile_well_known_types); - - if json { - quote! { - let data = data.as_ref(); - let input: #request = if data.is_empty() { - Default::default() - } else { - serde_json::from_slice(data)? - }; - let response = self.inner.#method_ident(input).await?; - Ok(serde_json::to_vec(&response)?) - } - } else { - quote! { - let input: #request = prpc::Message::decode(data.as_ref())?; - let response = self.inner.#method_ident(input).await?; - Ok(prpc::codec::encode_message_to_vec(&response)) - } - } -} diff --git a/crates/prpc/Cargo.toml b/crates/prpc/Cargo.toml deleted file mode 100644 index 37c7ce4806..0000000000 --- a/crates/prpc/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "prpc" -version = "0.1.0" -edition = "2018" - -[dependencies] -async-trait = "0.1.57" -derive_more = "0.99.16" -prost = { version = "0.11", default-features = false, features = ["prost-derive"] } -anyhow = { version = "1", default-features = false } -parity-scale-codec = { version = "3.6.5", default-features = false } -serde_json = { version = "1", default-features = false } - -[features] -default = ["std"] -std = ["serde_json/std"] diff --git a/crates/prpc/src/lib.rs b/crates/prpc/src/lib.rs deleted file mode 100644 index eaa273afa1..0000000000 --- a/crates/prpc/src/lib.rs +++ /dev/null @@ -1,125 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] -extern crate alloc; - -use alloc::boxed::Box; -use alloc::string::String; -use alloc::vec::Vec; -use async_trait::async_trait; -use derive_more::Display; -use prost::DecodeError; - -pub use prost::Message; - -pub mod server { - use super::*; - use alloc::string::ToString; - use parity_scale_codec::Error as ScaleCodecErr; - - /// Error for server side RPC handlers. Finally, this error will be wrapped in a `ProtoError`. - #[derive(Display, Debug)] - pub enum Error { - /// The requesting RPC method is not recognized - NotFound, - /// Failed to decode the request parameters - DecodeError(DecodeError), - /// Some error occurred when handling the request - AppError(String), - /// Error for contract query - #[display(fmt = "ContractQueryError({_0})")] - ContractQueryError(String), - } - - impl From for Error { - fn from(e: DecodeError) -> Self { - Self::DecodeError(e) - } - } - - #[cfg(feature = "std")] - impl std::error::Error for Error {} - - #[cfg(not(feature = "std"))] - impl From for anyhow::Error { - fn from(error: Error) -> Self { - Self::msg(error) - } - } - - impl From for Error { - fn from(e: ScaleCodecErr) -> Self { - Self::DecodeError(DecodeError::new(e.to_string())) - } - } - - impl From for Error { - fn from(e: serde_json::Error) -> Self { - Self::DecodeError(DecodeError::new(e.to_string())) - } - } - - /// The final Error type of RPCs to be serialized to protobuf. - #[derive(Display, Message)] - pub struct ProtoError { - #[prost(string, tag = "1")] - pub message: ::prost::alloc::string::String, - } - - impl ProtoError { - pub fn new(message: impl Into) -> ProtoError { - ProtoError { - message: message.into(), - } - } - } -} - -pub mod client { - use super::*; - - /// The Error type for the generated client-side RPCs. - #[derive(Display, Debug)] - pub enum Error { - /// Failed to decode the response from the server. - DecodeError(DecodeError), - /// The error returned by the server. - ServerError(super::server::ProtoError), - /// Other errors sush as networking error. - RpcError(String), - } - - impl From for Error { - fn from(e: DecodeError) -> Self { - Self::DecodeError(e) - } - } - - #[cfg(feature = "std")] - impl std::error::Error for Error {} - - #[cfg(not(feature = "std"))] - impl From for anyhow::Error { - fn from(error: Error) -> Self { - Self::msg(error) - } - } - - /// Trait for RPC client to implement the underlying data transport. - /// Required by the generated RPC client. - #[async_trait] - pub trait RequestClient { - async fn request(&self, path: &str, body: Vec) -> Result, Error>; - } -} - -pub mod codec { - use super::*; - - pub use parity_scale_codec as scale; - - pub fn encode_message_to_vec(msg: &impl Message) -> Vec { - let mut buf = Vec::with_capacity(msg.encoded_len()); - - msg.encode_raw(&mut buf); - buf - } -} diff --git a/crates/rustfmt-snippet/Cargo.toml b/crates/rustfmt-snippet/Cargo.toml index 545d4a7f26..393ee9b9cb 100644 --- a/crates/rustfmt-snippet/Cargo.toml +++ b/crates/rustfmt-snippet/Cargo.toml @@ -8,5 +8,3 @@ edition = "2018" [dependencies] proc-macro2 = "1.0.36" -tempfile = "3.10.1" - diff --git a/crates/rustfmt-snippet/src/lib.rs b/crates/rustfmt-snippet/src/lib.rs index d9986dfb51..a4554d33f4 100644 --- a/crates/rustfmt-snippet/src/lib.rs +++ b/crates/rustfmt-snippet/src/lib.rs @@ -16,18 +16,8 @@ pub fn rustfmt(source: &str) -> std::io::Result { io::Write, process::{Command, Stdio}, }; - use tempfile::NamedTempFile; - // Create a temporary file - let mut tempfile: NamedTempFile = NamedTempFile::new()?; - - // Write the source code to the temporary file - writeln!(tempfile, "{}", source)?; - - // Retrieve the path of the temporary file to pass it to rustfmt - let path = tempfile.path(); - let path = format!("{}", path.display()); let proc = Command::new("rustfmt") - .args([path.as_str(), "--emit", "stdout", "--edition", "2018"]) + .args(["--emit", "stdout", "--edition", "2018"]) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn()?; diff --git a/e2e/contracts/check_system/sideprog.wasm b/e2e/contracts/check_system/sideprog.wasm index ecf6faa4456a8dabe5d9c1d743f51ea6bd9c098c..dcb30f89c5e83765f355a4e434515862109478d2 100755 GIT binary patch delta 153319 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 delta 134827 zcmd44d0-U9);>H{GufB~1_^6eCSft``>F_yAP6e%yMhXO#p{B4-LDf?0|p2VSOEeg ztdUJ1NFr;12*?@{6p>9tjI04sxr+Ebr~1sKlR~}k`+NWR(DXe0bam}@s?Isp-FtSA z663dz6tS+yUV2uzTrROn)R-81Zv~fYU}Ql5oA~Mj6OZh0uXV2uE)m__5z-wzCu+n; zxTA%~BZMbH3gH%Rmpj4}^viAm#Nl##V%-w|aNUhqg*yV*af8bh=XSeYVBMg=A!tRR zPr`vq7hQKJyCAqL5xCFq^lx; z*rKI$Aw8txibH}(RLZ!xhzN>Z;{OPV{2+iQTEq$DQA8kVMCS2$B9KZ%wA&l)t>mLT z3J+z-gQ9pUyS!!_4bal0!c*68@Em62G47YWpi_99%o+f%JNg?7ifJW=8W zkt=e8Z@ZfW*1NBH>FGg(UwL-GvyVOf+<+(l_42=79PBD^$E=dVWeM+cQTzHjUx_ZA zuj^#3bT_-Dd6R|@HE4Qmi$?u!sMxJ>>#s%k{o*%yW7i({4!ryR`<}b&p67?Y@Wv~z zz4@v$oB9I}bi6vr@_)vT-){2kB z3b9-)L+)0Kg<_M~EDFU&@rn3UjFAi6E70hx+#k9>6Q7GcVz2l@>=Qf1A#qq75l6)u z_b7Q%WXd1J1oupNQJfIP;*|JaTo&iVS#e%u$kXD2xFm+l6j>tvBPPgnIq?x0l<&#+ zrIJ63#d3-KP%f2|`l4&_`>5tMK1)Hc zq^MqTZp3TF4neF@h<8V@S#(#iTZsmuP23UtCW{h0thzT4orA}sn~EL5iZPiuE{ypW z#|ag3uhxgW{p6imArmotshp9 z;<76GN|~LS@i~}7nyKVqPHQIG!CW+$%bJOIgh?MxX+`;F1xAFDSDJE0Jueg}9A>d* zVjK~z)J&{{*=XGLsb=CFVZP8z1u%h7@<+o|h&gF67Y*i$!K99$l2O#5c-}LZ%u*)6 zl|QePVrHqqtTLEFgV|*;`wixpg9+Gef7(IW%+CgsGO~Qh#v05dgPCD4IZh^^yWVmq zrI|Gbv)N#Z4Ca8r95M4dz&C!N79D^0X1?XM;%@Q$EvU4Q5h^$$cgHXk-N~jlFZ+ zA~JZ#>Z-wiwQMIo4K8T8TI>!!*{Z$xDwx@-A@Igl&2cPg^&yz7))(|KJ~+S47eH^f z?TO>2wm;&S*KV2kD);I3-6c+jcCH#+-?4*@a=o1f3tSu8xg}l8zOFfryRZ8W$B(Z6 z700DrKfvV&Z+Hu#f?sya!7-)#r#SYt62#%)lU98k$Liw}s{!!m8vkN-7e|7fdJFMN%&os{=l9S@GeMf*2VU48&Ab)3QVb<$qg52M70_h$w#P-4)07 zeH4y6`}Dxkck}x=&cFFtQ5dY+_eLBa=$jFBaUB}WcQ|;dZ+kE;`q6PvzYZZjH@jb7 zs{}qm3+>R3DR=6XA!uak?#c|4=RQLmT-XpdJ zTiq2ew&wP_E0r$qx_c3hZ{9;Sanrr)a9_lIxuVurRM5oe*vejO&->JelCAxUvQ`q@ zbALxs60GpRW!w?Td#jN0%K`q2wmE{ptb9W9} z=v*t#o=Vl{Tq`cqjB~BHK{L(;U6E#-YsLKrb5t|VwcrY2g7T{A_rx!6%QE9af3N)FqaHw`1EjDxnOBd#$GGF z@1*ovG0R{U7|aTTS!Xa?4Q5XnMz0kQmZ3;$o-mjagZb59M$RZ-*6{|DQI?^#;;gb1 zm_-J&(qIY zI}GLvgE?w2Ck-ZW(V(svOlns7vc6|9nFce@V3r!ps(?Wi8q6+(*>5n%4Cb`K{A@5O z*@5yU8=GC8nPf0C3?|25mK)3(gV~&ItQCulKnD!wxWSw?m`fohx8L(eBQftadu5Hx zm>oR%$^(hX_6;KkWoZ_qDh{tK}Hg}FGN=5 zoJA1(oo2nrS?a$VHx1cVGa}4sAZJhnh1aJ-=XrhjCT3*hoQLMUP1&c zS96zbj*{K26lq2KcG1!!NyNFVXb@N^_I-O$+yuJ8FRc_Y#5X&*`t94@Ti0(4RtyXh z$AT{fy3{Y2LJ1wGhVZ3P4qRR48IL4$NPsrfc4Pw;UD$j^-yGDMSpx^Wq-BADqg?Kx`+(?PC1N?@XGG~ znE6R=TG2(rMu!!hUNwb71wR;ZMCbF}k*yKw+L6JyBAw5@I!9^2M@BuRuWuRkkpGyj z5)?6d2qM55jBJTAS;o>K-ZwJXV{`*V^3>?WIJ>YJA5pQ=f|Ezri(9IrEnsHD=;u)_ zt=}0|ZToQKv=-va5JM1kjUm=?mv4J;>pRWG$l%ZKT#E?nriLQC%(vf?+6`vIwA2|m zHXXAJ$3tT-iXAGkn;4t>@Vm`qrLU-*i30Izy&$N@4HU<7FO9pN)~@X*{6hqTGbYqv zGo!AVUBQhLc8cw}>FKS+{iSA0w~y_gu`a(0CerP?68L1BKDh?Gm9Z9O4cXDWeEmyj z;Db0(iDN`#|GU)uSPD>l%N=+nVeipswPBj5svcD`G7eSZfnn8`LzjZ-IWN3)=vplpa9x%sxGY%JNko(0{0J33t)QhxG9+eVqQj zKM<-4RGM!JRZAibN#BqL=nfd2E^lod&~20GfclEoeOUMw>Y9(YFH#7Y$bAQN>y;xH z>yXmr#sBGWlLYGPsI6AdB)Jo8tseYjYE!6%=co3jOPw=G&)k&R z2*d1TCN3aIe6Y#%>q7?q+r71e6J|83mB4-$R^)LrNw&N+Hc*Ir1h}2-E>>9QPjHEc{ z?X%x3oAWi<4VvVyv14nM7-2+Jt|lwYO5}Q1t=<-K!Sopo|EdPZ&$?Nj%nN=st5sE_ zdC+I%YOz_RwE#gP6*O&cp3)RG&6Q!*PYiAD@JA-zh zJLa^g)X`Q0%Tv*tI%ar69+A}4qSI3xH$P8~5N z*dwQVIc7`FxVy8ch9F#IC2u82JwN&9vWctYtq!4PGk&*kmJa9fdn$RWFz=gPdN0-$ zdJ@xjs$Zq7+r(aBc=e=sX(NhZMc6AmuS1eXV_+`KE&1Rgv^@Q6Fe5*q=4X4yOz|gGTWwW z(@LlV=4EN+1pipluCCT@5?!)8tv=f&30mUBjh$jnF>r+r1TXzh1g0LgWRPtb7

3OYjWp`eUr?=7--x=!0uyyep zwzv#~wS&K=zlybH8^yJVx-#M-HqKwwT4b}q+w-d;%_s9aHPb^E6BL4YusU%2ic)Y( zQUsZW9TTJ;g28S1{hEYinFsxeu|E>oaQP#w0$n6d^n2y2C~LI9QpkhU1zK5lN6SI8 zf)TVgTF!0759uK~>ID-n(}JluIP>GG>eq@gE`TKxt%wd%cA)+thi)vGu;sv-LzKPF ziYB6mwBz7KSK6lq|FcCGCqW5>S6#06*1Xl|u$?ye(zTRRqS*^ZRnl4X`R}(|1k)o< z1TU?%%Ivt98a%kp!Q?htFQqt}+jzrAg-tN`{##Q52;4-WXa-cHEaJ&g4F@ZwPUPUtmwwnc$W$PvXk* z{Yj{ief!%`u;>H5Veq*904+A(I`DNBohwKmS~-VGJLKz;^7rAvlCSHE-MN(xKIEKs zP=%Wg_4AdVe1Z?8ws9z#LuKai;EXXhXkBv*o%~~LSNfShwh3#VboS`GEi3A&Z{2a! zGb}FWg2`taiiN@3&bDl}Uvm-GA^X=4bAUz{^^rsydh{ha@y!c}xznXNh*w(sPeYmIUp zIM=7_YO_U2C%OAOy$}zS)N-eOR}joBxf3DJl}vMEX%ifGzJu5mEIi*{F1CYRbHN{1 zDimlj-|a%9n9O06f8D*bM8K(#4W6e07I~xqMIfMC+!HhUnz7fZT7{>;{5Jj`A9*Wrp zv(R8ZGMM!S^Qpmn9%cfe#14h25c9pkoHv-?3})2n@@1W1FjGpIkW+VdDaEB67A2F_?oWR^M#SXKQbNxe1-9F;4vk3hK2!8Vw?gzlX1XnEnxVz z*ZPRzzr9ug!?(QFc7|_ytuHi0`fqrxZ!t%y6jJDrESA*V@hSd9QUK!1y_@^&P`!y;cdse|oLo7(U~* zMqjWqF~n<4Wcak#%4GNtuQi|HQ(kL1!zaDgT84wY)>ejtyw>M748%U+wGK1=xYzoD z;bUIwBEx}R>kozlyw=zs?MyuCwI(xs#A{_SeAsI(WcZNRTFLN1ueE{U172$f!~4C~ zmp{__2P5Dtd94!+`+BYO3~%;Yml^i)TJQX1XQH>)dXM2vUTZqT zUS2DQVNb7>%kW08wT@vAuk|TI%WLiZiPm2zes`~Rgz0Wx>md z_ge2Vyv}RA&#;Tv%4XQvYb|2f$!p~??C7;NGVI{Bb~0>_L9?H6JFoRE!?s@QEWpu)zd##bb*qLbMwI(oZ>9wXZY~i)$GHmX(mNIPSwN^81>a{jAY~r;(1Jv@bvDZ4t zbh6j_p5e7#>jJ|@Uh8*;4WR{JvNO@ZYXuqB_gXU;CV8z77$$nH6%3&~uV+}#Yi(m# z7xHf(<2qjJD8t%b>lDKTh-rqkAf*3er(6>A(a_cfKX-_1DVVa z&XFw)qrBFGdl*?Mvgo%pl@+p$@`z7k=rwSWCCt5Bo8`pBB~eme2ZQ|<`S zzUEA=lX{xFViMhc{6xbTPBxrOg&mtuR$6JRtnd=zf8TVqIYPV`dzm884m&GX^^6pW zQTs1bl&91`BgH`Dp06Xt4Puh26(yEJJ>MQBIwurUc&iR96Gg5eR_gC`mO)2fnyMEq z+J};eM~GZCFj~})%F&lksj<X-=CcBem?(({gYFD(V9S?vg$yfkW zLgp2UIaOVW7Q;oh8Wtluh)k6qBU(JZpDvL#&SM?5VJsj_=WgFA+kRwa{ed7>Q!687 z17fl5Ib`TTWkqyx)w6a@25;5HZS{s&r}atE`xMmP-Jm{;5mlRKP$YkuPFTgyNy$Bb zVVXOzfYK|Y;IGzM22XZne45q|jel?hp!^_7!-e59@Zz!+e z&oTlnGMJSHQ(!RL3}&yv90pTP!7nxfT`-u-1~Ym@`Ld=P%v6J!Lrhr(e~A$&-(WTx z%npP3!eEXX%t_6ZQSdJsfvy-#>d5kCea~Pr4Q8IfEVUV@g1^cLRA?}}3}(N<95a~H z2JGdFKWH!~45q|jel?hp?}W-4D%f}j z!wPS{7sBW!QaIgy2@7!q2M292nGKfLn!#aGK7LZ>Rrl< zt>C9?EMuYIPhBNdaV!-442F-vX2EbEY!(a$z-GY^3VtC&DEPY>Lcu@45DNZx458qcFoc5t z8^ilyvKUY6A6vnnINpX(@G}`g!Jp3%3jT72Q1I6>go3}7;T^D9Foc4Cm?0GW9~eTx zzsL{@{vQlU!5=%pP8kaRWQI`ivlv3bU&s&&{z`^W@Ha4og1>`dFW4*?_JqlTAr$;G z458p(Vrao+kxuI`TfrZnZfBw!Y!(cm;Ll+Q1^+{a*TZJP5DNY$458o`F@%EuHN#FY zSulixf1V)}{L2hU!GC9>oiY^s_ZYT?&4OVY*en>fhRuQ@6#R7zTf%0+umx-u458p3 zVF(5PBtt0pKQV-YpYk5dzs9gx08>pQ!)Cz{3Vt@jMzC2hYzUhL!v?TfFoc4?lOYuR z{R|UfvS0`W|186LFj+7p1%G7FP8kaR1ctR?vtS4Xe=b8P_)8f=!C%d=21GPNDEOZ- zgo1yNAr$=Y8A8Foz_1FWGeK7HQzzM(s0`uE5DNYbhLs?h8CHZ~W(Wm;Jwqt?+ZaN@ z-^UON{!xZ8kjV_AA(9zF!M|@9sdA|JNJwOc5wKY>^gtXlgo3}AAr$<4hLFFTY*<#o zSKlOHW5?0=RZ4x)^ndy82z5;z(J($mA%j*$+YFFSColu_t0UTU!;bqD>@4xStSn7` zLs~p`my~XRMaAXo+na){gw5vqq%eabNmFa;h}&cL(n$wN8;(}18g)ghR^O6Fj8p7; z$Ii55=}UsqB3ah(Woat`V0@B`_8*aAj?G8vwYuV7aXC2b?P}_~y5eE+qv}ylv@7FW zSHtUxPIB=SwWgkEQup0ZME955YoqrKDi|g@$x&0(4SvMCLtz_qt19-^LY*CKc(udr z_ls`wV1}xhC>k}|O>TDVg8l2=k!os>3J2VT_fNMon-1@I;MgPEhT~}_{t}HRMR~)_F zg_6#|`xrQFH$7ERHagx4vpWqNvBfQIRj~`LKD#w8SdXibV41bHqq6; ztBIrf#nq}mp?ZO?X@Mc1h@se0#M9ng-zwFnspyZ6aYF}D?S4nK<7tpTsdf>rcI;B@ zAZtJfg{xhJDy}xz(rQ;FO+^>vx@j}fplN9}heM;9?exkvlTd4uMfK9^w!{2obzdcj zDnhE^>i(^nuI|>&QQhyWKyycR+xM2O?k&xAb;q_4tx?@Kw9wT(vW4i@JKVyaKO01_ zMLGwO#~4J^k5%m!A`wwHYZ;EZbbS8rqgEGN>hYP_O5EJm9%Rxn$n^M*4UaLsX{+q` zp597?`V7q$FfhxOB9{Bi?pER!5+bKnW9Q0E|l0@H42 zOpR@=JI5!jOUGb3CZ|wnj7K}}Q25w3&M|0T`^!#ol^|+J8%L*@+y<4uLw(&w+=yOU zudTQ@JO=H1%XW(Nw&MNx9WqUD}COz8qVo(FJ53>>KSwV>I!c zcH(~2+VAZ|op7zWtu;oiwQsNc+#Bsh-PU>nB%xR!_yHQs{^71?-(9Bc>eKe31roc| zUiT*q>r%mtw@s9jr0RtZ;bw+t@Y$jv)XcLw=w?3GLDak_)XW&{_D}zig$~o_BG@e9pp5f*z29Ds&x-BwB9^Qg|_Jm zD{xDkEZxfu0*{ZW4L#tgnz!;sF&d9Ys&{&dPX5w|#6);&x7$h)R@w}T{j56DQ#7fU zLJMxJd@Z=iMiPeJ00qEBTe)#fCHF$a>(x`egg?B*(d+KA0yDdpsNZD8Ohjx|Lzb{$ z+M!P}vnZ|5!YaIqSKsy&js7pwzUL}wr(Hd5{oo%x$wIr>J!t34lvC_Lrw0PBaaoyE zJ#^K#MK$Ox7G5Qr(PgUWY;SQrs;FrnM-{p0IoPsQG`Nqbe|IRG`np|3rz!bx6}hbj z&Sf1f;EE_iwA66hd9(eOh<}d0^OQQ+2Yq_3y3|MX_}k1ra5H4idNt|hzs~Hgn?=i7 zSIO)_JF}{KU%VV}hPuA5=zGIby9>Fg3#}lG2m0{bmF2Pm9c+TG6wnoHUk|*L6me^u zN5bowEc4OB3j2ySx9j^XF(fgP^c`H`NM$(Eq)6+^AAkH2)sJHLM{tU7D^%V6d#IvEu#nuU&qnf@&TkJ-N6HcUFqFU!b`}6p_d4@>bv`5!N%$jm z+G5oXjZ%CysoJ62; z%*9!T6ZeV{D0O!EEWT$jnFce@V3r!pDlp}oxP?ZbT?Vt?V2&BgX@mLMU{dCwU}c@S zV~Hx$9Fq)YhQZ_*%yNTSV=$XFQ^tu~WCS{3Fvkt%tifC|nBjBF7c9+YoKD>LjX+rj zv%p|h7|c3@*=jI*m~l994;q0^7)*)5{Aw^G=anz(c!S9ZF{Mu2Ss{wVpLXOeGMJSH zQ(!RL3}&yv91b&KCvI_=3MGHRU@jZX==tT#nr<*t4Q5U$6LR7%DW$md`3AGmV0IYH z7Y1|GU`{$1cH&-iP*|VoVde2a5!<(a6%WziK`fs6L%J4a^fy#OitW<#^l7^#F(78yBL!b_bbNa z#68ZKoVe#0YbWlnd_qp#Q48!$kP|nZF*$LkF(xPOJjUe2UB;N4xN8`b6L$+^a^mh` zOitWGjLC^xtT8)rf8-0~#J$3poVa5a+8H7z?j*+K#GT2QoVW`Z!yok#LpX5@7{ZCW zo#9(>b25ArZcYttC+=yc;l%xgA)L6w7uku!i93$rD{yl%gcEl*LpX7lFnkGaPKGbS z&B<^m+?)*I#67_9dAKhJ)eeWH<C#{h7ZBb$q-K59Sq^b{gNS^xW|^z`Uk!KKKMDAz88K@hH&DJ_|OgjC+>KLcfrlc z@J_fn8QuXmCqp=KS264lHz&i};O1lqC+^n_$%%V{aX@oVYs~c7Tq;kes;RGHwSyCqp=K|HBYY+>y)e zOu&gdfgzl@QyI2|o0B1&xJwzriMyI%Gq^b!Hies$VH3DH0YkgAzh@dw+zSlh#QmLN zBWyy+wKD-HZjfOExH%cthntfjoVY6(Cc@3h5Ki1}4C}$o$&j45M;XJ3dx~Lg_&FIS zKuoW&Q-%{ajbTm5Xohg&&SD5B?qY`3AfOpmg?wfh5An|>({SRRV+bei zuMA<09QBc%2{>`n8N!J>jbSXrGD9zf->yWV4n8Vs zU8gNVwl=Ioq0f}^Ib^++QaiX@dzU`EovewS~9YCS;IbZ0^pzjc6kq~9W2uO`(s zhasNupTiLEg~+lYDc-mVX;_-^&J!X6Z*U8x1G|8ZuxkO|iU`**M1-uq`w^k7{FiF- z=zcohol>}!7$~bmzy;`As^$+Aeee#Gl7XUa!aQ3k#~ab`+7|mQQW3Ttd%L>fG0~{Q zOmfLy=&iP)MKwc{(~ilc|_N0O`0my);l zG4YtF#D;Y;1HuBeRP}s9JPlLlk|)ITVxFoyNYunxr$NHsfFF0)Ci(`*7A+60N!o9i zWaaBfOVnF~#EtcewAXSDne3?|OO1zk`yJlJq7DzjmoRp#WrIbd`fPHSr7uZ{MzkKh zGmoDNpC^KqR6?A#b)a36C0zC@=}FN#wwRJ3^MkbZ1@BPRYQ@4tlZ-RiG4K|bRk&(Z zhw()Ej;RSxiW}&)bgJk{(e{6IXSb(Bby>X1Hd36_kvfeOziGy4q!_cB5_TFXrf9}# zNyyQR(@3$@VDdHNG*avcXv%3y_*^s2sE-+8e$b55NO3_kP9wz?|bLTDUKO|P8-b629vUuO6JV;Sc92lFf+iEGg9Oj zftDN08iUzvFhvG)z+jFOQ`Sgv)(CXTV1}WSTWTY6q$-aS%6cZVf zks^~Z87by7CL_gi#$=>e%b1K5TN#s);&aB@NO71?$Vl-6V=_`)WK2eiKNypdVr-$E zAu>`-W=uwkEXHJ{Sjd=+6e}5%kzxa5GE(f&n2i))@&z(d9AivIiZhJKNO6fV87W45 zVrPPk6yq5~-UhH7%9#(gpuMh zLl`OE*=*j(GK7(09mD6LyapJ?mNQ_>5^7DGoA( zk>Y!XcSCt)2qVSs3}K{5{nU;DMv5Rq7%65j><{IYA&e9&7{W-go*@}2wlRj0Vjn{o zDULFPk>V6X7%6^c2qVR?ZFb5qQlv42kwP(qkzy7@7%3Jr>;dJKp#|l2Td9#^7t`IK zy)uN6;y6PXDb6v3k>Xc|Fj9=#Zf62UigboBQcPnABgH(1Fj6dI2qVQBhGeAJ!Wc%1 zJq%%_IK&V}ieiQ^QvApeMv5y8TS9r=VP^tHib)J%q?pMNMv4UtVWjwoA&e9SfFUEr zcBWyZ_<|vf6yGp}k>WH%7%6^X2qVStop#DFQjBAm1Un+bMA#7-!bq`%VLjLp8IqBr zkTHxDyBWeraeyI=6yGs~k)nhlj1<2ygpp$OE;|!2QcPqBBSj`d7%Ap6gpp!7Ll`O6 z5@aLAR;FR3_?#h(6o(l?efxnSj1(6c!btH4Ll`N>?zS@lBgJHfFj8bOgppz)Ll`Mm zGK7)hz732cA(0uvNbw~@7%7f1gpuM5LkVHb5b}3Kkxsd+kwSg=nh0V?!;Pf-n zFFdAvwf#={dk{y+u@8OQ=iEU-uWR1>83NE|54TllLsHf~L#!NqCu`$rks>nmGHBm3 zNzzuT)qpp|lh{(W`3-R`e$Kujs>#bURpgsu40Pu7H?h%djr!tEZ0pWb&EFDTqB1_$ zxlzx(C6Y=r|7V+xtsFZz??VU|_D{qAZ3t|7@>rL2!OjHuNpRZHkg5|p!%VTW&PsQT z{aLblYYdi^`4ox8Z~V7k5xY%Oe*1ZU?^Af!8!SoKPUlJT_|^D-iv;({&o`(={}#1i zW!ds?k*JQO3cQvVdl#_Le!?ixG?2QNVg-?meGRZr_!io^ya8sW`r5Q%p+Q`BgZT02 z{Fk~tV*x9YwFQN<84n;{9KMUpIIi+9cf9H=!WX0BJGs0yb>gA7ira4wr%QTMP(!kf zp+vB6`KH=ALpqszH>jsai?)yRo0hdLh0HMYCR2e{fK3Q{js37nA#w_C_d%C_dnVrE z%~3gxEBeKQi*#-9HZkudyh%~*`bg9b4(J^jyxkigJo;p$>hU%@7j_Ei7j8;=LpeR| zP-v%71Mm>#g!Y2t4Z#=?v}cG=G!XVC0@c7r4yb^5LqlbH)uOAhJG!Gg8dr>HkCsNO zU!uv;2L3Ky-+v$Pk^ezmT;;}$ zzrPWmBB2`t_U_$q#m@QrJ7FTeN|O11eQ zV~Q;{X`~GKvx>#LdWCHY=dUe<-t0m#mcC+_q^%C8C22@{L7>6lOTsg@GR8*=r1CnC z+VPR_;|=9BN4P7x-2$_V&Rvp6H-aS+BXAz-;rsu(?c=aFm*Rr(Cc)$>Clg1O-u|sU z+%PH;yJ|N=R2Q?=SHneO|8Qbk!=WiB4G`|C)k0~8gl=g9lrr7&tx6st>R+S9D?(DW zC6eVmLOn7_+>K=kwgBU?wh^LkY-Tt=U`~w?E!)~cn_k)L zE3&6Ks;)9^5n)fvMRYHHGDt^I+;2lFs19zyxZ>`Pkq!rCk*R!O`?}!>t_{@9;BKtztLN7S*51|j@y^f)@bOZx`y~Q zzH84`XtaRl5&ceo^lA8j#_My(tM{>}@GVx+V@1Q7ztL(0^C5*>P2m`)=iM|`R1|g3 zXnz()Uvwgd7%gG^s3PrLa{IQc7vB|g<;dZx|Mj9<>F)fz$I?WE5a-lW7OsCpB`yYBs`HmJoD#Ip@k3aJ0m8tiu}6^*E5sY$&f7_E#G z)h%7LcOS<+ucnJT9^XL`>L$VETlCgqOLTE*T6QN#*hq>MeoOcXyVxgy2%Jhh+KTTZ zlx&kp=sLHA1F0qxMU%j3opEeW{v&FrPVRboEC#Jxa*AqZF4Y2v7{~$a1or)87XXo7 zEgZbC^xz!@)?1;Skz=R6eK%6kSw^$Et$wa9c!W@&bJ5Bbj=H-pk)xb?OEQ-!5oP8u zs_uKDsTiU9;wMlGTxF{Qv|~RO zSx=VeIqJzE_Tl5cjl~Sv6ylc(6PdIawr& z?^VmmqCP+MOVb#frH@V)ja!ybdnbC_-D$dcD=Ff3dL#qBTr8sXrKCv67SA0?BB3J@ zYUN~cZ3T9q`mPL9-%l1Tu1!CztA*4Tu3Xx=jmK3o=t8J&Z=-KXRqvcn^-ZD+a~=)*fHo;?d9Fbj}oY<3FJe8Yk>))GIG<+Nhq%6gMP=;Uxn1msNkJ-#A!({ypOIIPmAqkXoktBC0&nx0xWL%a|gP?&5m6Yf^m&qV&dQ7_MgblIY^ zW@015KDBD5sMR3!9DFzvkvbERek=m*m-=JnlvrQHtJo}&)YGm4WCrE2Rcjh`b|zur zp+zMmD3*8>!2VpGnZp;e#ND08>q1C+93u4HiO`oz&e%&uYJZ5%X80*Sj%u*?Gn`d_ zWQpcjJ2uaTQDe92lP!{3AGb$yGJ>A7Z^lLlWI?{1M?drR<~3thl#7;l{?`eMnEF;CRfOO93Z#FoFmD|^1UGmw7bPvXv}3!!58-Fm$W z`OwAXqApGL!AzYxuV0Wie91(wIWe|L#3fX0hlS$Cgs^16x|vsaF<2-2BhdpU zEfm-4T3ojfUm5({x*xho+#dM9s0yly|6L`zDweCn+ZKziN%k`FZ$*4a;)JI4W=rs} zdzm@xttFyM_ad6RD|*}>DX_l!g(grd*;+wsl(3>AwN!(=6eKUnrfB8pkyO$5uKIb2 zxXE8g;UU`^fGzb6j<82;(Y7aDySq>OUWf8nG;y zs2`W8I!i^jGRsxuIkcj*liEjVW8rCGQOU`M)qJQIT1BscxOf0V!lD7W7SVf#r>g1i{NSEp=F{@QrZuwTr%v2Ws;A^5DG3p z;eof=YU(o4p!R7qTxo~{%S3W5Jy}p~_<70bkMMf2F7VAzwU>(<-6({5e7R`nPC2_l z6)hLF6WH{OWhQbEw%_8bxEw$%RA-ip`jI819LK3;8w5Vrc~a*$7U|4X9dkwJI9`=d z75qM2{X16-2^AD-fu0Y4$`!Yl=k8h|u8qxiMmBndNRB#6420uHD@2=WYpL&$n&o+&<8a-L7hpX3k+{CTeV_gS z7mAHgdLBw7n-K*>fBsl~@)7ibt9Caer}dPB)NvBAuAt{W^$CQn*7TjXk+PO7i*;CB zBqd#+5PLin1FdoO2|e;mjc3ba_54Z^6PQCfm9{~L`XCuX@xG0%TG?Wqgq19;$^ZM* z{QRM;KN(lHnpnAu>nP<@4-s8Z6`hAg&2H5$Pc(9;UD%)=$rJSw-?3}DxeMI_FBkCr zMhZ`8=odwZ$lx8Tt9FKDpv8xqEEaC4LZQV2o#}Onbw0Ed!S+&8kZ7#At#j&Bp2!My zpwQ@cDq4zDhW1)aI_E)Xfti3`iW{ zM6LQ*BvjmbMrVXJx6%mu_G9snP*y_H_kmTSZKWMrx;C|nD7>#kOMHhQ=_{y_e2Wxi z%)R&g2K8Hk@K?7-VPtbxcYkEE>=_z`I@EQ=WwK90s};2cY!s2yv2^wPSp@HF5cNf_ zTDURve6${VpJS)qDw6pz|JUDdZ6MZ&fFsn=lP z|0C6|UnW#Wu~S@OcO%vnD4uVbYPd-}CswLSn?%R9bI3$RdL0G}dcg5bbc*GzDWiN0uuBDj^H*Gfq##C=(XIJud+aiVlm&sbl9 z#;s(+wL^7~J2(=36SnVDzR+PS>i?9PSuwzFH-LDL<2>S662|Z42F;+x_uxa z5rNA2MAUVs!9MxvC*r#1Tq4?!U>6n=ED4%xbP|0^5fMdNZ~G%&9oj+CEv+|;UhYW% zuWuF|Du!yqt|+y3Ge>-Qv$(C2ebKh5XW@?Pwm{}l9FJ}h*R=+tvx(v(I=oK=n?O*A zbizp$XarS2+7+G|`VVNW)|!nQ)wV6-Z8zFe_1h{&x)D(A*(&aF)1@Y#icdB8`BO1a zXYYY+B3TC>xlKG*MW>L2x5Me~k}N4Z5!=P!`uYOWLA~h=p%UO9@x*$ugr@AE2GzLj zqJBkPe+Y&MOz|&OuiTrAXKkMCdxE;dZFcgfYNj-Qh&(OFC*`5CLV-e=EFfi1f z9immu&9oMP9UyR1T%|v01ae+PpYxrleh>ePhledapgy z{W0M;YWQP(I*LS8EP|)(60LjdY)~f9t2IWc^lGkv@^`E5r?{lg&~)~Hlz&?;kusz! z;LR z1bL9UII8piN`#b^AbtFQE(g$gQ6K6bMHs`>i)9p0|QnEtxzLzU-uk>Zca8-mx9QHN{s8F~hRr#};u9^gU511klUuNzdS=Z`|A zku>wb5Q0RYYwB^D;RbPr9y6QF}3983h zcwG6TNG^a5%|$eH9A!jrq8@j2zwp<$MURUx@~~?)rWu zHeEH_{sWxtt_Q?W-F(Xqi2C}TFAs<>G_&+;k))Y@UyA}`9-4EI=bDJY#qRr9?i)h~5(G_d4;|shVxERhID0f|+%!~p zcD11{Yb9y`Tq`rWkOEf(T|h;okYPe6LA6r(sOVm{uvj4cO<@B^@l+kEP!$|Sv1pdQ zda0lLM!Z&8C*C{cJEbIl`9`!2bpY+*2=&{p$G8JLcuc%dg@<3bXHz{MI>tTs$}zDj zevuycfgwqFTbW;Aw*d&X<6F`D_LcTTh`xyWduvE@m& zt8l}Te*xP(?bXF|--#NPxJr;0-5_f6cOo_1ThU%rNlj0Pn?mgptvg|qHt70=(FwgF zu{ZMsx69EJBGA&Vza;X;;}*a0N7J+vt#w9Qo~4k`)LoeBcKr8ZQzd7~gm0x9SS(t3 zw^MNw(G`99YFe@A=SBh455*$Uy#gTa2T{`pp;;OmNze{Iz$i?8WZ)0nN5-AL+Q_JQ zl1E1RNzubOGSI(`ks;93p^AOuD;ou@q3WL&PwA0x^-_L(y6i~cM(%M&v~7htq-n5G3s^2-02sQ56bK*0xT6HUd zHn>{NC=oT=a8LK6z`ixqytcV=6G7UhYDarq@5~9H`{0ejKa_~3)izQ9lJK+@DmIBs zCMnQ6nw%F2k7`39nFXn7Jid=9C_+HQ+U7t!O5yUYvs3UByMZw20~`Q((RM>@_YVg| z$x&Izh?;#~^t-oM+ljQ)&|_BmigYrzDa0PE=!o{vWJeYZ8-BgngNFWY3XZ+%u0({g z3eg9sqIzBsU7PAz%%X>_U`T%%J7){+yiO6q6Y#C46DqgW)wfeEx&S4Fa`oi}IHrHpqaf_c@%V3$|k}_`=#$ zaj5(*guaoocOA|E#vPjjVWgFi-IVrrwImWXuvBe}lw0aw)+K6cZ5=`J^7qaheoJ`N z)ru(DP8?G|M9Dm)mmMv8)(!2;U>`PW8j86snLWOv${i!`D)qZ#9fMLwpw$0}kxjgO z?^3sjQb)T%-n4p1depP^aas@~FNA6Z_n=nRRgg*DN?QqSiIQ0RDYsTzSYz=z^0bk3 zvVxAGS3)`p;6?%JdF2&x)ZWQ)Pz{Tfyp!WPq0g$;)AhognzjjG8H)w2w<0&KU zF;1q`D%9yTMPZO=i9X33r4v;-ak6)<(=%{F4JEBb#M{O#cr)gygi5k|UB`P6FoDw3 z6g%eVVB`TUecwTZdVZkviBoh_J+-W&OuWjSOJ|n7vxy!4YKffwt3>kVRFap4n32^Xq5V(imZ>wc2<$CYZXu`$Q&#IHk8(7UE+zVM!f7TcT81}#mj9`8F>hYx1%nr zCabAFRprCXoKXv_%0HZ!UyWHY8ey@+@<-LWx~vjdqfb4)A9d~18U)*>T)e#5p)W?2 zxtKz4enh)i#rk5!vKJ*^%zB4XNeEr^llKP}e9O)$KhTjM=~kPnV~f%bb-cR#D3s~E ztQvBf=+A|se8IsQ5x)5>Ge&f<1eHs`nWP$9OWqCfbEK9$i3GPLNW8dLRje&BmM*^!;sSayf`{_3%8mwZ?*1?CAoNNZ2 zA?%7W?B%hkPX>vmLF|^c#-1P{+{Rx)_SVr|Z2^xK7XJZK^8^M9nfyh~5&a z^RsGVE7>LQ3;5s42Z}EnsHf_YBrk`Wn{Ml=#?+TL-nN}9&3_H7C9nrs=@EDhhh6W9 z)yZj+7LkY@MAnK(GP+WwXJOk&=q}9dd&xY2tLWfAsag$W-5SoTmuM5m{-`0A+xJu6 z?G5DqNK8bHo62k{ep1_;%k)4FjU=lU_frnq=os^=~UXM$OSDXVtj2nBjJ)UhU+I zca`mCp3>O3kWu9sYol(vI_0X+ai^-#UXBSDWomo5HZ=4jtQB}?IS+kIKDSl3$2yJB z2x}=_^LzE+-rWI_A)KQI*;jdSkM{fBzbng}VuCq4t|1ugM#oS^f@h1@)nfv>2RBcbI%QwmR za&ogYt~07}Z+V`(<=MQ%K3ErH5WIG??2=^9OkT_nc+GSLe>Lbgv3PER7IYVNhdHD6 z-Yo0$U<_5FquCr)Hqx##mDE>uh?-=d)gn`^&JQo}4+w8AGTirob>?qhmXhSG~XNB`XzCBvwr;-;PW@bBCN&^Rzw* zS08Hkvd!c*x>Nq9>!<$R@^z}88F$MXs2`Pow`?J|PF2Ns%f+{aX6j32ijz8(l4@Wr zqTld5yNJSAiPjn?i$PqPQ}yjVGB2Fbi*`8m!M)f_`Jdrx`@QnbD*vGZ(vpfK{WOaH zjC$Zc*&uv@ddMWckba*$fDZM{{jv*w=G`xQwJFq>c=*tQ+nQ6JfdN-vSYcmKbsmtp z@^q%!^MGtC&t$5o2jv(#fA2xr;6 z@KC}|0lQGehvbbF@@X$KJVMf|mJXG@Rl>uvikzLT5?_?@*pIQ}A^CXdw9|AuEbY5V z34L}$uQ_2+z+RX zAk|{=Q#2j1*&DsET+bXJYgYc9@1RY0D8S|6YV!a&^eSpY)?B{VR5&W1vO8@eG#)6@ zR`GO|J`hd*<8-xrAT}gVvb7s}7H6*dW1y@rPYqX}43sTm^GmPH(^tG4)v_o&hI_|I zQ7!mxhYCUeEzx-^9)s!?JDO?>?kr^W9d+<=*|qn6Dic{Y@%bCHIxH@)kVn};L+FBz zE>A;?0v*e=8u)~)TGMe?1${X_bb0&}vT6MBl}PJ47u7E&5BMQZtlX$}J|XY>|3xlZ z!%Tt_Rj~F_Hp899!KlWAWl#6zyp8IG!SX2$4h)v{t7PaK!a~GK$=|4aPs&C*MCT{v zE$)<$H>%VpW%H;UJE&Uoq}-5jaRCytnpry*(r=-#(iaoh==Oc2GMo|p{FFQm)vYvlVHixoW?|E4@`W*FNZw|d`uUc2D*$^wNZ-+LhJBZNsF}+ot z9!xB>J2CZ&95vy2*d0&tn8#?Z`H<>vIcxC7lMTIleQ!mImB1esS zK_=DWVTri9lZ7#w9&(56(<+{!HoPGFQVMZH4K!fG1Y^C17qdVE^wl`7Bi$>*5eG^m9 zHQ8E7N6?x&5=$8A%g#ITmi$aqJf~-b5`Bb7{p4+Qwey+k_qV0Lx}N3}WAPXq8V=2z zK`PwEOw}$RZ>DJ|5RebcOT*QnfNUav9CqEby(6FT$jsU5+BD4J_J*oe zt0)S*tQD+OvZ`U{T-(X=?WUJ>5f)M2T;3{JO6Wk?`sB;CIT#XcTlhJ3aI(A=aW{D% z>)R-fJI_)uT8MLbcVs}Ki*0!yPm^ixK*@YcBP7wO1D0jtz!d2)p_LSRwsll9DR#o> z=^kc6VPe3fIb&fd1J8XsnhHKZ z#IzML0+!TU=E?-sW{zwPDKuz~Y}CpTA;;ig(A_D9Vk3rqb7Y+dc`1VcSILtzZa{7PYws~mV z$wC%otN9;bKEm&|599#)ZMpzYq2u@71v0sstt^o#84udv!H{dQD-a!H(gN8ZGyU-e z@{!O|8Y}Dj7eb_#&V1V!$~v{mb~be2@TywLMY2QXY1G|m7^8wD_G4wLn-|H~{(eUN zV-ZY3`O3do*6*Sh{N(zy2{xTKYbfcnZbu^0gx5y|PY1TS!SMaCyI6 zC)M>0-2S{lOXLEtY}HBmR>}CvQ#>xXom{Rrygt{%_?@8IuacV*!Mfs1|LPP4h-kSOuRQk8rw93Q{MXk6~*PSvU#*b6V{W8`bX8#M19lC zeVr=a1wAWG{k}^MXkG00x%%T$#YmSc9>30WDr)FlhOVn|yJhdnX}GN)F25Y%f67f^A}{p+9qEK_-|J_uJwJ-tWP zi+cgEB5rvbzg{)5y8A}u|6KYWY}KjdOD{gra`1~UKL28i7hiH^;`#uDJB;`#$D#9M zIHx)Zo&Qko`URXfaa{jdsV?*S!6vBm#)n9w~tJF}T(1G@_wiOa$+Nz#G@$sjo{ut?5P!T^$y912NmB#DY~ zjELbqQB+Kr6;z%PB`B!q)8F@2chyYqd+&eF?|=UPJ*SwtpSqQ9-3r}ZJ)DNzCQ3d7 z8L#z8{d~=tz76C&)_#&+CtUw?^oV*O-2SZQRg>!>k?76(_>QYL^k$z|wY<)SMLnlY zt?V~#N@YVp;ggN<{YJ9Kn2I^GDix(TDy}iUkFA_FCR)FQRmA8m*vm0`JX;&1*9~8K zP&?pb3sZEnb#>8W zdJpYX+wiqi{T*K{rGuS$Xc<-JpEt3Fxq6$t8z^5pw8m$&Or6yhp&i?jt2c^mkFWGc z*_B&a`SbLo)L**ADZRmx5wZ}LLZ&}fk*8;~L3#S2)*T>J_I@*0&;%iwSuqzLy}7;i!-MBJ@KL@q6)|+zI(!FVyR{xEbHM)v~9J z88c^Q<=B?lO84H@)F{$C1D#Bs#wzm|zBdW?c}6?zW1gn^2(9i=Hm<4Ov*E6xaeQdM zh)adjsTvz+y5 zM3Q|5Algu|=}`E06gu%&o* zl{a?0H633=WE#TF)23xlshGMTdtSw)N=$YyBRXP7NK`p> z&XjC?Cqvi;&74p%b#{HQ=uGEUaICZg4?=hLoavJ*QNBgtTHw^9R^cK7)t``#KYqb_KmX_>k*^1H;-?30Bb1-91z$g7tPfesQpM)@(UG1oMN*Fn3>a5unqbFC6${tr)F&jge zsU7up?DiXVvr93r>d2APXHJ+~F}reP#q((4S5M)RR9 z7S#p#PCZ3ENHf|(ghdF^d@XQ#3Qo%Nfv zc2mMvI_sLA+zz#;zriytmmP~wmEF}%Ph=V0bicNACac>`FY_G*FMuB8iQOWTO`~$;}sccDOX8vrJ)&sNa_Sx*# z9(rBhFVLg4(44~_?4hSfxo{49vj-~CWe)qPhhFZUJ||9TYBj7&Pc-c495$e*p5J%{ z(h8%k#P?MQs}a^9tVLLdupZ%d1o~6ihMs!5x{bYxkF<7kt%27CpEMQ*;FD^9Y%2S! zr#@iHe8@c^A4Tb8o)w6!h0mo3qSWp9PA)($OkKUBn!FP-L)e8tokco#AnZnvwZiv3 z?1f%>GoR?u=JS}=8~c_;^H`hSdYSvld2vbu)}W7`%C_{@>ttSnOl#gTxCRZO=ql`G zZ$m}vGM`=Rt=IO=pKq;PkZbqR+qmzA+=#NO%Qp4F8L&_1v)z64BcaLD;*>=Q8xX1x z9zu8?;T?qY2$vE5Mo5|tM?k2D&<>$L!dQfv2rCipNB9ciPlUu7aY`0KAwmg4Il^Fs znFvb}HXz)EaCk;s9pzq`7wdjQX z_+Eu@CyO7dC$o$OsQFS8cSrud}J%R%S4@oA0bRzvh0?cg#tVu)TIdlxYMksU_!8M2X=&nlb$NK}P<@E1`B$)? zhGDaX&sxLvy7YO|aJ@~5e+A4BMVb?+K0wtMArFj_Z-ZPGC09a5E$hf? zcLS&$r4WE@RUrKR2)(bneExd$C=_V!qoFV4!}v~$LOxPWzF*30$ymKjg3x;?!rvUL zm$VQ(76p?%h1{;1{D4en)#s>X*S?h)b@SJ=jg@+dEaNk~5#aAs>ScXJo=xCWwBiUE z&p;eyPOc_@1(_xkp??wbO^*3u4Os<11xsD-Yjzw zl4Jw##V4)x4MWoXRS-x0n(MSsMdaA`MYWPsiX^m%DF zJ3dRVo6>xb&@R2Za7iSX9stO-hl%G+2V1JCa430huk!=wfsERSYS58=fw!4A$?gXR# z3j~^`JsEfJ%|#eF%vLf)sb5f;zYpyw7&B2!WW} zP1AF?twJELSq<+FF0-@m>O~<+N}Ju-d1|`R=~+b?W9JS)-D^Ax<$1PJ%$wd+@2dbI z0A9<}-VVk=)KUUo%a(`EAZ2q4=dfN0N_mF&Cs^rFecF=a&Bb0+{RhqIIzhOkpYG`J7PqtPR3BEDwdH)To5uhOwGs)M$V0{UM zzdM7MrbEYIn{$ZaF1UE2t{mO!Rbm^c-ala5*Ack^k+BWcRPSnZ5dpZQ61!c^Hg1gq z1#hTXinqhRaJdQL;Y43dY`HrxHM>k^rfY z=)y~i@{35cM@=*4z8nE{A60SL`6yaYjNuu(U#({xdlUD%U`X-PtmssN zXW}qyDk0NEUG#WYf6}Tbc@(Pap9_su(4hIO=u8$G5DUUUXn}~msG6QWQK0Cu$uqqd z3glBFQz?&PADz`x5>50gcd>t|Ze!u=igI-o)6VI2LLKL;%9lupZq=(sp3;<2+t95U zR<{m9B%@+;)C}IO1h`>Dw+ayH)|pUobgKZegCvOR))h$Q=vDz_DhVRpx=th#-6}w& zTgPKNFT3@$sJ-acv-AI>TYsA$F8xB^uh;$zK7d|Syg!oNl&bPps#3MytCXJc7+<3Y zK3mDIp4WSaF52TV_BS=(dlg#-1zo|L^1GViKOY5({-Q+&f8OV}pjJ@JgHZap$MkN% z<&^-1=k!$XucISCzoM$%*K9z8sx%za$oORp*BHQuS!pf2TjV|Q7OsYnE!_hzeJZAg z@#Q-a&}gnNP4TXW^Vhd4So&;CJg>0;U6!i}yvFrch10&)FX5%3rOf}WUMrNd)av)r z4?TI_Z&BGM00mUchn@uQCsBY`_9{RpXe2>{fH4(jAV8+%8rm8RDgfH&anO25H9)4k z85(5DkpEp*Jg=D`5nFx)TUJ0%+A@f&1>m-fhouDIWu1pD2}oN8#zp~d%8y~nu~4y0 z*&4R|6Sfp2V#}q_p&CkC3LtH{bZNNqJN^AQEwD7)`nn$QYPFVzd#J9#YWi9v&PHP4 zVvpcD!@FiWF0z-h7c^Hgk%z-dYnO$h2$^XI zR2*g^Kt_>P5qo6%lu`oTH4mR;reB+&t3IiKr-x*;~7AkTOqI$}z?84by~ry7FEt zlzYH)`~BYfH%LSN5O>h@{_u{f`~`3zwCy3mV3Lv(mKh0xZTf2%T6Xz3+*kb<%pd<6>EvX;NC;5Tg zk|qIAD(p9{Ew%)5OIi~ul#kq!X3P(N-r6-wZCkhiJ|oQ2?jKk-^9?f3hbM3eg}7+* z2w9q^_X4)Lt?L_XO~ohy?*C%1Do%bB;(+I)x^b=nKM(t`4R(cj=nTqJO{bau9# zD??kiko}v|u3H$+XzyC$(dw-Z@9pf$PSsvm#*UA44eEFe9-D*8mm1zguZlHaf+Q`6 zZ^Hx-+c0&x%C98FHcVa4hKzD$<*f&&jdz2c?iz~sBV<(sLdGohc@vDBRRq}nQLg?& zIwQh`h?0Y@A|nx25Ww1Ey@F+^A5=0(<$hNk<4hE2bOYUa^8SWvn>lv=C8j&iXodXe zED!gnaAlg>#pU726I~6)Y9}|cJ#V_w>KL1>z2k@usov+m!}XLck2KW`BZC9>;hU}v zp-zZE{z~ja*?bo*WWL?<&_1;*G{|jZpKQSGBV=J8DcgHrl4(C#M0;QQ^E^2b*LOCp zIGAA^!8~ot?EGn0T;dEw(jBfR-%e2c!=F)VGd z{`nD<#_`O7rYE*%lswe*Pk2>P{z80x#EZfg^+@C-mNRN8SPeyZ)=6(#d-y810Cu;2yP_|Q@) zMt75tBi(cxG@`pn$fBF1YIBXkOpC4Rc{eweM3~Xw0W^WAG;vhy*N~8 z_Yw^Zy7(jD*k=U*s48+h6W9>`@<&&{L0XFqtXU^_Y2w$=pj9&UIX#x|*}mSuLY>@2 zxj$6T>-Xw;{l0;{-pSoS+rKgVM<@3`G_Ckn_F`A}oY4MTt==~;t2Mp;eTpK%muh`u z*#rxaRn4U;-Ft$^(N5tDq@$G~=VMPzY^ZQQ5x}uiZ~)pVH~{Sw078*8v{kr{ObU=I z?=ad>IRNbx@SoZ_cM1fkdUB^AfZQphL&HNFVnZ(g`j`!w;qle67340VuzHHZh2hcN z+|yknF7HMggpq5euULa$yueER28bX2reTMIqwcGsME^ z-t(UeV@)t>wptPWE*dhSHg3ms>N6IDh^Ql^LarswF{2v|^(;^}xW zA}?8F#(2(Q5x}Ob=C|pwv)HtL?zohV$dG2fniq2Mufp#lzQNdze(s{gHxNgrk#`Y4 zV(jgH?vbIuu4)m<5kPh4w-+1ROm=Y#07n-~AiKB?R2+Ms_5e{`Y|h=NDJR)OH@njk zhat*DVfowDB>z0DV#9W^Pj7Z-Cf;GEk^OeZF6Qr#e!F)UtJmM%p~c5gaP*r5qTeKl z?zdldv4j2Hg|+eDpYTeGep~72HziPSE4$p^U0yP0Yc>CoV7VI)CsLk+p`JkBPIA{X zObAQ2vdRH)t0$1oQ9TJn^(2U{-dkJQD+Anx3H7!)t9NBPQwO?lOsoPYdr7lYZNpo5 zFw3EBZ2mxZhtRK3pyfuovjn1C*LJ&R(dFg>)p^|CPFPM!lUDlN}f;_+WxDW5=r-(hS1Dx7W9YuL4b(ha+uuRS?NzbMe4 zlNPk5_23$NTL01G=F@sj0LQfM05q*j5W-y-FU{+c5TI$j5SbL9U^%Tj08Q&np+QR< z*P!cU0yK2wv@U?0*1JN3dRb2EAwiI1DI2wEaG_m8AUykoFUxh&?{UT}MmV%sw9C?ns~6L$R8rY_^Oh=fFGwa^C36 zycS?oSvl3U2XIVv63D5plbw%T&AI|aO?68AG=Q!{Fgc6WnpOn93Q!ED@yIG5fLsLx z5Uaqn%`ASHyCCITq^v&O*WSW<4#RX`dyCZy+0=$x*t%ivEbZ79cK**0n@U^k0En^$pZ1H{s^RV$+G|@_)o^#3c6tkYX1KdG zeO@1qjyjDbkPQ&NdxZPq z&mH2ITKiGaW$!)eR>r|L#V1wojGr`x;;CW9ui~l1*eKBZnrYngnx>>L4Zqjd^M)D< z-K{EbpsV=3kXJHsGoucYt@Mn$t|{9Pmq)p*GQ5wy9+69G>zMXVMnG{l&Eq}rmcmoe z_$q!(%`&z}fkqGe$sd%M$6nEt-dCWpzNUGhiORD3djg%0qaeEKIb4+DZN5!Wgxus~ z)ihe%Zh=@R6yBky7@Yu4Aq82ua5p_l@?U;RQT}}oo73OZEAf3qk=*A4& zkflWgkQO0e)yA|nM}VjskBrbV zJ+bfO*nkZVx2@$J2}22)8|qfHNdU_(NUC@yL+?4HYY3ruv)j8GYLG)5@V0LUc^Mi7 z(BN&q33KH;0Mt|t`r+XO0rFwK)+|7#0?4WIU(j$&l>&%G!~Y5PrRmUukA)u?==o67 zdfv-c5AhU+^!uz8q1dbT=1XcUKnGDi-FbEZS`i$8Rs;v26(Iw8$VSnHk^|6+PzVij z*br|fEvZDPTjY`|fNW-KXgHcFK=g`mldZ(_rE6#b zkfu2e4Tot2h&IiqP@+qCX&Qi#^ZtTR5sm|GZkuaJ%54*8+r~Ul%{GYu4%;{Y*~S6L zHUvU44H>64NR)A^0kTa)XgF*`z+oE!q-{Dt!(kf%sFBqF{E0;XqT3v7*{d$=0gQT4@W+sj5bayOgO-x?EdiwY1c)-9 zQe%H;As$8G<}Q{&wJL~55g)@&#XtF9|3Oh6MI2qx6kpEtw8W}+95O9N#XkqVu~=KB z{D5lul_-G47V}7EzOI}@5}G@Ue=+?ZBFmp3Q)`Q_*YxMzfhQvBLUv%Jr@V=}$hx0b z{AZfysUwQg9WveCEdDFsyBl(U$hdu}1m|L5-^c+=ALYqR*o+8X!ry5|L0d)HyolX2 z$}^<$8E`tE(EMbMpY6aFSjf!^6wl_56y+QMt-Z}ZO7pyK%T%@Ix90foMFNWFG7|XL z0elBQi&FF3@O&r+UX>bRW`(Cb@hTz`5mEY$x4uyf2fVt7ji~SpPEKEJ?YrC;Tqwyn zg-lv4X0KOx>X*$y6lFH+bG?yK2WbRoG(<~KyyM{4n}y1ky0uVlUd$Sf_LL{=K?K!o zMMW+DcRO*UcrjZ(+H*(3dGKWLrb*e}!&?>Q{9@K%j3-08xR`Yt7qVRL1(3@LILq@AS|$|u@?W@~0DFC`r*+~Uq->7T zW__i*Jum#IDSMW%j7m>I2a0gm%$8R+tgCqLo`n5A06F`LF*QA#P=t_IcB^TeSVuBj zRq5%hJ->vVuJj~#`WX5J)L{G!vbPtia2B9803U(#F7CJ?C5V!b=hYRVyi?f~wPC(ZcBO$rBm zJ|C@RdS^X_O)xZQq!y3SYWaubq1o|+?5|rq+e6z9sr=nDzK5Uqk*+k0gVs#VI|KPX zfJk2QEEGf~9|Lfdd;-8xG66@)?*lkW79j2eJbdt@PKtICvuApX!#LOK8J5)Iur)=> zr$-4}53>yuJn7m8``HnEhJM*^tuw`Iv~0t;fJbLl_5`+GOEHoFh6}I(ARAz`02=|8 zplP!Jd}NTV0F=i%p|Q=*W4i!5>^$zUfmys0i=vWy=rHRs(NmcC94cHyS*=kU8Bf9| zpF7OfO!O?#l8!KA685KEj#v}b;iPoW-uF>E$TUt4r_}Inijw)*{9{{0fsajdLj>4c zbAHXT=K;$p52s>5iEEA~tU|stPZTS@de}8K{~KR}dMtZrlE+;-4(i;^5^w>Qf;mtC&4bPNhMJL>z_CNRjx3J7v4Ld#(8_9beUwg8uYf00=zn}zu$+en>_Tx%){!$}R`JDWQdSON)Qg;`zQ$0NHd0pr$(jHQfQI>Fcbf zM_TRx)bgEn%OjUtMEucB7eF@serP!MeF8)`{YhJiSD!Ao1duHkfTyAoVQ%uD21i+s zX&4~uVLZA;A^k;wh`;D?HHW_h0380}0Aw@=Afq_|87&ieIQ_*Y5q~Lyio;(BIQ&Hb zX|y)ba2QR1Xrpzrl_LHkh_qU_2P}WNAJ(Ck7XN7bivZGJ9Dthc0Mv8`pr${KOwsg+ zzc>K-%Riw(EsyvM5r@ABAe;UPG#pJAAiC+_+Dg)21duHkfTvvd*_SIkZ9^4% zty3$sG5r~j*Mv-SoNqWDnK%CmSNU{{Ya)c%(56ndCp@qEtft%!MhigW1U1&%4R@#{ z_*KpD48}b>0UGA!dxztmosh9*4Outs1d)4I0$6?`dsYF&O*_OXo?rgdl*gdi8^X}q zW-Q%u>y7#jZRA!w^H5*cK9&Cz!O%Kx?`~90$lSzqH*Els21qXV*D(Op9I?L^vfN(_ zAnQsXh!k>v9kb8cU)MzhSxfA%g)Hu-m8ePyROniR@2~s4hmNuV?XNpU$$Sw~u=y1V zd=XlKHkRyTmsa6_M_Rs*rLFd)h3-NQH8E=pt)Jrg=oDW4fjkaH3@vTq?FaM z9K%L{=wai>u8oxJVS~FCg2-_rfSnA=it#2!Lk%RQTGPD;&+32St$zR=U}$-=|2`bT z6LOnNK`TWC6zYf+FXPhUP5`>b9lBXH!X$@mK-Ez^r1BUDRS+s(QV}w*@Kl(}0V=A4 z9n}GyTX7_zV=EHyXL)pPMG|_JN6U`@@|cPMQD#9k@pCh;p~f-zB5vhRU5KMJ+kMK= z1OCttit;X^HAD}6z^%CH&7)1$&3aeWqMP*aLu)j)|yP8f8%+>)&`ur~lzdu31-I zIsRr*pmiMWv+>6ZzaR>4qSoMr3()4qkX^VSvTy--^{8+GWZ@Es!Uc#FPQIdG{^Kog zj&q#kD*|x$8cNRMAml6#K)wl?JV(C1wds)RXPfBSjBGM4is}0^2 zaiebt(1_?2qh@>e;TpC8fV>GH$!Ps9f$-5|p6_+-={0QEW1c}JZ?3T}ImAIgA&V1c zQnpW+y}5?fe%v!4)OD?O!82lLyocTa>kFA?;t|7QjosK42{~qio`Cax?Qn4d4Qkhj z?ghpVeIs(rT++DVJ4JaG8gv0SqDQ*7Zj{Uq&VBN2L}BFHF&bTIRwCPfu4UR2o`TSO zNKCiJVyD@g-LC-*0x#OHcL+dZ&YO=zkXMDqDK*|$9tDbu@$Qpx;3S?RL4_LoW2GWQg6gJ{6r zfB-L9ysmNpfVW4yQXl}IL&61N&vV|%-B7#Z)|8-EJ%tAJgM$u^QN3qwRFx@++=$4* ze$^fGMun=3>Vg`5?emXD2jV`EdJh_Hs z*86!+MxD38X$K}wI|^Bzc6@ss+w{C=eCPrcQMf#mD&)v%$BWP)BMDy=vhYPI+rCIL z+#u>uDxG#T*E>%;+A^Da!jl==i%5D|NUp&50rUjm9YNQ44nQlg1JDY53`shOB(wrQ z4^SWgEx-;y3-BpuI5)0D$eeNo7C^4R=b%BuUM{5q*lPxVKJcTh#H&v$jQ}#006Z1# z>nO`1JMm*$>%;qB@chz&mufdq(L0zC^A zvYxzTeg#0zWKIVlb2VxnlvTi~syw;y70iQdOD&+-H95i8yXE2=r3&Paduq3{=p-e*ni{6nlN z)0?iv9}7R5>HX+V?c?tmJMPWQ`S^S5wLbL&Q*qsM#iji7uvbxE#0GOVZr*z1e+ZvB z?k!WbAHQd@C%kFerSDnM32&R+>qti{la7_icQY>7j34Y#gO$nCfrIe+6W(VuE%%3T zmzTV20--5Cs>(T};rFE9`V*H%cqv(LfdAYK>(g39ZlDbDQnK$;WKDpU3Vpkp?LQp_ zeDqSX?{2u<9Z-Qe6df-m`?f~`11}}}mq!DN4cDoJxQ8JRf=n}r>+!Ch zrMMI#nXKm;Mcc9Gpm8e*O^B`==(TL$6rj~Wb%1odmd$e&z;)T=xo(F74NsBl_6zJ1 zT2Na@55ts-jtcvyVIueriZouSNlJX?k18wvz?-I*;!BSYyzkZtA_1+kVqTj)*rT*S z%U$zS|C^`@;=>(2^ghs_ZkwO6BZD#ckeJmJHT@c0JQ7q#`Z)X~g#SGYur!ZR6qi;(YRX2#=gz&$Gd>Z^>gHhgC-&iEc1Aq%FLHs6! z{|v7EB%r;j{~*%Tg$h*xDn*L#VjcW46iDMPR1kg>!gm$jL4-gMzX=idrL96BrCAN% z8B1nAdyK*mX>tqVV7~u56g}F`UblV}!f&Ehb8V#{eiXv@Cz3A#;MK$%YyLr~rUbm2 zyLJ3Jn4M1$KMLW`MCY#pAOiu=SW%35op7#bx7TQI>PLT3+2?UaW+!~%KMxUypNHUW zlK?*t!J8(4Y?=U~X^>g_cr=Y7XemHTtfoC5z)cZF_z~D6_}TIqmb>k`Z8hS`;pBVB&wOKCVGkh-omunxY#(L>S>o$ z_Hkn)O>c-Vzcw~XL--Q$xH#D11^_q=^;5p$dj{Ur8DtibA((dRLWKaIm>y73izr~t z!OLL0K2Sk~qCaRa0|IcP1vg{*U%CKZx9ZsUu0|4Bnk6?AM zmWMM``w}CwS=MEH(20SX2*BM$3{(l^Kux`@vW88JvPosotxqN4+Ly1$od7UdDLSrw z`HC!n3)jBBmFVC8LIW4J{(0C(3E-k@Uw;6phubyK>DresW=k)t;nPiw9;SXfiq2|n zq;IAimZ(kIsgLg&Z4r5{#8aX8?aoy3EkXfj;k+0`o zQQ4u^M&JH>uh_j|yQh#N?pXzmX!jJda8D`Q?g^RoYGWkly@`ahXl0Gn;yhFEMF17g zuKk5*_UBjB@LH&RQhdHPzn{UO|9d%#)#( zanJ~W9LkfarYgP>P$?E#W?Y01oUcb8m~kC z2nr8DVL-NNG`SVOFDc~J-Hq3mMC2js8V56$M&w-hh_Pis1Pm%kG4j`RjpR6Zk!i%D zNeNRl-p0VU9Rdm11|&>jySrm%yBVD99(J?cpK8x1EHnGo$t;Gw1EnNph(jVAk@;4C=(eD z2B}Ah3f;NEcjn-yJ^|1I#l72|5PWcU1ei_rKw#QPRce?YX|$0EQZ~;a6%s4%#&$L- z)2d}dAV?X@d{U;dYdwrkdGirNEipgU>X;A3sEPzH&@~HOV&AVStLSNDhVX?CEcYOH zjX>2{RS_U>EnasCy1!7BXP`oca#y(Xg1?=MfW9sDCc*3;Q9#uTfRh`G_%lM zB9Fomy{P=)*Kms0k#Af(bRIIU6a2^`EVh?XIQ}a{QLkDC3C@ELeg{N8m^(y`GuqqW zK7d}g*EC-G#!}#N{RATx9z+RfAs(0?Fh6x+CkGj$M+wwVQq0pxQ1dsH?dxUag|dIM z#?QcpG|qzmgcXheQ3X(1M&PL^z|ErY8a)ghTsJGZ8*yZUYD8cVfT)p_?HZ9BT_ciF zBi6pRk<$DV2-If-TO{(@eJ$h?zPSn3LQmk1u+kVh?s4wKVCuIVuuZ+O2DU;B)wl2W zbh9AvE^6Enh&%5%cLpEDYXQiD?pf|Sd=v{HM)4jfM2})A+oM>>ViXHGw@FKT7z;wf zm`1UX#VCFcCD2SIMloczxR23ubjo$B{!zo2kAl(QGpNps-GzKGg#jFcNdP$r2#_hn zU|KdB``ABJ)}XIZ+P?4)%gSk^0-&7Z}N_d}(BoukPC5O@YwSw36i{^4Vh+uz!tTZ@ikmlg4=R~0n|*$v6t17fEop2 zVqD~qXnIS`6U~ticgZX6g5YP!Sb%ubWtuw11_vSN7k<+TH-@Q}#m!Oe-`q9vGkkM3 z{(IcwT5AXvshAQ#TyMz>upWSkHvu+{g0}z$=_d{;q6s406TPNM=?T;ZC>@Q8`Ikca znoeV*_q|m+esC!-7eIN2mnYti*b+)S&zsH@6Uea>2Q!iVCjg5`V}aK+Ce6aH56si} zkGGdzD+r!~Y5;OqC=?gEQ+O7s0NIqquU)v@0&=Jp2Phd;8V~RbzMw`iRf$VH$|kDO zQmaOb5Xoz_#;y?oM~&VF;5Axr*XTMxKg!>(k!yan8U^OZIjhuYet7l(<2fxf0;+D6 zSH)d5Zl123rK-dj!QR-6&O~Gx@^$--^Z;3wKqeJbUrh+q!|ZhjB`458ZKVXC$yb!8 zK=x3YfMEvTg}KfHOed99YC-UKXnX@eyEd{{D$h24fyRHUvUH7_%t4a{;gf@n{d)be zh-nF3;T{`NdT=Mjwm|9DWb<(}HheQ{Gs;LWzYdPcLn*C_=iRCF z*ZAFw(mO4=7Gzq2OYe#|FCya`A=Ahzz1xZ(*`MthW#oqrfzxdT_j9fUb1PYdhL_UAt)*iydQR)>$}AQy8pM znw=2Tunr2jS6jCkjQLzumJDM(#u#R&!F#oU1n4$0(Oe6OA9v;T{E0O=MJ>R}gFrlL@(R zKUZw9Rut%cqgE9B9kml0y}#7W;C*fI1~jsOsg(GBzS_nEEhE5}5DeZKC5L?Y9gE;s zXpl(a!|xOXaC2GQ<7IUV*LQ{HCV}4hYg6Gh>M1U3q?nLWKppgvFOtdZyAOj!~<}AGn ztvii6=KZ~%CQr50nFZSjkq;GP1Nax3ELAi~{YZ3GD4zxT7#-f~I@{ zC+ye3svXI^c9T`Bb_AkpCuC7OAxG72CXz(eP7$)G9LaX&T3WUH6oh6~?8}bT=4eExJH_&DWedRzd@~K-gA;b_}=pR@xtw*O&(j;&^c6;uR=kC+B6-gi_TUO5O*_7Yy|%(g zPprAs^0fY{S{8`MMR4|3_S*_0qj5(O5o1Sm1EA@re~g+O+Xvp+`$?euFja;98VF30#)n2IWgYzSK->V=sr;2FzhXOkb_2?vjaX6sd~AUi zNIAoN809a499{nH+nKQu<-ZRu4KNesOF-q1Mb!J-!y`8uZ^de!4y^HBBdvCN2aVs; z=zl!LdmOfm;@bd_%Fz~0`ADm@7< zt3)P|K$zso4y(|tI>qF~`F1EjRcRvKSY~(GBXh zNSo`x4T9U)Yx_~7j^MJ*A=F3$s?iKYb=<~ss?g?2Xo?c3&C?)@5>BCn+0{x|zKw0D zLJ8sM5^hHc5>N?vClerizRK9FYK@1nxpx_(wK*Nx$9Ea&+J=to*Sm~DZNQBz=We4c z^m!+1y`x(_N-(%`9AZS>RX&tfg^F~(C8t%mN!`U=y>Dy?-xyp={yK`;4Yq#X?qgpHbRu-9pO~>DH9d8#k>s z0?_(C?19>53s{I`+Kvr-o34zkz0CfF?C$%FUWqX<1e#&p$!xq0*ZYf@>wqyj@fAeS z)up?{tQ81P!Y%1VY{3C6P<0oxdk+|8g9a{+6f1I_2*&RLmtto@_Fe)&MZ3#PSVYT3 zZT#Q>o#%KM8Tng=nE#NG zKBPb5=z`7N&rAyZh%yAQ?zINdiiJ>lhExWaslg*rpdo&MG_cPGG|(IJ$HKf7-Ij)z z9Wo|pTB{xG!Vv@i5&1Bdd%rPAt1*x*x!by#t$r&jnGm}y4A9+bNHzTjW-JQ z_&-&)_5&kBFZ@#tANs)Ph=U{=`{_e$eun7QjF3G)De#Z&xX7^O8uXCExBxN^gyx9s z1xbOkQF4t0ElV-)IE8yv&}c&%tCP5V0&+)^*Ccb<<+5&LWUoy!?}L61$mAc{>yo`@ z_9r;@?`9i6GScb{#h~;fB8Sxq&cg&JNopPIat%#frYFcmwQV1ZkXyRord~9^Sr3*A~qOvxt$-#sr`005YxQsAr}lby<~y6UdEY|3z>047qC`mje>#CBS)HSWPb=C`a{T({&*ir z9Q`4I=#TgPyg%w(fTp8A1Q7jk!Oup1X{0dUIiqdjH?h|J7U|00#Ij-Mj8VBIfoiTS zfOO@O06TXMuG|@#4wDKXO)7yfDFKH`B@iYRK$x_1fNlK3XghGAT`g%k0fgy<95LNg zBypHd0%5wT0n2nNpy@E30K#-D0%W@Wi9>?btTrUbUilJMyB87EvvL9uKw9nIAnW!O zto9T%9aa-ST1^6BH3AN+Ng%8yfUw$ALH7Gsu-dD3wWQSq5LOd%#A@e|#9=iFgw@Uk zEvsFFro(Ci2&-KSS`K&aJRI(I+(M=seA3}wk7FhOg6UG?tC>y!X}Xkn_Qb!8&Y^nH z>_kQubEg2(bP@>D5ok{%PRyMW2-685OebV9hUcG>V|dZm7{l$5qhn4LK$uj>5t9x; z5{F485GEZEZ<%y5G#w@tK$vuLyk*jE-@v5h3Drzmp1}5fV|30viU_`-iRDNDY0{$! z%=i{2{UO=SDN!``3~l1J|ige)!DD3N{q9rgx) zLXlEC}QvT@&IZ!kWontux*vlySm-ufO>!(wPU_67pT&X7QK27w!+{aXUj83KsT zSe(R`{D7%pD^fcASO8&kAxDgU6iFOLmp~Z(Xc9Mi=tXEc{8#{CbRkQl^S!}IB%{q{ z_E&LyZy;p3H;_Q=4J5Gk20WLuNhMb4+2;d1o3nOpWHu6rY|bWyKf7Q|S94D%R~tD3 z$j&;Q%x3(A&iWFXBT!d483`aeO9IhZ1O`WUmIR`+1Q4C|WirdUXpGCvOQ~jg354bI zQY_22f~Ldr0tm|sSy~?ZvPVwht%5X7*+{nkJK$j+QQ0YMBCPC#@fPMg(1d?&Dz5%X1{;tIyzHH2Enwf2F zhxv2#kI-`x;5quoNFikY9Q_RrSo@!iBsTqu5t}{`mY53^^-{ z-F3y7+_ZU4wSpwD3lg#{sCf<*l#{y|Rm7E`BFhj!ma#dTt@_!>sxty*L{FANmV;+R z4mbTc_G&DS*tPZyom0FIc&5fu>`!6hMwY3B>p#;JA>I zK#V^D#P}03RxWJf@xxXhW99lWIj(F8tGa5W4_t&C9h0a4ViFZ{WD?zpB#uc`0x^_# z*0DANN1^E$$^wX?e6$Yhe$5Ew-kfJ&1GQ7LxpOTC$VZQ5m)qdUJa+LK?u7ikervwoLvne}gII?O77Fzes>Z0zsGfW$Wn ztXqb1MSr7!z41GoG^end)dY}M%PC}iuNzaFmO+!AA4?NRAWR^DFhN-%`{g=JP;QqY zO(1|Ufsi967=|Pc6G$LTFs#rr!A@v8OdxI?DNu^AO8(&4zsH( ztto)8rjR4noQot5Yf2!jIk%o=&D){ru%-aQnzz^6vCSNiII?~aAKM>C(!T~u7n)&fXdFDhn#Yi8$Lwm|b{-Z z5Vj`J6G`NFmq6HB0AcGb#q0syY%=5sQaV-=0fbG39I@$3c1z@~ItheLIbh5FFp`^` zgR;Y{0w8~b?o|mH`I~XjJXg$?yUf<1n8up2A5F@hi{FQ!jUj>PjiHd`#!!IB#xM;@ z3Xq4`7m`f-e7P?qK<+^gH~7A=H2`hY0;A-{uqP0W9iGxjo~Jwp(7Ic zcUzlDAoL=sK8xT8sApf+lI*J}h3UuZ&+u$*0YL{Cw)oa$&)Fv#$Yi4TRR;-oRyjk1QmTmEx zQ$v5XwG3SJl@`wpOd#68LY4*=AY$Oyc1{D6>@Y9^hk=U$xPe2`!0mye4J>47ED0h8 zUXC=;1{ShRLx9Q=M{f_eR+T@%=>5H-i`q>_%7Km%f@4X6``eKmPBhI-RV!`JN_=K7 z?Qr|>Z9emBkG3kEO^P?moBfe)J=`=sIt?2majv3dXIL!fo3x-gCnEF8+(YLHGT8Ze zvqRzlZ1Q=f3_Zte<5!gdncsG9LD>=D1c6bl2e+1yYa7M%B zgTgi?nWeQ)LX##OdREpG^Np18tn4K8PAcr{B=dajGpbWh%C_Dam0d_STTB=VJsPPP z3kE~M3x#awFJ(KOknQJrN^n+BysCmk^gvBkUjSMCQZ>9W#q2OlOWn-gooUt!_1$b4 zCGnU$-KgD4RRo~3V#(1mj*10x%cB&&RO_RxVEeYJG7Py;?Gqn$XYgDE5V=U14xCXg zHpo%hS8+_re6&yVt7oJpdV^Vp; zE}956mKPn^HXZ+wI0$(bS2+N1c{7_h+sr8a1`&J!+D~PrY(G&Ivek?H?S$Vpho6~k z?oZIQYbqPI+N`PP;>-NiW*t2V?`rHPQid;2gJ_pJv$LzsG%cY^_>a}*j`+~LrFfc+ zs)!?3M{q>a!1D-Y6(ZH0+a>*CEqvQf{BLOk8GJMx3-Hnam(h zS{5zSin%e%?W2|eQiGqg><&PeVmN7OevO)4UK(z@+x#}5E$qsQ4x8zrFS=^{XNejf z#|86OlX1vKfah&c<0f0DZonr)6mDq0myY?8osPH z4_rdI@7=`SJZzR~8@n<05wpq2z1^&Z+K2ypDY&D(sz`wUtR`?8t|@{2pVcVF0Z>50ARvyvx)U4+!gzo4LC7dgpM_ljg6kj`O=%NBV^GT>jm~4<+32surY!^Aw+r zO5gCBmd?+?3m^~C&+o#7BY8WFC7)0AA@Hsw)4K;+v&VtLZ)#p zoR?&W^IjDSw(pWG6v%gzl%zhIQkSw2$Arszhu54iuQk#i!<%%=E@520jxYNznN9TR zc+KS9OXh?6dW_u_m(A1qKR^atF>le@3}Me-L4z9%Wctr$`_KmiHRVwZP<~kI2b_SQ zV<0{5;s?7gA&z!XJ?=J*jgMd@8>A_VNxsMQ{(_q`qY5>p`#(+o{Cy+hX#W7&Iu-r^ z04>rz?u+FLS8RnI2V#v5^YPX@&UqEn?WrCIn+8V%qyf;3-VDDfZVcdno%`9$Oz4UT zp3|XNUag6P!@*z7{Ce8HWvp42uOhMHHp^JOn|W#ne!}UOird)zS-!rZJ&2$=#J2~F z$7(E#5?GUba6b+aAAl0wY3kj{?dK<@1)xL3!G)u7tO^=5jrN}Gt{L245dm`dE;Lg3 z?-|68z&UB7m&O)l`)U+lvQyK$M%z&bA@fPsdmB`n!?yz8rklBbRjIpzy_D^%8&XzT zgRplWykbRV3LwjrfR`DhGJ{BToGLoRofdotH%BE{;5Ln>m?nlmgRcm7WrQ55%r0IT z!>Y~pRpHq=zWQ3|;c1$3D^^J{HgOkDIf>(`1M-d6aQ^5xqUq(A0WAyoL3)y@nE0Gv zR`5I&UKb!Qm>2jU8VvFxA%A)E8|XYhnRHI(FK^| z*S^g87)~VfT@!XW{AJGR5o_Stj*?)@+!}H3;@;bd&b({b{#;-434IZbj)=VD$*a8` zlum#Q=v>OHEoJ*{H6e>y3t84$08#7h(^=a*-^kFP$e1=Ag)h0&gInMN0;J$~V*(X$ zObPh!#su@Q2Qz0_`{}}$@sea}6o`kR1Gl1)LL>f3Z!6?(#6U?yDl*J~UiE{2p?63Q z5{R$sZWOr839Fy)D@%9@F|>^yFeJgO0e}5q2AiGlYnm`(rtJaaQaGP6lRcg98VT9pm=gm&LaMzb$e<#EK(UZU@mKV+JL`+lAk_!4u9 zknzq%P%(42;W$WCE^$=sxqh0`cLiSJgzPC*JJ0N1{njDUm3KA`$!pkzGq<9w2f?9OJCiA zW1&YqEayfEthtdN(OY3>R_U{j=m}XI(UY>hp0CM@jxlt z>4a=;L>2Q`CH^1YjcimaU%^;!wY>5mQ^$xpNZHOy$kBP#w9^z6Vs&~Bnb!kIMkbYM zWlHknJ;Oh=^7Zs+4STRw<-U5Mn|oN#%%*nB2_DA_5<-rj6=McJ1Q-SdS~KDcVhVyo zIz<6GZn+6NU7_Lo35N-TNk}sRY3S+*X=((q9&cpeHbPj4FRA`x{H25%=sQBH>9xS;7T+Qss+IH}zmFD%d*2_HnQl_~M3Z($#5>p3a zeKk(NJ2NFo2t3MVwy}e+NZZ&m{8R_uQ8PsEVGTqQjbY{04&iE7>yL7^M-JhTo`@8S z0YUX=)fITfqfi`8E9x(5yjzU|+CtOQ&6cVAv>Up*b8ML=2!D1dw!Jcu4?REY0GrA;dzvjc^)JCQm76evbZn~;htzSyJLGVSDD@yRj;$^RuqdP1^HLY8nPM3S)I2Kfqj1*vOX zHPeiBcILdR9*R{wBcp&TE&V?gde{n>V~~Ss?2D4M`;mjFFU>lx#7N;JQ+>nx2m6-k zsbAo1wuT=)a3KT`;tzSY8Qhx#_F zh1-^@$}WVv5Dp@Uzv?{v_j+HPTKE`LoAmjskaV}vFMWeDQ$fAMHt`tRZyLUco{ z_>h%Z`=|_~6GroCx1r+@Zdif4UkKvwfAN9P8G$ecVP2GeG@sBUDq_n@JpV_y6X7ug z@fXbxfK$&IDjWG&%!h1b&6wX<+oYIXEcle~Eq1ZWw~L*9-ZzM~UGJODrtS0ZVp*^G zPO`I8e4|*F*FTC~ob2mOvE$j#o9Y zARvgp|G)WPm_QNO@gcs!gT|oXr3kAKc1Bg=fAMFb^C7}#2$!Ptufu)P(3l*ATm*8B zLN#tP=9Xg!VT7mYv+Ajs6B@gC)i;PbYP>5v?T?tZU=Z{i1Gq$noqllB_c3Z1|Mb>a zqcJ`sL_cHPXdQlQ4xuZ8_#SW z|KLzo@@?H!QTqS4{1np0%Lb=KTK1kJ0+UIvW--0P7zc5Bh<+e=@Oq4Mgt-Xf?*B%tQDY;o#q|#;7#Ue9JC==08E6GF=N}oZ^+5 zo*VE#Bq3-U@oogdVua-gcOdLX5PwUcvmW72ga;9xLU;*5{QZFMmk@qOP@~fQFHU9U zZB%oVf%sApm7omYJ0NsIxEbO9)OH?lP8C}N-`v203(M|imm+LQRFo#B7g3r75UGj+ zwk1_jdJ{wqcA5gBjDjLouz@|;MW4?u=(9fs^jWYVh$v#?`=2DkUYA{j_xa9`|1vpq z=FHrC=T5uH9l2t&GFt=>UBK@ZU=(PPt%DC#ZzoM#kR64!h##%*Xwv_S@Wuty=q3w! zQxIs$MeL=Q4Sw50XXt6NH|xD7{c(i*!u{~HNq-{Y5fFv(3+e496A&XUe>V7g;$>f9 zE!m8-elJhe6LFqNUsKv_BJHR?y=*32at&t{DnUzKdRghnt1Ck5Kfsx6M!elrAhFl_ z&j?FT^t0OCvB?_69k5=y+h?U?92`iEx{k$dcpcsYEz=KBKc^o1N6^0pU&F7UC8tmA z6>;QZ`UYjmd*%i@yCpRVMBf#r!%Vmut_Lk<{d|*tJmD#DDM%VEHxRyeG1cqGS{Y>{ z_SXMI0$s2jq|s8JemVznIXo%{16uy1PnjZKC;T>i09)$OZ#3z}W(PF8o>vls9Zm-= z`xBo!PzNqk2Ih?G(;sTGZ%EjjhJwn(lS$y-5gGku=uhTUkAufer~G#GDLNx@Q5vLj3-(-F1x z$6y?Tf5FF~r9Sd++yhU*KS9d_gxBPB;y{a8|Ds7R z85H2Rw*Not4I0P!v4Zflk#Fi70oE08k*QVDASO$UvA0<=gG7t;6q~buGP5k=hl{7-qFa-l){MK0`5dXotE~;2 zjFzQ7&c?G-D z8y!s=Thh<0ZPKbiW;QGH?~&@LMNQhN)GjJP<`24Ua&@}PlFzf*33hs&rI6Z{nbXc+ z#yEouyFT^C&6d0`;Ab$F*OaB0a0FIE!7VlV3c|eYCa(_+G3n1Id^6kvcbW9h6E3-x zpP@q)XgP}Tm|JOKrV_Zo6!A3S%`oIPM%C~;^uN6(p~Sxnwe_Mir_&kjTTc(8Gupod zd)t3a#w~J%y`2BGi2g^&L)Ro1pXC1uZ~c_y4rQkCv)qw=Q@_n%7IOhl zGNB)6(fa25sdr)LhCa3IC-He2TmiE|i)>Kc-4HB^U9x=y#Bb_#arye~sQ0 zA^TcWqP#)q%mwR&MljAF1_nyO`Mc`{_rOWhNw)wl`rOiQLU+?q_)m|zW7&s^Aa zxjfXGrg*G#woH+jG09V_)GZ9Th~;^fOuu9fl$-vLdVOxv#;j?uC5_`XmQ<_xmb?I5 z3u{4(=&k?@3%1Qo3%H`6@b~FQ9Z&|*dNST0eP%u+=a7d!{JoxCBgQtJnN?(;|1iUt zSvhfvCGQ$o1P?)O4zv4V!tYK|6^okmZ1Eo9HdAZj$_dY%Dsk@od4!i{!l$NgBzzCt z3(tb~rTrVA^w9ja|Fxta~$)*Y;&O4qw!yeWPYG zdH6olqTU!&;HawPgB`R7{r_xqcVX1|w1R^h-OYzraw(2@l@C9{PcZCaUfvDQfKIuV zFi(@SDYst2faB6^Ud_5)%9D-DEP3+O_M^))XJ_EYguOhr)2SVJodte$&97uZ9{UB@ z=y?5qFV4#0oQ)RPbbyX9?@IA`YX0O|EaA+`hGh%w?=F$>#Qew6A3sOJ{qkjF%Y)`g z_;HzXuH5ryL8H)B+|gHO58!ZlY%vDL!OJXhzXET7EPYq85N3z=*VN%Bl>+_FWisHsSicEIH z^LyUNH|lD%GaEIT$K8BY<^r^DK7d%6?q32gFXLd~9aX-l$&6tuZ?@!(y@lh1yFvEM zdjuYZLz(*>1{Z=ZkN!V}PA0Yb^D@d_$n_hDu5v~8!uKgbQ32YhY6a`-Fas9S2`_>m zy@zyh3*j2L6W*hIcT%vGguAcGUXlEsG@P%j`tyO0%zx=>X_YeC&aYw-SdB|q3<{RQ zjc^C(Vw}VIpOmR5{fcB)y!G%VY*=kkm9YXxW7!VxKcH^DsVOTbU(n8GmM1oz(=@0u ze^{9~dr#F_p8pxfJ?@uMERi**#yl;S<&2EgxO7vVD4)Y(SgIG#^l8fZ`Tz?X@-2X% zENtDM4UK!c>8$Mc7Wh)acu6r_Kcwf8zbumUP1C3^cc*0Iyxk!C2dck}w70`O zu*&2oy@g8v8{iYra?iKiAm6fG?K%RRAU%I=lVIk_`8HM#|5I>(c7ZPwR5YzGr6zvI z!&10-E0+Yc$VO4JL6bsv_y0hjyVUa4f(e<8oP68(nhJadS~?Tf`d91GcQfgS5k3zt zf{RW1&k6qwyWx=UYy3+%`n@HT$9_k7bM}tdOE3E`kzkKr6}?;Vvn-cRv!sf))73y9 z7z|qK)6c?2_9QZX;06ILqF;01ddFWnk}q2Hr5bRL2rcahGQ5e;j*%jI?(uLd38MBjLsyD#@A^SzkdS9dZC#;i9#E8X|eI_c zb!UL=Pbd4)X)){1MxXu8QhJ?g8e}YY3G3vXukP89UJPXzw~NLn^C$Dol*}31J*Qxn zlx=f6**We}kPYKxgE%c_{aW;D^{IRnD)T)B&c)A1d`Ro@E$9|e|Gx#@R@er`-((wJ ze+f;)p>P=ZAqcIx`(-cA0o=o~J7Y7#Y+{&qF0eIWUilVj3@28ysa#$wZVR1({-52} zxFf{o{QP;;_+x&^*yqb;hWG4{aK9osh@HR|b$R*x6ozq2`$p`gm3K3*kL+Agc(5g1 zUD9-epCD4dGB(L`1{GBz$z61urDR2g85yNJn;5qNP%Sb6s!evVLs)v798c3gZMcb z#LqAgKa)YyKMh*MR`Tug2iIRR9uAW66p)O?STfXd5-%t{B;Uxp7mnopnUfkDc{4%F zS;U_M68{)z`AdCjKNE=a2jE}uHWZLf3iLRvgLmN*(6Ybw*+l|UX~(r4)u&%eAzp#c zVF&C2Db#21HEf07K#SPF1Y*Ah#Qu+lyskqOV9Dw9dY3L({VluZ`Gj!Bn^q7J!1g;Q@FYq%e)hyb0*Sq}ubrZ7PvC8VTZP28g5UKpd?G zanRUgFSe5L1t1wO2Fdt-kc`DvGSs3k$1z-vdz*0oPvzBdmx2~CxDQ%mAlFR{kAu@7 z3Zq~=Xc0RH==cNEbN#ifA=4*e9lQ%)!8WksyZ}l;G8+gdg1InL_^d_zJO<+DZ4f`- zf%s_*l75i3m-bhTCF6HMGTsW3@j)0##$qfPYU#s!hUfG9!4r7X;QP>pvsZ08gA(7q zux|bL#F_0g?Y|_b9U+;GK%dAZINp@Of$GJ_9Uwl;1x25#FXDjo590hO_yXjm%Ua}Z z&ToLcvRUG^)abeXbw~VJFQ?PhEPKjFa>})cJ_fU3HarL4z;@ULTI#h+)iTtMYCEV; zKb7?2<0iNl9snuCZfHn>3!o)v5&H{4?C*e-BzP1gL0&FFktxANVgzD*H{1h~k)(M7 zB#mSwY06CL@D?%4IuRF%a)g<_v_2l0V=O@EOAg`U) zBJZPa~5!TmlPWF-RdkgRfyL{03UYJ_=$#2gH79v5fx-d=8Re2WW{AmJGyr zJ}dyqh(vkILDEP@l4ciZk(ZZW2#;{Ko->^>(NEY*&+*qC!7Jo2K4Px~f1kcHzC$Vg zBtc#?uB98{{%{INoR$OCUq;$_j1!*cEXX)Pi|C(*|3K<9{#0Pp8wS8|&|)^+mz_A0 z_}b~~)4z%BhwyU=*S`@NHU%lfnGlCjFcq{&g7>otcriuRzJ&k9z8b`SENJ;4mx0(e zgnW>EBuxvDG?LF)8~6Vt0$Oe-`~=7g)0^@>@sBxeUz<+dnq2(frcc$%;AJv+8!Til z??u=0A-XR?-m)%nS`Jiy1ZmIaZQNVQ_curdS~86SEnP6^3jZs;_`VG8gcYS+|Bne2 zP@)nj2Q9S>>$S@{+ADp1`fJJWCRhV6mU8`HBOrySBJ;M;0RpCiNP?vx37!S9e-p&s zp0hv7WPc-Zl7ZO10RMy+LDIYnl1B28G~SdcphK zAnAvj?8R2{jimS^8P5R8_&Sh`#aJ@bqEFi_PTLN6{$MH-Xp#6`kR(n{uh`9p6|f2( zfhR$W*o}ddHmDu3zxoC^X$)=P5b(hVd0Q{u> zV~RF?+3MPVuMGlu)kE6L2@zC!M=Sa#lqDzyat-VjHW&zP5f(|64mkUyAzl zGjKi&Wb=$WLCXQ^Q+Y3t_!^FM4YX;?YR6FwtwD>#w2u==%5Ojx=;8Yj`li@;;w6DM$U@pv7K5G#_hl2R&3gTxth@Xim{)mHD zL5mnm#@#?N9s!c^B#?~7Rx;GGfwRV2^76KHrm}&S`t+@_9S7$_>TdpwZpTy@)*Q)< z1+-|x+WOHs2Y-V;l_^PWM^Z9#!E}KxM!&#RV67Kh+Yy{e3jdzz07TzlpL*_pbAmM_ zcmirW`n&Y9ZOR6ay-{{SZvMktBx*|~ zIft-hAhwG^fn+3UR)D0Dj3kYW`m`B3~Dm|tN5cx zsNFY1a=p&Epv}@XP>v1ZNFf}}){|1VQ zD}jD66)uF!Knr%M{W8>!YCEV;{|A{jBBQq8g%C&~=D-5D4sL}#_n#zah(Zz^36h{I zNP@W_36_ACe8Q4}*t)?3l98l24kV3aBx!C2EwV|^Asu+PGiNI#XH56M64AmOkxNmZ z{uS(BhdqvR_6Mp@)tBIHoNt6C6siQY$UZ&W;MZK-f2(hgPftg#|IwU=L8i(h5lNT} z^WX*e9)5=1pk;sUw4d7PvwH6T+7Z*qT4YzEb3wKqk~kz=|Lcgzq^VDTJBc6c#L5|G;XKos5d9~R zPh2DD4x?cbTm)Kb?705>GSrT0JE%{;gUo-2He}WTjshvfWiSWk!;PS2M+)O#a|sS5 zLK1jE5?l_F;9Ah~TP_2!Z3pc^GLkeQkTjB!q`3jKtS7vjal!?hEg2`~F~Tkc-Tvf> z!M{KZW}8mw-=!DdZ7IMtAO)F29t%5j|KCO6en`X9phXOC03H9|>Ye!TLLV3i5jY!W zz$Hg={pS*p%x)y}RO7SX4C{3#%^C1{a|zeC>} zKeOQ{Xn_A#Pz3?#3SlSLzdr#jV)#2~ga1~4Ek3S?d*DHM0bYZR@C9rI$*Y5t>)*Mi zG?~H-G8IT1T?gXmeh^2mfH?XLI$+z;WG}Xo@dF?kzY3D^=O7u2t>mZWf)pPA^4@?t)dIWl4{& z^+oKTUafwP*F*7Ra( zDftF-H$tx=HK_~v+!?x}6MdRr2e!++5N@;n*`EIC+u7Nl%kr~VYNNdUjTc{c&%WA# zpU@7@e&iQ(nV;r%&%HD(^Om?RO}9yP&ipcZq(q!8zpTsHWnM0p`QdI&D3i8top!a7 zWj<1m`pOS>Gk=2ev%}5lq6Z7QThz_ZG=1L`L#-Q}EpMjAX6^-QJHOnMyG++aUPjJa z?XoW@mm4C@JIwhdB=^D3@^i>F5*nY14`cWP_rjx~YegL`g&Q4u)I$yJZ*>DH^bOv(`(DGOD_mXBS zcu4aPQ@R(2QaRyU_yx4gJemAJ!S<6G+G(j3q1AbDaj-*G0?ywZJ)TbAlTVVyPf=mO}{hA0f5x5H)L~Fd%rx%+hPz)_W zyx5DU6Pf`t;TFifc0bd1=n7qY_M#*YAYm~T5&iFwA80R2AeP(4=0-JClJ0F zHuR<%ftLF8|G?(;-c*}63A}Gg@Dt&k@CUG=o%WMgpZ?;}+%@nBJPKM49m9MXoZyFJ z;W+3ALt!#pFedfq1c#xN1TK&ST|p9@0Fqz|Xps#5-}Wh-)R%!cmm`qE$Pq|keKhaCJg<5<`Dv7KAHudVigI zei3Sp_#C5eU_1N_yP@GPytD~gfFHVo7P0>V#Qp~m`#j>sz7WJd09y94PaSB2zp$6W z$N@-Ukpt}Gq`_g|~hyAmYn83qNQ)tJh*7#|~=Qhv*0#i)) z|DPl3OYqlvab5-eAO_Rm5?BLofR>D%2gP3*uE*wM_yoQI>0t(^I-bvPd z7zR<$BKiS2{pox3G+cE@u(KIP=R*qS?n#iBH=6LIoc^-?(67g)8)soEtblwDqEsJ< zG@L(S(6&BbsM608ofj-u)&=9XKuLzzwikpCWSEm%a~n{b9JtK0vs8PCsOy`rLT4>LOM);APke z9k`)`rklDyx@mtAKPnf$f&aBgy885|iG7Mc>rDy7STYhPbrs~V;x8uMWiTJ)fV9-7 zZ&zQ$A`&kLDMTJ;LT$W|$yRo`L0*H$G;EXXt<*O=)nl&6gpoHU$vVWE?2Au$KM|8H zF_v|MbawwEJ}*~Qr7UOg>X-2{;~F`f4YKoG&>MzAHH-o+Y?qyP91MpfOn@1n#m16C z6?ma141i%EbH47y^O^SkdJ>ZbW*z51W@Mc@bUe)oIKdCc!g0_KWSi3SAO%{){xA@G z7l?gV5c?BA?5Ba2zp!Utp#w{>m%S854nPVc2Ox!!1CYYV0Z3uY2XGIcAB1P%#qnIx zw+XxtTFeH|qL=u0{>FIm`C`uJ`{t6#Cakhws_d)U0<=i@U|0dG_d|a)HUr@lI0q)e zB`_D3f|g$ir%ESMXW%I41w%oL#I=ARblDI6`Pj^aS#UUG1ugr~rw%m10okvmATPoj z@HYG#K7q}!9c+`h{;f?Vl?2a$Bv=QM;3JR(Ux5wV(!bNb&tGI9g^?qW!pIRwVdMy; zFmeP^7&!pBnXgwHFJ~R6+X}WbOch?jgzyS(iz|6F30g$|E{MKoEqycekHa&dMeOU+ ze}sO_rQB-x7;5r!0lJGXr9V3vWpeL`{nlTDqdVa&e9STVsZYNaTjymQ6r6pTsn7az zM9q=?PJ#v)H-;i8g%;2TI>3o=I%ruyc<|-iMige1sX(HWEwopo+jFKnlIkp!V__mp zhYMjQTn^X51Mmc7mgHm`i~BP>zMXAJy)=t15k7zq;cNH?wER{457@SvO;x^%stj88 zrEiFR0koKH8jMPU-#{XYKudl4C$U*Hhc76QsWN5!A^J_Qe|iQZ|E?#2IN1$lWO4`u zAPlF%*>E9T23o}a%bfke=*9jR5c_Hn`%6H}&*DGD9|uawpchC6XMtp(C1dzMvP=+?kblDNS7eB=^zG|RP?U3Y3jYtwIm~vcyYm^M zGoYWDeLTr=ERelhr-|rM8{3Eu*D!rkx?h^>}`2|M9v=#k=2e;5R( zLL6pOvK!!bxC^xWDPb-9YwEDiWRUZ>z~o2gBmPt749pSxqnG;PfMapg&y>Ld=(7#= z0VK$rjJ9Md^=1%^g%{ur&?50ZcoDt4kry*}?<<+d2$4K&m({%O~u^a#Vwq@D)IQ#Nt=Jd?h=knbGeD;-$c;G9|n>_ND zEO{8qvs#`O%bV{r-xA0)d}1xpvn(rizu&a=@Ky_WFbF<)4c>yng$zNV0uF^ELCbXF zXTtBW8?<~$cpLl-5|?eVGTV}MyQt|*mFir`Q{RtyB3+k`#ya!#d2@OeDBPn+@|!_KNUwNW|c(r+RB6YPXvOnNtGxeFWv#{n-W${zDjKAZt(LIUKy;Old5 z2baeD{_Fy6=55%Sjqd3gxZg6XwtrG)yNkiuw`FU~I+ZWgPA=Q3ESK-GE!gutvElOK z@K)>@$sUwxT5G$J=36=RA{+1KJ4czV23aFspDm#*6sKv1?M7zJSc1F*$~S-}c_3d> zfrmiLhv@$eR&)*aL*En|8?=R>$v#ZDFI)|a_SPS?CnEc;2-)qi#d6-2eIKlX`{4n2 z=tp_E_BF#wczd(Fpm_@;4*AjkB8J=Yl~w(M?%{+RcB%Q?i17SweBT{BJ!v^Lm?F-Bw$%T3rQ2zFIx7-)n)Pnj zIherdp$uU}rWkaZM1F7+4IOe=8P3vbiVmGXeN3|!!bN>|am5ww6*rydM6w&g5`<8IB9VmUybWYJA#jvgpY=G9Mq<(vIRS;3yJ}t6SbnkI6;5b z|F@)KcN~^UbbO=Ev`(~Ga*kYA?(S9y&7cU1p#*GD3T4n7T0l!^1qVZGXp`REt$h9r zW8xIG;0a!WwJ7_)di;s<7RJL<(r-Oc?y@xaa0=fSJm}f-sp`U~%G)=P{gTv;PnK7t zUwo?kaf@-))byp#l#e$mZz96_V~M3<*ZkoPhhAc^{gkCaal<|Zc@2&GrmB+X%3o^m z4@rE~bL9h6hv&+3umJcx2UYtJh&2o#y*m{XN`K|KhMz>4TJKriF zW-+e4JU#gB@-x~Pn=VhU-db*0jKgNChqje72ERfb`+fP-#{HM2fB(LGs$uk+rl#!R z5L;fUyg!y7YIM9ZJ>tjmSOa77tn|~n%6B#}mS2)i|50vfYCJwG{dhq|e!g+Sob+?W z6^De3&{gR#j;}b>Fb-az$gsZ}*1y7GOk9vYzkfwLOB>nz$hyR8X_#NoHG3%v8+MXQ z@z%nu`9T9KDh&HI>2?Dv4j*Lny-p3jsbaNp@Zz*(Sw$E4f5oZQwp?#A>@8!Nsq zF`CRvFZjOV@CL?!8`YX0D_$@zxk;sds`$uwby@n1ofYFsjFmU1-)LNUn8g@(i`sEe z)Wb!+;zCY5Ix#aMcN9>$Cn>f5r)TZ~03)%@m_!;NF^QeQQ%>|eHs-HEKb8(54| zshmzu$9v1v@hvJJGFIM|{-Z_ZxmKg+s`R<7E6?dU3~KrLq{C zR;S-QwQ^aZ@!9J1gtIHBri_1ot-kuQGHHDGwHmUyvefwDYn9wwInA(rqc&}>Y}u+U z+jdz0%|&dRzdd^qt>hH^MiqTk`M8zMJk)DnRX%A{e5>YsUHONV-8|IXZz>PB7H_en zAO5DYePb(|d89Y}P&wYPvVBMTq@OC^&$qI9N4oRxl?Rtw*}5a$@8GJkM%L9kEGlBJ zN?3R8u%utMSIxIr*|sBn+96eA3#_-WlgDeFsw!HnrmvP;CR3J%7O74TVzs+d)e9w7 zh9~J4yHV*B2YZ-RYYWRqr=2%DSY_JE!VR!??Cvy5E?p z35MbCk$!4i)snVG&pv9zbyfY0*ZQRIxUTAP!K zG1?rj4!WW0U&f5%(;IH6I^`ha{XuE}ZB=KtGmadlmcLrn+jwu7+WczO$5zG`>ZRAJ zdRiG&sKVE)-m)^FNPqfzReOt-(S&NYuIfyq>#1t&x~lt)3r|t@^;MgUey696H>)1A z81v6mPrXI{mk&+<{8rT#i}BT&>dUvQrW@0$)6sXTZnqfUk4!gyuZni&+-SP`{i^j1 zjNXZ~>*K2HEJnXk>6bQCjV(2njZ?wxe1FV+y1IFLRV!mkuk>Tvs~)x(6Gx}V?Wme- z7@a1m-+rpI! zw@)>ePgif|+ug>K(^bPp_KwEa)6?!ocBi%F3v|NPCv9Z$L@o#1zkQ*aUSR*mI69S1 zHnCr880XDQ|5j)(Y-FYTS52GSds^xL)sW`)EP&f6#AKEl3ZUY5&M(>|T^UYLWdGtC5(m-db#*Z@hD5I;QNOTN_Bv zt!}x&ez3aeHhW0TTw?FiKzeb}dDXfF_Da$9Q44Oe7pJedQ3{oRoSJdF{iyVa+w69W zvGkfWpD2iPVS4Qy_A|Mtrzpn?`v_zEwd#Tu_Ct&vJ>~PkM(gX;6D#ah#`>$|b7^|( z3j3q^#xd8a6{|S1gHKl*SJ_WAS`ABkR@=X8UMQWl^(n*BFi>EI4e{m%4iTS#PZKjig$)lnPl=h@=^kT0I_1^tO+BoOs@!p+p$ZT3L1Kkkit0Pzbg6E-a(DrXfG*tI(@;QFBJ6!JOQuA zA5<4_w0A2GgyK@7-@ZVK%Rx&khLGLlRN z!z~76V|#sKx0U*%0dFV}bNfSX3hHx*TMo>|F8ah?T8cgz4{~{8aaS@CkA+*EBC+k& zr=Qr%ivymZKj{s{UCu}(;0$!-Afnw3uCG`aD#E z(?7SL)4@*#OS-**Xe<&+aC+*`U2Xf^KBkB|l}v^r@lYtinT)H^U)aYMdt$zLB*EGB zcsX0Hfcp9i`}w7Tc*Gk_Bs>xFmF{&| zhYwbrCv(soiQT-y`h})%HU)j$tPDb6aWW?i&a}UM+ zo`kyVD|@eEkI&Zoe-P z=Zg3fiFnlKN`{ZDR=3P499SHUM?9WrBoYg{+%#J*)#4lb&|)_Qh&bJ@h>sS|6N#wv zzpibJ$r zQEqe9bc-}UF`p-ra0h(xpf|u3S0`+-x9{NgxIMvuJDKo%-JZD1le^X-e;~j=r<)uC ze$GqCua<4GKUEqCCZZuv)ai`Hyk0I?IM7XvD{@q*x!=(M`9m>}E9CP>I1kRK+o$gR z&K|V6VljV`6YdL2^Gp*LQmekR`)xjFEaZ*FIAN|((h~@VkIw3Yk$5uT3OJqQ><%O% z;Vv0{aWoN1L|r}(#7FBFbE?<2+C#Q@z)v0X2L05lcpwr!cBJa@b~ArRS2RXL%-!Zs zP|n~!j;w2@#Vv`%xca^bjd3!Xj3onM_3So#urv~j$GskIUms`Qned0ZN7X0o9l?&Y z0RB*vmN=gDx+5Xogw%2BdZWk>cqz*sFouaz!uyq=lbW+nJ+?}pKh;!(!|DyHsNiQ@hF;SZPgfBdC;<$+}e zBcn&ftNA-6!5!g@(4$gYye>LA?oDO+!9KWyGwzAT<3W$h@1yH-)t^ak_1boOTU#hV z$L8~eyk2kIM{gSLqh|bIKin4ZCL=TqWa0@p{eeWduX^YQ`w_MvcVI|rT`-UcMG~&? z@#@Ra zzb|}3<~p{DI^!{^i0(KyWYFsg_dk>LexGtZ-OQu9KT_DdmD?Q;`r|%NNUC$p9SIK@ zi%B3TCau-_xwfL3d`|apZ-wISU@{nwIQ`LNcwp1&>WNb(O|FiN9z8BLs9Ek)Jdyc4 zSbv_F{XC@9Y+ZeRV&b?&{KVE-rTYG~!ZPEeKFaa0B7bRs<{%!7(6PHiUXLpp9@<}h z@=&ubHg7WIW-Jh*N$~k&-bnal_03QAlPuJSo%~R8ShecD)9zQ>`a9Yi!_UZmaQM|=MVS-QE$la3ZJSL{A?dwnhbg9FuYDr$er{s zfC`^>sv5M*-dWv$yrYdR#w7{G{ccx0;qiMz&hY7K;4b@sPTpw1&%j3-y_hc%4d|}I z$*9Ifed5jxI6XA~zB7DMlIH58UG}2VSUloN#v?Ijz!P(F--XYNOJ+S)_h0NKHu{GU z_0H+@y5h7nk#Mzg{c3mHLfp&=n&BYbVk{m@hDT=ZEA;do5f6htC&K}MARLiF-yt15 zQ9pf5G!P8Z}t;P zlaV-gJ}tO2L7x#!hT})8ktaKvtDg&PZPkk3>?4XfbgwhwqrZ*>VpL^S{JVW*vDfSI zxPsi<)UZ%I;!`t!x1UxV3I@p_iK*L7D;ZVa{BCd01&$=5&IET4<1eQtJnCF^7nxVN zoTJVfJ8oj4deY>HT)enD5lFa_5qHq*W(X8g3;wXji#g98`fPfiNRr+>rW)+FA5k1i zMBF~FJ48335I+gCnMvrPBp}5 zt16XyBtfT5B1U`EigDQ*S-Mw^9B- zqRutVhK(UKL!TtW&v-Byr+gQxX8Dd2Z49g!{s&@=JR&XzSmBH6E?=si^09>1%5nVO z<-3?~418tpTUL7*628QeEqUv`N`9#&DlKEETG<;p+Ny0wJ6ftua|(-WF&U@(y)kA+ z?kIzX@MY@5#*R)UzF3qZhZ4>}h~^>@zFf6D$T5ve=l1yAiKNr%iZTv#hObb!9ORf{ ziw2!hFI{QS6Z9qHNniL%)vmzNzKjMT=uS{Oq`uJ{g=bkjYC@p&kg|jfJEKW&%;}*K zXP`6Nl9U1BF-Owy1d`0Rs5eo6!js6gG;T&f0XO}K$L|Tqq{!o)W0|n{YkQxLd!2~v zEU}IhbJdt4N5JNf#F7kQ84}aAGV2S^Q)`E|*=7+r_2vh-8GTv=MB z+BJ2wrlK=^VxksF1|t!g?(o%WXj4aTTQoqQDtBfm!l2d@3(r^gHgz0gqe)CK!(uc* zV-s_R!VA=a`=1V3c-te_*eKW^go0mBj zeZ4#3jWH(m1;W?mj^5`^`kfIEEqXNKL^}_0igfLX1QLaesJ;u9q~O z0dK_R3;CV#q{o>IFRiCumhDw9Z?yDQJxU#&Dtxig<0i>i#?7=W=4Lb>_l6j6`NB6@ z!Wolt@Az?}M@u8>j3h$IM8M-ohP<4#@G{H5jD>pD<|rw1Gee0+m{10phj^U9@Xb29 zywp)*bGjLmxZF+#vI(~@=nV6f#8QXP#>t`c^o6+XecT+e@GWX%sl%xrEp@cC`D4^- zn*0!BTFzS_e5*wEDWh6MT?tn#;t$9?+#kMePhqEy85O6n&S=CNaxn(=(<(Ab58rM% zK}F`3Iy!RMlTl|VE;ovdOmjDc$L*62&cj*+vq%~Ey6;dk%N%8yH4w({9y)_q!pBgJ zn&1lGX~`~vM15}VD{mqhqJSQEGQ2{a-`p{+l&c(J{2rn&Zk5%Y~Q(F%t;iosFg9pDVIw zFjPmHhicL!oslFfFkUKDoTf0hlvPKXhe_l5*w&$AgyA~(Je4mQNXB$a=&B>hBkG0% zN7qhNN&0aXzCujpVxj0hGI>-v+Bn+Tn3u&v)KyQM*{|Q{45!s;Z5)T&7`OSET%%7o z;|w3dYt*7Pjw8yr(UM*cg9)|INoL{4EEA;><~;s+QoN6>AGeH9JTV6&2d8n8z82ds!QBhM!hrDjdU^XK*k3ST18S z9d~+T;b$xpr8`wmH*&O74J#e~66T~HZ!i)J#S+Zx-Qj0d|4MoQmzN$Tz|F$|*%zXz zU8`nRItG;anOnzc{sV62Pj1F2&sip^PbwY9AIZ93G#TQaiTb@XJGwfu{1}qcEwcr$ z+r^@q>-k)V*}0yJUPqFDSgx|Dr@Iu})e{A*r+ioC2p-8mmi3sJD;lI%XVRKGO?9Mx z!7@hORL-PqoZZpxNSD_aiqP}L5}r6cfo_%RNcYcdH+^J1HKdLdFIu{*TbdRfp_Xqi zXqb0fvms z#^avwt7^+3j!$h)x;TF_5n-z4^7vxG@N4RmLmflQJhb9b)}5TJOGa762)|BK|7NPl zYh#GzVr7`A5@U6oh2KyU+Bv#1pALCg5{}BUH8*!6yiToc=jd7Dp^J<&gXO3gy!ylI zRatw-p`|hEfG@(OVoJ-RoiqGquGyulXC+z20ZeOHIu5^;ZFZ?H%xftq$HxH5AO2TH zUlt5-{TNxh0x@5Vx*vYq(p5P=vmeO-$;YHAim{8CPQn|0M~&{_7*$3kWWACZA|u8? zz!eFW*+Vc+qgiCM4YS)`56%egW-?Vn;jjum$3-JP3vO8%SX%ac7{LZO6=Zgt5PdF zIhxbNg@Q~HJOLTraMi*a)VfZNW6R<`o-43=pNxBxjDx-5jh4RZ%}#XjGCV6|p_I{4 zlofpDDlw)|n;0Z!qL&`&IA~mwxdL;*1idQ*3~x02iRB0y3(x3rXStk{5|gV5oRyF{ zUce=f2;!_{G7FA-BH>RhowcQ>x_bP?QBxz66V;LNqcVvDXEQ8d(oSjPAKsJo_nZe37jk>hPl+CB~Pz598&-=G=$J`C$1fQzululknHs z@cI`@O03^l&Q#04E$OJXZEu#Z78u2aDzLD~ZvEEcR^3P094a`rxWwQAtUO^+CpRlD zv3{qciW)a7v2LYlJL<}2F}2O*D7I`<7PrG~`Ck5WsAC$GlvuWB!?WC!`UmC*TkqiB z{pi`^GRqFN-tAa!`B6>qIQm$BvUF2}MizHgUwN?HNnPzRyU4DJFKSk(3Z5=3vHony z%vt+ecQKx3*?6$^7t1*1TB)0Y{##0#s3M=EyTK#SAwI`s>u;9x)y4Bl&bR(fm(=~c z(zdF)U$NKt!=je^9Y5B)reT`-8hjgQ&jTlwypO}a#4s($ST8kd z%2#Q<%y7$K&TY9|EeSeKvs|Hm3OcH-R~nsF$e$P1Z1KHDLB`$q$ka6N<{DP5>UF^L0KaB>Hq7%=3G4mN0FBuKvQ^t&$ z{<2Y$Njs)m4x>6gdECTFuW;OnF|je@U(E)_Pk${Fpn-i|DiNz_v9l+Roih3jIh~V6 zOdcN_KYg8%FZ%J**JlFpDdXSFW$~7AP<8d_*yM?kv6KE~G{!0+3+Qhf1v*$g@tsVf z(TTC|8jaA7CG+=;%<7rb`o57_*zIHez{oC}seX5{jqHa;cJ=n(YTEIRxbcyZZ6uHA z$4&EbwncEL)A?lCpvLxdge)7?%6^WcjZHOe%h8QLF~-v?1l;P(pskfU<1y-F*Z-7s zQOSQ%+degVsr7?xZB)9vxV_~+>e~|>LF;D}EAn+oOVzc%<6!IOe`=P#FgIeBFIDRS zj^38dDl))v3|+vo0ghv>UuO@-ugV5e&Tnwm?lPOx`Yl;4e6LxV8aI#|Y>Qex&~c3Q zJELb-Ip~4n&ep9o5(`_~TBy@sYSzlS&FG~1&M56<{hmfD(~K_LN;A2gBqc*=43;l1 zZlpF1a#UJ=P`d{?x>|P_$M1>hWc|?yDa)3^ay5E#QDb%gU`KQ7Pe$*o!T2xP=U}Iy ziibD`SbxqYJ4~$~;;^ZYFDfmy?lMM*VMgV%{$g}djzXT!SDffL-1@5#RS!6ek5bFm zl$5D0&5DcE`%P`d*58cNnROK%E2?H{*B#ADjNc7)&`FLX8vkL$7 z9Vc6_u=Z0u-e(YU=f}-DTCP-6xP{s}oFofXvk{JCjccr#*}GbEBdyXR>u~j9|Kj0v0N;;rjIvy(PCM0c zu642X*lhOSoa$&}Rn{)@sfDUK&C%9+y)`JGnyYp9*z(o*?@KEzH>jDXQ5lw4yJau` z((Ogk3G6g$RQu`aV_ZXJi(cDkd;a`WOdsJF|lz4urY zsgY;UqupZdA*z<@$O*RImes0j#L>@szm;mb)7D%qk2nsqKES8%R~GX0 zgHM(Rl_lyJX?@7*Q^DDcLQaYmwXi;HHP^q5QAd^K5w$z&@LL`g^CPoYtY}hkQ?;&) z`z38XOD%l2@HnZLja2!=g%y@H$`W_Dt&drAHMZ*!CC${`2F8zDN2;F(HXCVuB76ON z$fYk-cL!-Jo-}3LJgXn)E-JA;^(TGBiwviVlMD}^&Q_GgKQt?;e8$>((x`Z1>X>R- bTk9MfH)c$PFG(b(ji&{FHoZK_nC|}o?^T3C diff --git a/standalone/pruntime/Cargo.lock b/standalone/pruntime/Cargo.lock index bb09080cf7..66e4d9c01f 100644 --- a/standalone/pruntime/Cargo.lock +++ b/standalone/pruntime/Cargo.lock @@ -229,7 +229,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" dependencies = [ "include_dir", - "itertools", + "itertools 0.10.3", "proc-macro-error", "proc-macro2", "quote", @@ -322,7 +322,7 @@ dependencies = [ "ark-std", "derivative", "hashbrown 0.13.2", - "itertools", + "itertools 0.10.3", "num-traits", "rayon", "zeroize", @@ -390,7 +390,7 @@ dependencies = [ "ark-std", "derivative", "digest 0.10.7", - "itertools", + "itertools 0.10.3", "num-bigint", "num-traits", "paste", @@ -611,7 +611,7 @@ checksum = "7b2d0f03b3640e3a630367e40c468cb7f309529c708ed1d88597047b0e7c6ef7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -1183,7 +1183,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -1666,7 +1666,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -1786,7 +1786,7 @@ checksum = "5fe87ce4529967e0ba1dcf8450bab64d97dfd5010a6256187ffe2e43e6f0e049" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -1860,7 +1860,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics 0.10.0", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -1963,7 +1963,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.43", + "syn 2.0.60", "termcolor", "toml 0.8.2", "walkdir", @@ -2154,7 +2154,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2194,7 +2194,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2405,14 +2405,14 @@ dependencies = [ "ethers-etherscan", "eyre", "hex", - "prettyplease 0.2.9", + "prettyplease", "proc-macro2", "quote", "regex", "reqwest", "serde", "serde_json", - "syn 2.0.43", + "syn 2.0.60", "toml 0.7.6", "walkdir", ] @@ -2430,7 +2430,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2456,7 +2456,7 @@ dependencies = [ "serde", "serde_json", "strum 0.25.0", - "syn 2.0.43", + "syn 2.0.60", "tempfile", "thiserror", "tiny-keccak", @@ -2601,7 +2601,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2834,7 +2834,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2935,13 +2935,13 @@ dependencies = [ "derive-syn-parse", "expander", "frame-support-procedural-tools", - "itertools", + "itertools 0.10.3", "macro_magic", "proc-macro-warning", "proc-macro2", "quote", "sp-core-hashing", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2953,7 +2953,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -2963,7 +2963,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -3117,7 +3117,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -3408,6 +3408,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.1" @@ -3829,14 +3835,14 @@ dependencies = [ "impl-serde", "ink_ir", "ink_primitives", - "itertools", + "itertools 0.10.3", "log", "parity-scale-codec", "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -3890,10 +3896,10 @@ checksum = "1bb9a2826cae9617d8ed2d547ed6e595deb334c1b69ff0a579abd86a76e48c30" dependencies = [ "blake2", "either", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -3908,7 +3914,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "synstructure", ] @@ -4064,6 +4070,15 @@ dependencies = [ "either", ] +[[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.9" @@ -4149,7 +4164,7 @@ dependencies = [ "diff", "ena", "is-terminal", - "itertools", + "itertools 0.10.3", "lalrpop-util", "petgraph", "regex", @@ -4339,7 +4354,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -4353,7 +4368,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -4364,7 +4379,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -4375,7 +4390,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -4567,6 +4582,12 @@ name = "multimap" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "multimap" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" dependencies = [ "serde", ] @@ -4748,7 +4769,7 @@ dependencies = [ "proc-macro-crate 1.2.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -5030,7 +5051,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -5562,7 +5583,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -6017,7 +6038,7 @@ dependencies = [ "phala-node-runtime", "phala-trie-storage", "phala-types", - "prost 0.11.8", + "prost 0.12.4", "prpc", "prpc-build", "reqwest", @@ -6419,7 +6440,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -6516,7 +6537,7 @@ dependencies = [ "proc-macro-crate 1.2.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "unzip3", ] @@ -6633,16 +6654,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "prettyplease" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" -dependencies = [ - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "prettyplease" version = "0.2.9" @@ -6650,7 +6661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9825a04601d60621feed79c4e6b56d65db77cdca55cef43b46b0de1096d1c282" dependencies = [ "proc-macro2", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -6726,14 +6737,14 @@ checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] @@ -6759,7 +6770,7 @@ checksum = "606c4ba35817e2922a308af55ad51bab3645b59eae5c570d4a6cf07e36bd493b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "version_check", "yansi 0.5.1", ] @@ -6800,12 +6811,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.8" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48e50df39172a3e7eb17e14642445da64996989bc212b583015435d39a58537" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" dependencies = [ "bytes", - "prost-derive 0.11.8", + "prost-derive 0.12.4", ] [[package]] @@ -6816,10 +6827,10 @@ checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" dependencies = [ "bytes", "heck 0.3.3", - "itertools", + "itertools 0.10.3", "lazy_static", "log", - "multimap", + "multimap 0.8.3", "petgraph", "prost 0.9.0", "prost-types 0.9.0", @@ -6830,24 +6841,23 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.11.8" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c828f93f5ca4826f97fedcbd3f9a536c16b12cff3dbbb4a007f932bbad95b12" +checksum = "80b776a1b2dc779f5ee0641f8ade0125bc1298dd41a9a0c16d8bd57b42d222b1" dependencies = [ "bytes", - "heck 0.4.1", - "itertools", - "lazy_static", + "heck 0.5.0", + "itertools 0.12.1", "log", - "multimap", + "multimap 0.10.0", + "once_cell", "petgraph", - "prettyplease 0.1.25", - "prost 0.11.8", - "prost-types 0.11.8", + "prettyplease", + "prost 0.12.4", + "prost-types 0.12.4", "regex", - "syn 1.0.109", + "syn 2.0.60", "tempfile", - "which", ] [[package]] @@ -6857,7 +6867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.3", "proc-macro2", "quote", "syn 1.0.109", @@ -6865,15 +6875,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.8" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" dependencies = [ "anyhow", - "itertools", + "itertools 0.12.1", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.60", ] [[package]] @@ -6888,41 +6898,59 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.11.8" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379119666929a1afd7a043aa6cf96fa67a6dce9af60c88095a4686dbce4c9c88" +checksum = "3235c33eb02c1f1e212abdbe34c78b264b038fb58ca612664343271e36e55ffe" dependencies = [ - "prost 0.11.8", + "prost 0.12.4", ] [[package]] name = "prpc" -version = "0.1.0" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ac203d10cfaff379693bbb2b5c2ca58813463b879adc055c8df610ab827550" dependencies = [ "anyhow", "async-trait", "derive_more", + "hex", + "hex_fmt", "parity-scale-codec", - "prost 0.11.8", + "prost 0.12.4", + "prpc-serde-bytes", + "serde", "serde_json", ] [[package]] name = "prpc-build" version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d38aa9ef7bdf72bb2f4c3f4b790198beb68054e3213dcdbebfd323fb0141e8" dependencies = [ "either", - "heck 0.4.1", - "itertools", + "heck 0.5.0", + "itertools 0.12.1", "log", - "multimap", + "multimap 0.10.0", "proc-macro2", - "prost 0.11.8", - "prost-build 0.11.8", + "prost 0.12.4", + "prost-build 0.12.4", "prost-build 0.9.0", - "prost-types 0.11.8", + "prost-types 0.12.4", "quote", - "syn 1.0.109", + "syn 2.0.60", +] + +[[package]] +name = "prpc-serde-bytes" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac0855066edbf6bdcb42beb02cd9063d12d8d6d44b9a0c2f15a30e6ddd11f5" +dependencies = [ + "proc-macro2", + "syn 2.0.60", ] [[package]] @@ -7011,9 +7039,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -7563,7 +7591,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn 2.0.43", + "syn 2.0.60", "unicode-xid", "version_check", ] @@ -8113,7 +8141,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8460,7 +8488,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c792fe9fae2a2f716846f214ca10d5a1e21133e0bf36cef34bcc4a852467b21" dependencies = [ - "itertools", + "itertools 0.10.3", "lalrpop", "lalrpop-util", "phf", @@ -8500,7 +8528,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8639,7 +8667,7 @@ dependencies = [ "hash-db", "hash256-std-hasher", "impl-serde", - "itertools", + "itertools 0.10.3", "libsecp256k1", "log", "merlin 2.0.1", @@ -8687,7 +8715,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8718,7 +8746,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk.git?branch=release-polk dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8728,7 +8756,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#b4c816665bd094b6ad703f1 dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8940,7 +8968,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -8953,7 +8981,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -9138,7 +9166,7 @@ dependencies = [ "parity-scale-codec", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -9427,7 +9455,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -9482,9 +9510,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.43" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -9505,7 +9533,7 @@ checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "unicode-xid", ] @@ -9660,7 +9688,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -9789,7 +9817,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -9970,7 +9998,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -10582,7 +10610,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "wasm-bindgen-shared", ] @@ -10639,7 +10667,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -11511,7 +11539,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]] @@ -11552,7 +11580,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.60", ] [[package]]