From dd3894fa1ef839deab4e1b5306f8a61e6d57b157 Mon Sep 17 00:00:00 2001 From: Alejo Mendoza Date: Mon, 18 Mar 2024 16:40:23 -0500 Subject: [PATCH 1/3] call contract test --- .gitignore | 4 + contract/Cargo.lock | 1434 ++++++++++++++++++++++++++++++++ contract/Cargo.toml | 30 + contract/init.sh | 134 +++ contract/src/lib.rs | 134 +++ package.json | 4 +- src/config/config.interface.ts | 1 - src/config/index.ts | 1 - src/graphql/call-contract.ts | 207 +++++ src/graphql/resolvers.ts | 5 + src/graphql/schema.ts | 3 + src/graphql/server.ts | 6 + tsconfig.json | 5 +- yarn.lock | 5 + 14 files changed, 1969 insertions(+), 4 deletions(-) create mode 100644 contract/Cargo.lock create mode 100644 contract/Cargo.toml create mode 100755 contract/init.sh create mode 100644 contract/src/lib.rs create mode 100644 src/graphql/call-contract.ts diff --git a/.gitignore b/.gitignore index 18a437b..3905b4f 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,7 @@ src/data-import/data/users.csv .vercel .tool-versions + +contract/target +contract/.vars +.soroban diff --git a/contract/Cargo.lock b/contract/Cargo.lock new file mode 100644 index 0000000..b02a4f0 --- /dev/null +++ b/contract/Cargo.lock @@ -0,0 +1,1434 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" + +[[package]] +name = "bytes-lit" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0adabf37211a5276e46335feabcbb1530c95eb3fdf85f324c7db942770aa025d" +dependencies = [ + "num-bigint", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cc" +version = "1.0.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crate-git-revision" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c521bf1f43d31ed2f73441775ed31935d77901cb3451e44b38a1c1612fcbaf98" +dependencies = [ + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "curve25519-dalek" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7277392b266383ef8396db7fdeb1e77b6c52fed775f5df15bb24f35b72156980" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core", + "serde", + "sha2", + "zeroize", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "escape-bytes" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bfcf67fea2815c2fc3b90873fae90957be12ff417335dfadc7f52927feb03b2" + +[[package]] +name = "ethnum" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "indexmap-nostd" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + +[[package]] +name = "js-sys" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "platforms" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +dependencies = [ + "base64 0.21.7", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.3", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "skyhitz" +version = "0.1.0" +dependencies = [ + "soroban-sdk", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "soroban-builtin-sdk-macros" +version = "20.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ef302d2118a14267e441e50e33705adc4f0da56616e7d2d9f198448d5714b2" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "soroban-env-common" +version = "20.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc40ac91f70bb93aed7dff6057caac8810d49a8c451f44286e1e49243c799beb" +dependencies = [ + "arbitrary", + "crate-git-revision", + "ethnum", + "num-derive", + "num-traits", + "serde", + "soroban-env-macros", + "soroban-wasmi", + "static_assertions", + "stellar-xdr", +] + +[[package]] +name = "soroban-env-guest" +version = "20.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "949587b3608cb05fe1d5eecce24aed1c33063c38fa79402f2e5b1c2a29466350" +dependencies = [ + "soroban-env-common", + "static_assertions", +] + +[[package]] +name = "soroban-env-host" +version = "20.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa4e738232cacae7deb7947adfd4718e47cd2b50676e9518a8a38ee00930c9" +dependencies = [ + "backtrace", + "curve25519-dalek", + "ed25519-dalek", + "getrandom", + "hex-literal", + "hmac", + "k256", + "num-derive", + "num-integer", + "num-traits", + "rand", + "rand_chacha", + "sha2", + "sha3", + "soroban-builtin-sdk-macros", + "soroban-env-common", + "soroban-wasmi", + "static_assertions", + "stellar-strkey", +] + +[[package]] +name = "soroban-env-macros" +version = "20.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff09cd5f1e4968e6dbac40eb4fbb2bdbb478fa989a96088fe0466d09e8ff40c6" +dependencies = [ + "itertools", + "proc-macro2", + "quote", + "serde", + "serde_json", + "stellar-xdr", + "syn", +] + +[[package]] +name = "soroban-ledger-snapshot" +version = "20.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a7b822725a73a90ef650bc1f325d13c8bae7a808156c101953092327e2edee" +dependencies = [ + "serde", + "serde_json", + "serde_with", + "soroban-env-common", + "soroban-env-host", + "thiserror", +] + +[[package]] +name = "soroban-sdk" +version = "20.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdff4b5fc50f554499b81aa6ecbb4045beb84742ecda9777ebbdc90c0d93ec62" +dependencies = [ + "arbitrary", + "bytes-lit", + "ctor", + "ed25519-dalek", + "rand", + "serde", + "serde_json", + "soroban-env-guest", + "soroban-env-host", + "soroban-ledger-snapshot", + "soroban-sdk-macros", + "stellar-strkey", +] + +[[package]] +name = "soroban-sdk-macros" +version = "20.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12d147c3ce37842919893946a4467632aa012f567a7ab2286abe19e5ecc25e05" +dependencies = [ + "crate-git-revision", + "darling", + "itertools", + "proc-macro2", + "quote", + "rustc_version", + "sha2", + "soroban-env-common", + "soroban-spec", + "soroban-spec-rust", + "stellar-xdr", + "syn", +] + +[[package]] +name = "soroban-spec" +version = "20.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7a132b7c234edf6ef3add4ffb17807f3b25a4ce5ab944ebbaf4d2326470eb1" +dependencies = [ + "base64 0.13.1", + "stellar-xdr", + "thiserror", + "wasmparser", +] + +[[package]] +name = "soroban-spec-rust" +version = "20.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d396f3b29800138e8abf2562aba0b579d09d8c2d2b956379fc9e68914a6e62" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "sha2", + "soroban-spec", + "stellar-xdr", + "syn", + "thiserror", +] + +[[package]] +name = "soroban-wasmi" +version = "0.31.1-soroban.20.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "710403de32d0e0c35375518cb995d4fc056d0d48966f2e56ea471b8cb8fc9719" +dependencies = [ + "smallvec", + "spin", + "wasmi_arena", + "wasmi_core", + "wasmparser-nostd", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stellar-strkey" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12d2bf45e114117ea91d820a846fd1afbe3ba7d717988fee094ce8227a3bf8bd" +dependencies = [ + "base32", + "crate-git-revision", + "thiserror", +] + +[[package]] +name = "stellar-xdr" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e59cdf3eb4467fb5a4b00b52e7de6dca72f67fac6f9b700f55c95a5d86f09c9d" +dependencies = [ + "arbitrary", + "base64 0.13.1", + "crate-git-revision", + "escape-bytes", + "hex", + "serde", + "serde_with", + "stellar-strkey", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" + +[[package]] +name = "wasmi_arena" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" + +[[package]] +name = "wasmi_core" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" +dependencies = [ + "downcast-rs", + "libm", + "num-traits", + "paste", +] + +[[package]] +name = "wasmparser" +version = "0.88.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb8cf7dd82407fe68161bedcd57fde15596f32ebf6e9b3bdbf3ae1da20e38e5e" +dependencies = [ + "indexmap 1.9.3", +] + +[[package]] +name = "wasmparser-nostd" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +dependencies = [ + "indexmap-nostd", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/contract/Cargo.toml b/contract/Cargo.toml new file mode 100644 index 0000000..bd41ccc --- /dev/null +++ b/contract/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "skyhitz" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +soroban-sdk = "20.3.2" + +[dev_dependencies] +soroban-sdk = { version = "20.3.2", features = ["testutils"] } + +[features] +testutils = ["soroban-sdk/testutils"] + +[profile.release] +opt-level = "z" +overflow-checks = true +debug = 0 +strip = "symbols" +debug-assertions = false +panic = "abort" +codegen-units = 1 +lto = true + +[profile.release-with-logs] +inherits = "release" +debug-assertions = true diff --git a/contract/init.sh b/contract/init.sh new file mode 100755 index 0000000..d7591b2 --- /dev/null +++ b/contract/init.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +set -e + +NETWORK="$1" + +SOROBAN_RPC_HOST="$2" + +CTR="contract-id" + +PATH=./target/bin:$PATH + +cd ./contract + +if [[ -f "./.vars/$CTR" ]]; then + echo "Found existing contract directory; already initialized." + exit 0 +fi + + +if [[ "$SOROBAN_RPC_HOST" == "" ]]; then + # If soroban-cli is called inside the soroban-preview docker container, + # it can call the stellar standalone container just using its name "stellar" + if [[ "$IS_USING_DOCKER" == "true" ]]; then + SOROBAN_RPC_HOST="http://stellar:8000" + SOROBAN_RPC_URL="$SOROBAN_RPC_HOST" + FRIENDBOT_URL="http://localhost:8000/friendbot" + elif [[ "$NETWORK" == "futurenet" ]]; then + SOROBAN_RPC_HOST="https://rpc-futurenet.stellar.org:443" + SOROBAN_RPC_URL="$SOROBAN_RPC_HOST" + FRIENDBOT_URL="https://friendbot-futurenet.stellar.org" + elif [[ "$NETWORK" == "testnet" ]]; then + SOROBAN_RPC_HOST="https://soroban-testnet.stellar.org:443" + SOROBAN_RPC_URL="$SOROBAN_RPC_HOST" + FRIENDBOT_URL="https://friendbot.stellar.org" + else + # assumes standalone on quickstart, which has the soroban/rpc path + SOROBAN_RPC_HOST="http://localhost:8000" + SOROBAN_RPC_URL="$SOROBAN_RPC_HOST/soroban/rpc" + FRIENDBOT_URL="http://localhost:8000/friendbot" + fi +else + SOROBAN_RPC_URL="$SOROBAN_RPC_HOST" +fi + +case "$1" in +standalone) + SOROBAN_NETWORK_PASSPHRASE="Standalone Network ; February 2017" + FRIENDBOT_URL="$SOROBAN_RPC_HOST/friendbot" + ;; +futurenet) + SOROBAN_NETWORK_PASSPHRASE="Test SDF Future Network ; October 2022" + FRIENDBOT_URL="https://friendbot-futurenet.stellar.org/" + ;; +testnet) + SOROBAN_NETWORK_PASSPHRASE="Test SDF Network ; September 2015" + FRIENDBOT_URL="https://friendbot.stellar.org" + ;; +*) + echo "Usage: $0 standalone|futurenet|testnet [rpc-host]" + exit 1 + ;; +esac + +echo "Using $NETWORK network" +echo " RPC URL: $SOROBAN_RPC_URL" +echo " Friendbot URL: $FRIENDBOT_URL" + +echo Add the $NETWORK network to cli client +soroban config network add \ + --rpc-url "$SOROBAN_RPC_URL" \ + --network-passphrase "$SOROBAN_NETWORK_PASSPHRASE" "$NETWORK" + +echo Add $NETWORK to .vars for use with npm scripts +mkdir -p .vars +echo $NETWORK > ./.vars/network +echo -n $SOROBAN_RPC_URL > ./.vars/rpc-url +echo -n "$SOROBAN_NETWORK_PASSPHRASE" > ./.vars/passphrase +echo $FRIENDBOT_URL > ./.vars/friendbot-url + +echo -n GD7BAZM73BXQTMRHA2JVJPE5X4AATOMOIXGA76N22JNTNMVXRQW5DR4B > ./.vars/public-key +echo -n SB6NGNDLFKMRK4XW2W5OWFMJ2LIJ5SBXJU2X5TRSPXR2UNDOXHHZNKWY > ./.vars/secret-key + +if !(soroban config identity ls | grep token-admin 2>&1 >/dev/null); then + echo Create the token-admin identity + soroban config identity generate token-admin --rpc-url "$SOROBAN_RPC_URL" --network-passphrase "$SOROBAN_NETWORK_PASSPHRASE" --network "$NETWORK" +fi +ADMIN_ADDRESS="$(soroban config identity address token-admin)" + +# This will fail if the account already exists, but it'll still be fine. +echo Fund token-admin account from friendbot +curl --silent -X POST "$FRIENDBOT_URL?addr=$ADMIN_ADDRESS" >/dev/null + +ARGS="--network $NETWORK --source token-admin" + +echo Install dependencies + +yarn + +echo Build contracts + +soroban contract build + +# echo Deploy the voting contracts +echo Deploy contract $CTR + DEPLOYED_CTR_ID="$( + soroban contract deploy $ARGS \ + --wasm ./target/wasm32-unknown-unknown/release/skyhitz.wasm + )" + echo "Contract deployed succesfully with ID: $DEPLOYED_CTR_ID" + echo -n "$DEPLOYED_CTR_ID" > .vars/$CTR + + # we do not use bindings for now but they're sometimes useful - they contain a lot of code that interacts with blockchain + # plus we may switch to using them one day + # echo Build Bindings for $CTR + soroban contract bindings typescript \ + --wasm ./target/wasm32-unknown-unknown/release/skyhitz.wasm \ + --output-dir ../node_modules/skyhitz-soroban-client \ + --network $(cat ./.vars/network) \ + --contract-id $(cat ./.vars/$CTR) \ + --overwrite + +cd ../ + +echo "Change development vercel variables" +vercel env rm RPC_URL development --yes 2> /dev/null || true +vercel env rm NETWORK_PASSPHRASE development --yes 2> /dev/null || true +vercel env rm CONTRACT_ID development --yes 2> /dev/null || true +vercel env rm CONTRACT_SECRET development --yes 2> /dev/null || true +vercel env add RPC_URL development < ./contract/.vars/rpc-url +vercel env add NETWORK_PASSPHRASE development < ./contract/.vars/passphrase +vercel env add CONTRACT_ID development < ./contract/.vars/contract-id +vercel env add CONTRACT_SECRET development < ./contract/.vars/secret-key + diff --git a/contract/src/lib.rs b/contract/src/lib.rs new file mode 100644 index 0000000..387531c --- /dev/null +++ b/contract/src/lib.rs @@ -0,0 +1,134 @@ +#![no_std] + +use soroban_sdk::{contract, contractimpl, contracttype, log, symbol_short, token, Address, Env, Map, String, Symbol, Vec}; + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Offer { + mft: String, + amount: i128, + list_price: i128, +} + +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct Owner { + public_key: Address, + amount: i128, + mft: String, +} + +const OFFERS_KEY: Symbol = symbol_short!("offers"); +const OWNERS_KEY: Symbol = symbol_short!("owners"); + +fn get_xlm_address(e: &Env) -> Address { + // public xlm + // return Address::from_string(&String::from_str( + // &e, + // "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + // )); + + // testnet + return Address::from_string(&String::from_str( + &e, + "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", + )); +} + +#[contract] +pub struct MusicNFTs; + +#[contractimpl] +impl MusicNFTs { + + pub fn buy(e: Env, buyer:Address, mft: String, amount: i128) { + buyer.require_auth(); + + let offers = Self::get_offers(&e); + if let Some(offer) = offers.get(mft.clone()) { + assert!(offer.amount >= amount, "amount must less or equal to the current offer"); + + log!(&e, "Buying NFT."); + // let xlm_address = get_xlm_address(&e); + // let xlm = token::Client::new(&e, &xlm_address); + + // let total_xlm = offer.list_price * (amount / 100); + // xlm.transfer(&buyer, &e.current_contract_address(), &total_xlm); + + // let mut updated_offer = offer; + // updated_offer.amount = updated_offer.amount - amount; + + // if updated_offer.amount == 0 { + // Self::delete_offer(e.clone(), updated_offer.mft); + // } else { + // Self::update_offer(e.clone(), updated_offer); + // } + + // // record ownership + + // let res = Self::get_ownership(e.clone(), mft.clone(), buyer.clone()); + + // if res.is_some() { + // let mut owner = res.unwrap(); + // owner.amount = owner.amount + amount; + // Self::update_owner(e.clone(), owner) + // } else { + // let owner = Owner { public_key: buyer, amount: amount, mft: mft }; + // Self::update_owner(e.clone(), owner) + // } + } + + log!(&e, "Offer not found or insufficient amount."); + } + + pub fn update_offer(e: Env, new_offer: Offer) { + assert!(new_offer.amount > 0, "amount must be positive"); + assert!(new_offer.amount <= 100, "amount less than 100"); + let mut all_offers = Self::get_offers(&e); + all_offers.set(new_offer.mft.clone(), new_offer); + + e.storage().instance().set(&OFFERS_KEY, &all_offers); + } + + pub fn update_owner(e: Env, new_owner: Owner) { + assert!(new_owner.amount > 0, "amount must be positive"); + assert!(new_owner.amount <= 100, "amount less than 100"); + let mut all_owners = Self::get_owners(&e); + let mft = new_owner.mft.clone(); + let mut owners = all_owners.get(mft.clone()).unwrap_or_else(|| Map::new(&e)); + owners.set(new_owner.public_key.clone(), new_owner); + all_owners.set(mft, owners); + + e.storage().instance().set(&OWNERS_KEY, &all_owners); + } + + pub fn get_ownership(e: Env, mft: String, owner: Address) -> Option{ + let all_mfts_owners = Self::get_owners(&e); + let owners = all_mfts_owners.get(mft.clone()).unwrap_or_else(|| Map::new(&e)); + return owners.get(owner.clone()); + } + + pub fn update_offers(e: Env, offers: Vec) { + // Bulk update logic + for offer in offers.into_iter() { + Self::update_offer(e.clone(), offer); + } + } + + pub fn delete_offer(e: Env, mft: String){ + let mut all_offers: Map = Self::get_offers(&e); + + all_offers.remove(mft); + + e.storage().instance().set(&OFFERS_KEY, &all_offers); + } + + pub fn get_offers(e: &Env) -> Map { + e.storage().instance().get(&OFFERS_KEY).unwrap_or_else(|| Map::new(e)) + } + + pub fn get_owners(e: &Env) -> Map> { + e.storage().instance().get(&OWNERS_KEY).unwrap_or_else(|| Map::new(e)) + } +} + diff --git a/package.json b/package.json index aee2e4f..334741c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "dev": "NODE_ENV=development node -r ts-node/register -r tsconfig-paths/register --inspect ./src/graphql/server.ts", "prod": "NODE_ENV=production node -r ts-node/register -r tsconfig-paths/register --inspect ./src/graphql/server.ts", "ci": "tsc --noEmit && tslint --test src && prettier --check src", - "stellar:check-test-account": "node -r ts-node/register ./src/testing/verify-stellar-test-account.ts" + "stellar:check-test-account": "node -r ts-node/register ./src/testing/verify-stellar-test-account.ts", + "setup:contract:testnet": "./contract/init.sh ${NETWORK:-testnet}" }, "dependencies": { "@apollo/server": "^4.2.0", @@ -31,6 +32,7 @@ "express": "^4.18.2", "express-jwt": "^7.7.7", "graphql": "^16.6.0", + "graphql-type-json": "^0.3.2", "jsonwebtoken": "^8.5.1", "memory-cache": "^0.2.0", "sha.js": "^2.4.11", diff --git a/src/config/config.interface.ts b/src/config/config.interface.ts index 500fcfd..8b117d4 100644 --- a/src/config/config.interface.ts +++ b/src/config/config.interface.ts @@ -9,7 +9,6 @@ export interface IConfig { ALGOLIA_ADMIN_API_KEY: string; SENDGRID_API_KEY: string; UNIVERSAL_LINK_SCHEME: string; - NFT_STORAGE_API_KEY: string; STELLAR_NETWORK: string; PINATA_JWT: string; AUDIBLE_SECRET: string; diff --git a/src/config/index.ts b/src/config/index.ts index 59094a2..d52f863 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -15,7 +15,6 @@ export const Config: IConfig = { ALGOLIA_ADMIN_API_KEY: process.env.ALGOLIA_ADMIN_API_KEY || '', SENDGRID_API_KEY: process.env.SENDGRID_API_KEY || '', UNIVERSAL_LINK_SCHEME: process.env.UNIVERSAL_LINK_SCHEME || '', - NFT_STORAGE_API_KEY: process.env.NFT_STORAGE_API_KEY || '', STELLAR_NETWORK: process.env.STELLAR_NETWORK || 'testnet', PINATA_JWT: process.env.PINATA_JWT || '', AUDIBLE_SECRET: diff --git a/src/graphql/call-contract.ts b/src/graphql/call-contract.ts new file mode 100644 index 0000000..fb76325 --- /dev/null +++ b/src/graphql/call-contract.ts @@ -0,0 +1,207 @@ +import { + Address, + Keypair, + Operation, + StrKey, + Transaction, + hash, + nativeToScVal, + xdr, +} from 'stellar-base'; + +import { Contract, networks, Offer, Wallet } from 'skyhitz-soroban-client'; +// import { getAuthenticatedUser } from '../auth/logic'; +import { User } from 'src/util/types'; +// import { decrypt } from 'src/util/encryption'; + +const pk = 'GD7BAZM73BXQTMRHA2JVJPE5X4AATOMOIXGA76N22JNTNMVXRQW5DR4B'; + +const sourceKeys = Keypair.fromSecret( + 'SB6NGNDLFKMRK4XW2W5OWFMJ2LIJ5SBXJU2X5TRSPXR2UNDOXHHZNKWY' +); + +const customWallet: Wallet = { + isConnected: async () => await true, + isAllowed: async () => await true, + getUserInfo: async () => + await { + publicKey: pk, + }, + signTransaction: async (tx: string, opts) => { + const txFromXDR = new Transaction(tx, opts.networkPassphrase); + + txFromXDR.sign(sourceKeys); + + return txFromXDR.toXDR(); + }, + signAuthEntry: async (entryXdr, opts) => { + console.log('entry xdr', entryXdr); + console.log('options', opts); + return (await sourceKeys.sign( + hash(Buffer.from(entryXdr, 'base64')) + )) as any; + }, +}; + +const skyhitz = new Contract({ + ...networks.testnet, + rpcUrl: 'https://soroban-testnet.stellar.org', // from https://soroban.stellar.org/docs/reference/rpc-list#sdf-futurenet-and-testnet-only + wallet: customWallet, +}); + +// const new_offer: Offer = { +// amount: BigInt(100), +// list_price: BigInt(1500), +// mft: 'bafkreihwofyg6w6gvm5inzvsjoxyxwooafryhkhvsaoozla6hc2b43v56e', +// }; + +const new_offer: Offer = { + amount: BigInt(90), + list_price: BigInt(200), + mft: 'bafkreihbc4nxtgvpltswmxovhj23vydtccudflhah3azlszjomnmvgpp4a', +}; + +const addOffer = async () => { + const tx = await skyhitz.updateOffer({ new_offer }); + const res = await tx.signAndSend(); + return res.getTransactionResponse; +}; + +const getOffers = async () => { + const tx = await skyhitz.getOffers(); + return tx.result; +}; + +const buy = async (mftHash: string, user?: User) => { + // const buyerKeys = Keypair.fromSecret(decrypt(user.seed)); + + // GBZP6P7QNKI342HNDUWXG5TE6DPIRIJBMERMZY5VCVHKVI67TJAYSK2C + const buyerKeys = Keypair.fromSecret( + 'SC5FF7SJOUA3XVCSPIXEG6L2ORFHQ6BTVJBJH345W2GRSACKYIUXUDUP' + ); + + // get mft issuer with our logic + const tx = await skyhitz.buy({ + buyer: buyerKeys.publicKey(), + mft: mftHash, + amount: BigInt(10), + }); + + console.log(await tx.needsNonInvokerSigningBy()); + + const rawInvokeHostFunctionOp = tx.raw + .operations[0] as Operation.InvokeHostFunction; + + const authEntries = rawInvokeHostFunctionOp.auth ?? []; + + for (const [i, entry] of authEntries.entries()) { + if ( + entry.credentials().switch().name !== + xdr.SorobanCredentialsType.sorobanCredentialsAddress().name + ) { + // if the invoker/source account, then the entry doesn't need explicit + // signature, since the tx envelope is already signed by the source + // account, so only check for sorobanCredentialsAddress + continue; + } + const pk = StrKey.encodeEd25519PublicKey( + entry.credentials().address().address().accountId().ed25519() + ); + + console.log('pk', pk); + console.log('buyer public key', buyerKeys.publicKey()); + + // this auth entry needs to be signed by a different account + // (or maybe already was!) + if (pk !== buyerKeys.publicKey()) continue; + + const validUntilLedgerSeq = await tx.getStorageExpiration(); + + const addrAuth = entry.credentials().address(); + addrAuth.signatureExpirationLedger(validUntilLedgerSeq); + + const networkId = hash(Buffer.from(tx.options.networkPassphrase)); + const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization({ + networkId, + nonce: addrAuth.nonce(), + invocation: entry.rootInvocation(), + signatureExpirationLedger: addrAuth.signatureExpirationLedger(), + }) + ); + + console.log(JSON.stringify(preimage)); + + // this breaks: preimage.toXDR(), XDR Write Error: 2290679041439903971 is not a Hyper, where the number is coming from addrAuth.nonce(); + + // const payload = hash(preimage.toXDR()); + + const signature = buyerKeys.sign(hash(preimage.toXDR())); + + // const signature = Buffer.from(buyerKeys.sign(payload)); + + const publicKey = Address.fromScAddress(addrAuth.address()).toString(); + + // if (!Keypair.fromPublicKey(publicKey).verify(payload, signature)) { + // throw new Error(`signature doesn't match payload`); + // } + + // This structure is defined here: + // https://soroban.stellar.org/docs/fundamentals-and-concepts/invoking-contracts-with-transactions#stellar-account-signatures + // + // Encoding a contract structure as an ScVal means the map keys are supposed + // to be symbols, hence the forced typing here. + const sigScVal = nativeToScVal( + { + public_key: StrKey.decodeEd25519PublicKey(publicKey), + signature, + }, + { + type: { + public_key: ['symbol', null], + signature: ['symbol', null], + }, + } + ); + + addrAuth.signature(xdr.ScVal.scvVec([sigScVal])); + + authEntries[i] = entry; + + console.log('auth entries', authEntries); + } + + const res = await tx.signAndSend(); + + console.log('result', res.getTransactionResponse); + + return res.getTransactionResponse; +}; + +const deleteOffer = async (mftHash: string) => { + const tx = await skyhitz.deleteOffer({ mft: mftHash }); + const res = await tx.signAndSend(); + return res.getTransactionResponse; +}; + +export const callContract = async (_: any, args: any, ctx: any) => { + // const user = await getAuthenticatedUser(ctx); + + const { fn, mftHash } = args; + + switch (fn) { + case 'updateOffer': + return addOffer(); + + case 'deleteOffer': + return deleteOffer(mftHash); + + case 'getOffers': + return getOffers(); + + case 'buy': + return buy(mftHash); + } + + return {}; +}; diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts index 5bb46a9..302a518 100644 --- a/src/graphql/resolvers.ts +++ b/src/graphql/resolvers.ts @@ -1,3 +1,5 @@ +import GraphQLJSON from 'graphql-type-json'; + import { requestTokenResolver } from './request-token'; import { signInWithTokenResolver } from './sign-in-with-token'; import { userCreditsResolver } from './user-credits'; @@ -29,6 +31,7 @@ import { bids } from './bids'; import { acceptBidResolver } from './accept-bid'; import { pinAssetUrlResolver } from './pin-asset-url'; import { decentralizeEntryResolver } from './decentralize-entry'; +import { callContract } from './call-contract'; const Query = { authenticatedUser: authenticatedUserResolver, @@ -42,6 +45,7 @@ const Query = { xlmPrice: XLMPriceResolver, getIssuer: getIssuerResolver, getAudibleToken: getAudibleTokenResolver, + callContract: callContract, }; const Mutation = { @@ -70,4 +74,5 @@ const Mutation = { export const resolvers = { Query, Mutation, + JSON: GraphQLJSON, }; diff --git a/src/graphql/schema.ts b/src/graphql/schema.ts index 1c1b0d1..00bb411 100644 --- a/src/graphql/schema.ts +++ b/src/graphql/schema.ts @@ -1,4 +1,6 @@ export const Schema = ` +scalar JSON + type Query { authenticatedUser: User! bids(assetCode: String!, assetIssuer: String!): [Offer!]! @@ -11,6 +13,7 @@ type Query { xlmPrice: String! getIssuer(cid: String!): String! getAudibleToken: Token! + callContract(fn: String!, mftHash: String): JSON } type Mutation { diff --git a/src/graphql/server.ts b/src/graphql/server.ts index 89129b1..734a4a4 100644 --- a/src/graphql/server.ts +++ b/src/graphql/server.ts @@ -109,6 +109,12 @@ startGraphqlServer(); export default graphQLServer; +// graphql does not know how to serialize big ints +(BigInt.prototype as any).toJSON = function () { + const int = Number.parseInt(this.toString()); + return int ?? this.toString(); +}; + if (Config.ENV === 'development') { graphQLServer.listen(4000); } diff --git a/tsconfig.json b/tsconfig.json index 293daca..5889c61 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,10 @@ "typeRoots": ["./node_modules/@types/**/*.d.ts"], "baseUrl": ".", "paths": { - "src/*": ["./src/*"] + "src/*": ["./src/*"], + "skyhitz-soroban-client/*": [ + "./contract/node_modules/skyhitz-soroban-client/*" + ] } } } diff --git a/yarn.lock b/yarn.lock index 7c1ffb5..efc4da8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1478,6 +1478,11 @@ glob@^7.1.1, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +graphql-type-json@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" + integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== + graphql@*, graphql@^16.6.0: version "16.6.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" From ac94c7b292ccbb32e2658c056cede6b24365d08a Mon Sep 17 00:00:00 2001 From: Alejo Mendoza Date: Thu, 28 Mar 2024 11:26:31 -0500 Subject: [PATCH 2/3] pause soroban work --- contract-client/.gitignore | 2 + contract-client/README.md | 54 ++ contract-client/dist/cjs/assembled-tx.d.ts | 184 +++++ contract-client/dist/cjs/assembled-tx.js | 462 ++++++++++++ contract-client/dist/cjs/index.d.ts | 128 ++++ contract-client/dist/cjs/index.js | 141 ++++ contract-client/dist/cjs/method-options.d.ts | 47 ++ contract-client/dist/cjs/method-options.js | 4 + contract-client/dist/esm/assembled-tx.d.ts | 184 +++++ contract-client/dist/esm/assembled-tx.js | 450 ++++++++++++ contract-client/dist/esm/index.d.ts | 128 ++++ contract-client/dist/esm/index.js | 123 ++++ contract-client/dist/esm/method-options.d.ts | 47 ++ contract-client/dist/esm/method-options.js | 3 + contract-client/dist/esm/package.json | 1 + contract-client/dist/types/assembled-tx.d.ts | 184 +++++ contract-client/dist/types/index.d.ts | 155 ++++ .../dist/types/method-options.d.ts | 47 ++ contract-client/package-lock.json | 328 +++++++++ contract-client/package.json | 20 + contract-client/scripts/build.mjs | 37 + contract-client/scripts/tsconfig.cjs.json | 7 + contract-client/scripts/tsconfig.esm.json | 7 + contract-client/scripts/tsconfig.types.json | 8 + contract-client/src/assembled-tx.ts | 664 ++++++++++++++++++ contract-client/src/index.ts | 223 ++++++ contract-client/src/method-options.ts | 50 ++ contract-client/tsconfig.json | 98 +++ contract/init.sh | 4 +- contract/src/lib.rs | 159 ++--- package.json | 4 +- src/graphql/call-contract.ts | 221 +++--- src/graphql/schema.ts | 2 +- tsconfig.json | 5 +- yarn.lock | 91 ++- 35 files changed, 4029 insertions(+), 243 deletions(-) create mode 100644 contract-client/.gitignore create mode 100644 contract-client/README.md create mode 100644 contract-client/dist/cjs/assembled-tx.d.ts create mode 100644 contract-client/dist/cjs/assembled-tx.js create mode 100644 contract-client/dist/cjs/index.d.ts create mode 100644 contract-client/dist/cjs/index.js create mode 100644 contract-client/dist/cjs/method-options.d.ts create mode 100644 contract-client/dist/cjs/method-options.js create mode 100644 contract-client/dist/esm/assembled-tx.d.ts create mode 100644 contract-client/dist/esm/assembled-tx.js create mode 100644 contract-client/dist/esm/index.d.ts create mode 100644 contract-client/dist/esm/index.js create mode 100644 contract-client/dist/esm/method-options.d.ts create mode 100644 contract-client/dist/esm/method-options.js create mode 100644 contract-client/dist/esm/package.json create mode 100644 contract-client/dist/types/assembled-tx.d.ts create mode 100644 contract-client/dist/types/index.d.ts create mode 100644 contract-client/dist/types/method-options.d.ts create mode 100644 contract-client/package-lock.json create mode 100644 contract-client/package.json create mode 100644 contract-client/scripts/build.mjs create mode 100644 contract-client/scripts/tsconfig.cjs.json create mode 100644 contract-client/scripts/tsconfig.esm.json create mode 100644 contract-client/scripts/tsconfig.types.json create mode 100644 contract-client/src/assembled-tx.ts create mode 100644 contract-client/src/index.ts create mode 100644 contract-client/src/method-options.ts create mode 100644 contract-client/tsconfig.json diff --git a/contract-client/.gitignore b/contract-client/.gitignore new file mode 100644 index 0000000..252089d --- /dev/null +++ b/contract-client/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +out/ \ No newline at end of file diff --git a/contract-client/README.md b/contract-client/README.md new file mode 100644 index 0000000..b7cef39 --- /dev/null +++ b/contract-client/README.md @@ -0,0 +1,54 @@ +# contract-client JS + +JS library for interacting with [Soroban](https://soroban.stellar.org/) smart contract `contract-client` via Soroban RPC. + +This library was automatically generated by Soroban CLI using a command similar to: + +```bash +soroban contract bindings ts \ + --rpc-url https://soroban-testnet.stellar.org:443 \ + --network-passphrase "Test SDF Network ; September 2015" \ + --contract-id CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY \ + --output-dir ./path/to/contract-client +``` + +The network passphrase and contract ID are exported from [index.ts](./src/index.ts) in the `networks` constant. If you are the one who generated this library and you know that this contract is also deployed to other networks, feel free to update `networks` with other valid options. This will help your contract consumers use this library more easily. + +# To publish or not to publish + +This library is suitable for publishing to NPM. You can publish it to NPM using the `npm publish` command. + +But you don't need to publish this library to NPM to use it. You can add it to your project's `package.json` using a file path: + +```json +"dependencies": { + "contract-client": "./path/to/this/folder" +} +``` + +However, we've actually encountered [frustration](https://github.com/stellar/soroban-example-dapp/pull/117#discussion_r1232873560) using local libraries with NPM in this way. Though it seems a bit messy, we suggest generating the library directly to your `node_modules` folder automatically after each install by using a `postinstall` script. We've had the least trouble with this approach. NPM will automatically remove what it sees as erroneous directories during the `install` step, and then regenerate them when it gets to your `postinstall` step, which will keep the library up-to-date with your contract. + +```json +"scripts": { + "postinstall": "soroban contract bindings ts --rpc-url https://soroban-testnet.stellar.org:443 --network-passphrase \"Test SDF Network ; September 2015\" --id CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY --name contract-client" +} +``` + +Obviously you need to adjust the above command based on the actual command you used to generate the library. + +# Use it + +Now that you have your library up-to-date and added to your project, you can import it in a file and see inline documentation for all of its exported methods: + +```js +import { Contract, networks } from "contract-client" + +const contract = new Contract({ + ...networks.futurenet, // for example; check which networks this library exports + rpcUrl: '...', // use your own, or find one for testing at https://soroban.stellar.org/docs/reference/rpc#public-rpc-providers +}) + +contract.| +``` + +As long as your editor is configured to show JavaScript/TypeScript documentation, you can pause your typing at that `|` to get a list of all exports and inline-documentation for each. It exports a separate [async](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function) function for each method in the smart contract, with documentation for each generated from the comments the contract's author included in the original source code. diff --git a/contract-client/dist/cjs/assembled-tx.d.ts b/contract-client/dist/cjs/assembled-tx.d.ts new file mode 100644 index 0000000..1d5e6f5 --- /dev/null +++ b/contract-client/dist/cjs/assembled-tx.d.ts @@ -0,0 +1,184 @@ +import { Account, Address, Operation, SorobanRpc, xdr } from "@stellar/stellar-sdk"; +import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; +import type { ClassOptions, MethodOptions, Wallet, XDR_BASE64 } from "./method-options.js"; +export type Tx = Transaction, Operation[]>; +export declare class ExpiredStateError extends Error { +} +export declare class NeedsMoreSignaturesError extends Error { +} +export declare class WalletDisconnectedError extends Error { +} +export declare class SendResultOnlyError extends Error { +} +export declare class SendFailedError extends Error { +} +export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { +} +type SendTx = SorobanRpc.Api.SendTransactionResponse; +type GetTx = SorobanRpc.Api.GetTransactionResponse; +export type u32 = number; +export type i32 = number; +export type u64 = bigint; +export type i64 = bigint; +export type u128 = bigint; +export type i128 = bigint; +export type u256 = bigint; +export type i256 = bigint; +export type Option = T | undefined; +export type Typepoint = bigint; +export type Duration = bigint; +export { Address }; +export interface Error_ { + message: string; +} +export interface Result { + unwrap(): T; + unwrapErr(): E; + isOk(): boolean; + isErr(): boolean; +} +export declare class Ok implements Result { + readonly value: T; + constructor(value: T); + unwrapErr(): E; + unwrap(): T; + isOk(): boolean; + isErr(): boolean; +} +export declare class Err implements Result { + readonly error: E; + constructor(error: E); + unwrapErr(): E; + unwrap(): never; + isOk(): boolean; + isErr(): boolean; +} +export declare const contractErrorPattern: RegExp; +type AssembledTransactionOptions = MethodOptions & ClassOptions & { + method: string; + args?: any[]; + parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; +}; +export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +export declare class AssembledTransaction { + options: AssembledTransactionOptions; + raw: Tx; + private simulation?; + private simulationResult?; + private simulationTransactionData?; + private server; + toJSON(): string; + static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { + tx: XDR_BASE64; + simulationResult: { + auth: XDR_BASE64[]; + retval: XDR_BASE64; + }; + simulationTransactionData: XDR_BASE64; + }): AssembledTransaction; + private constructor(); + static fromSimulation(options: AssembledTransactionOptions): Promise>; + simulate: () => Promise; + get simulationData(): { + result: SorobanRpc.Api.SimulateHostFunctionResult; + transactionData: xdr.SorobanTransactionData; + }; + get result(): T; + parseError(errorMessage: string): Err | undefined; + getWallet: () => Promise; + getPublicKey: () => Promise; + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount: () => Promise; + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend: ({ secondsToWait, force }?: { + /** + * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). + */ + secondsToWait?: number | undefined; + /** + * If `true`, sign and send the transaction even if it is a read call. + */ + force?: boolean | undefined; + }) => Promise>; + getStorageExpiration: () => Promise; + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { + /** + * Whether or not to include auth entries that have already been signed. Default: false + */ + includeAlreadySigned?: boolean | undefined; + }) => Promise; + preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries: (expiration?: number | Promise) => Promise; + get isReadCall(): boolean; + hasRealInvoker: () => Promise; +} +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +declare class SentTransaction { + options: AssembledTransactionOptions; + assembled: AssembledTransaction; + server: SorobanRpc.Server; + signed: Tx; + sendTransactionResponse?: SendTx; + sendTransactionResponseAll?: SendTx[]; + getTransactionResponse?: GetTx; + getTransactionResponseAll?: GetTx[]; + constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); + static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; + private send; + get result(): T; +} diff --git a/contract-client/dist/cjs/assembled-tx.js b/contract-client/dist/cjs/assembled-tx.js new file mode 100644 index 0000000..c60a6e5 --- /dev/null +++ b/contract-client/dist/cjs/assembled-tx.js @@ -0,0 +1,462 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AssembledTransaction = exports.NULL_ACCOUNT = exports.contractErrorPattern = exports.Err = exports.Ok = exports.Address = exports.NoUnsignedNonInvokerAuthEntriesError = exports.SendFailedError = exports.SendResultOnlyError = exports.WalletDisconnectedError = exports.NeedsMoreSignaturesError = exports.ExpiredStateError = void 0; +const stellar_sdk_1 = require("@stellar/stellar-sdk"); +Object.defineProperty(exports, "Address", { enumerable: true, get: function () { return stellar_sdk_1.Address; } }); +const buffer_1 = require("buffer"); +class ExpiredStateError extends Error { +} +exports.ExpiredStateError = ExpiredStateError; +class NeedsMoreSignaturesError extends Error { +} +exports.NeedsMoreSignaturesError = NeedsMoreSignaturesError; +class WalletDisconnectedError extends Error { +} +exports.WalletDisconnectedError = WalletDisconnectedError; +class SendResultOnlyError extends Error { +} +exports.SendResultOnlyError = SendResultOnlyError; +class SendFailedError extends Error { +} +exports.SendFailedError = SendFailedError; +class NoUnsignedNonInvokerAuthEntriesError extends Error { +} +exports.NoUnsignedNonInvokerAuthEntriesError = NoUnsignedNonInvokerAuthEntriesError; +; +; +class Ok { + value; + constructor(value) { + this.value = value; + } + unwrapErr() { + throw new Error('No error'); + } + unwrap() { + return this.value; + } + isOk() { + return true; + } + isErr() { + return !this.isOk(); + } +} +exports.Ok = Ok; +class Err { + error; + constructor(error) { + this.error = error; + } + unwrapErr() { + return this.error; + } + unwrap() { + throw new Error(this.error.message); + } + isOk() { + return false; + } + isErr() { + return !this.isOk(); + } +} +exports.Err = Err; +exports.contractErrorPattern = /Error\(Contract, #(\d+)\)/; +exports.NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +class AssembledTransaction { + options; + raw; + simulation; + simulationResult; + simulationTransactionData; + server; + toJSON() { + return JSON.stringify({ + method: this.options.method, + tx: this.raw?.toXDR(), + simulationResult: { + auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), + retval: this.simulationData.result.retval.toXDR('base64'), + }, + simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), + }); + } + static fromJSON(options, { tx, simulationResult, simulationTransactionData }) { + const txn = new AssembledTransaction(options); + txn.raw = stellar_sdk_1.TransactionBuilder.fromXDR(tx, options.networkPassphrase); + txn.simulationResult = { + auth: simulationResult.auth.map(a => stellar_sdk_1.xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), + retval: stellar_sdk_1.xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), + }; + txn.simulationTransactionData = stellar_sdk_1.xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64'); + return txn; + } + constructor(options) { + this.options = options; + this.server = new stellar_sdk_1.SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + } + static async fromSimulation(options) { + const tx = new AssembledTransaction(options); + const contract = new stellar_sdk_1.Contract(options.contractId); + tx.raw = new stellar_sdk_1.TransactionBuilder(await tx.getAccount(), { + fee: options.fee?.toString(10) ?? stellar_sdk_1.BASE_FEE, + networkPassphrase: options.networkPassphrase, + }) + .addOperation(contract.call(options.method, ...(options.args ?? []))) + .setTimeout(stellar_sdk_1.TimeoutInfinite) + .build(); + return await tx.simulate(); + } + simulate = async () => { + if (!this.raw) + throw new Error('Transaction has not yet been assembled'); + this.simulation = await this.server.simulateTransaction(this.raw); + if (stellar_sdk_1.SorobanRpc.Api.isSimulationSuccess(this.simulation)) { + this.raw = stellar_sdk_1.SorobanRpc.assembleTransaction(this.raw, this.simulation).build(); + } + return this; + }; + get simulationData() { + if (this.simulationResult && this.simulationTransactionData) { + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData, + }; + } + // else, we know we just did the simulation on this machine + const simulation = this.simulation; + if (stellar_sdk_1.SorobanRpc.Api.isSimulationError(simulation)) { + throw new Error(`Transaction simulation failed: "${simulation.error}"`); + } + if (stellar_sdk_1.SorobanRpc.Api.isSimulationRestore(simulation)) { + throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`); + } + if (!simulation.result) { + throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`); + } + // add to object for serialization & deserialization + this.simulationResult = simulation.result; + this.simulationTransactionData = simulation.transactionData.build(); + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData, + }; + } + get result() { + try { + return this.options.parseResultXdr(this.simulationData.result.retval); + } + catch (e) { + let err = this.parseError(e.toString()); + if (err) + return err; + throw e; + } + } + parseError(errorMessage) { + if (!this.options.errorTypes) + return; + const match = errorMessage.match(exports.contractErrorPattern); + if (!match) + return; + let i = parseInt(match[1], 10); + let err = this.options.errorTypes[i]; + if (err) + return new Err(err); + } + getWallet = async () => { + return this.options.wallet ?? (await Promise.resolve().then(() => require("@stellar/freighter-api"))).default; + }; + getPublicKey = async () => { + const wallet = await this.getWallet(); + if (await wallet.isConnected() && await wallet.isAllowed()) { + return (await wallet.getUserInfo()).publicKey; + } + }; + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount = async () => { + const publicKey = await this.getPublicKey(); + return publicKey + ? await this.server.getAccount(publicKey) + : new stellar_sdk_1.Account(exports.NULL_ACCOUNT, "0"); + }; + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend = async ({ secondsToWait = 10, force = false } = {}) => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated'); + } + if (!force && this.isReadCall) { + throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.'); + } + if (!await this.hasRealInvoker()) { + throw new WalletDisconnectedError('Wallet is not connected'); + } + if (this.raw.source !== (await this.getAccount()).accountId()) { + throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`); + } + if ((await this.needsNonInvokerSigningBy()).length) { + throw new NeedsMoreSignaturesError('Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.'); + } + return await SentTransaction.init(this.options, this, secondsToWait); + }; + getStorageExpiration = async () => { + const entryRes = await this.server.getLedgerEntries(new stellar_sdk_1.Contract(this.options.contractId).getFootprint()); + if (!entryRes.entries || + !entryRes.entries.length || + !entryRes.entries[0].liveUntilLedgerSeq) + throw new Error('failed to get ledger entry'); + return entryRes.entries[0].liveUntilLedgerSeq; + }; + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy = async ({ includeAlreadySigned = false, } = {}) => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated'); + } + // We expect that any transaction constructed by these libraries has a + // single operation, which is an InvokeHostFunction operation. The host + // function being invoked is the contract method call. + if (!("operations" in this.raw)) { + throw new Error(`Unexpected Transaction type; no operations: ${JSON.stringify(this.raw)}`); + } + const rawInvokeHostFunctionOp = this.raw + .operations[0]; + return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => entry.credentials().switch() === + stellar_sdk_1.xdr.SorobanCredentialsType.sorobanCredentialsAddress() && + (includeAlreadySigned || + entry.credentials().address().signature().switch().name === 'scvVoid')).map(entry => stellar_sdk_1.StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519())))]; + }; + preImageFor(entry, signatureExpirationLedger) { + const addrAuth = entry.credentials().address(); + return stellar_sdk_1.xdr.HashIdPreimage.envelopeTypeSorobanAuthorization(new stellar_sdk_1.xdr.HashIdPreimageSorobanAuthorization({ + networkId: (0, stellar_sdk_1.hash)(buffer_1.Buffer.from(this.options.networkPassphrase)), + nonce: addrAuth.nonce(), + invocation: entry.rootInvocation(), + signatureExpirationLedger, + })); + } + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries = async ( + /** + * When to set each auth entry to expire. Could be any number of blocks in + * the future. Can be supplied as a promise or a raw number. Default: + * contract's current `persistent` storage expiration date/ledger + * number/block. + */ + expiration = this.getStorageExpiration()) => { + if (!this.raw) + throw new Error('Transaction has not yet been assembled or simulated'); + const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy(); + if (!needsNonInvokerSigningBy) + throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?'); + const publicKey = await this.getPublicKey(); + if (!publicKey) + throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?'); + if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) + throw new Error(`No auth entries for public key "${publicKey}"`); + const wallet = await this.getWallet(); + const rawInvokeHostFunctionOp = this.raw + .operations[0]; + const authEntries = rawInvokeHostFunctionOp.auth ?? []; + for (const [i, entry] of authEntries.entries()) { + if (entry.credentials().switch() !== + stellar_sdk_1.xdr.SorobanCredentialsType.sorobanCredentialsAddress()) { + // if the invoker/source account, then the entry doesn't need explicit + // signature, since the tx envelope is already signed by the source + // account, so only check for sorobanCredentialsAddress + continue; + } + const pk = stellar_sdk_1.StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519()); + // this auth entry needs to be signed by a different account + // (or maybe already was!) + if (pk !== publicKey) + continue; + authEntries[i] = await (0, stellar_sdk_1.authorizeEntry)(entry, async (preimage) => buffer_1.Buffer.from(await wallet.signAuthEntry(preimage.toXDR('base64')), 'base64'), await expiration, this.options.networkPassphrase); + } + }; + get isReadCall() { + const authsCount = this.simulationData.result.auth.length; + const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length; + return (authsCount === 0) && (writeLength === 0); + } + hasRealInvoker = async () => { + const account = await this.getAccount(); + return account.accountId() !== exports.NULL_ACCOUNT; + }; +} +exports.AssembledTransaction = AssembledTransaction; +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +class SentTransaction { + options; + assembled; + server; + signed; + sendTransactionResponse; + sendTransactionResponseAll; + getTransactionResponse; + getTransactionResponseAll; + constructor(options, assembled) { + this.options = options; + this.assembled = assembled; + this.server = new stellar_sdk_1.SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + this.assembled = assembled; + } + static init = async (options, assembled, secondsToWait = 10) => { + const tx = new SentTransaction(options, assembled); + return await tx.send(secondsToWait); + }; + send = async (secondsToWait = 10) => { + const wallet = await this.assembled.getWallet(); + this.sendTransactionResponseAll = await withExponentialBackoff(async (previousFailure) => { + if (previousFailure) { + // Increment transaction sequence number and resimulate before trying again + // Soroban transaction can only have 1 operation + const op = this.assembled.raw.operations[0]; + this.assembled.raw = new stellar_sdk_1.TransactionBuilder(await this.assembled.getAccount(), { + fee: this.assembled.raw.fee, + networkPassphrase: this.options.networkPassphrase, + }) + .setTimeout(stellar_sdk_1.TimeoutInfinite) + .addOperation(stellar_sdk_1.Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] })) + .build(); + await this.assembled.simulate(); + } + const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { + networkPassphrase: this.options.networkPassphrase, + }); + this.signed = stellar_sdk_1.TransactionBuilder.fromXDR(signature, this.options.networkPassphrase); + return this.server.sendTransaction(this.signed); + }, resp => resp.status !== "PENDING", secondsToWait); + this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1]; + if (this.sendTransactionResponse.status !== "PENDING") { + throw new Error(`Tried to resubmit transaction for ${secondsToWait} seconds, but it's still failing. ` + + `All attempts: ${JSON.stringify(this.sendTransactionResponseAll, null, 2)}`); + } + const { hash } = this.sendTransactionResponse; + this.getTransactionResponseAll = await withExponentialBackoff(() => this.server.getTransaction(hash), resp => resp.status === stellar_sdk_1.SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, secondsToWait); + this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1]; + if (this.getTransactionResponse.status === stellar_sdk_1.SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { + console.error(`Waited ${secondsToWait} seconds for transaction to complete, but it did not. ` + + `Returning anyway. Check the transaction status manually. ` + + `Sent transaction: ${JSON.stringify(this.sendTransactionResponse, null, 2)}\n` + + `All attempts to get the result: ${JSON.stringify(this.getTransactionResponseAll, null, 2)}`); + } + return this; + }; + get result() { + // 1. check if transaction was submitted and awaited with `getTransaction` + if ("getTransactionResponse" in this && + this.getTransactionResponse) { + // getTransactionResponse has a `returnValue` field unless it failed + if ("returnValue" in this.getTransactionResponse) { + return this.options.parseResultXdr(this.getTransactionResponse.returnValue); + } + // if "returnValue" not present, the transaction failed; return without parsing the result + throw new Error("Transaction failed! Cannot parse result."); + } + // 2. otherwise, maybe it was merely sent with `sendTransaction` + if (this.sendTransactionResponse) { + const errorResult = this.sendTransactionResponse.errorResult?.result(); + if (errorResult) { + throw new SendFailedError(`Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}`); + } + throw new SendResultOnlyError(`Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\``); + } + // 3. finally, if neither of those are present, throw an error + throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`); + } +} +/** + * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. + * Returns an array of all attempts to call the function. + */ +async function withExponentialBackoff(fn, keepWaitingIf, secondsToWait, exponentialFactor = 1.5, verbose = false) { + const attempts = []; + let count = 0; + attempts.push(await fn()); + if (!keepWaitingIf(attempts[attempts.length - 1])) + return attempts; + const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf(); + let waitTime = 1000; + let totalWaitTime = waitTime; + while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { + count++; + // Wait a beat + if (verbose) { + console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`); + } + await new Promise(res => setTimeout(res, waitTime)); + // Exponential backoff + waitTime = waitTime * exponentialFactor; + if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { + waitTime = waitUntil - Date.now(); + if (verbose) { + console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`); + } + } + totalWaitTime = waitTime + totalWaitTime; + // Try again + attempts.push(await fn(attempts[attempts.length - 1])); + if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { + console.info(`${count}. Called ${fn}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2)}`); + } + } + return attempts; +} diff --git a/contract-client/dist/cjs/index.d.ts b/contract-client/dist/cjs/index.d.ts new file mode 100644 index 0000000..6c077b4 --- /dev/null +++ b/contract-client/dist/cjs/index.d.ts @@ -0,0 +1,128 @@ +import { ContractSpec } from '@stellar/stellar-sdk'; +import { AssembledTransaction } from './assembled-tx.js'; +import type { i128 } from './assembled-tx.js'; +import type { ClassOptions } from './method-options.js'; +export * from './assembled-tx.js'; +export * from './method-options.js'; +export declare const networks: { + readonly testnet: { + readonly networkPassphrase: "Test SDF Network ; September 2015"; + readonly contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY"; + }; +}; +/** + + */ +export type DataKey = { + tag: "Offers"; + values: readonly [string]; +}; +/** + + */ +export interface Offer { + /** + + */ + amount: i128; + /** + + */ + list_price: i128; + /** + + */ + mft: string; +} +/** + + */ +export interface Owner { + /** + + */ + amount: i128; + /** + + */ + mft: string; + /** + + */ + public_key: string; +} +/** + + */ +export declare const Errors: {}; +export declare class Contract { + readonly options: ClassOptions; + spec: ContractSpec; + constructor(options: ClassOptions); + private readonly parsers; + private txFromJSON; + readonly fromJSON: { + buy: (json: string) => AssembledTransaction; + balance: (json: string) => AssembledTransaction; + setOffer: (json: string) => AssembledTransaction; + getOffer: (json: string) => AssembledTransaction; + deleteOffer: (json: string) => AssembledTransaction; + }; + /** +* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + buy: ({ buyer, mft, amount }: { + buyer: string; + mft: string; + amount: i128; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + balance: ({ address }: { + address: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + setOffer: ({ offer }: { + offer: Offer; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + getOffer: ({ mft }: { + mft: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + deleteOffer: ({ mft }: { + mft: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; +} diff --git a/contract-client/dist/cjs/index.js b/contract-client/dist/cjs/index.js new file mode 100644 index 0000000..6d5ca79 --- /dev/null +++ b/contract-client/dist/cjs/index.js @@ -0,0 +1,141 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Contract = exports.Errors = exports.networks = void 0; +const stellar_sdk_1 = require("@stellar/stellar-sdk"); +const buffer_1 = require("buffer"); +const assembled_tx_js_1 = require("./assembled-tx.js"); +__exportStar(require("./assembled-tx.js"), exports); +__exportStar(require("./method-options.js"), exports); +if (typeof window !== 'undefined') { + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || buffer_1.Buffer; +} +exports.networks = { + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", + } +}; +/** + + */ +exports.Errors = {}; +class Contract { + options; + spec; + constructor(options) { + this.options = options; + this.spec = new stellar_sdk_1.ContractSpec([ + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", + "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", + "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", + "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", + "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", + "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", + "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", + "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" + ]); + } + parsers = { + buy: () => { }, + balance: (result) => this.spec.funcResToNative("balance", result), + setOffer: () => { }, + getOffer: (result) => this.spec.funcResToNative("get_offer", result), + deleteOffer: () => { } + }; + txFromJSON = (json) => { + const { method, ...tx } = JSON.parse(json); + return assembled_tx_js_1.AssembledTransaction.fromJSON({ + ...this.options, + method, + parseResultXdr: this.parsers[method], + }, tx); + }; + fromJSON = { + buy: (this.txFromJSON), + balance: (this.txFromJSON), + setOffer: (this.txFromJSON), + getOffer: (this.txFromJSON), + deleteOffer: (this.txFromJSON) + }; + /** +* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + buy = async ({ buyer, mft, amount }, options = {}) => { + return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ + method: 'buy', + args: this.spec.funcArgsToScVals("buy", { buyer: new stellar_sdk_1.Address(buyer), mft: new stellar_sdk_1.Address(mft), amount }), + ...options, + ...this.options, + errorTypes: exports.Errors, + parseResultXdr: this.parsers['buy'], + }); + }; + /** +* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + balance = async ({ address }, options = {}) => { + return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ + method: 'balance', + args: this.spec.funcArgsToScVals("balance", { address: new stellar_sdk_1.Address(address) }), + ...options, + ...this.options, + errorTypes: exports.Errors, + parseResultXdr: this.parsers['balance'], + }); + }; + /** +* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + setOffer = async ({ offer }, options = {}) => { + return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ + method: 'set_offer', + args: this.spec.funcArgsToScVals("set_offer", { offer }), + ...options, + ...this.options, + errorTypes: exports.Errors, + parseResultXdr: this.parsers['setOffer'], + }); + }; + /** +* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + getOffer = async ({ mft }, options = {}) => { + return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ + method: 'get_offer', + args: this.spec.funcArgsToScVals("get_offer", { mft: new stellar_sdk_1.Address(mft) }), + ...options, + ...this.options, + errorTypes: exports.Errors, + parseResultXdr: this.parsers['getOffer'], + }); + }; + /** +* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + deleteOffer = async ({ mft }, options = {}) => { + return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ + method: 'delete_offer', + args: this.spec.funcArgsToScVals("delete_offer", { mft: new stellar_sdk_1.Address(mft) }), + ...options, + ...this.options, + errorTypes: exports.Errors, + parseResultXdr: this.parsers['deleteOffer'], + }); + }; +} +exports.Contract = Contract; diff --git a/contract-client/dist/cjs/method-options.d.ts b/contract-client/dist/cjs/method-options.d.ts new file mode 100644 index 0000000..6840adb --- /dev/null +++ b/contract-client/dist/cjs/method-options.d.ts @@ -0,0 +1,47 @@ +declare let responseTypes: 'simulated' | 'full' | undefined; +export type ResponseTypes = typeof responseTypes; +export type XDR_BASE64 = string; +export interface Wallet { + isConnected: () => Promise; + isAllowed: () => Promise; + getUserInfo: () => Promise<{ + publicKey?: string; + }>; + signTransaction: (tx: XDR_BASE64, opts?: { + network?: string; + networkPassphrase?: string; + accountToSign?: string; + }) => Promise; + signAuthEntry: (entryXdr: XDR_BASE64, opts?: { + accountToSign?: string; + }) => Promise; +} +export type ClassOptions = { + contractId: string; + networkPassphrase: string; + rpcUrl: string; + errorTypes?: Record; + /** + * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: + * + * @example + * ```ts + * import freighter from "@stellar/freighter-api"; + * import { Contract } from "contract-client"; + * const contract = new Contract({ + * …, + * wallet: freighter, + * }) + * ``` + */ + wallet?: Wallet; +}; +export type MethodOptions = { + /** + * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') + */ + fee?: number; +}; +export {}; diff --git a/contract-client/dist/cjs/method-options.js b/contract-client/dist/cjs/method-options.js new file mode 100644 index 0000000..6d483ac --- /dev/null +++ b/contract-client/dist/cjs/method-options.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +// defined this way so typeahead shows full union, not named alias +let responseTypes; diff --git a/contract-client/dist/esm/assembled-tx.d.ts b/contract-client/dist/esm/assembled-tx.d.ts new file mode 100644 index 0000000..1d5e6f5 --- /dev/null +++ b/contract-client/dist/esm/assembled-tx.d.ts @@ -0,0 +1,184 @@ +import { Account, Address, Operation, SorobanRpc, xdr } from "@stellar/stellar-sdk"; +import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; +import type { ClassOptions, MethodOptions, Wallet, XDR_BASE64 } from "./method-options.js"; +export type Tx = Transaction, Operation[]>; +export declare class ExpiredStateError extends Error { +} +export declare class NeedsMoreSignaturesError extends Error { +} +export declare class WalletDisconnectedError extends Error { +} +export declare class SendResultOnlyError extends Error { +} +export declare class SendFailedError extends Error { +} +export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { +} +type SendTx = SorobanRpc.Api.SendTransactionResponse; +type GetTx = SorobanRpc.Api.GetTransactionResponse; +export type u32 = number; +export type i32 = number; +export type u64 = bigint; +export type i64 = bigint; +export type u128 = bigint; +export type i128 = bigint; +export type u256 = bigint; +export type i256 = bigint; +export type Option = T | undefined; +export type Typepoint = bigint; +export type Duration = bigint; +export { Address }; +export interface Error_ { + message: string; +} +export interface Result { + unwrap(): T; + unwrapErr(): E; + isOk(): boolean; + isErr(): boolean; +} +export declare class Ok implements Result { + readonly value: T; + constructor(value: T); + unwrapErr(): E; + unwrap(): T; + isOk(): boolean; + isErr(): boolean; +} +export declare class Err implements Result { + readonly error: E; + constructor(error: E); + unwrapErr(): E; + unwrap(): never; + isOk(): boolean; + isErr(): boolean; +} +export declare const contractErrorPattern: RegExp; +type AssembledTransactionOptions = MethodOptions & ClassOptions & { + method: string; + args?: any[]; + parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; +}; +export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +export declare class AssembledTransaction { + options: AssembledTransactionOptions; + raw: Tx; + private simulation?; + private simulationResult?; + private simulationTransactionData?; + private server; + toJSON(): string; + static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { + tx: XDR_BASE64; + simulationResult: { + auth: XDR_BASE64[]; + retval: XDR_BASE64; + }; + simulationTransactionData: XDR_BASE64; + }): AssembledTransaction; + private constructor(); + static fromSimulation(options: AssembledTransactionOptions): Promise>; + simulate: () => Promise; + get simulationData(): { + result: SorobanRpc.Api.SimulateHostFunctionResult; + transactionData: xdr.SorobanTransactionData; + }; + get result(): T; + parseError(errorMessage: string): Err | undefined; + getWallet: () => Promise; + getPublicKey: () => Promise; + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount: () => Promise; + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend: ({ secondsToWait, force }?: { + /** + * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). + */ + secondsToWait?: number | undefined; + /** + * If `true`, sign and send the transaction even if it is a read call. + */ + force?: boolean | undefined; + }) => Promise>; + getStorageExpiration: () => Promise; + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { + /** + * Whether or not to include auth entries that have already been signed. Default: false + */ + includeAlreadySigned?: boolean | undefined; + }) => Promise; + preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries: (expiration?: number | Promise) => Promise; + get isReadCall(): boolean; + hasRealInvoker: () => Promise; +} +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +declare class SentTransaction { + options: AssembledTransactionOptions; + assembled: AssembledTransaction; + server: SorobanRpc.Server; + signed: Tx; + sendTransactionResponse?: SendTx; + sendTransactionResponseAll?: SendTx[]; + getTransactionResponse?: GetTx; + getTransactionResponseAll?: GetTx[]; + constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); + static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; + private send; + get result(): T; +} diff --git a/contract-client/dist/esm/assembled-tx.js b/contract-client/dist/esm/assembled-tx.js new file mode 100644 index 0000000..79b7c01 --- /dev/null +++ b/contract-client/dist/esm/assembled-tx.js @@ -0,0 +1,450 @@ +import { Account, Address, Contract, Operation, SorobanRpc, StrKey, TimeoutInfinite, TransactionBuilder, authorizeEntry, hash, xdr, BASE_FEE, } from "@stellar/stellar-sdk"; +import { Buffer } from "buffer"; +export class ExpiredStateError extends Error { +} +export class NeedsMoreSignaturesError extends Error { +} +export class WalletDisconnectedError extends Error { +} +export class SendResultOnlyError extends Error { +} +export class SendFailedError extends Error { +} +export class NoUnsignedNonInvokerAuthEntriesError extends Error { +} +export { Address }; +; +; +export class Ok { + value; + constructor(value) { + this.value = value; + } + unwrapErr() { + throw new Error('No error'); + } + unwrap() { + return this.value; + } + isOk() { + return true; + } + isErr() { + return !this.isOk(); + } +} +export class Err { + error; + constructor(error) { + this.error = error; + } + unwrapErr() { + return this.error; + } + unwrap() { + throw new Error(this.error.message); + } + isOk() { + return false; + } + isErr() { + return !this.isOk(); + } +} +export const contractErrorPattern = /Error\(Contract, #(\d+)\)/; +export const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +export class AssembledTransaction { + options; + raw; + simulation; + simulationResult; + simulationTransactionData; + server; + toJSON() { + return JSON.stringify({ + method: this.options.method, + tx: this.raw?.toXDR(), + simulationResult: { + auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), + retval: this.simulationData.result.retval.toXDR('base64'), + }, + simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), + }); + } + static fromJSON(options, { tx, simulationResult, simulationTransactionData }) { + const txn = new AssembledTransaction(options); + txn.raw = TransactionBuilder.fromXDR(tx, options.networkPassphrase); + txn.simulationResult = { + auth: simulationResult.auth.map(a => xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), + retval: xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), + }; + txn.simulationTransactionData = xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64'); + return txn; + } + constructor(options) { + this.options = options; + this.server = new SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + } + static async fromSimulation(options) { + const tx = new AssembledTransaction(options); + const contract = new Contract(options.contractId); + tx.raw = new TransactionBuilder(await tx.getAccount(), { + fee: options.fee?.toString(10) ?? BASE_FEE, + networkPassphrase: options.networkPassphrase, + }) + .addOperation(contract.call(options.method, ...(options.args ?? []))) + .setTimeout(TimeoutInfinite) + .build(); + return await tx.simulate(); + } + simulate = async () => { + if (!this.raw) + throw new Error('Transaction has not yet been assembled'); + this.simulation = await this.server.simulateTransaction(this.raw); + if (SorobanRpc.Api.isSimulationSuccess(this.simulation)) { + this.raw = SorobanRpc.assembleTransaction(this.raw, this.simulation).build(); + } + return this; + }; + get simulationData() { + if (this.simulationResult && this.simulationTransactionData) { + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData, + }; + } + // else, we know we just did the simulation on this machine + const simulation = this.simulation; + if (SorobanRpc.Api.isSimulationError(simulation)) { + throw new Error(`Transaction simulation failed: "${simulation.error}"`); + } + if (SorobanRpc.Api.isSimulationRestore(simulation)) { + throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`); + } + if (!simulation.result) { + throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`); + } + // add to object for serialization & deserialization + this.simulationResult = simulation.result; + this.simulationTransactionData = simulation.transactionData.build(); + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData, + }; + } + get result() { + try { + return this.options.parseResultXdr(this.simulationData.result.retval); + } + catch (e) { + let err = this.parseError(e.toString()); + if (err) + return err; + throw e; + } + } + parseError(errorMessage) { + if (!this.options.errorTypes) + return; + const match = errorMessage.match(contractErrorPattern); + if (!match) + return; + let i = parseInt(match[1], 10); + let err = this.options.errorTypes[i]; + if (err) + return new Err(err); + } + getWallet = async () => { + return this.options.wallet ?? (await import("@stellar/freighter-api")).default; + }; + getPublicKey = async () => { + const wallet = await this.getWallet(); + if (await wallet.isConnected() && await wallet.isAllowed()) { + return (await wallet.getUserInfo()).publicKey; + } + }; + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount = async () => { + const publicKey = await this.getPublicKey(); + return publicKey + ? await this.server.getAccount(publicKey) + : new Account(NULL_ACCOUNT, "0"); + }; + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend = async ({ secondsToWait = 10, force = false } = {}) => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated'); + } + if (!force && this.isReadCall) { + throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.'); + } + if (!await this.hasRealInvoker()) { + throw new WalletDisconnectedError('Wallet is not connected'); + } + if (this.raw.source !== (await this.getAccount()).accountId()) { + throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`); + } + if ((await this.needsNonInvokerSigningBy()).length) { + throw new NeedsMoreSignaturesError('Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.'); + } + return await SentTransaction.init(this.options, this, secondsToWait); + }; + getStorageExpiration = async () => { + const entryRes = await this.server.getLedgerEntries(new Contract(this.options.contractId).getFootprint()); + if (!entryRes.entries || + !entryRes.entries.length || + !entryRes.entries[0].liveUntilLedgerSeq) + throw new Error('failed to get ledger entry'); + return entryRes.entries[0].liveUntilLedgerSeq; + }; + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy = async ({ includeAlreadySigned = false, } = {}) => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated'); + } + // We expect that any transaction constructed by these libraries has a + // single operation, which is an InvokeHostFunction operation. The host + // function being invoked is the contract method call. + if (!("operations" in this.raw)) { + throw new Error(`Unexpected Transaction type; no operations: ${JSON.stringify(this.raw)}`); + } + const rawInvokeHostFunctionOp = this.raw + .operations[0]; + return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => entry.credentials().switch() === + xdr.SorobanCredentialsType.sorobanCredentialsAddress() && + (includeAlreadySigned || + entry.credentials().address().signature().switch().name === 'scvVoid')).map(entry => StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519())))]; + }; + preImageFor(entry, signatureExpirationLedger) { + const addrAuth = entry.credentials().address(); + return xdr.HashIdPreimage.envelopeTypeSorobanAuthorization(new xdr.HashIdPreimageSorobanAuthorization({ + networkId: hash(Buffer.from(this.options.networkPassphrase)), + nonce: addrAuth.nonce(), + invocation: entry.rootInvocation(), + signatureExpirationLedger, + })); + } + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries = async ( + /** + * When to set each auth entry to expire. Could be any number of blocks in + * the future. Can be supplied as a promise or a raw number. Default: + * contract's current `persistent` storage expiration date/ledger + * number/block. + */ + expiration = this.getStorageExpiration()) => { + if (!this.raw) + throw new Error('Transaction has not yet been assembled or simulated'); + const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy(); + if (!needsNonInvokerSigningBy) + throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?'); + const publicKey = await this.getPublicKey(); + if (!publicKey) + throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?'); + if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) + throw new Error(`No auth entries for public key "${publicKey}"`); + const wallet = await this.getWallet(); + const rawInvokeHostFunctionOp = this.raw + .operations[0]; + const authEntries = rawInvokeHostFunctionOp.auth ?? []; + for (const [i, entry] of authEntries.entries()) { + if (entry.credentials().switch() !== + xdr.SorobanCredentialsType.sorobanCredentialsAddress()) { + // if the invoker/source account, then the entry doesn't need explicit + // signature, since the tx envelope is already signed by the source + // account, so only check for sorobanCredentialsAddress + continue; + } + const pk = StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519()); + // this auth entry needs to be signed by a different account + // (or maybe already was!) + if (pk !== publicKey) + continue; + authEntries[i] = await authorizeEntry(entry, async (preimage) => Buffer.from(await wallet.signAuthEntry(preimage.toXDR('base64')), 'base64'), await expiration, this.options.networkPassphrase); + } + }; + get isReadCall() { + const authsCount = this.simulationData.result.auth.length; + const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length; + return (authsCount === 0) && (writeLength === 0); + } + hasRealInvoker = async () => { + const account = await this.getAccount(); + return account.accountId() !== NULL_ACCOUNT; + }; +} +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +class SentTransaction { + options; + assembled; + server; + signed; + sendTransactionResponse; + sendTransactionResponseAll; + getTransactionResponse; + getTransactionResponseAll; + constructor(options, assembled) { + this.options = options; + this.assembled = assembled; + this.server = new SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + this.assembled = assembled; + } + static init = async (options, assembled, secondsToWait = 10) => { + const tx = new SentTransaction(options, assembled); + return await tx.send(secondsToWait); + }; + send = async (secondsToWait = 10) => { + const wallet = await this.assembled.getWallet(); + this.sendTransactionResponseAll = await withExponentialBackoff(async (previousFailure) => { + if (previousFailure) { + // Increment transaction sequence number and resimulate before trying again + // Soroban transaction can only have 1 operation + const op = this.assembled.raw.operations[0]; + this.assembled.raw = new TransactionBuilder(await this.assembled.getAccount(), { + fee: this.assembled.raw.fee, + networkPassphrase: this.options.networkPassphrase, + }) + .setTimeout(TimeoutInfinite) + .addOperation(Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] })) + .build(); + await this.assembled.simulate(); + } + const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { + networkPassphrase: this.options.networkPassphrase, + }); + this.signed = TransactionBuilder.fromXDR(signature, this.options.networkPassphrase); + return this.server.sendTransaction(this.signed); + }, resp => resp.status !== "PENDING", secondsToWait); + this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1]; + if (this.sendTransactionResponse.status !== "PENDING") { + throw new Error(`Tried to resubmit transaction for ${secondsToWait} seconds, but it's still failing. ` + + `All attempts: ${JSON.stringify(this.sendTransactionResponseAll, null, 2)}`); + } + const { hash } = this.sendTransactionResponse; + this.getTransactionResponseAll = await withExponentialBackoff(() => this.server.getTransaction(hash), resp => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, secondsToWait); + this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1]; + if (this.getTransactionResponse.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { + console.error(`Waited ${secondsToWait} seconds for transaction to complete, but it did not. ` + + `Returning anyway. Check the transaction status manually. ` + + `Sent transaction: ${JSON.stringify(this.sendTransactionResponse, null, 2)}\n` + + `All attempts to get the result: ${JSON.stringify(this.getTransactionResponseAll, null, 2)}`); + } + return this; + }; + get result() { + // 1. check if transaction was submitted and awaited with `getTransaction` + if ("getTransactionResponse" in this && + this.getTransactionResponse) { + // getTransactionResponse has a `returnValue` field unless it failed + if ("returnValue" in this.getTransactionResponse) { + return this.options.parseResultXdr(this.getTransactionResponse.returnValue); + } + // if "returnValue" not present, the transaction failed; return without parsing the result + throw new Error("Transaction failed! Cannot parse result."); + } + // 2. otherwise, maybe it was merely sent with `sendTransaction` + if (this.sendTransactionResponse) { + const errorResult = this.sendTransactionResponse.errorResult?.result(); + if (errorResult) { + throw new SendFailedError(`Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}`); + } + throw new SendResultOnlyError(`Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\``); + } + // 3. finally, if neither of those are present, throw an error + throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`); + } +} +/** + * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. + * Returns an array of all attempts to call the function. + */ +async function withExponentialBackoff(fn, keepWaitingIf, secondsToWait, exponentialFactor = 1.5, verbose = false) { + const attempts = []; + let count = 0; + attempts.push(await fn()); + if (!keepWaitingIf(attempts[attempts.length - 1])) + return attempts; + const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf(); + let waitTime = 1000; + let totalWaitTime = waitTime; + while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { + count++; + // Wait a beat + if (verbose) { + console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`); + } + await new Promise(res => setTimeout(res, waitTime)); + // Exponential backoff + waitTime = waitTime * exponentialFactor; + if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { + waitTime = waitUntil - Date.now(); + if (verbose) { + console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`); + } + } + totalWaitTime = waitTime + totalWaitTime; + // Try again + attempts.push(await fn(attempts[attempts.length - 1])); + if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { + console.info(`${count}. Called ${fn}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2)}`); + } + } + return attempts; +} diff --git a/contract-client/dist/esm/index.d.ts b/contract-client/dist/esm/index.d.ts new file mode 100644 index 0000000..6c077b4 --- /dev/null +++ b/contract-client/dist/esm/index.d.ts @@ -0,0 +1,128 @@ +import { ContractSpec } from '@stellar/stellar-sdk'; +import { AssembledTransaction } from './assembled-tx.js'; +import type { i128 } from './assembled-tx.js'; +import type { ClassOptions } from './method-options.js'; +export * from './assembled-tx.js'; +export * from './method-options.js'; +export declare const networks: { + readonly testnet: { + readonly networkPassphrase: "Test SDF Network ; September 2015"; + readonly contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY"; + }; +}; +/** + + */ +export type DataKey = { + tag: "Offers"; + values: readonly [string]; +}; +/** + + */ +export interface Offer { + /** + + */ + amount: i128; + /** + + */ + list_price: i128; + /** + + */ + mft: string; +} +/** + + */ +export interface Owner { + /** + + */ + amount: i128; + /** + + */ + mft: string; + /** + + */ + public_key: string; +} +/** + + */ +export declare const Errors: {}; +export declare class Contract { + readonly options: ClassOptions; + spec: ContractSpec; + constructor(options: ClassOptions); + private readonly parsers; + private txFromJSON; + readonly fromJSON: { + buy: (json: string) => AssembledTransaction; + balance: (json: string) => AssembledTransaction; + setOffer: (json: string) => AssembledTransaction; + getOffer: (json: string) => AssembledTransaction; + deleteOffer: (json: string) => AssembledTransaction; + }; + /** +* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + buy: ({ buyer, mft, amount }: { + buyer: string; + mft: string; + amount: i128; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + balance: ({ address }: { + address: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + setOffer: ({ offer }: { + offer: Offer; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + getOffer: ({ mft }: { + mft: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; + /** +* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + deleteOffer: ({ mft }: { + mft: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + }) => Promise>; +} diff --git a/contract-client/dist/esm/index.js b/contract-client/dist/esm/index.js new file mode 100644 index 0000000..c73213c --- /dev/null +++ b/contract-client/dist/esm/index.js @@ -0,0 +1,123 @@ +import { ContractSpec, Address } from '@stellar/stellar-sdk'; +import { Buffer } from "buffer"; +import { AssembledTransaction } from './assembled-tx.js'; +export * from './assembled-tx.js'; +export * from './method-options.js'; +if (typeof window !== 'undefined') { + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || Buffer; +} +export const networks = { + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", + } +}; +/** + + */ +export const Errors = {}; +export class Contract { + options; + spec; + constructor(options) { + this.options = options; + this.spec = new ContractSpec([ + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", + "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", + "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", + "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", + "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", + "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", + "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", + "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" + ]); + } + parsers = { + buy: () => { }, + balance: (result) => this.spec.funcResToNative("balance", result), + setOffer: () => { }, + getOffer: (result) => this.spec.funcResToNative("get_offer", result), + deleteOffer: () => { } + }; + txFromJSON = (json) => { + const { method, ...tx } = JSON.parse(json); + return AssembledTransaction.fromJSON({ + ...this.options, + method, + parseResultXdr: this.parsers[method], + }, tx); + }; + fromJSON = { + buy: (this.txFromJSON), + balance: (this.txFromJSON), + setOffer: (this.txFromJSON), + getOffer: (this.txFromJSON), + deleteOffer: (this.txFromJSON) + }; + /** +* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + buy = async ({ buyer, mft, amount }, options = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'buy', + args: this.spec.funcArgsToScVals("buy", { buyer: new Address(buyer), mft: new Address(mft), amount }), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['buy'], + }); + }; + /** +* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + balance = async ({ address }, options = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'balance', + args: this.spec.funcArgsToScVals("balance", { address: new Address(address) }), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['balance'], + }); + }; + /** +* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + setOffer = async ({ offer }, options = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'set_offer', + args: this.spec.funcArgsToScVals("set_offer", { offer }), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['setOffer'], + }); + }; + /** +* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + getOffer = async ({ mft }, options = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'get_offer', + args: this.spec.funcArgsToScVals("get_offer", { mft: new Address(mft) }), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['getOffer'], + }); + }; + /** +* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. +*/ + deleteOffer = async ({ mft }, options = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'delete_offer', + args: this.spec.funcArgsToScVals("delete_offer", { mft: new Address(mft) }), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['deleteOffer'], + }); + }; +} diff --git a/contract-client/dist/esm/method-options.d.ts b/contract-client/dist/esm/method-options.d.ts new file mode 100644 index 0000000..6840adb --- /dev/null +++ b/contract-client/dist/esm/method-options.d.ts @@ -0,0 +1,47 @@ +declare let responseTypes: 'simulated' | 'full' | undefined; +export type ResponseTypes = typeof responseTypes; +export type XDR_BASE64 = string; +export interface Wallet { + isConnected: () => Promise; + isAllowed: () => Promise; + getUserInfo: () => Promise<{ + publicKey?: string; + }>; + signTransaction: (tx: XDR_BASE64, opts?: { + network?: string; + networkPassphrase?: string; + accountToSign?: string; + }) => Promise; + signAuthEntry: (entryXdr: XDR_BASE64, opts?: { + accountToSign?: string; + }) => Promise; +} +export type ClassOptions = { + contractId: string; + networkPassphrase: string; + rpcUrl: string; + errorTypes?: Record; + /** + * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: + * + * @example + * ```ts + * import freighter from "@stellar/freighter-api"; + * import { Contract } from "contract-client"; + * const contract = new Contract({ + * …, + * wallet: freighter, + * }) + * ``` + */ + wallet?: Wallet; +}; +export type MethodOptions = { + /** + * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') + */ + fee?: number; +}; +export {}; diff --git a/contract-client/dist/esm/method-options.js b/contract-client/dist/esm/method-options.js new file mode 100644 index 0000000..00ad9d3 --- /dev/null +++ b/contract-client/dist/esm/method-options.js @@ -0,0 +1,3 @@ +// defined this way so typeahead shows full union, not named alias +let responseTypes; +export {}; diff --git a/contract-client/dist/esm/package.json b/contract-client/dist/esm/package.json new file mode 100644 index 0000000..1632c2c --- /dev/null +++ b/contract-client/dist/esm/package.json @@ -0,0 +1 @@ +{"type": "module"} \ No newline at end of file diff --git a/contract-client/dist/types/assembled-tx.d.ts b/contract-client/dist/types/assembled-tx.d.ts new file mode 100644 index 0000000..1d5e6f5 --- /dev/null +++ b/contract-client/dist/types/assembled-tx.d.ts @@ -0,0 +1,184 @@ +import { Account, Address, Operation, SorobanRpc, xdr } from "@stellar/stellar-sdk"; +import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; +import type { ClassOptions, MethodOptions, Wallet, XDR_BASE64 } from "./method-options.js"; +export type Tx = Transaction, Operation[]>; +export declare class ExpiredStateError extends Error { +} +export declare class NeedsMoreSignaturesError extends Error { +} +export declare class WalletDisconnectedError extends Error { +} +export declare class SendResultOnlyError extends Error { +} +export declare class SendFailedError extends Error { +} +export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { +} +type SendTx = SorobanRpc.Api.SendTransactionResponse; +type GetTx = SorobanRpc.Api.GetTransactionResponse; +export type u32 = number; +export type i32 = number; +export type u64 = bigint; +export type i64 = bigint; +export type u128 = bigint; +export type i128 = bigint; +export type u256 = bigint; +export type i256 = bigint; +export type Option = T | undefined; +export type Typepoint = bigint; +export type Duration = bigint; +export { Address }; +export interface Error_ { + message: string; +} +export interface Result { + unwrap(): T; + unwrapErr(): E; + isOk(): boolean; + isErr(): boolean; +} +export declare class Ok implements Result { + readonly value: T; + constructor(value: T); + unwrapErr(): E; + unwrap(): T; + isOk(): boolean; + isErr(): boolean; +} +export declare class Err implements Result { + readonly error: E; + constructor(error: E); + unwrapErr(): E; + unwrap(): never; + isOk(): boolean; + isErr(): boolean; +} +export declare const contractErrorPattern: RegExp; +type AssembledTransactionOptions = MethodOptions & ClassOptions & { + method: string; + args?: any[]; + parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; +}; +export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; +export declare class AssembledTransaction { + options: AssembledTransactionOptions; + raw: Tx; + private simulation?; + private simulationResult?; + private simulationTransactionData?; + private server; + toJSON(): string; + static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { + tx: XDR_BASE64; + simulationResult: { + auth: XDR_BASE64[]; + retval: XDR_BASE64; + }; + simulationTransactionData: XDR_BASE64; + }): AssembledTransaction; + private constructor(); + static fromSimulation(options: AssembledTransactionOptions): Promise>; + simulate: () => Promise; + get simulationData(): { + result: SorobanRpc.Api.SimulateHostFunctionResult; + transactionData: xdr.SorobanTransactionData; + }; + get result(): T; + parseError(errorMessage: string): Err | undefined; + getWallet: () => Promise; + getPublicKey: () => Promise; + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount: () => Promise; + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend: ({ secondsToWait, force }?: { + /** + * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). + */ + secondsToWait?: number | undefined; + /** + * If `true`, sign and send the transaction even if it is a read call. + */ + force?: boolean | undefined; + }) => Promise>; + getStorageExpiration: () => Promise; + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { + /** + * Whether or not to include auth entries that have already been signed. Default: false + */ + includeAlreadySigned?: boolean | undefined; + }) => Promise; + preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries: (expiration?: number | Promise) => Promise; + get isReadCall(): boolean; + hasRealInvoker: () => Promise; +} +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +declare class SentTransaction { + options: AssembledTransactionOptions; + assembled: AssembledTransaction; + server: SorobanRpc.Server; + signed: Tx; + sendTransactionResponse?: SendTx; + sendTransactionResponseAll?: SendTx[]; + getTransactionResponse?: GetTx; + getTransactionResponseAll?: GetTx[]; + constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); + static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; + private send; + get result(): T; +} diff --git a/contract-client/dist/types/index.d.ts b/contract-client/dist/types/index.d.ts new file mode 100644 index 0000000..24805b4 --- /dev/null +++ b/contract-client/dist/types/index.d.ts @@ -0,0 +1,155 @@ +import { ContractSpec } from '@stellar/stellar-sdk'; +import { AssembledTransaction } from './assembled-tx.js'; +import type { i128 } from './assembled-tx.js'; +import type { ClassOptions } from './method-options.js'; +export * from './assembled-tx.js'; +export * from './method-options.js'; +export declare const networks: { + readonly testnet: { + readonly networkPassphrase: 'Test SDF Network ; September 2015'; + readonly contractId: 'CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY'; + }; +}; +/** + + */ +export type DataKey = { + tag: 'Offers'; + values: readonly [string]; +}; +/** + + */ +export interface Offer { + /** + + */ + amount: i128; + /** + + */ + list_price: i128; + /** + + */ + mft: string; +} +/** + + */ +export interface Owner { + /** + + */ + amount: i128; + /** + + */ + mft: string; + /** + + */ + public_key: string; +} +/** + + */ +export declare const Errors: {}; +export declare class Contract { + readonly options: ClassOptions; + spec: ContractSpec; + constructor(options: ClassOptions); + private readonly parsers; + public txFromJSON; + readonly fromJSON: { + buy: (json: string) => AssembledTransaction; + balance: (json: string) => AssembledTransaction; + setOffer: (json: string) => AssembledTransaction; + getOffer: (json: string) => AssembledTransaction; + deleteOffer: (json: string) => AssembledTransaction; + }; + /** + * Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + buy: ( + { + buyer, + mft, + amount, + }: { + buyer: string; + mft: string; + amount: i128; + }, + options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + } + ) => Promise>; + /** + * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + balance: ( + { + address, + }: { + address: string; + }, + options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + } + ) => Promise>; + /** + * Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + setOffer: ( + { + offer, + }: { + offer: Offer; + }, + options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + } + ) => Promise>; + /** + * Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + getOffer: ( + { + mft, + }: { + mft: string; + }, + options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + } + ) => Promise>; + /** + * Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + deleteOffer: ( + { + mft, + }: { + mft: string; + }, + options?: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number; + } + ) => Promise>; +} diff --git a/contract-client/dist/types/method-options.d.ts b/contract-client/dist/types/method-options.d.ts new file mode 100644 index 0000000..6840adb --- /dev/null +++ b/contract-client/dist/types/method-options.d.ts @@ -0,0 +1,47 @@ +declare let responseTypes: 'simulated' | 'full' | undefined; +export type ResponseTypes = typeof responseTypes; +export type XDR_BASE64 = string; +export interface Wallet { + isConnected: () => Promise; + isAllowed: () => Promise; + getUserInfo: () => Promise<{ + publicKey?: string; + }>; + signTransaction: (tx: XDR_BASE64, opts?: { + network?: string; + networkPassphrase?: string; + accountToSign?: string; + }) => Promise; + signAuthEntry: (entryXdr: XDR_BASE64, opts?: { + accountToSign?: string; + }) => Promise; +} +export type ClassOptions = { + contractId: string; + networkPassphrase: string; + rpcUrl: string; + errorTypes?: Record; + /** + * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: + * + * @example + * ```ts + * import freighter from "@stellar/freighter-api"; + * import { Contract } from "contract-client"; + * const contract = new Contract({ + * …, + * wallet: freighter, + * }) + * ``` + */ + wallet?: Wallet; +}; +export type MethodOptions = { + /** + * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') + */ + fee?: number; +}; +export {}; diff --git a/contract-client/package-lock.json b/contract-client/package-lock.json new file mode 100644 index 0000000..c5e547e --- /dev/null +++ b/contract-client/package-lock.json @@ -0,0 +1,328 @@ +{ + "name": "contract-client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "contract-client", + "version": "0.0.0", + "dependencies": { + "@stellar/freighter-api": "1.7.1", + "@stellar/stellar-sdk": "11.2.0", + "buffer": "6.0.3" + }, + "devDependencies": { + "typescript": "5.3.3" + } + }, + "node_modules/@stellar/freighter-api": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-1.7.1.tgz", + "integrity": "sha512-XvPO+XgEbkeP0VhP0U1edOkds+rGS28+y8GRGbCVXeZ9ZslbWqRFQoETAdX8IXGuykk2ib/aPokiLc5ZaWYP7w==" + }, + "node_modules/@stellar/js-xdr": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.1.tgz", + "integrity": "sha512-3gnPjAz78htgqsNEDkEsKHKosV2BF2iZkoHCNxpmZwUxiPsw+2VaXMed8RRMe0rGk3d5GZe7RrSba8zV80J3Ag==" + }, + "node_modules/@stellar/stellar-base": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-10.0.1.tgz", + "integrity": "sha512-BDbx7VHOEQh+4J3Q+gStNXgPaNckVFmD4aOlBBGwxlF6vPFmVnW8IoJdkX7T58zpX55eWI6DXvEhDBlrqTlhAQ==", + "dependencies": { + "@stellar/js-xdr": "^3.0.1", + "base32.js": "^0.1.0", + "bignumber.js": "^9.1.2", + "buffer": "^6.0.3", + "sha.js": "^2.3.6", + "tweetnacl": "^1.0.3" + }, + "optionalDependencies": { + "sodium-native": "^4.0.1" + } + }, + "node_modules/@stellar/stellar-sdk": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-11.2.0.tgz", + "integrity": "sha512-qInRR+mLLl9O/AI6Q+Sr19RZeYJtlNoJQJi3pch5BYoMvVhjO8IU8AhHADP//Zmc2osyogwPuqXBiFdaGlfHWA==", + "dependencies": { + "@stellar/stellar-base": "10.0.1", + "axios": "^1.6.5", + "bignumber.js": "^9.1.2", + "eventsource": "^2.0.2", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base32.js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", + "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sodium-native": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz", + "integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.8.0" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + } + } +} diff --git a/contract-client/package.json b/contract-client/package.json new file mode 100644 index 0000000..e07be53 --- /dev/null +++ b/contract-client/package.json @@ -0,0 +1,20 @@ +{ + "version": "0.0.0", + "name": "contract-client", + "dependencies": { + "@stellar/freighter-api": "1.7.1", + "buffer": "6.0.3", + "@stellar/stellar-sdk": "11.2.0" + }, + "scripts": { + "build": "node ./scripts/build.mjs" + }, + "exports": { + "require": "./dist/cjs/index.js", + "import": "./dist/esm/index.js" + }, + "typings": "dist/types/index.d.ts", + "devDependencies": { + "typescript": "5.3.3" + } +} diff --git a/contract-client/scripts/build.mjs b/contract-client/scripts/build.mjs new file mode 100644 index 0000000..15a1704 --- /dev/null +++ b/contract-client/scripts/build.mjs @@ -0,0 +1,37 @@ +import { spawnSync } from "node:child_process" +import fs from "node:fs" +import path from "node:path" + +const buildDir = "./dist" + +const { error, stderr } = spawnSync("tsc", ["-b", "./scripts/tsconfig.cjs.json", "./scripts/tsconfig.esm.json", "./scripts/tsconfig.types.json"], { stdio: "inherit" }) + +if (error) { + console.error(stderr) + console.error(error) + throw error +} + +function createEsmModulePackageJson() { + fs.readdir(buildDir, function (err, dirs) { + if (err) { + throw err + } + dirs.forEach(function (dir) { + if (dir === "esm") { + // 1. add package.json file with "type": "module" + var packageJsonFile = path.join(buildDir, dir, "/package.json") + if (!fs.existsSync(packageJsonFile)) { + fs.writeFileSync( + packageJsonFile, + '{"type": "module"}', + 'utf8', + err => { if (err) throw err } + ) + } + } + }) + }) +} + +createEsmModulePackageJson() diff --git a/contract-client/scripts/tsconfig.cjs.json b/contract-client/scripts/tsconfig.cjs.json new file mode 100644 index 0000000..542ea86 --- /dev/null +++ b/contract-client/scripts/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../dist/cjs", + "module": "commonjs" + } +} diff --git a/contract-client/scripts/tsconfig.esm.json b/contract-client/scripts/tsconfig.esm.json new file mode 100644 index 0000000..92b4527 --- /dev/null +++ b/contract-client/scripts/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../dist/esm", + "module": "esnext" + } +} diff --git a/contract-client/scripts/tsconfig.types.json b/contract-client/scripts/tsconfig.types.json new file mode 100644 index 0000000..8a24fc1 --- /dev/null +++ b/contract-client/scripts/tsconfig.types.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../dist/types", + "declaration": true, + "emitDeclarationOnly": true + } +} diff --git a/contract-client/src/assembled-tx.ts b/contract-client/src/assembled-tx.ts new file mode 100644 index 0000000..f4f892d --- /dev/null +++ b/contract-client/src/assembled-tx.ts @@ -0,0 +1,664 @@ +import { + Account, + Address, + Contract, + Operation, + SorobanRpc, + StrKey, + TimeoutInfinite, + TransactionBuilder, + authorizeEntry, + hash, + nativeToScVal, + xdr, + BASE_FEE, +} from "@stellar/stellar-sdk"; +import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; +import { Buffer } from "buffer"; +import type { + ClassOptions, + MethodOptions, + Wallet, + XDR_BASE64, +} from "./method-options.js"; + +export type Tx = Transaction, Operation[]> + +export class ExpiredStateError extends Error { } +export class NeedsMoreSignaturesError extends Error { } +export class WalletDisconnectedError extends Error { } +export class SendResultOnlyError extends Error { } +export class SendFailedError extends Error { } +export class NoUnsignedNonInvokerAuthEntriesError extends Error { } + +type SendTx = SorobanRpc.Api.SendTransactionResponse; +type GetTx = SorobanRpc.Api.GetTransactionResponse; + +export type u32 = number; +export type i32 = number; +export type u64 = bigint; +export type i64 = bigint; +export type u128 = bigint; +export type i128 = bigint; +export type u256 = bigint; +export type i256 = bigint; +export type Option = T | undefined; +export type Typepoint = bigint; +export type Duration = bigint; +export {Address}; + +/// Error interface containing the error message +export interface Error_ { message: string }; + +export interface Result { + unwrap(): T, + unwrapErr(): E, + isOk(): boolean, + isErr(): boolean, +}; + +export class Ok implements Result { + constructor(readonly value: T) { } + unwrapErr(): E { + throw new Error('No error'); + } + unwrap(): T { + return this.value; + } + + isOk(): boolean { + return true; + } + + isErr(): boolean { + return !this.isOk() + } +} + +export class Err implements Result { + constructor(readonly error: E) { } + unwrapErr(): E { + return this.error; + } + unwrap(): never { + throw new Error(this.error.message); + } + + isOk(): boolean { + return false; + } + + isErr(): boolean { + return !this.isOk() + } +} + +export const contractErrorPattern = /Error\(Contract, #(\d+)\)/; + +type AssembledTransactionOptions = MethodOptions & + ClassOptions & { + method: string; + args?: any[]; + parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; + }; + +export const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF" + +export class AssembledTransaction { + public raw: Tx + private simulation?: SorobanRpc.Api.SimulateTransactionResponse + private simulationResult?: SorobanRpc.Api.SimulateHostFunctionResult + private simulationTransactionData?: xdr.SorobanTransactionData + private server: SorobanRpc.Server + + toJSON() { + return JSON.stringify({ + method: this.options.method, + tx: this.raw?.toXDR(), + simulationResult: { + auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), + retval: this.simulationData.result.retval.toXDR('base64'), + }, + simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), + }) + } + + static fromJSON( + options: Omit, 'args'>, + { tx, simulationResult, simulationTransactionData }: + { + tx: XDR_BASE64, + simulationResult: { + auth: XDR_BASE64[], + retval: XDR_BASE64, + }, + simulationTransactionData: XDR_BASE64, + } + ): AssembledTransaction { + const txn = new AssembledTransaction(options) + txn.raw = TransactionBuilder.fromXDR(tx, options.networkPassphrase) as Tx + txn.simulationResult = { + auth: simulationResult.auth.map(a => xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), + retval: xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), + } + txn.simulationTransactionData = xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64') + return txn + } + + private constructor(public options: AssembledTransactionOptions) { + this.server = new SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + } + + static async fromSimulation(options: AssembledTransactionOptions): Promise> { + const tx = new AssembledTransaction(options) + const contract = new Contract(options.contractId); + + tx.raw = new TransactionBuilder(await tx.getAccount(), { + fee: options.fee?.toString(10) ?? BASE_FEE, + networkPassphrase: options.networkPassphrase, + }) + .addOperation(contract.call(options.method, ...(options.args ?? []))) + .setTimeout(TimeoutInfinite) + .build(); + + return await tx.simulate() + } + + simulate = async (): Promise => { + if (!this.raw) throw new Error('Transaction has not yet been assembled') + this.simulation = await this.server.simulateTransaction(this.raw); + + if (SorobanRpc.Api.isSimulationSuccess(this.simulation)) { + this.raw = SorobanRpc.assembleTransaction( + this.raw, + this.simulation + ).build() + } + + return this + } + + get simulationData(): { + result: SorobanRpc.Api.SimulateHostFunctionResult + transactionData: xdr.SorobanTransactionData + } { + if (this.simulationResult && this.simulationTransactionData) { + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData, + } + } + // else, we know we just did the simulation on this machine + const simulation = this.simulation! + if (SorobanRpc.Api.isSimulationError(simulation)) { + throw new Error(`Transaction simulation failed: "${simulation.error}"`) + } + + if (SorobanRpc.Api.isSimulationRestore(simulation)) { + throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`) + } + + if (!simulation.result) { + throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`) + } + + // add to object for serialization & deserialization + this.simulationResult = simulation.result + this.simulationTransactionData = simulation.transactionData.build() + + return { + result: this.simulationResult, + transactionData: this.simulationTransactionData!, + } + } + + get result(): T { + try { + return this.options.parseResultXdr(this.simulationData.result.retval) + } catch (e) { + let err = this.parseError(e.toString()) + if (err) return err as T + throw e + } + } + + parseError(errorMessage: string): Err | undefined { + if (!this.options.errorTypes) return + const match = errorMessage.match(contractErrorPattern) + if (!match) return + let i = parseInt(match[1], 10) + let err = this.options.errorTypes[i] + if (err) return new Err(err) + } + + getWallet = async (): Promise => { + return this.options.wallet ?? (await import("@stellar/freighter-api")).default + } + + getPublicKey = async (): Promise => { + const wallet = await this.getWallet() + if (await wallet.isConnected() && await wallet.isAllowed()) { + return (await wallet.getUserInfo()).publicKey + } + } + + /** + * Get account details from the Soroban network for the publicKey currently + * selected in user's wallet. If not connected to Freighter, use placeholder + * null account. + */ + getAccount = async (): Promise => { + const publicKey = await this.getPublicKey() + return publicKey + ? await this.server.getAccount(publicKey) + : new Account(NULL_ACCOUNT, "0") + } + + /** + * Sign the transaction with the `wallet` (default Freighter), then send to + * the network and return a `SentTransaction` that keeps track of all the + * attempts to send and fetch the transaction from the network. + */ + signAndSend = async ({ secondsToWait = 10, force = false }: { + /** + * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). + */ + secondsToWait?: number + /** + * If `true`, sign and send the transaction even if it is a read call. + */ + force?: boolean + } = {}): Promise> => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated') + } + + if (!force && this.isReadCall) { + throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.') + } + + if (!await this.hasRealInvoker()) { + throw new WalletDisconnectedError('Wallet is not connected') + } + + if (this.raw.source !== (await this.getAccount()).accountId()) { + throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`) + } + + if ((await this.needsNonInvokerSigningBy()).length) { + throw new NeedsMoreSignaturesError( + 'Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.' + ) + } + + return await SentTransaction.init(this.options, this, secondsToWait); + } + + getStorageExpiration = async () => { + const entryRes = await this.server.getLedgerEntries( + new Contract(this.options.contractId).getFootprint() + ) + if ( + !entryRes.entries || + !entryRes.entries.length || + !entryRes.entries[0].liveUntilLedgerSeq + ) throw new Error('failed to get ledger entry') + return entryRes.entries[0].liveUntilLedgerSeq + } + + /** + * Get a list of accounts, other than the invoker of the simulation, that + * need to sign auth entries in this transaction. + * + * Soroban allows multiple people to sign a transaction. Someone needs to + * sign the final transaction envelope; this person/account is called the + * _invoker_, or _source_. Other accounts might need to sign individual auth + * entries in the transaction, if they're not also the invoker. + * + * This function returns a list of accounts that need to sign auth entries, + * assuming that the same invoker/source account will sign the final + * transaction envelope as signed the initial simulation. + * + * One at a time, for each public key in this array, you will need to + * serialize this transaction with `toJSON`, send to the owner of that key, + * deserialize the transaction with `txFromJson`, and call + * {@link signAuthEntries}. Then re-serialize and send to the next account + * in this list. + */ + needsNonInvokerSigningBy = async ({ + includeAlreadySigned = false, + }: { + /** + * Whether or not to include auth entries that have already been signed. Default: false + */ + includeAlreadySigned?: boolean + } = {}): Promise => { + if (!this.raw) { + throw new Error('Transaction has not yet been simulated') + } + + // We expect that any transaction constructed by these libraries has a + // single operation, which is an InvokeHostFunction operation. The host + // function being invoked is the contract method call. + if (!("operations" in this.raw)) { + throw new Error( + `Unexpected Transaction type; no operations: ${JSON.stringify(this.raw) + }` + ) + } + const rawInvokeHostFunctionOp = this.raw + .operations[0] as Operation.InvokeHostFunction + + return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => + entry.credentials().switch() === + xdr.SorobanCredentialsType.sorobanCredentialsAddress() && + ( + includeAlreadySigned || + entry.credentials().address().signature().switch().name === 'scvVoid' + ) + ).map(entry => StrKey.encodeEd25519PublicKey( + entry.credentials().address().address().accountId().ed25519() + )))] + } + + preImageFor( + entry: xdr.SorobanAuthorizationEntry, + signatureExpirationLedger: number + ): xdr.HashIdPreimage { + const addrAuth = entry.credentials().address() + return xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( + new xdr.HashIdPreimageSorobanAuthorization({ + networkId: hash(Buffer.from(this.options.networkPassphrase)), + nonce: addrAuth.nonce(), + invocation: entry.rootInvocation(), + signatureExpirationLedger, + }), + ) + } + + /** + * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize + * the transaction with `toJSON`, send it to the owner of one of the public keys + * in the map, deserialize with `txFromJSON`, and call this method on their + * machine. Internally, this will use `signAuthEntry` function from connected + * `wallet` for each. + * + * Then, re-serialize the transaction and either send to the next + * `needsNonInvokerSigningBy` owner, or send it back to the original account + * who simulated the transaction so they can {@link sign} the transaction + * envelope and {@link send} it to the network. + * + * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently + * supported! + */ + signAuthEntries = async ( + /** + * When to set each auth entry to expire. Could be any number of blocks in + * the future. Can be supplied as a promise or a raw number. Default: + * contract's current `persistent` storage expiration date/ledger + * number/block. + */ + expiration: number | Promise = this.getStorageExpiration() + ): Promise => { + if (!this.raw) throw new Error('Transaction has not yet been assembled or simulated') + const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy() + + if (!needsNonInvokerSigningBy) throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?') + const publicKey = await this.getPublicKey() + if (!publicKey) throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?') + if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) throw new Error(`No auth entries for public key "${publicKey}"`) + const wallet = await this.getWallet() + + const rawInvokeHostFunctionOp = this.raw + .operations[0] as Operation.InvokeHostFunction + + const authEntries = rawInvokeHostFunctionOp.auth ?? [] + + for (const [i, entry] of authEntries.entries()) { + if ( + entry.credentials().switch() !== + xdr.SorobanCredentialsType.sorobanCredentialsAddress() + ) { + // if the invoker/source account, then the entry doesn't need explicit + // signature, since the tx envelope is already signed by the source + // account, so only check for sorobanCredentialsAddress + continue + } + const pk = StrKey.encodeEd25519PublicKey( + entry.credentials().address().address().accountId().ed25519() + ) + + // this auth entry needs to be signed by a different account + // (or maybe already was!) + if (pk !== publicKey) continue + + authEntries[i] = await authorizeEntry( + entry, + async preimage => Buffer.from( + await wallet.signAuthEntry(preimage.toXDR('base64')), + 'base64' + ), + await expiration, + this.options.networkPassphrase + ) + } + } + + get isReadCall(): boolean { + const authsCount = this.simulationData.result.auth.length; + const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length + return (authsCount === 0) && (writeLength === 0); + } + + hasRealInvoker = async (): Promise => { + const account = await this.getAccount() + return account.accountId() !== NULL_ACCOUNT + } +} + +/** + * A transaction that has been sent to the Soroban network. This happens in two steps: + * + * 1. `sendTransaction`: initial submission of the transaction to the network. + * This step can run into problems, and will be retried with exponential + * backoff if it does. See all attempts in `sendTransactionResponseAll` and the + * most recent attempt in `sendTransactionResponse`. + * 2. `getTransaction`: once the transaction has been submitted to the network + * successfully, you need to wait for it to finalize to get the results of the + * transaction. This step can also run into problems, and will be retried with + * exponential backoff if it does. See all attempts in + * `getTransactionResponseAll` and the most recent attempt in + * `getTransactionResponse`. + */ +class SentTransaction { + public server: SorobanRpc.Server + public signed: Tx + public sendTransactionResponse?: SendTx + public sendTransactionResponseAll?: SendTx[] + public getTransactionResponse?: GetTx + public getTransactionResponseAll?: GetTx[] + + constructor(public options: AssembledTransactionOptions, public assembled: AssembledTransaction) { + this.server = new SorobanRpc.Server(this.options.rpcUrl, { + allowHttp: this.options.rpcUrl.startsWith("http://"), + }); + this.assembled = assembled + } + + static init = async ( + options: AssembledTransactionOptions, + assembled: AssembledTransaction, + secondsToWait: number = 10 + ): Promise> => { + const tx = new SentTransaction(options, assembled) + return await tx.send(secondsToWait) + } + + private send = async (secondsToWait: number = 10): Promise => { + const wallet = await this.assembled.getWallet() + + this.sendTransactionResponseAll = await withExponentialBackoff( + async (previousFailure) => { + if (previousFailure) { + // Increment transaction sequence number and resimulate before trying again + + // Soroban transaction can only have 1 operation + const op = this.assembled.raw.operations[0] as Operation.InvokeHostFunction; + + this.assembled.raw = new TransactionBuilder(await this.assembled.getAccount(), { + fee: this.assembled.raw.fee, + networkPassphrase: this.options.networkPassphrase, + }) + .setTimeout(TimeoutInfinite) + .addOperation( + Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] }), + ) + .build() + + await this.assembled.simulate() + } + + const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { + networkPassphrase: this.options.networkPassphrase, + }); + + this.signed = TransactionBuilder.fromXDR( + signature, + this.options.networkPassphrase + ) as Tx + + return this.server.sendTransaction(this.signed) + }, + resp => resp.status !== "PENDING", + secondsToWait + ) + + this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1] + + if (this.sendTransactionResponse.status !== "PENDING") { + throw new Error( + `Tried to resubmit transaction for ${secondsToWait + } seconds, but it's still failing. ` + + `All attempts: ${JSON.stringify( + this.sendTransactionResponseAll, + null, + 2 + )}` + ); + } + + const { hash } = this.sendTransactionResponse + + this.getTransactionResponseAll = await withExponentialBackoff( + () => this.server.getTransaction(hash), + resp => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, + secondsToWait + ) + + this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1] + if (this.getTransactionResponse.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { + console.error( + `Waited ${secondsToWait + } seconds for transaction to complete, but it did not. ` + + `Returning anyway. Check the transaction status manually. ` + + `Sent transaction: ${JSON.stringify( + this.sendTransactionResponse, + null, + 2 + )}\n` + + `All attempts to get the result: ${JSON.stringify( + this.getTransactionResponseAll, + null, + 2 + )}` + ); + } + + return this; + } + + get result(): T { + // 1. check if transaction was submitted and awaited with `getTransaction` + if ( + "getTransactionResponse" in this && + this.getTransactionResponse + ) { + // getTransactionResponse has a `returnValue` field unless it failed + if ("returnValue" in this.getTransactionResponse) { + return this.options.parseResultXdr(this.getTransactionResponse.returnValue!) + } + + // if "returnValue" not present, the transaction failed; return without parsing the result + throw new Error("Transaction failed! Cannot parse result.") + } + + // 2. otherwise, maybe it was merely sent with `sendTransaction` + if (this.sendTransactionResponse) { + const errorResult = this.sendTransactionResponse.errorResult?.result() + if (errorResult) { + throw new SendFailedError( + `Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}` + ) + } + throw new SendResultOnlyError( + `Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\`` + ) + } + + // 3. finally, if neither of those are present, throw an error + throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`) + } +} + +/** + * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. + * Returns an array of all attempts to call the function. + */ +async function withExponentialBackoff( + fn: (previousFailure?: T) => Promise, + keepWaitingIf: (result: T) => boolean, + secondsToWait: number, + exponentialFactor = 1.5, + verbose = false, +): Promise { + const attempts: T[] = [] + + let count = 0 + attempts.push(await fn()) + if (!keepWaitingIf(attempts[attempts.length - 1])) return attempts + + const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf() + let waitTime = 1000 + let totalWaitTime = waitTime + + while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { + count++ + // Wait a beat + if (verbose) { + console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`) + } + await new Promise(res => setTimeout(res, waitTime)) + // Exponential backoff + waitTime = waitTime * exponentialFactor; + if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { + waitTime = waitUntil - Date.now() + if (verbose) { + console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`) + } + } + totalWaitTime = waitTime + totalWaitTime + // Try again + attempts.push(await fn(attempts[attempts.length - 1])) + if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { + console.info( + `${count}. Called ${fn}; ${attempts.length + } prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2) + }` + ) + } + } + + return attempts +} diff --git a/contract-client/src/index.ts b/contract-client/src/index.ts new file mode 100644 index 0000000..c5f5097 --- /dev/null +++ b/contract-client/src/index.ts @@ -0,0 +1,223 @@ +import { ContractSpec, Address } from '@stellar/stellar-sdk'; +import { Buffer } from "buffer"; +import { AssembledTransaction, Ok, Err } from './assembled-tx.js'; +import type { + u32, + i32, + u64, + i64, + u128, + i128, + u256, + i256, + Option, + Typepoint, + Duration, + Error_, + Result, +} from './assembled-tx.js'; +import type { ClassOptions, XDR_BASE64 } from './method-options.js'; + +export * from './assembled-tx.js'; +export * from './method-options.js'; + +if (typeof window !== 'undefined') { + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || Buffer; +} + + +export const networks = { + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", + } +} as const + +/** + + */ +export type DataKey = {tag: "Offers", values: readonly [string]}; + +/** + + */ +export interface Offer { + /** + + */ +amount: i128; + /** + + */ +list_price: i128; + /** + + */ +mft: string; +} + +/** + + */ +export interface Owner { + /** + + */ +amount: i128; + /** + + */ +mft: string; + /** + + */ +public_key: string; +} + +/** + + */ +export const Errors = { + +} + +export class Contract { + spec: ContractSpec; + constructor(public readonly options: ClassOptions) { + this.spec = new ContractSpec([ + "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", + "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", + "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", + "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", + "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", + "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", + "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", + "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" + ]); + } + private readonly parsers = { + buy: () => {}, + balance: (result: XDR_BASE64): i128 => this.spec.funcResToNative("balance", result), + setOffer: () => {}, + getOffer: (result: XDR_BASE64): Offer => this.spec.funcResToNative("get_offer", result), + deleteOffer: () => {} + }; + private txFromJSON = (json: string): AssembledTransaction => { + const { method, ...tx } = JSON.parse(json) + return AssembledTransaction.fromJSON( + { + ...this.options, + method, + parseResultXdr: this.parsers[method], + }, + tx, + ); + } + public readonly fromJSON = { + buy: this.txFromJSON>, + balance: this.txFromJSON>, + setOffer: this.txFromJSON>, + getOffer: this.txFromJSON>, + deleteOffer: this.txFromJSON> + } + /** + * Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + buy = async ({buyer, mft, amount}: {buyer: string, mft: string, amount: i128}, options: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number, + } = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'buy', + args: this.spec.funcArgsToScVals("buy", {buyer: new Address(buyer), mft: new Address(mft), amount}), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['buy'], + }); + } + + + /** + * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + balance = async ({address}: {address: string}, options: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number, + } = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'balance', + args: this.spec.funcArgsToScVals("balance", {address: new Address(address)}), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['balance'], + }); + } + + + /** + * Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + setOffer = async ({offer}: {offer: Offer}, options: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number, + } = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'set_offer', + args: this.spec.funcArgsToScVals("set_offer", {offer}), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['setOffer'], + }); + } + + + /** + * Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + getOffer = async ({mft}: {mft: string}, options: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number, + } = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'get_offer', + args: this.spec.funcArgsToScVals("get_offer", {mft: new Address(mft)}), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['getOffer'], + }); + } + + + /** + * Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + deleteOffer = async ({mft}: {mft: string}, options: { + /** + * The fee to pay for the transaction. Default: 100. + */ + fee?: number, + } = {}) => { + return await AssembledTransaction.fromSimulation({ + method: 'delete_offer', + args: this.spec.funcArgsToScVals("delete_offer", {mft: new Address(mft)}), + ...options, + ...this.options, + errorTypes: Errors, + parseResultXdr: this.parsers['deleteOffer'], + }); + } + +} \ No newline at end of file diff --git a/contract-client/src/method-options.ts b/contract-client/src/method-options.ts new file mode 100644 index 0000000..96a5cbb --- /dev/null +++ b/contract-client/src/method-options.ts @@ -0,0 +1,50 @@ +// defined this way so typeahead shows full union, not named alias +let responseTypes: 'simulated' | 'full' | undefined +export type ResponseTypes = typeof responseTypes + +export type XDR_BASE64 = string + +export interface Wallet { + isConnected: () => Promise, + isAllowed: () => Promise, + getUserInfo: () => Promise<{ publicKey?: string }>, + signTransaction: (tx: XDR_BASE64, opts?: { + network?: string, + networkPassphrase?: string, + accountToSign?: string, + }) => Promise, + signAuthEntry: ( + entryXdr: XDR_BASE64, + opts?: { + accountToSign?: string; + } + ) => Promise +} + +export type ClassOptions = { + contractId: string + networkPassphrase: string + rpcUrl: string + errorTypes?: Record + /** + * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: + * + * @example + * ```ts + * import freighter from "@stellar/freighter-api"; + * import { Contract } from "contract-client"; + * const contract = new Contract({ + * …, + * wallet: freighter, + * }) + * ``` + */ + wallet?: Wallet +} + +export type MethodOptions = { + /** + * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') + */ + fee?: number +} diff --git a/contract-client/tsconfig.json b/contract-client/tsconfig.json new file mode 100644 index 0000000..efd4c61 --- /dev/null +++ b/contract-client/tsconfig.json @@ -0,0 +1,98 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "ESNext", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + // "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + // "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + // "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": [ + "src/*" + ] +} diff --git a/contract/init.sh b/contract/init.sh index d7591b2..b5a137c 100755 --- a/contract/init.sh +++ b/contract/init.sh @@ -115,13 +115,15 @@ echo Deploy contract $CTR # echo Build Bindings for $CTR soroban contract bindings typescript \ --wasm ./target/wasm32-unknown-unknown/release/skyhitz.wasm \ - --output-dir ../node_modules/skyhitz-soroban-client \ + --output-dir ../contract-client \ --network $(cat ./.vars/network) \ --contract-id $(cat ./.vars/$CTR) \ --overwrite cd ../ +yarn add ./contract-client + echo "Change development vercel variables" vercel env rm RPC_URL development --yes 2> /dev/null || true vercel env rm NETWORK_PASSPHRASE development --yes 2> /dev/null || true diff --git a/contract/src/lib.rs b/contract/src/lib.rs index 387531c..2ade7de 100644 --- a/contract/src/lib.rs +++ b/contract/src/lib.rs @@ -1,38 +1,26 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, contracttype, log, symbol_short, token, Address, Env, Map, String, Symbol, Vec}; +use soroban_sdk::{contract, contractimpl, contracttype, log, token, Address, Env, String}; + +#[contracttype] +pub enum DataKey { + Offers(Address), +} #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct Offer { - mft: String, - amount: i128, + mft: Address, + amount: i128, list_price: i128, } #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct Owner { - public_key: Address, - amount: i128, - mft: String, -} - -const OFFERS_KEY: Symbol = symbol_short!("offers"); -const OWNERS_KEY: Symbol = symbol_short!("owners"); - -fn get_xlm_address(e: &Env) -> Address { - // public xlm - // return Address::from_string(&String::from_str( - // &e, - // "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", - // )); - - // testnet - return Address::from_string(&String::from_str( - &e, - "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", - )); + public_key: Address, + amount: i128, + mft: Address, } #[contract] @@ -40,95 +28,74 @@ pub struct MusicNFTs; #[contractimpl] impl MusicNFTs { - - pub fn buy(e: Env, buyer:Address, mft: String, amount: i128) { + pub fn buy(e: Env, buyer: Address, mft: Address, amount: i128) { buyer.require_auth(); - let offers = Self::get_offers(&e); - if let Some(offer) = offers.get(mft.clone()) { - assert!(offer.amount >= amount, "amount must less or equal to the current offer"); - - log!(&e, "Buying NFT."); - // let xlm_address = get_xlm_address(&e); - // let xlm = token::Client::new(&e, &xlm_address); - - // let total_xlm = offer.list_price * (amount / 100); - // xlm.transfer(&buyer, &e.current_contract_address(), &total_xlm); - - // let mut updated_offer = offer; - // updated_offer.amount = updated_offer.amount - amount; - - // if updated_offer.amount == 0 { - // Self::delete_offer(e.clone(), updated_offer.mft); - // } else { - // Self::update_offer(e.clone(), updated_offer); - // } - - // // record ownership - - // let res = Self::get_ownership(e.clone(), mft.clone(), buyer.clone()); - - // if res.is_some() { - // let mut owner = res.unwrap(); - // owner.amount = owner.amount + amount; - // Self::update_owner(e.clone(), owner) - // } else { - // let owner = Owner { public_key: buyer, amount: amount, mft: mft }; - // Self::update_owner(e.clone(), owner) - // } - } - - log!(&e, "Offer not found or insufficient amount."); - } + // let offer = Self::get_offer(&e, mft.clone()); + // assert!(offer.amount >= amount, "amount must be less or equal to the current offer"); - pub fn update_offer(e: Env, new_offer: Offer) { - assert!(new_offer.amount > 0, "amount must be positive"); - assert!(new_offer.amount <= 100, "amount less than 100"); - let mut all_offers = Self::get_offers(&e); - all_offers.set(new_offer.mft.clone(), new_offer); + // log!(&e, "Buying NFT."); + // let xlm_address = get_xlm_address(&e); + // let xlm = token::Client::new(&e, &xlm_address); - e.storage().instance().set(&OFFERS_KEY, &all_offers); - } + // let total_xlm = offer.list_price * (amount / 100) * 1000000; + // xlm.transfer(&buyer, &e.current_contract_address(), &total_xlm); - pub fn update_owner(e: Env, new_owner: Owner) { - assert!(new_owner.amount > 0, "amount must be positive"); - assert!(new_owner.amount <= 100, "amount less than 100"); - let mut all_owners = Self::get_owners(&e); - let mft = new_owner.mft.clone(); - let mut owners = all_owners.get(mft.clone()).unwrap_or_else(|| Map::new(&e)); - owners.set(new_owner.public_key.clone(), new_owner); - all_owners.set(mft, owners); + // let mut updated_offer = offer; + // updated_offer.amount -= amount; - e.storage().instance().set(&OWNERS_KEY, &all_owners); + // if updated_offer.amount == 0 { + // Self::delete_offer(e.clone(), mft.clone()); + // } else { + // Self::set_offer(e.clone(), updated_offer); + // } } - pub fn get_ownership(e: Env, mft: String, owner: Address) -> Option{ - let all_mfts_owners = Self::get_owners(&e); - let owners = all_mfts_owners.get(mft.clone()).unwrap_or_else(|| Map::new(&e)); - return owners.get(owner.clone()); + pub fn balance(e: Env, address: Address) -> i128 { + let xlm_address = get_xlm_address(&e); + let xlm = token::Client::new(&e, &xlm_address); + xlm.balance(&address) } - pub fn update_offers(e: Env, offers: Vec) { - // Bulk update logic - for offer in offers.into_iter() { - Self::update_offer(e.clone(), offer); - } - } + pub fn set_offer(e: Env, offer: Offer) { + let key = DataKey::Offers(offer.mft.clone()); - pub fn delete_offer(e: Env, mft: String){ - let mut all_offers: Map = Self::get_offers(&e); + e.storage().instance().set(&key, &offer); + } + - all_offers.remove(mft); + pub fn get_offer(e: &Env, mft: Address) -> Offer { + let key = DataKey::Offers(mft); - e.storage().instance().set(&OFFERS_KEY, &all_offers); + e.storage().instance().get(&key).unwrap() } - pub fn get_offers(e: &Env) -> Map { - e.storage().instance().get(&OFFERS_KEY).unwrap_or_else(|| Map::new(e)) - } + pub fn delete_offer(e: Env, mft: Address) { + let key = DataKey::Offers(mft); - pub fn get_owners(e: &Env) -> Map> { - e.storage().instance().get(&OWNERS_KEY).unwrap_or_else(|| Map::new(e)) + e.storage().instance().remove(&key); } + + // The rest of the contract methods... } +fn get_xlm_address(e: &Env) -> Address { + // Implementation remains unchanged... + // public xlm + // return Address::from_string(&String::from_str( + // &e, + // "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", + // )); + + // testnet + return Address::from_string(&String::from_str( + &e, + "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", + )); + + // futurenet + // return Address::from_string(&String::from_str( + // &e, + // "CB64D3G7SM2RTH6JSGG34DDTFTQ5CFDKVDZJZSODMCX4NJ2HV2KN7OHT", + // )); +} diff --git a/package.json b/package.json index 334741c..829ac4f 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,13 @@ "prod": "NODE_ENV=production node -r ts-node/register -r tsconfig-paths/register --inspect ./src/graphql/server.ts", "ci": "tsc --noEmit && tslint --test src && prettier --check src", "stellar:check-test-account": "node -r ts-node/register ./src/testing/verify-stellar-test-account.ts", - "setup:contract:testnet": "./contract/init.sh ${NETWORK:-testnet}" + "setup": "./contract/init.sh ${NETWORK:-testnet}" }, "dependencies": { "@apollo/server": "^4.2.0", "@iarna/toml": "^2.2.5", "@sendgrid/mail": "^7.7.0", + "@stellar/js-xdr": "^3.1.0", "@types/cors": "^2.8.12", "@types/express-jwt": "^6.0.4", "@types/graphql": "^14.2.3", @@ -27,6 +28,7 @@ "body-parser": "^1.20.1", "bs58": "^5.0.0", "compression": "^1.7.4", + "contract-client": "./contract-client", "cors": "^2.8.5", "dotenv": "16.0.3", "express": "^4.18.2", diff --git a/src/graphql/call-contract.ts b/src/graphql/call-contract.ts index fb76325..3d0da52 100644 --- a/src/graphql/call-contract.ts +++ b/src/graphql/call-contract.ts @@ -1,53 +1,48 @@ -import { - Address, - Keypair, - Operation, - StrKey, - Transaction, - hash, - nativeToScVal, - xdr, -} from 'stellar-base'; - -import { Contract, networks, Offer, Wallet } from 'skyhitz-soroban-client'; +import { Keypair, Transaction, hash, scValToNative, xdr } from 'stellar-base'; +import { Contract, networks, Offer } from 'contract-client'; // import { getAuthenticatedUser } from '../auth/logic'; import { User } from 'src/util/types'; // import { decrypt } from 'src/util/encryption'; +// import { Hyper } from '@stellar/js-xdr'; -const pk = 'GD7BAZM73BXQTMRHA2JVJPE5X4AATOMOIXGA76N22JNTNMVXRQW5DR4B'; +// const buyerKeys = Keypair.fromSecret(decrypt(user.seed)); +// GBZP6P7QNKI342HNDUWXG5TE6DPIRIJBMERMZY5VCVHKVI67TJAYSK2C +const buyerKeys = Keypair.fromSecret( + 'SC5FF7SJOUA3XVCSPIXEG6L2ORFHQ6BTVJBJH345W2GRSACKYIUXUDUP' +); + +// GD7BAZM73BXQTMRHA2JVJPE5X4AATOMOIXGA76N22JNTNMVXRQW5DR4B const sourceKeys = Keypair.fromSecret( 'SB6NGNDLFKMRK4XW2W5OWFMJ2LIJ5SBXJU2X5TRSPXR2UNDOXHHZNKWY' ); -const customWallet: Wallet = { - isConnected: async () => await true, - isAllowed: async () => await true, - getUserInfo: async () => - await { - publicKey: pk, - }, - signTransaction: async (tx: string, opts) => { - const txFromXDR = new Transaction(tx, opts.networkPassphrase); - - txFromXDR.sign(sourceKeys); - - return txFromXDR.toXDR(); - }, - signAuthEntry: async (entryXdr, opts) => { - console.log('entry xdr', entryXdr); - console.log('options', opts); - return (await sourceKeys.sign( - hash(Buffer.from(entryXdr, 'base64')) - )) as any; - }, -}; +function getClientForKeypair(keys: Keypair) { + return new Contract({ + ...networks.testnet, + rpcUrl: 'https://soroban-testnet.stellar.org', // from https://soroban.stellar.org/docs/reference/rpc-list#sdf-futurenet-and-testnet-only + wallet: { + isConnected: async () => await true, + isAllowed: async () => await true, + getUserInfo: async () => + await { + publicKey: keys.publicKey(), + }, + signTransaction: async (tx: string, opts) => { + const txFromXDR = new Transaction(tx, opts.networkPassphrase); + + txFromXDR.sign(keys); -const skyhitz = new Contract({ - ...networks.testnet, - rpcUrl: 'https://soroban-testnet.stellar.org', // from https://soroban.stellar.org/docs/reference/rpc-list#sdf-futurenet-and-testnet-only - wallet: customWallet, -}); + return txFromXDR.toXDR(); + }, + signAuthEntry: async (entryXdr, opts) => { + return keys + .sign(hash(Buffer.from(entryXdr, 'base64'))) + .toString('base64'); + }, + }, + }); +} // const new_offer: Offer = { // amount: BigInt(100), @@ -58,128 +53,78 @@ const skyhitz = new Contract({ const new_offer: Offer = { amount: BigInt(90), list_price: BigInt(200), - mft: 'bafkreihbc4nxtgvpltswmxovhj23vydtccudflhah3azlszjomnmvgpp4a', + mft: 'GBCXC355SJCKNESJILVJWVDMURDGBYMXOCUBKSL73RQYM7RB6XB27PSW', }; const addOffer = async () => { - const tx = await skyhitz.updateOffer({ new_offer }); + const contract = getClientForKeypair(sourceKeys); + const tx = await contract.setOffer({ offer: new_offer }); const res = await tx.signAndSend(); return res.getTransactionResponse; }; -const getOffers = async () => { - const tx = await skyhitz.getOffers(); +const getOffer = async (mft: string) => { + const contract = getClientForKeypair(sourceKeys); + const tx = await contract.getOffer({ + mft, + }); return tx.result; }; -const buy = async (mftHash: string, user?: User) => { - // const buyerKeys = Keypair.fromSecret(decrypt(user.seed)); - - // GBZP6P7QNKI342HNDUWXG5TE6DPIRIJBMERMZY5VCVHKVI67TJAYSK2C - const buyerKeys = Keypair.fromSecret( - 'SC5FF7SJOUA3XVCSPIXEG6L2ORFHQ6BTVJBJH345W2GRSACKYIUXUDUP' - ); +const buy = async (mft: string, user?: User) => { + const contract = getClientForKeypair(sourceKeys); // get mft issuer with our logic - const tx = await skyhitz.buy({ - buyer: buyerKeys.publicKey(), - mft: mftHash, - amount: BigInt(10), - }); + let tx = await contract.buy( + { + buyer: buyerKeys.publicKey(), + mft: mft, + amount: BigInt(10), + }, + { fee: 100000000 } + ); console.log(await tx.needsNonInvokerSigningBy()); - const rawInvokeHostFunctionOp = tx.raw - .operations[0] as Operation.InvokeHostFunction; + const jsonFromRoot = tx.toJSON(); - const authEntries = rawInvokeHostFunctionOp.auth ?? []; + console.log(tx.simulationData.transactionData.resources); - for (const [i, entry] of authEntries.entries()) { - if ( - entry.credentials().switch().name !== - xdr.SorobanCredentialsType.sorobanCredentialsAddress().name - ) { - // if the invoker/source account, then the entry doesn't need explicit - // signature, since the tx envelope is already signed by the source - // account, so only check for sorobanCredentialsAddress - continue; - } - const pk = StrKey.encodeEd25519PublicKey( - entry.credentials().address().address().accountId().ed25519() - ); + const buyerClient = getClientForKeypair(buyerKeys); - console.log('pk', pk); - console.log('buyer public key', buyerKeys.publicKey()); + const txBuyer = buyerClient.txFromJSON(jsonFromRoot); - // this auth entry needs to be signed by a different account - // (or maybe already was!) - if (pk !== buyerKeys.publicKey()) continue; + await txBuyer.signAuthEntries(); - const validUntilLedgerSeq = await tx.getStorageExpiration(); + const jsonFromBuyer = txBuyer.toJSON(); - const addrAuth = entry.credentials().address(); - addrAuth.signatureExpirationLedger(validUntilLedgerSeq); + const txRoot = contract.txFromJSON(jsonFromBuyer); - const networkId = hash(Buffer.from(tx.options.networkPassphrase)); - const preimage = xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId, - nonce: addrAuth.nonce(), - invocation: entry.rootInvocation(), - signatureExpirationLedger: addrAuth.signatureExpirationLedger(), - }) - ); + const result = await txRoot.signAndSend(); - console.log(JSON.stringify(preimage)); + // console.log('send res', result.sendTransactionResponseAll); + // console.log('get res', result.getTransactionResponseAll); + const getRes = result.getTransactionResponse as any; - // this breaks: preimage.toXDR(), XDR Write Error: 2290679041439903971 is not a Hyper, where the number is coming from addrAuth.nonce(); + console.log(getRes.resultMetaXdr.toXDR('base64')); - // const payload = hash(preimage.toXDR()); + xdr.TransactionMeta.fromXDR(getRes.resultMetaXdr.toXDR('base64'), 'base64') + .v3() + .sorobanMeta() + ?.diagnosticEvents() + .forEach((event) => { + // console.log(event); + // console.log('event', event.event().body().v0().data().toXDR('base64')); + console.log(scValToNative(event.event().body().v0().data())); + }); - const signature = buyerKeys.sign(hash(preimage.toXDR())); - - // const signature = Buffer.from(buyerKeys.sign(payload)); - - const publicKey = Address.fromScAddress(addrAuth.address()).toString(); - - // if (!Keypair.fromPublicKey(publicKey).verify(payload, signature)) { - // throw new Error(`signature doesn't match payload`); - // } - - // This structure is defined here: - // https://soroban.stellar.org/docs/fundamentals-and-concepts/invoking-contracts-with-transactions#stellar-account-signatures - // - // Encoding a contract structure as an ScVal means the map keys are supposed - // to be symbols, hence the forced typing here. - const sigScVal = nativeToScVal( - { - public_key: StrKey.decodeEd25519PublicKey(publicKey), - signature, - }, - { - type: { - public_key: ['symbol', null], - signature: ['symbol', null], - }, - } - ); - - addrAuth.signature(xdr.ScVal.scvVec([sigScVal])); - - authEntries[i] = entry; - - console.log('auth entries', authEntries); - } - - const res = await tx.signAndSend(); - - console.log('result', res.getTransactionResponse); - - return res.getTransactionResponse; + return result.getTransactionResponse; }; const deleteOffer = async (mftHash: string) => { - const tx = await skyhitz.deleteOffer({ mft: mftHash }); + const contract = getClientForKeypair(sourceKeys); + + const tx = await contract.deleteOffer({ mft: mftHash }); const res = await tx.signAndSend(); return res.getTransactionResponse; }; @@ -187,20 +132,20 @@ const deleteOffer = async (mftHash: string) => { export const callContract = async (_: any, args: any, ctx: any) => { // const user = await getAuthenticatedUser(ctx); - const { fn, mftHash } = args; + const { fn, mft } = args; switch (fn) { case 'updateOffer': return addOffer(); case 'deleteOffer': - return deleteOffer(mftHash); + return deleteOffer(mft); - case 'getOffers': - return getOffers(); + case 'getOffer': + return getOffer(mft); case 'buy': - return buy(mftHash); + return buy(mft); } return {}; diff --git a/src/graphql/schema.ts b/src/graphql/schema.ts index 00bb411..e0cc1a0 100644 --- a/src/graphql/schema.ts +++ b/src/graphql/schema.ts @@ -13,7 +13,7 @@ type Query { xlmPrice: String! getIssuer(cid: String!): String! getAudibleToken: Token! - callContract(fn: String!, mftHash: String): JSON + callContract(fn: String!, mft: String): JSON } type Mutation { diff --git a/tsconfig.json b/tsconfig.json index 5889c61..293daca 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,10 +12,7 @@ "typeRoots": ["./node_modules/@types/**/*.d.ts"], "baseUrl": ".", "paths": { - "src/*": ["./src/*"], - "skyhitz-soroban-client/*": [ - "./contract/node_modules/skyhitz-soroban-client/*" - ] + "src/*": ["./src/*"] } } } diff --git a/yarn.lock b/yarn.lock index efc4da8..976d092 100644 --- a/yarn.lock +++ b/yarn.lock @@ -470,11 +470,48 @@ "@sendgrid/client" "^7.7.0" "@sendgrid/helpers" "^7.7.0" +"@stellar/freighter-api@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@stellar/freighter-api/-/freighter-api-1.7.1.tgz#d62b432abc7e0140a6025cd672455ecee7b3199a" + integrity sha512-XvPO+XgEbkeP0VhP0U1edOkds+rGS28+y8GRGbCVXeZ9ZslbWqRFQoETAdX8IXGuykk2ib/aPokiLc5ZaWYP7w== + +"@stellar/js-xdr@^3.0.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@stellar/js-xdr/-/js-xdr-3.1.1.tgz#be0ff90c8a861d6e1101bca130fa20e74d5599bb" + integrity sha512-3gnPjAz78htgqsNEDkEsKHKosV2BF2iZkoHCNxpmZwUxiPsw+2VaXMed8RRMe0rGk3d5GZe7RrSba8zV80J3Ag== + "@stellar/js-xdr@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@stellar/js-xdr/-/js-xdr-3.1.0.tgz#37c23e6c913d011f750808f3d8b60174b633e137" integrity sha512-mYTyFnhgyQgyvpAYZRO1LurUn2MxcIZRj74zZz/BxKEk7zrL4axhQ1ez0HL2BRi0wlG6cHn5BeD/t9Xcyp7CSQ== +"@stellar/stellar-base@10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@stellar/stellar-base/-/stellar-base-10.0.1.tgz#cf4458e081f694109422521562e53e642c29991b" + integrity sha512-BDbx7VHOEQh+4J3Q+gStNXgPaNckVFmD4aOlBBGwxlF6vPFmVnW8IoJdkX7T58zpX55eWI6DXvEhDBlrqTlhAQ== + dependencies: + "@stellar/js-xdr" "^3.0.1" + base32.js "^0.1.0" + bignumber.js "^9.1.2" + buffer "^6.0.3" + sha.js "^2.3.6" + tweetnacl "^1.0.3" + optionalDependencies: + sodium-native "^4.0.1" + +"@stellar/stellar-sdk@11.2.0": + version "11.2.0" + resolved "https://registry.yarnpkg.com/@stellar/stellar-sdk/-/stellar-sdk-11.2.0.tgz#1ddc98f5f6fa9cca8629a83c81e841c996f0287b" + integrity sha512-qInRR+mLLl9O/AI6Q+Sr19RZeYJtlNoJQJi3pch5BYoMvVhjO8IU8AhHADP//Zmc2osyogwPuqXBiFdaGlfHWA== + dependencies: + "@stellar/stellar-base" "10.0.1" + axios "^1.6.5" + bignumber.js "^9.1.2" + eventsource "^2.0.2" + randombytes "^2.1.0" + toml "^3.0.0" + urijs "^1.19.1" + "@ts-morph/common@~0.11.0": version "0.11.1" resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.11.1.tgz#281af2a0642b19354d8aa07a0d50dfdb4aa8164e" @@ -802,6 +839,15 @@ axios@^0.26.0: dependencies: follow-redirects "^1.14.8" +axios@^1.6.5: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -885,7 +931,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^6.0.3: +buffer@6.0.3, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -1016,6 +1062,13 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +contract-client@./contract-client: + version "0.0.0" + dependencies: + "@stellar/freighter-api" "1.7.1" + "@stellar/stellar-sdk" "11.2.0" + buffer "6.0.3" + convert-hrtime@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz#62c7593f5809ca10be8da858a6d2f702bcda00aa" @@ -1286,6 +1339,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + exit-hook@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" @@ -1390,6 +1448,11 @@ follow-redirects@^1.14.8, follow-redirects@^1.15.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -2039,6 +2102,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -2111,7 +2181,7 @@ safe-buffer@5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2199,6 +2269,13 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +sodium-native@^4.0.1: + version "4.0.10" + resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-4.0.10.tgz#24af8db06518807a8ddf4e5143d819f14bf7a837" + integrity sha512-vrJQt4gASntDbnltRRk9vN4rks1SehjM12HkqQtu250JtWT+/lo8oEOa1HvSq3+8hzJdYcCJuLR5qRGxoRDjAg== + dependencies: + node-gyp-build "^4.6.0" + sodium-native@^4.0.8: version "4.0.9" resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-4.0.9.tgz#c49a754935b6167e64e29ee7ed836322b9b5810f" @@ -2315,6 +2392,11 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -2453,6 +2535,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urijs@^1.19.1: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From 44aa165facc8580545309b4538dedaa9fea453ba Mon Sep 17 00:00:00 2001 From: Alejo Mendoza Date: Tue, 11 Jun 2024 12:41:55 -0500 Subject: [PATCH 3/3] multiple auth issue --- .yarn/install-state.gz | Bin 408469 -> 415908 bytes contract-client/.gitignore | 2 +- contract-client/README.md | 4 +- contract-client/dist/cjs/assembled-tx.d.ts | 184 ----- contract-client/dist/cjs/assembled-tx.js | 462 ------------ contract-client/dist/cjs/index.d.ts | 128 ---- contract-client/dist/cjs/index.js | 141 ---- contract-client/dist/cjs/method-options.d.ts | 47 -- contract-client/dist/cjs/method-options.js | 4 - contract-client/dist/esm/assembled-tx.d.ts | 184 ----- contract-client/dist/esm/assembled-tx.js | 450 ------------ contract-client/dist/esm/index.d.ts | 128 ---- contract-client/dist/esm/index.js | 123 ---- contract-client/dist/esm/method-options.d.ts | 47 -- contract-client/dist/esm/method-options.js | 3 - contract-client/dist/esm/package.json | 1 - contract-client/dist/index.d.ts | 134 ++++ contract-client/dist/index.js | 36 + contract-client/dist/types/assembled-tx.d.ts | 184 ----- contract-client/dist/types/index.d.ts | 155 ---- .../dist/types/method-options.d.ts | 47 -- contract-client/package-lock.json | 632 ++++++++--------- contract-client/package.json | 34 +- contract-client/scripts/build.mjs | 37 - contract-client/scripts/tsconfig.cjs.json | 7 - contract-client/scripts/tsconfig.esm.json | 7 - contract-client/scripts/tsconfig.types.json | 8 - contract-client/src/assembled-tx.ts | 664 ------------------ contract-client/src/index.ts | 338 ++++----- contract-client/src/method-options.ts | 50 -- contract-client/tsconfig.json | 17 +- contract/Cargo.lock | 297 ++++---- contract/Cargo.toml | 4 +- contract/init.sh | 8 +- contract/src/lib.rs | 156 ++-- package.json | 11 +- src/graphql/call-contract.ts | 150 ++-- src/graphql/schema.ts | 2 +- tsconfig.json | 4 +- yarn.lock | 296 ++++---- 40 files changed, 1137 insertions(+), 4049 deletions(-) delete mode 100644 contract-client/dist/cjs/assembled-tx.d.ts delete mode 100644 contract-client/dist/cjs/assembled-tx.js delete mode 100644 contract-client/dist/cjs/index.d.ts delete mode 100644 contract-client/dist/cjs/index.js delete mode 100644 contract-client/dist/cjs/method-options.d.ts delete mode 100644 contract-client/dist/cjs/method-options.js delete mode 100644 contract-client/dist/esm/assembled-tx.d.ts delete mode 100644 contract-client/dist/esm/assembled-tx.js delete mode 100644 contract-client/dist/esm/index.d.ts delete mode 100644 contract-client/dist/esm/index.js delete mode 100644 contract-client/dist/esm/method-options.d.ts delete mode 100644 contract-client/dist/esm/method-options.js delete mode 100644 contract-client/dist/esm/package.json create mode 100644 contract-client/dist/index.d.ts create mode 100644 contract-client/dist/index.js delete mode 100644 contract-client/dist/types/assembled-tx.d.ts delete mode 100644 contract-client/dist/types/index.d.ts delete mode 100644 contract-client/dist/types/method-options.d.ts delete mode 100644 contract-client/scripts/build.mjs delete mode 100644 contract-client/scripts/tsconfig.cjs.json delete mode 100644 contract-client/scripts/tsconfig.esm.json delete mode 100644 contract-client/scripts/tsconfig.types.json delete mode 100644 contract-client/src/assembled-tx.ts delete mode 100644 contract-client/src/method-options.ts diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index a8257d1ff9c520f89d78cecaab8b316b84b366f8..c251b2e52fc247273cb2936a2e31ce4ed1376581 100644 GIT binary patch delta 396655 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≻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�GS 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 ZOM)j-XvnwU@fW`M{{V3YJIw!w5df*&NALgu delta 389088 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�?$oXVGyo}5%1R403{L0L+ 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 =Y#r zS{c;h$th)Pq%(+Le`kUQ#wxpI{Mg5-hmC-VjSL@bywtW3;RRbsOLZR!X1Ri8PB9)D zq{1BI**#F4YNz+t)rJ4^`|n;(B7X9Q^}WaMr?PB~R>S5acucPQ@>P|f1@j9w4!c50 z;H<(j&aA@uJWBw5GE!w|L(X~vwha=Z2F|L=0b|%ze3K3xf4Yt0=M8cxXa2%GnVrgB{q5KN<9FY;PygYqDE!U? z`1(}%$AhNle}V-xU{--zK>orRT_!qsJxYNC1}vesh6o+v$WcML#LnT zjyCQ+gA^aUzaSQY*q`UPs|ISZ0Tj}>uGZ?QVv?fe>L7e^hr=lJ2nT)Co%HNRcc;v+ zvLY{Q0Asm>YRGKuuz1kNa-W$Zdq7)^tg0W}Pg$c;f1+NgDmbkxL1ds%1luhoM%+qz?{8Ebn=`Bki+f(IuAWs@bDxET{M;)% z%5WC%tl?xp6dgm0ZmGB4>O>z+gh*u;K89;s>I8Li(r8;)d}v?Nv@cy(kV*69RthNt znD-hoe|d>0nuR#@q|wZC7MmKPdQypaYy;?k!e7>>Ji~|0Jd|!mAmy^PiB9$_kY(9V zTs;$4nUF-gh-O))+uWlJ@UlEg2dF1CmDgU+>7RZ2ZTtBBPebDO9=+G8^~ZDmlPo3n z?j3N*_lG$moS(-#TqYTIb{;`i?cIFWsV+jNe{b>zXa#IJ<|H??m9OK}%)wIZR>SmS zn8*SZICuaS;?$1EvmthzT|W_+8edED*zVmf-p^LDgEj1}G4WPSBCzZUXdsZ?X-ybB zAa?Sq(N=S)I?KL5{=ipoMxb-KlgQ}=FRgrx=s9gse74`wJJ)WrdK*!z6vCPAF<;=N zf3JW0!$LsFaH1W@$_kCN za0XH}LEL`%VUbNBewhhMQP4bwCGRhX^?e>WgE~Q#Lrv5ZN~salP~}m*uS1E&e-@&Z z0)eM9T!LYzx7^!#q}10CIFe|16n+Lizg<4m*<4nvgo6d!wshSD$<9l0G5h?&rSM~J z23XBr_`zeT;&BefcEALPXt58zppFE5cs6gj;EdG*L|uw9m<9m$x?=Rd=-Bb-kW>*h-LWTZ^9Bf?Q68tm>YSo-N6#9$ELkx(C~@6>M4Kg~~@u|;t_ zoVD0zZZG(VU?2Xag&UBQX9QDCZ%A1Bi6_lhx;i8$dpqsXdT-W*hjKG{e@pWl9(RyZ z+0_%8du}0+7%Hpe_1WQ{fBmfw_tnc0;#&q{?>u}zNmsXPsDk2i`waF8S7K$`@tIB@ z)>5!TWOyy*49HsHX>1G~xYP4Yxby6sJ)IXf_$ouzZEb`Hq*{+h3q+m9 z^rVgufpR|aIJdRHs`hQ1h3}T8DvC|UJ$5@jiTm0W^j|cW|7ZXH)AN?!-+PbRE6MI3 z&-a%aHn)YWJkJ8{vk0cQ?$_u`b=sqo-)$gl1TlU)fq~~>8CFeQe{@N-#$1iJuBr4S zg(qdbf}Z1nO|oy%Iv)?iQXGG+b_Ez3tFVnP&K{1gd4*Mkx>;MwGTC4xSYR&H8$7bq zLDtg4_Qa!&CIirY6Oa?(0D2ZbO?fdP6X=MTcAZOSr^KiPZQ_6)7n=$?)Dm%xz@W)- zPG3}ZfBGGp^ZWJHf14Uv?>%;37A?JKcUzuGL~7$WZP#TbWg^McJemlW8M`+6BfTdT zomD%ZwUmucS3Jo}4U!ii{by>Bv177x9*?Lmm)@|(H5o92YTFAs#^OC|95!Ra;_4R; ze*oTErfRrKWZdGSu=ws1y1-KJT`{Wj8K**1HUh>_Y-3=Rf5Sl+oCY??OLfuiV9q@? zRrWgf1k5OURtHNuFEtm!JhS#SD%3`P@W-O1{x3g$`2NHE@D2a84;r*Km5B7$A@2ixcR^1!;6BJx=#6Q z-ZL~^x>#$we=wI-)8gDBCsq6IZLP?nQdH<|QIt`|3SW>6R*D898<{e;@KH4` zF6ieIZk;Hvr$xn1nh9ljxAvOvWWU#Ahtzmw80LsY?M7?#ZKry=;&H4EPj?UY_M?q7 z_{mVFZ@gv-0@XYNNHl1JPS06ro7$5$_Tl4O*yn@iiiBaBZU z#cJF%05T+!3KD#DGuIr6uf<8|EH)V^9W~T-i@T0H-mE`sx`91|)k`3oa8!#)9^HgU zV=Tgpz;@~Q&N@V|JcC!N-^>43n9v_$xW?BCFeww5&~ zngvazQJMz0;qd5gHZP7YLdW0%6#6Gav$Pa+N>6>Q;PX#^^5o*Z$L)(9eeF5@)ra&l zuUFh!a%V_BTVBi{i@m{ib(YoC4J=Ge?yb%1(FZ!8PFeCM!orb9v1Ayv)Ho$ z7+Nq5VUg$b{FesREZL=_3)F_4dEVgSd43@(+;Ufdf$e#iWOD^xl*^*ibgMTDgiK6u zw0+R>JuLxaiGkpL)Rf8GN>m-N+itl6k9o7li#mgVA`uV?4>-dn+j8+$l?PTwCM6Q! zfAfE2NB`T`JNn`Of8r}|DTuuD$iA_s!{@pG9L-H}44$%qa4}C7wEWVW{IY$5hfsVb z92Vw*8`LMacIEH_l|_Ak=2v8HYKEr(9O5J}+IF8F9*GfVu>-EO>MORPpDgCS2qPRM$L@>S z{oi)Pc6aBO*{zEgU$BaBY7ub3NW29jG-TB~>e^y8F_IT9Ip|q{ebIa8gFUf`e|f3j z#MpZ(iLG~5Yo}+rgtFi@jE)jYJFjp?-sPIw$LF~M*$Qm=g^r$8{qcG%x&}4(!?Q}g zZM^`xD`B~mKyb6%GlvPjx|*_b#N`g=@}Pt8$i|Ir*~7LC9qboBbV1Mu`2@Z$Z!5;Z ze6VUtfuMovp5uH~Ti*Z8{P27Bf9<#I=TFS>5A5dt_C9{^as2Z5BYwWtWlg0WVY23C zQNdoh>DFz5p3VDgrLG5x_o!X28bH6UqJce#f}dbJWvvwI`62|kJiZ4yNB)m>9W75% zG@EdnGS8l3tTsh-ZN6SdZhHa7<@oR|Y*25lPhHEd@l;QK#=W+p@Kw~5f3)xaxVm1S z=cx?_k-1($?*On*=a2BDp(iuAE^4}}U;1sQwQk$)8;`@F)TD+s%Io?4NM!yNy!9Qs z`WWmlQ#>KF=?<)SMO5zRg0*05X=gorGE~7ab9~k zfZ<86@vt())BAoce{`Xts+q9%mFS0m9%8j<0bLNbfOTJIUZe5XAO8K@`}MuY?#KQ5 zZ~ip%9v|u-krgD~4*M8sJeDU$}h;etB$GYM&hlu+}45xJo>< zvfLGyxgTD4K={%{97=fu0n!@F@Ggg`32tx)VBy+jP_K~{e|XbAEwEv+Be6af>EB0) zy?Z>eO1eNV=K@iA(NB&AB0+h&Jyd6lN7FW!lxBiDv*(K-X8UNCsvtlzJ6^3~N~Kpl z?nX`_d-8v7nU+7jZ?FLJ@2P)$=fV5ZspE4~mm296u%T$9o)N1x83;=T!WDGOeS-Ff zd_~-DLu%Pae+y91TQBbgNQ@*#h{l#-upXr@e6#21Jn8yXn5VwgK%xqe$b{hx?TDn~71PZUXEifIk6q-qI`S;> zmZv3DL#>iENwii!C-q#O1D+jVmjeWym*ViR6%GE&fA!rr-+cEsUwxe8>yNX4|EA5( zJCES!nf>tP-pw03zlf2*re|0A4n!7SL^uzRxF@UaGL=~|G@AF|q_QgN(IMg3p$7hT zht(|lV%0$a?)$~fT0vSby7aO?NI-tty`@=OuSr&;gfgh-b?@G(8gpw2HblgGt`*p1 zggu?ae~#m@3yR@r9tC=)YaM7EXKi;aVb)Tu#L!?H_;R$9ozNb_ATOzXod?-KpQ&Tj zT+>tS!Q^lGp%tMu86NY_O*10$FTLw0=BloqG4UWI7gSDbk;S73XB&#bGAUFsa(`^>q`s$&;YY3B>;rl7S-)aR5A%53@-b#vH_k3a@vz=-MmOH_&77wO#u1BaWDXRd@^65+y z&Xw3S_LRu;`y+YSEWCwk~L)LT&t za2V+vrb0fm0w%K4!xs(Jsvvyz>%aXS$@lAT#+wa&?>l~fh|qtB4V}d1@<%qL@k6(0T4$cCEIRkpe?cm!J`~Ri zr#o91!ud&#(Xp^zH~HAH)y5W*&PF$z^!cZY3@q^d&idcNyvN(8X74?KKd!O=^ABt6 zIkb&pIq{Jrb|^gP#*?TM9-!&y4SfjeJ(HUfzwoYIiRi0cian)N3F9nfZNArGkkfm8 zoe{!FJonCylva-1)S}J(f5qLEU>V7kFsi-A%CG9@OvT0~FkX*p*EZ-J_qbIzpX9jP z0ypT-WlyQc-*Pc8x}c>iH`e^A*lq>~0f3*jEu}}dRG!z<<$FA*R<_MvgA)>EP$FGd zcpPuSyS_f2{iRr9y!WvExUT+>Kdh_MGFv`YRXnEJtr)H6;<@HBf2lDh+8vD%#<^_4 zZA%5>M#viFnuMyJ`0=rm;N=0veG&A66?TDq4hw4ej!E0a)9znVjyt$n!rszeS1*;T zN6-YAwMlgM-iVx?HD)|Jzwzd|Ecs4nzgzNh(XMMy;jLm(QE(xtSk8-Bjt3g!`<0}! zGT@q}0j)L7y_LB+e=K`qT$WBD`2^y?P+l|CE8V-(SexvN-1fAq=*Qd`%TB}w2#jF` zhUxP3g+RcwS}Gnd75D5IIrzCiaAMk_cjJjiIlUHB!sWWHu}PCKQY1#i4D%j|3V|ydk@=}nb5n(aj+&Tfc0!_Dt;LO zD}pPRcbU9i?uMhwf?n06?dF*Z);;cL&_i5pS1b2k4%^mPLZct)0j3_?3yI!X@MagrXd6dPryKe>F zYfg`b&si&!i|1oA6~c`6h6=TM8T{CR!d|Xxu@9AKEpsh?%Ywf=7NQb|fBAs^y+`oJ zBk}+DKmGlOuRnbJ@coA$KC}`-i{v?-pNq`19oN3tzAN*TbJT{}uS^!%v_5TjEnYpD_97 z6W#n1_<6rC>?gYT z+rIzwJ+J-y|LVivbJEztR8B>WqDLQO=nizOe_BJ@NS5hZv+etrqT+W_KKRn)HmdLf z_YU5J6N!pK#mZiK`qM3gx`D@8u`Zy+#XkV)4kCR{jaLS9$znNP-xA!lw74Z%F5+i_ zBc6>&0DEV#Pb;5@p?N;u26Q-My!q5t&%Htq zzIyIG759ov{M-7xv)bN!gRhVM_pV^Se_HofT<3M~$%}t;AGu%e{oDHfUO&gx9QQ7X z{B!J`68W3?`I*!Hy6}O;de})zG zL0SW!-2}haG&|Q;AEx<=S~CLuW6;;jh4LM|0+3I?GtXH~5 z6an5kr>4~43BdiC;DN(F(x`>S44%e=CD{f`Gi7jHI@c?j-T#L_Rv>+~V_E<38%F%A z9Vy)--~ZHZc<*uj$KCJ`+70n@e|7ceT1=g!j>Fy{qElL@)dxk_qV?F=F>JZf$wlSh z>UFl@cjever=iCKq`$@u{I_r_0e=a!2Hezy2QnLdBan)+M*%l+{0cMaFK zZ|#Kl9@Br^3ICv-@KTX%Zg}x;$#yQzE2uj994sFdJPE_$${tp4*=<U+49Cy%T<3$FKi@ z)7SSNzdx+{FB!ov$J6dkKD|zPKLR7YBO4aSHepY^* z&^8Fpz!TUciTzB2DFO9r2T{(vea+%^GIOe|U!ZLw9dwWtcek zWANx*aL|tP&_D4!??%`L7p+@+8r3?W$%IqZvxSj?-`|zNTb{R!cC}+J-XwM#rU;=? z;U$74ftUAK{9I5)af07RI%=>03qtWa1N@om{u|blRl9F#f4uYP{bQ{E2d(<+b9L+I zSbu4NdguYG+{T=if7?~F>FDYw#`FxmKfO)tFvxb_PXZ?B3vuTPcwlO)QW84QGnMDm zB?*wb48S_?ZjH5AMoZ7^<*aHBKwH}wD}8DHbA+L|z)Q#k?jP~7t|p$Lq}Jn@$63xc zZ#TiM6za);Wn~{vJ4AIU8_(#+@SO|by(#ng-edXYA@V9&eMK4Q+7tEpD5m!fE>8wJx5? zE97w43Y0>Be^ibl&xZBm&2IREwo>0ks(R>Xw{|>EZ%AqlFUxI)HrXZC(3B7F^BL8{ z3lB*d2hTa9N4E7I#EwGZAK>KC&qCCSm--fWZdSm=z<7qKxF=I!A0jdEOK;9;Rk5cm zylJkgb1)ZEq3iQpC-f?L?sk!D%VIisCV3ih?Y#Szf84qf!S(LNgKYbOvMtL!FptMM zvXZWC?z>S~-s(A8@_gKct#RGw+pF#0ewrVDKR z=XE5De}b%*f}tQ@A>fAgy0c)ky&#A>jymY^6Crk-a*b*!eJ`{BBxYNrt5setu zs$G#0BUutw-d=M5`iJko{^rxKe)!aWJwMLhe|`7y`?pmq-g_{AuFLI@vM3K*hCIM{ zcM$&}csp*jcdp0qf9?LkYaK!H;2hOdSC%JggOMTP%z2zC<@@l)461vp#8erb<5G8X zd6nA^%@!aC_sO>9QJPMV4B`3uRN2^dHgX17Z>`DyHkKW8r{ESjkvHu`EP~#!7QZ;H zfBjhs_+KI4Y;h%>RQtMnyNw{%9yXW;PncL~x<~RBu=y1Zor`;8=&YLy=l$a~-CzFs zuRpfm{pPR9o!@=;&5!n%|MU}C^|$Sy zINV;YH@yTcdNw@QGgG#4EZmW}_4>wu&;yd;$Lhhaa0W6t2$syw0?ok;)M`1WBDEoO zi@J}f=}9Ki@mOT3kimG+&aR+rEZc|f0bJ+&`}1FVw;CLAX05+KI5(dG$~aXu z^=T&5NiB!21htY_mH4BF^|a^VJ_^5Nbx%Bw0i579Ku(udhYXJ{8N*XV!9Ixr9K1>) z?d28Cfk2Yi)m6tXQ&G|Ie;!ITGEmnwcqZLx!A0|EO>ZvVA4E4!xI{SGlL-i{Lok~f zLR*;)rn;4d!lh!w)stRVLzOnG2M9VjYNT|?c87{H>L9J3AgV7*@8kUKcfX(Qo3Goa zH;L+dkL4RhF+YdZ_Q%Cmo^2@tvQQZjcpHlbUV+cAI%t*66f6W< zM2AC#qXO0%-ISpnz*M-}Ci4qSqRdUpn#n%xA&s1kfi8N&LiH=C{`F$B5_{z<@aV#- zqleP0g(8X>nC{a~_ol`IA7_q!g@Wh17&Y1zvK-GvGFz>^fzK4a7e z=mwMpj_;>JJ2QS!GD?gZAt$YI*|>18(dR8WI4*Uh$wc*1e`}5TXgrMWyzX@GD!@K@ z6xF4>KGx_Dr?2gb z`i5lsv3>Kla@+e3>d$}KJsu979rUUauQF^MsAMzH@LGV^ZR4)}DO+mzjxd_p*;j97?vg0KwiahDj%oT@D~P&t&Om~d+VKw zWwVw5v0}F5M{i*~WWJ^Ok1}i?uFYAVTq;2;69ke(sWeqe)&;^LThT$g0 z5%NX&&5m+O-a^7G@i?nzR0D)ezNs+>-G&O^(Ph(Yf5>O2i4o(oHA3ht-b1Jow zEPn+Ih0i?}=~u^Rjg)i5aC?h6LcE_{+D-h>17)PB9ZppD;MR=+w%d-i7?a3kyYI@W zB+;cbf8ND5eLB&-+8hsEJnBvs_qiTDGcV=6TCveJHXXJ$w|sq{_Q2G$&hh6y?Bq$j z0O*}}tlEiPcZ!hAmz7b2sJgMUPNIp5a17;GA$NN=NwAg%#}F>2nk~6SvUmsU({p-Q zsBCX`^_cvEb7_?^{{CgQgWOw{@$Wo{Ut+bNf5kGZf3Q$jsmucDvk|$EkZRU;sVlgB z>RWPq#F}dI%KcicL$^Dh%5!P9c0Ouh+o^l!z&6Z0rrl|~)j(&(#>S4d51j)qJtv?~ zz+UfVK}Lk8*Q*TX`4FJ4s?9>MP<(ZHKpoy}-jigZY)d`v#sccBp~1U*@(W~cvl5|Z ze`J^-qswkk9y0;Rc`{}<99=<_))@VkAIL02<#Dhi^&mpN(r5Y0fA;;SpITY(J#cR{ zB5G<}$K1+c$8(J1-YwLsg%CND4!L03i{GCc0}x{)W87N;HnQSK7d)f3&rL!01f>Vq zY9=&0RBGPshP2FVdHj54H94|zpP<@ze<|t5JQ=Hr^56Y`|NJlit51yA9RKV5^xZc< z>~o|4QU0VH0(-_&I>K___QX1*-X!F!r8^zRutc|e%Ey}31SiC+0SwCz5weh3Gt5lHTVk z{jcm< zk_>TVinYzsX1&nnY+O$&2g{Ca4epWt4&gn4?zvj86XQ*y){^xA;RQP;A-@FR(iepI4vE+H?C6}Lf8%Kv%K&_|V;`uG zlM&L$hdt+&_3af$-XP}@t?-kXc`fWGGJW=v&SpLaC*9*=yTdB#V2(1`pKRV4PrYTL zKF-<8~5S+R+9w8EAf7Va^TgrhrNMX|`y`*iER)Y#`iGHtX6o{<@eEbhnH+{71hq}FB86?MUJ@%0opsd_ zWA8Aitj$sMsY5X{KL zF}j>2nY^7kht?s2IF`NH?A>LjQ_4y+@@teA16MvEU$O|O!}^g^=OBhs*QH!mARPCt zjvohXQ+GIif0T{K!mLVP5JHHl4^K9rzw5G$E8oyj-A!%RlG+jeuC{L9sJLUUUN4rg z&X>#!Bb2VjVm2EL6$1dU<%Wq9&M)C#wHuBgau!Qw2CsCnG^3~WDgwjirOQjN>+0TW zUYRky3<1!(9TD(AdSLsq-l5+L8@gV_YxE}o?iYSL^*126V_oE8c2w>o!Ms{m8G z>OShK|Q z&T{}1fcWeXC-Qbvu9S4`fgJ*o>`+~1(v56{U*^a#Qd1}ib0WxYs z;0%Y}wlue@5m#cxMWvBh6sBAycUUfWQcm;&cctynNr17=kK_w)P=FQ+MBsnOFNcdI ze}eO^&b#4B{Oa4gw|Mch*{I^Qjb-(LE#|iVGvv8xY{y1Oq7FOQ^-wR60#M%Cr(uu6 zv4g;>ltAnT==L<@U|D?7c?_uQN%Ec6eMh#<(+MDDt4{K%%FdIEmtf+8M?j;Gi|h>+ zR279(z&>VffM&50@e{ue+RB+eLWky-l`(2?IUD&*Kq@m#`(2(yCZ(peAtXKJ)Mf6dnuM+VGWkf8=8TOAz;yKZwyT zWrh~6J_VM|`iXMoWRsE!>`{|=@R4=56`dArkDI4tg?Dn2?#Vz~(g_*2o+UlXy=D(S z>#9>f6tcLS82%=exvRaP3XW{i{m7cPoc*?@s<9e}Wyxt{h5Lj^T5QC$sZ2j#(%QpZWa0ym$+Ia}X=XI{1$0K;U0t@c^Hum{yN{+H0AqY_Y zMA9Y8vWX%Qht!``hAahK+V7UOeahG%E_*wZu{nYr#F(T?={yS<}39jH;&>2x)C~P7uAC zl>#oH(7AI^S2n{AQ_{KpqXf9K+ml@nh3pw*RRsF!f5i?vk9?mq53L*L1R>jZ3J*AW z8LP~Wb3>NL^AO@jZHL}+r}(K)wnCp<0W@lpo^(t&dge_u6VrMmX#1&W#%_GoFa$>ka2{^^E5+~x5p=u2>1r>-$qmXUsJjdnbJ}}>#fCDV8mDx1c2D>I3 zapyP>PuzlrCw!`PWvpmjvo4t6LGle&rmy9}b7JA^2h!^ytf;ZFPPA&cNw~3X`5m4R zFhoQk9W(v;fbW79vpR!`Y{3{=8e&IS+;uQ2e+xMZ%bIbx4N>-P-VX)ceePvV?F1u7 zf1x5ztMTJdxZ}{6uib~I9NF_s9f?*WL4kkl{`9{<63rg#+v2$qQq{JVt;l~~44}>s z{brdO9YfHV@L~RXDHi5L&0vyBHX30N87_M|V-A{psk}G&1=n$13fFt%%b;amxTv6^ ze?Ok*q>V*Latc~TS)Hgp(&4Xwl_Uab(a8`FWq{Vty+jYkS#;?-Sau)_`($qq@fBGQ zz<-jClxt@bZ9VKo(qloFyoZffm>m#XxBB+zQx@iBe0V}rZt~{040XfcD>ukb>pC)e z3qHdASWIo*E3*}pLr$IeNH8EEwax;Jf0-Qicr3xF`CYWSK2bzL~;YZR4>? zoF6n%J#ahlI60jq%ZA^*61O_8o<*q;b$b}ax~x}I^%aP>tbDr&8P|5PDJ(tfe=Dc9 z1@UL{2+nuNM8g3!EhiMYbRz32BrGzxj%^IvO-g}zm$CI6i6ir6n*xAfC&d4$M{!b) zLzkr6o&hiZY)^rHMo7W~cDb4c?t*%7+jU;6?<;FSA;ClCQeL`(dV@Zf1Q~$x($c)T zl8FM{J*HfZLZdvH8H#Xod){`+e|916a0`aZ=4f({%}T_QBi&or$#&OKRL%i-L`89r zmq*}(dv4o$XwTQRZz9d>~Glqn3@MxOFG_86* z^)*#7G)Lk{(HJS~6g0frfA>@MXo+ID9T&W!?tQF2$7Woh2GHLk{#-Ys)tfHMV1*34 zzw8<|2LnIM_odm%M#3g)90j1uoE60+l%%%XKxsCzB&qy9bQ-%Wv>dDf{oH4qJ3s?$ zFLUVe*cAudWjQz7r3;xJdPPEke8MuOvNJs4YK)MsHatMm5seL|e+R9GF)C^+UwN|j z&O$_lW3cWcW@w9^_+ zkjGMTpQJX}-0TSRYVi8%h#*A}+yv-ZJq&IlcJkR5*)M1F#l!Nedk?52^fCaH>Xc=xpMso;f{> zq}cn`WnhG$g0`IT7fde@M8N@R5a zA5+;3^zrnQjYl-}pm*s-6my2&CVs4xhX5bx=lv*g`avy9N`IgNWPA@C2cY~xA-kgh0v&34ty z5Og#+*>i4bz@K3jwjJ12%E~A(59WXwC@KS-hS)($AJtkaplzkw@=4$X8AWx=Gv|>X z0(T^n@hiPB&&??gY>CCxxv~ML`(miAZI;kI?gWxwf8g^Dd#F5Fgpstmif0qq!|t{X z3p&Zl!sTZHWWBnBd^3lg-$$U>i$fAq7YdES8sc_TRKB1dQQ<+R<7_LB%KculUdj$t!HY|Tom{=I-?Sal#Nbzp2g{Mu z!`MvwSV1rPppegDqih}D4xXR~wH{?pv-;lZ&(0HEitZD24~TwPz`}j#$HQJkrhF5E ze+aBa%muRZJoP3_W%jfNhro{s(kPwXsR8}mR9oKy(sVdT(^lOaCgf9?^y~~vAhL-v z9enPp%qol{>=U%byz`11zVahr%_D3iLNMvO_1I#_0P-x*02Tu2)uB}jB42~O`` zZCiROiyX2Qw0MO)uie$h4-GcYnV+NNg0a4wxLtOuUe*YDmI=1= zl;Q5~HHL71l-ZhM8Rh4QFD`#mc|U)SlpF9%Y}{-u1&J_%rJYjiZJ)S2OAAgqK^8^r)kyj82zQ^X0~v3>-k z4_p_US+@|6?v)!D(DJPKIHHxuHgY}$vf`00bT6>P8p|!@i>S;{vYg}gH0(DR=e%#>tK!DV`%*SFe@m0sJ(b^Jzt3zfEKBHoV9a$6BYBP21BSBUWbDJs z?qRVC+As<*5y;~@?0j11u2rmxS~3Rnv_|HEwW#@PCoWmbeq+}{)8H(n^R(#_3~;5! zQ^O>a4m^Bq@%xxuaE*l#sW8912WW+vwS5+X#gYIV7Lf7Ky4{PcTH}C3e?Pj6&&rHt zFtuVF#Xbey=TGYu<&+EVnY7f)9^+pO@w}{i^UmA~jpZ4MMVR2d79eF%(*c-cMUllO zn4(%kGOWs1yv))gJD}K5MI5BC*$oQZ!V}Y5h|4pp0pKrIhV4gyv{;1jvX^-I3iV)v zK-2kP=&~4%T|aeFRWZ=2f0t7?NXD3OE^Eo&?8NATuuu#F4+!bka|aLAr!|_oW0Kzw z)zlcDKm=wz?m`l9GxU2}nZQ=h!Ao*rk;jhXQ8amYkQY_})e*}f32I^wtGW1ytY5ZY zBe_-Y%Z}n)G%uB`1OxB19&L%Z9st+{^t6E9YF~i^iO{1@`@l80e*ovek_n2Cj7y|w z9iN2|Y>w)?fpY+7Kq${2GvK#d{2VnRG$V%-I72XI3Lv7oTQasfjItHgPa?=4j$5{w zlC)-x=)Jr!_Ixn0gUQG2aZ3h)ta{XWL(Hr_PFk|Pim3rU9PF0dn(g)MEZ8{2$F}U3=Q6^n5tgd;pg!PKpHDXQq3)U%?Y3*8`gAI zd$iyua7WWu$?%zHZ^vVip7a2-cRO#BVXGJ(EyC=yCRZuu+KK!oFk8L%laRd;?j!6g0C|xk*(>4}XU{;hS1~)vY>H$`;Hf!{1*%sEO?d5S0 zTMrfzusrjHM@uX>Z!MiL=`nkOygZ(MdvtQ$K5qwQZ0fsDUo{K`c9D%;K*A(IDzTBB z!qz`klp3P3rY(1|Zk>-~{WRa*n?F^>8B4Ovy;O>ie_97W-lW}H;#37`U6G1J?aFvR zMVATU-A>j*irQ`-ckW8~6bM}L(Z`7q^St#5wI`)&J=y|F4i5_;NRw4jJ?c2YC(CUn-A6uz3i!CaLd=c@ zo5Ru-f6`%QGo0$~PY{namZW0syd5&)Agh2hn+jB#K`sd@t7 z4pISvTgpd(Y&OX(s~sNwkP~=4+#YF}bl^v;GaS*5`F43z-k~p69YoeD02+i#(lRvV z$8*@A%CE(HAUsQaKvBJ0D6!qSPG!Id%d-adpcOg?LtVBBW7fxMd7s-ZVnuJKM+HiQ ze`}J!TJQDtiiR=tX28NvQYKky?pWZ_Cpiq9z4cJ+C>&NeOt7@}=b%1?vu*d`*&dyD z&uE?FCNoc(NlpEwfJ>cy3v}2z8Ne(6lzDW4L?&(u$zdSuZyPDnio;rix?)TF09Yv^ zLLwnWWAIDMSe}&E^!|;U<(1Y|RSg-2f4WePB+X(NAS4i<@Uk>dH>M7HY-7u(p=(pu zHkKfywlUh|soIw+2t>BBhx561HFzN&w`REA7044l4Qn7qzr25aD)!*0l9Le^}1M z8bU5Wk-2~dG2(o*PyckKnu=u_09Qb$za(VENj)3{{Zv%~?1}^?L1|6(19l(1m1jL% zFjSH*C@d(h!b-F=Ja%oK+PulV$8JtgnPk{KGufyNGWqA&h@XH2bi9spRK-m|?F8Z> zzJg=ji{Z`V(p%w7U5^xoAb198P50WDf`8|2VI&EbNj-0}HL;U5x-r{no+Uzxng}Dn ztXrSax^;TkdH11YR0d`d`KPAEoxuJ?)H3&QDdbtRfJ~dpBT(aH8cqh;8Bsq>=7(ctLeGWPOm@$-(HpDBJEq4z<*j^ zo$U$;BJ@P|amrRo!nLImpn=C)wg^MJJgWlnz;>*{V`?w9K09ZhvnIU**+)A~*+0zA zE6}Os)ne0O=bCWf%Yt}i)l)0myA>@F-A0 zhYaPj00P<2hd9jB@fRRkaCa558PnOkqJJuK9zONl z@*C{*EMWuolF98y%s-DhXd!mDnAS=&|922?0TslB?&x;!=xx9U%X*8=J7nwPScEIG zQz7%jrCFP!rc3%Nn={)_aNcb7!zv!alv0KF05Dm_DW9u4~PfY?QG6L7^5+jk>RkK^VF`s2k^0+U!ywLmqOigiV-gH!p+%I|=g$A98U9i!@-u{;RZ!LaV( zi$|!SCL7|eusir5B+z@d^kud!@k)TN?!X+c}%WM*1&a>e_dv+S~vwE_N#1 z+f3;RQ}-rpGJh;7_*(!4fSYNJq&JOxcCc#6N;@*;?U2B?b76W0>*N-uSg4Z}UbLHm z@l=k-%Lr9&o1|_?_8xEW=0$J})`x{6UN|iQfeBph<^kD)!)4Y4+vEz`VyRQLKun%F z10uko&BLInn=ujS^inJDhEcn6_F zu+}yu;Xp`;=BaJWSqX^;|Dt<`zt$T`hN{@Y&V$*MxCm7Yzul)nW505_8BZ;^!Qmv* zyl&zdISSa@yu~~`hliI-Cz_gHSKd@cv3O#dr*0>q*JGie2~)TBmmQlm)`hlOeR|bw zD)T~t@Ok2!Qy756O=MpW)ZbRJa(tA2S7r9?=n~oL}{(v*1IMr+XYmlL}0~ zi+?=K^zy&vz!Q39R&3l3y7dy8JS@wEE)Y_@R2qADI-&vj=;SXol~=ocDH=j}^o*NH zvBvleroKPt0bp;`~yobQdKK5`q`i z9wFVyl9@oHD9y99$Vhk>8wrF}PkDO>FV+p{{sEwin}Uj=1R`D=SOL#+E%bPM=zs5R zpxxB*upgm&_Y>uRmCZJ)L{9HKLKW-vVq7B3h%9*#^|OglgSoB+HQAUnu13wiwt&QU zIbZ}yctdR8JI`Zn`~z`l=g;F24iDO50(vIvf(ul2O9)r571_!F0HwQ`#-erDWp7^h z%=Ou2bs=bXaHwxF!HMLQMDD2JNPo~{)nqS=VZF_Rv3tT@NuF%$TU~lW)ckpzHKhY^ zX~%K{fD^HFb=EihQm%nOo$WA!mRC5Lt@ueHX>S9P8s(5oJ>lbG!JcpmgRXkgJj=9F zi9c)7_SM0aT@gGx$x6#bFvPPPRmx)0uSF{N*pcx9^-QlMAHX8x*}VD#_k6ft7uMM;I9ZX?*NQw;Lf6D?uz!@^hEB55l<3Lx1j2_U@C|KCs0r zfx>PjMXi5Z;5E;h$b1ZW`+WMEOY-bw_R@i2O^Gv249SI+(C2wA^S=tCWw;}SKVGBr zrxk@3v4aRt)^@hm>RESO7R%`}zN}0#*Z0Y*rp1a7g zy1(%f)6*&|8B6gRkbn91`qfOsFj+dsq_fs-9b+qM-|5{h7-8LB0@+MM>a$U37r1x= zmdo5#nDwx=@zH>qc(CgilEqU*0UiwS4$!n-?-b;M3ZhyVXOrSuV#`ol>_&KGFwf!z z@3DoMI{S}w0v4KJ^bGLTHdKiob}B&xn5)Hg)6P0bv%DAdmw)YA7FPF23N~n&8U-Vk zgLv>u{AI(F&RD(#L6-Qum0f>`yf7p{^K~eqt5mLy&mQUW+lS54Due_Q`T;C?QqrLr zwzLbqc;dSF7<*&Wz9e)tvUD|ogd5t1?v=DI)2FV$>kvFbu;2lZGq%>2YulEtSK@O# z8)=XCBUS~G$bT7jt7e(i2lmY-ffoV4AMrB*Ack5j>vxwBEG?~4vjf0*Sp-0$At)Z6 z#qN4!vcDFTrBv&ZiHepFTsLbZfD5}BKc!{2=Tb@BUj*@lf3xSUsa1%d%*-pFHcxcO zVubg=I8Sy5ur!&bc&TSt+Lno05aI%Z=fqwvXvyXv>tkZLn_s-Uv+Ji02 zK~$+Yqk_Y6vS}t^73OBa@WGm{k)MAEG6S>-#U!FL;+J}HnX!|~fGIlxp8S_C5Uhnc z{xj{VyIB8=Fcgx?9w&kO*d>E7NN~twf#I?210W7T1=YW}2)u=0Z_!U;Er)%gUz@^v zx1~0h&4110iKoEr(iXzl6?D6xom4jL{){9n=+x1y2W7W0*iW<1=mH0Oinru|Nz2|0 zDfT#lAs~Yjzq%qZUMez8481I~DT{WJkXZDankrm2c6T5?uU_J9>yZELqTqi|mxTw|@=I8+Bp>OvS3m>WLgcHFya0SZK1w zby)xnf>bBOgKP^f@~#GVRzwK1dH!8`BOzw+KB z5;U0Cn@qy_?93wP{!6=RW}AC4bYM{C7G$L#)OH_GYu2-3^ygsf&blCzaV6%c3p!ee<1_|fJWa!IqtZjR%WZ}O76 z8%l58jhgBSaO}PxsiTi8o$8>(Xr^HY0LiRTCc3gd8=>}m{900<25z?0=d3RWAb;!b zx=`AN!sZ@|`U3SHfPn<@Mb&}WPe!n`;a>nqpITzMtp;kdv1Qb*xih2_i2clCvngwUiJz{}trTd9BcZEkR-iJyhM%fW z5v&`b()t$Ql+6ubHkdd|!&&rLH)~sD6$z=*O4Xo$GAPwfQSD!b=fO~vqJMxAu{PCx zH#KyXa$APrkoudn@*v}Q30mEzS`u1n8-TrbhZ2$@2qP=}n7miC0R{-mveH&#HgYH6 zZXa=Z0x-0{9T60yOXJh8)4Wjw5%c8{V9&Bjh1Z~AWKA-IoqSy_YQ<3t3))oev0_m) zLy`}SCHV4@(>t0$mTlT2vVYZX3!YWCv~8LF1d>$OZt$XN+}$uBnJ2(c)pes|7+d0k zB<9uq*!hE;+j@bM%DeAvh(WY9STb-BcVJDIOFl2{%-dDl2lc<;TaiW7<0EY9#jL* z2Tc~0C~hkRHMlxRA%C-*#{uqJCg|B7oTGR}9qlT*wOKzNQsJ`JjGzOO)Ds7o+Lb{I zTmAaF749VD!n+%9$VgZ_N2F{IL|6I2vTyN|s?q#e594x%4^ft-x5Tlm_yIX# zL!D~B9tLPD*C51Wcg@`TtDB~Rh8Q7bknog>LW`_o>mE)>289D@T6{tjl;PflMr&df zxgnEVKdi?dQ0Z1_f^BP^0RuM3(I7g_BJ+H1pW;+3i;z#?k2-h9;rYVFSb;lOOFCUu zD+tL2DQgO;q* zk_Tf?PymX0%6(Z5NGKts0Qh-3-onnn!-7P6tJxkRA_Fay-t%EmLQ6`jHf$e1k4FfaXalH$8(n`Iex#kx+HE5Q1KS5n0yGD2-Gj}HJvHUia!?qOF%7O}Dv~*fMIor99p&!eMgck4zyEP78#M*!RnE|$K8+XFv)e2My zL4Tj}YN0rxfRFjh7ssprpSd$JljX*ltuL~GTQZa8aP{AWIft#WLG|AEYovR-t8yWM z2oQ)U3H0S0qXJ;K%Y&krgp1;PAZ=4QiqK-aw+j;H1|ldc_Rl!v4VC#Q-5_o zu(K7vUh~Uh{ba*hnLCRFxw>N8oPTG2;L+^MMu5hnuQg+ibHllB^D(h{If0d zH!k6*2bCNE54M?>hYVFAoS>Se8h-}yObxiDh}O9s21J+XB-Hb&NcdTnRqVnVz3-C5 z4{p1?(~oDV{@mwCK+`mjNVvL05bD~XCE+(N!4CAZ?E17!bDVR&=fc2E&kgtf6p*}Q z!=Ey`=Tm%sdP2r7!(0w0DF=ERVzvXfS|wRZgpGvXxP*TDLOxqAu0QN>5Xn|-A;B>XFK~m+s|ueT zo4#A{&@=p@Yv+22H-x33ZGVr|A^VJ9tM~Z|&4lf+k%b*)K0vjkuU@4X{>X1!0&zvv zxi$K8o!4v=BalR8vtmEGk2rMi5U3;BQL@_Lso&Lw=ny;zJ3*+UnVNfy-yMhJYuD}iJdkDB`s48rZ>q2# zV~Jdn$6^Yc3q2ZC(xlT!+?5xhYZX^=d(zbN0T6Q|Jt;d-AAcvyzt4(5N*AKMH8^UV z9b8S_d0Y?3*}Lh^+&cm|H2NU4Z4kXyBKl<7s%(4&!-uU>Zq~4V<+mFF>jyjveBZIX zoICDQk#MfzdYflmhMyCi$@AC~B$Yh$3{p}q6IN0`yLYY(F@VJy@l>d8DKmLz{6Xp9 z`J|{r{8VWJ(toJxmhK?%17TIQ5ehMFE-4-@>Rn^2!ySTp=Bjj3)2U)YR!)3jB$9)m2I%pZnE6(aa3O)Ty{cb?Nzch&J!-Vl_$)0rl_E?fGRpMa_P9t(P0l42xQ^dGz2g6B-C ze5lMqRDb%^H>#T4G;dvP3!+4Vf;t(vz>k(6o^W%7L%CHd{$4!KdfVQOcu6%c`CT{umLzu^z)l{ zhR#yH1=)07rzBF72svKtaL%0q31~FMnNaQg^}ydQ!PZw_OMUG29(&f9d4tHLZRgrqHSrtOyS*ECq6j~ zt$)#&GM|Ig9u8X*;-t`wh3Irgz*Q5NT)ahWma5|k1hT~LR;GMerz5V7rHcqrFupa} zA{?BP`aEU-i?L?|*?^nvBaTN<^2Bs&l*eqE(2zJ7RtIH@0m( zt~`Eh@)*i8qy7yAO!(RG3N-{(@nWFdpX!%J^rzp01|F|~`xQHH=)~0Gd7Hw7UUwRc zCCm*tY)@{RuLj{;D}b9LoE@`L(+HoL$EN#YAz?NZ*_`=u{{JYK(|Me?qk%-~0e>mM z%V)ej#RA&LWNkOFdw^)#bnHjfH+8D)swcAYa5YPEK>w?^$p4jF=uu4OI8?Vt>Fc?} zN?&{4c`cT-aeSBaE{=IOHD$}Ect+(}vuz0rdPi*gxZ{Fo5|)!jHruI)xwKnk2MGZH>B#U&o{e^t?fzxWy$K9zPkWX$xrnsCGjzWB^qH`WFxoBpJa$iW*?-Z2{uco4 z@f}czpvyaJ{8qmmJ*VzJ<3m<;6{QEVCLy$(E7U_YQm$EHuu0rYV0Ue}c%#|ga`qJo z9AJ}Pf-n1+YjbLocSRy$iT)>k)Ib))R&g*E|vwm_kY;()v_HciFGg)R@GKWuaLw#1~TfGHP|2To-ZFo zWq^<*#LuxJw|mf0=d5o#djnapqeV!+ooXU8^sHEn6ZwNk#>VIW!Cit!kR)@KG%Gl> zn_2x@EQH%aL0){d3%IqD$fud@xrcJ=ZtQ{81SGr+phx1DQ!@n}!jUS3J744SQ8ZHg zQVBN0C~tcNGjZQ+*?(KIp#b!ysyFbHOrRv?UmrAqwJhrq`Uo$*@yHadn`e4-wytZq z$xiav{z(eL@A_5eT6ujME-CU|-1)Ze*&+@y9{U<_v9-Zy#dB=YPhDGuc5s3x@zAw! z$_-8S2Xyi=WFwj9c)B+B@w5T^K~%|7b9Dcyrt);FQXrFT^M4J|?i(bqsPGPS!07zV=n0w@mm^G7+XpUGLg(nXbDvez`6${IiJTL7dIa0a>1lw5Z5odr zm7t|k@0$e8D49--f-^u@ZGK`wLkr=HQTyIUquZwK{7|pEt8@+XYiH5+~b zeyUnvw8e&$Xn#4VyEj>Dwh0!2_p*vlY+%E{Zu#IlqX<`X)Z?@}=W}GgTz1t~D5&_) zUn*LV^|-gUh{UC-MExv0WF^VGgkU&HDi)K%wnWFqB!y!7a8&%Aj!I1yhI1V&e~>aY zZnGtDZ41=3)KV6({Y*VftmP2T*Ke@qI`U0wV;V8XbUsJEp{sQ}m zek|UMwvYMILA7xZ=4qPDuJf@E%os zjYli&W2?BPOKYig1}GKUv*k3yV7sOjVpJQMklJs*<7yf`0hFaoTQRzE!}oQvBEqVZ z*p&Q!luQ)|#@oTL4UfYy5YJqcA^?GFAq3P@D-v9utDVL{t?Ey=Pa?DDX)H!k<-Ui> zzJCav7L}jW)iAsN9XV54YXpz|qT|#o7KchpQ_pKXUw2k*kJk6JyG9o7<{%l1FCjjn z7M3Y!AEF;fV0MqRqQEspBvkG+<=D}OEtfMNh@@PTB{o!(}jel1+j`E}>X9+efY z_<<+W1|C3zNBidU&0^63b!~-$&F#crh2he0ia$C3E9J87#ex)hU%`V9zOAm1{R6rb zs&Gj%(ZGbL(Vc;_1EEUHtN?Ps7sTt98m|&la+*AU5(gN%GxX3V_OWhOjris4d4JH9 z6DF<{&qMgD1q#K*A4Ro3TM52qC&n=G>&`-cdBq>yK4+Dw)%CG$epZ6mdn;}~a0y^- zRV&g}koYW8u<5nYZ`g_bu_^hg9Pf^t6KtxCO}9e~eD`SE0BciBHxkh| z6ilAaM>L|?82~Zv1O)VHKFKb9-+%lYmym&}PsqjeD4!-Y7l0dt4`iQTozX7#>~CV}kZZ0G#t&SAeWg64^FbV5l~IVq>@iX!*e=yFj-sxP z@pbJH0XWstXMmeZh}3PdeK;6{}~fe~N_`rj7orhiQbEC)NC>TduskP@&h0R;6;RTcD}hkp<8xBx-PZlo$b zi|gljw8tiZYCEkyWdva?(t)0WmKTWXbU|vkEdsAS?E=mDW-<21jjD;s-+y#xBDIBwX3Q%? z`~#Oj%nT}ygC_?8M_rJhlwiuF=1(sRa9dIF*1_FnTiE^_u2QZ?$pDaAu}CSOkJl_s z@$W7HPar_Jjt6f_NLeS~k_qOe6oLSF<4R2OuJn6u6{?c-uH~z{p<)3WgsO@LT?3_j zr}6lpmXvLcx(!})<$qY!z&~3V<)ES_G&3(v)kF5Ab2=Cwwwi%b5LVOha7optY^NW0 z1~{K~%EqI7w_53{5^s$vMp&AY@zI~-jn9?zu!HdGD4giPnO6kVv)N2*UnP5ZAW-RT z{Y5WXBD)?w+Oh>@LIdDU`P=uos#QO53BWn9hvJWct@&MXN`H`QaILUx*fx;5qxa5K zErpk>qe}lQgFxj5VW(=SUgC4bUHP-5E;<`FMg@=5P;wF-IAi?R9d>;VSg3LHcPjH_ zD?zRu+o&^u*)bm#ya&-3tW_gZIG z-m}WMuMO1B^yzZ`HBcOgq#Zpw^BOjjFHJ`jx;)*!=zpP@?HzY`6N#s?Lal~`)BD)yW-`0Pg z?`P?iqda(4d(LqVTfbPycGD-eREA`QRh50q7L%+5ZVe1x@Z)jLvXGp_3!qmOVE`6& z+Ez!#b${5ud}%95s|=N5S1_HVLOK7V1>m%=ygy`czo03gM1ppd;LTZ0s&3D+b=WJG zWSi#!`;h6YCuS^ruchww*K%3TJ=|Wl_;)Lxs*u^#0b}D~evtO9{tH2q#|@{{7h1hd zpp)l`9#lBbn>4glUZ-ed!)|imYBpu*H)I7Mo_|ZXJ%q5_Z^0Eh7B7hRNP0xoJ*_mn zj}1jSMRZtWv@Yi)&Ig1iIt&ko-V(6?153K4e!@W77{cyVqD?(PZrw zke6k}fbeFgK($XK-|jAUa?(22i9C-Xo@;y!f_f#3T0bR%B0M^G`SIfk7$ zJbw|7WIc7u@7BweZJ^=Rt!rl`icZ^)p4(;Hz+rQ(Yb1m>SY`RTYCn3gxJ=m`#qKg- zMI_|udFD8|1$366hq5X>C?OtdQm93va8=qeFvVic0p1zDG#iKP#6;E#!46jEf3_Oh zS&NZ3ytljcHXCv|E5h)2XoX8#2h=RU)6%E%^+1-OKrQ! zv@PohKimac88+>Q-#g#%D!kQhCjo>u1U>lnfvLiJvf~||5Koo0U$waiGEPYp#ebH_ z(X54|u*G#?Q`{!1@R7$6owU2#kEP@R^(1y)GzC;1wm50C zHOO)0(M0e{nQzmu?&>f!an;i2!Ah(F1<+a8Ej|T!*$&k)p*y(&BmJByVf7?v|M>K! zUqKOqs_bu5k-%{Hc6WxNhcGx#1b@#&U7$1%=4@ zGhKd{mZ<84Z{s3a2c*~B(A~MNn`yq=S`|E}-y^$ol6gD8aScy;0 zzfU`O4uOxon3l+c97YlO|$r@BLV!1&7VQu@_(zyMLH(FjH<;N}pq2GgiCESwP@om!ReO>;VqzK=(I|NuArT zDkHE86x|3hyXZShRn%EChV-g_+aPf2N%TV1LWd4mQEDBe?Z}}qoI=HU`-A#x8?koa2GJap5gCc2@vtvsb|u z-L$j){@hRe6mtfzzJC(yriOzGWJlw5WzoQa#C0pn&DleOh{nNoQn@!D1)5v%6-`?- zicJ8K2kyLQy+zEc#lepPE*{;1x-QXLvgk;0?(va9(wGC1w)v}Hf4WIbu;4j-`dM~$V^72;jTRwVI)YJbb07V7)gtHWlLSbq0k3JZ%10x^QN8@mLz3Ia*7;ebl%wo=9@JzzvlpU{?UL zz@WieTJKFFu+>#{}Wp>6LqM<0ZLihQhCfq?V~b z&Qq56tGQ~_rto6Z^_^vM6iOf~Bt47f^d#8>UWX*?)=_Oi*R?+B-=dvhq~a#SvL`cFK3Sl{OMTRbA`;$FZ!*Fi#e6=Cq(k%QPH+Oi?S74JZ|`%o zum5Q7e*G&!-|scLeaMNb#|zF=7XKv{wny0?fF|1U)&K?e)x+~{*=>iSXJs=~fjMtz zN+2wcX@8EMA^?i*_aySug~*T@aw;U?PCIs8ERr*QDug>KtrJfNe5|M0%*2-2-G1cf zeeF6`vKerHmhPg@_ zk{Vb)Cu^15cp}S%xAr@TI8;>wrmdllAnBf%qWtb(c=JD+c{SQvP5kP&zO4g9(n5w@ zuQq&8hW#iE14o)pi&<8=N<}|#3DLRPrnOWfEuDFIL{OGbfi_4MM18dk< zx>z-D%k3mx7Ou_L889gqQo|x>KmJ^YHui~f$KlxPw3qX<<5T1kv;{ph?LZE`@4GrG zo46fpbpSD?KV6UbDvLnWH8d@PcmQo^-hTkG4eEB-u%ZPm*+-8nJ~gI4rA6M2twH3R zWQSX~4Vq`?tUJJXD)tKdu)CO#uR0|MCCP?HR$YYy1roFqS%MB8$K8|;LH_AT>GYt^ zbkSBwQ7Ja|$FHU7sAc^WyH|xHY)b;b3qPK3Vq>>vTQ9--3jGd82T0rHPBJbFxPLDw z3S>+wh#Gwiphebq?h-l}HbK}-INs*K>QUXvVKeghRtt-iQuW{Ekt?&_Z7tVYiKJ50 z$4H<<7_@?9C7)}}s}S2eYkj+VtG$m^OUSE-Eza7BDsL_EL`rC$V=L@u334ivMnkTK} zibC=2%Bt9LR$firLvO6(Py5*D7&mcXwLahRjftO4_S05&O z-p(43os>F9m9*7%Cp0F~bX1{w@!ITTRBEkgng$SHpJn|R_3(0vyDBLe3t#!ith1yZ z8vE*>YpwFz7rm0<^?-2xc{H_pj-52yZsKoyXD%V$2g$P-)OcIj!+(FfIqR8!&0VD2 zKYyvk6&?Kzgqv0JuMYuHPY@3sn~LsitIo+BKyGFe&HJJ9B)ZBfbv+r-7W3Rlu1;ax2wY-hLBSRE~1# zCu*4Hhrl6o{K*6b-OF3BTe|7>AY{MI%Wfe4Oq0&>Dp3WkG!t4UBA97pYfUguSqzIX z49|DHB|gd?uOv5T6Txcrq$#@vZz9?($EBK62P+F8G!IJh!qaSlOH|{8O_NbNzPvp zqu#inTP`8PL}MS7_BTYn?zku%RfU*m<@R<@qX43g5-J4cd%FjY(^+KCq=LL6IOo9g zH39RsS$@qTkADW$z1ckfE|vsqw-FryWzVHDTf3WMcZp+RmDPLumdHTMPiS|(1K7{r za{6HLqpvQBS|{m6m%pX{OSSl|rIlSQ(b=|7aX^w!c5O{({OhHzTqgv?X^?*f`~Uks z=nR9(kUi5ipn(OV*=4_G)I>XiH486kji#}sqBah8Eq|_m5Rs}CTJk&Cd_K*A9#Wui z_gtxFtJcnUzF?0MZ;92Q{>^1$yw+*gSUl(-2;bXZYCbOCbR<0}GAt%jSeTU_Rl>Z{ z?Oc_iN+jTNSY+CSC<_^zZW&u69_K-7a1r|JcHi0^j^#gz&%OFu)rZid zns8D))^LO^uJ|eGvtygk zw+n$~=qkt7(sS`;6_#70P;^rasxw?XmJ{=0$`8P)~vVVTh z;AaB#^Bb37t|m5t*845L>awA7NmKIR=?d~eUY!L2Z73|hG$-qdU1SdrzL+fX1yaNH zLgdrIj__t~B0e4($I#T;C6+kU*a@_c$4{Q$oXaVH;1WhsRgO56Nb8`W=@m}lPAGm~?KWisWPy}7q0(`NScPQ?nMRb=$SEcoiYC%>rgR?}QW!(qgoiB4N z=?W*`Sy;WU#Q5rGekYl1UtSa|{^YAu+rQZ~^3He8`WG%?)uKpX+@Es%*?&<&bB~nu!pP2 zLv{k9{l+CYBLKA}lwR$1WwDpu)Sp(Lj}{Wp_T`v9!AIv{Cqfb#n~3ZvgAG&AB6!O8 zC=C7BDxyJk(>F@CB9aEk6o0L5E6@T6Qneb%>f5j1xP%#3jBVUXoB3tihorOo0G76( zO0DN$LB|vlFvLEPmX=&g>+3`ovdu=b0YbLo-}=SbOT@Z#ROIxL;#7ATimuckka#!& z`ZZCV%pq(%1i>rp-Ut74XkouEHweJcL#n@czZ#s`%-a;q z29$5bj(_74l$D4!>3?i15VMhi>VVcSi(o)tQ2R@a&X>QR9i8!h|Ago>gtjhe<29gM zEYoIN=mPQC@42{ZyU-g zDqWsyUBi}LQh((UJ*wE2DD`d14J-;|t(&(A^^u+M*YoJj9e*UHrDogPJka;tT5>ln zOxXv^dThUO2^MdOJCDs-=h|@c8j`2|eArY@PK+g6y!?f~%b~u-Qh?&%e!jv-%0Q{5 z(cr>id(3-1;FQq-#n^2OM%EPFT26BoxP+pB{BK->-PMkjzyKXhe)~ht$$V$jSz4Fx zq8<`)O3AQHq<{TL$poAADtymUBlbjC{*$jv0+EZI-Py*rxaz0XNM11Ts&lT>pjI-k z@^N_nEU$jx5?E~xBP7VL(nyw1cO@~e4ouZ3=K$0i|3O#{S75ejdCJe|w4;GkY&P>P zfsYClohx9cT9a_P_;&c`SL=Fp_gi*Y?OXdB#}4xP8-JIeFP6gE$0hZ=In8%kA+V8a z6lEuk)izbcsklsa2)$p4Z8g!SE#|M~$D$>YdP-YkH4@aFQe)#oK~eP*bkIF~hNeRg_Dee#E8)z)&?<30xf zx_%$}(toMOMly131}Mp+<&^2#rEBJM)^0?s41q6vwRgrVxTyt?*m5 zyT11!9P`ph;osBBGqRET^TbKTx_MbUr9|B6@PU*^c3>B9mI;=(oFz2a&Ky-^Fm+C;A%kL$RdKh0KDD}UP$ zfLULu+h;zNB+{dO%_p%EM=B4zbm>zc`ntPcF}$TPwnx9W)d~#d@g_;uHcUW2vF-Uh?AfZ6i#~?`vGz4VdUyOJG*-sci&A5< z+AuK7$Mx7$U~be($x|8Y;3wPG#D7I7+xy*MJso9o4-g$8RlNI0D<4l7&g9j8j|!Nb(Z1dgAGj&amnD9Pw1+E5Jdfxqi#{W<61K)c6Zp{HwheUxwbzz1(q zv1bnQRwp0XpSYBN9Le?vn}hA}hlsA?vHvswLX%aB&2CNH2OCRiNPq2|T#@k#&^oLc zEC71O`Z~&7N2~0u=dTa*yv^f=uiZW13Cg476nUWAW2)85>xlnQvkUUFoq2&m^Rh_! zcgPtaTXYt_Xg8$In^4VVB~peuQ2VcON_BX0Le6rfa~*+fx&E|*B(;-KDvy%~m^3SH zPS_~?6FvnX*X}HMmVYM*%@IYow-Px-h>IP?Xi6q8Xj#76bjM`Uf=Xn|yg_(AwsmSy zY{~z??XRl2nN_c0Hc0Yx5}XcPAiJcGKhw&jUb!veooxj6mk(!&6su_3Y>>fkt;wo+ zE&WQE?tDlCdw4X*!eMIyiqa7Ddm?Uo%i_MeM@TAgRGl)o?SD_#YjBk|RXpy!HM^Mp zS>cTXO>}0nwWeu^;Da&BX>`ePH<6{h9aG z+wb?#Cph0zYw!Sg1QFqLxPGU?<7>%Z(+w@~#};I(b- zO^4g)YtNk30w)1gQw2+(I%yvO1DmdwuC3Hk(3L;quJpqLf!MYzDzkfZXyv3HOwdyP zsxW$xq$p!0Usn&}fW~Yo$CM(N6CC(xCv1IvadD74xqrU4Mg2Ynt#(+(2|H7l1*Oj)l; zuv?7;P+RaezuYbkkk+~^YdaHv=y!j4@ntOR~ zx?9tZG(*$p#87-Y0C+%$zpL89%SnWM(kwq8bpKG&F>HU}&*+DniQpG?c6l%A5wd#2 z9cBZYkP?Y%)^e0FKk_r1jU011*Anu4de3!Mu7S;)BCY+2A9Rubv==#A3XJdVpJ90p zQ-vcp1Skkb3Lk948Idhf?0*x9kD3bgy)(`15>`@DYpn|dgA;B9oTAk>(P_-!pbs0` zg-2REasPkDVCxTD0^FEq3(DrV`lB{*AOJ?K!FU7h1ukx7)nOURJrDw+Is;~28}PuP zR)B>~q~x#k9Gx$n>H*u6+4Wr?YzWusy?nJf_ay?^UgVgs`t32IT@SBsYQud@3nW{8 z)*fkqof?%L9Btme^V(@ha=587SBas2Z z0p0{-8rsrB0?nWk-Hw$<&~lF$ly$ja!H%`q zc}ah#52ivJEE)oChJ+>u9C+K!j@!VBa_CNjok$FKPRnA;Z2%rXMmUbuSw0XT2zby; z;X1am`z&nf&!9?TAr%R%xbr(-aZ?Has06#pO6)d~ash-6+mWyGM|*q;)=bjNi`KzX z_f~uM0~B19a$|WQbXgqgTBQJQXH+*u1nqw?Fkp;OB75{H0fqw)A~+dEPU7J}Tl=n> z@DK=YYcaXpijis3&aw|O$Li_wlT{rx%DVQ1S)ITlqdQ7Kga}&LDxyTfSVgk*H=<#` zRe-`0?duhwQyfPXIj*TIRn3a7^7F@tqDZadNJn?Bl@kw+?>-L7uqo9u7+rf}-IafP zoC^PSSP^^C4&pd$ae?~*zntCre&Z5&l+LuxY)cd<_Zk|r{=SuMgN36RnWxhwVJjYR zWj@Lg$pXO$$nXla_tk-{kF6q)$HR5oDP*yMmv)sBPpS6pJirbXm*o?v>H8a(Pyn^@ zL?R5Vaoy_KFvC}UM^??yoX~U(8)|<~I(1kad^*iRxntvjvxbCT$mLK=B+U0wL!aFZ z>p#N+WB_m|6m=z4jzWrZ=G~ubsr>_&@EY$N)U_8oNAN~e-)@q4*=i9^ngM;Uqnz2J zWk-~a&@i2JfCV25j~CR-QoIwe0ksIodA_z^kji8zMQB z*t9-cY-Pycx-9{Pp>GR=q@a154b}J-Xk_ac8suqf%laawl4>9=1UdCh-2+Wh zCIHZOScfe3MMalc!ZX`EHbH-*Q8kBSYmVUdQEOT2Dn%%vXU!uh9o$K8KXM6*qJhFy zI3>?%4DH0Q_RvTDiyoZ*J4vO9rjdmc%K8H8o%h1*J?f}a%MQAS-EtY!gBZEsrodD3Y*V2A`p~UMk+?k6%lh<{ z|F%N2+1ZPsmMTH2zj1qb$eO*CT`ePO@@uPRK&o=XX32q8CN@Mxg>&`Sj)UW5Tg#q} zgb1oK?Y+=v0$JC|&$xf^>Xy-(1B!e#3?Vu>5MN&fiF@l?%;(ReJ3DDk8S=r7PC)Ho z19thk-ZbR*{Eq%wL}rKbnNN09mW{nFI~04U1tU+%N~`lU^m+g5i4XivQVJ_B-HnN$ zyp6-96MvnvBECTOeGbHgX}|LIcLdp~ted0bU9yjPnu~vOxe^lJ1lXvdy9u4R%E|FrpWJsCiF5)w3 zPg4jrdK6yTWB$e^yzS^@r2Y_?3-qerk+TZBXkb#OW&16y1k-_X?aR~;yLV~-D;pVgK24p4rBh3j=XPA` zF!nxS-)RPCJCuB}!p7%5Dj*kLL0sUQ5{CkcxbmT4ZCuApx5%;Pv3 zCy?lhLKI-)C#D~{1Xdh4EpHEXG=6+ZSDU@4Bc_Hd{m*wXs)?S!W94c~s{zgSKhF1# zKsug@a069L%os_wjByw>E_+tX5eqVxJcVn7_=#E-Bwt|T>B5a3IYeVc|4bywaT zS<;hO4V0m-nV?kJIIehNZUH}e{2qd@*|r||EYSucYFpDw&2^>u;@}%;> zM^Jz+>)Y+%bh)Q8T+sZCHc+HR=m;7!a1nv0;c9=>8iI#DfmU~BjqH310f^hKhbRZ| z_0Td9UrFtxzQs*8k91VlAQJXGfvu(owP@8Gcv*-<(Q6j|+;hri0q^ms4`h@S?IavO zx{>N-#Jl6hjt$)R5Xi&y(Dxzx+cT^R?(OZ?93eOhs|RJw9<^GZ9o!(F&;p5W-(fQV zSG|97xcZu0zbPx}KH%(m)V25ps}YTEcVTt|-kGGwuJh&)tEX_~O`728HS$gUz?#%} zYd=*V>A*_r6gdoBbFrCS?T%4ACeqP%+}5I@GRSYt$~X-<73@&`7d+n*%$u~-EY@pN zZx2*fK}w_Z>-7{L!>9*!tm`bSee}`JS9O1j&HY&3*2}>132f0cO~&P!7H#Osi(n43 z9(U} zncrDknf1c`ur>B`#mK?`JYSGg0Od`2*rolqi(?H-dps|`9rV$yES%S5rE{_VIDmh> zrh8agw@IBXGm>iW@u-|oa)6A~ZSu)4DD?X5l2EKUsgA8AaWm#`KNZxoQ zbYPksMS;Az)N0e{s3}uq$#->fV21ZNoWzPetyoS3Cx)~C{HPo&n{_EV!`4^1u_%`D zRZE{XkrV(lOx2dSrUHwo>?pEK8ijwl2;4@#2X%ad!1S$agc{LXVI1 zPwiS2E(ad8Wl%iiohn#e#7p)iNbx4`_@YoVi2ihLEl={0eXCZtu6BJ;-VA>X4U>e6 z5_T-o+d8{<(h}aDm_Uppde*DIu&V9j;Vm%}WZ60Di6-SR;D|NB&zFa@HEd6H8VM&m zG{qO18621EK;pnX0@kCC+nHt0oh15we#0Ybew5{Awy(q>a7G5TL!AC*=-9?UAy*XC zh3(9eO%@Ed15ky?0|#X}s7!zFq2p2|&sG^;U)Tk-97#~!N}8IFO3D*_0Qyd$*XFdY zCNmB6xFPT5TFhCo8qR3m=y)f;WoC8)0Z2*6f$-J5em=IcB-4#rWvUdvw5x%p<)lW7 z|KLT}(zgY%m~}#`eRyiQG?AIgBfad6Who4D6vVvdAcUvN<$40dHO1)}9HeoX+U6eBUk?`Aq(mr{7q)Itr*op0)no zA$q(t_4jjl{Pw;Qy2(kNt0((J6#%gj)scPU92 z%yN%t=JgW!)MZej!nqSAbQG(%O^S@ic2q7`DaoVdU$Ae?sq}y5c{5idJBhq_o^cij zLo*?x+HZd)d`;aiJ1pj_a(A_Xl`O-1W!E>ohvpSs|IafjmHlxVwQu6WMb^ z(Ptk&cLtYO$=nO|J;YN_O?79tG=JTo_#LTC;5}}g5Odn_nCKDcFg0fnE1#n%!2CPt zR0iwQfmY=-<$+bW@HA2R0oIeXxD>PF^q&&4j>&=wx-);|VA5*Hj^}xc)NJ%SO?!u& z(;axv9$0Y|seCeGB0Vpq+ikQJgPFCwPJfa#i{4mrw`vay08sd&rMh05V_Q0yO(~bC z?=*pscSFv8XTA+pye>i{xI(LnRWDw!=}*aO`;W4-q)C6)I>FOzy*#?&+2M6Z@$f-c z$Se;hZ}EQ%Y<5V}@ciC^UB}hC)M?JD0jYE3l)kC73Hi7mxECV z>Iq`AY^L#|CX{a$qMb4>UV`-$pu4(wLnm^_ivxc<>`S^F)vnPA5XP}W{r6NJI`a!x1y+hQqA9*JOw9H|9gO%b~8^B1S55WmZFq{&dRuwJ!Mw0YYIDp(GUmzbFk4U^$ ze2(+nHiAQ%cmR)&f-k-UG9Pz;h%E#-Ezlt>Hv8z^_osgQc~E?a!sOVhNGf1sY+5e(W@x?zV$4MAgFTKZdpgw?R${AEnyuD$K>$YAv=;{jlJ5BnG{PR7BtIVPkn7*X3IR%ty^LaWQI+9nM?kBtnxPo2NDF!{LjX|pHD5!S@MQ|b~f*ge-;S%n=) z4eNv$#Z~Z3Pv-ft1sd|aY-%IhOe1gicnh$8M1r%ZP;zx!i)w#<&9PqI z`y@26wm#n#f2jzbJ}H`z%Rh>OcNKE-SK=@qRLeGOSR=6h!=RJYuA7Y&1W_=YM(}-W zhM)6;(6U5s%%!XOa{Ab-fWPiY*>l=t+1R?oa(($9CsnQg5J7E5*DGnc`@%h~t<__A z;N9*?ZCxI-XFRatpev+W`a^#~xB@ZZpU%G8yT-cFHP3F7zV+{zO7^%Kzu+0OYRD`u z1=>jKytwycHwN`aEJ+VY0!g#y-?#+Dlg7F&1$yq0Ysu5WLG9uR7ynZUFiFubYiUh` z2KyN8v*U}kdu6S@isU+!LaKBI@~{PAh#QK-H-{^t#g+w|tOk24EQ5blJal}1;}TRC z9gSVGRqnF#b(LJtXLr|Qhf82fxmzsys(N(5z-)HH14!EzzMxhzL?jf;hdLH~0Qs)f zYVqx=M4F#9Gc2bnPfm(&z*BzXChH%#1ntZfkG3`F5x0JM0=#pcy1|0TkB+@$ing3Z zQ+6Z6zZDgYFFTowaw2~`55R7)6Y~Q@WgDr~0a9<>x`g+*2)l1;_JC%B`RzTu=8!*d z2}2>=!f&j#qaBXL>42lwY|;2<4~-{Jxn21i+-A?s2&I)kx-36%2@#}1JZ7cnIb(mn1c5w)hS`z!4pi-J z_%rf0Xk%!N=h$noSs%)(!qltBd+Y#wn_jm)5&-xHW?cCV`>HdQTdj|=KOQadab&tC z*!zu3u;-XW%a5u?qzfRqcYcx@O$Uv@_b~&Bi z;Tzf7=LX8~CV_w59=UzCAF0=!R3lScn0vUjrXRS35FI|9*|GiiPAd^{mopV`^8|DQ z2l920WhLls`wzFaM&_BU(>8D6q`7|;g3vkvPEh&9t>T64Yk)FWUVC3>$}^NU`9<>e z`yzhe671aN;R3KH^cZfD6(xQ8F7_Vw=+U#o4o`?s+**I^p&;JqGz(4P{g8?jF?cK> zI8p^VnecZ{5Q0a;5c1~44Ag8ZBdi_P>mg?a6nyD7E+G+ppMKuc?NB&-DDj;-AkS%% zXalIlBV`FkFH>E1B6nnAF8g#hO#W)Lsv>0@j_$k)PV);pc6-O0&YxA)2xsXaQE}TG z4zHenE*gJ7a0%Ax3B5_vtH%zx9mAUmx2X(OuBKvQ{89odlVi^7xByv;Kqk>)@7hzD zUI(Q;+EY>xj0(W(@QIck1b_D1`LB4Tv>`@G)!(^Pwhg~=31nNeDmyuM`O%F2Q4 zwKd6R<0$UMFX?+iq2kH@=5 zy_SFViUKzh4|PuMykx1)WiwM3uz=M+VsO+Q=~yYXc@6@8TF9R=Ak`Wh%Z_(991!rJ zs_?lMao~0ill;ad^cmh%Nkij#W#&-or;K{i>q$=N8vj{lhvZLZAR#@G(9>-*E_{6V z@P`kHc69aONH=V?UCHyZ!j7c7n7;wtcfNnr5+R&6l=UU+a_cuP0W|r_Rkbv3YA{YN zL2nZ0$-DJrM@8mt4q87fPq2Kc@8UHSNGs7>bYp8Z>v?lKClajqx89szCyc964?%#; z7d|YfrNih}ZFl#p4gLd{;Iux8x!6xI%YkNGw;|%I<6Do%8E*<(c_W@bh_pjdp0=*@R6wPTow=T^W-R=lU)CndvX^e?ifQpOt>y44mChQ&VIHC%k?%Jy;ZxB=@1K;? zC{Zzs?dYU+%(%O{s!iFSUQ9pf3k3kyuAw~Suw=3+M;F#6zWFWvubXRve zIfU!A#l{+T57;sF*T3}?qBU#pD4ME6fJy=CgR8R3zrOl~^BREgr9+T@;}T8=ZaV^) zl-Z0Kw3&*9cOBD#Y-BF}6D)te^yBkj2&_iV_VY))Jp)hHu%+0m(1+6fD&1c2_Ne$g z>{C>m;8n8ISq)$fxjon;wtnLhhNJ5m<$a$$R{HDchoS}s+1SM?dfT_jh=6kqQs5=v zSNM)2qYu}c>|BbrRDb=|Pt`Iq3mIhgv3kR|obq5}XUI#ObEsWlQ(%89zi|nyo2_H| z2U3f+W~mLoKYe9~oAdSjcsWfC8i~iz%~w^Je7cGO9?DI}Os|@NjRZ-Zpuz>HJopmV z$ahYefrpFD{@mUOL+MK5`M%oVJ?YEz=;%VF%E7^_r&ANY-Eceis1OOHTK*q;e+fcl^tUhze8ghO1?SD4A-vV&csX=3& zcx-6QO0A#QmRL=N>~)(Lc6>5>M`XXQ0L$x`orBpmeIz8uI~;lo#LY>Wbv4%O(IIa*P3kLB`}Jrxsb2#WeVYcR{9nM$um!T zoWGq4Ym6;FT=bjw{3u*~r_ac!E0Zj)-}T74IW#3XqNb_=4=B@n}xrCL$ zLaAdzP!rL^Zdb6_QTK*NSgn(?_(GjruwOh{UArG5wiSPk!vl3VlnWd2jpeP*IPq+b zBcbmVjDR(YX5VImnma-_K?m=1a{@Pe44k&ME)VD!+N8PZqgzl|?!fZs83LptK`a%0 zc2~}*T|q#0&ik&nj`{{=zqrld3sf?PCs~MxKrkgRq9*dhAajJi7D+SVdTf~w69}T| z#Bf5{b7_BPo^=~9N&>t#8WzPz;qlkvh3)@251Mtq8tOHZz|(TNl(6+qAaU15Br0fL zULNpf`8b)c&+S>a$^yW>4pk4&Ha;IoAbcc@3OgQ;6WD+J`?|&}Y^Cx#)}pCL&c0tB#vcB=*cA-X$Retv|Ly|-n<|WC)&q3I=(yRrwm{p)ty8B$-QTXSP+qT(3L;ws ztfE95uM|G^NcmS7HX^Gg)>xS5)kVItuh+v;QIvrYxcXJ-ZqZX`FpMsF)&VsMsvm!k z^$O&iv|EVxqS&e~Dy2+@nWHM?8uOM-vHpv#VPjf0B>FwTpO-wZ-!(fyjSy{(v&~=) z3PsNN0?`xhNsKrO^sfcxvZLWDdOdGp6I?ewN8Gj@mEZT4pgtrFwy_7_rTU4@RCB8p z_FVB99`YT{7;qLx_8@hOAY{YsZ32IKi_&gEuWNHvP#WOTaj|K%3~Fmqn`E!K?X%Z= zte6s2Ty#o^`_hK-&cCi1?F}tUh4^cQ$fk*ePPU3_dt~-KWRFg?X-!;|$a*ct1$Uj@ z*9tnY?UO?40SeW^>r&1j&v+8M(Q`_8C|T_ASf?79ypsU2m5t1}Y|em$InaL*Y^_pT zkhSx{UU=25PjFLGHU=bTzoN%#bpm%Q>z0i~X4h=IWm{>9udJrobrW?PLGVZ>u7yv+ z4C5zu8uFx3$M!vYieEhqwecHdc{Y8st^6TOs2sem{W!_nC#&caY3mTmht9Kb5GAk@ zIohL4)@8kB-(n5Y!O=NrecyjI1bo0jPMu~?End=2Q0pPwgaQkT(S~xp35V8`uj)rI z6P6!=U2`-DtNK$8z+?xWco~Y(6h&q9ulUqej8=nHQp!LoFcs_Qj%$z*ZmsFHt4fv0 z_fy_kACGeFHdFlWv0Kw-cGxk_)e)Mv1F*^zuAp)}oA7MAlUjab1k(*`rHBwaO|vy>YM z!+sV=KgfR?F3bE_SW|zSp8RN{t+g*}a05`Bpx`zM`%$32t_LvBMWKuNIU@e5R`t0} zlv)IKc@k#3CW}f>v}>t7Lkk*Xk$A%uwahBrI5_OI?q_S~=j2hp>YhV)^EnP-gO@}2 z79}`N``K1${hYPOvt&a!a>1&Y>ft!zpsm3Zx5&~)%&br7&6Iyig4;XlQF>J)T#2)8 zu+BM!%|m!&Q*>;yROhx>REb$aN8Z1Bb6TY78~a|zzoDM!MTHjHfOe2*76#9m;A^9U zD!`hseB%NdbA(nYw?~YXlOjO`FiX_6(tih09mv;ND+?61xQa{A2~_npa*}%EZ4}-9 zUWWjz4sgXUA)0^3bWYVkH7>{ZKF49r#c+(O>sGrSLt5@l+kQ!Ix=1P83{JAqm~Fp; zJv^+$V)jkW@bO^5ruhy>sAba+t*(YABZ?*1(fZeNY57NQNQIsr9>Tt*W>025@;c<^QyyI3 zY*4UXu8(630eGO`uOGT~&#A8mQ`%=LF$RfcA@D+Kv6G8fo!jm4|nTK|GMvokHjE+hz6A!(D(hTfR`TU9zS z15M#n2S79*nEbj{0NN{LpI{$OP7v$2Q${>I(wcuRvD~?CBsMU5kX;OJQ9R^YFoh}i z`h=;#ejoWxvFb#0P80&M;T7!zQfNWSciQa@GD`}4Ru%M!d@!ANKX%>xnJN-0wW9Ux z6>15WJp6oQ(Xh=YByAF1NSn9lcX!SrgPq3gJJJ=beuQpxYR;?x`4I zrDtu9JQvg@Q!h~{nNG5v{}BLzufA?Q-i~7Z(~6Z-#|}ovk?h=Czi|o9sRT6u&oSZi zy>KofSQkWqh*ot#u}yu2V^DzUQ>K;ZsF5xV@p}|(J$+Mx#5sQ* zRvUIy3yGXxDBy+muKgRApgHXXVmcvC?8uHw61@X|4A^(RRkZ*Q`Gotgik6WOT1I*7 z$qEWiL`U5rtD!n?S;>Ti^!DAiaV6vw$r-$X=K~1^QqMFW0;=Bd8<$|pY8tzJ68q@P zCv=g^vPk8j4p5VAw!m7Xf)uYD1mS;;U94qOzSLI{c5vKsZt40nzr!+>`h|tHe7ce< zUEh+XG_>91aA3#C#nDuSq*f2*swQ4D>G=WCtWbYdt_!&6 z@I{%jxp^hHpX=%UDn;-*CJLuX5;6x{^aRN@0t15QdA7xZOL)~1Q*agQ{?*N1D4jQ< z^{HC4sK5zD5@KD8OgNq`{?Kn&(Fd_j>OaT*d{t&_BM6yQS4ucjbXs9ILYAkXkM%on zi_lls*>~~=W)L3f^sX8-6s~`~yvX{z%4@*Dp6e2%ari@m`%}4`ME5dU_@?&^#&a6& zQO!9{bwJb`P)t_gfpgVWGgv(7zN#dSvyFhs*;osZsyuDu2ui#WO;k$__2ldCPNc9q zMsyq_%=8s_|4|wHVyv+!cd5=~Rk$`D4dO=w>}{t!5-8XPR8?-Br_z7Q1ilI=)ee>o zrkj}x=nkW+n+&-pA;X@CWYZB>!1--W;r{kxWh&@(a(-hn;L+C0^#%h_dcP@`r&=?M zf@KeG2k1%^ZMWwGrW4qFU{RQWt-$VR;QS4O-Fms`a5={V)!$^RsOntWbvUyB0lmMh zw0;TJ&h!btav=Y`d+&b>msW>-4vmP_#3uYSMW}TGd%k-d4sX%vSPf=kjlQ#NDvuY= zmn>az?@NQ@SK%;zXo5Hs+ptEZO6@-VwpC>qCA7t1OP0Ap`d4&yPFM8tY|CZ~9ei8R zzOrb+d?klq0%S`bT2T4pef}m0VX0%v(^x8%%kGLLsdYm5Vi3;d)vU zl~^Mjz;p<~ELPV7FtzL4@o3aS{JWOa{F}ISd*H{jQMR~p6XLd_5wlN3zh6-MwMX;7 zP-6#{WixgXAPu6#d&S?|Jgb!RY(nmd3~WCc z>^+6s@2EBc3~GNKXjo(_@v@scB1W)Ob^3{*i`P1x?uU;$9nG29plC&sH?-Xr@{wtGPDk_gZ10Ll=nQx6nfv)t-N(J4mR=_Z1xp4vt5=Rl#^p za8BSbY+Yk2-UZaswGrXb2XM)SN2fs5F*(-J?ui(yL`{tdSB&gNEmq#GinuSAMASiQ z^A5Z#(R3vR<7R6(&CfgcPKQ(bKy#S+vMJTG&+$6el9pEH1uCKv9g9n;>9R?A!vi3- zv1-0fgCu`mmX|B#rj(DZ+-g0(Ko}ALnqIv}fZrHFu{xXRv6R-MjS0jL2wyP>S!6QauzZ2TJWVXhm;3-56UY^rE zKz+zzq!|Zt3A8%?Zbu>ing>{vS{xI()$wqQS}z>-XrJ|p{@w(pb)ya3cXrpFrV>cc zN|7icvTfZUo^0C#ia(}$?1VlzOpq+Ovw43$&A1=lPZLgOwKC&9Hh=HAEAf);la$`J zp5*C`1r1^q}Aw080YWa_5R_0;Ep4VLqpx2y?{(CQ*Nu z?GCd(3fViDTkOgREC=PZR|Jc*Y~UgwDiE-a=rif2#CC^Zn5Kv+tQ*_C*sQq|^V!62 zR!oqO(fJN!R5bEZ{8P=?XIjjHt4H9aZfDgYoTc``>+If@c}o@yUdyP2e~Y&xC6$rx^Not8Xfu2JzH(b8D@DitSgJWc!* zH-eVTaZi>!t^~hqCDK-IM2@#Zh!fZT?A5HuJIhrxAXmg(=f5f7)FakG5HNp3^n}GG z{eA7luaum&lYoWhV1Q*($HpAjS1<{n0s4$up%9YoZy{&tAqK-TYTo>Aez7`H=&W)Iq~~yD5yqevK;7pT2Yx;+q|0e^kj(18uBp`IjE8l1yTJ z-a`P(j%2W6*@kM3z!HD7NU;+G3J}TQ-)~$(xOO>*nDX?g-ZpG_6Hv4^1g6@E9A%Mq zSpd+tQ|?M!lJi4T$XylVq&*7EQy1c9S7z2d`LjQPrC5lUH%2+85Om&%S)0($8E6AE z8BUcGUJoHI=n>;vX1VVC&MVi{RYN*WDdn!Ku{KM9#V92Vwkm(^rA0!9p&gTgnx`N` z4P}BS%Pm*7c(#)yB&BE{p`FrAuqy+!hmYVklBf{7Vkisnl8!!QpeMoD@)W;?fpN?mm*I7slrs`i2(Nw*kq*4&j_x&wLLzyE@ zo8+m`9%uv-!OefqloWX6{@-dXa@s8y2*`ZnCq;|5ldZ0x_N5ghqBihDkD5&2cWnE3 zR!%M;+e2=6Eb7O>@L-8bVcd$_XjW{hnY4;gGz8G-nSWL3Wh;=^PSY^R3Fe@7KQQF_ zQA7(qjTp6*bf{BV^8vid0t(TzN{^&E@7(4@9+Iv&AR~XJM&e$?M^O{k0)I=YWJ8-^ z7#2~$SRhi?EH`Le726WOx2}7qc$!h0^pEc&v)$8WXIlg1S-|Mrw z4W{F-_uGH9J{u3|Fxg<3C3H{k?K-x9;FTu%EZRPh>*JlRJ%>OLZB|e&7#Q626V>2u z1(q6n*yFoe?@6tTvFZx~UDUxKn{QbX)0S^CUiZjScL+;X0R2b*gPXQ^2IXdQD5%3I zZ58OxpI8!PYsKO&C%|OZ`Y8?Wpj`v#k}m*Ly+(f-V53r2?Y7Z?Ff#m24?Tb@P-nKQ zjm1l;-N`ni`LMT3D?hFa?rXdD0^-71x-##qvni)MYTPN0_$hNz4Bmf54;bcoRDe33 zVQYuSP6Veom*17H=GxUk0=ctqRbjI`S_>mWpkvAru&ptSWo(U?9>s`mS?iiUtA3cb z(UE^`t9(!;oqz4M*3W)wS!Y092W`&gC(84hy|Nx*&ceS*!=R`*KrkPBY&45HFyS`l zDUER3D)nCX+8kH0Xgt|K4m1%CVdCR&K0@0wxUCk;ydfPl28d)RoXKOanbZ$`gFv&B z34huFT&<_a)%rcRD-9;rAqzm51_}Sz<9C0gvRmtAzq0@yn~*X)gf((*N3Ms&@mLY-}*K`%v;X_;7Le*2dC(NGL=#9zCcKnu&lT|Fe%>$q1 zq&Qx6VZrBSY*3Z=(oR2WB4*3cPWwK#osz2aqeuk&Os~U>-q;am)z7%V>aj21&K@<0 ziMY;j6~b{C=N^QpW9>K~yzbAu;Rk;%;kDVKE9Ievy1gEbt#dVwU0Py;01rFpS%pQF zS#|`G(L;HQKEPt0afXtTu>)X%H+}TJT&h$~r~k)sux%wiZTOQ>WDt(4m#BXXWh2vQq#I3O6bn+d(1&SZ{xeQM7-0 z3`sFD1`18=Cs=E=@{wQ9R{od}dYcETWn=gz;2?}UIj~4sW3px76N3J4*+WMPxOMi# zid!!KJsSL`I^#2+N8QtQG^T+?}D5DShL3 zW?_YHbq8nzTsOZe`uczj?+$#-WW|Z(p6nLl9P}uUPzmyj$1^qy@Wg_8!sII|yBa z_ijl})p%$~@%(`2e|uS;%0mAjUu0-tr{gF`1s^3b0f5ulD;qC*@T3&7$wDM%zrX>W zcCq2bragOWG(0Odn(%+JxGnO3u^aOiF0?<2rJ8P39kq>{>;JCwEJ@!k=wZV~e{-o_ zyCv7(6`9f6DSpd?3}wl)LgvLevAy2Ozq0;<)etSm;&8tFv#XZ;#LF$3Bq`R(OWXTd ztXnI^Cgw9esJiEr?F#QfrPU>9dT+gcU```|E=&qS ztgZOPReR7O1L*CXg_f%@pQ)r>VOwjg37l%JUM6 zArM$Gug=)D`_M=0Q3$_7*$(@f5XU>z2MjXUZQi?PPsNi1>0KA19Pn+jidIV|n6YvI za;!m8KbayZGRXZcK;LWAx0-&RNARDK9f}l85&)lVU+{k_zK>?NEJ$crb*-Mp0(B-( zG21^iE}^q&(rIN~2EnGlRraaM<79OOJLHwAN9!ZVT%n*wmN?nGCd1%oT`MN zMNGIT+ujqPfO@vtTzkZ+6fs%x+(UuloRDR3i8Vo5)MZnj42ti3q8*d0J(i*T&#@=2 zNtYA|LV$mxg=ihIl28<1vP22en6|k-GLNG6D(Gic-G+F`%I~r83>pgC-xH!QTV)V^<6QM1$8gJK;Yi5#Eu_B=bc zL4m5+0lMrSAH}(-qE??mH4sVC+B#O>-nm{Gz=qmed%3bb|Za#Oci$249NH3 zpFn?dZfm{`_HcG~K45?PbFriDPU@RIa)v}|#p&Coe!dPR4s`*X z>a!NXN;PSZ>ti4WY74LXdnc^@TG9dvr6 zpZ^YwDTP$v0Q>aT+M14pBoD}_sZvx?Xl%-tMft056rnO_XL^Q_m#k}${v^PIqji4( zCT~kV)tvlM-;f<%HNbkVz+rU|hS)=B(`w`ns%+U$+jB91hBm(6BQL#akV&ZmS`FI1 zfiyqK6p5W^Tgrons)IF;y%e^aJ#1>|s;qbj)Xi2#zzse+fM%4dlfme!o7`!scZ%np z%IHC=yaoZ5sN(^k=LM{)0~(YNPmq7p=9rkX+w{CmuDymMl3`^nD#ThGGMB^y_B%FM z5B~-BkitRT_Gu*R`r7qVzd{az$?%?2E?q@zci%Zu9f0|=sjoUe6d%@q*f14jo?UttP(X(TX(i$6wjR=g_3kt51vGlM5KT#qpMDY4iGCxE265*{q=ty10zu% zh7hf9tal) zd#bV49Jk|N9#m}|kQ)0FBy4}bH%kceqbQI`U9Y1Qp2=l>$AKTxU-OL%V<<1Ms(M?B zH7PM6^)(RriM3rbD*`av{SF#wv5=j))$W-~{-}>DFP3$%J+>x>Io6|=hdhX33$MEV zSc@fl`r9d@b@%BnnDBa)u3a9hVDOk`(J*oo(`CUphwn=J}zsuar?f$<{1C@642dKFWQHw>Z;1;+?io^@&r zV2bmw4xqz7j_2*$_#vynwnyZ8R*N7S(18T;BdsS#;?{Jy%Fy&ti4I%JNj`=x*z;b$ zDFx26HVV#)3pKdZV;TO4V{A@ovHWVG#bvka5ZrZn_zj|w6i9znXA_jeJ8i2{py~@p z-qq^-v0Hp@HO03qOqHbDd74d|?E?p{`^Ku@QIw>N-)N6l^PQugr41e)vt9&16xlIU4W%kaecgwT`o>e{ zkA_4lix3I)awlb8t0GnCfsBe2egw!KHI%uPwcgt@!e4)>BqTrmLb9jpR!@O9>KQeF zKwg5~%*qOtrAIF5n#?U-=XLK?sObAVm{Cr?SD$6X{06yHPgO<7Iw)z62_t zg3|(@a7+jGR}nF?Der7%K6=fUP2Z`+SiDoKdn$};1#h$0YEO)vE}~Umhhk8(c4z5g znoZ5`ZRvlm1i~v{jeJYiaD-iSPGu)v(AS-E)FDWjD$9MNo*8N3fQEw}WYZyPrJ9b) zZZ_Px_oA##1=>=}1L6-keQHf_sYRv#upMV)6D)fnS|c0}-?OxevYMHRP+ac{LFYk)@sDeQDgAztN2@>ztotC1cTZvEJDK9N5 zgi9V9MbY55cw(k$GB2JD=nw^%^wk1|XKa73glbA(BHp=dj9XJmx>HJAwTY_1U%gJu z*RGEU>P#c`amYmvo^eO@gU*3RLL(8sQ#w;P5YArZVq(*6 zr8_;+(##cXbLT0eUG6~8aR5j$LMk&WjT0R6NwWAVDO8JW>S`6O>auN5l;0tKVsC#6 zAWZLWt~7~#r{p0}_nKFKXo z!pfBui%P)kPKkKzMBI0OI>Ekj zb2PXnRnK@;k8@D^;&#%g`RsP=?db;1*4h<6c!P_;<^bTVkQjAnVv?OU=4up6at_4B8Z$;A?(J)iRODCa?)%sdkvD&NOBsoD zFO?an{`(|(z8aDmm7_C2W}vQYin)xEbvQgRELlRbl1q2S+;q7;h6aMN|D-R@sP2EY z|EyEH)r<`ybDl0GWks7p&Qk+2QgMSPW7^Hv|S@`SFQcN*U7qYcHra>_LPMY?AJNmsHWDW9Bv_~>Gq%(i;8pP0KIW=Oz@zf>W6Y9UcSnPsONe`~J%QeyVt`O6VzMfl zM7?VvUy}YfGw&Z2dlS?MY)jKLPklz%Zo!>CG^7 zA|XD>_!W|AKuAHk$enQwz$g1GzWU;5u|hJF>qa0kn1owLR!#}x5pAKOdo?J|IaW;0r~kiL4o=eRw+SDGR% z6*Q`HjpfqGrOY?O66ImEah+DQ7yVWqg_QqnGfjh{XvP1;)~SClM$x?|XAgwA0F}(h z1UxL>lJJ$F%xxYuJYIGpNPV6UOhAb|?sEhF8Ghfv#XL=-lvc7Ns12l&Sixfj(6<+G zqinaBSSVJe^p9gr@S;9dxp(ok}Y#T7O)4QTBvQ4V#Lu4o3 zHZ9sRuQu7NyE{U$KWfqxiSCQn3nXynTsw*&LB*m@>DgIG0$MNeloz4%$e69lvJd;^ zlBaj<%9E3Yij+U%ev{iX9Tc@KV<@?nr=+T58Xi}*s)De#Vq|ZBi5`5MX6#&px5&cG zazI(pNoE#R;&zd%)wufB8dPSpLWg5&7k!(dPBgPy39XbIj!dgNVa&cXKi0FW@4dM2 zBcom-Nso%@$T+s$()yW~61qpSGu*W*qz3r-1Z8d(#aH8|OaXesD&NrWeA2qp#0u2D z^(tXV#7lPDx>5#zs^>gB8kg$x27BeoxZgv<<$3z#`MxK+T|*HZQxoW7WuXf=EaQ@M z96VL8C9CUwEa{VC(j6$4t{Ept?DcQ}Xmgsgz2$Y}h!kB55O6qpO(~Os5M(6^9r40c zZG!;ERj3-J87%?7dL(B_tGaHf#%*3O6_nlSA$t0>)GN<_W!LmezJB_5r(Zta>ePss zTHmwaXWl2FAeeNd(w1ir&M2LD$%cYINfMvWUfPidr<7FD)(ML;bQQ1kaHURPP9Sv$ zmRM$AzZR~#+%+A~3?MH#wrY{qmB}}*P?9VgKP=ca?C9$vE}-M*6x(t~1Si>TLWeul zMUJ*1_$a}DP88nuGG6D~sE0h+T@LR~*IROZ5;7Eh&~Kx zOTu$X?NVDPAGxL1^Ukh4J?~S59tq)BDPO3+t4hg#=L0ib2?)jO$l|;rb`GKG4yX+6 zWyv^QJF?)EPi(Bpd$PYZjZ@Mw?7rv^Cm*wG76_M16#{nQ5LQ^F}$3%RQ zu59=E#2)IovVuirxk-MNe<>%RzK-g z1gy+|-S8Uirm29<{dr=JVvbJYn%peJdwdt7G)?Dk0TQlnYg*Q}x7a&kgaRKc!2*iNc>TD^&@^ju(e)Uz? z20DKt@$h;Vyg%L#^#W^lH0ly_rX(ku)$Lm@M|SyJDo91K2XOKdU=!B6=3kD5sL;or z1>8!l5x(s z>x+Dh$23MOatMX4B-O1o-b?(Lo>_eBo>}+yM48#;v&FJl(lQX*`^a+mzC!xl9)WMgi9Yu)!l1F9J&WfUjpJs^5C)X(RUT4(S&kC=a z&Fv#unA?pywsl+n4RuoBXRxrwDy#(va?QKJNy+LY>YJTctl7)<8gcg>H zt7U;^sryZA=juTZDR}KyMX+pt6@Sy2LZvbdcO^P!!iGm?{itYmNtA>}(ksyeRAN)0 zYxA?Uh7C*0#zr=Ey691`bIaLUf@dY{xf`dlQckJd6FMhO^pK>a1E-DP*gbhsOh|MP zxHz^;(e4}|CD84!j=Q+LQgELwuD2R|`Q9o$k_4@iPS9%Ca|*@Y;udy)D$4KS-=nw0 zLqNIOU9X+#Ds98Dn4`ppUOihcSpuozOvRC_$LR=?FLljOs%6{I-~)@tc;HYf`>$!^ zWEzvAc$WcNp6|5M-Fo)12;=K4j1s&um!Q<+d<=N{18Q=mlh4-y)xiwj z=X3Z z{ho8P4=ESy-?C#86Iqt9GL-I!-5-96xAU$SOuCg)D(Z=U+9!VQ8Y>Q;6c)=B zl}v>4lP<4^|0bXxA;!_2=W))4*O8Bh8Po*|Y*ltVRZbuyA$G5ObqfCf&4mP|$(S&@&bbUd)pIfZ^tW%M-aa*B$M z?c4<+F21ssm(Xq<;kkAT;p&@y%_Wu`jai?4YELhwrmd_~J%t?0oyt(Hc9UxU zh@QKo+fVW2EbHN=5;RdA{E)yave!1>=b)ey*eZP7lkdw}yMwKl*T8d$s`jw}gGShM zd42-kAVht0Mo&3s8PdevNh+3@VVK$Kmsmq;z* zC|OZ_Ax1v-XWl@lWmh{BpcExr)M^!&OR-B7+zC)>!cdTv=jXYa*_mi-v0HA3MWbow zB_?}jY1alCpiT@+`57P`L7l9? ztxy|(SUIq}bjbwXmaMYj2bOL<6WFz+t3U^fyBinS-VX6sn`FIF05t+#@<479jn#Uf zJ|+ykR2p^yZ8Q&izPg*0SMubSOH@cFX|h?B%WGG-nd&_gVtGz1CF%$Jkax0#EJ=J1 zPF-B!28s_(CwP4xMyk?mOO<>8c;#{OJ!XV|tY<0k)-qkYrSy78+?xkh8jv`TxZhl_ zm8hGWvV%%)`oJ7)da9PO@isNH-2GuAM$?Bh9CTz5=lHTt+9yg-}oDU zmq66hPxgEy0tXPNE2>zI0*1$H_qV<*-0p@}W#o9^=NY=Xa=Zme(Q0CbD_7_lf(#tu z)Z=)l(Vo@2^fYfCyrpneN7?I>2%U1g6bes2YI6eWd7|RF-_ac#2=A4BzH2~=KD94+ zia!|qe+5-MO0Gv%i=IO|adowtg1)kU!871VL1S~|OXD$P-2S$aB^GFjnV4qz*hy(_ZzKV+Y%T%DO5fahU0N zehH%4zN`u|de$R==%SQiGBTzm0p^jv-bI*uc}&pMY*D>*C{9d$a^87Wt27rOl0^lb zgY?|0K`=MrnyhgsFs+yz_yEj7ChH2LxOs^?lAiOsltr0pz((FDDeO^^5Ipx-EG}D7 zEm)9A>x>j5Y8+Mz3X;byWd`ei>iJZ2%rdr)jIFu5-7Q@Nreip7*O0dtPq3+F9^n@; z6zodbZ1H$)x2bBLqb9Tr(OER6XUSP+gEGj2TIzJ$XA)|N_=Ln;(5dAx$iJB?5qR}X z2Ly&gK|)NT;THJ-UG=)6opKq8oJ1@#Ujs8HKbD-+J` zq=INQJ~&hg^RPUXK-bZHX~fQrN|lcKj|_$IWhD{Pq;wW3`iiF4$CSiYFqg=&qcF!1hlY0Qo-B?r_M^8TWBqw>-!FHs_16P-W5 z=CySeaPK@nMG`r9e)P8hHC8Hj0}+0*eTrV552PG;`*|hjrO4at54%>B=h_FPuCw!W zc8s{7Vs>~5Xh*`!49_@g%n;vD?@lr&86e|fepxEElb_w~#WNL?qwZmQW)X5XqP$&-W2-r&5Q6Br_!D$+xId$awH!eYv zFI$a0r9whAZt^rk)VI$HsB76KGm9nvM7;%MjH={Gf>1Gk_q)dj$1b795}u!ql|j*q z+Qq}O>NEl|W@$1?0$SC1jZ;XZA(opdt39NqZ38!}zSV0tSlV9?ice9NXt0?T`J(KW zhoHgxal|l2039KvQgcgtd04frKxn4;_A;6R+XGCAZj z^xkBD6A;xw$)5^2#GkUSu;FwXGkb~&a(nA74*BO4e}fuVdBD@!uIfb}Txa%78u)jV zFQ;x1^(6hQ0EfFObNt*C#4t!)sZiJ$q{ZS_PGRQ7yEQ>1I~XYR*V; zk@YM-1PC1px0aO4T4Jc2tSSww`j}N} zrr6gdAbd}0x^wW5k9D;MfR!yO64nLMp`#%Q8IY%@M2Me9S_;eUGbt||H+%lZCHw*6 z=^wZRKs$(7VzJeQD(Ikdf)iguVY3~RAl{pVUel!;&cQiCeG#*(15$j#O}(Nm5tgX& z?$&Jqe%9q4!g5`se^r7DxZ}isk_eELU3Zf34_rdCcP>PdUr7xpd$;OSWHh1>Rx^c7 z&H9oQqD~3u=44_cB~`b6^SDT1N6A@yO;6zIJ8G%Xf!CO>wZ`Xx@f*~h-K`OJ^J+f} zi$8D)_8cf{i%R0r!L)rnNP3+PfDF)^rbTf&zxFvUo1gCrx)0e4O5YNHt*>)3A$oZ{ z4VLv#$e)y$#m#hS!CEMigh-i0=@i0m=)3=oOIT{flFf!%U*?akV;A4fGSx};8l}9C zN9j`=?3(n;qQshZiA&ylu8!uK>m#p+}iNSA`! z`jn??;U-<_Az_mzfO3(4xIW@^s@zEna^11g)}3H=rAoncTAO7qIa&O6O?WzASJ1N(&ZBP%JxNKj6te4omXM`;%lETOjbD*9 z<7BY&wZ%hI(%epwXHT`UJXIe$&Q7(#b9bP;*E^bKlX0vdYEkjfj8BU2p!}K>zP1-N zw|wohQ%g8p{3v#C9Bk^St8e24ZeairM~UA@7JwRG>ts1#9_nRV zV@lON+n(U7YT&b-IJ)`^K%&4Kh&*HBN7JYT5X~!bYNYUgJ{^ewtK?3ZIPd&KR3ebX zoAq&Gqv^zR07>OIxW&?or`t5ieW(R zriBx6xZYg{v|vvZrHFXF_u!*#nNKfOpMA+kF0!)E>J=(~B(}9xlEFay;N$TnshJvb zgf22rP4^3bS1MRDk-u>X#fbNHBMv*T=upVY;Fh&{c56d6f}9kcqCrmlf!C;*)auoVi!Yp=5i?@%tN>pvi*DZ^JKHxBB_0 zOQK|`tT!^D)(p0&o$_T?RDBn0zh}L&QvmT2{VBqKo!gmLi5S>74O+6@!7?nq!aF5D zS3lY@xphs8_mzO~nmn>-jHxW8`k%XzHu$kD#X|C! z!j@5HLy3Hnr??KrC3(EM0jh#RDN$9#n$9+xE@j96j6xMo*C9ZuWt}s>lB6azoozmq z?k%x@u1JHr97#f-DivL+Up1>mG0{G0JyDT99|8fJg#PGeI{D)}gw-|ul8mK`-qcDr zSJ04MmaNRkx1B&8Ujz&7KrWM(YU7bH~4o$;o*af<1oFdg^FK?ZdM&+(bfYy)4 z{3mncu^SScTV%~7IqM-ROhXN6A`Oe@;DAUu>^yMEqcN4FVf~dSxSlnq+bBhKv8=T56J9G4fsT|K>1!Hfse04(uwg~3jcs3u$do?d{zI^T z($FHSApNoJG=~J{z3=6>escJ1E}ARXelN{VC!lO-c%Mj8&?FY9rCBvq(E~Q7c2?TJ zQ-m!xIYY{I@JP?lM>+6nmFJnV%FmSCYX0#BnwQP@%GJoXV968@$a*aOp28`+H{Fyf z4(6iPUzQLn75%Md-b5i2KZncI79bOU$5n-0rFbHGec=?0ZFU>4BcJjvGR)Fc#blrU zDm3b_ERSzUl>r>q+e0BGD79tJ>GmCy6@k6ha_8$$`3Ek+3~&vQ|8esDc&vWH}e4IAF$DrSJbIcUYjdyh0=%hgwO#T~};K-dmdP*DL zZ#ZfwsL68)`9NzQU}fn$NOF&*K0D@H{7fNX?W9I$TyHREYfyHKy=)s^ZL%dikIr#T z&sw!XRdUT##|{tScp>EoKtrZ>4Q0cj{_!o)$W9A zasn?qj{kbXtF?EQ=?7F#+RCVu@f@MP$0OhdN@MQJ2;z8X9Dm~y%DgHrQuM%<`gd$8 zT9YZKiRSlK3pVI}}er7nFLK zJp5e_%U?&o6wlwdgxV;7MT1$gIVz}Vz|oVJ+U6&C3qBfzX6k?J?}mAT zszna7fb7R?dX})rhVYwoe3mh z;Y>o0V0s;DRsK)FebS&Ui>hX9w#;vyaDiJzWLYkVM-AUSkJuH+%T6MaJhqnrTGz>i zcqHHW%Tyga;!E6r*G*LCuJFBOH0@I?Tz9dQ%SoXVeY-`;o^H6$PTLHBN^W_No?)10YWT!7?9Ea- zS?D>wXN~0f-+=zWdeMbSeYN5gzC(*&rZgDqc1U#uQDs~gvjk2n`o*zhJ+=f%=~5#@ zbF`~wryV@-Mx6obj;h(o9p4(Qs9CB)L3%ADc2PPO3BI zu4W(6ra5VHm6Sg@tNAJvlkQ(BMph`ED{7<0{ZnhbMN5*Kyw6s(L4rzDKy=p<%k>iZ zNQB)Ux>lPqL}hjdO42XgVJG(RTce$K4X0mqAD1G3u*V6|s_{CtogyK;Whtzu-_bj& z@vIK)m@zlZGX*K)l?!1>wPQHKaMOai#rIvhme)yc=JcQ)-SW8qwX zl-P8Eu9to#uldSFvo_vPM5SFtjuR4vDmSi`4iP53il)=#l7wJ{bzYe}g`qNno zc-1|u%|GLgYx^;QP~K*+#k6FC zEZuS0>N}OUpJiZ4@J&ujY2N!#8b^n=h}imnaMtOd!L;&qKF^UypF*LSudhC<03V&h zoGk6m;a%m^$Nm~Ys4S}JERDi}hpIGxj9|tm891w=7~BY8S@#x+f{O1hey&oQC=e{5 zs@gkcASY3p&CC0{Gxve5Kyvlk*VvRZpL4E_dW;V*iYX3tTUjly9@h>(kV|am++<#V z?2F1y-%WL34P+@|C29cHc>Mkm}$V$2Th;!tBShd1ZHNSq2&ru9l^4sJsuw*oftSZD2M(U>6 zB(~-tb1muC5Ot;tDOB}(30>CNY z=clM4pn_6SzBEa9sTaMn0%S#hb<&qW*mQJYsl0cBu_%@|#2Y$fFJ-ra_Klko3n(RJ zP{l&!O|F#Ow~1b*MCQtxC_zvrqAH6=?E1)c*&m-VThqy?2iPnwRNsWnA^(5@#+m)Rji z5mtWL${joaRMyklgzM1Vqrai`vl#UYivN-GOH9It#KqV~U7y1^*Jx!53@k7}(;ACj zvSAXi_IJL7eb?Q%JYKnfK(5ya8W&K$k(dc)627|95!<=`#XcmwTGtQh zds#~8c0Qc^yjH%My1LSTw^HxlLr(e|^OWQqUYiQ9Y3nJyGOG%t5ewCXtb$ki>%(4H z`e<Y_l=0*<}{C#@9|J_3@B&piOLK{X98dedflNbf+$DF`sRJHrBF~6|<=yJYq1E zI98&iTVFp7xXH3o_)YyqN7FBhgJ{=-W#L6L0M{BBLgX~UrGi6PofUw1(+nf}?rb-iA zT>>eWT8VF))J!#hm8l$;bL4j2Ue5?rO;oxLz^pQiA}lOifTt!YQ(bF?RdPwZb!CyL zJJ(gv_ke&XcFk?>kjYiEE2`pYr>^>^I`ug#Vx(*@izXyf!d9L7s*M_zj}&Jh(>dQS zPXmrbqv_Q^{c3wvT|$QE|H20?bA8DUta#*2$hX=&qxM^WM?75UI7j~n``dgPpi7aq z>=8MDwN`5~AV*PZSN=ifaj{UrHmnHN+T@WESOGK20Q10`a~0HfD&Gr2hzJP)d(H2X zrPk4R)?<=;S_@=6@+2fLPiD7MmC4?B{BOsG1u&r*i}offG1*VQ!0U)NRw1` z*c8vO`w`uLS>QXV^V`T)qH?rOfX3-Cp9a?BP)6L5PO=IwoI-8{{brWkQ-F}t$WBaV zmEfr-yKaOmA7YHN%{u33X{nx?fAY-3Vq)#<#Y{-0ngH$*xMXJXyGoeoKm9ty=RhEs zKf0o>OQ+p)2bLT6;DGRUgd&A0gFF+JMCY2FlDAZUiC7BQaXr>ZicC?lX;27`jmPom zJv=Pb=%U+9O|c~HSo@Z{7((tqMC|nD!f?^UZ5_SYS~ytD?}2~s$! zsW_&1Il)7r_N=*r2BD=ZVVo3T(<`q(lAIkW3aTEn6C8-NIq=9Yo&*uKzIfa?>IiakUwbqDRi6amu3#b@@Nyx8&M&3rfQg>9$Z>1_zlc=^`B`z$oTE26#`ZN}k zk`g+s?x|*^=V!%&xjSnaugqPzPD_8_5~{F9J-g_PIL~@D=OkaB82h$yVV+-V2y?pf zW{+O%+Fckh_^7R`>{TsSwSe%tqZAlvW;$Shq}kU8ydlk~{H9jQ!}?SVO^_RuP5Im&UJnrc&oRB6tmYTGTuvfgPCmF`cdslusdZYOtV{b~4iO9?SJ8ASQ?U(@doTmqr$ zJH}c8v(5TE(h!fbj5Jasq9t8HzXI5gluegas@bJez~B(#_bu*&3WlM7-*gm|UuQi= zMajs6q^oR~NlqfDds57(r^AYW|HdVMEE%K;h+_n28S!+#p~j@fU10lmm!!j&By5N5 z`jlmE`yfx{2fnMD(shI^I+Zvv?no&)_9Rtcju7@SRK->ERh+nUsH!g4^*1gd+ruL( zv!0fSxGT7?fa+2zc4}ZNRio*a%Ny!;qj)2)TDBl@U2edNLF)&A?|z8yEZ0+itnol; z6m*2L4hDChDc?tm)qqi ze(ILYl;5QPW@Lc58icLwn|kInM{Ueu9 zp0ngLl8F@q+1G^KX?Qu-1f{SPfT2)V4>Yz^m27D|RU^%(=f_8l>7X5n$vL;9(Cp=G zU;9&=9}49v{}8#9SBWZ3Sz0|``XiU%FqhqLmgM_*`Zy%p*;VO$cD~0qoF5y!v zqw|<#3p>DBini*6)c$~0wjuSqo**P<`)Z#Wk3aj*^~goKofRz_)Z_yGIlKs%Rro;K z?Fa5lRo6G_Z`L1wMT4TY0LCII`EOi;{op5Qp`mb-lHz?`aJf6t_WDlo66BkA2a1*F z9*=Ei%G^#4Cv#g7t4ntDg<>mrcP8+b_j^<&rm)WJ;lt z6?UT7U%e2olRBzTQFt^tt+C_ZxP$_@e8sSACg*#v5yRr)KSy7cyE$2f?WlKnJ{i|v zj=632SlSf8=jD>G`t!Orbhd9S^>eoS`5TwOo=WwJ z)F@ff&3r$9)|a|mWb4ffYR{CuqN?P4ot?LP`H`jcv#7=SmZDaKlAB96rT3vil$N?R zPDsS%rSJL|sF*#ip-SA};LTqWeEl1j(7VjSFngF`vg?AZ6Nfd$ZMB49siVd+=%g!V z!m?G3T>uyS@mEt1${s~Y$o$FzXpKEtk194K5}F}@j-cGb8y$~Q`4mh<6nIAX8<%iS zs~(|6WfEU!7_*Ieu0)hgwYul~Cgpy+p4IAX+2qUdieX5Neks;iwwd%}^d%7U$DfSm zZyB)CV>kWNn)i+o$+Lp7@>f-?)Tp zSpHCfO>*j|Hs$d^F~uv(kju++RoO!Muo&VUugF8UQODL4+M4R561$Y^nED2prbAGn zLk8K{?9(47AisHK0KBJ~QZ>h{f8-L>W+1|UB#nEh#gz#U@;v%6kTe(Bm#;mzv;2BM zOFH}FJvb`+jKh0yLQ`s`hb8>39JY5{O|hb1MqoXvY?9*efJ6=9QFUkEcUI;PoJY)l z0BBKn!|ti6dg7DF1M<3dE>6N~usX`4*S$3SSEd3VE-uvp`{bzobJGyDaJBP|&l?AS z*p^+al0zuGMn6VJS}cb(LZ$7MEvJ>HGq>HM!XXL|}IQg;Ybah`|A2cF_FupN9^ zHL2}jN2x1tr1>boo3|3y`|$dsC%xJc5E)1NG$^B_C|`|*ThpULX_mYlsMDzEa#^Zw zQ!Qz+mOO0iOV26K)p7%6ZN)rui~2-=vjE=LBS-xi4y!=p9i4o){mP&r_XnIceeq5Y~wmA zSgQ@*!nO-9!EOsC?{NwoE8lEH&jzLSTpCXkwB{Bu=YEIV9BG85+?VNMD<`q(mg z79qN(SE>;EQ)Y5}9OBm8ABL6a$)ns+}o7I8QceI+z?K9jbh4koTxjGsFu?`=2-TOOoV% z>bf?Ady=dLsuEAQ3cWd5!xSu?UoQJ&=LR!!mG3#rQkFKW#!EKO>_B!}Aa}>*3-0;# z2y|pmh)8c$l@XhRcd+#jTte377|8L)tnnH#@Vov!5xm+wFB*W*9`(L|&1xi0nL|Y{ z6Agf*t;+2FWO8Rc#iDY^Ujh6sV`0|)MRvpVrhunOr#hhCVlVfr>#d-@ zFv(I4CKlE6NFQ&yW?$uhffQ9`;Q9aL)g3AVi+|4yI$lQMIeVJrJ@O;lOzj+ks0snx zruq6P0e_uQjg>;c3SkBrs ziq;CFJ*Kp#KA6X2k0NNg9&R4s<~n@i;CHv4?&PyPz)72@(o_U@o%P)-!}x7z|0Tb8?S@waPTU)R7^X$UT#3)*9OerNq8(u>5)5 zmZGHRdC#mVT_b5hRk2~s(HBpV;MnD`+MDQ|k5cz2WlhvQA9To1DR>okrM!UD?Tzbn zGQJ0Fs}_HjzM|pJ)j)PSf~_Nip0%sr~_ zge!n+)m}j z-P10YWYraBZx{KOL#>;aIWPytvqlTPP=75#Je$Sza-5x{KrgS4I2?X44 zCu&VWN(77;Go7dys$~+_^rHrnR@GxNZ;-sJ#X`~5T*q8qn5@`%tyri!N#u_FiG2jx>xEH2Q03@8)?S$PPde#g~1ADZ|1z{k2Q4iyg6 zMyJ$~)T@4|#9~$!kc;aj34+;^&Pkv~@wA4+(eTeJ{x)?)iYyWJkO*(uFTWuwPOh1; zjK7WK`Wups-a@+4fMK;#lzwVDvYa2&uWRhl6_{1( zud_G3jV&|~DU;yKmCx-eimAsdqxuz?rS#e`CK9|(lw2!A`U?NP zl=DE_q&%av9o=$=5{)-BQQWPvL`KekfASF5FS=+BAhT3}z*-@ja$qkrLLk@MN52fR6^r(5`erXXnqM^{E zk705eKt~Xn;%iFRriNpEboRHd4aGsAF69=)Ktckqp8$}PaQLW@az_Ui=%&?wR<@>f zZz~G7@*&s!Lj{fN@VG&g|{DQJrK(JosU5T0?ZA=~rJp ze_45|NK#Na!Z#@ETh`*7I_v6x{qSy0#g5B&;{UVfjn=;KZK2MyJI1te4}$=qWPh1C zQAOF9xKOd9{nkgbM(1GNwRg(`dRTBxBTXeAsV6Nfhlt%b~;QBL>$bjHwe5dZIDbaU_87m(~ z7|qQt6d+fxkfStJ*9rNfBPPq8R#?{^Z#S zZ)c3ylq$yYc+La%cZQkB>2`C-LE|+Ztp{#{NV~|?q`c;|U>)j+Pb)+I=8Ckx4v(07 zGW*7yrOr10L1sOFylzJ*m0}Oq>D_M7rkK*|BxnWTK!nPdB+lX-@+jnlsGl(R4*ZLS zY~ir+)Xb#l`DbW0p*wfG@8}l$OSKdAJ|a;85I}J~vo55pt*uded-(6|N#UGCQk^l5 zV{KjTK6uQL0}s-xjXYHaxj1t7_Dqb=VOPy;LtKMpYM@YmMpWx}D#dkc%BX47AaqHb zR`f2}>=Ygl;>OWGfl$Y8s8xyd{yNyacF&Fk>$=i>)4Y_be2a>(%Q+Z3hHRqH4CUFj zVmV+N!Ut(gVhqc7UZHW1vR26;I`Ul(%KDFPavIYP0J+&`YUZd zHO$(PyLf|tD%?pcx$Ue8uS$AFyRG7;JTG~*NF?X7Nt3E=wJXy8+|Q4nvxronn!ak^ z!!}b=nMWjaEQ12`8JS-!vuJy1L_+NiQ`mfZian`gOG5 zBW;_-pEjPC*R=IlePvjde7-w&|6~Knvx+m$S*zK9K-MT^AGM%JS6^q@#rRYKSx`5` zil!ay{JwpoXy9!wPr$miE18%!t_&WadjwUsdsL+KH%SQG*B!a@Z<#FG6oW{s9)NlT zvv6&65M`2a2K(?-Kp)FC6(B|vajEalkd zpHGAu&Dod7VMYh=i&j$7n_4n|UREk2fL$*RErY>{mx-vOUlgX;50-H-*EZ==(h)oQ?XQ8FYbt-TCQ-i`;Oqnt46r#$NX#(@PPFcEg zY>sZOg;2$F*W@|hWI?6DFZDaRrQ^kayxMdAl3IIY!~%@6PtG0t{{u7k&Ik!o71KS=B~2M{gNl-PKY|MI8tDnX)Zuc-weecP zsYFn6swV(iuV|M|iXw8FPcJ$V=BfMPfs+OV|4A9_G0Z1vENF$oTj6G+{92aM z(1g7`9&4PdczQj9_Hdr!O-`wsFFz1euxC#(FiKK2h40mdl`Qp&#nf1N*eqnzls%>( zBr3!=pQEkAnvObuo*6oSMcG` zz?DM0m(Zy|D7_~euns5c)n`bSFJyepGi^3jiGkESnT4uSx6C?!Cmt`LD?~Qks}FZ8 z_vo$sZ&hv{(RjV?(vq`_9A4_rrBsq`2!K($EHAl2$9k&}2hf)w)OIUXyxHC;>p>BP zs*O}G3sk5_1*M^qflsh6X@VjVypaW{i|$z8l`v6@*?!yWDl#U2Dp3$6RSNpt3RY9v zfyR=gj3vTPGAKBIM97Y!*aI9WlsZ2T8XSQo84;K*2B?~IqGYD3H79ljl(?7K(*~0( zNyq}u3SzEd`}do&a{wE<&XuBM9qZ(F+>Ya1kFENZ8}mJAholsG}8jxgR;~cWiK8LW;Z#1K6uhwv>m=e?5y0M9Eidy z;W`=V>X<<&r^R>bNqx1~!Kc}kFjQLM*$_3G_z$?Wn*)G}sOR~d$~&IhRF>wgnH00h zL+R<^iP>?kjkvM}JNj|G_AqWWr3M?|LyI|;{#E^6`m}B?76|D?NcQNr0MQr40P8I3 zo!Qhjy5p~Z#0O#@h=nScFRqTuv+l40A+zj@Z0ZWeNa!R1Rr>McseSHq8U^Sb5v}QD%vjkvx~j z0oY~Fwhz*{zB9@8xPipa(1{D^dLbZEmy*mPVybLKBiGN(%IVLZG)Nr`Kh{coUC5#en8Ar zG$E9KUG=BkS8|0_XnukOdo}E75$N-6i_`WwW2Z-YS~<@<@Xn7>JWqh6!-bTQ7UfU4 zzBGVx1u|3tuAQV)Z7We=gJzaKI$N#(sZPy*=Z034GgOd;aU)(m&+Y7sJ$}O(H7|>f zEu{5&RMF=9<%s1n0x5!;Jv*x3)hbP&Q2pU{hk)(;qEd)MlL65PPX*wo$`|D=>zg;SOj@1F+N~T^FGuF#$Q|7{d zS_oJ%i;}-DnUtdGS^iH_Vj9yEL`9e+7w102_jB% z_DkoJt4Km-F(NyTtxlR)TQ%CHdGpuE^iE`R+0<|TW1*HX&?`yv^y8!qvJtN&cr zI08zf9==sJIc`%MMuj_)iUJS#X|j{3CV2u$d!9SSS7j!0z0I=rVi0nbeP6)$m33#U zs4b!`vxWdGhzvwd4n>KA?!K}4qEltoyiNOJwvxP&VRJsnn)7(k*;IlzxzvZNV)hNt zwuL|ppgNG_ar9~)&o)62?At_tf@@S`*7{!qvY(%2AaGhYOV6>2MX6w8Lv{Y%LYsRv}*Qt163RiJ)WNXM44&&f^hF1de8RS=D-`&aQ(g zr6obdu8@Gf{h<@jM!m0y*^5*0GkT)N7%8-(gYTwhC$?r>b&epj*)C3DDO$Vo}xHAg#a z)$@75N48`O^6@D)lZJctGd|)+x-vl|DDqX*iBk4!mJpnbG+m1L(l}O>e6&few>!Y+ z+gH|;jIx__(|`;~DWUSR>V&1?e=5OC6d`VZ#F(je7_jGiZrebQv7|l6Z(@k(-1R&4 zuv*T&0%d@x@aQ=G%8mo{c28yPjm7DJOfeu>PR}=dfLV7>j7qV z!mme#{exay>k>+c0qo``g68_28O=Jg7OhP`o(sj8T z!Iq^Fwq?(-4tV{MthKnS|TJfIair7KcoQHUt0`rBRCoxK-l}|-)8|cqI?N|Lx zIX6*R1;@n+!~Jq!fkP5of3Fmv{1pPW+8$}x%jLbR6A%mUX@6?UvpA^J;z z!fMA#lHxt-dlK|{;YpFOx^Vb?HwB0h^Qu-U7Z^at-IYgD?y7?nClD;`RD+U9lKS40?HD)cmFqgq6?iZe@U8K9yF-*mDa|M^lb-~Izv0j z6CY3G;_VsmNmQ^!61e<>q&t})KHpi}UaLoX>;z(3P`io3e}$}}cDybI)b!EGe#iC| zYirks!@*WXa{PS{_OuF|EK1KVK-_bdJ3oH_i|)}quV}dy4P_s{Md-e#wOjB=M$>=T zVYuznpE^2pa;-;V-M&{1cK6lXQ)mQ~#wVP|3a0UPs6BviT9OXS$VYi(+i1;${BhG2 zsZC*JDqglaf5{?SF<;cAbTn|D4Wi6rP@A6Z7-jUa&RzppQeGZ3Mvz%*CPf*a(<0OV z=Z)}_o;`sONYE45n0Y!!Gm|Sk-EG)5s?1d0>ikQQQ>wQrWwVz+gy^1PI0nnIpEl*M zL3@nDjI+BR0@deQ(pfyE`IgSuMIsQP}I0!OG3;HqV_xcH&URqRKaENhaVj`>X$acd(DtM(#aL zYX#y#R8FvFV-BF9tLXLgpUxL?0_;ak$x5QC^gM#M@<&eYb0F7!Usn^aq-$XCD6c!C zga#5EfBRl7#4cawsmG?=J4;lSygBwT->7Nc>l6h5`UozfX0u>uPyXY+X1wYod}_N> zm*^^D4ND&V{sw|>&ht})E3q{MBA@2)!n~l@Eh~jhWn=@85mBi!bmjePS4y`*fth42fT+G zI@z#f!0%z{pXRZNYB(jEP`B*^DUFRoqgqXw_d|eT3wquXGc%F*35%F ze@cYmHe2zqK$Bu}jU+AmO3vaa@ub>bDM}ZVV3Y9n9f>Yn1bdyG351q-#>xk_oL7P6 z>?n^X>F~3p5q09hv_M(vxDs!HfA@Cd00ZXWTGR`?g381lpqv&mN&8A7*rdn> zGp$CAvhoWK^MoUw@3L39FLu*3<%^#qVX(U+4xx+(O)v%~#LpvP`AS}YVaMBu0O}}g zxR>G;h2KpNe*r#vqupju=BmvZ0Yb@dp;2=x&I(5TNU(uupxzh{dJtpTlD)|Fe_;#d z>#p+gFW zia`KdCQxwrTB%+MF};e@IQ6`pQpfdu_1=h~#81{xGN&x#a18PCX8u;?GxR zPl7HVm7`s?AdOYWX}$dn07+}0>A4ZPP}WKUl5r)=pPe3njdNjP0;{@xHo%T&pj(wE zQMTDxAf6`jf_+-7eK6@FTCuh7fid^YEpE-1KTY(qi#d51dPL-`U&+Lue@)dEffd2| zjcB+pgilKNq2dW!R2x?e1eB{qp@W5G&r{Qqv`pUKI{+O1Bzz#MvGLT}ncUZ}{<9jhTsg?;4Mf}(s{>6Sl)uN8|1Y08~_f6i9v_%x)t2Px|w z0Ey5ZqQhH^jwHSh{2aJw04a-pG?0$`v@7SU-$Zh;vj;vo?@Tam^IGq+_CEbns=rKZ(irCsuB=N!FHKRsv;t`%14u z*N(>y$|8?4xCc+=e>^9rMj`}Wk zQ8#%j2527djtXW<($lBUp~~90Ll9WvDM~paHvqIV-^y;%Q{CaKJ4YkKz=XkEZ~&5{Y!AKpkDzY?C|NAbRt8NtnL~E-%#Wz#e0$gLgKF!} zN3i4A(Y090lWru^^1fa@t;k^6G$4Xk2M3hPN5y-l2mS=Hg4`t4eGw>-<$ti@<&-Cp zq@;=DR005$e@JR$*vFN{AC*9*HGIFsQ_2_{98rphO&w{TEDW`3BdBzEq6R`>-7WU0 zr$Zh?Xs!^ilfgPKYmxOsL0!ZKhm7J8jbL|q*iMzj_8|GPc^4HzFV3oW`Ez%?_j}27 z)#+NNRjt(k+SBGZ#RL@?G2;3Gc28l53)~w^mYN~ze{nON%9GiuB#z3draO|=qtBS= z86-()2pR(oS?HRVJ=6Z(aoc_QM=BDkUb7Mk5i>n+k9V$q0Dwq#EYim8(+{U9k^?dm}{V^z~TXgV?IG*kv2huQElbG zWTg_Qco{5Y`_w>(rx+vm_h|C+EcK!(^qwYFYI=z{ue=DAuzdtn-Xha zbY8h4A@iC8H^>3We1!w828b&^bZ`uEOHHkDtJnRMj96+Q;ICpiv&nZ7GqlwD|Qe!{M(R1dW zcRbpuhig7vCBmKkQN2Wq)?1`C9h&XH>G`d}!L>yU6vy)%*_=~*0v3w2IBJ;hT1|0n zDotM-?%s*`!FgZL0iNzldbatqf4UL3hQ{u`rkH(qxSa^m75-bmlSkusN;6WO;Ky0# zcE|XrdZhk?qvBK?{H1bzy49Yn?yj{CbX9Qo3#g7sfir6Pjxo)|8 zRMk#aUP_qOhmcfx5$sLyA!U)6>P|0R^M*$nv4;!<4#I6xXWvJ_3N@?Re=FIRms9zB zI}20)POS%Och=f57#?CJp7MXH*O4LE{qfV^cvY|+%lsr?J6Cy)A>b1(-)>D z6+^DSd_^~TmA+#+4)SxVa4)ryC`XLz7eS)tq2(bMLVxkS;Zi!Nhs8s z{3%-(+DY&jN8KmxHQS<9wx>i}nVur(H>wCMS(fW?jw?>ZFtbizUP21>u*!%n7Se<3L~5j~;2a{#Ue{4X*I@FDPU&-$T5fh^ zrFKvmn9Gxnpqf6H;)0U4rU?om(3}J8(|h@|{rCZzZl)YBm5ApSpC{FxuvWe^y`8b%)<)kumo*bfTh82RO{Jt z#hI4po=tgtu@VoC0@1yr%`#}4>`X#-&jJr-xLz6ab9hs~->l4Yc=c;Zb+dyB9YTmt z4o}f-&wG7RQ$&0Oy+bG%Eqs;HjdB zfV?4r=XgTJFE>@$o|dwsE|entT(^Df`JmGzzX#Ct0${x8My)LedVTJWB)ZD)!i0;Il#5fv=_( zzQiz6fwNw0o%z#A;~nc#udf;rxNBDN?MtZNT*>haLH2XgsDz?c$4tG^&h5S`9phPt zL9;u+4Ix zJr~#VnLOE(cpGF%YnpU^Esj_~ZB`v_$@1l@GJOC*6Fr?osHTgd*y;o$*>tOp9OxW4 z9R=a?qmpqKCtePLz}IHDoVN1R+0UPaFfcUfGnNa$VAv=os*&iasU~4#IWlgpwSBh+E0ENq zhtH7!*vFOfN!c`|kzdsfZ)k}AZjY|aL5Fw2f*whO?40>khs+-5TO-?=WK12QyryQ# zy`KS>{W_JN1WHX4D_$w!t0swJY^Rn^7{yt%znd|MLDm zwF=2O>_p{2gE~b)?TW&h8yeyz+0*=Eza!QwI4xZD01B!_vba6dE`AyhWZm%*VA>}~ z@4d=~*Ew>@PFf}D8UK0pO${~PpeIx%e>mEes=k}gD%$}JHjsS%`2qGi5NWF*`Q1aK z^aK#wTjU>oK}{y=k*021UE(bkO}=XGNpIqtBLLVcvd(zq_+B+&7DA%hQvH~Bp^mdf zZno_;S>RFiJ1g|z$%n3!Ie8MMQE!nm!Q!UuWi5MTLQbiw5gg~70iCOPi@HblfAKT; ziPt4)dL{R?l+91z)y1>8$pLAl*mAlSqY8&Q8ui++RllZd!p>u%XnQ0_Q@m>I^f+Dk zZ2KO;ROwNQKGR1@Mitr(O@?!M1)x5{kyi2RHB% z3Boh&>Ifv)0dPcyXum zsK~{lQyEQ)`k5Jdh!0u(nQx@@T)Zy6>y-z~cBz_*u&UnZ#HR7v!vKZo`v$`6Mo&>I z0m*>?BGx|H+LConM6=CEjMj5AC#Q)7>-nA&NPv2|VvkNKVixe}yYEbiwIa)AIjUzL z+2K7!SRD8aP9VA*)wZRUf08-P-u>(;J;{R6eF+`vaFy@3<7D>*HxbvJg>T#&HHcE>*K|UggbI%PffkY+RtGAhz*t-%N$F zoNUipYdLkLSIjW&HoNysHifFU;(2@_-D)}Rq;E-kfh)vJXcjk@LVLw&L zs3TRAkwSm0B9<;CfBQOWJJ-_`C2@Fc=5gdMHOo8jiv$CQXO}ZD8;B1|ak@RRRw+rH zi2Od{Cf^k1-?#+Td#IQdZ*-OHa~l{W@@nfd5}eePj}rB%vz+>xjxDr0u5iX}xz52B z6W<)SqvV3Fel38c*b}in4)ijE0!dOxpGu*9M-`mRC4iz{xl}sHCBE|#m_wrMdyb@S+Xmpv z5s4z_9+gt96TzI>xlzhdY&Oy`%@X&b?$zLb>qF9wH093|@-u;xkGx=T92=8T6JWTA zokRW~b-gu-e>#vskFrT>dU+2jMHVUrn-E7SwS33^ZOn~V;)5^?_|MKjzlL28Vyc~H_=Qgt)U(DUYG+(Llf3dDx0fRubjogYX3a(cha2qt**xoK0B2| z9Ta43-+iR3l)dcw{pPq70nVKS$klyv&ur-PGu@-N;evPKo2^6M?#sKnoOo)GhXf+0 zOlyJ=f1TWU9vR<`KiYb3i~Y0Yi7w5}rxIc82sVJ3Sz%QoyzQUNLsBzFABgE}H7WRj zK&3lX9fH^rP5$kE-k|QwZ-(yQv%7SJPT;|Jsu55k!0zLnPb!(=YJ5O&Gc?~0Xc{n0 zTzE7iO)Rf2w@@j{2VDCo6S8{gJbTW`P zkoR7Yqa38)?_@W(`^(xDh3Vd}G=rY$%*x6y;+Xe+UiUmx%QZhz)vL{C@78R;9VSg= zf3H?nC$Rq6Q5kHI8t_ixC+7|1H<2CZl;oO7xM=jEnt$9aIZV!}7_r-oUCNAa%@^b_ z8z)PYJjvu2(DYIRSuJT5rDtnZUgb2g!{6k`I^9jcX)6WW=CA?A#Ks=Zr@VNTfMpnB zNn}*lN7g;HeL^ZAtd!<7s4QbqMS8-4f799CQMnInYi-03IcJa|%R7m)-UD`;Ww$IX zuPmF&5^u66OTR$;ISE*CJ^fNFGSw-cU5E#cg$r`n&EEvL4p>FjFFLd9+?KOLT+iKT z+zGqW!ZC-3>)FBK;2VJQ;UM8Gn-k*~UdtAaO|j|d?U+>7LS^d;n78;y_)zL;e_NRq zN)HGp3r~7s(|VEpU=CF&<4hQ9)23663a!~1wwjaGvpN|hheWp^F|-$@g9NwrxyT5@LK_KK+yOSR5pZH3_MV2L~C z7tbCKYX_HtenrlxzS#rp4A(jIl}X7uoK(&BFt0=vvgV9)ks^FLYs+6jaSirQmKa$z zldad2TS}2bf_>a7F^L+w(U6Z|fq-l$fRmkfan2#eO%ma>$~0UvYfE^9e`i?a`zk7a zIFk)Fo(vkI_?dN>`2~Yedt_YrLR{xar<0E|bMWh>_rt~Xftkq)d~(V&3uvOvArAui zGOrEBG9E<=nu9VMB@s*ad=sVJAgCFm?57h;-4 zk#bu&WTN9nWHoKnwB)Kve=oL6vw0c_OdC_i4aj5A@$=5CjwXhFe=Hqej*T=IVYkLLJ; zk5{$(Hfe-{MGR0e0e!S*FSALefX)p+vbhm6J>>ikuVlT`+CHGPI&rPjcmCWgDJFL; z4nSkSz&~cVu#{ksB60G%E1B20P9}zg5a#DQP=@!hFZ5KFn-AD0I5Q-+Z!B!H{dVWx z?NKMov0c4xe|UWk6SoHpX(Key)ZUb$hVAUmVwEfq;Zaof7M|K3x#9Fr6BV3V0KhKK z{VpNVW#_&GSNwgVGPamK!bIY@j>$-ZQE77!Px)%#<&goMyUkoc5t%z2EVE3bB%U=L zVgfq=Ex?1{x3SF`!evbA!`TKY|MRKR7Y=)r(d>lce;J%)0#+K^tpFq9jcr|KAGB!y zkidu6R~CU?;^uKK6*G^^9M!Ii6P0C(P+|6hC3~$h;EYS^84mVffTe6a&w?;TmDNuG zdx7hP{FY6+#Zw&2c{=uV&K3$H)#7+KwlyDW-4g5PHFGRC&Tx~tc9C>r?p!SDDMW2M zjwk|)e+YCU4gnkW*z4$w`*CndsTz@qMwD0C|yd$HfTtM_|JZ6W6?CM19-&na<~hz1NSg3CHfe3upUmB<$xwR5%Y z^E0xM<9gx5_`$=jLkDsL$7-I1**JDh+Jx1qe*vyRai~e^DXb~*>zcb*4H__1r&@9Z z6soq{LBYN{x}n$640f-wP6()&`mAePgm(zXp1loYj)CjzYD#~ObYg0huCYHkV$|fI z*RseHYb10!8&JmLMCxIDyx0QA(U;DJNK=N2wc62%g{ZocruK>Hu!1SPoU^v*v+~@o zf0iJmNET6fF$EM2=vJo&GNv!Ddlj`8gpo`0%v5a-Ej#2DrG1P7bPgmgWGzPJ=+of3$-Yy0%WHMH9&wHfgq$KTXtNA7Dcmnz9kl{I-e_ZkdtrK zUaSL?c_fbfw00O^FiB9 zk#JwU5S`oVv%w17euBcd|5-@36SQWB4{gIx)7-goZu{X>oGlg0wqMu6f3aF8JHDc1 zxJP1^*+3frlZ$N!DsObz1lFBE@!}=GFYJ3ODa8p{)R7_bIb@Y#@$s1jKqP6!VPWPN z*VF{IK6e00_o)nyp%;a#ebIL8vT_aE{HB!j+fX_Olwt;z@C#qJS-6m-X_rovb?5Mb zVkT=<;%uF2)$aDx4u|7$f76??%dFud>-3(@Oeh{Cxka|8#;HObCua+rwMq{!dAgL& zQUoqV34?K%3$v$WH!3etRHhVYXG4^k*z1%tkp%l{S8(2Nh*h|X#i65|s<+ z*zZAi7cfVz*KrE2Y|Je7tPXA}AVkoY#7~=8e6RxPvYqCzPD{*(H;zsn?ybdR9wi>a zo;J3gu;ftr@3a?B*_W8)mRJ4&+na1-$H00iFInPnZ}&w76B{0uvI`%~@~&NO6B6xxJWL@~s)E3q>09=lISJSN5SY0D@ma;kbebE&1h zz=wQ>1KFLmZV9Kx(_FF`$fp@Z@cSfhpIRi%*xJ7NBis17jAL=Af(PI1VmB2m3yE3a zZ78m8={;Roe|LFClp5gT)G2udSiqG_=OG1uP>HYtmQPLdkh+pz%3YPkG&!od_oD|d za93Xrhw4apvp|>S_twKliJhE1in2v+Dl$1nxuz*liIeEgGI940T#mqvGdFUUYKgEg zZ(vS4_KA$}62}5g+Tv+u2V_b7HEhHP-B~#mrh-G8e}d{+l;`YYf;VSf%TQ*L)x|V} zRxfOPS1m2t5vw6K18Z3Lejw;@MODPG&G<3Sp6b{pC7hD)jtzi~?e4T~2j_!f19>^U z7lNXwgV>N5g>WLD07Q8YoyP@E1j(zrJ%G-2;9zWpz4$k7C4cNB%K1oy!E5gL$bhrb znzzFTf6Z$17W+VkVhr5Ww#!PpM7Ky?gS|U_vmc&BK$s)BoLA{kF@(ouNZ*_-SGB>> zs~Bwta|+IMHEZegnL{kk-wRTd_uvt@%=Q;alww7zNw3m_YHtOL+s?2xFDw`On$1e} z;)#ih2ygo4jBqH^IG=K5FSAd&nxC~lNMBoRe>5wKA?>D!9e&1fNj{!!Wtcr~BTk~f z&7&mB74U9zJitt!V=tIaPWF}5pmmbywA`c=uW<(MVUfc{vtId`q$l*+#UahiMZ|ob zEaG-VhXZ)oV5@5ZaLZI75r&-%PT8c&f?~|-sr7i=m z6c3T-PPMI6jT~?xNr1UbB17=b5j`$jo_zeL;(U0!s02oydB@#0=ukOym+CE&>aoQu z2ak($Ono6v_HsDbizoEdpR=6`e+S=AwImVK=N<@HoNI}RQ!Is+u^Wzu1CUJAO<#XH4ZF_rGcoTl3I^b3pvPv` z#00m~^wFNeI_yZ0U_@fPIQeXy<6Lk~geX%G$2gsbdr!DHq{8m9Y;yO{e?!v0HA~l| zobYDLvtuoXyeu3dbufY~WD4k|H)$Lkn`@8@n_#UCZ$cSxZt$+V@7+o zI}vlGY~4D0U*Cf|<&|bR{qP3wvaMs%x^1whIS0_-&fo8j71y2E@Q^QyqgncDkZ6w%@p$IXTQbt~U9tL`U%r(h!nHHr-E;CvcEJk?N zo%WTShA4TlU?La4ykgC{Z3iw0F!2@ibEP$79tM-z1wfGk%h!-5w2q= zh}}d^(F|E_kIjZWqI_45%UUy$#P+azgP=btEKpQEU9+471nt#CfB7ZFHpmJ|NHJ_z(nMBb?>zvx5 zw&QkfSZ02(WYywLmB$GauPL0$3CFl#k%sJLV0jNVK@;n1zIwHt6x*@l6E#-ut!f~a zzjirnZT~0}ve=wlf0FHZTkbPi^_WJ-4*8+Qy%(}BN*fc$4Eg3*TF_9Knof1M29zX` zJ`!OTS5E#k0;n}&?*LvHWvP=C|K$K&XI4E6n6uX@_GBxh0(0f?ppTO^W|Jkw%7j@a zo`LVhO30`RojC53fpkj9P@(zf96Olb^scX^D0OA7lX;U z&CVgC$j{sIog$1~f*@|B)$y`RRAZh-<}|a+_^8u)n(n;5gYfIAUhq8WU2VEjZTH+S z8NCxu)pTD~=4&$u-~~0`SWDUec|kl(mtcL~2qI+X3s1}2{KOnO-xWrXXh`B`c0FU> zb5i5jAxbdbf7)xEa^h7)BO~)=Qi31D_uC3fJcr2y2A&vw;Ma+1jLK!4PJQyX)m^}W zPp(e_0b72u{7$C;ci73qiE~bN1%7glFv`R-Tx%sVi-K2#J<+aLTc|7{J8^Ak&6u{S z_Y~xD!B?wu$Et>5^AbKXc#TF}XN&DJDWh0hAg5u>e`>AGn1(}SYus_>Fd5-FPXoNC zQs*Tal66kHEc?Pvd&Q(`N>145d(te;O7B?=>!-9s4O1sBshPTo@UJ<>W2`M?0oZ|! zFj{fylSv>f)r!MNr_wvpaPE^aev=DEzTInKxh7Lc1zuzLr9LE#ve)9Vp&6K~(t8JA zcU5B#e;LVSoL36>(ui|+Iv?sPT&mVSwl*vh!^ykjsJ)bR3e{fWQd>))4!BVXFP`}F zu+44~wtZEYd4ORJJ1kaLIoW_#N11_bEa9Hn_exC@dqQQIK~Z;b8AYd1htv)^=$>4n@%)DRS2ocER2yY8wQoL zS#wIjrBYI`uS8N5T3I5SQ6V=Y$KWm*Z_}b1O+f-rYPW5udzqS;C*D6s$!n z`8F}MZ{x2N*jXkKMy^H;#EIMxS@w<0 z4iLU!u~dy*Fr2^q4gKP{FA_*rv%-5KrjW%a5&UpUl(gMspO-50B!uB&&go6FFWz6Q z?P@D^lbj=-hNF{24Zt>ZeP9)0Kz60$LDcQ*tD7iCeOwnolPM#yoO2*8v9@MAe=xi} zkyMMj{OUyCfXyviHj9^oJa}S2wz`{Y(;ZyyK%8x<)coQP++*Wz*dRb3kT6%Z_jIju7jpbF~^0Dq1RC5q=#5 znUo%viUxaYibIaHitW7Av)XKBf57VuWdcI9Zz-!KFS&IYq} z(kwVP)aMj^?bxCb0KqA5)=KQNTSLXu3|pM|um!`NS7}zZq82z0esae-^q14`Do_}M ztJ(zY-p#wnaw@4hf8UuSx&HwZ1yDo z;geKlBUs}jutNZbr1v@PBd$}73gfrg6T8gr{$&a`+UU`NmmOHlfy#C?9%`pHHv)*& zRbtg4=w6qqnw*pdIL}9Fkl8~JcaMTOHiIvTfu&+UR7x91 zw|B$}rE=hbYk2IBs#_OJ1xDQ0MiebmJ+6#^c8awWd0a5M+sr^7$yHE{%l1|*1#V%i zn3ds7iDHmT>Rx(_T*Rbp88bO~sqe8hMN&+P4iJ!pf1IowPx07_O&nX7DTw0W$pPFhRninOS08ax99lV~d{vo4rskVOVVgrH+&%%E?7hJuS-uyf(mn;c zwtzOfe}GkrlB+H>0+MU0bJ<*JHnh&9o?)Y5i>!X{$s^d-tERmD?0CwH3vb^sCr1LH z7|yd@a`RXtPTXvpWAV|FWXk2DHeDD_&Vs^$4Of!!wi)k&PA?k*!NJ>(|^H2NCP*u(uPP--6BH!W^qJ zy2NLR4=~kgm;qKTomX2A>kuF|PJ%3kL)LQ)0yf14J3_E%FTX;8sV1?*X2YhD9kzs< ze^U5iAomPqHq{?huyVc&EQ@E|;_=v8 zrH(=JPN_$3AhrW03Fz1jV7*ljyoY0R1eHWF#ZDzBGB?M&7b0cMPQ;Kq&*DS{k7(*q zYOG;n4clq@LTR#*B;Bp?!f2Vaf5iuu_u~;%=e@!*yPz+bK%9;v8aLxO{m218mfQ4H zBALTZw0(eZoAj@;b8~LO>UjN3E(6aDny_7)(SYL8Y`Yng?M&zD#gm<8iRxS03-|oJ zV8w1+M1GifCbFR5Fr0Jf3bBF*1b_zZ&UEvgJ#s=*2e3QAS~hu(x$rW3e-KZ|eQ3K+ z1)A&H<=9le7~4EHVq@oH#Z8Izi7E|j*o-NQh=p?ObL9=QeX0t^D{x~FCH0bOe}_`D z=PX3o-eV7$a~1ZrSiH;2oT}m(O#8~_gee#ts9=_i(<750))2&N=4iGr$axKHm zK3Esq2T}DXL|t}FY8!XSfA*7I<3xs&-r{nWSf==?y+!agBy^Xrt$9>1=tMk2McQ== z*>yWvTbH;nsyWF=Up*e{yV>geGm=e-2bqM1#Og#>R#9EShbp z)UY*DcyFdUZ9~dzG6!$Bok+Q1&5?1I4OPY6~_2R99q?b8U|U_1HYe=YuVyW_LK9iw#J^fNHjS)+72HVri$f`PE6gE;X*Q zTf>`UFQ&S+E-*Iv;4hjK3}8?IBmhcpM3g)SYYq%Ge=yvnf3PE}*4h0YY!BkznEG6} z4y_Q8%SK~*Q#VDJAtYS^B{mp1t7omE&59|v=mOFmGQqFYP;xBOG92)+ z*n; zYwT)80BQ^2X9t>`IVaTd~`UAhT5^ z;k>hoPB=@cqLE{?Mj{yHxbhp-71%Tbi#t)R-|uqGi48d)Bb!0p$8K}sCIzfg3fEGc ziZk!XU+=sKrwNanlTBoOs$W^gvk^jeFfjoiRmnt@+$;jJBE8#i;9?~gT1*N@5duxAr$m0Veo0rAS9DMRc#%EI#!Rc z=u#u+jMBg!iv*`i8RyfsYsIg)016e)h5!P2)##jtj5FQGt`cD+N!btM;?B0>U2$mq z!PF!Sl8bKAUM(?o4)LZQf4ulUoN{q?$J&0YVigOd0%;(?R@s2N;Ls4k z_v(n<=oX5JpA$xJiePcSBk$SHshqihx3?~E!|)tk=}@kPz6P7<5Xm0vs2h+eh~72} zTAL{in{moENyge~r`P5rRKBMD#W(QtbCkn089rXN^2Bc0?}&fu{7^QN&c`&ue<^OY z@HIPOif3>-*{Cc|5gO~!B^eHFleK-fQ_6u0$(q(RT8H5>WpygDeMHzAn`h3g?Xryx z;orh-+6gv58M~D`o2qQjnVknt-ENP1Qz9Ivu#@d2!TO^#rZ~iIgP$`RB}gV2RBBwD z99pG)$|F?UxG#0xG{^Cp^u1C9e-*cxU!1ed?LkSQh#xUeyGr+HbgzDP?Xw~MJ$Qtu z8&&;Lu@fwa#RmykSb7YxjoPa`bV<#-6QDdp(}gV~a>m;24o8Z3MfHagb}|U_F??3p z&7P_Xr~aIDjQBo<2nJqP3PFB*p22;wb=*XOT*3=GZr@O~IFUR~%|<;ge;IMQty$R` zAqQPiV^1uf?B7dSsw*OfVUomVq+zn?n6!X(2WQXTo0-I!>c$RGrYlcn#zn(A0% zgO@MIn7FtmmXvAbCIZKmr#p7yuHh&ImdR2XYg6%)Eh@1b*c^EoTi z){g;_P`+38x{3)&oF}nk^Nekhn{pm)uTsQM4&TdY*k{iC4p2r&ToQ?u>v?j_v5`|u z+=3T>ZYyLC)~~8^shDq$z;>G8F&^a6J)Uy&IYXG0^ezUrv$g7!ZYU|o99UGNqtl_u zsbg?9OK=+(PI%`We~OHFY?uQK0n=-@mYQ{dlRW427NCQ*OkT;GrqKmWY4MxNE{j8J z$+@AbB+4=S9qT&VYP+3-Qmzvo;R016vQlWbD9@S{P*o*2nIn;q7N>C(dlX`jbag-G zd^H$U8KGfu{d591Ie}1v>FK5hzRS~eR(!DN+p2PsQHXm7pi zROU$Mq1aHvfUGj9VoJaT7br`TE;T-4o+$&6q+HQOpkHKn=Im_xJp5YSxDLB*=#pvR z`Z;>}ly$I{e?)jxIV!w&aJUwulZdYunY&HsTOO;Sm`#gNnL@CG6}Nw#7@&nXEE%6W6MkqWH8= z)RZ}GMC$}&AlsGTe6gp+oCS_>!~0E291I#hW4E+^f2B=I=BVmjib3t0Yck)RYVfFj zL=0da8O+pGL*L|zCaxoxxmG-mpk%2I-cMoi!y)iBI=N)0hn)VyUXKa}v1!TX8NGqc z+uTsatG9tkbOd2ni-@JV>;#d8gQbbxW;zVYkTuqU{nFW>^i@c9t;NG*M>DB}+UU$#YDMQ(j%Dh0r}uvRUGdCQrf{E-aMg zv&jNf>`gHns!DS6kt7!9j7YoK2-?-5UU;>`e;yF*lp%Uh?sMrXgtN?(?+3i(Bdjw=?lOp6$w5A&w&&W(0VZOQg7=oBs$CwC|9@KS`n*SZH=Qi?JXiVK4C zMsdnkRt&M;4COe##K=S9xvDnzV@X7w2cFMbBG>nndzBj^(YdAXg9|OCuvnt*a_c&z ze_|Qc_M3G#tOP_jfapgN6q;ecaSZu>a-EIp#A9F`ZV(U$v!M3puKwRhbE=d$T`K0) zpctE&WuRu!w_PEZOjxe?7U*c<6;GfcT!Zhq8%RNB9lY%weZtcRIyg;BtO_{SC^Cz z-JJ+Lg5rltVuT*dpoye+^}<{ zWOw1-aeawnFwj@Al``4m%fWBbe<;T8#JhYVtjw~T5Xbaj^s2UIHG?^GO+-NrJU6dqhumCvnvp03?fXwoKpHes2j?S@_qJGXY#W_VU zHQgmcb|cE~vMYn}R>`|6|Gq`LFCI~|*!omoqsV-2`vLdJ-tUQ;j(}kfT1aO}uYZ|A z1r)l07L_c8`3Y-jc<2G<&qJMwwd3CSD11RQ@?NqUlCn=()nG4kl33hXq>I%NDkvtH zSy^q^#7VreBmrJ-Kf9Ma%#TV)c#-r!X%MdD!T3?GAa#?a0b<>+^ER z&Q)d8AUvA+h1HfGNu+Q%oqt$h)m*BZ(=J2TO{K_3VIZXdu50$iZ?1!Am;J$qZYnu* z*6YcA$*Lut3h`o3C;6*0Hi`XwWGqmd9UmAC3;Uc5D8hnRF?n{P+Es@wos+8gWL43z z$my!Yj3eMi2;-0BA2w|2xPtmw_-;10&Ov_Sg@D~^vnMpp$Pg3lJb&NnoUknz#bSUg zFZSBT_u~;{>sgXfz~h9!8K+|?xSeHv%LU&#`A#IOn8RpTCZMhO78I`z5_Zx_J6Sv| z2VDF?*yXXF*C)kM)Pg?j*U4r82v!`?%0%E>e?K0f*xF_bT;_1A;j}yVqsv;IP)bsMhSJe)5Ud{-uX8deTU&b6I zA&{TZ)Mab9fLV#;+Qb9dNdr7+Q~lK@M+<>np1dMo{BY3Yuu~QPptIJ`0dT>Em;A|> z+;c?K`Lc3z@;ztBo42oC_kZ?R=K8Do2mQ_O*JxXe zHs=?X#_^dPb=~1n1!<0~VEGE13C=DxfrkY5>Pl^rL13Mx8k${qnRhzRD|AfjWn+~< zbqXG}OTOx^@(p2}1gdj%KC8X`>iI9cX#M5eKb+tEP*i0CU%gQN@&-yTu4i<`r7pDT zz_v@koLbo|3x9FTN-%AMJcn$Rnk4iS$g!|w7V1ukkK*2Dfvxl)qga$|(OH>Y$tFc6 zR3#Wm1OCl7_0^|+dH#);`IG+q=kup8p8xKTU)9XQefEg=Ua{xD@EW)9y1yhm{oTL* z>h-U_`4rUh(TC5!{cHX8n-{NMKC8dDKKt<5GXHu0-G7hs%OCuh?f%Psp>O~A<*&Yc z_3JO6f9K;DFMsuq{PffQ{2PDuU-5_j$n#&UuU@tnZ~5zQmgnDX{nP%EZK*FFPYK9} z`>2+T40}pk>%&%)yPy_T%ZQO`-EFldLIQKO{p!TvSfa_k!)3MxyD5q?xrU2Z4F?5o zb|{m`P=7MJ-Oz(b={TIr4Ml%OmR1-)4rS1^rpPPh%S1|SU6h)Pj_!$9>0 z>@6v$oTudIwkV9nb)21S>*Pu+mN`#_xrjYaldpKbsqT<-kX3b5_#Sz8%-Y zUq7EB&ej0p`Jj9VrfktcmR&}1h1u9Mh4XB^v402Hp*q0hMVxPOP(Y{-mvY3#T>25r zs{uA5f6WnVym;!;aI?+rXt99_oM%Y(bu9bC-{4c&!m&$M0~G9win{7S@zya(0n@fa zrH5$SpXG!@@(x0u#lNwc_SRhCD4m`e&hJZ;j*U4x&_sGVr$%L&T?ssP1vRWi0!=Pf z6Mu*F@HhGtY{TR{-0;X*-NAUA4i(O>eDG?KqhRW84V$s7^@$72Y^)MZZ0br1jkn5; zmB`J)u7!5{-AulEYoZyu=4z@KJ4_Iox7t#9_?vu+xEtAYHNxa@;E3`joKEbc3BK;+ zsWfy>!*P(SLP4N5*PoRNlTBQG0ZfSbVt@B;a*cv)n!t3*WtwMCqLkBgY_e9!|0=|o z9{y&ZB2P7gQkTt;b+JcJLfV3V2Zph~HW0gAlBdw=|L<}jgY6VLlz+ha zl20@>=d6JYoOEZe7lMqUkmqbxZt1kYj5|7HKE6ycS2<=RbTm_woHz)@=IZJ+xKn!a z!LJX0t52aQv!SK~OdQ~9?ZGOWg^Vhi2Ff*Q`w1#*+zI+6PAO6+R$jHcfQpA<|G@OStWT}j03iNQE7{0s+I0b!yR zc`2|u+N>tBChB0tH7l0Qdn+r*JD&u4-U`qU(b)m& zxj+Lg^-&eKCbYc3aEtV%_>Sffr!w(*ior&}gQRAd%BBe(<#_nJ=IKlzKGC;cT3#4u ztL0v?4K=Nnfv#ZInP^;MJ%hceqdw+Vd%X_A$2>Zyoq`3Oe_JH^N+sV`56x(?C`{qpz zgtDv8=TNa%{j%?G_e$9Gd}s(Uko@L=JL)QMaJ(JSwC@2JKXSCQNXC0njru4Hr^ueg zNx)-MQ;PCt0A>k#%&}fgz5q5cJ^cOCg4-#(*?Gv_=I0VGy>5?{5uV)2rySHaRjgA+ z>L8H0OcpLgl7EVENGnqw8Mh9r@7(&@rl6JOpTlObSu))=r^=f;j#5tWDcrX8;UAdx zLdPxA0FTb?u;o+?h=Mk;Xr&d@2@n79d|K~*BqzDgEoGhau1-4Lw_}!LpZ_1DUAbaR}~?wwwi$P)ZR4D zgtsFmFOG@!XfX@7=G@Lu1u|)Tn;mR6++E}0AN46%0`;yob{N~X+o6*7DcFKR2ujQc z5HGhVN!NEt>4=vrQ)S?C1swMRR}-Hole}4#nO>gD+oF88QT8~@;d)r88H@A%pcBwV zC4WGB_{Zj2?DD1*xvH16sGciRf@55=ArsdDjfn|3gh7j#ciT<7bx7MPxJ)Y5TNjp8 zf1BzLk>A;Yeez}utCp77aqZWXQ1A!>EYEgmoVSO6+^4V;k2Ts)tFTL#!~AF?{!j{!a0n#DVt?4u8!mfuu7Wp+2@_e9It6jDnWZRc3!qTc z__USMIX)RA+QUEbh&va_EsF#WO8ZFBHlbEi0h=R8h~eS!v~08C#!dz6Ydfcg)so5wlf@rx4;Sf~h|$Nn7=)s#L+}BsK?F-F)@Dzh;~LE=(IEc0>M$Kl#g^iygbe%S!TY>n*2UHBNJNO$orLxUacRJb#9bq&Q9R zx2--H^;1eUwp+^M1?$qgIy9iIO;Vk*jwUfhkSw{|&8BwdVxH8zIBp@1{_v-KiUSwL zo!f^R3zkJ?gt$`nO;kuUtYTH7dR|1S5>xl1aCbw%;~aC6|u|f2nHQ} zmXPdlDnx9m7`9#$f0TL3=g7qCo;hOPi&i>e91zI9l5~Emsa-d;oz}XP6e02n}Km3`w7Fa@+ z$oU6zmCdek*JDg7BU_(Wbe;uTB&=RfscW6;Th>eV;*o(QQo$W~wSUpTWL3#pVqH_R z-~nFw!iZSqR|ZFR`Mqr*JtsLFW`Fpzzx>f3dj3nF_Wt@0elgAT(X;2j^u@f>U)JAd zzxjJ_fAaG``1$hUCI9~$-}9wfw#5Zg;(R_Z)f6&2*HqeYE->M9HdzT(Xy-n}M=_=V zrdqRif7A8C$mhx%*5i@0lU2vU~oKc(wO(omwlGT zeE!WB`Sr{ESu*n*Z(n`#@ohHq-V67|Z00Y#{PdHL!iV9*{mn~?9zwz=_ z>t9S^{^7s$ulj?(T?*5)_0=9YFD-8++hI~k^{^gcFI-Y@TYt*yWFG1gq)0=$$AO_7 z6{OX@&$cW9264|Ih&g$2jv_q9Mhzpfz1u~Et5-3o%F&(_yq*Gyc!rw;ckiU+=LhcF zZ{GHgKhCc|J96Lp(VGu`(q7*lx_d9)lS8+CxPG{N;m|#P{oWnAA@9N2_tl1vUW~W4 zY9mf7O=gU0t$&zE*r5@rm=z4|V0{BN;upupxYns&su~VEW>2+^iKvUh&yO^%szzi* z?%4af6U^?hucEP%Z>`*&bI^a@%DrVj-h6K5>Z{jpZV%kO7w(G(?iU}e-1*@ee)GhA z>$7jXcSkN4{KLMS4i!qrFFV_5EuX;dl4Klbbk3PYM}Ow~u1fmg;$q%#0fL*=J_+xg){=w_~=@0*!CjrB~SM6Qr?f4>i`_^aQc<;`eWY>=Qo{4u`MB-aLEWjxjPV9aG zgYjxb>N%D&9h0pENZc~!C*^omF0I878O0yzw&i--7q0#y2h}i#tZ?2b@wW`P*q|}n z%zw6PxeXcaoKLh=e1Sjw(VLHcZl1{Ckf=&Zn|w2)10tjbQhP|o zY4tKdO^ftKh5N^PT?UZgW=9s{X-D6IgXt?CZ>(u6d5pazkO4m zf17{(760WsZ{NJ>uX)<%-+lbn<5wSj)C5s380*#CZu0hXM*;{E}VUg*>Q8J zb4E`-W_f4%&h!Yi16NP_Y@Jv5BD!4!pCp?jA!#bz~~Qu?E4@6+*b|~E}8u|rJLJo zlg|OJSE=Z#M5<~`rIAZ<%C`0NND(Qi7{2;Nq>RGudv}U z?B;15_AQF5@j8z5v?;l9Ym)EXNBPdP|J@(GdG+$wdwKinSNqE+aN*7i_{21y9QW%B zrup&fpZ)mrZ1RVn)@N5qSNLK;Yq@`5F#9Z@?WTOe$##L*#N5YlLQ?iIkm_4$|(%Q=8kH zM0TK$)|Y(B1E!MF&VOy*u&b?3Eva`MxM=}Ra7@#~-cqIw9{$AlKl;X3egAgJ zM`cHg7ue2Ln}2TWn+b|Tzc${y%>i~D0`BXW#83ixlPL4dxqzocsAmJq6=B7APSnv-HIBYTIYk!#{%bAO}3JLM4*p$7gse@wpFw@@u$*;ZP~H$owunRhN-5K z6jsSLbgDWXfU~`rGd}_`%C=Zz>zuflfNI%6-4gAN#F4QE0IRA%__<`xEEXP%ejD%K zyG!y0^nE}7{1}TqCvB z13N|l$<`7*x~L^z4}WU*6zA>AN)HDi!+9up7&GXSza?e1B@mu&lhyXDQ3=`#%ABM^ zfPau{L|fydvqXzT1AMOZc^L>_jyyg(|;I2=?4QLGk7i(-a^7mjK9jEGp8s}>uJCbf8s z7!AVM+i~s=G0Bwd}hgsI0>h7#oUwfp4)Ij z>R6Yiye{_#Bzl~A*ta+JeM13lU3?3LtD z0#O_NRbtzfL zr_Vlp)_KEUdG?!c`|A03UVW;W%zq#Mk>B`T1g2l|sGMM8vaJ{CX##PZXoP#iUfD=B z#ZFyQx#@S%byEO4Ec^#p$QEr9bM?mZt#-Co@PO>IiYnp!WaLeQc)aB`;P`xZ;Y}q*t-)%1IhWe#dx}Yz(#{NN+cFBfIVAz{_Hn7M3_Eo9bKw zZjVn44}a#7y1|HCZ7($^yOPbAO7MybHV(TeHnubZ7P;%svRuPCh-D`h2T#eNzZ#_T zTU7bX>I$m-I)x%IKurlA`G26BQ7XdXFyhJ;o;AI4N$g%zIQX;P82TcfH?)t z*<4r5W#6&+;0BPErD|0cg^)Yw0hi@?n4`v-01AtF$m;IW7+zH@b&Y_aCO zN%aQ)$8TUEdshkI=HlIZl=n7&`L1^0doS5L>-+mneg9`3da#aI`hU?wE|W(S&!>`o zjoJescnj*CUtLXMTNp5Xm9UQEyE!}_o#Pq2gOUVC*Ksb3{f$FTwp55qicMa`9m00m zeB+fIN0(ZXP%!Sx!#_VK(J*DIx;49^x#tV6Ks#ukVnJ0XWp)jSwqKfvo4#oR3TlyWOB+c6~IXw>U?$Ic9*8q z6#k~_bKf1lns|)`mRu?)OyzAO!<{E$Z~fhyALb8#^yK2*dwb; z1<9KN%*@=ssHU6JmF!G0yVyban;Lz%E>5$=&v|W8sh$?ti8Zc8mIcgO%H>SUW`Ivv z%q1Flml}__By&9d#Cu^{i%HX}&P!B-FXJY+hktP2-#q&vi1fo}KN5X^=fhv&+rQadv>Z+k8xFHPIP|2fQ#~-l zn3%lmyOq;(SZG?e#o7Hu25Id0Iw``HN>me0e#%pwFntmAMDo zaqipU`0cSN2w1Q8I&gXZ&6(A?y^{A{vnRfAy@8(xmF~^XeJ*@8(yE9vc1&U1obp*VoUH9XtaAZ}TytCw ztRjVTA6R96U|r;$*c0$&#d6f_aA}eYIPZHcmvoX_z7z^#@q1a%hkxafhev_hY?n|5 ziCw3>@q0REetTbg%xlU~O*y{YixsIDmR?7|_kX(>W06T!wYYE@N==iCrENOm(Q(*o zO~=eYl(m|qPtIB`APru1dH7?${L#0*YL9$H+wkxxd9TD~vvWdy0yYK@((=j{cK}6D zSo>7q-o!ufCT=RWuu8121*W`Q>Z2dnGg~@1sO-Tmsh}MA80swM$*h(&4{qGSxu~~5 z_lpNPV`AUb;*x0z(NM8&7 zlekh1BaDesOS`0%UD|Z~GbVXvhw~OCB=5!M_5rF=DuR2joMutOWG4Ux2w?3n0K869 zp>k1=J3Rbr?*psNZ5zOyALlm9_xnT`uYaDseD>?l`m^%vE&u+j{M*ZS<^1pf%GEa@ zro#qyIVxC3%#DHl-dnzWIbQtWgHQ9@A3niZ_g=hr^lyI|XT`4wXUSthD8gB{!w>&I z%ahUibdSMduJt;i)I@6wnftB&-hVly2iewogaRgOL0OG;%Tu_wRhjP&f}>_6!ZsWP zdE=7)-Im$iyl!^cBo2P~*Jt3fD`RjfMn`Zp@JlM~t2Na3aAiUt8@75LyHsU$w~sCMh;O&sXp-ISQsqU$yo(_G;eX$ltVnTh zCw^jALIL2H7I4;-ZZFcN#At!-Qo3s|a{aN7sS()XkXA67a^g|Fp;bq+O*xN@fj9e+ z5|#j%+STh!V0X)o3*RrTTqeR==*Ppq`Tein479L%(Fowv)shr|eFJ=?nT8hMuqnAs z^~0;H6f=_r>};R#K_>gvbbl{CE2-YSHV%PNdpWS%L`n*%CYwG1PHV4wYmOTNI#(QY zyse$zyD9bEEClo7+_p{LdEvgq96dv=^TT!hVyE!8KmX4AGsf{b!H>o6L)DaI+%q*5 zV*+9y#8HG<*IFhs=w%O{qI2gCdd@{6nu`@1g=m(b*$JK$iN}KjW`97@OSS3(`eMJ; z@&xv&>`Oen5%j2~aw<-Fo8`W9W9XCeQhw7v_{kG;pF1zwJABS^<8!`(KHabWu=TD$ zg>4ioD-f1=;-A$Ym$3ocfg@N?zG2(bzFe%VN)_2^daZVn5fHVlmmSkWOyvj`F$I8c z4WkRu9o=az7EYY-PJdn#47{?3TVJ2lGVk4ia&y@J;>W%qHstN=S08`S-+Xd=?(V&Q z@5m`FH#w#E^4uAY5^}fhw37{5#(cr*b6(W*kYDuxC(08t)jCrGLL3<&l%$3uMmL41 zb_!@}J;-zX903uWX?9`R1UClMF?7$4LdZ!KDsk^M_ z4kW5q<+^4Wc!muN#ME(TyUUUmKndGjuuRw|JeXQpnT2XwJ%(v2{vq707U>En=63w$ z&b7kZ^6{_b*MC2KLSJ_0C3|PeJlv$r-$O2`3Ir#hQ;AP?z_!Ty0WgWmx2L8guQEQ% zsfw}8(hi799k`dRZ|0##?uwXJd!U<+k4PNLarM;@G3?i>-dF=U$FL};xs5Afaov_`((X`fNW8&gni~a4D!QgyTD%T|Mjq32Wgl9Q-u+cH+s1P|xNT-z%k}JOfJ|gY0wHhLGWJ8^yMMHU1xDWplTuaB@8GT-`>~&O$8?XQ zjT0{re62GLi#?-&!Epc)Q@$xsCI?B}Qs00&Ih75o@bGWV`fu~@RlD6HC&GsRvCW3b z5lt%riFP#?ZGGQX5P1MsE#}O2RdFx76sq~g>Uf9UHR?9n$ywY*_QEXWm8W`h0Jo)B z!hdeV=0Xq{+rz&-+1igmTsZj1q`-ufQt47y0`qvDp>QTZJcrYrTXwYm9NTWA=Hf&a z2BbQ(l}EA>)()q(wEegwrkB;iF(#E`hBAVnuKkE*3i9=W0UNzM{5w+t#gHH^DRb5w zq8XNjIBozghpQIHrOwK0+RFzxJv(NM*ncMww%}UvwvFv`m~>I#FC9%qH}&bT-fAXe zD2>1|l#;f0iC5SqqHgRnJN@wQz88%;|K5AisrT=He^TA>T}85O6_)z`9F?6;z*p$YrayIH}`?EQPAky#N^7TDKi* zF}y10w#r4+D<})Aov<(MDn=1GCT5l7Wch)Gl6wz^s7mR6FEK5gz zt`Gmgym`ABkFgPz+AU-cr4{m+FYG)YmT^6}*;Q`^?Bhl+~WL3sAUw}tUNCc|sRI$u`)62^*%Y{?!$N32I2z~)6Tts*#}$(D2;E1%1P_j&k_A5}c2N`<8! z-f>-eVVf7w8h7$YOX0N%-na@*Ip9vYX;GcNeeawi*~joGn@Zx>B7Xv`0H(nz?6|Ml zU*^XveX0Q#r0)t*@4SVj&1--7Po^3aNZ}mBxNEZ)h@B#$OsdXeRq=$wsiU8 z6Cljd)JsL;w2#b=v7ENG<=ru1hYpj2pnNpY)REE3iN%4Gp?cejJ(Aao)!X|L9{$r= zO(g&i&MmG+(PLMuV}BS`Cy}0Mm4y?M+2upsd36o&Dfp@lf3ih;C2&Oq#JQ@dadBXQ zP zxmE4qKmQu2Xn#a*i~Mf~m)6hUh*yK-LU@V>WXGbc*1Nkc&FxgKW~{L^H?*I@Oq&@j zC9Jl6Srjq>m@k-)!)YVXVs|`}2nQUJ2sSFmTCFae&~n_44&R$_;hn7n-}}6A^T#hg z=Kr2Z8{Byb-%o3r1(*t^TcZMQ zBNkq$oQ-D$0uav-l^Gd>p5j(nmZL1dq(v#0L%xnv_RrbOwl%fqfG5C>lW0f|NREQh zK1kx0d+*MD;WtsiFO63pfBfp#KX~2Si`TtAO^x4s`JPfwez@*mEX925vu}JIsY=n| z-pUBq4uAIT03MvR0?6tt<5%NhLT4uckciu?S#thji3Hu1=!nDJFf8>Y-TQIgX+OW&din7W-qp2>laC49!QZtF zpTc*{&8Bavs@}3L+&k-W+jMg0$GII|`mJ_Rg4=32J`2_=@qC#Lyx4Q@ zvKnfft-)n3!BGm1mP}B?AHaVnY*rwo&O6Sz+eep^_N$wjblhUS+FG#!oW2H_BG?OC zA%Cbi9EqrF{n9S}e`8ws?47>Ms_^`~e_$ToUwOx$@$0`-PUW#c+eF*fh_b!p70BD= zAjxBM7#+-g9;=+bm-KNGT4x|T(N34NaUHgl5`x=%CiQ5jc14FnJ;afS2iI#3uw(g& z2wBOUzi4KY9~`#_=H8P{x9!-UzJB$SpMQQZUcdU}gLlZL+-p`Uc2!M?zI0PMwBhD4Ga2e!dCd(=-(aJ3a zok{lTgt6Ko8V}PAr?gg6N%FSDb#F$8+e7CDeUMvw_40%K>5C_a?#_$%JI0%evwv4f zHAW>sGuWye7|uDn#+zBuxvso#eD4BFaxFG6+>!927J~^;PSXJec&Iw@neujQ5#-q; zK^VdQei3isr;oE9b7u>LI}scmZ*qQ8%-hTQ=MRY*X&zt0W4cn&+<4d_bh;&`{c#T7oWU%^OU0Y&dc@=bQ!)h zQ2qGz`*Q;S{Di5}#OvVtuL@(!%V^KoX^Aalhv-Y14I{XRQrA;<-$3Ya$St}ov+$*o z$iZC?dyu>FP#MPtmZ&CUUCWa8Q`$U*fs14ZW36r2zAcMtUDs_nac&hC)iPnHlXdI1cfg45; zEP7l`>d!36;Cc~$5+{s9eVRp;p2)J{%!1m!tIu|cpL7R4CCWnad{uFGZG&WgP_ zY%aKRE}UAt>w2hQgGpMG9aFs8t#|$IXJXzTI9>MS$lZDAo~B-JhJ3!YekD^r&+jj; z{(fq`*YCY~_V!tS_A&p>D!x53-F{czgb$wm}?E*5*Wvsx;HMcp!J7^|~8D4ZVt>q$}s+*sCNr+@d5yU@sxxSdZ+PNeL-TsfVz zv+*K|w6fHl@>e8zEVgv)DGx!{71W%o+bT5&>jNMv?2woRyoJ#!S3B$=VUci;j%{D% z;lKI*dq8RT@ZZk%&;aoaWJ5SAl^?Aue7LAF{a6w#Z0Dxnnmn2cr){Xv{Q$ z7K@@%tAS0k6KmPF#e$d+={f(dh=;uEAxxYXS53rl%OuNr}HS@G= z=h4H74?D~hpJAh> zWIMa^)su4;Q5b^l4^}2q#1phu#&v!fE`Q8(@m_G`Km3nh1E(!F5s%HZm}2!l=d+LD}{iGR_p@Mic&yQS401iNn%e=QQ3*Y)9lo*;eT3u7D? zL3cfid@YL3g(1DclwQUx*o9~P8`DahUbc1XHpGLeSRDXrvWsxR4KMs}7r=L-d7wR! z0sw9^%Mu99uZ)w6JkzDmKEZ(7!~gO%usUgDv5n>6BU-40VT5{P=gGD+)qhy*U>}Q= zu#ZDqo2sXsJh)q;p9Rq&r zssM|ew?xRwl1*H5Vm*5p`zbs=2Z7oNHcV~dch|0JRIb1nFhsEpLGAd$jz-|TZAhD5nH!sW*&Bk$)sbIV3`^TG-6%^ZAtL-{L0K{_$@|>vZpxdxs5(H#Q)C zB{tyROk4l|A^v)bV+fLituHZH#3qF8SVK9`flJuX?K0V6gBu%s5L6NL&Jq5Nr%BT3 zOmVe!A^gjgL$ul@z+dLz`*#B-an(n(#yJn2IfnT)(&$b*ACu4v6r}kMGaQ0FgUXJzOTJ5XD)a+Rx5%0 zz=c4Um>c0K?pyZ3*g@$aveGtL5cuF_d-z|cN#9OM6u1fzryTp%Z8^nQ7Fkw@vp3B~ zKimffl$VX+ib{HRRewL^o|c~B>idvD)56G!7g{k5{I<;z8$1lQqou|o9+(Al?Lpey zYvY+8{@jeOu@xY%e(h!KyE#>^VU4Hl+Pi!(=YA=zw&5st9R!Cga$t7CTKrCN80M1I zW|y0&E*vwEC?DwTt!>vUe`Z#0%Si;#=CHvb&u1#3ZV&(49DlP};xJveEGB_%l*FHM zHUW*L=iuyUBH*v<6m7qFk?wSxME85&eS>cA-M-1Wo%g6Y1n`Edt@=Kn35(Y=?=7$> zAYtH3J?5|`F7DxfpY*h<2}wU{U)9FujgSI?cwp!3&?73_q9nQ;gUF2ug^=+)cK3sY z;vm$S{s9+pb$_@&k-uTvpsgIPAlqT5O5i*Y>|em-OQz04>Xg3JhyP>l2>*_opA9fW z>Gb7r4C633JP7c%w6~+ORB0XAd1rApYX&e`xLQX#WM@-*9jG-nd-Y^B!-oPJ&x38{ z9^v7SR0C^}2sF=V*AK@ZRJc6+pEDD-vEK~@u1GNmqkrUM&Y9s;HgJmU;10}P831r3j1-6u;NYxTwCQ!^hyUxn z$h-XCbNtH5d#*1BBI0&qTw-m!8g@1Ao4f#x$0822ZPy`(K%lrgNTMqqtF$8OIS|yy z_Ml!-On+T0=D@Q3R?hLWb1_;iomr?rG|Ev8fa3n}$A9^w-}}|~vn_LuE-5=&Dl&C)EdqPxp2VE}VGy>am_jRJ=;9bT6;gwT0EB~g-ZCS zwbr8YayfvdzzB+c3Vez!!m+Nkl;-kj(FM}WHo#3xg^gx%3XlXU3}YR%#+hmP6M}_a z+fXBNB%pH<<?50yXm+>?N z6n~VfRW5;&WK@pm!Occb6W(r0n&688sF5GTpaTQZ@fN^ulPJd0_ z#Ibl!EhcS(TrPjv2Zv^Zut3)4#_#gb$H*gVQg#nYaTv40ym7ALUQ79UTA32LpxQP67X`XohEOn)QqP=H|h<2xW?qvu|gKjMX*?d~kHpbF>3Y=Ts2th$$wJKPZTryz~^JV?sQMZj*LY z&<1@<7iTe=8xEM102OYui;X^k{$dq?Mm$xZWoUKz=Vq{I>bECKB!0=7O&W0wORf_EOQ`&o|<5yJ`(Z(W6{uM zxbg{Gu_tktq`?*vaU9*O;D1IR8c8i=Emtj7g=2-OE{ePL7Q$Y3(gUx!$j!mDv~owV z7fN`g*~?%3!TV3w23SWMm#}(L)|%XVCN$H9Peo%4mk5;}#$%{C>cg=j3K@=>DdH=v zCBa=GZ77rQq|vNu%ZcMyMd_kUIk=~tl##poV{YH1px=C3iF@Vr zbLX+U($feZ+WevYg38i2-+kvj=qxFoi|13H8iYY0G-Fo=Q(Q+eT!f)}@_;aIT*ryq zN}4Yr)IsmR0xW}1C*aq|dflKgN>kb5<|4!n<-0{wHY$Nr6MOk2Y>d=~#JB1PpN-$aRK|ici z>?%WQ>TPqhTcX;l3?1<;un|gM^tOu2)PFA-PTkj zn%>*v>Rhn6U%vX}*=%pxmE+Kz$L;?cW%A<=O8{p;n7_b5^fej*yOCLY{cXz@R(ca?6~3#%1jYLShauk7!i3Pv8PS*^)|*1KDblt(ENhOV(3G> zOCLtRs#jaz40nG`5nXIk5%cmleenM8O+fBW+aS@7GILKsq%{LoM*fspS6v!+9=I=tfWP3=_GWzVqaQx(A5cvAv;ChRKCB=5KkHq!(4Tpf z4?TbJ=OJX--u%iBfBn}!`si)s_|@Yjf6n*x8Glu)Zq4v0sMIIbWAvS$e)E5NeCM0` z=dbXOZ@qc_dcD%qe&^c{-+K7!qn~+@st}(zWD#Z+wHDkbO@yN~C~N|G)qey27qWkX zj(cfZ2A3Gxn@aIrNVkhH5M*kFhiSnTiX%DG$bc7v;RW{(!kdaVn}Y>Ykz(oPELCx5 z3CnXQQvbo5b*)cv=P~=L*5!XMN-N>!?xM{;J{!+33W;o_P$ zw+dO%TvWcsUW8~6|7ez1ojza#8)>y3I;$;>sFCF?$7-q-^}v z)e67&$ld5^e{6;jpQagtNnDp473rgBry4;8I^Gj{YXll4uFN&a6#3Tx$DnT>=XK)o z(*&V>%R#YoI7}3j)3JZuQAonNwbaZR`K0y@+3v071Zb3VzsxAN!BldNxi z{BrVmSC-ZH9l9?rxo^Kc$kPASFC^A)eg3T{xA1z1#Y3pqC?kpAjSe0WGpkAvH9{V> zh3WZl$E8pyeMg`5pUPyMFK9=b01vdt=I-n?Qc)Yd;-#tVwiSP7482Ju8kK66zQ)kb|r|v0rmcJ7@^+j7rpjID89Ny3t>!^bg z2h`r>5;Zj89rXB@i4zx8+7q)z0bN7OT-70PD+D8SyDZhv)a;0#dOD&zYehNH&#Xy7 zG@#Z<-4uW9ES-OGZ)xANd*AIacke;_DlfPy%D*`31iVJ>+Bh-jROkd$%Y@*?yfimP zV-YBlQa0P=P&L$qS-Z2)iYC7ZI;Wa60VOr9lt?F-BU?scb^@1TNnWC#wczMX+HiZG zh4JpJ;(QKrFWQTj8n?7e(;Q|$*VYb=drt~U>i>gw(;q$xuf&fVYQ(Q zGY?xvMGk)>l-lqb$D%BFdbjA+5_O})#E3U~)L5g}h|I>I#j!91D!>!HK1E73I8vph zN&is9@wN!l?_Ar~?hdOe#GD-^?yb&#)@FJ0^3#{EU%t9JcfR+q-CS<&wA`K`VO3z? z(}vkms0fPjJ-03BAjaQ!f%V%K2g+=TKB}s8u)Kf%S3~1FCA5|{7R~=Qc5sN+#j`Y+ z!y>5ZZ9~CEW8A8SFqDPM>n>iYWak~sx%yvmsV-#_1t4!s$#idpHhV;!gzDOcPG2>C z3W9H8DH>UY!a{S#>XE7@9PeYqO%`ut>(rmwdg>C>6k0?0I}qITqK*s7s-?tEprZ~Wxfo%cSKzx>TyGzy9LCGzc4M&Taa z%{YCpTn%s9(}cWuZ575*mO$aP>cx>D;PV!1Q$|x#D*UBL)3bnEIT}vm*rEWGQMDLW z#?75J2aoEhzCvl%waedfluC9CSGby@2*H2VF!g^OdB>=zvWORmR(I5=n%~N$ajJ`4sX;%`V%I;XPel<*OQ-OzhmZW_Z#|wujMJjD z5S5-q7Mvc(cku;L6Rq#MiGmyrE34+ERk@WG^6&zIE4Cgy(zRMHf7?+iX(Kn)s}D~x!Lq^^nu_3?8CY4PfgzYX z-4YZK4zZNuXnu`?a4z~)gwXE|g`gC82!qM2Q_bF4NgLDqkGwK*V< zORLr4oL3b&qR^Cb^X2d4DOT96?5R-?sRGic)2^t=QY=CVwidWh*Q7T>Q3^}=*g~cz z7`YN~S_BEPO3xwKA`;2M<*QJ79)b_m-!N?!Bj?>g3n5-YXc zjzV1Qr2-`o+FJUOK2wcL)cb$bo<^kNGiQD7ITh16@AjN{>mws*GGo^AP?$8V&luaX z0aL<~E%vV2V1-btR(q~Pk%E7n-YXyBSR3r^Z$gOroviPii!|=+<#Ij_m}`Cd$$ItOtK)!skK2thE%yj3KYabmRimJUt4DA+==80n4s&Q!04!M8xLG2T*>)N75z!RH9 z;iMsaM+^>4zigCd8sbixYo+&nzQ4Y=(dN0U=yN03{_)k4yZ6vtf#t)$rhEY`zx~F0 zuyopss=z7)S(g_aLZNL6`T;_e3WWBBgPZb^kc>X3z-f<%`Y}3qLN0=xbb$)t>hT-* zz=Fd~8{ZYd#+iQvFHz8nNToJyC_`(VB6=(Vd9cgh_rd#D$5`bVM_651 zOj+Wgy+Zg;)3Q;Y7AwYW%PoshZ!p!B?&u-Pn_eJ6Oj9|g7gcb0c69}|fe1|~O0_~; z-FeNRptB}WA61y~D`8`CCWv<)vl~Ye>BIWyNP@3_@)du7_s*EV|MrTfj)9|2kDKq6BHTGf9TVRV<0`4^SP|&-j8#Z z?Eh`2v#+%U08GUIi>Ae*AZh8k8=|e;Gj8jCAE@h0g*f-0Kf;AQMCdKokgw5?>pB`jqWs2W`ii91$>rLfUen6V8f z(2Jl0C`?;%?W4brUDI|vEPS#uyb#{(lduZBiOqSfBo9|;m+fB<4W0@1eU| za`jY`Sf6H1V$X{AhOOyqg_}@@u4?ywFv~TB!(jjgFq7Vvg`x^>lxa zIE;5Y$E%}mF8fjWJ=%Lph~g;1B($%VR1Wt?WrjQ$*mIfAokefYA@0rh*Lw4!jgPNN z!|pt8H>ad`lIN8MsbJp4fZ$^2Qv8y z<6nG0?exluEsO7Q6f%bm7}jyJDkLr_R{AJa;Y=K3+vHr!o0{!HlYKQp?a`!AvTvG9 zYZ_NV3YS)psTXBwt!SE*wqnx{F?VnMbIG}HzWVINo9CZgos-;q?5@s9^7(&KF~6@% z#jf#;R$SJ0B@Ya~#4TK-0$wmu9HSlX85&f5n1+uKo@&|C^;RhX5gtBn7r5FJr4Z3c zs3dC#3V-8D)&-pw{l;9GmQt20Vw(mDWbu&8Kky}-lO!y)1a@p`Va*za+ZzB5b*m)& zwve*u)u0Hdx!8w_j8aKI6sHs+QZ(|%Z94TH)(|mQd^JjD$+qUL9|{^dIE}f< z`efCwSW2D2QN=ED>F~HzZn79hjH>^M83zfyW=@*{&;tQw*e~BYWA_>K4ncuBStEWd_`3W9Bvko$&3H zbHS4%pc_sBp|9lmjkBim?;%hhMX3jl_gnn9p>OE~DaB{vRn5_9 zZ&h(vczEJ!Rg(gwo;@$r2TUtpMlIB6Kb6QqB5Ix~Uj7lDA{{+z zc@%_WoF*^|3PGW`5lovJ?GkC@ z&qc&vBv2n<<(kmsEQyG1so){s#Buo}hv-oeAx#dU8>b+S2we~eqCRGaM4i+`m1_l0 z8PGWV-SE5Y^qbSETQy-yR>7APR@Mh$T)aj|8%}tm&g6e^an*xmkEtN;MM_8;aZK^w z%RhRoPUs;EPdW0aLop4ZPs;f99ZgC11^ca7X>d>58?h0=j_ql1Q8rzZ$kE%3_>50W z!I2QpniO4(qB+*yp%lf49nChK+hWV9YQG84_{%?b)K-XPYh9Sd1y~V3=^DclAo61e z*3;2;L$QC&&~#2d;ub4Mtt)QdkG4S4BgNa(YB3=2FtlcicNt;3I=FjtMGs>{M`+YH z=)qQWHOu86KlX^i;KaJABkXMss~=N}W_2Q?gDusfabKI0CJO)@@?;n|=r1a+W3{4f zWRpdj$S!I!8mET2D0Jji9Fe9Mgr}4O4tI#4{aSylwZa0If8uzGCDyNn+uBS>j3^{w zBCV;}j#9uJy`5O1c?z1b3sxX;l{cyv^AENdb4v`hq!xC+8`5?ha&k-!*!9nDr`bB^X?Z6;+oMTtp8To*6MMi9ShGo{NvbyT~UC}ygd ztvDb~j0jcN+8auOH45_|-gKI0^!K%!VfW12{az5LOm+C_iN$ZLryOV33qSJc9-i2oi+sJ3a1nYPKt zy*CAK)`@`pG7Uu{rNM+ygpxwh5O$^Xg~X+z-X7B!eKN%+B@KP$6u@_^%DjooR_1K) z%Rl|WM}OMwt01G4ie0>hzrmEWs-jUY=RixN6UQ=(5_GY`q?zg7B9?^OYtLHjR{Vc_ z7YG?W|Jp27p-RiE53@H8B@N`lMTdwCldj1XL*ycEA}D`82D$g+yrZQ*{rdakoyzri z`RbO+b*n6EdXBVY6n}^2Az`cmV9|_j(tb(^K#G(J&vD#*)RGC<;UTw@fy0U7Avdf@ ztqd{{3Q?Y3+}G=!5+a${4mu1znR$Qx1&?;Vdv{;(tzY|994_O7SBE}h-$uZorG^>9p|?lbpz?LcM+c!C#L*NcT0(!biccQR z^xBj7iq3&IPL1ev8ikU4uKv0AiOjw1}u(bsg+D21Aj}?EAJd4{@ z>O~a)rn2S^+IBTlDaSqdNJp#Lno11|wF7!^^?%dSEv}fi5G)U9qahJpM{=TSKJ}fl zr5L3LlW))Gy@lVu$~yFoTlGUhZMVD>1x&%N6yLHwgzH#~0Y{%8Ze>NJR_PR+9ZEfU zP+rP2)`9~QRYeWSYlKHiOQ3(6u=_#+~&5t-CdP{a^%uw8#KAaYzL#LY)B zp`a%@2(O4_iw(X9zX3@XAmoK{GN*Y#orNq3q0 zOW~;B%cuD)is1_2TCx+7bccDz@(ICe^w}_F5m@2wS4doo8?_VRZ7OBV9LFu8a2u8w z=tXE*;cHNF@rbQf#Y2CD1wK9vN`9idFRLZG4uH&A}*Jr_&hZc z%5At2^_d+XTB4L&$pACe4{5EbF4O(f6Wx2i<_CXGrZfQHz$9vuwQ=A* z9p|~gX|V{MSiM3z7l&PeP8o0Hs#u~BM`?HU;_ZrcNl3Blfw+_LJWW)t7h*Z@&pSWP z&H4P|S>^SF+Jd&a6-86j;Mk!jFE*ylRuO{||Fg4dogs&T6iOEJ7lWsf!cRwp=T3CC z<~=}QIF#=cj)Z@8wFA);qz*%qir8{Nk5kxO^wSW##hgwPdhc`IugV@0A!R&7tssyU!wn&D?kB`2_MHUT zhX}l)3-1r-!;d0qv1o2x$2a7250_v2Rrg{33%~x+FaCdyDq?>24=C{b3VGyI4D;{< z0@CRRzx=LB=3N5%aX-KD`akjQ&wn_orwW^&dpM!~+W5schimYQuf6=*{M!23cYc08 zfBoiH^t0o3|Lv*kv+@1;onLzQ6TW)%)1`p=!=LIae)@~=e)@J+f6wQ?@bC?O=TCn3 zJ8v|;uRni%{_%SD^2NtL_|EVB{C7Y90l)sU`t`T(_Gg^l?U|dYfC}CqwTHmbJb&GmH;R5jltl~%|+p=aIC;9jWGL4 z{Nl~)kDp&#gx-75u5NkKhxXAe&%@X6;c_!13SuycoGZ*E>YT76aLF!;PAGpsF^SF{ zf$e{OIN2zHG|q<_0wqPSwfGBA%ubnsJ4&jm$Ad1>=GO2!6v4JGhU2(^q`wtsLLZlZ z<~TQPF)BSpjX*C#iuh194)!{}1$zl2a6{s~qMpg<09f>$Yv*)tk0Kp0p}9sh=wbBJk@n0@DrEUVYdB zhTau>w8Q*7aHAcCYfKstOFe$cN|zMjP@ovbtcS%2cYZY@J7KteK%Bm>9H}mAIXQjs zEC%Mv7?*$U5bZ8@97T-=(F2VqZqeEpU0@Q&iOlVw7F&-?sM63aUKQ7mp0sI{iH?6B zgpNSW@Ztnof>yZG97p_an#Om6*d4vU8fd|<$r4!O(nV-$s+t}& zvM24Gv?~caI3zal8WmEmT5_6aY^i@Z9uL%32r)jki$z4*9<3NQdn!_`(71 znoEC!#?PX0I0VN)^SCmLkXvvrzoy8#{ULcPZoa5|(*EmMZcz~AMi#7Jgt{c$kq8wN z<6hBqtvOq#U+MBMJXpvWg%C{=wR_8#IqcGgMETonS}kGob<~4CI8vlq(hurHUz@{!-zufo`+umw)jv>F_2Fy|=~d zW@$*OfUh?`qI8WNmmbrI!^D_*9{pwtNLAveD4dMZiJk;iL;4)`Nn=TxN0(DVn!5U~ z#U!SVaET&_R6rfF-qmF*@s1 zXV;R1$}v7$_`_FA^`oh7h^j@6p*LtBQfrGv@)mfnIAiqX1NV(9QOiz&A>AhX@-Oog zM~N#h8wmJlfzX8%7?6b7j8<>M9S2uq`aU7Cox1P`xfX)ISiHCcUh;pfAbGD<6vNa4 zuyiK}QPrhnZ8V&IQOFRe`bC95?_~VtUwIN%A^+;pd8+M)D1!D1*L0bFdyhPv5Vp9h z^292l+!_c)b>&EH*0T6tv2jxtcPbbYBn?Z~Vi3aFbiHZ?CB*M%$Xu0_ilV9>8lQ28 zf1#LhjtUc(f9=>KHr9V$5Ak%(sS)Nm3P`)JlX|1P76&6*CpI_Z5UV$|Tw*KB;pft} z;}V5B_=Z+_R2cKkR5~t<0?n9K3As@)8#^lKT$A?0jGFV&dHL6WcMGP=D8YD(QRA_%hR6VUkFM^|<$S*uR z3#JihA!vapa5W{aT{t336$J#C!SblvdB}DD@XO!tX5ODTC2{^ivN?e2wZW5flVNLc@+#j4jr^$I;`ud{l1GKBG;Y5*865 z3Qv(X9K#n%P1Br^5Bfay{gudP%m9t+o8Y_vlf3&qzqk;pXOH1L42$sbfu-G z#NU-0ICI8cC>O`F4}ud!x`tdxJ$uT3vyHJneRI{paPLvOQBm$cERQP6`TBi$O5fQN z^VdPm7Wy)Jtn^h7>QO0 zYvvpje#C#-g)9^xgTbaQo7D6)%X-03Cp;onBrcpoxcr+Rus`3kKHT<-u&v{iBTOQk zzugW_(5_Qi(-4L%-`1)YbU^cPx)zVY@OKlu)%xI!Od3XB^K@#@GKE0>$2p&)6Y8j5I@ z?e%{lwU(pStP?BdsA!446b4_(GzeAcS8aBjKB4PXi7rAy6guHTtxX^}B}9OPxWUje zE7@NDt%HsULKcPJIg@Y(8W71h@xY+)C9Z+qmf$@`-`X#GnzU)9DP4gK(gCOfeH*qq}9lME2ie4#=)kG;>1#xO_V--b& zyuB41)JPXieAad))dN052!$^5(G+fWv3j}adPSufRjQ8dtJ7X2Pl(TnP+D9(u<*G2 z`^Q*dd8N@XEiCFFgzTyK!1k7EKzxk zGb)S-s-pRWnE#}#I*Ve7Mc1h4I+ik5K$xdbLv<%ksLH*HcBWOW-&q9<^kJh%x2)?8 zgzLR%b%?f(%O5*-D!WT*wCR6MW<)wFD~i#Ip`AyygWcsYD8_F!HziD^(uxZ}5}dBa zi*XC_r{h?J!!x0zOuwk9O|+tFF>vX{5Rdr?bfHAz3gA z?T5rZEspApn4%Fa(9}fRF8|SSRBSkjQGQ{0i0tfYO3hP`-~)#+`j@84n@(e*5|~I+ z(wvEXcuHtNIYB$f;(e_>(CcwWSSid&X=fte(3+UYHz-yd@{mDbLV0d!^wZ^!AFGpk zrXwIhUfG587C43nJy0 z|Ky=0Ur#qt#6uS}2xa4c0>acX~$I_tPXDu<=0a?tTvI44wGpzvBlZxiB+RS&)zW-wedr%;#D@T90q zAhuv}#0?RkCxWSFKDUBv%CVaF+Wm*kP(<-o7$TOS?9TxUht{KLpL4Bc>|r6jTow{T z=mI?x$H}MdLwivOPT)xiNr;dxJvNczlk-{t+Eu7XB3yr;740Db>wHe|_4ZrOUtTe& zdym-_f-@hw^r$80?Kj?o=&HsQrInQRY4Rj}4$VTXXqizwiC`N8%BV z#Ep_jspx;cHpGGgeY0IKQaRt^zd)xas)h!^Z}L$T$y&-H+2V5=IDDq9LxT`H&Y0zJ zu%8H`7>cB8ptv&Y%^bc5jiOdc;m&J5;nG!cV@H=#5nhSMIw9bIjl1Z7*OM->yGdt> z;&VYqO-U3ZBNu=$*nSBUBIe@bpv~Nisv||E#Uy`NifW7CnnJPy>^lDGgo?RYziLDq z-)pR`t5tvJQM)0w@mSp2JWX+HbY_)jfrJ8z+9Y*Wfx_H4pvRN7D;l7Vbe#Dvr-W8} zKzkrAZxl|=5MMy#P#X}tWenmSS#k+l6NYLjP1)nx|;1O|AVeks8 zsjOg;pm6Hpx!JX4%U(GJigB#bv))!c}Din|ddx=_`^mT7Xckgk#aVCFi zKTMC#MEUy3t+z_opU@O?A{(-bQ(wom8BJ;DfYg)=HK;U>8dSL_PSXUBW>nszfltYA zFV}q^I83@#sHs5dgia7KGcNHa7o=8^XY^dCbJxq}x&6fn<3XM|P)BE{uBzXy6ARPW z#7d!u0$~Yhs~Q8?iXP%bvWg0dLMVS++a8j54LWleW>KY%sG(SpXq_Hjf1`)hl078k z{1EriA2#pS+jqX9c^jY0Z2UalzVq24j|(e#TQr1g@$z7+S0pu9KQzSSpe`jI@$*x&Q8h9SFdIIBNpCKdD>q+ zpV#us_a4Bns(tV<9ufYfd}V(vC$K#pvZ;1wY)XZuIGg8SCzq)Wy-S>$`cX%ul{}Ee zCSv@RB9@W&?u*VX@w(umKSY-})ZY8Bu;`p1Y}&Jt)f@Y~@M7;vNUm%7DSB0E#;Sse zU_OASpTq{E%HHny>Gwk}U=Wm{U@8!$ixYA9#^SIs6p?&QB<({Vd7ln)3R~jhpjs>d^ zPR+qEZG2@P+^TWS#ikP>^PypLpf#YWKWv36hPh2!8UXH5eSJ7ZMXa0SK@PjPTHJ7e zqhPMDjre*|m^oK?Gtz(f#)uRs^`uUh8E5YSEl^`zX&evhO>)APg$_PFmh!M@0)4|x zziB6hIVn=2TRS3CC19%~)?t!Tsg}knN2_+BkdE7JCCQ+b-OhC!M}*t!&Gj|gy$9~5 z@UcA!A3wnb=bPJUH|Ho_Rn*3avJXVA(Wu~PVrn{Lw9ZU=!dHJRep#D4>YI_OPFof) zjT@UIhf+z}p7vsH^HLq+`4|*BhYLpXO_)mKsx6;{zs?jw0jnKby^Q1J-y-C%_in%+ zEDv|fHOzpUfkFw&)=Q5DM;tyWNAl<*iiOHkp14`zLP735T7CHX$*sB$HVQ%vitVddv^g+N zrdIYy5P?2XYPx&~UV(&;l8vwlJp=ma3KLFa)CM;cLLPfWWra}vj_7^niu92nio@O1 za3UL&@n}A2){KzP#FZndCFU?gLo^&8dQ={xR|?9Ro@0MEQS*#LD0&mdLQ{zI)Du{4 z@av>en>uq%?G{4-atr7q8yB3GDA!2CC>R#BQM69B2rb3sW!f`w{pEM7?sb3p^5fNB zT&YCfdH8OkIe$WPPf57!U3PU!S5<)Bq7g8g=#s!m6Usp*Na=!F^V$%~>UN@(KWI79 z;=mMWaif1FY=S?D2AG0Cx($#zL7RFi^Azk7`iOp-K33nt`L!pjj6?6hm6^uwI8f6G zVg#>xL#$fh8&|H%)pjgpZ=b~oaUMehRF4xQO7%fB!cQeJO{2l`XtY4HPh7kS+CDgu z#U8gljc}2j3MbZ5i%B^+C-P@Ufgdir=P%x@?_Pf&o7{W&ZbUotVR#hn`1;8$J27?5 zL-zFh_>D`S&l_n$?o_;1LF1~cRAskl@v&5*bK|hQSG=%6n-eP%Lpk0?xjy^sIa_lJ zwM}O#gEf(^q32|ACU!_@aK9AI8PxgJ=1#F|Lbg{B5)`+X9CFDjB1k8O$n9#Kl}6K6 zg%N*>=~i^xzCP)J;>2 zuKN_d+B?6X;ilNZP(aRGZ44qU3*>=MdhnJG(Ca&k6livuGZvjNIwDY4z{~ z$|Eby?j9l*yma^_0lP^rl~ac5fhHR&id^ZQo;i_(iIiSmb|)IYhO(bW3$Av5+zj*I z)uuA39T(r#Bqtx6H}gy-KKOjqefn{G{^Di-^);?rNAEm@Hv?We1-vJCPMn?HLJfb_ z4rc^{#hc7NBy}y_vl>%b@$F*cSWRx=yfdM$OkS$jV+;JtqH z>iLUn51%`a-py5KPpj?;Qdw#^y{pP@*5Dpe71KrNQSWs^ETPvac(FOEOq25Kl@pB| z7E|zue(O}W(6%!I^9WsQ6%71wmZxiv{vj&nT)^m6qlayykeCT*VQDE{X@Gw#NhSLC zRv?76wx>Y!$^v$YinhVQ7IkxJVpZnRbqoq+F3w_Xf3Rypo^GH4fs09u)$A(JRrE+h zDLeR0^O2}x&_|C;|1FG&3EMuex}Sf$>RvLf=Qwxgk-M?t>}kc>r?}z@CJi*8+c0q_ zjiO7#hz{m~zL}w{5*IHTPBnjblyQVI1ZI+nC|)|8Ip*w-_0RyD^Xrv#oknJGb}UyUX`1{PB8y@|!p4>YWGe#${`M6xANSemaZo z^MU;KhbYnf%EMQ0yYB{qr<$d`@R3z;(By9I&sGP85OxnN*70Na7?mU4dUUagS4D@a zI<4@^cxiCWh<0N}L3)2Gx4CKEuJus!AeHPDv54iKE9GcAzMbb-m(XIcu9qQjYkLnrm zq#BYw@er}rW)!Gt3llG#Uy+!>j|Xv9F?z8p1&L4&M;AuK+Y z;7A;l=%lhQ|Jk8a?eHzpC!dkT5z)Rx&E=>yJlb9c2fQVhElwvEYBn15!DLKw=y?eE zN4bESh10^aLi&HDG*5#-%mI~30Ukv!y|%HurWc&%L~9#y(aV4SB{bh{tw?ds#A$>; zm6CAd0NIM96z&CDZdSapWeQmm`syirqX-o=8F>`#- zC#r(CwZ0eyK3nNwO$g8^?4IRYoCvPCYwswK9Zfw5v`~M}(1sXBGCgJ2unz2qWw>f< zRj}P-ao4O3x{>QWAfnc?s1=eGxQyqcP97L2(vu5ha?buQQMTh1W0V z^Upqc_M*Lc{+n08_TFQ6lSB7;Q*H!qMWHJSYa1%Rm%uQizk~w2Wl{FCOY(77IZhp(2pFrRJi;X zM-z*Z=cMNXy{?8>g8-((7KaRpD|A&{_WE9>XUr{>vJzIK;;}|gfVP_EqugfD&a zAvfU+N`-w82CPv*IF+H5<1L+)ctk2J;^lMYe0qQ9$2l$4ZymSS-~GX-w=@W9-Sn0n zRT83c3Q`Mw3l6V3v9EBNN(@p;OL^kB+iE?edj_?ylm{tz)=cM=<^;7|eFRGo#=fXF zo*UL{_ok%e5b{EnGteNiEDT>EUkBfhnVT? zU6g-!X{u{@VKEzFD5tIE=_^M-8i@?tSM*j0H>|_-VoLmOL%T%1b%7w~5UA_E{tcpVOD`6jMI(8Vj!5l1x*=32I7_PiD zJ|3o;hDVS|VM8;kB+_#f%`81C(IL@;vs-_zrU4V%;6l~;4hU7I!(AwdqZhp3MoZe> zbUvT!TD6Uf(qG@4Uu&KhMrntZgf@TMG!jurL+7wqZJk)aIF$NDZUTxk(~0x@L(R}l zUbZ5teGw5n;YFq9Vvdq{tz`17BL3c}@C{|YF>lJ@{L~-1V)OSNwj1cSewZJjTfTpO zI*amMQDMd+o2a3Q6wHX6$t0R&y|QhOnNBJ|lNbv(X5`&MU1r!cf}+L0dRd_%KPYOW zAdeD78BHOlHP<3Ods+iq47Gb-1W>xMad#Sd%sEZ&HW46K>L9&0w1;dIQYdx%IYhm? z$Pz{#3)eqI6$}B!rpR+}(jp!lZ4rNd*0X3y+AdtD2``q^%JrNbenY&@ANwSdV*8bn0QqNr~baM_S`1qx$@W07~P2rnsQp+l3ngI-#a zJ0$&W=<_yW=12dSVjb*XF{v*RK|v-_jzh9Z+*5zieO^5MN&B?F{H=E`zy~<{^wk4E zJFUEXkKnZ_8#gfKi>7Q3-}ryYiA2E6aA!e7@=OeeZh)R5(2`yTvW!v4h8~HixFM2{ zKu$JYc?e%6!BMgQrH!9T)$4{A2gHDW8#lMuwcnu!Y}xH`DK)gEBRBCbQe3$&|K)?c zq{SRe`Cu$(cNN#rKq&!at4yOmeBApkNQgJ2m>MkB<3_aYP|heyp4@-Grf5@7derUh z9F?L}0q4ULNslq7Rk|wFQY92s0pCe9Ctd!l4~}aQQ=x)clqWA701>E569opW9a605 zNEVBdn^D9Or;0w>qu{^Ss`urCXq6tuZ?q4im#Yv+;+z@<{a|WIOtF!|sV6H{|A7Nu zZ0_=3AEsaU4O+m?-xWCn5R@ zeJV7g=`b*?%tK7B5RcIT5M#%_{qTDdwP|7_ZudAY|IMLmWKbpTCQ)m?T~Si-O&J?n zV&>A@SIu5ryXaF{0aFftoS>xD8Y$@H?TBA@>_Wg;a*s*fruKjDq*)r*Lst-bo|VEz}1{*uNjwueVNZfwecT7y%YS2K3`@1BIn<$r&u zB6;a-@zdrw z+91oeO*?qnh@F|8c?ikJmc=_a*S`plq;^$D=yK{yD{2}cwk5{al?4sz2TMCOB%(|~ z|92hW#?7!PlR~1_H0>f^G?LyUvckRLY}!#?gwsau+4S9BxfAJV7HWgKfFg{rI3{zN z<+Bd^FO7efpJ?FLeD?aytJOZax^2Gm=-u=JhT{Ny!JQ)TrpclwgcGXt}L_etNM37!ujO+ zC+pb*Z$2;kI}h9yh&=AP;}<~W+i(2j3%~9Kmt-$i{2X)3+LDU;SOXzCX;CFtkkSB- z#sz4qN@50OZhPo48JoWC?(+%ut2!{ zPhY~q$D9H|ID^1}!>SI&wV4j9NGCumw!E|^+z|2!OL$lt6wORz>u4^(XEO&;f=wHr z2&eEhH_8hu+U5@HH+=}Fxhu0(v6?)+c#eMno8IV5qm=nG4Rvdag9`?8c;^qILzRpU5>QwO%%JmAF#VifZ=hhNa2F5| zq?qh{=hrm&wkp1G!_0CKZ1+r&Fh3$S-Dg$^9?Fz>S$Yq`RAkl87EOq#`g z8b!E*Dmyp0++m~27{khG4MW$xAB}&ecwyu0+&Rd8TT}5yPj|%GtCp-g58X|45l-mh zDV>zRYf?yqic!HtQ88>KlwAa#aAL8hV|GtHnV4tUNyL8S4%Y9SLr3u*p%^TjH-%;e z&8vb?eiaZwd41v|tXI?lX-VQ{iLgIKEJV))MA!LhX7(nSNl}D-IFu8y6BB;R(6)k(Pj5 zMFA9}^KCRf7(?S3jm3Q1MR9+@OxFfx0i3J2>bKBR7-*GJVXwEKtDP=)qv2QjE7n%r zeR4i`Cd`0OPjoXn%_r6VhU-1is4XrW1ldNKUA!vbV%f!6Egmo!!$;R~r8mndtup!5 zD|F}yQ65Hcdsj>`Ia}&MOQlg!yG&Y~kWJju+qIDQT;feHe{f!H_a1+>8-dL|T5S(s zKe^TBP?h>uoG)tw91Vo%6tRq&Zfbn}U`(Z{@L77?^s z4%1#dTGGN5E%|CquE~EjMZvX|Rt1&QYzQANgA5$Yucpvr!KEZM^w^Mvt)Zthmt8p` z9gDzfxT>A}?8T?gue0dA2kmASHK#241Q*+|O|S-kYoYB(X%kKlv2f{$_ITJDBfNyX z0=%J@Ep?aCBuE)ObA=*Q^I|W4dg=VoQ6B7S-ZJb915`t?0Eww{j{f>32gtEw-Qj_3vL%gnN(J4T|7S6v4e0b#$?C zZQfi3HId;ni0Xd|w}=x{#U3;UuOo zRD6UeBoso>{&Xk{j^X!k^@;=R%t>>aBJL@ zxWd+mI*503T$+lbAz>>aj8}C$cZB(YPC?KcQAbooL3gI#A^^>{k57<528WWGCXGfy|et(;A}( zSt7u=XpK=8-DI6!RuU`KjzR>2i3_$viJr?@TUNxiX{8E1q?8J6wbU-Jo*sL`#RpHg zFQMX;?WBL5t`*wn!YI-UuezbgK8CPM#A>AZ?0xeK@twr&xgv%p5sC-msFC*KnC9>r z87qo~7vIBG%B(rJOe-GBWS!aq#URiW$6-00`;`T6OcuR#PWytYq$ylQ{F$kSip){R z@xjkRS3DwtE43+Rsy`P3lKxGQ8Btqpsw7^)9~ysEIY^t(53bX?Z`z(dSz79%08y}= zB2Zzye6t+p=ljd~gJ++%SFf+DzVAJLH?E6qePsFY_8ae^?f`v2g1@^3t6*xnX#Esw#OJ-F)rp|r(1^- zenapP_k^W?br5MS$C;_k%l~r7mgnOjs0^|CNk*%zqxNrNQb0gODr?FW zDCqN;LiodG{W(28=ZJ|rzzhUi=*D|XM{i7s)CR$4YSVF1FLfgtiILYn`;*-Jac(Zy zhuOW3X`;#koSj16#R+m>X$ta-Een$+u614BN;bHEXrhc#^#M|`q7bI%Md9#qqG&K} z9DZ-iH=SNgM85N*(fH_~n-TY7mrQNlByM3efD<3V z(v*;YG<913qf`B0=M)vZQmyRXiyq>em=;ZxdXbA$*q`XoEVp(Bt^AQ<@fvy@Ypw0{ zup{H_7Zvo!5fmaV;*gcDlBumE@E^6~XiQLKpitigObrkQ;S|N-OKESej&C3Jkk4Mf zX>XoiNkQLx0B^;!_~GO7m*X2hc|4;m+6ZNTikS2sLm(x{3gD6q>4B2jQp*2=8MiXEw(WXCJ(KU-q4k&yE||*{?OT?mKEX zf>?B?AQqqG0a{(wiirjRIAJ!?(-}}5!yuE|v_MVB>K$zZjFITj>qZD#NeDMPb(F?=}~Er zS{4&?7jX|*A>qpwNueTwV~Aiw9}W$Tjn%HukH#P#W{A}&&k92gW5z!E{AdaF^~k;1 zn&sDFg|*!}nmiF$qiRreZ=4U$#9EqIi10|C1FhsD#^@U75l!rd`n!~UPKP#si)OJN zW*C`nt5B6e>aa(p+~Njw?pdPvs+M0GoVn44*12Z{-YtDNalhpXWwAZQ(Ea%e>Q8#L zzPnzmS1hz=uReS6=J_XA$F}z#!7r}7pMNNkxBf%>g{Jp!zWdITTYcJW!X7A#(bL$f zI4kW>MLQ1_&s@mz9a&k=+-ih>EAB%S&{72Jd=A44@d)irADse+LQW`M|J4+slt+|I z3M~;!$sy1RVIIr_LR1*KIvLZdD>f|L$6}15tXitF4{ggO&n6b5%2PIIPJPR?Z0H*)VA)eLU7?!cQ51*v6G-$(fj<-0EjiVQ=6gBdBbuMnBYaC;D6#Xl%dK^@X z=haXJ4)CuN)exc2mi1ky#>I3c44vGqzn7{_2KQuu(orMMgh zhjr1-k5E*!)JQ8oiIVEUgWl9)Rvf*%{O@m1l=XQvXFDIxokB?%3X3v8a5PCGipbcC zCLy||2h~fb9$T?<^uRHl0$|fZs1)eqQ(1(jtzacqc}uJ~gqVwe!X$P_!i0F$ENrIG zJ{_0;lDg+O&KEZ*Snx;^z9Pqg@VCX?X)tM5pgJ0Vyu5wRL zqd^x!q<^=fK7mXoH3{N5Tf9g~r9+ZLL-ecqv|gjXoAP_U>Y34En=5KfiHPf;0zO5+ zS=n9y+Y3+RotRKYf3Z;`a2ZLgJ zw^-;k?s5j_+t$(sf39+TuHEsQ&pv+s<|+f-d*E)ErG*dO7wT`m@%9_3Z*Z4xD0z%DD7C!d}<*a01Yx3Cf{MP;4gr z9MOqfB?*LkuPNAKb1vw+TO1-g->O1RY?;Qv^Zn4v7ti+d7tddRZ(UUb-FxJ2B)@P< ze&M|&zoghL)F{5yh8TG_%7O~!8ZJ8D?LMyZ45jRUO44Mvh6<*b@^CA1hNOfgK;n04 z+OV`*RvM3s=#Tck{(;4{pvsDvA}VigV`q+02`l3db@{)(gmpifP{pVdv44Rm<*M1X z3rkakB!D>rX3rFxl@whtO(=&NF42BbeK3h~r!rLuz^K^!QP5Ge5Gq&INsO;xfNQ(6 zQ3G~=T=wF2IZ@3$m%pvB6*=fd3gQeU;Q=l}sQh0&m9Ct#MUEPe7$lC0xn;LSBkE(IHjRYww+8tw>gb14+T@hGZRK!F`0%hNGz`xP_eeVIg3iL^= z;?a4^+i$#wn|n$Fhd7V2DZTP8rChcVTkG0?r$R93sZ?=9rUNli4ivEu=H9uxsF)Ij zwOie>Xrn9ZVaS3*W8+S*$1J4ein6efGJZf@sChw14WoPx#`RnB2yGX z6pbPw#T+*?1+Z2O!)djN>{3P^Yecnn4h-3}#sbcyhjuc`p@*J~Mo5s4g~`RI!nAmQ zZ(RsO57C%f1}1AzNCO%?lWowy5*+pqdWrrM_ER}R@ygPLQlj- zckiO5M?sNaBOt}w#g+VVO)6$2_=?^0Mmt!@*dE=OmFs$;A2{&-ybu7Ph_~G4ZG9B$ z#hR-t-aC)p&HAW%s*n1Kg@wL^BOZN!fN4h(gG+RHHH)xWz+pKyI{OSoL~9*aMxqon z=S+jlz4I&6YguY@Mr$D*GRZdSpJ8dtv)BO=rYVQu|V0<--1Rp+iC#+^s+b|1Pu_n|+8=QDX0Ty~M zDw(ve_s(n4B{@i-`rw*gVZsU}Mz$N9$?Qd0gu;3bLs;Vw3+ z3JY_K<8qzJiJH<}5c)gcnM~7v#A&G&iX`Gz7ndh31%dsz9|ZP`cvMBxhvR|ieW!aY zrLrdVyftZdv|95ThaR4QBDZl`UtJ4YY}(cov?eD0hz93#!c)Y*F#R^sE?k}K+MCR3s&VO!c4OJeQ!|X@75jlyhb@X{BnR z{o0HcXr*b^OT+^UHEj+`&=v==IK0({tfj`3Dmtzc%DM6&9o2Sui1AdXJs+Y$IDtcG zF6pe;31a%)ie%0-TxL)ww;fm4R>-K%2nU{;8>OV_r;t^r@>jbU@d2)} zEA1pvGu)I=#1M?_b#=D)6cOzZQQ;Bo%R>M!(?+Xo(AuU6yNWw&ej}$8qJ)WV!*ioz z3B4!cg}~gZtu(=Yf&b}I#t?xJ((@fn6*|d;o&Jq-T5ES6vm0xzJUT6U`1mihKPnHHPe)V5WaGB(IPZ`qH0DzG@Udvr*k*iPq$as*K~It zv72@e{$%&?1QRQ|j3tbw3{)cr&ol-fr~4~u-{Dadlkjg>G#6yaE~P5?l7>NIItC}8 z9Gi{7HbEoB9;X!8xZPD^Lv+^CGi{XW6mmEpHQRB2%!=7}9pS3E2bcL>1_vMMc$J}T zPZ(xW)y{dU79qYgS+h2%QNU42^8ri1G;q_-ur0b>tJpr)<{o>D*r(|+lF=0&bi`=F z5M~X3O&irJC^)0&Zn-OO*=@i%e6rF5srVxyN(+*-uZCfcvd^38B)RY1p4)?_) z4(=+2RQOzpXe_6{Bpz|dnM{$@16CD*zZ5Zl1f<|{Bw_ME$3vw~Qyf_=w<*4z+ZTUk zKHvMwKX^0R3;Yt_y_%4CN7X1F7r4s=@ilxlOpW;*--@D5j+3i@ zB}ERDNa76Mt*r$^z3IU)7ew#S^V6Hst}~i4F7kmQt-Wd$m10LgM})o_6#W}T-N=PC=McU*}|H)Tz+#~Hh50b-@JV{tFLbK;&qn{eFH zIE;0JLECFMx+5qd*Mlas#7(3BUZ|<+Tiu0(y+>FpCWD4rOVbQW$`$GiV#()!*!ID1 zmS^MTC!aq5cs&y@{oZ=^@$;*)=6es}O?OQDsD1WHn#Gld%~Vy0DOs$L!jc}c6T&e$ zwLMMS+S8qWo7rO+S_B%cDGY;4vLJCk3O>aFt#XP|ooFU93EHnpghEfrY0jyN*A^DD zG<9Uui75cn5T0esqCuL!OxyQ=Tp*mImV9w3i|nCo!v1XsW9UmATBTlJxjis|<~evg67N3OIsDWQt_bVB2kfSllRZf} zJ;8;h4YGg#Va6+C6 zJYrI!m^(TIY%-_%ldJZen;=#30f$O13uf1UUM)1PrM%|9FDfZbq7SCQB|A-Bdm+e7 zd!;|T!u9vJMHs$z$i~{(mQNaC6bm?m&AgFwbbgg84Arz&l|=R1nH&`-W^Y@ZvW*&+ z?dOK;U+SMd|M<=G7tcO_c{xA(_=bSkok#Dh${MDEb8nico}E8hA68Qq*k)IEw9wFn zI7gh6)d?=u7P6?A5)t~VC2Rqbx+n{8d-ySt_6=oe&^N-XEA-gK2qSmeZKbWOCkCfr z;9^5X;_SpyfGaVHO(v}jr*{n4ME8KS(Zbrf=CNy!Tn3qf#a3y5xO6S_u^kgTY7b=` znm5$o+vD7yOIN4Z!*|dp-epED=~@Ku17gggzB`@Wx_(w^^^>OYyFzmJ9=97JjqcH< z!#Cc3MnP#X z3~r3X6ootjuE>dhUUIG;=}4fMi2F~hxWw|6fwZiGhV@)HDAFgQ>JS{}f*~U|=bOdk zZzm@hW>?9Un$xAQqPg)?xl{kE88XVPiZ{4sq*)*qNeO9lgyly`8JR9hJcN;;jlzs# z!UmhuC9I^pCmMJ@1b*}S26(&onB8iueN;2}jkn);a;vR>1WpLHQdK}MO+*PxckTaR z=+s#a8THTyu5wL-JH+Y*;LS!$6>8;!%_(&{9$az3l;QNUwDz7_ChKtLKJ+AA7E-BZ z=~bLDMUDI{=TniP#4$ui(-!g?#07hZ5jU$T=y@*wC!@^*;L>t4u`Bk~mRoYxHM#@P z<6IuWdu7vqsQDY5+0}+6N>$<=25E6kzVliKz(Q7IXw37?4%t6-{nn?i*6Y{LzS!F> zMsee8?#`om)i$Ixmp}AhY#Vy_o%hhY@w?5{|G#Oj{?7f)lD;b5P1lp@k@3yA)!Ut> zRl-bNfQAN=W)m`1+08_%sC3?NRJ)SWU#7EAz)D1aPM9YgJ%D0_%9NvTrzH`wmsq=_ zrlaJj=+%>0oj$3hR=9WJK(oV*$(#*)PVvH#e5fmt29;yESl6-%sO13pF?cC!D5Doc z<)?-PxjN-x{2#1FSoAhgeXqEc7Of&$_#&`jwOaX@lT~G-B5$0SS=ROcu=k$Lc3qNTLN0C;;qW%?sxo%Q@$99_O6H zd=clIbN;RW1xVtY3k`dC*$1owI}rEc+;jhDhv!*q@8?--7Sq=0Kl~DUiRy$Zd2!gH z5YI$y2+5X1X%A8xvH`v{)NUyW@D6pBsco2l(EjFbM7(;-F_>87(>Ar;bf+ktBFX1u zB1PB6V)ryz|0NgLsG*vp)8w213K$cJ537i|0%6%#NsS7+f)IchWy@<@M(>1gLII%&+^S7oFA)xv_5!$ z{QQBk(M7rAl?Uz?!>9DhJ>|{UZyY!pQykZ^-Mt`N|CGGXaYok(;ea z+Ln%4Q>&#{p;fU?S8Imwb9fYyG91{3$zV%I^`KiL^V|Yf=<-?bYC&WObC&tXd4?nR zGya}fmki^nXY)<=zD=g1UDD5F02#=CvOM-QUOjT6y@x^J^wTJKm znFj&!&q{c`_{JNz_#$w|0{mq4tg1j}X&g6wqE2vm74L62NhZQHBelN8NX%(}{HTR7 zgELEafn?%(gdZ2}(t8L@bo8WJvsg&GYiwhVwOeS>og^ zyd^LURcopz*I}8O4qmhPe*WQq;}1SqPhYe8u04id-PNbF7qeQFoBNhXoP+#3)j z(&-B(fPBtRA&SZp$)Iie1a2m&fSQdUEeJR!Ka-awxh$eGfZzJwJLoEZ@pG!_Ac&AP z7mQJQp6NJ98tMpDjhHmT+ES&P*k@6f+(_UV3vvR98FhufX7&AU)o83|&tJO$uRV-k z-36HBg*J6%k){Jt!LeLZOEhyuhzC5)os1%c25)R1o9Ya5weqk5=`Sx9u=ieb>O?cC zHjJrOKrw!|=w$UB)Pb^p4u4D294~TFhKT;W!6lctfHVfM%nDg+$bK+_$V3sngqQ)y zp~#WRRaRp%I>GP;dI?CCa*osceJpftby@TBW9#k|n#@4|~AbuMOHYg5|9;#dF;^GxL~62 zi#~a9mnW(3kRl_0o#$S45V3V@1yJan-Jx2?Dv7DI7a)KE^8idI4M4RKR@g{r=T~hW z^ji6S-HOcf`+0~Ye}TlK5Ea>7E0$8Hs_c?twp%g`T*Hds9xOIy=CAWJ%t^MYIafCY zw7h|pVR3Aa5Jr`9!cfD*N~>;N12g(Bga5b2vnP+A4=vSyn_c+J&mMpLbgcW2+LQaw zK7R7#@zV>h-D?l!E!6AP@?>)t<;h~hu8RTh7@I`K;gE5V2RvEDKBfpj zXn_7*XT2)wuOGPp#nndZ4tUTzv)7XOoVKLUqP?=ph^y!+H@9Juc%cD@dU9ydWRY%!;*LP2B+ydQ@imDX|w7aT0-c zuB*tlz&Gh74=`SKi78yT%u z33L*QJ~v7LLoC(|`J9XqbdU7O=7vQ)ci%nYr^3O<_r}P;%WMfUdIvweqMG zMUB;fa7lnL*Mc8AM3$KWJ9)Ng(_2Zk_BeATKgKk5)}Ci1AMOOVCtzFRJ2~!b`CB0J zAX8g8B(N}?9s-CJWt*;d?SvY&-4cF?uDnuz70rxrkh`!nd>Lff)do3!=oFzOXS~Zv z0wS!g-j-%7s;@Z8GIt0Qk$zO}ZO-c$zxC+BM-Lvg=i|eRpnv6Y`{}r~Dd;meV*!AA z1Mq@qi#ddpM*u@+$&^ZGO!iH1pD_2FeUuT8Q&72I$L7@B!5f5;Hya>J+G-o}gpu)o z3g9``;w9hD+$PyhORt?k0q``@p8m5h!1%FT zzShL3Eja{oab^l6BqPws=Qq));NCz&>*z_raE=Dutnk1ZKzfZZZD*dcP}sAw%YowO z`gOs|s<&DIr33u&qf(#FjIPg1HQ3UBG%LQOK1}IJF{Ch33ml|sZz8*$1YlED-UCnJ zTgHNc>)PGw3Twhf<&WHtqZt=gn#P0avjk=?D%!sO=(pyBrx(ud*B-Q6a87)sa`)!z zJD?qra6QU~W;Y4xR#&YWWm&xA5aC<45ujE106!NxY3x?BtX!Z}rEFB)oLRkpusdjA zh(J!G^5$yx;e+Nut|7xGe1Vu8ZJf?DUBlFR(Is{5$2nUa-#lXCgJ;igxh5M1b}4Z+ z6&-cCBYXJ;db^g|8Kl&bk~$6D(Dg);s>hH8H(1;S5Ko@6FP1k#7#j#uNrnza?q(n| zPPqf8ISWrZN|4jLXgVyKr?tR;#aB%~WU`fh`)hX?K0etR-&SYccr@Sp{<9aYbqp74 zS@KPw8FhlgJuHAK>8fWrmtcPdAO;i`6llCIgdLr#qr*_=8xtFquZ}Am*OyWfG+{|z zVs%mo8%iZA5;oA?C={WJBkl^!IKN2f!0^r@0QV6N3|KvEHFf(c*E|4!+sdGELX6GL zIDk4?lc-A)GB6YZ3~_q7CdoU+eoqdIFw?55Pos0xY5Cpqq=$2f6{|hIyQ4^-rFX9U z`;F(%K7Rh-;l*LbwMXr?8nXI|GSZ80eDSDq?JBF&e|~!+RsN9}9NA*XWI6gSGf%Y> zB{H`kD?t^&xSpAfKpNqHRYtJS6nq$|?4)Cw)VGZ3W4Af-2>?_fcAXyWsPlH&G_K@` z@+PR*1wLQp`Kb)F8d{5ZGP1$_JX;s|%QxgCM~b!OxoP)7PnUA|l@0fq?2v=e_< zp)ERiYwFW!EfTb4aLAfab%~Q(TobvG$hOl#QS{k$!|V|eRRY9+%iCZV6je7sxw>GK z`T(nW8TfwYrZ%9GPqSe&TOj6AgGG_h7y|@-Vr48@&N!*%K@|Dj($L~5*g$e~wA+GE zZ+aLGIf@|oVVorE63fjO0|@CR14#$_YKoT;3?!5qs)eSWOSoM5an7&Nf5)k8*{i$| zI8#jy&9~g85NEu9)pk{n2fGc17u78qBxmhI6lc}RlwSh+JZ4C~wxdP3Efq(5!c2%p zQX+lIfY1=hmXp0D^iJAki#Hs>`j=Drhkxex|At(~&9DE#Kltk}{&;_`AH4k1z51np z^~><;m+{pv)2mAsalBb&xUTq6)7N07@|k?G&GxfEZa<)D_HbdWfFC009VUX!rK`DN)0&Pn$-cUJTg zTG^7D4pp6h8-_KKs!9@dEy?PcZL#~;jOkEQ@lw`Qg`jZ>(B)KZ7In=}IwdmzdvbMB zL>+xg^8QdQk^;UwpantsDfZgqc1v48JZlSxZ(`Z(CWIdfdWU#2 zS=DAB1+l1-bT;v*kz0(ezttNn>ZPlc4WVLu(jumR5&ErVRzV~>E~wG!_$MZ7Ne|Lk zWlgBEu*z#;MmKj6ZV9UYOXtqJUefaJI6YQTPt>K9QLZuBWYCzFnhL@)Z{W7-CAQAg zVOn)(DGh^{6TjpTqIWurYcR0VAnN3zqu|*`Ioc0?R<=k`N|nsX588}%;k^4mRl4y) z{_5I)qjszF?yIZKy@{($<-fvqWSnYscC?1%VSQQZdkDUPc6w6^oEkA1CQnN`@s1&d zaFOMt`lB0YDWOSar&rZS6NV(e62Qb`Nn)3T)Dy#-XV<+W=waD>E`L=7Hzv7uy66|k zi`jsslXF4)J{76Cc$wB^093hAWmFf6ihOu~xvE!z>85oU#)fPLCQ077IRk!m5inE( z2XvdMbUp_kTQ?-q+Yf4{I@e3k1l|AO$4~C72kJsj_}YVaOA~u}MU3d?>o;f7T@2{g z`7T`c-Cuk4`}bd_<9C1V<)8GbUpaf#^Y!fcyFdTwpT&y5e#44I!A8lt3`>Ngo+T82 zq${ifw`>r(DSM3y%M(JBNkBDfIWv;L10;57Be?0~p>$e|$}YVeP;2*Hz2RoXMH*hb zGO!xkV9_ySHLG*-Jc!y(EQC17t~^gjBujC^6>_g~MR24;e(9dRyQKLZu8`8e*tST{ z%F5|irMb@U8in`{M^Yt88LF<;RB;l2;m+y{l-RJEP>r>lq*_@~m#p~yu?o&v@s&sI z7Qv%>CU{iu5itEzN8bM!b9ui}EwFV>6#s7|Ez0U0x$hwESYTPJ~yDTPu>~sWNa_XgHtE!zcL-P!##<2%Ow< zgiyEAf`K#%qQa>f?*pI)mB<8tRGxhNc34^OnWvXc6pQdE_NWBo#j29xog)qPIaeOG z>ZUoxX00xKN(XohTZT`nxY&dMVPkLoWP;oIF}Qs>rwm7rqI5b-I_~95jD5P^z(31M z-4E2ClU7)tYAtecOR-O43rh_wk->U_DTurm>2OH_qmDU$Wc9h1#C|fF zN_RWE$A0=RzWWB~H@x|B5|=CL>WUICR@A3z62JYm_rLx2H2Ljm^4rto-+3xizL9zc zUK9IUic%nqO^vHC%ScXeJ1$o<@IA8tdC(<`w>>ksKTNiG%fU`dcm~4*=lO`<0bmF} zqTuY$s?)-zWVgv1iN(Ty+yd>}ryKWc$2sqpc1HWo_=V^1JbUNeisM@)V(xDCm-~ zLs_a{tyY!N0S-Ti=tcbjhsj+?0J*eO5^kL&b^_RPGjE%JzXpw3fCeBTfJSA~!+bYp z8)#nhys*cTe2{908u>BVGBZ4K%^hHYR+>?RxY6aGlN|tut=ijOtk$E)Pk(%QZFSvI zd>dWfMwd5#GP-y*jLfWBxkx5t$)^q+n27}3*$-)F^&3KKbA#Q)01Dn#HFR*h z?(@-x!d^0!aSBj`kyn-uD+2?5uvMn%qDRDoE~~ZfYrWLS>tyTA-inT`zmxnNjLoCRl0Iy?`xr#09vx{S>X z$CiqJRZ_pRM$hSfLA9BKJws^czad;`g&9zQbe(2n`xLXQDY|?0fPz4v=1*a>qL4pjYmY>BS>F;LLTUuy!(kjGsPoYoOM<72 zmZQ|k8xy>PfmWQynOK}*JGr`(QaD(b{l*wZt6u$d0Fu&H@Gu4wB@;K2&t|A?GW0@! zuCYM|E+CW=!j?OcVmi+*g+SSxX9))E;kyO>>Tpi|Yc>|!LT&Rk3+7ioT`;V!XfKFfMN~0S|A-u z&6gld+08roGeLF1a7?r3zjDiC=uEm=UfRi*c!jmWEX&d zQ>B>8%r)4kl8I1Dt5q4}NboAHt)hxwE%)GNZ{g=mu_)2l>j(?7tM$W_6q~>@@$G1XEheL=5LwaGY zaaxg@VmxstRfg71+n~q<8CCXwWZ5wjZi=x|3m~6mV5rRZbZrKukhn=+Rnn5ei`Jd~ ztGg5!`E*_Vf|}%BeDP_coVuomvTs>%(W!&^BvMMxok;L2q#Nt*-=FG+1)o*E#9|bTlan<<|NY4p>>8PwyHe`|D zXq4!^g=xSWU>ocMwv^hKStv2KS=!DLZpl!NI%Nh%JPc#6Z3Pqfx#6X;lT~Zw=H5w+ zq6bz;V*kQUMgi=*r6!SH+(jM#&&~CGjpwp285dd$S01^GvOss{U*g_O{}Qizuvz?C z%SyM>N^Fx{RYEs5P9sTwX{I)=W~B$igqyV-0S$z+08G+BQuli1HIwZe11qC#=9`(w zYR9+4!@hDT)q@UI=su)c!j7!nop+AxQBCVM_NZQ5sfdnVWq__i`%3QT8GvJ?O-P=% zTOuh{-9>o^C+??<>JR`7jm**f7RuzuiLJybPx4-1R%HVqoOFeMoG~kODbNXXIraC#&Su*692Z{u zab7dSKX+4a@%Sl!b9~$6^0ZxD$O(YaS(7lt#O|NcW{1|U-N>MPQNTMxS+18Ny*V37FbRAQumMkc3%=8pRW_1R?!XPE^Y zkO3oDm^4mopZra8>a3rn?x>}GUZU<(O$1OzqzBfs85TnyrA z`{DimcwSt8-(GvzZow+?46EEh*P&{C<#O5CnVSjFxh|t5B-Mo{?Q9bw1?zJ%E%)-k zQH_pnCM51JVQ_g_WF00sRy@IuMXn-qSOui2g=D*;S}Vs6n6tzEoY19Fk@BU3{FNW) z+{>l^`1!g`P+tsEx5FkB?_C0Ps%iittIAmiTHbzt9*cGCPy^I!#?qpcL^>;K)Ttuw z8~_jy;lB7pfOo==8e1}~^)QM^g+Ek+;o+x|C+H>d)Vxu@C}_RO3_6ly^{+mps<|Q8 zV33_92}#lx2RJYVo@C^l_xDx3ReX6 zu6vgP5#5rB^T`7R`Y?^<+HChyy%c(B>F7(TOXas?usHN?G54hoEd%=!nOgFHFSVII zpjrJ>lY~#W$xUBMwu7(`9hA9Q>ED4MNPz@@C)+%fmahO4)MTOYDiQ@{AsSLx?pCM4vYThwCQz=8G3Rrc*(*QJdHL!C!rKqv zo6m1EF;U}iQwE4c4OjW9>(;#xhk1f(iaN;w5re(e14!Q)Qi&|mC1lcw=^ZlA)FZ`z z##7)Jq#QntJi)fg*hinx92vEOY>M0L&<3<^10uTnD@oqGM~)B2oJJNCA51szl0<=` z!(rW+FbY5fkqBf69o|W$w4_G|NVXg^;n`qLY@eQ`>`GEWZv53^2>(D|w@m2y$m{A02HDlvh;W zO6X<6YmT4xj=gBjKDOxl-@J3e4+~9`a7Y3p1l1)co-_*~1ti3Gm-d7;R?f43e5NiX z1W9TEG%Ej|y}>4;B!{4;hspy_54>uxs}isb zD%19nHJ;^9(~6h9Vpm6(%;lx|Mp$kk@&J;?6Gek-`@IV(oNdU21;G1|P%}8X^Dz8g zz_5}0EeozepZOX}mlFis=S-M?DdWOlZG6}s{?-M-zw(&f0@z;R_g}mD`ilcLP)=M$ zmOxVFX46$q;GI&*Fd&JwjzhkzMoG&6Gy{w6j%f=r!jvQ#nFsPb_~h#J@iy~Aer^Xm zjWS3XS=)GQ1#-Z+&gmpVnO&7X-RZwRM5Wa|Xyv{_YW7UD5KL@A%raq}mC=OWn+dN8`yQSRD60y1LrhZYyC2sefA?YPy-zkX)Qp`&^Z@7N3JfY4jt5 z-~`?%Tb*IC6WVnZ8m-!YrI=>sJ;+Y$XtGz0ML7MpUxJ6wklGb^hgC|{86j8|mHAj0 zwE$(%=?8hI8lC|RYKgCW9_A7fPTaCl&;mvsA*G?gCm^1a^e53d6MKbfK+-c9o6I{5 zvAZ$sL_Ia0Yy}g|){7Zd7Z3W(d-|ky7rsy7jG^ZRfp(-K0mgds`&- z1voM6|6GH~w9)YIL8UW|~J z1Je`#Q(-s5Y}BVats9c_gv0Jd{!g(gfU8rJ|LfbUTbt2mBSO7{6i%!d@2YG^Vy=1` zAjwXPjq(+Y0zBg4O+DS^= z6^LTN$x~;m|;0KXu8?g3~onTD| zN7!-t@AVYMji!qPGRtgXZqQ>V@-+$0SOQm8Nw#h&t!1rAowD|>-UJ<8Gj(ADY=#*s zgG(FC3EE^_deiBUZnCW2pG=lhUE??1C+67jAQ(q@j~ z1MrZ4yoa2jtxBOq-$(*|+O&n-hICRu4++*{dhyL z^W(##jeb73^p?Kzu-z)JZO-Ji??M%nK*j^gB2)@*lUz?Y$Q5WoBj>rgn3TPxC zoK@N&O_>k7CAD6fq7sWlok-1R0!g32%T$N|ob#^)-T)~V*sV`>CP_iAYpa+weGA=q7C-} zG20>cQOK_x;>n-tn{KlxhwO>qsIi|=NC_-Pz_Ds$oWkHhoFF`FIMUgNY!ai%? z5DeCE`}9A(UJSR9w^ovth-gZej=9`_s&teZ>xNM*OR_sM0&0g{D|t$q7rin4+A#fdY^fNh?&reh&}skxjUU)g_{=ag;2Yic{Eey-CY> zh<_KhVw9;C$f?+aNlgf8k{XUtp;T*w4|^tFV4zt&F1fJEa+eUGqPXH^BtBh|w4wK^ zrh<-w(6oiSyju&XSW>N#<(YMVXyfIJtEw1%gsw^rum&+iCH_r`NcLDGSvDdth?ScG zF7z-H8ah2#>;vcZ$7*Y+FbU15j0ReJUyQtbVtK=oR z%H5(50dyvhjYK3`Ms-i7vdIauYUwI~H5Ox(J`c-~{m%XrTK{AszkV`*HyTqvp?1M1 zpY2u2f_H!Mg{Hynf6Xs>h1VI7tJ!@YX1Wori!S#-w=%JyD;V4F#f zUXAy~?W6Lqnw|*l1apm(t22V#qb!+Mv#RiboMb`%t_#x6D^uSRl{(kHXr@c{-sIv} zpHahR%c{I<(7`cCW=G(Ew{Bbww5qPnPMI((xd+9RHvcE#*D2v*r#rkX2Wq)i={BWn zsvr{t(n0J!w2(rSz8IgR$MfYw=zntIhjr~CyGUa3>|2Eh8pFD4Pe4 z>!$Hd(u@@N9sIiowTd#drVE1s(%`f5JDBWiD_SarX3F*kxAK04DuviS-p_Y~BoMMCSu>f%JiSHYBs8{rw<-IZTq5F^U8yE3xhFd20`X- z&eL0A@Zyv$y49_Kn(XVEs#Iq#_}m$69W3yaO)?t1-C45`!r29TY*_jHc<*m)>yK9kh!rkl*v~ea5KtYd2qi@ht#C zl}A%8aT`KMkc7HAO*N4`LyjiuE%ple*jx94yIB6uu^w$! zcQ0?Dssrdq8Iq$|{-Q&e^)f?X3EkXojkZ-3Eje`KW~?r;Uij^n$IVOiY`S?M(-z)N z^5ceoIm)ZHR(){Y>^#+A()5Z;A9ztr-NtzQ z@kbXB>Dq(%Q>>=GcD4IgviSa%+Nx{U-@m4mI?ALlnnFn0p*zXzd6`EiGWmjrPB{(l&ktpn24;aJlhZ-4FdUb{4Z z{cWZEmsTl%_jMP5M$5w+=Rs;|tO6YgAiBPyN(I@7tkG$fjNSGU%!|EE^)`}T6ZGo{ zsjX!gjkW4kBM23C8rhA%g(r0~d@f0Kjk0iHNZ5QMLVm0}w@oavA1nzvu5y{ALjtKp zL$18Mz#Ho&xeDV;e$-tgW(Bp#uoAU@>Jvx2F2y9o2?k@|XI0-dIQfuZN8qubHnRYx z)g#($k|oAsuGByXlz7cr`PCPp;0c*lM@|p^yr$H7QHOEm!F-Dl-Xes%K?v9GUwhk5 z_qLtxEl7A%K*F_w?pKm8oO`TYn=HJ=25+&!TWs(a8@$B^Z?VB$w%T9$V}1pH*UEX< z{k0d$Tha8lqUm2)H2vM{%S69bt^V>K=sxfD8WT&nTRv6lk0x&E#88YsU73Mt+In8%Tv64S4OI<}% z)A~ee4syMh{{#emShXNEClOG87YL|LmFQ4k&qg3N@~(@>aW3<5?Z>&WpIuMpZDzt` zBdhK_narwqZ%@FB)aRMaE_-VLNUF9-vz2ATg6S;Os@mhcQ^;11#!~dy#D>UoC@X?d z?}GKgcazt1#?;m4*!YSfoBy z!{P#yfV)KlL*3$?W_rCP>4NGlt_%|gze$ZUF(;H@km!zL!S z1(ZGgZ%329s@~Y1s<|OLCg46PlgKZ_fVGp`xmfF5CKybhuqO#v*?|_hxD|EqyDHVz zshT`eyfHq?bhYNl(15ppWA%hq2LRi%lW`njciA3@y3?-H|E{NCPKwk%2ok*V5S|^( zyaIP-_Lfw0Exf~R;V|;^Fcrcg!HracmCG;lWS}TF4Vih$-hgbN_Wh)C(xy)n+6Kr} zKu$Osje|NIHvuq_ZSz*eo%Na&)qT zF~E+1SCElPn@in^)xoD4fD)!l@S>=qN-Df=vwG_yjPL}(t8l9_-lzZbySEySexbB7 zc>*7OQhhJWoq1-XZ4=c>p(D})1@z2^dT`u!#POc}ly-`8zbbT7F`aE8$%xi%V)jEF z)(;Yak&Rzr2b)=cnNP>UX(f>w>V)9|2Hkn}%3$yEDt>=tkl8(TjxhI7WA0$BW+}fC zK$s+}F5RwuZzRf-#W)QBVL+b0i@40-b-Nq0de&-ohUqS<}N)ua{-nf2=ZS-BRS3ji5OA zP)=vVjTkBgaE3{mYgN)Ls^w#N^0qQ8u5c`?F836P7&R$-L|LO5##{vqkcUi=%o&OT zu`Hu7sOO60aj3xvBx;F?Y1yJvUv(rnL^2R;x28*iG@YJOTN*i=Wrm%yBL z*~xksYC*J#V}+oKe{Jc2)JA|J$U$_x?K0n;ggxRVubAgD0bhIeVS9SvaB%H0yExP^ z?|J{8|IDGri*I~!3}fUKEkz~iGQkLqlb;k6B)O4;Tx*v^!J-Vg<(d^>ZzB*M(~t^} zScMefgPI`8C5{x?x&uQ9KE|U}QdQie2Pp%{4|J2cRL{y^f0HRr|JQeK*lvRN6{5uM zq%+bmC}aWkJW<7xj^GPZhZ>X2YZ)Us-KguD7}Sez|>JrOp9xv+NJG|J- zl0$kb07~_8>R`d^3L$C{`P2V>sG?8#4YJlEsKk<6z}FJV2TwSXJS%{FIDncUTE_uWIsN~YF}bYs-K>*RG(RA|q$+A)aR6DrB(j_O8`%PgC#?LOv^OdP<% zicxg+e>_&^lc3_A-@Y=UthNl1s4_t^Yk?T$50F<7^8s1uz~uDj-&5~{&(V++S@WF_ z#e7OO&&zJz4G9gYe})gbn%YBvd&LHsJdspZs64*`w(^rjA%q9Fl>t1=w2cHWJ*3Nm zQdv)d56>G$mIsU1R%zmxefkUZ6iE$4tvSXVe}+HQrCH^?03%9WeLPN+0$S7k;M`JF zuGYJ@bStNO-0Wm&w*mDbIev79OCXuXU4BFp2kACHQ< z++{k*e0SC@yjybyhf_QMk`NM8YauUv1^C!(MoMi(PGYCO<0IG$JR3lz@oD@|( zvc@1m13+AiY-80$9#Mq>M6#B5PJ3$ykYCl^oYz>Bpfm_>49DcjyBx{D?@Xa`f3q)Z zlMn)r1KDVBMl}<=(_gBm0KRvrlj+1xXUfxq2&EdCAQ~ zQK$hLSpW=~(S170Z%ZnTm=qVBc(-!;%k>n*SIb~D8OO;1!$DL9RGAnJBak_IwQEX@ zSPw68+d#}`!j1zIX>qQkCiG|-33hP}^5FoQ2B%*9EHz`8VU{3?WA`=Se>BrqGdr-( z(_eAK3%6B|8kyfjT9OE3BTJA4JCP-@ZK~S%30{pc8z6nBxMZZeBQdz%^ORdhV|HY! z$<85B#maVLSrc~W29V3TVpkn66MA_cU|eGnwlq(FrJe%jMId9bEh2<&6i7&MRCbf) zaXKNvnFF-(q>{d1>>3lOe@0uyKw?;Au_>aal2vdb87PsCZc6u-d0rA8)ND^pDmkb4 zLRemG??xW^tBx5V&IDL50f>y!ebgsUQ~lp#Z0Um%C-UA_3qC+kqnGJ<0uf}mHXEo( z&4oN$T$jxs1b0M+vdBcnD)2=io!lHOiVveBwW!nCLd43kL~u@r$ZX+UF{S z=Liz1$DKk6Y>+D0e>JtP7DFVeHHl(?9O9r{SlQu_NWcx_3sUJJrMir*r@vNDacvWn z(_eS*4d`k-{q^_W|1&-><9qkle)GYj559LWmix0k{o#X;?zg9pQus5?<9EN-KYsA= z`5*X8g9lHZ{jog5 z?|J>(eEw(olWutvNYBSV(xZIN_xO{4r}y~WPxAVAc?QP((HH(apMOl=ecgLJ`uN$y zpXf9F`tSHopZ|%z`^x+LWV7?DxBcwr{>_&^{gceb<#T`j&-^Ex|LjjZ`hWbb@9_Db z;Fmu0^FM6Qe;#@F#}FOZj^5pW&_4GMfA`{tKlc;A|NB1QIaY9_&MjHc<)zOCpOUs- z8E{d^th6jDXi+rC4yo-bF)kG~fIBvM5|p`tV224oHhy+eSSUqew#AU8K=xKzyVC%B ztguc4k3sCn-_H08XFZ$DEYV^N$Wb8W~3!ZPKUqSs*4BN!Mh>{#42S!I9?WA;HRWTdiix0eNw-;bdU`;b3czMczQgwV>5u%{f89IN0I^%1Y8YQu=W&wGlt0P>QKkV6 zmwQXyfa9YF3}(S1H!y}E2^1iHFA&b8B7_`Z4cmEOeYag=2GZLC&88+J$tCMYDU*Zu zbwr{rIDcL)2eR^0M?wHRsT&wDTyc3u`GpAE6ZNz5JzVmAGhanu1WFDLuK!SA730NUwhat zHD}GM+LB*?@r^ssoaJ}790r>#so}s6n8bkoy55;C(Ov7~=282Yx=_>s>THn9J-Ti# ziKZsn88;tNm)9N$-Qt8&Os_sj=tA0de=>TbZT4w_!>p+~x7KqXr@!$y67j^aHq>Mg z8_#1+jJzJ^P~i7bro)z@mDDv`MTG;pt11#=$TAAG?7XdlgQn|J8J$lEie0@QmF7f+ z9mk3;j1~qwAZys=<{9(QZ#w-=_ud4Vn!outn6Z9KyGw$H&?Z>)wtVWOQys__f3pLj zgg)zF&YKNqgB`7u11!qH`4T_tb>>AvNGpz`if&hLqmka5^l!J$EvuKa^9psrZ%0w7 znYg??{Vn&7Hij@`K5F-lTV-8-tAuYzWAQjxZL@c_t!ZpIvRxKmAi17u?U2 zCbb}Atu-vEBR2v~t|gI{j-&-uRRx1&&4(veY`3!f0xE!kPd*$QYD-_E=$z4z&$3SR zZ_fCZO*g`u%+6A}Pcp=n`0VL#e-o(hS3_Uu7LCH{)7<2Qr3-Ij-6BBAfACigFab-A--ne)bVpgcs(fPztMPI9hLPWKNrfl2s$wFP zsy5j-A9c;qCAiGo>T<2^efm4^z5m_2(pK22Ue=CRSS!$H3>>&;e zACAL)CXxr2!1`dBF4B&~eV6FY|Kd`%Sie(F9IrSx5toX%7B0Q=2|KC)gXl( zpITnh+O2Y5n2s0&IJ{^stc1v&S=7KFU;6&a`cO&M~ebFs$nJZs>N`~Bm+ zFFOaWJ#@E}3EDIJ7yHHg2EGK}2fuZH(7o7N){SW(T!1vXj>;Q2xJS}3xxh83os)C~ zX_vgG+6jmP#4aV^1!>w>^44I7T19}ZVtgr}#hM|jb+BIKf0yMTCX;nV;vMFE$t6(e ziYWlz29weyH=DC}gPl$K+$8d#%ECan-5sRcZmx^#a4O%Da;#7yAF2UxR?<=N0HQ6{ zfG3dwl3;SIQ5bRsl&idP9`~(1!-UTZI=;Eq{r%wSvrCQ8D-YW(HY4^G{(JNF8@Jq& z3TLt;oC)Tpe|y#4N##=JO^}n^eUmTZhVb%vjqkun5R2}d>fY*4ZqoC2NjHqjiO{IJ zI;$ccs%EN}0NVjsb-J+2(JmmV=~9Y37S0RjJ2;o8fK!Am*)_>>MqS(HEZ2z)vYoX! zz?shgf(GV{@Mu;T6Ihl>hOA{_PDzy;W#uegcIMO>f0eg72?PSFcgd1pW4R4rA$)5A zE30Ft9m{n`4jk4w5ERK2XyQh8wMY^d zsBdKPf4;U#r&Lg9iKJVfmVMosr&3Iet*Uf7wxsHxts~QY-s04Ptp(Z$+|fy=&y2WL z$FOOH?G=`~-3X6!WebmNq3OD7kQI^ximyOAwd7M?1BgmpCQcqCA0tU&$VK=N=i|+4 zn>&m(dsY=MyLTUlFSoQSd;>J}(Ha+wxnV8SKCV6BS#+t?ZsuM?dJ&M{5Zf5w&_TZ0Odr%K^va6=9u#g6k~%{U`0|vs+~CuRMUaoL#v0!YgMN`udGKf4eA2 zogZX}XpZ8)(Yq|A!B9=Do`HSf7cq3&28NmpCd1rSN@|l-2GsVjygW@)0+xkrG^^kd zBbLWTBr({UWNy~w-zMWQTU6mI!?b=uRoLUR$+=D5qOuUvX=lph{03-)Q?v~FBtNtc z3-O!Sm5rqQp>{E;*#NG;NlUyMe^49+V3SIyS*%t^QYLNHC72cq{Is^10gJxrN^oBE zKKhQA=Yuh_K+dkWz$$Zo$eh6I`qzm_iAsm47O)Z> zaROAzaxCg6(vb*2ses)j^PyUq?GsDP17w?wHA1yM?Xwm4?IYqH>F=UE>BXO>=RY^)FbY>N1LO3H9CMH#tjV$RwyqMZaoHaTBzj#FMRvSLax%ix!s$h&lvmjs!?%v6o( z=L`KiYm&^Le*Dq%e_J}4uRV0P8lKxT!}GhS#LKafw>Cq$)NsE|4M%#bb1&kOYjRIX zaSR!TJN9@yY_N=sels60u3p*BfcL&3WQ3`e)rM#pH?JlSc(9}wR7takn)c;&)ahAhSV)a)Oou^R1`I26t|-aBxL19m@~3@URCX*e+M}qPQ6167TK!FP#DnV z`8DM2LdZ~z}v#;Q0aef}fUUlok zwxZ%SuLhJfSif23T-h^YtXO`nQ;|YVIW6@FCaF|-Qsl7eTd%~iP}SACrPP&Y22D5? z=FxN{^4m-Xf685mhh6(|&i2c<){h=MzyIOm$G>%(Vwl4E%xf~=hmCBHDub1EE0YGH z*TLH1?5Gk6xs}EVjT`D>wvm^ZZsw>-G9X~vymyy^g$Gmzr7klRuFIJ!i1{Lz`hnam-TD| zZBHHJWk{X$cwn3>Cv|pO$5H|tX-;(ZONMoFH|@f9tlTu0Q*M5m=SrE3-NM(zQ0AzwI%icZ_RPVrPXm6|H$ z$lB>dDq<~LJLs^)nkoxqHT8NhBUD#0m{+Ju$4SdU3UF#fW2ZKjnvosT>F+yw zih?!b$|_EYR_>u{NbUUN7SYE$lOcX;c3W0PfAq5RRrmV#@=GM5r=uyU-&i1Kl0=3q zrApTDMoXos<4kvKIs^c9tZtM8KoP9YG){m2(RW8Wutx<~vYsb6e9G-uu(m#BNy`AT zdB`h6N+nfAS-RJ5Am>q4q`FzOO~((xWIdT$&2v-to_V~2xIAPsL1x1kEUk1 z0;^4g!f7&Kix-inh_$SREs?uO`%Anh%~m z|K51`;Cl~v`Hwzhnx`U2NkvE`%F3jQf0#BS+{7{+Hw$ZnRJ$6!4^4@Y4+5rhov~#S zx|&97WgAo*#tJN(HJsEpsYDhGS%K-Ajij|xO)@=J+3mr#&Z6wKD?rZ`nLc>bUcNZ3_?@MBG{E(Qa5SYr~uFw#VN(h zvdORzI70fRPv4QLy2*9FArUwLG}Es54UO!`Sgz-c|6p$)r_2?)E_z#tU;|2!>SVz-{ZV6UR#2eC{jVX*$nK6waf=9V?fjoXR z`5vSP>qyIF+Nt{CF5N?RWU*WKg9KF`EFRtB!{}T=4L&??>s6Lce^a`H(WvrNXK*2^ zFhr_REXP?3OIeqX=9ul60&i+P$v%2_-m~@nXOBO+|7?7?9<}?=AK!m|Q8aYz@w5wULrjE$4z4ABMHgQ+he{y>4FFevLtY`3n39!Dk-7`| zbgE2Kc?og54=>qVfBGlx-F?qi*Z}5jlN)?y;bzDj;7=ltf5gt@n`=grGGqgQ2%4a$JBF@m-k_$|B;5>RJ0neaWRt=i zPyf`Hu=#u?%4G zq0p^MQtb-CQG`On9RS|h*Vgh~fGQ&*!M=F< z!^g=aygdDMCnxP|9Uz6fAVS%5V()S~>sSgN5yjvt1{>F~*>t(qy8hG7k6Qim?TS;R&RLT8%5 zCVpLjnVkNao3W^eTC#czXFob%6dAWye=Ss0a~%=R%V)Yl;Cvs)gi7cC-ES1AnDCOH3yHc09?u9A;L3jQ%y>gf8?G4 z87q-Mu+~ty(k`TJX@H+AnKyN@>!=(Es=ZeLS+W)FOk)esoI}sZfSYV6{Bbm+V|5^$Lt)vjnNDg%DO{qLWqCC*Mzv56Z8b5bLub^t0dpVY^KJ z*B!B2aCbPnp$T^qfokmxQ(0h@e+;D77QT553F*R%Sf#9LQ4Fh^%F1!|rS%9wwf^+a9o)BABgQ}XSZZRI z_XRQ0wW*4n7T!MgG^O92-MV7n>0d|fU@N0_y^chBnDgg6jEIq#Wkp7 zStKhJof3`IQUw2+L;|Nn2`hJtF3`D~*f+lyg6LJ8MmSKV`2_Z=Q~i*7xCF{qeVp@R z5w-HY?Bu(=qftH~a}3C}f9_sY9-!t!D|NHBqzK2akp>@sq19y!52EU}Iazk20HO(@ z8_*Dxhy8{QND6)p$TKh`QO|u(U+}E=+zSNC4? zpF7FJ*4nC6)VgwVqd9Z;>bmVX%3#rKJxiGFhdp7Q&h&9|(<+ z%S&OR30^homcqien&i?6Z&~*q?2tmZWyB#Y8D7f1YAPZLMrPJFi+`sqVL*F+pz)3M z?8(yyk1oRLwMXqDf1HLhKo{OH>F#&NFRXW-z4PRq_RdrOy?B%NzNaD#23Q4x?|uK- z_^w{@177j)od@qs{{399`<0ik`$2p7V7BLa>5GaD_M5j7&fl=jnkvzKLRGU)RN=4M z{Y(MKf5fPS2g_o@r`f8J9zhkcb|g8Au#=UQX8`?aDo)q)f6b5>CCv{-TkuvuYY5I}mupaa zx?RV8H_!y)9MzaXkXkcK7JLQZEIT==62*~M+2*PtsA55K&+@^O^vmRpl7Xp~4SXgc2dDdA9|(?lq}VHq0{XjncAb}{o@ar3!$YzP zidjh#e?%2!nvhOeV0fUtkjJ&e^Doe)aDsPqKBP-YiIfF!| zdhuR7w*-HhJN--dz657ao1FBbcJD*iURB3ce?gTknV1W^;Qvi!!g2T+CbK+X&P7^AC_Sw*2fk-Gi%jdV*A!zoZUI(sKbMP*~Zu$)PxluW7Ab+ z2f<4L3}!Qpx-bmOiMNlH-G3O|7#)5LY1B6_o%jKmBg61m@Y^jaz)ABksTX8Q{E!GkX3vn|FdU&AfBLKztr{2nUn)fzQhoZD4}q$^dy#-iF{($9 zbxHB_sO{nzL|?ZD^$@U}&hl72K;}`3PQh0363JGJX;KXp9B(8@;5PCVkSrUChR4`T zbUi~6R2t_~m_wKPPP!JSf91ba_$)Jl{os3yt@Qe%Xvi+DvicWGPCfi)OJ(7>R3o!8tL3~@xGY`C zPPxehXvdOHrHw5>vjL%A(&xsjs=-R!T~*`3tI$RT7F}0;1asj#CW9ZzNvPw4X zjO54#on?lPT0$A^i9OT}Z0d&`$>G7K-v4scW*!%CF-z!jb~!AtX2F-zq#59j?tu#h z6rzJks56Oy5T4KZ`ZwFt4-P(gzTB=oY?qgxBIvJNe%^fJ4mwvYLpDLH*-3|&5tb3g z+O4S?QzyT57ouzHA?m1Cf1W*TJ^3KcJSXJSW;kCb)+ZIX@@a#*oxpf|dC*tW{fuP& zle{UqnlcMfmkEab`EmMJ@7;aFKJHkS15}_n1ZWY5~%`wYTjD80aK!8 zB9dD`{Z$$rM7A;l|J#}6Zk@L!Nc~bCUj6j19VhQa7?QBaxNoMdcnPp1zD_djl2eIr z=VsKqndB#ldJ0kd6P!B_p2!mO7ykK{NLv=Z*n7TvQrkrbl4Vz%8HkYCrPOnVPr}J8cOEv_bfhbdD>bk$NFTU+rWmA#rRL-&6BR4}Hs1HbEuPs^QALo@=v4K4NrW=C zBb!ogkNjpCe>~ma`Q5Jt<#>@-F*8=d;a15Ta(YV2kus^lh3eDe)F)-R<9&%lH9H1{sH6e!^}er zP1}hmYzinqPDae|%J9T3IYlCvl#9f2(x-G6YDDI7C0zPLNRA?7#x4 z+vmlv>zIvcgacL(2P&SJMk0zJ{P zVO30IhGC_t#2~9lSal3i9EMtXtM_l-W?dub%BdvpM)p#*hbEmZxZnHi<0lexkw*SH zjtlQUfBW$x&DXR0`(e8vzSkbjTUVhuTZM061GLH@_(1K@ar6XTT|nAKS~pHQchXWM z;tWEA96IZSe2l2uN*Qc9DOZd_sw8PLD7(rZX*agFzB8Q6eAK>K>RJWN<;)SpIzeEC z8Qi%#Wv--ESzz@P77TBs(6()3?%nFj!H2>+e_MJ)wIhKz4KGlC*l9N5tb3rW{WH=27=prt}_|e_g;-L8WEDpQ-P6iS77|lgjM6(wEY7B~WnrnFiA6e_1LpClfj^HiPyg0Yf-#di z6sJVbbo{tOVNkg{F*UrwKjnF_=voy1K z`ge{t!d##m!uBi%kVNE@SQYgUfAj;t-oqIgcIbw>hVyZ5xtn441rWarVX3uQGR5$G z##}e$?&ff@7g<#VpV`pzNYLFT`?t$dG^+t!#Q5~@zA#7wCNnr&h8Ctbwl?n}LHiY= zD&oi|jwSD=&e0*;yE$K+BILnM)Tk|^_QUAbh^K%5P|TlJgk$MQyDdI) z=x$1=k3o;RLpJtk0GC7Vf5=gNpD=M1zc2?C#yO<#7$mc$^27k~s&b3ZJdo;ESTBIy zrO3+$PyQq1Pr3SD#Nv>S$(cn0h&R;f1A-yd-@|sydWM0 z7KR9>6!10}sIC8>y7z9fE4!{dM^clLD5|BFnxUDV>241Hm_IrqOUD~cC_bsUaTAs3IpDD?BRbpy#(_rYA3>dszNR!-jWh@fJ zepxT~|NPNjx(Pbc+ysad8V)(Wz{^0uR7j+2Yml`>XnQ2OOTcEzX`#R)CF|YYQ5mmt z+r_A{WyI904u^Q(rLK=DF~WVGn>)7#!Esf?*E0uf7Ve|rZW2>T$$lzsZ4TD zj5QB*^v&|0tWrQ|BOH+6!-5Msr%!|;DX6OHWU#7+icg^UhJ7|jld^Cm09CaB4c2Q_ z=YQP^BFl18MHb8O{$JEn_@m#~v-{M6YnG^$(;<&NRD0WGqg78Hu!m9?OvQJ;zI&-c zsw@vJMTU#O}@-+)M7^!OD)9HS0xngKB(Y19+;CHTy%h{r+D%b}GqVc9V_K zD)Mitb+1Lx9qd#dcZilV?kwodH2Fgvud5h~Jv?n9o`j_KeYL6x+N!IK+%$kTYRWcb zRWH;_@KG}{Phf1(1)m%;y}AFFk3FId2wo=wMqU5tf7aKtrrV=-PkU)JEEYMA>FRid7+*BU1Myd~Ld6+!BTsqTHVYLIm zVyqIOf6sEF9sqq)CE(b>S5Ddyamr(6gD?Ko<6e~&q{|)Bj|3z5ZBztSy|HAS(qO~n z79EeZpyA|B9=gcFguUpPPu7ANfYv?K<>VpPMz>{zkmS|VO{h~XomEGPmws$vr;`zy ztZ(L7JMq?!^DZG9zcv1`XGe9@HErBnEuqp{e{}#@a0kom1ANl4##Lye34b9L=zwf*jlWyVZp5 zlk&!6WA#I2SY9Nq@k)NFA3@jt87yu|Y)i6yrUa*MZ}6Ea^DIwefD4Ai-Pj48%%b*+ ze^^vyx3?EaDhzy&x(<|U+I(nsGh5a-azu3keE$AlJEGnI_OpS#(!(Ta|_L1;uQ*r^oA z3|TX8(Y6{^|Mep$2c66T4Tzb5$3WD~e=;ZIE#UJtNw#c*XpLNK2`@PtwI8xJbYj;@ zpm_^8IspXuaZz`ok-Tk?1O>lVlGVjo=4bP;{0K+1XiYr7?fZY@*y%ac!=zV6CyZ}( zL=qMHs)Sow-#Hc`16KgiL>^XeInI?;PT>N{$jeR2shJ7rN;=963mHeNPY+~aWSs)AP$l^<_HR5cHs&2{UjO~C7&e@j1I%v-jo+MAb)2P7GlB%nd zbe(}KwnG{&7519MBsy$xwclV5-L zj2WUdq=c?ZC$&WepA2atORTI~#-hlmCu9S#Vn|^5K?qb1FA)}AnJPb2AG0z%Lg&Ik zO1Yw#%;c~2sUDVJda z0jVR9kpnVzBagfy3xEx3l(Gf$mZUPF`d?9<%3_=8f2?X<9b{pF4Rz%+tNDQKvpjaxsGAUVdiESly-UMg@$%mf~K~X^|$z0cMa*-JT=@L?W&_z>KB0NHc z4qNxh*$v6soL6D%{l)spWpDRw2km2Z;Zo;%39vIVvAVu^cb#%Vu{|SbBsMg3qRRAa z&{SODe+?&T)1B3*0yvaOX;ZB&DSqZnNN-gaDYo>c%Mw*`IH`?#^@&OPZ$Xj`$Qwj+ z))g)~Js;{(FGpoe9Fl^P+?*1i)is)v4eMcGs-|>lP>I~Ia;h;gnXnG2r9()rLW>Nn zR|O^k*d(_|>6&jDtM}uaN3HxsE+#n0>G9mdf7^b1vC?imVizl|kQd+9HGBB|H@{31 zml}>es*VN80m$`uxfQdj@RB@}yAL|NGdd3$wy4NF4!zUn4`Nw0sv;|E%*%p-w*-Tb znNv+i`^BUFj75Pi1#*Qra|L$?{*PI&R2^{<(JS{D-1)FpX5x@@AkTWm2 ze@25Bbi&ZO&A`LD)$9c>wvF|qLqApONX^r#nGaOU#wAgCqE%AaD|u$d#@moKc_EP^ zSN8qCcU)sZKc?Ozb(jst%gexl=;x;NTNcb;cS!+a4{;LX zTpL!W8zV9G24RWGGpxGsI81+e`t3$Zf4r#<1&Ft?-2eN>QLIkgn`vUN15!))a?FR? zU!az2NuOAn=Wa^uNc>etNl<;b{;*yrAF=Chk_gLi`>9HDR#u0Dsvg04=z?iXBkv{u zIKwOR%|!xmu9*A(-~*@#92B|3ao|0-v3FbVa93o9o ziQ*i<{kqix6reno@B^-o{S<-zf8gb_*DoI0DDK`=nq1a3-F5&k$_mXV@e}uUS>c;6 zyoc^8TcpaX)8A~CS{H}}Q>;T&P?lH#Pit59wlbEwW>uY74_4@9$DmStrecXa&}($Od#4c$5teWJn&`?#(9|4`cyX4TS^r_!*igU$nJe>td}jAe01 zy+}?PE*EuOwLratonB$rS!&#aCrNBM+hj>B2@y%7sMuO->X09*UJf!l1l2AA-z)2B z6Dy=$<=Xv!^a08WB{%|z6I}pxd1Cu)y4cjQV=v6RN(T-{RznaXP3LNz?m&ZlPK;!e z7jSF9JYPiBXNDMe+Y3*d7H`i)(u&p_Z+yC6Qd z9=;tth{6U(O=5+L8Udh~!R=XPGE-@EId;F7%9B%_j<;$-CA+H$k2Jg)A-VQABi#Xcilydj z8e1~FFxe)Wo=lZ6f4^!=byw7nENznGNu_B!G>Q{E1Wl1}iQ>7m3=ZYFpcQB#^a1>&(?1<*>STduTm4e6kESyjp^Y|6RHKtkey&a_y5^ZOQN7!t7Wf2f9GqKWC|#k`00tAR`)o( zx-UtHswZ$=m8`;2EtBdSW3`i|WU3nr3_MlxXlFE%EVZ(}no?oW-d`%Ha~cxkbr7ch z*}d=o^J86TZZ)0NfMHy&kW4ER!>xgftuSz7?(C{@>8NZgd8j(skL3x+nUJ7{=D9j~ zIjfq?#lB;@IM&x{=fJT5~n(MCs&sULt>ea$vCIRiVUh50?)8+ zM4%YYAe)FF+iLUjub$~} z@7cb9L^mG1tG-s|YVz!c(<)rHLfLSsYWtWz{ zR2kygf0RrXVMTXp9r7wws>X+T6*ezd{| z8I-x|l&oa}H_I;#z?uQmGFvdJ$RUL=k)z0OLDiD1sZ_`=Y}XVNd(%VX08lvR#iQ2^ zFRk)#*5ZYam!7L3H%Tfk1+CcR$AzZn%UA8yf9sd)LQePA!*;RU+)0PVJu)4dFFOme zob7oza$a;jHHhZQk{Ki(gpv6&IaNL)Ge}^W@b3MZ4)S6%fL^t)Ky}w4{8)-b*Q|p-F|Y zJAgf6R~}JQ8~8OBxI4W8}pO@|rS#I@dC= z_lX`$ZVMjv0fez$eE~uG@>z72Z>YMp(e3Uuy_?Ys;%{#N?qE5KcFPm>ImM&7^*i zAvrW?AUh~ZV`|7^i!39pF`)S2zfpD3PWb3nlPZ5$nLs4h@BhmK=1bECMpd&;TZ#iL zHNq3Qq;>eCJG@kcx)q8-gcquFe^nYDL>Gn<{!7LXU6vw_+T4~;dNWo=R6D-hMs?ZO z$+J8839NQd?tGBzG4B7X6;{8D_-o(r7MQV_5hBFj&a)0H>H8(S#&HyE6!m7*Hl+^@&RWsjfB)AXK*&XR z1lHurVze@zm};t!Up7C!TL5Q3n7`>f2A#oLS5?g#o6B-dRy`u*C8&I16w7AXDr(e; zGnu)7TiJIc{4u&z6Wfed_wjZaNWSSK$~n$9!s^*Wz_B6O>5jQ!;lbv-ip{~*j!h4; zfbnh>oVG4S%LYe+gR>-b7{39j)_+K|nk)cd;2GhjO9~F#Nk7b}P=}xnciU>fj8frV z>fiCi_GT{BoPI|w%y%ze{ru?_xO3x?yU0EM)K28zQ#(<&FveJ%mr7x28Gfru&BN`k z=#ZmZ9VI}1hqMu5mm%F^I*5fb#|T?8O6r}7yTKY%To!jF`zN_EsXTcet$!cPZ; z8j4ilM_Pxmm;3+b1N87)bwbISnuxWBJ&q5Y&d|aLI@=&xudya9JmfAn@KFoVD?)!& z;9vTN+!^U-rp$JXx`R#d#0o~D}TC{he4Q zO)LW=QqKm+q^QitO0arrJM$W3kkQ!;aw^h+>e08qq3>o$cwua5x_`^hpqHR<-uf2n z0fR=eO=n6IGaD2JwiJs2*YWUq`%}mUw^u;wD&g!04 z{be1zqFxaBgm{KtD+pX>?Pyk}d<_((tC9s4@<-rRkrnTu_B%CY$xA&aNjJ3%+vch3 z0O>pehb+`$XSt;Sihq*2DM<2??<+?tO!8_|t3%5&1p*INI4(rQG$?V%5L}icsB5oS z7~+wd?z3T#Qqpp>tB0jcKC0F!h3sm-ylVQKfi@4Wo1y?B22^hy88ljkq* zW_$6|CtuvP7oVqa-U_!K%&QEl10+Pw_6K)ZqfR)hws~SII~sV( z|I^N5%Tn`*LVs+NZ}OwUfK{cX(^Ltl)(%F9zNt^u)=_5hNvN2IHpG=)bbBrblN{ZZ zrTLFvU7A0;T$r~W$`7uWr3GATo{}}l+kIPZY#(> zErr#Jtx3LTW#nMheU-fvJyCa4BOMo3l>Blx$P^|%)3mIlt`1Mo-nqJak!dC05oFe; zmOfxlVS&OOwjE;t3%z`3XH-3JUOUDr-v-d)5`U6yJVS#}On#7j7eyeP-=w{6CEO_u zKG@fmaV8M5F!L*@o6|L~418sk{?XU0(hJkh8;|4%TBCpea*ckwD^yC{PB;^|D*t1PMq~SK#-g%PObim!jq2uxCK833 zoL)1ruK}&(hM3g@T3H(l?km_;q%Hy}C+ot_)vS|uXqoi}esbsQKhoA(tvT7@bw6_H zU`q8m5jdp3<<`{#VA)D;V_FBl#`G(VunF2jLGpjryS{f7-viJh>z8&8W+Yc9hT@!wMk3|xVgrz!?sGs zCul)R|L@^6|Lz;ObQxCa)LnuM4O-ncZN$>P2*x71^4+reY0RWb-1y?$b9B~l z37#bY9dj|L#z8_%QZl%*P=Ei)uUn{B!s)F?^8+o@zxVaw^jle^+k?x=fz^puSXKm} zX^knTXXPi!FRTG*pIs`(5Y46rfehecA0PKO(aT^w47f|{(Mw#qt|L>$Jqa4p?;mZ* znjUhZ7Q-Q_c@rf6d|IS~_!ka)>A*A^W_$^9~`uu#sqAr~mNYE@f~x~I*m*q?_IkGvQ4{Va6nuPoBve^{hHee#8O zcTbvk7XkFfLwKe5-ut)Pfxi3Z3;%zPn~v9hvo?>H|KK8z1te95QHN0u=T7P=~y|)+Sl}LH(5&U55 z@efYx@!L54baP6|s{-6$3#kd`0Od?lk)V7eW0R0RB%*YZi6jwowxXwQI344-rQ2RR zTpO}Awug&+nl8(4$X`B(7;DJ-}A_B(UETI1E-0sPPBNH-q2s}+&{R1x`&n=cdAg?Ul&cO77wfd0-7k?p0zVXibGKHC9laOnUL5|k! zni`4m=MAq6)wwC;^0u_W=u8KluT(nZzx6J5){Sa+X4 zo3Ec<2!DLvdhjk{pZmnxw{Pda`{oPZ{CYl0Ez|F#jdKj$z&W{j3>_5bG?tgjnO9O8 zfCZJ^nPIcUrHYHqckqdtL)05pWuR#e$Ari{rcLAzwo3%k=)NmSG>SJ?lZo%vimW@Vz(I(b^+ z;Hj4o86gQlLY&ERnSb#TVWp5%Ybk#M^1GTDhB;r)-&%<5wD^Df>5JEQ;K0u=*8Q!= z?TP}2IVo_w2TAcq(CBkMpSM&RdV$6}09~{VVUGpz{M1?SBM0 zzLf3(GKSFWy7$l{Q`}~k+a*&bKt}@u4YhsdLl;|x*=kglP!7YVw$w0nVJ1{e#wpDF zsw%BMOmx7$RyH~kCntV*X|FfATEsJ2GhQa^BTA>EvGS}TJWDwi)@E2>#d^DTwuOgn z-E^W$Hj|$}cHT)Hqb}|t>m4=YMStShgk#8cD5l7i#<1hiz1nEH3tM^G;AJ-!;rpnGV9r2{mi#Mq^t3*=5j zk!pmReP1@Hz7$Rf9|NR0kT^_=m?G6oNiPm*)u_}YuwK#xi)*@V3|G#A|KQ;)_?H!F z-+B-~*m3Y*t4#Y5)YyOACI6R9^5#|lZrX#j^B?}@Z~V!x^8^2Styb3P90rEH78B!~FlLlUyYA=b$opHMO|` zxyYpy5)*G^KsvRm;T4>n!!Ap{nv&g_;)5O5=iwVYIw_}p{r&3K7xUkG2tVlk>R(aL z{|NdpKIXQN%iwkM&X8{wy#DUj2d|&K@6go-ds||a5`WQ~3Enee07pAuK~*h~mn)gP zsSh>2Buz!hGnJOaIIkZZ+$rtU*GU?<1zeTvFlfE`FI4a zJ0Eo?(Pb#Rc{9;B3uS-rN+^5lh2L*1gOh+@#!iC5Nt&zd!?L}!mUCkRk$2cx3m7iF z$r+jP0EDT{gcuxPN$|GLOjc`)J-sccnqRd#_20eo2u8+9a>@teo zyno&7n?X${a_Z!1VNru=SOxNAvuFD5mcEEN#dok*~Fgvs4-{cMj(I)XHb#IkT zngXz@udBB-<5Ju)0C^`ZTzM_zEJF@U#AoR+!Jv`t50`NQOqV>~x$&Vx?W8k9DrhN2 z2T@Nxm)0a>975yott}H}R+(C>4EuZn>VGYK%#23>CV` zR}tvWv#@@^!J$ctI|~Z)3%_@jwA&&n)jXmdEUs;h9Lm&VGL)E`P1cpfq^snvwLW(- zz$6LlG*@;je-$3Paw>M~5&YKh*neNqVE71{L_gx5)hnm_w{BbgPYdsm z5*Rg%83PWG+09J4P)ltV=zmU#Q_Z+jCR{ylz)}dZYjGrkB0rTa<8N63ltU^rsu7q) zVEIdfJ=>#8rZgB6gXxR4(7=luONe`%tw%`;^X(3z)^r{avW&!odehV+3OQ(C6lNzl z;eJzMwli5cSk^(35Ru7Xew}`jo@ykAhVE5uZ3t?XC0?TrKqDcDn15lw*&d#EWeNV_ zIjmiQXSW{34;IvZwT9(K(0Bfkx4~Zqw3~Orf3tx0!(STE-aASw6~1gBM$+icj#-hN z(oD)m^|)k?W->NOr_ZVEPHY=3H1>aN8yo{Jo+q~xZN4-zPvxYkLUK%v^9Zraz=tF{$lDp6P+ zRzMXZ6QZM!RB~RylmKkXWp-1@J@D5h@our$DY9DN2);;&n>E|6UOIjMO+Rsa`T1pY z`>luXgT=A$DR{kk=S#CI2cR?}{Bj_6Z1dOxiM|*+0N2w2UVqw3VM^z|#~~X%wOu5( z9teT|gL>*5(`fv+Y$l;m0A-ym1oBY@I>?`P$`@0uV7t!x;46{)u=oG{2k5Qapm(G3 z1+I()4Xs(8QBK19%%bk68*8Plsf@+H2w6~8*r)?1`7K#%n`8#w)%v}TE+ikVO0=e& zGd;OUK6kP~4S(YSW`1O=QS&LM# z43ra?<~+NM5ptwPu}*7&zb3YGg7sOKmdVYfp2TL4`hQjad17{|YY9QCDyOLJk^n;d z*_sC1tbZITDv8K6lZvQ73^hLZ;yDy~HuXcJh0xHF%GvvpFZjODF7d)O$A^dlCX!dF8Xp@AJ!xTdR^y06z>0r>-h0FCRQtvggSJ42(%iK zzG_SHr-Js$T1;}vi-@H1*dZUEE@va)T7R%ip9UEg42fA?S-8aw)~}7JltmUN$x_Z%A>jD1t&jw#QN zJ<_gT4&YtqF~4Yh@FI$=9Z`F>?;0TvRz9JDgc(SIzJddR(~lm zRiC}j5$^ugEy=I_gTMUFBXCgpxC~t`r?W4h8xXRp+(3dyg&=86EYcUq36IU+&pkM<##yYd`wIpMM?e`j3CvH}M1CPHa9yvjQ~4$mmz{9!!N(L1quM_Y9kkuFe{PfU+2tpPAu*E`$yqz<~^ z0)d`LKEf{NGNU0IHcup!9jjG)F{FuS%6@{!hVixV7ZX_`Z|?&8E$EUpzf$ zw_6X~6=NWCG6s4-8Z3TAQCBG%8YAJj0Sjg+cgDM_C(O;Ma|GM2&eh^ueoN-a=_DNA$qL$r_va0g?blBni5 z2lC38k+QrR`&Snp6vAAps0?ZGdCmePS%6qp?MER&zcO! zJFU3P0s@XGllidJ^1>I1Rm2Sj*>#<{=2Rqwr-QFZBuPFk7iQ8?lzL*k?#^qNWLI7; z%dM6{3n>zx7_!oV`s&j>sv1Me4oqXr{r~(v4<)~xOdTocSAV}aP?!YbF+*kO8`L=0 zTr0dlmdw$+X^tnCrZ4%(05(*4v>A(amy}*u@FUYi%q&_@R!ZERO zCd@jFkuqWPhQ(JUY;|T<%?-w94)}itgA|b25ZZP?mf9i_Uw%u z;NV~dmQJ(}VSlyBg0brF@3EvJDV$XnsG!Se*Eezo0G24Vx1Cm52b#b*bZaoBEMl4x2XW3P6nvGg{8uOGR){+*HpwMnQI;q zcE}Q20gPPZWxzYX%m+XE{+gezyBDv&c=hC1N5=vFe)i(?c99-#J%U$s!`~5v{LaJg zAD#9_i4bgNueQ-4F$wZQ{>i1lgF@^Q-C5N_n}0$T^%*dk(OoAcRhRuBRYf4yDlJ#n zWFyHyu@9N{*(6&agK|LZa#n&ZE6GE4^$2!MteT6q<3VNz(Pe#Vhx3&jij)H+c3GiU zgv+UGnM|JRWIhmy(WR*f1M@FI;}Y^@X^sk{i;IBgX18v)>Mbj>8&9NDqlh|Bx=DMq zxPN&vr%w0t`PT1z_UhI1yO*!ptJjy_xHlfTD=RL(BYgYt`^UH9;1SEH#jxsnO&b)z zR)q4|hS2QEbO$TVsFK&Tbu&!xJ`bSrM->^|KL%Z%tEjk&Nx`zJHS>^3pbkwZ)@7&6eZfvFRQYWU!?MzNgVu z5FF#s#B~x#iGZo5dnYh$CzNypl#s+n_x& zN9@W?-9Yf#D+)Oj*;BchI4vf+wnMX4=NPnk! z=(ma;7$60Fo1~KG%~2dvD%>G9S_=1&Vb|Hlqfbtz{=rW?NCd7bdhao)Z1vfRDxRJLtrJ@c||83 zEC(W#I51m2%YT{Ncy8Sb`XPC%Y8Cjl0@K*CG*8BViEu_nCpWy7ppy$7Vde)-FoCc)_)+Uiyjrj?pb(O zH)D;AoGzQajs{i8ut6)LcOlwjGStv}+2Meutg2*_C#-)XnTrxA`&< z!c=t8JmWg9#fcn_XMY&1u~chjrs)9YldJb~GucdbP z0w9lavOsOI|m~LznfT@qf`iN|@8j@TY9p7b)_B zHq6ZrR`40ldy*HBC;I4jt%Kd|boOMMk#20BS#~?R3o0vD-8$A;f<#D}#VWD2seT8A zK&Db6w}c<%yhv&#p{j&q+HIZ8cY>}A!eiqH*D`Pb)9T2GKiG!cx9a~GAB;GnJu;BGAqiK zW=aBQ&tX*X98&3Pg+qLfFM!8$tV~HM_y4P|s!E#86Z9E&>s%<{UBA7Q_qihGd_m6_cC}A$=bGP>{_jl<0J~PJi0zs*_p6SsmnitDEtn+J3^9 z6*{v0{(t)bS5>@Da>SX@blX`>HJezIiBL9JNo|1HBUpaGB;BEI8uXea*5(Y)nj|f5 zLWV)i4F^`|{^4v!kagW2_kPS33ufw8aq$Csbt99D8({Ek)xkE%89MCP1W}qeD!Nc( z&yY$D(0@_dlca6-;UeM{pG#VLD3#y>S=og~{uueN8RBQgG`-tI_g>ZSTnV)vA`epw z>TC7v(jH?=W7gJZzFJ7~J3oH;?2EgX zTKT6$5YnpbLjXOo$QzfW84sRhhP1bRif|VG>wlyyXmcvrwdu1I;MXD=XA(Js5|{5% zvu(BM)R4HS;5cG-Y+8seTWR>k?3fErE-Q%u0*2(vZ6b0{mAX{B_yL}I^F*7S3nrYsfo~_ z61E!6(EXgR$pHS~?WOBFPxW{}9zw#hJHqz^%qU4_F-jqpd6SYDB)F*@QhL!L4prn3 z4q+sYEWTw_X1kqps7h*y+?(pphkuoS#8kki)*b(T_2SvnyO*zCJo)0&i({l)kK)IA z4G4*L(u;RN?ut3of> z0pGCYJh3pu~d4L=Saa88Q}&i*Jn8qt}>z;cnoirtnRgp z#FZk%%uJi4v=9sv3ULDc=YKk#dbbDv0P?G?axY0vXQSHAJq82c1~bZ*-)hk^)|q6d zVfzyp&cp&D*BnbmZ3|h31|+Zz8}BS8&{1Hau&_)a_mt^nfVEcMPGr!^9U}NCwF~IE zC6T2CewXw}BP~JjhYD+4^$=?&4!$YTb>1OMES3Ob&r9y_^w%Wj7k_u_FJ8B&ih3_! zwJ%=X9fc6*1$g6u{8&$v61x%zv`9SDE$R8O-8=)qre!euQ3&Rwq9w!J$)tCP+!V%V zQUS@(d$1G>#jD(;5uS=~O;=t{4tjUsiDd9kMT-hOG(&9DFDLMZmuqxbD(+M_r&8kYKQ>}sCT`K(i+(53Qc zrhM$d;sdrWXEk<&E4sk#v-8-2WRt*8foZMQ249E_Mg@OSM}JbG11jW%+bci7C)Kfs zk$@L&2`JkQfxQ3UKR}cC6cA!lr@-ov;f+k`TRM8-!OX z=uRcx$l1$RV_0lkL827jYdNlY?Hay2iJy__V)3aMQsYp?B4jaN_-m5e?P21StZ$Zh z>lYMzNh5d?Z+}!X!2-6<516yB@@0Z4NOF&%cRHhsBQ%JCBAae6<*3p&kihJ@1n+o8 z_1-iyXJb}mL>HxmWl5!H_u=1ub5r^G<<0nw$L&fL^1HD%zmHg}i@eA>9GwlPlZ$@% z1Ir(z5J-aRzQHzI8W2Yk0Kg=xvhdbqE}xC9&9kH3>VItbDc6Lkh@fg(CBC*996mWl zU6nyfrw+z!FDj}Nfw*{`#z+_}iE!Z!BuG-^6mZ@%Qi)V2eRE4&lD*)HFK zZ2>YdS$xeOK7~H3W~(cynigd*(oGC#f`gEad*JpLT<8?VZM z=rpA#zo;&3IY2~y1;tSg-oL)0^gnhzVWtfJl*Nw-w>f(`%+pw{qOYI$ZU z?$K557|PLEF1R7wTWkwv@8pcu=y}yE;NQJ`-oCi7X1VdWeQRaMEP7^QOU-kG_2L4k z8J)RKh)2;14G=&EHB0M(IS5guHhmi?;|elykbf9OB0{*#dpjKfdNPJzI-ph!!y0Xp z@w{&Td{f_#Q=lb1ayu~1vRcXV(mq`*5wObn1fP{V z6MxI8R0ak7G3qW-!jZuIgVaW-W!Smul#~%;1FGfY#+F^=jHSpVE04m00}c=!gDia1 zSUa;V-upgOW2GK@Luv*@5rE{BuxbtGg1f)*Osnc#8*t+xy8>>)3EYJD18!i%!;r;V zD~$-ACwOJC2S$;2KV!h}y^*S|G&P9yV3+VO1tEX;*4X<1xLP>|?@ZRe|Gz$j0uGzC z!L5f0a45i|_cPifWU8+T(7F|omX7HG2Tm=%yX22r@?PgTkbzB?~?wdtoR`8PF(mKk)H6HHCPMp9w5sx7ddU!;^7 zH>Q6<_ExPgr?kqVs74ynz>dngmk1_!-$B+SsNSYjr=tyx^eiPJ-=(-?i=Ad(V zg&9)TF&5DcCQtxTlX;hUDOT09;=a8g9pT|4fCo%W9dmdSwX9WiI5zUfLb^dKmpyZ$c?@j z$G^NZo3?SotIM_%MP*X2_8T2v!9csSvi%EyUC>1^Z1d#K6$*d2#(dfCUOxHs?xBB! zDp zJk4BCg+Vic+%!8#j_@1Q^iq$8=iOAY6lE;MD`qK2REbXLL`b&bhXTm?!1czDbH3bs z+4j17I0C!U$1iVH1NVS#fic4-TMd7^9T-=>NK*9V$4JthKhOal6w68n!cQ64liIv# zVkSO>qUzCYF6O#bc@!qi52LuxQ1Z?SWOI}JAwbF|xajSpvPe+!<7K(=V6Hi}io<+0&n_yVsY^6Sp43tG@H^nleAi8=)N;6m^6H5EJ`( z8l9i$SaGY6K?38+$S`}X0E4em+$PIZ;t2e&$r7=`2D9I4KUqw}VEfBMmYAT11gpc6 zrsx6&01(IAnvP413})6jn^hH|@#8uOq%E~B8!+h6v?Dr33fg}7Xdr)T@Y70WawNXO zRww-xFC9(jDJZ48L_8X>SYAjTAwaM^AEY3bPVWUnhAfj)m~3~e^5WsYe)0X@%V)1& zjP-eYey8j4aRI1qJdjtCTKL3zz|Stq1Pv zjgUXx2tC5q#KtIFmqL^R8a&=4A=l0eAU|~Wf--ms6)Nz`mgGG&NHsvpRXkOdNNYgWphhRpl0xlm3Fn2 z#l}!GRa;T6yYPQTu#{7`sL7HI46f=9rNx+ZpE*`;gvuCeAxM&!a;-90n4oQ7R8jGT z-rd_mIJGk4Ugu`mzu6lTHrBiYyjn!4@SowJS%dLqd5xxgx6q3XoKfA_4&MCY~&H2qu5KSFDy*z^0FhG}d5w6Byk0 zaghLylLiuL#7uV<;*Vt+=@(z%zsH%yissn&v|O3%oS1Q;@~Kk0-Wl3%uD zUA_&BFYEn78)~58|VwzNPnYG;!+#`j6qh;POl& zKY)5aK=hE;CN;=a{T#AlU^yPPMXHztx9>ob4KeCjZI!mgE@aM}jRY0vPONbWO&4{m zIKO|E2q09QnkzWBw;AXcvVOhL3#U3!hYhV4*dvD_|H7<#*cHBga7G^_Wb$J zulWf@*J2@b^yw17!#X3O%do6tiyyM$sg}^Xgp^8isg%r4j+HQ>ETe-F5RF=}mM4Ao zemKD_76Rx-6(DP?x~lDBvzO>Mh}*LKNLPO|nhZ?e-fl&rAYQ86$AdJ6d{k9oe2x(IfxRFJ~l5wyO*K+40z^`Mf zsJBCq2+RX^+jXDT>MR#V0rH7})gJ1IIjDfM8?zwoF#RU$GM)K0^0!pEEi64qK-PbZ zEaMgz8EG|u$`3%#Y>#-)j9Z@C8MtbfO`d21Y-)+yIJ$?G@ z%VX<94gRaLcs^B9Pm`5veu>o1Y7Mex-SClZIgXnsidN2 zrzPVyo5`O>^F|(o6__N!UnVK38zp}%2?|U}uhUWdkVUWXikC~6^8>q6f?m|p=?`qO2jb(o|CYhwo z!9NK}GTHE{NJfNMcN7`=EZg=jLBa|3Ts?tkvLhpHRmw^ok4y(%+d5v;C6k&$jSS&f z{Ebnzvw10ATL9HiX}3C>A+_hAaO=l8rHfxOk2VX`WiPw(qw&|Yt%mNHgJa-#DpE`d z#fLO?rdVJTnWtfs%grl|=9YiXFrm(e9ZEVhZ%tE*cdg08pph=YG7?U%ieP*|mgTF} zg~ylk__uBN&^LE$&=dr}hq^>+)o)qAcBG_vHD51?~0 ztxdsuX=>RZokJZQ!N!bc1uQpp1krT&7JzChZUgi#Cp%sdF=_QhHspWg?T4x0Cwbd; zyK7<*ggqq+9n=r);|0P9KnMO@>!a{3+qBg62#2_q@Rbq%;G*@ms!*i53H1nk-MwBU{!f-a)2=aJui{p!inm!ItQ ziga?>sD0xh{8)PkyzYOC$?=TPmh`1_Y(7G|0AfxR{IGSNq5gCw0Os7Qpn~LoTudgX zibH}(KTfNL^k1XO8$w)V%@Rja*FDn`$HB@WK;rn*87a zdpTM4j)ekY3&fU2#!eHWvj+*RnH_Wi#1bhog-E@zos(;ak8O}XtI;`XjeJTW;vYC; zif5Q+APj_|i{pP{ODdd1G6!}fgm|kPRi4bkL`)nktEH;X&J=nzxhyxJ(cb9jA~-@% zkcrZSkF4mxvLogSl8G4{5i`;GB(pAm#RVT)L0vtzeEW}bB2s$+{5nWwn zW=9?%w;6x^wAWYOA3UtQpFVl@*^BiTub;eF^Wtvy#^d<0uD{-8*saryq!RxCuC9_k zHRJ(^Ed1BWiI?pdfWt)%G^+N|+%2!lk!_2xRv^P2hUO#c+)Lut)i{0^`23;!)RLkE z3tE+6lgf?&$nK($Uec9C?H60cJg%tHk_F@s!=DoyZy)#4JD`i?NR0 zRdqjG9b{ZqDrwjlqDNm$<#bERBGVBf`4IItM`<=?DQ?5hr*B_2EC1*>fBfv_dj8p$ zj+@_mC`)Pm=|#%D^#FdXJ$v@(SF1jUBCE&Vn-5}$hcujDR-HdUksTwcqCk^$T$BLB z!{mRRtC6HQ16-kqb%V>~QWF9b45F$=dZ}bVHphn_S*tP}%2O>gmuJ(zMV5WKezJcqJWFmpY*&_BIW4#H7?<1hUCOIEo{rYp zk?Qi6hz~$gXJU{LTPY+zSt`#e|Isp4b+MLR#^=5gAqT7?lP|T3sAjseMMINKUyvD^ z1h-&$6P_^S1vt8-FebEqo~tw;uUqE1P433yc185ahELuVJvzSd=vJIr%NSMFH}HQ! z&Qb$}J;rHN2PXAq2U2g~b0hF^g52 zLLQ?@7T6t54pXT|ig-4WZH-*6fmMGpwR1x^CvB>n1vV_H2i@+H*Xkg(omSir4j+Zq zpS^hX<&pf;OIC5~F}zap`EGLck2ARjsW1~c7y}?Xd4^mNin^_{JSMH_x`D}6rVwI- z`M99>v2+XeEpSC^4*g6Lg35O7q4Xn7l^VNr$t9IaRFeA}cxNz0Y8(yT88?68Ity-z z3Px$*DID=Bq?}}dF(5r#66q`CVD=a=Qs;7IrIOx=5-!RfD4G=2MCswD!>qllTQhbE z$odIoO=|$mWw>i)oI(maIvj>gQnF4ZotuLH#_QKlE(pY}hwNgh)f0iJkBmUP8OGn8 zPhP(IV>zMdw_m!T^n>!tZ8v{eadp|S+uRDtZfvRT&p70WP;{4J!BRE3p~KQDMKcKn zFS~~-(4+H9#(QbGs)b zs8bnTC`qum$YF#B4RUpe1VK%2+Uf`myROE3tIoWu6r_e^OUsmf}|emqxyuLnXT) zVF{N-IGx)e9u8R(s%2_2=_tFHMGi1?x<1v(!j_(X=E0~kcruTUI@knBdk;!3%zK-x z2qIEv##I8&SVfhTA8vnLCY@KE1ObLq*FlzYt07)BHu{P=M0FU{EBR}z1z@6wV0ztuz+%-s1>Ez*zFZ)Y)5^lUjs!sg@-HuksCllx`@P*> zzPg)hJ%5m*xsZs&h`FrCwuverr@V!NUS z(49i4F6mmz%0v;m*uhnnu>#0cn5DE#8;QmSw}P8Kll=I)$yQZN1Kw8hh(+qCp^tN} zbT{$z0zx|e=>fNgsO|y9s@NPYXAFF_Sku92$ zDN+LO1T`QNFlJ}7rO1@82(=_J$Q@?SrPyBr@T4&)>{hWz&{ikUESOsx*)6lwsH`H0 zFkzZnCxPit#DLPWSCDX~$zmK5cfR5$c~0GeEorh4H`qq>*l8^2APEd>n?9EZHr85|+1>-bRJfocmPY zoE6{g7tcO_BQtned3@Uuyn1ZxPRGWNu+&}WNUF)nOK0KgGuCByc77bvO40>sUh6=| z832ztBzk}4nlHJjx;7Y)45LD(P;WAnuE^-VWwVTu4aj~kGPBf2M#P(4AuOuHJq~G|*(JaE9*;ZSrmY{Wyg8+ZMoLY|EtR1}I|uW| zDvVN%tlN95+P=NBF5h`-UAPftqrxXkw*X{7o4=h2#_zm;k$ls_yP&i;9=WS(TkfQ` z^$1s-#Ao1mUA5K{CQ4q8NY1XVJL4)8~% zcPd?8UyiNIM31P0RZqN{>X{(`v3V;wXJ=KcpEcg#rY#Y6hbKFlEDZ^Eujh|g2bGp zowaoY6%O$i5BlnW=Ag@U!n?W>WGy&Xgl~~Xpj+yHVowu7SELZguIF#4wVnaijinp8 zCt|}H*R9S7ck=4ehwxas+?*^AGvq<`+~|NTZ{{pq@U^%+xp_w#kpWO3`^ z`*tpWWHm9lZdGN$>lio(e-_CLO+9-&Szuh*G3u}+QJ7xT*9500_bl7x3$KEo1pc+E zt?7qhW;-gGo$5SIV*sFaQBYjAYGi=wWq~?a41D+f|1HOgIA=2oI7Mf$U=FPTR=^xC zo4TP~e8c7$A(lf`&8yi~b)gM9HkHH?)qw$j4$?VT2CtCn81w8l!70VC4-5E|+4wR` zn*4{?fFBMJc`5h*&j)ai)uojak&Gd9p)) z$#oa6lW#jMF?)mTwr4yg06A3@W#v}lfxUfNDOj-7gXs?5Jmt-z@lJ23gg^wJfVtk*A=>p$=cYOBjr(ay0ncsTQKGsSI<}WR9lj?>$^TXsWKpr%+ zjM^Fg(gs^g=fF;XRuyRApl+%Cdd!@En`zR?pJY?{BMx03tChe!m{;raRRx3$y$oZZ z(z6yqn$Q7T^Ss!EOKY_|N@cxf$@u6Fq&5%yw7NayXZeyuzPs*mD;$?O)EPO1O7^lm zrl}6}CpJw;u}rxRF2Kcqtq1KY za}Oux{+I+2z8c8y>BxM1K7U~y-pRhRF1A)D5<^&`@}qPJ`-;)YRa;fi*~ksdI}=?s zU^t>UgWFw|@QvIQ!)9g+Yhx!vcv^MnT*t|B!uF{SB^{tF6*^c}$+9im94?M8la(>8 zlU4w!$bkz8RS*;M5$Pbd!kmtOxk(7dC8k*gp`*8yd1?>91v+@ATgS!XV4{J+@N~KA z0&?q&O55_svPmLTEb!4M^qYB(M|1eOVE^as>C-1KFL1`KNA25DwEPf-UoyRcS2V!; zkZn?lgJ8fvAh)%`D7|zbO0`2C*t%Li)O)Oxg+r5Zz7{mqtlJHG9F$rk3hj?*HGz ziETPB@=Sj4Ru>IPb*C!6N__MvGVFuHCdrw#Vr1Y^=7M!IL!04$ll2>afe5oztjd(_ zEE;X%ByIqANFx6qd+*sSX?A7jfx{ULW(JVPfGtJn3k8J~3`G=pylIIH>OUw#-;!}` zcX7H5@2!Rr847vtz4wOl-g`^^8%ZDJ?X%un)#!fnLIMWW$SSH~y35?meDj#S*E(nK zwNha=07~7<`o!0N!sZ@ET_Dw8{>R^QC}P;UQXWNE$;jnxOqn*s=2XlVfYM36s2(uQ zyL(`G%Y-|1qCi)CC1Qa3^V*{>y^$)jgW1e+VGyUx{Q&mO)WM57@y|&bK2GA4ZXGZG zlb%8rP~`1M)bd$m9Yk)Lj|48sQFgf7u!G65iM2Hp>JAxy>gsi4ZlcZ5LPA*eo>*@Do{~3|DviFOWkJNUA{;TYUx34l)DgqVy2{kumY0|t zziT9$D|?%NTR+a(U_`|%Oa2bpXOA=q&Mtiv0kNR6Jg<&WrV9=^^+07E$F)n+#PO*akf@QVT)FoC>I#OjG`&+3(e(! z*@2FZZoyq7faJ|k)z<7owGC3atyO|ZR#p3cv({FB=|&wcg`qgK*cKl%b|i3*)U>c0 z69Ump5`balcv;uy&7);i-odHV(+R(uuAxP@n$YoI_-eAj6v@7_( zTnvDJ1MG>gAVlHvzv?L_NLHE@+Z?YDISy0WC^E9)^N%DW<0Jq&qe9>wM#Abc9+q}Q zGY2bVUV+sC!d)Vm)ot=mDI*30x={FrExC00-}Mw>tj#KtjC*T37hJ`v z8v>9rbR5{W30ab3bZJ;g?lBn~ zJ?{ppP&@1fC5!*xJlmv{wo~ zw|<=SJ=({wUcG#>?(SaP-9Hj>{03x8G^~J_9TQU(>v_@=n@W$9+~^YAv;|h{0CfA~ zKEpJtmf`MoecQW?by!SOx3pllF=C#2Hxk8i$}ViZL%h4Nj!SKZP@HCe-{HqZoNhB< zb~rglN!C)n0FDP#yNMf&;Fe}305aav>gx=n*AW&mylu zQG*qFm_Qt7lvetd0)VA|grdG^D1JRIK{ZT4{vm3>9|9@yxbO)Ub^v_`L;+nS>T~(a zKhUwXg*&!6mnr_Z0>f4m;cs8y~7 zgsejR%TQst({&v(H(jL2wm^0Evma89z7pya*w9P9xp;3#isW7i$+xEd%R@4E5YNC9 zMuypdy<)rQT~^QL7V&f}p$d*7WR=tU4$?*zB@_2r+EURh)>T)b81$j+u-I9_dk-)L zp?2YbA_o(ek@Pfw;VZ&#urHDhK~>UpI`<~S!37mYvKm%optH$5DVn|HaRR%M;s?-K z<#d<7LMsbU&VozUX|qcF)w6^FMI=T7m=t9upuw?~m}MBY4JJA1+_A$+!d+T*vSpS) zzO7xKz+M}2r;=GuDi%O&SpM3hhUe)-n<)h=SS_sY@>lAADR?&41;fkK!_`X%jj5`N zr(2z_WCj39bc<*?K@?q;r&9EkXEhlgfST3%CVtI213D3^ z+=hG--w41wu8sBbSAB4FlWg8~5}HG*rldxK(nX$y!1BXT0hYBy;j3ao$;^Cg0UW#} zXuIs*jfmiXSRV^sPDl_CaVkr0x)!X4;79IH0aUPUmq#~4JbJV;GQR?>w|<<{F8hT) z`dIQ95;z6(Aj5(=rND3n|gp;ZBhQy;bm-%z{WAs znvmuI2riw)WErRT;SSxW0Rm(Nxu7yWH7$2& zrOD)fZ~(GIN=Z?nvBA|4EYTG|1nHdY^Wc}Ha2^E`2?`utccorOKSYpxoJlw6^5w5R z#zIB?@M1=%PjbRc>b*~ryBw~7Qwi}P&aTUk=9^_iLjXuT@L1vj**+R6Kd`<5QAfrx z(iV1`jL!!VbeRJ`83J#GUev7xda3F!^q0SXPESD|jt)pQhT0|M#1~aK!m<^1Rglb5 zz$XUHq%#I@!7Hpw;_Q@*)p^iyV$K5)ne@I7>P#PC|3Y{cqW*N_4O@i5gphL+U} zqE{o?xl#AVk8@VEy9rU1Ff-fO0?qDji$z$9VZ60_T(NoQUq zj`0i0)PC2!-tJ_&qH|u5@|0U#8d}oi5Ar;OdPzMJlEa$cJlH7G+?B)_!=#dd7`ja8 z`EY4Z!BoTq^I|7Si5I$DP1Ae?up2pl-UI+(*O%2K2Od0+y;C9s=fO3emxez z%R$5PhO86P;_Bw;t%!~wWnkOCi!UDwOfU%SLpu%9m!XZIKT?4MFlI87}csG6s+ZcM`dB~ z0g(OxKb8QN*{bC?YWN1b)g%AQeO9}r^25`6R-XK+lWI$d^g5N4w(sf^f(8M~CmT#i zmdxSGJLa~JbG}#6{(SQEvH4U(X_Ws~@?Ce@u?_=ylT)N46-BGs%b*LwavWz@s|!jp z6A-R8ey#!R*@@ZfxQXl&71kktEs%KUBrX^?Ff=a$eH$!fH^oIkj&U?#+?)CQwbv)3 zXvp7a?$pFzimP>Dm>fXn@kXg1P+l4|vz8ZI(^P)6a*0LmWxKOMO|w zYDBYb%^{aYuo4Of4@)6Nhd{D=EX)xTB|i>O8AQm-`g{!MEGR?ZB_=DfZi5560aB-~ zBZl1FYd!~xTR+bEQ1W~2?lJ98+ZSO0Y;JkJM0%ICy@jVv6;^@KS@tTs6)#B85V(Zy z^8i13u18BV;H~fhm1=F7cGUwW4d6mh-)hpm zT4aGw6_!_^1bj;J?I6P)&CKw2u!>L)Jf`)_pZqgE{DW`3#~!qQX2C3TXl&*6qAOjs zcG_hJQD)0Vp{AIGzbx3Ey+aJzV$)lPOHOT@y6uy|s=DZwRp9C#-e617Z5hax_X)%* zHlcBBMMeNr*T%Vk0YvIl?5f%;6}*6a0sT#7DJs6L>L>vl2G!v@ox;Ge89%kElMWIO zEJcV!O7HTZ>Z*-@b(N?V6p8u{PFO9}d>oqg&SHjwi{u-YHVv#BqWil-40c~kg7r>2=ol(XKewHx&%zeSTWb>LDAB{ zf|f+xbi=(TBNF5B}FdlzyJ?Ct3CXY`zNnn{Puc&Ro-yx zaeH5jX>8JeK9k9!wS42|jtk%o2bI_&4Vq>SHTX(})3uJZV zZl(c+yQU^`GlgGO3JN~((%AQK zFjCkW3Fv*U75~P^?f%LBq+NAi-Fn#G*GA`Z+@`4OR@IdNtJKIweGo^I#7)5fUgBmt z743mJ_6yhm1zT#-ts!j&OIK5((p?TTN96|@W9AkTfWt1q23^xlqjr?G-aagYhahviaLc2(8>Bq_L(`7* zlY!(~#!Ynz2bsI*@W{y7${9xr^CTab#MlHyU58njO|H4r2;rfUyLQO0AbqwGESN@r zm&VaLC?9`Zth7Ozhz+4;t9S=;?1cu;orq4FZar@1rQEEzwl1sj$-wbWQXJUY2Fuhv*RUG24rNm@jH<0VGoi~bon&UvB42t3*mai-W@0xp8KSp;d^_+~ zuhK#x3`szLSArOEt4a|z2?h3T*vahwu8`}U#3>FY%!r&NYt^pOO!HPEoN!{V8pa4F zT@cc>O3Be2vYa+fQnt!^{eoA^F421FmB~SI$S$akBm=rhP!$kRg;H{4a;uU!h_8;! zGx1fHb*jdba{9Sl;nTaPkJ#yd-Fna-3H4tPGyA27-~a4Oe!xu|iLLmurBOpxR?o#S zD{i)`&(Z@>>hH%$(WgmaLb?_Zmg`Myc zIh&`POw0KwvcLRIU&4})y3}ErnWTF!LzElTa;nwgl)&Ft1U3GuEllRB{5hjHJ)J)pEgxByQaK5 z2-Bh7q>g*T#}E;v~8S#`#$aMEPx>{69OY=Ewztm?E7V-m;DN3A-n$?0q@ zLfAu)*e9>qF{+rI5O!66EVJ*QJbU{5>C1Lqwtnl8d!#4Ko_fOGf_3g8S2!ZbgKTI# z4@DyGY-5mHFlvdE*1qarAkZzqK737M>$;-Ps?r5jrm8Tscw)SorjIzK^S#FStT1#n z3;!rn?NV$X$^EAoKtkOHHvPGD^Tv;JCSsqhkL#0C*NaQV6eAdaS9x3YvhLBEYqIRx zW559ot2%F)+lHW8f5?BF?D^>q*JV?DFzQ5A9mY;W#)Hdst1z;G{&SZA5>lV4vFey5 z`DTDUqjPe-@(@on0X3#ChXk zdxWX`FZB66{QfOq#T$3My(dk0k6g!gP(|b|Ht4{hsu z`0!g#z^NkC7)Wh${N54_0GhSq1XL|~I`&L<3O~vmbgJBcxx!xI)hzrGbYPwL7vo3x zvf{@E;_3QF#dED}%R0`hg7+J+(efX^YHLOZ>ryc9&!w+mG<#rP7Jj%on%b<{s%)CM zg7&R*{P@L>K6%lv)V*#zWS@^6$K|dy1PlAQ6P90o^Cv%h{NOt+Ir;2fjCx)8PN62% zi>d*kw5D?uC}d!9>x9<3LU@+Z-0m?M80U_vg{(4vA9tetUWMc{nP_!q86Xn`SgDgj zRM@a(rdkTo(nB!8?#*FMr!{eJ|mY321Jz+wpZKcxYQ5yj&eH zT4u4w0Z^PqLNBeUP#ttt<$zM;=A&oXUPe-XZbK*RTC=DJ9-17ZOjYeHSrQ*vJ*^to zx>Qa+ovY*Ww}0^Auf9d?*JGpq`l0>0?w?8j^}EkL>tqM`5kGWXG$ofWuQNy}%c|=} z0sj8bPa@(7m1tR2_*-(iDpGDzqnK3^zt9u-)t1=HCizJXPBue9wEL)3@pj84VvI$9 z=96liu_4xT63yz>fUDcau&RZxD)~&ae26M84o(W4HAwit5*v>L;n1uaYMj*l*UXLN zwnFBsq>;!uUNLEsDOE#RWLd%IvN=dgOSp#s)g*yFliihcFCFMr1ehjc)YX0s~3+di6znA#+tgre%u zoTYwhW%SpJ%xD={wxSc^mkVqe31muKl+I-KS%-ge^DPqCnF|ahbtOsouq!2htHH-_ zlL^^F))4KyOmF=-r)B!BkJhUvPoGOR@&4&}1o5dY9XRS7q=3g{W2i=@!3s))1oHcu z)I~}lorVZbUxdgi&l(kf^Xv}(md$-2^-W0c(d$TNX@mT`B$Q7O;oA{ZW<6L^ z%u!cY;gA5=xn~R{>Z&SsnRGRsOfR{m50gPaxsyU&wEgfWQbTw@7xZ=570Ax{Y=S9L z_fz3r*QfX*$)RqKqq*T^Iqf5Ojuqn6?~$bELp)-Y=$0*R`CC>Oj+Wtn22)ed<}m8@ zmuSXXp$<7F`6;J>$Ww=MK6U!mc=5@LJ4yHxB(B6cZasF71hjg(VyJKBiec{}GE=ti z2JAclcV^j1`jrkqVCzDNDj2pgIoVrP$k!HRNn>MV-|{9 zN|Nfu)ioWX?njp{7qTROF8Igg@BA{Z*763dh(_{ARqz9(vR$>BDc$K>8OiM9`p}NV zbP$bH4QiDQNqvgH05UZqOxc2a$!Hd)E1TKXs_j%$3R@*uR~?*A^4cg2p;1xbxp_+_ zczz%E17oP4(p7bs7MVY%p>w6pz(Noh{mo!+2uD_%OmVS!z-AzS(ZvC4BzMSBMYVJh zc$c8OBiLU3CL#{9h};2XV{9Lwv z^`S;*KeL12TOxVoLKMpxQrBXPH z^U1|N6eL$wOM3Kw!yU>EUY9#6R3|RF#8cZWlh|b?g%StBRxy*scut*G#p`cBfUwEz zlF9{NiKoj27%kzAsqVGJism~=t~Xl}QgBE=~cEQ(kD;g9miY2Gn^5Jg(W}&*K|b&fq?V> zS5wzO6vOU*tNd5RvoHBiibLdE~<( zHJp}w%`@(QvXinB?J^$%-TN^?67@dbQBc7Isi09xp1Dm6BEd zP6qR*@baV1_*$ECv#+4R7~<-4%Uq5?+aUm8z2+bi*)wq4>Qc3C;%;wF_X9opP#y7b zS`|ZkaA{C6lZ$LuwbSb$FsNEax01;L36vBW>|Eu45#-~QEzFG{=Zjh6YvY^uU;FrL z?Q7rt+8_Da{ns9u)-3f+6Rii{XBj4_BHbR-XQac~bsD+_gjrBd_1>_h0FD>$BD3j= zAZFuNlz>(rUdD4ZFF(6Ia^gV@!K__JAk1_re#kZs{uKaPU+9pz91Y?2%V1pUD(B%7 zlQQ^!d^TF?S-mlVpcUl+mUTiy@^+0Crzi)jiBdyg*z=O7195Mssnz4P}(y~^^oyaW<%=l(at-eYxDac%g_psu>)yKfMCGYLyu111? zbB(_@PJn8S^5e3`t-UfYf7b_ZKgMmHK^v7lPX<#r8wJ7&-jt?M0H(TOna`B7xJDw4 zhjqBxtvS85YR*^B8DYiCZc(D9Vlhb_LQ`sRqcL9moo-)7UAg5bGg`)-pSR~!Xe*N^ zmXTn~r1MqlUJEqK=P{auJODuN&IZeWyG$SLF}uV%m4hPO?52`x;2kWLlU z_wLr}s%Nb}q?m%dc-UIXNWcrV%2jX4Ke|r4YWu(K<2<@f9>(>N18SgJlgApgEEv$v zO0y2t(@7$fh~(JuVb3W$y=ooNttKYi^E99$!df_ zhn_^W=Wq6~ZUY!7U0MZl2a#Hi1z8PCKB@S+hDHiHTX~1BB79x@N*^{#b&xzY$gEZ3 zf?bj-MoO`)S{KQBB+W{RX z8cAi-Ck4XuIpHrnyE-O+y!C)RT8`;X<(TiF2hfydr!CbU$2QC*q*H3Ap%%GX%8E;&=9-d+@1NGkD(+`BVXN z<{S(e`KkI{X*V0DW|3V|wyDcdrDsCQ9EUng-rgSEr-AZ3B@5b2BsJ2easmZJS7!lCi*Vf@6|s^y+FCe)uIwYFnvi>?kQb{!X_T zT|E+K8IRxm{_0QXC$F#lG?CX8qch&vf7|X_{&@ zcID5KQLiguBUo6^b~A-ZnvzqHV>?H=)}=#|Z(9`;1i)HQ-M%Ep;hQ@b<{|;^K|X$H z0i4gsoW%a(l24xW+@-O(LN}`3u4~yS%PA*4Y64#Ag496msIo!%x(4;{T9s=pPlS=I z5{sg!?Ar`~0$>60<+ey}hsP|daLdRYaG04yW3KvoTJLx3d)EgYw;iLs7fA+* z@>;M=CEx=D+k$i;byvU_G;5L8#vw+YNF-a*j)z%skd>v~TSCs#{2Bxfb%Us@t3t_L zWN38z;Aihy@RPsGW#)KTvxjx%d7~WX#lOnftrVw!Vg+e`^Nynr7o{w!uJ$ZP0}N$K{AI;m`;7;OnE^Pa@S`XSm=bBPU$u?;PcR>FNFY z!PTMKt;g(9pJaRTNqz?dn>@0%kxN6Z@)*jxuWbpG;3a1>`GwldfEw_yu`1vdRFudP zP$8y&TH3I_UWrtCHd#+YD83~c~!0BTg6`blM1TXcda?N};9AT<QB7zBxNMLgWLF&Od1< z`&iXi>v(s5V%sPrmH1HUCAl|D_8YJ6pFDeiarg4$&s@D;JbT78o-1i?JbG7JFh-J< zpVxwU{ReO18n8psbjKOgZ#E6svg{};ikzhDOPypU5<)9fId8mDGdwv}U+N`seYDO-;TMzjrJ2-#R_9R(gv=5a0f z?vTBpXVb{CB(jjBXwi_q)^=j!+Y)DMPw;fH-WAIEd!QevuU)z?*(G{6*ej>H#n4;?uvT>icfKK#a8KLR2y5!R#=0IxJvax2m7%EU?qql3yF zQ4sZt1@NMvsx~4F@ z=^jSAp*!6(=-MDjbX|(KU5)4j<*3qfzL8a(>qzdgwz|Lclc!g$F}EJJpU*+iJJ5vj zzO-GwCw;l^Kxg7tjgoJ*QSz;SUkW&%fz!P^lZvWk44X(^T{e@dNvEM@DP?z(o$3ub zY&%IymM_yos6u=jBG+I)rinmJ!k@0Wo0Vo+7}=-~X8^2QIqvp$VFByHCuZpWxp-K< zL2|;1QJ)``rLzM%1DseMR<`Ogv{^0+CeBTwDAKKFb5u#a8oY2!W7q`>|!Jjs$<;Yn0nZv+q&FZ zJsq|i8I;NVCl&OxB#rKWhjWoFEtn2+B!qg^D!KXN3N&slgz_HgvRqGU-0bbp)y*f1 zLc+I-!l#$6N+2c06m}<9N$U_^Op*s0j?7QwQ9`g%?~1mnlTR)p$9a2zGS6g6AXF_2 z{M*oJ12cl*&#BfcrrKH-bc;W3Qg02BE`R?A?*Nd0UwFkM!6G()8C=3<8F=S_E-|GP zoX#wZ2OFkj{o(k@1IdsvNjJdO3M1*;5$a^?HWTT=x3KrFxyrt;TUSVsWlD2^$vm8t zVeC^_6YvEK(dx73b!A`c&{6Ry2`diBv+<(G71BO zMTzpW(|kNS6TCd1<*KY*Cf5&8PwIV=%2?`Za%WAG?7SR*i!E6G{c5s4w-erY>>g<+ zw5N7L`&B#PSM7w4wi7DEjmU~M^81o!R~w^(izeHv+rt0|pcs$(Hh2eII;mJnW#qNM zvKj8&N+th>%>>9c#8s)AG>~FeH(rmbHI6(6k2?4$hBzOU+^RNi^YRaT@DB71zXxs1 zkGS!$4#+`&ykTEc;Vw#}De*Z$R%*LMSpY?uHbFU)+?q#A@^o>TCumIyDaN@C>V!4N zsk`hcq4uVP1b(hE&0*n^ktClhmjP=M8zgF>JqkBI{Q6rjfDrvMR#wjP0%s#`r+$5~ zIWTbOVWBKC)BvNyc}Vg2m23kM@AZ_?RSCrEPEWc459HJR=jkGCtv4tUmd(%oM28RJh@iGbm|kgvoO2nN7~tswFC5u~BC2vWh;`_daVJS(jS+s8j+SKt2!ovKQ6)qlb$=UC+wDq z@B9I4mx%6U_2$4DAp)T#8VBZH145iYPiJaf<&h}8Wm4+)(l?PJiO$ntGmzJy6gi|4 z$;%x;r$`W?%f>h*}$)Ttp#QQpy4)HcQLcU)^LJE%DmK(W$ z$kjJX|C?*dHQ@D%f8B`k^6u#~R>$|&Rhi?hNAb};U`~7B9jrW?tLR3v_AZ?|%i!q9 z3WyBlY$PukT`&2JtChrODbGkGMQVjEOD*3el?iNejT797jVMX>H!V5lQw&WV5)2t( zG&EU-0xv+&BP74BjseK0Nlt+(noqueAK8;Pkb9nGMi%Ulr8(k|XIPbCu@%MFE!<&6 zQAx~f>(${A3J^K=!vr4qRM^d1Gb?XtU<~;ahz{hjy|maILGDVv{2MRZ-TiuU-8pdU zVf*++~&Jis(n{*ZBh5uSTl zB66up*cNi9#t%GlgjjanX&hA^q!=!_%2u0BwzpjU3>ZR%9Z5SgZA^$Kz#d) zElc!qRS(jiUB}aDt*WF$#!#^bWH48=O|UsmjjFiYl;T)jEC?t<4TtmSFnI|*!N$Ci zI_*~5>@bq|6N_`ONN|6DNV*W6rFr0OHfK2ZUdhzmdhC8~Ite$Isr!e%3@02NjlwL4 z8l==k6f#LfIdqG4+NN{5uF-UuX zW#x(-Mq!9N-jJ|nmV0L@k*%3oXHU|mtq4E z$-ML6tumz#QuZJ)UH-do9|uKInK%Q^6Dz|IC;|4(u(4Zz%DQl0OpI>+Y*xd*`e9Vm zqSH0r%&B6w}g1$gcS&tA}aF<-gZc7^jY7 zb%q6Cf8sau8LmtKPn$z84 zsBH6^7yC%1)-ZT5Y?Xo1*5N0+iBx=`i64cAmA#s{VLdUIzT$Q60vy#>|p`*)~X*3t*O^1c_ZhR$Oh?qwq&% zaPo>X4}6Z;ROBHI6u0UE=nOmTgH=Hmkfcmafc>hkcoZoxlLNl_nXUWTa`ArMvE!b6 z)LyOcw;$?aYu%Aau7c04NAppTmro!szYRN)8(U+(=T4oEltafPW4_v?f)DXRoG9V@W=N(jkXG(OnJp>+DN)6)j^e9|HyvzKvJ*+$&R-=GQdNA zd~Jp%fti>`?2aVooOQf`j|r^W3@k(93dx6EW$YJ>wC+N84T0xr`VlpI#%8+p1C}&j@aINBV&l!n}y=i+0s|VZL^&CH3R^M8*?JEtrFH1x2(RMd&qX@l;3w|;- ztbD33Q5cya9j2(_eur%`99Hf_Zbbcm?6x*{QiRUO!4?oNlhmEJtB8-<9le&_$hKJ3 zn~`W!c5x}%0#SDHDX576wte2!H-4N)wY7fvqr3L<<3IYzBXbSYfEj=Y0qC$3Kh#D6 zPmOa(m6Sc0rOUU%p%2rC61U9Vm`X_JBt8&%di7)+R^ZWu(MV9US?~#qlZPjNQ$@Sf zpTJuYBp8ION=E2Q{;cZccRfgJu?G%mXV|ynpG8&hQ#uWV8?qn^j~zw&2TOK|SIm^M zir^J0le(r`;Ej2@Pz~HHsIC{NzVYLn zj{$!CJX$`o^CUCtpe^)i+EyihZ_Gi>Fp#b&G3(+Xt`?$NTppRHfgtz-Y#PliD|I&5 zLpW-j22tFA56yC|0k=y#ylf!MyHvm-*+i;TYBsa}vr><5+wk2V{N6wQ$A7Plum7FC z`-6wpq@SG3edka6L&x&{{jb08i|>5n%?ZL^{KtORhrjT}9wo*$M$vA6*4R;slMdmD zCS~1}RNt_OMYG4f%XUN}3+nN_3RbShTc;u$X@pB}Cp*JdtvXR>9APtH$e|`2YgLyu zW87BN4<;Oz(ZOETu0q!WyFgrMtBW1#+oaAry|jrZFCQd)CPvP?Y9yIN#tnoo$$-hg z)m7SnGtT9#sF? z-IV*YHNdPUCcPB93IK;--J%Ce5!2zfVW&`%@5}6@61aR!;{FlTra-bn0vCo>)$+C}TDHBP`{X)Hm{ z()3Jf8=PjbXh}|uY}9mPP44E0s$Eq&V$tQv^O1|9^i|n^-T-$N>VjcQhps>L%NZdV zVwq^BD(!u_{G*R+61)Sb=qr%+6-avrKw6ox6tkhW5Y_RIq@gsr{UeyaDJEG?Z1 z?4oYZUL%<&spuQ(TuQge%DOWgHVrj;=rjDQZjudaHaeqIGvW&iX6YsY0;zJ}l(nrt z(^UC=7keCkdI_Ih0BWE8GX3b6`A0qFUlMTJx*Bt2HO8ZWI%AMUTqA6m3H5c5l+5+9913W=niKleD2)+ zm*4!!&yLnWWRlI*D2^hHB=VV6xYEt_mRu(Al)b#Vb!Mx}5#*HBmGRIn#%TM{v$}5w z08LkampuGB)Z>)wqS|eUn}pXu%xqF^mgZF2g@|s`TP5V{AS7!y8!+@$uve$V${Ao&?If{F8bL!9TCE^(lL&z!NhkY`Cm`cPXW^VkNSr(nn%# zs+uj&Qm{ShII#_3v{c!^wruthAb`OoV%FCAS4e)0!TXOEX0&EB9ce)e3g0=#dikgH z6d(eoC$Sm;S4r5D&jEYM%t?1)%p&=Jv`B?jq7J#L)jzV5b>HiDT>NTkhbHwQ`ofCs z>c%E6=%!4;pKPA^UZH~OCEhPDVBU5)=X<#P(|U@s)eit!v^qE^N0Ay*BUzBe_&~m% zX-R)FrNRav9tql+9Q(fj^neMnH_TTTl0_pXuP6yfa412PXW4472uw8CKJUvvdvuz6HWe#fo(02p@Ae-@n^>X!^EL(p1s%7=?D zF_VD|L4?(qyi~xPz3)kK0rB$BA5lxvi?C3+&-5i*a;K_LnU}lF3YcqGqBIm}H>fzX z;#C7XdDSF{@(e*uBXGcfTDJtc)2>-}0(t~$i;Yh0=QhFnin#!uIBPD9y3DpwepWoK|-g0p{WZ_3qool&NGBX z@-}RyJM4+lwyp~qo~WfpattM|MIa%ASvo?GwY%4 z55!8=(RGNCl&gB9$pc0e3*E3AON51;lK>7xr0xWxh_h^+WW7s4 z*McC2%fEi?R3M9&poU5<*D`8etj2)nSbSblW64_D^+Dz*eu zKJQ*UoljEu3*Z&Mbd=|>-}`G^15?}iBdp7Sf)-Ls$g#lP|9 z#k1Xg|LOCefBaLweR|DVF=J7sX6`dahHF)s!qZ(qk6enhY$#| z>NV4WGsIY;cjVow);P%bk{fL@iG(r%)ZmLa<>)4HVg8XP5Nwnp`67Vn*{dqa-7DA7 zKoBlSe|^|*5_-~Ecmu%iFje%LA$C(A-6QF_+LAM%s+Tn$_=L}D8sT%nE%0_jikCKE zbTv!iK~4rzMiBNT`()uA$cH`myL|JZ1>s&=A0J)y_1$>r9w~^dr&j9vr$z_Dzj=T+ z`2;vYNC)lqfFaGh)N=fmN)Xdmd0z%reMRsoe;BgPzE!6L^kE=Fs~`uMzw01^0Q~~u zfXHtzQ1EFTsWjh*yJ~Ic|vu14;mKAap52W$C3a zh`N{5mt>%dy0qkesCy$dyuj!UY-Fi!9_XzTyTTFyStp-m%+LT(D$WLL7AeO{?~?Ix zf6z3L;4tSRHCPW1A~o4uq*?3W{{VS#Jj5G{QUT`)WDHPaIroxTmeVk@Y@p8aNV0TE zTC5UR5gk##mzS)Qt{P0+8}ux-2-Z=Dq5*PwjN;jogP%Stme2LcQepCS3-^u3?a^Xn zb1FuD7uy?UCpPt6__A&~$1VzhZkU4Ge~ik8RO|qV-_kOS9e&0@dx%Ab(@PCz^J>LP zU0Igd5C4`v)H$#r^@|Xu>n9(?gXZ*2oqT&ZMjgIzUT=jUVkLysB4MMz(z{DCI^Jr> z7{!>Bw14I7-gLqx34xWO?#ESPuI4gc0GHduPdC&|SRm*o&gyk&)wb^R_;Rvre^Vu; zuVq;%j*4FEx$ov%?e4Dq@X7w9y?V8->>O@Ac0V8Kj4xr$k-^zMc|*P>b}|j&mQbOY zp1bI(6FS)$h`AX8N&7(|VRYH-*5vEsLti6Q_Nz|Kjsvi8)DBBkcP}5Msa^;vR!6&4 zv(8Fcn^jP*RE2j@`_v(pWK@hJe@!r`WvJv^2}Oq1R1+T;+h3mW#SlU)BzTQd;p&FW z#ZwSFnrfE;08LZGoRZ0ibUT7sbVc9-v$6; zno4h2Iy&<03n-?BF=tpy<*G*Fs5e+aHb}kpHrgB@+$<%#DbFBAf4)T7>(qw}NLgO4 zwfr;vgLk&rlH({gTGoftbE3ab$(0i-60Z=Y$@uP|^- z(WiHxTwQP9c--DsTA3Pf93#BFCEE4orBt2r6m`g8p}+ERg?GjQr~B}aykOs5ZuU!JPVVt ze6nOp6)|e50LWJHaN2i9-~3wcQ=N zQ+2jgmn|0HtCEUw6fNX@UU5M;CqyfsvT7fg(PHD$k%e~?pS0qr3diNpf!($6L`TD3xkrM_|I(9P+j_GqH)*qj9W&sAW*$cSAX z5Z!vn9$9MTL>S7uNEq6bIjOFp+U!tql|?&%Z8@U;)^+Giu=WZUGa~{bmP##vO`zD~ zEqk(7E3XC+b78o<>H(K(`jQO4U7cC_IK6k^6-1NQf2u^gLJpaav%}>wGs%9>sT9XY zPGsNyzZ@KpwrwXUdsw;1>^u6@Rj&)H>}=cCr_(Kb&bwIIOZ1Utkq~*O znDQ!e=k3geT$KI!{F`Y24iA@94PR`P0+?Gz#ZlCKbJ44NmiF=l;K1s7fEqg#+P!Wf$mik zD>zy9AW=3lpo)<^?*!si|HELk0MITl3C*kG1$N~nw=~4IhU6~KguyyB^d{NZ7fHqW zf9#YTRbtGW1ID6dWijS82!s)(3gjXjHad2U1ZE$W;8E08UX82r=#+g(2ohyfl{M+p zfb3Ok2HFQz?OH3GR{p?OMb*#NtB+sI>to*=kJ_V0aPD*j_YOum3kLNNIzuY!*=MsC zNF1o);~`4ad&^sPhEXan43%mHqg%T$f5YKWlmXf9#hd|Kbd*U7QAsLD3XnrcQNOwE zbtOj%0-kH4K~1Wt123PCeRaMI(gJsx#adIZHxD%q)sw@;+fOU|<(^=%kV1*zYj%i$ zQO6`8rFEDdC7w*u+lMWZoH0DyV6jBK3L$ffhqJ8CS9Q&xZZ9{QeN?&g5q5g(e_?xM zx%m@U@b4m5a0#d^s|8=wRpYFxA0v~VR#*4;klFGmYF0DVN;=T!+P6iiJiz0<^Gb2e z6wlxIm0*k^Z4gHa#?I!59>T}4{XvprlkN&Ot}|Kw<@&i}M4gocH+Uq;iBQCY1=%V} zib>m)~Me;L})LxclJ37ExWAFSbyPn98sSIdwkcNt=zQnK_I z`nF>d6z4d+?a#`cFWak+pS*hU_DJM+ea_Xv`+U(nfk`29P#=xhr*@z#ZU zS4ltvKKR3^n53nnZ)>eeG?^%?7E47L_Vse2UOu^$YlqpJlueIIGuY)af4#*Py|-26 z{ETcVE;sp7OQt4|6`l5bxzfg#y8mXmP4#@R(l&Wg!k4NuHEL$ux)SZNtHzqoQkN%d z5Y~{2Y=3G}dJCOsr^@W9T7X`Ub2|k}{?k>^EJ4@lOjhvN`RK2O6y|-lo%-g{3iRZN zbXP8hw;sAj;+#8yxVIn#fA=Mv!X@APR7ZBmlKF=e+G$*NK%oHv-(&}MMzB%Kk z`F0g`s3#(YwRVk_p9bVZswR2G6ns zL!}x=O^r@5m|GSF%j1yG1fv@=c3tLdf%0pI?#PpaLR_7~-FW2QSK4qWvKj+0s-6u* zmH~#iEY(MeLNTl@_CT}=KF!7NyG_y)N})2%UWzRSd>*`APS-JVzZ+{5fbk0I8E4Li z3L_YJIq1wewmKiBf9&5%I}6?)b%8O&KMM8@z zh>Gf-BDXSal3w+?IO@U4z9u;JcMKu=LoYy0JuFozqw9W_KerIUt@@x{&qpJ7>($+r zI`OT?>`Lx{mE}Lb*uMVy58k=emQ5w3bSX2*rM!Y^wye!;e}sT}m0B@zYh*WNcvE&U z3rMfo>?)0r!DI#-Ypxo|0_Z_has?nGK}vqZoaWNJ@{N>BRqp{p2Xd>eBc2aObe<+< zYR~_g3eZA#vq@>wRe(N_+-l{JUVKzFk@DAsvR3K#*6j~v>dK4KP(%#UD$fo6!8BE} zDql{T!i&Y$e+_8JS9ruIpet`#=;d*FrEfpTD;;`xpUL4}sTJRNBp+2PHYc^>w;{N3 zYqi3!#1nsB;)#g}7$hRgfLNJXnh7CFIkLmTHdEb#QS!o54QOk+)EE&zoeN1i^Cl6C zJA6jbHm*o|R*T?h8tGgnn=v^6^d^!*zd^~+@TF6mf0%r&788p1KwKuy?+fQaqRdz_G z#UW?$NI0k~Xoee5ISzCAcOH6ma{vPG7@<}?y$95%8Alm|0m`a4YbA7Ym?uO{;TdBg zV6~Gmf4u~Bmr@0TKcz~r+%kgHleI>`Qsdf;K~p__bXCnSS&*sA@jL=_F8}V)(Nja& zQGGW<+Cb8_U zToUMPXvKF)yOFcDyzJqw!z`J2GEx%%WOQrd*#M+VBCpLz^q}se7bNhIBlQO9mpBvP zR;seB6A+~S_OR=aznW92v|;z9oFvGge=4bSCF(a`e){}}s?)kYk-Y7&J!)WOPX<=+ zAbrwVZIHVrj6!zPemV9BP_%)?B+RY@J5`cz39!aWpi>h}Ch@D;b!XTx34BDqK&&%L z+rr6CoSY{yvK^~*R2fdWy+;-Zv2wt`tJ=`l`FLm&u^DwK$$Oh+9^Wgh8=z};f7wYg zCA#hNW;RlbD96~@$Sk|+Qbx7Rsw|Z`mCOpduJ^V{>eMwVHq>z^b6ckT(zo18tNgpO z+Gm*NbCK3Jo;`j3^kuuhy5zg{uw5-TX(NTtEw_i?zjMp2OI3xTS~^YZLWWJz1AZLm z+)0ht5vT=>Vq+5XCrB7x3i1z7e;Fr#c?pbHBYptx0*?~enG78bldLO9UL6j)1+JCo zk`3UpF~2r0aN>Jq$b5F~zVX<-ue}{AgGy{0E13+xq))F(UMmB;Ac>GjrYJIzlTd<8 zDh~aGvWYk8=sj3T%`Oaz_e&R1Kqi(70Y@q|kO5W7cik^!nNKfZ?FPcGe_$tB?Y!oU z9N?ujaHF&goQ<;Oe1Kq~aM#blXFXeetDyE5tte0WFvX zfy`D3R~H91SFa(gOC=9Hs;)DVk^g!=gRtLXDqit)Pv+D6moM&*Nx4d{Hy*)93%A0l zaO-D|c1Ja&DIFH9ItzAde~==Nk$<$5T1IrDCbd^xVuJR;F@y{VLxKbozSR&6Sk+-( zmoK?aDJ+z|%Q0cgy|Ba)jH>c-gi+Npb(`Ut(*gH}0-fy~Z~Qpt%aZ%H*OUI~-j8au z%SL%ft*mdqWa_w@1vfbblq_L5UHY*gT!kJ_u%QQaEy9tMpGd!1fBx@AY$9}7N6Th` zMVDDSl`QXc1DJOxx%I{0Nq|&0FK~G>e6;lqWTNhY?Ivt90xMGX zR%#+WMwwX$b^L~Mf7K~=UaynkV@xVQrzWgbDy@Q1+5|<)!Hc~Qx zR?0PV=%@|!tAcVBFm^@E0@m=OTMJ~Aok{H@xFIj5DQT}oMp+Z`rlY>VdMLqyA!MIk zG}u%22|W-HGFfJ~38D_An{!=M)VU3FvNDuukI@TjEtV;HeMU2cxlR@v-i9r!Nd zfl7=?K^9^ssiq)Zy_Dca_GU7TlkH z6sq*Q7vH~McTe}##oDb$?|r?*&BWNIWIY%rs8%S^Z{V)Ue8p{5_3DaOim$R@8=j1> zqwj56k-m|ue>$<5CV^6NRI`)Z*GUH|95S;=iYcfVeY-q|BeV-CIElCqDM+2m2E4pU zT9JaHYJi3BDVirE zgEHUS60ibYnH)3UM+VA6G9SxZbLNG=B3}4R=7LvIf9}TPcD3H>i5S+mK@3&Q&)|&J z$ki${^u898Y#h>L4RWIdLI}HLmzF1}?OR)SLl4VVPR9EYE@>|Saa^zF~2aX7!itz&H zgV4!cf9{a%YN{rXV1J4_>-IkN9HghnGwWbkhf+DFFiFFzSFsX_wGu9~Tgv#$^|5*P zP|x`9eK`%e^{`zn`gpoIj_;<@h2^XD4a5m)NWxD(nnup+{DMI_)E6b3FP}<72qafV z1{f-)WGX-6Fs9^%mm#F}CSNWH8c^Cn2lH`Ee;{Fs0QjF%)V>TNiW^`nd9$8No=02~ z(f{STjYnT4FI0dG8V?`wzTY%8ge5H>~B ze=wQN=6Vz zz0+}e-^Cv#EY1V>?!vN7j8u`}&-@A&!1OJwE4K&v=9f@2c!x~o70x8IFa!MrC zL0EEE1CE#4EWk=_W^yN-+ZF3n7jLETJb2*CfAnPtX-SSia{Q}B6I6;$Lb|l(3E}*gxgD8 zq(_(wJgZ(6Mn^(R$=X^-+_NW!S*lfnmY)kFKWd*|7vbJ|f6T7-oj-{$ z__raxpwoR9rC$MZ>SU(A*myg-xMl|LLs#1z!IO()*v<@f)pw@$PqyGNp$B!Ge?WQ2p^C`tvF)TCPrhYFB!&(_BTjpjbS$}VPg|2MEs%C= z?`n%m?y>c0C9L<|fsw8G_Gh zD_5};TY5~;%dRFi6;i79Cg@lT!01|$puAgB%O`kPRl~A&BqFzne>~yxpB@^>o8_@& z(&R}Sz*nLU#3eg*seoa(%ILr_(pao6NZFharcxgrbn`vcH5EqMuBky@(p!bR1anKJ zFc#paV3x$7VN7zs_F*+PN2z>Q-uUvL=_w>;A{Bnms8?q-oWxR>L1;{)1NQg2_Lj{q zA+P6AjE5BaC4?3ff9T+4Wh6=LJ4HlkvTsl1W98f3L3vI|HX-lGSQphxe=|VGHj#+{I*v>pjz?#E z*`rB=+ZZd~0CMN9U6yB-2Z5{hDfkmHs&9^U6lp73}kj$t`e^B0483tLFQzFvzT8Z1eH@Jpf ztkD)@Go8n;Q(6LAT?4d~TXRXu0y-^WPZ5B0W-XPdVT2Wuye5{WII>UGk}LBFdoF$v zXo(qY0M%AR9@3?UF%Jn?j3}eo*}<=ico(HG$yCQU4E)E-@r-n*D#hHPIg;@pPV3mZ z613HJf9aviJg40GIw>2EnlvwTvQbhU+ z2-S_3UA^&DrNgPyHj{dimMz8X)d1j?l+6J#pE;FKWIT7frk)h;q8(qip-UjEx7A`QPS z{02(BcRMPYyZ4?X!&}WID*~OVhaBPGK&$_Uy*K@_E6c9@(6UrgRkdWzuvUistYT=N*N2%#`7VAjERERdRl03YiB;7D$3old5utZ~*ie ztG#4{wINtt%KJdTyMO9HFw#7duq$&%dJHUdfP`grAM!iV9;d$KUlKlyK0a3EfABj< zilmj6VmibWw-r0somHkf4>mi0pB*@pyw5vHYEBAG(r1Lk7D>bb1?=5FeN-6pdQ$Wv zL?6_xoCYZ9%qz4cDIFby)#Dnh$u+=|#blc}tn6YY;PCKe z3B>OXDh78=xN}#vKZ99RehYNJfBR<+=K>;+F;GnYa>*YIuoUE~BKxDMigsWDbWHd5 z&F-U__;8U-@~SZ;Cg2SeG#W#O-QKM!V-MFMhN!e_e37Qs4>SeYtl6>fefs}e`+`_(GFrR z)#l=Cwfrs~H)n!53zdb$Vt2u)+#(a^i4+i4Z;hKW#RFrqw9ogpw|<=S$;b2c>5ErS zl}fJM><8WXI$_=k&<3Zov41SD?hqz;DO+e7qNfv} z;}O=7BOP?9vE|Ejq*yt0FkZSGXTcpR%3Tc(#7fXVI~uab;6X|hCm_CF4pv=FTI6do zN8~e%&YMjydsaT5z5dT1c(4GOz(^{kBFcL?fUrZ=m8E_RuT~z0e?c`^hPY6O2EcZC ze@$qnsx$H!Aq=U=@cfBP#fKl^La7{}rwi_-V$=Y%mGoOxuaC~dAcXGjU-;;gkKTUU zFtY$0nQ*j9c2Y40ah>exr6Ca6Wiq!@EC2=&M>YgY&G~X{BQ>+%`HCI8Izi7Q*#W2n zAj|%DnV1PHMvdx z!c4FscF79K>#(9S;1Zo3;F(x1DjZ}}+SHh&b~NRvKGSjQe+)?6G3vr!-jyIDfG3|0 zsv?z#JiX4GW(C@0*f!)CO2F@H^8Hg2xzR~y*gBQiyiZL4H3-F=#4j@QFp#)%u5h?l z<5hpQWbv@t=NH9!Hy*t!CuHf3%eTire|y9a^nlU!l>*Q<`e6VPnRfwkrlCW0FX_8# zY`4;0XHR#Le-;3&4VH1`?MbLWH63s}l5T7AoL0Ma0Gnh3l#tzZ12^~MVhg%Af=;KJ z?9cE1#lvAyACsXKU@a)bWafcv~6;EU=jmA2UPb;vL>%35R#;ahfljFIKG?U1haf8D?I=+?fRhh-YO^V$GlmXJ%J zzhvZI2|(jF1L%Nq#In4NT^krl^4+rXhCig7TmeOn0o{uN9WrCw5+(9LbZeb78j4hU zU1PSrB*KZRk`=G(?qB}slkdItniDc^kt!spt@N!E{OY%SC1GTs4gfDOS`wA2d0P$i z4*OhLe;s*}yad5VI9F%XWp_JbRh@^DyWC5pRx`Hr878Y&jmN&3s`A59WZ7xYaezr* zIfG_;5jkN8gVR&rQPKcp`UWEz$`%gtAz3)5zCbsRw#y{v2y1=acc-6&v1L58stQ@Me9u ze;f7T2jFVW0WY02#fPc@rI%#nd>N0Dtx#bYAuWPMV9~+?y$Y4pmu4VAKv8vC*c{Dq zj;da@xLx%F>;<%~LrQX)%_nP(LmE)NfuRy7i8Ax zF40>}fnJ^5M8RnO`kw&-?2VxhW-G?3Am zeRnd5bxme^w#qoMTUhSeMcgz_Iqt}`e_R^_BFW%F7YsRG+CrwS+9agW&AIIB_uKf% z!^_ova^8El9=9vd&%a@S@c8F%zxSAcG&4jd>S#fp!j=VZQH(gE3avcZiVD0?*a zTN$%L)78&wO_!PPR{u*eTZkw3szWcfqfYgcA5LxTW2!Blc*xL55sbl`x^-@MfB)KX zq_BP7>{6+|`l0(t)xxP0r?4w~Rjnq_1%}t7&MllcY26(Tl_t;X8mN1aDlHo-bps7k z4}}>pM_JgXk+P%(RA8?23h5og7AoK1tS{~EU;k6=y&wPPUwHYGPk;a6cMoB!cK_+a zpU^bzm;QwEu<{Snt$|#;eOCLKf6k5!Lm8^KR#Br@pJq4$8~Ak`Qs+w)G)QlOsHQ63 z1uO_T^YUN?A{Z|_`My$tw_6A}Ejf+`$cM^%Ndy^aa3LzDPVWhA*3pyk(ri1-gsUv5 zWk=>Cv`k`8QwMup4Ff~-1P>GX08{DE2NdE#MtfSg-GaGG<|#U$kouOPe}F>ZS@KFM z`>b-I){E3LRr}#lAp9`CxW820x%J3h9+!V?-?&}=-s>-X`+ZBG0L%1RUxxet_xC;Olm)CY!r1T28E^qSs1dd(!F9hYPs^R znVsI{h212&%TKj^_iwxxe@B7;<~zul#6s3#CynQ!OGsg?E=@TTN%qR$QsvkrhU8m@ zHCaLw>#3>O$@fxWZt`#oI$7KDDgkOPMZsXCkz;fy6b7fkv zi0ezf5EZ=4zz4(EJll8~HzYIcXRy+rvz8qSTg_?+Blk5q8oJSd%V$-IMN~*`kiS)N zS*>m>z-2n8gDxdqC=VSYm_;;&a5q*?Q+Y7tlW(eaRacrWs-{}_b$<|~;6cn~<>l4D z>O2Ivx5|rKk|Qc;e}LV3`H!E^OMdeY+Osd#6V}|z`xl=-eYh+sy7BN`iTdVaYu||a z#~0qag=Ybx8iW*gAjca+RIMFS1IZ=(nQAkzZ|a_KOBaa|wDwTpY_%C(4}jqq3}bXO z5h}z=dfY|+C=l&d4_7G=yPUkEN(YBrMzb87u4q%pOQ5<)f2wYys1JlyXC=|1z_nE_ zUL;7%KhQ0myn0n%s2^LF-8$=V1OsLNP8J7xZRGk}(%EGOsKB-6hK(uu5(- zK_^Y z2T+X_oK<9%3q!R(yurmi*|7 z1>p5VdPysS-cBp>x}*Dr_T-Jn@EtD7k1iJF;|RR-GJAEt2O(nykJP~CJ$P;uUF}`< zfTWqtkXvtSE2SM7Qj$7xbX)lDM6PM7Nd@D;Q*D;MvC|zSEZB+LR#0Br%g-X01IUU| z&o+};e=fS`bikcdji!>X=nib>Opq#QVzx)KDzD5cqn%S;MLDVvW=o&3WY|D-CPRFQ zkb`B{Ogj8~;0h$;%$n2$U{>!J&uf)k)kKa37 zl7EgR`S{-7VVI0+GR#4VW9p{8Nt!dM+K7Kyf3ScexyV5JaN7H=ZK;TOCtJp~q>$ty z;UNa;`;BE`c;uxGBI6G`K`*wqErZk59qV%t!!v>vZU$y*QMJ6w{#eO{8^O_1Cj45U(ad5|SlQ&q#8j_#nF zdv+jn@ug0=c(dVSj8#g^xpikf!lJ*1`t%)?f8Z4y>vI3P~O4Ks@=agSC6E$A$4Bf5SuK z3PJa{Q5Z-bda_y=BSZ(T;ey+z+~*^!rIL-#QVVKNi1LeTqlD~r1C@CIRzZXdL0G2SYJp0#N`oj1 z8QgRB<{MQTH`I=~Yx8rNn%XSIB&|T18nvXasGxx0rWQ^sjUOlLA@8Eve+Y93>e5i@ zYg04M-pk5Eq&UluLvWHn9Jw_~v^5=)j3rC2`JBCf^Q&da%zg3GC*ECjr{8$^-Z7Xw zUifch%LLT8?zHKwc{9e_fLEc(zH_sUxfXrh1@Mn62~E;Y@A{aiqGb z>(QE_tBphOUN#Va{BpbukhdPbceot?=F@WgE^@X3JR9j6SE5PLf60hpjvc&J#avTT zD-xNDDzS>{(pj=IUFujS5Ty(q-Yks_blOLy3@q8YvSwG413$rsd6kDAGE{0YsWW9W zA0-~wxv6$}*~depy-Mf_Av&Z~Q}=eN-v?sO!qin&f%PVLqz>)wO-0^Y1;49o^@XKj zi*BFgvPKBCs@wCvf9jUqcZftWvsk%IK$RgIGs`WLfP7Z>dvi5j&Dggd!FLQJzqug4 zn|y7O-E&&`dK_2TOINH$&1CZB29cY|a554z%SW(EkigU`&s1PGJO9vibU|lopd|Gr z4I3YQzJ1b7-dH-kNxJ{`46Lgjy35~J)$5&?Bs|$mC`py~e?UJ#Pl+og}Yfp); z$iPkd-h4pD~d?SpZU;oYm;0hn4J@aOHK7oozNb-v&=$3Lg>*c$HPr zH~jtQo&J2iBrg`^jmPghjF5W!cWzZ}yOrJ^Nyph?{qC~tBWvVRTw`<>8+xo>a+G%| zSV(n?Q3|7~e_kdIg$BPcU1dj6O^ip0yq#*~BAdprij3(=R0hx%aH#o za`G!kOh?)<(V2nzc7x1XmInvPcs4?u6k3QV-Kt$_*aicQ2d&<{?nUNwq-7^t;G!aH ze?U$`mee;=o&+?v!aC zd>n%H?A>e3sRh5W3uWBhmoX_x(*bhV>{>@He90~tQiX~|7?xJnnyJH0r&S4ca3)G= zEQX>cO+cPpg|_;fRP~VqajRrCQgxXyxv)##zNDPw4}Lx+hZ+>$EemP%rSd^nQ(Y=D zbQ#Dvf0r!7WN$-&35oRWllOV@Q`1Y10D?ep@r04Ojgbwo)(4Y6VoI>Mn1H9?}Nrn0pqTflrU6&X~n{!zEf zp*gbDmT<8sM-8ek9~NY$6vb1ip+LQOp_EpW8lRZ|(5sD7lJ2%hw;Vjzn?z5RU$WL| z{35A0gBRwj zf4;dWzZ!vezASa{rCZ)5r^`5H6s9(9n;W}A#d@tTZu9l+|9GWMXU}9?gOaw zEZ`gLmv53u)H#WtXwHML=BF2n^2Q_h9Y)H>_kZW-Kpy0*YcZe<$%kc!{(e z(5Oo5ew!Y5mY;o&5;Fkdgw?y1+RiVFSKB=;~Yb6dY;+Y^sVGIjlfe*;_W zI}Fy?WEq{$fvRM^;v~joTbtKWoRRthIZf$$$YfP2#SUIzjR{+B#>>t*ndcd#Ogspd z3C^w0hpieI4}UqjN?;`r)AsC6%0xU#j7f*mV!~oR=eozQY0mTY>iYG~t;g>jpG!Wz z_jh;_q_Trzp{V39XQZi@)Qo4xe~JMiLcMX(zACf8}k+S#ZF9BvxGUb(B6!B>*kg`;~Sq{!IdQSP$0q%QGwwEFhe zJP-{s9a*y74AT4DQyO*?8bA<~lo4N(aV7z9t3G>eXoR}FCi%Zu$>XZKe@_ZhDYY~W z;FTwdgi=!P&%00LYtOGQ$XgHKJC2aAU;H~*v)ULdR>3q= zzIkTnMg*{=rs(|A4TRCRJAO(ws*#~J_V8>lRc6J7C}DlDO$Dn#r!}pHQfsWVy z4p-yeG9(Jcw`!PYo!mkmCZnpW)3((7#Qb(u&;*dSS|XPuyOT^df2YoUo%HXdp_9Y| zp@dsCJk3k7AFQqtS~AsIGPByT#w@cm-Q4xw&b5+F)d|c~A!!j51gBc#zcG3bf&@`9 zAA^MiLFW4i9liDiS>8@U=fst!PV8g|S!C_Bdl->5XN2Gq|C*}ZC5lC4=@rAs7csUc zOJp|w=T`52`SkgGfAQtRm5an%58yja*u1!R-{nOj*-x}K$=a-GKbo4?j<%OE+4Rg` zRS5(n7M$iK^|+6#RzgB*Ee2U;cMF)e5?KTmf#l|v8@nx!XVJ|6BD27HO;u@Dm76Zh zODr;8sI5aeheVLNb<)T**6f-?GHn>ey1a(e$AcW2bsET5f0x|1rX;b9G!-NqNQ^4P z6brnZJ*7C!mg@urT&}l?AS9!%yozollO><3pgWCq?qj%EkXOniZ#;nSI6!`LL4GGy zlIp#;$+e;D4pxE+3|j~cPtzHmW4q>(rIfY2>S^|LQ6i?M*0sD88YDjhV(%4J?A08X zr9teaQs?BJe-0$7GFWngebLN7kSi>n)kit6M_H$O`A}G$>@AbQU)7jq)$ZnXDtV|H zN&QTof-aWPRF+E+oF!IQo9w=Fi8@7Qev|wqf+SB>w#_s4Skn%VYW!2J(kUcXW|fI% z%xC?9-#)L$>t&KR9>aHxA-}mKznja%A`kPD*|}kuf7MLc72pjnYDR*s8+N*2iV|@S zUUv&HN1g6T5YXv9medK?-BLm9YD5hkb|4v$6}Ml3&vrv~(<}x#ZIwfuFT_m}^Q?@s zI8Lh4!6Y^BF2mP(s6Ud9gUWh}ktM*$N0)k+t6(i5$bL{-Wl2J_$u^Qc&$6~LI?FTa z8Bk~Te}=$o>DaUdA!n3>aEVQwqy$`eZysls{bwK6{U1mfr@eYQE*l$eJ9O9Dd*hpG zn2%rh_U*lrX;A~Llu3BM(Iy~wXI-#Q$<2c}2nl1$#8Pb|Lv6n7w`nXI z6jEi3Tac45qVhG+#s7ue{4u5OdQ<6XjwOQ z7+WPWHnsNIF@#*=ZRSJgRNr&}^DdV5o8oqVuUh}yA#OL})TDP7lntr_C*sQ@t?|yh ze|~2m)QS!y1t806l#DNTD}GDxJtogu&8Ch9k_Hl_sPjqw7ytze(4D8r1kjO7b-ntQ z*{KF(Dz8Yjlby{$Zv8mtwtl9uy8{7MwOAxTFvwQ+ zD4}jY^MU`_q&_MZ%Fu{KOn#N&fzL!W2Ewp8!cvF3_lF*>^qAQ{r0zY`-{-e9UvpV8 zHM8m{JYs=gumQT@ohl?mK9;wpBuenxfcH5kpSg@&+fqkFNvPnywGSX^nWjV(md`h~dyAZp1?$Wh4 zTa}+sR%+TZh#x=`X)*0CIT-*~bu&WI`gunE>ltmOghMea15{>_>(Q=#NLHvwgrBDz zP&Br*&ew&NoYF6 z%50Y9dI{3Nl!0zEp8V2dB$iq||8U?0c|El33O^WSdYqM%2MHxE)nU9bf13cp^0E1& zU-{(M-a2?AJtRq|`mUnBrnX2cZK^?3YqbU<2#YyNKDTY%CT!2VkcCzvq7Y`gV+z<{ z!7yG?aaYkx_PH{D2)udjPItdKNR_)WRScVl73@7P8m6;Z5mG=5oa#4~#<(#9rq`-0 zQ>2{CR;V={VmHl6N6*h7e>qo;p&N6XI8;Bd9m}AC7Z)ulVV`DQZ^VlBn6O z6;6L41XnKu35#-=I6K$OC>C_mg6F@ zf_fcEuoSYHg;Q81#U*KrZFq~7bgWHQmYlbq(ZX|?5^xh6kWrP!Qk|)FBINR+smb5U zI;$0^d(wq-Dw3qjfAWY9y8UzE91d>%IA4W>UwOqQ`6>+j>g(8WWv+XJX32fFK@6iK zIW@b%8u2gyQlChchS8yk)=D2Kz|)*idsfUE(r1>JfinXH6ZF$f2wkH1EO#kKu#k18 zs~i2f`(6w}RuQ3L5q}Np{>CWPSe(=AAUn4}3e@bJxdPz-SgjMBaalBOY zoaCO-`8k(n)sY|{%+rAx6Nsxal5%1KMw{T9yYf0Ivi&(bVf6lt1BkNoNXreJrhk<(!vm4BI zGo3b&kxA#I$pDNxSN6cy%Or>swuj2W0A)VS86d+7+{9Xfc4_Spss`iBFf7YUhDn@j z$N-)w+@S{UunS8=#x-F${$4#Uu}OzmvX`UEH=2Fe%}Rpz{L8qIT--12KYudYt9Eht zedBSvf9ecoPtIU(0~s)`Al_PYGHuFD!ZfvmX0qC^FCgQ5I6&fNNO&YZD5{NeNQ zlc%q)1R6p~NFL@VH5I4pn@aj$%%ohiT$WOaf6Bj_?CccQ3Y3PN!ID{<7-;?4YPON8 zq|P@(9$6)0GSAvUJ+?e;JhVjNqrfFsdnq zf2Iq}%d~O^DG3O6f%R_uIA_80@#1sh(*7$i?%3`4H%6I8w?-f#EQM-fK{Ff|F5ze1iI8rrnK^`k+Q^u zo5opBh7>y9DUZiHnOqjYx{G0gMJ=LTe}q7(#lO!f5nt$d7PsITk}GPeB8BnX3_HI- zqI!fE-?oGTv=N+yN?BskrwYUpc)`f<)ufS*78d_8#t zdzW(>rA!^8fs$_R`RPdBP}1CD>&C{R9yPYC>ernxUy3pf^i4V({Drhd0Ta&Ue-=bF zROM3SBHf}ayNEV&4_%#w89a2-Vm8r=R)gSJtglIw}`xA@|R44TZxy^WjaFD61 zptJmulhp-skik)uMDHQ#q~lTo?X+F?QroM)l_dmLBn(UTb(5a!Zc(C~?JRro8xK!E ze<`nnFQ5L!zj)d1Z~%Tlfxqj)yGZ)xWA}y~=;NQiebQIq=OPw0ou~68B$hCfntw(n z&nKVIE*Cn$Fv-clb()n|V47yjjDklrj4I^355l74Coq3MjYk`dR@(KL)& zH***x9g1|d*t>u0qpK|T+f@vcRHgB0eF;(SW5y_uZ`;5Jd#IqIs8d#DKW_1ACc`=a z51_`#Xjs)Qv}_dnEv!TSpgI;VI)BU!0Js8YGp!V$Nm4)TX66_ZQh1i-*13pX_k*E? z*#>LA%Tr5NGcW}fETCaZZUAs=fr4JwQCe$bD9?ukKpsY|iCvELNoHE{K)_{<2AT*u zd2LxLeqJJyGj&!Hp_Qj4bV0noIxGG0_u9)B&makpJK%3S&cQyO_b*<4@qhe_2iD}; zPoKZOgFcrK-*`Z;x>B1rWXIov+uzko_4nZX;=^&uhvSs@;5Y>cli^(IR7fDOt~)Q? zct!R+15b!xHb#I7Cz7&b=@AZinqnHPmK55YOwk4`#(??MG+=c4PdHpoHMm~Kqq#6? zb(dNIXna71O36RXf6a1!%YTNCf2vax8(;r_`uL~s^ymZ>A!uis>&^EWCA1ZGb6^pv zVN@1uUJ^sf2}(dD)7_)$r@9O>9h{_+4?}GRyr}LA^-czvN0%aHB70;{xr0oZV9GtW z>0TkT!oiQ{ihnhDc4mPMZ!=3~N$EgfgIykLmZQNqY%#&6#<1v zXv-*hHURvbS~bfp8I<&yhF|6|nt}r-iIRF1Lc$7Uhs4VeZhv%}em$xDxyPh(zdnEQ z2dh1M+8)*gIl1*fe#j#q^2mog@*$7hD38okg6pHHrjI-Tx^58bU<-VKG z#OM&J3|3P%1Du>jEb=l;#d5W%N1weauKSt=K+Fb;B1UzclOFF}0R* zE(|0sOrukAU4PmYu zrJ5QE+$G119A{b?=Aw||Rm!i<(M3`!&699kxt>S<_QyQ(@QOwAu%15j2>=9L1dgT}f1M63HS3JtHlq7Iq3H`7Q$*vy0qA zlFcF4@64jm)Rz2uh$>&@EynCwBJ|nKwtq`vVtbLdN)J%~UAlTCgB@i|bzqmA z6{o6WBk$GvV859v$&VN$JdrH>#y1@phx0O;Rh5L2H5pNbC%OhKWhV997wv*z*fFXj zWzVzo$lN9Cn^=2l6eS^o{krWPfZa#+lF1ovkTck9?A<;cSh16VnZuw^ypjuHmZ1B_ zb$|Ux;n!auDZIFU)gE45K)@Rh;dgU}AfCj=c3V#DviV-Y%ESbCYP%)1nbA|;t6SAN z8wNTxwe6-TuROPhbVueUG)4u9D9>^mcQ>I7nGDJFI|H#um_|mC!yD#@xL=)AXMx53 z?%%#%K=vLalMlJ=LvDKya@+rZPcmd;GJjiNAnh(i$i}K|euw6WBT^eznr|i+mLVx+ z$pJaBJO^*VWDX~HdjjyRR+pTeO*T|!Q{;_Cwojz{L$$@lzWS2HbZv$mooXQAoKG@Z zm27mV4e(G1;}aks*J8sDBd;n3yKJ6LwrCptENKAQpFjW@;NhEb^5==csXAJ=%YSLv zF2jo4GC%|V66Mxx;g4H>fX=emB)Kr8%yp&Z>C1LM*SskAyz#hQt$sGA>gRWJ0RHWK z%WGS?Dl zRs9j8;(s>+A)}154krY%1%hpHMYj>w6FLNLcN^3BX=;Jr z7TYC15mcEzn}lJ3v{?yS=Ov?9iDDIN%9Ko}+`ls`?kL~)s^qUGTitD_?8-WDjj{5z z8Z6E8dVBh^&3XUv?_XTF+sfzR_a$_~-X;y(OrFhf}O+$QnkK*nc_zS&PUZ zCr6{Bf^4L<4;e`kjv<~)hfi`GUF{Px;7&WGrRr?Qe6~bXV&sA=Q@STJn@qBoHgpY6}H~5Pv}BSDq#GV;i_Ila>fFG4Gzv2Q=T`;PNM*K6}wG*4vH8 z?c#ja6VKi_pMCv>w;=Zb%49Qbkeu}Ug3M&xB)yv@KWhGsd6D~X8G+2?*-1`Loy|EA zUy+ryEI!Rn4t7;@nnvA}4Pu-(3>OAWEHF;~F?mgh)GF{>Z`h^N`hRlw?|j5lc$wSr ztK0;%LvV(8G{1}t0g_0zl4<1Qlxrh_ku5UVUPqdQngm)3Br+>QM`{1_M0N0+EJP@J z=TuU(o$G$-LDUryBy?GUoA3h`S(tbKuAXAcl1b|8I&m9h&eVlIQ}&T{2D8vDb$2Th zDamYsG!}grN?*)!(|_o&CVA1#w={lRChy5|IYI7-s_Jb^tYBbm<+sY8eJ9-}rGqSFcsm26J*n}ot{Hsjy{`mj>NAK|=PwtZxIxsRtjLMjp{ zu6+KKoV+7-GN*?TACpGz4sH_hopd@=8pq|OxLN+1pK9_)KYr0aMcB4pLK&Wvp6Yqu~l`HARy-?KK)mk};X zPOg%&WZ_NFFgwD{Bq_B3Oh?BuLrA=IvR8&j7#-K|L-H$3W&o(oI`zVKR|mja=y6>b^PfdJ24mj6Nm#7j04zW7N%FX55x) zNm7(zfG48W0K1&bRw6oH82Cu~ehbd5trL{M?_U{s-dQhkEE7Ewkqdm)K;w80{-9uy zl8sJQi+|h6z?m>-XO{0Mq&2eRb%3x)A!gbtx!zz(suEIVWw09KP;)Gd^0e4~eY|+~ z;{M6Q7cXDFxW70ZyY<*z0etpj{|4aGpWmM~cOK90@kN02C%^O<_hfw3Ll(M-pezPq zNw;hR(x=?EqqWAXyWDEWO~weOZf32<$dMQbAb+`D^?bNgWrW23S5L`7%1CSMcG$gy z2$Hl3Yf8h)uRTj>I$!YIU06}NQ1b>pnj(2Z z9_j$128S!!-0P6iAE11omuMp~sLMB0jy2tPh#E+;5qiina%PC$r!&*7!>{Rmw@wcA zO-G;V|KY!(jILf@@N?y8(jKFP`asYR>51Fp+7 zS#m?x^vX-NLmP4`yJlVUvpbbBQV%f09$^@1!15qGrdppQJEGGBz&OcZt_+IrvVWNc zo{ebb{RP;W!xE|ntLnZzjLJiSFt2~awiVdoGjy?Xg%wDH+`@~}Q{&tE+qmw(4BHy*-^r58>bhv98#9KHkpP=GAMQJ_VKZ8b<; zem10moR$P4vRCQO^jQK#Q_~ZxJU$_Y$C)f7V9M^Wt^}ucYDrl#(<;Q9zSk;%FIDfb zlpwNW!EV>#faL8UzMPgG;b~h^)G|Pvb~Ji24sjP zA|X69$W4H6=@iV27$N?Nm1YgNZx>6v6k+^33U2@4ZZ}u>#VKWg7y4Vfa<9uQSM8j+ZA!)ac=XF#f39ml3m)k!kXn z^8_FG6@S?Bz05u_5PYGg>3>OS5JO2Rxh|=ak@;*s*TzbAYwD3zE;@IHrJ@5^fDoXE z;8R>6k4}J(BR?^jZmHI)n3ZPC4HD_4ktP(!V|tKyi>*xA92#;hAPv+cC)>!Mll*En z`Pvd1E1@tH&yox>uV=mT9T#>^e|A45w|>^1&u8oY!WQDjLw9A#y?=RgVc*8h#gA{V zeE&g+|AP?!2O<8ywh%ur;UpQPw?)th68(hw%d9U>Z-TEyhogB_zyQ0i zHC7cnvNq{KPPtSAv778LZSV4;?pgN*YYnFblzHXs%NupkDx|d^%oYB+G*{sLc+co{ zM(>It2DsrJzuFDcg2$mc2QZhG(x0)?a2cvmN>+se zNsQI<6V{%#sDF9AMPrx$6A;a)t_qBh9KdzVwv+T!A*!ya?_XB+YqsbTIp1VRdUO2N z9rzJ49*dCgS%#pX!hQZeblK6Wpp=DH$%E2xBU&u02}?1l(k zqf}acFbhn*M8=aeZ2Rc>HjRUH85bH_{W(k-jPD=N6k{HY!5};MZ>^|&V zb%nrm6!CvU{^V?*WWrzE^X6NR+|@%rb2{{U53hHn63k|;0H&#$F|rPjkbtnAOAX|^ zO>OL9&`TrekOg!AJhGiDI|hP)W0Oq|3K1ufDG~nRycJ+mTZ<}^g>vw*k)+*6pGC!J zg!AFp#QVJBl=?wQ^TO%piY_{A4;y&a0~oD758wm}b%`MUtYj z6zbv59o8z$4gv=8s#_(ElzGiPE5RpiSRAoXEs{e@wxxYtJpS@0pZ@+=#pB;UpkBNG z^x~-b)}wb(VFfUFW7&Q0^%vf|b!T(a?KTjn`3T07psp|3GfY7>YZC%pT40-H^#&@h z&CY*NM-mdW$Jo(}69uw^RFykp*du?AX>Hvn)sl!Y>P_T(rz+`ewT!Ce```>0cey(9 zT}=gj$>>%T0BIw5Gzg-AyNO?2C?zQe%{?dda76h~kC+q;oNV6tfG|kDKp38TZJ1Y7 zk4UuYZ4rY>i3FD5Yv3WP)52s(&S!G*H}-$~HWq>IWqW?i1j2 zh%MqEM&OrKHZMs?2nCP2x+^o*w4pcHepd8W464ng%j z{A;p2UoPZ>P;A?7ny!-^o$dGOV-J6lBPhiNrHUa3ipG>KI0>u-Y{Iv}?t!3zS!QC- zS#0qr8A1es=lAshh0P)}q?_Tps>Y&Pid3D-cu6M#athdH6G9vNq4}=_=2|0pu|gVu zt;1C{ih<7gIlf0Vq8W^|(95Ws6qin@5gBPv>lUGAMC}d3to-T!w zrrC{^k_x^HzqrA$h&w6!JPLoyNtzGddb3nCy?A^Bcu_;68#zU-J+D?A@>c_=4Dv_x z>h+4}759Tff$E8p*9By{@xWcAu5?OW=`E$MvScbi+L!$iFmQ;AvwL)JN9b2zK9cxq zqDZjdY+xzu89Dj{13!Tn@oJ0kTFAhX`>+c@VWsjC2Fbi07kMykz9y{iE6p4bNGCM*p5uuGoP%JGPqvpR$7~C z1LY2HS~ z6uO@7IzsHLrM_grvG4xlcd+akI<;ICFp`d|U}YpWIN#o>I3v{)3rmnpLSkp9YKb)^ zSJq1aTniJyDR$ST4TNCJ^r1%i2ZgyH0fwcy)y!o}-j7yKhuABaoORRt*;G!qSF;qM zNI8bB*~!$yHno3?v!-Pw!Ix{!!>L||tdK@%x-ldJ=RjhBtG3*9f~{VOBU#q~M*x0$ zZ2>k$-+VXA-7nAc0xxDS>eP<&0)~G6^!d}5?cw3ce)a_qcs>lg@!(xO42-A4z_+pV zRcHZX9toOYbJh6*GZHG%d>7K1pOtYP-b~iAPSz73pR9k@XVnE35W1>KmQW6iN z!S2?@wriE0@9lu)<|zxFM0_!kzv|6yogIur@JWA7b`t!A9r9QS9z$^7-YpfkF=x8E zoWnPO;Z*gdlcHCK`9L15y+n4BnH6o`aZC(6T|^1 zJeYq&sm{qoB)25LP~V{ceq`rYGbu7i%x$k$n)3U+KuiHJgOH8HP+%j$#R81*uu560 z08yi@EAu_h0A6%t=4^sZlET@>6#z2^8`<=c!Fvg~(1;SkG_LoeYh*Pbvj%yHqB`wf zgNpv84`G8lEs$S+c(}hHp0^&dYiAvA;E;dsz5c>4e)zciPu>9rcfr90@}9chUMbB{ z%psSs+un!3LsyG)A+@M3jz=D9&o9fE$75Tg22ZOBa_Ktss49rU&V_>vuX0AU(mBn% z(Ml;1rbSqA9r$W4%s}_nV)eCvipf8-RYHKYP{$mmv0_q|YNlz{4msmNF4vr+MOA;g zb>$p*)DXmmoH9L4!*B4Q)L;I5urbB8`s$tMQ+bzxNS#Z3@(fwU)?`_{^{?{ zrHastg5g^a-j&ShPX)vNtrQHi#C1{AS&SvLrW$T%Qs(&w|A|gYQI+5!t#g-;YWu|u z68C*}Au!%eb#+7}$0FB>wjHrTvHf4zOd)}61j96y484H6OyikE6YXe65zF0w`Yujg zr1#kk;EH&qqrUDVAWhbkp_a=0@U~rk+#zg2u$?xk$}H_rT1mRE0J#OeMGbp~MOP&G z7nI_xO28$bBJB}phv%0R-~}Lm8w;vT=i+iw)|y3!R9nl$B;RGI0;pm$kSs=RRfLWY zSsG8@WpK>vUO{<5-OqC96ls4Pe3z5Bn(?t0(T;s2Q*+4)baCS6l zuh2_w>Y1+6vLL;+CRv#tR@lp~R=im)*?jk(eROCl*&>ZdRqv_mVYEJ6_IB5!02#)v z0|d44l|G0(M9|n`Sg{;>4>khim+3rxm;bFL0|gg=4suxTYcn~AS`?YOd#Q|cIWH^Q zdR6||{8^(ps@sBk&W&{KiSV{qJ`vMYA%qWObEe4Qo=~7z~ zsFvhNKHdG7AH4^+QNK8sW0wS$r;&D?VMNTf)v06La`fXMKaB3g5R zNfy8p)*Orqv5O&&+>v(k$!a=WduD59-!a zE2@S5pG{J!sT~l{xU|Xh=AP@vtM$@`>QCq8jZXH+payzmwhq?eN zL;`%Y3DE>!vYcjhN#sglz^cQA`IYLJbB#?uq5?xq zPXh)}@ea|!k=5bZ%fto^4I$=v_g@`3Tow)$96rVb4ghVYm$n(dpc{$C7`D5GO+jAa zBC0TBuLt#;tKBciW^2V-4|%lQRKt8oNDf1K8gt1yIVUiGLX%FWx4L|uuEYSDUp9oh z|5{H$S~KczWy{0&c4;w=U3IoDg}@o-RCj0t+3y^r@EaUlc*|JQM>nhrcBQQp!eN*> zB;p~vnxtMQ{uWkZJDCVd=SgmJir_b(7k+tp|T~L&IXC{(!(R1 zf;rT50Y_X(4xH|+B)P^Ti0$N@$p%k$MZl}n{s1XVrjd;ciy=edc8j8T5+-A!yi^zy zJC4-}4V60S?%v3Vtuxj9eRevX0gPHT{dVvscmT$K*E%^&?Likr`WyGSOXY-TD1YO@ zyDI4tPLeKfoU~PWBoQk`P5GBXX&`z{~V6XJEJ~AOsMBV+#WQ6B##IFl3lDb(?h`KJNaqHee5IEzmn5g*XW? zXQl&x|F5(K>CDm0qp z4t2`25)|xm(whYn$D_#k?!W!$Jvd7K#l4A&(y-6OUm05Qcxty-!eF1QY6+agd6=M6 zyd**Iu!!VvsI}n88wfX?wkyj>D)Olihl_)Mi@;Tygmi*mYcJ*&YqNV1a!NpAv#TU55izv-IC$4VueO0I0PZq%yC*R2au*7W2tAh zyq5}18VQO;y%)57vf#WSB1{SXufs{w01KjRz3BwoxC3+E{dXUI@@s$6!2aW3J0uQ& zo<9Hd?=~-f{44#7r_Wyf-Z!++fBgL~p1*wd#iyUH`Fnr#H+=F-pZwCFkbX>wfAZS8 zpUSGYsuHjyG6JZh*MZb3j0TCk?FbNX5&WbRE!G(SWVMkJz<@XWeILFx({>kFWANmq z$&}3Pq6|INW6eZM@Q*l88om(ry0yE1#Q8+^*^9}89i|`s;zaebMT|$ebq$7k2@$_5ELZ8Kg4`WMr zUTn7>v@6%8;Uwu5-bYCoo9Z$F{h@(AWh7>e zI&*8(w`{XOrgln4wMY|zk&2SisZuIvM}LWzc>_!x+Bg6j%)EyvoKN*4(Sk+d$81v; zsw(_oD-RV=XR?$`ttU9X7P)kID^~>q0tpgo9d#N|g9Nn>VG(i_j|yCWY)LZbsU^vt z%D5Z6WmqOAPO^8Dc91T;NnT$&YB7c5+0(Ba6`8Q-7xC@ZLw6;F9*_9`@ zmLwS+9#oAGL-!y>r4Y8NE=P@&!({S?m+6j9LZtdIY||n9l-#EwXh>o|0x#kt0#&n! zD}4h!qLb?#XWb|){$G}OjTFkZ*U?vjPGv~2ygZHg9HFc5 z*?0fL!SSY*L$9=4*3pc9sD42QGEb&l3e#Lfv$j~tKs;Z8hIUqef>SJAm1=#k|M8>upk3|muN-3`Y6CjW(s2z< zleu&?p;B-Uja8EdppdXmFmI5m&_-iwR%BOt;Z0yE%O&!O`OxN?I{I|F@Qg(UsFGq- zkB4W%T5*$SGr8n{ZPcJ`@BZpLkm^?g=~^w8aoMH^B0XzK9e4b87TY81caela?6 zt*#74*ea0I5mR(hgBfK@z{Q7H$JYVz4U54ayu5$$>P7!zUs~qedi<_d{N_`|@3)o_ z*6R0BEY zz-);d3X)|fsd*X945{jNRST>V9f*$YURQ2&$_}N$BpN(I&21s7S}LnhfoFgQ0LzS* z{|Jl6*mCzj9|k62t0k`FNGM?H)C@&b)d{ncf{@aG+i`j>0-Hx-$Rzkm`j&i@4y+4t zbWCz$Ymrcv`_?^bJ@i+X&YXGvuCq~9eL}6F-(w$EJvMZ6_rDyKEbNk9We6A5X1{s~ z)puoMmm~#ZRdL>RDa*e$U0leRII(GxATE417wK8G6lAlk!x=d>Rd{|Y+3TFG>#o-8 zpx0%8{-Q{{8qB$;t7+c-ug5VwgdLO%AcdsJ6&Wf;L|%|+b}vw|N}xTl42ZTJUQW)^ z3rRkE0C^#G8F*6ohAQo=vG>rqB5BLA#MW+A%|2`qoG0Rfi3%t1Q(ixhjSN(=<}) zlF>6G(n#bMLb_x|#E5jMe6zOK==!?9``?c|B~1e>Mq;BT`Up9DFtJ+Q%i%#ZUQ^k=0GpQ)>jN~$bv6;${uy12oTUnDc zyhKtf>EJ+$^^(-l{eD*bRLy1ArGGuNKL)8ZwJmwgyZ`gpsgJ$}5-IyEQvCEsS zSq4$%*G_TUx-tv#>##1Hbyui-nXGb<*fK!l*^+b>n&iwt!w{*v|NB^-M{!esVy59< zDqdx=N<)D+4}oA&E7+!(SOQ^)C*xTqP;{J`Pf$^BGQ^#JvvCi#WfpBonH0xwCm*ux z8IdJ*IyhWlb%dz!C%?J5N4xufj;B!D$zlr+FKtbou=jN6!}_iXZgn#z#J`{=&geEt z)IdFW+J2~N$kJwtbV80x1y5OjJv(_f5I<*wP;NEqfT5(_I32^frQZhX>OSB7zaM?_ zx4bs!Wv$r|eGWnRu3+^<6inG3eZeEDuRm?MlfyEdsSmIu+i}057?J!5dXAYvrpB zRid`70*-ZReJ;_yu@Tn!id`OUPhPhBE9~#qBX@yw;>Y$4_V@VbZ;x|Y9EZz;45vvC zL&OhYV!FVHUFtJc$x_~ty)m2`OC(uXXAT>}%RgCyHkN=+IGDh9B$BSf%eE43;wSHZAI`2}b?+3riO>ym2e#Q}h%HbXWmyyW?e z?bgZz=Xy6)x;?pHpRS)?h(X+V;I1tDH;c35`zf8j8;K_gjn~qDv(RROCd5?1h>-sz zQThoThx{`ts~Lv4rVRxv@(*>wvTA?JDjyOt25JOGME)C)e_dI!HM1-HU}R&~tm0en zB*YHPc)m)IIocs2DKBoOB$KvlAF4_c1cr(T2=gg|-Ba2LMtLmSs$Ko!*%7Jcdp(7p4W{f!^zygC?vu4^jXkTIPHc0i&8q`m6f zs9Yg}uVSlT#^C0@03X}X*Pdl->-*j@}V*+=wX1Y zz`Ko@lA@P6MPY6oE5z|YDF!K*>cWNDTdFv70KT$|x1DTGNPmVNfB|*-$AXX}3wSO` z;@QFLJz>4~ZW>#2>qtLK*rl>i#(E=%nvdh_fa@j5k|f~ZRVxnBXSM0lubCmsRDwl1 z>|9o#jbXJ?es(hYVEYulm27WRMq9xwP-E~)wN3IKzI#ndOT0oLHA)gQM9Ik|nQxFx zfDdO(bnC~tFn@xTN#eS{e{p}UF4b@Fn9LFsg2tQz`&e3E@IlI!dp$t=gEn>$|J z${}GT`2b}WB5x8pgxNH$;u&RjDReFmB>vMK)QdgBK7>4j%G9x!b$_<v}|8u*6DezSzGwKX2jpkzV7rv6EE(0FnNwu< zHqb~4EY>vT|5V_yPUea2XlqHjII4s-*lmDbFtL&rAhYdhR=9xv?)9wR+QR6AqtaV; zRC*u0jQ-ZQm*MpV9e>2*a6-$vQ6~d$^=3+xSz02g^b}`SMHo;-SwZ#{TRJH#0oT=# z6Frch&|zj!$45Ko6DbC;N(s)Y;hP=GEol)}9JmkAP$fjf63w-#WUUOT>^ptu*8Knp z0_5YQ(Wja+0F3AbSn_C`8+&@_5x`f)=dAb%4r3n>s0$loj2bZin9B1n+q0ish@{_m z^sd$*l~WB;c^frImzVYhF@J&;<~xcdK=Ik9)l?Pu>Dp2PwQw2u4c|J~-9PxFL&9RH zLF`rZOOw1tYq~ikBf^`;>w2#;5f_6;}y*yP{ zYpe<~z>TU7OaPTqoD^tMQJ0@`UBCN>e)RSgWF#KN#3yy*=q9uI=6_v;hEF5S2}yQ< zI8@*yXKVeLRn+85q;4K3k+8NH@S~{Hw>+VJRn8$W1>Kfem9h9mW|c#h1LrImlo)Wn zXANHD3Bxxsdv)p{n>lP1m^L7dK|Mhb=>l?-eTAwi;vu2ftJFVrk7_~RVM0f3V9Cp~ zX|^HXr^)_PC2b|pu`7Kg?_Q0az*`7FU~z4yv&C?}u=&B~Psja>M-Pkh4dIOk?n<-K zn{6NAEtl~31tSOAHz>clL5-Ih_yrn&fZfSbY$A9ae7#2N@BZN*9jXMuf}Q2Ll)6=A z4g);+4M43le3-y|-E@TnvxgKB7C}uLoCUPw302Yy30wqBqoVsY^d2)cFYpJE%BpKx z8^*SLNw8zMtoj&tW=ZXK_m8}T&9`~7kjNadNL(_?X--(3Ago@{Y@Dlnt?*=jP2S!r z6y&QqI4sVwdXrW2lB%PtL~vPcR`o@UI0%Rli5;{#T~y51J3@&I0jSDeajbJ$3TZ7# z97vi8##HA>0xJ2B73`JNKfvgOqIyDk_+*9-fFRwjAthb4+eNm~iX9Th1o5DPsfTr* z50O2fN~k_~IJhVq#}xq2l-~w_e7Ak=arM2Y53uF0Os;-qJbU`Zg=prjhwftgm6MTQ zc^gK4>Icw4voC$Kil!AVOb~;y*qq10t(A^Iz)%?ThAi{l&}t zNGFmOBnYO~yOmDfq0TmZ?uOmKu2ipsj=G%HmFDty|LBk217)wfe@st*QM}c&rPg%f zQI){e${ePuYys^oqwZOnT{i^YAP+ z?Jx>_Ln>fHK3>2DO$2^zPKD6qWH?oTIt3nEm0gz|nigBaJtMSA z^j1r^j)G?B5(5ccpimfq+TjmpgCaW#0u^(cku%J$w)M`&hE6rMJ41#bOohWKvzzF)Tzzer}vm|~H z2-8goj^`4bOrmX-gp670R+p85VV)dzSVs0RSAwoL)=xZh=k@H_Bb|j_l?vW?*zRqF z^`}PI&#cDt=4+-hNFx)^6WKb$0#b6KYSTwPDSe^2!Cg8oN-~5!C z&|8n(y^zzKAm;;|adwT(O|L};lSmj#QBCVfH4)J*oh_>EKwnj(R^c#o!se%bmWK>V z*+)A%dCn+_s6UBO0}pJ;8V8Ao0k2Xx+%5G{rgimy_N^w*%JUKTjg?4GGwv&opFi3k zK6!G8)E;^D(Fac-Ul-!vdKB*!xiTk_s|Psy1QLX0oNV{h#wIHS*iP5o2eqR$5dJcw z4JZUS3*^mdui+E zTwrm3YbC!knERkH>wb1!CD>aJ+db3GzE%ML^6LjT-Jn8UWqVfbR9Zky{aG?`ky>U= zWe1(h_6};&nRMg(Qbl#HZo?ge*0p8aRMV{kd7UMIv<#!{=FU8OwXJ(?BzIGm*Cwe^ zlY-ST=v8&rttA`J_R-J3LGph8>%_VD-fP!?weYtdy?ZHyIZ=o=Q3)@XcMB1(jc~gK z1Yl|EK&@+b`Dj#a5qChtX8m`c9Lx&TVv~c-0nsJC2wJW3+K$>5$gI7|8XTp@y41y6 zYn1yHT%FqmAB8;1n87IAU;eeX&}~FUol_cF84jpciYi#{l50oPv{BP2h@2dzB9oDS zVFu9^H5D7^9^V$nJsxY(VW?*gZCL40$M{eOB$OdpRgw|?z)h|akb<_`L#@n!bMwcI zg+k9n=I6ih`1%;()?;?>jCZFQ|0eb^gZjArbRZ*k3PiUO(&djhvD+C zzsVU7=@U|W`AC2JJ3pg-(|`2JyFc*K9mNUzkvC;zS;^!+ux1+}n1|?(z7jWt!WfIB zD*eIgCK{-kpt)LCSG5qaFD+Sw@Q2Y^mDYHlty!~)Z z+2!AO8)?9#S<(((ay~{hm>fobe1p6<&n0!uK4WZZGA{%rZaF;8Eopc7J_~rmu_U6i znSa{z+fFk{`%*>S8Q{d_$mpa!u!c_hT8ch}<|Q(5-p{(VTEbnC&p z*OS(tJZayEr1|&td%y1_`CYfgS(v7)WU15J(J6&6Bc~k!jKl>)N%= zrL6*;?wf`FvSQxz;EkGp#fr4WqTzeVD~-FDp|gY*le`24GB``M!Savu5u`7NQc`!3 zY@i_)pS##^Eq?XsQ}2ttJ%>qL)kfWT{64SqP6z&_$fDCMRR?>(s+%o^z+E;Ip-epX z1hrYjby#PrrcR&LZ#IDPFjFhJ#okCpK!+MCXxF98!q%dfVqTYjbOl%jTp{{P?#i+z z%jEuZ$h)=N*{9FD->iM|udgdZm|G9vy=*$1*z{+1f_Mv?nl>Xt~B zZ%cZzgoL1^1|pUAN|ma%nlQByZJ>?;mMAsUER>?X5@g-mqs*VebJR(ZrO2*xW=> zRs3?hNG@Ay{!s#A+7FAQ5$<=$2x3|3_DyXP&!jq9^-YCVnuKp_DiUdBRfFG|4Nh_Z zb=DG_nn3~Hafgyr_T{T1Ak3>a^;>HSe){bD!hZ7fT7dq4*28x%WppRX_z<(Ll$c@c zYA*x(RC$wuNS2g;*S4c|i95~c#G(q(f*?;8JglZAl_E(36}7}HWey%VgnN)nX7kdn zUMi3-6J7xRAH8X7Qe>*@aHNwT&qp;k7Loie+4k}KKlkC|XIJ#%)&ux?jdx@v7VBJD zwXkqQu!fs|*)}VUaAT(AUmTn*?7)zy^b-UIFEnOYFU@sx$X+bQud1m;I-Ex|@#biN zABU0jbn+WtiDvqbd0C4XSTR6TA0FO^W#7uN`X_lBQZQeEwF0%Ro86Kd6Qv0UD? zjh*yv455m*0O6Zl>K%#hOlohe6Z_p}-P5N}&a>{;qxX4@b#l_K+*uxe*KAgvI(u8k$OYQ%9IUZY`~(`QUC*jN zI;q-sF=Da>7*RW~Zb-BS?2;vZl4M~FlOu!4g~JsSGii`j8-gT0bVQ&KMB*s&(vV42 zIFur$c5JV7Pj9OO{n4!Z!V8|q#}n?!)9bT;*IN(Vy1M=MHJ(7pw$s zf^1Za>k@d0>be17+jJKGxwYi?S(NMEsdnQbyLYOY(^Pwav2D~PHBc3KWzoJGZC+}B zZS^`CuD-jXx+k^rn8o*G9>UVo`HT)KOD#q%T+$d{{@CwSr5ppUN+$)BJPjXFi9=4} zDdfJPlT4{}S+dc&WBbOgNmrWA^00cObBSwB=i3h4J#OKzm$c?LQPTPlq(XlAEmV~x z(^ic}zExzIB0&ua#%NPsD?J-myA=L^cmU+hGPGS)+T_PwHf;jzhV~TJ;m$Wy-e-6^ z+#8T8HZZ-6Wu2379TbGPVtDq>B?&h&)2`^tja9+U5%#^u?_Ev!TMyYi0E<9$zvwZY z&|`W~5%$$EesMf`{LVL@zpCOJy^u~UfH{(9psK4ysXGxT3h>MpXQ!&=i*zNlJtbpv zf9VHQhSI62EDkqQRCOG~t#Tx*9|Xy|GWh zS?Boi^GC9exC*v69<_V3yFX?3H&Vhkq;W}R8LaZIHs`9ENT`<2av6?ln^v=!8g;6H z&-r8+nNhsi-siy3CTpUdu_zN3GNA(#e>qT9XX$m&${@Y4o(%C|SHjDx6O_%Zmp(54 z=G*X%$VECfwIoB7W4;?$ES$G+<4sXe>s2l zuR)BLUq76P`|*yrtbwv_Q1;Z%g zG*#aPG8ls`U%l-mI+s)^+YGAdzWB~@n!Ybd*Uc0Iqb2j^+N{q{pQ^@C?m zzx|y@_gb{xdid@^wy(4H{Dztce{M}SK0n;&9?9fjW-oFT@kwG>azb6|Le%bIXj1!# zTiecwX`{1fW_C!?6G?59wGK#68#qQk#A7#r{RP0tOx^+vR0js%CcNezrB>B;upnZI zZ6~|p>t&4S;=1 zCTsY_P!-kXOM1z)sv4hIe@8YQoZaN|M4$w@Ij_#-8nUzlfQk!Tmo)WxhqRqGLbqny z2G9wvUzHUBJEga+t!{>!zZ57^U_K6T#IBMNX7JR=L}-?#EGyP_jo#47VBN#O<6y)moM`3kf~#swJn|YYF>EF=y?n?OPLhsmItTm4f7PbJtw-&u`^uh_ z)xK!ol(gFFhpAij1d2LKRY?PUcLb)T#K1s5+dHx129r+JI^z}6_~roDgYtK@I*JYw zvC#=OFiDS>;6kz;gvRNIad5%)68Mj}86g%5hizkfOpn>EL>d` zz8ry!96*@be_3*m>O2bDk7ZkvQP(ilr{efAMnuWDONij;!MV|gQo$f9nt@XSfkq(2?Iq=~NH8J;!n(WQei8Ko*_A{lR8wM^Xla?U{eq zl0zCQ+XCe#**8>(MwX-es0Pv53grRZFDgVwfO(11yQgTP+q4 ze}bqMVjcg#PW3;sF0)V-r}k+lp#Y_U>VSacq%JeN+9oCYg3R)d#1%#@2#UnGF{Uxbc^N_ob9{RL59`40oWm z8q5k2)AO6;?C85l5YUelOg?3RxMQ1Ce^)h^Ap#St)ulNkF(>WeI@Q>Agl~yAi7~Bg zR#0CD(Xi@p<=8kQJ&{w-h9|eaoGXvo=g%JB>t0jkbt{1}snx2fW(0yYbdHrjKregB z?o_Vi0+UfnxH&^$JB!lY8o5TT$QTHy{XLdbw#f6Adq zSP6c5559Q0e-ve0+Q=#~dWI-Ux=h6{au^Rlg3U|POaV^we$ohbAYmdZa7g1in6?8l zmgU?4(kMo~+(eAUY86XV1 zxB{p^CqYBg6Y&8WLC{fMcb2LXf3QSbzN*KO9}&oL$@_LnwwZ-R&}hOMTC_4gY!-4W zwW6Wo-lLr)JB7(b$W*C?6;n`G`gr|mCKW!sM2l9gds_;gtyqF!;d8y(my5BI(_=34 z5mjYz0Li38!)nmPlMJ5Pv0Ik{L#fKFJ*Q0&mD!t7u!t~}nJl>}^B9upe-Lg*G~t_& zJqTU7{Ci({_s8D&aa!YQyR^x7pC&Q+0dQM&q|rgzAyXaPP)Z4M@eud!#AG$gO3&Ib zlUT3SMQ+PV&(cX!5J<6#0~)H=Y7MTe<2cvP;+Kuy2^2h;my*|;s>fsb|8jB8XFlz4$qOVoZ#my zlKjanD$7+#aZM>y;zNj|8m64%K6xk}0GjH!>qmbY-s5#r%!E+1btK&!(dcj?nbR@nk#f?!*g zw)_U**~-eYgc-5}Q~MD6(%P$XdNGodwBe{>4tB{^1xB$|u16Hg(l!9iOhAIf=>Zdj z{wrzM+dA}IxtF%*e=mOS>S*J}V|Km4`i}LlNmsvm;j_mx`4*J2YVj=A7PXCP#)cBP z(if3Vo@XJFkD2w|u-I&9t+#ya2oR+m5g4>vbznh4*LEeDTy6KtQ#xZ93C5)IV|7A% zpJ!@Y8ewK-K;`8RzJ=Nts1TuoTi}xzND}GNfxrAjL+w@;e;E=S&mf-YoNAQ$kB0zC z#~E_%dm`QH5T)}@V5FATVBV@Dh``^plMZ8MI9!#xyM}PfA$v=)GG6P_+}57wH0QtA zpS7``Un$Ytc+l=uFLo#O;x}=o&pdK*(d zh=zi)2$DW_BCC?G*=jH^YJQspNNqHoAV<}X zANhO9YWgUOk;+Si{?B4I%iF9ZJ)3iwzqJ9&x$NTke+zQ|qxSyuE0>~M58S;a=jK#$ z{w5+lL7p5o$!v|>TH#u&GE0jgJLyzgc&xdkiOhVJhJ}&x5LvLuCY&{{q_v`SF~CY` zE|S+$(N!sphq2;uv;}^JyZJ(7*vU=OJ0m2^hs%HPR)h>gCQEPdT9@T-6FZ+WQ(5Xx z*NRg;f5qB5plEGd3k(}X)GAGRD6v(841ep~m@Zy&-7wj}BP8!ZWt-zQQG5~~M5Hp~ zbTH4_Pr%u8q}K)WD&wn zqCjqnc{l4=lUod0!VNk=>{&&sa%ag)_EAJG@6vV>5`%z}kakJ!@(T~8l;n$VIuew6 ze^ltg0qlX-ogX^ISQ154v+vf~fZK<98i8u)Fc?y&gdL8!%NebJW2$Be;I|pfd#xH{f|H#^QjZmH%}30C?6X_?R08O zPfoBQr^$a*p;vn*kcy3NfdfKG%xg|}6pkq{B7N)ZOHi2M*mrOezD8+GQPSx19(ve?g|D zV@fr|$zK&vyZPA5fAkjWxeBPC&q^}gR%wHb2UJM`Yl*%t;u>@~mo#Nttje7r_c6Js z2SOmoDMw+kQzwJjfXlk7{JzU)dA$B!*J|f5M0T~OYVlv zs5?~R(B3QcLGUWrrWbji@-?tvfNobd%}$N_IBL2GXyjzm2e|k&=WZ>cf8OAF{Cs`; zs)F#=WA?o<@pub!ZA%T%`XHwtuOma9tc3s`>b(N#M;0%f65l2GfRP!*e>}QUUyuvX z2GjwoN{(%*@08@%kImziyE`yr;V70j?tu&PhIhlntABGG< zyBreYaVX8z!Usd&rgrale-abWd53!9hPruRXHyFdA_8fVs4L0HsWQpLeEE+BFK%tx zcll2qf)DTKXIJX_e9A=EK!mErtm+Q;>hjRmB(OtG8>Eo3>h|(7Oz?}?+w92z%K5*< z<+W0o65+@y7P>wHAQwE!Y>wZP*n<`^OFBao$rXT9yQGn-wY*y;9F5WVd!pKGzff{IhodzU8gQ?cVkqb85eN6Z@9d z*|e@eFrXq|gv6*fjsAjX1@xuwO5_5d&D{%*bMpxqE_1&P&#Y%{;4 zLhGJKR58kcY;VGzoLr)TYe`7f`0N1W-d_IG2jQ;%M;<~vz5LO)uye!3hs6!Zldi+3 zlJPshS;$^1FEfwLvAi}pt0lpJy?8E0nz)%DXh~y^OwT$qe=5RUfP^h?WNByET7eP) zroU@QJh<#5Nh_J`Hi&gdA@lPZ0d75R_w3!;liBT?Ik~ub1o&eQA_Dwp4?jAEbas$c7MWPsSd1}#*xOK+0>h#(*f0qM77`%M>&)>pPu+*}MmTF8| zYQZ6}7V?CX#?10VURtVxHB2yqJb}oO=Nu2#$Q8W9X&sN!NcKNS@1x0rNBb4(fiuQS z*ahMY(N%$~m(Pk8z0MMxA+>{b9Y~;bAAAzG8dI3J9szwUSZ@d50iY|C%uHi>v}u>4a}n-h ze{>imrDK+=3YEwuhl`x;(*Q95`^9+IyaOs)D_#C@<-KxaC5Vp-D!#}g98VsuzCNR{fi+M1BGIjQE_43-YNtEESZ z7|=YGUz9@>C9)_RAat|L3dEkbm`BqGe~)*C447Q3F8DCGS~7v8t9C9qz4hgstE``| z_Zaf~WFSC#YAYrX5=t6xW`Reo9iE=uwm_yzLruIpSSBEhK|8d>7$X}C+oh>lRe++y z;E_^-hQcql3KgPi5aQa9BeFhO5JWi1kJHvF+n&A!hAK95Ge231mrxja8Z?*#W;WvbH5ahpgQyY0&Jlhn0ZNvY$WtxIO%=?{njkySEa=pDIDVZ!rCR`GAvr zz+32Q@Y5^l1=GEgMLGaZTZ%Q#f9{-3Kro~2M4+ZoWS6+lHgX@D+Kyy+Sih`v2uCMc zbMx?JRty2RRcp0(%nun!(plq80=mgQG_r`pB!!>r$!@HZa~2)_SUO}peez_DtLpAs z58u6IKK4}R^CslLD2iG)x3JS*Q{%vnqupw;U7?mpM$} zy3TUbwgPB7I(aLA&l&w_e|M=%Ve_W6D<0tDS9zSKy z8;{=irWpH>9o}2#<0INS%yQ6(z~~Z4a)`z0kWM=nHSwgffkDDA?NEillETpf>A;m+ zs4ACl8-U~)?U20ZPN7xJMS?+W!cCBj7Lp!|5JQY4nR59PZ(;8DqJCvHtf^?D=znz) zZc7o%w=6|Cwb521e{hCOZK}i|Ymf4eP7>Sh1$JG*aNJoRZ9?NrbQ$uk4L>FobFsS) zj#7mP>5o)b)Ih9l!LtVWts9Qdd!Xg_ z3FwVGoX*whf6qRA|Ir8SS%WHFdB@&*=c&}1UyqoXp-K9IBUZ%e-^^)+qRnCfk?Vzo>gQVJi*IMoxOwnswlvM zH?>Btf6f3?)vxs-H85#VInnMR%X(GVw3iYswie6yUL)I!CRr7dmV4x z@NwSXUhh5q=BJ#<-g@M&W?W^4eX>OF7L}6PcDFj>R z4rTg5U|UNY#G&i1R_h3a*$SlUL0Kp=7tIJc4RmG{TKq_g{TK1N}5+$%Z3j;~Q z0ZR_AI^Wo{)Xl=>PaOsEpoyk3R0{|2f36QXG*mE+bC6*Vsbj2ohQJjuWAMqYB^voq zABUe@y$L*gNghMT#a=hR=949ZY_OUHI6{=)OQ~RZRoHb9P-mfQ$MEu}--3<;A2=kM zGIICTR=LW~2Go*%5VMAO%SCY82KqC!sVm9>c=TRjlOIZ8cYqncxngjO+W~=@e-zbz z;+R}J$~Ig0eR9=Urqt^H}!`ppP8g5->o-9t9Pltvb+ z!1!LuO1>m1URYHsM41A2CUiFiqQ>L!ghqvr-SaF#@?;E)8Ucfen<1KM5n$#pel}KJ z;rWI-2#&l!;K|TcCB$>r)QvCae=M~zo<4c{?2$_S*RvP*oqIVMaX3NII$=+w0Op0? zfrm{v335|#p_xr&NWMxLPFog2sIa!to8<*x5ybg5&lTU5~_g&=m{8sa1amdsqpZd2Moc+ui1K zAbE8P@chY#U%w_Pw;j3f+3A-QY+CY-lo)kVp{}hxnC`GC8!{m=DyI6qfK6ghI}yU| z2(|=2XJOUy3<>0uMU=gse-6tu>}aPXZ&i}sjl>-`2|)TgZ91K-$W{&<=&&KWYOwyJ$0knDEUVV4ae1{;62F`$zX+!7+s z)$43RE@vL_tYp(bGa*#QQispyXnX5Jj`Kd`i>EL5gYG|jy7l1QBM|fY*;9N&XHOOe zsx?u1RXsRdWa(&Rz)!uDKr>u*cUE)n;!-eMBl`!2pvwh{Ohf(|#9n#*1(&taOa{s> zH?l|$dZ<;{)`dE|3YLGDdL;QAMm42z`LEtWz>RHa2ajuJwivM7n64$MR+|pd6)md^ z#v~E<%A+xGgf*&kdon-?t|)&L@D#&hl7ush*Z%V?DqJQy7WH1%CQHk{Y>Y%AV(r_oF@gO(grN)0BOxj_oXiY_OO()9? z$I;lmL#=A1D9r#=h+N#Ngx6GRv12lWEJF~HJ2s09p^1wB=Jx04dFiX0PZSmqmE z4r^prFDvDe!g)LN)>TC39N)hFb)s#1u^z2w&z@e*x?7Ll_pD9D0o4Vv9ni`h4job< z-P!?E&uVWrWgUO?mIPIu&F*MeM(QGrO{-nTiC)BCLLOm)bL7!j*LGv_f*=czeYN3Q z)A^aIGvuukZ4;u4m;YMZRAe;Lrg1uXiM=g%=pqa56v^;PDt9_p27h53froLq!GmC4 zShu?GLk~L*5_2Sbsg>G|CYu>kGM~2Pv@* z>(9RUvc!MEnb%b#ml*j+o;pa)ZheL2v1-|f^JT-H2`Q3 zffHbRG%1CFf3lYyEU8AcZTKijTpQAY?v+MB;vr~{BCEx>^03-Ix1Zm78{xdQ^Z30F zpYebHZ|LeytMAq$cTdHGeXRxk<<}1maG3;ZA+yI36G7EgXodo$@kGip$w|N-*d@$G zM^=qRCmA}Oy|Nlr*vK+rB?Sq)^mKIP*RhF!3`_A6#ofy>bv!^?M)i=D>=!E%R+_F_ z&~MG7&O%*}pFev4!}t0%z`ymleQ%`t-u!=jJ9f3yT|bO8(=4g4!@f+HS{AoTGE?L2 zt|Y!LK{mLOA%K*XQUdPvRWmq?5wLJ0>!5NnrQ=JvAqy`R9h(jycZ|El$%K(G#!fO> z?&k*MTLZ~+gd0y*d;ih%7j0Z^;N5!U?m2^YCw=D!Nh!%cHV18tg`ll6p=j-Qii($= zCI%OOW$wsj;D#--bhH~Yj69G&mJ48i6?yM&nuC5-XuD_h!1@CwaMf>kW72RwRC}zk zd-3R{%=1;t#Er-9dvjp&=I5N%2^G&1CZaldo{sI6m>`h~FQpt+w^$Jj7O`uV5i)Ru zX31}ap}tCHw2L+j(yj$$Q;V#FQ;|=61h-6oMkyQ}0Zp#)hkW*2b62y+m7?FR5&PNe z`kT-D`{${4>mmEzxXr!=`T9z>nOTDU^7H{uPvUupBf~_A7x1Fo)RGjnLWfiurNjjD z=`)U6RO`E9VCMz+XTEq4d$-!~S;HQ!E^w~%`NWNB*_C*I zf34Y^QJ8)LH=!?$O>Ffm}6B)>6#?BpX_o-m#zmB&_OfDG3mDN5vYtvQoXKZhSdsLB&shju~WjOr%;-t1;c0J9LVHGq9S))ggGY=wf!-RILky~FB6%VRbax%=dJfDFav4+&0g*I8i{Q(@vDwjcq(do)aNS9`!~7U{R_HYlP`%WHv-Nop!tzLEZacBqV1R@Mr*^ zYrp)Wt|AT96S!UmBj8HfpPmJh<=E))x_Q-8Y8{7l%FMsYWm{JVKJddG8>AbsUYEnV7 z_K@Y1whlkjI@R6Tz05FUkbLNX4Ky)Nk^;+<0NlX%EP=v(x?`)E2TJB}kdx%}^m3N? zc5h@~o``Dbx10jbrzI3#!+h!G9$Z}y=$iZr= zB{i!Da!L-;M_900fNab>a>yn8Fzc*oBp|!B+U}5E7g5z|b8X4hG#J*J4wZ=_@$%;n z6AONSOpcIK3fx^g8!l^eEtX)jDosiEKn0@El*oz!7Iw>pWUkMLl%#VH<$<|&R;jZq zZ?!r%FJJVrbWdF!O53b1J>~|~jZhCyHnU~z%U}4)OMNU}Fea+&uIV^No8c(Y zFrhM?jTt2jK8`0;A-YD&4YsNweRFqzUYbN{0BC&((nVuM)nw+Hp~x?*sF`q9$1Et_ z8TI(pG_yq44~O?SnvQxlP{8Ll%jLg2Y7gd$d30iKF^$MXV1-ic&b9VX|_ z%YT0$1@&M7(qfRwu^0C&UPq*h*a4IbdD#i+2b)N^+mfuy5_qi}B$!ogQl=c6RR}4! zjp(Z|D3?oM=H4vyqJa)c=i;eBedfvVpuLeZ_2n;p<=r2C%_}P z@(Rm}zp1_x-W*_rXPKWH&$sjL(vJ%JzfUH9$|~)5-#K#h^Q)|U>ruRaN6Ed4D6i$@ zANs_rZ@>kGyOr!l$fX3;n{>%wW-H?s;dkwl8L zhZ#nQI*1_K7HHBY3kb@C->WY`0p+jKOT zz|x83UEc9yaCt?LeW@?AfRwfg(OW|928Yeed@MZlB<11^E>YhSaK)1bbzIEb$USU2 zwa1%XMrlMKkQlj!sB~q2{&U+*aJ44Z-M3zGVC}Dd2wEL{eYGZTJc^&bCd}0?>nC1) zaQpu(fel8qfFFY5EK6ITwsD*4$cONezEYoE?QlEP!g}k1DSCD~0BLI}GHx;U>8q-OK?Qm~aLr_!R%$HVM6+Y(TEHxkOzVo` z!&0ehlk>}pk{)xj5v`%kVv(E25lNVnB^sQL7(qC5r~_&dK}_T?<4nA7eL3eMv;Fkh zdyi&&(e5DzK(qmW-Gw?9IH5WR_Q*Dq*EJJk&T24Kv9S&t^@-YEDKfjWH7$aV)F}4e z%e1H_Ls)_A5x^>t)4Up?HxReDZ^u2E!=;{8nH|>L2HS2PFFun7Yn8>El9Tbf&=C zi!H*jYsw^-CVvpCF5qs@t?IYFoO4^;2hW~<`#X>Jv#0MpTJL}Bp65DLYgP2gOIkIN zndRqBOVxrfPl%`ofr;k zfuPBMX{buNb!-NUnIo4g$)FI_O=XN2b_3m+T7hBnFr1pxRXoEKfT@)#7t?qM4W(^W z5^%+TZyW>8?g;zolP6Dq{?W5FA3s~;#Z^(yt%vUu)9{nK(VA=VKvb{qMt|bmvdHb z`?RO1x|>0&iBfC@7^^%!8}F7He>wqw%S&_^)Y}~?RZ7^v!oKwb+6W_vxdM2MLtEtv z5m^BZtZ4lRL*-#|u$(ewcL8=*obP$aRa};s64c~7s`OnmiAuPQ3;`5tfo z`o_`V_Vy$ix)w4+$INOi*(|a90FM}vK$dkx*Pt1P)Ulh~{B{xz)fOKMENj?*8{&I8?JM>o^-CB1@N~96f(!J?Czk%4EhEX)zwmh^ktcWF5I+ zPUE{|OUT%nfH8+kY?36}hLLW6nCU@ne=87lcuyaae3a{e{!LQ&(Al}9OwL*8*5^0p zJ)<9daqQO7pv_>9i*C8FR$kwA79qb9<~kfo=?SF%KkVQoc!8#zweA>*60 z!oIS#ym8&YcV~S+cCP&B{P+1iJL!sAW8x` z__BNKq<(9yHfxPa2LLZdZti8sHo3N3ivjvnsm;hxSe3#pwB%YhbI%d@HOX5-*hw|= zA>K>95EG=Ke&Z}EW8&q1uYBcYhjs#5g2IS2vVW`c4UI509b9Uw0IDVN;-xxOt`0ut zW^sp}3E(*$ZgzYi(5G9lEJzzhwA3MppnrJE@avr7XEkfA0Rc_2ry* zR(pF6l)k^@Lejc+I3{ddevsjV)XxD7wu}1hUWl=IcK-!SJGPdY@Sb()SAN^gSu1X0q_y2EfSLUxrwZmG(=3cK{XB|OKH}b z)#s5jeX-p`F(y=ho+!|C?APW11WG_lGPM#5p8{;YL{DH+pTvx`kk$T37dc;{#tBFWac0*MqcQDBo1y}Zx4RVan4F_EODQBS&`+74Krgc&Sj z?BrF?#0widCynzx3^CR*q{PhRbOLC!1mjuk`PP?nVqRZ=dVco}FvUABx!3jc<=2na zV3$D+l6&nz%??tXG;>t#n+WRe=mvLENi}WA;R09=rIOLNBpIwUha(X?OtMTXOa-aT zs(X)1TxF1~qN-~{JT%iXPh1_?^}dzsUiCetm(SO@K*9%9b@f$vGfMN@g5&DqQa}R| zBXrs!uxgNh8Lq02gFrae(3x9pj58PO6hmqyZA5-3EhFV1FFnW6z1ljA_9B2uBqGSf z+zTwwSG)YxqwZ662XwQ|8(;1~s^^BSUc-X4)nM-_mw4+=j zAJS#4!#EC0NCNSO-R=bH%2xL3#q)eikN z>z^}!=N6lHf8ZZiU$^Pd2!JIWbXP1SB(lV$zC2jh&Q{ikI>@{v<|-t4&&(2Q^1*An zL=y-REP=?hA4Pyi*a*zNn9ytTD4EDm~ySdU|f}d(%O(}Hj_RT!}9mQg_XO3(rKTRb<}ca zEF|Sq2**2`)^nEX12hg6#4uzX$gt+f)|21rU1+P`0dp zR*6^#Ai|oYBr#db-n&vHu?v>W<;>@AeK}`uXg$|QU;oYr_r$$Y>kg2q=xghX=&J6L z6x3Kx)atvJwD?xc0h|XnlKwxi2kw@b;DG-m3##JD%TjmeZppaZf>k@UAF?Ty1B>3j zJ8AclYgvLkc7Cka@LD~|llEdgfAMmESNu&ksY|=7lqxL6aJ}fet+dBFy;w8Wk!btFYt814yq!nz) zQ)lLM`E>%lCzMR20<6d?dpI`d9Teecy!J~u2q2fU{u|g zs#CNnChl00)TSB~j_FldckrRl`N{sRhwqaa_7D7~Z#{nY;=}gj-3EiT(&_hoj$vv& zjuJe85Q>?ye1XeyFy;iekk43u?z_qy7u48QvXzYKe5_5X9+c$oYN|GO9gGuzjB8J5 zZuP1)wK8s8T(X?AopjyZ*Io&S#7}zNeeu-`zd=h1E`R*TAHeDJQcPvSZ(f~mTWVn`8gALmWo-~8f#`J-bhpY`!>JZhf|5WoN90MV@@-4hFV+v!GL(88!rAyR4{ zf&8Dzc!@NsdICN)*TFl=-g0!|vI^8*tb@u5vmPigHPwT&An+O0Z)@G*m=O4_I83XN zWkE_#0P^-SK$LgtYh>W%*PopX$N(oq_&Q6DaKIw>0AGb@f;5qz2%z(opb@?0aXPN2OZmr(Mmp(>mMJfEW2HDIZ&a|AF{Gy*DRqZ$(QcRl@QLXq<1TUlQ^{vQ5P0#hm&bL*GXiB z%98oEYw7ZLj;mc@^v zyW~YgQy5-~HAkC7umt0}@($In?`_5?FATmvgbkXU&r0WPAipgM(B2l@XQs*Wl z+O5icf{^TgKBYHY$u|4)|NY2O3n&&+bYqjaK+^G3LiTH=48FEaN9#~;qK$+;BOgfY zfT$bUmq~w&VNZqx&SF)Cy^+ry-wb=qgU7so_Y@|h^XmEd`HP?7d&dFMtGw~(zm( z{=wsaC+pGE_n&;{t6%>3XFvXie*B-}$6vkMKYe<)N8A-S7J@tZ$#;M7r3Ivg210vm zk?OS-{g*U?)aRF#(u{PBVbMSpzn2Q4>f|XBB_PxAIhHifM@R}1MY@!p0+F8JCxr;O z*j9rR>0%7YI+F5c(TPYm+w-~SQ-NDUsQU|l_|E2!Hy*S5(|V8=x*BOc={iM0ASZR! znPK4FxW=H!RB%o+!>(k>w&kKhe(Ab$U_MI+j<2nq4)9ezgD@Bdo>fPVAn&LF#S_tk zEHmM2LQbs=Z5n>k#bj+8Id#z%Io_xbuE>f9ig@`y zzI<;Jt#;ZZ1rcFmhcxZC#@8;7@O5G)VLU z2SU$wi*UvRFA}z`z7MyO1A_r=t!ayYw)cD2ad8Ot^7p@{gHrP197}kXJYWHFQd{GV zj#Npoc6%PsvBRWc*&wx?c!#ivl+IN?P!$A&1*Tt-rli;UQo4;@6I|Nz+S!)SSPA^G zWxgWIV3TvW{DZIkT2;87fB3-%PoEL54inAG|MIo3e)&}_J$>hY{o09*%$L1?yV=K; zUpA<>zOrTr1FN<}FS(Wu>yK3ji`*DL9;BtOtty^VZHx&&&ks0I7^Ig3v-eOS8Ji&o zu0Q|)z%qe`8v=ttjzK&A?n>{`i&ghx$R~-6sY3h>QD{K}bad&>sm>VfWdto4BNs+_ zIk}`BE7|hdsnp3lZPFy=5^V{8szlP!Z_1Jt^{X5xp(OHp?tbXlKXHv`fzcyf?Db+? zSrXiO;O>uHwpg(q1C;~JY1a_uPB1sQf<-K3B1kU|D6*K6A@LnB34^y;xz(oJbjGLC z7Z0|OrY6JKFq24+9=dcBF1+-rffof^(p2s6*LOpsuazVG&&z=B)M0@>cgh zL^QQ-Rg>0}Q?UaJ+sY`3&>Q!X2#8&8Qx*P$gag#LGGsl5jrBpaDU-E}NYSF)n}hr+$rpk?RNf;^}<+{?{+R z_)}l~ZLeb1$FKdlpE^aWp-nTWbyfHlI-FU-k%HV1 zGO65D0bB#+W6Qwb&6MUYK?mgEwwYm;bRC#Txe8kBuqA!Lawo`=Q_#wCvw=%Uj@)%ff0dgy=}VrvN3EeWe|aZ~r@`&Dt>+HA zB1!m;EwB2b-y=tqL6o-K@c<@u)lw7Swa+?6l!!HJA{=T!W@^vPdeVM7d(3{`j)rbM ze4lLk{9`}xt-Hr}&+cB_eR$XIp4`2ASMK87xZ8L3Zr$ah-_!9o&uivx@?HJC@@L|E zjaS@V=T*y}k=NT@f8hI@uM+>x<9nM|I)4VfUwFOpRp-ylSB6(Rza99S=UoTyu=pqN zZiat1uk_=S!>ixbwN3u1$5pK3w;KPHxq*vgIMTzf@ z<4@gZIzInvci-=Wo#XNc?E`=Vmp^2GeTP=RU{8luf7qU4e^`<`k?}47pSkYcZS}nq zvsX6cp(Xd!1;JP^eO{8$-bS~iJue6mtS9M`=8dG!wF6F$KTbW{nldgQ6K+E4+d6WU zzXEyBj4sP`)plQ5o>a-S*95v{V2d|FimOsFjY-TyCm#x)iQPT11hQ6y@OEsM->-e{bKt-(d(m<=I86# zx30~^ZasFN0>DD{O;nX1kD-scj0)Z5ix8lPe7Ln!BRBMMOg~wLgAt`*p{*`8o=qd| zXdsqOTHH$Th^SycWWOAfo1|N*G3~`Wd#7aGrI}ZNe=T48$hX*@e2d@2(N!wy;qP)m zk2$J^q=i8Yup)IetLv($u5?It!UKpU8Nj-&6@bH9N+7Vzh_K#TV~u&CkIGblCXqk9 z1f&Z03-wX8a%O0H1v`Uevm0Yx{_>YKOJQFs*69E`P@dT^=}ziWaeZn{){1~q`L6Sh zaxw+)fAK`pJ}P9BSKDiiYi0-Bt=dcg+!!BWs@6)?t~%a|Ylkfsm1jlx+=8@=oSCpL z|HGG$PM9ScIi!GJWISqG0)cMwUsv6oA(qIQKrPSJSV`WgJBAe{PA7Q|%lHKT){32b zg>oDWL!H3{L5-DQwx<sg@{_1fRs#dfN&Q|%J>1`Cpd-$wAx@gEEvI3A)v-Swu1oJk>D%uPY&$hAx zf2I!B;v_;qiufs(EPnZ8uSK+o;f72XI28%%&MFtEFy;m2ihq?`~<-yE%3XihP zRYUf&OzT0CopZ{SC#l)Hhe?=%%1MO2RrOYpOl$Xig41f^xjS{c0`w7mU`J=n1AKODb@@XRx6^q_-%gk7z_G$drjos-t(P2FbYs>6RLpe~77Y zkJ^`$DLa#O!zmdw-h@RgD|M-AMQw>NXf0g+CtZc|C(({)Ey*?`Ve91NJY>0uR$*3? zt6zeM*~B)N(auQSM@zBY3<)%aXV&~`(=bV7sR#a$#i|KM1A}eMP@+FsKxYFbLx7r7 zN2DF~@;7u9Tt4xNJ0nn-!4Orxf7uda&9IQL)=^@#9IDqdMNTl`Dgq zwxqhKqJW|-0_9|laJfU;0$o;RR10V8jZ7a6e;HBQND=_6 zgi#1#<0Dx1lZeODAaxQ6YId0%cln#g8iB^=4s3v1G#(2&pjYv)XWjx^GWrAR>&Ze;s5(iquK@Ao7qj+4+1O9|Js@67U*97GQ9VuwXlnV(oQ! zWfM4*qQ{cb*mPwLQQSd}d{wwlo!lUqL-Xe<)sJ5#Dv}QqBUC zCl<>xHqCwcrJp`jCWsZ%#EVRLUX}7~XA%08=T>PQaZZKICAcm_O+I~&s`6w*axsMY z#?$NaMp3I~DUQ6ny;7=ZVwVCVPhqdA>K%22rD(}8yE?%GfB8E{X1}q~%;gugMx<3Z z=4sU}93$jhAgQ%R(jS(P`y7CJ;+I@&G46PY!Mp z!z3D#q>EMP?%>1;mFiqY&5UK+q`AxA)mW?$B%@GER9~2U(Oni};bI}*0=H3?L{Vk_ z%SzA7sEVG4%t(X0flSh3a860B!K#{M#iW!LfSyivCj87)e;E&-&BY$=o{j%WkD=|$ z-#gYwW)P>#Jbz}x3KbB|bk0l`TMq*=unCp|1p>E* zw#dOJYFCJDtHa&_u(L@`t%H_lVx;+_UHmw62$x^cRj3xp6k_dSe#augv!aNfj8r|H zGSTMJcdB(ne`cKlzcYTszA;E}&^c8{`&qyxG4fa>Hf@+}GWOD5pBpZf;|y%5&W!o2 z!=uQB)UoWi{Hm^k)dSEZL1@U_lp%J4b3lWcWoe*r`lcy zJ0%8&h^2HwkY&Mv1f&Yr)ek5y9TINZ(o2;h*C83x6o9mosNym&O#S(Ft zZqYQBD_}2HIajNCffNhZ-@zr71`Wx{5Z<2>VbnkgkW9pCQ>?EjAviA!kLM z${50ND_aizjI;(QBnR2-Ny+cl5e;#rrq+$@lBH=Ue%nm^pImtC{FKdku zF-UvzKqmZ5>1Aj2i~Z>KC3aH8ttWIP%5L%qy>tqo)K_C5aXI{ zDVJY4%xAdE00@Ut_`R85t0{#t$X@59(sCQz8^fbsPXH+28YI#HgE7#Jsa3i9*2ZPa ze{$4I2Tdl+WXnYwSsasnWsi0A4HF9qEmMt2K#hL+)vr8&gXYU$`^vlJVOr!}e)*># zLW=uqKmFOf$S!~5r%wiC%q=j5mnj#db19Pyoz9TvOIFJbp$W96POhwC)KMX0MFp8| zN%bU4LWu82I41y2ZjuhCoIW@gt!)HSz8^1Z6K=UPNBk3 z&UlH#C zmtVgD&x2e0|NKcoO>h>Ex)a}fRgp26VliG)-isb)ya@=+s*8;GRsl8PPa9}N71@Fd zuN~?{Fp~*Ghk9ArN{|$QCdJzf#YvKE5YA%;gSiBKgbv5-tzQ17u7azsEqQ{R6#GjW zU^%4{omdx@(m`vvI#t&8!jmgne;^Am%;kb8D>w);BKZnH6^W70HANmC&Vm~vC{1NB zRyH6o38~5vSQ9YRNhcwc%isEudo_!dPeO|7R_4;0Dz>vKz7pK&Ogh2|0K9 z1j3)R7Z{wj927gb;gHR%-eI1bpW1sQzxs$tC%$O!7Hth`jZv-QO|&AfUK4uXjX#@zo3ee|zWlqG@)O z@gO8<4j8b>h#i6qgk~6LvXAfHd#*&mf57`M>|>@$&-Bn$okqM-LE~s*6z@e%G#(O7 zqKSB;;*BVHlW06#dcc4eqTrpU-}6={&Q#Y7NR50SlTJvWf2ym#df&a*;d%C6>sfC= zOJq+vOg0TBW?4r7-!2>MHWdt$vNbM>ryjv2{7NHUp>;E`k`h?!MHkE}Dr)@B7?!sh zg-?u-IZ2CazEqVQVh7UI)}exg6QzBham{e}MK$0x$e>D;EucJxAgw;4Mz^;ZaRW9W)9qg*l8^h z3U2{5uqNuVSIsqV1nyNWnpeMQw#`WUE1RqtZw_#te=MKW(&3l)X2b#GjKsUGXc*Z5 zk=in$kUf2JJL!5iWc51LJSUJ7KMl~W5hZW00W_0euXC)b z>nBzhtL++?BMH8$5rUovhq*PSi^H$#DJrnAe{IrR#2{yZ@x{=IKSSC`o62%^VXV%C zv>y))l?7;a5&v!bS%2K~;^CS{%Ffj#raWfAXdp$miiVZ=6C4^=EE8_ui|)wgznI-Vq~E z1s~huqbVjya<;0hYXU^nO{H6YU4B|9YSOvq)g)bX z2cRn|*wLtgp($b={~Bu535WksnL0n%mLaL`cg8WtrE;-M$kC03!yGjdR_#;Cf09Ra zu}x^qAvP=yPLC;K7&#MBNvR{ZsEIYJLa!&lO7euHcz}(^S3-|CN{*by%puJK#CCkZdtP zr*IH+`0sr!fJRL{U9hM^HeyM@4VwhkmXxQ-6RKjX7xlY^BwTb-rRrE%f0k7B)gdR{ z4StvWp|e4Y5rn2=G&3aKhW>qn};92`S7a;_3VYiPuzU+-Cysfc+fxi!Tm=*dg+_{PyXc1t7HOR zzWLnSFF57vs|38`>k0trmE$ zeQetGE=N}M9SZS;8mtv=hlf>S5HTu2MSz(p!#P?LwWt7)jIZFE!>LILD$wzC;$0yl zM>S6EeMv-Mwd4yjfDcOsL^!|tuqGm1*>C=yemN#m^xJ8sY1;N>mhy2O-0=OvZD0)8D#GK zQRSfHF4_s-S#8hSSKV1%eEkMA>VgJ`N-iXf#_Ob|{Zk97of^j^5n&i#2JY)PqIpeH z0;N~MzS-ZLt?maeN5Ue&qflz4hkaaZbI zRhb1UKxWyQf4k=0>pKBNq25gvy1=c4Wxa?EW_S49Nf42b-`vZu;hch7;03E9!7M%j ze`1N8ZVdT2P@>gno(@durc2MgsVZ80VebVepMw-367BE>J%#luIEO9* z5rstEK8DD6;HXN)x|;q?R<%{q^YD{!^3l|8AelpK((oiu_yB~MS$z|mGpvb5!Him9 zq|*Wof1}QAq|Prusf)5Co@=(l@8~IlRe4O&xusJ-vfP2}kqU8eI*nZrHo@+|@42Z# zRO7Rq2Cr*#2?|z&Dok;ma2Q!bZ>;3g2>MoFb~rvV1)Vkp9e)wRHAJZ;b+bc6epgQ+ z=kfYA-dY0r12f=hSdb00&cjHdUR?)GfwTyJe>SzIO6$>GjEU+~tFAFn< zByJ${0h9@xm6&VvGeGEr#-ZRryeu^8@Wnl9l}7C05lJB$W(Q-cInG4F+?Hy$)e$S1 z^q_-9iQIwQo2EXiB|uXvTGzF}mWU4!>7|38K>&n;>8e1LY@M(tg$TCNvd)$)t^))` ze-V55lAc1PCu+vVS9D&ZmJRY1Ib0X>4sHof*C0eT-EYKpG8Zh6{{p0;5Tf`~T%Kit z9Bp6(^_!^FeA5taXq=dPX0I|SDoDH^ygQ|)onj6B@O!62)|-t|5XYxImSxoVzPhR* z%P5+jG1(lA8H4du10hgHf@QhcX@Wksf66OO4Vlr1@zA6h9##6OUTNq!98oi(t0t_( z<_KguJA_$OR)Zuk4uA8+YtiJR6Om7x1QGe!o7Yzw`}v#yt2Fjbafmx_xebdrf6J3^ z=bIn6z?RQ_%Z|fIRb%pkKrLvpF+F7{FE$;Zs-#sle3JM`1|HIGopqbynz{joe;KtJ zs5baA3nNR663DsfC{=exR&D+vxg`JRujZlexy600OVAls9p{B zQDcbI#kP+=gy@XD#!ua1csP$Q#Ui{`<0o>JcvH-mqvo+|@~@7X-+9qP{>+E!`Fv1+ z=oymEya%y-l6EkWdCFVH{TI)w%L+O2D*)PKHpDWxXS@alE_X)D;bD_?+`aasjm(`kS;%sdsf6xo7ys7Y!_pK~8 z%MMHr*lq{5%<1hirfY7Xbv(L>HYfHYWMfp_=11v~ZF6AOwaDcp?AW5z4>lFH#I9z} zNCYVwgDW}J#XpxcBA0=Z5o*Kc82%hST2;+*X$8<6?n(jZMv+M8|dJ2siQe%?p zHH`@}NljSZtW;B)OCgxO8LJqKPghV*Wi0#<#^g1)8S9o3UehQNyvhd+n0MVt9oJeN z21=8qdE;=pKmf=(>?39c4bGj1ztmIkYQQO$yJFtEDhfuUe@a%n%@9=h2AXVZ%Aci@ zk!x3xv;lBIGxounEF1JgGs84Wn>ZN>o_i&q-?u-pUGh3<=BkLv&ZdhwuZeW|@YN@t zd-sV#i+StKK|4tXyN-_2#G_-Wyh2cXj{Nt04x&BITsn{Q-3 zKl&}+zleA7IU3hzt=~xd#j1bQ+Nmef?Ex;bbqyvre^b)VWogD0rl-=FzPA+2LJIHE zrJ<3&LATFI6F_?OK?vFnsfx6%;3P{!XW;@}2OT6TjPCFY?@=bL6=7CT;jw9P02$Vijaf-KX@9Ul$kwzp1-(ckzp=V_c;Il>&gG zfMf|D1LN!(VoWHMIJYxq<0ar6+Xz50Z=f+TdMV{DS&;+)bY&TP*v8?npEy~P{;wxN z(*NzcB>mqnlk^3^k?@)&ny=7iTB{PP%L3OLf2V0&Y6xQKrd0EskeE*2phGHw%@9bl zE6wSyUdA%4Ym#FRm}^wu0^WfsyXL|gMXHBYRm!p9Y%tn+`P}=+ApdHTe)EE)k9&7t zy8q(+vpL3Gw_m)7@{g!c9C<-sqoVJ~CkX$qT>a?5;Z(Bf$=(`%^667ppie!0&FJ~* zf2S`;Pxw1bS7icTr-1641*{Yy-vWHbNA1uAV3TW_!W{^{*;Y|>bIsr*@t3(axLnPm-M$=rL^?mHaiL0aMcV9%$m+swu@%+K< z^XKo)alg;;;Q8C<^X#Q7ZV!*Ws*gkHf8!8(av}6HClNwFd)*NFxyvC`SE<8Ej;pl< zKfo1o&}3IlnyGbGqp`zV-)whVFQI@3+mzJv=vufYmsc-_<^Av;KL=DT;X6qs=iok= zoJu8hI#|boH3FnGfuD7f&K;e(AbV^Y<@DO&zq9&3flEjIztMoZoEqJ}u93B$a{VTT)UeYc@NK8iO`f zT{n}Y-o8oPx@aO5ZYvEIJ}=kQ8vjsJS0Ah8(-ZsVBspzW#=E>E9oOZkdF-2@tE1+- zE~4hy-FxTt?2*>HV=v+3c=^p6e=h|z_|tA_(1P^HrB)hAsixazor|WoEy?Is_0gy+ z0@NV`n7|G;+WW3+rJAE&gU2z$MhU6s&ifXrlasWgv`jTmtb2pku%gAOd!py)4}bff z*OH4o`Zj&}B%=0Lt{b(#dO2zn$x@kp?`WIOG^c7Vbngqcl)KY`QjPTj{yWKDVyGKBImm_l((dRlMGkwS-WJ<;Uxrzep-fBx*c$>Yx-!QQ%T z*Lb5bj7x2cS+e>qb)vX;o90#+0z|SBag~ z?8VoQQ^%Vsb-euaf5{%0{Pal#?T=kIXn*2z&{mtWP$k%MZL#zr=dBWc<~c`)t2->9 znuO!eUYjJW0o>B3o_iI51ZUKL?242!3oMyEDa9K=bn&crCXUve5+Rp;Nj8O;fxU6F zCa-ZhXdhW@^zihx6A>kP&0~>c z%K?4cW|DYg_%CE6pMe=V37?pY0r6))l3W;%iZUQ zLxThYz9>z4f7W%nk-A%erS;^y&OUtmrI+UTzWcZDjI&$c^Oh&yeMXde_>CVtujg}b zwd~t$p^!#uBn~z9g}>wXIiT73UB<^I=TwBz8eyaEM=k+i3tYyGOq+h!H>>*`SHE0~ zDgdj5I1Q8?0Jk|3`OHZ)*sGg!c@24WEBK`@fVvi8f7ni)9+MDDYf80vZYCHP9eZP$ zDM`e>%HYyUM#sb?(n-_=2xdu&hT?#)gfIfn)HGs(uv?nwnsm^Ep|Hk8JI(q9K&z!+ zJ;+%_Z_;IRApCtim|?571VA;;YjWwt{4{aiN?elvk#0l)dh%;Z{mx2{KJOJAI(!Nm zO*W+je^Ln>ayysxbJ^GEi;AR8CXYi9_$rjex0E-?{XAd^LldLs@_B4-dU(T(sx_9{ zqUZUShDeqUuz`SNze;oZvp81K;8q?4I8;MZr3-6D3}lz26ADqOlGanjA%;0iUlGri zSU!HYX%&{?$2%s0pA|q55D0!_jpIY{!Kz74f8>B9G5bx!4Z{Z@SB5)9At_K5OGeIg(~pl+uMVLTbIrO<1ZSrTHv zfA(`?J!R6-YZdqbqKvg$i7UCRuo$B*Rifg(lj36rL~d1M3m%ST19HTwytKxH3^PaO|H(v}yHGkY(nv$4YveW`>$M7Id9(Mbq_lJmMDW9>w9$j` z2z(vEkfE?@3E~rnhct8p_<=t^c<_z&f7+Ew+vuA*VuG{SxExf)>=$@?zCp3d zXwEqSDtp_iGAh5~3BR-H9-X&07Rn4iPE7+3f>EQsrn^d^#K#jV~oVeO$ zJsE5AysO=BxQG;aX%N~zevO?{_W~Gxz_`0A58SM3a45SHC%Lj}qO$rQMjobXF3R4c zt{Eg!t`&2iR%O4w!2(7n)o$ixphXqZi7KI^87G9Hf= zu#rEgkHLd1h7K^E5=(EJ1Z;;!Xcv69C}sd, Operation[]>; -export declare class ExpiredStateError extends Error { -} -export declare class NeedsMoreSignaturesError extends Error { -} -export declare class WalletDisconnectedError extends Error { -} -export declare class SendResultOnlyError extends Error { -} -export declare class SendFailedError extends Error { -} -export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { -} -type SendTx = SorobanRpc.Api.SendTransactionResponse; -type GetTx = SorobanRpc.Api.GetTransactionResponse; -export type u32 = number; -export type i32 = number; -export type u64 = bigint; -export type i64 = bigint; -export type u128 = bigint; -export type i128 = bigint; -export type u256 = bigint; -export type i256 = bigint; -export type Option = T | undefined; -export type Typepoint = bigint; -export type Duration = bigint; -export { Address }; -export interface Error_ { - message: string; -} -export interface Result { - unwrap(): T; - unwrapErr(): E; - isOk(): boolean; - isErr(): boolean; -} -export declare class Ok implements Result { - readonly value: T; - constructor(value: T); - unwrapErr(): E; - unwrap(): T; - isOk(): boolean; - isErr(): boolean; -} -export declare class Err implements Result { - readonly error: E; - constructor(error: E); - unwrapErr(): E; - unwrap(): never; - isOk(): boolean; - isErr(): boolean; -} -export declare const contractErrorPattern: RegExp; -type AssembledTransactionOptions = MethodOptions & ClassOptions & { - method: string; - args?: any[]; - parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; -}; -export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; -export declare class AssembledTransaction { - options: AssembledTransactionOptions; - raw: Tx; - private simulation?; - private simulationResult?; - private simulationTransactionData?; - private server; - toJSON(): string; - static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { - tx: XDR_BASE64; - simulationResult: { - auth: XDR_BASE64[]; - retval: XDR_BASE64; - }; - simulationTransactionData: XDR_BASE64; - }): AssembledTransaction; - private constructor(); - static fromSimulation(options: AssembledTransactionOptions): Promise>; - simulate: () => Promise; - get simulationData(): { - result: SorobanRpc.Api.SimulateHostFunctionResult; - transactionData: xdr.SorobanTransactionData; - }; - get result(): T; - parseError(errorMessage: string): Err | undefined; - getWallet: () => Promise; - getPublicKey: () => Promise; - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount: () => Promise; - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend: ({ secondsToWait, force }?: { - /** - * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). - */ - secondsToWait?: number | undefined; - /** - * If `true`, sign and send the transaction even if it is a read call. - */ - force?: boolean | undefined; - }) => Promise>; - getStorageExpiration: () => Promise; - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { - /** - * Whether or not to include auth entries that have already been signed. Default: false - */ - includeAlreadySigned?: boolean | undefined; - }) => Promise; - preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries: (expiration?: number | Promise) => Promise; - get isReadCall(): boolean; - hasRealInvoker: () => Promise; -} -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -declare class SentTransaction { - options: AssembledTransactionOptions; - assembled: AssembledTransaction; - server: SorobanRpc.Server; - signed: Tx; - sendTransactionResponse?: SendTx; - sendTransactionResponseAll?: SendTx[]; - getTransactionResponse?: GetTx; - getTransactionResponseAll?: GetTx[]; - constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); - static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; - private send; - get result(): T; -} diff --git a/contract-client/dist/cjs/assembled-tx.js b/contract-client/dist/cjs/assembled-tx.js deleted file mode 100644 index c60a6e5..0000000 --- a/contract-client/dist/cjs/assembled-tx.js +++ /dev/null @@ -1,462 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AssembledTransaction = exports.NULL_ACCOUNT = exports.contractErrorPattern = exports.Err = exports.Ok = exports.Address = exports.NoUnsignedNonInvokerAuthEntriesError = exports.SendFailedError = exports.SendResultOnlyError = exports.WalletDisconnectedError = exports.NeedsMoreSignaturesError = exports.ExpiredStateError = void 0; -const stellar_sdk_1 = require("@stellar/stellar-sdk"); -Object.defineProperty(exports, "Address", { enumerable: true, get: function () { return stellar_sdk_1.Address; } }); -const buffer_1 = require("buffer"); -class ExpiredStateError extends Error { -} -exports.ExpiredStateError = ExpiredStateError; -class NeedsMoreSignaturesError extends Error { -} -exports.NeedsMoreSignaturesError = NeedsMoreSignaturesError; -class WalletDisconnectedError extends Error { -} -exports.WalletDisconnectedError = WalletDisconnectedError; -class SendResultOnlyError extends Error { -} -exports.SendResultOnlyError = SendResultOnlyError; -class SendFailedError extends Error { -} -exports.SendFailedError = SendFailedError; -class NoUnsignedNonInvokerAuthEntriesError extends Error { -} -exports.NoUnsignedNonInvokerAuthEntriesError = NoUnsignedNonInvokerAuthEntriesError; -; -; -class Ok { - value; - constructor(value) { - this.value = value; - } - unwrapErr() { - throw new Error('No error'); - } - unwrap() { - return this.value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } -} -exports.Ok = Ok; -class Err { - error; - constructor(error) { - this.error = error; - } - unwrapErr() { - return this.error; - } - unwrap() { - throw new Error(this.error.message); - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } -} -exports.Err = Err; -exports.contractErrorPattern = /Error\(Contract, #(\d+)\)/; -exports.NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; -class AssembledTransaction { - options; - raw; - simulation; - simulationResult; - simulationTransactionData; - server; - toJSON() { - return JSON.stringify({ - method: this.options.method, - tx: this.raw?.toXDR(), - simulationResult: { - auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), - retval: this.simulationData.result.retval.toXDR('base64'), - }, - simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), - }); - } - static fromJSON(options, { tx, simulationResult, simulationTransactionData }) { - const txn = new AssembledTransaction(options); - txn.raw = stellar_sdk_1.TransactionBuilder.fromXDR(tx, options.networkPassphrase); - txn.simulationResult = { - auth: simulationResult.auth.map(a => stellar_sdk_1.xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), - retval: stellar_sdk_1.xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), - }; - txn.simulationTransactionData = stellar_sdk_1.xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64'); - return txn; - } - constructor(options) { - this.options = options; - this.server = new stellar_sdk_1.SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - } - static async fromSimulation(options) { - const tx = new AssembledTransaction(options); - const contract = new stellar_sdk_1.Contract(options.contractId); - tx.raw = new stellar_sdk_1.TransactionBuilder(await tx.getAccount(), { - fee: options.fee?.toString(10) ?? stellar_sdk_1.BASE_FEE, - networkPassphrase: options.networkPassphrase, - }) - .addOperation(contract.call(options.method, ...(options.args ?? []))) - .setTimeout(stellar_sdk_1.TimeoutInfinite) - .build(); - return await tx.simulate(); - } - simulate = async () => { - if (!this.raw) - throw new Error('Transaction has not yet been assembled'); - this.simulation = await this.server.simulateTransaction(this.raw); - if (stellar_sdk_1.SorobanRpc.Api.isSimulationSuccess(this.simulation)) { - this.raw = stellar_sdk_1.SorobanRpc.assembleTransaction(this.raw, this.simulation).build(); - } - return this; - }; - get simulationData() { - if (this.simulationResult && this.simulationTransactionData) { - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData, - }; - } - // else, we know we just did the simulation on this machine - const simulation = this.simulation; - if (stellar_sdk_1.SorobanRpc.Api.isSimulationError(simulation)) { - throw new Error(`Transaction simulation failed: "${simulation.error}"`); - } - if (stellar_sdk_1.SorobanRpc.Api.isSimulationRestore(simulation)) { - throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`); - } - if (!simulation.result) { - throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`); - } - // add to object for serialization & deserialization - this.simulationResult = simulation.result; - this.simulationTransactionData = simulation.transactionData.build(); - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData, - }; - } - get result() { - try { - return this.options.parseResultXdr(this.simulationData.result.retval); - } - catch (e) { - let err = this.parseError(e.toString()); - if (err) - return err; - throw e; - } - } - parseError(errorMessage) { - if (!this.options.errorTypes) - return; - const match = errorMessage.match(exports.contractErrorPattern); - if (!match) - return; - let i = parseInt(match[1], 10); - let err = this.options.errorTypes[i]; - if (err) - return new Err(err); - } - getWallet = async () => { - return this.options.wallet ?? (await Promise.resolve().then(() => require("@stellar/freighter-api"))).default; - }; - getPublicKey = async () => { - const wallet = await this.getWallet(); - if (await wallet.isConnected() && await wallet.isAllowed()) { - return (await wallet.getUserInfo()).publicKey; - } - }; - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount = async () => { - const publicKey = await this.getPublicKey(); - return publicKey - ? await this.server.getAccount(publicKey) - : new stellar_sdk_1.Account(exports.NULL_ACCOUNT, "0"); - }; - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend = async ({ secondsToWait = 10, force = false } = {}) => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated'); - } - if (!force && this.isReadCall) { - throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.'); - } - if (!await this.hasRealInvoker()) { - throw new WalletDisconnectedError('Wallet is not connected'); - } - if (this.raw.source !== (await this.getAccount()).accountId()) { - throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`); - } - if ((await this.needsNonInvokerSigningBy()).length) { - throw new NeedsMoreSignaturesError('Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.'); - } - return await SentTransaction.init(this.options, this, secondsToWait); - }; - getStorageExpiration = async () => { - const entryRes = await this.server.getLedgerEntries(new stellar_sdk_1.Contract(this.options.contractId).getFootprint()); - if (!entryRes.entries || - !entryRes.entries.length || - !entryRes.entries[0].liveUntilLedgerSeq) - throw new Error('failed to get ledger entry'); - return entryRes.entries[0].liveUntilLedgerSeq; - }; - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy = async ({ includeAlreadySigned = false, } = {}) => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated'); - } - // We expect that any transaction constructed by these libraries has a - // single operation, which is an InvokeHostFunction operation. The host - // function being invoked is the contract method call. - if (!("operations" in this.raw)) { - throw new Error(`Unexpected Transaction type; no operations: ${JSON.stringify(this.raw)}`); - } - const rawInvokeHostFunctionOp = this.raw - .operations[0]; - return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => entry.credentials().switch() === - stellar_sdk_1.xdr.SorobanCredentialsType.sorobanCredentialsAddress() && - (includeAlreadySigned || - entry.credentials().address().signature().switch().name === 'scvVoid')).map(entry => stellar_sdk_1.StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519())))]; - }; - preImageFor(entry, signatureExpirationLedger) { - const addrAuth = entry.credentials().address(); - return stellar_sdk_1.xdr.HashIdPreimage.envelopeTypeSorobanAuthorization(new stellar_sdk_1.xdr.HashIdPreimageSorobanAuthorization({ - networkId: (0, stellar_sdk_1.hash)(buffer_1.Buffer.from(this.options.networkPassphrase)), - nonce: addrAuth.nonce(), - invocation: entry.rootInvocation(), - signatureExpirationLedger, - })); - } - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries = async ( - /** - * When to set each auth entry to expire. Could be any number of blocks in - * the future. Can be supplied as a promise or a raw number. Default: - * contract's current `persistent` storage expiration date/ledger - * number/block. - */ - expiration = this.getStorageExpiration()) => { - if (!this.raw) - throw new Error('Transaction has not yet been assembled or simulated'); - const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy(); - if (!needsNonInvokerSigningBy) - throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?'); - const publicKey = await this.getPublicKey(); - if (!publicKey) - throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?'); - if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) - throw new Error(`No auth entries for public key "${publicKey}"`); - const wallet = await this.getWallet(); - const rawInvokeHostFunctionOp = this.raw - .operations[0]; - const authEntries = rawInvokeHostFunctionOp.auth ?? []; - for (const [i, entry] of authEntries.entries()) { - if (entry.credentials().switch() !== - stellar_sdk_1.xdr.SorobanCredentialsType.sorobanCredentialsAddress()) { - // if the invoker/source account, then the entry doesn't need explicit - // signature, since the tx envelope is already signed by the source - // account, so only check for sorobanCredentialsAddress - continue; - } - const pk = stellar_sdk_1.StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519()); - // this auth entry needs to be signed by a different account - // (or maybe already was!) - if (pk !== publicKey) - continue; - authEntries[i] = await (0, stellar_sdk_1.authorizeEntry)(entry, async (preimage) => buffer_1.Buffer.from(await wallet.signAuthEntry(preimage.toXDR('base64')), 'base64'), await expiration, this.options.networkPassphrase); - } - }; - get isReadCall() { - const authsCount = this.simulationData.result.auth.length; - const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length; - return (authsCount === 0) && (writeLength === 0); - } - hasRealInvoker = async () => { - const account = await this.getAccount(); - return account.accountId() !== exports.NULL_ACCOUNT; - }; -} -exports.AssembledTransaction = AssembledTransaction; -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -class SentTransaction { - options; - assembled; - server; - signed; - sendTransactionResponse; - sendTransactionResponseAll; - getTransactionResponse; - getTransactionResponseAll; - constructor(options, assembled) { - this.options = options; - this.assembled = assembled; - this.server = new stellar_sdk_1.SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - this.assembled = assembled; - } - static init = async (options, assembled, secondsToWait = 10) => { - const tx = new SentTransaction(options, assembled); - return await tx.send(secondsToWait); - }; - send = async (secondsToWait = 10) => { - const wallet = await this.assembled.getWallet(); - this.sendTransactionResponseAll = await withExponentialBackoff(async (previousFailure) => { - if (previousFailure) { - // Increment transaction sequence number and resimulate before trying again - // Soroban transaction can only have 1 operation - const op = this.assembled.raw.operations[0]; - this.assembled.raw = new stellar_sdk_1.TransactionBuilder(await this.assembled.getAccount(), { - fee: this.assembled.raw.fee, - networkPassphrase: this.options.networkPassphrase, - }) - .setTimeout(stellar_sdk_1.TimeoutInfinite) - .addOperation(stellar_sdk_1.Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] })) - .build(); - await this.assembled.simulate(); - } - const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { - networkPassphrase: this.options.networkPassphrase, - }); - this.signed = stellar_sdk_1.TransactionBuilder.fromXDR(signature, this.options.networkPassphrase); - return this.server.sendTransaction(this.signed); - }, resp => resp.status !== "PENDING", secondsToWait); - this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1]; - if (this.sendTransactionResponse.status !== "PENDING") { - throw new Error(`Tried to resubmit transaction for ${secondsToWait} seconds, but it's still failing. ` + - `All attempts: ${JSON.stringify(this.sendTransactionResponseAll, null, 2)}`); - } - const { hash } = this.sendTransactionResponse; - this.getTransactionResponseAll = await withExponentialBackoff(() => this.server.getTransaction(hash), resp => resp.status === stellar_sdk_1.SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, secondsToWait); - this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1]; - if (this.getTransactionResponse.status === stellar_sdk_1.SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { - console.error(`Waited ${secondsToWait} seconds for transaction to complete, but it did not. ` + - `Returning anyway. Check the transaction status manually. ` + - `Sent transaction: ${JSON.stringify(this.sendTransactionResponse, null, 2)}\n` + - `All attempts to get the result: ${JSON.stringify(this.getTransactionResponseAll, null, 2)}`); - } - return this; - }; - get result() { - // 1. check if transaction was submitted and awaited with `getTransaction` - if ("getTransactionResponse" in this && - this.getTransactionResponse) { - // getTransactionResponse has a `returnValue` field unless it failed - if ("returnValue" in this.getTransactionResponse) { - return this.options.parseResultXdr(this.getTransactionResponse.returnValue); - } - // if "returnValue" not present, the transaction failed; return without parsing the result - throw new Error("Transaction failed! Cannot parse result."); - } - // 2. otherwise, maybe it was merely sent with `sendTransaction` - if (this.sendTransactionResponse) { - const errorResult = this.sendTransactionResponse.errorResult?.result(); - if (errorResult) { - throw new SendFailedError(`Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}`); - } - throw new SendResultOnlyError(`Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\``); - } - // 3. finally, if neither of those are present, throw an error - throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`); - } -} -/** - * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. - * Returns an array of all attempts to call the function. - */ -async function withExponentialBackoff(fn, keepWaitingIf, secondsToWait, exponentialFactor = 1.5, verbose = false) { - const attempts = []; - let count = 0; - attempts.push(await fn()); - if (!keepWaitingIf(attempts[attempts.length - 1])) - return attempts; - const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf(); - let waitTime = 1000; - let totalWaitTime = waitTime; - while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { - count++; - // Wait a beat - if (verbose) { - console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`); - } - await new Promise(res => setTimeout(res, waitTime)); - // Exponential backoff - waitTime = waitTime * exponentialFactor; - if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { - waitTime = waitUntil - Date.now(); - if (verbose) { - console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`); - } - } - totalWaitTime = waitTime + totalWaitTime; - // Try again - attempts.push(await fn(attempts[attempts.length - 1])); - if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { - console.info(`${count}. Called ${fn}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2)}`); - } - } - return attempts; -} diff --git a/contract-client/dist/cjs/index.d.ts b/contract-client/dist/cjs/index.d.ts deleted file mode 100644 index 6c077b4..0000000 --- a/contract-client/dist/cjs/index.d.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { ContractSpec } from '@stellar/stellar-sdk'; -import { AssembledTransaction } from './assembled-tx.js'; -import type { i128 } from './assembled-tx.js'; -import type { ClassOptions } from './method-options.js'; -export * from './assembled-tx.js'; -export * from './method-options.js'; -export declare const networks: { - readonly testnet: { - readonly networkPassphrase: "Test SDF Network ; September 2015"; - readonly contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY"; - }; -}; -/** - - */ -export type DataKey = { - tag: "Offers"; - values: readonly [string]; -}; -/** - - */ -export interface Offer { - /** - - */ - amount: i128; - /** - - */ - list_price: i128; - /** - - */ - mft: string; -} -/** - - */ -export interface Owner { - /** - - */ - amount: i128; - /** - - */ - mft: string; - /** - - */ - public_key: string; -} -/** - - */ -export declare const Errors: {}; -export declare class Contract { - readonly options: ClassOptions; - spec: ContractSpec; - constructor(options: ClassOptions); - private readonly parsers; - private txFromJSON; - readonly fromJSON: { - buy: (json: string) => AssembledTransaction; - balance: (json: string) => AssembledTransaction; - setOffer: (json: string) => AssembledTransaction; - getOffer: (json: string) => AssembledTransaction; - deleteOffer: (json: string) => AssembledTransaction; - }; - /** -* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - buy: ({ buyer, mft, amount }: { - buyer: string; - mft: string; - amount: i128; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - balance: ({ address }: { - address: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - setOffer: ({ offer }: { - offer: Offer; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - getOffer: ({ mft }: { - mft: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - deleteOffer: ({ mft }: { - mft: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; -} diff --git a/contract-client/dist/cjs/index.js b/contract-client/dist/cjs/index.js deleted file mode 100644 index 6d5ca79..0000000 --- a/contract-client/dist/cjs/index.js +++ /dev/null @@ -1,141 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Contract = exports.Errors = exports.networks = void 0; -const stellar_sdk_1 = require("@stellar/stellar-sdk"); -const buffer_1 = require("buffer"); -const assembled_tx_js_1 = require("./assembled-tx.js"); -__exportStar(require("./assembled-tx.js"), exports); -__exportStar(require("./method-options.js"), exports); -if (typeof window !== 'undefined') { - //@ts-ignore Buffer exists - window.Buffer = window.Buffer || buffer_1.Buffer; -} -exports.networks = { - testnet: { - networkPassphrase: "Test SDF Network ; September 2015", - contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", - } -}; -/** - - */ -exports.Errors = {}; -class Contract { - options; - spec; - constructor(options) { - this.options = options; - this.spec = new stellar_sdk_1.ContractSpec([ - "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", - "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", - "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", - "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", - "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", - "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", - "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", - "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" - ]); - } - parsers = { - buy: () => { }, - balance: (result) => this.spec.funcResToNative("balance", result), - setOffer: () => { }, - getOffer: (result) => this.spec.funcResToNative("get_offer", result), - deleteOffer: () => { } - }; - txFromJSON = (json) => { - const { method, ...tx } = JSON.parse(json); - return assembled_tx_js_1.AssembledTransaction.fromJSON({ - ...this.options, - method, - parseResultXdr: this.parsers[method], - }, tx); - }; - fromJSON = { - buy: (this.txFromJSON), - balance: (this.txFromJSON), - setOffer: (this.txFromJSON), - getOffer: (this.txFromJSON), - deleteOffer: (this.txFromJSON) - }; - /** -* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - buy = async ({ buyer, mft, amount }, options = {}) => { - return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ - method: 'buy', - args: this.spec.funcArgsToScVals("buy", { buyer: new stellar_sdk_1.Address(buyer), mft: new stellar_sdk_1.Address(mft), amount }), - ...options, - ...this.options, - errorTypes: exports.Errors, - parseResultXdr: this.parsers['buy'], - }); - }; - /** -* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - balance = async ({ address }, options = {}) => { - return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ - method: 'balance', - args: this.spec.funcArgsToScVals("balance", { address: new stellar_sdk_1.Address(address) }), - ...options, - ...this.options, - errorTypes: exports.Errors, - parseResultXdr: this.parsers['balance'], - }); - }; - /** -* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - setOffer = async ({ offer }, options = {}) => { - return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ - method: 'set_offer', - args: this.spec.funcArgsToScVals("set_offer", { offer }), - ...options, - ...this.options, - errorTypes: exports.Errors, - parseResultXdr: this.parsers['setOffer'], - }); - }; - /** -* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - getOffer = async ({ mft }, options = {}) => { - return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ - method: 'get_offer', - args: this.spec.funcArgsToScVals("get_offer", { mft: new stellar_sdk_1.Address(mft) }), - ...options, - ...this.options, - errorTypes: exports.Errors, - parseResultXdr: this.parsers['getOffer'], - }); - }; - /** -* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - deleteOffer = async ({ mft }, options = {}) => { - return await assembled_tx_js_1.AssembledTransaction.fromSimulation({ - method: 'delete_offer', - args: this.spec.funcArgsToScVals("delete_offer", { mft: new stellar_sdk_1.Address(mft) }), - ...options, - ...this.options, - errorTypes: exports.Errors, - parseResultXdr: this.parsers['deleteOffer'], - }); - }; -} -exports.Contract = Contract; diff --git a/contract-client/dist/cjs/method-options.d.ts b/contract-client/dist/cjs/method-options.d.ts deleted file mode 100644 index 6840adb..0000000 --- a/contract-client/dist/cjs/method-options.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -declare let responseTypes: 'simulated' | 'full' | undefined; -export type ResponseTypes = typeof responseTypes; -export type XDR_BASE64 = string; -export interface Wallet { - isConnected: () => Promise; - isAllowed: () => Promise; - getUserInfo: () => Promise<{ - publicKey?: string; - }>; - signTransaction: (tx: XDR_BASE64, opts?: { - network?: string; - networkPassphrase?: string; - accountToSign?: string; - }) => Promise; - signAuthEntry: (entryXdr: XDR_BASE64, opts?: { - accountToSign?: string; - }) => Promise; -} -export type ClassOptions = { - contractId: string; - networkPassphrase: string; - rpcUrl: string; - errorTypes?: Record; - /** - * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: - * - * @example - * ```ts - * import freighter from "@stellar/freighter-api"; - * import { Contract } from "contract-client"; - * const contract = new Contract({ - * …, - * wallet: freighter, - * }) - * ``` - */ - wallet?: Wallet; -}; -export type MethodOptions = { - /** - * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') - */ - fee?: number; -}; -export {}; diff --git a/contract-client/dist/cjs/method-options.js b/contract-client/dist/cjs/method-options.js deleted file mode 100644 index 6d483ac..0000000 --- a/contract-client/dist/cjs/method-options.js +++ /dev/null @@ -1,4 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -// defined this way so typeahead shows full union, not named alias -let responseTypes; diff --git a/contract-client/dist/esm/assembled-tx.d.ts b/contract-client/dist/esm/assembled-tx.d.ts deleted file mode 100644 index 1d5e6f5..0000000 --- a/contract-client/dist/esm/assembled-tx.d.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Account, Address, Operation, SorobanRpc, xdr } from "@stellar/stellar-sdk"; -import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; -import type { ClassOptions, MethodOptions, Wallet, XDR_BASE64 } from "./method-options.js"; -export type Tx = Transaction, Operation[]>; -export declare class ExpiredStateError extends Error { -} -export declare class NeedsMoreSignaturesError extends Error { -} -export declare class WalletDisconnectedError extends Error { -} -export declare class SendResultOnlyError extends Error { -} -export declare class SendFailedError extends Error { -} -export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { -} -type SendTx = SorobanRpc.Api.SendTransactionResponse; -type GetTx = SorobanRpc.Api.GetTransactionResponse; -export type u32 = number; -export type i32 = number; -export type u64 = bigint; -export type i64 = bigint; -export type u128 = bigint; -export type i128 = bigint; -export type u256 = bigint; -export type i256 = bigint; -export type Option = T | undefined; -export type Typepoint = bigint; -export type Duration = bigint; -export { Address }; -export interface Error_ { - message: string; -} -export interface Result { - unwrap(): T; - unwrapErr(): E; - isOk(): boolean; - isErr(): boolean; -} -export declare class Ok implements Result { - readonly value: T; - constructor(value: T); - unwrapErr(): E; - unwrap(): T; - isOk(): boolean; - isErr(): boolean; -} -export declare class Err implements Result { - readonly error: E; - constructor(error: E); - unwrapErr(): E; - unwrap(): never; - isOk(): boolean; - isErr(): boolean; -} -export declare const contractErrorPattern: RegExp; -type AssembledTransactionOptions = MethodOptions & ClassOptions & { - method: string; - args?: any[]; - parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; -}; -export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; -export declare class AssembledTransaction { - options: AssembledTransactionOptions; - raw: Tx; - private simulation?; - private simulationResult?; - private simulationTransactionData?; - private server; - toJSON(): string; - static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { - tx: XDR_BASE64; - simulationResult: { - auth: XDR_BASE64[]; - retval: XDR_BASE64; - }; - simulationTransactionData: XDR_BASE64; - }): AssembledTransaction; - private constructor(); - static fromSimulation(options: AssembledTransactionOptions): Promise>; - simulate: () => Promise; - get simulationData(): { - result: SorobanRpc.Api.SimulateHostFunctionResult; - transactionData: xdr.SorobanTransactionData; - }; - get result(): T; - parseError(errorMessage: string): Err | undefined; - getWallet: () => Promise; - getPublicKey: () => Promise; - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount: () => Promise; - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend: ({ secondsToWait, force }?: { - /** - * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). - */ - secondsToWait?: number | undefined; - /** - * If `true`, sign and send the transaction even if it is a read call. - */ - force?: boolean | undefined; - }) => Promise>; - getStorageExpiration: () => Promise; - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { - /** - * Whether or not to include auth entries that have already been signed. Default: false - */ - includeAlreadySigned?: boolean | undefined; - }) => Promise; - preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries: (expiration?: number | Promise) => Promise; - get isReadCall(): boolean; - hasRealInvoker: () => Promise; -} -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -declare class SentTransaction { - options: AssembledTransactionOptions; - assembled: AssembledTransaction; - server: SorobanRpc.Server; - signed: Tx; - sendTransactionResponse?: SendTx; - sendTransactionResponseAll?: SendTx[]; - getTransactionResponse?: GetTx; - getTransactionResponseAll?: GetTx[]; - constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); - static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; - private send; - get result(): T; -} diff --git a/contract-client/dist/esm/assembled-tx.js b/contract-client/dist/esm/assembled-tx.js deleted file mode 100644 index 79b7c01..0000000 --- a/contract-client/dist/esm/assembled-tx.js +++ /dev/null @@ -1,450 +0,0 @@ -import { Account, Address, Contract, Operation, SorobanRpc, StrKey, TimeoutInfinite, TransactionBuilder, authorizeEntry, hash, xdr, BASE_FEE, } from "@stellar/stellar-sdk"; -import { Buffer } from "buffer"; -export class ExpiredStateError extends Error { -} -export class NeedsMoreSignaturesError extends Error { -} -export class WalletDisconnectedError extends Error { -} -export class SendResultOnlyError extends Error { -} -export class SendFailedError extends Error { -} -export class NoUnsignedNonInvokerAuthEntriesError extends Error { -} -export { Address }; -; -; -export class Ok { - value; - constructor(value) { - this.value = value; - } - unwrapErr() { - throw new Error('No error'); - } - unwrap() { - return this.value; - } - isOk() { - return true; - } - isErr() { - return !this.isOk(); - } -} -export class Err { - error; - constructor(error) { - this.error = error; - } - unwrapErr() { - return this.error; - } - unwrap() { - throw new Error(this.error.message); - } - isOk() { - return false; - } - isErr() { - return !this.isOk(); - } -} -export const contractErrorPattern = /Error\(Contract, #(\d+)\)/; -export const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; -export class AssembledTransaction { - options; - raw; - simulation; - simulationResult; - simulationTransactionData; - server; - toJSON() { - return JSON.stringify({ - method: this.options.method, - tx: this.raw?.toXDR(), - simulationResult: { - auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), - retval: this.simulationData.result.retval.toXDR('base64'), - }, - simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), - }); - } - static fromJSON(options, { tx, simulationResult, simulationTransactionData }) { - const txn = new AssembledTransaction(options); - txn.raw = TransactionBuilder.fromXDR(tx, options.networkPassphrase); - txn.simulationResult = { - auth: simulationResult.auth.map(a => xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), - retval: xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), - }; - txn.simulationTransactionData = xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64'); - return txn; - } - constructor(options) { - this.options = options; - this.server = new SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - } - static async fromSimulation(options) { - const tx = new AssembledTransaction(options); - const contract = new Contract(options.contractId); - tx.raw = new TransactionBuilder(await tx.getAccount(), { - fee: options.fee?.toString(10) ?? BASE_FEE, - networkPassphrase: options.networkPassphrase, - }) - .addOperation(contract.call(options.method, ...(options.args ?? []))) - .setTimeout(TimeoutInfinite) - .build(); - return await tx.simulate(); - } - simulate = async () => { - if (!this.raw) - throw new Error('Transaction has not yet been assembled'); - this.simulation = await this.server.simulateTransaction(this.raw); - if (SorobanRpc.Api.isSimulationSuccess(this.simulation)) { - this.raw = SorobanRpc.assembleTransaction(this.raw, this.simulation).build(); - } - return this; - }; - get simulationData() { - if (this.simulationResult && this.simulationTransactionData) { - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData, - }; - } - // else, we know we just did the simulation on this machine - const simulation = this.simulation; - if (SorobanRpc.Api.isSimulationError(simulation)) { - throw new Error(`Transaction simulation failed: "${simulation.error}"`); - } - if (SorobanRpc.Api.isSimulationRestore(simulation)) { - throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`); - } - if (!simulation.result) { - throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`); - } - // add to object for serialization & deserialization - this.simulationResult = simulation.result; - this.simulationTransactionData = simulation.transactionData.build(); - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData, - }; - } - get result() { - try { - return this.options.parseResultXdr(this.simulationData.result.retval); - } - catch (e) { - let err = this.parseError(e.toString()); - if (err) - return err; - throw e; - } - } - parseError(errorMessage) { - if (!this.options.errorTypes) - return; - const match = errorMessage.match(contractErrorPattern); - if (!match) - return; - let i = parseInt(match[1], 10); - let err = this.options.errorTypes[i]; - if (err) - return new Err(err); - } - getWallet = async () => { - return this.options.wallet ?? (await import("@stellar/freighter-api")).default; - }; - getPublicKey = async () => { - const wallet = await this.getWallet(); - if (await wallet.isConnected() && await wallet.isAllowed()) { - return (await wallet.getUserInfo()).publicKey; - } - }; - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount = async () => { - const publicKey = await this.getPublicKey(); - return publicKey - ? await this.server.getAccount(publicKey) - : new Account(NULL_ACCOUNT, "0"); - }; - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend = async ({ secondsToWait = 10, force = false } = {}) => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated'); - } - if (!force && this.isReadCall) { - throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.'); - } - if (!await this.hasRealInvoker()) { - throw new WalletDisconnectedError('Wallet is not connected'); - } - if (this.raw.source !== (await this.getAccount()).accountId()) { - throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`); - } - if ((await this.needsNonInvokerSigningBy()).length) { - throw new NeedsMoreSignaturesError('Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.'); - } - return await SentTransaction.init(this.options, this, secondsToWait); - }; - getStorageExpiration = async () => { - const entryRes = await this.server.getLedgerEntries(new Contract(this.options.contractId).getFootprint()); - if (!entryRes.entries || - !entryRes.entries.length || - !entryRes.entries[0].liveUntilLedgerSeq) - throw new Error('failed to get ledger entry'); - return entryRes.entries[0].liveUntilLedgerSeq; - }; - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy = async ({ includeAlreadySigned = false, } = {}) => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated'); - } - // We expect that any transaction constructed by these libraries has a - // single operation, which is an InvokeHostFunction operation. The host - // function being invoked is the contract method call. - if (!("operations" in this.raw)) { - throw new Error(`Unexpected Transaction type; no operations: ${JSON.stringify(this.raw)}`); - } - const rawInvokeHostFunctionOp = this.raw - .operations[0]; - return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => entry.credentials().switch() === - xdr.SorobanCredentialsType.sorobanCredentialsAddress() && - (includeAlreadySigned || - entry.credentials().address().signature().switch().name === 'scvVoid')).map(entry => StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519())))]; - }; - preImageFor(entry, signatureExpirationLedger) { - const addrAuth = entry.credentials().address(); - return xdr.HashIdPreimage.envelopeTypeSorobanAuthorization(new xdr.HashIdPreimageSorobanAuthorization({ - networkId: hash(Buffer.from(this.options.networkPassphrase)), - nonce: addrAuth.nonce(), - invocation: entry.rootInvocation(), - signatureExpirationLedger, - })); - } - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries = async ( - /** - * When to set each auth entry to expire. Could be any number of blocks in - * the future. Can be supplied as a promise or a raw number. Default: - * contract's current `persistent` storage expiration date/ledger - * number/block. - */ - expiration = this.getStorageExpiration()) => { - if (!this.raw) - throw new Error('Transaction has not yet been assembled or simulated'); - const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy(); - if (!needsNonInvokerSigningBy) - throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?'); - const publicKey = await this.getPublicKey(); - if (!publicKey) - throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?'); - if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) - throw new Error(`No auth entries for public key "${publicKey}"`); - const wallet = await this.getWallet(); - const rawInvokeHostFunctionOp = this.raw - .operations[0]; - const authEntries = rawInvokeHostFunctionOp.auth ?? []; - for (const [i, entry] of authEntries.entries()) { - if (entry.credentials().switch() !== - xdr.SorobanCredentialsType.sorobanCredentialsAddress()) { - // if the invoker/source account, then the entry doesn't need explicit - // signature, since the tx envelope is already signed by the source - // account, so only check for sorobanCredentialsAddress - continue; - } - const pk = StrKey.encodeEd25519PublicKey(entry.credentials().address().address().accountId().ed25519()); - // this auth entry needs to be signed by a different account - // (or maybe already was!) - if (pk !== publicKey) - continue; - authEntries[i] = await authorizeEntry(entry, async (preimage) => Buffer.from(await wallet.signAuthEntry(preimage.toXDR('base64')), 'base64'), await expiration, this.options.networkPassphrase); - } - }; - get isReadCall() { - const authsCount = this.simulationData.result.auth.length; - const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length; - return (authsCount === 0) && (writeLength === 0); - } - hasRealInvoker = async () => { - const account = await this.getAccount(); - return account.accountId() !== NULL_ACCOUNT; - }; -} -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -class SentTransaction { - options; - assembled; - server; - signed; - sendTransactionResponse; - sendTransactionResponseAll; - getTransactionResponse; - getTransactionResponseAll; - constructor(options, assembled) { - this.options = options; - this.assembled = assembled; - this.server = new SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - this.assembled = assembled; - } - static init = async (options, assembled, secondsToWait = 10) => { - const tx = new SentTransaction(options, assembled); - return await tx.send(secondsToWait); - }; - send = async (secondsToWait = 10) => { - const wallet = await this.assembled.getWallet(); - this.sendTransactionResponseAll = await withExponentialBackoff(async (previousFailure) => { - if (previousFailure) { - // Increment transaction sequence number and resimulate before trying again - // Soroban transaction can only have 1 operation - const op = this.assembled.raw.operations[0]; - this.assembled.raw = new TransactionBuilder(await this.assembled.getAccount(), { - fee: this.assembled.raw.fee, - networkPassphrase: this.options.networkPassphrase, - }) - .setTimeout(TimeoutInfinite) - .addOperation(Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] })) - .build(); - await this.assembled.simulate(); - } - const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { - networkPassphrase: this.options.networkPassphrase, - }); - this.signed = TransactionBuilder.fromXDR(signature, this.options.networkPassphrase); - return this.server.sendTransaction(this.signed); - }, resp => resp.status !== "PENDING", secondsToWait); - this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1]; - if (this.sendTransactionResponse.status !== "PENDING") { - throw new Error(`Tried to resubmit transaction for ${secondsToWait} seconds, but it's still failing. ` + - `All attempts: ${JSON.stringify(this.sendTransactionResponseAll, null, 2)}`); - } - const { hash } = this.sendTransactionResponse; - this.getTransactionResponseAll = await withExponentialBackoff(() => this.server.getTransaction(hash), resp => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, secondsToWait); - this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1]; - if (this.getTransactionResponse.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { - console.error(`Waited ${secondsToWait} seconds for transaction to complete, but it did not. ` + - `Returning anyway. Check the transaction status manually. ` + - `Sent transaction: ${JSON.stringify(this.sendTransactionResponse, null, 2)}\n` + - `All attempts to get the result: ${JSON.stringify(this.getTransactionResponseAll, null, 2)}`); - } - return this; - }; - get result() { - // 1. check if transaction was submitted and awaited with `getTransaction` - if ("getTransactionResponse" in this && - this.getTransactionResponse) { - // getTransactionResponse has a `returnValue` field unless it failed - if ("returnValue" in this.getTransactionResponse) { - return this.options.parseResultXdr(this.getTransactionResponse.returnValue); - } - // if "returnValue" not present, the transaction failed; return without parsing the result - throw new Error("Transaction failed! Cannot parse result."); - } - // 2. otherwise, maybe it was merely sent with `sendTransaction` - if (this.sendTransactionResponse) { - const errorResult = this.sendTransactionResponse.errorResult?.result(); - if (errorResult) { - throw new SendFailedError(`Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}`); - } - throw new SendResultOnlyError(`Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\``); - } - // 3. finally, if neither of those are present, throw an error - throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`); - } -} -/** - * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. - * Returns an array of all attempts to call the function. - */ -async function withExponentialBackoff(fn, keepWaitingIf, secondsToWait, exponentialFactor = 1.5, verbose = false) { - const attempts = []; - let count = 0; - attempts.push(await fn()); - if (!keepWaitingIf(attempts[attempts.length - 1])) - return attempts; - const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf(); - let waitTime = 1000; - let totalWaitTime = waitTime; - while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { - count++; - // Wait a beat - if (verbose) { - console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`); - } - await new Promise(res => setTimeout(res, waitTime)); - // Exponential backoff - waitTime = waitTime * exponentialFactor; - if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { - waitTime = waitUntil - Date.now(); - if (verbose) { - console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`); - } - } - totalWaitTime = waitTime + totalWaitTime; - // Try again - attempts.push(await fn(attempts[attempts.length - 1])); - if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { - console.info(`${count}. Called ${fn}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2)}`); - } - } - return attempts; -} diff --git a/contract-client/dist/esm/index.d.ts b/contract-client/dist/esm/index.d.ts deleted file mode 100644 index 6c077b4..0000000 --- a/contract-client/dist/esm/index.d.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { ContractSpec } from '@stellar/stellar-sdk'; -import { AssembledTransaction } from './assembled-tx.js'; -import type { i128 } from './assembled-tx.js'; -import type { ClassOptions } from './method-options.js'; -export * from './assembled-tx.js'; -export * from './method-options.js'; -export declare const networks: { - readonly testnet: { - readonly networkPassphrase: "Test SDF Network ; September 2015"; - readonly contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY"; - }; -}; -/** - - */ -export type DataKey = { - tag: "Offers"; - values: readonly [string]; -}; -/** - - */ -export interface Offer { - /** - - */ - amount: i128; - /** - - */ - list_price: i128; - /** - - */ - mft: string; -} -/** - - */ -export interface Owner { - /** - - */ - amount: i128; - /** - - */ - mft: string; - /** - - */ - public_key: string; -} -/** - - */ -export declare const Errors: {}; -export declare class Contract { - readonly options: ClassOptions; - spec: ContractSpec; - constructor(options: ClassOptions); - private readonly parsers; - private txFromJSON; - readonly fromJSON: { - buy: (json: string) => AssembledTransaction; - balance: (json: string) => AssembledTransaction; - setOffer: (json: string) => AssembledTransaction; - getOffer: (json: string) => AssembledTransaction; - deleteOffer: (json: string) => AssembledTransaction; - }; - /** -* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - buy: ({ buyer, mft, amount }: { - buyer: string; - mft: string; - amount: i128; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - balance: ({ address }: { - address: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - setOffer: ({ offer }: { - offer: Offer; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - getOffer: ({ mft }: { - mft: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; - /** -* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - deleteOffer: ({ mft }: { - mft: string; - }, options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - }) => Promise>; -} diff --git a/contract-client/dist/esm/index.js b/contract-client/dist/esm/index.js deleted file mode 100644 index c73213c..0000000 --- a/contract-client/dist/esm/index.js +++ /dev/null @@ -1,123 +0,0 @@ -import { ContractSpec, Address } from '@stellar/stellar-sdk'; -import { Buffer } from "buffer"; -import { AssembledTransaction } from './assembled-tx.js'; -export * from './assembled-tx.js'; -export * from './method-options.js'; -if (typeof window !== 'undefined') { - //@ts-ignore Buffer exists - window.Buffer = window.Buffer || Buffer; -} -export const networks = { - testnet: { - networkPassphrase: "Test SDF Network ; September 2015", - contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", - } -}; -/** - - */ -export const Errors = {}; -export class Contract { - options; - spec; - constructor(options) { - this.options = options; - this.spec = new ContractSpec([ - "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", - "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", - "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", - "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", - "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", - "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", - "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", - "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" - ]); - } - parsers = { - buy: () => { }, - balance: (result) => this.spec.funcResToNative("balance", result), - setOffer: () => { }, - getOffer: (result) => this.spec.funcResToNative("get_offer", result), - deleteOffer: () => { } - }; - txFromJSON = (json) => { - const { method, ...tx } = JSON.parse(json); - return AssembledTransaction.fromJSON({ - ...this.options, - method, - parseResultXdr: this.parsers[method], - }, tx); - }; - fromJSON = { - buy: (this.txFromJSON), - balance: (this.txFromJSON), - setOffer: (this.txFromJSON), - getOffer: (this.txFromJSON), - deleteOffer: (this.txFromJSON) - }; - /** -* Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - buy = async ({ buyer, mft, amount }, options = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'buy', - args: this.spec.funcArgsToScVals("buy", { buyer: new Address(buyer), mft: new Address(mft), amount }), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['buy'], - }); - }; - /** -* Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - balance = async ({ address }, options = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'balance', - args: this.spec.funcArgsToScVals("balance", { address: new Address(address) }), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['balance'], - }); - }; - /** -* Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - setOffer = async ({ offer }, options = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'set_offer', - args: this.spec.funcArgsToScVals("set_offer", { offer }), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['setOffer'], - }); - }; - /** -* Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - getOffer = async ({ mft }, options = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'get_offer', - args: this.spec.funcArgsToScVals("get_offer", { mft: new Address(mft) }), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['getOffer'], - }); - }; - /** -* Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. -*/ - deleteOffer = async ({ mft }, options = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'delete_offer', - args: this.spec.funcArgsToScVals("delete_offer", { mft: new Address(mft) }), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['deleteOffer'], - }); - }; -} diff --git a/contract-client/dist/esm/method-options.d.ts b/contract-client/dist/esm/method-options.d.ts deleted file mode 100644 index 6840adb..0000000 --- a/contract-client/dist/esm/method-options.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -declare let responseTypes: 'simulated' | 'full' | undefined; -export type ResponseTypes = typeof responseTypes; -export type XDR_BASE64 = string; -export interface Wallet { - isConnected: () => Promise; - isAllowed: () => Promise; - getUserInfo: () => Promise<{ - publicKey?: string; - }>; - signTransaction: (tx: XDR_BASE64, opts?: { - network?: string; - networkPassphrase?: string; - accountToSign?: string; - }) => Promise; - signAuthEntry: (entryXdr: XDR_BASE64, opts?: { - accountToSign?: string; - }) => Promise; -} -export type ClassOptions = { - contractId: string; - networkPassphrase: string; - rpcUrl: string; - errorTypes?: Record; - /** - * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: - * - * @example - * ```ts - * import freighter from "@stellar/freighter-api"; - * import { Contract } from "contract-client"; - * const contract = new Contract({ - * …, - * wallet: freighter, - * }) - * ``` - */ - wallet?: Wallet; -}; -export type MethodOptions = { - /** - * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') - */ - fee?: number; -}; -export {}; diff --git a/contract-client/dist/esm/method-options.js b/contract-client/dist/esm/method-options.js deleted file mode 100644 index 00ad9d3..0000000 --- a/contract-client/dist/esm/method-options.js +++ /dev/null @@ -1,3 +0,0 @@ -// defined this way so typeahead shows full union, not named alias -let responseTypes; -export {}; diff --git a/contract-client/dist/esm/package.json b/contract-client/dist/esm/package.json deleted file mode 100644 index 1632c2c..0000000 --- a/contract-client/dist/esm/package.json +++ /dev/null @@ -1 +0,0 @@ -{"type": "module"} \ No newline at end of file diff --git a/contract-client/dist/index.d.ts b/contract-client/dist/index.d.ts new file mode 100644 index 0000000..fbd3758 --- /dev/null +++ b/contract-client/dist/index.d.ts @@ -0,0 +1,134 @@ +import { AssembledTransaction, Client as ContractClient, ClientOptions as ContractClientOptions } from '@stellar/stellar-sdk/contract'; +import type { i128 } from '@stellar/stellar-sdk/contract'; +export * from '@stellar/stellar-sdk'; +export * as contract from '@stellar/stellar-sdk/contract'; +export * as rpc from '@stellar/stellar-sdk/rpc'; +export declare const networks: { + readonly testnet: { + readonly networkPassphrase: "Test SDF Network ; September 2015"; + readonly contractId: "CC5ELPSQFQMJ75XUPJARIODNA7UIH4RS36N37BAV4SVEBEDN4PJYVL5E"; + }; +}; +export type DataKey = { + tag: "Index"; + values: void; +} | { + tag: "Entries"; + values: readonly [string]; +}; +export interface Entry { + apr: i128; + equity_shares: Map; + escrow: i128; + ipfs_hash: string; + total_invested: i128; +} +export declare const Errors: {}; +export interface Client { + /** + * Construct and simulate a set_entry transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + set_entry: ({ entry }: { + entry: Entry; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a get_entry transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + get_entry: ({ ipfs_hash }: { + ipfs_hash: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a invest transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + invest: ({ user, ipfs_hash, amount }: { + user: string; + ipfs_hash: string; + amount: i128; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a distribute_payout transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + distribute_payout: ({ ipfs_hash }: { + ipfs_hash: string; + }, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; + /** + * Construct and simulate a distribute_payouts transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + distribute_payouts: (options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise>; +} +export declare class Client extends ContractClient { + readonly options: ContractClientOptions; + constructor(options: ContractClientOptions); + readonly fromJSON: { + set_entry: (json: string) => AssembledTransaction; + get_entry: (json: string) => AssembledTransaction; + invest: (json: string) => AssembledTransaction; + distribute_payout: (json: string) => AssembledTransaction; + distribute_payouts: (json: string) => AssembledTransaction; + }; +} diff --git a/contract-client/dist/index.js b/contract-client/dist/index.js new file mode 100644 index 0000000..964e107 --- /dev/null +++ b/contract-client/dist/index.js @@ -0,0 +1,36 @@ +import { Buffer } from "buffer"; +import { Client as ContractClient, Spec as ContractSpec, } from '@stellar/stellar-sdk/contract'; +export * from '@stellar/stellar-sdk'; +export * as contract from '@stellar/stellar-sdk/contract'; +export * as rpc from '@stellar/stellar-sdk/rpc'; +if (typeof window !== 'undefined') { + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || Buffer; +} +export const networks = { + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CC5ELPSQFQMJ75XUPJARIODNA7UIH4RS36N37BAV4SVEBEDN4PJYVL5E", + } +}; +export const Errors = {}; +export class Client extends ContractClient { + options; + constructor(options) { + super(new ContractSpec(["AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAgAAAAAAAAAAAAAABUluZGV4AAAAAAAAAQAAAAAAAAAHRW50cmllcwAAAAABAAAAEA==", + "AAAAAQAAAAAAAAAAAAAABUVudHJ5AAAAAAAABQAAAAAAAAADYXByAAAAAAsAAAAAAAAADWVxdWl0eV9zaGFyZXMAAAAAAAPsAAAAEwAAAAsAAAAAAAAABmVzY3JvdwAAAAAACwAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAAAAAAOdG90YWxfaW52ZXN0ZWQAAAAAAAs=", + "AAAAAAAAAAAAAAAJc2V0X2VudHJ5AAAAAAAAAQAAAAAAAAAFZW50cnkAAAAAAAfQAAAABUVudHJ5AAAAAAAAAA==", + "AAAAAAAAAAAAAAAJZ2V0X2VudHJ5AAAAAAAAAQAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAEAAAfQAAAABUVudHJ5AAAA", + "AAAAAAAAAAAAAAAGaW52ZXN0AAAAAAADAAAAAAAAAAR1c2VyAAAAEwAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==", + "AAAAAAAAAAAAAAARZGlzdHJpYnV0ZV9wYXlvdXQAAAAAAAABAAAAAAAAAAlpcGZzX2hhc2gAAAAAAAAQAAAAAA==", + "AAAAAAAAAAAAAAASZGlzdHJpYnV0ZV9wYXlvdXRzAAAAAAAAAAAAAA=="]), options); + this.options = options; + } + fromJSON = { + set_entry: (this.txFromJSON), + get_entry: (this.txFromJSON), + invest: (this.txFromJSON), + distribute_payout: (this.txFromJSON), + distribute_payouts: (this.txFromJSON) + }; +} diff --git a/contract-client/dist/types/assembled-tx.d.ts b/contract-client/dist/types/assembled-tx.d.ts deleted file mode 100644 index 1d5e6f5..0000000 --- a/contract-client/dist/types/assembled-tx.d.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Account, Address, Operation, SorobanRpc, xdr } from "@stellar/stellar-sdk"; -import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; -import type { ClassOptions, MethodOptions, Wallet, XDR_BASE64 } from "./method-options.js"; -export type Tx = Transaction, Operation[]>; -export declare class ExpiredStateError extends Error { -} -export declare class NeedsMoreSignaturesError extends Error { -} -export declare class WalletDisconnectedError extends Error { -} -export declare class SendResultOnlyError extends Error { -} -export declare class SendFailedError extends Error { -} -export declare class NoUnsignedNonInvokerAuthEntriesError extends Error { -} -type SendTx = SorobanRpc.Api.SendTransactionResponse; -type GetTx = SorobanRpc.Api.GetTransactionResponse; -export type u32 = number; -export type i32 = number; -export type u64 = bigint; -export type i64 = bigint; -export type u128 = bigint; -export type i128 = bigint; -export type u256 = bigint; -export type i256 = bigint; -export type Option = T | undefined; -export type Typepoint = bigint; -export type Duration = bigint; -export { Address }; -export interface Error_ { - message: string; -} -export interface Result { - unwrap(): T; - unwrapErr(): E; - isOk(): boolean; - isErr(): boolean; -} -export declare class Ok implements Result { - readonly value: T; - constructor(value: T); - unwrapErr(): E; - unwrap(): T; - isOk(): boolean; - isErr(): boolean; -} -export declare class Err implements Result { - readonly error: E; - constructor(error: E); - unwrapErr(): E; - unwrap(): never; - isOk(): boolean; - isErr(): boolean; -} -export declare const contractErrorPattern: RegExp; -type AssembledTransactionOptions = MethodOptions & ClassOptions & { - method: string; - args?: any[]; - parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; -}; -export declare const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"; -export declare class AssembledTransaction { - options: AssembledTransactionOptions; - raw: Tx; - private simulation?; - private simulationResult?; - private simulationTransactionData?; - private server; - toJSON(): string; - static fromJSON(options: Omit, 'args'>, { tx, simulationResult, simulationTransactionData }: { - tx: XDR_BASE64; - simulationResult: { - auth: XDR_BASE64[]; - retval: XDR_BASE64; - }; - simulationTransactionData: XDR_BASE64; - }): AssembledTransaction; - private constructor(); - static fromSimulation(options: AssembledTransactionOptions): Promise>; - simulate: () => Promise; - get simulationData(): { - result: SorobanRpc.Api.SimulateHostFunctionResult; - transactionData: xdr.SorobanTransactionData; - }; - get result(): T; - parseError(errorMessage: string): Err | undefined; - getWallet: () => Promise; - getPublicKey: () => Promise; - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount: () => Promise; - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend: ({ secondsToWait, force }?: { - /** - * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). - */ - secondsToWait?: number | undefined; - /** - * If `true`, sign and send the transaction even if it is a read call. - */ - force?: boolean | undefined; - }) => Promise>; - getStorageExpiration: () => Promise; - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy: ({ includeAlreadySigned, }?: { - /** - * Whether or not to include auth entries that have already been signed. Default: false - */ - includeAlreadySigned?: boolean | undefined; - }) => Promise; - preImageFor(entry: xdr.SorobanAuthorizationEntry, signatureExpirationLedger: number): xdr.HashIdPreimage; - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries: (expiration?: number | Promise) => Promise; - get isReadCall(): boolean; - hasRealInvoker: () => Promise; -} -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -declare class SentTransaction { - options: AssembledTransactionOptions; - assembled: AssembledTransaction; - server: SorobanRpc.Server; - signed: Tx; - sendTransactionResponse?: SendTx; - sendTransactionResponseAll?: SendTx[]; - getTransactionResponse?: GetTx; - getTransactionResponseAll?: GetTx[]; - constructor(options: AssembledTransactionOptions, assembled: AssembledTransaction); - static init: (options: AssembledTransactionOptions, assembled: AssembledTransaction, secondsToWait?: number) => Promise>; - private send; - get result(): T; -} diff --git a/contract-client/dist/types/index.d.ts b/contract-client/dist/types/index.d.ts deleted file mode 100644 index 24805b4..0000000 --- a/contract-client/dist/types/index.d.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { ContractSpec } from '@stellar/stellar-sdk'; -import { AssembledTransaction } from './assembled-tx.js'; -import type { i128 } from './assembled-tx.js'; -import type { ClassOptions } from './method-options.js'; -export * from './assembled-tx.js'; -export * from './method-options.js'; -export declare const networks: { - readonly testnet: { - readonly networkPassphrase: 'Test SDF Network ; September 2015'; - readonly contractId: 'CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY'; - }; -}; -/** - - */ -export type DataKey = { - tag: 'Offers'; - values: readonly [string]; -}; -/** - - */ -export interface Offer { - /** - - */ - amount: i128; - /** - - */ - list_price: i128; - /** - - */ - mft: string; -} -/** - - */ -export interface Owner { - /** - - */ - amount: i128; - /** - - */ - mft: string; - /** - - */ - public_key: string; -} -/** - - */ -export declare const Errors: {}; -export declare class Contract { - readonly options: ClassOptions; - spec: ContractSpec; - constructor(options: ClassOptions); - private readonly parsers; - public txFromJSON; - readonly fromJSON: { - buy: (json: string) => AssembledTransaction; - balance: (json: string) => AssembledTransaction; - setOffer: (json: string) => AssembledTransaction; - getOffer: (json: string) => AssembledTransaction; - deleteOffer: (json: string) => AssembledTransaction; - }; - /** - * Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - buy: ( - { - buyer, - mft, - amount, - }: { - buyer: string; - mft: string; - amount: i128; - }, - options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - } - ) => Promise>; - /** - * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - balance: ( - { - address, - }: { - address: string; - }, - options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - } - ) => Promise>; - /** - * Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - setOffer: ( - { - offer, - }: { - offer: Offer; - }, - options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - } - ) => Promise>; - /** - * Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - getOffer: ( - { - mft, - }: { - mft: string; - }, - options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - } - ) => Promise>; - /** - * Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - deleteOffer: ( - { - mft, - }: { - mft: string; - }, - options?: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number; - } - ) => Promise>; -} diff --git a/contract-client/dist/types/method-options.d.ts b/contract-client/dist/types/method-options.d.ts deleted file mode 100644 index 6840adb..0000000 --- a/contract-client/dist/types/method-options.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -declare let responseTypes: 'simulated' | 'full' | undefined; -export type ResponseTypes = typeof responseTypes; -export type XDR_BASE64 = string; -export interface Wallet { - isConnected: () => Promise; - isAllowed: () => Promise; - getUserInfo: () => Promise<{ - publicKey?: string; - }>; - signTransaction: (tx: XDR_BASE64, opts?: { - network?: string; - networkPassphrase?: string; - accountToSign?: string; - }) => Promise; - signAuthEntry: (entryXdr: XDR_BASE64, opts?: { - accountToSign?: string; - }) => Promise; -} -export type ClassOptions = { - contractId: string; - networkPassphrase: string; - rpcUrl: string; - errorTypes?: Record; - /** - * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: - * - * @example - * ```ts - * import freighter from "@stellar/freighter-api"; - * import { Contract } from "contract-client"; - * const contract = new Contract({ - * …, - * wallet: freighter, - * }) - * ``` - */ - wallet?: Wallet; -}; -export type MethodOptions = { - /** - * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') - */ - fee?: number; -}; -export {}; diff --git a/contract-client/package-lock.json b/contract-client/package-lock.json index c5e547e..e75390e 100644 --- a/contract-client/package-lock.json +++ b/contract-client/package-lock.json @@ -1,328 +1,328 @@ { - "name": "contract-client", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "contract-client", - "version": "0.0.0", - "dependencies": { - "@stellar/freighter-api": "1.7.1", - "@stellar/stellar-sdk": "11.2.0", - "buffer": "6.0.3" - }, - "devDependencies": { - "typescript": "5.3.3" - } + "name": "contract-client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "contract-client", + "version": "0.0.0", + "dependencies": { + "@stellar/freighter-api": "2.0.0", + "@stellar/stellar-sdk": "12.0.0-rc.3", + "buffer": "6.0.3" + }, + "devDependencies": { + "typescript": "5.3.3" + } + }, + "node_modules/@stellar/freighter-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-2.0.0.tgz", + "integrity": "sha512-j/R7MLPL8S3QhwOEdAxSl7MgWBTXWlOXQKQyXR8mPk1JMKKR4tF8e4U+Fs9TPQH0HZoYqfVDvLOOUrTMMY058Q==" + }, + "node_modules/@stellar/js-xdr": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.1.tgz", + "integrity": "sha512-3gnPjAz78htgqsNEDkEsKHKosV2BF2iZkoHCNxpmZwUxiPsw+2VaXMed8RRMe0rGk3d5GZe7RrSba8zV80J3Ag==" + }, + "node_modules/@stellar/stellar-base": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-12.0.0.tgz", + "integrity": "sha512-uGpahDFFXbE39myOmBnEZSjVys4yUkQ/ASNuYENGyS8MNdfA0TS7DPWkiO6t17P+rW+FRV1zmumJtjRHwxxMdw==", + "dependencies": { + "@stellar/js-xdr": "^3.1.1", + "base32.js": "^0.1.0", + "bignumber.js": "^9.1.2", + "buffer": "^6.0.3", + "sha.js": "^2.3.6", + "tweetnacl": "^1.0.3" + }, + "optionalDependencies": { + "sodium-native": "^4.1.1" + } + }, + "node_modules/@stellar/stellar-sdk": { + "version": "12.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-12.0.0-rc.3.tgz", + "integrity": "sha512-FYO+F8VokXjP3Mu+OQtK0GrJWWvwf1+DL3n3aOi6M5H6EwJ6bp/yAOtfnClx6vqzzvpMbWveYABn8U9QNpcHww==", + "dependencies": { + "@stellar/stellar-base": "^12.0.0-rc.1", + "axios": "^1.6.8", + "bignumber.js": "^9.1.2", + "eventsource": "^2.0.2", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base32.js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", + "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/@stellar/freighter-api": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-1.7.1.tgz", - "integrity": "sha512-XvPO+XgEbkeP0VhP0U1edOkds+rGS28+y8GRGbCVXeZ9ZslbWqRFQoETAdX8IXGuykk2ib/aPokiLc5ZaWYP7w==" + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/@stellar/js-xdr": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-3.1.1.tgz", - "integrity": "sha512-3gnPjAz78htgqsNEDkEsKHKosV2BF2iZkoHCNxpmZwUxiPsw+2VaXMed8RRMe0rGk3d5GZe7RrSba8zV80J3Ag==" - }, - "node_modules/@stellar/stellar-base": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-10.0.1.tgz", - "integrity": "sha512-BDbx7VHOEQh+4J3Q+gStNXgPaNckVFmD4aOlBBGwxlF6vPFmVnW8IoJdkX7T58zpX55eWI6DXvEhDBlrqTlhAQ==", - "dependencies": { - "@stellar/js-xdr": "^3.0.1", - "base32.js": "^0.1.0", - "bignumber.js": "^9.1.2", - "buffer": "^6.0.3", - "sha.js": "^2.3.6", - "tweetnacl": "^1.0.3" - }, - "optionalDependencies": { - "sodium-native": "^4.0.1" - } - }, - "node_modules/@stellar/stellar-sdk": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-11.2.0.tgz", - "integrity": "sha512-qInRR+mLLl9O/AI6Q+Sr19RZeYJtlNoJQJi3pch5BYoMvVhjO8IU8AhHADP//Zmc2osyogwPuqXBiFdaGlfHWA==", - "dependencies": { - "@stellar/stellar-base": "10.0.1", - "axios": "^1.6.5", - "bignumber.js": "^9.1.2", - "eventsource": "^2.0.2", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/sodium-native": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz", - "integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.8.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + { + "type": "consulting", + "url": "https://feross.org/support" } + ] + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sodium-native": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-4.1.1.tgz", + "integrity": "sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.8.0" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" } + } } diff --git a/contract-client/package.json b/contract-client/package.json index e07be53..3221bc1 100644 --- a/contract-client/package.json +++ b/contract-client/package.json @@ -1,20 +1,18 @@ { - "version": "0.0.0", - "name": "contract-client", - "dependencies": { - "@stellar/freighter-api": "1.7.1", - "buffer": "6.0.3", - "@stellar/stellar-sdk": "11.2.0" - }, - "scripts": { - "build": "node ./scripts/build.mjs" - }, - "exports": { - "require": "./dist/cjs/index.js", - "import": "./dist/esm/index.js" - }, - "typings": "dist/types/index.d.ts", - "devDependencies": { - "typescript": "5.3.3" - } + "version": "0.0.0", + "name": "contract-client", + "type": "module", + "exports": "./dist/index.js", + "typings": "dist/index.d.ts", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@stellar/freighter-api": "2.0.0", + "buffer": "6.0.3", + "@stellar/stellar-sdk": "12.0.0-rc.3" + }, + "devDependencies": { + "typescript": "5.3.3" + } } diff --git a/contract-client/scripts/build.mjs b/contract-client/scripts/build.mjs deleted file mode 100644 index 15a1704..0000000 --- a/contract-client/scripts/build.mjs +++ /dev/null @@ -1,37 +0,0 @@ -import { spawnSync } from "node:child_process" -import fs from "node:fs" -import path from "node:path" - -const buildDir = "./dist" - -const { error, stderr } = spawnSync("tsc", ["-b", "./scripts/tsconfig.cjs.json", "./scripts/tsconfig.esm.json", "./scripts/tsconfig.types.json"], { stdio: "inherit" }) - -if (error) { - console.error(stderr) - console.error(error) - throw error -} - -function createEsmModulePackageJson() { - fs.readdir(buildDir, function (err, dirs) { - if (err) { - throw err - } - dirs.forEach(function (dir) { - if (dir === "esm") { - // 1. add package.json file with "type": "module" - var packageJsonFile = path.join(buildDir, dir, "/package.json") - if (!fs.existsSync(packageJsonFile)) { - fs.writeFileSync( - packageJsonFile, - '{"type": "module"}', - 'utf8', - err => { if (err) throw err } - ) - } - } - }) - }) -} - -createEsmModulePackageJson() diff --git a/contract-client/scripts/tsconfig.cjs.json b/contract-client/scripts/tsconfig.cjs.json deleted file mode 100644 index 542ea86..0000000 --- a/contract-client/scripts/tsconfig.cjs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../dist/cjs", - "module": "commonjs" - } -} diff --git a/contract-client/scripts/tsconfig.esm.json b/contract-client/scripts/tsconfig.esm.json deleted file mode 100644 index 92b4527..0000000 --- a/contract-client/scripts/tsconfig.esm.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../dist/esm", - "module": "esnext" - } -} diff --git a/contract-client/scripts/tsconfig.types.json b/contract-client/scripts/tsconfig.types.json deleted file mode 100644 index 8a24fc1..0000000 --- a/contract-client/scripts/tsconfig.types.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../dist/types", - "declaration": true, - "emitDeclarationOnly": true - } -} diff --git a/contract-client/src/assembled-tx.ts b/contract-client/src/assembled-tx.ts deleted file mode 100644 index f4f892d..0000000 --- a/contract-client/src/assembled-tx.ts +++ /dev/null @@ -1,664 +0,0 @@ -import { - Account, - Address, - Contract, - Operation, - SorobanRpc, - StrKey, - TimeoutInfinite, - TransactionBuilder, - authorizeEntry, - hash, - nativeToScVal, - xdr, - BASE_FEE, -} from "@stellar/stellar-sdk"; -import type { Memo, MemoType, Transaction } from "@stellar/stellar-sdk"; -import { Buffer } from "buffer"; -import type { - ClassOptions, - MethodOptions, - Wallet, - XDR_BASE64, -} from "./method-options.js"; - -export type Tx = Transaction, Operation[]> - -export class ExpiredStateError extends Error { } -export class NeedsMoreSignaturesError extends Error { } -export class WalletDisconnectedError extends Error { } -export class SendResultOnlyError extends Error { } -export class SendFailedError extends Error { } -export class NoUnsignedNonInvokerAuthEntriesError extends Error { } - -type SendTx = SorobanRpc.Api.SendTransactionResponse; -type GetTx = SorobanRpc.Api.GetTransactionResponse; - -export type u32 = number; -export type i32 = number; -export type u64 = bigint; -export type i64 = bigint; -export type u128 = bigint; -export type i128 = bigint; -export type u256 = bigint; -export type i256 = bigint; -export type Option = T | undefined; -export type Typepoint = bigint; -export type Duration = bigint; -export {Address}; - -/// Error interface containing the error message -export interface Error_ { message: string }; - -export interface Result { - unwrap(): T, - unwrapErr(): E, - isOk(): boolean, - isErr(): boolean, -}; - -export class Ok implements Result { - constructor(readonly value: T) { } - unwrapErr(): E { - throw new Error('No error'); - } - unwrap(): T { - return this.value; - } - - isOk(): boolean { - return true; - } - - isErr(): boolean { - return !this.isOk() - } -} - -export class Err implements Result { - constructor(readonly error: E) { } - unwrapErr(): E { - return this.error; - } - unwrap(): never { - throw new Error(this.error.message); - } - - isOk(): boolean { - return false; - } - - isErr(): boolean { - return !this.isOk() - } -} - -export const contractErrorPattern = /Error\(Contract, #(\d+)\)/; - -type AssembledTransactionOptions = MethodOptions & - ClassOptions & { - method: string; - args?: any[]; - parseResultXdr: (xdr: string | xdr.ScVal | Err) => T; - }; - -export const NULL_ACCOUNT = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF" - -export class AssembledTransaction { - public raw: Tx - private simulation?: SorobanRpc.Api.SimulateTransactionResponse - private simulationResult?: SorobanRpc.Api.SimulateHostFunctionResult - private simulationTransactionData?: xdr.SorobanTransactionData - private server: SorobanRpc.Server - - toJSON() { - return JSON.stringify({ - method: this.options.method, - tx: this.raw?.toXDR(), - simulationResult: { - auth: this.simulationData.result.auth.map(a => a.toXDR('base64')), - retval: this.simulationData.result.retval.toXDR('base64'), - }, - simulationTransactionData: this.simulationData.transactionData.toXDR('base64'), - }) - } - - static fromJSON( - options: Omit, 'args'>, - { tx, simulationResult, simulationTransactionData }: - { - tx: XDR_BASE64, - simulationResult: { - auth: XDR_BASE64[], - retval: XDR_BASE64, - }, - simulationTransactionData: XDR_BASE64, - } - ): AssembledTransaction { - const txn = new AssembledTransaction(options) - txn.raw = TransactionBuilder.fromXDR(tx, options.networkPassphrase) as Tx - txn.simulationResult = { - auth: simulationResult.auth.map(a => xdr.SorobanAuthorizationEntry.fromXDR(a, 'base64')), - retval: xdr.ScVal.fromXDR(simulationResult.retval, 'base64'), - } - txn.simulationTransactionData = xdr.SorobanTransactionData.fromXDR(simulationTransactionData, 'base64') - return txn - } - - private constructor(public options: AssembledTransactionOptions) { - this.server = new SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - } - - static async fromSimulation(options: AssembledTransactionOptions): Promise> { - const tx = new AssembledTransaction(options) - const contract = new Contract(options.contractId); - - tx.raw = new TransactionBuilder(await tx.getAccount(), { - fee: options.fee?.toString(10) ?? BASE_FEE, - networkPassphrase: options.networkPassphrase, - }) - .addOperation(contract.call(options.method, ...(options.args ?? []))) - .setTimeout(TimeoutInfinite) - .build(); - - return await tx.simulate() - } - - simulate = async (): Promise => { - if (!this.raw) throw new Error('Transaction has not yet been assembled') - this.simulation = await this.server.simulateTransaction(this.raw); - - if (SorobanRpc.Api.isSimulationSuccess(this.simulation)) { - this.raw = SorobanRpc.assembleTransaction( - this.raw, - this.simulation - ).build() - } - - return this - } - - get simulationData(): { - result: SorobanRpc.Api.SimulateHostFunctionResult - transactionData: xdr.SorobanTransactionData - } { - if (this.simulationResult && this.simulationTransactionData) { - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData, - } - } - // else, we know we just did the simulation on this machine - const simulation = this.simulation! - if (SorobanRpc.Api.isSimulationError(simulation)) { - throw new Error(`Transaction simulation failed: "${simulation.error}"`) - } - - if (SorobanRpc.Api.isSimulationRestore(simulation)) { - throw new ExpiredStateError(`You need to restore some contract state before you can invoke this method. ${JSON.stringify(simulation, null, 2)}`) - } - - if (!simulation.result) { - throw new Error(`Expected an invocation simulation, but got no 'result' field. Simulation: ${JSON.stringify(simulation, null, 2)}`) - } - - // add to object for serialization & deserialization - this.simulationResult = simulation.result - this.simulationTransactionData = simulation.transactionData.build() - - return { - result: this.simulationResult, - transactionData: this.simulationTransactionData!, - } - } - - get result(): T { - try { - return this.options.parseResultXdr(this.simulationData.result.retval) - } catch (e) { - let err = this.parseError(e.toString()) - if (err) return err as T - throw e - } - } - - parseError(errorMessage: string): Err | undefined { - if (!this.options.errorTypes) return - const match = errorMessage.match(contractErrorPattern) - if (!match) return - let i = parseInt(match[1], 10) - let err = this.options.errorTypes[i] - if (err) return new Err(err) - } - - getWallet = async (): Promise => { - return this.options.wallet ?? (await import("@stellar/freighter-api")).default - } - - getPublicKey = async (): Promise => { - const wallet = await this.getWallet() - if (await wallet.isConnected() && await wallet.isAllowed()) { - return (await wallet.getUserInfo()).publicKey - } - } - - /** - * Get account details from the Soroban network for the publicKey currently - * selected in user's wallet. If not connected to Freighter, use placeholder - * null account. - */ - getAccount = async (): Promise => { - const publicKey = await this.getPublicKey() - return publicKey - ? await this.server.getAccount(publicKey) - : new Account(NULL_ACCOUNT, "0") - } - - /** - * Sign the transaction with the `wallet` (default Freighter), then send to - * the network and return a `SentTransaction` that keeps track of all the - * attempts to send and fetch the transaction from the network. - */ - signAndSend = async ({ secondsToWait = 10, force = false }: { - /** - * Wait `secondsToWait` seconds (default: 10) for both the transaction to SEND successfully (will keep trying if the server returns `TRY_AGAIN_LATER`), as well as for the transaction to COMPLETE (will keep checking if the server returns `PENDING`). - */ - secondsToWait?: number - /** - * If `true`, sign and send the transaction even if it is a read call. - */ - force?: boolean - } = {}): Promise> => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated') - } - - if (!force && this.isReadCall) { - throw new Error('This is a read call. It requires no signature or sending. Use `force: true` to sign and send anyway.') - } - - if (!await this.hasRealInvoker()) { - throw new WalletDisconnectedError('Wallet is not connected') - } - - if (this.raw.source !== (await this.getAccount()).accountId()) { - throw new Error(`You must submit the transaction with the account that originally created it. Please switch to the wallet with "${this.raw.source}" as its public key.`) - } - - if ((await this.needsNonInvokerSigningBy()).length) { - throw new NeedsMoreSignaturesError( - 'Transaction requires more signatures. See `needsNonInvokerSigningBy` for details.' - ) - } - - return await SentTransaction.init(this.options, this, secondsToWait); - } - - getStorageExpiration = async () => { - const entryRes = await this.server.getLedgerEntries( - new Contract(this.options.contractId).getFootprint() - ) - if ( - !entryRes.entries || - !entryRes.entries.length || - !entryRes.entries[0].liveUntilLedgerSeq - ) throw new Error('failed to get ledger entry') - return entryRes.entries[0].liveUntilLedgerSeq - } - - /** - * Get a list of accounts, other than the invoker of the simulation, that - * need to sign auth entries in this transaction. - * - * Soroban allows multiple people to sign a transaction. Someone needs to - * sign the final transaction envelope; this person/account is called the - * _invoker_, or _source_. Other accounts might need to sign individual auth - * entries in the transaction, if they're not also the invoker. - * - * This function returns a list of accounts that need to sign auth entries, - * assuming that the same invoker/source account will sign the final - * transaction envelope as signed the initial simulation. - * - * One at a time, for each public key in this array, you will need to - * serialize this transaction with `toJSON`, send to the owner of that key, - * deserialize the transaction with `txFromJson`, and call - * {@link signAuthEntries}. Then re-serialize and send to the next account - * in this list. - */ - needsNonInvokerSigningBy = async ({ - includeAlreadySigned = false, - }: { - /** - * Whether or not to include auth entries that have already been signed. Default: false - */ - includeAlreadySigned?: boolean - } = {}): Promise => { - if (!this.raw) { - throw new Error('Transaction has not yet been simulated') - } - - // We expect that any transaction constructed by these libraries has a - // single operation, which is an InvokeHostFunction operation. The host - // function being invoked is the contract method call. - if (!("operations" in this.raw)) { - throw new Error( - `Unexpected Transaction type; no operations: ${JSON.stringify(this.raw) - }` - ) - } - const rawInvokeHostFunctionOp = this.raw - .operations[0] as Operation.InvokeHostFunction - - return [...new Set((rawInvokeHostFunctionOp.auth ?? []).filter(entry => - entry.credentials().switch() === - xdr.SorobanCredentialsType.sorobanCredentialsAddress() && - ( - includeAlreadySigned || - entry.credentials().address().signature().switch().name === 'scvVoid' - ) - ).map(entry => StrKey.encodeEd25519PublicKey( - entry.credentials().address().address().accountId().ed25519() - )))] - } - - preImageFor( - entry: xdr.SorobanAuthorizationEntry, - signatureExpirationLedger: number - ): xdr.HashIdPreimage { - const addrAuth = entry.credentials().address() - return xdr.HashIdPreimage.envelopeTypeSorobanAuthorization( - new xdr.HashIdPreimageSorobanAuthorization({ - networkId: hash(Buffer.from(this.options.networkPassphrase)), - nonce: addrAuth.nonce(), - invocation: entry.rootInvocation(), - signatureExpirationLedger, - }), - ) - } - - /** - * If {@link needsNonInvokerSigningBy} returns a non-empty list, you can serialize - * the transaction with `toJSON`, send it to the owner of one of the public keys - * in the map, deserialize with `txFromJSON`, and call this method on their - * machine. Internally, this will use `signAuthEntry` function from connected - * `wallet` for each. - * - * Then, re-serialize the transaction and either send to the next - * `needsNonInvokerSigningBy` owner, or send it back to the original account - * who simulated the transaction so they can {@link sign} the transaction - * envelope and {@link send} it to the network. - * - * Sending to all `needsNonInvokerSigningBy` owners in parallel is not currently - * supported! - */ - signAuthEntries = async ( - /** - * When to set each auth entry to expire. Could be any number of blocks in - * the future. Can be supplied as a promise or a raw number. Default: - * contract's current `persistent` storage expiration date/ledger - * number/block. - */ - expiration: number | Promise = this.getStorageExpiration() - ): Promise => { - if (!this.raw) throw new Error('Transaction has not yet been assembled or simulated') - const needsNonInvokerSigningBy = await this.needsNonInvokerSigningBy() - - if (!needsNonInvokerSigningBy) throw new NoUnsignedNonInvokerAuthEntriesError('No unsigned non-invoker auth entries; maybe you already signed?') - const publicKey = await this.getPublicKey() - if (!publicKey) throw new Error('Could not get public key from wallet; maybe Freighter is not signed in?') - if (needsNonInvokerSigningBy.indexOf(publicKey) === -1) throw new Error(`No auth entries for public key "${publicKey}"`) - const wallet = await this.getWallet() - - const rawInvokeHostFunctionOp = this.raw - .operations[0] as Operation.InvokeHostFunction - - const authEntries = rawInvokeHostFunctionOp.auth ?? [] - - for (const [i, entry] of authEntries.entries()) { - if ( - entry.credentials().switch() !== - xdr.SorobanCredentialsType.sorobanCredentialsAddress() - ) { - // if the invoker/source account, then the entry doesn't need explicit - // signature, since the tx envelope is already signed by the source - // account, so only check for sorobanCredentialsAddress - continue - } - const pk = StrKey.encodeEd25519PublicKey( - entry.credentials().address().address().accountId().ed25519() - ) - - // this auth entry needs to be signed by a different account - // (or maybe already was!) - if (pk !== publicKey) continue - - authEntries[i] = await authorizeEntry( - entry, - async preimage => Buffer.from( - await wallet.signAuthEntry(preimage.toXDR('base64')), - 'base64' - ), - await expiration, - this.options.networkPassphrase - ) - } - } - - get isReadCall(): boolean { - const authsCount = this.simulationData.result.auth.length; - const writeLength = this.simulationData.transactionData.resources().footprint().readWrite().length - return (authsCount === 0) && (writeLength === 0); - } - - hasRealInvoker = async (): Promise => { - const account = await this.getAccount() - return account.accountId() !== NULL_ACCOUNT - } -} - -/** - * A transaction that has been sent to the Soroban network. This happens in two steps: - * - * 1. `sendTransaction`: initial submission of the transaction to the network. - * This step can run into problems, and will be retried with exponential - * backoff if it does. See all attempts in `sendTransactionResponseAll` and the - * most recent attempt in `sendTransactionResponse`. - * 2. `getTransaction`: once the transaction has been submitted to the network - * successfully, you need to wait for it to finalize to get the results of the - * transaction. This step can also run into problems, and will be retried with - * exponential backoff if it does. See all attempts in - * `getTransactionResponseAll` and the most recent attempt in - * `getTransactionResponse`. - */ -class SentTransaction { - public server: SorobanRpc.Server - public signed: Tx - public sendTransactionResponse?: SendTx - public sendTransactionResponseAll?: SendTx[] - public getTransactionResponse?: GetTx - public getTransactionResponseAll?: GetTx[] - - constructor(public options: AssembledTransactionOptions, public assembled: AssembledTransaction) { - this.server = new SorobanRpc.Server(this.options.rpcUrl, { - allowHttp: this.options.rpcUrl.startsWith("http://"), - }); - this.assembled = assembled - } - - static init = async ( - options: AssembledTransactionOptions, - assembled: AssembledTransaction, - secondsToWait: number = 10 - ): Promise> => { - const tx = new SentTransaction(options, assembled) - return await tx.send(secondsToWait) - } - - private send = async (secondsToWait: number = 10): Promise => { - const wallet = await this.assembled.getWallet() - - this.sendTransactionResponseAll = await withExponentialBackoff( - async (previousFailure) => { - if (previousFailure) { - // Increment transaction sequence number and resimulate before trying again - - // Soroban transaction can only have 1 operation - const op = this.assembled.raw.operations[0] as Operation.InvokeHostFunction; - - this.assembled.raw = new TransactionBuilder(await this.assembled.getAccount(), { - fee: this.assembled.raw.fee, - networkPassphrase: this.options.networkPassphrase, - }) - .setTimeout(TimeoutInfinite) - .addOperation( - Operation.invokeHostFunction({ ...op, auth: op.auth ?? [] }), - ) - .build() - - await this.assembled.simulate() - } - - const signature = await wallet.signTransaction(this.assembled.raw.toXDR(), { - networkPassphrase: this.options.networkPassphrase, - }); - - this.signed = TransactionBuilder.fromXDR( - signature, - this.options.networkPassphrase - ) as Tx - - return this.server.sendTransaction(this.signed) - }, - resp => resp.status !== "PENDING", - secondsToWait - ) - - this.sendTransactionResponse = this.sendTransactionResponseAll[this.sendTransactionResponseAll.length - 1] - - if (this.sendTransactionResponse.status !== "PENDING") { - throw new Error( - `Tried to resubmit transaction for ${secondsToWait - } seconds, but it's still failing. ` + - `All attempts: ${JSON.stringify( - this.sendTransactionResponseAll, - null, - 2 - )}` - ); - } - - const { hash } = this.sendTransactionResponse - - this.getTransactionResponseAll = await withExponentialBackoff( - () => this.server.getTransaction(hash), - resp => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND, - secondsToWait - ) - - this.getTransactionResponse = this.getTransactionResponseAll[this.getTransactionResponseAll.length - 1] - if (this.getTransactionResponse.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND) { - console.error( - `Waited ${secondsToWait - } seconds for transaction to complete, but it did not. ` + - `Returning anyway. Check the transaction status manually. ` + - `Sent transaction: ${JSON.stringify( - this.sendTransactionResponse, - null, - 2 - )}\n` + - `All attempts to get the result: ${JSON.stringify( - this.getTransactionResponseAll, - null, - 2 - )}` - ); - } - - return this; - } - - get result(): T { - // 1. check if transaction was submitted and awaited with `getTransaction` - if ( - "getTransactionResponse" in this && - this.getTransactionResponse - ) { - // getTransactionResponse has a `returnValue` field unless it failed - if ("returnValue" in this.getTransactionResponse) { - return this.options.parseResultXdr(this.getTransactionResponse.returnValue!) - } - - // if "returnValue" not present, the transaction failed; return without parsing the result - throw new Error("Transaction failed! Cannot parse result.") - } - - // 2. otherwise, maybe it was merely sent with `sendTransaction` - if (this.sendTransactionResponse) { - const errorResult = this.sendTransactionResponse.errorResult?.result() - if (errorResult) { - throw new SendFailedError( - `Transaction simulation looked correct, but attempting to send the transaction failed. Check \`simulation\` and \`sendTransactionResponseAll\` to troubleshoot. Decoded \`sendTransactionResponse.errorResultXdr\`: ${errorResult}` - ) - } - throw new SendResultOnlyError( - `Transaction was sent to the network, but not yet awaited. No result to show. Await transaction completion with \`getTransaction(sendTransactionResponse.hash)\`` - ) - } - - // 3. finally, if neither of those are present, throw an error - throw new Error(`Sending transaction failed: ${JSON.stringify(this.assembled)}`) - } -} - -/** - * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true. - * Returns an array of all attempts to call the function. - */ -async function withExponentialBackoff( - fn: (previousFailure?: T) => Promise, - keepWaitingIf: (result: T) => boolean, - secondsToWait: number, - exponentialFactor = 1.5, - verbose = false, -): Promise { - const attempts: T[] = [] - - let count = 0 - attempts.push(await fn()) - if (!keepWaitingIf(attempts[attempts.length - 1])) return attempts - - const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf() - let waitTime = 1000 - let totalWaitTime = waitTime - - while (Date.now() < waitUntil && keepWaitingIf(attempts[attempts.length - 1])) { - count++ - // Wait a beat - if (verbose) { - console.info(`Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${secondsToWait * 1000}ms)`) - } - await new Promise(res => setTimeout(res, waitTime)) - // Exponential backoff - waitTime = waitTime * exponentialFactor; - if (new Date(Date.now() + waitTime).valueOf() > waitUntil) { - waitTime = waitUntil - Date.now() - if (verbose) { - console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`) - } - } - totalWaitTime = waitTime + totalWaitTime - // Try again - attempts.push(await fn(attempts[attempts.length - 1])) - if (verbose && keepWaitingIf(attempts[attempts.length - 1])) { - console.info( - `${count}. Called ${fn}; ${attempts.length - } prev attempts. Most recent: ${JSON.stringify(attempts[attempts.length - 1], null, 2) - }` - ) - } - } - - return attempts -} diff --git a/contract-client/src/index.ts b/contract-client/src/index.ts index c5f5097..eeb1410 100644 --- a/contract-client/src/index.ts +++ b/contract-client/src/index.ts @@ -1,6 +1,12 @@ -import { ContractSpec, Address } from '@stellar/stellar-sdk'; import { Buffer } from "buffer"; -import { AssembledTransaction, Ok, Err } from './assembled-tx.js'; +import { Address } from '@stellar/stellar-sdk'; +import { + AssembledTransaction, + Client as ContractClient, + ClientOptions as ContractClientOptions, + Result, + Spec as ContractSpec, +} from '@stellar/stellar-sdk/contract'; import type { u32, i32, @@ -13,211 +19,159 @@ import type { Option, Typepoint, Duration, - Error_, - Result, -} from './assembled-tx.js'; -import type { ClassOptions, XDR_BASE64 } from './method-options.js'; - -export * from './assembled-tx.js'; -export * from './method-options.js'; +} from '@stellar/stellar-sdk/contract'; +export * from '@stellar/stellar-sdk' +export * as contract from '@stellar/stellar-sdk/contract' +export * as rpc from '@stellar/stellar-sdk/rpc' if (typeof window !== 'undefined') { - //@ts-ignore Buffer exists - window.Buffer = window.Buffer || Buffer; + //@ts-ignore Buffer exists + window.Buffer = window.Buffer || Buffer; } export const networks = { - testnet: { - networkPassphrase: "Test SDF Network ; September 2015", - contractId: "CBKPY5UKSG5PLW6WL7BKE5JTTUINCD5EWQWXLCD74EYNOBFIRADP4ADY", - } + testnet: { + networkPassphrase: "Test SDF Network ; September 2015", + contractId: "CC5ELPSQFQMJ75XUPJARIODNA7UIH4RS36N37BAV4SVEBEDN4PJYVL5E", + } } as const -/** - - */ -export type DataKey = {tag: "Offers", values: readonly [string]}; +export type DataKey = {tag: "Index", values: void} | {tag: "Entries", values: readonly [string]}; -/** - - */ -export interface Offer { - /** - - */ -amount: i128; - /** - - */ -list_price: i128; - /** - - */ -mft: string; + +export interface Entry { + apr: i128; + equity_shares: Map; + escrow: i128; + ipfs_hash: string; + total_invested: i128; } -/** - - */ -export interface Owner { - /** - - */ -amount: i128; +export const Errors = { + +} + +export interface Client { /** - - */ -mft: string; + * Construct and simulate a set_entry transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + set_entry: ({entry}: {entry: Entry}, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise> + /** - - */ -public_key: string; -} + * Construct and simulate a get_entry transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + get_entry: ({ipfs_hash}: {ipfs_hash: string}, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise> -/** - - */ -export const Errors = { + /** + * Construct and simulate a invest transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + invest: ({user, ipfs_hash, amount}: {user: string, ipfs_hash: string, amount: i128}, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise> -} + /** + * Construct and simulate a distribute_payout transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + distribute_payout: ({ipfs_hash}: {ipfs_hash: string}, options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise> -export class Contract { - spec: ContractSpec; - constructor(public readonly options: ClassOptions) { - this.spec = new ContractSpec([ - "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAABk9mZmVycwAAAAAAAQAAABM=", - "AAAAAQAAAAAAAAAAAAAABU9mZmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAApsaXN0X3ByaWNlAAAAAAALAAAAAAAAAANtZnQAAAAAEw==", - "AAAAAQAAAAAAAAAAAAAABU93bmVyAAAAAAAAAwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAAANtZnQAAAAAEwAAAAAAAAAKcHVibGljX2tleQAAAAAAEw==", - "AAAAAAAAAAAAAAADYnV5AAAAAAMAAAAAAAAABWJ1eWVyAAAAAAAAEwAAAAAAAAADbWZ0AAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=", - "AAAAAAAAAAAAAAAHYmFsYW5jZQAAAAABAAAAAAAAAAdhZGRyZXNzAAAAABMAAAABAAAACw==", - "AAAAAAAAAAAAAAAJc2V0X29mZmVyAAAAAAAAAQAAAAAAAAAFb2ZmZXIAAAAAAAfQAAAABU9mZmVyAAAAAAAAAA==", - "AAAAAAAAAAAAAAAJZ2V0X29mZmVyAAAAAAAAAQAAAAAAAAADbWZ0AAAAABMAAAABAAAH0AAAAAVPZmZlcgAAAA==", - "AAAAAAAAAAAAAAAMZGVsZXRlX29mZmVyAAAAAQAAAAAAAAADbWZ0AAAAABMAAAAA" - ]); - } - private readonly parsers = { - buy: () => {}, - balance: (result: XDR_BASE64): i128 => this.spec.funcResToNative("balance", result), - setOffer: () => {}, - getOffer: (result: XDR_BASE64): Offer => this.spec.funcResToNative("get_offer", result), - deleteOffer: () => {} - }; - private txFromJSON = (json: string): AssembledTransaction => { - const { method, ...tx } = JSON.parse(json) - return AssembledTransaction.fromJSON( - { - ...this.options, - method, - parseResultXdr: this.parsers[method], - }, - tx, - ); - } - public readonly fromJSON = { - buy: this.txFromJSON>, - balance: this.txFromJSON>, - setOffer: this.txFromJSON>, - getOffer: this.txFromJSON>, - deleteOffer: this.txFromJSON> - } - /** - * Construct and simulate a buy transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - buy = async ({buyer, mft, amount}: {buyer: string, mft: string, amount: i128}, options: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number, - } = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'buy', - args: this.spec.funcArgsToScVals("buy", {buyer: new Address(buyer), mft: new Address(mft), amount}), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['buy'], - }); - } - - - /** - * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - balance = async ({address}: {address: string}, options: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number, - } = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'balance', - args: this.spec.funcArgsToScVals("balance", {address: new Address(address)}), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['balance'], - }); - } - - - /** - * Construct and simulate a set_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - setOffer = async ({offer}: {offer: Offer}, options: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number, - } = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'set_offer', - args: this.spec.funcArgsToScVals("set_offer", {offer}), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['setOffer'], - }); - } - - - /** - * Construct and simulate a get_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - getOffer = async ({mft}: {mft: string}, options: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number, - } = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'get_offer', - args: this.spec.funcArgsToScVals("get_offer", {mft: new Address(mft)}), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['getOffer'], - }); - } - - - /** - * Construct and simulate a delete_offer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. - */ - deleteOffer = async ({mft}: {mft: string}, options: { - /** - * The fee to pay for the transaction. Default: 100. - */ - fee?: number, - } = {}) => { - return await AssembledTransaction.fromSimulation({ - method: 'delete_offer', - args: this.spec.funcArgsToScVals("delete_offer", {mft: new Address(mft)}), - ...options, - ...this.options, - errorTypes: Errors, - parseResultXdr: this.parsers['deleteOffer'], - }); - } + /** + * Construct and simulate a distribute_payouts transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. + */ + distribute_payouts: (options?: { + /** + * The fee to pay for the transaction. Default: BASE_FEE + */ + fee?: number; + + /** + * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT + */ + timeoutInSeconds?: number; + + /** + * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true + */ + simulate?: boolean; + }) => Promise> +} +export class Client extends ContractClient { + constructor(public readonly options: ContractClientOptions) { + super( + new ContractSpec([ "AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAgAAAAAAAAAAAAAABUluZGV4AAAAAAAAAQAAAAAAAAAHRW50cmllcwAAAAABAAAAEA==", + "AAAAAQAAAAAAAAAAAAAABUVudHJ5AAAAAAAABQAAAAAAAAADYXByAAAAAAsAAAAAAAAADWVxdWl0eV9zaGFyZXMAAAAAAAPsAAAAEwAAAAsAAAAAAAAABmVzY3JvdwAAAAAACwAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAAAAAAOdG90YWxfaW52ZXN0ZWQAAAAAAAs=", + "AAAAAAAAAAAAAAAJc2V0X2VudHJ5AAAAAAAAAQAAAAAAAAAFZW50cnkAAAAAAAfQAAAABUVudHJ5AAAAAAAAAA==", + "AAAAAAAAAAAAAAAJZ2V0X2VudHJ5AAAAAAAAAQAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAEAAAfQAAAABUVudHJ5AAAA", + "AAAAAAAAAAAAAAAGaW52ZXN0AAAAAAADAAAAAAAAAAR1c2VyAAAAEwAAAAAAAAAJaXBmc19oYXNoAAAAAAAAEAAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==", + "AAAAAAAAAAAAAAARZGlzdHJpYnV0ZV9wYXlvdXQAAAAAAAABAAAAAAAAAAlpcGZzX2hhc2gAAAAAAAAQAAAAAA==", + "AAAAAAAAAAAAAAASZGlzdHJpYnV0ZV9wYXlvdXRzAAAAAAAAAAAAAA==" ]), + options + ) + } + public readonly fromJSON = { + set_entry: this.txFromJSON, + get_entry: this.txFromJSON, + invest: this.txFromJSON, + distribute_payout: this.txFromJSON, + distribute_payouts: this.txFromJSON + } } \ No newline at end of file diff --git a/contract-client/src/method-options.ts b/contract-client/src/method-options.ts deleted file mode 100644 index 96a5cbb..0000000 --- a/contract-client/src/method-options.ts +++ /dev/null @@ -1,50 +0,0 @@ -// defined this way so typeahead shows full union, not named alias -let responseTypes: 'simulated' | 'full' | undefined -export type ResponseTypes = typeof responseTypes - -export type XDR_BASE64 = string - -export interface Wallet { - isConnected: () => Promise, - isAllowed: () => Promise, - getUserInfo: () => Promise<{ publicKey?: string }>, - signTransaction: (tx: XDR_BASE64, opts?: { - network?: string, - networkPassphrase?: string, - accountToSign?: string, - }) => Promise, - signAuthEntry: ( - entryXdr: XDR_BASE64, - opts?: { - accountToSign?: string; - } - ) => Promise -} - -export type ClassOptions = { - contractId: string - networkPassphrase: string - rpcUrl: string - errorTypes?: Record - /** - * A Wallet interface, such as Freighter, that has the methods `isConnected`, `isAllowed`, `getUserInfo`, and `signTransaction`. If not provided, will attempt to import and use Freighter. Example: - * - * @example - * ```ts - * import freighter from "@stellar/freighter-api"; - * import { Contract } from "contract-client"; - * const contract = new Contract({ - * …, - * wallet: freighter, - * }) - * ``` - */ - wallet?: Wallet -} - -export type MethodOptions = { - /** - * The fee to pay for the transaction. Default: soroban-sdk's BASE_FEE ('100') - */ - fee?: number -} diff --git a/contract-client/tsconfig.json b/contract-client/tsconfig.json index efd4c61..3841393 100644 --- a/contract-client/tsconfig.json +++ b/contract-client/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "esModuleInterop": true, /* Visit https://aka.ms/tsconfig to read more about this file */ /* Projects */ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ @@ -9,7 +10,7 @@ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ @@ -22,9 +23,9 @@ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "ESNext", /* Specify what module code is generated. */ + "module": "NodeNext" /* Specify what module code is generated. */, // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "NodeNext" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ @@ -39,12 +40,12 @@ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ /* Emit */ - "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, // "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist", /* Specify an output folder for all emitted files. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, // "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ @@ -71,7 +72,7 @@ /* Type Checking */ // "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ @@ -92,7 +93,5 @@ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "include": [ - "src/*" - ] + "include": ["src/*"] } diff --git a/contract/Cargo.lock b/contract/Cargo.lock index b02a4f0..c16e100 100644 --- a/contract/Cargo.lock +++ b/contract/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" @@ -82,9 +82,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytes-lit" @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.88" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" [[package]] name = "cfg-if" @@ -133,9 +133,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -200,9 +200,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", "syn", @@ -238,9 +238,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -248,9 +248,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", @@ -262,9 +262,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -316,22 +316,21 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "ecdsa" -version = "0.16.9" +version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" dependencies = [ "der", "digest", "elliptic-curve", "rfc6979", "signature", - "spki", ] [[package]] @@ -360,9 +359,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "elliptic-curve" @@ -376,7 +375,6 @@ dependencies = [ "ff", "generic-array", "group", - "pkcs8", "rand_core", "sec1", "subtle", @@ -413,9 +411,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fnv" @@ -472,9 +470,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hex" @@ -542,12 +540,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "serde", ] @@ -568,15 +566,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -590,9 +588,7 @@ dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", - "once_cell", "sha2", - "signature", ] [[package]] @@ -606,9 +602,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -618,21 +614,21 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" dependencies = [ "adler", ] @@ -699,11 +695,23 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pkcs8" @@ -717,9 +725,9 @@ dependencies = [ [[package]] name = "platforms" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" [[package]] name = "powerfmt" @@ -743,6 +751,15 @@ dependencies = [ "syn", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.69" @@ -803,9 +820,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" @@ -818,29 +835,28 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "sec1" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" dependencies = [ "base16ct", "der", "generic-array", - "pkcs8", "subtle", "zeroize", ] [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" @@ -875,15 +891,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.6.1" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.3", + "indexmap 2.2.6", "serde", "serde_derive", "serde_json", @@ -893,9 +909,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.6.1" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" dependencies = [ "darling", "proc-macro2", @@ -926,9 +942,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" dependencies = [ "digest", "rand_core", @@ -943,15 +959,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "soroban-builtin-sdk-macros" -version = "20.2.2" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ef302d2118a14267e441e50e33705adc4f0da56616e7d2d9f198448d5714b2" +checksum = "084aab008009e712c445a9d7eab837a86559a6c2341f30bc4f33e9b258947688" dependencies = [ "itertools", "proc-macro2", @@ -961,9 +977,9 @@ dependencies = [ [[package]] name = "soroban-env-common" -version = "20.2.2" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc40ac91f70bb93aed7dff6057caac8810d49a8c451f44286e1e49243c799beb" +checksum = "c16ee889fe99d6828bf3ffac00c84382793c31d62682401dbfa3e1b512f0c542" dependencies = [ "arbitrary", "crate-git-revision", @@ -975,13 +991,14 @@ dependencies = [ "soroban-wasmi", "static_assertions", "stellar-xdr", + "wasmparser", ] [[package]] name = "soroban-env-guest" -version = "20.2.2" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "949587b3608cb05fe1d5eecce24aed1c33063c38fa79402f2e5b1c2a29466350" +checksum = "95e591a15e488e66d3edd4be044fc4ffea438945f022c27129e933275744666f" dependencies = [ "soroban-env-common", "static_assertions", @@ -989,13 +1006,16 @@ dependencies = [ [[package]] name = "soroban-env-host" -version = "20.2.2" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa4e738232cacae7deb7947adfd4718e47cd2b50676e9518a8a38ee00930c9" +checksum = "4b73f48ae8081ecfb6c0d56c67f139c52cb6d5b6800d5e1adb9eef8e14a155b9" dependencies = [ "backtrace", "curve25519-dalek", + "ecdsa", "ed25519-dalek", + "elliptic-curve", + "generic-array", "getrandom", "hex-literal", "hmac", @@ -1003,8 +1023,10 @@ dependencies = [ "num-derive", "num-integer", "num-traits", + "p256", "rand", "rand_chacha", + "sec1", "sha2", "sha3", "soroban-builtin-sdk-macros", @@ -1012,13 +1034,14 @@ dependencies = [ "soroban-wasmi", "static_assertions", "stellar-strkey", + "wasmparser", ] [[package]] name = "soroban-env-macros" -version = "20.2.2" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff09cd5f1e4968e6dbac40eb4fbb2bdbb478fa989a96088fe0466d09e8ff40c6" +checksum = "06d0581e3aba14892ee0ce63788f3d3e5d9eb1ab18906a9b7c66d77dae9e9fea" dependencies = [ "itertools", "proc-macro2", @@ -1031,9 +1054,9 @@ dependencies = [ [[package]] name = "soroban-ledger-snapshot" -version = "20.3.2" +version = "21.1.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a7b822725a73a90ef650bc1f325d13c8bae7a808156c101953092327e2edee" +checksum = "07d02fc89d3a0e49776cdc35609719ddc5635ff61751b37d5577a06cc4b592ea" dependencies = [ "serde", "serde_json", @@ -1045,9 +1068,9 @@ dependencies = [ [[package]] name = "soroban-sdk" -version = "20.3.2" +version = "21.1.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdff4b5fc50f554499b81aa6ecbb4045beb84742ecda9777ebbdc90c0d93ec62" +checksum = "1460cfdb31c0a1a7b93a35573fb9f794244a196224f8bf94cd235e4d29d8563d" dependencies = [ "arbitrary", "bytes-lit", @@ -1065,9 +1088,9 @@ dependencies = [ [[package]] name = "soroban-sdk-macros" -version = "20.3.2" +version = "21.1.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d147c3ce37842919893946a4467632aa012f567a7ab2286abe19e5ecc25e05" +checksum = "a164fe430678986174b9872c6f82c23d73e74d3c6820800979af19c455c0bb70" dependencies = [ "crate-git-revision", "darling", @@ -1085,9 +1108,9 @@ dependencies = [ [[package]] name = "soroban-spec" -version = "20.3.2" +version = "21.1.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7a132b7c234edf6ef3add4ffb17807f3b25a4ce5ab944ebbaf4d2326470eb1" +checksum = "6eeac587846418ecb0c73e9b05a9719559bccfc05da941d328eb3f8f8664c11a" dependencies = [ "base64 0.13.1", "stellar-xdr", @@ -1097,9 +1120,9 @@ dependencies = [ [[package]] name = "soroban-spec-rust" -version = "20.3.2" +version = "21.1.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d396f3b29800138e8abf2562aba0b579d09d8c2d2b956379fc9e68914a6e62" +checksum = "57c179749d655418a01d6d46d5dd08c024ed2e6ee68689430144195ba2f42ca8" dependencies = [ "prettyplease", "proc-macro2", @@ -1159,9 +1182,9 @@ dependencies = [ [[package]] name = "stellar-xdr" -version = "20.1.0" +version = "21.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e59cdf3eb4467fb5a4b00b52e7de6dca72f67fac6f9b700f55c95a5d86f09c9d" +checksum = "ec43c9c5ae7ec7b6ac9e263b6d5b9e3781aa05ba3a1c05f6e70701c5c6600665" dependencies = [ "arbitrary", "base64 0.13.1", @@ -1175,9 +1198,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -1218,9 +1241,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -1239,9 +1262,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -1273,9 +1296,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1283,9 +1306,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", @@ -1298,9 +1321,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1308,9 +1331,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", @@ -1321,9 +1344,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasmi_arena" @@ -1345,18 +1368,19 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.88.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb8cf7dd82407fe68161bedcd57fde15596f32ebf6e9b3bdbf3ae1da20e38e5e" +checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" dependencies = [ - "indexmap 1.9.3", + "indexmap 2.2.6", + "semver", ] [[package]] name = "wasmparser-nostd" -version = "0.100.1" +version = "0.100.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" +checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] @@ -1372,13 +1396,14 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -1387,48 +1412,54 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.52.3" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.52.3" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/contract/Cargo.toml b/contract/Cargo.toml index bd41ccc..11bbc1d 100644 --- a/contract/Cargo.toml +++ b/contract/Cargo.toml @@ -7,10 +7,10 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -soroban-sdk = "20.3.2" +soroban-sdk = "21.1.0-rc.1" [dev_dependencies] -soroban-sdk = { version = "20.3.2", features = ["testutils"] } +soroban-sdk = { version = "21.1.0-rc.1", features = ["testutils"] } [features] testutils = ["soroban-sdk/testutils"] diff --git a/contract/init.sh b/contract/init.sh index b5a137c..17e9df4 100755 --- a/contract/init.sh +++ b/contract/init.sh @@ -67,7 +67,7 @@ echo " RPC URL: $SOROBAN_RPC_URL" echo " Friendbot URL: $FRIENDBOT_URL" echo Add the $NETWORK network to cli client -soroban config network add \ +soroban network add \ --rpc-url "$SOROBAN_RPC_URL" \ --network-passphrase "$SOROBAN_NETWORK_PASSPHRASE" "$NETWORK" @@ -81,11 +81,11 @@ echo $FRIENDBOT_URL > ./.vars/friendbot-url echo -n GD7BAZM73BXQTMRHA2JVJPE5X4AATOMOIXGA76N22JNTNMVXRQW5DR4B > ./.vars/public-key echo -n SB6NGNDLFKMRK4XW2W5OWFMJ2LIJ5SBXJU2X5TRSPXR2UNDOXHHZNKWY > ./.vars/secret-key -if !(soroban config identity ls | grep token-admin 2>&1 >/dev/null); then +if !(soroban keys ls | grep token-admin 2>&1 >/dev/null); then echo Create the token-admin identity - soroban config identity generate token-admin --rpc-url "$SOROBAN_RPC_URL" --network-passphrase "$SOROBAN_NETWORK_PASSPHRASE" --network "$NETWORK" + soroban keys generate token-admin --rpc-url "$SOROBAN_RPC_URL" --network-passphrase "$SOROBAN_NETWORK_PASSPHRASE" --network "$NETWORK" fi -ADMIN_ADDRESS="$(soroban config identity address token-admin)" +ADMIN_ADDRESS="$(soroban keys address token-admin)" # This will fail if the account already exists, but it'll still be fine. echo Fund token-admin account from friendbot diff --git a/contract/src/lib.rs b/contract/src/lib.rs index 2ade7de..b8cea11 100644 --- a/contract/src/lib.rs +++ b/contract/src/lib.rs @@ -1,101 +1,115 @@ #![no_std] -use soroban_sdk::{contract, contractimpl, contracttype, log, token, Address, Env, String}; +use soroban_sdk::{contract, contracttype, Map, contractimpl, Env, String, Address, token, log, Vec, vec }; #[contracttype] pub enum DataKey { - Offers(Address), + Index, + Entries(String), } #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] -pub struct Offer { - mft: Address, - amount: i128, - list_price: i128, -} - -#[contracttype] -#[derive(Clone, Debug, Eq, PartialEq)] -pub struct Owner { - public_key: Address, - amount: i128, - mft: Address, +pub struct Entry { + pub ipfs_hash: String, + pub apr: i128, + pub total_invested: i128, + pub escrow: i128, + pub equity_shares: Map, } #[contract] -pub struct MusicNFTs; +pub struct Contract; #[contractimpl] -impl MusicNFTs { - pub fn buy(e: Env, buyer: Address, mft: Address, amount: i128) { - buyer.require_auth(); - - // let offer = Self::get_offer(&e, mft.clone()); - // assert!(offer.amount >= amount, "amount must be less or equal to the current offer"); - - // log!(&e, "Buying NFT."); - // let xlm_address = get_xlm_address(&e); - // let xlm = token::Client::new(&e, &xlm_address); - - // let total_xlm = offer.list_price * (amount / 100) * 1000000; - // xlm.transfer(&buyer, &e.current_contract_address(), &total_xlm); +impl Contract { + pub fn set_entry(e: Env, entry: Entry) { + let key = DataKey::Entries(entry.ipfs_hash.clone()); + e.storage().instance().set(&key, &entry); + + let mut index: Vec = e.storage().instance().get(&DataKey::Index).unwrap_or(vec![&e]); + index.push_back(entry.ipfs_hash.clone()); + e.storage().instance().set(&DataKey::Index, &index); + } + - // let mut updated_offer = offer; - // updated_offer.amount -= amount; + pub fn get_entry(e: &Env, ipfs_hash: String) -> Entry { + let key = DataKey::Entries(ipfs_hash); - // if updated_offer.amount == 0 { - // Self::delete_offer(e.clone(), mft.clone()); - // } else { - // Self::set_offer(e.clone(), updated_offer); - // } + e.storage().instance().get(&key).unwrap() } - pub fn balance(e: Env, address: Address) -> i128 { - let xlm_address = get_xlm_address(&e); - let xlm = token::Client::new(&e, &xlm_address); - xlm.balance(&address) + pub fn invest(e: Env, user: Address, ipfs_hash: String, amount: i128) { + user.require_auth(); + let download_amount = 3000000; + let key = DataKey::Entries(ipfs_hash.clone()); + let mut entry: Entry = e.storage().instance().get(&key).unwrap(); + + // Update equity share + let past_user_equity = entry.equity_shares.get(user.clone()).unwrap_or(0); + + if amount > download_amount { + entry.equity_shares.set(user.clone(), past_user_equity + amount); + log!(&e, "Got equity!"); + entry.total_invested += amount; + } + + entry.escrow += amount; + entry.apr = get_apr(&e, entry.clone()); + + // Save updated entry + e.storage().instance().set(&key, &entry); + transfer(&e, &user, &e.current_contract_address(), amount); } - pub fn set_offer(e: Env, offer: Offer) { - let key = DataKey::Offers(offer.mft.clone()); - - e.storage().instance().set(&key, &offer); + pub fn distribute_payout(e: Env, ipfs_hash: String) { + let key = DataKey::Entries(ipfs_hash.clone()); + let mut entry: Entry = e.storage().instance().get(&key).unwrap(); + for (user, equity) in entry.equity_shares.iter() { + let user_payout = (entry.escrow / 365) * (equity / entry.total_invested); + entry.escrow -= user_payout; + entry.apr = get_apr(&e, entry.clone()); + + e.storage().instance().set(&key, &entry); + log!(&e, "Payout {}!", user_payout); + transfer(&e, &e.current_contract_address(), &user, user_payout); + } } - - - pub fn get_offer(e: &Env, mft: Address) -> Offer { - let key = DataKey::Offers(mft); - e.storage().instance().get(&key).unwrap() + pub fn distribute_payouts(e: Env) { + let index: Vec = e.storage().instance().get(&DataKey::Index).unwrap_or(vec![&e]); + for key in index.iter() { + // Access each entry by key + log!(&e,"Key: {}", key); + Self::distribute_payout(e.clone(), key); + } } + +} - pub fn delete_offer(e: Env, mft: Address) { - let key = DataKey::Offers(mft); - - e.storage().instance().remove(&key); - } +fn get_apr(_: &Env, entry: Entry) -> i128 { + if entry.total_invested == 0 { + return 0 + } + (entry.escrow * 100 ) / entry.total_invested +} - // The rest of the contract methods... +fn transfer(e: &Env, from: &Address, to: &Address, amount: i128) { + let token_contract_id = &get_xlm_address(e); + let client = token::Client::new(e, token_contract_id); + client.transfer(from, to, &amount) } -fn get_xlm_address(e: &Env) -> Address { - // Implementation remains unchanged... - // public xlm - // return Address::from_string(&String::from_str( - // &e, - // "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", - // )); +fn get_xlm_address(env: &Env) -> Address { + // futurenet + // CB64D3G7SM2RTH6JSGG34DDTFTQ5CFDKVDZJZSODMCX4NJ2HV2KN7OHT // testnet - return Address::from_string(&String::from_str( - &e, - "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", - )); - - // futurenet - // return Address::from_string(&String::from_str( - // &e, - // "CB64D3G7SM2RTH6JSGG34DDTFTQ5CFDKVDZJZSODMCX4NJ2HV2KN7OHT", - // )); + // CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC + // mainnet + // CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA + + // testnet + Address::from_string(&String::from_str(env, "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC",)) } + diff --git a/package.json b/package.json index 1f191bb..17e29e0 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "main": "index.ts", "author": "Alejo Mendoza", "license": "MIT", + "type": "module", "scripts": { "dev": "NODE_ENV=development node -r ts-node/register -r tsconfig-paths/register --inspect ./src/graphql/server.ts", "prod": "NODE_ENV=production node -r ts-node/register -r tsconfig-paths/register --inspect ./src/graphql/server.ts", @@ -12,23 +13,23 @@ "setup": "./contract/init.sh ${NETWORK:-testnet}" }, "dependencies": { - "@apollo/server": "^4.2.0", + "@apollo/server": "^4.10.4", "@iarna/toml": "^2.2.5", "@sendgrid/mail": "^7.7.0", "@stellar/js-xdr": "^3.1.0", + "@stellar/stellar-sdk": "12.0.0-rc.3", "@types/cors": "^2.8.12", "@types/express-jwt": "^6.0.4", "@types/graphql": "^14.2.3", "@types/jsonwebtoken": "^8.5.9", "algoliasearch": "^4.14.2", "async": "^3.2.4", - "axios": "1.1.0", + "axios": "^1.7.2", "axios-cache-adapter": "^2.7.3", "bcrypt": "5.1.0", "body-parser": "^1.20.1", "bs58": "^5.0.0", "compression": "^1.7.4", - "contract-client": "./contract-client", "cors": "^2.8.5", "dotenv": "16.0.3", "express": "^4.18.2", @@ -45,10 +46,10 @@ "devDependencies": { "@vercel/node": "2.4.0", "prettier": "2.8.0", - "ts-node": "^10.9.1", + "ts-node": "^10.9.2", "tsconfig-paths": "^4.1.0", "tslint": "^6.1.2", - "typescript": "^4.9.3" + "typescript": "^5.4.5" }, "packageManager": "yarn@4.1.1" } diff --git a/src/graphql/call-contract.ts b/src/graphql/call-contract.ts index 6d3d190..c9c74a0 100644 --- a/src/graphql/call-contract.ts +++ b/src/graphql/call-contract.ts @@ -1,14 +1,13 @@ import { Keypair, Transaction, hash, scValToNative, xdr } from 'stellar-base'; -import { Contract, networks, Offer } from 'contract-client'; +import { Client, Entry, networks } from 'contract-client'; // import { getAuthenticatedUser } from '../auth/logic'; -import { User } from 'src/util/types'; // import { decrypt } from 'src/util/encryption'; // import { Hyper } from '@stellar/js-xdr'; -// const buyerKeys = Keypair.fromSecret(decrypt(user.seed)); +// const userKeys = Keypair.fromSecret(decrypt(user.seed)); // GBZP6P7QNKI342HNDUWXG5TE6DPIRIJBMERMZY5VCVHKVI67TJAYSK2C -const buyerKeys = Keypair.fromSecret( +const userKeys = Keypair.fromSecret( 'SC5FF7SJOUA3XVCSPIXEG6L2ORFHQ6BTVJBJH345W2GRSACKYIUXUDUP' ); @@ -17,88 +16,92 @@ const sourceKeys = Keypair.fromSecret( 'SB6NGNDLFKMRK4XW2W5OWFMJ2LIJ5SBXJU2X5TRSPXR2UNDOXHHZNKWY' ); +const defaultOptions = { timeoutInSeconds: 60, fee: 100000000 }; + function getClientForKeypair(keys: Keypair) { - return new Contract({ - ...networks.testnet, - rpcUrl: 'https://soroban-testnet.stellar.org', // from https://soroban.stellar.org/docs/reference/rpc-list#sdf-futurenet-and-testnet-only - wallet: { - isConnected: async () => await true, - isAllowed: async () => await true, - getUserInfo: async () => - await { - publicKey: keys.publicKey(), - }, - signTransaction: async (tx: string, opts) => { - const txFromXDR = new Transaction(tx, opts.networkPassphrase); - - txFromXDR.sign(keys); - - return txFromXDR.toXDR(); - }, - signAuthEntry: async (entryXdr, opts) => { - return keys - .sign(hash(Buffer.from(entryXdr, 'base64'))) - .toString('base64'); - }, + return new Client({ + contractId: networks.testnet.contractId, + networkPassphrase: networks.testnet.networkPassphrase, + rpcUrl: 'https://soroban-testnet.stellar.org', + publicKey: keys.publicKey(), + signTransaction: async (tx: string, opts) => { + const txFromXDR = new Transaction(tx, opts.networkPassphrase); + + txFromXDR.sign(keys); + + return txFromXDR.toXDR(); + }, + signAuthEntry: async (entryXdr, opts) => { + return keys + .sign(hash(Buffer.from(entryXdr, 'base64'))) + .toString('base64'); }, }); } -// const new_offer: Offer = { -// amount: BigInt(100), -// list_price: BigInt(1500), -// mft: 'bafkreihwofyg6w6gvm5inzvsjoxyxwooafryhkhvsaoozla6hc2b43v56e', -// }; - -const new_offer: Offer = { - amount: BigInt(90), - list_price: BigInt(200), - mft: 'GBCXC355SJCKNESJILVJWVDMURDGBYMXOCUBKSL73RQYM7RB6XB27PSW', +const new_entry: Entry = { + ipfs_hash: 'abc', + total_invested: BigInt(0), + apr: BigInt(0), + equity_shares: new Map(), + escrow: BigInt(0), }; -const addOffer = async () => { +const setEntry = async () => { const contract = getClientForKeypair(sourceKeys); - const tx = await contract.setOffer({ offer: new_offer }); + const tx = await contract.set_entry({ entry: new_entry }, defaultOptions); + console.log(tx); const res = await tx.signAndSend(); + console.log(res); return res.getTransactionResponse; }; -const getOffer = async (mft: string) => { +const getEntry = async (ipfs_hash: string) => { const contract = getClientForKeypair(sourceKeys); - const tx = await contract.getOffer({ - mft, - }); + const tx = await contract.get_entry( + { + ipfs_hash, + }, + defaultOptions + ); + console.log(tx); + console.log(tx.simulationData); + + return tx.result; +}; + +const distributePayouts = async () => { + const contract = getClientForKeypair(sourceKeys); + + // get mft issuer with our logic + let tx = await contract.distribute_payouts(); return tx.result; }; -const buy = async (mft: string, user?: User) => { +const invest = async (ipfs_hash: string, amount: number) => { const contract = getClientForKeypair(sourceKeys); // get mft issuer with our logic - let tx = await contract.buy( + let tx = await contract.invest( { - buyer: buyerKeys.publicKey(), - mft: mft, - amount: BigInt(10), + user: userKeys.publicKey(), + ipfs_hash, + amount: BigInt(amount), }, - { fee: 100000000 } + defaultOptions ); - console.log(await tx.needsNonInvokerSigningBy()); - const jsonFromRoot = tx.toJSON(); - console.log(tx.simulationData.transactionData.resources); - - const buyerClient = getClientForKeypair(buyerKeys); + const userClient = getClientForKeypair(userKeys); - const txBuyer = buyerClient.fromJSON['buy'](jsonFromRoot); + const txUser = userClient.fromJSON['invest'](jsonFromRoot); - await txBuyer.signAuthEntries(); + await txUser.signAuthEntries(); - const jsonFromBuyer = txBuyer.toJSON(); + const jsonFromUser = txUser.toJSON(); - const txRoot = contract.fromJSON['buy'](jsonFromBuyer); + const txRoot = contract.fromJSON['invest'](jsonFromUser); const result = await txRoot.signAndSend(); @@ -106,7 +109,9 @@ const buy = async (mft: string, user?: User) => { // console.log('get res', result.getTransactionResponseAll); const getRes = result.getTransactionResponse as any; - console.log(getRes.resultMetaXdr.toXDR('base64')); + // console.log(getRes.resultMetaXdr.toXDR('base64')); + + console.log(getRes.resultXdr.toXDR('base64')); xdr.TransactionMeta.fromXDR(getRes.resultMetaXdr.toXDR('base64'), 'base64') .v3() @@ -121,31 +126,20 @@ const buy = async (mft: string, user?: User) => { return result.getTransactionResponse; }; -const deleteOffer = async (mftHash: string) => { - const contract = getClientForKeypair(sourceKeys); - - const tx = await contract.deleteOffer({ mft: mftHash }); - const res = await tx.signAndSend(); - return res.getTransactionResponse; -}; - export const callContract = async (_: any, args: any, ctx: any) => { // const user = await getAuthenticatedUser(ctx); - const { fn, mft } = args; + const { fn, ipfs_hash } = args; switch (fn) { - case 'updateOffer': - return addOffer(); - - case 'deleteOffer': - return deleteOffer(mft); - - case 'getOffer': - return getOffer(mft); - - case 'buy': - return buy(mft); + case 'setEntry': + return setEntry(); + case 'getEntry': + return getEntry(ipfs_hash); + case 'invest': + return invest(ipfs_hash, 10000000); + case 'distribute': + return distributePayouts(); } return {}; diff --git a/src/graphql/schema.ts b/src/graphql/schema.ts index fc95b1c..7d5327f 100644 --- a/src/graphql/schema.ts +++ b/src/graphql/schema.ts @@ -13,7 +13,7 @@ type Query { xlmPrice: String! getIssuer(cid: String!): String! getAudibleToken: Token! - callContract(fn: String!, mft: String): JSON + callContract(fn: String!, ipfs_hash: String): JSON } type Mutation { diff --git a/tsconfig.json b/tsconfig.json index 293daca..d071c80 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,8 +4,8 @@ "sourceMap": true, "noUnusedLocals": true, "esModuleInterop": true, - "module": "commonjs", - "moduleResolution": "node", + "module": "Preserve", + "moduleResolution": "Bundler", "target": "ESNext", "jsx": "react", "experimentalDecorators": true, diff --git a/yarn.lock b/yarn.lock index 58288be..d4b896a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -137,12 +137,12 @@ __metadata: languageName: node linkType: hard -"@apollo/cache-control-types@npm:^1.0.2": - version: 1.0.2 - resolution: "@apollo/cache-control-types@npm:1.0.2" +"@apollo/cache-control-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@apollo/cache-control-types@npm:1.0.3" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/685b29a3f68d4690fd6e7fd277a5dc4b26f4b65843a67e66b9c012981db9b979e690169acd04eb5196770cebc0c0ac7f987aee25f0b73f9e527b47bf6455fcea + checksum: 10c0/b49a9e99c7d5af6dfe12b775eb6374c8a54894e17ffa882b3d85f4501ca19ee413bdcc1a787a4b44dcc2903ce2c28f19b69116f338f88670c4f6f2e10a0bc498 languageName: node linkType: hard @@ -169,33 +169,33 @@ __metadata: languageName: node linkType: hard -"@apollo/server-gateway-interface@npm:^1.0.7": - version: 1.0.7 - resolution: "@apollo/server-gateway-interface@npm:1.0.7" +"@apollo/server-gateway-interface@npm:^1.1.1": + version: 1.1.1 + resolution: "@apollo/server-gateway-interface@npm:1.1.1" dependencies: - "@apollo/usage-reporting-protobuf": "npm:^4.0.0" + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" "@apollo/utils.fetcher": "npm:^2.0.0" - "@apollo/utils.keyvaluecache": "npm:^2.0.1" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" "@apollo/utils.logger": "npm:^2.0.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/61469e6bf1f37d3de0b09639b2eef2347620f82c0bbbb37239be552827ce35222e092d10200c0425b4b2b96038f9a6b5661d8379b7978394cb57bdc773d1b3eb + checksum: 10c0/2787b2954028f5aff55846df98b3967f38f40df4c5e4c9df0da56ac16d4323ba0aeabd76d4b134fedc9f6fe7d63e6fd9e9a133eb5d209408eac34c0e25cbe7dd languageName: node linkType: hard -"@apollo/server@npm:^4.2.0": - version: 4.2.1 - resolution: "@apollo/server@npm:4.2.1" +"@apollo/server@npm:^4.10.4": + version: 4.10.4 + resolution: "@apollo/server@npm:4.10.4" dependencies: - "@apollo/cache-control-types": "npm:^1.0.2" - "@apollo/server-gateway-interface": "npm:^1.0.7" - "@apollo/usage-reporting-protobuf": "npm:^4.0.0" + "@apollo/cache-control-types": "npm:^1.0.3" + "@apollo/server-gateway-interface": "npm:^1.1.1" + "@apollo/usage-reporting-protobuf": "npm:^4.1.1" "@apollo/utils.createhash": "npm:^2.0.0" "@apollo/utils.fetcher": "npm:^2.0.0" "@apollo/utils.isnodelike": "npm:^2.0.0" - "@apollo/utils.keyvaluecache": "npm:^2.0.1" + "@apollo/utils.keyvaluecache": "npm:^2.1.0" "@apollo/utils.logger": "npm:^2.0.0" - "@apollo/utils.usagereporting": "npm:^2.0.0" + "@apollo/utils.usagereporting": "npm:^2.1.0" "@apollo/utils.withrequired": "npm:^2.0.0" "@graphql-tools/schema": "npm:^9.0.0" "@josephg/resolvable": "npm:^1.0.0" @@ -203,28 +203,27 @@ __metadata: "@types/express-serve-static-core": "npm:^4.17.30" "@types/node-fetch": "npm:^2.6.1" async-retry: "npm:^1.2.1" - body-parser: "npm:^1.20.0" cors: "npm:^2.8.5" express: "npm:^4.17.1" loglevel: "npm:^1.6.8" lru-cache: "npm:^7.10.1" negotiator: "npm:^0.6.3" - node-abort-controller: "npm:^3.0.1" + node-abort-controller: "npm:^3.1.1" node-fetch: "npm:^2.6.7" uuid: "npm:^9.0.0" whatwg-mimetype: "npm:^3.0.0" peerDependencies: graphql: ^16.6.0 - checksum: 10c0/55854d9054396baa157446cc21e940dc16413a1c7b0b742f2318813e1921f36bcc92ecf5bb166a5c07b6f6e96e5c2fa69ee12b0522db52953e2352956d3efbc5 + checksum: 10c0/e807ea6755e86cb86809c988542cf05ffafcffb752da2ccd1fe75912ca0beeecc33c36749c4ea498faa0fe6b5297a85da454b5b55f7cf76cf1b08cbd0b3effe9 languageName: node linkType: hard -"@apollo/usage-reporting-protobuf@npm:^4.0.0": - version: 4.0.2 - resolution: "@apollo/usage-reporting-protobuf@npm:4.0.2" +"@apollo/usage-reporting-protobuf@npm:^4.1.0, @apollo/usage-reporting-protobuf@npm:^4.1.1": + version: 4.1.1 + resolution: "@apollo/usage-reporting-protobuf@npm:4.1.1" dependencies: "@apollo/protobufjs": "npm:1.2.7" - checksum: 10c0/43425843a465ebde6d18744c80f50f9c2566126c418be1530fa9b987ed5cd19552511bff6f6da5293863e6aaaaa7d6857845d37f2691ae4920519dc271b53ec0 + checksum: 10c0/45f0167a87d4ae8a12124831ebb29905122d28afdbfa23a4f25f4570189d5ddaa6f2829ef97923f5909b9753e39dbd28f810ca2a93ad9fcd60b2baf5669f5223 languageName: node linkType: hard @@ -238,12 +237,12 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.dropunuseddefinitions@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.0" +"@apollo/utils.dropunuseddefinitions@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.dropunuseddefinitions@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/856617663b6ab70c83c0cde6a3f5f24fb907a6179ff0858b42fa81fab054a57e802b14756e73f8f867f79327f720b2e515c95cf4316dfd6a2aed1e77fde356a5 + checksum: 10c0/4f646ac18219c16b77ffacf25cd18be4f0dfe7b4bd1fa4d57de7e0105c6f2daa71e30a9ba3266a322d4adb6fbbb2494b053748f3fbe7ed035683cf490b6abf38 languageName: node linkType: hard @@ -261,13 +260,13 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.keyvaluecache@npm:^2.0.1": - version: 2.0.1 - resolution: "@apollo/utils.keyvaluecache@npm:2.0.1" +"@apollo/utils.keyvaluecache@npm:^2.1.0": + version: 2.1.1 + resolution: "@apollo/utils.keyvaluecache@npm:2.1.1" dependencies: - "@apollo/utils.logger": "npm:^2.0.0" + "@apollo/utils.logger": "npm:^2.0.1" lru-cache: "npm:^7.14.1" - checksum: 10c0/94002400aea95825b9af76ef676c05a05f33969f5b5e8a8e1623818401189d8aaa0356a27382e04263c4b0201ac41f9d196b0bc73cd23d7805d99ad277a46d90 + checksum: 10c0/393a66ccae32d0f0d346f796b9196c983abd9300e340ecdefa7edb5acd577693ef31ab72de73ef0acee689856a80f977938aab57d3eb9d8cbd3ce494cc4c0233 languageName: node linkType: hard @@ -278,57 +277,64 @@ __metadata: languageName: node linkType: hard -"@apollo/utils.printwithreducedwhitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.0" +"@apollo/utils.logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.logger@npm:2.0.1" + checksum: 10c0/7fcf72fdce95540907647ed99b878e2b84f82b963ab00e3bcfea082597d51a5b825411659e378c1497485f858e4e0bb7eb55369c502d96a0b87375d5036a92ba + languageName: node + linkType: hard + +"@apollo/utils.printwithreducedwhitespace@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.printwithreducedwhitespace@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/36fecead7b4ad0de770523d678a83f461a7af16d1356f7af2975df29157ce290b66666019fac785ccecee3d804ab20ed7817f771036a98edb5d6b9410950293a + checksum: 10c0/e4af07f8608bff93970574f891c98cb34c960faa3036d467180bb8964684c5d89357311269f78113e1871fc670a2be7672096f6de06180eb170a3219571a7881 languageName: node linkType: hard -"@apollo/utils.removealiases@npm:2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.removealiases@npm:2.0.0" +"@apollo/utils.removealiases@npm:2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.removealiases@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/2028d9303336d621f65fb19d7bcb4ee88fd77aad919ba71270f28303f28a0f06b6e6d828cd426db9074bf5dafe70bed907c22d9a5a5e78a6a550f5bde790468d + checksum: 10c0/8783fc0cfc04a3127d6537bef950c500c2ddf50206847e691b630dde9e7f3a402ed540800e19e69405e7421bdcc05fba84ce45cba9a824e550b405900efffcae languageName: node linkType: hard -"@apollo/utils.sortast@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.sortast@npm:2.0.0" +"@apollo/utils.sortast@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.sortast@npm:2.0.1" dependencies: lodash.sortby: "npm:^4.7.0" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/b663944d4415648674bab47b3a4334811ddf61fcd591f77ac3ec87fbe1bc1e96b11bb13edb810fbbfa58d88807dc19649acd8bbd786049f394901cca417d8a09 + checksum: 10c0/5b8ccabfa4e86c31ab5108f72bcea8968fdc63f1a9306707365ddf77f7d8bd406dea494b269e4dee210c97a681ee031c60f9a34368dcee4692ec462d076a0bd9 languageName: node linkType: hard -"@apollo/utils.stripsensitiveliterals@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.0" +"@apollo/utils.stripsensitiveliterals@npm:^2.0.1": + version: 2.0.1 + resolution: "@apollo/utils.stripsensitiveliterals@npm:2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/f9ff3971841377ce2ee98be3ba24f68aaac30d9f8de1193ab2cc70f4b0e9cbd0fbde5e5a1f20bf1da4747f8b086869131a36206aaaa2a8bd87aee660b30c50c2 + checksum: 10c0/eb6b22e5a140be574e526da044a48ac0f8949b6f87dccb0c4224c02a5a3df4db82873ab128177476765f1091edde4f3dcae5cb73077827b2cb91489c1c7a8130 languageName: node linkType: hard -"@apollo/utils.usagereporting@npm:^2.0.0": - version: 2.0.0 - resolution: "@apollo/utils.usagereporting@npm:2.0.0" - dependencies: - "@apollo/usage-reporting-protobuf": "npm:^4.0.0" - "@apollo/utils.dropunuseddefinitions": "npm:^2.0.0" - "@apollo/utils.printwithreducedwhitespace": "npm:^2.0.0" - "@apollo/utils.removealiases": "npm:2.0.0" - "@apollo/utils.sortast": "npm:^2.0.0" - "@apollo/utils.stripsensitiveliterals": "npm:^2.0.0" +"@apollo/utils.usagereporting@npm:^2.1.0": + version: 2.1.0 + resolution: "@apollo/utils.usagereporting@npm:2.1.0" + dependencies: + "@apollo/usage-reporting-protobuf": "npm:^4.1.0" + "@apollo/utils.dropunuseddefinitions": "npm:^2.0.1" + "@apollo/utils.printwithreducedwhitespace": "npm:^2.0.1" + "@apollo/utils.removealiases": "npm:2.0.1" + "@apollo/utils.sortast": "npm:^2.0.1" + "@apollo/utils.stripsensitiveliterals": "npm:^2.0.1" peerDependencies: graphql: 14.x || 15.x || 16.x - checksum: 10c0/e68fdb8cf6807f7b71d2b738a38cb09dd9bd0332d747da818957653b4771c07975f6628a324c21d7f2303268d895b5697832c96a67a23e9fe299845492a06084 + checksum: 10c0/5c2b06a14c5094d0ee8eab7ff78449da1efff3bb4c82ef311b2bb90190437c6c59f2783702a428775f394f12455a53a9723e625e53e18e47b423df8cb9eb26d8 languageName: node linkType: hard @@ -857,57 +863,50 @@ __metadata: languageName: node linkType: hard -"@stellar/freighter-api@npm:1.7.1": - version: 1.7.1 - resolution: "@stellar/freighter-api@npm:1.7.1" - checksum: 10c0/f18ac804a5efb29609e3b599b0ab715a008f3c67313a3e9521dc5796ab834d50d1e28c1a1a60fb30266578329eb5fc09c1c9692d448744dae26d5fc193242f34 +"@stellar/js-xdr@npm:^3.1.0": + version: 3.1.0 + resolution: "@stellar/js-xdr@npm:3.1.0" + checksum: 10c0/1b483355e42fe0e982fd46e1652c3cad85747061f2a950b95f0ea929ade6107e24755d0a96dad6e47a6f24549a6b6689f34a133914b2334ef634dc81734f36c4 languageName: node linkType: hard -"@stellar/js-xdr@npm:^3.0.1": +"@stellar/js-xdr@npm:^3.1.1": version: 3.1.1 resolution: "@stellar/js-xdr@npm:3.1.1" checksum: 10c0/ba3f8327ea2eac6fc62ef2f87b90b13038e59cc397d837bc722484f682ae2d2aae7626ed91d16d75c20388af29cc7248919d5c64b40fdfb0cfb44cefde6e69e2 languageName: node linkType: hard -"@stellar/js-xdr@npm:^3.1.0": - version: 3.1.0 - resolution: "@stellar/js-xdr@npm:3.1.0" - checksum: 10c0/1b483355e42fe0e982fd46e1652c3cad85747061f2a950b95f0ea929ade6107e24755d0a96dad6e47a6f24549a6b6689f34a133914b2334ef634dc81734f36c4 - languageName: node - linkType: hard - -"@stellar/stellar-base@npm:10.0.1": - version: 10.0.1 - resolution: "@stellar/stellar-base@npm:10.0.1" +"@stellar/stellar-base@npm:^12.0.0-rc.1": + version: 12.0.0 + resolution: "@stellar/stellar-base@npm:12.0.0" dependencies: - "@stellar/js-xdr": "npm:^3.0.1" + "@stellar/js-xdr": "npm:^3.1.1" base32.js: "npm:^0.1.0" bignumber.js: "npm:^9.1.2" buffer: "npm:^6.0.3" sha.js: "npm:^2.3.6" - sodium-native: "npm:^4.0.1" + sodium-native: "npm:^4.1.1" tweetnacl: "npm:^1.0.3" dependenciesMeta: sodium-native: optional: true - checksum: 10c0/37d7f3594830e4e91693fa8b5b0b17ee0081a282711e63d6e6e29f8f6b321db419fada65f923fdc1b06f5f246b8cfb5c27ef54866ae0fb746c71b6f35e214174 + checksum: 10c0/3b532c868a7a17b99692e53d941aed3a5c91778b370e91a978c2dfa98083e7880cfd485444a39e4e2086eee40ed42409a36a4058fa4351e7c0061d7f16c0e075 languageName: node linkType: hard -"@stellar/stellar-sdk@npm:11.2.0": - version: 11.2.0 - resolution: "@stellar/stellar-sdk@npm:11.2.0" +"@stellar/stellar-sdk@npm:12.0.0-rc.3": + version: 12.0.0-rc.3 + resolution: "@stellar/stellar-sdk@npm:12.0.0-rc.3" dependencies: - "@stellar/stellar-base": "npm:10.0.1" - axios: "npm:^1.6.5" + "@stellar/stellar-base": "npm:^12.0.0-rc.1" + axios: "npm:^1.6.8" bignumber.js: "npm:^9.1.2" eventsource: "npm:^2.0.2" randombytes: "npm:^2.1.0" toml: "npm:^3.0.0" urijs: "npm:^1.19.1" - checksum: 10c0/a3470cd18276d8007a39bd2706cb5d8000bb16000635dd34f7e35a09ba2c7248a6d8250ec0c3c309cbdc82d40e318a8f851962c6b6d033abdb9f5c01e96e943c + checksum: 10c0/2c5368c02062c71dea445fb70f15dfb81c2665f5765d8a8b9536d738bfe795e380d8e3d2668d96aac6da3add6371e8bcc541799ac008b098c0f48ec2b55de19b languageName: node linkType: hard @@ -1294,10 +1293,11 @@ __metadata: version: 0.0.0-use.local resolution: "api@workspace:." dependencies: - "@apollo/server": "npm:^4.2.0" + "@apollo/server": "npm:^4.10.4" "@iarna/toml": "npm:^2.2.5" "@sendgrid/mail": "npm:^7.7.0" "@stellar/js-xdr": "npm:^3.1.0" + "@stellar/stellar-sdk": "npm:12.0.0-rc.3" "@types/cors": "npm:^2.8.12" "@types/express-jwt": "npm:^6.0.4" "@types/graphql": "npm:^14.2.3" @@ -1305,13 +1305,12 @@ __metadata: "@vercel/node": "npm:2.4.0" algoliasearch: "npm:^4.14.2" async: "npm:^3.2.4" - axios: "npm:1.1.0" + axios: "npm:^1.7.2" axios-cache-adapter: "npm:^2.7.3" bcrypt: "npm:5.1.0" body-parser: "npm:^1.20.1" bs58: "npm:^5.0.0" compression: "npm:^1.7.4" - contract-client: ./contract-client cors: "npm:^2.8.5" dotenv: "npm:16.0.3" express: "npm:^4.18.2" @@ -1324,10 +1323,10 @@ __metadata: sha.js: "npm:^2.4.11" sharp: "npm:^0.33.3" stellar-base: "npm:^11.0.0" - ts-node: "npm:^10.9.1" + ts-node: "npm:^10.9.2" tsconfig-paths: "npm:^4.1.0" tslint: "npm:^6.1.2" - typescript: "npm:^4.9.3" + typescript: "npm:^5.4.5" yup: "npm:^0.32.11" languageName: unknown linkType: soft @@ -1407,17 +1406,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:1.1.0": - version: 1.1.0 - resolution: "axios@npm:1.1.0" - dependencies: - follow-redirects: "npm:^1.15.0" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/39cfcef4b85edea490eaca01b97a967915b6c4b01c42b04c67d72b6f1aab1ee1cd496a0d3fa4138d18bba9c5ff2988dd8a7687191226b0595fae62f518002077 - languageName: node - linkType: hard - "axios@npm:^0.26.0": version: 0.26.1 resolution: "axios@npm:0.26.1" @@ -1427,14 +1415,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.5": - version: 1.6.8 - resolution: "axios@npm:1.6.8" +"axios@npm:^1.6.8, axios@npm:^1.7.2": + version: 1.7.2 + resolution: "axios@npm:1.7.2" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9 + checksum: 10c0/cbd47ce380fe045313364e740bb03b936420b8b5558c7ea36a4563db1258c658f05e40feb5ddd41f6633fdd96d37ac2a76f884dad599c5b0224b4c451b3fa7ae languageName: node linkType: hard @@ -1483,7 +1471,7 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1, body-parser@npm:^1.20.0, body-parser@npm:^1.20.1": +"body-parser@npm:1.20.1, body-parser@npm:^1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: @@ -1554,7 +1542,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:6.0.3, buffer@npm:^6.0.3": +"buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" dependencies: @@ -1792,17 +1780,6 @@ __metadata: languageName: node linkType: hard -"contract-client@file:./contract-client::locator=api%40workspace%3A.": - version: 0.0.0 - resolution: "contract-client@file:./contract-client#./contract-client::hash=188772&locator=api%40workspace%3A." - dependencies: - "@stellar/freighter-api": "npm:1.7.1" - "@stellar/stellar-sdk": "npm:11.2.0" - buffer: "npm:6.0.3" - checksum: 10c0/c645cf6299c22e1c64ba2fbc70c6b8b5e881c94599d5a2cf3986e44f39c69e64a6b622523111444174ed51086176ca0883bc999f52f7830a1e182b8ba57987b4 - languageName: node - linkType: hard - "convert-hrtime@npm:^3.0.0": version: 3.0.0 resolution: "convert-hrtime@npm:3.0.0" @@ -2402,7 +2379,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.0": +"follow-redirects@npm:^1.14.8": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" peerDependenciesMeta: @@ -3321,10 +3298,10 @@ __metadata: languageName: node linkType: hard -"node-abort-controller@npm:^3.0.1": - version: 3.0.1 - resolution: "node-abort-controller@npm:3.0.1" - checksum: 10c0/37f895533f7a18a2d83fa4853da1cc00fcae1e0a71553f9ffc94d3153f5fc886d6d4ef3a33bf60c38be161fab78c5b2275cbbf2359351fb12f5edad68d88d8ca +"node-abort-controller@npm:^3.1.1": + version: 3.1.1 + resolution: "node-abort-controller@npm:3.1.1" + checksum: 10c0/f7ad0e7a8e33809d4f3a0d1d65036a711c39e9d23e0319d80ebe076b9a3b4432b4d6b86a7fab65521de3f6872ffed36fc35d1327487c48eb88c517803403eda3 languageName: node linkType: hard @@ -3358,7 +3335,7 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.6.0, node-gyp-build@npm:^4.8.0": +"node-gyp-build@npm:^4.6.0": version: 4.8.0 resolution: "node-gyp-build@npm:4.8.0" bin: @@ -3369,6 +3346,17 @@ __metadata: languageName: node linkType: hard +"node-gyp-build@npm:^4.8.0": + version: 4.8.1 + resolution: "node-gyp-build@npm:4.8.1" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 10c0/e36ca3d2adf2b9cca316695d7687207c19ac6ed326d6d7c68d7112cebe0de4f82d6733dff139132539fcc01cf5761f6c9082a21864ab9172edf84282bc849ce7 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.1.0 resolution: "node-gyp@npm:10.1.0" @@ -4020,16 +4008,6 @@ __metadata: languageName: node linkType: hard -"sodium-native@npm:^4.0.1": - version: 4.1.1 - resolution: "sodium-native@npm:4.1.1" - dependencies: - node-gyp: "npm:latest" - node-gyp-build: "npm:^4.8.0" - checksum: 10c0/7687554fc224bcd350a3b695de792d21b0c374d116d82306f16b5ff674c58f5f397667a1c977dd7e14bde2de4657b8bcd0bdd7cf435eb55173380c825754793f - languageName: node - linkType: hard - "sodium-native@npm:^4.0.8": version: 4.0.9 resolution: "sodium-native@npm:4.0.9" @@ -4040,6 +4018,16 @@ __metadata: languageName: node linkType: hard +"sodium-native@npm:^4.1.1": + version: 4.1.1 + resolution: "sodium-native@npm:4.1.1" + dependencies: + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.8.0" + checksum: 10c0/7687554fc224bcd350a3b695de792d21b0c374d116d82306f16b5ff674c58f5f397667a1c977dd7e14bde2de4657b8bcd0bdd7cf435eb55173380c825754793f + languageName: node + linkType: hard + "source-map-support@npm:^0.5.17": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -4282,9 +4270,9 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" dependencies: "@cspotcode/source-map-support": "npm:^0.8.0" "@tsconfig/node10": "npm:^1.0.7" @@ -4316,7 +4304,7 @@ __metadata: ts-node-script: dist/bin-script.js ts-node-transpile-only: dist/bin-transpile.js ts-script: dist/bin-script-deprecated.js - checksum: 10c0/95187932fb83f3901e22546bd2feeac7d2feb4f412f42ac3a595f049a23e8dcf70516dffb51866391228ea2dbcfaea039e250fb2bb334d48a86ab2b6aea0ae2d + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 languageName: node linkType: hard @@ -4415,23 +4403,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.3": - version: 4.9.3 - resolution: "typescript@npm:4.9.3" +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/bddcb0794f2b8aa52094b9de9d70848fdf46ccecac68403e1c407dc9f1a4e4e28979887acd648e1917b1144e5d8fbfb4c824309d8806d393b4194aa39c71fe5e + checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f languageName: node linkType: hard -"typescript@npm:^5.3.3": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" +"typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f + checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e languageName: node linkType: hard @@ -4445,23 +4433,23 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.9.3#optional!builtin": - version: 4.9.3 - resolution: "typescript@patch:typescript@npm%3A4.9.3#optional!builtin::version=4.9.3&hash=a66ed4" +"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/e5a7c3c6b75cf3eb2b6619fdc84f7ee434659413ace558da8b2c7270b21266be689ece5cf8e6bba529cdd3ea36d3c8ddac9c6d63e5f5c5224c1eac8785c92620 + checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.3.3#optional!builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" +"typescript@patch:typescript@npm%3A^5.4.5#optional!builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 + checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9 languageName: node linkType: hard